Repository: jstedfast/MailKit Branch: master Commit: 8967eebe1abe Files: 1080 Total size: 19.0 MB Directory structure: gitextract_1og2imlt/ ├── .config/ │ └── dotnet-tools.json ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── dependabot.yml │ └── workflows/ │ ├── aot-compatibility.yml │ ├── codeql.yml │ └── main.yml ├── .gitignore ├── .gitmodules ├── AotCompatibility/ │ ├── AotCompatibility.csproj │ └── Program.cs ├── Documentation/ │ ├── Content/ │ │ ├── Creating-Messages.aml │ │ ├── Frequently-Asked-Questions.aml │ │ ├── Getting-Started.aml │ │ ├── Introduction.aml │ │ ├── License.aml │ │ ├── Parsing-Messages.aml │ │ ├── Working-With-Messages.aml │ │ ├── Working-With-OpenPGP.aml │ │ └── Working-With-SMime.aml │ ├── ContentLayout.content │ ├── Documentation.shfbproj │ └── Examples/ │ ├── ArcSignerExample.cs │ ├── ArcVerifierExample.cs │ ├── AttachmentExamples.cs │ ├── BodyBuilder.cs │ ├── CreateMultipartAlternative.cs │ ├── CreateMultipartMixed.cs │ ├── CreateSimpleMessage.cs │ ├── DecodingContent.cs │ ├── DkimExamples.cs │ ├── DkimVerifierExample.cs │ ├── ForwardExamples.cs │ ├── ImapBodyPartExamples.cs │ ├── ImapExamples.cs │ ├── ImapIdleExample.cs │ ├── InlinePGPExample.txt │ ├── MessageDeliveryStatusExamples.cs │ ├── MimeIterator.cs │ ├── MimeMessageLoad.cs │ ├── MimeParserExamples.cs │ ├── MimeVisitorExamples.cs │ ├── MultipartFormDataExamples.cs │ ├── OAuth2ExchangeExample.cs │ ├── OAuth2GMailExample.cs │ ├── OpenPGPExamples.cs │ ├── OpeningContent.cs │ ├── ParameterExamples.cs │ ├── Pop3Examples.cs │ ├── ProxyExamples.cs │ ├── RecursivelyTraverse.cs │ ├── SMimeExamples.cs │ ├── SmtpExamples.cs │ ├── SslCertificateValidation.cs │ └── VerifySignature.cs ├── ExchangeOAuth2.md ├── FAQ.md ├── GMailOAuth2.md ├── LICENSE ├── MailKit/ │ ├── AccessControl.cs │ ├── AccessControlList.cs │ ├── AccessRight.cs │ ├── AccessRights.cs │ ├── AlertEventArgs.cs │ ├── Annotation.cs │ ├── AnnotationAccess.cs │ ├── AnnotationAttribute.cs │ ├── AnnotationEntry.cs │ ├── AnnotationScope.cs │ ├── AnnotationsChangedEventArgs.cs │ ├── AppendRequest.cs │ ├── AuthenticatedEventArgs.cs │ ├── BodyPart.cs │ ├── BodyPartBasic.cs │ ├── BodyPartCollection.cs │ ├── BodyPartMessage.cs │ ├── BodyPartMultipart.cs │ ├── BodyPartText.cs │ ├── BodyPartVisitor.cs │ ├── ByteArrayBuilder.cs │ ├── CommandException.cs │ ├── CompressedStream.cs │ ├── ConnectedEventArgs.cs │ ├── DeliveryStatusNotification.cs │ ├── DeliveryStatusNotificationType.cs │ ├── DisconnectedEventArgs.cs │ ├── DuplexStream.cs │ ├── Envelope.cs │ ├── FetchRequest.cs │ ├── FolderAccess.cs │ ├── FolderAttributes.cs │ ├── FolderCreatedEventArgs.cs │ ├── FolderFeature.cs │ ├── FolderNamespace.cs │ ├── FolderNamespaceCollection.cs │ ├── FolderNotFoundException.cs │ ├── FolderNotOpenException.cs │ ├── FolderQuota.cs │ ├── FolderRenamedEventArgs.cs │ ├── HeaderSet.cs │ ├── IAppendRequest.cs │ ├── IAuthenticationSecretDetector.cs │ ├── IFetchRequest.cs │ ├── IMailFolder.cs │ ├── IMailFolderAppendExtensions.cs │ ├── IMailFolderFetchExtensions.cs │ ├── IMailFolderStoreExtensions.cs │ ├── IMailService.cs │ ├── IMailSpool.cs │ ├── IMailStore.cs │ ├── IMailTransport.cs │ ├── IMessageSummary.cs │ ├── IProtocolLogger.cs │ ├── IReplaceRequest.cs │ ├── IStoreFlagsRequest.cs │ ├── IStoreLabelsRequest.cs │ ├── IStoreRequest.cs │ ├── ITransferProgress.cs │ ├── MailFolder.cs │ ├── MailKit.csproj │ ├── MailKitLite.csproj │ ├── MailService.cs │ ├── MailSpool.cs │ ├── MailStore.cs │ ├── MailTransport.cs │ ├── MessageEventArgs.cs │ ├── MessageFlags.cs │ ├── MessageFlagsChangedEventArgs.cs │ ├── MessageLabelsChangedEventArgs.cs │ ├── MessageNotFoundException.cs │ ├── MessageSentEventArgs.cs │ ├── MessageSorter.cs │ ├── MessageSummary.cs │ ├── MessageSummaryFetchedEventArgs.cs │ ├── MessageSummaryItems.cs │ ├── MessageThread.cs │ ├── MessageThreader.cs │ ├── MessagesVanishedEventArgs.cs │ ├── Metadata.cs │ ├── MetadataChangedEventArgs.cs │ ├── MetadataCollection.cs │ ├── MetadataOptions.cs │ ├── MetadataTag.cs │ ├── ModSeqChangedEventArgs.cs │ ├── Net/ │ │ ├── ClientMetrics.cs │ │ ├── IChannelBindingContext.cs │ │ ├── Imap/ │ │ │ ├── AsyncImapClient.cs │ │ │ ├── IImapClient.cs │ │ │ ├── IImapFolder.cs │ │ │ ├── ImapAuthenticationSecretDetector.cs │ │ │ ├── ImapCallbacks.cs │ │ │ ├── ImapCapabilities.cs │ │ │ ├── ImapClient.cs │ │ │ ├── ImapCommand.cs │ │ │ ├── ImapCommandException.cs │ │ │ ├── ImapCommandResponse.cs │ │ │ ├── ImapCommandStatus.cs │ │ │ ├── ImapEncoding.cs │ │ │ ├── ImapEngine.cs │ │ │ ├── ImapEventGroup.cs │ │ │ ├── ImapFolder.cs │ │ │ ├── ImapFolderAnnotations.cs │ │ │ ├── ImapFolderConstructorArgs.cs │ │ │ ├── ImapFolderFetch.cs │ │ │ ├── ImapFolderFlags.cs │ │ │ ├── ImapFolderSearch.cs │ │ │ ├── ImapIdleContext.cs │ │ │ ├── ImapImplementation.cs │ │ │ ├── ImapLiteral.cs │ │ │ ├── ImapProtocolException.cs │ │ │ ├── ImapResponseCode.cs │ │ │ ├── ImapSearchQueryOptimizer.cs │ │ │ ├── ImapStream.cs │ │ │ ├── ImapToken.cs │ │ │ └── ImapUtils.cs │ │ ├── NetworkOperation.cs │ │ ├── NetworkStream.cs │ │ ├── Pop3/ │ │ │ ├── AsyncPop3Client.cs │ │ │ ├── IPop3Client.cs │ │ │ ├── Pop3AuthenticationSecretDetector.cs │ │ │ ├── Pop3Capabilities.cs │ │ │ ├── Pop3Client.cs │ │ │ ├── Pop3Command.cs │ │ │ ├── Pop3CommandException.cs │ │ │ ├── Pop3Engine.cs │ │ │ ├── Pop3Language.cs │ │ │ ├── Pop3ProtocolException.cs │ │ │ └── Pop3Stream.cs │ │ ├── Proxy/ │ │ │ ├── HttpProxyClient.cs │ │ │ ├── HttpsProxyClient.cs │ │ │ ├── IProxyClient.cs │ │ │ ├── ProxyClient.cs │ │ │ ├── ProxyProtocolException.cs │ │ │ ├── Socks4Client.cs │ │ │ ├── Socks4aClient.cs │ │ │ ├── Socks5Client.cs │ │ │ ├── SocksClient.cs │ │ │ └── WebProxyClient.cs │ │ ├── SelectMode.cs │ │ ├── Smtp/ │ │ │ ├── AsyncSmtpClient.cs │ │ │ ├── ISmtpClient.cs │ │ │ ├── SmtpAuthenticationSecretDetector.cs │ │ │ ├── SmtpCapabilities.cs │ │ │ ├── SmtpClient.cs │ │ │ ├── SmtpCommandException.cs │ │ │ ├── SmtpDataFilter.cs │ │ │ ├── SmtpErrorCode.cs │ │ │ ├── SmtpProtocolException.cs │ │ │ ├── SmtpResponse.cs │ │ │ ├── SmtpStatusCode.cs │ │ │ └── SmtpStream.cs │ │ ├── SocketMetrics.cs │ │ ├── SocketUtils.cs │ │ └── SslStream.cs │ ├── NullProtocolLogger.cs │ ├── PreviewOptions.cs │ ├── ProgressStream.cs │ ├── Properties/ │ │ └── AssemblyInfo.cs │ ├── ProtocolException.cs │ ├── ProtocolLogger.cs │ ├── ReplaceRequest.cs │ ├── Search/ │ │ ├── AnnotationSearchQuery.cs │ │ ├── BinarySearchQuery.cs │ │ ├── DateSearchQuery.cs │ │ ├── FilterSearchQuery.cs │ │ ├── HeaderSearchQuery.cs │ │ ├── ISearchQueryOptimizer.cs │ │ ├── NumericSearchQuery.cs │ │ ├── OrderBy.cs │ │ ├── OrderByAnnotation.cs │ │ ├── OrderByType.cs │ │ ├── SearchOptions.cs │ │ ├── SearchQuery.cs │ │ ├── SearchResults.cs │ │ ├── SearchTerm.cs │ │ ├── SortOrder.cs │ │ ├── TextSearchQuery.cs │ │ ├── UidSearchQuery.cs │ │ └── UnarySearchQuery.cs │ ├── Security/ │ │ ├── AuthenticationException.cs │ │ ├── KeyedHashAlgorithm.cs │ │ ├── Ntlm/ │ │ │ ├── BitConverterLE.cs │ │ │ ├── DES.cs │ │ │ ├── HMACMD5.cs │ │ │ ├── MD4.cs │ │ │ ├── NtlmAttribute.cs │ │ │ ├── NtlmAttributeValuePair.cs │ │ │ ├── NtlmAuthenticateMessage.cs │ │ │ ├── NtlmChallengeMessage.cs │ │ │ ├── NtlmFlags.cs │ │ │ ├── NtlmMessageBase.cs │ │ │ ├── NtlmNegotiateMessage.cs │ │ │ ├── NtlmSingleHostData.cs │ │ │ ├── NtlmTargetInfo.cs │ │ │ ├── NtlmUtils.cs │ │ │ └── RC4.cs │ │ ├── RandomNumberGenerator.cs │ │ ├── SaslException.cs │ │ ├── SaslMechanism.cs │ │ ├── SaslMechanismAnonymous.cs │ │ ├── SaslMechanismCramMd5.cs │ │ ├── SaslMechanismDigestMd5.cs │ │ ├── SaslMechanismGssapi.cs │ │ ├── SaslMechanismLogin.cs │ │ ├── SaslMechanismNegotiateBase.cs │ │ ├── SaslMechanismNtlm.cs │ │ ├── SaslMechanismNtlmNative.cs │ │ ├── SaslMechanismOAuth2.cs │ │ ├── SaslMechanismOAuthBearer.cs │ │ ├── SaslMechanismPlain.cs │ │ ├── SaslMechanismScramBase.cs │ │ ├── SaslMechanismScramSha1.cs │ │ ├── SaslMechanismScramSha256.cs │ │ ├── SaslMechanismScramSha512.cs │ │ ├── SecureSocketOptions.cs │ │ └── SslHandshakeException.cs │ ├── ServiceNotAuthenticatedException.cs │ ├── ServiceNotConnectedException.cs │ ├── SpecialFolder.cs │ ├── StatusItems.cs │ ├── StoreAction.cs │ ├── StoreFlagsRequest.cs │ ├── StoreLabelsRequest.cs │ ├── Telemetry.cs │ ├── TextEncodings.cs │ ├── ThreadingAlgorithm.cs │ ├── UniqueId.cs │ ├── UniqueIdMap.cs │ ├── UniqueIdRange.cs │ ├── UniqueIdSet.cs │ ├── UriExtensions.cs │ ├── WebAlertEventArgs.cs │ └── mailkit.snk ├── MailKit.Coverity.sln ├── MailKit.Documentation.sln ├── MailKit.sln ├── MailKitLite.sln ├── README.md ├── RFCs.md ├── ReleaseNotes.md ├── SECURITY.md ├── TODO.md ├── Telemetry.md ├── UnitTests/ │ ├── AccessControlListTests.cs │ ├── AnnotationAttributeTests.cs │ ├── AnnotationEntryTests.cs │ ├── AnnotationTests.cs │ ├── AppendRequestTests.cs │ ├── ArgumentExceptionTests.cs │ ├── BodyPartTests.cs │ ├── CompressedStreamTests.cs │ ├── DuplexStreamTests.cs │ ├── EnvelopeTests.cs │ ├── EventArgsTests.cs │ ├── ExceptionTests.cs │ ├── ExceptionalProtocolLogger.cs │ ├── FolderNamespaceTests.cs │ ├── HeaderSetTests.cs │ ├── MailServiceTests.cs │ ├── MessageSortingTests.cs │ ├── MessageSummaryTests.cs │ ├── MessageThreadingTests.cs │ ├── MetadataTests.cs │ ├── Net/ │ │ ├── DummyNetworkStream.cs │ │ ├── Imap/ │ │ │ ├── ImapAuthenticationSecretDetectorTests.cs │ │ │ ├── ImapClientTests.cs │ │ │ ├── ImapCommandExceptionTests.cs │ │ │ ├── ImapCommandTests.cs │ │ │ ├── ImapEncodingTests.cs │ │ │ ├── ImapEngineTests.cs │ │ │ ├── ImapEventGroupTests.cs │ │ │ ├── ImapFolderAnnotationsTests.cs │ │ │ ├── ImapFolderFetchTests.cs │ │ │ ├── ImapFolderFlagsTests.cs │ │ │ ├── ImapFolderSearchTests.cs │ │ │ ├── ImapFolderTests.cs │ │ │ ├── ImapImplementationTests.cs │ │ │ ├── ImapReplayStream.cs │ │ │ ├── ImapSearchQueryOptimizerTests.cs │ │ │ ├── ImapStreamTests.cs │ │ │ ├── ImapUtilsTests.cs │ │ │ └── Resources/ │ │ │ ├── acl/ │ │ │ │ ├── authenticate.txt │ │ │ │ ├── capability.txt │ │ │ │ ├── getacl.txt │ │ │ │ ├── listrights.txt │ │ │ │ └── myrights.txt │ │ │ ├── common/ │ │ │ │ ├── basic-greeting.txt │ │ │ │ ├── capability-greeting.txt │ │ │ │ ├── capability.txt │ │ │ │ ├── fetch-annotations.txt │ │ │ │ ├── getquota-no-root.txt │ │ │ │ ├── getquota.txt │ │ │ │ ├── id.txt │ │ │ │ ├── list-inbox.txt │ │ │ │ ├── list-literal-subfolders.txt │ │ │ │ ├── list-namespace.txt │ │ │ │ ├── list-nil-folder-delim.txt │ │ │ │ ├── message.0.msg │ │ │ │ ├── message.1.msg │ │ │ │ ├── message.10.msg │ │ │ │ ├── message.11.msg │ │ │ │ ├── message.12.msg │ │ │ │ ├── message.13.msg │ │ │ │ ├── message.14.msg │ │ │ │ ├── message.15.msg │ │ │ │ ├── message.16.msg │ │ │ │ ├── message.17.msg │ │ │ │ ├── message.18.msg │ │ │ │ ├── message.19.msg │ │ │ │ ├── message.2.msg │ │ │ │ ├── message.20.msg │ │ │ │ ├── message.21.msg │ │ │ │ ├── message.22.msg │ │ │ │ ├── message.23.msg │ │ │ │ ├── message.24.msg │ │ │ │ ├── message.25.msg │ │ │ │ ├── message.26.msg │ │ │ │ ├── message.27.msg │ │ │ │ ├── message.28.msg │ │ │ │ ├── message.29.msg │ │ │ │ ├── message.3.msg │ │ │ │ ├── message.30.msg │ │ │ │ ├── message.31.msg │ │ │ │ ├── message.32.msg │ │ │ │ ├── message.33.msg │ │ │ │ ├── message.34.msg │ │ │ │ ├── message.35.msg │ │ │ │ ├── message.36.msg │ │ │ │ ├── message.37.msg │ │ │ │ ├── message.38.msg │ │ │ │ ├── message.39.msg │ │ │ │ ├── message.4.msg │ │ │ │ ├── message.40.msg │ │ │ │ ├── message.41.msg │ │ │ │ ├── message.42.msg │ │ │ │ ├── message.43.msg │ │ │ │ ├── message.44.msg │ │ │ │ ├── message.45.msg │ │ │ │ ├── message.46.msg │ │ │ │ ├── message.47.msg │ │ │ │ ├── message.48.msg │ │ │ │ ├── message.49.msg │ │ │ │ ├── message.5.msg │ │ │ │ ├── message.6.msg │ │ │ │ ├── message.7.msg │ │ │ │ ├── message.8.msg │ │ │ │ ├── message.9.msg │ │ │ │ ├── namespace.txt │ │ │ │ ├── preauth-capability-greeting.txt │ │ │ │ ├── preauth-greeting.txt │ │ │ │ ├── select-inbox-annotate-no-modseq.txt │ │ │ │ ├── select-inbox-annotate-none.txt │ │ │ │ ├── select-inbox-annotate-readonly.txt │ │ │ │ ├── select-inbox-annotate.txt │ │ │ │ ├── select-inbox-no-modseq.txt │ │ │ │ ├── select-inbox.txt │ │ │ │ ├── setquota.txt │ │ │ │ └── status-literal-folder.txt │ │ │ ├── courier/ │ │ │ │ ├── capability.txt │ │ │ │ └── greeting.txt │ │ │ ├── cyrus/ │ │ │ │ ├── authenticate.txt │ │ │ │ ├── capability.txt │ │ │ │ └── greeting.txt │ │ │ ├── domino/ │ │ │ │ ├── capability.txt │ │ │ │ ├── fetch-extra-parens.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── list-inbox.txt │ │ │ │ └── namespace.txt │ │ │ ├── dovecot/ │ │ │ │ ├── append.1.txt │ │ │ │ ├── append.2.txt │ │ │ │ ├── append.3.txt │ │ │ │ ├── append.4.txt │ │ │ │ ├── append.5.txt │ │ │ │ ├── append.6.txt │ │ │ │ ├── append.7.txt │ │ │ │ ├── append.8.txt │ │ │ │ ├── authenticate+annotate+replace.txt │ │ │ │ ├── authenticate+annotate.txt │ │ │ │ ├── authenticate+filters.txt │ │ │ │ ├── authenticate+fuzzy.txt │ │ │ │ ├── authenticate+gmail-capabilities.txt │ │ │ │ ├── authenticate+replace.txt │ │ │ │ ├── authenticate+savedate.txt │ │ │ │ ├── authenticate.txt │ │ │ │ ├── copy.txt │ │ │ │ ├── enable-qresync.txt │ │ │ │ ├── examine-folder.txt │ │ │ │ ├── expunge.txt │ │ │ │ ├── fetch1.txt │ │ │ │ ├── fetch2.txt │ │ │ │ ├── fetch3.txt │ │ │ │ ├── fetch4.txt │ │ │ │ ├── getbodypart.txt │ │ │ │ ├── getbodypart1.txt │ │ │ │ ├── getbodypartheaders.txt │ │ │ │ ├── getmessageheaders.txt │ │ │ │ ├── getstream-section.txt │ │ │ │ ├── getstream-section2.txt │ │ │ │ ├── getstream.txt │ │ │ │ ├── getstream2.txt │ │ │ │ ├── getstreams1.txt │ │ │ │ ├── getstreams2.txt │ │ │ │ ├── greeting-preauth.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── list-folder.txt │ │ │ │ ├── list-inbox.txt │ │ │ │ ├── list-personal.txt │ │ │ │ ├── list-special-use.txt │ │ │ │ ├── list-unittests-destination.txt │ │ │ │ ├── list-unittests-messages.txt │ │ │ │ ├── list-unittests.txt │ │ │ │ ├── move.txt │ │ │ │ ├── multiappend.txt │ │ │ │ ├── namespace.txt │ │ │ │ ├── noop+alert.txt │ │ │ │ ├── notify-idle-done.txt │ │ │ │ ├── notify-idle.txt │ │ │ │ ├── notify-list-personal.txt │ │ │ │ ├── notify.txt │ │ │ │ ├── optimized-search.txt │ │ │ │ ├── search-all.txt │ │ │ │ ├── search-changed-since.txt │ │ │ │ ├── search-raw.txt │ │ │ │ ├── search-uids-options.txt │ │ │ │ ├── search-uids.txt │ │ │ │ ├── select-unittests-destination.txt │ │ │ │ ├── select-unittests-messages-qresync.txt │ │ │ │ ├── select-unittests-messages.txt │ │ │ │ ├── setflags-unchangedsince.txt │ │ │ │ ├── sort-by-date.txt │ │ │ │ ├── sort-by-strings.txt │ │ │ │ ├── sort-raw.txt │ │ │ │ ├── sort-reverse-arrival.txt │ │ │ │ ├── sort-uids-options.txt │ │ │ │ ├── status-unittests-destination.txt │ │ │ │ ├── store-answered.txt │ │ │ │ ├── store-deleted-custom.txt │ │ │ │ ├── store-deleted.txt │ │ │ │ ├── store-seen.txt │ │ │ │ ├── thread-orderedsubject.txt │ │ │ │ ├── thread-references.txt │ │ │ │ └── uid-expunge.txt │ │ │ ├── exchange/ │ │ │ │ ├── capability-postauth.txt │ │ │ │ ├── capability-preauth.txt │ │ │ │ ├── greeting-2003.txt │ │ │ │ ├── greeting-2007.txt │ │ │ │ ├── greeting.txt │ │ │ │ └── issue115.txt │ │ │ ├── gmail/ │ │ │ │ ├── add-flags.txt │ │ │ │ ├── add-labels.txt │ │ │ │ ├── append.1.txt │ │ │ │ ├── append.10.txt │ │ │ │ ├── append.11.txt │ │ │ │ ├── append.12.txt │ │ │ │ ├── append.13.txt │ │ │ │ ├── append.14.txt │ │ │ │ ├── append.15.txt │ │ │ │ ├── append.16.txt │ │ │ │ ├── append.17.txt │ │ │ │ ├── append.18.txt │ │ │ │ ├── append.19.txt │ │ │ │ ├── append.2.txt │ │ │ │ ├── append.20.txt │ │ │ │ ├── append.21.txt │ │ │ │ ├── append.22.txt │ │ │ │ ├── append.23.txt │ │ │ │ ├── append.24.txt │ │ │ │ ├── append.25.txt │ │ │ │ ├── append.26.txt │ │ │ │ ├── append.27.txt │ │ │ │ ├── append.28.txt │ │ │ │ ├── append.29.txt │ │ │ │ ├── append.3.txt │ │ │ │ ├── append.30.txt │ │ │ │ ├── append.31.txt │ │ │ │ ├── append.32.txt │ │ │ │ ├── append.33.txt │ │ │ │ ├── append.34.txt │ │ │ │ ├── append.35.txt │ │ │ │ ├── append.36.txt │ │ │ │ ├── append.37.txt │ │ │ │ ├── append.38.txt │ │ │ │ ├── append.39.txt │ │ │ │ ├── append.4.txt │ │ │ │ ├── append.40.txt │ │ │ │ ├── append.41.txt │ │ │ │ ├── append.42.txt │ │ │ │ ├── append.43.txt │ │ │ │ ├── append.44.txt │ │ │ │ ├── append.45.txt │ │ │ │ ├── append.46.txt │ │ │ │ ├── append.47.txt │ │ │ │ ├── append.48.txt │ │ │ │ ├── append.49.txt │ │ │ │ ├── append.5.txt │ │ │ │ ├── append.50.txt │ │ │ │ ├── append.6.txt │ │ │ │ ├── append.7.txt │ │ │ │ ├── append.8.txt │ │ │ │ ├── append.9.txt │ │ │ │ ├── authenticate+annotate.txt │ │ │ │ ├── authenticate+create-special-use.txt │ │ │ │ ├── authenticate+preview.txt │ │ │ │ ├── authenticate+savedate.txt │ │ │ │ ├── authenticate+statussize+objectid.txt │ │ │ │ ├── authenticate+webalert.txt │ │ │ │ ├── authenticate-no-appendlimit-value.txt │ │ │ │ ├── authenticate.txt │ │ │ │ ├── capability+login.txt │ │ │ │ ├── capability+logindisabled.txt │ │ │ │ ├── capability.txt │ │ │ │ ├── count-explicit.noop.txt │ │ │ │ ├── count-implicit.noop.txt │ │ │ │ ├── count.examine.txt │ │ │ │ ├── create-mailboxid.txt │ │ │ │ ├── examine-inbox.txt │ │ │ │ ├── expunge-during-fetch.txt │ │ │ │ ├── expunge.txt │ │ │ │ ├── fetch-all-headers.txt │ │ │ │ ├── fetch-invalid-headers.txt │ │ │ │ ├── fetch-korean-previewtext-bodystructure.txt │ │ │ │ ├── fetch-korean-previewtext-peek-text-only.txt │ │ │ │ ├── fetch-nil-bodystructure.txt │ │ │ │ ├── fetch-nil.txt │ │ │ │ ├── fetch-objectid.txt │ │ │ │ ├── fetch-preview.txt │ │ │ │ ├── fetch-previewtext-bodystructure.txt │ │ │ │ ├── fetch-previewtext-peek-html-only.txt │ │ │ │ ├── fetch-previewtext-peek-text-alternative.txt │ │ │ │ ├── fetch-previewtext-peek-text-only.txt │ │ │ │ ├── fetch-quoted-string-bodystructure.txt │ │ │ │ ├── fetch-quoted-string.txt │ │ │ │ ├── fetch-savedate.txt │ │ │ │ ├── fetch.1+unsolicited-info.txt │ │ │ │ ├── fetch.1.txt │ │ │ │ ├── fetch.11.txt │ │ │ │ ├── fetch.12.txt │ │ │ │ ├── fetch.13.txt │ │ │ │ ├── fetch.14.txt │ │ │ │ ├── fetch.2.txt │ │ │ │ ├── fetch.26.txt │ │ │ │ ├── fetch.27.txt │ │ │ │ ├── fetch.28.txt │ │ │ │ ├── fetch.29.txt │ │ │ │ ├── fetch.3.txt │ │ │ │ ├── fetch.31.txt │ │ │ │ ├── fetch.34.txt │ │ │ │ ├── fetch.41.txt │ │ │ │ ├── fetch.42.txt │ │ │ │ ├── fetch.43.txt │ │ │ │ ├── fetch.5.txt │ │ │ │ ├── fetch.50.txt │ │ │ │ ├── fetch.7.txt │ │ │ │ ├── fetch.8.txt │ │ │ │ ├── fetch.9.txt │ │ │ │ ├── get-indexes.txt │ │ │ │ ├── go-ahead.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── headers.1+unsolicited-info.txt │ │ │ │ ├── idle-done.txt │ │ │ │ ├── idle.txt │ │ │ │ ├── list-all-no-status.txt │ │ │ │ ├── list-all.txt │ │ │ │ ├── list-archived-messages.txt │ │ │ │ ├── list-archives.txt │ │ │ │ ├── list-flagged.txt │ │ │ │ ├── list-gmail-subfolders-no-status.txt │ │ │ │ ├── list-gmail-subfolders.txt │ │ │ │ ├── list-gmail.txt │ │ │ │ ├── list-inbox.txt │ │ │ │ ├── list-level1.txt │ │ │ │ ├── list-level2.txt │ │ │ │ ├── list-level3.txt │ │ │ │ ├── list-personal-status-appendlimit.txt │ │ │ │ ├── list-personal.txt │ │ │ │ ├── list-sublevel1.txt │ │ │ │ ├── list-sublevel2.txt │ │ │ │ ├── list-toplevel1.txt │ │ │ │ ├── list-toplevel2.txt │ │ │ │ ├── list-unittests-dummy.txt │ │ │ │ ├── list-unittests.txt │ │ │ │ ├── logout.txt │ │ │ │ ├── lsub-all.txt │ │ │ │ ├── lsub-personal.txt │ │ │ │ ├── namespace.txt │ │ │ │ ├── precise-pangolin-message.txt │ │ │ │ ├── rename-unittests.txt │ │ │ │ ├── search-deleted-not-1-3.txt │ │ │ │ ├── search-summary.txt │ │ │ │ ├── search.txt │ │ │ │ ├── select-inbox.txt │ │ │ │ ├── select-sublevel1.txt │ │ │ │ ├── select-sublevel2.txt │ │ │ │ ├── select-toplevel.txt │ │ │ │ ├── select-unittests.txt │ │ │ │ ├── set-flags.txt │ │ │ │ ├── set-labels.txt │ │ │ │ ├── status-+folder.txt │ │ │ │ ├── status-all-mail.txt │ │ │ │ ├── status-drafts.txt │ │ │ │ ├── status-important.txt │ │ │ │ ├── status-inbox-appendlimit-nil.txt │ │ │ │ ├── status-inbox-appendlimit.txt │ │ │ │ ├── status-inbox.txt │ │ │ │ ├── status-sent-mail.txt │ │ │ │ ├── status-spam.txt │ │ │ │ ├── status-starred.txt │ │ │ │ ├── status-trash.txt │ │ │ │ ├── uid-copy.txt │ │ │ │ ├── uid-expunge.txt │ │ │ │ ├── uid-move.txt │ │ │ │ ├── utf8accept.txt │ │ │ │ └── xlist.txt │ │ │ ├── icloud/ │ │ │ │ ├── authenticate-plain.txt │ │ │ │ ├── capability.txt │ │ │ │ ├── enable-qresync.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── list-inbox.txt │ │ │ │ └── namespace.txt │ │ │ ├── lowercase/ │ │ │ │ ├── authenticate.txt │ │ │ │ ├── capability.txt │ │ │ │ ├── greeting.txt │ │ │ │ └── list.txt │ │ │ ├── metadata/ │ │ │ │ ├── authenticate.txt │ │ │ │ ├── capability.txt │ │ │ │ ├── getmetadata-multi.txt │ │ │ │ ├── getmetadata-options.txt │ │ │ │ ├── getmetadata.txt │ │ │ │ ├── inbox-getmetadata-multi.txt │ │ │ │ ├── inbox-getmetadata-options.txt │ │ │ │ ├── inbox-getmetadata.txt │ │ │ │ ├── inbox-setmetadata-maxsize.txt │ │ │ │ ├── inbox-setmetadata-noprivate.txt │ │ │ │ ├── inbox-setmetadata-toomany.txt │ │ │ │ ├── setmetadata-maxsize.txt │ │ │ │ ├── setmetadata-noprivate.txt │ │ │ │ └── setmetadata-toomany.txt │ │ │ ├── protonmail/ │ │ │ │ ├── capability.txt │ │ │ │ └── greeting.txt │ │ │ ├── qqmail/ │ │ │ │ └── greeting.txt │ │ │ ├── smartermail/ │ │ │ │ └── greeting.txt │ │ │ ├── strato.de/ │ │ │ │ ├── authenticate.txt │ │ │ │ ├── capability.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── list-inbox.txt │ │ │ │ ├── namespace.txt │ │ │ │ └── xlist.txt │ │ │ ├── uw/ │ │ │ │ ├── greeting.txt │ │ │ │ └── preauth-greeting.txt │ │ │ ├── yahoo/ │ │ │ │ ├── capabilities.txt │ │ │ │ ├── examine-inbox.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── list-inbox.txt │ │ │ │ ├── namespace.txt │ │ │ │ └── search.txt │ │ │ ├── yandex/ │ │ │ │ ├── authenticate.txt │ │ │ │ ├── capability.txt │ │ │ │ ├── getbodypart-missing-content.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── list-inbox.txt │ │ │ │ ├── namespace.txt │ │ │ │ ├── select-inbox.txt │ │ │ │ └── xlist.txt │ │ │ └── zoho/ │ │ │ ├── authenticate.txt │ │ │ ├── capability.txt │ │ │ ├── examine-gesendet.txt │ │ │ ├── fetch-negative-modseq-values.txt │ │ │ ├── greeting.txt │ │ │ ├── list-inbox.txt │ │ │ ├── namespace.txt │ │ │ └── xlist.txt │ │ ├── NetworkStreamTests.cs │ │ ├── Pop3/ │ │ │ ├── Pop3AuthenticationSecretDetectorTests.cs │ │ │ ├── Pop3ClientTests.cs │ │ │ ├── Pop3CommandExceptionTests.cs │ │ │ ├── Pop3ReplayStream.cs │ │ │ ├── Pop3StreamTests.cs │ │ │ └── Resources/ │ │ │ ├── comcast/ │ │ │ │ ├── capa1.txt │ │ │ │ ├── capa2.txt │ │ │ │ ├── err.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── list-error1.txt │ │ │ │ ├── list-error2.txt │ │ │ │ ├── list-error3.txt │ │ │ │ ├── list.txt │ │ │ │ ├── list1-error1.txt │ │ │ │ ├── list1-error2.txt │ │ │ │ ├── list1-error3.txt │ │ │ │ ├── list1.txt │ │ │ │ ├── ok.txt │ │ │ │ ├── quit.txt │ │ │ │ ├── retr1.txt │ │ │ │ ├── stat-error1.txt │ │ │ │ ├── stat-error2.txt │ │ │ │ ├── stat-error3.txt │ │ │ │ └── stat.txt │ │ │ ├── common/ │ │ │ │ ├── err-greeting.txt │ │ │ │ └── ok-greeting.txt │ │ │ ├── exchange/ │ │ │ │ ├── auth.txt │ │ │ │ ├── capa.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── plus.txt │ │ │ │ ├── quit.txt │ │ │ │ ├── retr1.txt │ │ │ │ ├── stat.txt │ │ │ │ └── uidl.txt │ │ │ ├── gmail/ │ │ │ │ ├── auth.txt │ │ │ │ ├── capa1.txt │ │ │ │ ├── capa2.txt │ │ │ │ ├── dele.txt │ │ │ │ ├── dele123.txt │ │ │ │ ├── greeting.txt │ │ │ │ ├── list.txt │ │ │ │ ├── list1.txt │ │ │ │ ├── list2.txt │ │ │ │ ├── list3.txt │ │ │ │ ├── noop.txt │ │ │ │ ├── plus.txt │ │ │ │ ├── quit.txt │ │ │ │ ├── retr1-parse-error.txt │ │ │ │ ├── retr1.txt │ │ │ │ ├── retr123.txt │ │ │ │ ├── rset.txt │ │ │ │ ├── stat.txt │ │ │ │ ├── top.txt │ │ │ │ ├── top123.txt │ │ │ │ ├── uidl-error1.txt │ │ │ │ ├── uidl-error2.txt │ │ │ │ ├── uidl.txt │ │ │ │ ├── uidl1-error1.txt │ │ │ │ ├── uidl1-error2.txt │ │ │ │ ├── uidl1.txt │ │ │ │ ├── uidl2.txt │ │ │ │ └── uidl3.txt │ │ │ └── lang/ │ │ │ ├── auth.txt │ │ │ ├── capa1.txt │ │ │ ├── capa2.txt │ │ │ ├── getlang.txt │ │ │ ├── greeting.txt │ │ │ ├── quit.txt │ │ │ ├── setlang.txt │ │ │ ├── stat.txt │ │ │ └── utf8.txt │ │ ├── Proxy/ │ │ │ ├── HttpProxyClientTests.cs │ │ │ ├── HttpProxyListener.cs │ │ │ ├── HttpsProxyClientTests.cs │ │ │ ├── ProxyListener.cs │ │ │ ├── ProxyProtocolExceptionTests.cs │ │ │ ├── Socks4ClientTests.cs │ │ │ ├── Socks4ProxyListener.cs │ │ │ ├── Socks4aClientTests.cs │ │ │ ├── Socks4aProxyListener.cs │ │ │ ├── Socks5ClientTests.cs │ │ │ ├── Socks5ProxyListener.cs │ │ │ └── WebProxyClientTests.cs │ │ ├── Smtp/ │ │ │ ├── Resources/ │ │ │ │ ├── auth-failed.txt │ │ │ │ ├── auth-required.txt │ │ │ │ ├── auth-successful.txt │ │ │ │ ├── auth-too-weak.txt │ │ │ │ ├── bad-command-sequence.txt │ │ │ │ ├── comcast-auth-digest-md5-reset.txt │ │ │ │ ├── comcast-auth-digest-md5-response.txt │ │ │ │ ├── comcast-auth-digest-md5.txt │ │ │ │ ├── comcast-auth-login-password.txt │ │ │ │ ├── comcast-auth-login-username.txt │ │ │ │ ├── comcast-auth-login.txt │ │ │ │ ├── comcast-auth-plain.txt │ │ │ │ ├── comcast-data-done.txt │ │ │ │ ├── comcast-data.txt │ │ │ │ ├── comcast-ehlo+binarymime.txt │ │ │ │ ├── comcast-ehlo+digest-md5.txt │ │ │ │ ├── comcast-ehlo+dsn.txt │ │ │ │ ├── comcast-ehlo+pipelining.txt │ │ │ │ ├── comcast-ehlo+requiretls.txt │ │ │ │ ├── comcast-ehlo+smtputf8.txt │ │ │ │ ├── comcast-ehlo+x-exps.txt │ │ │ │ ├── comcast-ehlo.txt │ │ │ │ ├── comcast-greeting.txt │ │ │ │ ├── comcast-mail-from.txt │ │ │ │ ├── comcast-noop.txt │ │ │ │ ├── comcast-quit.txt │ │ │ │ ├── comcast-rcpt-to.txt │ │ │ │ ├── comcast-rset.txt │ │ │ │ ├── ehlo-failed.txt │ │ │ │ ├── greeting-not-ready.txt │ │ │ │ ├── helo.txt │ │ │ │ ├── mailbox-unavailable.txt │ │ │ │ ├── pipelined-mail-from-rcpt-to.txt │ │ │ │ ├── pipelined-mailbox-unavailable.txt │ │ │ │ ├── rfc0821-expn.txt │ │ │ │ └── rfc0821-vrfy.txt │ │ │ ├── SmtpAuthenticationSecretDetectorTests.cs │ │ │ ├── SmtpClientTests.cs │ │ │ ├── SmtpCommandExceptionTests.cs │ │ │ ├── SmtpDataFilterTests.cs │ │ │ ├── SmtpProtocolExceptionTests.cs │ │ │ ├── SmtpReplayStream.cs │ │ │ └── SmtpStreamTests.cs │ │ └── SocketUtilsTests.cs │ ├── ProgressStreamTests.cs │ ├── ProtocolLoggerTests.cs │ ├── ReplaceRequestTests.cs │ ├── Search/ │ │ └── SearchQueryTests.cs │ ├── Security/ │ │ ├── AuthenticationExceptionTests.cs │ │ ├── ChannelBindingContext.cs │ │ ├── Ntlm/ │ │ │ ├── MD4Tests.cs │ │ │ ├── NtlmAuthenticateMessageTests.cs │ │ │ ├── NtlmChallengeMessageTests.cs │ │ │ ├── NtlmNegotiateMessageTests.cs │ │ │ ├── NtlmSingleHostDataTests.cs │ │ │ ├── NtlmTargetInfoTests.cs │ │ │ └── RC4Tests.cs │ │ ├── SaslExceptionTests.cs │ │ ├── SaslMechanismAnonymousTests.cs │ │ ├── SaslMechanismCramMd5Tests.cs │ │ ├── SaslMechanismDigestMd5Tests.cs │ │ ├── SaslMechanismLoginTests.cs │ │ ├── SaslMechanismNtlmTests.cs │ │ ├── SaslMechanismOAuth2Tests.cs │ │ ├── SaslMechanismOAuthBearerTests.cs │ │ ├── SaslMechanismPlainTests.cs │ │ ├── SaslMechanismScramSha1Tests.cs │ │ ├── SaslMechanismScramSha256Tests.cs │ │ ├── SaslMechanismScramSha512Tests.cs │ │ ├── SaslMechanismTests.cs │ │ └── SslHandshakeExceptionTests.cs │ ├── StoreFlagsRequestTests.cs │ ├── StoreLabelsRequestTests.cs │ ├── TestHelper.cs │ ├── UniqueIdMapTests.cs │ ├── UniqueIdRangeTests.cs │ ├── UniqueIdSetTests.cs │ ├── UniqueIdTests.cs │ ├── UnitTests.csproj │ └── UriExtensionTests.cs ├── cov-build.bat ├── nuget/ │ ├── GettingStarted.md │ ├── MailKit.nuspec │ └── MailKitLite.nuspec ├── rfc/ │ ├── SOCKS4.protocol │ ├── draft-murchison-sasl-login-00.txt │ ├── rfc0821.txt │ ├── rfc1652.txt │ ├── rfc1730.txt │ ├── rfc1731.txt │ ├── rfc1734.txt │ ├── rfc1854.txt │ ├── rfc1870.txt │ ├── rfc1891.txt │ ├── rfc1928.txt │ ├── rfc1929.txt │ ├── rfc1939.txt │ ├── rfc1961.txt │ ├── rfc2034.txt │ ├── rfc2060.txt │ ├── rfc2086.txt │ ├── rfc2087.txt │ ├── rfc2088.txt │ ├── rfc2177.txt │ ├── rfc2193.txt │ ├── rfc2195.txt │ ├── rfc2197.txt │ ├── rfc2221.txt │ ├── rfc2222.txt │ ├── rfc2245.txt │ ├── rfc2342.txt │ ├── rfc2359.txt │ ├── rfc2449.txt │ ├── rfc2487.txt │ ├── rfc2554.txt │ ├── rfc2595.txt │ ├── rfc2683.txt │ ├── rfc2821.txt │ ├── rfc2831.txt │ ├── rfc2920.txt │ ├── rfc2971.txt │ ├── rfc3030.txt │ ├── rfc3207.txt │ ├── rfc3348.txt │ ├── rfc3461.txt │ ├── rfc3501.txt │ ├── rfc3502.txt │ ├── rfc3516.txt │ ├── rfc3691.txt │ ├── rfc4013.txt │ ├── rfc4314.txt │ ├── rfc4315.txt │ ├── rfc4466.txt │ ├── rfc4469.txt │ ├── rfc4505.txt │ ├── rfc4551.txt │ ├── rfc4616.txt │ ├── rfc4731.txt │ ├── rfc4959.txt │ ├── rfc4978.txt │ ├── rfc5032.txt │ ├── rfc5161.txt │ ├── rfc5162.txt │ ├── rfc5182.txt │ ├── rfc5255.txt │ ├── rfc5256.txt │ ├── rfc5257.txt │ ├── rfc5258.txt │ ├── rfc5259.txt │ ├── rfc5267.txt │ ├── rfc5321.txt │ ├── rfc5464.txt │ ├── rfc5465.txt │ ├── rfc5466.txt │ ├── rfc5530.txt │ ├── rfc5788.txt │ ├── rfc5801.txt │ ├── rfc5802.txt │ ├── rfc5819.txt │ ├── rfc5957.txt │ ├── rfc6154.txt │ ├── rfc6203.txt │ ├── rfc6237.txt │ ├── rfc6531.txt │ ├── rfc6851.txt │ ├── rfc6855.txt │ ├── rfc6856.txt │ ├── rfc7162.txt │ ├── rfc7377.txt │ ├── rfc7628.txt │ ├── rfc7677.txt │ ├── rfc7888.txt │ ├── rfc7889.txt │ ├── rfc8437.txt │ ├── rfc8438.txt │ ├── rfc8440.txt │ ├── rfc8457.txt │ ├── rfc8474.txt │ ├── rfc8508.txt │ ├── rfc8514.txt │ ├── rfc8689.txt │ ├── rfc8970.txt │ ├── rfc9051.txt │ ├── rfc9208.txt │ └── rfc9394.txt ├── samples/ │ ├── ImapClientDemo/ │ │ ├── .gitignore │ │ ├── ImapClientDemo/ │ │ │ ├── App.config │ │ │ ├── AuthenticationFailedEventArgs.cs │ │ │ ├── ClientCommand.cs │ │ │ ├── ClientCommandPipeline.cs │ │ │ ├── ClientConnection.cs │ │ │ ├── ClientConnections.cs │ │ │ ├── CommandFailedEventArgs.cs │ │ │ ├── ConnectionFailedEventArgs.cs │ │ │ ├── CustomTaskScheduler.cs │ │ │ ├── FolderNameComparer.cs │ │ │ ├── FolderSelectedEventArgs.cs │ │ │ ├── FolderTreeView.cs │ │ │ ├── ImapClientDemo.csproj │ │ │ ├── LoginWindow.Designer.cs │ │ │ ├── LoginWindow.cs │ │ │ ├── LoginWindow.resx │ │ │ ├── MainWindow.Designer.cs │ │ │ ├── MainWindow.cs │ │ │ ├── MainWindow.resx │ │ │ ├── MessageInfo.cs │ │ │ ├── MessageList.cs │ │ │ ├── MessageSelectedEventArgs.cs │ │ │ ├── MultipartRelatedImageContext.cs │ │ │ ├── Program.cs │ │ │ └── Properties/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── Resources.Designer.cs │ │ │ ├── Resources.resx │ │ │ ├── Settings.Designer.cs │ │ │ └── Settings.settings │ │ └── ImapClientDemo.sln │ ├── ImapClientDemo.Android/ │ │ ├── ImapClientDemo.Android/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── FoldersActivity.cs │ │ │ ├── ImapClientDemo.Android.csproj │ │ │ ├── LoginActivity.cs │ │ │ ├── Mail.cs │ │ │ ├── MainActivity.cs │ │ │ ├── MessageListActivity.cs │ │ │ ├── MessageViewActivity.cs │ │ │ └── Resources/ │ │ │ ├── AboutResources.txt │ │ │ ├── Resource.designer.cs │ │ │ ├── layout/ │ │ │ │ ├── FoldersLayout.xml │ │ │ │ ├── LoginLayout.xml │ │ │ │ ├── Main.xml │ │ │ │ ├── MessageListItemLayout.xml │ │ │ │ ├── MessagesLayout.xml │ │ │ │ └── ViewMessageLayout.xml │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ ├── appicon.xml │ │ │ │ └── appicon_round.xml │ │ │ └── values/ │ │ │ ├── Strings.xml │ │ │ └── themes.xml │ │ └── ImapClientDemo.Android.sln │ ├── ImapClientDemo.iOS/ │ │ ├── ImapClientDemo.iOS/ │ │ │ ├── AppDelegate.cs │ │ │ ├── Assets.xcassets/ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Entitlements.plist │ │ │ ├── FoldersViewController.cs │ │ │ ├── ImapClientDemo.iOS.csproj │ │ │ ├── Info.plist │ │ │ ├── LaunchScreen.storyboard │ │ │ ├── LoginViewController.cs │ │ │ ├── Mail.cs │ │ │ ├── Main.cs │ │ │ ├── MessageListViewController.cs │ │ │ ├── MessageViewController.cs │ │ │ ├── MultipartRelatedUrlCache.cs │ │ │ ├── Resources/ │ │ │ │ └── LaunchScreen.xib │ │ │ └── SceneDelegate.cs │ │ └── ImapClientDemo.iOS.sln │ └── ImapIdle/ │ ├── .gitignore │ ├── ImapIdle/ │ │ ├── IdleClient.cs │ │ ├── ImapIdle.csproj │ │ └── Program.cs │ └── ImapIdle.sln └── scripts/ ├── coveralls.ps1 ├── test-aot-compatibility.ps1 ├── test.ps1 └── update-version.ps1 ================================================ FILE CONTENTS ================================================ ================================================ FILE: .config/dotnet-tools.json ================================================ { "version": 1, "isRoot": true, "tools": { "altcover.global": { "version": "9.0.102", "commands": [ "altcover" ], "rollForward": false }, "coveralls.net": { "version": "4.0.1", "commands": [ "csmacnz.Coveralls" ], "rollForward": false }, "nunit.consolerunner.netcore": { "version": "3.22.0", "commands": [ "nunit" ], "rollForward": false } } } ================================================ FILE: .editorconfig ================================================ # Remove the line below if you want to inherit .editorconfig settings from higher directories root = true # C# files [*.cs] #### Core EditorConfig Options #### # Indentation and spacing indent_size = 4 indent_style = tab tab_width = 4 # New line preferences end_of_line = crlf insert_final_newline = true #### .NET Coding Conventions #### # Organize usings dotnet_separate_import_directive_groups = true dotnet_sort_system_directives_first = true file_header_template = unset # this. and Me. preferences dotnet_style_qualification_for_event = false:silent dotnet_style_qualification_for_field = false:silent dotnet_style_qualification_for_method = false:silent dotnet_style_qualification_for_property = false:silent # Language keywords vs BCL types preferences dotnet_style_predefined_type_for_locals_parameters_members = true:silent dotnet_style_predefined_type_for_member_access = true:silent # Parentheses preferences dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent # Modifier preferences dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent # Expression-level preferences dotnet_style_coalesce_expression = true:suggestion dotnet_style_collection_initializer = true:suggestion dotnet_style_explicit_tuple_names = true:suggestion dotnet_style_null_propagation = true:suggestion dotnet_style_object_initializer = true:suggestion dotnet_style_operator_placement_when_wrapping = beginning_of_line dotnet_style_prefer_auto_properties = true:silent dotnet_style_prefer_compound_assignment = true:suggestion dotnet_style_prefer_conditional_expression_over_assignment = true:silent dotnet_style_prefer_conditional_expression_over_return = true:silent dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion dotnet_style_prefer_inferred_tuple_names = true:suggestion dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion dotnet_style_prefer_simplified_boolean_expressions = true:suggestion dotnet_style_prefer_simplified_interpolation = true:suggestion # Field preferences dotnet_style_readonly_field = true:suggestion # Parameter preferences dotnet_code_quality_unused_parameters = all:suggestion #### C# Coding Conventions #### # var preferences csharp_style_var_elsewhere = false:silent csharp_style_var_for_built_in_types = false:silent csharp_style_var_when_type_is_apparent = false:silent # Expression-bodied members csharp_style_expression_bodied_accessors = true:silent csharp_style_expression_bodied_constructors = false:silent csharp_style_expression_bodied_indexers = true:silent csharp_style_expression_bodied_lambdas = true:silent csharp_style_expression_bodied_local_functions = false:silent csharp_style_expression_bodied_methods = false:silent csharp_style_expression_bodied_operators = false:silent csharp_style_expression_bodied_properties = true:silent # Pattern matching preferences csharp_style_pattern_matching_over_as_with_null_check = true:suggestion csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion csharp_style_prefer_switch_expression = true:suggestion # Null-checking preferences csharp_style_conditional_delegate_call = true:suggestion # Modifier preferences csharp_prefer_static_local_function = true:suggestion csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent # Code-block preferences csharp_prefer_braces = true:silent csharp_prefer_simple_using_statement = true:suggestion # Expression-level preferences csharp_prefer_simple_default_expression = true:suggestion csharp_style_deconstructed_variable_declaration = true:suggestion csharp_style_inlined_variable_declaration = true:suggestion csharp_style_pattern_local_over_anonymous_function = true:suggestion csharp_style_prefer_index_operator = true:suggestion csharp_style_prefer_range_operator = true:suggestion csharp_style_throw_expression = true:suggestion csharp_style_unused_value_assignment_preference = discard_variable:suggestion csharp_style_unused_value_expression_statement_preference = discard_variable:silent # 'using' directive preferences csharp_using_directive_placement = outside_namespace:silent #### C# Formatting Rules #### # New line preferences csharp_new_line_before_catch = false csharp_new_line_before_else = false csharp_new_line_before_finally = false csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_open_brace = methods,types csharp_new_line_between_query_expression_clauses = true # Indentation preferences csharp_indent_block_contents = true csharp_indent_braces = false csharp_indent_case_contents = true csharp_indent_case_contents_when_block = true csharp_indent_labels = one_less_than_current csharp_indent_switch_labels = false # Space preferences csharp_space_after_cast = true csharp_space_after_colon_in_inheritance_clause = true csharp_space_after_comma = true csharp_space_after_dot = false csharp_space_after_keywords_in_control_flow_statements = true csharp_space_after_semicolon_in_for_statement = true csharp_space_around_binary_operators = before_and_after csharp_space_around_declaration_statements = false csharp_space_before_colon_in_inheritance_clause = true csharp_space_before_comma = false csharp_space_before_dot = false csharp_space_before_open_square_brackets = false csharp_space_before_semicolon_in_for_statement = false csharp_space_between_empty_square_brackets = false csharp_space_between_method_call_empty_parameter_list_parentheses = false csharp_space_between_method_call_name_and_opening_parenthesis = true csharp_space_between_method_call_parameter_list_parentheses = false csharp_space_between_method_declaration_empty_parameter_list_parentheses = false csharp_space_between_method_declaration_name_and_open_parenthesis = true csharp_space_between_method_declaration_parameter_list_parentheses = false csharp_space_between_parentheses = false csharp_space_between_square_brackets = false # Wrapping preferences csharp_preserve_single_line_blocks = true csharp_preserve_single_line_statements = true #### Naming styles #### # Naming rules dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion dotnet_naming_rule.types_should_be_pascal_case.symbols = types dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case # Symbol specifications dotnet_naming_symbols.interface.applicable_kinds = interface dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected dotnet_naming_symbols.interface.required_modifiers = dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected dotnet_naming_symbols.types.required_modifiers = dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected dotnet_naming_symbols.non_field_members.required_modifiers = # Naming styles dotnet_naming_style.pascal_case.required_prefix = dotnet_naming_style.pascal_case.required_suffix = dotnet_naming_style.pascal_case.word_separator = dotnet_naming_style.pascal_case.capitalization = pascal_case dotnet_naming_style.begins_with_i.required_prefix = I dotnet_naming_style.begins_with_i.required_suffix = dotnet_naming_style.begins_with_i.word_separator = dotnet_naming_style.begins_with_i.capitalization = pascal_case ================================================ FILE: .gitattributes ================================================ *.csproj text *.nuspec text *.sln eol=crlf *.msg text *.txt text *.yml text *.cs text *.md text ================================================ FILE: .github/FUNDING.yml ================================================ github: jstedfast ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve --- **Describe the bug** A clear and concise description of what the bug is. **Platform (please complete the following information):** - OS: [e.g. Windows, Linux, MacOS, iOS, Android, Windows Phone, etc.] - .NET Runtime: [e.g. CoreCLR, Mono] - .NET Framework: [e.g. .Net Core, .NET 4.5, UWP, etc.] - MailKit Version: **Exception** If you got an exception, please include the exception Message *and* StackTrace. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Code Snippets** If applicable, add code snippets to help explain your problem. ```csharp // Add your code snippet here. ``` **Protocol Logs** Please include a protocol log (scrubbed of any authentication data), especially if you got an exception such as `Syntax error in XYZ. Unexpected token: ...`. To get a protocol log, follow one of the following code snippets: ```csharp // log to a file called 'imap.log' var client = new ImapClient (new ProtocolLogger ("imap.log")); ``` ```csharp // log to a file called 'pop3.log' var client = new Pop3Client (new ProtocolLogger ("pop3.log")); ``` ```csharp // log to a file called 'smtp.log' var client = new SmtpClient (new ProtocolLogger ("smtp.log")); ``` Note: if the protocol log contains sensitive information, feel free to email it to me at jestedfa@microsoft.com instead of including it in the GitHub issue. **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/dependabot.yml ================================================ # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file version: 2 updates: - package-ecosystem: "nuget" directory: "/" schedule: interval: "weekly" day: "monday" time: "08:00" timezone: "America/New_York" ================================================ FILE: .github/workflows/aot-compatibility.yml ================================================ name: AOT Compatibility on: push: branches: [ 'master' ] paths-ignore: - '**.md' pull_request: branches: [ 'master' ] paths-ignore: - '**.md' jobs: aot-test: strategy: fail-fast: false # ensures the entire test matrix is run, even if one permutation fails matrix: os: [ windows-latest ] mailkitlite: [ true ] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # fetching all submodules: true - name: Setup dotnet uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: publish AOT testApp, assert static analysis warning count, and run the app shell: pwsh run: .\scripts\test-aot-compatibility.ps1 ${{ matrix.mailkitlite }} ================================================ FILE: .github/workflows/codeql.yml ================================================ name: "CodeQL" on: push: branches: [ "master" ] pull_request: branches: [ "master" ] schedule: - cron: '38 12 * * 1' jobs: analyze: name: Analyze # Runner size impacts CodeQL analysis time. To learn more, please see: # - https://gh.io/recommended-hardware-resources-for-running-codeql # - https://gh.io/supported-runners-and-hardware-resources # - https://gh.io/using-larger-runners # Consider using larger runners for possible analysis time improvements. runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'csharp' ] steps: - name: Setup/Install the .NET 8 SDK uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Checkout repository uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} submodules: recursive fetch-depth: 0 - name: Run .NET restore shell: pwsh run: | dotnet restore MailKit.sln # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality - name: Build continue-on-error: false shell: pwsh run: | dotnet msbuild MailKit.sln -property:Platform="Any CPU" -property:Configuration=Release - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 with: category: "/language:${{matrix.language}}" ================================================ FILE: .github/workflows/main.yml ================================================ name: Build on: [push, pull_request, workflow_dispatch] jobs: ci: runs-on: ${{ matrix.os }} strategy: matrix: os: [ windows-latest, ubuntu-latest ] build-configuration: [ Debug, Release ] outputs: latest-version: ${{ steps.semantic_version.outputs.version_num }} environment: ci env: SOLUTION_PATH: MailKit.sln BUILD_PLATFORM: Any CPU BUILD_CONFIGURATION: ${{ matrix.build-configuration }} GENERATE_CODE_COVERAGE: ${{ matrix.os == 'windows-latest' && matrix.build-configuration == 'Debug' }} MONO_RUNTIME: ${{ matrix.os != 'windows-latest' }} PUBLISH: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && matrix.os == 'windows-latest' && matrix.build-configuration == 'Release' }} steps: - name: Setup/Install the .NET 8 SDK id: install-netsdk8 uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Setup/Install the .NET 10 SDK id: install-netsdk uses: actions/setup-dotnet@v4 with: dotnet-version: 10.0.x - if: runner.os == 'Windows' name: Setup MSBuild id: setup_msbuild uses: microsoft/setup-msbuild@v2 - name: Checkout repository id: checkout_repo uses: actions/checkout@v3 with: token: ${{ secrets.GITHUB_TOKEN }} submodules: recursive fetch-depth: 0 - name: Get semantic version from csproj id: semantic_version shell: pwsh run: | $xml = [xml](gc MailKit/MailKit.csproj) $SEMANTIC_VERSION_NUMBER = $xml.Project.PropertyGroup.VersionPrefix $VERSION_NUM = $SEMANTIC_VERSION_NUMBER[0].Trim() Write-Host "version_num=${VERSION_NUM}" [IO.File]::AppendAllText($env:GITHUB_OUTPUT, "version_num=${VERSION_NUM}$([Environment]::NewLine)") - if: ${{ env.PUBLISH == 'true' }} name: Get latest tag id: get_latest_tag shell: pwsh run: | $LATEST_TAG = git -c 'versionsort.suffix=-' ls-remote --exit-code --refs --sort='version:refname' --tags "https://github.com/$env:GIT_URL.git" '*.*.*' | tail --lines=1 | cut --delimiter='/' --fields=3 Write-Host "tag=$LATEST_TAG" [IO.File]::AppendAllText($env:GITHUB_OUTPUT, "tag=${LATEST_TAG}$([Environment]::NewLine)") env: GIT_URL: ${{ github.repository }} - if: ${{ env.PUBLISH == 'true' && steps.semantic_version.outputs.version_num != steps.get_latest_tag.outputs.tag }} name: Add new tag to repo id: add_new_tag_to_repo continue-on-error: true shell: pwsh run: | git config --global user.name $env:GIT_USER_NAME git config --global user.email $env:GIT_USER_EMAIL git tag -a -m "Tagged for $env:NEW_VERSION_NUM" $env:NEW_VERSION_NUM git push --follow-tags env: GIT_USER_NAME: ${{ github.event.head_commit.author.username }} GIT_USER_EMAIL: ${{ github.event.head_commit.author.email }} NEW_VERSION_NUM: ${{ steps.semantic_version.outputs.version_num }} - name: Run .NET restore shell: pwsh run: | dotnet restore $env:SOLUTION_PATH - name: Run .NET tool restore shell: pwsh run: | dotnet tool restore - name: Build solution id: build_solution continue-on-error: true shell: pwsh run: | dotnet msbuild $env:SOLUTION_PATH -property:Platform=$env:BUILD_PLATFORM -property:Configuration=$env:BUILD_CONFIGURATION -property:MonoRuntime=$env:MONO_RUNTIME - name: Run unit tests id: run_unit_tests continue-on-error: true shell: pwsh run: | & ./scripts/test.ps1 -Configuration:$env:BUILD_CONFIGURATION -GenerateCodeCoverage:$env:GENERATE_CODE_COVERAGE - name: Upload unit test results id: upload_test_results continue-on-error: true uses: actions/upload-artifact@v4 with: name: MailKit.${{ steps.semantic_version.outputs.version_num }}.${{ github.run_number }}-${{ matrix.os }}-${{ matrix.build-configuration }}-TestResults.xml path: TestResult.xml - if: ${{ env.GENERATE_CODE_COVERAGE == 'true' }} name: Upload code coverage data to coveralls.io id: upload_to_coveralls shell: pwsh run: | & ./scripts/coveralls.ps1 env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} GIT_COMMIT_SHA: ${{ github.sha }} GIT_REF: ${{ github.ref }} GIT_ACTOR: ${{ github.event.head_commit.author.username }} GIT_ACTOR_EMAIL: ${{ github.event.head_commit.author.email }} GIT_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} COVERALLS_JOB_ID: ${{ steps.semantic_version.outputs.version_num }}.${{ github.run_number }} - if: ${{ env.PUBLISH == 'true' }} name: Create NuGet package id: create_nuget_package shell: pwsh run: | nuget pack nuget/MailKit.nuspec -Version "$env:LATEST_VERSION.$env:GITHUB_RUN_NUMBER" env: LATEST_VERSION: ${{ steps.semantic_version.outputs.version_num }} - if: ${{ env.PUBLISH == 'true' }} name: Push NuGet package to MyGet id: push_nuget_package shell: pwsh run: | nuget push $env:NUGET_PKG_PATH -ApiKey $env:MYGET_API_KEY -Source https://www.myget.org/F/mimekit/api/v3/index.json env: NUGET_PKG_PATH: MailKit.${{ steps.semantic_version.outputs.version_num }}.${{ github.run_number }}.nupkg MYGET_API_KEY: ${{ secrets.MYGET_API_KEY }} - if: ${{ env.PUBLISH == 'true' }} name: Upload NuGet package as artifact id: upload_nuget_package uses: actions/upload-artifact@v4 with: name: MailKit.${{ steps.semantic_version.outputs.version_num }}.${{ github.run_number }}.nupkg path: MailKit.${{ steps.semantic_version.outputs.version_num }}.${{ github.run_number }}.nupkg # Built with ❤ by [Pipeline Foundation](https://pipeline.foundation) ================================================ FILE: .gitignore ================================================ MailKit/Resources/Resource.designer.cs *.csproj.nuget.dgspec.json *.csproj.nuget.cache *project.lock.json *.userprefs *.user *.suo *~ test-results packages obj bin .vs *.patch *.tree *.zip .idea .DS_Store ================================================ FILE: .gitmodules ================================================ [submodule "submodules/MimeKit"] path = submodules/MimeKit url = https://github.com/jstedfast/MimeKit.git ================================================ FILE: AotCompatibility/AotCompatibility.csproj ================================================  Exe net8.0 enable enable true false true true false ================================================ FILE: AotCompatibility/Program.cs ================================================ // // Program.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2024 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using MimeKit; using MailKit; using MailKit.Net; using MailKit.Net.Imap; using MailKit.Net.Pop3; using MailKit.Net.Smtp; namespace AotCompatibility { class Program { static int Main (string[] args) { try { Encoding.RegisterProvider (CodePagesEncodingProvider.Instance); var message = new MimeMessage (); using (var imap = new ImapClient ()) {} using (var pop3 = new Pop3Client ()) {} using (var smtp = new SmtpClient ()) {} return 0; } catch (Exception ex) { Console.WriteLine (ex); return -1; } } } } ================================================ FILE: Documentation/Content/Creating-Messages.aml ================================================  MimeKit provides a number of ways to create messages.
Creating a Simple Message Creating MIME messages using MimeKit is really trivial. A T:MimeKit.TextPart is a leaf-node MIME part with a text media-type. The first argument to the TextPart constructor specifies the media-subtype, in this case, plain. Another media subtype you are probably familiar with is the html subtype. Some other examples include enriched, rtf, and xml. The P:MimeKit.TextPart.Text property is the easiest way to both get and set the string content of the MIME part.
Creating a Message with Attachments Attachments are just like any other T:MimeKit.MimePart, the only difference is that they typically have a Content-Disposition header with a value of attachment instead of inline or no Content-Disposition header at all. Of course, that is just a simple example. A lot of modern mail clients such as Outlook or Thunderbird will send out both a text/html and a text/plain version of the message text. To do this, you'd create a T:MimeKit.TextPart for each part and then add them to a multipart/alternative like so:
Using a BodyBuilder If you are used to N:System.Net.Mail's API for creating messages, you will probably find using a T:MimeKit.BodyBuilder much more friendly than manually creating the tree of MIME parts. Here's how you could create a message body using a T:MimeKit.BodyBuilder:
Importing from System.Net.Mail To make things even simpler still, MimeKit allows you to explicitly cast a T:System.Net.Mail.MailMessage to a T:MimeKit.MimeMessage.
================================================ FILE: Documentation/Content/Frequently-Asked-Questions.aml ================================================
Are MimeKit and MailKit completely free? Can I use them in my proprietary product(s)? Yes. MimeKit and MailKit are both completely free and open source. They are both covered under the MIT https://opensource.org/licenses/MIT _blank license.
Why do I get "NotSupportedException: No data is available for encoding ######."? In .NET Core, Microsoft decided to split out the non-Unicode text encodings into a separate NuGet package called System.Text.Encoding.CodePages https://www.nuget.org/packages/System.Text.Encoding.CodePages _blank . MimeKit already pulls in a reference to this NuGet package, so you shouldn't need to add a reference to it in your project. That said, you will still need to register the encoding provider. It is recommended that you add the following line of code to your program initialization (e.g. the beginning of your program's Main() method): System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
Why does text show up garbled in my ASP.NET Core / .NET Core / .NET 5+ app? .NET Core (and ASP.NET Core by extension) and .NET 5 (and later) only provide the Unicode encodings, ASCII and ISO-8859-1 by default. Other text encodings are not available to your application unless your application registers https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.registerprovider?view=net-5.0 _blank the encoding provider that provides all of the additional encodings. First, add a package reference for the System.Text.Encoding.CodePages https://www.nuget.org/packages/System.Text.Encoding.CodePages _blank nuget package to your project and then register the additional text encodings using the following code snippet: System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance); Note: The above code snippet should be safe to call in .NET Framework versions >= 4.6 as well.
Why do I get a TypeLoadException when I try to create a new MimeMessage? This only seems to happen in cases where the application is built for .NET Framework (v4.x) and seems to be most common for ASP.NET web applications that were built using Visual Studio 2019 (it is unclear whether this happens with Visual Studio 2022 as well). The issue is that some (older?) versions of MSBuild do not correctly generate *.dll.config, app.config and/or web.config files with proper assembly version binding redirects. If this problem is happening to you, make sure to use MimeKit and MailKit >= v4.0 which include MimeKit.dll.config and MailKit.dll.config. The next step is to manually edit your application's app.config (or web.config) to add a binding redirect for System.Runtime.CompilerServices.Unsafe: <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
Why do I get "An error occurred while attempting to establish an SSL or TLS connection." when I try to Connect? When you get an exception with that error message, it usually means that you are encountering one of the following scenarios: The mail server does not support SSL on the specified port. There are 2 different ways to use SSL/TLS encryption with mail servers. The first way is to enable SSL/TLS encryption immediately upon connecting to the SMTP, POP3 or IMAP server. This method requires an "SSL port" because the standard port defined for the protocol is meant for plain-text communication. The second way is via a STARTTLS command (aka STLS for POP3) that is optionally supported by the server. Below is a table of the protocols supported by MailKit and the standard plain-text ports (which either do not support any SSL/TLS encryption at all or only via the STARTTLS command extension) and the SSL ports which require SSL/TLS encryption immediately upon a successful connection to the remote host. Protocol Standard Port SSL Port SMTP 25 or 587 465 POP3 110 995 IMAP 143 993
It is important to use the correct T:MailKit.Security.SecureSocketOptions for the port that you are connecting to. If you are connecting to one of the standard ports above, you will need to use SecureSocketOptions.None, SecureSocketOptions.StartTls or SecureSocketOptions.StartTlsWhenAvailable. If you are connecting to one of the SSL ports, you will need to use SecureSocketOptions.SslOnConnect. You could also try using SecureSocketOptions.Auto which works by choosing the appropriate option to use by comparing the specified port to the ports in the above table.
The mail server that you are connecting to is using an expired (or otherwise untrusted) SSL certificate. Often times, mail servers will use self-signed certificates instead of using a certificate that has been signed by a trusted Certificate Authority. Another potential pitfall is when locally installed anti-virus software replaces the certificate in order to scan web traffic for viruses. When your system is unable to validate the mail server's certificate because it is not signed by a known and trusted Certificate Authority, the above error will occur. You can work around this problem by supplying a custom RemoteServerCertificateValidationCallback https://msdn.microsoft.com/en-us/library/ms145054 _blank and setting it on the client's P:MailKit.MailService.ServerCertificateValidationCallback property. In the simplest example, you could do something like this (although I would strongly recommend against it in production use): using (var client = new SmtpClient ()) { client.ServerCertificateValidationCallback = (s,c,h,e) => true; client.Connect (hostName, port, SecureSocketOptions.Auto); // ... } A better solution might be to compare the certificate's common name, issuer, serial number, and fingerprint to known values to make sure that the certificate can be trusted. Take the following code snippet as an example of how to do this: bool MyServerCertificateValidationCallback (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) return true; // Note: The following code casts to an X509Certificate2 because it's easier to get the // values for comparison, but it's possible to get them from an X509Certificate as well. if (certificate is X509Certificate2 certificate2) { var cn = certificate2.GetNameInfo (X509NameType.SimpleName, false); var fingerprint = certificate2.Thumbprint; var serial = certificate2.SerialNumber; var issuer = certificate2.Issuer; return cn == "imap.gmail.com" && issuer == "CN=GTS CA 1O1, O=Google Trust Services, C=US" && serial == "00BABE95B167C9ECAF08000000006065B6" && fingerprint == "E79A011EF55EEC72D2B7E391D193761372796836"; } return false; } The downside of the above example is that it requires hard-coding known values for "trusted" mail server certificates which can quickly become unwieldy to deal with if your program is meant to be used with a wide range of mail servers. The best approach would be to prompt the user with a dialog explaining that the certificate is not trusted for the reasons enumerated by the SslPolicyErrors https://docs.microsoft.com/en-us/dotnet/api/system.net.security.sslpolicyerrors?view=netframework-4.8 _blank argument as well as potentially the errors provided in the X509Chain https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.x509chain?view=netframework-4.8 _blank If the user wishes to accept the risks of trusting the certificate, your program could then return true. For more details on writing a custom SSL certificate validation callback, it may be worth checking out the SslCertificateValidation.cs https://github.com/jstedfast/MailKit/blob/master/Documentation/Examples/SslCertificateValidation.cs _blank example. A Certificate Authority CRL server for one or more of the certificates in the chain is temporarily unavailable. Most Certificate Authorities are probably pretty good at keeping their CRL and/or OCSP servers up 24/7, but occasionally they do go down or are otherwise unreachable due to other network problems between you and the server. When this happens, it becomes impossible to check the revocation status of one or more of the certificates in the chain. To ignore revocation checks, you can set the P:MailKit.MailService.CheckCertificateRevocation property of the IMAP, POP3 or SMTP client to false before you connect: using (var client = new SmtpClient ()) { client.CheckCertificateRevocation = false; client.Connect (hostName, port, SecureSocketOptions.Auto); // ... } The server does not support the same set of SSL/TLS protocols that the client is configured to use. MailKit attempts to keep up with the latest security recommendations and so is continuously removing older SSL and TLS protocols that are no longer considered secure from the default configuration. This often means that MailKit's SMTP, POP3 and IMAP clients will fail to connect to servers that are still using older SSL and TLS protocols. Currently, the SSL and TLS protocols that are not supported by default are: SSL v2.0, SSL v3.0, TLS v1.0 and TLS v1.1. You can override MailKit's default set of supported SSL and TLS protocols https://docs.microsoft.com/en-us/dotnet/api/system.security.authentication.sslprotocols?view=netframework-4.8 _blank by setting the value of the P:MailKit.MailService.SslProtocols property on your SMTP, POP3 or IMAP client. For example: using (var client = new SmtpClient ()) { // Allow SSLv3.0 and all versions of TLS client.SslProtocols = SslProtocols.Ssl3 | SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13; client.Connect ("smtp.gmail.com", 465, true); // ... }
How do I debug SMTP, POP3 and/or IMAP errors? All of MailKit's client implementations have a constructor that takes a nifty T:MailKit.IProtocolLogger interface for logging client/server communications. Out of the box, you can use the handy T:MailKit.ProtocolLogger class. Here are some examples of how to use it: // log to a file called 'imap.log' var client = new ImapClient (new ProtocolLogger ("imap.log")); // log to standard output (i.e. the console) var client = new ImapClient (new ProtocolLogger (Console.OpenStandardOutput ())); Note: When submitting a protocol log as part of a bug report, make sure to scrub any sensitive information including your authentication credentials. This information will generally be the base64 encoded blob immediately following an AUTHENTICATE or AUTH command (depending on the type of server) or the cleartext username and password strings in a LOGIN command. The only exception to this case is if you are authenticating with NTLM in which case I may need this information, but only if the bug/error is in the authentication step.
Why doesn't MailKit find some of my GMail POP3 or IMAP messages? By default, GMail's POP3 and IMAP server does not behave like standard POP3 or IMAP servers and hides messages from clients using those protocols (as well as having other non-standard behavior). If you want to configure your GMail POP3 settings to behave the way POP3 is intended to behave, you'll need to log in to your GMail account via your web browser and navigate to the Forwarding and POP/IMAP tab of your GMail Settings page and make the following changes in the POP3 Download section: Enable POP for all mail (even if it has already been downloaded). When messages are accessed with POP, keep GMail's copy in the Inbox.
How do I access GMail using MailKit? As of September 30th, 2024, authentication using only a username and password is no longer supported by Google https://support.google.com/accounts/answer/6010255?hl=en _blank . There are now only 2 options to choose from: Use OAuth 2.0 to authenticate with GMail. This is the recommended approach. Use an App Password to authenticate with GMail. This is a less secure option and is not recommended. It is only available for accounts that have 2-Step Verification enabled. To use an App password, you will first need to turn on 2-Step Verification https://support.google.com/accounts/answer/185839 _blank . Once 2-Step Verification is turned on, you can generate an App password https://myaccount.google.com/apppasswords _blank . Then, assuming that your GMail account is user@gmail.com, you would use the following code snippet to connect to GMail via IMAP: using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("user@gmail.com", "app-specific-password"); // do stuff... client.Disconnect (true); } Connecting via POP3 or SMTP is identical except for the host names and ports (and, of course, you'd use a Pop3Client or SmtpClient as appropriate).
How can I log in to a GMail account using OAuth 2.0? The first thing you need to do is follow Google's instructions https://developers.google.com/accounts/docs/OAuth2 _blank for obtaining OAuth 2.0 credentials for your application. Or, as an alternative set of step-by-step instructions, you can follow the directions that I have written https://github.com/jstedfast/MailKit/blob/master/GMailOAuth2.md _blank (complete with screenshots). Once you've done that, the easiest way to obtain an access token is to use Google's Google.Apis.Auth https://www.nuget.org/packages/Google.Apis.Auth/ _blank library: const string GMailAccount = "username@gmail.com"; var clientSecrets = new ClientSecrets { ClientId = "XXX.apps.googleusercontent.com", ClientSecret = "XXX" }; var codeFlow = new GoogleAuthorizationCodeFlow (new GoogleAuthorizationCodeFlow.Initializer { // Cache tokens in ~/.local/share/google-filedatastore/CredentialCacheFolder on Linux/Mac DataStore = new FileDataStore ("CredentialCacheFolder", false), Scopes = new [] { "https://mail.google.com/" }, ClientSecrets = clientSecrets }); var codeReceiver = new LocalServerCodeReceiver (); var authCode = new AuthorizationCodeInstalledApp (codeFlow, codeReceiver); var credential = await authCode.AuthorizeAsync (GMailAccount, CancellationToken.None); if (authCode.ShouldRequestAuthorizationCode (credential.Token)) await credential.RefreshTokenAsync (CancellationToken.None); var oauth2 = new SaslMechanismOAuth2 (credential.UserId, credential.Token.AccessToken); using (var client = new ImapClient ()) { await client.ConnectAsync ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync (oauth2); await client.DisconnectAsync (true); }
How do I create a message with attachments? To construct a message with attachments, the first thing you'll need to do is create a multipart/mixed container which you'll then want to add the message body to first. Once you've added the body, you can then add MIME parts to it that contain the content of the files you'd like to attach, being sure to set the Content-Disposition header value to attachment. You'll probably also want to set the filename parameter on the Content-Disposition header as well as the name parameter on the Content-Type header. The most convenient way to do this is to use the P:MimeKit.MimePart.FileName property which will set both parameters for you as well as setting the Content-Disposition header value to attachment if it has not already been set to something else. A simpler way to construct messages with attachments is to take advantage of the T:MimeKit.BodyBuilder class. For more information, see Creating Messages.
How do I get the main body of a message? (Note: for the TL;DR version, skip to the end) MIME is a tree structure of parts. There are multiparts which contain other parts (even other multiparts). There are message parts which contain messages. And finally, there are leaf-node parts which contain content. There are a few common message structures: The message contains only a text/plain or text/html part (easy, just use that). The message contains a multipart/alternative which will typically look a bit like this:
multipart/alternative
  text/plain
  text/html
Same as above, but the html part is inside a multipart/related so that it can embed images:
multipart/alternative
  text/plain
  multipart/related
    text/html
    image/jpeg
    image/png
The message contains a textual body part as well as some attachments:
multipart/mixed
  text/plain
  application/octet-stream
  application/zip
The same as above, but with the first part replaced with either #2 or #3 To illustrate:
multipart/mixed
  multipart/alternative
    text/plain
    text/html
  application/octet-stream
  application/zip
Or:
multipart/mixed
  multipart/alternative
    text/plain
    multipart/related
      text/html
      image/jpeg
      image/png
  application/octet-stream
  application/zip
For your convenience, the T:MimeKit.MimeMessage class has 2 properties that you may find useful: P:MimeKit.MimeMessage.TextBody and P:MimeKit.MimeMessage.HtmlBody. For more information, see .
How do I tell if a message has attachments? In most cases, a message with a body that has a MIME-type of multipart/mixed containing more than a single part probably has attachments. As illustrated above, the first part of a multipart/mixed is typically the textual body of the message, but it is not always quite that simple. In general, MIME attachments will have a Content-Disposition header with a value of attachment. To get the list of body parts matching this criteria, you can use the P:MimeKit.MimeMessage.Attachments property. Unfortunately, not all mail clients follow this convention and so you may need to write your own custom logic. For example, you may wish to treat all body parts having a name or filename parameter set on them: var attachments = message.BodyParts.OfType<MimePart> ().Where (part => !string.IsNullOrEmpty (part.FileName)); A more sophisticated approach is to treat body parts not referenced by the main textual body part of the message as attachments. In other words, treat any body part not used for rendering the message as an attachment. For an example on how to do this, consider the following code snippets: And the way you'd use this visitor might look something like this: Once you've rendered the message using the above technique, you'll have a list of attachments that were not used, even if they did not match the simplistic criteria used by the P:MimeKit.MimeMessage.Attachments property.
Why doesn't the MimeMessage class implement ISerializable so that I can serialize a message to disk and read it back later? The MimeKit API was designed to use the existing MIME format for serialization. In light of this, the ability to use the .NET serialization API and format did not make much sense to support. You can easily serialize a MimeMessage to a stream using the Overload:MimeKit.MimeMessage.WriteTo methods.
How do I save messages? One you've got a T:MimeKit.MimeMessage, you can save it to a file using the Overload:MimeKit.MimeMessage.WriteTo method: message.WriteTo ("message.eml"); The WriteTo method also has overloads that allow you to write the message to a Stream instead. By default, the WriteTo method will save the message using DOS line-endings on Windows and Unix line-endings on Unix-based systems such as macOS and Linux. You can override this behavior by passing a T:MimeKit.FormatOptions argument to the method: // clone the default formatting options var format = FormatOptions.Default.Clone (); // override the line-endings to be DOS no matter what platform we are on format.NewLineFormat = NewLineFormat.Dos; message.WriteTo (format, "message.eml");
How do I save attachments? If you've already got a T:MimeKit.MimePart that represents the attachment that you'd like to save, here's how you might save it: Pretty simple, right? But what if your attachment is actually a T:MimeKit.MessagePart? To save the content of a message/rfc822 part, you'd use the following code snippet: If you are iterating over all of the attachments in a message, you might do something like this:
How do I get the email addresses in the From, To, and Cc headers? The P:MimeKit.MimeMessage.From, P:MimeKit.MimeMessage.To, and P:MimeKit.MimeMessage.Cc properties of a T:MimeKit.MimeMessage are all of type T:MimeKit.InternetAddressList. An T:MimeKit.InternetAddressList is a list of T:MimeKit.InternetAddress items. This is where some people start to get lost, conceptually, because T:MimeKit.InternetAddress is an abstract class that only really has a P:MimeKit.InternetAddress.Name property. As you've probably already discovered, the P:MimeKit.InternetAddress.Name property contains the name of the person (if available), but what you probably want is his or her email address, not their name. So how do you get it? To get the email address, you'll need to figure out what subclass of address each T:MimeKit.InternetAddress really is. There are 2 direct subclasses of T:MimeKit.InternetAddress. They are: T:MimeKit.GroupAddress and T:MimeKit.MailboxAddress. A T:MimeKit.GroupAddress is a named group of more T:MimeKit.InternetAddress items that are contained within the P:MimeKit.GroupAddress.Members property. To get an idea of what a group address represents, consider the following examples: To: My Friends: Joey <joey@friends.com>, Monica <monica@friends.com>, "Mrs. Chanandler Bong" <chandler@friends.com>, Ross <ross@friends.com>, Rachel <rachel@friends.com>; In the above example, the P:MimeKit.MimeMessage.To header's T:MimeKit.InternetAddressList will contain only 1 item which will be a T:MimeKit.GroupAddress with a P:MimeKit.InternetAddress.Name value of My Friends. The P:MimeKit.GroupAddress.Members property of the T:MimeKit.GroupAddress will contain 5 more T:MimeKit.InternetAddress items (which will all be instances of T:MimeKit.MailboxAddress). The above example, however, is not very likely to ever be seen in messages you deal with. A far more common example would be the one below: To: undisclosed-recipients:; Most of the time, the P:MimeKit.MimeMessage.From, P:MimeKit.MimeMessage.To, and P:MimeKit.MimeMessage.Cc headers will only contain mailbox addresses. As you will notice, a T:MimeKit.MailboxAddress has an P:MimeKit.MailboxAddress.Address property which will contain the email address of the mailbox. In the following example, the P:MimeKit.MailboxAddress.Address property will contain the value john@smith.com: To: John Smith <john@smith.com> If you only care about getting a flattened list of the mailbox addresses in one of the address headers, you can do something like this: foreach (var mailbox in message.To.Mailboxes) Console.WriteLine ("{0}'s email address is {1}", mailbox.Name, mailbox.Address);
Why do attachments with Unicode filenames appear as "ATT0####.dat" in Outlook? An attachment filename is stored as a MIME parameter on the Content-Disposition header. Unfortunately, the original MIME specifications did not specify a method for encoding non-ascii filenames. In 1997, rfc2184 https://tools.ietf.org/html/rfc2184 _blank (later updated by rfc2231 https://tools.ietf.org/html/rfc2231 _blank ) was published which specified an encoding mechanism to use for encoding them. Since there was a window in time where the MIME specifications did not define a way to encode them, some mail client developers decided to use the mechanism described by rfc2047 https://tools.ietf.org/html/rfc2047 _blank which was meant for encoding non-ASCII text in headers. While this may at first seem logical, the problem with this approach was that rfc2047 encoded-word tokens are not allowed to be in quotes (as well as some other issues) and so another, more appropriate, encoding mechanism was needed. Outlook is one of those mail clients which decided to encode filenames using the mechanism described in rfc2047 and until Outlook 2007, did not support filenames encoded using the mechanism defined in rfc2231. As of MimeKit v1.2.18, it is possible to configure MimeKit to use the rfc2047 encoding mechanism for filenames in the following two ways: The first way is to set the encoding method on each individual T:MimeKit.Parameter: Parameter param; if (attachment.ContentDisposition.Parameters.TryGetValue ("filename", out param)) param.EncodingMethod = ParameterEncodingMethod.Rfc2047; The other way is to use a T:MimeKit.FormatOptions: var options = FormatOptions.Default.Clone (); options.ParameterEncodingMethod = ParameterEncodingMethod.Rfc2047; message.WriteTo (options, stream);
How do I decrypt PGP messages that are embedded in the main message text? Some PGP-enabled mail clients, such as Thunderbird, embed encrypted PGP blurbs within the text/plain body of the message rather than using the PGP/MIME format that MimeKit prefers. These messages often look something like this: To deal with these kinds of messages, MimeKit's T:MimeKit.Cryptography.OpenPgpContext includes a M:MimeKit.Cryptography.OpenPgpContext.DecryptTo(System.IO.Stream,System.IO.Stream,System.Threading.CancellationToken) method which can be used to get the raw decrypted stream. The method variant that has a T:MimeKit.Cryptography.DigitalSignatureCollection output parameter is useful in cases where the encrypted PGP blurb is also digitally signed, allowing you to get your hands on the list of digital signatures in order for you to verify each of them. To decrypt the sample message above, you could use the following code snippet:
How do I reply to a message using MimeKit? Replying to a message is fairly simple. For the most part, you'd just create the reply message the same way you'd create any other message. There are only a few slight differences: In the reply message, you'll want to prefix the Subject header with "Re: " if the prefix doesn't already exist in the message you are replying to (in other words, if you are replying to a message with a Subject of "Re: party tomorrow night!", you would not prefix it with another "Re: "). You will want to set the reply message's In-Reply-To header to the value of the Message-Id header in the original message. You will want to copy the original message's References header into the reply message's References header and then append the original message's Message-Id header. You will probably want to "quote" the original message's text in the reply. If this logic were to be expressed in code, it might look something like this: But what if you wanted to reply to a message and quote the HTML formatting of the original message body (assuming it has an HTML body) while still including the embedded images? This gets a bit more complicated, but it's still doable... The first thing we'd need to do is implement our own T:MimeKit.MimeVisitor to handle this:
How do I forward a message? There are 2 common ways of forwarding a message: attaching the original message as an attachment and inlining the message body much like replying typically does. Which method you choose is up to you. To forward a message by attaching it as an attachment, you would do do something like this: To forward a message by inlining the original message's text content, you can do something like this:
How do I get all of the unread messages in a folder? The easiest way is to search for all of the messages that do not have the \Seen flag on them, like so: foreach (var uid in folder.Search (SearchQuery.NotSeen)) { var message = folder.GetMessage (uid); }
How would I parse multipart/form-data from an HTTP web request? Since classes like T:System.Net.HttpWebRequest take care of parsing the HTTP headers (which includes the Content-Type header) and only offer a content stream to consume, MimeKit provides a way to deal with this using the following two static methods: M:MimeKit.MimeEntity.Load(MimeKit.ParserOptions,MimeKit.ContentType,System.IO.Stream,System.Threading.CancellationToken) and M:MimeKit.MimeEntity.Load(MimeKit.ContentType,System.IO.Stream,System.Threading.CancellationToken) Here's how you might use these methods: If the multipart/form-data HTTP response is expected to be large and you do not wish for the content to be read into memory, you can use the following approach:
================================================ FILE: Documentation/Content/Getting-Started.aml ================================================
Adding MailKit to your project via NuGet In Visual Studio's Package Manager Console http://docs.nuget.org/docs/start-here/using-the-package-manager-console , enter the following command: Install-Package MailKit
Building MailKit from Source First, you'll need to clone MailKit from the GitHub https://github.com/jstedfast _blank repository: git clone https://github.com/jstedfast/MailKit.git Then, since MailKit makes use of git submodules, you will need to initialize and update the submodules using the following command from within the MailKit directory: git submodule update --init --recursive In the top-level MailKit source directory, there are several solution files: MailKit.sln includes projects for .NET 4.5.2, .NET 4.6, .NET 4.7, .NET 4.8, .NET 5.0, .NET 6.0, .NETStandard 2.0, .NETStandard 2.1, and the unit tests. MailKit.Documentation.sln includes projects for generating the documentation that you are reading right now. Once you've opened the appropriate MailKit solution file in either Xamarin Studio or Visual Studio (either will work), you can choose the Debug or Release build configuration and then build.
================================================ FILE: Documentation/Content/Introduction.aml ================================================ MimeKit and MailKit are popular fully-featured email frameworks for .NET
Feature Overview Security SASL Authentication Supports the ANONYMOUS, CRAM-MD5, DIGEST-MD5, LOGIN, NTLM, OAUTHBEARER, PLAIN, SCRAM-SHA-1(-PLUS), SCRAM-SHA-256(-PLUS), SCRAM-SHA-512(-PLUS), and XOAUTH2 mechanisms. Supports S/MIME v3.2. Supports OpenPGP. Supports DKIM-Signatures. Supports ARC signatures. SMTP Client Supports SSL and TLS. Supports the STARTTLS, SIZE, DSN, 8BITMIME, PIPELINING, BINARYMIME, and SMTPUTF8 extensions. POP3 Client Supports SSL and TLS. Supports the STLS, UIDL, PIPELINING, UTF8, and LANG extensions. IMAP Client Supports SSL and TLS. Supports the ACL, QUOTA, LITERAL+, IDLE, NAMESPACE, ID, CHILDREN, LOGINDISABLED, STARTTLS, MULTIAPPEND, UNSELECT, UIDPLUS, CONDSTORE, ESEARCH, SASL-ID, COMPRESS, WITHIN, ENABLE, QRESYNC, SORT, THREAD, ANNOTATE, LIST-EXTENDED, ESORT, METADATA, METADATA-SERVER, NOTIFY, FILTERS, LIST-STATUS, SORT=DISPLAY, SPECIAL-USE, CREATE-SPECIAL-USE, SEARCH=FUZZY, MOVE, UTF8=ACCEPT, UTF8=ONLY, LITERAL-, APPENDLIMIT, STATUS=SIZE, OBJECTID, REPLACE, SAVEDATE, XLIST, and Google Mail (X-GM-EXT-1) extensions. Proxy Support Supports HTTP(S), SOCKS4, SOCKS4a, and SOCKS5. Fully cancellable and asynchronous Connect methods. MIME Parser Flexible: allows overriding default classes for any MIME-type. High performance: faster than any other .NET MIME parser on the market. Rivals the performance of even the fastest C++ parsers. Robust: handles a wide variety of broken MIME formatting with ease. All API's that might block allow cancellation via T:System.Threading.CancellationToken. All API's that perform I/O have async variants. Client-side sorting and threading of messages. Supports .NET 4.5.2, .NET 4.6, .NET 4.7, .NET 4.8, .NET 5.0, .NETStandard 2.0, Xamarin.Android, Xamarin.iOS, Windows Phone 8.1, and more.
History As a developer and user of email clients, I had come to realize that the vast majority of email client (and server) software had less-than-satisfactory MIME implementations. More often than not these email clients created broken MIME messages and/or would incorrectly try to parse a MIME message thus subtracting from the full benefits that MIME was meant to provide. MimeKit is meant to address this issue by following the MIME specification as closely as possible while also providing programmers with an extremely easy to use high-level API. This led me, at first, to implement another MIME parser library called GMime http://spruce.sourceforge.net/gmime _blank which was implemented in C and later added a C# binding called GMime-Sharp. Now that I typically find myself working in C# rather than lower level languages like C, I decided to begin writing a new parser in C# which would not depend on GMime. This would also allow me to have more flexibility in that I'd be able use Generics and create a more .NET-compliant API.
Performance While mainstream beliefs may suggest that C# can never be as fast as C, it turns out that with a bit of creative parser design and a few clever optimizations [ 1 http://jeffreystedfast.blogspot.com/2013/09/optimization-tips-tricks-used-by.html _blank ][ 2 http://jeffreystedfast.blogspot.com/2013/10/optimization-tips-tricks-used-by.html _blank ], MimeKit's performance is actually on par with GMime http://jeffreystedfast.blogspot.com/2014/03/gmime-gets-speed-boost.html _blank . Since GMime is pretty well-known as a high-performance native MIME parser and MimeKit more-or-less matches GMime's performance, it stands to reason that MimeKit is likely unsurpassed in performance in the .NET MIME parser space. For a comparison, as I blogged here http://jeffreystedfast.blogspot.com/2013/10/optimization-tips-tricks-used-by.html _blank (I have since optimized MimeKit by at least another 30%), MimeKit is more than 25x faster than OpenPOP.NET, 75x faster than SharpMimeTools, and 65x faster than regex-based parsers. Even the commercial MIME parser offerings such as LimiLabs' Mail.dll and NewtonIdeas' Mime4Net cannot even come close to matching MimeKit's performance (they are both orders of magnitude slower than MimeKit).
Donate MimeKit and MailKit are personal open source projects that I have put thousands of hours into perfecting by continuously improving the API based on feedback from developers like yourself, writing documentation, and optimizing with the goal of making them the very best email frameworks for .NET. I need your help to achieve this. Donating helps pay for things such as web hosting, domain registration and licenses for developer tools such as a performance profiler, memory profiler, a static code analysis tool, and more. If MimeKit and/or MailKit have been helpful to you, please consider donating. Your contributions will be greatly appreciated.

Click here to lend your support to MimeKit and MailKit by making a donation!

================================================ FILE: Documentation/Content/License.aml ================================================
MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Copyright Notices MimeKit and MailKit are Copyright © 2013-2026 Jeffrey Stedfast
================================================ FILE: Documentation/Content/Parsing-Messages.aml ================================================  One of the more common operations that MimeKit is meant for is parsing email messages from arbitrary streams. There are two ways of accomplishing this task.
Using the Load methods The easiest way is to use one of the Load methods on T:MimeKit.MimeMessage.
Using MimeParser directly The second way is to use the T:MimeKit.MimeParser class. For the most part, using the MimeParser directly is not necessary unless you wish to parse a Unix mbox file stream. However, this is how you would do it: For Unix mbox file streams, you would use the parser like this:
================================================ FILE: Documentation/Content/Working-With-Messages.aml ================================================ MimeKit provides a number of ways to get the data you want from a message.
The Message Structure A common misunderstanding about email is that there is a well-defined message body and then a list of attachments. This is not really the case. The reality is that MIME is a tree structure of content, much like a file system. Luckily, MIME does define a set of general rules for how mail clients should interpret this tree structure of MIME parts. The Content-Disposition header is meant to provide hints to the receiving client as to which parts are meant to be displayed as part of the message body and which are meant to be interpreted as attachments. The Content-Disposition header will generally have one of two values: inline or attachment. The meaning of these values should be fairly obvious. If the value is attachment, then the content of said MIME part is meant to be presented as a file attachment separate from the core message. However, if the value is inline, then the content of that MIME part is meant to be displayed inline within the mail client's rendering of the core message body. If the Content-Disposition header does not exist, then it should be treated as if the value were inline. Technically, every part that lacks a Content-Disposition header or that is marked as inline, then, is part of the core message body. There's a bit more to it than that, though. Modern MIME messages will often contain a multipart/alternative MIME container which will generally contain a text/plain and text/html version of the text that the sender wrote. The text/html version is typically formatted much closer to what the sender saw in his or her WYSIWYG editor than the text/plain version. The reason for sending the message text in both formats is that not all mail clients are capable of displaying HTML. The receiving client should only display one of the alternative views contained within the multipart/alternative container. Since alternative views are listed in order of least faithful to most faithful with what the sender saw in his or her WYSIWYG editor, the receiving client should walk over the list of alternative views starting at the end and working backwards until it finds a part that it is capable of displaying. Example:
multipart/alternative
  text/plain
  text/html
As seen in the example above, the text/html part is listed last because it is the most faithful to what the sender saw in his or her WYSIWYG editor when writing the message. To make matters even more complicated, sometimes modern mail clients will use a multipart/related MIME container instead of a simple text/html part in order to embed images and other multimedia content within the HTML. Example:
multipart/alternative
  text/plain
  multipart/related
    text/html
    image/jpeg
    video/mp4
    image/png
In the example above, one of the alternative views is a multipart/related container which contains an HTML version of the message body that references the sibling video and images. Now that you have a rough idea of how a message is structured and how to interpret various MIME entities, the next step is learning how to traverse the MIME tree using MimeKit.
Traversing a Message The P:MimeKit.MimeMessage.Body is the top-level MIME entity of the message. Generally, it will either be a T:MimeKit.TextPart or a T:MimeKit.Multipart. There are 3 ways of iterating over the tree structure of a message using MimeKit. The first way is to recursively traverse the MIME structure like this: A second way, which is a bit cleaner and doesn't require recursive methods, is to use a T:MimeKit.MimeIterator: And finally, for those that prefer to use the visitor pattern http://en.wikipedia.org/wiki/Visitor_pattern _blank , MimeKit includes the T:MimeKit.MimeVisitor class for visiting each node in the MIME tree structure. For example, the following MimeVisitor subclass could be used to generate HTML to be rendered by a browser control (such as T:System.Windows.Forms.WebBrowser ): And the way you'd use this visitor might look something like this:
Using the TextBody and HtmlBody Properties To simplify the common task of getting the text of a message, MimeKit includes two properties that can help you get the text/plain or text/html version of the message body. These are P:MimeKit.MimeMessage.TextBody and P:MimeKit.MimeMessage.HtmlBody, respectively. Keep in mind, however, that at least with the P:MimeKit.MimeMessage.HtmlBody property, it may be that the HTML part is a child of a multipart/related, allowing it to refer to images and other types of media that are also contained within that multipart/related entity. This property is really only a convenience property and is not a really good substitute for traversing the MIME structure yourself so that you may properly interpret related content.
Enumerating Body Parts Sometimes traversing the body of a message is overkill when all you really need to do is something quick & dirty. For this reason, MimeKit provides the P:MimeKit.MimeMessage.BodyParts and P:MimeKit.MimeMessage.Attachments properties which flatten out the hierarchy and allow you to iterate over all of the body parts (or attachments) in depth-first order.
Getting the Decoded Content of a MimePart At some point, you're going to want to extract the decoded content of a T:MimeKit.MimePart (such as an image) and save it to disk or feed it to a UI control to display it. Once you've found the T:MimeKit.MimePart object that you'd like to extract the content of, here's how you can save the decoded content to a file: You can also get access to the original raw content by "opening" the P:MimeKit.MimePart.Content. This might be useful if you want to pass the content off to a UI control that can do its own loading from a stream. There are a number of useful filters that can be applied to a T:MimeKit.IO.FilteredStream, so if you find this type of interface appealing, I would suggest taking a look at the available filters in the N:MimeKit.IO.Filters namespace or even write your own! The possibilities are limited only by your imagination.
================================================ FILE: Documentation/Content/Working-With-OpenPGP.aml ================================================
Creating your own OpenPGP Context Before you can start working with OpenPGP in MimeKit, you will first need to create and register your own T:MimeKit.Cryptography.OpenPgpContext. For the sake of simplicity, MimeKit includes a T:MimeKit.Cryptography.GnuPGContext that does most of the work of interoperating with the popular GnuPG https://www.gnupg.org _blank program for you. To register your class, you can use the following code snippet: Now you are ready to encrypt, decrypt, sign and verify messages using PGP!
Encrypting Messages with PGP/MIME PGP/MIME uses a MIME part with a multipart/encrypted mime-type to encapsulate encrypted data. To encrypt any T:MimeKit.MimeEntity, use the Overload:MimeKit.Cryptography.MultipartEncrypted.Encrypt method: When you know that you will be encrypting a message, it may be a good idea to use a T:MimeKit.Cryptography.SecureMailboxAddress instead of a T:MimeKit.MailboxAddress for each of the recipients, allowing you to specify the unique fingerprint of each recipient's PGP key.
Decrypting PGP/MIME Messages As mentioned earlier, PGP/MIME uses a multipart/encrypted part to encapsulate the encrypted content. A multipart/encrypted contains exactly 2 parts: the first T:MimeKit.MimeEntity is the version information while the second T:MimeKit.MimeEntity is the actual encrypted content and will typically be an application/octet-stream. The first thing you must do is find the T:MimeKit.Cryptography.MultipartEncrypted part (see the section on ).
Digitally Signing Messages using PGP/MIME PGP/MIME uses a MIME part with a multipart/signed mime-type to contain the signed content and the detached signature data. Here's how you might digitally sign a message using PGP/MIME: You can also do your own PGP key lookups instead of relying on email addresses to match up with the user's secret key.
Verifying PGP/MIME Digital Signatures As mentioned earlier, PGP/MIME uses a multipart/signed part to contain the signed content and the detached signature data. A multipart/signed contains exactly 2 parts: the first T:MimeKit.MimeEntity is the signed content while the second T:MimeKit.MimeEntity is the detached signature and, by default, will be an T:MimeKit.Cryptography.ApplicationPgpSignature part. Because the multipart/signed part may have been signed by multiple signers, it is important to verify each of the digital signatures (one for each signer) that are returned by the Overload:MimeKit.Cryptography.MultipartSigned.Verify method:
================================================ FILE: Documentation/Content/Working-With-SMime.aml ================================================
Creating your own S/MIME Context Before you can begin using MimeKit's S/MIME support, you will need to decide which database to use for certificate storage. If you are targeting any of the Xamarin platforms (or Linux), you won't need to do anything (although you certainly can if you want to) because, by default, MimeKit will automatically use the Mono.Data.Sqlite binding to SQLite https://www.sqlite.org/ _blank . If you are, however, on any of the Windows platforms, you'll need to pick a N:System.Data provider such as System.Data.SQLite https://www.nuget.org/packages/System.Data.SQLite _blank . Once you've made your choice and installed it (via NuGet or however), you'll need to implement your own T:MimeKit.Cryptography.SecureMimeContext subclass. Luckily, it's very simple to do. Assuming you've chosen System.Data.SQLite, here's how you'd implement your own T:MimeKit.Cryptography.SecureMimeContext class: To register your class, you can use the following code snippet: Now you are ready to encrypt, decrypt, sign and verify messages using S/MIME!
Encrypting Messages with S/MIME Instead of using a multipart/encrypted MIME part to encapsulate encrypted content like OpenPGP, S/MIME uses application/pkcs7-mime. To encrypt any T:MimeKit.MimeEntity, use the Overload:MimeKit.Cryptography.ApplicationPkcs7Mime.Encrypt method: When you know that you will be encrypting a message, it may be a good idea to use a T:MimeKit.Cryptography.SecureMailboxAddress instead of a T:MimeKit.MailboxAddress for each of the recipients, allowing you to specify the unique fingerprint of each recipient's X.509 certificate.
Decrypting S/MIME Messages As mentioned earlier, S/MIME uses an application/pkcs7-mime part with an smime-type parameter with a value of enveloped-data to encapsulate the encrypted content. The first thing you must do is find the T:MimeKit.Cryptography.ApplicationPkcs7Mime part (see the section on ).
Digitally Signing Messages using S/MIME S/MIME can use either a multipart/signed MIME part or a application/pkcs7-mime MIME part for signed data. To digitally sign a T:MimeKit.MimeEntity using a multipart/signed MIME part, it works exactly the same as it does for OpenPGP using Overload:MimeKit.Cryptography.MultipartSigned.Create You can also do your own certificate lookups instead of relying on email addresses to match up with the user's certificate. You can also choose to digitally sign a T:MimeKit.MimeEntity using the application/pkcs7-mime format using Overload:MimeKit.Cryptography.ApplicationPkcs7Mime.Sign When you know that you will be signing a message, it may be a good idea to use a T:MimeKit.Cryptography.SecureMailboxAddress instead of a T:MimeKit.MailboxAddress for the sender, allowing you to specify the unique fingerprint of the sender's X.509 certificate.
Verifying S/MIME Digital Signatures As mentioned earlier, S/MIME typically uses a multipart/signed part to contain the signed content and the detached signature data. A multipart/signed contains exactly 2 parts: the first T:MimeKit.MimeEntity is the signed content while the second T:MimeKit.MimeEntity is the detached signature and, by default, will be an T:MimeKit.Cryptography.ApplicationPkcs7Signature part. Because the multipart/signed part may have been signed by multiple signers, it is important to verify each of the digital signatures (one for each signer) that are returned by the Overload:MimeKit.Cryptography.MultipartSigned.Verify method: It should be noted, however, that while most S/MIME clients will use the preferred multipart/signed approach, it is possible that you may encounter an application/pkcs7-mime part with an smime-type parameter set to signed-data. Luckily, MimeKit can handle this format as well:
================================================ FILE: Documentation/ContentLayout.content ================================================  ================================================ FILE: Documentation/Documentation.shfbproj ================================================ Debug AnyCPU 2.0 59115814-a1e3-46ae-ae30-4065ae8f4caf 2017.9.26.0 Documentation Documentation Documentation Cross-platform (.NET Core/.NET Standard) bin\docs\ Documentation en-US OnlyWarningsAndErrors Website False False False False True 2 False C# Blank True VS2013 False MemberName MailKit Documentation AboveNamespaces API Reference The <b>MimeKit</b> namespace provides classes that are used to implement the core MIME parsing services of the framework. The <b>MimeKit.Cryptography</b> namespace provides classes that are necessary for dealing with PGP, S/MIME, and other cryptographic services. The <b>MimeKit.Encodings</b> namespace provides classes for encoding and decoding various MIME transfer encodings. The <b>MimeKit.IO</b> namespace provides classes that extend the <b>System.IO</b> namespace. The <b>MimeKit.IO.Filters</b> namespace provides filters for use with <a href="T_MimeKit_IO_FilteredStream.htm">MimeKit.IO.FilteredStream</a>. The <b>MimeKit.Text</b> namespace provides classes that are used for converting between various text formats. The <b>MimeKit.Tnef</b> namespace provides classes that are used for dealing with Microsoft TNEF attachments. The <b>MimeKit.Utils</b> namespace provides various utility classes. The <b>MailKit</b> namespace provides classes that are used to implement the core services of the framework. The <b>MailKit.Net.Imap</b> namespace provides classes that are necessary for managing messages on an IMAP server. The <b>MailKit.Net.Pop3</b> namespace provides classes that are necessary for downloading messages from a POP3 server. The <b>MailKit.Net.Proxy</b> namespace provides classes that are necessary for connecting via proxy servers. The <b>MailKit.Net.Smtp</b> namespace provides classes that are necessary for sending messages to an SMTP server. The <b>MailKit.Search</b> namespace provides classes that are necessary for searching folders for messages matching a set of criteria. The <b>MailKit.Security</b> namespace provides implementations of various SASL authentication mechanisms used by the IMAP, POP3 and SMTP clients. Copyright &#169%3b 2013-2026 Jeffrey Stedfast obj\ &lt%3b!-- Global site tag %28gtag.js%29 - Google Analytics --&gt%3b &lt%3bscript src=&quot%3bhttps://www.googletagmanager.com/gtag/js%3fid=UA-63841238-1&quot%3b&gt%3b&lt%3b/script&gt%3b &lt%3bscript&gt%3b window.dataLayer = window.dataLayer || []%3b function gtag%28%29{{dataLayer.push%28arguments%29%3b}} gtag%28&#39%3bjs&#39%3b, new Date%28%29%29%3b gtag%28&#39%3bconfig&#39%3b, &#39%3bUA-63841238-1&#39%3b%29%3b &lt%3b/script&gt%3b 100 1.0.0.0 Jeffrey Stedfast jestedfa%40microsoft.com https://github.com/jstedfast Summary, Parameter, Returns, Value, Remarks, AutoDocumentCtors, Namespace, TypeParameter, AutoDocumentDispose v4.8 clone Clone MailKit source code from GitHub using TortoiseGit. update Update MailKit source code via TortoiseGit using the Pull and Submodule Update buttons. MailKit {e543a427-93de-4e65-adf2-44412e440fb1} True MimeKit {faec8a91-6983-4ed9-a414-09c6b65b13bb} True ================================================ FILE: Documentation/Examples/ArcSignerExample.cs ================================================ using System; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; using MimeKit.Cryptography; namespace ArcSignerExample { class ExampleArcSigner : ArcSigner { public ExampleArcSigner (Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (stream, domain, selector, algorithm) { } public ExampleArcSigner (string fileName, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (fileName, domain, selector, algorithm) { } public ExampleArcSigner (AsymmetricKeyParameter key, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (key, domain, selector, algorithm) { } public string AuthenticationServiceIdentifier { get; set; } /// /// Generate the ARC-Authentication-Results header. /// /// /// The ARC-Authentication-Results header contains information detailing the results of /// authenticating/verifying the message via ARC, DKIM, SPF, etc. /// /// In the following implementation, we assume that all of these authentication results /// have already been determined by other mail software that has added some Authentication-Results /// headers containing this information. /// /// Note: This method is used when ArcSigner.Sign() is called instead of ArcSigner.SignAsync(). /// protected override AuthenticationResults GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) { var results = new AuthenticationResults (AuthenticationServiceIdentifier); for (int i = 0; i < message.Headers.Count; i++) { var header = message.Headers[i]; if (header.Id != HeaderId.AuthenticationResults) continue; if (!AuthenticationResults.TryParse (header.RawValue, out AuthenticationResults authres)) continue; if (authres.AuthenticationServiceIdentifier != AuthenticationServiceIdentifier) continue; foreach (var result in authres.Results) { if (!results.Results.Any (r => r.Method == result.Method)) results.Results.Add (result); } } return results; } protected override Task GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) { return Task.FromResult (GenerateArcAuthenticationResults (options, message, cancellationToken)); } } class Program { public static void Main (string[] args) { if (args.Length < 2) { Help (); return; } for (int i = 0; i < args.Length; i++) { if (args[i] == "--help") { Help (); return; } } var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; var signer = new ExampleArcSigner ("privatekey.pem", "example.com", "brisbane", DkimSignatureAlgorithm.RsaSha256) { HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, AgentOrUserIdentifier = "@eng.example.com", }; if (!File.Exists (args[0])) { Console.Error.WriteLine ("{0}: No such file.", args[0]); return; } var message = MimeMessage.Load (args[0]); // Prepare the message body to be sent over a 7bit transport (such as older versions of SMTP). // Note: If the SMTP server you will be sending the message over supports the 8BITMIME extension, // then you can use `EncodingConstraint.EightBit` instead. message.Prepare (EncodingConstraint.SevenBit); signer.Sign (message, headers); using (var stream = File.Create (args[1])) message.WriteTo (stream); } static void Help () { Console.WriteLine ("Usage is: ArcSigner [options] [message] [output]"); Console.WriteLine (); Console.WriteLine ("Options:"); Console.WriteLine (" --help This help menu."); } } } ================================================ FILE: Documentation/Examples/ArcVerifierExample.cs ================================================ using System; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using Heijden.DNS; using Org.BouncyCastle.Crypto; using MimeKit; using MimeKit.Cryptography; namespace ArcVerifierExample { // Note: By using the DkimPublicKeyLocatorBase, we avoid having to parse the DNS TXT records // in order to get the public key ourselves. class ExamplePublicKeyLocator : DkimPublicKeyLocatorBase { readonly Dictionary cache; readonly Resolver resolver; public ExamplePublicKeyLocator () { cache = new Dictionary (); resolver = new Resolver ("8.8.8.8") { TransportType = TransportType.Udp, UseCache = true, Retries = 3 }; } AsymmetricKeyParameter DnsLookup (string domain, string selector, CancellationToken cancellationToken) { var query = selector + "._domainkey." + domain; AsymmetricKeyParameter pubkey; // checked if we've already fetched this key if (cache.TryGetValue (query, out pubkey)) return pubkey; // make a DNS query var response = resolver.Query (query, QType.TXT); var builder = new StringBuilder (); // combine the TXT records into 1 string buffer foreach (var record in response.RecordsTXT) { foreach (var text in record.TXT) builder.Append (text); } var txt = builder.ToString (); // DkimPublicKeyLocatorBase provides us with this helpful method. pubkey = GetPublicKey (txt); cache.Add (query, pubkey); return pubkey; } public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) { var methodList = methods.Split (new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < methodList.Length; i++) { if (methodList[i] == "dns/txt") return DnsLookup (domain, selector, cancellationToken); } throw new NotSupportedException (string.Format ("{0} does not include any supported lookup methods.", methods)); } public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) { return Task.Run (() => { return LocatePublicKey (methods, domain, selector, cancellationToken); }, cancellationToken); } } class Program { public static void Main (string[] args) { if (args.Length == 0) { Help (); return; } for (int i = 0; i < args.Length; i++) { if (args[i] == "--help") { Help (); return; } } var locator = new ExamplePublicKeyLocator (); var verifier = new ArcVerifier (locator); for (int i = 0; i < args.Length; i++) { if (!File.Exists (args[i])) { Console.Error.WriteLine ("{0}: No such file.", args[i]); continue; } Console.Write ("{0} -> ", args[i]); var message = MimeMessage.Load (args[i]); var result = verifier.Verify (message); switch (result.Chain) { case ArcSignatureValidationResult.None: Console.WriteLine ("No ARC signatures to verify."); break; case ArcSignatureValidationResult.Pass: Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine ("PASS"); Console.ResetColor (); break; case ArcSignatureValidationResult.Fail: Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine ("FAIL"); Console.ResetColor (); break; } } } static void Help () { Console.WriteLine ("Usage is: ArcVerifier [options] [messages]"); Console.WriteLine (); Console.WriteLine ("Options:"); Console.WriteLine (" --help This help menu."); } } } ================================================ FILE: Documentation/Examples/AttachmentExamples.cs ================================================ using System; using MimeKit; namespace MimeKit.Examples { public static class AttachmentExamples { public static void SaveMimePart (MimePart attachment, string fileName) { #region SaveMimePart using (var stream = File.Create (fileName)) attachment.Content.DecodeTo (stream); #endregion SaveMimePart } public static void SaveMimePart (MessagePart attachment, string fileName) { #region SaveMessagePart using (var stream = File.Create (fileName)) attachment.Message.WriteTo (stream); #endregion SaveMessagePart } public static void SaveAttachments (MimeMessage message) { #region SaveAttachments foreach (var attachment in message.Attachments) { if (attachment is MessagePart) { var fileName = attachment.ContentDisposition?.FileName; var rfc822 = (MessagePart) attachment; if (string.IsNullOrEmpty (fileName)) fileName = "attached-message.eml"; using (var stream = File.Create (fileName)) rfc822.Message.WriteTo (stream); } else { var part = (MimePart) attachment; var fileName = part.FileName; using (var stream = File.Create (fileName)) part.Content.DecodeTo (stream); } } #endregion SaveAttachments } public static void SaveAttachments (MimeMessage message) { #region SaveBodyParts foreach (var bodyPart in message.BodyParts) { if (!bodyPart.IsAttachment) continue; if (bodyPart is MessagePart) { var fileName = attachment.ContentDisposition?.FileName; var rfc822 = (MessagePart) attachment; if (string.IsNullOrEmpty (fileName)) fileName = "attached-message.eml"; using (var stream = File.Create (fileName)) rfc822.Message.WriteTo (stream); } else { var part = (MimePart) attachment; var fileName = part.FileName; using (var stream = File.Create (fileName)) part.Content.DecodeTo (stream); } } #endregion SaveBodyParts } } } ================================================ FILE: Documentation/Examples/BodyBuilder.cs ================================================ using MimeKit; namespace BodyBuilderExamples { public class Program { public static void Complex () { #region Complex var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); message.Subject = "How you doin?"; var builder = new BodyBuilder (); // Set the plain-text version of the message text builder.TextBody = @"Hey Alice, What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it. Will you be my +1? -- Joey "; // In order to reference selfie.jpg from the html text, we'll need to add it // to builder.LinkedResources and then use its Content-Id value in the img src. var image = builder.LinkedResources.Add (@"C:\Users\Joey\Documents\Selfies\selfie.jpg"); image.ContentId = MimeUtils.GenerateMessageId (); // Set the html version of the message text builder.HtmlBody = string.Format (@"

Hey Alice,

What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it.

Will you be my +1?

-- Joey

", image.ContentId); // We may also want to attach a calendar event for Monica's party... builder.Attachments.Add (@"C:\Users\Joey\Documents\party.ics"); // Now we just need to set the message body and we're done message.Body = builder.ToMessageBody (); #endregion } public static void Simple () { #region Simple var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); message.Subject = "How you doin?"; var builder = new BodyBuilder (); // Set the plain-text version of the message text builder.TextBody = @"Hey Alice, What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it. Will you be my +1? -- Joey "; // We may also want to attach a calendar event for Monica's party... builder.Attachments.Add (@"C:\Users\Joey\Documents\party.ics"); // Now we just need to set the message body and we're done message.Body = builder.ToMessageBody (); #endregion } } } ================================================ FILE: Documentation/Examples/CreateMultipartAlternative.cs ================================================ var attachment = CreateImageAttachment (); var plain = CreateTextPlainPart (); var html = CreateTextHtmlPart (); // Note: it is important that the text/html part is added second, because it is the // most expressive version and (probably) the most faithful to the sender's WYSIWYG // editor. var alternative = new MultipartAlternative (); alternative.Add (plain); alternative.Add (html); // now create the multipart/mixed container to hold the multipart/alternative // and the image attachment var multipart = new Multipart ("mixed"); multipart.Add (alternative); multipart.Add (attachment); // now set the multipart/mixed as the message body message.Body = multipart; ================================================ FILE: Documentation/Examples/CreateMultipartMixed.cs ================================================ var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); message.Subject = "How you doin?"; // create our message text, just like before (except don't set it as the message.Body) var body = new TextPart ("plain") { Text = @"Hey Alice, What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it. Will you be my +1? -- Joey " }; // create an image attachment for the file located at path var attachment = new MimePart ("image", "gif") { Content = new MimeContent (File.OpenRead (path), ContentEncoding.Default), ContentDisposition = new ContentDisposition (ContentDisposition.Attachment), ContentTransferEncoding = ContentEncoding.Base64, FileName = Path.GetFileName (path) }; // now create the multipart/mixed container to hold the message text and the // image attachment var multipart = new Multipart ("mixed"); multipart.Add (body); multipart.Add (attachment); // now set the multipart/mixed as the message body message.Body = multipart; ================================================ FILE: Documentation/Examples/CreateSimpleMessage.cs ================================================ var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); message.Subject = "How you doin?"; message.Body = new TextPart ("plain") { Text = @"Hey Alice, What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it. Will you be my +1? -- Joey " }; ================================================ FILE: Documentation/Examples/DecodingContent.cs ================================================ // This will get the name of the file as specified by the sending mail client. // Note: this value *may* be null, so you'll want to handle that case in your code. var fileName = part.FileName; using (var stream = File.Create (fileName)) { part.Content.DecodeTo (stream); } ================================================ FILE: Documentation/Examples/DkimExamples.cs ================================================ using System; using System.IO; using MimeKit; namespace MimeKit.Examples { public static class DkimExamples { #region DkimSign public static void DkimSign (MimeMessage message) { var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; var signer = new DkimSigner ("privatekey.pem", "example.com", "brisbane", DkimSignatureAlgorithm.RsaSha256) { HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, AgentOrUserIdentifier = "@eng.example.com", QueryMethod = "dns/txt", }; // Prepare the message body to be sent over a 7bit transport (such as older versions of SMTP). // Note: If the SMTP server you will be sending the message over supports the 8BITMIME extension, // then you can use `EncodingConstraint.EightBit` instead. message.Prepare (EncodingConstraint.SevenBit); signer.Sign (message, headers); } #endregion } } ================================================ FILE: Documentation/Examples/DkimVerifierExample.cs ================================================ using System; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using Heijden.DNS; using Org.BouncyCastle.Crypto; using MimeKit; using MimeKit.Cryptography; namespace DkimVerifierExample { // Note: By using the DkimPublicKeyLocatorBase, we avoid having to parse the DNS TXT records // in order to get the public key ourselves. class ExamplePublicKeyLocator : DkimPublicKeyLocatorBase { readonly Dictionary cache; readonly Resolver resolver; public ExamplePublicKeyLocator () { cache = new Dictionary (); resolver = new Resolver ("8.8.8.8") { TransportType = TransportType.Udp, UseCache = true, Retries = 3 }; } AsymmetricKeyParameter DnsLookup (string domain, string selector, CancellationToken cancellationToken) { var query = selector + "._domainkey." + domain; AsymmetricKeyParameter pubkey; // checked if we've already fetched this key if (cache.TryGetValue (query, out pubkey)) return pubkey; // make a DNS query var response = resolver.Query (query, QType.TXT); var builder = new StringBuilder (); // combine the TXT records into 1 string buffer foreach (var record in response.RecordsTXT) { foreach (var text in record.TXT) builder.Append (text); } var txt = builder.ToString (); // DkimPublicKeyLocatorBase provides us with this helpful method. pubkey = GetPublicKey (txt); cache.Add (query, pubkey); return pubkey; } public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) { var methodList = methods.Split (new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < methodList.Length; i++) { if (methodList[i] == "dns/txt") return DnsLookup (domain, selector, cancellationToken); } throw new NotSupportedException (string.Format ("{0} does not include any supported lookup methods.", methods)); } public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) { return Task.Run (() => { return LocatePublicKey (methods, domain, selector, cancellationToken); }, cancellationToken); } } class Program { public static void Main (string[] args) { if (args.Length == 0) { Help (); return; } for (int i = 0; i < args.Length; i++) { if (args[i] == "--help") { Help (); return; } } var locator = new ExamplePublicKeyLocator (); var verifier = new DkimVerifier (locator); for (int i = 0; i < args.Length; i++) { if (!File.Exists (args[i])) { Console.Error.WriteLine ("{0}: No such file.", args[i]); continue; } Console.Write ("{0} -> ", args[i]); var message = MimeMessage.Load (args[i]); var index = message.Headers.IndexOf (HeaderId.DkimSignature); if (index == -1) { Console.WriteLine ("NO SIGNATURE"); continue; } var dkim = message.Headers[index]; if (verifier.Verify (message, dkim)) { // the DKIM-Signature header is valid! Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine ("VALID"); Console.ResetColor (); } else { // the DKIM-Signature is invalid! Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine ("INVALID"); Console.ResetColor (); } } } static void Help () { Console.WriteLine ("Usage is: DkimVerifier [options] [messages]"); Console.WriteLine (); Console.WriteLine ("Options:"); Console.WriteLine (" --help This help menu."); } } } ================================================ FILE: Documentation/Examples/ForwardExamples.cs ================================================ // // ForwardExamples.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2023 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Linq; using System.Text; using System.Collections.Generic; using MimeKit; namespace MimeKit.Examples { public static class ForwardExamples { #region ForwardAttached public static MimeMessage Forward (MimeMessage original, MailboxAddress from, IEnumerable to) { var message = new MimeMessage (); message.From.Add (from); message.To.AddRange (to); // set the forwarded subject if (!original.Subject?.StartsWith ("FW:", StringComparison.OrdinalIgnoreCase)) message.Subject = "FW: " + (original.Subject ?? string.Empty); else message.Subject = original.Subject; // create the main textual body of the message var text = new TextPart ("plain") { Text = "Here's the forwarded message:" }; // create the message/rfc822 attachment for the original message var rfc822 = new MessagePart { Message = original }; // create a multipart/mixed container for the text body and the forwarded message var multipart = new Multipart ("mixed"); multipart.Add (text); multipart.Add (rfc822); // set the multipart as the body of the message message.Body = multipart; return message; } #endregion ForwardAttached #region ForwardInline public static MimeMessage Forward (MimeMessage original, MailboxAddress from, IEnumerable to) { var message = new MimeMessage (); message.From.Add (from); message.To.AddRange (to); // set the forwarded subject if (!original.Subject?.StartsWith ("FW:", StringComparison.OrdinalIgnoreCase)) message.Subject = "FW: " + (original.Subject ?? string.Empty); else message.Subject = original.Subject; // quote the original message text using (var text = new StringWriter ()) { text.WriteLine (); text.WriteLine ("-----Original Message-----"); test.WriteLine ("From: {0}", original.From); text.WriteLine ("Sent: {0}", DateUtils.FormatDate (original.Date)); text.WriteLine ("To: {0}", original.To); text.WriteLine ("Subject: {0}", original.Subject ?? string.Empty); text.WriteLine (); text.Write (original.TextBody); message.Body = new TextPart ("plain") { Text = text.ToString () }; } return message; } #endregion ForwardInline } } ================================================ FILE: Documentation/Examples/ImapBodyPartExamples.cs ================================================ // // ImapBodyPartExamples.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2023 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using MimeKit; using MailKit; using MailKit.Search; using MailKit.Security; using MailKit.Net.Imap; namespace MailKit.Examples { public static class ImapBodyPartExamples { #region GetBodyPartsByUniqueId public static void DownloadBodyAndAttachments (string baseDirectory) { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); // search for messages where the Subject header contains either "MimeKit" or "MailKit" var query = SearchQuery.SubjectContains ("MimeKit").Or (SearchQuery.SubjectContains ("MailKit")); var uids = client.Inbox.Search (query); // fetch summary information for the search results (we will want the UID and the BODYSTRUCTURE // of each message so that we can extract the text body and the attachments) var items = client.Inbox.Fetch (uids, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); foreach (var item in items) { // determine a directory to save stuff in var directory = Path.Combine (baseDirectory, item.UniqueId.ToString ()); // create the directory Directory.CreateDirectory (directory); // IMessageSummary.TextBody is a convenience property that finds the 'text/plain' body part for us var bodyPart = item.TextBody; if (bodyPart != null) { // download the 'text/plain' body part var plain = (TextPart) client.Inbox.GetBodyPart (item.UniqueId, bodyPart); // TextPart.Text is a convenience property that decodes the content and converts the result to // a string for us var text = plain.Text; File.WriteAllText (Path.Combine (directory, "body.txt"), text); } // IMessageSummary.HtmlBody is a convenience property that finds the 'text/html' body part for us bodyPart = item.HtmlBody; if (bodyPart != null) { // download the 'text/html' body part var html = (TextPart) client.Inbox.GetBodyPart (item.UniqueId, bodyPart); // TextPart.Text is a convenience property that decodes the content and converts the result to // a string for us var text = html.Text; File.WriteAllText (Path.Combine (directory, "body.html"), text); } // now iterate over all of the attachments and save them to disk foreach (var attachment in item.Attachments) { // download the attachment just like we did with the body var entity = client.Inbox.GetBodyPart (item.UniqueId, attachment); // attachments can be either message/rfc822 parts or regular MIME parts if (entity is MessagePart) { var rfc822 = (MessagePart) entity; var path = Path.Combine (directory, attachment.PartSpecifier + ".eml"); rfc822.Message.WriteTo (path); } else { var part = (MimePart) entity; // default to using the sending client's suggested fileName value var fileName = attachment.FileName; if (string.IsNullOrEmpty (fileName)) { // the FileName wasn't defined, so generate one... if (!MimeTypes.TryGetExtension (attachment.ContentType.MimeType, out string extension)) extension = ".dat"; fileName = Guid.NewGuid ().ToString () + extension; } var path = Path.Combine (directory, fileName); // decode and save the content to a file using (var stream = File.Create (path)) part.Content.DecodeTo (stream); } } } client.Disconnect (true); } } #endregion #region GetBodyPartsByUniqueIdAndSpecifier public static void DownloadBodyAndAttachments (string baseDirectory) { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); // search for messages where the Subject header contains either "MimeKit" or "MailKit" var query = SearchQuery.SubjectContains ("MimeKit").Or (SearchQuery.SubjectContains ("MailKit")); var uids = client.Inbox.Search (query); // fetch summary information for the search results (we will want the UID and the BODYSTRUCTURE // of each message so that we can extract the text body and the attachments) var items = client.Inbox.Fetch (uids, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); foreach (var item in items) { // determine a directory to save stuff in var directory = Path.Combine (baseDirectory, item.UniqueId.ToString ()); // create the directory Directory.CreateDirectory (directory); // IMessageSummary.TextBody is a convenience property that finds the 'text/plain' body part for us var bodyPart = item.TextBody; if (bodyPart != null) { // download the 'text/plain' body part // Note: In general, you should use `GetBodyPart(item.UniqueId, bodyPart)` instead if you have it available. // This particular overload of the GetBodyPart() method exists for convenience purposes where you already // know the body-part specifier string before-hand. var plain = (TextPart) client.Inbox.GetBodyPart (item.UniqueId, bodyPart.PartSpecifier); // TextPart.Text is a convenience property that decodes the content and converts the result to // a string for us var text = plain.Text; File.WriteAllText (Path.Combine (directory, "body.txt"), text); } // IMessageSummary.HtmlBody is a convenience property that finds the 'text/html' body part for us bodyPart = item.HtmlBody; if (bodyPart != null) { // download the 'text/html' body part // Note: In general, you should use `GetBodyPart(item.UniqueId, bodyPart)` instead if you have it available. // This particular overload of the GetBodyPart() method exists for convenience purposes where you already // know the body-part specifier string before-hand. var html = (TextPart) client.Inbox.GetBodyPart (item.UniqueId, bodyPart.PartSpecifier); // TextPart.Text is a convenience property that decodes the content and converts the result to // a string for us var text = html.Text; File.WriteAllText (Path.Combine (directory, "body.html"), text); } // now iterate over all of the attachments and save them to disk foreach (var attachment in item.Attachments) { // download the attachment just like we did with the body var entity = client.Inbox.GetBodyPart (item.UniqueId, attachment); // attachments can be either message/rfc822 parts or regular MIME parts if (entity is MessagePart) { var rfc822 = (MessagePart) entity; var path = Path.Combine (directory, attachment.PartSpecifier + ".eml"); rfc822.Message.WriteTo (path); } else { var part = (MimePart) entity; // default to using the sending client's suggested fileName value var fileName = attachment.FileName; if (string.IsNullOrEmpty (fileName)) { // the FileName wasn't defined, so generate one... if (!MimeTypes.TryGetExtension (attachment.ContentType.MimeType, out string extension)) extension = ".dat"; fileName = Guid.NewGuid ().ToString () + extension; } var path = Path.Combine (directory, fileName); // decode and save the content to a file using (var stream = File.Create (path)) part.Content.DecodeTo (stream); } } } client.Disconnect (true); } } #endregion #region GetBodyPartStreamsByUniqueId public static void CacheBodyParts (string baseDirectory) { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); // search for messages where the Subject header contains either "MimeKit" or "MailKit" var query = SearchQuery.SubjectContains ("MimeKit").Or (SearchQuery.SubjectContains ("MailKit")); var uids = client.Inbox.Search (query); // fetch summary information for the search results (we will want the UID and the BODYSTRUCTURE // of each message so that we can extract the text body and the attachments) var items = client.Inbox.Fetch (uids, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); foreach (var item in items) { // determine a directory to save stuff in var directory = Path.Combine (baseDirectory, item.UniqueId.ToString ()); // create the directory Directory.CreateDirectory (directory); // now iterate over all of the body parts and save them to disk foreach (var bodyPart in item.BodyParts) { // cache the raw body part MIME just like we did with the body using (var stream = client.Inbox.GetStream (item.UniqueId, bodyPart)) { var path = Path.Combine (directory, bodyPart.PartSpecifier); using (var output = File.Create (path)) stream.CopyTo (output); } } } client.Disconnect (true); } } #endregion #region GetBodyPartStreamsByUniqueIdAndSpecifier public static void SaveAttachments (string baseDirectory) { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); // search for messages where the Subject header contains either "MimeKit" or "MailKit" var query = SearchQuery.SubjectContains ("MimeKit").Or (SearchQuery.SubjectContains ("MailKit")); var uids = client.Inbox.Search (query); // fetch summary information for the search results (we will want the UID and the BODYSTRUCTURE // of each message so that we can extract the text body and the attachments) var items = client.Inbox.Fetch (uids, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); foreach (var item in items) { // determine a directory to save stuff in var directory = Path.Combine (baseDirectory, item.UniqueId.ToString ()); // create the directory Directory.CreateDirectory (directory); // now iterate over all of the attachments and decode/save the content to disk foreach (var attachment in item.Attachments) { // default to using the sending client's suggested fileName value string fileName = attachment.FileName; if (string.IsNullOrEmpty (fileName)) { // the FileName wasn't defined, so generate one... if (!MimeTypes.TryGetExtension (attachment.ContentType.MimeType, out string extension)) extension = ".dat"; fileName = Guid.NewGuid ().ToString () + extension; } // we'll need the Content-Transfer-Encoding value so that we can decode it... ContentEncoding encoding; if (string.IsNullOrEmpty (attachment.ContentTransferEncoding) || !MimeUtils.TryParse (attachment.ContentTransferEncoding, out encoding)) encoding = ContentEncoding.Default; // if all we want is the content (rather than the entire MIME part including the headers), then // we want the ".TEXT" section of the part using (var stream = client.Inbox.GetStream (item.UniqueId, attachment.PartSpecifier + ".TEXT")) { // wrap the attachment content in a MimeContent object to help us decode it using (var content = new MimeContent (stream, encoding)) { var path = Path.Combine (directory, fileName); // decode the attachment content to the file stream using (var output = File.Create (path)) content.DecodeTo (output); } } } } client.Disconnect (true); } } #endregion } } ================================================ FILE: Documentation/Examples/ImapExamples.cs ================================================ // // ImapExamples.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2023 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using MimeKit; using MailKit; using MailKit.Search; using MailKit.Security; using MailKit.Net.Imap; namespace MailKit.Examples { public static class ImapExamples { #region ProtocolLogger public static void DownloadMessages () { using (var client = new ImapClient (new ProtocolLogger ("imap.log"))) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); var uids = client.Inbox.Search (SearchQuery.All); foreach (var uid in uids) { var message = client.Inbox.GetMessage (uid); // write the message to a file message.WriteTo (string.Format ("{0}.eml", uid)); } client.Disconnect (true); } } #endregion #region Capabilities public static void Capabilities () { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); var mechanisms = string.Join (", ", client.AuthenticationMechanisms); Console.WriteLine ("The IMAP server supports the following SASL authentication mechanisms: {0}", mechanisms); client.Authenticate ("username", "password"); if (client.Capabilities.HasFlag (ImapCapabilities.Id)) { var clientImplementation = new ImapImplementation { Name = "MailKit", Version = "1.0" }; var serverImplementation = client.Identify (clientImplementation); Console.WriteLine ("Server implementation details:"); foreach (var property in serverImplementation.Properties) Console.WriteLine (" {0} = {1}", property.Key, property.Value); } if (client.Capabilities.HasFlag (ImapCapabilities.Acl)) { Console.WriteLine ("The IMAP server supports Access Control Lists."); Console.WriteLine ("The IMAP server supports the following access rights: {0}", client.Rights); Console.WriteLine ("The Inbox has the following access controls:"); var acl = client.Inbox.GetAccessControlList (); foreach (var ac in acl) Console.WriteLine (" {0} = {1}", ac.Name, ac.Rights); var myRights = client.Inbox.GetMyAccessRights (); Console.WriteLine ("Your current rights for the Inbox folder are: {0}", myRights); } if (client.Capabilities.HasFlag (ImapCapabilities.Quota)) { Console.WriteLine ("The IMAP server supports quotas."); Console.WriteLine ("The current quota for the Inbox is:"); var quota = client.Inbox.GetQuota (); if (quota.StorageLimit.HasValue) Console.WriteLine (" Limited by storage space. Using {0} out of {1} bytes.", quota.CurrentStorageSize.Value, quota.StorageLimit.Value); if (quota.MessageLimit.HasValue) Console.WriteLine (" Limited by the number of messages. Using {0} out of {1} bytes.", quota.CurrentMessageCount.Value, quota.MessageLimit.Value); Console.WriteLine ("The quota root is: {0}", quota.QuotaRoot); } if (client.Capabilities.HasFlag (ImapCapabilities.Thread)) { if (client.ThreadingAlgorithms.Contains (ThreadingAlgorithm.OrderedSubject)) Console.WriteLine ("The IMAP server supports threading by subject."); if (client.ThreadingAlgorithms.Contains (ThreadingAlgorithm.References)) Console.WriteLine ("The IMAP server supports threading by references."); } client.Disconnect (true); } } #endregion #region Namespaces public static void ShowNamespaces () { using (var client = new ImapClient ()) { client.Connect ("imap.mail-server.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); Console.WriteLine ("Personal namespaces:"); foreach (var ns in client.PersonalNamespaces) Console.WriteLine ($"* \"{ns.Path}\" \"{ns.DirectorySeparator}\""); Console.WriteLine (); Console.WriteLine ("Shared namespaces:"); foreach (var ns in client.SharedNamespaces) Console.WriteLine ($"* \"{ns.Path}\" \"{ns.DirectorySeparator}\""); Console.WriteLine (); Console.WriteLine ("Other namespaces:"); foreach (var ns in client.OtherNamespaces) Console.WriteLine ($"* \"{ns.Path}\" \"{ns.DirectorySeparator}\""); Console.WriteLine (); // get the folder that represents the first personal namespace var personal = client.GetFolder (client.PersonalNamespaces[0]); // list the folders under the first personal namespace var subfolders = personal.GetSubfolders (); Console.WriteLine ("The list of folders that are direct children of the first personal namespace:"); foreach (var folder in subfolders) Console.WriteLine ($"* {folder.Name}"); client.Disconnect (true); } } #endregion #region DownloadMessagesByUniqueId public static void DownloadMessages () { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); var uids = client.Inbox.Search (SearchQuery.All); foreach (var uid in uids) { var message = client.Inbox.GetMessage (uid); // write the message to a file message.WriteTo (string.Format ("{0}.eml", uid)); } client.Disconnect (true); } } #endregion #region DownloadMessageStreamsByUniqueId public static void DownloadMessages () { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); var uids = client.Inbox.Search (SearchQuery.All); foreach (var uid in uids) { using (var stream = client.Inbox.GetStream (uid)) { using (var output = File.Create ($"{uid}.eml")) stream.CopyTo (output); } } client.Disconnect (true); } } #endregion #region DownloadMessagesByIndex public static void DownloadMessages () { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); for (int index = 0; index < client.Inbox.Count; index++) { var message = client.Inbox.GetMessage (index); // write the message to a file message.WriteTo (string.Format ("{0}.eml", index)); } client.Disconnect (true); } } #endregion #region DownloadMessageStreamsByIndex public static void DownloadMessages () { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Inbox.Open (FolderAccess.ReadOnly); for (int index = 0; index < client.Inbox.Count; index++) { using (var stream = client.Inbox.GetStream (index)) { using (var output = File.Create ($"{index}.eml")) stream.CopyTo (output); } } client.Disconnect (true); } } #endregion #region SslConnectionInformation public static void PrintSslConnectionInfo (string host, int port) { using (var client = new ImapClient ()) { client.Connect (host, port, SecureSocketOptions.Auto); Console.WriteLine ($"Negotiated the following SSL options with {host}:"); Console.WriteLine ($" Protocol Version: {client.SslProtocol}"); Console.WriteLine ($" Cipher Algorithm: {client.SslCipherAlgorithm}"); Console.WriteLine ($" Cipher Strength: {client.SslCipherStrength}"); Console.WriteLine ($" Hash Algorithm: {client.SslHashAlgorithm}"); Console.WriteLine ($" Hash Strength: {client.SslHashStrength}"); Console.WriteLine ($" Key-Exchange Algorithm: {client.SslKeyExchangeAlgorithm}"); Console.WriteLine ($" Key-Exchange Strength: {client.SslKeyExchangeStrength}"); // Example Log: // // Negotiated the following SSL options with imap.gmail.com: // Protocol Version: Tls12 // Cipher Algorithm: Aes128 // Cipher Strength: 128 // Hash Algorithm: Sha256 // Hash Strength: 0 // Key-Exchange Algorithm: 44550 // Key-Exchange Strength: 255 client.Disconnect (true); } } #endregion } } ================================================ FILE: Documentation/Examples/ImapIdleExample.cs ================================================ using System; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MailKit; using MailKit.Net.Imap; using MailKit.Security; namespace ImapIdleExample { class Program { // Connection-related properties const SecureSocketOptions SslOptions = SecureSocketOptions.Auto; const string Host = "imap.gmail.com"; const int Port = 993; // Authentication-related properties const string Username = "username@gmail.com"; const string Password = "password"; public static void Main (string[] args) { using (var client = new IdleClient (Host, Port, SslOptions, Username, Password)) { Console.WriteLine ("Hit any key to end the demo."); var idleTask = client.RunAsync (); Task.Run (() => { Console.ReadKey (true); }).Wait (); client.Exit (); idleTask.GetAwaiter ().GetResult (); } } } class IdleClient : IDisposable { readonly string host, username, password; readonly SecureSocketOptions sslOptions; readonly int port; List messages; CancellationTokenSource cancel; CancellationTokenSource done; FetchRequest request; bool messagesArrived; ImapClient client; public IdleClient (string host, int port, SecureSocketOptions sslOptions, string username, string password) { this.client = new ImapClient (new ProtocolLogger (Console.OpenStandardError ())); this.request = new FetchRequest (MessageSummaryItems.Full | MessageSummaryItems.UniqueId); this.messages = new List (); this.cancel = new CancellationTokenSource (); this.sslOptions = sslOptions; this.username = username; this.password = password; this.host = host; this.port = port; } async Task ReconnectAsync () { if (!client.IsConnected) await client.ConnectAsync (host, port, sslOptions, cancel.Token); if (!client.IsAuthenticated) { await client.AuthenticateAsync (username, password, cancel.Token); await client.Inbox.OpenAsync (FolderAccess.ReadOnly, cancel.Token); } } async Task FetchMessageSummariesAsync (bool print) { IList fetched = null; do { try { // fetch summary information for messages that we don't already have int startIndex = messages.Count; fetched = client.Inbox.Fetch (startIndex, -1, request, cancel.Token); break; } catch (ImapProtocolException) { // protocol exceptions often result in the client getting disconnected await ReconnectAsync (); } catch (IOException) { // I/O exceptions always result in the client getting disconnected await ReconnectAsync (); } } while (true); foreach (var message in fetched) { if (print) Console.WriteLine ("{0}: new message: {1}", client.Inbox, message.Envelope.Subject); messages.Add (message); } } async Task WaitForNewMessagesAsync () { do { try { if (client.Capabilities.HasFlag (ImapCapabilities.Idle)) { // Note: IMAP servers are only supposed to drop the connection after 30 minutes, so normally // we'd IDLE for a max of, say, ~29 minutes... but GMail seems to drop idle connections after // about 10 minutes, so we'll only idle for 9 minutes. done = new CancellationTokenSource (new TimeSpan (0, 9, 0)); try { await client.IdleAsync (done.Token, cancel.Token); } finally { done.Dispose (); done = null; } } else { // Note: we don't want to spam the IMAP server with NOOP commands, so lets wait a minute // between each NOOP command. await Task.Delay (new TimeSpan (0, 1, 0), cancel.Token); await client.NoOpAsync (cancel.Token); } break; } catch (ImapProtocolException) { // protocol exceptions often result in the client getting disconnected await ReconnectAsync (); } catch (IOException) { // I/O exceptions always result in the client getting disconnected await ReconnectAsync (); } } while (true); } async Task IdleAsync () { do { try { await WaitForNewMessagesAsync (); if (messagesArrived) { await FetchMessageSummariesAsync (true); messagesArrived = false; } } catch (OperationCanceledException) { break; } } while (!cancel.IsCancellationRequested); } public async Task RunAsync () { // connect to the IMAP server and get our initial list of messages try { await ReconnectAsync (); await FetchMessageSummariesAsync (false); } catch (OperationCanceledException) { await client.DisconnectAsync (true); return; } // Note: We capture client.Inbox here because cancelling IdleAsync() *may* require // disconnecting the IMAP client connection, and, if it does, the `client.Inbox` // property will no longer be accessible which means we won't be able to disconnect // our event handlers. var inbox = client.Inbox; // keep track of changes to the number of messages in the folder (this is how we'll tell if new messages have arrived). inbox.CountChanged += OnCountChanged; // keep track of messages being expunged so that when the CountChanged event fires, we can tell if it's // because new messages have arrived vs messages being removed (or some combination of the two). inbox.MessageExpunged += OnMessageExpunged; // keep track of flag changes inbox.MessageFlagsChanged += OnMessageFlagsChanged; await IdleAsync (); inbox.MessageFlagsChanged -= OnMessageFlagsChanged; inbox.MessageExpunged -= OnMessageExpunged; inbox.CountChanged -= OnCountChanged; await client.DisconnectAsync (true); } // Note: the CountChanged event will fire when new messages arrive in the folder and/or when messages are expunged. void OnCountChanged (object sender, EventArgs e) { var folder = (ImapFolder) sender; // Note: because we are keeping track of the MessageExpunged event and updating our // 'messages' list, we know that if we get a CountChanged event and folder.Count is // larger than messages.Count, then it means that new messages have arrived. if (folder.Count > messages.Count) { int arrived = folder.Count - messages.Count; if (arrived > 1) Console.WriteLine ("\t{0} new messages have arrived.", arrived); else Console.WriteLine ("\t1 new message has arrived."); // Note: your first instinct may be to fetch these new messages now, but you cannot do // that in this event handler (the ImapFolder is not re-entrant). // // Instead, cancel the `done` token and update our state so that we know new messages // have arrived. We'll fetch the summaries for these new messages later... messagesArrived = true; done?.Cancel (); } } void OnMessageExpunged (object sender, MessageEventArgs e) { var folder = (ImapFolder) sender; if (e.Index < messages.Count) { var message = messages[e.Index]; Console.WriteLine ("{0}: message #{1} has been expunged: {2}", folder, e.Index, message.Envelope.Subject); // Note: If you are keeping a local cache of message information // (e.g. MessageSummary data) for the folder, then you'll need // to remove the message at e.Index. messages.RemoveAt (e.Index); } else { Console.WriteLine ("{0}: message #{1} has been expunged.", folder, e.Index); } } void OnMessageFlagsChanged (object sender, MessageFlagsChangedEventArgs e) { var folder = (ImapFolder) sender; Console.WriteLine ("{0}: flags have changed for message #{1} ({2}).", folder, e.Index, e.Flags); } public void Exit () { cancel.Cancel (); } public void Dispose () { client.Dispose (); cancel.Dispose (); } } } ================================================ FILE: Documentation/Examples/InlinePGPExample.txt ================================================ Return-Path: Received: from [127.0.0.1] (hostname.example.com. [201.95.8.17]) by mx.google.com with ESMTPSA id l67sm26628445yha.8.2014.04.27.13.49.44 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 27 Apr 2014 13:49:44 -0700 (PDT) Message-ID: <535D6D67.8020803@example.com> Date: Sun, 27 Apr 2014 17:49:43 -0300 From: Die-Hard PGP Fan User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: undisclosed-recipients:; Subject: Test of inline encrypted PGP blocks X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Antivirus: avast! (VPS 140427-1, 27/04/2014), Outbound message X-Antivirus-Status: Clean -----BEGIN PGP MESSAGE----- Charset: ISO-8859-1 Version: GnuPG v2.0.22 (MingW32) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ SGFoISBJIGZvb2xlZCB5b3UsIHRoaXMgdGV4dCBpc24ndCBhY3R1YWxseSBlbmNy eXB0ZWQgd2l0aCBQR1AsCml0J3MgYWN0dWFsbHkgb25seSBiYXNlNjQgZW5jb2Rl ZCEKCkknbSBqdXN0IHVzaW5nIHRoaXMgYXMgYW4gZXhhbXBsZSwgdGhvdWdoLCBz byBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIuCgpGb3IgdGhlIHNha2Ugb2YgYXJn dW1lbnQsIHdlJ2xsIHByZXRlbmQgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGFuIGVu Y3J5cHRlZApibHVyYi4gTW1ta2F5PyBUaGFua3MuCg== -----END PGP MESSAGE----- ================================================ FILE: Documentation/Examples/MessageDeliveryStatusExamples.cs ================================================ // // MessageDeliveryStatusExamples.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2023 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using MimeKit; namespace MimeKit.Examples { public static class MessageDeliveryStatusExamples { #region ProcessDeliveryStatusNotification public void ProcessDeliveryStatusNotification (MimeMessage message) { var report = message.Body as MultipartReport; if (report == null || report.ReportType == null || !report.ReportType.Equals ("delivery-status", StringComparison.OrdinalIgnoreCase)) { // this is not a delivery status notification message... return; } // process the report foreach (var mds in report.OfType ()) { // process the status groups - each status group represents a different recipient // The first status group contains information about the message var envelopeId = mds.StatusGroups[0]["Original-Envelope-Id"]; // all of the other status groups contain per-recipient information for (int i = 1; i < mds.StatusGroups.Length; i++) { var recipient = mds.StatusGroups[i]["Original-Recipient"]; var action = mds.StatusGroups[i]["Action"]; if (recipient == null) recipient = mds.StatusGroups[i]["Final-Recipient"]; // the recipient string should be in the form: "rfc822;user@domain.com" var index = recipient.IndexOf (';'); var address = recipient.Substring (index + 1); switch (action) { case "failed": Console.WriteLine ("Delivery of message {0} failed for {1}", envelopeId, address); break; case "delayed": Console.WriteLine ("Delivery of message {0} has been delayed for {1}", envelopeId, address); break; case "delivered": Console.WriteLine ("Delivery of message {0} has been delivered to {1}", envelopeId, address); break; case "relayed": Console.WriteLine ("Delivery of message {0} has been relayed for {1}", envelopeId, address); break; case "expanded": Console.WriteLine ("Delivery of message {0} has been delivered to {1} and relayed to the the expanded recipients", envelopeId, address); break; } } } } #endregion } } ================================================ FILE: Documentation/Examples/MimeIterator.cs ================================================ var attachments = new List (); var multiparts = new List (); using (var iter = new MimeIterator (message)) { // collect our list of attachments and their parent multiparts while (iter.MoveNext ()) { var multipart = iter.Parent as Multipart; var part = iter.Current as MimePart; if (multipart != null && part != null && part.IsAttachment) { // keep track of each attachment's parent multipart multiparts.Add (multipart); attachments.Add (part); } } } // now remove each attachment from its parent multipart... for (int i = 0; i < attachments.Count; i++) multiparts[i].Remove (attachments[i]); ================================================ FILE: Documentation/Examples/MimeMessageLoad.cs ================================================ // Load a MimeMessage from a stream var message = MimeMessage.Load (stream); ================================================ FILE: Documentation/Examples/MimeParserExamples.cs ================================================ using System; using System.IO; using System.Linq; using System.Collections.Generic; using MimeKit; namespace Examples { class MimeParserExamples { #region ParseMessage public static MimeMessage ParseMessage (string fileName) { // Load a MimeMessage from a file path or stream using (var stream = File.OpenRead (fileName)) { var parser = new MimeParser (stream, MimeFormat.Entity); return parser.ParseMessage (); } } #endregion // ParseMessage #region ParseMbox public static void ParseMbox (string fileName) { // Load every message from a Unix mbox spool. using (var stream = fileName.OpenRead (fileName)) { var parser = new MimeParser (stream, MimeFormat.Mbox); while (!parser.IsEndOfStream) { MimeMessage message = parser.ParseMessage (); long mboxMarkerOffset = parser.MboxMarkerOffset; string mboxMarker = parser.MboxMarker; Console.WriteLine ($"MBOX marker found @ {mboxMarkerOffset}: {mboxMarker}"); // TODO: Do something with the message. } } } #endregion // ParseMboxSpool #region MessageOffsets class MimeOffsets { public string MimeType { get; set; } public long? MboxMarkerOffset { get; set; } public int LineNumber { get; set; } public long BeginOffset { get; set; } public long HeadersEndOffset { get; set; } public long EndOffset { get; set; } public MimeOffsets Message { get; set; } public List Children { get; set; } public long Octets { get; set; } public int? Lines { get; set; } } public static void MimeOffsetsExample (string fileName) { using (var stream = fileName.OpenRead (fileName)) { var messages = new Dictionary (); var entities = new Dictionary (); MimeOffsets messageOffsets = null; var parser = new MimeParser (stream, MimeFormat.Entity); // Connect a handler to track MimeMessage begin offsets parser.MimeMessageBegin += delegate (sender, args) { var parser = (MimeParser) sender; // Create a new MimeOffsets for this message. var offsets = new MimeOffsets { BeginOffset = args.BeginOffset, LineNumber = args.LineNumber }; if (args.Parent != null) { // If we get here, then it means that the MimeMessage is part of // a message/rfc822 "attachment". var parentOffsets = entities[args.Parent]; parentOffsets.Message = offsets; } else { // Otherwise, this is the top-level MimeMessage. offsets.MboxMarkerOffset = parser.MboxMarkerOffset; messageOffsets = offsets; } messages.Add (args.Message, offsets); }; // Connect a handler to track MimeMessage end offsets parser.MimeMessageEnd += delegate (sender, args) { // Our MimeMessageBegin event handler already created a MimeOffsets for // this message. Use the `messages` dictionary to retrieve it. var offsets = messages[args.Message]; // Track the size of the MimeMessage in octets (aka bytes), the offset // for the end of the header block, and the end of the message. offsets.Octets = args.EndOffset - args.HeadersEndOffset; offsets.HeadersEndOffset = args.HeadersEndOffset; offsets.EndOffset = args.EndOffset; }; // Connect a handler to track MimeEntity begin offsets parser.MimeEntityBegin += delegate (sender, args) { // Create a new MimeOffsets for this MIME entity (which could be a MimePart, MessagePart, or Multipart). var offsets = new MimeOffsets { MimeType = args.Entity.ContentType.MimeType, BeginOffset = args.BeginOffset, LineNumber = args.LineNumber }; if (args.Parent != null && entities.TryGetValue (args.Parent, out var parentOffsets)) { parentOffsets.Children ??= new List (); parentOffsets.Children.Add (offsets); } entities.Add (args.Entity, offsets); }; // Connect a handler to track MimeEntity end offsets parser.MimeEntityEnd += delegate (sender, args) { // Our MimeEntityBegin event handler already created a MimeOffsets for // this entity. Use the `entities` dictionary to retrieve it. var offsets = entities[args.Entity]; // Track the size of the MimeEntity in octets (aka bytes), the offset // for the end of the header block, the end of the entity, and the // line count. offsets.Octets = args.EndOffset - args.HeadersEndOffset; offsets.HeadersEndOffset = args.HeadersEndOffset; offsets.EndOffset = args.EndOffset; offsets.Lines = args.Lines; }; // Parse the message (which will emit the events as appropriate). var message = parser.ParseMessage (); // Now we can find out the offsets of each MimePart: foreach (var bodyPart in message.BodyParts.OfType ()) { var offsets = entities[bodyPart]; Console.WriteLine ($"The offsets for the MIME part for {bodyPart.ContentType} are:"); Console.WriteLine ($" - LineNumber: {offsets.LineNumber}") Console.WriteLine ($" - BeginOffset: {offsets.BeginOffset}"); Console.WriteLine ($" - HeadersEndOffset: {offsets.HeadersEndOffset}"); // Note: This is also where the *content* begins. Console.WriteLine ($" - EndOffset: {offsets.BeginOffset}"); Console.WriteLine ($" - Octets: {offsets.Octets}"); Console.WriteLine ($" - Lines: {offsets.Lines}"); } } } #endregion // MessageOffsets } } ================================================ FILE: Documentation/Examples/MimeVisitorExamples.cs ================================================ // // MimeVisitorExamples.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2023 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Linq; using System.Text; using System.Collections.Generic; using MimeKit; using MimeKit.Text; using MimeKit.Tnef; namespace MimeKit.Examples { #region HtmlPreviewVisitor /// /// Visits a MimeMessage and generates HTML suitable to be rendered by a browser control. /// class HtmlPreviewVisitor : MimeVisitor { List stack = new List (); List attachments = new List (); string body; /// /// Creates a new HtmlPreviewVisitor. /// public HtmlPreviewVisitor () { } /// /// The list of attachments that were in the MimeMessage. /// public IList Attachments { get { return attachments; } } /// /// The HTML string that can be set on the BrowserControl. /// public string HtmlBody { get { return body ?? string.Empty; } } protected override void VisitMultipartAlternative (MultipartAlternative alternative) { // walk the multipart/alternative children backwards from greatest level of faithfulness to the least faithful for (int i = alternative.Count - 1; i >= 0 && body == null; i--) alternative[i].Accept (this); } protected override void VisitMultipartRelated (MultipartRelated related) { var root = related.Root; // push this multipart/related onto our stack stack.Add (related); // visit the root document root.Accept (this); // pop this multipart/related off our stack stack.RemoveAt (stack.Count - 1); } // look up the image based on the img src url within our multipart/related stack bool TryGetImage (string url, out MimePart image) { UriKind kind; int index; Uri uri; if (Uri.IsWellFormedUriString (url, UriKind.Absolute)) kind = UriKind.Absolute; else if (Uri.IsWellFormedUriString (url, UriKind.Relative)) kind = UriKind.Relative; else kind = UriKind.RelativeOrAbsolute; try { uri = new Uri (url, kind); } catch { image = null; return false; } for (int i = stack.Count - 1; i >= 0; i--) { if ((index = stack[i].IndexOf (uri)) == -1) continue; image = stack[i][index] as MimePart; return image != null; } image = null; return false; } /// /// Get a data: URI for the image attachment. /// /// /// Encodes the image attachment into a string suitable for setting as a src= attribute value in /// an img tag. /// /// The data: URI. /// The image attachment. string GetDataUri (MimePart image) { using (var memory = new MemoryStream ()) { image.Content.DecodeTo (memory); var buffer = memory.GetBuffer (); var length = (int) memory.Length; var base64 = Convert.ToBase64String (buffer, 0, length); return string.Format ("data:{0};base64,{1}", image.ContentType.MimeType, base64); } } // Replaces urls that refer to images embedded within the message with // "file://" urls that the browser control will actually be able to load. void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) { if (ctx.TagId == HtmlTagId.Meta && !ctx.IsEndTag) { bool isContentType = false; ctx.WriteTag (htmlWriter, false); // replace charsets with "utf-8" since our output will be in utf-8 (and not whatever the original charset was) foreach (var attribute in ctx.Attributes) { if (attribute.Id == HtmlAttributeId.Charset) { htmlWriter.WriteAttributeName (attribute.Name); htmlWriter.WriteAttributeValue ("utf-8"); } else if (isContentType && attribute.Id == HtmlAttributeId.Content) { htmlWriter.WriteAttributeName (attribute.Name); htmlWriter.WriteAttributeValue ("text/html; charset=utf-8"); } else { if (attribute.Id == HtmlAttributeId.HttpEquiv && attribute.Value != null && attribute.Value.Equals ("Content-Type", StringComparison.OrdinalIgnoreCase)) isContentType = true; htmlWriter.WriteAttribute (attribute); } } } else if (ctx.TagId == HtmlTagId.Image && !ctx.IsEndTag && stack.Count > 0) { ctx.WriteTag (htmlWriter, false); // replace the src attribute with a "data:" URL foreach (var attribute in ctx.Attributes) { if (attribute.Id == HtmlAttributeId.Src) { if (!TryGetImage (attribute.Value, out var image)) { htmlWriter.WriteAttribute (attribute); continue; } var dataUri = GetDataUri (image); htmlWriter.WriteAttributeName (attribute.Name); htmlWriter.WriteAttributeValue (dataUri); } else { htmlWriter.WriteAttribute (attribute); } } } else if (ctx.TagId == HtmlTagId.Body && !ctx.IsEndTag) { ctx.WriteTag (htmlWriter, false); // add and/or replace oncontextmenu="return false;" foreach (var attribute in ctx.Attributes) { if (attribute.Name.Equals ("oncontextmenu", StringComparison.OrdinalIgnoreCase)) continue; htmlWriter.WriteAttribute (attribute); } htmlWriter.WriteAttribute ("oncontextmenu", "return false;"); } else { // pass the tag through to the output ctx.WriteTag (htmlWriter, true); } } protected override void VisitTextPart (TextPart entity) { TextConverter converter; if (body != null) { // since we've already found the body, treat this as an attachment attachments.Add (entity); return; } if (entity.IsHtml) { converter = new HtmlToHtml { HtmlTagCallback = HtmlTagCallback }; } else if (entity.IsFlowed) { var flowed = new FlowedToHtml (); string delsp; if (entity.ContentType.Parameters.TryGetValue ("delsp", out delsp)) flowed.DeleteSpace = delsp.Equals ("yes", StringComparison.OrdinalIgnoreCase); converter = flowed; } else { converter = new TextToHtml (); } body = converter.Convert (entity.Text); } protected override void VisitTnefPart (TnefPart entity) { // extract any attachments in the MS-TNEF part attachments.AddRange (entity.ExtractAttachments ()); } protected override void VisitMessagePart (MessagePart entity) { // treat message/rfc822 parts as attachments attachments.Add (entity); } protected override void VisitMimePart (MimePart entity) { // realistically, if we've gotten this far, then we can treat this as an attachment // even if the IsAttachment property is false. attachments.Add (entity); } } #endregion #region ReplyVisitor public class ReplyVisitor : MimeVisitor { readonly Stack stack = new Stack (); MimeMessage message; MimeEntity body; /// /// Creates a new ReplyVisitor. /// public ReplyVisitor () { } /// /// Gets the reply. /// /// The reply. public MimeEntity Body { get { return body; } } void Push (MimeEntity entity) { var multipart = entity as Multipart; if (body == null) { body = entity; } else { var parent = stack.Peek (); parent.Add (entity); } if (multipart != null) stack.Push (multipart); } void Pop () { stack.Pop (); } public static string GetOnDateSenderWrote (MimeMessage message) { var sender = message.Sender != null ? message.Sender : message.From.Mailboxes.FirstOrDefault (); var name = sender != null ? (!string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address) : "someone"; return string.Format ("On {0}, {1} wrote:", message.Date.ToString ("f"), name); } /// /// Visit the specified message. /// /// The message. public override void Visit (MimeMessage message) { this.message = message; stack.Clear (); base.Visit (message); } protected override void VisitMultipartAlternative (MultipartAlternative alternative) { var multipart = new MultipartAlternative (); Push (multipart); for (int i = 0; i < alternative.Count; i++) alternative[i].Accept (this); Pop (); } protected override void VisitMultipartRelated (MultipartRelated related) { var multipart = new MultipartRelated (); var root = related.Root; Push (multipart); root.Accept (this); for (int i = 0; i < related.Count; i++) { if (related[i] != root) related[i].Accept (this); } Pop (); } protected override void VisitMultipart (Multipart multipart) { foreach (var part in multipart) { if (part is MultipartAlternative) part.Accept (this); else if (part is MultipartRelated) part.Accept (this); else if (part is TextPart) part.Accept (this); } } void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) { if (ctx.TagId == HtmlTagId.Body && !ctx.IsEmptyElementTag) { if (ctx.IsEndTag) { // end our opening
htmlWriter.WriteEndTag (HtmlTagId.BlockQuote); // pass the tag through to the output ctx.WriteTag (htmlWriter, true); } else { // pass the tag through to the output ctx.WriteTag (htmlWriter, true); // prepend the HTML reply with "On {DATE}, {SENDER} wrote:" htmlWriter.WriteStartTag (HtmlTagId.P); htmlWriter.WriteText (GetOnDateSenderWrote (message)); htmlWriter.WriteEndTag (HtmlTagId.P); // Wrap the original content in a
htmlWriter.WriteStartTag (HtmlTagId.BlockQuote); htmlWriter.WriteAttribute (HtmlAttributeId.Style, "border-left: 1px #ccc solid; margin: 0 0 0 .8ex; padding-left: 1ex;"); ctx.InvokeCallbackForEndTag = true; } } else { // pass the tag through to the output ctx.WriteTag (htmlWriter, true); } } string QuoteText (string text) { using (var quoted = new StringWriter ()) { quoted.WriteLine (GetOnDateSenderWrote (message)); using (var reader = new StringReader (text)) { string line; while ((line = reader.ReadLine ()) != null) { quoted.Write ("> "); quoted.WriteLine (line); } } return quoted.ToString (); } } protected override void VisitTextPart (TextPart entity) { string text; if (entity.IsHtml) { var converter = new HtmlToHtml { HtmlTagCallback = HtmlTagCallback }; text = converter.Convert (entity.Text); } else if (entity.IsFlowed) { var converter = new FlowedToText (); text = converter.Convert (entity.Text); text = QuoteText (text); } else { // quote the original message text text = QuoteText (entity.Text); } var part = new TextPart (entity.ContentType.MediaSubtype.ToLowerInvariant ()) { Text = text }; Push (part); } protected override void VisitMessagePart (MessagePart entity) { // don't descend into message/rfc822 parts } } #endregion public class Program { #region RenderMessage void Render (MimeMessage message) { var tmpDir = Path.Combine (Path.GetTempPath (), message.MessageId); var visitor = new HtmlPreviewVisitor (tmpDir); Directory.CreateDirectory (tmpDir); message.Accept (visitor); DisplayHtml (visitor.HtmlBody); DisplayAttachments (visitor.Attachments); } #endregion #region ReplySimple public static MimeMessage Reply (MimeMessage message, MailboxAddress from, bool replyToAll) { var reply = new MimeMessage (); reply.From.Add (from); // reply to the sender of the message if (message.ReplyTo.Count > 0) { reply.To.AddRange (message.ReplyTo); } else if (message.From.Count > 0) { reply.To.AddRange (message.From); } else if (message.Sender != null) { reply.To.Add (message.Sender); } if (replyToAll) { // include all of the other original recipients (removing ourselves from the list) reply.To.AddRange (message.To.Mailboxes.Where (x => x.Address != from.Address)); reply.Cc.AddRange (message.Cc.Mailboxes.Where (x => x.Address != from.Address)); } // set the reply subject if (!message.Subject.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase)) reply.Subject = "Re: " + message.Subject; else reply.Subject = message.Subject; // construct the In-Reply-To and References headers if (!string.IsNullOrEmpty (message.MessageId)) { reply.InReplyTo = message.MessageId; foreach (var id in message.References) reply.References.Add (id); reply.References.Add (message.MessageId); } // quote the original message text using (var quoted = new StringWriter ()) { var sender = message.Sender ?? message.From.Mailboxes.FirstOrDefault (); var name = sender != null ? (!string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address) : "someone"; quoted.WriteLine ("On {0}, {1} wrote:", message.Date.ToString ("f"), name); using (var reader = new StringReader (message.TextBody)) { string line; while ((line = reader.ReadLine ()) != null) { quoted.Write ("> "); quoted.WriteLine (line); } } reply.Body = new TextPart ("plain") { Text = quoted.ToString () }; } return reply; } #endregion #region Reply public static MimeMessage Reply (MimeMessage message, MailboxAddress from, bool replyToAll) { var visitor = new ReplyVisitor (); var reply = new MimeMessage (); reply.From.Add (from); // reply to the sender of the message if (message.ReplyTo.Count > 0) { reply.To.AddRange (message.ReplyTo); } else if (message.From.Count > 0) { reply.To.AddRange (message.From); } else if (message.Sender != null) { reply.To.Add (message.Sender); } if (replyToAll) { // include all of the other original recipients (removing ourselves from the list) reply.To.AddRange (message.To.Mailboxes.Where (x => x.Address != from.Address)); reply.Cc.AddRange (message.Cc.Mailboxes.Where (x => x.Address != from.Address)); } // set the reply subject if (!message.Subject.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase)) reply.Subject = "Re: " + message.Subject; else reply.Subject = message.Subject; // construct the In-Reply-To and References headers if (!string.IsNullOrEmpty (message.MessageId)) { reply.InReplyTo = message.MessageId; foreach (var id in message.References) reply.References.Add (id); reply.References.Add (message.MessageId); } visitor.Visit (message); reply.Body = visitor.Body ?? new TextPart ("plain") { Text = ReplyVisitor.GetOnDateSenderWrote (message) + Environment.NewLine }; return reply; } #endregion } } ================================================ FILE: Documentation/Examples/MultipartFormDataExamples.cs ================================================ using System; using System.Net; using MimeKit; namespace Examples { class MultipartFormDataExample { #region ParseMultipartFormDataSimple MimeEntity ParseMultipartFormData (HttpWebResponse response) { var contentType = ContentType.Parse (response.ContentType); return MimeEntity.Load (contentType, response.GetResponseStream ()); } #endregion #region ParseMultipartFormDataComplex MimeEntity ParseMultipartFormData (HttpWebResponse response) { // create a temporary file to store our large HTTP data stream var tmp = Path.GetTempFileName (); using (var stream = File.Open (tmp, FileMode.Open, FileAccess.ReadWrite)) { // create a header for the multipart/form-data MIME entity based on the Content-Type value of the HTTP // response var header = Encoding.UTF8.GetBytes (string.Format ("Content-Type: {0}\r\n\r\n", response.ContentType)); // write the header to the stream stream.Write (header, 0, header.Length); // copy the content of the HTTP response to our temporary stream response.GetResponseStream ().CopyTo (stream); // reset the stream back to the beginning stream.Position = 0; // parse the MIME entity with persistent = true, telling the parser not to load the content into memory return MimeEntity.Load (stream, persistent: true); } } #endregion } } ================================================ FILE: Documentation/Examples/OAuth2ExchangeExample.cs ================================================ using System; using System.Threading; using System.Threading.Tasks; using MailKit; using MailKit.Net.Imap; using MailKit.Security; using Microsoft.Identity.Client; namespace OAuth2ExchangeExample { class Program { const string ExchangeAccount = "username@office365.com"; public static void Main (string[] args) { using (var client = new ImapClient ()) { client.Connect ("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect); if (client.AuthenticationMechanisms.Contains ("OAUTHBEARER") || client.AuthenticationMechanisms.Contains ("XOAUTH2")) AuthenticateAsync (client).GetAwaiter ().GetResult (); client.Disconnect (true); } } static async Task AuthenticateAsync (ImapClient client) { var options = new PublicClientApplicationOptions { ClientId = "Application (client) ID", TenantId = "Directory (tenant) ID", RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient" }; var publicClientApplication = PublicClientApplicationBuilder .CreateWithApplicationOptions (options) .Build (); var scopes = new string[] { "email", "offline_access", "https://outlook.office.com/IMAP.AccessAsUser.All", // Only needed for IMAP //"https://outlook.office.com/POP.AccessAsUser.All", // Only needed for POP //"https://outlook.office.com/SMTP.AccessAsUser.All", // Only needed for SMTP }; AuthenticationResult? result; try { // First, check the cache for an auth token. result = await publicClientApplication.AcquireTokenSilent (scopes, username).ExecuteAsync (); } catch (MsalUiRequiredException) { // If that fails, then try getting an auth token interactively. result = await publicClientApplication.AcquireTokenInteractive (scopes).WithLoginHint (username).ExecuteAsync (); } // Note: We use result.Account.Username here instead of ExchangeAccount because the user *may* have chosen a // different Microsoft Exchange account when presented with the browser window during the authentication process. SaslMechanism oauth2; if (client.AuthenticationMechanisms.Contains ("OAUTHBEARER")) oauth2 = new SaslMechanismOAuthBearer (result.Account.Username, result.AccessToken); else oauth2 = new SaslMechanismOAuth2 (result.Account.Username, result.AccessToken); await client.AuthenticateAsync (oauth2); } } } ================================================ FILE: Documentation/Examples/OAuth2GMailExample.cs ================================================ using System; using System.Threading; using System.Threading.Tasks; using Google.Apis.Util; using Google.Apis.Util.Store; using Google.Apis.Auth.OAuth2; using Google.Apis.Auth.OAuth2.Flows; using MailKit; using MailKit.Net.Imap; using MailKit.Security; namespace OAuth2GMailExample { class Program { const string GMailAccount = "username@gmail.com"; public static void Main (string[] args) { using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); if (client.AuthenticationMechanisms.Contains ("OAUTHBEARER") || client.AuthenticationMechanisms.Contains ("XOAUTH2")) AuthenticateAsync (client).GetAwaiter ().GetResult (); client.Disconnect (true); } } static async Task AuthenticateAsync (ImapClient client) { var clientSecrets = new ClientSecrets { ClientId = "XXX.apps.googleusercontent.com", ClientSecret = "XXX" }; var codeFlow = new GoogleAuthorizationCodeFlow (new GoogleAuthorizationCodeFlow.Initializer { DataStore = new FileDataStore ("CredentialCacheFolder", false), Scopes = new [] { "https://mail.google.com/" }, ClientSecrets = clientSecrets }); // Note: For a web app, you'll want to use AuthorizationCodeWebApp instead. var codeReceiver = new LocalServerCodeReceiver (); var authCode = new AuthorizationCodeInstalledApp (codeFlow, codeReceiver); var credential = await authCode.AuthorizeAsync (GMailAccount, CancellationToken.None); if (credential.Token.IsStale) await credential.RefreshTokenAsync (CancellationToken.None); // Note: We use credential.UserId here instead of GMailAccount because the user *may* have chosen a // different GMail account when presented with the browser window during the authentication process. SaslMechanism oauth2; if (client.AuthenticationMechanisms.Contains ("OAUTHBEARER")) oauth2 = new SaslMechanismOAuthBearer (credential.UserId, credential.Token.AccessToken); else oauth2 = new SaslMechanismOAuth2 (credential.UserId, credential.Token.AccessToken); await client.AuthenticateAsync (oauth2); } } } ================================================ FILE: Documentation/Examples/OpenPGPExamples.cs ================================================ using System; using System.IO; using System.Linq; using System.Text; using MimeKit; using MimeKit.Cryptography; namespace Examples { #region MyGnuPGContext public class MyGnuPGContext : GnuPGContext { public MyGnuPGContext () { } protected override string GetPasswordForKey (PgpSecretKey key) { // prompt the user (or a secure password cache) for the password for the specified secret key. return "password"; } } #endregion public class OpenPGPExamples { public void RegisterMyGnuPGeContext () { #region RegisterCustomContext // Note: by registering our custom context it becomes the default OpenPGP context // instantiated by MimeKit when methods such as Encrypt(), Decrypt(), Sign(), and // Verify() are used without an explicit context. CryptographyContext.Register (typeof (MyGnuPGContext)); #endregion } #region Encrypt public void Encrypt (MimeMessage message) { // encrypt our message body using our custom GnuPG cryptography context using (var ctx = new MyGnuPGContext ()) { // Note: this assumes that each of the recipients has a PGP key associated // with their email address in the user's public keyring. // // If this is not the case, you can use SecureMailboxAddresses instead of // normal MailboxAddresses which would allow you to specify the fingerprint // of their PGP keys. You could also choose to use one of the Encrypt() // overloads that take a list of PgpPublicKeys. message.Body = MultipartEncrypted.Encrypt (ctx, message.To.Mailboxes, message.Body); } } #endregion #region Decrypt public MimeEntity Decrypt (MimeMessage message) { if (message.Body is MultipartEncrypted) { // the top-level MIME part of the message is encrypted using PGP/MIME var encrypted = (MultipartEncrypted) entity; return encrypted.Decrypt (); } else { // the top-level MIME part is not encrypted return message.Body; } } #endregion #region Sign public void Sign (MimeMessage message) { // digitally sign our message body using our custom GnuPG cryptography context using (var ctx = new MyGnuPGContext ()) { // Note: this assumes that the Sender address has an S/MIME signing certificate // and private key with an X.509 Subject Email identifier that matches the // sender's email address. // // If this is not the case, you can use a SecureMailboxAddress instead of a // normal MailboxAddress which would allow you to specify the fingerprint // of the sender's private PGP key. You could also choose to use one of the // Create() overloads that take a PgpSecretKey, instead. var sender = message.From.Mailboxes.FirstOrDefault (); message.Body = MultipartSigned.Create (ctx, sender, DigestAlgorithm.Sha1, message.Body); } } #endregion #region SignWithKey public void Sign (MimeMessage message, PgpSecretKey key) { // digitally sign our message body using our custom GnuPG cryptography context using (var ctx = new MyGnuPGContext ()) { message.Body = MultipartSigned.Create (ctx, key, DigestAlgorithm.Sha1, message.Body); } } #endregion #region Verify public void Verify (MimeMessage message) { if (message.Body is MultipartSigned) { var signed = (MultipartSigned) message.Body; foreach (var signature in signed.Verify ()) { try { bool valid = signature.Verify (); // If valid is true, then it signifies that the signed content // has not been modified since this particular signer signed the // content. // // However, if it is false, then it indicates that the signed // content has been modified. } catch (DigitalSignatureVerifyException) { // There was an error verifying the signature. } } } } #endregion #region DecryptInlinePGP static Stream Decrypt (MimeMessage message) { var text = message.TextBody; using (var encrypted = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var ctx = new MyGnuPGContext ()) { var decrypted = new MemoryStream (); ctx.DecryptTo (encrypted, decrypted); decrypted.Position = 0; return decrypted; } } } #endregion } } ================================================ FILE: Documentation/Examples/OpeningContent.cs ================================================ using (var stream = part.Content.Open ()) { // At this point, you can now read from the stream as if it were the original, // raw content. Assuming you have an image UI control that could load from a // stream, you could do something like this: imageControl.Load (stream); } ================================================ FILE: Documentation/Examples/ParameterExamples.cs ================================================ using System; using MimeKit; namespace MimeKit.Examples { public static class ParameterExamples { public void OverrideAllParameterEncodings (MimePart part) { #region OverrideAllParameterEncodings // Some versions of Outlook expect the rfc2047 style of encoding of parameter values. foreach (var parameter in part.ContentDisposition.Parameters) parameter.EncodingMethod = ParameterEncodingMethod.Rfc2047; #endregion OverrideAllParameterEncodings } public void OverrideFileNameParameterEncodings (MimePart part) { #region OverrideFileNameParameterEncoding // Some versions of Outlook expect the rfc2047 style of encoding for the filename parameter value. if (part.ContentDisposition.Parameters.TryGetValue ("filename", out var parameter)) parameter.EncodingMethod = ParameterEncodingMethod.Rfc2047; #endregion OverrideFileNameParameterEncoding } } } ================================================ FILE: Documentation/Examples/Pop3Examples.cs ================================================ // // Pop3Examples.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2023 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Collections.Generic; using MimeKit; using MailKit; using MailKit.Security; using MailKit.Net.Pop3; namespace MailKit.Examples { public static class Pop3Examples { #region ProtocolLogger public static void DownloadMessages () { using (var client = new Pop3Client (new ProtocolLogger ("pop3.log"))) { client.Connect ("pop.gmail.com", 995, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); for (int i = 0; i < client.Count; i++) { var message = client.GetMessage (i); // write the message to a file message.WriteTo (string.Format ("{0}.msg", i)); // mark the message for deletion client.DeleteMessage (i); } client.Disconnect (true); } } #endregion #region Capabilities public static void PrintCapabilities () { using (var client = new Pop3Client ()) { client.Connect ("pop.gmail.com", 995, SecureSocketOptions.SslOnConnect); if (client.Capabilities.HasFlag (Pop3Capabilities.SASL)) { var mechanisms = string.Join (", ", client.AuthenticationMechanisms); Console.WriteLine ("The POP3 server supports the following SASL mechanisms: {0}", mechanisms); } client.Authenticate ("username", "password"); if (client.Capabilities.HasFlag (Pop3Capabilities.Apop)) Console.WriteLine ("The server supports APOP authentication."); if (client.Capabilities.HasFlag (Pop3Capabilities.Expire)) { if (client.ExpirePolicy > 0) Console.WriteLine ("The POP3 server automatically expires messages after {0} days", client.ExpirePolicy); else Console.WriteLine ("The POP3 server will never expire messages."); } if (client.Capabilities.HasFlag (Pop3Capabilities.LoginDelay)) Console.WriteLine ("The minimum number of seconds between login attempts is {0}.", client.LoginDelay); if (client.Capabilities.HasFlag (Pop3Capabilities.Pipelining)) Console.WriteLine ("The POP3 server can pipeline commands, so using client.GetMessages() will be faster."); if (client.Capabilities.HasFlag (Pop3Capabilities.Top)) Console.WriteLine ("The POP3 server supports the TOP command, so it's possible to download message headers."); if (client.Capabilities.HasFlag (Pop3Capabilities.UIDL)) Console.WriteLine ("The POP3 server supports the UIDL command which means we can track messages by UID."); client.Disconnect (true); } } #endregion #region DownloadMessages public static void DownloadMessages () { using (var client = new Pop3Client ()) { client.Connect ("pop.gmail.com", 995, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); for (int i = 0; i < client.Count; i++) { var message = client.GetMessage (i); // write the message to a file message.WriteTo (string.Format ("{0}.msg", i)); // mark the message for deletion client.DeleteMessage (i); } client.Disconnect (true); } } #endregion #region BatchDownloadMessages public static void DownloadMessages () { using (var client = new Pop3Client ()) { client.Connect ("pop.gmail.com", 995, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); var messages = client.DownloadMessages (0, count); foreach (var message in messages) { // write the message to a file message.WriteTo (string.Format ("{0}.msg", i)); } client.DeleteMessages (0, count); client.Disconnect (true); } } #endregion #region DownloadNewMessages public static void DownloadNewMessages (HashSet previouslyDownloadedUids) { using (var client = new Pop3Client ()) { client.Connect ("pop.gmail.com", 995, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); if (!client.Capabilities.HasFlag (Pop3Capabilities.UIDL)) throw new Exception ("The POP3 server does not support UIDs!"); var uids = client.GetMessageUids (); for (int i = 0; i < client.Count; i++) { // check that we haven't already downloaded this message // in a previous session if (previouslyDownloadedUids.Contains (uids[i])) continue; var message = client.GetMessage (i); // write the message to a file message.WriteTo (string.Format ("{0}.msg", uids[i])); // add the message uid to our list of downloaded uids previouslyDownloadedUids.Add (uids[i]); } client.Disconnect (true); } } #endregion #region ExceptionHandling public static void DownloadNewMessages (HashSet previouslyDownloadedUids) { using (var client = new Pop3Client ()) { IList uids = null; try { client.Connect ("pop.gmail.com", 995, SecureSocketOptions.SslOnConnect); } catch (Pop3CommandException ex) { Console.WriteLine ("Error trying to connect: {0}", ex.Message); Console.WriteLine ("\tStatusText: {0}", ex.StatusText); return; } catch (Pop3ProtocolException ex) { Console.WriteLine ("Protocol error while trying to connect: {0}", ex.Message); return; } try { client.Authenticate ("username", "password"); } catch (AuthenticationException ex) { Console.WriteLine ("Invalid user name or password."); return; } catch (Pop3CommandException ex) { Console.WriteLine ("Error trying to authenticate: {0}", ex.Message); Console.WriteLine ("\tStatusText: {0}", ex.StatusText); return; } catch (Pop3ProtocolException ex) { Console.WriteLine ("Protocol error while trying to authenticate: {0}", ex.Message); return; } // for the sake of this example, let's assume GMail supports the UIDL extension if (client.Capabilities.HasFlag (Pop3Capabilities.UIDL)) { try { uids = client.GetMessageUids (); } catch (Pop3CommandException ex) { Console.WriteLine ("Error trying to get the list of uids: {0}", ex.Message); Console.WriteLine ("\tStatusText: {0}", ex.StatusText); // we'll continue on leaving uids set to null... } catch (Pop3ProtocolException ex) { Console.WriteLine ("Protocol error while trying to authenticate: {0}", ex.Message); // Pop3ProtocolExceptions often cause the connection to drop if (!client.IsConnected) return; } } for (int i = 0; i < client.Count; i++) { if (uids != null && previouslyDownloadedUids.Contains (uids[i])) { // we must have downloaded this message in a previous session continue; } try { // download the message at the specified index var message = client.GetMessage (i); // write the message to a file if (uids != null) { message.WriteTo (string.Format ("{0}.msg", uids[i])); // keep track of our downloaded message uids so we can skip downloading them next time previouslyDownloadedUids.Add (uids[i]); } else { message.WriteTo (string.Format ("{0}.msg", i)); } } catch (Pop3CommandException ex) { Console.WriteLine ("Error downloading message {0}: {1}", i, ex.Message); Console.WriteLine ("\tStatusText: {0}", ex.StatusText); continue; } catch (Pop3ProtocolException ex) { Console.WriteLine ("Protocol error while sending message {0}: {1}", i, ex.Message); // most likely the connection has been dropped if (!client.IsConnected) break; } } if (client.IsConnected) { // if we do not disconnect cleanly, then the messages won't actually get deleted client.Disconnect (true); } } } #endregion #region SslConnectionInformation public static void PrintSslConnectionInfo (string host, int port) { using (var client = new SmtpClient ()) { client.Connect (host, port, SecureSocketOptions.Auto); Console.WriteLine ($"Negotiated the following SSL options with {host}:"); Console.WriteLine ($" Protocol Version: {client.SslProtocol}"); Console.WriteLine ($" Cipher Algorithm: {client.SslCipherAlgorithm}"); Console.WriteLine ($" Cipher Strength: {client.SslCipherStrength}"); Console.WriteLine ($" Hash Algorithm: {client.SslHashAlgorithm}"); Console.WriteLine ($" Hash Strength: {client.SslHashStrength}"); Console.WriteLine ($" Key-Exchange Algorithm: {client.SslKeyExchangeAlgorithm}"); Console.WriteLine ($" Key-Exchange Strength: {client.SslKeyExchangeStrength}"); // Example Log: // // Negotiated the following SSL options with pop.gmail.com: // Protocol Version: Tls12 // Cipher Algorithm: Aes128 // Cipher Strength: 128 // Hash Algorithm: Sha256 // Hash Strength: 0 // Key-Exchange Algorithm: 44550 // Key-Exchange Strength: 255 client.Disconnect (true); } } #endregion } } ================================================ FILE: Documentation/Examples/ProxyExamples.cs ================================================ // // ProxyExamples.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2023 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using MimeKit; using MailKit; using MailKit.Security; using MailKit.Net.Smtp; using MailKit.Net.Pop3; using MailKit.Net.Imap; using MailKit.Net.Proxy; namespace MailKit.Examples { public static class ProxyExamples { #region ProxyClient public static void SendMessageViaProxy (MimeMessage message) { using (var client = new SmtpClient ()) { client.ProxyClient = new Socks5Proxy ("socks5.proxy.com", 1080, new NetworkCredentials ("proxyUserName", "proxyPassword")); client.Connect ("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Send (message); client.Disconnect (true); } } #endregion } } ================================================ FILE: Documentation/Examples/RecursivelyTraverse.cs ================================================ static void HandleMimeEntity (MimeEntity entity) { var multipart = entity as Multipart; if (multipart != null) { for (int i = 0; i < multipart.Count; i++) HandleMimeEntity (multipart[i]); return; } var rfc822 = entity as MessagePart; if (rfc822 != null) { var message = rfc822.Message; HandleMimeEntity (message.Body); return; } var part = (MimePart) entity; // do something with the MimePart, such as save content to disk } ================================================ FILE: Documentation/Examples/SMimeExamples.cs ================================================ using System; using MimeKit; using MimeKit.Cryptography; namespace Examples { #region MySecureMimeContext public class MySecureMimeContext : DefaultSecureMimeContext { public MySecureMimeContext () : base (OpenDatabase ("C:\\wherever\\certdb.sqlite")) { } static IX509CertificateDatabase OpenDatabase (string fileName) { var builder = new SQLiteConnectionStringBuilder (); builder.DateTimeFormat = SQLiteDateFormats.Ticks; builder.DataSource = fileName; if (!File.Exists (fileName)) SQLiteConnection.CreateFile (fileName); var sqlite = new SQLiteConnection (builder.ConnectionString); sqlite.Open (); return new SqliteCertificateDatabase (sqlite, "password"); } } #endregion public class SMimeExamples { public void RegisterMySecureMimeContext () { #region RegisterCustomContext // Note: by registering our custom context it becomes the default S/MIME context // instantiated by MimeKit when methods such as Encrypt(), Decrypt(), Sign(), and // Verify() are used without an explicit context. CryptographyContext.Register (typeof (MySecureMimeContext)); #endregion } #region Encrypt public void Encrypt (MimeMessage message) { // encrypt our message body using our custom S/MIME cryptography context using (var ctx = new MySecureMimeContext ()) { // Note: this assumes that each of the recipients has an S/MIME certificate // with an X.509 Subject Email identifier that matches their email address. // // If this is not the case, you can use SecureMailboxAddresses instead of // normal MailboxAddresses which would allow you to specify the fingerprint // of their certificates. You could also choose to use one of the Encrypt() // overloads that take a list of CmsRecipients, instead. message.Body = ApplicationPkcs7Mime.Encrypt (ctx, message.To.Mailboxes, message.Body); } } #endregion #region Decrypt public MimeEntity Decrypt (MimeMessage message) { var pkcs7 = message.Body as ApplicationPkcs7Mime; if (pkcs7 != null && pkcs7.SecureMimeType == SecureMimeType.EnvelopedData) { // the top-level MIME part of the message is encrypted using S/MIME return pkcs7.Decrypt (); } else { // the top-level MIME part is not encrypted return message.Body; } } #endregion #region MultipartSign public void MultipartSign (MimeMessage message) { // digitally sign our message body using our custom S/MIME cryptography context using (var ctx = new MySecureMimeContext ()) { // Note: this assumes that the Sender address has an S/MIME signing certificate // and private key with an X.509 Subject Email identifier that matches the // sender's email address. var sender = message.From.Mailboxes.FirstOrDefault (); message.Body = MultipartSigned.Create (ctx, sender, DigestAlgorithm.Sha1, message.Body); } } #endregion #region MultipartSignWithKey public void MultipartSign (MimeMessage message, X509Certificate2 certificate) { // digitally sign our message body using our custom S/MIME cryptography context using (var ctx = new MySecureMimeContext ()) { var signer = new CmsSigner (certificate) { DigestAlgorithm = DigestAlgorithm.Sha1 }; message.Body = MultipartSigned.Create (ctx, signer, message.Body); } } #endregion #region Pkcs7Sign public void Pkcs7Sign (MimeMessage message) { // digitally sign our message body using our custom S/MIME cryptography context using (var ctx = new MySecureMimeContext ()) { // Note: this assumes that the Sender address has an S/MIME signing certificate // and private key with an X.509 Subject Email identifier that matches the // sender's email address. var sender = message.From.Mailboxes.FirstOrDefault (); message.Body = ApplicationPkcs7Mime.Sign (ctx, sender, DigestAlgorithm.Sha1, message.Body); } } #endregion #region VerifyMultipartSigned public void VerifyMultipartSigned (MimeMessage message) { if (message.Body is MultipartSigned) { var signed = (MultipartSigned) message.Body; foreach (var signature in signed.Verify ()) { try { bool valid = signature.Verify (); // If valid is true, then it signifies that the signed content // has not been modified since this particular signer signed the // content. // // However, if it is false, then it indicates that the signed // content has been modified. } catch (DigitalSignatureVerifyException) { // There was an error verifying the signature. } } } } #endregion #region VerifyPkcs7 public void VerifyPkcs7 (MimeMessage message) { var pkcs7 = message.Body as ApplicationPkcs7Mime; if (pkcs7 != null && pkcs7.SecureMimeType == SecureMimeType.SignedData) { // extract the original content and get a list of signatures MimeEntity original; // Note: if you are rendering the message, you'll want to render the // original mime part rather than the application/pkcs7-mime part. foreach (var signature in pkcs7.Verify (out original)) { try { bool valid = signature.Verify (); // If valid is true, then it signifies that the signed content // has not been modified since this particular signer signed the // content. // // However, if it is false, then it indicates that the signed // content has been modified. } catch (DigitalSignatureVerifyException) { // There was an error verifying the signature. } } } } #endregion } } ================================================ FILE: Documentation/Examples/SmtpExamples.cs ================================================ // // SmtpExamples.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2023 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using MimeKit; using MailKit; using MailKit.Security; using MailKit.Net.Smtp; namespace MailKit.Examples { public static class SmtpExamples { #region SaveToPickupDirectory public static void SaveToPickupDirectory (MimeMessage message, string pickupDirectory) { do { // Generate a random file name to save the message to. var path = Path.Combine (pickupDirectory, Guid.NewGuid ().ToString () + ".eml"); Stream stream; try { // Attempt to create the new file. stream = File.Open (path, FileMode.CreateNew); } catch (IOException) { // If the file already exists, try again with a new Guid. if (File.Exists (path)) continue; // Otherwise, fail immediately since it probably means that there is // no graceful way to recover from this error. throw; } try { using (stream) { // IIS pickup directories expect the message to be "byte-stuffed" // which means that lines beginning with "." need to be escaped // by adding an extra "." to the beginning of the line. // // Use an SmtpDataFilter to "byte-stuff" the message as it is written // to the file stream. This is the same process that an SmtpClient // would use when sending the message in a `DATA` command. using (var filtered = new FilteredStream (stream)) { filtered.Add (new SmtpDataFilter ()); // Make sure to write the message in DOS () format. var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; message.WriteTo (options, filtered); filtered.Flush (); return; } } } catch { // An exception here probably means that the disk is full. // // Delete the file that was created above so that incomplete files are not // left behind for IIS to send accidentally. File.Delete (path); throw; } } while (true); } #endregion #region LoadFromPickupDirectory public static MimeMessage LoadFromPickupDirectory (string fileName) { using (var stream = File.OpenRead (fileName)) { // IIS pickup directories store messages that have been "byte-stuffed" // which means that lines beginning with "." have been escaped by // adding an extra "." to the beginning of the line. // // Use an SmtpDataFilter to decode the message as it is loaded from // the file stream. This is the reverse process that an SmtpClient // would use when sending the message in a `DATA` command. using (var filtered = new FilteredStream (stream)) { filtered.Add (new SmtpDataFilter (decode: true)); return MimeMessage.Load (filtered); } } } #endregion #region ProtocolLogger public static void SendMessage (MimeMessage message) { using (var client = new SmtpClient (new ProtocolLogger ("smtp.log"))) { client.Connect ("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Send (message); client.Disconnect (true); } // Example log: // // Connected to smtps://smtp.gmail.com:465/ // S: 220 smtp.gmail.com ESMTP w81sm22057166qkg.43 - gsmtp // C: EHLO [192.168.1.220] // S: 250-smtp.gmail.com at your service, [192.168.1.220] // S: 250-SIZE 35882577 // S: 250-8BITMIME // S: 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH // S: 250-ENHANCEDSTATUSCODES // S: 250-PIPELINING // S: 250-CHUNKING // S: 250 SMTPUTF8 // C: AUTH PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk // S: 235 2.7.0 Accepted // C: MAIL FROM: // C: RCPT TO: // S: 250 2.1.0 OK w81sm22057166qkg.43 - gsmtp // S: 250 2.1.5 OK w81sm22057166qkg.43 - gsmtp // C: DATA // S: 354 Go ahead w81sm22057166qkg.43 - gsmtp // C: From: "LastName, FirstName" // C: Date: Thu, 27 Dec 2018 10:55:18 -0500 // C: Subject: This is a test message // C: Message-Id: // C: To: "LastName, FirstName" // C: MIME-Version: 1.0 // C: Content-Type: multipart/alternative; boundary="=-CToJI+AD2gS6z+fFlzDvhg==" // C: // C: --=-CToJI+AD2gS6z+fFlzDvhg== // C: Content-Type: text/plain; charset=utf-8 // C: Content-Transfer-Encoding: quoted-printable // C: // C: This is the text/plain message body. // C: --=-CToJI+AD2gS6z+fFlzDvhg== // C: Content-Type: text/html; charset=utf-8 // C: Content-Transfer-Encoding: quoted-printable // C: // C:
This is the text/html message body.
// C: --=-CToJI+AD2gS6z+fFlzDvhg==-- // C: // C: . // S: 250 2.0.0 OK 1545926120 w81sm22057166qkg.43 - gsmtp // C: QUIT // S: 221 2.0.0 closing connection w81sm22057166qkg.43 - gsmtp } #endregion #region Capabilities public static void PrintCapabilities () { using (var client = new SmtpClient ()) { client.Connect ("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); if (client.Capabilities.HasFlag (SmtpCapabilities.Authentication)) { var mechanisms = string.Join (", ", client.AuthenticationMechanisms); Console.WriteLine ("The SMTP server supports the following SASL mechanisms: {0}", mechanisms); client.Authenticate ("username", "password"); } if (client.Capabilities.HasFlag (SmtpCapabilities.Size)) Console.WriteLine ("The SMTP server has a size restriction on messages: {0}.", client.MaxSize); if (client.Capabilities.HasFlag (SmtpCapabilities.Dsn)) Console.WriteLine ("The SMTP server supports delivery-status notifications."); if (client.Capabilities.HasFlag (SmtpCapabilities.EightBitMime)) Console.WriteLine ("The SMTP server supports Content-Transfer-Encoding: 8bit"); if (client.Capabilities.HasFlag (SmtpCapabilities.BinaryMime)) Console.WriteLine ("The SMTP server supports Content-Transfer-Encoding: binary"); if (client.Capabilities.HasFlag (SmtpCapabilities.UTF8)) Console.WriteLine ("The SMTP server supports UTF-8 in message headers."); client.Disconnect (true); } } #endregion #region ExceptionHandling public static void SendMessage (MimeMessage message) { using (var client = new SmtpClient ()) { try { client.Connect ("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); } catch (SmtpCommandException ex) { Console.WriteLine ("Error trying to connect: {0}", ex.Message); Console.WriteLine ("\tStatusCode: {0}", ex.StatusCode); return; } catch (SmtpProtocolException ex) { Console.WriteLine ("Protocol error while trying to connect: {0}", ex.Message); return; } // Note: Not all SMTP servers support authentication, but GMail does. if (client.Capabilities.HasFlag (SmtpCapabilities.Authentication)) { try { client.Authenticate ("username", "password"); } catch (AuthenticationException ex) { Console.WriteLine ("Invalid user name or password."); return; } catch (SmtpCommandException ex) { Console.WriteLine ("Error trying to authenticate: {0}", ex.Message); Console.WriteLine ("\tStatusCode: {0}", ex.StatusCode); return; } catch (SmtpProtocolException ex) { Console.WriteLine ("Protocol error while trying to authenticate: {0}", ex.Message); return; } } try { client.Send (message); } catch (SmtpCommandException ex) { Console.WriteLine ("Error sending message: {0}", ex.Message); Console.WriteLine ("\tStatusCode: {0}", ex.StatusCode); switch (ex.ErrorCode) { case SmtpErrorCode.RecipientNotAccepted: Console.WriteLine ("\tRecipient not accepted: {0}", ex.Mailbox); break; case SmtpErrorCode.SenderNotAccepted: Console.WriteLine ("\tSender not accepted: {0}", ex.Mailbox); break; case SmtpErrorCode.MessageNotAccepted: Console.WriteLine ("\tMessage not accepted."); break; } } catch (SmtpProtocolException ex) { Console.WriteLine ("Protocol error while sending message: {0}", ex.Message); } client.Disconnect (true); } } #endregion #region SendMessage public static void SendMessage (MimeMessage message) { using (var client = new SmtpClient ()) { client.Connect ("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); client.Send (message); client.Disconnect (true); } } #endregion #region SendMessageUri public static void SendMessage (MimeMessage message) { using (var client = new SmtpClient ()) { // Note: since GMail requires SSL at connection time, use the "smtps" // protocol instead of "smtp". var uri = new Uri ("smtps://smtp.gmail.com:465"); client.Connect (uri); client.Authenticate ("username", "password"); client.Send (message); client.Disconnect (true); } } #endregion #region SendMessageWithOptions public static void SendMessageWithOptions (MimeMessage message) { using (var client = new SmtpClient ()) { client.Connect ("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); var options = FormatOptions.Default.Clone (); if (client.Capabilities.HasFlag (SmtpCapabilities.UTF8)) options.International = true; client.Send (options, message); client.Disconnect (true); } } #endregion #region SendMessages public static void SendMessages (IList messages) { using (var client = new SmtpClient ()) { client.Connect ("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); foreach (var message in messages) { client.Send (message); } client.Disconnect (true); } } #endregion #region VerifyAddress public static void VerifyAddress () { using (var client = new SmtpClient ()) { client.Connect ("smtp.mail-server.com", 465, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); try { var verified = client.Verify ("smith"); Console.WriteLine ($"'smith' was resolved the the following mailbox: {verified}"); } catch (SmtpCommandException ex) { Console.WriteLine ($"'smith' is not a valid address: {ex.Message}"); } client.Disconnect (true); } } #endregion #region ExpandAlias public static void ExpandAlias (string alias) { using (var client = new SmtpClient ()) { client.Connect ("smtp.mail-server.com", 465, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); var expanded = client.Expand (alias); Console.WriteLine ($"Expanding the alias '{alias}' results in the following list of addresses:"); foreach (var mailbox in expanded.Mailboxes) Console.WriteLine ($"* {mailbox}"); client.Disconnect (true); } } #endregion #region DeliveryStatusNotification public class DSNSmtpClient : SmtpClient { public DSNSmtpClient () { } /// /// Get the envelope identifier to be used with delivery status notifications. /// /// /// The envelope identifier, if non-empty, is useful in determining which message /// a delivery status notification was issued for. /// The envelope identifier should be unique and may be up to 100 characters in /// length, but must consist only of printable ASCII characters and no white space. /// For more information, see rfc3461, section 4.4. /// /// The envelope identifier. /// The message. protected override string GetEnvelopeId (MimeMessage message) { // Since you will want to be able to map whatever identifier you return here to the // message, the obvious identifier to use is probably the Message-Id value. return message.MessageId; } /// /// Get the types of delivery status notification desired for the specified recipient mailbox. /// /// /// Gets the types of delivery status notification desired for the specified recipient mailbox. /// /// The desired delivery status notification type. /// The message being sent. /// The mailbox. protected override DeliveryStatusNotification? GetDeliveryStatusNotifications (MimeMessage message, MailboxAddress mailbox) { // In this example, we only want to be notified of failures to deliver to a mailbox. // If you also want to be notified of delays or successful deliveries, simply bitwise-or // whatever combination of flags you want to be notified about. return DeliveryStatusNotification.Failure; } } #endregion #region SslConnectionInformation public static void PrintSslConnectionInfo (string host, int port) { using (var client = new SmtpClient ()) { client.Connect (host, port, SecureSocketOptions.Auto); Console.WriteLine ($"Negotiated the following SSL options with {host}:"); Console.WriteLine ($" Protocol Version: {client.SslProtocol}"); Console.WriteLine ($" Cipher Algorithm: {client.SslCipherAlgorithm}"); Console.WriteLine ($" Cipher Strength: {client.SslCipherStrength}"); Console.WriteLine ($" Hash Algorithm: {client.SslHashAlgorithm}"); Console.WriteLine ($" Hash Strength: {client.SslHashStrength}"); Console.WriteLine ($" Key-Exchange Algorithm: {client.SslKeyExchangeAlgorithm}"); Console.WriteLine ($" Key-Exchange Strength: {client.SslKeyExchangeStrength}"); // Example Log: // // Negotiated the following SSL options with smtp.gmail.com: // Protocol Version: Tls12 // Cipher Algorithm: Aes128 // Cipher Strength: 128 // Hash Algorithm: Sha256 // Hash Strength: 0 // Key-Exchange Algorithm: 44550 // Key-Exchange Strength: 255 client.Disconnect (true); } } #endregion } } ================================================ FILE: Documentation/Examples/SslCertificateValidation.cs ================================================ using System; using System.Net.Security; using System.Collections.Generic; using System.Security.Cryptography.X509Certificates; using MimeKit; using MailKit; using MailKit.Security; using MailKit.Net.Smtp; namespace MailKit.Examples { public static class SslCertificateValidationExample { public static void SendMessage (MimeMessage message) { using (var client = new SmtpClient ()) { // Set our custom SSL certificate validation callback. client.ServerCertificateValidationCallback = MySslCertificateValidationCallback; // Connect to smtp.gmail.com on the SSL-wrapped port. client.Connect ("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect); // Authenticate with our username and password. client.Authenticate ("username@gmail.com", "password"); // Send our message. client.Send (message); // Disconnect cleanly from the server. client.Disconnect (true); } } static bool MySslCertificateValidationCallback (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { // If there are no errors, then everything went smoothly. if (sslPolicyErrors == SslPolicyErrors.None) return true; // Note: MailKit will always pass the host name string as the `sender` argument. var host = (string) sender; if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) != 0) { // This means that the remote certificate is unavailable. Notify the user and return false. Console.WriteLine ("The SSL certificate was not available for {0}", host); return false; } if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) != 0) { // This means that the server's SSL certificate did not match the host name that we are trying to connect to. var certificate2 = certificate as X509Certificate2; var cn = certificate2 != null ? certificate2.GetNameInfo (X509NameType.SimpleName, false) : certificate.Subject; Console.WriteLine ("The Common Name for the SSL certificate did not match {0}. Instead, it was {1}.", host, cn); return false; } // The only other errors left are chain errors. Console.WriteLine ("The SSL certificate for the server could not be validated for the following reasons:"); // The first element's certificate will be the server's SSL certificate (and will match the `certificate` argument) // while the last element in the chain will typically either be the Root Certificate Authority's certificate -or- it // will be a non-authoritative self-signed certificate that the server admin created. foreach (var element in chain.ChainElements) { // Each element in the chain will have its own status list. If the status list is empty, it means that the // certificate itself did not contain any errors. if (element.ChainElementStatus.Length == 0) continue; Console.WriteLine ("\u2022 {0}", element.Certificate.Subject); foreach (var error in element.ChainElementStatus) { // `error.StatusInformation` contains a human-readable error string while `error.Status` is the corresponding enum value. Console.WriteLine ("\t\u2022 {0}", error.StatusInformation); } } return false; } } } ================================================ FILE: Documentation/Examples/VerifySignature.cs ================================================ if (entity is MultipartSigned) { var signed = (MultipartSigned) entity; foreach (var signature in signed.Verify ()) { try { bool valid = signature.Verify (); // If valid is true, then it signifies that the signed content has not been // modified since this particular signer signed the content. // // However, if it is false, then it indicates that the signed content has // been modified. } catch (DigitalSignatureVerifyException) { // There was an error verifying the signature. } } } ================================================ FILE: ExchangeOAuth2.md ================================================ # Using OAuth2 With Exchange (IMAP, POP3 or SMTP) ## Quick Index * [Registering Your Application with Microsoft](#registering-your-application-with-microsoft) * [Configuring the Correct API Permissions for Your Application](#configuring-the-correct-api-permissions-for-your-application) * Desktop and Mobile Applications * [Authenticating a Desktop or Mobile Application with OAuth2](#authenticating-a-desktop-or-mobile-application-with-oauth2) * Web Applications * [Authenticating a Web Application with OAuth2](#authenticating-a-web-application-with-oauth2) * Web Services * [Registering Service Principals for Your Web Service](#registering-service-principals-for-your-web-service) * [Granting Permissions for Your Web Service](#granting-permissions-for-your-web-service) * [Authenticating a Web Service with OAuth2](#authenticating-a-web-service-with-oauth2) * [Additional Resources](#additional-resources) ## Registering Your Application with Microsoft Whether you are writing a Desktop, Mobile or Web Service application, the first thing you'll need to do is register your application with Microsoft's Identity Platform. To do this, go to Microsoft's [Quickstart guide](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app) and follow the instructions. ## Configuring the Correct API Permissions for Your Application There are several different API permissions that you may want to configure depending on which protocols your application intends to use. Follow the instructions for [adding the POP, IMAP, and/or SMTP permissions to your Entra AD application](https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth#use-client-credentials-grant-flow-to-authenticate-smtp-imap-and-pop-connections). ## Desktop and Mobile Applications ### Authenticating a Desktop or Mobile Application with OAuth2 Now that you have the **Client ID** and **Tenant ID** strings, you'll need to plug those values into your application. The following sample code uses the [Microsoft.Identity.Client](https://www.nuget.org/packages/Microsoft.Identity.Client/) nuget package for obtaining the access token which will be needed by MailKit to pass on to the Exchange server. ```csharp static async Task GetPublicClientOAuth2CredentialsAsync (string protocol, string emailAddress, CancellationToken cancellationToken = default) { var options = new PublicClientApplicationOptions { ClientId = "Application (client) ID", TenantId = "Directory (tenant) ID", // Use "https://login.microsoftonline.com/common/oauth2/nativeclient" for apps using // embedded browsers or "http://localhost" for apps that use system browsers. RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient" }; var publicClientApplication = PublicClientApplicationBuilder .CreateWithApplicationOptions (options) .Build (); string[] scopes; if (protocol.Equals ("IMAP", StringComparison.OrdinalIgnoreCase)) { scopes = new string[] { "email", "offline_access", "https://outlook.office.com/IMAP.AccessAsUser.All" }; } else if (protocol.Equals ("POP", StringComparison.OrdinalIgnoreCase)) { scopes = new string[] { "email", "offline_access", "https://outlook.office.com/POP.AccessAsUser.All" }; } else { scopes = new string[] { "email", "offline_access", "https://outlook.office.com/SMTP.Send" }; } try { // First, check the cache for an auth token. return await publicClientApplication.AcquireTokenSilent (scopes, emailAddress).ExecuteAsync (cancellationToken); } catch (MsalUiRequiredException) { // If that fails, then try getting an auth token interactively. return await publicClientApplication.AcquireTokenInteractive (scopes).WithLoginHint (emailAddress).ExecuteAsync (cancellationToken); } } ``` #### IMAP (using PublicClientApplication) ```csharp var result = await GetPublicClientOAuth2CredentialsAsync ("IMAP", "username@outlook.com"); // Note: We always use result.Account.Username instead of `Username` because the user may have selected an alternative account. var oauth2 = new SaslMechanismOAuth2 (result.Account.Username, result.AccessToken); using (var client = new ImapClient ()) { await client.ConnectAsync ("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync (oauth2); await client.DisconnectAsync (true); } ``` #### SMTP (using PublicClientApplication) ```csharp var result = await GetPublicClientOAuth2CredentialsAsync ("SMTP", "username@outlook.com"); // Note: We always use result.Account.Username instead of `Username` because the user may have selected an alternative account. var oauth2 = new SaslMechanismOAuth2 (result.Account.Username, result.AccessToken); using (var client = new SmtpClient ()) { await client.ConnectAsync ("smtp.office365.com", 587, SecureSocketOptions.StartTls); await client.AuthenticateAsync (oauth2); await client.DisconnectAsync (true); } ``` Note: Once you've acquired an auth token using the interactive method above, you can avoid prompting the user if you cache the `result.Account` information and then silently reacquire auth tokens in the future using the following code: ```csharp var result = await publicClientApplication.AcquireTokenSilent(scopes, account).ExecuteAsync(cancellationToken); ``` Note: for information on caching tokens, see Microsoft's documentation about how to implement a [cross-platform token cache](https://github.com/AzureAD/microsoft-authentication-extensions-for-dotnet/wiki/Cross-platform-Token-Cache). ## Web Applications ### Authenticating a Web Application with OAuth2 Use this if you want to send/receive mail on behalf of a user. ```csharp // Common Code using Microsoft.Graph; using Microsoft.Identity.Client; using Microsoft.Kiota.Abstractions.Authentication; public static class OAuthMicrosoft { public static readonly string[] RegistrationScopes = new string[] { "offline_access", "User.Read", "Mail.Send", "https://outlook.office.com/SMTP.Send", "https://outlook.office.com/IMAP.AccessAsUser.All", }; public static readonly string[] SmtpScopes = new string[] { "email", "offline_access", "https://outlook.office.com/SMTP.Send" }; public static readonly string[] ImapScopes = new string[] { "email", "offline_access", "https://outlook.office.com/IMAP.AccessAsUser.All", }; public static IConfidentialClientApplication CreateConfidentialClient () { var clientId = "Application (client) ID"; var tenantId = "common"; // common = anybody with microsoft account personal or organization; other options see https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols#endpoints var clientSecret = "client secret"; var redirectURL = "https://example.com/oauth/microsoft/callback"; var confidentialClientApplication = ConfidentialClientApplicationBuilder.Create (clientId) .WithAuthority ($"https://login.microsoftonline.com/{tenantId}/v2.0") .WithClientSecret (clientSecret) .WithRedirectUri (redirectURL) .Build (); // You also need to configure an MSAL token cache. so that token are remembered. return confidentialClientApplication; } } ``` ```csharp // Registration page - redirect user to Microsoft to get authorization public async Task OnPostAsync () { var client = OAuthMicrosoft.CreateConfidentialClient (); // Note: When getting authorization, specify all of the scopes that your application will ever need (eg. SMTP /and/ IMAP). // Later, when requesting an access token, you will only ask for the specific scopes that you need (e.g. SMTP). var authurlbuilder = client.GetAuthorizationRequestUrl (OAuthMicrosoft.RegistrationScopes); var authurl = await authurlbuilder.ExecuteAsync (); return this.Redirect (authurl.ToString ()); } // Callback page = https://example.com/oauth/microsoft/callback in this example public async Task OnGet ([FromQuery] string code) { var confidentialClientApplication = OAuthMicrosoft.CreateConfidentialClient (); var scopes = OAuthMicrosoft.SmtpScopes; var auth = await confidentialClientApplication.AcquireTokenByAuthorizationCode (scopes, code).ExecuteAsync (); //this saves the token in msal cache var ident = auth.Account.HomeAccountId.Identifier; // Note: you will need to persist the ident to refer to later. } // Use the credentials public async Task SendEmailAsync (string ident) { var confidentialClientApplication = OAuthMicrosoft.CreateConfidentialClient (); var account = await confidentialClientApplication.GetAccountAsync (ident); var scopes = OAuthMicrosoft.SmtpScopes; try { var auth = await confidentialClientApplication.AcquireTokenSilent (scopes, account).ExecuteAsync (); using (var client = new SmtpClient ()) { await client.ConnectAsync ("smtp-mail.outlook.com", 587, SecureSocketOptions.StartTls); var oauth2 = new SaslMechanismOAuth2 (auth.Account.Username, auth.AccessToken); await client.AuthenticateAsync (oauth2); var serverfeedback = await client.SendAsync (message); await client.DisconnectAsync (true); } } catch (MsalUiRequiredException) { throw new Exception ("Need to get authorization again"); } } public async Task TestImapAsync (string ident) { var confidentialClientApplication = OAuthMicrosoft.CreateConfidentialClient (); var account = await confidentialClientApplication.GetAccountAsync (ident); var scopes = OAuthMicrosoft.ImapScopes; var auth = await confidentialClientApplication.AcquireTokenSilent (scopes, account).ExecuteAsync (); var oauth2 = new SaslMechanismOAuth2 (auth.Account.Username, auth.AccessToken); using (var client = new ImapClient ()) { await client.ConnectAsync ("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync (oauth2); await client.DisconnectAsync (true); } } ``` ## Web Services ### Registering Service Principals for Your Web Service Once your web service has been registered, the tenant admin will need to register your service principal. To use the New-ServicePrincipal cmdlet, open an [Azure Powershell](https://learn.microsoft.com/en-us/powershell/azure/new-azureps-module-az?view=azps-10.2.0) terminal and install ExchangeOnlineManagement and connect to your tenant as shown below: ```powershell Install-Module -Name ExchangeOnlineManagement -allowprerelease Import-module ExchangeOnlineManagement Connect-ExchangeOnline -Organization ``` Next, register the Service Principal for your web service: ```powershell New-ServicePrincipal -AppId -ObjectId [-Organization ] ``` Note: In the Azure portal, make sure you retrieve the Object ID from the Service Principal, under Enterprise Applications, and not the App Registration. ### Granting Permissions for Your Web Service In order to grant permissions for your web service to access an Office365 and/or Exchange account, you'll need to first get the Service Principal ID registered in the previous step using the following command: ```powershell Get-ServicePrincipal | fl ``` Once you have the Service Principal ID for your web service, use the following command to add full mailbox permissions for the email account that your web service will be accessing: ```powershelllo;.k,; Add-MailboxPermission -Identity "john.smith@example.com" -User -AccessRights FullAccess ``` ### Authenticating a Web Service with OAuth2 Now that you have the **Client ID** and **Tenant ID** strings, you'll need to plug those values into your application. The following sample code uses the [Microsoft.Identity.Client](https://www.nuget.org/packages/Microsoft.Identity.Client/) nuget package for obtaining the access token which will be needed by MailKit to pass on to the Exchange server. ```csharp static async Task GetConfidentialClientOAuth2CredentialsAsync (string protocol, CancellationToken cancellationToken = default) { var confidentialClientApplication = ConfidentialClientApplicationBuilder.Create (clientId) .WithAuthority ($"https://login.microsoftonline.com/{tenantId}/v2.0") .WithCertificate (certificate) // or .WithClientSecret (clientSecret) .Build (); string[] scopes; if (protocol.Equals ("SMTP", StringComparison.OrdinalIgnoreCase)) { scopes = new string[] { // For SMTP, use the following scope "https://outlook.office365.com/.default" }; } else { scopes = new string[] { // For IMAP and POP3, use the following scope "https://ps.outlook.com/.default" }; } return await confidentialClientApplication.AcquireTokenForClient (scopes).ExecuteAsync (cancellationToken); } ``` #### IMAP (using ConfidentialClientApplication) ```csharp var result = await GetConfidentialClientOAuth2CredentialsAsync ("IMAP"); var oauth2 = new SaslMechanismOAuth2 ("username@outlook.com", result.AccessToken); using (var client = new ImapClient ()) { await client.ConnectAsync ("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync (oauth2); await client.DisconnectAsync (true); } ``` #### SMTP (using ConfidentialClientApplication) ```csharp var result = await GetConfidentialClientOAuth2CredentialsAsync ("SMTP"); var oauth2 = new SaslMechanismOAuth2 ("username@outlook.com", result.AccessToken); using (var client = new SmtpClient ()) { await client.ConnectAsync ("smtp.office365.com", 587, SecureSocketOptions.StartTls); await client.AuthenticateAsync (oauth2); await client.DisconnectAsync (true); } ``` ## Additional Resources For more information, check out the [Microsoft.Identity.Client](https://docs.microsoft.com/en-us/dotnet/api/microsoft.identity.client?view=azure-dotnet) documentation. ================================================ FILE: FAQ.md ================================================ # Frequently Asked Questions ## Question Index ### General * [Are MimeKit and MailKit completely free? Can I use them in my proprietary product(s)?](#completely-free) * [Why do I get `NotSupportedException: No data is available for encoding ######. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.`?](#register-provider) * [Why does text show up garbled in my ASP.NET Core / .NET Core / .NET 5+ app?](#garbled-text) * [Why do I get a `TypeLoadException` when I try to create a new MimeMessage?](#type-load-exception) * [Why do I get `"MailKit.Security.SslHandshakeException: An error occurred while attempting to establish an SSL or TLS connection."` when I try to Connect?](#ssl-handshake-exception) * [How can I get a protocol log for IMAP, POP3, or SMTP to see what is going wrong?](#protocol-log) * [Why doesn't MailKit find some of my GMail POP3 or IMAP messages?](#gmail-hidden-messages) * [How can I access GMail using MailKit?](#gmail-access) * [How can I log in to a GMail account using OAuth 2.0?](#gmail-oauth2) ### Messages * [How can I create a message with attachments?](#create-attachments) * [How can I get the main body of a message?](#message-body) * [How can I tell if a message has attachments?](#has-attachments) * [Why doesn't the `MimeMessage` class implement `ISerializable` so that I can serialize a message to disk and read it back later?](#serialize-message) * [How can I parse messages?](#load-messages) * [How can I save messages?](#save-messages) * [How can I save attachments?](#save-attachments) * [How can I get the email addresses in the From, To, and Cc headers?](#address-headers) * [Why do attachments with Unicode filenames appear as "ATT0####.dat" in Outlook?](#untitled-attachments) * [How can I decrypt PGP messages that are embedded in the main message text?](#decrypt-inline-pgp) * [How can I reply to a message?](#reply-message) * [How can I forward a message?](#forward-message) ### ImapClient * [How can I get the number of unread messages in a folder?](#imap-unread-count) * [How can I search for messages delivered between two dates?](#imap-search-date-range) * [What does "The ImapClient is currently busy processing a command." mean?](#imap-client-busy) * [Why do I get InvalidOperationException: "The folder is not currently open."?](#imap-folder-not-open-exception) * [Why doesn't ImapFolder.MoveTo() move the message out of the source folder?](#imap-move-does-not-move) * [How can I mark messages as read using IMAP?](#imap-mark-as-read) * [How can I re-synchronize the cache for an IMAP folder?](#imap-folder-resync) * [How can I login using a shared mailbox in Office365?](#office365-shared-mailboxes) ### SmtpClient * [Why doesn't the message show up in the "Sent Mail" folder after sending it?](#smtp-sent-folder) * [How can I send email to the SpecifiedPickupDirectory?](#smtp-specified-pickup-directory) * [How can I request a notification when the message is read by the user?](#smtp-request-read-receipt) * [How can I process a read receipt notification?](#smtp-process-read-receipt) ## General ### Q: Are MimeKit and MailKit completely free? Can I use them in my proprietary product(s)? Yes. MimeKit and MailKit are both completely free and open source. They are both covered under the [MIT](https://opensource.org/licenses/MIT) license. ### Q: Why do I get `NotSupportedException: No data is available for encoding ######. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.`? In .NET Core, Microsoft decided to split out the non-Unicode text encodings into a separate NuGet package called [System.Text.Encoding.CodePages](https://www.nuget.org/packages/System.Text.Encoding.CodePages). MimeKit already pulls in a reference to this NuGet package, so you shouldn't need to add a reference to it in your project. That said, you will still need to register the encoding provider. It is recommended that you add the following line of code to your program initialization (e.g. the beginning of your program's Main() method): ```csharp System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance); ``` ### Q: Why does text show up garbled in my ASP.NET Core / .NET Core / .NET 5+ app? .NET Core (and ASP.NET Core by extension) and .NET 5 (and later) only provide the Unicode encodings, ASCII and ISO-8859-1 by default. Other text encodings are not available to your application unless your application [registers](https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.registerprovider?view=net-5.0) the encoding provider that provides all of the additional encodings. First, add a package reference for the [System.Text.Encoding.CodePages](https://www.nuget.org/packages/System.Text.Encoding.CodePages) nuget package to your project and then register the additional text encodings using the following code snippet: ```csharp System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance); ``` Note: The above code snippet should be safe to call in .NET Framework versions >= 4.6 as well. ### Q: Why do I get a `TypeLoadException` when I try to create a new MimeMessage? This only seems to happen in cases where the application is built for .NET Framework (v4.x) and seems to be most common for ASP.NET web applications that were built using Visual Studio 2019 (it is unclear whether this happens with Visual Studio 2022 as well). The issue is that some (older?) versions of MSBuild do not correctly generate `\*.dll.config`, `app.config` and/or `web.config` files with proper assembly version binding redirects. If this problem is happening to you, make sure to use MimeKit and MailKit >= v4.0 which include `MimeKit.dll.config` and `MailKit.dll.config`. The next step is to manually edit your application's `app.config` (or `web.config`) to add a binding redirect for `System.Runtime.CompilerServices.Unsafe`: ```xml ``` ### Q: Why do I get `"MailKit.Security.SslHandshakeException: An error occurred while attempting to establish an SSL or TLS connection."` when I try to Connect? When you get an exception with that error message, it usually means that you are encountering one of the following scenarios: #### 1. The mail server does not support SSL on the specified port. There are 2 different ways to use SSL/TLS encryption with mail servers. The first way is to enable SSL/TLS encryption immediately upon connecting to the SMTP, POP3 or IMAP server. This method requires an "SSL port" because the standard port defined for the protocol is meant for plain-text communication. The second way is via a `STARTTLS` command (aka `STLS` for POP3) that is *optionally* supported by the server. Below is a table of the protocols supported by MailKit and the standard plain-text ports (which either do not support any SSL/TLS encryption at all or only via the `STARTTLS` command extension) and the SSL ports which require SSL/TLS encryption immediately upon a successful connection to the remote host. |Protocol|Standard Port|SSL Port| |:------:|:-----------:|:------:| | SMTP | 25 or 587 | 465 | | POP3 | 110 | 995 | | IMAP | 143 | 993 | It is important to use the correct `SecureSocketOptions` for the port that you are connecting to. If you are connecting to one of the standard ports above, you will need to use `SecureSocketOptions.None`, `SecureSocketOptions.StartTls` or `SecureSocketOptions.StartTlsWhenAvailable`. If you are connecting to one of the SSL ports, you will need to use `SecureSocketOptions.SslOnConnect`. You could also try using `SecureSocketOptions.Auto` which works by choosing the appropriate option to use by comparing the specified port to the ports in the above table. #### 2. The mail server that you are connecting to is using an expired (or otherwise untrusted) SSL certificate. Often times, mail servers will use self-signed certificates instead of using a certificate that has been signed by a trusted Certificate Authority. Another potential pitfall is when locally installed anti-virus software replaces the certificate in order to scan web traffic for viruses. When your system is unable to validate the mail server's certificate because it is not signed by a known and trusted Certificate Authority, the above error will occur. If you are on a Linux system or are running a web service in a Linux container, it might be possible to use the following command to install the standard set of Certificate Authority root certificates using the following command: ```text apt update && apt install -y ca-certificates ``` Another option is to work around this problem by supplying a custom [RemoteCertificateValidationCallback](https://msdn.microsoft.com/en-us/library/ms145054) and setting it on the client's [ServerCertificateValidationCallback](https://mimekit.net/docs/html/P_MailKit_MailService_ServerCertificateValidationCallback.htm) property. In the simplest example, you could do something like this (although I would strongly recommend against it in production use): ```csharp using (var client = new SmtpClient ()) { client.ServerCertificateValidationCallback = (s,c,h,e) => true; client.Connect (hostName, port, SecureSocketOptions.Auto); // ... } ``` A better solution might be to compare the certificate's common name, issuer, serial number, and fingerprint to known values to make sure that the certificate can be trusted. Take the following code snippet as an example of how to do this: ```csharp bool MyServerCertificateValidationCallback (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) return true; // Note: The following code casts to an X509Certificate2 because it's easier to get the // values for comparison, but it's possible to get them from an X509Certificate as well. if (certificate is X509Certificate2 certificate2) { var cn = certificate2.GetNameInfo (X509NameType.SimpleName, false); var fingerprint = certificate2.Thumbprint; var serial = certificate2.SerialNumber; var issuer = certificate2.Issuer; return cn == "imap.gmail.com" && issuer == "CN=GTS CA 1O1, O=Google Trust Services, C=US" && serial == "00A15434C2695FB1880300000000CBF786" && fingerprint == "F351BCB631771F19AF41DFF22EB0A0839092DA51"; } return false; } ``` The downside of the above example is that it requires hard-coding known values for "trusted" mail server certificates which can quickly become unwieldy to deal with if your program is meant to be used with a wide range of mail servers. The best approach would be to prompt the user with a dialog explaining that the certificate is not trusted for the reasons enumerated by the [SslPolicyErrors](https://docs.microsoft.com/en-us/dotnet/api/system.net.security.sslpolicyerrors?view=netframework-4.8) argument as well as potentially the errors provided in the [X509Chain](https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.x509chain?view=netframework-4.8). If the user wishes to accept the risks of trusting the certificate, your program could then `return true`. For more details on writing a custom SSL certificate validation callback, it may be worth checking out the [SslCertificateValidation.cs](https://github.com/jstedfast/MailKit/blob/master/Documentation/Examples/SslCertificateValidation.cs) example. #### 3. A Certificate Authority CRL server for one or more of the certificates in the chain is temporarily unavailable. Most Certificate Authorities are probably pretty good at keeping their CRL and/or OCSP servers up 24/7, but occasionally they *do* go down or are otherwise unreachable due to other network problems between you and the server. When this happens, it becomes impossible to check the revocation status of one or more of the certificates in the chain. To ignore revocation checks, you can set the [CheckCertificateRevocation](https://www.mimekit.net/docs/html/P_MailKit_IMailService_CheckCertificateRevocation.htm) property of the IMAP, POP3 or SMTP client to `false` before you connect: ```csharp using (var client = new SmtpClient ()) { client.CheckCertificateRevocation = false; client.Connect (hostName, port, SecureSocketOptions.Auto); // ... } ``` #### 4. The server does not support the same set of SSL/TLS protocols that the client is configured to use. MailKit attempts to keep up with the latest security recommendations and so is continuously removing older SSL and TLS protocols that are no longer considered secure from the default configuration. This often means that MailKit's SMTP, POP3 and IMAP clients will fail to connect to servers that are still using older SSL and TLS protocols. Currently, the SSL and TLS protocols that are not supported by default are: SSL v2.0, SSL v3.0, TLS v1.0 and TLS v1.1. You can override MailKit's default set of supported [SSL and TLS protocols](https://docs.microsoft.com/en-us/dotnet/api/system.security.authentication.sslprotocols?view=netframework-4.8) by setting the value of the [SslProtocols](https://www.mimekit.net/docs/html/P_MailKit_MailService_SslProtocols.htm) property on your SMTP, POP3 or IMAP client. For example: ```csharp using (var client = new SmtpClient ()) { // Allow SSLv3.0 and all versions of TLS client.SslProtocols = SslProtocols.Ssl3 | SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13; client.Connect ("smtp.gmail.com", 465, true); // ... } ``` ### Q: How can I get a protocol log for IMAP, POP3, or SMTP to see what is going wrong? All of MailKit's client implementations have a constructor that takes a nifty [IProtocolLogger](https://www.mimekit.net/docs/html/T_MailKit_IProtocolLogger.htm) interface for logging client/server communications. Out of the box, you can use the handy [ProtocolLogger](https://www.mimekit.net/docs/html/T_MailKit_ProtocolLogger.htm) class. Here are some examples of how to use it: ```csharp // log to a file called 'imap.log' var client = new ImapClient (new ProtocolLogger ("imap.log")); ``` ```csharp // log to standard output (i.e. the console) var client = new ImapClient (new ProtocolLogger (Console.OpenStandardOutput ())); ``` **Note:** When submitting a protocol log as part of a bug report, make sure to scrub any sensitive information including your authentication credentials. This information will generally be the base64 encoded blob immediately following an `AUTHENTICATE` or `AUTH` command (depending on the type of server). The only exception to this case is if you are authenticating with `NTLM` in which case I *may* need this information, but *only if* the bug/error is in the authentication step. ### Q: Why doesn't MailKit find some of my GMail POP3 or IMAP messages? By default, GMail's POP3 and IMAP server does not behave like standard POP3 or IMAP servers and hides messages from clients using those protocols (as well as having other non-standard behavior). If you want to configure your GMail POP3 or IMAP settings to behave the way POP3 and IMAP are intended to behave according to their protocol specifications, you'll need to log in to your GMail account via your web browser and navigate to the `Forwarding and POP/IMAP` tab of your GMail Settings page and set your options to look like this: ![GMail POP3 and IMAP Settings](Documentation/media/gmail-imap-pop3-settings.png "GMail POP3 and IMAP Settings") #### POP download: **1. Status:** POP is enabled for all mail that has arrived since 12/31/69 - [X] Enable POP for **all mail** (even mail that's already been downloaded) - [ ] Enable POP for **mail that arrives from now on** - [ ] **Disable** POP **2. When messages are accessed with POP** \[keep GMail's copy in the Inbox] #### IMAP access: **When I mark a message in IMAP as deleted:** - [ ] Auto-Expunge on - Immediately update the server. (default) - [X] Auto-Expunge off - Wait for the client to update the server. **When a message is marked as deleted and expunged from the last visible IMAP folder:** - [ ] Archive the message (default) - [ ] Move the message to the Trash - [X] Immediately delete the message forever **Folder size limits** - [X] Do not limit the number of messages in an IMAP folder (default) - [ ] Limit IMAP folders to contain no more than this many messages \[1000] ### Q: How can I access GMail using MailKit? As of September 30th, 2024, authentication using only a username and password is [no longer supported by Google](https://support.google.com/accounts/answer/6010255?hl=en). There are now only 2 options to choose from: 1. Use [OAuth 2.0 authentication](#gmail-oauth2) 2. Use an "App password" To use an App password, you will first need to [turn on 2-Step Verification](https://support.google.com/accounts/answer/185839). Once 2-Step Verification is turned on, you can [generate an App password](https://myaccount.google.com/apppasswords). Then, assuming that your GMail account is `user@gmail.com`, you would use the following code snippet to connect to GMail via IMAP: ```csharp using (var client = new ImapClient ()) { client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("user@gmail.com", "app-specific-password"); // do stuff... client.Disconnect (true); } ``` Connecting via POP3 or SMTP is identical except for the host names and ports (and, of course, you'd use a `Pop3Client` or `SmtpClient` as appropriate). ### Q: How can I log in to a GMail account using OAuth 2.0? The first thing you need to do is follow [Google's instructions](https://developers.google.com/accounts/docs/OAuth2) for obtaining OAuth 2.0 credentials for your application. (Or, as an alternative set of step-by-step instructions, you can follow the directions that I have written in [GMailOAuth2.md](https://github.com/jstedfast/MailKit/blob/master/GMailOAuth2.md).) Once you've done that, the easiest way to obtain an access token is to use Google's [Google.Apis.Auth](https://www.nuget.org/packages/Google.Apis.Auth/) library: ```csharp const string GMailAccount = "username@gmail.com"; var clientSecrets = new ClientSecrets { ClientId = "XXX.apps.googleusercontent.com", ClientSecret = "XXX" }; var codeFlow = new GoogleAuthorizationCodeFlow (new GoogleAuthorizationCodeFlow.Initializer { // Cache tokens in ~/.local/share/google-filedatastore/CredentialCacheFolder on Linux/Mac DataStore = new FileDataStore ("CredentialCacheFolder", false), Scopes = new [] { "https://mail.google.com/" }, ClientSecrets = clientSecrets, LoginHint = GMailAccount }); // Note: For a web app, you'll want to use AuthorizationCodeWebApp instead. var codeReceiver = new LocalServerCodeReceiver (); var authCode = new AuthorizationCodeInstalledApp (codeFlow, codeReceiver); var credential = await authCode.AuthorizeAsync (GMailAccount, CancellationToken.None); if (credential.Token.IsStale) await credential.RefreshTokenAsync (CancellationToken.None); var oauth2 = new SaslMechanismOAuthBearer (credential.UserId, credential.Token.AccessToken); using (var client = new ImapClient ()) { await client.ConnectAsync ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync (oauth2); await client.DisconnectAsync (true); } ``` ## Messages ### Q: How can I create a message with attachments? To construct a message with attachments, the first thing you'll need to do is create a `multipart/mixed` container which you'll then want to add the message body to first. Once you've added the body, you can then add MIME parts to it that contain the content of the files you'd like to attach, being sure to set the `Content-Disposition` header value to attachment. You'll probably also want to set the `filename` parameter on the `Content-Disposition` header as well as the `name` parameter on the `Content-Type` header. The most convenient way to do this is to use the [MimePart.FileName](https://www.mimekit.net/docs/html/P_MimeKit_MimePart_FileName.htm) property which will set both parameters for you as well as setting the `Content-Disposition` header value to `attachment` if it has not already been set to something else. ```csharp var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); message.Subject = "How you doin?"; // create our message text, just like before (except don't set it as the message.Body) var body = new TextPart ("plain") { Text = @"Hey Alice, What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it. Will you be my +1? -- Joey " }; // create an image attachment for the file located at path var attachment = new MimePart ("image", "gif") { Content = new MimeContent (File.OpenRead (path), ContentEncoding.Default), ContentDisposition = new ContentDisposition (ContentDisposition.Attachment), ContentTransferEncoding = ContentEncoding.Base64, FileName = Path.GetFileName (path) }; // now create the multipart/mixed container to hold the message text and the // image attachment var multipart = new Multipart ("mixed"); multipart.Add (body); multipart.Add (attachment); // now set the multipart/mixed as the message body message.Body = multipart; ``` A simpler way to construct messages with attachments is to take advantage of the [BodyBuilder](https://www.mimekit.net/docs/html/T_MimeKit_BodyBuilder.htm) class. ```csharp var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); message.Subject = "How you doin?"; var builder = new BodyBuilder (); // Set the plain-text version of the message text builder.TextBody = @"Hey Alice, What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it. Will you be my +1? -- Joey "; // We may also want to attach a calendar event for Monica's party... builder.Attachments.Add (@"C:\Users\Joey\Documents\party.ics"); // Now we just need to set the message body and we're done message.Body = builder.ToMessageBody (); ``` For more information, see [Creating Messages](https://www.mimekit.net/docs/html/Creating-Messages.htm). ### Q: How can I get the main body of a message? (Note: for the TL;DR version, skip to [the end](#message-body-tldr)) MIME is a tree structure of parts. There are multiparts which contain other parts (even other multiparts). There are message parts which contain messages. And finally, there are leaf-node parts which contain content. There are a few common message structures: 1. The message contains only a `text/plain` or `text/html` part (easy, just use that). 2. The message contains a `multipart/alternative` which will typically look a bit like this: ``` multipart/alternative text/plain text/html ``` 3. Same as above, but the html part is inside a `multipart/related` so that it can embed images: ``` multipart/alternative text/plain multipart/related text/html image/jpeg image/png ``` 4. The message contains a textual body part as well as some attachments: ``` multipart/mixed text/plain or text/html application/octet-stream application/zip ``` 5. the same as above, but with the first part replaced with either #2 or #3. To illustrate: ``` multipart/mixed multipart/alternative text/plain text/html application/octet-stream application/zip ``` or... ``` multipart/mixed multipart/alternative text/plain multipart/related text/html image/jpeg image/png application/octet-stream application/zip ``` Now, if you don't care about any of that and just want to get the text of the first `text/plain` or `text/html` part you can find, that's easy. [MimeMessage](https://www.mimekit.net/docs/html/T_MimeKit_MimeMessage.htm) has two convenience properties for this: [TextBody](https://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_TextBody.htm) and [HtmlBody](https://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_HtmlBody.htm). `MimeMessage.HtmlBody`, as the name implies, will traverse the MIME structure for you and find the most appropriate body part with a `Content-Type` of `text/html` that can be interpreted as the message body. Likewise, the `TextBody` property can be used to get the `text/plain` version of the message body. For more information, see [Working with Messages](https://www.mimekit.net/docs/html/Working-With-Messages.htm). ### Q: How can I tell if a message has attachments? In most cases, a message with a body that has a MIME-type of `multipart/mixed` containing more than a single part probably has attachments. As illustrated above, the first part of a `multipart/mixed` is typically the textual body of the message, but it is not always quite that simple. In general, MIME attachments will have a `Content-Disposition` header with a value of `attachment`. To get the list of body parts matching this criteria, you can use the [MimeMessage.Attachments](https://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_Attachments.htm) property. Unfortunately, not all mail clients follow this convention and so you may need to write your own custom logic. For example, you may wish to treat all body parts having a `name` or `filename` parameter set on them: ```csharp var attachments = message.BodyParts.OfType ().Where (part => !string.IsNullOrEmpty (part.FileName)); ``` A more sophisticated approach is to treat body parts not referenced by the main textual body part of the message as attachments. In other words, treat any body part not used for rendering the message as an attachment. For an example on how to do this, consider the following code snippets: ```csharp /// /// Visits a MimeMessage and generates HTML suitable to be rendered by a browser control. /// class HtmlPreviewVisitor : MimeVisitor { List stack = new List (); List attachments = new List (); readonly string tempDir; string body; /// /// Creates a new HtmlPreviewVisitor. /// /// A temporary directory used for storing image files. public HtmlPreviewVisitor (string tempDirectory) { tempDir = tempDirectory; } /// /// The list of attachments that were in the MimeMessage. /// public IList Attachments { get { return attachments; } } /// /// The HTML string that can be set on the BrowserControl. /// public string HtmlBody { get { return body ?? string.Empty; } } protected override void VisitMultipartAlternative (MultipartAlternative alternative) { // walk the multipart/alternative children backwards from greatest level of faithfulness to the least faithful for (int i = alternative.Count - 1; i >= 0 && body == null; i--) alternative[i].Accept (this); } protected override void VisitMultipartRelated (MultipartRelated related) { var root = related.Root; // push this multipart/related onto our stack stack.Add (related); // visit the root document root.Accept (this); // pop this multipart/related off our stack stack.RemoveAt (stack.Count - 1); } // look up the image based on the img src url within our multipart/related stack bool TryGetImage (string url, out MimePart image) { UriKind kind; int index; Uri uri; if (Uri.IsWellFormedUriString (url, UriKind.Absolute)) kind = UriKind.Absolute; else if (Uri.IsWellFormedUriString (url, UriKind.Relative)) kind = UriKind.Relative; else kind = UriKind.RelativeOrAbsolute; try { uri = new Uri (url, kind); } catch { image = null; return false; } for (int i = stack.Count - 1; i >= 0; i--) { if ((index = stack[i].IndexOf (uri)) == -1) continue; image = stack[i][index] as MimePart; return image != null; } image = null; return false; } /// /// Get a file:// URI for the image attachment. /// /// /// Saves the image attachment to a temp file and returns a file:// URI for the /// temp file. /// /// The file:// URI. /// The image attachment. /// The original HTML image URL. string GetFileUri (MimePart image, string url) { string fileName = url.Replace (':', '_').Replace ('\\', '_').Replace ('/', '_'); string path = Path.Combine (tempDir, fileName); if (!File.Exists (path)) { using (var output = File.Create (path)) image.Content.DecodeTo (output); } return "file://" + path.Replace ('\\', '/'); } /// /// Get a data: URI for the image attachment. /// /// /// Encodes the image attachment into a string suitable for setting as a src= attribute value in /// an img tag. /// /// The data: URI. /// The image attachment. string GetDataUri (MimePart image) { using (var memory = new MemoryStream ()) { image.Content.DecodeTo (memory); var buffer = memory.GetBuffer (); var length = (int) memory.Length; var base64 = Convert.ToBase64String (buffer, 0, length); return string.Format ("data:{0};base64,{1}", image.ContentType.MimeType, base64); } } // Replaces urls that refer to images embedded within the message with // "file://" urls that the browser control will actually be able to load. void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) { if (ctx.TagId == HtmlTagId.Meta && !ctx.IsEndTag) { bool isContentType = false; ctx.WriteTag (htmlWriter, false); // replace charsets with "utf-8" since our output will be in utf-8 (and not whatever the original charset was) foreach (var attribute in ctx.Attributes) { if (attribute.Id == HtmlAttributeId.Charset) { htmlWriter.WriteAttributeName (attribute.Name); htmlWriter.WriteAttributeValue ("utf-8"); } else if (isContentType && attribute.Id == HtmlAttributeId.Content) { htmlWriter.WriteAttributeName (attribute.Name); htmlWriter.WriteAttributeValue ("text/html; charset=utf-8"); } else { if (attribute.Id == HtmlAttributeId.HttpEquiv && attribute.Value != null && attribute.Value.Equals ("Content-Type", StringComparison.OrdinalIgnoreCase)) isContentType = true; htmlWriter.WriteAttribute (attribute); } } } else if (ctx.TagId == HtmlTagId.Image && !ctx.IsEndTag && stack.Count > 0) { ctx.WriteTag (htmlWriter, false); // replace the src attribute with a file:// URL foreach (var attribute in ctx.Attributes) { if (attribute.Id == HtmlAttributeId.Src) { if (!TryGetImage (attribute.Value, out var image)) { htmlWriter.WriteAttribute (attribute); continue; } // Note: you can either use a "file://" URI or you can use a // "data:" URI, the choice is yours. var uri = GetFileUri (image, attribute.Value); //var uri = GetDataUri (image); htmlWriter.WriteAttributeName (attribute.Name); htmlWriter.WriteAttributeValue (uri); } else { htmlWriter.WriteAttribute (attribute); } } } else if (ctx.TagId == HtmlTagId.Body && !ctx.IsEndTag) { ctx.WriteTag (htmlWriter, false); // add and/or replace oncontextmenu="return false;" foreach (var attribute in ctx.Attributes) { if (attribute.Name.Equals ("oncontextmenu", StringComparison.OrdinalIgnoreCase)) continue; htmlWriter.WriteAttribute (attribute); } htmlWriter.WriteAttribute ("oncontextmenu", "return false;"); } else { // pass the tag through to the output ctx.WriteTag (htmlWriter, true); } } protected override void VisitTextPart (TextPart entity) { TextConverter converter; if (body != null) { // since we've already found the body, treat this as an attachment attachments.Add (entity); return; } if (entity.IsHtml) { converter = new HtmlToHtml { HtmlTagCallback = HtmlTagCallback }; } else if (entity.IsFlowed) { var flowed = new FlowedToHtml (); string delsp; if (entity.ContentType.Parameters.TryGetValue ("delsp", out delsp)) flowed.DeleteSpace = delsp.Equals ("yes", StringComparison.OrdinalIgnoreCase); converter = flowed; } else { converter = new TextToHtml (); } body = converter.Convert (entity.Text); } protected override void VisitTnefPart (TnefPart entity) { // extract any attachments in the MS-TNEF part attachments.AddRange (entity.ExtractAttachments ()); } protected override void VisitMessagePart (MessagePart entity) { // treat message/rfc822 parts as attachments attachments.Add (entity); } protected override void VisitMimePart (MimePart entity) { // realistically, if we've gotten this far, then we can treat this as an attachment // even if the IsAttachment property is false. attachments.Add (entity); } } ``` And the way you'd use this visitor might look something like this: ```csharp void Render (MimeMessage message) { var tmpDir = Path.Combine (Path.GetTempPath (), message.MessageId); var visitor = new HtmlPreviewVisitor (tmpDir); Directory.CreateDirectory (tmpDir); message.Accept (visitor); DisplayHtml (visitor.HtmlBody); DisplayAttachments (visitor.Attachments); } ``` Once you've rendered the message using the above technique, you'll have a list of attachments that were not used, even if they did not match the simplistic criteria used by the `MimeMessage.Attachments` property. ### Q: Why doesn't the `MimeMessage` class implement `ISerializable` so that I can serialize a message to disk and read it back later? The MimeKit API was designed to use the existing MIME format for serialization. In light of this, the ability to use the .NET serialization API and format did not make much sense to support. You can easily serialize a [MimeMessage](https://www.mimekit.net/docs/html/T_MimeKit_MimeMessage.htm) to a stream using the [WriteTo](https://www.mimekit.net/docs/html/Overload_MimeKit_MimeMessage_WriteTo.htm) methods. For more information on this topic, see the following other two topics: * [How can I parse messages?](#load-messages) * [How can I save messages?](#save-messages) ### Q: How can I parse messages? One of the more common operations that MimeKit is meant for is parsing email messages from arbitrary streams. There are two ways of accomplishing this task. The first way is to use one of the [Load](https://www.mimekit.net/docs/html/Overload_MimeKit_MimeMessage_Load.htm) methods on `MimeMessage`: ```csharp // Load a MimeMessage from a stream var message = MimeMessage.Load (stream); ``` Or you can load a message from a file path: ```csharp // Load a MimeMessage from a file path var message = MimeMessage.Load ("message.eml"); ``` The second way is to use the [MimeParser](https://www.mimekit.net/docs/html/T_MimeKit_MimeParser.htm) class. For the most part, using the `MimeParser` directly is not necessary unless you wish to parse a Unix mbox file stream. However, this is how you would do it: ```csharp // Load a MimeMessage from a stream var parser = new MimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); ``` For Unix mbox file streams, you would use the parser like this: ```csharp // Load every message from a Unix mbox var parser = new MimeParser (stream, MimeFormat.Mbox); while (!parser.IsEndOfStream) { var message = parser.ParseMessage (); // do something with the message } ``` ### Q: How can I save messages? One you've got a [MimeMessage](https://www.mimekit.net/docs/html/T_MimeKit_MimeMessage.htm), you can save it to a file using the [WriteTo](https://mimekit.net/docs/html/Overload_MimeKit_MimeMessage_WriteTo.htm) method: ```csharp message.WriteTo ("message.eml"); ``` The `WriteTo` method also has overloads that allow you to write the message to a `Stream` instead. By default, the `WriteTo` method will save the message using DOS line-endings on Windows and Unix line-endings on Unix-based systems such as macOS and Linux. You can override this behavior by passing a [FormatOptions](https://mimekit.net/docs/html/T_MimeKit_FormatOptions.htm) argument to the method: ```csharp // clone the default formatting options var format = FormatOptions.Default.Clone (); // override the line-endings to be DOS no matter what platform we are on format.NewLineFormat = NewLineFormat.Dos; message.WriteTo (format, "message.eml"); ``` Note: While it may seem like you can safely use the `ToString` method to serialize a message, ***DON'T DO IT!*** This is ***not*** safe! MIME messages cannot be accurately represented as strings due to the fact that each MIME part of the message *may* be encoded in a different character set, thus making it impossible to convert the message into a unicode string using a single charset to do the conversion (which is *exactly* what `ToString` does). ### Q: How can I save attachments? If you've already got a [MimePart](https://www.mimekit.net/docs/html/T_MimeKit_MimePart.htm) that represents the attachment that you'd like to save, here's how you might save it: ```csharp using (var stream = File.Create (fileName)) attachment.Content.DecodeTo (stream); ``` Pretty simple, right? But what if your attachment is actually a [MessagePart](https://www.mimekit.net/docs/html/T_MimeKit_MessagePart.htm)? To save the content of a `message/rfc822` part, you'd use the following code snippet: ```csharp using (var stream = File.Create (fileName)) attachment.Message.WriteTo (stream); ``` If you are iterating over all of the attachments in a message, you might do something like this: ```csharp foreach (var attachment in message.Attachments) { var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name; using (var stream = File.Create (fileName)) { if (attachment is MessagePart) { var rfc822 = (MessagePart) attachment; rfc822.Message.WriteTo (stream); } else { var part = (MimePart) attachment; part.Content.DecodeTo (stream); } } } ``` ### Q: How can I get the email addresses in the From, To, and Cc headers? The [From](https://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_From.htm), [To](https://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_To.htm), and [Cc](https://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_Cc.htm) properties of a [MimeMessage](https://www.mimekit.net/docs/html/T_MimeKit_MimeMessage.htm) are all of type [InternetAddressList](https://www.mimekit.net/docs/html/T_MimeKit_InternetAddressList.htm). An `InternetAddressList` is a list of [InternetAddress](https://www.mimekit.net/docs/html/T_MimeKit_InternetAddress.htm) items. This is where most people start to get lost because an `InternetAddress` is an abstract class that only really has a [Name](https://www.mimekit.net/docs/html/P_MimeKit_InternetAddress_Name.htm) property. As you've probably already discovered, the `Name` property contains the name of the person (if available), but what you want is his or her email address, not their name. To get the email address, you'll need to figure out what subclass of address each `InternetAddress` really is. There are 2 subclasses of `InternetAddress`: [GroupAddress](https://www.mimekit.net/docs/html/T_MimeKit_GroupAddress.htm) and [MailboxAddress](https://www.mimekit.net/docs/html/T_MimeKit_MailboxAddress.htm). A `GroupAddress` is a named group of more `InternetAddress` items that are contained within the [Members](https://www.mimekit.net/docs/html/P_MimeKit_GroupAddress_Members.htm) property. To get an idea of what a group address represents, consider the following examples: ``` To: My Friends: Joey , Monica , "Mrs. Chanandler Bong" , Ross , Rachel ; ``` In the above example, the `To` header's `InternetAddressList` will contain only 1 item which will be a `GroupAddress` with a `Name` value of `My Friends`. The `Members` property of the `GroupAddress` will contain 5 more `InternetAddress` items (which will all be instances of `MailboxAddress`). The above example, however, is not very likely to ever be seen in messages you deal with. A far more common example would be the one below: ``` To: undisclosed-recipients:; ``` Most of the time, the `From`, `To`, and `Cc` headers will only contain mailbox addresses. As you will notice, a `MailboxAddress` has an [Address](https://www.mimekit.net/docs/html/P_MimeKit_MailboxAddress_Address.htm) property which will contain the email address of the mailbox. In the following example, the `Address` property will contain the value `john@smith.com`: ``` To: John Smith ``` If you only care about getting a flattened list of the mailbox addresses in a `From`, `To`, or `Cc` header, you can do something like this: ```csharp foreach (var mailbox in message.To.Mailboxes) Console.WriteLine ("{0}'s email address is {1}", mailbox.Name, mailbox.Address); ``` ### Q: Why do attachments with Unicode filenames appear as "ATT0####.dat" in Outlook? An attachment filename is stored as a MIME parameter on the `Content-Disposition` header. Unfortunately, the original MIME specifications did not specify a method for encoding non-ASCII filenames. In 1997, [rfc2184](https://tools.ietf.org/html/rfc2184) (later updated by [rfc2231](https://tools.ietf.org/html/rfc2231)) was published which specified an encoding mechanism to use for encoding them. Since there was a window in time where the MIME specifications did not define a way to encode them, some mail client developers decided to use the mechanism described by [rfc2047](https://tools.ietf.org/html/rfc2047) which was meant for encoding non-ASCII text in headers. While this may at first seem logical, the problem with this approach was that rfc2047 `encoded-word` tokens are not allowed to be in quotes (as well as some other issues) and so another, more appropriate, encoding mechanism was needed. Outlook is one of those mail clients which decided to encode filenames using the mechanism described in rfc2047 and until Outlook 2007, did not support filenames encoded using the mechanism defined in rfc2231. As of MimeKit v1.2.18, it is possible to configure MimeKit to use the rfc2047 encoding mechanism for filenames (and other `Content-Disposition` and `Content-Type` parameter values) by setting the encoding method on each individual [Parameter](https://www.mimekit.net/docs/html/T_MimeKit_Parameter.htm): ```csharp Parameter param; if (attachment.ContentDisposition.Parameters.TryGetValue ("filename", out param)) param.EncodingMethod = ParameterEncodingMethod.Rfc2047; ``` Or: ```csharp foreach (var param in attachment.ContentDisposition.Parameters) { param.EncodingMethod = ParameterEncodingMethod.Rfc2047; } ``` ### Q: How can I decrypt PGP messages that are embedded in the main message text? Some PGP-enabled mail clients, such as Thunderbird, embed encrypted PGP blurbs within the `text/plain` body of the message rather than using the PGP/MIME format that MimeKit prefers. These messages often look something like this: ```text Return-Path: Received: from [127.0.0.1] (hostname.example.com. [201.95.8.17]) by mx.google.com with ESMTPSA id l67sm26628445yha.8.2014.04.27.13.49.44 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 27 Apr 2014 13:49:44 -0700 (PDT) Message-ID: <535D6D67.8020803@example.com> Date: Sun, 27 Apr 2014 17:49:43 -0300 From: Die-Hard PGP Fan User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: undisclosed-recipients:; Subject: Test of inline encrypted PGP blocks X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Antivirus: avast! (VPS 140427-1, 27/04/2014), Outbound message X-Antivirus-Status: Clean -----BEGIN PGP MESSAGE----- Charset: ISO-8859-1 Version: GnuPG v2.0.22 (MingW32) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ SGFoISBJIGZvb2xlZCB5b3UsIHRoaXMgdGV4dCBpc24ndCBhY3R1YWxseSBlbmNy eXB0ZWQgd2l0aCBQR1AsCml0J3MgYWN0dWFsbHkgb25seSBiYXNlNjQgZW5jb2Rl ZCEKCkknbSBqdXN0IHVzaW5nIHRoaXMgYXMgYW4gZXhhbXBsZSwgdGhvdWdoLCBz byBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIuCgpGb3IgdGhlIHNha2Ugb2YgYXJn dW1lbnQsIHdlJ2xsIHByZXRlbmQgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGFuIGVu Y3J5cHRlZApibHVyYi4gTW1ta2F5PyBUaGFua3MuCg== -----END PGP MESSAGE----- ``` To deal with these kinds of messages, I've added a method to OpenPgpContext called `GetDecryptedStream` which can be used to get the raw decrypted stream. There are actually 2 variants of this method: ```csharp public Stream GetDecryptedStream (Stream encryptedData, out DigitalSignatureCollection signatures) ``` and ```csharp public Stream GetDecryptedStream (Stream encryptedData) ``` The first variant is useful in cases where the encrypted PGP blurb is also digitally signed, allowing you to get your hands on the list of digital signatures in order for you to verify each of them. To decrypt the content of the message, you'll want to locate the `TextPart` (in this case, it'll just be `message.Body`) and then do this: ```csharp static Stream DecryptEmbeddedPgp (TextPart text) { using (var memory = new MemoryStream ()) { text.Content.DecodeTo (memory); memory.Position = 0; using (var ctx = new MyGnuPGContext ()) { return ctx.GetDecryptedStream (memory); } } } ``` What you do with that decrypted stream is up to you. It's up to you to figure out what the decrypted content is (is it text? a jpeg image? a video?) and how to display it to the user. ### Q: How can I reply to a message? Replying to a message is fairly simple. For the most part, you'd just create the reply message the same way you'd create any other message. There are only a few slight differences: 1. In the reply message, you'll want to prefix the `Subject` header with `"Re: "` if the prefix doesn't already exist in the message you are replying to (in other words, if you are replying to a message with a `Subject` of `"Re: party tomorrow night!"`, you would not prefix it with another `"Re: "`). 2. You will want to set the reply message's `In-Reply-To` header to the value of the `Message-Id` header in the original message. 3. You will want to copy the original message's `References` header into the reply message's `References` header and then append the original message's `Message-Id` header. 4. You will probably want to "quote" the original message's text in the reply. 5. If you are generating an automatic reply, you should also follow [RFC3834](https://www.rfc-editor.org/rfc/rfc3834) and set the `Auto-Submitted` value to `auto-replied`. If this logic were to be expressed in code, it might look something like this: ```csharp public static MimeMessage Reply (MimeMessage message, MailboxAddress from, bool replyToAll) { var reply = new MimeMessage (); reply.From.Add (from); // reply to the sender of the message if (message.ReplyTo.Count > 0) { reply.To.AddRange (message.ReplyTo); } else if (message.From.Count > 0) { reply.To.AddRange (message.From); } else if (message.Sender != null) { reply.To.Add (message.Sender); } if (replyToAll) { // include all of the other original recipients - TODO: remove ourselves from these lists reply.To.AddRange (message.To); reply.Cc.AddRange (message.Cc); } // set the reply subject if (!message.Subject?.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase)) reply.Subject = "Re: " + (message.Subject ?? string.Empty); else reply.Subject = message.Subject; // construct the In-Reply-To and References headers if (!string.IsNullOrEmpty (message.MessageId)) { reply.InReplyTo = message.MessageId; foreach (var id in message.References) reply.References.Add (id); reply.References.Add (message.MessageId); } // if this is an automatic reply, be sure to specify this using the Auto-Submitted header in order to avoid (infinite) mail loops reply.Headers.Add (HeaderId.AutoSubmitted, "auto-replied"); // quote the original message text using (var quoted = new StringWriter ()) { var sender = message.Sender ?? message.From.Mailboxes.FirstOrDefault (); quoted.WriteLine ("On {0}, {1} wrote:", message.Date.ToString ("f"), !string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address); using (var reader = new StringReader (message.TextBody)) { string line; while ((line = reader.ReadLine ()) != null) { quoted.Write ("> "); quoted.WriteLine (line); } } reply.Body = new TextPart ("plain") { Text = quoted.ToString () }; } return reply; } ``` But what if you wanted to reply to a message and quote the HTML formatting of the original message body (assuming it has an HTML body) while still including the embedded images? This gets a bit more complicated, but it's still doable... The first thing we'd need to do is implement our own [MimeVisitor](https://www.mimekit.net/docs/html/T_MimeKit_MimeVisitor.htm) to handle this: ```csharp public class ReplyVisitor : MimeVisitor { readonly Stack stack = new Stack (); MimeMessage original, reply; MailboxAddress from; bool replyToAll; int isRelated; /// /// Creates a new ReplyVisitor. /// public ReplyVisitor (MailboxAddress from, bool replyToAll) { this.replyToAll = replyToAll; this.from = from; } /// /// Gets the reply. /// /// The reply. public MimeMessage Reply { get { return reply; } } void Push (MimeEntity entity) { var multipart = entity as Multipart; if (reply.Body == null) { reply.Body = entity; } else { var parent = stack.Peek (); parent.Add (entity); } if (multipart != null) stack.Push (multipart); } void Pop () { stack.Pop (); } static string GetOnDateSenderWrote (MimeMessage message) { var sender = message.Sender != null ? message.Sender : message.From.Mailboxes.FirstOrDefault (); var name = sender != null ? (!string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address) : "an unknown sender"; return string.Format ("On {0}, {1} wrote:", message.Date.ToString ("f"), name); } /// /// Visit the specified message. /// /// The message. public override void Visit (MimeMessage message) { reply = new MimeMessage (); original = message; stack.Clear (); reply.From.Add (from.Clone ()); // reply to the sender of the message if (message.ReplyTo.Count > 0) { reply.To.AddRange (message.ReplyTo); } else if (message.From.Count > 0) { reply.To.AddRange (message.From); } else if (message.Sender != null) { reply.To.Add (message.Sender); } if (replyToAll) { // include all of the other original recipients - TODO: remove ourselves from these lists reply.To.AddRange (message.To); reply.Cc.AddRange (message.Cc); } // set the reply subject if (!message.Subject?.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase)) reply.Subject = "Re: " + (message.Subject ?? string.Empty); else reply.Subject = message.Subject; // construct the In-Reply-To and References headers if (!string.IsNullOrEmpty (message.MessageId)) { reply.InReplyTo = message.MessageId; foreach (var id in message.References) reply.References.Add (id); reply.References.Add (message.MessageId); } base.Visit (message); } /// /// Visit the specified entity. /// /// The MIME entity. /// /// Only Visit(MimeMessage) is supported. /// public override void Visit (MimeEntity entity) { throw new NotSupportedException (); } protected override void VisitMultipartAlternative (MultipartAlternative alternative) { var multipart = new MultipartAlternative (); Push (multipart); for (int i = 0; i < alternative.Count; i++) alternative[i].Accept (this); Pop (); } protected override void VisitMultipartRelated (MultipartRelated related) { var multipart = new MultipartRelated (); var root = related.Root; Push (multipart); root.Accept (this); isRelated++; for (int i = 0; i < related.Count; i++) { if (related[i] != root) related[i].Accept (this); } isRelated--; Pop (); } protected override void VisitMultipart (Multipart multipart) { foreach (var part in multipart) { if (part is MultipartAlternative) part.Accept (this); else if (part is MultipartRelated) part.Accept (this); else if (part is TextPart) part.Accept (this); } } void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) { if (ctx.TagId == HtmlTagId.Body && !ctx.IsEmptyElementTag) { if (ctx.IsEndTag) { // end our opening
htmlWriter.WriteEndTag (HtmlTagId.BlockQuote); // pass the tag through to the output ctx.WriteTag (htmlWriter, true); } else { // pass the tag through to the output ctx.WriteTag (htmlWriter, true); // prepend the HTML reply with "On {DATE}, {SENDER} wrote:" htmlWriter.WriteStartTag (HtmlTagId.P); htmlWriter.WriteText (GetOnDateSenderWrote (original)); htmlWriter.WriteEndTag (HtmlTagId.P); // Wrap the original content in a
htmlWriter.WriteStartTag (HtmlTagId.BlockQuote); htmlWriter.WriteAttribute (HtmlAttributeId.Style, "border-left: 1px #ccc solid; margin: 0 0 0 .8ex; padding-left: 1ex;"); ctx.InvokeCallbackForEndTag = true; } } else { // pass the tag through to the output ctx.WriteTag (htmlWriter, true); } } string QuoteText (string text) { using (var quoted = new StringWriter ()) { quoted.WriteLine (GetOnDateSenderWrote (original)); using (var reader = new StringReader (text)) { string line; while ((line = reader.ReadLine ()) != null) { quoted.Write ("> "); quoted.WriteLine (line); } } return quoted.ToString (); } } protected override void VisitTextPart (TextPart entity) { string text; if (entity.IsHtml) { var converter = new HtmlToHtml { HtmlTagCallback = HtmlTagCallback }; text = converter.Convert (entity.Text); } else if (entity.IsFlowed) { var converter = new FlowedToText (); text = converter.Convert (entity.Text); text = QuoteText (text); } else { // quote the original message text text = QuoteText (entity.Text); } var part = new TextPart (entity.ContentType.MediaSubtype.ToLowerInvariant ()) { Text = text }; Push (part); } protected override void VisitMessagePart (MessagePart entity) { // don't descend into message/rfc822 parts } protected override void VisitMimePart (MimePart entity) { if (isRelated > 0 || !entity.IsAttachment) { var parent = stack.Peek (); parent.Add (entity); } } } ``` ```csharp public static MimeMessage Reply (MimeMessage message, MailboxAddress from, bool replyToAll) { var visitor = new ReplyVisitor (from, replyToAll); visitor.Visit (message); return visitor.Reply; } ``` ### Q: How can I forward a message? There are 2 common ways of forwarding a message: attaching the original message as an attachment and inlining the message body much like replying typically does. Which method you choose is up to you. To forward a message by attaching it as an attachment, you would do something like this: ```csharp public static MimeMessage Forward (MimeMessage original, MailboxAddress from, IEnumerable to) { var message = new MimeMessage (); message.From.Add (from); message.To.AddRange (to); // set the forwarded subject if (!original.Subject?.StartsWith ("FW:", StringComparison.OrdinalIgnoreCase)) message.Subject = "FW: " + (original.Subject ?? string.Empty); else message.Subject = original.Subject; // create the main textual body of the message var text = new TextPart ("plain") { Text = "Here's the forwarded message:" }; // create the message/rfc822 attachment for the original message var rfc822 = new MessagePart { Message = original }; // create a multipart/mixed container for the text body and the forwarded message var multipart = new Multipart ("mixed"); multipart.Add (text); multipart.Add (rfc822); // set the multipart as the body of the message message.Body = multipart; return message; } ``` To forward a message by inlining the original message's text content, you can do something like this: ```csharp public static MimeMessage Forward (MimeMessage original, MailboxAddress from, IEnumerable to) { var message = new MimeMessage (); message.From.Add (from); message.To.AddRange (to); // set the forwarded subject if (!original.Subject?.StartsWith ("FW:", StringComparison.OrdinalIgnoreCase)) message.Subject = "FW: " + (original.Subject ?? string.Empty); else message.Subject = original.Subject; // quote the original message text using (var text = new StringWriter ()) { text.WriteLine (); text.WriteLine ("-------- Original Message --------"); text.WriteLine ("Subject: {0}", original.Subject ?? string.Empty); text.WriteLine ("Date: {0}", DateUtils.FormatDate (original.Date)); text.WriteLine ("From: {0}", original.From); text.WriteLine ("To: {0}", original.To); text.WriteLine (); text.Write (original.TextBody); message.Body = new TextPart ("plain") { Text = text.ToString () }; } return message; } ``` Keep in mind that not all messages will have a `TextBody` available, so you'll have to find a way to handle those cases. ## ImapClient ### Q: How can I get the number of unread messages in a folder? If the folder is open (via [Open](https://www.mimekit.net/docs/html/Overload_MailKit_Net_Imap_ImapFolder_Open.htm)), then the [ImapFolder.Unread](https://www.mimekit.net/docs/html/P_MailKit_MailFolder_Unread.htm) property will be kept up to date (at least as-of the latest command issued to the server). If the folder *isn't* open, then you will need to query the unread state of the folder using the [Status](https://www.mimekit.net/docs/html/M_MailKit_Net_Imap_ImapFolder_Status.htm) method with the appropriate [StatusItems](https://www.mimekit.net/docs/html/T_MailKit_StatusItems.htm) flag(s). For example, to get the total *and* unread counts, you can do this: ```csharp folder.Status (StatusItems.Count | StatusItems.Unread); int total = folder.Count; int unread = folder.Unread; ``` ### Q: How can I search for messages delivered between two dates? The obvious solution is: ```csharp var query = SearchQuery.DeliveredAfter (dateRange.BeginDate) .And (SearchQuery.DeliveredBefore (dateRange.EndDate)); var results = folder.Search (query); ``` However, it has been reported to me that this doesn't work reliably depending on the IMAP server implementation. If you find that this query doesn't get the expected results for your IMAP server, here's another solution that should always work: ```csharp var query = SearchQuery.Not (SearchQuery.DeliveredBefore (dateRange.BeginDate) .Or (SearchQuery.DeliveredAfter (dateRange.EndDate))); var results = folder.Search (query); ``` ### Q: What does "The ImapClient is currently busy processing a command." mean? If you get an InvalidOperationException with the message, "The ImapClient is currently busy processing a command.", it means that you are trying to use the [ImapClient](https://www.mimekit.net/docs/html/T_MailKit_Net_Imap_ImapClient.htm) and/or one of its [ImapFolder](https://www.mimekit.net/docs/html/T_MailKit_Net_Imap_ImapFolder.htm)s from multiple threads. To avoid this situation, you'll need to lock the `SyncRoot` property of the `ImapClient` and `ImapFolder` objects when performing operations on them. For example: ```csharp lock (client.SyncRoot) { client.NoOp (); } ``` Note: Locking the `SyncRoot` is only necessary when using the synchronous API's. All `Async()` method variants already do this locking for you. ### Q: Why do I get InvalidOperationException: "The folder is not currently open."? If you get this exception, it's probably because you thought you had to open the destination folder that you passed as an argument to one of the [CopyTo](https://www.mimekit.net/docs/html/Overload_MailKit_MailFolder_CopyTo.htm) or [MoveTo](https://www.mimekit.net/docs/html/Overload_MailKit_MailFolder_MoveTo.htm) methods. When you opened that destination folder, you also inadvertently closed the source folder which is why you are getting this exception. The IMAP server can only have a single folder open at a time. Whenever you open a folder, you automatically close the previously opened folder. When copying or moving messages from one folder to another, you only need to have the source folder open. ### Q: Why doesn't ImapFolder.MoveTo() move the message out of the source folder? If you look at the source code for the `ImapFolder.MoveTo()` method, what you'll notice is that there are several code paths depending on the features that the IMAP server supports. If the IMAP server supports the `MOVE` extension, then MailKit's `MoveTo()` method will use the `MOVE` command. I suspect that your server does not support the `MOVE` command or you probably wouldn't be seeing what you are seeing. When the IMAP server does not support the `MOVE` command, MailKit has to use the `COPY` command to copy the message(s) to the destination folder. Once the `COPY` command has completed, it will then mark the messages that you asked it to move for deletion by setting the `\Deleted` flag on those messages. If the server supports the `UIDPLUS` extension, then MailKit will attempt to `EXPUNGE` the subset of messages that it just marked for deletion, however, if the `UIDPLUS` extension is not supported by the IMAP server, then it cannot safely expunge just that subset of messages and so it stops there. My guess is that your server supports neither `MOVE` nor `UIDPLUS` and that is why clients like Outlook continue to see the messages in your folder. I believe, however, that Outlook has a setting to show deleted messages with a strikeout (which you probably have disabled). So to answer your question more succinctly: After calling `folder.MoveTo (...);`, if you are confident that the messages marked for deletion should be expunged, call `folder.Expunge ();` ### Q: How can I mark messages as read for IMAP? The way to mark messages as read using the IMAP protocol is to set the `\Seen` flag on the message(s). To do this using MailKit, you will first need to know either the index(es) or the UID(s) of the messages that you would like to set the `\Seen` flag on. Once you have that information, you will want to call one of the [AddFlags](https://www.mimekit.net/docs/html/Overload_MailKit_MailFolder_AddFlags.htm) methods on the `ImapFolder`. For example: ```csharp folder.AddFlags (uids, MessageFlags.Seen, true); ``` To mark messages as unread, you would *remove* the `\Seen` flag, like so: ```csharp folder.RemoveFlags (uids, MessageFlags.Seen, true); ``` ### Q: How can I re-synchronize the cache for an IMAP folder? Assuming your IMAP server does not support the `QRESYNC` extension (which simplifies this procedure a ton), here is some simple code to illustrate how to go about re-synchronizing your cache with the remote IMAP server. ```csharp /// /// Just a simple class to represent the cached information about a message. /// class CachedMessageInfo { public UniqueId UniqueId; public MessageFlags Flags; public HashSet Keywords; public Envelope Envelope; public BodyPart Body; } /// /// Resynchronize the cache with the remote IMAP folder. /// /// The IMAP folder. /// The local cache of message metadata. /// The cached UIDVALIDITY value of the IMAP folder from a previous session. static void ResyncFolder (ImapFolder folder, List cache, ref uint cachedUidValidity) { IList summaries; // Step 1: Open the folder. // Note: we only need read-only access to update our cache, but depending on // what you plan to do with the folder after resynchronizing, you may want // top open the folder in read-write mode instead. folder.Open (FolderAccess.ReadOnly); if (cache.Count > 0) { if (folder.UidValidity == cachedUidValidity) { // Step 2: Remove messages from our cache that no longer exist on the server. // get the full list of UIDs on the server... var all = folder.Search (SearchQuery.All); // remove any messages from our cache that no longer exist... for (int i = 0; i < cache.Count; i++) { if (!all.Contains (cache[i].UniqueId)) { cache.RemoveAt (i); i--; } } // Step 3: Sync any flag changes for our cached messages. // get a list of known uids... astute observers will note that an easy // optimization to make here would be to merge this loop with the above // loop. var known = new UniqueIdSet (SortOrder.Ascending); for (int i = 0; i < cache.Count; i++) known.Add (cache[i].UniqueId); // fetch the flags for our known messages... summaries = folder.Fetch (known, MessageSummaryItems.Flags); for (int i = 0; i < summaries.Count; i++) { // Note: the indexes should match up with our cache, but it wouldn't // hurt to add error checking to make sure. I'm not bothering to here // for simplicity reasons. cache[i].Flags = summaries[i].Flags.Value; cache[i].Keywords = summaries[i].Keywords; } } else { // The UIDVALIDITY of the folder has changed. This means that our entire // cache is obsolete. We need to clear our cache and start from scratch. cachedUidValidity = folder.UidValidity; cache.Clear (); } } else { // We have nothing cached, so just start from scratch. cachedUidValidity = folder.UidValidity; } // Step 4: Fetch the messages we don't already know about and add them to our cache. summaries = folder.Fetch (cache.Count, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure); for (int i = 0; i < summaries.Count; i++) { cache.Add (new CachedMessageInfo { UniqueId = summaries[i].UniqueId, Flags = summaries[i].Flags.Value, Keywords = summaries[i].Keywords, Envelope = summaries[i].Envelope, Body = summaries[i].Body }); } // Tada! Now we are resynchronized with the server! } ``` ### Q: How can I login using a shared mailbox in Office365? ```csharp var result = await GetPublicClientOAuth2CredentialsAsync ("IMAP", "sharedMailboxName@custom-domain.com"); // Note: We always use result.Account.Username instead of `Username` because the user may have selected an alternative account. var oauth2 = new SaslMechanismOAuth2 (result.Account.Username, result.AccessToken); using (var client = new ImapClient ()) { await client.ConnectAsync ("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync (oauth2); // ... await client.DisconnectAsync (true); } ``` Notes: 1. The `GetPublicClientOAuth2CredentialsAsync()` method used in this example code snippet can be found in the [ExchangeOAuth2.md](ExchangeOAuth2.md#desktop-and-mobile-applications) documentation. 2. Some users have reported that they need to use `"username@custom-domain.com\\sharedMailboxName"` as their username instead of `"sharedMailboxName@custom-domain.com"`. ## SmtpClient ### Q: Why doesn't the message show up in the "Sent Mail" folder after sending it? It seems to be a common misunderstanding that messages sent via SMTP will magically show up in the account's "Sent Mail" folder. In order for the message to show up in the "Sent Mail" folder, you will need to append the message to the "Sent Mail" folder yourself because the SMTP protocol does not support doing this automatically. If the "Sent Mail" folder is a local mbox folder, you'll need to append it like this: ```csharp using (var mbox = File.Open ("C:\\path\\to\\Sent Mail.mbox", FileMode.Append, FileAccess.Write)) { var marker = string.Format ("From MAILER-DAEMON {0}{1}", DateTime.Now.ToString (CultureInfo.InvariantCulture, "ddd MMM d HH:mm:ss yyyy"), Environment.NewLine); var bytes = Encoding.ASCII.GetBytes (marker); // Write the mbox marker bytes. mbox.Write (bytes, 0, bytes.Length); // Write the message, making sure to escape any line that looks like an mbox From-marker. using (var filtered = new FilteredStream (stream)) { filtered.Add (new MboxFromMarker ()); message.WriteTo (filtered); filtered.Flush (); } mbox.Flush (); } ``` If the "Sent Mail" folder exists on an IMAP server, you would need to do something more like this: ```csharp using (var client = new ImapClient ()) { client.Connect ("imap.server.com", 993, SecureSocketOptions.SslOnConnect); client.Authenticate ("username", "password"); IMailFolder sentMail; if (client.Capabilities.HasFlag (ImapCapabilities.SpecialUse)) { sentMail = client.GetFolder (SpecialFolder.Sent); } else { var personal = client.GetFolder (client.PersonalNamespaces[0]); // Note: This assumes that the "Sent Mail" folder lives at the root of the folder hierarchy // and is named "Sent Mail" as opposed to "Sent" or "Sent Items" or any other variation. sentMail = personal.GetSubfolder ("Sent Mail"); } sentMail.Append (message, MessageFlags.Seen); client.Disconnect (true); } ``` ### Q: How can I send email to a SpecifiedPickupDirectory? Based on Microsoft's [referencesource](https://github.com/Microsoft/referencesource/blob/master/System/net/System/Net/mail/SmtpClient.cs#L401), when `SmtpDeliveryMethod.SpecifiedPickupDirectory` is used, the `SmtpClient` saves the message to the specified pickup directory location using a randomly generated filename based on `Guid.NewGuid ().ToString () + ".eml"`, so to achieve the same results with MailKit, you could do something like this: ```csharp public static void SaveToPickupDirectory (MimeMessage message, string pickupDirectory) { do { // Generate a random file name to save the message to. var path = Path.Combine (pickupDirectory, Guid.NewGuid ().ToString () + ".eml"); Stream stream; try { // Attempt to create the new file. stream = File.Open (path, FileMode.CreateNew); } catch (IOException) { // If the file already exists, try again with a new Guid. if (File.Exists (path)) continue; // Otherwise, fail immediately since it probably means that there is // no graceful way to recover from this error. throw; } try { using (stream) { // IIS pickup directories expect the message to be "byte-stuffed" // which means that lines beginning with "." need to be escaped // by adding an extra "." to the beginning of the line. // // Use an SmtpDataFilter "byte-stuff" the message as it is written // to the file stream. This is the same process that an SmtpClient // would use when sending the message in a `DATA` command. using (var filtered = new FilteredStream (stream)) { filtered.Add (new SmtpDataFilter ()); // Make sure to write the message in DOS () format. var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; message.WriteTo (options, filtered); filtered.Flush (); return; } } } catch { // An exception here probably means that the disk is full. // // Delete the file that was created above so that incomplete files are not // left behind for IIS to send accidentally. File.Delete (path); throw; } } while (true); } ``` ### Q: How can I request a notification when the message is read by the user? The first thing I need to make clear is that requesting a notification does not guarantee that you'll actually get one. In order for you to receive a notification that the message was read by its recipient, the recipient's mail client needs to know how to send such a notification *and* that the user has enabled it to do so. That said, here's how you can request a notification when the recipient reads the message that has been sent: ```csharp // Add the following header to tell the recipient's client that you want to receive a // notification when the message has been read by the user. message.Headers[HeaderId.DispositionNotificationTo] = new MailboxAddress ("My Name", "me@example.com").ToString (true); ``` For more information on this topic, read [rfc3798](https://tools.ietf.org/html/rfc3798). ### Q: How can I process a read receipt notification? A read receipt notification comes in the form of a MIME message with a top-level MIME part with a MIME-type of `multipart/report` that has a `report-type` parameter with a value of `disposition-notification`. You could check for this in code like this: ```csharp var report = message.Body as MultipartReport; if (report != null && report.ReportType.Equals ("disposition-notification", StringComparison.OrdinalIgnoreCase)) { // This is a read receipt notification. } ``` The first part of the `multipart/report` will be a human-readable explanation of the notification. The second part will have a MIME-type of `message/disposition-notification` and be represented by a [MessageDispositionNotification](https://www.mimekit.net/docs/html/T_MimeKit_MessageDispositionNotification.htm). This notification part will contain a list of header-like fields containing information about the message that this notification is for such as the `Original-Message-Id`, `Original-Recipient`, etc. ```csharp var notification = report[1] as MessageDispositionNotification; if (notification != null) { // Get the Message-Id of the message this notification is for... var messageId = notification.Fields["Original-Message-Id"]; } ``` For more information on this topic, read [rfc3798](https://tools.ietf.org/html/rfc3798). ================================================ FILE: GMailOAuth2.md ================================================ # Using OAuth2 With GMail (IMAP, POP3 or SMTP) ## Quick Index * [Setting up OAuth2 for use with Google Mail](#setting-up-oauth2-for-use-with-google-mail) * [Register Your Application with Google](#register-your-application-with-google) * [Obtaining an OAuth2 Client ID and Secret](#obtaining-an-oauth2-client-id-and-secret) * [Authenticating a Desktop App with the OAuth2 Client ID and Secret](#authenticating-a-desktop-app-with-the-oauth2-client-id-and-secret) * [Authenticating an ASP.NET Web App with the OAuth2 Client ID and Secret](#authenticating-an-aspnet-web-app-with-the-oauth2-client-id-and-secret) ## Setting up OAuth2 for use with Google Mail ### Register Your Application with Google Go to [Google's Developer Console](https://cloud.google.com/console). Click the **Select A Project** button in the **Navigation Bar** at the top of the screen. ![Click "Select A Project"](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/click-select-a-project.png) Click the **New Project** button. ![Click "New Project"](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/click-new-project.png) Fill in the name **Project Name**, and if appropriate, select the **Organization** that your program should be associated with. Then click *Create*. ![Create New Project](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/create-new-project.png) ### Obtaining an OAuth2 Client ID and Secret Click the **☰** symbol, move down to **APIs & Services** and then select **OAuth consent screen**. ![Click "OAuth consent screen"](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/click-oauth-consent-screen-menu.png) Select the **External** radio item and then click **Create**. ![Select "External"](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/select-external.png) Fill in the **Application name** and any other fields that are appropriate for your application and then click **Create**. ![OAuth consent screen](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/oauth-consent-screen.png) Click **+ Create Credentials** and then select **OAuth client ID**. ![Click "Create Credentials"](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/click-create-credentials.png) Select the **Other** radio item in the **Application type** section and then type in a name to use for the OAuth client ID. Once completed, click **Create**. ![Select "Other"](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/select-application-type-other.png) At this point, you will be presented with a web dialog that will allow you to copy the **Client ID** and **Client Secret** strings into your clipboard to paste them into your program. ![Client ID and Secret](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/google-developer-console/client-id-and-secret.png) ## Authenticating a Desktop App with the OAuth2 Client ID and Secret Now that you have the **Client ID** and **Client Secret** strings, you'll need to plug those values into your application. The following sample code uses the [Google.Apis.Auth](https://www.nuget.org/packages/Google.Apis.Auth/) nuget package for obtaining the access token which will be needed by MailKit to pass on to the GMail server. ```csharp const string GMailAccount = "username@gmail.com"; var clientSecrets = new ClientSecrets { ClientId = "XXX.apps.googleusercontent.com", ClientSecret = "XXX" }; var codeFlow = new GoogleAuthorizationCodeFlow (new GoogleAuthorizationCodeFlow.Initializer { // Cache tokens in ~/.local/share/google-filedatastore/CredentialCacheFolder on Linux/Mac DataStore = new FileDataStore ("CredentialCacheFolder", false), Scopes = new [] { "https://mail.google.com/" }, ClientSecrets = clientSecrets, LoginHint = GMailAccount }); // Note: For a web app, you'll want to use AuthorizationCodeWebApp instead. var codeReceiver = new LocalServerCodeReceiver (); var authCode = new AuthorizationCodeInstalledApp (codeFlow, codeReceiver); var credential = await authCode.AuthorizeAsync (GMailAccount, CancellationToken.None); if (credential.Token.IsStale) await credential.RefreshTokenAsync (CancellationToken.None); var oauth2 = new SaslMechanismOAuthBearer (credential.UserId, credential.Token.AccessToken); using (var client = new ImapClient ()) { await client.ConnectAsync ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync (oauth2); await client.DisconnectAsync (true); } ``` ## Authenticating an ASP.NET Web App with the OAuth2 Client ID and Secret Now that you have the **Client ID** and **Client Secret** strings, you'll need to plug those values into your application. The following sample code uses the [Google.Apis.Auth](https://www.nuget.org/packages/Google.Apis.Auth/) nuget package for obtaining the access token which will be needed by MailKit to pass on to the GMail server. Add Google Authentication processor to your **Program.cs**. ```csharp builder.Services.AddAuthentication (options => { // This forces challenge results to be handled by Google OpenID Handler, so there's no // need to add an AccountController that emits challenges for Login. options.DefaultChallengeScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme; // This forces forbid results to be handled by Google OpenID Handler, which checks if // extra scopes are required and does automatic incremental auth. options.DefaultForbidScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme; // Default scheme that will handle everything else. // Once a user is authenticated, the OAuth2 token info is stored in cookies. options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie (options => { options.ExpireTimeSpan = TimeSpan.FromMinutes (5); }) .AddGoogleOpenIdConnect (options => { var secrets = GoogleClientSecrets.FromFile ("client_secret.json").Secrets; options.ClientId = secrets.ClientId; options.ClientSecret = secrets.ClientSecret; }); ``` Ensure that you are using Authorization and HttpsRedirection in your **Program.cs**: ```csharp app.UseHttpsRedirection (); app.UseStaticFiles (); app.UseRouting (); app.UseAuthentication (); app.UseAuthorization (); ``` Now, using the **GoogleScopedAuthorizeAttribute**, you can request scopes saved in a library as constants and request tokens for these scopes. ```csharp [GoogleScopedAuthorize(DriveService.ScopeConstants.DriveReadonly)] public async Task AuthenticateAsync ([FromServices] IGoogleAuthProvider auth) { GoogleCredential? googleCred = await auth.GetCredentialAsync (); string token = await googleCred.UnderlyingCredential.GetAccessTokenForRequestAsync (); var oauth2 = new SaslMechanismOAuthBearer ("UserEmail", token); using var emailClient = new ImapClient (); await emailClient.ConnectAsync ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect); await emailClient.AuthenticateAsync (oauth2); await emailClient.DisconnectAsync (true); } ``` All of that and more has been described in Google's [OAuth 2.0](https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web-applications-aspnet-mvc) documentation. However, be careful since [Asp.Net MVC](https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web-applications-asp.net-mvc) does not work for Asp.Net Core. ================================================ FILE: LICENSE ================================================ MIT License Copyright (C) 2013-2026 .NET Foundation and Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: MailKit/AccessControl.cs ================================================ // // AccessControl.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit { /// /// An Access Control. /// /// /// An Access Control is a set of permissions available for a particular identity, /// controlling whether or not that identity has the ability to perform various tasks. /// /// /// /// public class AccessControl { /// /// Initializes a new instance of the class. /// /// /// Creates a new with the given name and /// access rights. /// /// The identifier name. /// The access rights. /// /// is . /// -or- /// is . /// public AccessControl (string name, IEnumerable rights) { if (name == null) throw new ArgumentNullException (nameof (name)); Rights = new AccessRights (rights); Name = name; } /// /// Initializes a new instance of the class. /// /// /// Creates a new with the given name and /// access rights. /// /// The identifier name. /// The access rights. /// /// is . /// -or- /// is . /// public AccessControl (string name, string rights) { if (name == null) throw new ArgumentNullException (nameof (name)); Rights = new AccessRights (rights); Name = name; } /// /// Initializes a new instance of the class. /// /// /// Creates a new with the given name and no /// access rights. /// /// The identifier name. /// /// is . /// public AccessControl (string name) { if (name == null) throw new ArgumentNullException (nameof (name)); Rights = new AccessRights (); Name = name; } /// /// The identifier name for the access control. /// /// /// The identifier name for the access control. /// /// /// /// /// The identifier name. public string Name { get; private set; } /// /// Get the access rights. /// /// /// Gets the access rights. /// /// /// /// /// The access rights. public AccessRights Rights { get; private set; } } } ================================================ FILE: MailKit/AccessControlList.cs ================================================ // // AccessControlList.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections.Generic; namespace MailKit { /// /// An Access Control List (ACL) /// /// /// An Access Control List (ACL) is a list of access controls defining the permissions /// various identities have available. /// /// /// /// public class AccessControlList : List { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The list of access controls. /// /// is . /// public AccessControlList (IEnumerable controls) : base (controls) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public AccessControlList () { } } } ================================================ FILE: MailKit/AccessRight.cs ================================================ // // AccessRight.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// An individual Access Right to be used with ACLs. /// /// /// An individual Access Right meant to be used with /// . /// For more information on what rights are available, /// see https://tools.ietf.org/html/rfc4314#section-2.1 /// /// public readonly struct AccessRight : IEquatable { /// /// The access right for folder lookups. /// /// /// Allows the to be visible when listing folders. /// public static readonly AccessRight LookupFolder = new AccessRight ('l'); /// /// The access right for opening a folder and getting the status. /// /// /// Provides access for opening and getting the status of the folder. /// public static readonly AccessRight OpenFolder = new AccessRight ('r'); /// /// The access right for adding or removing the Seen flag on messages in the folder. /// /// /// Provides access to add or remove the flag on messages within the /// . /// public static readonly AccessRight SetMessageSeen = new AccessRight ('s'); /// /// The access right for adding or removing flags (other than Seen and Deleted) /// on messages in a folder. /// /// /// Provides access to add or remove the on messages /// (other than and /// ) within the folder. /// public static readonly AccessRight SetMessageFlags = new AccessRight ('w'); /// /// The access right allowing messages to be appended or copied into the folder. /// /// /// Provides access to append or copy messages into the folder. /// public static readonly AccessRight AppendMessages = new AccessRight ('i'); /// /// The access right allowing subfolders to be created. /// /// /// Provides access to create subfolders. /// public static readonly AccessRight CreateFolder = new AccessRight ('k'); /// /// The access right for deleting a folder and/or its subfolders. /// /// /// Provides access to delete the folder and/or any subfolders. /// public static readonly AccessRight DeleteFolder = new AccessRight ('x'); /// /// The access right for adding or removing the Deleted flag to messages within a folder. /// /// /// Provides access to add or remove the flag from /// messages within the folder. It also provides access for setting the /// flag when appending a message to a folder. /// public static readonly AccessRight SetMessageDeleted = new AccessRight ('t'); /// /// The access right for expunging deleted messages in a folder. /// /// /// Provides access to expunge deleted messages in a folder. /// public static readonly AccessRight ExpungeFolder = new AccessRight ('e'); /// /// The access right for administering the ACLs of a folder. /// /// /// Provides administrative access to change the ACLs for the folder. /// public static readonly AccessRight Administer = new AccessRight ('a'); /// /// The character representing the particular access right. /// /// /// Represents the character value of the access right. /// public readonly char Right; /// /// Initializes a new instance of the struct. /// /// /// Creates a new struct. /// /// The access right. public AccessRight (char right) { Right = right; } #region IEquatable implementation /// /// Determines whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// /// The to compare with the current . /// if the specified is equal to the current /// ; otherwise, . public bool Equals (AccessRight other) { return other.Right == Right; } #endregion /// /// Determines whether two access rights are equal. /// /// /// Determines whether two access rights are equal. /// /// if and are equal; otherwise, . /// The first access right to compare. /// The second access right to compare. public static bool operator == (AccessRight right1, AccessRight right2) { return right1.Right == right2.Right; } /// /// Determines whether two access rights are not equal. /// /// /// Determines whether two access rights are not equal. /// /// if and are not equal; otherwise, . /// The first access right to compare. /// The second access right to compare. public static bool operator != (AccessRight right1, AccessRight right2) { return right1.Right != right2.Right; } /// /// Determines whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// /// The to compare with the current . /// if the specified is equal to the current ; /// otherwise, . public override bool Equals (object? obj) { return obj is AccessRight right && right.Right == Right; } /// /// Serves as a hash function for a object. /// /// /// Serves as a hash function for a object. /// /// A hash code for this instance that is suitable for use in hashing algorithms and data structures such as a hash table. public override int GetHashCode () { return Right.GetHashCode (); } /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { return Right.ToString (); } } } ================================================ FILE: MailKit/AccessRights.cs ================================================ // // AccessRights.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; namespace MailKit { /// /// A set of access rights. /// /// /// The set of access rights for a particular identity. /// public class AccessRights : ICollection { readonly List list = new List (); /// /// Initializes a new instance of the class. /// /// /// Creates a new set of access rights. /// /// The access rights. /// /// is . /// public AccessRights (IEnumerable rights) { AddRange (rights); } /// /// Initializes a new instance of the class. /// /// /// Creates a new set of access rights. /// /// The access rights. /// /// is . /// public AccessRights (string rights) { AddRange (rights); } /// /// Initializes a new instance of the class. /// /// /// Creates an empty set of access rights. /// public AccessRights () { } /// /// Get the number of access rights in the collection. /// /// /// Gets the number of access rights in the collection. /// /// The count. public int Count { get { return list.Count; } } /// /// Get whether or not this set of access rights is read only. /// /// /// Gets whether or not this set of access rights is read only. /// /// if this collection is read only; otherwise, . public bool IsReadOnly { get { return false; } } /// /// Add the specified access right. /// /// /// Adds the specified access right if it is not already included. /// /// The access right. void ICollection.Add (AccessRight right) { Add (right); } /// /// Add the specified access right. /// /// /// Adds the specified access right if it is not already included. /// /// if the right was added; otherwise, . /// The access right. public bool Add (AccessRight right) { if (list.Contains (right)) return false; list.Add (right); return true; } /// /// Add the specified right. /// /// /// Adds the right specified by the given character. /// /// if the right was added; otherwise, . /// The right. public bool Add (char right) { return Add (new AccessRight (right)); } /// /// Add the rights specified by the characters in the given string. /// /// /// Adds the rights specified by the characters in the given string. /// /// The rights. /// /// is . /// public void AddRange (string rights) { if (rights == null) throw new ArgumentNullException (nameof (rights)); for (int i = 0; i < rights.Length; i++) Add (new AccessRight (rights[i])); } /// /// Add the range of specified rights. /// /// /// Adds the range of specified rights. /// /// The rights. /// /// is . /// public void AddRange (IEnumerable rights) { if (rights == null) throw new ArgumentNullException (nameof (rights)); foreach (var right in rights) Add (right); } /// /// Clears the access rights. /// /// /// Removes all of the access rights. /// public void Clear () { list.Clear (); } /// /// Checks if the set of access rights contains the specified right. /// /// /// Determines whether or not the set of access rights already contains the specified right /// /// if the specified right exists; otherwise, . /// The access right. public bool Contains (AccessRight right) { return list.Contains (right); } /// /// Copies all of the access rights to the specified array. /// /// /// Copies all of the access rights into the array, /// starting at the specified array index. /// /// The array. /// The array index. /// /// is . /// /// /// is out of range. /// public void CopyTo (AccessRight[] array, int arrayIndex) { if (array == null) throw new ArgumentNullException (nameof (array)); if (arrayIndex < 0 || arrayIndex + Count > array.Length) throw new ArgumentOutOfRangeException (nameof (arrayIndex)); list.CopyTo (array, arrayIndex); } /// /// Removes the specified access right. /// /// /// Removes the specified access right. /// /// if the access right was removed; otherwise, . /// The access right. public bool Remove (AccessRight right) { return list.Remove (right); } /// /// Get the access right at the specified index. /// /// /// Gets the access right at the specified index. /// /// The access right at the specified index. /// The index. /// /// is out of range. /// public AccessRight this [int index] { get { if (index < 0 || index >= list.Count) throw new ArgumentOutOfRangeException (nameof (index)); return list[index]; } } #region IEnumerable implementation /// /// Get the access rights enumerator. /// /// /// Gets the access rights enumerator. /// /// The enumerator. public IEnumerator GetEnumerator () { return list.GetEnumerator (); } #endregion #region IEnumerable implementation /// /// Get the access rights enumerator. /// /// /// Gets the access rights enumerator. /// /// The enumerator. IEnumerator IEnumerable.GetEnumerator () { return list.GetEnumerator (); } #endregion /// /// Return a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { var rights = new char[list.Count]; for (int i = 0; i < list.Count; i++) rights[i] = list[i].Right; return new string (rights); } } } ================================================ FILE: MailKit/AlertEventArgs.cs ================================================ // // AlertEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Alert event arguments. /// /// /// Some implementations, such as /// , will emit Alert /// events when they receive alert messages from the server. /// public class AlertEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The alert message. /// /// is . /// public AlertEventArgs (string message) { if (message == null) throw new ArgumentNullException (nameof (message)); Message = message; } /// /// Gets the alert message. /// /// /// The alert message will be the exact message received from the server. /// /// The alert message. public string Message { get; private set; } } } ================================================ FILE: MailKit/Annotation.cs ================================================ // // Annotation.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit { /// /// An annotation. /// /// /// An annotation. /// For more information about annotations, see /// rfc5257. /// public class Annotation { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The annotation entry. /// /// is . /// public Annotation (AnnotationEntry entry) { if (entry is null) throw new ArgumentNullException (nameof (entry)); Properties = new Dictionary (); Entry = entry; } /// /// Get the annotation tag. /// /// /// Gets the annotation tag. /// /// The annotation tag. public AnnotationEntry Entry { get; private set; } /// /// Get the annotation properties. /// /// /// Gets the annotation properties. /// /// The annotation properties. public Dictionary Properties { get; private set; } } } ================================================ FILE: MailKit/AnnotationAccess.cs ================================================ // // AnnotationAccess.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// An annotation access level. /// /// /// An annotation access level. /// For more information about annotations, see /// rfc5257. /// public enum AnnotationAccess { /// /// Annotations are not supported. /// None, /// /// Annotations are read-only. /// ReadOnly, /// /// Annotations are read-write. /// ReadWrite } } ================================================ FILE: MailKit/AnnotationAttribute.cs ================================================ // // AnnotationAttribute.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// An annotation attribute. /// /// /// An annotation attribute. /// For more information about annotations, see /// rfc5257. /// public class AnnotationAttribute : IEquatable { static readonly char[] Wildcards = { '*', '%' }; /// /// The annotation value. /// /// /// Used to get or set both the private and shared values of an annotation. /// public static readonly AnnotationAttribute Value = new AnnotationAttribute ("value", AnnotationScope.Both); /// /// The shared annotation value. /// /// /// Used to get or set the shared value of an annotation. /// public static readonly AnnotationAttribute SharedValue = new AnnotationAttribute ("value", AnnotationScope.Shared); /// /// The private annotation value. /// /// /// Used to get or set the private value of an annotation. /// public static readonly AnnotationAttribute PrivateValue = new AnnotationAttribute ("value", AnnotationScope.Private); /// /// The size of an annotation value. /// /// /// Used to get the size of the both the private and shared annotation values. /// public static readonly AnnotationAttribute Size = new AnnotationAttribute ("size", AnnotationScope.Both); /// /// The size of a shared annotation value. /// /// /// Used to get the size of a shared annotation value. /// public static readonly AnnotationAttribute SharedSize = new AnnotationAttribute ("size", AnnotationScope.Shared); /// /// The size of a private annotation value. /// /// /// Used to get the size of a private annotation value. /// public static readonly AnnotationAttribute PrivateSize = new AnnotationAttribute ("size", AnnotationScope.Private); AnnotationAttribute (string name, AnnotationScope scope) { switch (scope) { case AnnotationScope.Shared: Specifier = string.Format ("{0}.shared", name); break; case AnnotationScope.Private: Specifier = string.Format ("{0}.priv", name); break; default: Specifier = name; break; } Scope = scope; Name = name; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The annotation attribute specifier. /// /// is . /// /// /// contains illegal characters. /// public AnnotationAttribute (string specifier) { if (specifier == null) throw new ArgumentNullException (nameof (specifier)); if (specifier.Length == 0) throw new ArgumentException ("Annotation attribute specifiers cannot be empty.", nameof (specifier)); // TODO: improve validation if (specifier.IndexOfAny (Wildcards) != -1) throw new ArgumentException ("Annotation attribute specifiers cannot contain '*' or '%'.", nameof (specifier)); Specifier = specifier; if (specifier.EndsWith (".shared", StringComparison.Ordinal)) { Name = specifier.Substring (0, specifier.Length - ".shared".Length); Scope = AnnotationScope.Shared; } else if (specifier.EndsWith (".priv", StringComparison.Ordinal)) { Name = specifier.Substring (0, specifier.Length - ".priv".Length); Scope = AnnotationScope.Private; } else { Scope = AnnotationScope.Both; Name = specifier; } } /// /// Get the name of the annotation attribute. /// /// /// Gets the name of the annotation attribute. /// /// The name of the annotation attribute. public string Name { get; private set; } /// /// Get the scope of the annotation attribute. /// /// /// Gets the scope of the annotation attribute. /// /// The scope of the annotation attribute. public AnnotationScope Scope { get; private set; } /// /// Get the annotation attribute specifier. /// /// /// Gets the annotation attribute specifier. /// /// The annotation attribute specifier. public string Specifier { get; private set; } #region IEquatable implementation /// /// Determines whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// /// The to compare with the current . /// if the specified is equal to the current /// ; otherwise, . public bool Equals (AnnotationAttribute? other) { return other?.Specifier == Specifier; } #endregion /// /// Determines whether two annotation attributes are equal. /// /// /// Determines whether two annotation attributes are equal. /// /// if and are equal; otherwise, . /// The first annotation attribute to compare. /// The second annotation attribute to compare. public static bool operator == (AnnotationAttribute attr1, AnnotationAttribute attr2) { return attr1?.Specifier == attr2?.Specifier; } /// /// Determines whether two annotation attributes are not equal. /// /// /// Determines whether two annotation attributes are not equal. /// /// if and are not equal; otherwise, . /// The first annotation attribute to compare. /// The second annotation attribute to compare. public static bool operator != (AnnotationAttribute attr1, AnnotationAttribute attr2) { return attr1?.Specifier != attr2?.Specifier; } /// /// Determine whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// /// The to compare with the current . /// if the specified is equal to the current /// ; otherwise, . public override bool Equals (object? obj) { return obj is AnnotationAttribute attribute && attribute.Specifier == Specifier; } /// /// Serves as a hash function for a object. /// /// /// Serves as a hash function for a object. /// /// A hash code for this instance that is suitable for use in hashing algorithms and data structures such as a hash table. public override int GetHashCode () { return Specifier.GetHashCode (); } /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { return Specifier; } } } ================================================ FILE: MailKit/AnnotationEntry.cs ================================================ // // AnnotationEntry.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// An annotation entry. /// /// /// An annotation entry. /// For more information about annotations, see /// rfc5257. /// public class AnnotationEntry : IEquatable { /// /// An annotation entry for a comment on a message. /// /// /// Used to get or set a comment on a message. /// public static readonly AnnotationEntry Comment = new AnnotationEntry ("/comment", AnnotationScope.Both); /// /// An annotation entry for a private comment on a message. /// /// /// Used to get or set a private comment on a message. /// public static readonly AnnotationEntry PrivateComment = new AnnotationEntry ("/comment", AnnotationScope.Private); /// /// An annotation entry for a shared comment on a message. /// /// /// Used to get or set a shared comment on a message. /// public static readonly AnnotationEntry SharedComment = new AnnotationEntry ("/comment", AnnotationScope.Shared); /// /// An annotation entry for flags on a message. /// /// /// Used to get or set flags on a message. /// public static readonly AnnotationEntry Flags = new AnnotationEntry ("/flags", AnnotationScope.Both); /// /// An annotation entry for private flags on a message. /// /// /// Used to get or set private flags on a message. /// public static readonly AnnotationEntry PrivateFlags = new AnnotationEntry ("/flags", AnnotationScope.Private); /// /// Aa annotation entry for shared flags on a message. /// /// /// Used to get or set shared flags on a message. /// public static readonly AnnotationEntry SharedFlags = new AnnotationEntry ("/flags", AnnotationScope.Shared); /// /// An annotation entry for an alternate subject on a message. /// /// /// Used to get or set an alternate subject on a message. /// public static readonly AnnotationEntry AltSubject = new AnnotationEntry ("/altsubject", AnnotationScope.Both); /// /// An annotation entry for a private alternate subject on a message. /// /// /// Used to get or set a private alternate subject on a message. /// public static readonly AnnotationEntry PrivateAltSubject = new AnnotationEntry ("/altsubject", AnnotationScope.Private); /// /// An annotation entry for a shared alternate subject on a message. /// /// /// Used to get or set a shared alternate subject on a message. /// public static readonly AnnotationEntry SharedAltSubject = new AnnotationEntry ("/altsubject", AnnotationScope.Shared); static void ValidatePath (string path) { if (path == null) throw new ArgumentNullException (nameof (path)); if (path.Length == 0) throw new ArgumentException ("Annotation entry paths cannot be empty.", nameof (path)); if (path[0] != '/' && path[0] != '*' && path[0] != '%') throw new ArgumentException ("Annotation entry paths must begin with '/'.", nameof (path)); if (path.Length > 1 && path[1] >= '0' && path[1] <= '9') throw new ArgumentException ("Annotation entry paths must not include a part-specifier.", nameof (path)); if (path == "*" || path == "%") return; char pc = path[0]; for (int i = 1; i < path.Length; i++) { char c = path[i]; if (c > 127) throw new ArgumentException ($"Invalid character in annotation entry path: '{c}'.", nameof (path)); if (c >= '0' && c <= '9' && pc == '/') throw new ArgumentException ("Invalid annotation entry path.", nameof (path)); if ((pc == '/' || pc == '.') && (c == '/' || c == '.')) throw new ArgumentException ("Invalid annotation entry path.", nameof (path)); pc = c; } int endIndex = path.Length - 1; if (path[endIndex] == '/') throw new ArgumentException ("Annotation entry paths must not end with '/'.", nameof (path)); if (path[endIndex] == '.') throw new ArgumentException ("Annotation entry paths must not end with '.'.", nameof (path)); } static void ValidatePartSpecifier (string partSpecifier) { if (partSpecifier == null) throw new ArgumentNullException (nameof (partSpecifier)); char pc = '\0'; for (int i = 0; i < partSpecifier.Length; i++) { char c = partSpecifier[i]; if (!((c >= '0' && c <= '9') || c == '.') || (c == '.' && (pc == '.' || pc == '\0'))) throw new ArgumentException ("Invalid part-specifier.", nameof (partSpecifier)); pc = c; } if (pc == '.') throw new ArgumentException ("Invalid part-specifier.", nameof (partSpecifier)); } AnnotationEntry (string? partSpecifier, string entry, string path, AnnotationScope scope) { PartSpecifier = partSpecifier; Entry = entry; Path = path; Scope = scope; } /// /// Initializes a new instance of the struct. /// /// /// Creates a new . /// /// The annotation entry path. /// The scope of the annotation. /// /// is . /// /// /// is invalid. /// public AnnotationEntry (string path, AnnotationScope scope = AnnotationScope.Both) { ValidatePath (path); switch (scope) { case AnnotationScope.Private: Entry = path + ".priv"; break; case AnnotationScope.Shared: Entry = path + ".shared"; break; default: Entry = path; break; } PartSpecifier = null; Path = path; Scope = scope; } /// /// Initializes a new instance of the struct. /// /// /// Creates a new for an individual body part of a message. /// /// The part-specifier of the body part of the message. /// The annotation entry path. /// The scope of the annotation. /// /// is . /// -or- /// is . /// /// /// is invalid. /// -or- /// is invalid. /// public AnnotationEntry (string partSpecifier, string path, AnnotationScope scope = AnnotationScope.Both) { ValidatePartSpecifier (partSpecifier); ValidatePath (path); switch (scope) { case AnnotationScope.Private: Entry = string.Format ("/{0}{1}.priv", partSpecifier, path); break; case AnnotationScope.Shared: Entry = string.Format ("/{0}{1}.shared", partSpecifier, path); break; default: Entry = string.Format ("/{0}{1}", partSpecifier, path); break; } PartSpecifier = partSpecifier; Path = path; Scope = scope; } /// /// Initializes a new instance of the struct. /// /// /// Creates a new for an individual body part of a message. /// /// The body part of the message. /// The annotation entry path. /// The scope of the annotation. /// /// is . /// -or- /// is . /// /// /// is invalid. /// public AnnotationEntry (BodyPart part, string path, AnnotationScope scope = AnnotationScope.Both) { if (part == null) throw new ArgumentNullException (nameof (part)); ValidatePath (path); switch (scope) { case AnnotationScope.Private: Entry = string.Format ("/{0}{1}.priv", part.PartSpecifier, path); break; case AnnotationScope.Shared: Entry = string.Format ("/{0}{1}.shared", part.PartSpecifier, path); break; default: Entry = string.Format ("/{0}{1}", part.PartSpecifier, path); break; } PartSpecifier = part.PartSpecifier; Path = path; Scope = scope; } /// /// Get the annotation entry specifier. /// /// /// Gets the annotation entry specifier. /// /// The annotation entry specifier. public string Entry { get; private set; } /// /// Get the part-specifier component of the annotation entry. /// /// /// Gets the part-specifier component of the annotation entry. /// /// The part-specifier. public string? PartSpecifier { get; private set; } /// /// Get the path component of the annotation entry. /// /// /// Gets the path component of the annotation entry. /// /// The path. public string Path { get; private set; } /// /// Get the scope of the annotation. /// /// /// Gets the scope of the annotation. /// /// The scope. public AnnotationScope Scope { get; private set; } #region IEquatable implementation /// /// Determines whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// /// The to compare with the current . /// if the specified is equal to the current /// ; otherwise, . public bool Equals (AnnotationEntry? other) { return other?.Entry == Entry; } #endregion /// /// Determines whether two annotation entries are equal. /// /// /// Determines whether two annotation entries are equal. /// /// if and are equal; otherwise, . /// The first annotation entry to compare. /// The second annotation entry to compare. public static bool operator == (AnnotationEntry entry1, AnnotationEntry entry2) { return entry1?.Entry == entry2?.Entry; } /// /// Determines whether two annotation entries are not equal. /// /// /// Determines whether two annotation entries are not equal. /// /// if and are not equal; otherwise, . /// The first annotation entry to compare. /// The second annotation entry to compare. public static bool operator != (AnnotationEntry entry1, AnnotationEntry entry2) { return entry1?.Entry != entry2?.Entry; } /// /// Determine whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// /// The to compare with the current . /// if the specified is equal to the current /// ; otherwise, . public override bool Equals (object? obj) { return obj is AnnotationEntry entry && entry.Entry == Entry; } /// /// Serves as a hash function for a object. /// /// /// Serves as a hash function for a object. /// /// A hash code for this instance that is suitable for use in hashing algorithms and data structures such as a hash table. public override int GetHashCode () { return Entry.GetHashCode (); } /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { return Entry; } /// /// Parse an annotation entry. /// /// /// Parses an annotation entry. /// /// The annotation entry. /// The parsed annotation entry. /// /// is . /// /// /// does not conform to the annotation entry syntax. /// public static AnnotationEntry Parse (string entry) { if (entry == null) throw new ArgumentNullException (nameof (entry)); if (entry.Length == 0) throw new FormatException ("An annotation entry cannot be empty."); if (entry[0] != '/' && entry[0] != '*' && entry[0] != '%') throw new FormatException ("An annotation entry must begin with a '/' character."); var scope = AnnotationScope.Both; int startIndex = 0, endIndex; string? partSpecifier = null; var component = 0; var pc = entry[0]; string path; for (int i = 1; i < entry.Length; i++) { char c = entry[i]; if (c >= '0' && c <= '9' && pc == '/') { if (component > 0) throw new FormatException ("Invalid annotation entry."); startIndex = i; endIndex = i + 1; pc = c; while (endIndex < entry.Length) { c = entry[endIndex]; if (c == '/') { if (pc == '.') throw new FormatException ("Invalid part-specifier in annotation entry."); break; } if (!(c >= '0' && c <= '9') && c != '.') throw new FormatException ($"Invalid character in part-specifier: '{c}'."); if (c == '.' && pc == '.') throw new FormatException ("Invalid part-specifier in annotation entry."); endIndex++; pc = c; } if (endIndex >= entry.Length) throw new FormatException ("Incomplete part-specifier in annotation entry."); partSpecifier = entry.Substring (startIndex, endIndex - startIndex); i = startIndex = endIndex; component++; } else if (c == '/' || c == '.') { if (pc == '/' || pc == '.') throw new FormatException ("Invalid annotation entry path."); if (c == '/') component++; } else if (c > 127) { throw new FormatException ($"Invalid character in annotation entry path: '{c}'."); } pc = c; } if (pc == '/' || pc == '.') throw new FormatException ("Invalid annotation entry path."); if (entry.EndsWith (".shared", StringComparison.Ordinal)) { endIndex = entry.Length - ".shared".Length; scope = AnnotationScope.Shared; } else if (entry.EndsWith (".priv", StringComparison.Ordinal)) { endIndex = entry.Length - ".priv".Length; scope = AnnotationScope.Private; } else { endIndex = entry.Length; } path = entry.Substring (startIndex, endIndex - startIndex); return new AnnotationEntry (partSpecifier, entry, path, scope); } internal static AnnotationEntry Create (string entry) { switch (entry) { case "/comment": return Comment; case "/comment.priv": return PrivateComment; case "/comment.shared": return SharedComment; case "/flags": return Flags; case "/flags.priv": return PrivateFlags; case "/flags.shared": return SharedFlags; case "/altsubject": return AltSubject; case "/altsubject.priv": return PrivateAltSubject; case "/altsubject.shared": return SharedAltSubject; default: return Parse (entry); } } } } ================================================ FILE: MailKit/AnnotationScope.cs ================================================ // // AnnotationScope.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// The scope of an annotation. /// /// /// Represents the scope of an annotation. /// For more information about annotations, see /// rfc5257. /// [Flags] public enum AnnotationScope { /// /// No scopes. /// None, /// /// The private annotation scope. /// Private, /// /// The shared annotation scope. /// Shared, /// /// Both private and shared scopes. /// Both = Private | Shared } } ================================================ FILE: MailKit/AnnotationsChangedEventArgs.cs ================================================ // // AnnotationsChangedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using System.Collections.ObjectModel; namespace MailKit { /// /// Event args used when an annotation changes. /// /// /// Event args used when an annotation changes. /// public class AnnotationsChangedEventArgs : MessageEventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The annotations that changed. /// /// is . /// public AnnotationsChangedEventArgs (int index, IEnumerable annotations) : base (index) { if (annotations == null) throw new ArgumentNullException (nameof (annotations)); Annotations = new ReadOnlyCollection (annotations.ToArray ()); } /// /// Get the annotations that changed. /// /// /// Gets the annotations that changed. /// /// The annotation. public IList Annotations { get; internal set; } /// /// Gets the updated mod-sequence value of the message, if available. /// /// /// Gets the updated mod-sequence value of the message, if available. /// /// The mod-sequence value. public ulong? ModSeq { get; internal set; } } } ================================================ FILE: MailKit/AppendRequest.cs ================================================ // // AppendRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// A request for appending a message to a folder. /// /// /// A request for appending a message to a folder. /// public class AppendRequest : IAppendRequest { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message. /// The message flags. /// /// is . /// public AppendRequest (MimeMessage message, MessageFlags flags = MessageFlags.None) { if (message == null) throw new ArgumentNullException (nameof (message)); Message = message; Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message. /// The message flags. /// The message keywords. /// /// is . /// -or- /// is . /// public AppendRequest (MimeMessage message, MessageFlags flags, IEnumerable keywords) { if (message == null) throw new ArgumentNullException (nameof (message)); if (keywords == null) throw new ArgumentNullException (nameof (keywords)); Keywords = keywords as ISet ?? new HashSet (keywords); Message = message; Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message. /// The message flags. /// The internal date of the message. /// /// is . /// public AppendRequest (MimeMessage message, MessageFlags flags, DateTimeOffset internalDate) { if (message == null) throw new ArgumentNullException (nameof (message)); Message = message; Flags = flags; InternalDate = internalDate; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message. /// The message flags. /// The message keywords. /// The internal date of the message. /// /// is . /// -or- /// is . /// public AppendRequest (MimeMessage message, MessageFlags flags, IEnumerable keywords, DateTimeOffset internalDate) { if (message == null) throw new ArgumentNullException (nameof (message)); if (keywords == null) throw new ArgumentNullException (nameof (keywords)); Keywords = keywords as ISet ?? new HashSet (keywords); Message = message; Flags = flags; InternalDate = internalDate; } /// /// Get the message that should be appended to the folder. /// /// /// Gets the message that should be appended to the folder. /// /// The message. public MimeMessage Message { get; private set; } /// /// Get or set the message flags that should be set on the message. /// /// /// Gets or sets the message flags that should be set on the message. /// /// The message flags. public MessageFlags Flags { get; set; } /// /// Get or set the keywords that should be set on the message. /// /// /// Gets or sets the keywords that should be set on the message. /// /// The keywords. public ISet? Keywords { get; set; } /// /// Get or set the timestamp that should be used by folder as the . /// /// /// Gets or sets the timestamp that should be used by folder as the . /// /// The date and time to use for the INTERNALDATE or if it should be left up to the folder to decide. public DateTimeOffset? InternalDate { get; set; } /// /// Get or set the list of annotations that should be set on the message. /// /// /// Gets or sets the list of annotations that should be set on the message. /// /// This feature is not supported by all folders. /// Use with the enum value /// to determine if this feature is supported. /// /// /// The list of annotations. public IList? Annotations { get; set; } /// /// Get or set the transfer progress reporting mechanism. /// /// /// Gets or sets the transfer progress reporting mechanism. /// /// The transfer progress mechanism. public ITransferProgress? TransferProgress { get; set; } } } ================================================ FILE: MailKit/AuthenticatedEventArgs.cs ================================================ // // AuthenticatedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Authenticated event arguments. /// /// /// Some servers, such as GMail IMAP, will send some free-form text in /// the response to a successful login. /// public class AuthenticatedEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The free-form text. /// /// is . /// public AuthenticatedEventArgs (string message) { if (message == null) throw new ArgumentNullException (nameof (message)); Message = message; } /// /// Get the free-form text sent by the server. /// /// /// Gets the free-form text sent by the server. /// /// The free-form text sent by the server. public string Message { get; private set; } } } ================================================ FILE: MailKit/BodyPart.cs ================================================ // // BodyPart.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Globalization; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using MimeKit; using MimeKit.Utils; namespace MailKit { /// /// An abstract body part of a message. /// /// /// Each body part will actually be a , /// , , or /// . /// /// /// /// public abstract class BodyPart { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// [Obsolete ("Use BodyPart (ContentType, string) instead.")] protected BodyPart () { ContentType = new ContentType ("application", "octet-stream"); PartSpecifier = string.Empty; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The content type. /// The part specifier. /// /// is . /// -or- /// is . /// protected BodyPart (ContentType contentType, string partSpecifier) { if (contentType == null) throw new ArgumentNullException (nameof (contentType)); if (partSpecifier == null) throw new ArgumentNullException (nameof (partSpecifier)); ContentType = contentType; PartSpecifier = partSpecifier; } /// /// Gets the Content-Type of the body part. /// /// /// Gets the Content-Type of the body part. /// /// The content type. public ContentType ContentType { get; set; } /// /// Gets the part specifier. /// /// /// Gets the part specifier. /// /// /// /// /// The part specifier. public string PartSpecifier { get; set; } /// /// Dispatches to the specific visit method for this MIME body part. /// /// /// This default implementation for nodes /// calls . Override this /// method to call into a more specific method on a derived visitor class /// of the class. However, it should still /// support unknown visitors by calling /// . /// /// The visitor. /// /// is . /// public abstract void Accept (BodyPartVisitor visitor); internal static void Encode (StringBuilder builder, uint value) { builder.Append (value.ToString (CultureInfo.InvariantCulture)); } internal static void Encode (StringBuilder builder, string? value) { if (value != null) MimeUtils.AppendQuoted (builder, value); else builder.Append ("NIL"); } internal static void Encode (StringBuilder builder, Uri? location) { if (location != null) MimeUtils.AppendQuoted (builder, location.ToString ()); else builder.Append ("NIL"); } internal static void Encode (StringBuilder builder, string[]? values) { if (values == null || values.Length == 0) { builder.Append ("NIL"); return; } builder.Append ('('); for (int i = 0; i < values.Length; i++) { if (i > 0) builder.Append (' '); Encode (builder, values[i]); } builder.Append (')'); } internal static void Encode (StringBuilder builder, IList parameters) { if (parameters == null || parameters.Count == 0) { builder.Append ("NIL"); return; } builder.Append ('('); for (int i = 0; i < parameters.Count; i++) { if (i > 0) builder.Append (' '); Encode (builder, parameters[i].Name); builder.Append (' '); Encode (builder, parameters[i].Value); } builder.Append (')'); } internal static void Encode (StringBuilder builder, ContentDisposition? disposition) { if (disposition == null) { builder.Append ("NIL"); return; } builder.Append ('('); Encode (builder, disposition.Disposition); builder.Append (' '); Encode (builder, disposition.Parameters); builder.Append (')'); } internal static void Encode (StringBuilder builder, ContentType contentType) { Encode (builder, contentType.MediaType); builder.Append (' '); Encode (builder, contentType.MediaSubtype); builder.Append (' '); Encode (builder, contentType.Parameters); } internal static void Encode (StringBuilder builder, BodyPartCollection parts) { if (parts == null || parts.Count == 0) { builder.Append ("NIL"); return; } for (int i = 0; i < parts.Count; i++) { if (i > 0) builder.Append (' '); Encode (builder, parts[i]); } } internal static void Encode (StringBuilder builder, Envelope? envelope) { if (envelope == null) { builder.Append ("NIL"); return; } envelope.Encode (builder); } internal static void Encode (StringBuilder builder, BodyPart? body) { if (body == null) { builder.Append ("NIL"); return; } builder.Append ('('); body.Encode (builder); builder.Append (')'); } /// /// Encodes the into the . /// /// /// Encodes the into the . /// /// The string builder. protected abstract void Encode (StringBuilder builder); /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// The syntax of the string returned, while similar to IMAP's BODYSTRUCTURE syntax, /// is not completely compatible. /// /// A that represents the current . public override string ToString () { var builder = new StringBuilder (); builder.Append ('('); Encode (builder); builder.Append (')'); return builder.ToString (); } static bool IsNIL (string text, int index) { return string.Compare (text, index, "NIL", 0, 3, StringComparison.Ordinal) == 0; } static bool TryParse (string text, ref int index, out uint value) { while (index < text.Length && text[index] == ' ') index++; int startIndex = index; value = 0; while (index < text.Length && char.IsDigit (text[index])) value = (value * 10) + (uint) (text[index++] - '0'); return index > startIndex; } static bool TryParse (string text, ref int index, out string? nstring) { nstring = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length) return false; if (text[index] != '"') { if (index + 3 <= text.Length && IsNIL (text, index)) { index += 3; return true; } return false; } var token = new StringBuilder (); bool escaped = false; index++; while (index < text.Length) { if (text[index] == '"' && !escaped) break; if (escaped || text[index] != '\\') { token.Append (text[index]); escaped = false; } else { escaped = true; } index++; } if (index >= text.Length) return false; nstring = token.ToString (); index++; return true; } static bool TryParse (string text, ref int index, out string[]? values) { values = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length) return false; if (text[index] != '(') { if (index + 3 <= text.Length && IsNIL (text, index)) { index += 3; return true; } return false; } index++; if (index >= text.Length) return false; var list = new List (); do { if (text[index] == ')') break; if (!TryParse (text, ref index, out string? value)) return false; if (value != null) list.Add (value); } while (index < text.Length); if (index >= text.Length || text[index] != ')') return false; values = list.ToArray (); index++; return true; } static bool TryParse (string text, ref int index, out Uri? uri) { uri = null; if (!TryParse (text, ref index, out string? nstring)) return false; if (!string.IsNullOrEmpty (nstring)) { if (Uri.IsWellFormedUriString (nstring, UriKind.Absolute)) uri = new Uri (nstring, UriKind.Absolute); else if (Uri.IsWellFormedUriString (nstring, UriKind.Relative)) uri = new Uri (nstring, UriKind.Relative); } return true; } static bool TryParse (string text, ref int index, [NotNullWhen (true)] out IList? parameters) { parameters = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length) return false; if (text[index] != '(') { if (index + 3 <= text.Length && IsNIL (text, index)) { parameters = new List (); index += 3; return true; } return false; } index++; if (index >= text.Length) return false; parameters = new List (); do { if (text[index] == ')') break; if (!TryParse (text, ref index, out string? name) || name == null) return false; if (!TryParse (text, ref index, out string? value) || value == null) return false; parameters.Add (new Parameter (name, value)); } while (index < text.Length); if (index >= text.Length || text[index] != ')') return false; index++; return true; } static bool TryParse (string text, ref int index, out ContentDisposition? disposition) { disposition = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length) return false; if (text[index] != '(') { if (index + 3 <= text.Length && IsNIL (text, index)) { index += 3; return true; } return false; } index++; if (!TryParse (text, ref index, out string? value) || value == null) return false; if (!TryParse (text, ref index, out IList? parameters)) return false; if (index >= text.Length || text[index] != ')') return false; index++; disposition = new ContentDisposition (value); foreach (var param in parameters) disposition.Parameters.Add (param); return true; } static bool TryParse (string text, ref int index, bool multipart, [NotNullWhen (true)] out ContentType? contentType) { string? type, subtype; contentType = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length) return false; if (!multipart) { if (!TryParse (text, ref index, out type)) return false; } else { type = "multipart"; } if (!TryParse (text, ref index, out subtype)) return false; if (!TryParse (text, ref index, out IList? parameters)) return false; contentType = new ContentType (type ?? "application", subtype ?? "octet-stream"); foreach (var param in parameters) contentType.Parameters.Add (param); return true; } static bool TryParse (string text, ref int index, string prefix, [NotNullWhen (true)] out BodyPartCollection? bodyParts) { string path; int id = 1; bodyParts = null; if (index >= text.Length) return false; bodyParts = new BodyPartCollection (); do { if (text[index] != '(') break; path = prefix + id; if (!TryParse (text, ref index, path, out BodyPart? part)) return false; while (index < text.Length && text[index] == ' ') index++; if (part != null) bodyParts.Add (part); id++; } while (index < text.Length); return index < text.Length; } static bool TryParse (string text, ref int index, string path, out BodyPart? part) { ContentDisposition? disposition; ContentType? contentType; string[]? array; Uri? location; part = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length || text[index] != '(') { if (index + 3 <= text.Length && IsNIL (text, index)) { index += 3; return true; } return false; } index++; if (index >= text.Length) return false; if (text[index] == '(' || IsNIL (text, index)) { var prefix = path.Length > 0 ? path + "." : string.Empty; BodyPartCollection? bodyParts = null; if (text[index] == '(') { if (!TryParse (text, ref index, prefix, out bodyParts)) return false; } else { index += "NIL".Length; } if (!TryParse (text, ref index, true, out contentType)) return false; var multipart = new BodyPartMultipart (contentType, path, bodyParts ?? new BodyPartCollection ()); if (!TryParse (text, ref index, out disposition)) return false; multipart.ContentDisposition = disposition; if (!TryParse (text, ref index, out array)) return false; multipart.ContentLanguage = array; if (!TryParse (text, ref index, out location)) return false; multipart.ContentLocation = location; part = multipart; } else { BodyPartMessage? message = null; BodyPartText? txt = null; BodyPartBasic? basic; string? nstring; if (!TryParse (text, ref index, false, out contentType)) return false; if (contentType.IsMimeType ("message", "rfc822")) basic = message = new BodyPartMessage (contentType, path); else if (contentType.IsMimeType ("text", "*")) basic = txt = new BodyPartText (contentType, path); else basic = new BodyPartBasic (contentType, path); if (!TryParse (text, ref index, out nstring)) return false; basic.ContentId = nstring; if (!TryParse (text, ref index, out nstring)) return false; basic.ContentDescription = nstring; if (!TryParse (text, ref index, out nstring)) return false; basic.ContentTransferEncoding = nstring; if (!TryParse (text, ref index, out uint number)) return false; basic.Octets = number; if (!TryParse (text, ref index, out nstring)) return false; basic.ContentMd5 = nstring; if (!TryParse (text, ref index, out disposition)) return false; basic.ContentDisposition = disposition; if (!TryParse (text, ref index, out array)) return false; basic.ContentLanguage = array; if (!TryParse (text, ref index, out location)) return false; basic.ContentLocation = location; if (message != null) { if (!Envelope.TryParse (text, ref index, out Envelope? envelope)) return false; message.Envelope = envelope; if (!TryParse (text, ref index, path, out BodyPart? body)) return false; message.Body = body; if (!TryParse (text, ref index, out number)) return false; message.Lines = number; } else if (txt != null) { if (!TryParse (text, ref index, out number)) return false; txt.Lines = number; } part = basic; } if (index >= text.Length || text[index] != ')') return false; index++; return true; } /// /// Tries to parse the given text into a new instance. /// /// /// Parses a body part from the specified text. /// This syntax, while similar to IMAP's BODYSTRUCTURE syntax, is not completely /// compatible. /// /// if the body part was successfully parsed; otherwise, . /// The text to parse. /// The parsed body part. /// /// is . /// public static bool TryParse (string text, out BodyPart? part) { if (text == null) throw new ArgumentNullException (nameof (text)); int index = 0; return TryParse (text, ref index, string.Empty, out part) && index == text.Length; } } } ================================================ FILE: MailKit/BodyPartBasic.cs ================================================ // // BodyPartBasic.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using MimeKit; namespace MailKit { /// /// A basic message body part. /// /// /// Represents any message body part that is not a multipart, /// message/rfc822 part, or a text part. /// /// /// /// public class BodyPartBasic : BodyPart { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// [Obsolete ("Use BodyPartBasic (ContentType, string) instead.")] public BodyPartBasic () : base () { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The content type. /// The part specifier. /// /// is . /// -or- /// is . /// public BodyPartBasic (ContentType contentType, string partSpecifier) : base (contentType, partSpecifier) { } /// /// Gets the Content-Id of the body part, if available. /// /// /// Gets the Content-Id of the body part, if available. /// /// The content identifier. public string? ContentId { get; set; } /// /// Gets the Content-Description of the body part, if available. /// /// /// Gets the Content-Description of the body part, if available. /// /// The content description. public string? ContentDescription { get; set; } /// /// Gets the Content-Transfer-Encoding of the body part. /// /// /// Gets the Content-Transfer-Encoding of the body part. /// Hint: Use the MimeUtils.TryParse /// method to parse this value into a usable . /// /// The content transfer encoding. public string? ContentTransferEncoding { get; set; } /// /// Gets the size of the body part, in bytes. /// /// /// Gets the size of the body part, in bytes. /// Note that this size is the size in its transfer encoding /// and not the resulting size after any decoding. /// /// The number of octets. public uint Octets { get; set; } /// /// Gets the MD5 hash of the content, if available. /// /// /// Gets the MD5 hash of the content, if available. /// /// The content md5. public string? ContentMd5 { get; set; } /// /// Gets the Content-Disposition of the body part, if available. /// /// /// Gets the Content-Disposition of the body part, if available. /// The Content-Disposition value is only retrieved if the /// flag is used when fetching /// summary information from an . /// /// The content disposition. public ContentDisposition? ContentDisposition { get; set; } /// /// Gets the Content-Language of the body part, if available. /// /// /// Gets the Content-Language of the body part, if available. /// The Content-Language value is only retrieved if the /// flag is used when fetching /// summary information from an . /// /// The content language. public string[]? ContentLanguage { get; set; } /// /// Gets the Content-Location of the body part, if available. /// /// /// Gets the Content-Location of the body part, if available. /// The Content-Location value is only retrieved if the /// flag is used when fetching /// summary information from an . /// /// The content location. public Uri? ContentLocation { get; set; } /// /// Determines whether or not the body part is an attachment. /// /// /// Determines whether or not the body part is an attachment based on the value of /// the Content-Disposition. /// Since the value of the Content-Disposition header is needed, it /// is necessary to include the flag when /// fetching summary information from an . /// /// if this part is an attachment; otherwise, . public bool IsAttachment { get { return ContentDisposition != null && ContentDisposition.IsAttachment; } } /// /// Get the name of the file. /// /// /// First checks for the "filename" parameter on the Content-Disposition header. If /// that does not exist, then the "name" parameter on the Content-Type header is used. /// Since the value of the Content-Disposition header is needed, it is /// necessary to include the flag when /// fetching summary information from an . /// /// The name of the file. public string? FileName { get { string? filename = null; if (ContentDisposition != null) filename = ContentDisposition.FileName; filename ??= ContentType.Name; return filename?.Trim (); } } /// /// Dispatches to the specific visit method for this MIME body part. /// /// /// This default implementation for nodes /// calls . Override this /// method to call into a more specific method on a derived visitor class /// of the class. However, it should still /// support unknown visitors by calling /// . /// /// The visitor. /// /// is . /// public override void Accept (BodyPartVisitor visitor) { if (visitor == null) throw new ArgumentNullException (nameof (visitor)); visitor.VisitBodyPartBasic (this); } /// /// Encodes the into the . /// /// /// Encodes the into the . /// /// The string builder. protected override void Encode (StringBuilder builder) { Encode (builder, ContentType); builder.Append (' '); Encode (builder, ContentId); builder.Append (' '); Encode (builder, ContentDescription); builder.Append (' '); Encode (builder, ContentTransferEncoding); builder.Append (' '); Encode (builder, Octets); builder.Append (' '); Encode (builder, ContentMd5); builder.Append (' '); Encode (builder, ContentDisposition); builder.Append (' '); Encode (builder, ContentLanguage); builder.Append (' '); Encode (builder, ContentLocation); } } } ================================================ FILE: MailKit/BodyPartCollection.cs ================================================ // // BodyPartCollection.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using System.Collections; using System.Collections.Generic; using MimeKit.Utils; namespace MailKit { /// /// A collection. /// /// /// A collection. /// public class BodyPartCollection : ICollection { readonly List collection = new List (); /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public BodyPartCollection () { } /// /// Get the number of body parts in the collection. /// /// /// Gets the number of body parts in the collection. /// /// The count. public int Count { get { return collection.Count; } } /// /// Get whether or not this body part collection is read only. /// /// /// Gets whether or not this body part collection is read only. /// /// if this collection is read only; otherwise, . public bool IsReadOnly { get { return false; } } /// /// Add the specified body part to the collection. /// /// /// Adds the specified body part to the collection. /// /// The body part. /// /// is . /// public void Add (BodyPart part) { if (part == null) throw new ArgumentNullException (nameof (part)); collection.Add (part); } /// /// Clears the body part collection. /// /// /// Removes all of the body parts from the collection. /// public void Clear () { collection.Clear (); } /// /// Checks if the collection contains the specified body part. /// /// /// Determines whether or not the collection contains the specified body part. /// /// if the specified body part exists; otherwise, . /// The body part. /// /// is . /// public bool Contains (BodyPart part) { if (part == null) throw new ArgumentNullException (nameof (part)); return collection.Contains (part); } /// /// Copies all of the body parts in the collection to the specified array. /// /// /// Copies all of the body parts within the collection into the array, /// starting at the specified array index. /// /// The array. /// The array index. /// /// is . /// /// /// is out of range. /// public void CopyTo (BodyPart[] array, int arrayIndex) { if (array == null) throw new ArgumentNullException (nameof (array)); if (arrayIndex < 0 || arrayIndex + Count > array.Length) throw new ArgumentOutOfRangeException (nameof (arrayIndex)); collection.CopyTo (array, arrayIndex); } /// /// Removes the specified body part. /// /// /// Removes the specified body part. /// /// if the body part was removed; otherwise, . /// The body part. /// /// is . /// public bool Remove (BodyPart part) { if (part == null) throw new ArgumentNullException (nameof (part)); return collection.Remove (part); } /// /// Get the body part at the specified index. /// /// /// Gets the body part at the specified index. /// /// The body part at the specified index. /// The index. /// /// is out of range. /// public BodyPart this [int index] { get { if (index < 0 || index >= collection.Count) throw new ArgumentOutOfRangeException (nameof (index)); return collection[index]; } } /// /// Gets the index of the body part matching the specified URI. /// /// /// Finds the index of the body part matching the specified URI, if it exists. /// If the URI scheme is "cid", then matching is performed based on the Content-Id header /// values, otherwise the Content-Location headers are used. If the provided URI is absolute and a child /// part's Content-Location is relative, then then the child part's Content-Location URI will be combined /// with the value of its Content-Base header, if available, otherwise it will be combined with the /// multipart/related part's Content-Base header in order to produce an absolute URI that can be /// compared with the provided absolute URI. /// /// The index of the part matching the specified URI if found; otherwise -1. /// The URI of the body part. /// /// is . /// public int IndexOf (Uri uri) { if (uri == null) throw new ArgumentNullException (nameof (uri)); bool cid = uri.IsAbsoluteUri && uri.Scheme.Equals ("cid", StringComparison.OrdinalIgnoreCase); for (int index = 0; index < Count; index++) { if (this[index] is not BodyPartBasic bodyPart) continue; if (uri.IsAbsoluteUri) { if (cid) { if (!string.IsNullOrEmpty (bodyPart.ContentId)) { // Note: we might have a Content-Id in the form "", so attempt to decode it var id = MimeUtils.EnumerateReferences (bodyPart.ContentId!).FirstOrDefault () ?? bodyPart.ContentId; if (id == uri.AbsolutePath) return index; } } else if (bodyPart.ContentLocation != null) { if (!bodyPart.ContentLocation.IsAbsoluteUri) continue; if (bodyPart.ContentLocation == uri) return index; } } else if (bodyPart.ContentLocation == uri) { return index; } } return -1; } #region IEnumerable implementation /// /// Get the body part enumerator. /// /// /// Gets the body part enumerator. /// /// The enumerator. public IEnumerator GetEnumerator () { return collection.GetEnumerator (); } #endregion #region IEnumerable implementation /// /// Get the body part enumerator. /// /// /// Gets the body part enumerator. /// /// The enumerator. IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } #endregion } } ================================================ FILE: MailKit/BodyPartMessage.cs ================================================ // // BodyPartMessage.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using MimeKit; namespace MailKit { /// /// A message/rfc822 body part. /// /// /// Represents a message/rfc822 body part. /// public class BodyPartMessage : BodyPartBasic { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// [Obsolete ("Use BodyPartMessage (ContentType, string) instead.")] public BodyPartMessage () : this (new ContentType ("message", "rfc822"), string.Empty) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The content type. /// The part specifier. /// /// is . /// -or- /// is . /// public BodyPartMessage (ContentType contentType, string partSpecifier) : base (contentType, partSpecifier) { } /// /// Gets the envelope of the message, if available. /// /// /// Gets the envelope of the message, if available. /// /// The envelope. public Envelope? Envelope { get; set; } /// /// Gets the body structure of the message. /// /// /// Gets the body structure of the message. /// /// The body structure. public BodyPart? Body { get; set; } /// /// Gets the length of the message, in lines. /// /// /// Gets the length of the message, in lines. /// /// The number of lines. public uint Lines { get; set; } /// /// Dispatches to the specific visit method for this MIME body part. /// /// /// This default implementation for nodes /// calls . Override this /// method to call into a more specific method on a derived visitor class /// of the class. However, it should still /// support unknown visitors by calling /// . /// /// The visitor. /// /// is . /// public override void Accept (BodyPartVisitor visitor) { if (visitor == null) throw new ArgumentNullException (nameof (visitor)); visitor.VisitBodyPartMessage (this); } /// /// Encodes the into the . /// /// /// Encodes the into the . /// /// The string builder. protected override void Encode (StringBuilder builder) { base.Encode (builder); builder.Append (' '); Encode (builder, Envelope); builder.Append (' '); Encode (builder, Body); builder.Append (' '); Encode (builder, Lines); } } } ================================================ FILE: MailKit/BodyPartMultipart.cs ================================================ // // BodyPartMultipart.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using MimeKit; namespace MailKit { /// /// A multipart body part. /// /// /// A multipart body part. /// public class BodyPartMultipart : BodyPart { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// [Obsolete ("Use BodyPartMultipart (ContentType, string) instead.")] public BodyPartMultipart () : this (new ContentType ("multipart", "mixed"), string.Empty) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The content type. /// The part specifier. /// /// is . /// -or- /// is . /// public BodyPartMultipart (ContentType contentType, string partSpecifier) : base (contentType, partSpecifier) { BodyParts = new BodyPartCollection (); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The content type. /// The part specifier. /// The child body parts of the multipart. /// /// is . /// -or- /// is . /// -or- /// is . /// public BodyPartMultipart (ContentType contentType, string partSpecifier, BodyPartCollection bodyParts) : base (contentType, partSpecifier) { if (bodyParts is null) throw new ArgumentNullException (nameof (bodyParts)); BodyParts = bodyParts; } /// /// Gets the child body parts. /// /// /// Gets the child body parts. /// /// The child body parts. public BodyPartCollection BodyParts { get; private set; } /// /// Gets the Content-Disposition of the body part, if available. /// /// /// Gets the Content-Disposition of the body part, if available. /// /// The content disposition. public ContentDisposition? ContentDisposition { get; set; } /// /// Gets the Content-Language of the body part, if available. /// /// /// Gets the Content-Language of the body part, if available. /// /// The content language. public string[]? ContentLanguage { get; set; } /// /// Gets the Content-Location of the body part, if available. /// /// /// Gets the Content-Location of the body part, if available. /// /// The content location. public Uri? ContentLocation { get; set; } /// /// Dispatches to the specific visit method for this MIME body part. /// /// /// This default implementation for nodes /// calls . Override this /// method to call into a more specific method on a derived visitor class /// of the class. However, it should still /// support unknown visitors by calling /// . /// /// The visitor. /// /// is . /// public override void Accept (BodyPartVisitor visitor) { if (visitor == null) throw new ArgumentNullException (nameof (visitor)); visitor.VisitBodyPartMultipart (this); } /// /// Encodes the into the . /// /// /// Encodes the into the . /// /// The string builder. protected override void Encode (StringBuilder builder) { Encode (builder, BodyParts); builder.Append (' '); Encode (builder, ContentType.MediaSubtype); builder.Append (' '); Encode (builder, ContentType.Parameters); builder.Append (' '); Encode (builder, ContentDisposition); builder.Append (' '); Encode (builder, ContentLanguage); builder.Append (' '); Encode (builder, ContentLocation); } } } ================================================ FILE: MailKit/BodyPartText.cs ================================================ // // BodyPartText.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using MimeKit; namespace MailKit { /// /// A textual body part. /// /// /// Represents any body part with a media type of "text". /// /// /// /// public class BodyPartText : BodyPartBasic { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// [Obsolete ("Use BodyPartText (ContentType, string) instead.")] public BodyPartText () : this (new ContentType ("text", "plain"), string.Empty) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The content type. /// The part specifier. /// /// is . /// -or- /// is . /// public BodyPartText (ContentType contentType, string partSpecifier) : base (contentType, partSpecifier) { } /// /// Gets whether or not this text part contains plain text. /// /// /// Checks whether or not the text part's Content-Type is text/plain. /// /// if the text is html; otherwise, . public bool IsPlain { get { return ContentType.IsMimeType ("text", "plain"); } } /// /// Gets whether or not this text part contains HTML. /// /// /// Checks whether or not the text part's Content-Type is text/html. /// /// if the text is html; otherwise, . public bool IsHtml { get { return ContentType.IsMimeType ("text", "html"); } } /// /// Gets the length of the text, in lines. /// /// /// Gets the length of the text, in lines. /// /// The number of lines. public uint Lines { get; set; } /// /// Dispatches to the specific visit method for this MIME body part. /// /// /// This default implementation for nodes /// calls . Override this /// method to call into a more specific method on a derived visitor class /// of the class. However, it should still /// support unknown visitors by calling /// . /// /// The visitor. /// /// is . /// public override void Accept (BodyPartVisitor visitor) { if (visitor == null) throw new ArgumentNullException (nameof (visitor)); visitor.VisitBodyPartText (this); } /// /// Encodes the into the . /// /// /// Encodes the into the . /// /// The string builder. protected override void Encode (StringBuilder builder) { base.Encode (builder); builder.Append (' '); Encode (builder, Lines); } } } ================================================ FILE: MailKit/BodyPartVisitor.cs ================================================ // // BodyPartVisitor.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// Represents a visitor for a tree of MIME body parts. /// /// /// This class is designed to be inherited to create more specialized classes whose /// functionality requires traversing, examining or copying a tree of MIME body parts. /// public abstract class BodyPartVisitor { /// /// Initialize a new instance of the class. /// /// /// Creates a new . /// protected BodyPartVisitor () { } /// /// Dispatches the entity to one of the more specialized visit methods in this class. /// /// /// Dispatches the entity to one of the more specialized visit methods in this class. /// /// The MIME body part. public virtual void Visit (BodyPart body) { body?.Accept (this); } /// /// Visit the abstract MIME body part. /// /// /// Visits the abstract MIME body part. /// /// The MIME body part. protected internal virtual void VisitBodyPart (BodyPart entity) { } /// /// Visit the basic MIME body part. /// /// /// Visits the basic MIME body part. /// /// The basic MIME body part. protected internal virtual void VisitBodyPartBasic (BodyPartBasic entity) { VisitBodyPart (entity); } /// /// Visit the message contained within a message/rfc822 or message/news MIME entity. /// /// /// Visits the message contained within a message/rfc822 or message/news MIME entity. /// /// The body part representing the message/rfc822 message. protected virtual void VisitMessage (BodyPart message) { message.Accept (this); } /// /// Visit the message/rfc822 or message/news MIME entity. /// /// /// Visits the message/rfc822 or message/news MIME entity. /// /// The message/rfc822 or message/news body part. protected internal virtual void VisitBodyPartMessage (BodyPartMessage entity) { VisitBodyPartBasic (entity); if (entity.Body != null) VisitMessage (entity.Body); } /// /// Visit the children of a . /// /// /// Visits the children of a . /// /// The multipart. protected virtual void VisitChildren (BodyPartMultipart multipart) { for (int i = 0; i < multipart.BodyParts.Count; i++) multipart.BodyParts[i].Accept (this); } /// /// Visit the abstract multipart MIME entity. /// /// /// Visits the abstract multipart MIME entity. /// /// The multipart body part. protected internal virtual void VisitBodyPartMultipart (BodyPartMultipart multipart) { VisitBodyPart (multipart); VisitChildren (multipart); } /// /// Visit the text-based MIME part entity. /// /// /// Visits the text-based MIME part entity. /// /// The text-based body part. protected internal virtual void VisitBodyPartText (BodyPartText entity) { VisitBodyPartBasic (entity); } } } ================================================ FILE: MailKit/ByteArrayBuilder.cs ================================================ // // ByteArrayBuilder.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Buffers; namespace MailKit { class ByteArrayBuilder : IDisposable { byte[] buffer; int length; public ByteArrayBuilder (int initialCapacity) { buffer = ArrayPool.Shared.Rent (initialCapacity); length = 0; } public int Length { get { return length; } } void EnsureCapacity (int capacity) { if (capacity > buffer.Length) { var resized = ArrayPool.Shared.Rent (capacity); Buffer.BlockCopy (buffer, 0, resized, 0, length); ArrayPool.Shared.Return (buffer); buffer = resized; } } public void Append (byte c) { EnsureCapacity (length + 1); buffer[length++] = c; } public void Append (byte[] text, int startIndex, int count) { EnsureCapacity (length + count); Buffer.BlockCopy (text, startIndex, buffer, length, count); length += count; } public void Clear () { length = 0; } public byte[] ToArray () { var array = new byte[length]; Buffer.BlockCopy (buffer, 0, array, 0, length); return array; } public string ToString (Encoding encoding, Encoding fallback) { try { return encoding.GetString (buffer, 0, length); } catch (DecoderFallbackException) { return fallback.GetString (buffer, 0, length); } } public override string ToString () { return ToString (TextEncodings.UTF8, TextEncodings.Latin1); } public bool Equals (string value, bool ignoreCase = false) { if (length == value.Length) { if (ignoreCase) { for (int i = 0; i < length; i++) { uint a = (uint) buffer[i]; uint b = (uint) value[i]; if ((a - 'a') <= 'z' - 'a') a -= 0x20; if ((b - 'a') <= 'z' - 'a') b -= 0x20; if (a != b) return false; } } else { for (int i = 0; i < length; i++) { if (value[i] != (char) buffer[i]) return false; } } return true; } return false; } public void TrimNewLine () { // Trim the sequence from the end of the line. if (length > 0 && buffer[length - 1] == (byte) '\n') { length--; if (length > 0 && buffer[length - 1] == (byte) '\r') length--; } } // FIXME: This should be moved somewhere else... internal static bool TryParse (byte[] text, ref int index, int endIndex, out int value) { int startIndex = index; value = 0; while (index < endIndex && text[index] >= (byte) '0' && text[index] <= (byte) '9') { int digit = text[index] - (byte) '0'; if (value > int.MaxValue / 10) { // integer overflow return false; } if (value == int.MaxValue / 10 && digit > int.MaxValue % 10) { // integer overflow return false; } value = (value * 10) + digit; index++; } return index > startIndex; } // FIXME: Does this make sense to have here? Or should I have an extensions class for byte[] that has this? public bool TryParse (int startIndex, int endIndex, out int value) { int index = startIndex; return TryParse (buffer, ref index, endIndex, out value); } public void Dispose () { if (length != -1) { ArrayPool.Shared.Return (buffer); length = -1; } } } } ================================================ FILE: MailKit/CommandException.cs ================================================ // // CommandException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit { /// /// The exception that is thrown when there is a command error. /// /// /// A can be thrown by any of the various client /// methods in MailKit. Unlike a , a /// is typically non-fatal (meaning that it does /// not force the client to disconnect). /// #if SERIALIZABLE [Serializable] #endif public abstract class CommandException : Exception { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected CommandException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// An inner exception. protected CommandException (string message, Exception innerException) : base (message, innerException) { HelpLink = "https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog"; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. protected CommandException (string message) : base (message) { HelpLink = "https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog"; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// protected CommandException () { HelpLink = "https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog"; } } } ================================================ FILE: MailKit/CompressedStream.cs ================================================ // // CompressedStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Threading; using System.Threading.Tasks; using Org.BouncyCastle.Utilities.Zlib; namespace MailKit { /// /// A compressed stream. /// class CompressedStream : Stream { readonly ZStream zIn, zOut; bool eos, disposed; public CompressedStream (Stream innerStream) { InnerStream = innerStream; zOut = new ZStream (); zOut.deflateInit (5, true); zOut.next_out = new byte[4096]; zIn = new ZStream (); zIn.inflateInit (true); zIn.next_in = new byte[4096]; } /// /// Gets the inner stream. /// /// The inner stream. public Stream InnerStream { get; private set; } /// /// Gets whether the stream supports reading. /// /// if the stream supports reading; otherwise, . public override bool CanRead { get { return InnerStream.CanRead; } } /// /// Gets whether the stream supports writing. /// /// if the stream supports writing; otherwise, . public override bool CanWrite { get { return InnerStream.CanWrite; } } /// /// Gets whether the stream supports seeking. /// /// if the stream supports seeking; otherwise, . public override bool CanSeek { get { return false; } } /// /// Gets whether the stream supports I/O timeouts. /// /// if the stream supports I/O timeouts; otherwise, . public override bool CanTimeout { get { return InnerStream.CanTimeout; } } /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// The read timeout. public override int ReadTimeout { get { return InnerStream.ReadTimeout; } set { InnerStream.ReadTimeout = value; } } /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// The write timeout. public override int WriteTimeout { get { return InnerStream.WriteTimeout; } set { InnerStream.WriteTimeout = value; } } /// /// Gets or sets the position within the current stream. /// /// The current position within the stream. /// The position of the stream. /// /// The stream does not support seeking. /// public override long Position { get { throw new NotSupportedException (); } set { throw new NotSupportedException (); } } /// /// Gets the length in bytes of the stream. /// /// A long value representing the length of the stream in bytes. /// The length of the stream. /// /// The stream does not support seeking. /// public override long Length { get { throw new NotSupportedException (); } } static void ValidateArguments (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0 || count > (buffer.Length - offset)) throw new ArgumentOutOfRangeException (nameof (count)); } void CheckDisposed () { if (disposed) throw new ObjectDisposedException (nameof (CompressedStream)); } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// An I/O error occurred. /// public override int Read (byte[] buffer, int offset, int count) { CheckDisposed (); ValidateArguments (buffer, offset, count); if (count == 0) return 0; zIn.next_out = buffer; zIn.next_out_index = offset; zIn.avail_out = count; do { if (zIn.avail_in == 0 && !eos) { zIn.avail_in = InnerStream.Read (zIn.next_in, 0, zIn.next_in.Length); eos = zIn.avail_in == 0; zIn.next_in_index = 0; } int retval = zIn.inflate (JZlib.Z_FULL_FLUSH); if (retval == JZlib.Z_STREAM_END) break; if (eos && retval == JZlib.Z_BUF_ERROR) return 0; if (retval != JZlib.Z_OK) throw new IOException ("Error inflating: " + zIn.msg); } while (zIn.avail_out == count); return count - zIn.avail_out; } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// An I/O error occurred. /// public override async Task ReadAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); if (count == 0) return 0; zIn.next_out = buffer; zIn.next_out_index = offset; zIn.avail_out = count; do { if (zIn.avail_in == 0 && !eos) { cancellationToken.ThrowIfCancellationRequested (); zIn.avail_in = await InnerStream.ReadAsync (zIn.next_in, 0, zIn.next_in.Length, cancellationToken).ConfigureAwait (false); eos = zIn.avail_in == 0; zIn.next_in_index = 0; } int retval = zIn.inflate (JZlib.Z_FULL_FLUSH); if (retval == JZlib.Z_STREAM_END) break; if (eos && retval == JZlib.Z_BUF_ERROR) return 0; if (retval != JZlib.Z_OK) throw new IOException ("Error inflating: " + zIn.msg); } while (zIn.avail_out == count); return count - zIn.avail_out; } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Write (byte[] buffer, int offset, int count) { CheckDisposed (); ValidateArguments (buffer, offset, count); if (count == 0) return; zOut.next_in = buffer; zOut.next_in_index = offset; zOut.avail_in = count; do { zOut.avail_out = zOut.next_out.Length; zOut.next_out_index = 0; if (zOut.deflate (JZlib.Z_FULL_FLUSH) != JZlib.Z_OK) throw new IOException ("Error deflating: " + zOut.msg); InnerStream.Write (zOut.next_out, 0, zOut.next_out.Length - zOut.avail_out); } while (zOut.avail_in > 0 || zOut.avail_out == 0); } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// A task that represents the asynchronous write operation. /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override async Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); if (count == 0) return; zOut.next_in = buffer; zOut.next_in_index = offset; zOut.avail_in = count; do { cancellationToken.ThrowIfCancellationRequested (); zOut.avail_out = zOut.next_out.Length; zOut.next_out_index = 0; if (zOut.deflate (JZlib.Z_FULL_FLUSH) != JZlib.Z_OK) throw new IOException ("Error deflating: " + zOut.msg); await InnerStream.WriteAsync (zOut.next_out, 0, zOut.next_out.Length - zOut.avail_out, cancellationToken).ConfigureAwait (false); } while (zOut.avail_in > 0 || zOut.avail_out == 0); } /// /// Clears all output buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Flush () { CheckDisposed (); InnerStream.Flush (); } /// /// Clears all output buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// A task that represents the asynchronous flush operation. /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override Task FlushAsync (CancellationToken cancellationToken) { CheckDisposed (); return InnerStream.FlushAsync (cancellationToken); } /// /// Sets the position within the current stream. /// /// The new position within the stream. /// The offset into the stream relative to the . /// The origin to seek from. /// /// The stream does not support seeking. /// public override long Seek (long offset, SeekOrigin origin) { throw new NotSupportedException (); } /// /// Sets the length of the stream. /// /// The desired length of the stream in bytes. /// /// The stream does not support setting the length. /// public override void SetLength (long value) { throw new NotSupportedException (); } /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected override void Dispose (bool disposing) { if (disposing && !disposed) { InnerStream.Dispose (); disposed = true; zOut.free (); zIn.free (); } base.Dispose (disposing); } } } ================================================ FILE: MailKit/ConnectedEventArgs.cs ================================================ // // ConnectedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using MailKit.Security; namespace MailKit { /// /// Connected event arguments. /// /// /// When a is connected, it will emit a /// event. /// public class ConnectedEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The name of the host that the client connected to. /// The port that the client connected to on the remote host. /// The SSL/TLS options that were used when connecting to the remote host. public ConnectedEventArgs (string host, int port, SecureSocketOptions options) { Options = options; Host = host; Port = port; } /// /// Get the name of the remote host. /// /// /// Gets the name of the remote host. /// /// The host name of the server. public string Host { get; private set; } /// /// Get the port. /// /// /// Gets the port. /// /// The port. public int Port { get; private set; } /// /// Get the SSL/TLS options. /// /// /// Gets the SSL/TLS options. /// /// The SSL/TLS options. public SecureSocketOptions Options { get; private set; } } } ================================================ FILE: MailKit/DeliveryStatusNotification.cs ================================================ // // DeliveryStatusNotification.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Delivery status notification types. /// /// /// A set of flags that may be bitwise-or'd together to specify /// when a delivery status notification should be sent for a /// particular recipient. /// /// /// /// [Flags] public enum DeliveryStatusNotification { /// /// Never send delivery status notifications. /// Never = 0, /// /// Send a notification on successful delivery to the recipient. /// Success = (1 << 0), /// /// Send a notification on failure to deliver to the recipient. /// Failure = (1 << 1), /// /// Send a notification when the delivery to the recipient has /// been delayed for an unusual amount of time. /// Delay = (1 << 2) } } ================================================ FILE: MailKit/DeliveryStatusNotificationType.cs ================================================ // // DeliveryStatusNotificationReturnType.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // FIXME: Move this to the MailKit namespace. It wasn't ever supposed to be in MailKit.Net.Smtp! namespace MailKit.Net.Smtp { /// /// Delivery status notification type. /// /// /// The delivery status notification type specifies whether or not /// the full message should be included in any failed DSN issued for /// a message transmission as opposed to just the headers. /// /// /// /// public enum DeliveryStatusNotificationType { /// /// The return type is unspecified, allowing the server to choose. /// Unspecified, /// /// The full message should be included in any failed delivery status notification issued by the server. /// Full, /// /// Only the headers should be included in any failed delivery status notification issued by the server. /// HeadersOnly, } } ================================================ FILE: MailKit/DisconnectedEventArgs.cs ================================================ // // DisconnectedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit.Security; namespace MailKit { /// /// Disconnected event arguments. /// /// /// When a gets disconnected, it will emit a /// event. /// public class DisconnectedEventArgs : ConnectedEventArgs { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The name of the host that the client was connected to. /// The port that the client was connected to. /// The SSL/TLS options that were used by the client. /// If , the was disconnected via the /// method. public DisconnectedEventArgs (string host, int port, SecureSocketOptions options, bool requested) : base (host, port, options) { IsRequested = requested; } /// /// Get whether or not the service was explicitly asked to disconnect. /// /// /// If the was disconnected via the /// method, then /// the value of will be . If the connection was unexpectedly /// dropped, then the value will be . /// /// if the disconnect was explicitly requested; otherwise, . public bool IsRequested { get; private set; } } } ================================================ FILE: MailKit/DuplexStream.cs ================================================ // // DuplexStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Threading; using System.Threading.Tasks; namespace MailKit { /// /// A duplex stream. /// class DuplexStream : Stream { bool disposed; /// /// Initializes a new instance of the class. /// /// The stream to use for input. /// The stream to use for output. /// /// is . /// -or- /// is . /// public DuplexStream (Stream istream, Stream ostream) { if (istream == null) throw new ArgumentNullException (nameof (istream)); if (ostream == null) throw new ArgumentNullException (nameof (ostream)); InputStream = istream; OutputStream = ostream; } /// /// Gets the input stream. /// /// The input stream. public Stream InputStream { get; private set; } /// /// Gets the output stream. /// /// The output stream. public Stream OutputStream { get; private set; } /// /// Gets whether the stream supports reading. /// /// if the stream supports reading; otherwise, . public override bool CanRead { get { return true; } } /// /// Gets whether the stream supports writing. /// /// if the stream supports writing; otherwise, . public override bool CanWrite { get { return true; } } /// /// Gets whether the stream supports seeking. /// /// if the stream supports seeking; otherwise, . public override bool CanSeek { get { return false; } } /// /// Gets whether the stream supports I/O timeouts. /// /// if the stream supports I/O timeouts; otherwise, . public override bool CanTimeout { get { return InputStream.CanTimeout && OutputStream.CanTimeout; } } /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// The read timeout. public override int ReadTimeout { get { return InputStream.ReadTimeout; } set { InputStream.ReadTimeout = value; } } /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// The write timeout. public override int WriteTimeout { get { return OutputStream.WriteTimeout; } set { OutputStream.WriteTimeout = value; } } /// /// Gets or sets the position within the current stream. /// /// The current position within the stream. /// The position of the stream. /// /// The stream does not support seeking. /// public override long Position { get { throw new NotSupportedException (); } set { throw new NotSupportedException (); } } /// /// Gets the length in bytes of the stream. /// /// A long value representing the length of the stream in bytes. /// The length of the stream. /// /// The stream does not support seeking. /// public override long Length { get { throw new NotSupportedException (); } } static void ValidateArguments (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0 || count > (buffer.Length - offset)) throw new ArgumentOutOfRangeException (nameof (count)); } void CheckDisposed () { if (disposed) throw new ObjectDisposedException (nameof (DuplexStream)); } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// An I/O error occurred. /// public override int Read (byte[] buffer, int offset, int count) { CheckDisposed (); ValidateArguments (buffer, offset, count); return InputStream.Read (buffer, offset, count); } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// An I/O error occurred. /// public override Task ReadAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); return InputStream.ReadAsync (buffer, offset, count, cancellationToken); } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Write (byte[] buffer, int offset, int count) { CheckDisposed (); ValidateArguments (buffer, offset, count); OutputStream.Write (buffer, offset, count); } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// A task that represents the asynchronous write operation. /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); return OutputStream.WriteAsync (buffer, offset, count, cancellationToken); } /// /// Clears all output buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Flush () { CheckDisposed (); OutputStream.Flush (); } /// /// Clears all output buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// A task that represents the asynchronous flush operation. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override Task FlushAsync (CancellationToken cancellationToken) { CheckDisposed (); return OutputStream.FlushAsync (cancellationToken); } /// /// Sets the position within the current stream. /// /// The new position within the stream. /// The offset into the stream relative to the . /// The origin to seek from. /// /// The stream does not support seeking. /// public override long Seek (long offset, SeekOrigin origin) { throw new NotSupportedException (); } /// /// Sets the length of the stream. /// /// The desired length of the stream in bytes. /// /// The stream does not support setting the length. /// public override void SetLength (long value) { throw new NotSupportedException (); } /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected override void Dispose (bool disposing) { if (disposing && !disposed) { OutputStream.Dispose (); InputStream.Dispose (); disposed = true; } base.Dispose (disposing); } } } ================================================ FILE: MailKit/Envelope.cs ================================================ // // Envelope.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Linq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using MimeKit; using MimeKit.Utils; namespace MailKit { /// /// A message envelope containing a brief summary of the message. /// /// /// The envelope of a message contains information such as the /// date the message was sent, the subject of the message, /// the sender of the message, who the message was sent to, /// which message(s) the message may be in reply to, /// and the message id. /// public class Envelope { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public Envelope () { From = new InternetAddressList (); Sender = new InternetAddressList (); ReplyTo = new InternetAddressList (); To = new InternetAddressList (); Cc = new InternetAddressList (); Bcc = new InternetAddressList (); } /// /// Gets the address(es) that the message is from. /// /// /// Gets the address(es) that the message is from. /// /// The address(es) that the message is from. public InternetAddressList From { get; private set; } /// /// Gets the actual sender(s) of the message. /// /// /// The senders may differ from the addresses in if /// the message was sent by someone on behalf of someone else. /// /// The actual sender(s) of the message. public InternetAddressList Sender { get; private set; } /// /// Gets the address(es) that replies should be sent to. /// /// /// The senders of the message may prefer that replies are sent /// somewhere other than the address they used to send the message. /// /// The address(es) that replies should be sent to. public InternetAddressList ReplyTo { get; private set; } /// /// Gets the list of addresses that the message was sent to. /// /// /// Gets the list of addresses that the message was sent to. /// /// The address(es) that the message was sent to. public InternetAddressList To { get; private set; } /// /// Gets the list of addresses that the message was carbon-copied to. /// /// /// Gets the list of addresses that the message was carbon-copied to. /// /// The address(es) that the message was carbon-copied to. public InternetAddressList Cc { get; private set; } /// /// Gets the list of addresses that the message was blind-carbon-copied to. /// /// /// Gets the list of addresses that the message was blind-carbon-copied to. /// /// The address(es) that the message was carbon-copied to. public InternetAddressList Bcc { get; private set; } /// /// The Message-Id that the message is replying to. /// /// /// The Message-Id that the message is replying to. /// /// The Message-Id that the message is replying to. public string? InReplyTo { get; set; } /// /// Gets the date that the message was sent on, if available. /// /// /// Gets the date that the message was sent on, if available. /// /// The date the message was sent. public DateTimeOffset? Date { get; set; } /// /// Gets the ID of the message, if available. /// /// /// Gets the ID of the message, if available. /// /// The message identifier. public string? MessageId { get; set; } /// /// Gets the subject of the message. /// /// /// Gets the subject of the message. /// /// The subject. public string? Subject { get; set; } static void EncodeMailbox (StringBuilder builder, MailboxAddress mailbox) { builder.Append ('('); if (mailbox.Name != null) { MimeUtils.AppendQuoted (builder, mailbox.Name); builder.Append (' '); } else { builder.Append ("NIL "); } if (mailbox.Route.Count != 0) { MimeUtils.AppendQuoted (builder, mailbox.Route.ToString ()); builder.Append (' '); } else { builder.Append ("NIL "); } int at = mailbox.Address.LastIndexOf ('@'); if (at >= 0) { var domain = mailbox.Address.Substring (at + 1); var user = mailbox.Address.Substring (0, at); MimeUtils.AppendQuoted (builder, user); builder.Append (' '); MimeUtils.AppendQuoted (builder, domain); } else { MimeUtils.AppendQuoted (builder, mailbox.Address); builder.Append (" \"localhost\""); } builder.Append (')'); } static void EncodeInternetAddressListAddresses (StringBuilder builder, InternetAddressList addresses) { foreach (var addr in addresses) { if (addr is MailboxAddress mailbox) EncodeMailbox (builder, mailbox); else if (addr is GroupAddress group) EncodeGroup (builder, group); } } static void EncodeGroup (StringBuilder builder, GroupAddress group) { builder.Append ("(NIL NIL "); MimeUtils.AppendQuoted (builder, group.Name ?? string.Empty); builder.Append (" NIL)"); EncodeInternetAddressListAddresses (builder, group.Members); builder.Append ("(NIL NIL NIL NIL)"); } static void EncodeAddressList (StringBuilder builder, InternetAddressList list) { builder.Append ('('); EncodeInternetAddressListAddresses (builder, list); builder.Append (')'); } internal void Encode (StringBuilder builder) { builder.Append ('('); if (Date.HasValue) { builder.Append ('"'); builder.Append (DateUtils.FormatDate (Date.Value)); builder.Append ("\" "); } else { builder.Append ("NIL "); } if (Subject != null) { MimeUtils.AppendQuoted (builder, Subject); builder.Append (' '); } else { builder.Append ("NIL "); } if (From.Count > 0) { EncodeAddressList (builder, From); builder.Append (' '); } else { builder.Append ("NIL "); } if (Sender.Count > 0) { EncodeAddressList (builder, Sender); builder.Append (' '); } else { builder.Append ("NIL "); } if (ReplyTo.Count > 0) { EncodeAddressList (builder, ReplyTo); builder.Append (' '); } else { builder.Append ("NIL "); } if (To.Count > 0) { EncodeAddressList (builder, To); builder.Append (' '); } else { builder.Append ("NIL "); } if (Cc.Count > 0) { EncodeAddressList (builder, Cc); builder.Append (' '); } else { builder.Append ("NIL "); } if (Bcc.Count > 0) { EncodeAddressList (builder, Bcc); builder.Append (' '); } else { builder.Append ("NIL "); } if (InReplyTo != null) { string inReplyTo; if (InReplyTo.Length > 1 && InReplyTo[0] != '<' && InReplyTo[InReplyTo.Length - 1] != '>') inReplyTo = '<' + InReplyTo + '>'; else inReplyTo = InReplyTo; MimeUtils.AppendQuoted (builder, inReplyTo); builder.Append (' '); } else { builder.Append ("NIL "); } if (MessageId != null) { string messageId; if (MessageId.Length > 1 && MessageId[0] != '<' && MessageId[MessageId.Length - 1] != '>') messageId = '<' + MessageId + '>'; else messageId = MessageId; MimeUtils.AppendQuoted (builder, messageId); } else { builder.Append ("NIL"); } builder.Append (')'); } /// /// Returns a that represents the current . /// /// /// The returned string can be parsed by . /// The syntax of the string returned, while similar to IMAP's ENVELOPE syntax, /// is not completely compatible. /// /// A that represents the current . public override string ToString () { var builder = new StringBuilder (); Encode (builder); return builder.ToString (); } static bool IsNIL (string text, int index) { return string.Compare (text, index, "NIL", 0, 3, StringComparison.Ordinal) == 0; } static bool TryParse (string text, ref int index, out string? nstring) { nstring = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length) return false; if (text[index] != '"') { if (index + 3 <= text.Length && IsNIL (text, index)) { index += 3; return true; } return false; } var token = new StringBuilder (); bool escaped = false; index++; while (index < text.Length) { if (text[index] == '"' && !escaped) break; if (escaped || text[index] != '\\') { token.Append (text[index]); escaped = false; } else { escaped = true; } index++; } if (index >= text.Length) return false; nstring = token.ToString (); index++; return true; } static bool TryParse (string text, ref int index, out InternetAddress? addr) { addr = null; if (text[index] != '(') return false; index++; if (!TryParse (text, ref index, out string? name)) return false; if (!TryParse (text, ref index, out string? route)) return false; if (!TryParse (text, ref index, out string? user)) return false; if (!TryParse (text, ref index, out string? domain)) return false; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length || text[index] != ')') return false; index++; if (domain != null) { user ??= "NIL"; // Note: The serializer injects "localhost" as the domain when provided a UNIX mailbox or the special <> mailbox. var address = domain == "localhost" ? user : user + "@" + domain; if (route != null && DomainList.TryParse (route, out var domains)) addr = new MailboxAddress (name, domains, address); else addr = new MailboxAddress (name, address); } else if (user != null) { addr = new GroupAddress (user); } return true; } static bool TryParse (string text, ref int index, [NotNullWhen (true)] out InternetAddressList? list) { list = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length) return false; if (text[index] != '(') { if (index + 3 <= text.Length && IsNIL (text, index)) { list = new InternetAddressList (); index += 3; return true; } return false; } index++; if (index >= text.Length) return false; list = new InternetAddressList (); var stack = new List (); int sp = 0; stack.Add (list); do { if (text[index] == ')') break; if (!TryParse (text, ref index, out InternetAddress? addr)) return false; if (addr != null) { stack[sp].Add (addr); if (addr is GroupAddress group) { stack.Add (group.Members); sp++; } } else if (sp > 0) { stack.RemoveAt (sp); sp--; } while (index < text.Length && text[index] == ' ') index++; } while (index < text.Length); // Note: technically, we should check that sp == 0 as well, since all groups should // be popped off the stack, but in the interest of being liberal in what we accept, // we'll ignore that. if (index >= text.Length) return false; index++; return true; } internal static bool TryParse (string text, ref int index, out Envelope? envelope) { DateTimeOffset? date = null; envelope = null; while (index < text.Length && text[index] == ' ') index++; if (index >= text.Length || text[index] != '(') { if (index + 3 <= text.Length && IsNIL (text, index)) { index += 3; return true; } return false; } index++; if (!TryParse (text, ref index, out string? nstring)) return false; if (nstring != null) { if (!DateUtils.TryParse (nstring, out DateTimeOffset value)) return false; date = value; } if (!TryParse (text, ref index, out string? subject)) return false; if (!TryParse (text, ref index, out InternetAddressList? from)) return false; if (!TryParse (text, ref index, out InternetAddressList? sender)) return false; if (!TryParse (text, ref index, out InternetAddressList? replyto)) return false; if (!TryParse (text, ref index, out InternetAddressList? to)) return false; if (!TryParse (text, ref index, out InternetAddressList? cc)) return false; if (!TryParse (text, ref index, out InternetAddressList? bcc)) return false; if (!TryParse (text, ref index, out string? inreplyto)) return false; if (!TryParse (text, ref index, out string? messageid)) return false; if (index >= text.Length || text[index] != ')') return false; index++; envelope = new Envelope { Date = date, Subject = subject, From = from, Sender = sender, ReplyTo = replyto, To = to, Cc = cc, Bcc = bcc, InReplyTo = inreplyto != null ? MimeUtils.EnumerateReferences (inreplyto).FirstOrDefault () ?? inreplyto : null, MessageId = messageid != null ? MimeUtils.EnumerateReferences (messageid).FirstOrDefault () ?? messageid : null }; return true; } /// /// Tries to parse the given text into a new instance. /// /// /// Parses an Envelope value from the specified text. /// This syntax, while similar to IMAP's ENVELOPE syntax, is not /// completely compatible. /// /// , if the envelope was successfully parsed, otherwise. /// The text to parse. /// The parsed envelope. /// /// is . /// public static bool TryParse (string text, out Envelope? envelope) { if (text == null) throw new ArgumentNullException (nameof (text)); int index = 0; return TryParse (text, ref index, out envelope) && index == text.Length; } } } ================================================ FILE: MailKit/FetchRequest.cs ================================================ // // FetchRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// A request for fetching various properties of a message. /// /// /// A request for fetching various properties of a message. /// public class FetchRequest : IFetchRequest { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public FetchRequest () { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The items to fetch. public FetchRequest (MessageSummaryItems items) { Items = items; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The items to fetch. /// The specific set of headers to fetch. /// /// is . /// /// /// One or more of the specified is invalid. /// public FetchRequest (MessageSummaryItems items, IEnumerable headers) : this (items) { Headers = (headers is HeaderSet set) ? set : new HeaderSet (headers); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The items to fetch. /// The specific set of headers to fetch. /// /// is . /// /// /// One or more of the specified is invalid. /// public FetchRequest (MessageSummaryItems items, IEnumerable headers) : this (items) { Headers = (headers is HeaderSet set) ? set : new HeaderSet (headers); } /// /// Get or set the mod-sequence value that indicates the last known state of the messages being requested. /// /// /// Gets or sets the mod-sequence value that indicates the last known state of the messages being requested. /// If this property is set, the results returned by Fetch /// or FetchAsync will only include the message summaries which /// have a higher mod-sequence value than the one specified. /// If the mail store supports quick resynchronization and the application has enabled this feature via /// , then the Fetch or FetchAsync method /// will emit events for messages that were expunged from the folder after /// the change specified by the mod-sequence value. /// It should be noted that if another client has modified any message in the folder, the mail service may choose /// to return information that was not explicitly requested. It is therefore important to be prepared to handle both /// additional fields on a for messages that were requested as well as summaries for /// messages that were not requested at all. /// /// The mod-sequence value that indicates the last known state of the messages being requested. public ulong? ChangedSince { get; set; } /// /// Get or set the message summary items to fetch. /// /// /// Gets or sets the message summary items to fetch. /// /// The message summary items. public MessageSummaryItems Items { get; set; } /// /// Get the set of headers that will be fetched. /// /// /// Gets the set of headers that will be fetched. /// /// The set of headers to be fetched. public HeaderSet? Headers { get; set; } #if ENABLE_LAZY_PREVIEW_API /// /// Get or set options to use when fetching . /// /// /// Gets or sets options to use when fetching . /// These options are only used if includes the /// value. /// public PreviewOptions PreviewOptions { get; set; } #endif } } ================================================ FILE: MailKit/FolderAccess.cs ================================================ // // FolderMode.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// A folder access mode. /// /// /// A folder access mode. /// /// /// /// public enum FolderAccess { /// /// The folder is not open. /// None, /// /// The folder is read-only. /// ReadOnly, /// /// The folder is read/write. /// ReadWrite } } ================================================ FILE: MailKit/FolderAttributes.cs ================================================ // // FolderAttributes.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Folder attributes as used by . /// /// /// Folder attributes as used by . /// [Flags] public enum FolderAttributes { /// /// The folder does not have any attributes. /// None = 0, /// /// It is not possible for any subfolders to exist under the folder. /// NoInferiors = (1 << 0), /// /// It is not possible to select the folder. /// NoSelect = (1 << 1), /// /// The folder has been marked as possibly containing new messages /// since the folder was last selected. /// Marked = (1 << 2), /// /// The folder does not contain any new messages since the folder /// was last selected. /// Unmarked = (1 << 3), /// /// The folder does not exist, but is simply a place-holder. /// NonExistent = (1 << 4), /// /// The folder is subscribed. /// Subscribed = (1 << 5), /// /// The folder is remote. /// Remote = (1 << 6), /// /// The folder has subfolders. /// HasChildren = (1 << 7), /// /// The folder does not have any subfolders. /// HasNoChildren = (1 << 8), /// /// The folder is a special "All" folder containing an aggregate of all messages. /// All = (1 << 9), /// /// The folder is a special "Archive" folder. /// Archive = (1 << 10), /// /// The folder is the special "Drafts" folder. /// Drafts = (1 << 11), /// /// The folder is the special "Flagged" folder. /// Flagged = (1 << 12), /// /// The folder is the special "Important" folder. /// Important = (1 << 13), /// /// The folder is the special "Inbox" folder. /// Inbox = (1 << 14), /// /// The folder is the special "Junk" folder. /// Junk = (1 << 15), /// /// The folder is the special "Sent" folder. /// Sent = (1 << 16), /// /// The folder is the special "Trash" folder. /// Trash = (1 << 17), } } ================================================ FILE: MailKit/FolderCreatedEventArgs.cs ================================================ // // FolderCreatedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Event args used when a is created. /// /// /// Event args used when a is created. /// public class FolderCreatedEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The newly created folder. /// /// is . /// public FolderCreatedEventArgs (IMailFolder folder) { if (folder == null) throw new ArgumentNullException (nameof (folder)); Folder = folder; } /// /// Get the folder that was just created. /// /// /// Gets the folder that was just created. /// /// The folder. public IMailFolder Folder { get; private set; } } } ================================================ FILE: MailKit/FolderFeature.cs ================================================ // // FolderFeature.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// An optional feature that an may support. /// /// /// An optional feature that an may support. /// public enum FolderFeature { /// /// Indicates that the folder supports access rights. /// AccessRights, /// /// Indicates that the folder allows arbitrary annotations to be set on a message. /// Annotations, /// /// Indicates that the folder allows arbitrary metadata to be set. /// Metadata, /// /// Indicates that the folder uses modification sequences for every state change of a message. /// ModSequences, /// /// Indicates that the folder supports quick resynchronization when opening. /// QuickResync, /// /// Indicates that the folder supports quotas. /// Quotas, /// /// Indicates that the folder supports sorting messages. /// Sorting, /// /// Indicates that the folder supports threading messages. /// Threading, /// /// Indicates that the folder supports the use of UTF-8. /// UTF8, } } ================================================ FILE: MailKit/FolderNamespace.cs ================================================ // // FolderNamespace.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// A folder namespace. /// /// /// A folder namespace. /// public class FolderNamespace { /// /// The directory separator for this folder namespace. /// /// /// The directory separator for this folder namespace. /// public readonly char DirectorySeparator; /// /// The base path for this folder namespace. /// /// /// The base path for this folder namespace. /// public readonly string Path; /// /// Initializes a new instance of the class. /// /// /// Creates a new folder namespace. /// /// The directory separator. /// The folder path. /// /// is . /// public FolderNamespace (char directorySeparator, string path) { if (path == null) throw new ArgumentNullException (nameof (path)); DirectorySeparator = directorySeparator; Path = path; } } } ================================================ FILE: MailKit/FolderNamespaceCollection.cs ================================================ // // FolderNamespaceCollection.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Collections; using System.Collections.Generic; using MimeKit.Utils; namespace MailKit { /// /// A read-only collection of folder namespaces. /// /// /// A read-only collection of folder namespaces. /// public class FolderNamespaceCollection : IEnumerable { readonly List namespaces; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public FolderNamespaceCollection () { namespaces = new List (); } #region ICollection implementation /// /// Gets the number of folder namespaces contained in the collection. /// /// /// Gets the number of folder namespaces contained in the collection. /// /// The count. public int Count { get { return namespaces.Count; } } /// /// Adds the specified namespace. /// /// /// Adds the specified namespace. /// /// The namespace to add. /// /// is . /// public void Add (FolderNamespace @namespace) { if (@namespace == null) throw new ArgumentNullException (nameof (@namespace)); namespaces.Add (@namespace); } /// /// Removes all namespaces from the collection. /// /// /// Removes all namespaces from the collection. /// public void Clear () { namespaces.Clear (); } /// /// Checks if the collection contains the specified namespace. /// /// /// Checks if the collection contains the specified namespace. /// /// if the specified namespace exists; /// otherwise, . /// The namespace. /// /// is . /// public bool Contains (FolderNamespace @namespace) { if (@namespace == null) throw new ArgumentNullException (nameof (@namespace)); return namespaces.Contains (@namespace); } /// /// Removes the first occurrence of the specified namespace. /// /// /// Removes the first occurrence of the specified namespace. /// /// if the first occurrence of the specified /// namespace was removed; otherwise, . /// The namespace. /// /// is . /// public bool Remove (FolderNamespace @namespace) { if (@namespace == null) throw new ArgumentNullException (nameof (@namespace)); return namespaces.Remove (@namespace); } /// /// Gets the at the specified index. /// /// /// Gets the at the specified index. /// /// The folder namespace at the specified index. /// The index. /// /// is . /// /// /// is out of range. /// public FolderNamespace this [int index] { get { if (index < 0 || index >= namespaces.Count) throw new ArgumentOutOfRangeException (nameof (index)); return namespaces[index]; } set { if (index < 0 || index >= namespaces.Count) throw new ArgumentOutOfRangeException (nameof (index)); if (value == null) throw new ArgumentNullException (nameof (value)); namespaces[index] = value; } } #endregion #region IEnumerable implementation /// /// Gets the enumerator. /// /// /// Gets the enumerator. /// /// The enumerator. public IEnumerator GetEnumerator () { return namespaces.GetEnumerator (); } #endregion #region IEnumerable implementation /// /// Gets the enumerator. /// /// /// Gets the enumerator. /// /// The enumerator. IEnumerator IEnumerable.GetEnumerator () { return namespaces.GetEnumerator (); } #endregion static bool Escape (char directorySeparator) { return directorySeparator == '\\' || directorySeparator == '"'; } /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { var builder = new StringBuilder (); builder.Append ('('); for (int i = 0; i < namespaces.Count; i++) { builder.Append ("(\""); if (Escape (namespaces[i].DirectorySeparator)) builder.Append ('\\'); builder.Append (namespaces[i].DirectorySeparator); builder.Append ("\" "); MimeUtils.AppendQuoted (builder, namespaces[i].Path); builder.Append (')'); } builder.Append (')'); return builder.ToString (); } } } ================================================ FILE: MailKit/FolderNotFoundException.cs ================================================ // // FolderNotFoundException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit { /// /// The exception that is thrown when a folder could not be found. /// /// /// This exception is thrown by . /// #if SERIALIZABLE [Serializable] #endif public class FolderNotFoundException : Exception { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Deserializes a . /// /// The serialization info. /// The streaming context. /// /// is . /// [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected FolderNotFoundException (SerializationInfo info, StreamingContext context) : base (info, context) { FolderName = info.GetString ("FolderName"); } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// The name of the folder. /// The inner exception. /// /// is . /// public FolderNotFoundException (string message, string folderName, Exception innerException) : base (message, innerException) { if (folderName == null) throw new ArgumentNullException (nameof (folderName)); FolderName = folderName; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// The name of the folder. /// /// is . /// public FolderNotFoundException (string message, string folderName) : base (message) { if (folderName == null) throw new ArgumentNullException (nameof (folderName)); FolderName = folderName; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The name of the folder. /// /// is . /// public FolderNotFoundException (string folderName) : this ("The requested folder could not be found.", folderName) { } /// /// Gets the name of the folder that could not be found. /// /// /// Gets the name of the folder that could not be found. /// /// The name of the folder. public string FolderName { get; private set; } #if SERIALIZABLE /// /// When overridden in a derived class, sets the /// with information about the exception. /// /// /// Serializes the state of the . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecurityCritical] #if NET8_0_OR_GREATER [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] #endif public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("FolderName", FolderName); } #endif } } ================================================ FILE: MailKit/FolderNotOpenException.cs ================================================ // // FolderNotOpenException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Runtime.Serialization; #endif namespace MailKit { /// /// The exception that is thrown when a folder is not open. /// /// /// This exception is thrown when an operation on a folder could not be completed /// due to the folder being in a closed state. For example, the /// /// method will throw a if the folder is not /// current open. /// #if SERIALIZABLE [Serializable] #endif public class FolderNotOpenException : InvalidOperationException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Deserializes a . /// /// The serialization info. /// The streaming context. /// /// is . /// [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected FolderNotOpenException (SerializationInfo info, StreamingContext context) : base (info, context) { var value = info.GetString ("FolderAccess"); if (!Enum.TryParse (value, out FolderAccess access)) FolderAccess = FolderAccess.ReadOnly; else FolderAccess = access; FolderName = info.GetString ("FolderName"); } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The folder name. /// The minimum folder access required by the operation. /// The error message. /// The inner exception. /// /// is . /// public FolderNotOpenException (string folderName, FolderAccess access, string message, Exception innerException) : base (message, innerException) { if (folderName == null) throw new ArgumentNullException (nameof (folderName)); FolderName = folderName; FolderAccess = access; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The folder name. /// The minimum folder access required by the operation. /// The error message. /// /// is . /// public FolderNotOpenException (string folderName, FolderAccess access, string message) : base (message) { if (folderName == null) throw new ArgumentNullException (nameof (folderName)); FolderName = folderName; FolderAccess = access; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The folder name. /// The minimum folder access required by the operation. /// /// is . /// public FolderNotOpenException (string folderName, FolderAccess access) : this (folderName, access, GetDefaultMessage (access)) { } /// /// Get the name of the folder. /// /// /// Gets the name of the folder. /// /// The name of the folder. public string FolderName { get; private set; } /// /// Get the minimum folder access required by the operation. /// /// /// Gets the minimum folder access required by the operation. /// /// The minimum required folder access. public FolderAccess FolderAccess { get; private set; } static string GetDefaultMessage (FolderAccess access) { if (access == FolderAccess.ReadWrite) return "The folder is not currently open in read-write mode."; return "The folder is not currently open."; } #if SERIALIZABLE /// /// When overridden in a derived class, sets the /// with information about the exception. /// /// /// Serializes the state of the . /// /// The serialization info. /// The streaming context. /// /// is . /// #if NET8_0_OR_GREATER [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] #endif public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("FolderAccess", FolderAccess.ToString ()); info.AddValue ("FolderName", FolderName); } #endif } } ================================================ FILE: MailKit/FolderQuota.cs ================================================ // // FolderQuota.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// A folder quota. /// /// /// A is returned by . /// /// /// /// public class FolderQuota { /// /// Initializes a new instance of the class. /// /// /// Creates a new with the specified root. /// /// The quota root. public FolderQuota (IMailFolder? quotaRoot) { QuotaRoot = quotaRoot; } /// /// Get the quota root. /// /// /// Gets the quota root. If the quota root is , then /// it suggests that the folder does not have a quota. /// /// /// /// /// The quota root. public IMailFolder? QuotaRoot { get; private set; } /// /// Get or set the message limit. /// /// /// Gets or sets the message limit. /// /// /// /// /// The message limit. public uint? MessageLimit { get; set; } /// /// Get or set the storage limit, in kilobytes. /// /// /// Gets or sets the storage limit, in kilobytes. /// /// /// /// /// The storage limit, in kilobytes. public uint? StorageLimit { get; set; } /// /// Get or set the current message count. /// /// /// Gets or sets the current message count. /// /// /// /// /// The current message count. public uint? CurrentMessageCount { get; set; } /// /// Gets or sets the size of the current storage, in kilobytes. /// /// /// Gets or sets the size of the current storage, in kilobytes. /// /// /// /// /// The size of the current storage, in kilobytes. public uint? CurrentStorageSize { get; set; } } } ================================================ FILE: MailKit/FolderRenamedEventArgs.cs ================================================ // // FolderRenamedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Event args used when a is renamed. /// /// /// Event args used when a is renamed. /// public class FolderRenamedEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The old name of the folder. /// The new name of the folder. /// /// is . /// -or- /// is . /// public FolderRenamedEventArgs (string oldName, string newName) { if (oldName == null) throw new ArgumentNullException (nameof (oldName)); if (newName == null) throw new ArgumentNullException (nameof (newName)); OldName = oldName; NewName = newName; } /// /// The old name of the folder. /// /// /// The old name of the folder. /// /// The old name. public string OldName { get; private set; } /// /// The new name of the folder. /// /// /// The new name of the folder. /// /// The new name. public string NewName { get; private set; } } } ================================================ FILE: MailKit/HeaderSet.cs ================================================ // // HeaderSet.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// A set of headers. /// /// /// A set of headers. /// public class HeaderSet : ICollection { const string AtomSafeCharacters = "!#$%&'*+-/=?^_`{|}~"; /// /// A set of headers that only includes all headers. /// /// /// When used with a , this pre-computed set of headers can be used /// to fetch the entire list of headers for a message. /// public static readonly HeaderSet All = new HeaderSet () { Exclude = true, IsReadOnly = true }; /// /// A set of headers that only includes the standard envelope headers. /// /// /// When used with a , this pre-computed set of headers can be used /// to fetch the standard envelope headers for a message. /// public static readonly HeaderSet Envelope = new HeaderSet (new HeaderId[] { HeaderId.Sender, HeaderId.From, HeaderId.ReplyTo, HeaderId.To, HeaderId.Cc, HeaderId.Bcc, HeaderId.Subject, HeaderId.Date, HeaderId.MessageId, HeaderId.InReplyTo }) { IsReadOnly = true }; /// /// A set of headers that only includes the References header. /// /// /// When used with a , this pre-computed set of headers can be used /// to fetch the References header for a message. Generally, this should be used in /// combination with in order to have all of the /// information needed to thread messages using the /// threading algorithm. /// public static readonly HeaderSet References = new HeaderSet (new HeaderId[] { HeaderId.References }) { IsReadOnly = true }; readonly HashSet hash = new HashSet (StringComparer.Ordinal); bool exclude; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public HeaderSet () { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The headers to include. public HeaderSet (IEnumerable headers) { AddRange (headers); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The headers to include. public HeaderSet (IEnumerable headers) { AddRange (headers); } void CheckReadOnly () { if (IsReadOnly) throw new InvalidOperationException ("The HeaderSet is read-only."); } /// /// Get the number of headers in the set. /// /// /// Gets the number of headers in the set. /// /// The number of headers. public int Count { get { return hash.Count; } } /// /// Get or set whether this set of headers is meant to be excluded when used with a . /// /// /// Get or set whether this set of headers is meant to be excluded when used with a . /// /// if the headers are meant to be excluded; otherwise, . /// /// The operation is invalid because the is read-only. /// public bool Exclude { get { return exclude; } set { CheckReadOnly (); exclude = value; } } /// /// Get whether or not the set of headers is read-only. /// /// /// Gets whether or not the set of headers is read-only. /// /// if this instance is read only; otherwise, . public bool IsReadOnly { get; private set; } static bool IsAsciiAtom (char c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || AtomSafeCharacters.IndexOf (c) != -1; } static bool IsValid (string header) { if (header.Length == 0) return false; for (int i = 0; i < header.Length; i++) { if (header[i] < 127 && !IsAsciiAtom (header[i])) return false; } return true; } /// /// Add the specified header. /// /// /// Adds the specified header to the set of headers. /// /// if the header was added to the set; otherwise, . /// The header to add. /// /// is not a valid . /// /// /// The operation is invalid because the is read-only. /// public bool Add (HeaderId header) { if (header == HeaderId.Unknown) throw new ArgumentOutOfRangeException (nameof (header)); CheckReadOnly (); return hash.Add (header.ToHeaderName ().ToUpperInvariant ()); } /// /// Add the specified header. /// /// /// Adds the specified header to the set of headers. /// /// if the header was added to the set; otherwise, . /// The header to add. /// /// is . /// /// /// The operation is invalid because the is read-only. /// public bool Add (string header) { if (header == null) throw new ArgumentNullException (nameof (header)); if (!IsValid (header)) throw new ArgumentException ("The header field is invalid.", nameof (header)); CheckReadOnly (); return hash.Add (header.ToUpperInvariant ()); } /// /// Add the specified header. /// /// /// Adds the specified header to the set of headers. /// /// The header to add. /// /// is . /// /// /// The operation is invalid because the is read-only. /// void ICollection.Add (string item) { Add (item); } /// /// Add a collection of headers. /// /// /// Adds the specified headers to the set of headers. /// /// The headers to add. /// /// is . /// /// /// One or more of the specified is invalid. /// /// /// The operation is invalid because the is read-only. /// public void AddRange (IEnumerable headers) { if (headers == null) throw new ArgumentNullException (nameof (headers)); CheckReadOnly (); foreach (var header in headers) { if (header == HeaderId.Unknown) throw new ArgumentException ("One or more of the headers is invalid.", nameof (headers)); hash.Add (header.ToHeaderName ().ToUpperInvariant ()); } } /// /// Add a collection of headers. /// /// /// Adds the specified headers to the set of headers. /// /// The headers to add. /// /// is . /// /// /// One or more of the specified is invalid. /// /// /// The operation is invalid because the is read-only. /// public void AddRange (IEnumerable headers) { if (headers == null) throw new ArgumentNullException (nameof (headers)); CheckReadOnly (); foreach (var header in headers) { if (header == null || !IsValid (header)) throw new ArgumentException ("One or more of the headers is invalid.", nameof (headers)); hash.Add (header.ToUpperInvariant ()); } } /// /// Clear the set of headers. /// /// /// Clears the set of headers. /// /// /// The operation is invalid because the is read-only. /// public void Clear () { CheckReadOnly (); hash.Clear (); } /// /// Copy all of the headers in the to the specified array. /// /// /// Copies all of the headers within the into the array, /// starting at the specified array index. /// /// The array to copy the headers to. /// The index into the array. /// /// is . /// /// /// is out of range. /// public void CopyTo (string[] array, int arrayIndex) { hash.CopyTo (array, arrayIndex); } /// /// Check if the set of headers contains the specified header. /// /// /// Determines whether or not the set of headers contains the specified header. /// /// if the specified header exists; /// otherwise, . /// The header identifier. /// /// is not a valid . /// public bool Contains (HeaderId header) { if (header == HeaderId.Unknown) throw new ArgumentOutOfRangeException (nameof (header)); return hash.Contains (header.ToHeaderName ().ToUpperInvariant ()); } /// /// Check if the set of headers contains the specified header. /// /// /// Determines whether or not the set of headers contains the specified header. /// /// if the specified header exists; /// otherwise, . /// The name of the header. /// /// is . /// public bool Contains (string header) { if (header == null) throw new ArgumentNullException (nameof (header)); return hash.Contains (header.ToUpperInvariant ()); } /// /// Remove the specified header. /// /// /// Removes the specified header if it exists. /// /// if the specified header was removed; /// otherwise, . /// The header. /// /// is not a valid . /// /// /// The operation is invalid because the is read-only. /// public bool Remove (HeaderId header) { if (header == HeaderId.Unknown) throw new ArgumentOutOfRangeException (nameof (header)); CheckReadOnly (); return hash.Remove (header.ToHeaderName ().ToUpperInvariant ()); } /// /// Remove the specified header. /// /// /// Removes the specified header if it exists. /// /// if the specified header was removed; /// otherwise, . /// The header. /// /// is . /// /// /// The operation is invalid because the is read-only. /// public bool Remove (string header) { if (header == null) throw new ArgumentNullException (nameof (header)); CheckReadOnly (); return hash.Remove (header.ToUpperInvariant ()); } /// /// Get an enumerator for the set of headers. /// /// /// Gets an enumerator for the set of headers. /// /// The enumerator. public IEnumerator GetEnumerator () { return hash.GetEnumerator (); } /// /// Get an enumerator for the set of headers. /// /// /// Gets an enumerator for the set of headers. /// /// The enumerator. IEnumerator IEnumerable.GetEnumerator () { return hash.GetEnumerator (); } } } ================================================ FILE: MailKit/IAppendRequest.cs ================================================ // // IAppendRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// A request for appending a message to a folder. /// /// /// A request for appending a message to a folder. /// public interface IAppendRequest { /// /// Get the message that should be appended to the folder. /// /// /// Gets the message that should be appended to the folder. /// /// The message. MimeMessage Message { get; } /// /// Get or set the message flags that should be set on the message. /// /// /// Gets or sets the message flags that should be set on the message. /// /// The message flags. MessageFlags Flags { get; set; } /// /// Get or set the keywords that should be set on the message. /// /// /// Gets or sets the keywords that should be set on the message. /// /// The keywords. ISet? Keywords { get; set; } /// /// Get or set the timestamp that should be used by folder as the . /// /// /// Gets or sets the timestamp that should be used by folder as the . /// /// The date and time to use for the INTERNALDATE or if it should be left up to the folder to decide. DateTimeOffset? InternalDate { get; set; } /// /// Get or set the list of annotations that should be set on the message. /// /// /// Gets or sets the list of annotations that should be set on the message. /// /// This feature is not supported by all folders. /// Use with the enum value /// to determine if this feature is supported. /// /// /// The list of annotations. IList? Annotations { get; set; } /// /// Get or set the transfer progress reporting mechanism. /// /// /// Gets or sets the transfer progress reporting mechanism. /// /// The transfer progress mechanism. ITransferProgress? TransferProgress { get; set; } } } ================================================ FILE: MailKit/IAuthenticationSecretDetector.cs ================================================ // // IAuthenticationSecretDetector.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit { /// /// An authentication secret. /// /// /// An authentication secret. /// public struct AuthenticationSecret { /// /// Get the starting offset of the secret within a buffer. /// /// /// Gets the starting offset of the secret within a buffer. /// /// The start offset of the secret. public int StartIndex { get; private set; } /// /// Get the length of the secret within a buffer. /// /// /// Gets the length of the secret within a buffer. /// /// The length of the secret. public int Length { get; private set; } /// /// Create a new . /// /// /// Creates a new . /// /// The start index of the secret. /// The length of the secret. public AuthenticationSecret (int startIndex, int length) { StartIndex = startIndex; Length = length; } } /// /// An interface for detecting authentication secrets. /// /// /// An interface for detecting authentication secrets. /// public interface IAuthenticationSecretDetector { /// /// Detect a list of secrets within a buffer. /// /// /// Detects a list of secrets within a buffer. /// /// The buffer. /// The buffer offset. /// The length of the buffer. /// A list of secrets. IList DetectSecrets (byte[] buffer, int offset, int count); } } ================================================ FILE: MailKit/IFetchRequest.cs ================================================ // // IFetchRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// A request for fetching various properties of a message. /// /// /// A request for fetching various properties of a message. /// public interface IFetchRequest { /// /// Get or set the mod-sequence value that indicates the last known state of the messages being requested. /// /// /// Gets or sets the mod-sequence value that indicates the last known state of the messages being requested. /// If this property is set, the results returned by Fetch /// or FetchAsync will only include the message summaries which /// have a higher mod-sequence value than the one specified. /// If the mail store supports quick resynchronization and the application has enabled this feature via /// , then the Fetch or FetchAsync method /// will emit events for messages that were expunged from the folder after /// the change specified by the mod-sequence value. /// It should be noted that if another client has modified any message in the folder, the mail service may choose /// to return information that was not explicitly requested. It is therefore important to be prepared to handle both /// additional fields on a for messages that were requested as well as summaries for /// messages that were not requested at all. /// /// The mod-sequence value that indicates the last known state of the messages being requested. ulong? ChangedSince { get; set; } /// /// Get or set the message summary items to fetch. /// /// /// Gets or sets the message summary items to fetch. /// /// The message summary items. MessageSummaryItems Items { get; set; } /// /// Get the set of headers that will be fetched. /// /// /// Gets the set of headers that will be fetched. /// /// The set of headers to be fetched. HeaderSet? Headers { get; } #if ENABLE_LAZY_PREVIEW_API /// /// Get the options to use when fetching . /// /// /// Gets the options to use when fetching . /// These options are only used if includes the /// value. /// PreviewOptions PreviewOptions { get; } #endif } } ================================================ FILE: MailKit/IMailFolder.cs ================================================ // // IMailFolder.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; using MailKit.Search; #if NET5_0_OR_GREATER using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet; #else using IReadOnlySetOfStrings = System.Collections.Generic.ISet; #endif namespace MailKit { /// /// An interface for a mailbox folder as used by . /// /// /// Implemented by message stores such as /// public interface IMailFolder : IEnumerable { /// /// Gets an object that can be used to synchronize access to the folder. /// /// /// Gets an object that can be used to synchronize access to the folder. /// /// The sync root. object SyncRoot { get; } /// /// Get the parent folder. /// /// /// Root-level folders do not have a parent folder. /// /// The parent folder. IMailFolder? ParentFolder { get; } /// /// Get the folder attributes. /// /// /// Gets the folder attributes. /// /// The folder attributes. FolderAttributes Attributes { get; } /// /// Get the annotation access level. /// /// /// If annotations are supported, this property can be used to determine whether or not /// the supports reading and writing annotations. /// /// The annotation access level. AnnotationAccess AnnotationAccess { get; } /// /// Get the supported annotation scopes. /// /// /// If annotations are supported, this property can be used to determine which /// annotation scopes are supported by the . /// /// The supported annotation scopes. AnnotationScope AnnotationScopes { get; } /// /// Get the maximum size of annotation values supported by the folder. /// /// /// If annotations are supported, this property can be used to determine the /// maximum size of annotation values supported by the . /// /// The maximum size of annotation values supported by the folder. uint MaxAnnotationSize { get; } /// /// Get the permanent flags. /// /// /// The permanent flags are the message flags that will persist between sessions. /// If the flag is set, then the folder allows /// storing of user-defined (custom) message flags. /// /// The permanent flags. MessageFlags PermanentFlags { get; } /// /// Get the permanent keywords. /// /// /// The permanent keywords are the keywords that will persist between sessions. /// If the flag is set in , /// then the folder allows storing of user-defined keywords as well. /// /// The permanent keywords. IReadOnlySetOfStrings PermanentKeywords { get; } /// /// Get the accepted flags. /// /// /// The accepted flags are the message flags that will be accepted and persist /// for the current session. For the set of flags that will persist between /// sessions, see the property. /// /// The accepted flags. MessageFlags AcceptedFlags { get; } /// /// Get the accepted keywords. /// /// /// The accepted keywords are the keywords that will be accepted and persist /// for the current session. For the set of keywords that will persist between /// sessions, see the property. /// /// The accepted keywords. IReadOnlySetOfStrings AcceptedKeywords { get; } /// /// Get the directory separator. /// /// /// Gets the directory separator. /// /// The directory separator. char DirectorySeparator { get; } /// /// Get the read/write access of the folder. /// /// /// Gets the read/write access of the folder. /// /// The read/write access. FolderAccess Access { get; } /// /// Get whether or not the folder is a namespace folder. /// /// /// Gets whether or not the folder is a namespace folder. /// /// if the folder is a namespace folder; otherwise, . bool IsNamespace { get; } /// /// Get the full name of the folder. /// /// /// This is the equivalent of the full path of a file on a file system. /// /// The full name of the folder. string FullName { get; } /// /// Get the name of the folder. /// /// /// This is the equivalent of the file name of a file on the file system. /// /// The name of the folder. string Name { get; } /// /// Get the unique identifier for the folder, if available. /// /// /// Gets a unique identifier for the folder, if available. This is useful for clients /// implementing a message cache that want to track the folder after it is renamed by another /// client. /// This property will only be available if the server supports the /// OBJECTID extension. /// /// The unique folder identifier. string? Id { get; } /// /// Get whether or not the folder is subscribed. /// /// /// Gets whether or not the folder is subscribed. /// /// if the folder is subscribed; otherwise, . bool IsSubscribed { get; } /// /// Get whether or not the folder is currently open. /// /// /// Gets whether or not the folder is currently open. /// /// if the folder is currently open; otherwise, . bool IsOpen { get; } /// /// Get whether or not the folder can be opened. /// /// /// Gets whether or not the folder can be opened. /// /// if the folder can be opened; otherwise, . bool CanOpen { get; } /// /// Get whether or not the folder exists. /// /// /// Gets whether or not the folder exists. /// /// if the folder exists; otherwise, . bool Exists { get; } /// /// Get the highest mod-sequence value of all messages in the mailbox. /// /// /// Gets the highest mod-sequence value of all messages in the mailbox. /// /// The highest mod-sequence value. ulong HighestModSeq { get; } /// /// Get the Unique ID validity. /// /// /// UIDs are only valid so long as the UID validity value remains unchanged. If and when /// the folder's is changed, a client MUST discard its cache of UIDs /// along with any summary information that it may have and re-query the folder. /// The will only be set after the folder has been opened. /// /// The UID validity. uint UidValidity { get; } /// /// Get the UID that the next message that is added to the folder will be assigned. /// /// /// This value will only be set after the folder has been opened. /// /// The next UID. UniqueId? UidNext { get; } /// /// Get the maximum size of a message that can be appended to the folder. /// /// /// Gets the maximum size of a message that can be appended to the folder. /// If the value is not set, then the limit is unspecified. /// /// The append limit. uint? AppendLimit { get; } /// /// Get the size of the folder. /// /// /// Gets the size of the folder in bytes. /// If the value is not set, then the size is unspecified. /// /// The size of the folder, in bytes. ulong? Size { get; } /// /// Get the index of the first unread message in the folder. /// /// /// Gets the index of the first unread message in the folder. /// This value will only be set after the folder has been opened. /// A value of -1 indicates that there are no unread messages in the folder or that the server /// has not provided the index of the first unread message. /// /// The index of the first unread message or -1 if there are no unread messages in the folder. int FirstUnread { get; } /// /// Get the number of unread messages in the folder. /// /// /// Gets the number of unread messages in the folder. /// This value will only be set after calling /// /// with . /// /// The number of unread messages. int Unread { get; } /// /// Get the number of recently delivered messages in the folder. /// /// /// Gets the number of recently delivered messages in the folder. /// /// This value will only be set after calling /// /// with . /// /// The number of recently delivered messages. int Recent { get; } /// /// Get the total number of messages in the folder. /// /// /// Gets the total number of messages in the folder. /// /// /// /// /// The total number of messages. int Count { get; } /// /// Get the threading algorithms supported by the folder. /// /// /// Gets the threading algorithms supported by the folder. /// /// The supported threading algorithms. HashSet ThreadingAlgorithms { get; } /// /// Determine whether or not an supports a feature. /// /// /// Determines whether or not an supports a feature. /// /// The desired feature. /// if the feature is supported; otherwise, . bool Supports (FolderFeature feature); /// /// Opens the folder using the requested folder access. /// /// /// This variant of the /// method is meant for quick resynchronization of the folder. Before calling this method, /// the method MUST be called. /// You should also make sure to add listeners to the and /// events to get notifications of changes since /// the last time the folder was opened. /// /// The state of the folder. /// The requested folder access. /// The last known value. /// The last known value. /// The last known list of unique message identifiers. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The quick resynchronization feature has not been enabled. /// /// /// The mail store does not support the quick resynchronization feature. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// FolderAccess Open (FolderAccess access, uint uidValidity, ulong highestModSeq, IList uids, CancellationToken cancellationToken = default); /// /// Asynchronously opens the folder using the requested folder access. /// /// /// This variant of the /// method is meant for quick resynchronization of the folder. Before calling this method, /// the method MUST be called. /// You should also make sure to add listeners to the and /// events to get notifications of changes since /// the last time the folder was opened. /// /// The state of the folder. /// The requested folder access. /// The last known value. /// The last known value. /// The last known list of unique message identifiers. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The quick resynchronization feature has not been enabled. /// /// /// The mail store does not support the quick resynchronization feature. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task OpenAsync (FolderAccess access, uint uidValidity, ulong highestModSeq, IList uids, CancellationToken cancellationToken = default); /// /// Open the folder using the requested folder access. /// /// /// Opens the folder using the requested folder access. /// /// The state of the folder. /// The requested folder access. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// FolderAccess Open (FolderAccess access, CancellationToken cancellationToken = default); /// /// Asynchronously open the folder using the requested folder access. /// /// /// Asynchronously opens the folder using the requested folder access. /// /// The state of the folder. /// The requested folder access. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task OpenAsync (FolderAccess access, CancellationToken cancellationToken = default); /// /// Close the folder, optionally expunging the messages marked for deletion. /// /// /// Closes the folder, optionally expunging the messages marked for deletion. /// /// If set to , expunge. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Close (bool expunge = false, CancellationToken cancellationToken = default); /// /// Asynchronously close the folder, optionally expunging the messages marked for deletion. /// /// /// Asynchronously closes the folder, optionally expunging the messages marked for deletion. /// /// An asynchronous task context. /// If set to , expunge. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CloseAsync (bool expunge = false, CancellationToken cancellationToken = default); /// /// Create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// if the folder will be used to contain messages; otherwise, . /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IMailFolder? Create (string name, bool isMessageFolder, CancellationToken cancellationToken = default); /// /// Asynchronously create a new subfolder with the given name. /// /// /// Asynchronously creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// if the folder will be used to contain messages; otherwise, . /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CreateAsync (string name, bool isMessageFolder, CancellationToken cancellationToken = default); /// /// Create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// A list of special uses for the folder being created. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The does not support the creation of special folders. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IMailFolder? Create (string name, IEnumerable specialUses, CancellationToken cancellationToken = default); /// /// Asynchronously create a new subfolder with the given name. /// /// /// Asynchronously creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// A list of special uses for the folder being created. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The does not support the creation of special folders. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CreateAsync (string name, IEnumerable specialUses, CancellationToken cancellationToken = default); /// /// Create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// The special use for the folder being created. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The does not support the creation of special folders. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IMailFolder? Create (string name, SpecialFolder specialUse, CancellationToken cancellationToken = default); /// /// Asynchronously create a new subfolder with the given name. /// /// /// Asynchronously creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// The special use for the folder being created. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The does not support the creation of special folders. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CreateAsync (string name, SpecialFolder specialUse, CancellationToken cancellationToken = default); /// /// Rename the folder. /// /// /// Renames the folder. /// /// The new parent folder. /// The new name of the folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// does not belong to the . /// -or- /// is not a legal folder name. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be renamed (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Rename (IMailFolder parent, string name, CancellationToken cancellationToken = default); /// /// Asynchronously rename the folder. /// /// /// Asynchronously renames the folder. /// /// An asynchronous task context. /// The new parent folder. /// The new name of the folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// does not belong to the . /// -or- /// is not a legal folder name. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be renamed (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task RenameAsync (IMailFolder parent, string name, CancellationToken cancellationToken = default); /// /// Delete the folder. /// /// /// Deletes the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be deleted (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Delete (CancellationToken cancellationToken = default); /// /// Asynchronously delete the folder. /// /// /// Asynchronously deletes the folder. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be deleted (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task DeleteAsync (CancellationToken cancellationToken = default); /// /// Subscribe to the folder. /// /// /// Subscribes to the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Subscribe (CancellationToken cancellationToken = default); /// /// Asynchronously subscribe to the folder. /// /// /// Asynchronously subscribes to the folder. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be deleted (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task SubscribeAsync (CancellationToken cancellationToken = default); /// /// Unsubscribe from the folder. /// /// /// Unsubscribes from the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Unsubscribe (CancellationToken cancellationToken = default); /// /// Asynchronously unsubscribe from the folder. /// /// /// Asynchronously unsubscribes from the folder. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task UnsubscribeAsync (CancellationToken cancellationToken = default); /// /// Get the subfolders. /// /// /// Gets the subfolders as well as queries the server for the status of the requested items. /// When the argument is non-empty, this has the equivalent functionality /// of calling and then calling /// on each of the returned folders. /// Using this method is potentially more efficient than querying the status of each returned folder. /// /// The subfolders. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList GetSubfolders (StatusItems items, bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Asynchronously get the subfolders. /// /// /// Asynchronously gets the subfolders as well as queries the server for the status of the requested items. /// When the argument is non-empty, this has the equivalent functionality /// of calling and then calling /// on each of the returned folders. /// /// The subfolders. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> GetSubfoldersAsync (StatusItems items, bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Get the subfolders. /// /// /// Gets the subfolders. /// /// The subfolders. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList GetSubfolders (bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Asynchronously get the subfolders. /// /// /// Asynchronously gets the subfolders. /// /// The subfolders. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> GetSubfoldersAsync (bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Get the specified subfolder. /// /// /// Gets the specified subfolder. /// /// The subfolder. /// The name of the subfolder. /// The cancellation token. /// /// is . /// /// /// is either an empty string or contains the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The requested folder could not be found. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IMailFolder GetSubfolder (string name, CancellationToken cancellationToken = default); /// /// Asynchronously get the specified subfolder. /// /// /// Asynchronously gets the specified subfolder. /// /// The subfolder. /// The name of the subfolder. /// The cancellation token. /// /// is . /// /// /// is either an empty string or contains the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The requested folder could not be found. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetSubfolderAsync (string name, CancellationToken cancellationToken = default); /// /// Force the server to flush its state for the folder. /// /// /// Forces the server to flush its state for the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Check (CancellationToken cancellationToken = default); /// /// Asynchronously force the server to flush its state for the folder. /// /// /// Asynchronously forces the server to flush its state for the folder. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CheckAsync (CancellationToken cancellationToken = default); /// /// Update the values of the specified items. /// /// /// Updates the values of the specified items. /// The method /// MUST NOT be used on a folder that is already in the opened state. Instead, other ways /// of getting the desired information should be used. /// For example, a common use for the /// method is to get the number of unread messages in the folder. When the folder is open, however, it is /// possible to use the /// method to query for the list of unread messages. /// /// The items to update. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The mail store does not support the STATUS command. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Status (StatusItems items, CancellationToken cancellationToken = default); /// /// Asynchronously update the values of the specified items. /// /// /// Updates the values of the specified items. /// The method /// MUST NOT be used on a folder that is already in the opened state. Instead, other ways /// of getting the desired information should be used. /// For example, a common use for the /// method is to get the number of unread messages in the folder. When the folder is open, however, it is /// possible to use the /// method to query for the list of unread messages. /// /// An asynchronous task context. /// The items to update. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The mail store does not support the STATUS command. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StatusAsync (StatusItems items, CancellationToken cancellationToken = default); /// /// Get the complete access control list for the folder. /// /// /// Gets the complete access control list for the folder. /// /// The access control list. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// AccessControlList GetAccessControlList (CancellationToken cancellationToken = default); /// /// Asynchronously get the complete access control list for the folder. /// /// /// Asynchronously gets the complete access control list for the folder. /// /// The access control list. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetAccessControlListAsync (CancellationToken cancellationToken = default); /// /// Get the access rights for a particular identifier. /// /// /// Gets the access rights for a particular identifier. /// /// The access rights. /// The identifier name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// AccessRights GetAccessRights (string name, CancellationToken cancellationToken = default); /// /// Asynchronously get the access rights for a particular identifier. /// /// /// Asynchronously gets the access rights for a particular identifier. /// /// The access rights. /// The identifier name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetAccessRightsAsync (string name, CancellationToken cancellationToken = default); /// /// Get the access rights for the current authenticated user. /// /// /// Gets the access rights for the current authenticated user. /// /// The access rights. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// AccessRights GetMyAccessRights (CancellationToken cancellationToken = default); /// /// Asynchronously get the access rights for the current authenticated user. /// /// /// Asynchronously gets the access rights for the current authenticated user. /// /// The access rights. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetMyAccessRightsAsync (CancellationToken cancellationToken = default); /// /// Add access rights for the specified identity. /// /// /// Adds the given access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void AddAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Asynchronously add access rights for the specified identity. /// /// /// Asynchronously adds the given access rights for the specified identity. /// /// An asynchronous task context. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task AddAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Remove access rights for the specified identity. /// /// /// Removes the given access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void RemoveAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Asynchronously remove access rights for the specified identity. /// /// /// Asynchronously removes the given access rights for the specified identity. /// /// An asynchronous task context. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task RemoveAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Set the access rights for the specified identity. /// /// /// Sets the access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void SetAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Asynchronously set the access rights for the specified identity. /// /// /// Asynchronously sets the access rights for the specified identity. /// /// An asynchronous task context. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task SetAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Remove all access rights for the given identity. /// /// /// Removes all access rights for the given identity. /// /// The identity name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void RemoveAccess (string name, CancellationToken cancellationToken = default); /// /// Asynchronously remove all access rights for the given identity. /// /// /// Asynchronously removes all access rights for the given identity. /// /// An asynchronous task context. /// The identity name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task RemoveAccessAsync (string name, CancellationToken cancellationToken = default); /// /// Get the quota information for the folder. /// /// /// Gets the quota information for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The folder quota. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support quotas. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// FolderQuota GetQuota (CancellationToken cancellationToken = default); /// /// Asynchronously get the quota information for the folder. /// /// /// Asynchronously gets the quota information for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The folder quota. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support quotas. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetQuotaAsync (CancellationToken cancellationToken = default); /// /// Set the quota limits for the folder. /// /// /// Sets the quota limits for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The updated folder quota. /// If not , sets the maximum number of messages to allow. /// If not , sets the maximum storage size (in kilobytes). /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support quotas. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// FolderQuota SetQuota (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default); /// /// Asynchronously set the quota limits for the folder. /// /// /// Asynchronously sets the quota limits for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The updated folder quota. /// If not , sets the maximum number of messages to allow. /// If not , sets the maximum storage size (in kilobytes). /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support quotas. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task SetQuotaAsync (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default); /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// string? GetMetadata (MetadataTag tag, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetMetadataAsync (MetadataTag tag, CancellationToken cancellationToken = default); /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata tags. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// MetadataCollection GetMetadata (IEnumerable tags, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata. /// The metadata tags. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetMetadataAsync (IEnumerable tags, CancellationToken cancellationToken = default); /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// MetadataCollection GetMetadata (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetMetadataAsync (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default); /// /// Sets the specified metadata. /// /// /// Sets the specified metadata. /// /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void SetMetadata (MetadataCollection metadata, CancellationToken cancellationToken = default); /// /// Asynchronously sets the specified metadata. /// /// /// Asynchronously sets the specified metadata. /// /// An asynchronous task context. /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task SetMetadataAsync (MetadataCollection metadata, CancellationToken cancellationToken = default); /// /// Expunge the folder, permanently removing all messages marked for deletion. /// /// /// Expunges the folder, permanently removing all messages marked for deletion. /// Normally, an event will be emitted for each /// message that is expunged. However, if the mail store supports the quick /// resynchronization feature and it has been enabled via the /// method, then /// the event will be emitted rather than the /// event. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Expunge (CancellationToken cancellationToken = default); /// /// Asynchronously expunge the folder, permanently removing all messages marked for deletion. /// /// /// Asynchronously expunges the folder, permanently removing all messages marked for deletion. /// Normally, an event will be emitted for /// each message that is expunged. However, if the mail store supports the quick /// resynchronization feature and it has been enabled via the /// method, then /// the event will be emitted rather than the /// event. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task ExpungeAsync (CancellationToken cancellationToken = default); /// /// Expunge the specified uids, permanently removing them from the folder. /// /// /// Expunges the specified uids, permanently removing them from the folder. /// Normally, an event will be emitted for /// each message that is expunged. However, if the mail store supports the quick /// resynchronization feature and it has been enabled via the /// method, then /// the event will be emitted rather than the /// event. /// /// The message uids. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Expunge (IList uids, CancellationToken cancellationToken = default); /// /// Asynchronously expunge the specified uids, permanently removing them from the folder. /// /// /// Asynchronously expunges the specified uids, permanently removing them from the folder. /// Normally, an event will be emitted for /// each message that is expunged. However, if the mail store supports the quick /// resynchronization feature and it has been enabled via the /// method, then /// the event will be emitted rather than the /// event. /// /// An asynchronous task context. /// The message uids. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task ExpungeAsync (IList uids, CancellationToken cancellationToken = default); /// /// Append a message to the folder. /// /// /// Appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The append request. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// UniqueId? Append (IAppendRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously append a message to the folder. /// /// /// Asynchronously appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The append request. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task AppendAsync (IAppendRequest request, CancellationToken cancellationToken = default); /// /// Append a message to the folder. /// /// /// Appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The formatting options. /// The append request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// UniqueId? Append (FormatOptions options, IAppendRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously append a message to the folder. /// /// /// Asynchronously appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The formatting options. /// The append request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task AppendAsync (FormatOptions options, IAppendRequest request, CancellationToken cancellationToken = default); /// /// Append multiple messages to the folder. /// /// /// Appends multiple messages to the folder and returns the UniqueIds assigned to each of the messages. /// /// The UIDs of the appended messages, if available; otherwise, an empty array. /// The append requests. /// The cancellation token. /// /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Append (IList requests, CancellationToken cancellationToken = default); /// /// Asynchronously append multiple messages to the folder. /// /// /// Asynchronously appends multiple messages to the folder and returns the UniqueIds assigned to each of the messages. /// /// The UID of the appended message, if available; otherwise, an empty array. /// The append requests. /// The cancellation token. /// /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> AppendAsync (IList requests, CancellationToken cancellationToken = default); /// /// Append multiple messages to the folder. /// /// /// Appends multiple messages to the folder and returns the UniqueIds assigned to each of the messages. /// /// The UIDs of the appended messages, if available; otherwise, an empty array. /// The formatting options. /// The append requests. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Append (FormatOptions options, IList requests, CancellationToken cancellationToken = default); /// /// Asynchronously append multiple messages to the folder. /// /// /// Asynchronously appends multiple messages to the folder and returns the UniqueIds assigned to each of the messages. /// /// The UID of the appended message, if available; otherwise, an empty array. /// The formatting options. /// The append requests. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> AppendAsync (FormatOptions options, IList requests, CancellationToken cancellationToken = default); /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// UniqueId? Replace (UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the appended message, if available; otherwise, . /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task ReplaceAsync (UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// UniqueId? Replace (FormatOptions options, UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task ReplaceAsync (FormatOptions options, UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// UniqueId? Replace (int index, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the appended message, if available; otherwise, . /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task ReplaceAsync (int index, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// UniqueId? Replace (FormatOptions options, int index, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task ReplaceAsync (FormatOptions options, int index, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Copy the specified message to the destination folder. /// /// /// Copies the specified message to the destination folder. /// /// The UID of the message in the destination folder, if available; otherwise, . /// The UID of the message to copy. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// UniqueId? CopyTo (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously copy the specified message to the destination folder. /// /// /// Asynchronously copies the specified message to the destination folder. /// /// The UID of the message in the destination folder, if available; otherwise, . /// The UID of the message to copy. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CopyToAsync (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Copy the specified messages to the destination folder. /// /// /// Copies the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// UniqueIdMap CopyTo (IList uids, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously copy the specified messages to the destination folder. /// /// /// Asynchronously copies the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CopyToAsync (IList uids, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Move the specified message to the destination folder. /// /// /// Moves the specified message to the destination folder. /// /// The UID of the message in the destination folder, if available; otherwise, . /// The UID of the message to move. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// UniqueId? MoveTo (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously move the specified message to the destination folder. /// /// /// Asynchronously moves the specified message to the destination folder. /// /// The UID of the message in the destination folder, if available; otherwise, . /// The UID of the message to move. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task MoveToAsync (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Move the specified messages to the destination folder. /// /// /// Moves the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// UniqueIdMap MoveTo (IList uids, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously move the specified messages to the destination folder. /// /// /// Asynchronously moves the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task MoveToAsync (IList uids, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Copy the specified message to the destination folder. /// /// /// Copies the specified message to the destination folder. /// /// The index of the message to copy. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// does not refer to a valid message index. /// /// /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void CopyTo (int index, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously copy the specified message to the destination folder. /// /// /// Asynchronously copies the specified message to the destination folder. /// /// An asynchronous task context. /// The indexes of the message to copy. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// does not refer to a valid message index. /// /// /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CopyToAsync (int index, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Copy the specified messages to the destination folder. /// /// /// Copies the specified messages to the destination folder. /// /// The indexes of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void CopyTo (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously copy the specified messages to the destination folder. /// /// /// Asynchronously copies the specified messages to the destination folder. /// /// An asynchronous task context. /// The indexes of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task CopyToAsync (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Move the specified message to the destination folder. /// /// /// Moves the specified message to the destination folder. /// /// The index of the message to move. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// does not refer to a valid message index. /// /// /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void MoveTo (int index, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously move the specified message to the destination folder. /// /// /// Asynchronously moves the specified message to the destination folder. /// /// An asynchronous task context. /// The index of the message to move. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// does not refer to a valid message index. /// /// /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task MoveToAsync (int index, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Move the specified messages to the destination folder. /// /// /// Moves the specified messages to the destination folder. /// /// The indexes of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void MoveTo (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously move the specified messages to the destination folder. /// /// /// Asynchronously moves the specified messages to the destination folder. /// /// An asynchronous task context. /// The indexes of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task MoveToAsync (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Fetch the message summaries for the specified message UIDs. /// /// /// Fetches the message summaries for the specified message UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// /// /// /// An enumeration of summaries for the requested messages. /// The UIDs. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Fetch (IList uids, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously fetch the message summaries for the specified message UIDs. /// /// /// Asynchronously fetches the message summaries for the specified message /// UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The UIDs. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> FetchAsync (IList uids, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Fetch the message summaries for the specified message indexes. /// /// /// Fetches the message summaries for the specified message indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The indexes. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Fetch (IList indexes, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously fetch the message summaries for the specified message indexes. /// /// /// Asynchronously fetches the message summaries for the specified message /// indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The indexes. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> FetchAsync (IList indexes, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Fetches the message summaries for the messages between the two /// indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The fetch request. /// The cancellation token. /// /// is . /// /// /// is out of range. /// -or- /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Fetch (int min, int max, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Asynchronously fetches the message summaries for the messages between /// the two indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The fetch request. /// The cancellation token. /// /// is . /// /// /// is out of range. /// -or- /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> FetchAsync (int min, int max, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Get the specified message headers. /// /// /// Gets the specified message headers. /// /// The message headers. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// HeaderList GetHeaders (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified message headers. /// /// /// Asynchronously gets the specified message headers. /// /// The message headers. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetHeadersAsync (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// HeaderList GetHeaders (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part headers. /// /// /// Asynchronously gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetHeadersAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified message headers. /// /// /// Gets the specified message headers. /// /// The message headers. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// HeaderList GetHeaders (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified message headers. /// /// /// Asynchronously gets the specified message headers. /// /// The message headers. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetHeadersAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// HeaderList GetHeaders (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part headers. /// /// /// Asynchronously gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetHeadersAsync (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified message. /// /// /// Gets the specified message. /// /// /// /// /// The message. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// MimeMessage GetMessage (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified message. /// /// /// Asynchronously gets the specified message. /// /// /// /// /// The message. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetMessageAsync (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified message. /// /// /// Gets the specified message. /// /// /// /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// MimeMessage GetMessage (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified message. /// /// /// Asynchronously gets the specified message. /// /// /// /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetMessageAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part. /// /// /// Gets the specified body part. /// /// /// /// /// The body part. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// MimeEntity GetBodyPart (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part. /// /// /// Asynchronously gets the specified body part. /// /// /// /// /// The body part. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetBodyPartAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part. /// /// /// Gets the specified body part. /// /// The body part. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// MimeEntity GetBodyPart (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part. /// /// /// Asynchronously gets the specified body part. /// /// The body part. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetBodyPartAsync (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a message stream. /// /// /// Gets a message stream. /// /// /// /// /// The message stream. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a message stream. /// /// /// Asynchronously gets a message stream. /// /// /// /// /// The message stream. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a message stream. /// /// /// Gets a message stream. /// /// /// /// /// The message stream. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a message stream. /// /// /// Asynchronously gets a message stream. /// /// /// /// /// The message stream. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The UID of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (UniqueId uid, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The UID of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (UniqueId uid, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (int index, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (int index, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a body part as a stream. /// /// /// Gets a body part as a stream. /// /// /// /// /// The body part stream. /// The UID of the message. /// The desired body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a body part as a stream. /// /// /// Asynchronously gets a body part as a stream. /// /// /// /// /// The body part stream. /// The UID of the message. /// The desired body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a body part as a stream. /// /// /// Gets a body part as a stream. /// /// The body part stream. /// The index of the message. /// The desired body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a body part as a stream. /// /// /// Asynchronously gets a body part as a stream. /// /// The body part stream. /// The index of the message. /// The desired body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified body part. /// /// /// Gets a substream of the body part. If the starting offset is beyond /// the end of the body part, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the body part, a truncated stream /// will be returned. /// /// The stream. /// The UID of the message. /// The desired body part. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (UniqueId uid, BodyPart part, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified body part. /// /// /// Asynchronously gets a substream of the body part. If the starting offset is beyond /// the end of the body part, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the body part, a truncated stream /// will be returned. /// /// The stream. /// The UID of the message. /// The desired body part. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (UniqueId uid, BodyPart part, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified body part. /// /// /// Gets a substream of the body part. If the starting offset is beyond /// the end of the body part, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the body part, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The desired body part. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (int index, BodyPart part, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified body part. /// /// /// Asynchronously gets a substream of the body part. If the starting offset is beyond /// the end of the body part, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the body part, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The desired body part. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (int index, BodyPart part, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// /// /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (UniqueId uid, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the specified message. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// /// /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (UniqueId uid, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. If the starting offset is beyond /// the end of the specified section of the message, an empty stream is returned. If /// the number of bytes desired extends beyond the end of the section, a truncated /// stream will be returned. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the specified message. If the starting /// offset is beyond the end of the specified section of the message, an empty stream /// is returned. If the number of bytes desired extends beyond the end of the section, /// a truncated stream will be returned. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (int index, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the specified message. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (int index, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. If the starting offset is beyond /// the end of the specified section of the message, an empty stream is returned. If /// the number of bytes desired extends beyond the end of the section, a truncated /// stream will be returned. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Stream GetStream (int index, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the specified message. If the starting /// offset is beyond the end of the specified section of the message, an empty stream /// is returned. If the number of bytes desired extends beyond the end of the section, /// a truncated stream will be returned. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task GetStreamAsync (int index, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Store message flags and keywords for a message. /// /// /// Updates the message flags and keywords for a message. /// /// if the store operation was successful; otherwise, . /// The UID of the message. /// The message flags and keywords to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// bool Store (UniqueId uid, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store message flags and keywords for a message. /// /// /// Asynchronously updates the message flags and keywords for a message. /// /// if the store operation was successful; otherwise, . /// The UID of the message. /// The message flags and keywords to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StoreAsync (UniqueId uid, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Store message flags and keywords for a set of messages. /// /// /// Updates the message flags and keywords for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Store (IList uids, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store message flags and keywords for a set of messages. /// /// /// Asynchronously updates the message flags and keywords for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> StoreAsync (IList uids, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Store message flags and keywords for a message. /// /// /// Updates the message flags and keywords for a message. /// /// if the store operation was successful; otherwise, . /// The index of the message. /// The message flags and keywords to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// bool Store (int index, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store message flags and keywords for a message. /// /// /// Asynchronously updates the message flags and keywords for a message. /// /// if the store operation was successful; otherwise, . /// The index of the message. /// The message flags and keywords to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StoreAsync (int index, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Store message flags and keywords for a set of messages. /// /// /// Updates the message flags and keywords for a set of messages. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Store (IList indexes, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store message flags and keywords for a set of messages. /// /// /// Asynchronously updates the message flags and keywords for a set of message. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> StoreAsync (IList indexes, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Store GMail-style labels for a message. /// /// /// Updates the GMail-style labels for a message. /// /// if the store operation was successful; otherwise, . /// The UID of the message. /// The labels to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// bool Store (UniqueId uid, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store GMail-style labels for a message. /// /// /// Asynchronously updates the GMail-style labels for a message. /// /// if the store operation was successful; otherwise, . /// The UID of the message. /// The labels to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StoreAsync (UniqueId uid, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Store GMail-style labels for a set of messages. /// /// /// Updates the GMail-style labels for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Store (IList uids, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store GMail-style labels for a set of messages. /// /// /// Asynchronously updates the GMail-style labels for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> StoreAsync (IList uids, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Store GMail-style labels for a message. /// /// /// Updates the GMail-style labels for a message. /// /// if the store operation was successful; otherwise, . /// The index of the message. /// The labels to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// bool Store (int index, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store GMail-style labels for a message. /// /// /// Asynchronously updates the GMail-style labels for a message. /// /// if the store operation was successful; otherwise, . /// The index of the message. /// The labels to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StoreAsync (int index, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Store GMail-style labels for a set of messages. /// /// /// Updates the GMail-style labels for a set of messages. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Store (IList indexes, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store GMail-style labels for a set of messages. /// /// /// Asynchronously updates the GMail-style labels for a set of message. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> StoreAsync (IList indexes, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified message. /// /// /// Stores the annotations for the specified message. /// /// The UID of the message. /// The annotations to store. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Store (UniqueId uid, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified message. /// /// /// Asynchronously stores the annotations for the specified message. /// /// An asynchronous task context. /// The UID of the message. /// The annotations to store. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StoreAsync (UniqueId uid, IList annotations, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified messages. /// /// /// Stores the annotations for the specified messages. /// /// The UIDs of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Store (IList uids, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified messages. /// /// /// Asynchronously stores the annotations for the specified messages. /// /// An asynchronous task context. /// The UIDs of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StoreAsync (IList uids, IList annotations, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The UIDs of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Store (IList uids, ulong modseq, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The UIDs of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> StoreAsync (IList uids, ulong modseq, IList annotations, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified message. /// /// /// Stores the annotations for the specified message. /// /// The index of the message. /// The annotations to store. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Store (int index, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified message. /// /// /// Asynchronously stores the annotations for the specified message. /// /// An asynchronous task context. /// The indexes of the message. /// The annotations to store. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StoreAsync (int index, IList annotations, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified messages. /// /// /// Stores the annotations for the specified messages. /// /// The indexes of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// void Store (IList indexes, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified messages. /// /// /// Asynchronously stores the annotations for the specified messages. /// /// An asynchronous task context. /// The indexes of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task StoreAsync (IList indexes, IList annotations, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The indexes of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Store (IList indexes, ulong modseq, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously stores the annotations for the specified messages only if their mod-sequence value is less than the specified value.s /// /// The indexes of the messages that were not updated. /// The indexes of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> StoreAsync (IList indexes, ulong modseq, IList annotations, CancellationToken cancellationToken = default); /// /// Search the folder for messages matching the specified query. /// /// /// The returned array of unique identifiers can be used with methods such as /// . /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported by the mail store. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Search (SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously search the folder for messages matching the specified query. /// /// /// The returned array of unique identifiers can be used with methods such as /// . /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported by the mail store. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> SearchAsync (SearchQuery query, CancellationToken cancellationToken = default); /// /// Search the subset of UIDs in the folder for messages matching the specified query. /// /// /// The returned array of unique identifiers can be used with methods such as /// . /// /// An array of matching UIDs. /// The subset of UIDs /// The search query. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported by the mail store. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Search (IList uids, SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously search the subset of UIDs in the folder for messages matching the specified query. /// /// /// The returned array of unique identifiers can be used with methods such as /// . /// /// An array of matching UIDs. /// The subset of UIDs /// The search query. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported by the mail store. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> SearchAsync (IList uids, SearchQuery query, CancellationToken cancellationToken = default); /// /// Search the folder for messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// SearchResults Search (SearchOptions options, SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously search the folder for messages matching the specified query. /// /// /// Asynchronously searches the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task SearchAsync (SearchOptions options, SearchQuery query, CancellationToken cancellationToken = default); /// /// Search the subset of UIDs in the folder for messages matching the specified query. /// /// /// Searches the subset of UIDs in the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The subset of UIDs /// The search query. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// SearchResults Search (SearchOptions options, IList uids, SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously search the subset of UIDs in the folder for messages matching the specified query. /// /// /// Asynchronously searches the subset of UIDs in the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The subset of UIDs /// The search query. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task SearchAsync (SearchOptions options, IList uids, SearchQuery query, CancellationToken cancellationToken = default); /// /// Sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Sort (SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Asynchronously sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> SortAsync (SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The subset of UIDs /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Sort (IList uids, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Asynchronously sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The subset of UIDs /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> SortAsync (IList uids, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Sort messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// SearchResults Sort (SearchOptions options, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Asynchronously sort messages matching the specified query. /// /// /// Asynchronously searches the folder for messages matching the specified query, returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task SortAsync (SearchOptions options, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Sort messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The subset of UIDs /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// SearchResults Sort (SearchOptions options, IList uids, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Asynchronously sort messages matching the specified query. /// /// /// Asynchronously searches the folder for messages matching the specified query, /// returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The subset of UIDs /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task SortAsync (SearchOptions options, IList uids, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support threading search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Thread (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support threading search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> ThreadAsync (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default); /// /// Thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The subset of UIDs /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support threading search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// IList Thread (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The subset of UIDs /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support threading search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// Task> ThreadAsync (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default); /// /// Occurs when the folder is opened. /// /// /// Emitted when the folder is opened. /// event EventHandler Opened; /// /// Occurs when the folder is closed. /// /// /// Emitted when the folder is closed. /// event EventHandler Closed; /// /// Occurs when the folder is deleted. /// /// /// Emitted when the folder is deleted. /// event EventHandler Deleted; /// /// Occurs when the folder is renamed. /// /// /// Emitted when the folder is renamed. /// event EventHandler Renamed; /// /// Occurs when the folder is subscribed. /// /// /// Emitted when the folder is subscribed. /// event EventHandler Subscribed; /// /// Occurs when the folder is unsubscribed. /// /// /// Emitted when the folder is unsubscribed. /// event EventHandler Unsubscribed; /// /// Occurs when a message is expunged from the folder. /// /// /// Emitted when a message is expunged from the folder. /// /// /// /// event EventHandler MessageExpunged; /// /// Occurs when messages vanish from the folder. /// /// /// Emitted when a messages vanish from the folder. /// event EventHandler MessagesVanished; /// /// Occurs when flags changed on a message. /// /// /// Emitted when flags changed on a message. /// /// /// /// event EventHandler MessageFlagsChanged; /// /// Occurs when labels changed on a message. /// /// /// Emitted when labels changed on a message. /// event EventHandler MessageLabelsChanged; /// /// Occurs when annotations changed on a message. /// /// /// Emitted when annotations changed on a message. /// event EventHandler AnnotationsChanged; /// /// Occurs when a message summary is fetched from the folder. /// /// /// Emitted when a message summary is fetched from the folder. /// When multiple message summaries are being fetched from a remote folder, /// it is possible that the connection will drop or some other exception will /// occur, causing the Fetch method to fail, requiring the client to request the /// same set of message summaries again after it reconnects. This is obviously /// inefficient. To alleviate this potential problem, this event will be emitted /// as soon as the successfully retrieves the complete /// for each requested message. /// The Fetch /// methods will return a list of all message summaries that any information was /// retrieved for, regardless of whether or not all of the requested items were fetched, /// therefore there may be a discrepancy between the number of times this event is /// emitted and the number of summary items returned from the Fetch method. /// event EventHandler MessageSummaryFetched; /// /// Occurs when metadata changes. /// /// /// The event is emitted when metadata changes. /// event EventHandler MetadataChanged; /// /// Occurs when the mod-sequence changed on a message. /// /// /// Emitted when the mod-sequence changed on a message. /// event EventHandler ModSeqChanged; /// /// Occurs when the highest mod-sequence changes. /// /// /// The event is emitted whenever the value changes. /// event EventHandler HighestModSeqChanged; /// /// Occurs when the next UID changes. /// /// /// Emitted when the property changes. /// event EventHandler UidNextChanged; /// /// Occurs when the UID validity changes. /// /// /// Emitted when the property changes. /// event EventHandler UidValidityChanged; /// /// Occurs when the ID changes. /// /// /// Emitted when the property changes. /// event EventHandler IdChanged; /// /// Occurs when the size of the folder changes. /// /// /// Emitted when the property changes. /// event EventHandler SizeChanged; /// /// Occurs when the message count changes. /// /// /// Emitted when the property changes. /// /// /// /// event EventHandler CountChanged; /// /// Occurs when the recent message count changes. /// /// /// Emitted when the property changes. /// event EventHandler RecentChanged; /// /// Occurs when the message unread count changes. /// /// /// Emitted when the property changes. /// event EventHandler UnreadChanged; } } ================================================ FILE: MailKit/IMailFolderAppendExtensions.cs ================================================ // // IMailFolderAppendExtensions.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; namespace MailKit { public static partial class IMailFolderExtensions { #region Append Extensions /// /// Append the specified message to the folder. /// /// /// Appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static UniqueId? Append (this IMailFolder folder, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Append (folder, FormatOptions.Default, message, flags, cancellationToken, progress); } /// /// Asynchronously append the specified message to the folder. /// /// /// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AppendAsync (this IMailFolder folder, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return AppendAsync (folder, FormatOptions.Default, message, flags, cancellationToken, progress); } /// /// Append the specified message to the folder. /// /// /// Appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static UniqueId? Append (this IMailFolder folder, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Append (folder, FormatOptions.Default, message, flags, date, cancellationToken, progress); } /// /// Asynchronously append the specified message to the folder. /// /// /// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AppendAsync (this IMailFolder folder, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return AppendAsync (folder, FormatOptions.Default, message, flags, date, cancellationToken, progress); } /// /// Append the specified message to the folder. /// /// /// Appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The message. /// The message flags. /// The received date of the message. /// The message annotations. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// One or more does not define any properties. /// " /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static UniqueId? Append (this IMailFolder folder, MimeMessage message, MessageFlags flags, DateTimeOffset? date, IList annotations, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Append (folder, FormatOptions.Default, message, flags, date, annotations, cancellationToken, progress); } /// /// Asynchronously append the specified message to the folder. /// /// /// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The message. /// The message flags. /// The received date of the message. /// The message annotations. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// One or more does not define any properties. /// " /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AppendAsync (this IMailFolder folder, MimeMessage message, MessageFlags flags, DateTimeOffset? date, IList annotations, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return AppendAsync (folder, FormatOptions.Default, message, flags, date, annotations, cancellationToken, progress); } /// /// Append the specified message to the folder. /// /// /// Appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The formatting options. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static UniqueId? Append (this IMailFolder folder, FormatOptions options, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new AppendRequest (message, flags) { TransferProgress = progress }; return folder.Append (options, request, cancellationToken); } /// /// Asynchronously append the specified message to the folder. /// /// /// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The formatting options. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AppendAsync (this IMailFolder folder, FormatOptions options, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new AppendRequest (message, flags) { TransferProgress = progress }; return folder.AppendAsync (options, request, cancellationToken); } /// /// Append the specified message to the folder. /// /// /// Appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The formatting options. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static UniqueId? Append (this IMailFolder folder, FormatOptions options, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new AppendRequest (message, flags, date) { TransferProgress = progress }; return folder.Append (options, request, cancellationToken); } /// /// Asynchronously append the specified message to the folder. /// /// /// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The formatting options. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AppendAsync (this IMailFolder folder, FormatOptions options, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new AppendRequest (message, flags, date) { TransferProgress = progress }; return folder.AppendAsync (options, request, cancellationToken); } /// /// Append the specified message to the folder. /// /// /// Appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The formatting options. /// The message. /// The message flags. /// The received date of the message. /// The message annotations. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static UniqueId? Append (this IMailFolder folder, FormatOptions options, MimeMessage message, MessageFlags flags, DateTimeOffset? date, IList annotations, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new AppendRequest (message, flags) { TransferProgress = progress, Annotations = annotations, InternalDate = date }; return folder.Append (options, request, cancellationToken); } /// /// Asynchronously append the specified message to the folder. /// /// /// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The folder. /// The formatting options. /// The message. /// The message flags. /// The received date of the message. /// The message annotations. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AppendAsync (this IMailFolder folder, FormatOptions options, MimeMessage message, MessageFlags flags, DateTimeOffset? date, IList annotations, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new AppendRequest (message, flags) { TransferProgress = progress, Annotations = annotations, InternalDate = date }; return folder.AppendAsync (options, request, cancellationToken); } /// /// Append the specified messages to the folder. /// /// /// Appends the specified messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The folder. /// The array of messages to append to the folder. /// The message flags to use for each message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is null. /// -or- /// The number of messages does not match the number of flags. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Append (this IMailFolder folder, IList messages, IList flags, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Append (folder, FormatOptions.Default, messages, flags, cancellationToken, progress); } /// /// Asynchronously append the specified messages to the folder. /// /// /// Asynchronously appends the specified messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The folder. /// The array of messages to append to the folder. /// The message flags to use for each message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is null. /// -or- /// The number of messages does not match the number of flags. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AppendAsync (this IMailFolder folder, IList messages, IList flags, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return AppendAsync (folder, FormatOptions.Default, messages, flags, cancellationToken, progress); } /// /// Append the specified messages to the folder. /// /// /// Appends the specified messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The folder. /// The array of messages to append to the folder. /// The message flags to use for each of the messages. /// The received dates to use for each of the messages. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// One or more of the is null. /// -or- /// The number of messages, flags, and dates do not match. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Append (this IMailFolder folder, IList messages, IList flags, IList dates, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Append (folder, FormatOptions.Default, messages, flags, dates, cancellationToken, progress); } /// /// Asynchronously append the specified messages to the folder. /// /// /// Asynchronously appends the specified messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The folder. /// The array of messages to append to the folder. /// The message flags to use for each of the messages. /// The received dates to use for each of the messages. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// One or more of the is null. /// -or- /// The number of messages, flags, and dates do not match. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AppendAsync (this IMailFolder folder, IList messages, IList flags, IList dates, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return AppendAsync (folder, FormatOptions.Default, messages, flags, dates, cancellationToken, progress); } /// /// Append the specified messages to the folder. /// /// /// Appends the specified messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The folder. /// The formatting options. /// The array of messages to append to the folder. /// The message flags to use for each message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// One or more of the is null. /// -or- /// The number of messages does not match the number of flags. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Append (this IMailFolder folder, FormatOptions options, IList messages, IList flags, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (options == null) throw new ArgumentNullException (nameof (options)); if (messages == null) throw new ArgumentNullException (nameof (messages)); for (int i = 0; i < messages.Count; i++) { if (messages[i] == null) throw new ArgumentException ("One or more of the messages is null."); } if (flags == null) throw new ArgumentNullException (nameof (flags)); if (messages.Count != flags.Count) throw new ArgumentException ("The number of messages and the number of flags must be equal."); var requests = new AppendRequest[messages.Count]; for (int i = 0; i < messages.Count; i++) { requests[i] = new AppendRequest (messages[i], flags[i]) { TransferProgress = progress }; } return folder.Append (options, requests, cancellationToken); } /// /// Asynchronously append the specified messages to the folder. /// /// /// Asynchronously appends the specified messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The folder. /// The formatting options. /// The array of messages to append to the folder. /// The message flags to use for each message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// One or more of the is null. /// -or- /// The number of messages does not match the number of flags. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AppendAsync (this IMailFolder folder, FormatOptions options, IList messages, IList flags, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (options == null) throw new ArgumentNullException (nameof (options)); if (messages == null) throw new ArgumentNullException (nameof (messages)); for (int i = 0; i < messages.Count; i++) { if (messages[i] == null) throw new ArgumentException ("One or more of the messages is null."); } if (flags == null) throw new ArgumentNullException (nameof (flags)); if (messages.Count != flags.Count) throw new ArgumentException ("The number of messages and the number of flags must be equal."); var requests = new AppendRequest[messages.Count]; for (int i = 0; i < messages.Count; i++) { requests[i] = new AppendRequest (messages[i], flags[i]) { TransferProgress = progress }; } return folder.AppendAsync (options, requests, cancellationToken); } /// /// Append the specified messages to the folder. /// /// /// Appends the specified messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The folder. /// The formatting options. /// The array of messages to append to the folder. /// The message flags to use for each of the messages. /// The received dates to use for each of the messages. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// -or- /// is . /// /// /// One or more of the is null. /// -or- /// The number of messages, flags, and dates do not match. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Append (this IMailFolder folder, FormatOptions options, IList messages, IList flags, IList dates, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (options == null) throw new ArgumentNullException (nameof (options)); if (messages == null) throw new ArgumentNullException (nameof (messages)); for (int i = 0; i < messages.Count; i++) { if (messages[i] == null) throw new ArgumentException ("One or more of the messages is null."); } if (flags == null) throw new ArgumentNullException (nameof (flags)); if (messages.Count != flags.Count) throw new ArgumentException ("The number of messages and the number of flags must be equal."); if (dates == null) throw new ArgumentNullException (nameof (dates)); if (messages.Count != dates.Count) throw new ArgumentException ("The number of messages and the number of dates must be equal."); var requests = new AppendRequest[messages.Count]; for (int i = 0; i < messages.Count; i++) { requests[i] = new AppendRequest (messages[i], flags[i], dates[i]) { TransferProgress = progress }; } return folder.Append (options, requests, cancellationToken); } /// /// Asynchronously append the specified messages to the folder. /// /// /// Asynchronously appends the specified messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The folder. /// The formatting options. /// The array of messages to append to the folder. /// The message flags to use for each of the messages. /// The received dates to use for each of the messages. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// -or- /// is . /// /// /// One or more of the is null. /// -or- /// The number of messages, flags, and dates do not match. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AppendAsync (this IMailFolder folder, FormatOptions options, IList messages, IList flags, IList dates, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (options == null) throw new ArgumentNullException (nameof (options)); if (messages == null) throw new ArgumentNullException (nameof (messages)); for (int i = 0; i < messages.Count; i++) { if (messages[i] == null) throw new ArgumentException ("One or more of the messages is null."); } if (flags == null) throw new ArgumentNullException (nameof (flags)); if (messages.Count != flags.Count) throw new ArgumentException ("The number of messages and the number of flags must be equal."); if (dates == null) throw new ArgumentNullException (nameof (dates)); if (messages.Count != dates.Count) throw new ArgumentException ("The number of messages and the number of dates must be equal."); var requests = new AppendRequest[messages.Count]; for (int i = 0; i < messages.Count; i++) { requests[i] = new AppendRequest (messages[i], flags[i], dates[i]) { TransferProgress = progress }; } return folder.AppendAsync (options, requests, cancellationToken); } #endregion Append Extensions #region Replace Extensions /// /// Replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The UID of the message to be replaced. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static UniqueId? Replace (this IMailFolder folder, UniqueId uid, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Replace (folder, FormatOptions.Default, uid, message, flags, cancellationToken, progress); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The UID of the message to be replaced. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static Task ReplaceAsync (this IMailFolder folder, UniqueId uid, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return ReplaceAsync (folder, FormatOptions.Default, uid, message, flags, cancellationToken, progress); } /// /// Replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The UID of the message to be replaced. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static UniqueId? Replace (this IMailFolder folder, UniqueId uid, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Replace (folder, FormatOptions.Default, uid, message, flags, date, cancellationToken, progress); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The UID of the message to be replaced. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static Task ReplaceAsync (this IMailFolder folder, UniqueId uid, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return ReplaceAsync (folder, FormatOptions.Default, uid, message, flags, date, cancellationToken, progress); } /// /// Replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The formatting options. /// The UID of the message to be replaced. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static UniqueId? Replace (this IMailFolder folder, FormatOptions options, UniqueId uid, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new ReplaceRequest (message, flags) { TransferProgress = progress }; return folder.Replace (options, uid, request, cancellationToken); } /// /// Asynchronously replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The formatting options. /// The UID of the message to be replaced. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static Task ReplaceAsync (this IMailFolder folder, FormatOptions options, UniqueId uid, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new ReplaceRequest (message, flags) { TransferProgress = progress }; return folder.ReplaceAsync (options, uid, request, cancellationToken); } /// /// Replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The formatting options. /// The UID of the message to be replaced. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static UniqueId? Replace (this IMailFolder folder, FormatOptions options, UniqueId uid, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new ReplaceRequest (message, flags, date) { TransferProgress = progress }; return folder.Replace (options, uid, request, cancellationToken); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The formatting options. /// The UID of the message to be replaced. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static Task ReplaceAsync (this IMailFolder folder, FormatOptions options, UniqueId uid, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new ReplaceRequest (message, flags, date) { TransferProgress = progress }; return folder.ReplaceAsync (options, uid, request, cancellationToken); } /// /// Replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The index of the message to be replaced. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static UniqueId? Replace (this IMailFolder folder, int index, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Replace (folder, FormatOptions.Default, index, message, flags, cancellationToken, progress); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The index of the message to be replaced. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static Task ReplaceAsync (this IMailFolder folder, int index, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return ReplaceAsync (folder, FormatOptions.Default, index, message, flags, cancellationToken, progress); } /// /// Replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The index of the message to be replaced. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static UniqueId? Replace (this IMailFolder folder, int index, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Replace (folder, FormatOptions.Default, index, message, flags, date, cancellationToken, progress); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The index of the message to be replaced. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static Task ReplaceAsync (this IMailFolder folder, int index, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return ReplaceAsync (folder, FormatOptions.Default, index, message, flags, date, cancellationToken, progress); } /// /// Replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The formatting options. /// The index of the message to be replaced. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static UniqueId? Replace (this IMailFolder folder, FormatOptions options, int index, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new ReplaceRequest (message, flags) { TransferProgress = progress }; return folder.Replace (options, index, request, cancellationToken); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The formatting options. /// The index of the message to be replaced. /// The message. /// The message flags. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static Task ReplaceAsync (this IMailFolder folder, FormatOptions options, int index, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new ReplaceRequest (message, flags) { TransferProgress = progress }; return folder.ReplaceAsync (options, index, request, cancellationToken); } /// /// Replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The formatting options. /// The index of the message to be replaced. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static UniqueId? Replace (this IMailFolder folder, FormatOptions options, int index, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new ReplaceRequest (message, flags, date) { TransferProgress = progress }; return folder.Replace (options, index, request, cancellationToken); } /// /// Asynchronously replace a message in the folder. /// /// /// Replaces the specified message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The folder. /// The formatting options. /// The index of the message to be replaced. /// The message. /// The message flags. /// The received date of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public static Task ReplaceAsync (this IMailFolder folder, FormatOptions options, int index, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var request = new ReplaceRequest (message, flags, date) { TransferProgress = progress }; return folder.ReplaceAsync (options, index, request, cancellationToken); } #endregion Replace Extensions } } ================================================ FILE: MailKit/IMailFolderFetchExtensions.cs ================================================ // // IMailFolderFetchExtensions.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// Extension methods for that provide backwards API compatibility. /// /// /// Extension methods for that provide backwards API compatibility. /// public static partial class IMailFolderExtensions { /// /// Fetch the message summaries for the specified message UIDs. /// /// /// Fetches the message summaries for the specified message UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// /// /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The message summary items to fetch. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList uids, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items); return folder.Fetch (uids, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message UIDs. /// /// /// Asynchronously fetches the message summaries for the specified message /// UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// /// /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The message summary items to fetch. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList uids, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items); return folder.FetchAsync (uids, request, cancellationToken); } /// /// Fetch the message summaries for the specified message UIDs. /// /// /// Fetches the message summaries for the specified message UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList uids, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.Fetch (uids, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message UIDs. /// /// /// Asynchronously fetches the message summaries for the specified message /// UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList uids, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.FetchAsync (uids, request, cancellationToken); } /// /// Fetch the message summaries for the specified message UIDs. /// /// /// Fetches the message summaries for the specified message UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList uids, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.Fetch (uids, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message UIDs. /// /// /// Asynchronously fetches the message summaries for the specified message /// UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList uids, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.FetchAsync (uids, request, cancellationToken); } /// /// Fetch the message summaries for the specified message UIDs that have a /// higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the specified message UIDs that /// have a higher mod-sequence value than the one specified. /// If the mail store supports quick resynchronization and the application has /// enabled this feature via , /// then this method will emit events for messages that /// have vanished since the specified mod-sequence value. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The mod-sequence value. /// The message summary items to fetch. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList uids, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items) { ChangedSince = modseq }; return folder.Fetch (uids, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message UIDs that have a /// higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the specified message UIDs that /// have a higher mod-sequence value than the one specified. /// If the mail store supports quick resynchronization and the application has /// enabled this feature via , /// then this method will emit events for messages that /// have vanished since the specified mod-sequence value. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The mod-sequence value. /// The message summary items to fetch. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList uids, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items) { ChangedSince = modseq }; return folder.FetchAsync (uids, request, cancellationToken); } /// /// Fetch the message summaries for the specified message UIDs that have a /// higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the specified message UIDs that /// have a higher mod-sequence value than the one specified. /// If the mail store supports quick resynchronization and the application has /// enabled this feature via , /// then this method will emit events for messages that /// have vanished since the specified mod-sequence value. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList uids, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.Fetch (uids, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message UIDs that have a /// higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the specified message UIDs that /// have a higher mod-sequence value than the one specified. /// If the mail store supports quick resynchronization and the application has /// enabled this feature via , /// then this method will emit events for messages that /// have vanished since the specified mod-sequence value. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList uids, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.FetchAsync (uids, request, cancellationToken); } /// /// Fetch the message summaries for the specified message UIDs that have a /// higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the specified message UIDs that /// have a higher mod-sequence value than the one specified. /// If the mail store supports quick resynchronization and the application has /// enabled this feature via , /// then this method will emit events for messages that /// have vanished since the specified mod-sequence value. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList uids, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.Fetch (uids, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message UIDs that have a /// higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the specified message UIDs that /// have a higher mod-sequence value than the one specified. /// If the mail store supports quick resynchronization and the application has /// enabled this feature via , /// then this method will emit events for messages that /// have vanished since the specified mod-sequence value. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The UIDs. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList uids, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.FetchAsync (uids, request, cancellationToken); } /// /// Fetch the message summaries for the specified message indexes. /// /// /// Fetches the message summaries for the specified message indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The message summary items to fetch. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList indexes, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items); return folder.Fetch (indexes, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message indexes. /// /// /// Asynchronously fetches the message summaries for the specified message /// indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The message summary items to fetch. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList indexes, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items); return folder.FetchAsync (indexes, request, cancellationToken); } /// /// Fetch the message summaries for the specified message indexes. /// /// /// Fetches the message summaries for the specified message indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList indexes, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.Fetch (indexes, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message indexes. /// /// /// Asynchronously fetches the message summaries for the specified message /// indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList indexes, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.FetchAsync (indexes, request, cancellationToken); } /// /// Fetch the message summaries for the specified message indexes. /// /// /// Fetches the message summaries for the specified message indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList indexes, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.Fetch (indexes, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message indexes. /// /// /// Asynchronously fetches the message summaries for the specified message /// indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList indexes, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.FetchAsync (indexes, request, cancellationToken); } /// /// Fetch the message summaries for the specified message indexes that have a /// higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the specified message indexes that /// have a higher mod-sequence value than the one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The mod-sequence value. /// The message summary items to fetch. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList indexes, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items) { ChangedSince = modseq }; return folder.Fetch (indexes, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message indexes that have a /// higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the specified message /// indexes that have a higher mod-sequence value than the one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The mod-sequence value. /// The message summary items to fetch. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items) { ChangedSince = modseq }; return folder.FetchAsync (indexes, request, cancellationToken); } /// /// Fetch the message summaries for the specified message indexes that have a /// higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the specified message indexes that /// have a higher mod-sequence value than the one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList indexes, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.Fetch (indexes, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message indexes /// that have a higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the specified message /// indexes that have a higher mod-sequence value than the one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.FetchAsync (indexes, request, cancellationToken); } /// /// Fetch the message summaries for the specified message indexes that /// have a higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the specified message indexes that /// have a higher mod-sequence value than the one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, IList indexes, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.Fetch (indexes, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the specified message indexes /// that have a higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the specified message /// indexes that have a higher mod-sequence value than the one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The indexes. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.FetchAsync (indexes, request, cancellationToken); } /// /// Fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Fetches the message summaries for the messages between the two /// indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The message summary items to fetch. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, int min, int max, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items); return folder.Fetch (min, max, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Asynchronously fetches the message summaries for the messages between /// the two indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The message summary items to fetch. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, int min, int max, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items); return folder.FetchAsync (min, max, request, cancellationToken); } /// /// Fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Fetches the message summaries for the messages between the two /// indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, int min, int max, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.Fetch (min, max, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Asynchronously fetches the message summaries for the messages between /// the two indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, int min, int max, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.FetchAsync (min, max, request, cancellationToken); } /// /// Fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Fetches the message summaries for the messages between the two /// indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, int min, int max, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.Fetch (min, max, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Asynchronously fetches the message summaries for the messages between /// the two indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, int min, int max, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers); return folder.FetchAsync (min, max, request, cancellationToken); } /// /// Fetch the message summaries for the messages between the two indexes (inclusive) /// that have a higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the messages between the two /// indexes (inclusive) that have a higher mod-sequence value than the one /// specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The mod-sequence value. /// The message summary items to fetch. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, int min, int max, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items) { ChangedSince = modseq }; return folder.Fetch (min, max, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the messages between the two indexes /// (inclusive) that have a higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the messages between /// the two indexes (inclusive) that have a higher mod-sequence value than the /// one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The mod-sequence value. /// The message summary items to fetch. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, int min, int max, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default) { var request = new FetchRequest (items) { ChangedSince = modseq }; return folder.FetchAsync (min, max, request, cancellationToken); } /// /// Fetch the message summaries for the messages between the two indexes (inclusive) /// that have a higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the messages between the two /// indexes (inclusive) that have a higher mod-sequence value than the one /// specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, int min, int max, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.Fetch (min, max, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the messages between the two indexes /// (inclusive) that have a higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the messages between /// the two indexes (inclusive) that have a higher mod-sequence value than the /// one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// One or more of the specified is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, int min, int max, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.FetchAsync (min, max, request, cancellationToken); } /// /// Fetch the message summaries for the messages between the two indexes (inclusive) /// that have a higher mod-sequence value than the one specified. /// /// /// Fetches the message summaries for the messages between the two /// indexes (inclusive) that have a higher mod-sequence value than the one /// specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList Fetch (this IMailFolder folder, int min, int max, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.Fetch (min, max, request, cancellationToken); } /// /// Asynchronously fetch the message summaries for the messages between the two indexes /// (inclusive) that have a higher mod-sequence value than the one specified. /// /// /// Asynchronously fetches the message summaries for the messages between /// the two indexes (inclusive) that have a higher mod-sequence value than the /// one specified. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The folder. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The mod-sequence value. /// The message summary items to fetch. /// The desired header fields. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> FetchAsync (this IMailFolder folder, int min, int max, ulong modseq, MessageSummaryItems items, IEnumerable headers, CancellationToken cancellationToken = default) { var request = new FetchRequest (items, headers) { ChangedSince = modseq }; return folder.FetchAsync (min, max, request, cancellationToken); } } } ================================================ FILE: MailKit/IMailFolderStoreExtensions.cs ================================================ // // IMailFolderStoreExtensions.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; namespace MailKit { public static partial class IMailFolderExtensions { #region Store Flags Extensions static StoreFlagsRequest GetStoreFlagsRequest (StoreAction action, bool silent, MessageFlags flags, HashSet? keywords = null, ulong? modseq = null) { if (keywords != null) { return new StoreFlagsRequest (action, flags, keywords) { UnchangedSince = modseq, Silent = silent }; } else { return new StoreFlagsRequest (action, flags) { UnchangedSince = modseq, Silent = silent }; } } /// /// Add a set of flags to the specified message. /// /// /// Adds a set of flags to the specified message. /// /// The folder. /// The UID of the message. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddFlags (this IMailFolder folder, UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (uid, GetStoreFlagsRequest (StoreAction.Add, silent, flags), cancellationToken); } /// /// Asynchronously add a set of flags to the specified message. /// /// /// Asynchronously adds a set of flags to the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddFlagsAsync (this IMailFolder folder, UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uid, GetStoreFlagsRequest (StoreAction.Add, silent, flags), cancellationToken); } /// /// Add a set of flags to the specified message. /// /// /// Adds a set of flags to the specified message. /// /// The folder. /// The UID of the message. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddFlags (this IMailFolder folder, UniqueId uid, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (uid, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords), cancellationToken); } /// /// Asynchronously add a set of flags to the specified message. /// /// /// Asynchronously adds a set of flags to the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddFlagsAsync (this IMailFolder folder, UniqueId uid, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uid, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords), cancellationToken); } /// /// Add a set of flags to the specified messages. /// /// /// Adds a set of flags to the specified messages. /// /// The folder. /// The UIDs of the messages. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddFlags (this IMailFolder folder, IList uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreFlagsRequest (StoreAction.Add, silent, flags), cancellationToken); } /// /// Asynchronously add a set of flags to the specified messages. /// /// /// Asynchronously adds a set of flags to the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddFlagsAsync (this IMailFolder folder, IList uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Add, silent, flags), cancellationToken); } /// /// Add a set of flags to the specified messages. /// /// /// Adds a set of flags to the specified messages. /// /// The folder. /// The UIDs of the messages. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddFlags (this IMailFolder folder, IList uids, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords), cancellationToken); } /// /// Asynchronously add a set of flags to the specified messages. /// /// /// Asynchronously adds a set of flags to the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddFlagsAsync (this IMailFolder folder, IList uids, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords), cancellationToken); } /// /// Remove a set of flags from the specified message. /// /// /// Removes a set of flags from the specified message. /// /// The folder. /// The UIDs of the message. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveFlags (this IMailFolder folder, UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (uid, GetStoreFlagsRequest (StoreAction.Remove, silent, flags), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified message. /// /// /// Asynchronously removes a set of flags from the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveFlagsAsync (this IMailFolder folder, UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uid, GetStoreFlagsRequest (StoreAction.Remove, silent, flags), cancellationToken); } /// /// Remove a set of flags from the specified message. /// /// /// Removes a set of flags from the specified message. /// /// The folder. /// The UIDs of the message. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveFlags (this IMailFolder folder, UniqueId uid, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (uid, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified message. /// /// /// Asynchronously removes a set of flags from the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveFlagsAsync (this IMailFolder folder, UniqueId uid, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uid, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords), cancellationToken); } /// /// Remove a set of flags from the specified messages. /// /// /// Removes a set of flags from the specified messages. /// /// The folder. /// The UIDs of the messages. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveFlags (this IMailFolder folder, IList uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreFlagsRequest (StoreAction.Remove, silent, flags), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified messages. /// /// /// Asynchronously removes a set of flags from the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveFlagsAsync (this IMailFolder folder, IList uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Remove, silent, flags), cancellationToken); } /// /// Remove a set of flags from the specified messages. /// /// /// Removes a set of flags from the specified messages. /// /// The folder. /// The UIDs of the messages. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveFlags (this IMailFolder folder, IList uids, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified messages. /// /// /// Asynchronously removes a set of flags from the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveFlagsAsync (this IMailFolder folder, IList uids, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords), cancellationToken); } /// /// Set the flags of the specified message. /// /// /// Sets the flags of the specified message. /// /// The folder. /// The UIDs of the message. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetFlags (this IMailFolder folder, UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (uid, GetStoreFlagsRequest (StoreAction.Set, silent, flags), cancellationToken); } /// /// Asynchronously set the flags of the specified message. /// /// /// Asynchronously sets the flags of the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The folder is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetFlagsAsync (this IMailFolder folder, UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uid, GetStoreFlagsRequest (StoreAction.Set, silent, flags), cancellationToken); } /// /// Set the flags of the specified message. /// /// /// Sets the flags of the specified message. /// /// The folder. /// The UIDs of the message. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetFlags (this IMailFolder folder, UniqueId uid, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (uid, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords), cancellationToken); } /// /// Asynchronously set the flags of the specified message. /// /// /// Asynchronously sets the flags of the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetFlagsAsync (this IMailFolder folder, UniqueId uid, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uid, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords), cancellationToken); } /// /// Set the flags of the specified messages. /// /// /// Sets the flags of the specified messages. /// /// The folder. /// The UIDs of the messages. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetFlags (this IMailFolder folder, IList uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreFlagsRequest (StoreAction.Set, silent, flags), cancellationToken); } /// /// Asynchronously set the flags of the specified messages. /// /// /// Asynchronously sets the flags of the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetFlagsAsync (this IMailFolder folder, IList uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Set, silent, flags), cancellationToken); } /// /// Set the flags of the specified messages. /// /// /// Sets the flags of the specified messages. /// /// The folder. /// The UIDs of the messages. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetFlags (this IMailFolder folder, IList uids, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords), cancellationToken); } /// /// Asynchronously set the flags of the specified messages. /// /// /// Asynchronously sets the flags of the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetFlagsAsync (this IMailFolder folder, IList uids, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords), cancellationToken); } /// /// Add a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList AddFlags (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreFlagsRequest (StoreAction.Add, silent, flags, null, modseq), cancellationToken); } /// /// Asynchronously add a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AddFlagsAsync (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Add, silent, flags, null, modseq), cancellationToken); } /// /// Add a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList AddFlags (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords, modseq), cancellationToken); } /// /// Asynchronously add a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AddFlagsAsync (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords, modseq), cancellationToken); } /// /// Remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList RemoveFlags (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, null, modseq), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> RemoveFlagsAsync (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, null, modseq), cancellationToken); } /// /// Remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList RemoveFlags (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords, modseq), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> RemoveFlagsAsync (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords, modseq), cancellationToken); } /// /// Set the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Sets the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList SetFlags (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreFlagsRequest (StoreAction.Set, silent, flags, null, modseq), cancellationToken); } /// /// Asynchronously set the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously sets the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> SetFlagsAsync (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Set, silent, flags, null, modseq), cancellationToken); } /// /// Set the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Sets the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList SetFlags (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords, modseq), cancellationToken); } /// /// Asynchronously set the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously sets the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> SetFlagsAsync (this IMailFolder folder, IList uids, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords, modseq), cancellationToken); } /// /// Add a set of flags to the specified message. /// /// /// Adds a set of flags to the specified message. /// /// The folder. /// The index of the message. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddFlags (this IMailFolder folder, int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (index, GetStoreFlagsRequest (StoreAction.Add, silent, flags), cancellationToken); } /// /// Asynchronously add a set of flags to the specified message. /// /// /// Asynchronously adds a set of flags to the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the messages. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddFlagsAsync (this IMailFolder folder, int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (index, GetStoreFlagsRequest (StoreAction.Add, silent, flags), cancellationToken); } /// /// Add a set of flags to the specified message. /// /// /// Adds a set of flags to the specified message. /// /// The folder. /// The index of the message. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddFlags (this IMailFolder folder, int index, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (index, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords), cancellationToken); } /// /// Asynchronously add a set of flags to the specified message. /// /// /// Asynchronously adds a set of flags to the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the messages. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddFlagsAsync (this IMailFolder folder, int index, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (index, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords), cancellationToken); } /// /// Add a set of flags to the specified messages. /// /// /// Adds a set of flags to the specified messages. /// /// The folder. /// The indexes of the messages. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddFlags (this IMailFolder folder, IList indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Add, silent, flags), cancellationToken); } /// /// Asynchronously add a set of flags to the specified messages. /// /// /// Asynchronously adds a set of flags to the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddFlagsAsync (this IMailFolder folder, IList indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Add, silent, flags), cancellationToken); } /// /// Add a set of flags to the specified messages. /// /// /// Adds a set of flags to the specified messages. /// /// The folder. /// The indexes of the messages. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddFlags (this IMailFolder folder, IList indexes, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords), cancellationToken); } /// /// Asynchronously add a set of flags to the specified messages. /// /// /// Asynchronously adds a set of flags to the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddFlagsAsync (this IMailFolder folder, IList indexes, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords), cancellationToken); } /// /// Remove a set of flags from the specified message. /// /// /// Removes a set of flags from the specified message. /// /// The folder. /// The index of the message. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveFlags (this IMailFolder folder, int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (index, GetStoreFlagsRequest (StoreAction.Remove, silent, flags), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified message. /// /// /// Asynchronously removes a set of flags from the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the message. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveFlagsAsync (this IMailFolder folder, int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (index, GetStoreFlagsRequest (StoreAction.Remove, silent, flags), cancellationToken); } /// /// Remove a set of flags from the specified message. /// /// /// Removes a set of flags from the specified message. /// /// The folder. /// The index of the message. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveFlags (this IMailFolder folder, int index, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (index, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified message. /// /// /// Asynchronously removes a set of flags from the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the message. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveFlagsAsync (this IMailFolder folder, int index, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (index, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords), cancellationToken); } /// /// Remove a set of flags from the specified messages. /// /// /// Removes a set of flags from the specified messages. /// /// The folder. /// The indexes of the messages. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveFlags (this IMailFolder folder, IList indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Remove, silent, flags), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified messages. /// /// /// Asynchronously removes a set of flags from the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveFlagsAsync (this IMailFolder folder, IList indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Remove, silent, flags), cancellationToken); } /// /// Remove a set of flags from the specified messages. /// /// /// Removes a set of flags from the specified messages. /// /// The folder. /// The indexes of the messages. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveFlags (this IMailFolder folder, IList indexes, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified messages. /// /// /// Asynchronously removes a set of flags from the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveFlagsAsync (this IMailFolder folder, IList indexes, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords), cancellationToken); } /// /// Set the flags of the specified message. /// /// /// Sets the flags of the specified message. /// /// The folder. /// The index of the message. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetFlags (this IMailFolder folder, int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (index, GetStoreFlagsRequest (StoreAction.Set, silent, flags), cancellationToken); } /// /// Asynchronously set the flags of the specified message. /// /// /// Asynchronously sets the flags of the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the message. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetFlagsAsync (this IMailFolder folder, int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (index, GetStoreFlagsRequest (StoreAction.Set, silent, flags), cancellationToken); } /// /// Set the flags of the specified message. /// /// /// Sets the flags of the specified message. /// /// The folder. /// The index of the message. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetFlags (this IMailFolder folder, int index, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (index, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords), cancellationToken); } /// /// Asynchronously set the flags of the specified message. /// /// /// Asynchronously sets the flags of the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the message. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetFlagsAsync (this IMailFolder folder, int index, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (index, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords), cancellationToken); } /// /// Set the flags of the specified messages. /// /// /// Sets the flags of the specified messages. /// /// The folder. /// The indexes of the messages. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetFlags (this IMailFolder folder, IList indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Set, silent, flags), cancellationToken); } /// /// Asynchronously set the flags of the specified messages. /// /// /// Asynchronously sets the flags of the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetFlagsAsync (this IMailFolder folder, IList indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Set, silent, flags), cancellationToken); } /// /// Set the flags of the specified messages. /// /// /// Sets the flags of the specified messages. /// /// The folder. /// The indexes of the messages. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetFlags (this IMailFolder folder, IList indexes, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords), cancellationToken); } /// /// Asynchronously set the flags of the specified messages. /// /// /// Asynchronously sets the flags of the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetFlagsAsync (this IMailFolder folder, IList indexes, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords), cancellationToken); } /// /// Add a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList AddFlags (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Add, silent, flags, null, modseq), cancellationToken); } /// /// Asynchronously add a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AddFlagsAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Add, silent, flags, null, modseq), cancellationToken); } /// /// Add a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList AddFlags (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords, modseq), cancellationToken); } /// /// Asynchronously add a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to add. /// A set of user-defined flags to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AddFlagsAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Add, silent, flags, keywords, modseq), cancellationToken); } /// /// Remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList RemoveFlags (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, null, modseq), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> RemoveFlagsAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, null, modseq), cancellationToken); } /// /// Remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList RemoveFlags (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords, modseq), cancellationToken); } /// /// Asynchronously remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to remove. /// A set of user-defined flags to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> RemoveFlagsAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Remove, silent, flags, keywords, modseq), cancellationToken); } /// /// Set the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Sets the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList SetFlags (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Set, silent, flags, null, modseq), cancellationToken); } /// /// Asynchronously set the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously sets the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> SetFlagsAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Set, silent, flags, null, modseq), cancellationToken); } /// /// Set the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Sets the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList SetFlags (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords, modseq), cancellationToken); } /// /// Asynchronously set the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously sets the flags of the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The message flags to set. /// A set of user-defined flags to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> SetFlagsAsync (this IMailFolder folder, IList indexes, ulong modseq, MessageFlags flags, HashSet keywords, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreFlagsRequest (StoreAction.Set, silent, flags, keywords, modseq), cancellationToken); } #endregion Store Flags Extensions #region Store Labels Extensions static StoreLabelsRequest GetStoreLabelsRequest (StoreAction action, bool silent, IList labels, ulong? modseq = null) { if (labels == null) throw new ArgumentNullException (nameof (labels)); return new StoreLabelsRequest (action, labels) { UnchangedSince = modseq, Silent = silent }; } /// /// Add a set of labels to the specified message. /// /// /// Adds a set of labels to the specified message. /// /// The folder. /// The UID of the message. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddLabels (this IMailFolder folder, UniqueId uid, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (new[] { uid }, GetStoreLabelsRequest (StoreAction.Add, silent, labels), cancellationToken); } /// /// Asynchronously add a set of labels to the specified message. /// /// /// Asynchronously adds a set of labels to the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddLabelsAsync (this IMailFolder folder, UniqueId uid, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (new[] { uid }, GetStoreLabelsRequest (StoreAction.Add, silent, labels), cancellationToken); } /// /// Add a set of labels to the specified messages. /// /// /// Adds a set of labels to the specified messages. /// /// The folder. /// The UIDs of the messages. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddLabels (this IMailFolder folder, IList uids, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreLabelsRequest (StoreAction.Add, silent, labels), cancellationToken); } /// /// Asynchronously add a set of labels to the specified messages. /// /// /// Asynchronously adds a set of labels to the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddLabelsAsync (this IMailFolder folder, IList uids, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreLabelsRequest (StoreAction.Add, silent, labels), cancellationToken); } /// /// Remove a set of labels from the specified message. /// /// /// Removes a set of labels from the specified message. /// /// The folder. /// The UIDs of the message. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveLabels (this IMailFolder folder, UniqueId uid, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (new[] { uid }, GetStoreLabelsRequest (StoreAction.Remove, silent, labels), cancellationToken); } /// /// Asynchronously remove a set of labels from the specified message. /// /// /// Asynchronously removes a set of labels from the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveLabelsAsync (this IMailFolder folder, UniqueId uid, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (new[] { uid }, GetStoreLabelsRequest (StoreAction.Remove, silent, labels), cancellationToken); } /// /// Remove a set of labels from the specified messages. /// /// /// Removes a set of labels from the specified messages. /// /// The folder. /// The UIDs of the messages. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveLabels (this IMailFolder folder, IList uids, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreLabelsRequest (StoreAction.Remove, silent, labels), cancellationToken); } /// /// Asynchronously remove a set of labels from the specified messages. /// /// /// Asynchronously removes a set of labels from the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveLabelsAsync (this IMailFolder folder, IList uids, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreLabelsRequest (StoreAction.Remove, silent, labels), cancellationToken); } /// /// Set the labels of the specified message. /// /// /// Sets the labels of the specified message. /// /// The folder. /// The UIDs of the message. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetLabels (this IMailFolder folder, UniqueId uid, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (new[] { uid }, GetStoreLabelsRequest (StoreAction.Set, silent, labels), cancellationToken); } /// /// Asynchronously set the labels of the specified message. /// /// /// Asynchronously sets the labels of the specified message. /// /// An asynchronous task context. /// The folder. /// The UID of the message. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetLabelsAsync (this IMailFolder folder, UniqueId uid, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (new[] { uid }, GetStoreLabelsRequest (StoreAction.Set, silent, labels), cancellationToken); } /// /// Set the labels of the specified messages. /// /// /// Sets the labels of the specified messages. /// /// The folder. /// The UIDs of the messages. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetLabels (this IMailFolder folder, IList uids, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (uids, GetStoreLabelsRequest (StoreAction.Set, silent, labels), cancellationToken); } /// /// Asynchronously set the labels of the specified messages. /// /// /// Asynchronously sets the labels of the specified messages. /// /// An asynchronous task context. /// The folder. /// The UIDs of the messages. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetLabelsAsync (this IMailFolder folder, IList uids, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreLabelsRequest (StoreAction.Set, silent, labels), cancellationToken); } /// /// Add a set of labels to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Adds a set of labels to the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList AddLabels (this IMailFolder folder, IList uids, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreLabelsRequest (StoreAction.Add, silent, labels, modseq), cancellationToken); } /// /// Asynchronously add a set of labels to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously adds a set of labels to the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AddLabelsAsync (this IMailFolder folder, IList uids, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreLabelsRequest (StoreAction.Add, silent, labels, modseq), cancellationToken); } /// /// Remove a set of labels from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Removes a set of labels from the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList RemoveLabels (this IMailFolder folder, IList uids, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreLabelsRequest (StoreAction.Remove, silent, labels, modseq), cancellationToken); } /// /// Asynchronously remove a set of labels from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously removes a set of labels from the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> RemoveLabelsAsync (this IMailFolder folder, IList uids, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreLabelsRequest (StoreAction.Remove, silent, labels, modseq), cancellationToken); } /// /// Set the labels of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Sets the labels of the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList SetLabels (this IMailFolder folder, IList uids, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.Store (uids, GetStoreLabelsRequest (StoreAction.Set, silent, labels, modseq), cancellationToken); } /// /// Asynchronously set the labels of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously sets the labels of the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The folder. /// The UIDs of the messages. /// The mod-sequence value. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> SetLabelsAsync (this IMailFolder folder, IList uids, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (uids, GetStoreLabelsRequest (StoreAction.Set, silent, labels, modseq), cancellationToken); } /// /// Add a set of labels to the specified message. /// /// /// Adds a set of labels to the specified message. /// /// The folder. /// The index of the message. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddLabels (this IMailFolder folder, int index, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (new[] { index }, GetStoreLabelsRequest (StoreAction.Add, silent, labels), cancellationToken); } /// /// Asynchronously add a set of labels to the specified message. /// /// /// Asynchronously adds a set of labels to the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the messages. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddLabelsAsync (this IMailFolder folder, int index, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (new[] { index }, GetStoreLabelsRequest (StoreAction.Add, silent, labels), cancellationToken); } /// /// Add a set of labels to the specified messages. /// /// /// Adds a set of labels to the specified messages. /// /// The folder. /// The indexes of the messages. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void AddLabels (this IMailFolder folder, IList indexes, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreLabelsRequest (StoreAction.Add, silent, labels), cancellationToken); } /// /// Asynchronously add a set of labels to the specified messages. /// /// /// Asynchronously adds a set of labels to the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task AddLabelsAsync (this IMailFolder folder, IList indexes, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreLabelsRequest (StoreAction.Add, silent, labels), cancellationToken); } /// /// Remove a set of labels from the specified message. /// /// /// Removes a set of labels from the specified message. /// /// The folder. /// The index of the message. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveLabels (this IMailFolder folder, int index, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (new[] { index }, GetStoreLabelsRequest (StoreAction.Remove, silent, labels), cancellationToken); } /// /// Asynchronously remove a set of labels from the specified message. /// /// /// Asynchronously removes a set of labels from the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the message. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveLabelsAsync (this IMailFolder folder, int index, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (new[] { index }, GetStoreLabelsRequest (StoreAction.Remove, silent, labels), cancellationToken); } /// /// Remove a set of labels from the specified messages. /// /// /// Removes a set of labels from the specified messages. /// /// The folder. /// The indexes of the messages. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void RemoveLabels (this IMailFolder folder, IList indexes, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreLabelsRequest (StoreAction.Remove, silent, labels), cancellationToken); } /// /// Asynchronously remove a set of labels from the specified messages. /// /// /// Asynchronously removes a set of labels from the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task RemoveLabelsAsync (this IMailFolder folder, IList indexes, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreLabelsRequest (StoreAction.Remove, silent, labels), cancellationToken); } /// /// Set the labels of the specified message. /// /// /// Sets the labels of the specified message. /// /// The folder. /// The index of the message. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetLabels (this IMailFolder folder, int index, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (new[] { index }, GetStoreLabelsRequest (StoreAction.Set, silent, labels), cancellationToken); } /// /// Asynchronously set the labels of the specified message. /// /// /// Asynchronously sets the labels of the specified message. /// /// An asynchronous task context. /// The folder. /// The index of the message. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetLabelsAsync (this IMailFolder folder, int index, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (new[] { index }, GetStoreLabelsRequest (StoreAction.Set, silent, labels), cancellationToken); } /// /// Set the labels of the specified messages. /// /// /// Sets the labels of the specified messages. /// /// The folder. /// The indexes of the messages. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static void SetLabels (this IMailFolder folder, IList indexes, IList labels, bool silent, CancellationToken cancellationToken = default) { folder.Store (indexes, GetStoreLabelsRequest (StoreAction.Set, silent, labels), cancellationToken); } /// /// Asynchronously set the labels of the specified messages. /// /// /// Asynchronously sets the labels of the specified messages. /// /// An asynchronous task context. /// The folder. /// The indexes of the messages. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task SetLabelsAsync (this IMailFolder folder, IList indexes, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreLabelsRequest (StoreAction.Set, silent, labels), cancellationToken); } /// /// Add a set of labels to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Adds a set of labels to the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList AddLabels (this IMailFolder folder, IList indexes, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreLabelsRequest (StoreAction.Add, silent, labels, modseq), cancellationToken); } /// /// Asynchronously add a set of labels to the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously adds a set of labels to the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The labels to add. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> AddLabelsAsync (this IMailFolder folder, IList indexes, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreLabelsRequest (StoreAction.Add, silent, labels, modseq), cancellationToken); } /// /// Remove a set of labels from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Removes a set of labels from the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList RemoveLabels (this IMailFolder folder, IList indexes, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreLabelsRequest (StoreAction.Remove, silent, labels, modseq), cancellationToken); } /// /// Asynchronously remove a set of labels from the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously removes a set of labels from the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The labels to remove. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> RemoveLabelsAsync (this IMailFolder folder, IList indexes, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreLabelsRequest (StoreAction.Remove, silent, labels, modseq), cancellationToken); } /// /// Set the labels of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Sets the labels of the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static IList SetLabels (this IMailFolder folder, IList indexes, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.Store (indexes, GetStoreLabelsRequest (StoreAction.Set, silent, labels, modseq), cancellationToken); } /// /// Asynchronously set the labels of the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously sets the labels of the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The folder. /// The indexes of the messages. /// The mod-sequence value. /// The labels to set. /// If set to , no events will be emitted. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public static Task> SetLabelsAsync (this IMailFolder folder, IList indexes, ulong modseq, IList labels, bool silent, CancellationToken cancellationToken = default) { return folder.StoreAsync (indexes, GetStoreLabelsRequest (StoreAction.Set, silent, labels, modseq), cancellationToken); } #endregion Store Labels Extensions } } ================================================ FILE: MailKit/IMailService.cs ================================================ // // IMailService.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Net.Security; using System.Threading.Tasks; using System.Collections.Generic; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using SslProtocols = System.Security.Authentication.SslProtocols; using MailKit.Net.Proxy; using MailKit.Security; namespace MailKit { /// /// An interface for message services such as SMTP, POP3, or IMAP. /// /// /// Implemented by , /// and /// . /// public interface IMailService : IDisposable { /// /// Get an object that can be used to synchronize access to the folder. /// /// /// Gets an object that can be used to synchronize access to the folder. /// /// The sync root. object SyncRoot { get; } /// /// Get or set the set of enabled SSL and/or TLS protocol versions that the client is allowed to use. /// /// /// Gets or sets the enabled SSL and/or TLS protocol versions that the client is allowed to use. /// By default, MailKit initializes this value to which allows the /// operating system to choose the best protocol to use and to block protocols that are not secure. /// This property should be set before calling any of the /// Connect or /// ConnectAsync methods. /// /// The SSL and TLS protocol versions that are supported. SslProtocols SslProtocols { get; set; } #if NET5_0_OR_GREATER /// /// Get or set the cipher suites allowed to be used when negotiating an SSL or TLS connection. /// /// /// Specifies the cipher suites allowed to be used when negotiating an SSL or TLS connection. /// When set to , the operating system default is used. Use extreme caution when /// changing this setting. /// This property should be set before calling any of the /// Connect or /// ConnectAsync methods. /// /// The cipher algorithms allowed for use when negotiating SSL or TLS encryption. CipherSuitesPolicy? SslCipherSuitesPolicy { get; set; } /// /// Get the negotiated SSL or TLS cipher suite. /// /// /// Gets the negotiated SSL or TLS cipher suite once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher suite. TlsCipherSuite? SslCipherSuite { get; } #endif /// /// Get or set the client SSL certificates. /// /// /// Some servers may require the client SSL certificates in order /// to allow the user to connect. /// This property should be set before calling any of the /// Connect or /// ConnectAsync methods. /// /// The client SSL certificates. X509CertificateCollection? ClientCertificates { get; set; } /// /// Get or set whether connecting via SSL/TLS should check certificate revocation. /// /// /// Gets or sets whether connecting via SSL/TLS should check certificate revocation. /// Normally, the value of this property should be set to (the default) for security /// reasons, but there are times when it may be necessary to set it to . /// For example, most Certificate Authorities are probably pretty good at keeping their CRL and/or /// OCSP servers up 24/7, but occasionally they do go down or are otherwise unreachable due to other /// network problems between the client and the Certificate Authority. When this happens, it becomes /// impossible to check the revocation status of one or more of the certificates in the chain /// resulting in an being thrown in the /// Connect method. If this becomes a problem, /// it may become desirable to set to . /// /// if certificate revocation should be checked; otherwise, . bool CheckCertificateRevocation { get; set; } /// /// Get or set a callback function to validate the server certificate. /// /// /// Gets or sets a callback function to validate the server certificate. /// This property should be set before calling any of the /// Connect or /// ConnectAsync methods. /// /// /// /// /// The server certificate validation callback function. RemoteCertificateValidationCallback? ServerCertificateValidationCallback { get; set; } /// /// Get or set the local IP end point to use when connecting to a remote host. /// /// /// Gets or sets the local IP end point to use when connecting to a remote host. /// /// The local IP end point or to use the default end point. IPEndPoint? LocalEndPoint { get; set; } /// /// Get or set the proxy client to use when connecting to a remote host. /// /// /// Gets or sets the proxy client to use when connecting to a remote host via any of the /// Connect methods. /// /// /// /// /// The proxy client. IProxyClient? ProxyClient { get; set; } /// /// Get the authentication mechanisms supported by the message service. /// /// /// The authentication mechanisms are queried during the /// Connect method. /// /// The supported authentication mechanisms. HashSet AuthenticationMechanisms { get; } /// /// Get whether or not the client is currently authenticated with the mail server. /// /// /// Gets whether or not the client is currently authenticated with the mail server. /// To authenticate with the mail server, use one of the /// Authenticate methods /// or any of the Async alternatives. /// /// if the client is authenticated; otherwise, . bool IsAuthenticated { get; } /// /// Get whether or not the service is currently connected. /// /// /// The state is set to immediately after /// one of the Connect /// methods succeeds and is not set back to until either the client /// is disconnected via or until a /// is thrown while attempting to read or write to /// the underlying network socket. /// When an is caught, the connection state of the /// should be checked before continuing. /// /// if the service connected; otherwise, . bool IsConnected { get; } /// /// Get whether or not the connection is secure (typically via SSL or TLS). /// /// /// Gets whether or not the connection is secure (typically via SSL or TLS). /// /// if the connection is secure; otherwise, . bool IsSecure { get; } /// /// Get whether or not the connection is encrypted (typically via SSL or TLS). /// /// /// Gets whether or not the connection is encrypted (typically via SSL or TLS). /// /// if the connection is encrypted; otherwise, . bool IsEncrypted { get; } /// /// Get whether or not the connection is signed (typically via SSL or TLS). /// /// /// Gets whether or not the connection is signed (typically via SSL or TLS). /// /// if the connection is signed; otherwise, . bool IsSigned { get; } /// /// Get the negotiated SSL or TLS protocol version. /// /// /// Gets the negotiated SSL or TLS protocol version once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS protocol version. SslProtocols SslProtocol { get; } /// /// Get the negotiated SSL or TLS cipher algorithm. /// /// /// Gets the negotiated SSL or TLS cipher algorithm once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif CipherAlgorithmType? SslCipherAlgorithm { get; } /// /// Get the negotiated SSL or TLS cipher algorithm strength. /// /// /// Gets the negotiated SSL or TLS cipher algorithm strength once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif int? SslCipherStrength { get; } /// /// Get the negotiated SSL or TLS hash algorithm. /// /// /// Gets the negotiated SSL or TLS hash algorithm once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS hash algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif HashAlgorithmType? SslHashAlgorithm { get; } /// /// Get the negotiated SSL or TLS hash algorithm strength. /// /// /// Gets the negotiated SSL or TLS hash algorithm strength once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS hash algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif int? SslHashStrength { get; } /// /// Get the negotiated SSL or TLS key exchange algorithm. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS key exchange algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif ExchangeAlgorithmType? SslKeyExchangeAlgorithm { get; } /// /// Get the negotiated SSL or TLS key exchange algorithm strength. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm strength once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS key exchange algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif int? SslKeyExchangeStrength { get; } /// /// Get or set the timeout for network streaming operations, in milliseconds. /// /// /// Gets or sets the underlying socket stream's /// and values. /// /// The timeout in milliseconds. int Timeout { get; set; } /// /// Establish a connection to the specified mail server. /// /// /// Establish a connection to the specified mail server. /// If a successful connection is made, the /// property will be populated. /// /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// if the client should make an SSL-wrapped connection to the server; otherwise, . /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// void Connect (string host, int port, bool useSsl, CancellationToken cancellationToken = default); /// /// Asynchronously establish a connection to the specified mail server. /// /// /// Asynchronously establishes a connection to the specified mail server. /// If a successful connection is made, the /// property will be populated. /// /// An asynchronous task context. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// if the client should make an SSL-wrapped connection to the server; otherwise, . /// The cancellation token. /// /// The is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// Task ConnectAsync (string host, int port, bool useSsl, CancellationToken cancellationToken = default); /// /// Establish a connection to the specified mail server. /// /// /// Establish a connection to the specified mail server. /// If a successful connection is made, the /// property will be populated. /// /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// void Connect (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Asynchronously establish a connection to the specified mail server. /// /// /// Asynchronously establishes a connection to the specified mail server. /// If a successful connection is made, the /// property will be populated. /// /// An asynchronous task context. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// The is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// Task ConnectAsync (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Establish a connection to the specified mail server using the provided socket. /// /// /// Establish a connection to the specified mail server using the provided socket. /// If a successful connection is made, the /// property will be populated. /// /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// void Connect (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Asynchronously establish a connection to the specified mail server using the provided socket. /// /// /// Asynchronously establishes a connection to the specified mail server using the provided socket. /// If a successful connection is made, the /// property will be populated. /// /// An asynchronous task context. /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// Task ConnectAsync (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Establish a connection to the specified mail server using the provided stream. /// /// /// Establish a connection to the specified mail server using the provided stream. /// If a successful connection is made, the /// property will be populated. /// /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// void Connect (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Asynchronously establish a connection to the specified mail server using the provided stream. /// /// /// Asynchronously establishes a connection to the specified mail server using the provided stream. /// If a successful connection is made, the /// property will be populated. /// /// An asynchronous task context. /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// Task ConnectAsync (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Authenticate using the supplied credentials. /// /// /// Authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// /// The user's credentials. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// void Authenticate (ICredentials credentials, CancellationToken cancellationToken = default); /// /// Asynchronously authenticate using the supplied credentials. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// /// An asynchronous task context. /// The user's credentials. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// Task AuthenticateAsync (ICredentials credentials, CancellationToken cancellationToken = default); /// /// Authenticate using the supplied credentials. /// /// /// Authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// /// The encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// void Authenticate (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default); /// /// Asynchronously authenticate using the supplied credentials. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// /// An asynchronous task context. /// The encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// Task AuthenticateAsync (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default); /// /// Authenticate using the specified user name and password. /// /// /// Authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// The encoding to use for the user's credentials. /// The user name. /// The password. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// void Authenticate (Encoding encoding, string userName, string password, CancellationToken cancellationToken = default); /// /// Asynchronously authenticate using the specified user name and password. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// An asynchronous task context. /// The encoding to use for the user's credentials. /// The user name. /// The password. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// Task AuthenticateAsync (Encoding encoding, string userName, string password, CancellationToken cancellationToken = default); /// /// Authenticate using the specified user name and password. /// /// /// Authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// /// /// /// The user name. /// The password. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// void Authenticate (string userName, string password, CancellationToken cancellationToken = default); /// /// Asynchronously authenticate using the specified user name and password. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// An asynchronous task context. /// The user name. /// The password. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// Task AuthenticateAsync (string userName, string password, CancellationToken cancellationToken = default); /// /// Authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// void Authenticate (SaslMechanism mechanism, CancellationToken cancellationToken = default); /// /// Asynchronously authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// An asynchronous task context. /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// Task AuthenticateAsync (SaslMechanism mechanism, CancellationToken cancellationToken = default); /// /// Disconnect the service. /// /// /// Disconnects from the service. /// If is , a "QUIT" command will be issued in order to disconnect cleanly. /// /// If set to , a "QUIT" command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// void Disconnect (bool quit, CancellationToken cancellationToken = default); /// /// Asynchronously disconnect the service. /// /// /// Asynchronously disconnects from the service. /// If is , a "QUIT" command will be issued in order to disconnect cleanly. /// /// An asynchronous task context. /// If set to , a logout/quit command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// Task DisconnectAsync (bool quit, CancellationToken cancellationToken = default); /// /// Ping the message service to keep the connection alive. /// /// /// Mail servers, if left idle for too long, will automatically drop the connection. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// void NoOp (CancellationToken cancellationToken = default); /// /// Asynchronously ping the mail server to keep the connection alive. /// /// /// Mail servers, if left idle for too long, will automatically drop the connection. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// Task NoOpAsync (CancellationToken cancellationToken = default); /// /// Occurs when the client has been successfully connected. /// /// /// The event is raised when the client /// successfully connects to the mail server. /// event EventHandler? Connected; /// /// Occurs when the client has been disconnected. /// /// /// The event is raised whenever the client /// has been disconnected. /// event EventHandler? Disconnected; /// /// Occurs when the client has been successfully authenticated. /// /// /// The event is raised whenever the client /// has been authenticated. /// event EventHandler? Authenticated; } } ================================================ FILE: MailKit/IMailSpool.cs ================================================ // // IMailSpool.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.IO; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// An interface for retrieving messages from a spool. /// /// /// An interface for retrieving messages from a spool. /// Implemented by . /// public interface IMailSpool : IMailService, IEnumerable { /// /// Get the number of messages available in the message spool. /// /// /// Gets the number of messages available in the message spool. /// Once authenticated, the property will be set /// to the number of available messages in the spool. /// /// The message count. int Count { get; } /// /// Get whether or not the service supports referencing messages by UIDs. /// /// /// Not all servers support referencing messages by UID, so this property should /// be checked before using /// and . /// If the server does not support UIDs, then all methods that take UID arguments /// along with and /// will fail. /// /// if supports uids; otherwise, . bool SupportsUids { get; } /// /// Get the message count. /// /// /// Gets the message count. /// /// The message count. /// The cancellation token. int GetMessageCount (CancellationToken cancellationToken = default); /// /// Asynchronously get the message count. /// /// /// Asynchronously gets the message count. /// /// The message count. /// The cancellation token. Task GetMessageCountAsync (CancellationToken cancellationToken = default); /// /// Get the UID of the message at the specified index. /// /// /// Not all servers support UIDs, so you should first check /// the property. /// /// The message UID. /// The message index. /// The cancellation token. string GetMessageUid (int index, CancellationToken cancellationToken = default); /// /// Asynchronously get the UID of the message at the specified index. /// /// /// Not all servers support UIDs, so you should first check /// the property. /// /// The message UID. /// The message index. /// The cancellation token. Task GetMessageUidAsync (int index, CancellationToken cancellationToken = default); /// /// Get the full list of available message UIDs. /// /// /// Not all servers support UIDs, so you should first check /// the property. /// /// The message UIDs. /// The cancellation token. IList GetMessageUids (CancellationToken cancellationToken = default); /// /// Asynchronously get the full list of available message UIDs. /// /// /// Not all servers support UIDs, so you should first check /// the property. /// /// The message UIDs. /// The cancellation token. Task> GetMessageUidsAsync (CancellationToken cancellationToken = default); /// /// Get the size of the specified message, in bytes. /// /// /// Gets the size of the specified message, in bytes. /// /// The message size, in bytes. /// The index of the message. /// The cancellation token. int GetMessageSize (int index, CancellationToken cancellationToken = default); /// /// Asynchronously get the size of the specified message, in bytes. /// /// /// Asynchronously gets the size of the specified message, in bytes. /// /// The message size, in bytes. /// The index of the message. /// The cancellation token. Task GetMessageSizeAsync (int index, CancellationToken cancellationToken = default); /// /// Get the sizes for all available messages, in bytes. /// /// /// Gets the sizes for all available messages, in bytes. /// /// The message sizes, in bytes. /// The cancellation token. IList GetMessageSizes (CancellationToken cancellationToken = default); /// /// Asynchronously get the sizes for all available messages, in bytes. /// /// /// Asynchronously gets the sizes for all available messages, in bytes. /// /// The message sizes, in bytes. /// The cancellation token. Task> GetMessageSizesAsync (CancellationToken cancellationToken = default); /// /// Get the headers for the specified message. /// /// /// Gets the headers for the specified message. /// /// The message headers. /// The index of the message. /// The cancellation token. HeaderList GetMessageHeaders (int index, CancellationToken cancellationToken = default); /// /// Asynchronously get the headers for the specified message. /// /// /// Asynchronously gets the headers for the specified message. /// /// The message headers. /// The index of the message. /// The cancellation token. Task GetMessageHeadersAsync (int index, CancellationToken cancellationToken = default); /// /// Get the headers for the specified messages. /// /// /// Gets the headers for the specified messages. /// /// The headers for the specified messages. /// The indexes of the messages. /// The cancellation token. IList GetMessageHeaders (IList indexes, CancellationToken cancellationToken = default); /// /// Asynchronously get the headers for the specified messages. /// /// /// Asynchronously gets the headers for the specified messages. /// /// The headers for the specified messages. /// The indexes of the messages. /// The cancellation token. Task> GetMessageHeadersAsync (IList indexes, CancellationToken cancellationToken = default); /// /// Get the headers of the messages within the specified range. /// /// /// Gets the headers of the messages within the specified range. /// /// The headers of the messages within the specified range. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. IList GetMessageHeaders (int startIndex, int count, CancellationToken cancellationToken = default); /// /// Get the headers of the messages within the specified range. /// /// /// Gets the headers of the messages within the specified range. /// /// The headers of the messages within the specified range. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. Task> GetMessageHeadersAsync (int startIndex, int count, CancellationToken cancellationToken = default); /// /// Get the message at the specified index. /// /// /// Gets the message at the specified index. /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. MimeMessage GetMessage (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the message at the specified index. /// /// /// Asynchronously gets the message at the specified index. /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. Task GetMessageAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the messages at the specified indexes. /// /// /// Gets the messages at the specified indexes. /// /// The messages. /// The indexes of the messages. /// The cancellation token. /// The progress reporting mechanism. IList GetMessages (IList indexes, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the messages at the specified indexes. /// /// /// Asynchronously gets the messages at the specified indexes. /// /// The messages. /// The indexes of the messages. /// The cancellation token. /// The progress reporting mechanism. Task> GetMessagesAsync (IList indexes, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the messages within the specified range. /// /// /// Gets the messages within the specified range. /// /// The messages. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// The progress reporting mechanism. IList GetMessages (int startIndex, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the messages within the specified range. /// /// /// Asynchronously gets the messages within the specified range. /// /// The messages. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// The progress reporting mechanism. Task> GetMessagesAsync (int startIndex, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the message or header stream at the specified index. /// /// /// Gets the message or header stream at the specified index. /// /// The message or header stream. /// The index of the message. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. Stream GetStream (int index, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the message or header stream at the specified index. /// /// /// Asynchronously gets the message or header stream at the specified index. /// /// The message or header stream. /// The index of the message. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. Task GetStreamAsync (int index, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the message or header streams at the specified index. /// /// /// Gets the message or header streams at the specified index. /// /// The message or header streams. /// The indexes of the messages. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. IList GetStreams (IList indexes, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the message or header streams at the specified indexes. /// /// /// Asynchronously gets the message or header streams at the specified indexes. /// /// The message or header streams. /// The indexes of the messages. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. Task> GetStreamsAsync (IList indexes, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the message or header streams within the specified range. /// /// /// Gets the message or header streams within the specified range. /// /// The message or header streams. /// The index of the first stream to get. /// The number of streams to get. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. IList GetStreams (int startIndex, int count, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the message or header streams within the specified range. /// /// /// Asynchronously gets the message or header streams within the specified range. /// /// The messages. /// The index of the first stream to get. /// The number of streams to get. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. Task> GetStreamsAsync (int startIndex, int count, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Mark the specified message for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The index of the message. /// The cancellation token. void DeleteMessage (int index, CancellationToken cancellationToken = default); /// /// Asynchronously mark the specified message for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The index of the message. /// The cancellation token. Task DeleteMessageAsync (int index, CancellationToken cancellationToken = default); /// /// Mark the specified messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The indexes of the messages. /// The cancellation token. void DeleteMessages (IList indexes, CancellationToken cancellationToken = default); /// /// Asynchronously mark the specified messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The indexes of the messages. /// The cancellation token. Task DeleteMessagesAsync (IList indexes, CancellationToken cancellationToken = default); /// /// Mark the specified range of messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The index of the first message to mark for deletion. /// The number of messages to mark for deletion. /// The cancellation token. void DeleteMessages (int startIndex, int count, CancellationToken cancellationToken = default); /// /// Asynchronously mark the specified range of messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The index of the first message to mark for deletion. /// The number of messages to mark for deletion. /// The cancellation token. Task DeleteMessagesAsync (int startIndex, int count, CancellationToken cancellationToken = default); /// /// Mark all messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The cancellation token. void DeleteAllMessages (CancellationToken cancellationToken = default); /// /// Asynchronously mark all messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The cancellation token. Task DeleteAllMessagesAsync (CancellationToken cancellationToken = default); /// /// Reset the state of all messages marked for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The cancellation token. void Reset (CancellationToken cancellationToken = default); /// /// Asynchronously reset the state of all messages marked for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The cancellation token. Task ResetAsync (CancellationToken cancellationToken = default); } } ================================================ FILE: MailKit/IMailStore.cs ================================================ // // IMailStore.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; namespace MailKit { /// /// An interface for retrieving messages from a message store. /// /// /// An interface for retrieving messages from a message store. /// Implemented by . /// public interface IMailStore : IMailService { /// /// Get the personal namespaces. /// /// /// The personal folder namespaces contain a user's personal mailbox folders. /// /// The personal namespaces. FolderNamespaceCollection PersonalNamespaces { get; } /// /// Get the shared namespaces. /// /// /// The shared folder namespaces contain mailbox folders that are shared with the user. /// /// The shared namespaces. FolderNamespaceCollection SharedNamespaces { get; } /// /// Get the other namespaces. /// /// /// The other folder namespaces contain other mailbox folders. /// /// The other namespaces. FolderNamespaceCollection OtherNamespaces { get; } /// /// Get whether or not the mail store supports quotas. /// /// /// Gets whether or not the mail store supports quotas. /// /// if the mail store supports quotas; otherwise, . bool SupportsQuotas { get; } /// /// Get the threading algorithms supported by the mail store. /// /// /// The threading algorithms are queried as part of the /// Connect /// and Authenticate methods. /// /// /// /// /// The threading algorithms. HashSet ThreadingAlgorithms { get; } /// /// Get the Inbox folder. /// /// /// The Inbox folder is the default folder and is typically the folder /// where all new messages are delivered. /// /// The Inbox folder. IMailFolder? Inbox { get; } /// /// Enable the quick resynchronization feature. /// /// /// Enables quick resynchronization when a folder is opened using the /// /// method. /// If this feature is enabled, the event /// is replaced with the event. /// This method needs to be called immediately after /// , /// before the opening of any folders. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Quick resynchronization needs to be enabled before selecting a folder. /// /// /// The mail store does not support quick resynchronization. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// void EnableQuickResync (CancellationToken cancellationToken = default); /// /// Asynchronously enable the quick resynchronization feature. /// /// /// Enables quick resynchronization when a folder is opened using the /// /// method. /// If this feature is enabled, the event /// is replaced with the event. /// This method needs to be called immediately after /// , /// before the opening of any folders. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Quick resynchronization needs to be enabled before selecting a folder. /// /// /// The mail store does not support quick resynchronization. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// Task EnableQuickResyncAsync (CancellationToken cancellationToken = default); /// /// Get the specified special folder. /// /// /// Not all message stores support the concept of special folders, /// so this method may return . /// /// The folder if available; otherwise . /// The type of special folder. /// /// is out of range. /// IMailFolder? GetFolder (SpecialFolder folder); /// /// Get the folder for the specified namespace. /// /// /// The main reason to get the toplevel folder in a namespace is /// to list its child folders. /// /// The folder. /// The namespace. /// /// is . /// /// /// The folder could not be found. /// IMailFolder GetFolder (FolderNamespace @namespace); /// /// Get all of the folders within the specified namespace. /// /// /// Gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The namespace folder could not be found. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// IList GetFolders (FolderNamespace @namespace, bool subscribedOnly, CancellationToken cancellationToken = default); /// /// Asynchronously get all of the folders within the specified namespace. /// /// /// Asynchronously gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The namespace folder could not be found. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// Task> GetFoldersAsync (FolderNamespace @namespace, bool subscribedOnly, CancellationToken cancellationToken = default); /// /// Get all of the folders within the specified namespace. /// /// /// Gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The namespace folder could not be found. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// IList GetFolders (FolderNamespace @namespace, StatusItems items = StatusItems.None, bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Asynchronously get all of the folders within the specified namespace. /// /// /// Asynchronously gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The namespace folder could not be found. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// Task> GetFoldersAsync (FolderNamespace @namespace, StatusItems items = StatusItems.None, bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Get the folder for the specified path. /// /// /// Gets the folder for the specified path. /// /// The folder. /// The folder path. /// The cancellation token. /// /// is . /// /// /// The operation was canceled via the cancellation token. /// /// /// The folder could not be found. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// IMailFolder GetFolder (string path, CancellationToken cancellationToken = default); /// /// Asynchronously get the folder for the specified path. /// /// /// Asynchronously gets the folder for the specified path. /// /// The folder. /// The folder path. /// The cancellation token. /// /// is . /// /// /// The operation was canceled via the cancellation token. /// /// /// The folder could not be found. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// Task GetFolderAsync (string path, CancellationToken cancellationToken = default); /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. string? GetMetadata (MetadataTag tag, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. Task GetMetadataAsync (MetadataTag tag, CancellationToken cancellationToken = default); /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata tags. /// The cancellation token. MetadataCollection GetMetadata (IEnumerable tags, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata. /// The metadata tags. /// The cancellation token. Task GetMetadataAsync (IEnumerable tags, CancellationToken cancellationToken = default); /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. MetadataCollection GetMetadata (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. Task GetMetadataAsync (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default); /// /// Sets the specified metadata. /// /// /// Sets the specified metadata. /// /// The metadata. /// The cancellation token. void SetMetadata (MetadataCollection metadata, CancellationToken cancellationToken = default); /// /// Asynchronously sets the specified metadata. /// /// /// Asynchronously sets the specified metadata. /// /// An asynchronous task context. /// The metadata. /// The cancellation token. Task SetMetadataAsync (MetadataCollection metadata, CancellationToken cancellationToken = default); /// /// Occurs when a remote message store receives an alert message from the server. /// /// /// Some implementations, such as , /// will emit Alert events when they receive alert messages from the server. /// event EventHandler Alert; /// /// Occurs when a folder is created. /// /// /// The event is emitted when a new folder is created. /// event EventHandler FolderCreated; /// /// Occurs when metadata changes. /// /// /// The event is emitted when metadata changes. /// event EventHandler MetadataChanged; } } ================================================ FILE: MailKit/IMailTransport.cs ================================================ // // IMailTransport.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// An interface for sending messages. /// /// /// An interface for sending messages. /// Implemented by . /// public interface IMailTransport : IMailService { /// /// Send the specified message. /// /// /// Sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// The final free-form text response from the server. /// The message. /// The cancellation token. /// The progress reporting mechanism. string Send (MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously send the specified message. /// /// /// Asynchronously sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// The final free-form text response from the server. /// The message. /// The cancellation token. /// The progress reporting mechanism. Task SendAsync (MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Send the specified message using the supplied sender and recipients. /// /// /// Sends the specified message using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. string Send (MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously send the specified message using the supplied sender and recipients. /// /// /// Asynchronously sends the specified message using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. Task SendAsync (MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Send the specified message. /// /// /// Sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The cancellation token. /// The progress reporting mechanism. string Send (FormatOptions options, MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously send the specified message. /// /// /// Asynchronously sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The cancellation token. /// The progress reporting mechanism. Task SendAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Send the specified message using the supplied sender and recipients. /// /// /// Sends the specified message using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. string Send (FormatOptions options, MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously send the specified message using the supplied sender and recipients. /// /// /// Asynchronously sends the specified message using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. Task SendAsync (FormatOptions options, MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Occurs when a message is successfully sent via the transport. /// /// /// The event will be emitted each time a message is successfully sent. /// event EventHandler? MessageSent; } } ================================================ FILE: MailKit/IMessageSummary.cs ================================================ // // IMessageSummary.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using MimeKit; #if NET5_0_OR_GREATER using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet; #else using IReadOnlySetOfStrings = System.Collections.Generic.ISet; #endif namespace MailKit { /// /// A summary of a message. /// /// /// The Fetch and /// FetchAsync methods /// return lists of items. /// The properties of the that will be available /// depend on the passed to the aforementioned method. /// public interface IMessageSummary { /// /// Get the folder that the message belongs to. /// /// /// Gets the folder that the message belongs to, if available. /// /// The folder. IMailFolder? Folder { get; } /// /// Get a bitmask of fields that have been populated. /// /// /// Gets a bitmask of fields that have been populated. /// /// The fields that have been populated. MessageSummaryItems Fields { get; } /// /// Gets the body structure of the message, if available. /// /// /// The body will be one of , /// , , /// or . /// This property will only be set if either the /// flag or the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The body structure of the message. BodyPart? Body { get; } /// /// Gets the text body part of the message if it exists. /// /// /// Gets the text/plain body part of the message. /// This property will only be usable if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// /// /// /// The text body if it exists; otherwise, . BodyPartText? TextBody { get; } /// /// Gets the html body part of the message if it exists. /// /// /// Gets the text/html body part of the message. /// This property will only be usable if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// /// /// /// The html body if it exists; otherwise, . BodyPartText? HtmlBody { get; } /// /// Gets the body parts of the message. /// /// /// Traverses over the , enumerating all of the /// objects. /// This property will only be usable if either the /// flag or the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The body parts. IEnumerable BodyParts { get; } /// /// Gets the attachments. /// /// /// Traverses over the , enumerating all of the /// objects that have a Content-Disposition /// header set to "attachment". /// This property will only be usable if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// /// /// /// The attachments. IEnumerable Attachments { get; } /// /// Gets the preview text of the message. /// /// /// The preview text is a short snippet of the beginning of the message /// text, typically shown in a mail client's message list to provide the user /// with a sense of what the message is about. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The preview text. string? PreviewText { get; } /// /// Gets the envelope of the message, if available. /// /// /// The envelope of a message contains information such as the /// date the message was sent, the subject of the message, /// the sender of the message, who the message was sent to, /// which message(s) the message may be in reply to, /// and the message id. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The envelope of the message. Envelope? Envelope { get; } /// /// Gets the normalized subject. /// /// /// A normalized Subject header value where prefixes such as "Re:", "Re[#]:" and "FWD:" have been pruned. /// This property is typically used for threading messages by subject. /// /// The normalized subject. string NormalizedSubject { get; } /// /// Gets the Date header value. /// /// /// Gets the Date header value. If the Date header is not present, the arrival date is used. /// If neither are known, is returned. /// /// The date. DateTimeOffset Date { get; } /// /// Gets whether or not the message is a reply. /// /// /// This value should be based on whether the message subject contained any "Re:", "Re[#]:" or "FWD:" prefixes. /// /// if the message is a reply; otherwise, . bool IsReply { get; } /// /// Gets the message flags, if available. /// /// /// Gets the message flags, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The message flags. MessageFlags? Flags { get; } /// /// Gets the user-defined message flags, if available. /// /// /// Gets the user-defined message flags, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The user-defined message flags. IReadOnlySetOfStrings Keywords { get; } /// /// Gets the message annotations, if available. /// /// /// Gets the message annotations, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The message annotations. IReadOnlyList? Annotations { get; } /// /// Gets the list of headers, if available. /// /// /// Gets the list of headers, if available. /// This property will only be set if the used with /// Fetch or /// FetchAsync has the /// flag set on or if the list is non-empty. /// /// /// The list of headers. HeaderList? Headers { get; } /// /// Gets the internal date of the message, if available. /// /// /// Gets the internal date of the message (often the same date as found in the Received header), if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The internal date of the message. DateTimeOffset? InternalDate { get; } /// /// Gets the date and time that the message was saved to the current mailbox, if available. /// /// /// Gets the date and time that the message was saved to the current mailbox, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The save date of the message. DateTimeOffset? SaveDate { get; } /// /// Gets the size of the message, in bytes, if available. /// /// /// Gets the size of the message, in bytes, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The size of the message. uint? Size { get; } /// /// Gets the mod-sequence value for the message, if available. /// /// /// Gets the mod-sequence value for the message, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The mod-sequence value. ulong? ModSeq { get; } /// /// Gets the message-ids that the message references, if available. /// /// /// Gets the message-ids that the message references, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The references. MessageIdList? References { get; } /// /// Get the globally unique identifier for the message, if available. /// /// /// Gets the globally unique identifier of the message, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// This property maps to the EMAILID value defined in the /// OBJECTID extension. /// /// The globally unique message identifier. string? EmailId { get; } /// /// Get the globally unique thread identifier for the message, if available. /// /// /// Gets the globally unique thread identifier for the message, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// This property maps to the THREADID value defined in the /// OBJECTID extension. /// /// The globally unique thread identifier. string? ThreadId { get; } /// /// Gets the unique identifier of the message, if available. /// /// /// Gets the unique identifier of the message, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The uid of the message. UniqueId UniqueId { get; } /// /// Gets the index of the message. /// /// /// Gets the index of the message. /// This property is always set. /// /// The index of the message. int Index { get; } #region GMail extension properties /// /// Gets the GMail message identifier, if available. /// /// /// Gets the GMail message identifier, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The GMail message identifier. ulong? GMailMessageId { get; } /// /// Gets the GMail thread identifier, if available. /// /// /// Gets the GMail thread identifier, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The GMail thread identifier. ulong? GMailThreadId { get; } /// /// Gets the list of GMail labels, if available. /// /// /// Gets the list of GMail labels, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The GMail labels. IList? GMailLabels { get; } #endregion } } ================================================ FILE: MailKit/IProtocolLogger.cs ================================================ // // IProtocolLogger.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// An interface for logging the communication between a client and server. /// /// /// An interface for logging the communication between a client and server. /// /// /// /// public interface IProtocolLogger : IDisposable { /// /// Get or set the authentication secret detector. /// /// /// Gets or sets the authentication secret detector. /// /// The authentication secret detector. IAuthenticationSecretDetector? AuthenticationSecretDetector { get; set; } /// /// Logs a connection to the specified URI. /// /// /// Logs a connection to the specified URI. /// /// The URI. /// /// is . /// /// /// The logger has been disposed. /// /// /// An I/O error occurred. /// void LogConnect (Uri uri); /// /// Logs a sequence of bytes sent by the client. /// /// /// Logs a sequence of bytes sent by the client. /// is called by the upon every successful /// write operation to its underlying network stream, passing the exact same , /// , and arguments to the logging function. /// /// The buffer to log. /// The offset of the first byte to log. /// The number of bytes to log. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The logger has been disposed. /// /// /// An I/O error occurred. /// void LogClient (byte[] buffer, int offset, int count); /// /// Logs a sequence of bytes sent by the server. /// /// /// Logs a sequence of bytes sent by the server. /// is called by the upon every successful /// read of its underlying network stream with the exact buffer that was read. /// /// The buffer to log. /// The offset of the first byte to log. /// The number of bytes to log. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The logger has been disposed. /// /// /// An I/O error occurred. /// void LogServer (byte[] buffer, int offset, int count); } } ================================================ FILE: MailKit/IReplaceRequest.cs ================================================ // // IReplaceRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// A request for replacing a message in a folder. /// /// /// A request for replacing a message in a folder. /// public interface IReplaceRequest : IAppendRequest { /// /// Get or set the folder where the replacement message should be appended. /// /// /// Gets or sets the folder where the replacement message should be appended. /// If no destination folder is specified, then the replacement message will be /// appended to the original folder. /// /// The destination folder. IMailFolder? Destination { get; set; } } } ================================================ FILE: MailKit/IStoreFlagsRequest.cs ================================================ // // IStoreFlagsRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections.Generic; namespace MailKit { /// /// A request for storing message flags. /// /// /// A request for storing message flags. /// public interface IStoreFlagsRequest : IStoreRequest { /// /// Get the store action to perform. /// /// /// Gets the store action to perform. /// /// The store action. StoreAction Action { get; } /// /// Get or set the message flags that should be added, removed, or set. /// /// /// Gets or sets the message flags that should be added, removed, or set. /// /// The message flags. MessageFlags Flags { get; set; } /// /// Get the keywords that should be added, removed, or set. /// /// /// Gets the keywords that should be added, removed, or set. /// /// The keywords. ISet Keywords { get; } /// /// Get or set whether the store operation should run silently. /// /// /// Gets or sets whether the store operation should run silently. /// Normally, when flags or keywords are changed on a message, a event is emitted. /// By setting to , this event will not be emitted as a result of this store operation. /// /// if the store operation should run silently (not emitting events for flag changes); otherwise, . bool Silent { get; set; } } } ================================================ FILE: MailKit/IStoreLabelsRequest.cs ================================================ // // IStoreLabelsRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections.Generic; namespace MailKit { /// /// A request for storing GMail-style labels for a message. /// /// /// A request for storing GMail-style labels for a message. /// public interface IStoreLabelsRequest : IStoreRequest { /// /// Get the store action to perform. /// /// /// Gets the store action to perform. /// /// The store action. StoreAction Action { get; } /// /// Get the GMail-style labels that should be added, removed, or set. /// /// /// Gets the GMail-style labels that should be added, removed, or set. /// /// The GMail-style labels. ISet Labels { get; } /// /// Get or set whether the store operation should run silently. /// /// /// Gets or sets whether the store operation should run silently. /// Normally, when flags or keywords are changed on a message, a event is emitted. /// By setting to , this event will not be emitted as a result of this store operation. /// /// if the store operation should run silently (not emitting events for label changes); otherwise, . bool Silent { get; set; } } } ================================================ FILE: MailKit/IStoreRequest.cs ================================================ // // IStoreRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// A request for storing flags, labels, or annotations for a message. /// /// /// A request for storing flags, labels, or annotations for a message. /// public interface IStoreRequest { /// /// Get or set the mod-sequence value that indicates the last known state of the message(s) being updated. /// /// /// Gets or sets the mod-sequence value that indicates the last known state of the message(s) being updated. /// If this property is set, only messages that have not had their flags modified since the specified mod-sequence /// state will have their flags updated by the Store /// or StoreAsync methods. /// /// The mod-sequence value that indicates the last known state of the message(s) being updated. ulong? UnchangedSince { get; set; } } } ================================================ FILE: MailKit/ITransferProgress.cs ================================================ // // ITransferProgress.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// An interface for reporting progress of uploading or downloading messages. /// /// /// An interface for reporting progress of uploading or downloading messages. /// public interface ITransferProgress { /// /// Report the progress of the transfer operation. /// /// /// Reports the progress of the transfer operation. /// This method is only used if the operation knows the size /// of the message, part, or stream being transferred without doing /// extra work to calculate it. /// /// The number of bytes transferred. /// The total size, in bytes, of the message, part, or stream being transferred. void Report (long bytesTransferred, long totalSize); /// /// Report the progress of the transfer operation. /// /// /// Reports the progress of the transfer operation. /// /// The number of bytes transferred. void Report (long bytesTransferred); } } ================================================ FILE: MailKit/MailFolder.cs ================================================ // // MailFolder.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Threading; using System.Collections; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; using MailKit.Search; #if NET5_0_OR_GREATER using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet; #else using IReadOnlySetOfStrings = System.Collections.Generic.ISet; #endif namespace MailKit { /// /// An abstract mail folder implementation. /// /// /// An abstract mail folder implementation. /// public abstract class MailFolder : IMailFolder { /// /// The bit mask of settable flags. /// /// /// Only flags in the list of settable flags may be set on a message by the client. /// protected static readonly MessageFlags SettableFlags = MessageFlags.Answered | MessageFlags.Deleted | MessageFlags.Draft | MessageFlags.Flagged | MessageFlags.Seen; IMailFolder? parent; /// /// Initialize a new instance of the class. /// /// /// Initializes a new instance of the class. /// [Obsolete ("Use MailFolder (string fullName, char directorySeparator, FolderAttributes attributes) instead.")] protected MailFolder () { PermanentKeywords = new HashSet (StringComparer.Ordinal); AcceptedKeywords = new HashSet (StringComparer.Ordinal); FullName = string.Empty; Name = string.Empty; FirstUnread = -1; } /// /// Initialize a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The full name (path) of the folder. /// The directory separator used by the folder. /// The attributes of the folder. /// /// is . /// protected MailFolder (string fullName, char directorySeparator, FolderAttributes attributes) { if (fullName == null) throw new ArgumentNullException (nameof (fullName)); PermanentKeywords = new HashSet (StringComparer.Ordinal); AcceptedKeywords = new HashSet (StringComparer.Ordinal); Name = GetBaseName (fullName, directorySeparator); DirectorySeparator = directorySeparator; Attributes = attributes; FullName = fullName; FirstUnread = -1; } internal static string GetBaseName (string fullName, char delim) { int index; if ((index = fullName.LastIndexOf (delim)) != -1) return fullName.Substring (index + 1); return fullName; } /// /// Get an object that can be used to synchronize access to the folder. /// /// /// Gets an object that can be used to synchronize access to the folder. /// /// The sync root. public abstract object SyncRoot { get; } /// /// Get the parent folder. /// /// /// Root-level folders do not have a parent folder. /// /// The parent folder. public IMailFolder? ParentFolder { get { return parent; } internal protected set { if (value == parent) return; if (parent != null) parent.Renamed -= OnParentFolderRenamed; parent = value; if (parent != null) parent.Renamed += OnParentFolderRenamed; } } /// /// Get the folder attributes. /// /// /// Gets the folder attributes. /// /// The folder attributes. public FolderAttributes Attributes { get; internal protected set; } /// /// Get the annotation access level. /// /// /// If annotations are supported, this property can be used to determine whether or not /// the supports reading and writing annotations. /// /// The annotation access level. public AnnotationAccess AnnotationAccess { get; internal protected set; } /// /// Get the supported annotation scopes. /// /// /// If annotations are supported, this property can be used to determine which /// annotation scopes are supported by the . /// /// The supported annotation scopes. public AnnotationScope AnnotationScopes { get; internal protected set; } /// /// Get the maximum size of annotation values supported by the folder. /// /// /// If annotations are supported, this property can be used to determine the /// maximum size of annotation values supported by the . /// /// The maximum size of annotation values supported by the folder. public uint MaxAnnotationSize { get; internal protected set; } /// /// Get the permanent flags. /// /// /// The permanent flags are the message flags that will persist between sessions. /// If the flag is set, then the folder allows /// storing of user-defined keywords. /// /// The permanent flags. public MessageFlags PermanentFlags { get; protected set; } /// /// Get the permanent keywords. /// /// /// The permanent keywords are the keywords that will persist between sessions. /// If the flag is set in , /// then the folder allows storing of user-defined keywords as well. /// /// The permanent keywords. public IReadOnlySetOfStrings PermanentKeywords { get; protected set; } /// /// Get the accepted flags. /// /// /// The accepted flags are the message flags that will be accepted and persist /// for the current session. For the set of flags that will persist between /// sessions, see the property. /// /// The accepted flags. public MessageFlags AcceptedFlags { get; protected set; } /// /// Get the accepted keywords. /// /// /// The accepted keywords are the keywords that will be accepted and persist /// for the current session. For the set of keywords that will persist between /// sessions, see the property. /// /// The accepted keywords. public IReadOnlySetOfStrings AcceptedKeywords { get; protected set; } /// /// Get the directory separator. /// /// /// Gets the directory separator. /// /// The directory separator. public char DirectorySeparator { get; protected set; } /// /// Get the read/write access of the folder. /// /// /// Gets the read/write access of the folder. /// /// The read/write access. public FolderAccess Access { get; internal protected set; } /// /// Get whether or not the folder is a namespace folder. /// /// /// Gets whether or not the folder is a namespace folder. /// /// if the folder is a namespace folder; otherwise, . public bool IsNamespace { get; protected set; } /// /// Get the full name of the folder. /// /// /// This is the equivalent of the full path of a file on a file system. /// /// The full name of the folder. public string FullName { get; protected set; } /// /// Get the name of the folder. /// /// /// This is the equivalent of the file name of a file on the file system. /// /// The name of the folder. public string Name { get; protected set; } /// /// Get the unique identifier for the folder, if available. /// /// /// Gets a unique identifier for the folder, if available. This is useful for clients /// implementing a message cache that want to track the folder after it is renamed by another /// client. /// This property will only be available if the server supports the /// OBJECTID extension. /// /// The unique folder identifier. public string? Id { get; protected set; } /// /// Get a value indicating whether the folder is subscribed. /// /// /// Gets a value indicating whether the folder is subscribed. /// /// if the folder is subscribed; otherwise, . public bool IsSubscribed { get { return (Attributes & FolderAttributes.Subscribed) != 0; } } /// /// Get a value indicating whether the folder is currently open. /// /// /// Gets a value indicating whether the folder is currently open. /// /// if the folder is currently open; otherwise, . public abstract bool IsOpen { get; } /// /// Get whether or not the folder can be opened. /// /// /// Gets whether or not the folder can be opened. /// /// if the folder can be opened; otherwise, . public bool CanOpen { get { return (Attributes & (FolderAttributes.NoSelect | FolderAttributes.NonExistent)) == 0; } } /// /// Get a value indicating whether the folder exists. /// /// /// Gets a value indicating whether the folder exists. /// /// if the folder exists; otherwise, . public bool Exists { get { return (Attributes & FolderAttributes.NonExistent) == 0; } } /// /// Get the highest mod-sequence value of all messages in the mailbox. /// /// /// Gets the highest mod-sequence value of all messages in the mailbox. /// /// The highest mod-sequence value. public ulong HighestModSeq { get; protected set; } /// /// Get the UID validity. /// /// /// UIDs are only valid so long as the UID validity value remains unchanged. If and when /// the folder's is changed, a client MUST discard its cache of UIDs /// along with any summary information that it may have and re-query the folder. /// This value will only be set after the folder has been opened. /// /// The UID validity. public uint UidValidity { get; protected set; } /// /// Get the UID that the folder will assign to the next message that is added. /// /// /// This value will only be set after the folder has been opened. /// /// The next UID. public UniqueId? UidNext { get; protected set; } /// /// Get the maximum size of a message that can be appended to the folder. /// /// /// Gets the maximum size of a message that can be appended to the folder. /// If the value is not set, then the limit is unspecified. /// /// The append limit. public uint? AppendLimit { get; protected set; } /// /// Get the size of the folder. /// /// /// Gets the size of the folder in bytes. /// If the value is not set, then the size is unspecified. /// /// The size of the folder, in bytes. public ulong? Size { get; protected set; } /// /// Get the index of the first unread message in the folder. /// /// /// Gets the index of the first unread message in the folder. /// This value will only be set after the folder has been opened. /// A value of -1 indicates that there are no unread messages in the folder or that the server /// has not provided the index of the first unread message. /// /// The index of the first unread message or -1 if there are no unread messages in the folder. public int FirstUnread { get; protected set; } /// /// Get the number of unread messages in the folder. /// /// /// Gets the number of unread messages in the folder. /// This value will only be set after calling /// /// with . /// /// The number of unread messages. public int Unread { get; protected set; } /// /// Get the number of recently delivered messages in the folder. /// /// /// Gets the number of recently delivered messages in the folder. /// This value will only be set after calling /// /// with or by opening the folder. /// /// The number of recently delivered messages. public int Recent { get; protected set; } /// /// Get the total number of messages in the folder. /// /// /// Gets the total number of messages in the folder. /// This value will only be set after calling /// /// with or by opening the folder. /// /// /// /// /// The total number of messages. public int Count { get; protected set; } /// /// Get the threading algorithms supported by the folder. /// /// /// Gets the threading algorithms supported by the folder. /// /// The supported threading algorithms. public abstract HashSet ThreadingAlgorithms { get; } /// /// Determine whether or not a supports a feature. /// /// /// Determines whether or not a supports a feature. /// /// The desired feature. /// if the feature is supported; otherwise, . public abstract bool Supports (FolderFeature feature); /// /// Opens the folder using the requested folder access. /// /// /// This variant of the /// method is meant for quick resynchronization of the folder. Before calling this method, /// the method MUST be called. /// You should also make sure to add listeners to the and /// events to get notifications of changes since /// the last time the folder was opened. /// /// The state of the folder. /// The requested folder access. /// The last known value. /// The last known value. /// The last known list of unique message identifiers. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The quick resynchronization feature has not been enabled. /// /// /// The mail store does not support the quick resynchronization feature. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract FolderAccess Open (FolderAccess access, uint uidValidity, ulong highestModSeq, IList uids, CancellationToken cancellationToken = default); /// /// Asynchronously opens the folder using the requested folder access. /// /// /// This variant of the /// method is meant for quick resynchronization of the folder. Before calling this method, /// the method MUST be called. /// You should also make sure to add listeners to the and /// events to get notifications of changes since /// the last time the folder was opened. /// /// The state of the folder. /// The requested folder access. /// The last known value. /// The last known value. /// The last known list of unique message identifiers. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The quick resynchronization feature has not been enabled. /// /// /// The mail store does not support the quick resynchronization feature. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task OpenAsync (FolderAccess access, uint uidValidity, ulong highestModSeq, IList uids, CancellationToken cancellationToken = default); /// /// Open the folder using the requested folder access. /// /// /// Opens the folder using the requested folder access. /// /// The state of the folder. /// The requested folder access. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract FolderAccess Open (FolderAccess access, CancellationToken cancellationToken = default); /// /// Asynchronously open the folder using the requested folder access. /// /// /// Asynchronously opens the folder using the requested folder access. /// /// The state of the folder. /// The requested folder access. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task OpenAsync (FolderAccess access, CancellationToken cancellationToken = default); /// /// Close the folder, optionally expunging the messages marked for deletion. /// /// /// Closes the folder, optionally expunging the messages marked for deletion. /// /// If set to , expunge. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Close (bool expunge = false, CancellationToken cancellationToken = default); /// /// Asynchronously close the folder, optionally expunging the messages marked for deletion. /// /// /// Asynchronously closes the folder, optionally expunging the messages marked for deletion. /// /// An asynchronous task context. /// If set to , expunge. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task CloseAsync (bool expunge = false, CancellationToken cancellationToken = default); /// /// Create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// if the folder will be used to contain messages; otherwise, . /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IMailFolder? Create (string name, bool isMessageFolder, CancellationToken cancellationToken = default); /// /// Asynchronously create a new subfolder with the given name. /// /// /// Asynchronously creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// if the folder will be used to contain messages; otherwise, . /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task CreateAsync (string name, bool isMessageFolder, CancellationToken cancellationToken = default); /// /// Create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// A list of special uses for the folder being created. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The does not support the creation of special folders. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IMailFolder? Create (string name, IEnumerable specialUses, CancellationToken cancellationToken = default); /// /// Asynchronously create a new subfolder with the given name. /// /// /// Asynchronously creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// A list of special uses for the folder being created. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The does not support the creation of special folders. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task CreateAsync (string name, IEnumerable specialUses, CancellationToken cancellationToken = default); /// /// Create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// The special use for the folder being created. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The does not support the creation of special folders. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual IMailFolder? Create (string name, SpecialFolder specialUse, CancellationToken cancellationToken = default) { return Create (name, new [] { specialUse }, cancellationToken); } /// /// Asynchronously create a new subfolder with the given name. /// /// /// Asynchronously creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// The special use for the folder being created. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The does not support the creation of special folders. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task CreateAsync (string name, SpecialFolder specialUse, CancellationToken cancellationToken = default) { return CreateAsync (name, new [] { specialUse }, cancellationToken); } /// /// Rename the folder. /// /// /// Renames the folder. /// /// The new parent folder. /// The new name of the folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// does not belong to the . /// -or- /// is not a legal folder name. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be renamed (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Rename (IMailFolder parent, string name, CancellationToken cancellationToken = default); /// /// Asynchronously rename the folder. /// /// /// Asynchronously renames the folder. /// /// An asynchronous task context. /// The new parent folder. /// The new name of the folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// does not belong to the . /// -or- /// is not a legal folder name. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be renamed (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task RenameAsync (IMailFolder parent, string name, CancellationToken cancellationToken = default); /// /// Delete the folder. /// /// /// Deletes the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be deleted (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Delete (CancellationToken cancellationToken = default); /// /// Asynchronously delete the folder. /// /// /// Asynchronously deletes the folder. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be deleted (it is either a namespace or the Inbox). /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task DeleteAsync (CancellationToken cancellationToken = default); /// /// Subscribe to the folder. /// /// /// Subscribes to the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Subscribe (CancellationToken cancellationToken = default); /// /// Asynchronously subscribe to the folder. /// /// /// Asynchronously subscribes to the folder. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task SubscribeAsync (CancellationToken cancellationToken = default); /// /// Unsubscribe from the folder. /// /// /// Unsubscribes from the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Unsubscribe (CancellationToken cancellationToken = default); /// /// Asynchronously unsubscribe from the folder. /// /// /// Asynchronously unsubscribes from the folder. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task UnsubscribeAsync (CancellationToken cancellationToken = default); /// /// Get the subfolders. /// /// /// Gets the subfolders as well as queries the server for the status of the requested items. /// When the argument is non-empty, this has the equivalent functionality /// of calling and then calling /// on each of the returned folders. /// /// The subfolders. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList GetSubfolders (StatusItems items, bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Asynchronously get the subfolders. /// /// /// Asynchronously gets the subfolders as well as queries the server for the status of the requested items. /// When the argument is non-empty, this has the equivalent functionality /// of calling and then calling /// on each of the returned folders. /// /// The subfolders. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> GetSubfoldersAsync (StatusItems items, bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Get the subfolders. /// /// /// Gets the subfolders. /// /// The subfolders. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual IList GetSubfolders (bool subscribedOnly = false, CancellationToken cancellationToken = default) { return GetSubfolders (StatusItems.None, subscribedOnly, cancellationToken); } /// /// Asynchronously get the subfolders. /// /// /// Asynchronously gets the subfolders. /// /// The subfolders. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task> GetSubfoldersAsync (bool subscribedOnly = false, CancellationToken cancellationToken = default) { return GetSubfoldersAsync (StatusItems.None, subscribedOnly, cancellationToken); } /// /// Get the specified subfolder. /// /// /// Gets the specified subfolder. /// /// The subfolder. /// The name of the subfolder. /// The cancellation token. /// /// is . /// /// /// is either an empty string or contains the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The requested folder could not be found. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IMailFolder GetSubfolder (string name, CancellationToken cancellationToken = default); /// /// Asynchronously get the specified subfolder. /// /// /// Asynchronously gets the specified subfolder. /// /// The subfolder. /// The name of the subfolder. /// The cancellation token. /// /// is . /// /// /// is either an empty string or contains the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The requested folder could not be found. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetSubfolderAsync (string name, CancellationToken cancellationToken = default); /// /// Force the server to flush its state for the folder. /// /// /// Forces the server to flush its state for the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Check (CancellationToken cancellationToken = default); /// /// Asynchronously force the server to flush its state for the folder. /// /// /// Asynchronously forces the server to flush its state for the folder. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task CheckAsync (CancellationToken cancellationToken = default); /// /// Update the values of the specified items. /// /// /// Updates the values of the specified items. /// The method /// MUST NOT be used on a folder that is already in the opened state. Instead, other ways /// of getting the desired information should be used. /// For example, a common use for the /// method is to get the number of unread messages in the folder. When the folder is open, however, it is /// possible to use the /// method to query for the list of unread messages. /// /// The items to update. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The mail store does not support the STATUS command. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Status (StatusItems items, CancellationToken cancellationToken = default); /// /// Asynchronously update the values of the specified items. /// /// /// Updates the values of the specified items. /// The method /// MUST NOT be used on a folder that is already in the opened state. Instead, other ways /// of getting the desired information should be used. /// For example, a common use for the /// method is to get the number of unread messages in the folder. When the folder is open, however, it is /// possible to use the /// method to query for the list of unread messages. /// /// An asynchronous task context. /// The items to update. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the STATUS command. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task StatusAsync (StatusItems items, CancellationToken cancellationToken = default); /// /// Get the complete access control list for the folder. /// /// /// Gets the complete access control list for the folder. /// /// The access control list. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract AccessControlList GetAccessControlList (CancellationToken cancellationToken = default); /// /// Asynchronously get the complete access control list for the folder. /// /// /// Asynchronously gets the complete access control list for the folder. /// /// The access control list. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetAccessControlListAsync (CancellationToken cancellationToken = default); /// /// Get the access rights for a particular identifier. /// /// /// Gets the access rights for a particular identifier. /// /// The access rights. /// The identifier name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract AccessRights GetAccessRights (string name, CancellationToken cancellationToken = default); /// /// Asynchronously get the access rights for a particular identifier. /// /// /// Asynchronously gets the access rights for a particular identifier. /// /// The access rights. /// The identifier name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetAccessRightsAsync (string name, CancellationToken cancellationToken = default); /// /// Get the access rights for the current authenticated user. /// /// /// Gets the access rights for the current authenticated user. /// /// The access rights. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract AccessRights GetMyAccessRights (CancellationToken cancellationToken = default); /// /// Asynchronously get the access rights for the current authenticated user. /// /// /// Asynchronously gets the access rights for the current authenticated user. /// /// The access rights. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetMyAccessRightsAsync (CancellationToken cancellationToken = default); /// /// Add access rights for the specified identity. /// /// /// Adds the given access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void AddAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Asynchronously add access rights for the specified identity. /// /// /// Asynchronously adds the given access rights for the specified identity. /// /// An asynchronous task context. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task AddAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Remove access rights for the specified identity. /// /// /// Removes the given access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void RemoveAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Asynchronously remove access rights for the specified identity. /// /// /// Asynchronously removes the given access rights for the specified identity. /// /// An asynchronous task context. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task RemoveAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Set the access rights for the specified identity. /// /// /// Sets the access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void SetAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Asynchronously set the access rights for the specified identity. /// /// /// Asynchronously sets the access rights for the specified identity. /// /// An asynchronous task context. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task SetAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default); /// /// Remove all access rights for the given identity. /// /// /// Removes all access rights for the given identity. /// /// The identity name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void RemoveAccess (string name, CancellationToken cancellationToken = default); /// /// Asynchronously remove all access rights for the given identity. /// /// /// Asynchronously removes all access rights for the given identity. /// /// An asynchronous task context. /// The identity name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task RemoveAccessAsync (string name, CancellationToken cancellationToken = default); /// /// Get the quota information for the folder. /// /// /// Gets the quota information for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The folder quota. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support quotas. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract FolderQuota GetQuota (CancellationToken cancellationToken = default); /// /// Asynchronously get the quota information for the folder. /// /// /// Asynchronously gets the quota information for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The folder quota. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support quotas. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetQuotaAsync (CancellationToken cancellationToken = default); /// /// Set the quota limits for the folder. /// /// /// Sets the quota limits for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The updated folder quota. /// If not , sets the maximum number of messages to allow. /// If not , sets the maximum storage size (in kilobytes). /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support quotas. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract FolderQuota SetQuota (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default); /// /// Asynchronously set the quota limits for the folder. /// /// /// Asynchronously sets the quota limits for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The updated folder quota. /// If not , sets the maximum number of messages to allow. /// If not , sets the maximum storage size (in kilobytes). /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail store does not support quotas. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task SetQuotaAsync (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default); /// /// Get the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract string? GetMetadata (MetadataTag tag, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetMetadataAsync (MetadataTag tag, CancellationToken cancellationToken = default); /// /// Get the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata tags. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public MetadataCollection GetMetadata (IEnumerable tags, CancellationToken cancellationToken = default) { return GetMetadata (new MetadataOptions (), tags, cancellationToken); } /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata. /// The metadata tags. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task GetMetadataAsync (IEnumerable tags, CancellationToken cancellationToken = default) { return GetMetadataAsync (new MetadataOptions (), tags, cancellationToken); } /// /// Get the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract MetadataCollection GetMetadata (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetMetadataAsync (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default); /// /// Sets the specified metadata. /// /// /// Sets the specified metadata. /// /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void SetMetadata (MetadataCollection metadata, CancellationToken cancellationToken = default); /// /// Asynchronously sets the specified metadata. /// /// /// Asynchronously sets the specified metadata. /// /// An asynchronous task context. /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task SetMetadataAsync (MetadataCollection metadata, CancellationToken cancellationToken = default); /// /// Expunge the folder, permanently removing all messages marked for deletion. /// /// /// Expunges the folder, permanently removing all messages marked for deletion. /// Normally, an event will be emitted for /// each message that is expunged. However, if the mail store supports the quick /// resynchronization feature and it has been enabled via the /// method, then /// the event will be emitted rather than the /// event. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Expunge (CancellationToken cancellationToken = default); /// /// Asynchronously expunge the folder, permanently removing all messages marked for deletion. /// /// /// Asynchronously expunges the folder, permanently removing all messages marked for deletion. /// Normally, an event will be emitted for /// each message that is expunged. However, if the mail store supports the quick /// resynchronization feature and it has been enabled via the /// method, then /// the event will be emitted rather than the /// event. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task ExpungeAsync (CancellationToken cancellationToken = default); /// /// Expunge the specified uids, permanently removing them from the folder. /// /// /// Expunges the specified uids, permanently removing them from the folder. /// Normally, an event will be emitted for /// each message that is expunged. However, if the mail store supports the quick /// resynchronization feature and it has been enabled via the /// method, then /// the event will be emitted rather than the /// event. /// /// The message uids. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Expunge (IList uids, CancellationToken cancellationToken = default); /// /// Asynchronously expunge the specified uids, permanently removing them from the folder. /// /// /// Asynchronously expunges the specified uids, permanently removing them from the folder. /// Normally, an event will be emitted for /// each message that is expunged. However, if the mail store supports the quick /// resynchronization feature and it has been enabled via the /// method, then /// the event will be emitted rather than the /// event. /// /// An asynchronous task context. /// The message uids. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task ExpungeAsync (IList uids, CancellationToken cancellationToken = default); /// /// Append a message to the folder. /// /// /// Appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The append request. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual UniqueId? Append (IAppendRequest request, CancellationToken cancellationToken = default) { return Append (FormatOptions.Default, request, cancellationToken); } /// /// Asynchronously append a message to the folder. /// /// /// Asynchronously appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The append request. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task AppendAsync (IAppendRequest request, CancellationToken cancellationToken = default) { return AppendAsync (FormatOptions.Default, request, cancellationToken); } /// /// Append a message to the folder. /// /// /// Appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The formatting options. /// The append request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract UniqueId? Append (FormatOptions options, IAppendRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously append a message to the folder. /// /// /// Asynchronously appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The formatting options. /// The append request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task AppendAsync (FormatOptions options, IAppendRequest request, CancellationToken cancellationToken = default); /// /// Append multiple messages to the folder. /// /// /// Appends multiple messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The append requests. /// The cancellation token. /// /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual IList Append (IList requests, CancellationToken cancellationToken = default) { return Append (FormatOptions.Default, requests, cancellationToken); } /// /// Asynchronously append multiple messages to the folder. /// /// /// Asynchronously appends multiple messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The append requests. /// The cancellation token. /// /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task> AppendAsync (IList requests, CancellationToken cancellationToken = default) { return AppendAsync (FormatOptions.Default, requests, cancellationToken); } /// /// Append multiple messages to the folder. /// /// /// Appends multiple messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The formatting options. /// The append requests. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Append (FormatOptions options, IList requests, CancellationToken cancellationToken = default); /// /// Asynchronously append multiple messages to the folder. /// /// /// Asynchronously appends multiple messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The formatting options. /// The append requests. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> AppendAsync (FormatOptions options, IList requests, CancellationToken cancellationToken = default); /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual UniqueId? Replace (UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default) { return Replace (FormatOptions.Default, uid, request, cancellationToken); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the appended message, if available; otherwise, . /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual Task ReplaceAsync (UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default) { return ReplaceAsync (FormatOptions.Default, uid, request, cancellationToken); } /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public abstract UniqueId? Replace (FormatOptions options, UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public abstract Task ReplaceAsync (FormatOptions options, UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual UniqueId? Replace (int index, IReplaceRequest request, CancellationToken cancellationToken = default) { return Replace (FormatOptions.Default, index, request, cancellationToken); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the appended message, if available; otherwise, . /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual Task ReplaceAsync (int index, IReplaceRequest request, CancellationToken cancellationToken = default) { return ReplaceAsync (FormatOptions.Default, index, request, cancellationToken); } /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public abstract UniqueId? Replace (FormatOptions options, int index, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public abstract Task ReplaceAsync (FormatOptions options, int index, IReplaceRequest request, CancellationToken cancellationToken = default); /// /// Copy the specified message to the destination folder. /// /// /// Copies the specified message to the destination folder. /// /// The UID of the message in the destination folder, if available; otherwise, . /// The UID of the message to copy. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual UniqueId? CopyTo (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default) { var uids = CopyTo (new [] { uid }, destination, cancellationToken); if (uids != null && uids.Destination.Count > 0) return uids.Destination[0]; return null; } /// /// Asynchronously copy the specified message to the destination folder. /// /// /// Asynchronously copies the specified message to the destination folder. /// /// The UID of the message in the destination folder, if available; otherwise, . /// The UID of the message to copy. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual async Task CopyToAsync (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default) { var uids = await CopyToAsync (new [] { uid }, destination, cancellationToken).ConfigureAwait (false); if (uids != null && uids.Destination.Count > 0) return uids.Destination[0]; return null; } /// /// Copy the specified messages to the destination folder. /// /// /// Copies the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract UniqueIdMap CopyTo (IList uids, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously copy the specified messages to the destination folder. /// /// /// Asynchronously copies the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task CopyToAsync (IList uids, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Move the specified message to the destination folder. /// /// /// Moves the specified message to the destination folder. /// /// The UID of the message in the destination folder, if available; otherwise, . /// The UID of the message to move. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual UniqueId? MoveTo (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default) { var uids = MoveTo (new [] { uid }, destination, cancellationToken); if (uids != null && uids.Destination.Count > 0) return uids.Destination[0]; return null; } /// /// Asynchronously move the specified message to the destination folder. /// /// /// Asynchronously moves the specified message to the destination folder. /// /// The UID of the message in the destination folder, if available; otherwise, . /// The UID of the message to move. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual async Task MoveToAsync (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default) { var uids = await MoveToAsync (new [] { uid }, destination, cancellationToken).ConfigureAwait (false); if (uids != null && uids.Destination.Count > 0) return uids.Destination[0]; return null; } /// /// Move the specified messages to the destination folder. /// /// /// Moves the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract UniqueIdMap MoveTo (IList uids, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously move the specified messages to the destination folder. /// /// /// Asynchronously moves the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The mail store does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task MoveToAsync (IList uids, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Copy the specified message to the destination folder. /// /// /// Copies the specified message to the destination folder. /// /// The index of the message to copy. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// does not refer to a valid message index. /// /// /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual void CopyTo (int index, IMailFolder destination, CancellationToken cancellationToken = default) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); CopyTo (new [] { index }, destination, cancellationToken); } /// /// Asynchronously copy the specified message to the destination folder. /// /// /// Asynchronously copies the specified message to the destination folder. /// /// An asynchronous task context. /// The indexes of the message to copy. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// does not refer to a valid message index. /// /// /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task CopyToAsync (int index, IMailFolder destination, CancellationToken cancellationToken = default) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); return CopyToAsync (new [] { index }, destination, cancellationToken); } /// /// Copy the specified messages to the destination folder. /// /// /// Copies the specified messages to the destination folder. /// /// The indexes of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void CopyTo (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously copy the specified messages to the destination folder. /// /// /// Asynchronously copies the specified messages to the destination folder. /// /// An asynchronous task context. /// The indexes of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task CopyToAsync (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Move the specified message to the destination folder. /// /// /// Moves the specified message to the destination folder. /// /// The index of the message to move. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// does not refer to a valid message index. /// /// /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual void MoveTo (int index, IMailFolder destination, CancellationToken cancellationToken = default) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); MoveTo (new [] { index }, destination, cancellationToken); } /// /// Asynchronously move the specified message to the destination folder. /// /// /// Asynchronously moves the specified message to the destination folder. /// /// An asynchronous task context. /// The index of the message to move. /// The destination folder. /// The cancellation token. /// /// is . /// /// /// does not refer to a valid message index. /// /// /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task MoveToAsync (int index, IMailFolder destination, CancellationToken cancellationToken = default) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); return MoveToAsync (new [] { index }, destination, cancellationToken); } /// /// Move the specified messages to the destination folder. /// /// /// Moves the specified messages to the destination folder. /// /// The indexes of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void MoveTo (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Asynchronously move the specified messages to the destination folder. /// /// /// Asynchronously moves the specified messages to the destination folder. /// /// An asynchronous task context. /// The indexes of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task MoveToAsync (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default); /// /// Fetch the message summaries for the specified message UIDs. /// /// /// Fetches the message summaries for the specified message UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// /// /// /// An enumeration of summaries for the requested messages. /// The UIDs. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Fetch (IList uids, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously fetch the message summaries for the specified message UIDs. /// /// /// Asynchronously fetches the message summaries for the specified message /// UIDs. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The UIDs. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> FetchAsync (IList uids, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Fetch the message summaries for the specified message indexes. /// /// /// Fetches the message summaries for the specified message indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The indexes. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Fetch (IList indexes, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously fetch the message summaries for the specified message indexes. /// /// /// Asynchronously fetches the message summaries for the specified message /// indexes. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The indexes. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> FetchAsync (IList indexes, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Fetches the message summaries for the messages between the two /// indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The fetch request. /// The cancellation token. /// /// is . /// /// /// is out of range. /// -or- /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Fetch (int min, int max, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously fetch the message summaries for the messages between the two indexes, inclusive. /// /// /// Asynchronously fetches the message summaries for the messages between /// the two indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the mail service may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The fetch request. /// The cancellation token. /// /// is . /// /// /// is out of range. /// -or- /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> FetchAsync (int min, int max, IFetchRequest request, CancellationToken cancellationToken = default); /// /// Get the specified message headers. /// /// /// Gets the specified message headers. /// /// The message headers. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract HeaderList GetHeaders (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified message headers. /// /// /// Asynchronously gets the specified message headers. /// /// The message headers. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetHeadersAsync (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract HeaderList GetHeaders (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part headers. /// /// /// Asynchronously gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetHeadersAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified message headers. /// /// /// Gets the specified message headers. /// /// The message headers. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract HeaderList GetHeaders (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified message headers. /// /// /// Asynchronously gets the specified message headers. /// /// The message headers. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetHeadersAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract HeaderList GetHeaders (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part headers. /// /// /// Asynchronously gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetHeadersAsync (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified message. /// /// /// Gets the specified message. /// /// /// /// /// The message. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract MimeMessage GetMessage (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified message. /// /// /// Asynchronously gets the specified message. /// /// /// /// /// The message. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetMessageAsync (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified message. /// /// /// Gets the specified message. /// /// /// /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract MimeMessage GetMessage (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified message. /// /// /// Asynchronously gets the specified message. /// /// /// /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetMessageAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part. /// /// /// Gets the specified body part. /// /// /// /// /// The body part. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract MimeEntity GetBodyPart (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part. /// /// /// Asynchronously gets the specified body part. /// /// The body part. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetBodyPartAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part. /// /// /// Gets the specified body part. /// /// The body part. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract MimeEntity GetBodyPart (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part. /// /// /// Asynchronously gets the specified body part. /// /// The body part. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetBodyPartAsync (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a message stream. /// /// /// Gets a message stream. /// /// /// /// /// The message stream. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Stream GetStream (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return GetStream (uid, string.Empty, cancellationToken, progress); } /// /// Asynchronously get a message stream. /// /// /// Asynchronously gets a message stream. /// /// /// /// /// The message stream. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task GetStreamAsync (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return GetStreamAsync (uid, string.Empty, cancellationToken, progress); } /// /// Get a message stream. /// /// /// Gets a message stream. /// /// /// /// /// The message stream. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Stream GetStream (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return GetStream (index, string.Empty, cancellationToken, progress); } /// /// Asynchronously get a message stream. /// /// /// Asynchronously gets a message stream. /// /// /// /// /// The message stream. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task GetStreamAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return GetStreamAsync (index, string.Empty, cancellationToken, progress); } /// /// Get a substream of the specified message. /// /// /// Gets a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The UID of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Stream GetStream (UniqueId uid, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The UID of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetStreamAsync (UniqueId uid, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Stream GetStream (int index, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetStreamAsync (int index, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a body part as a stream. /// /// /// Gets a body part as a stream. /// /// /// /// /// The body part stream. /// The UID of the message. /// The desired body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Stream GetStream (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetStream (uid, part.PartSpecifier, cancellationToken, progress); } /// /// Asynchronously get a body part as a stream. /// /// /// Asynchronously gets a body part as a stream. /// /// /// /// /// The body part stream. /// The UID of the message. /// The desired body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task GetStreamAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetStreamAsync (uid, part.PartSpecifier, cancellationToken, progress); } /// /// Get a body part as a stream. /// /// /// Gets a body part as a stream. /// /// The body part stream. /// The index of the message. /// The desired body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Stream GetStream (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetStream (index, part.PartSpecifier, cancellationToken, progress); } /// /// Asynchronously get a body part as a stream. /// /// /// Asynchronously gets a body part as a stream. /// /// The body part stream. /// The index of the message. /// The desired body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task GetStreamAsync (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetStreamAsync (index, part.PartSpecifier, cancellationToken, progress); } /// /// Get a substream of the specified body part. /// /// /// Gets a substream of the body part. If the starting offset is beyond /// the end of the body part, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the body part, a truncated stream /// will be returned. /// /// The stream. /// The UID of the message. /// The desired body part. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Stream GetStream (UniqueId uid, BodyPart part, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (part == null) throw new ArgumentNullException (nameof (part)); if (offset < 0) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0) throw new ArgumentOutOfRangeException (nameof (count)); return GetStream (uid, part.PartSpecifier, offset, count, cancellationToken, progress); } /// /// Asynchronously get a substream of the specified body part. /// /// /// Asynchronously gets a substream of the body part. If the starting offset is beyond /// the end of the body part, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the body part, a truncated stream /// will be returned. /// /// The stream. /// The UID of the message. /// The desired body part. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task GetStreamAsync (UniqueId uid, BodyPart part, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (part == null) throw new ArgumentNullException (nameof (part)); if (offset < 0) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0) throw new ArgumentOutOfRangeException (nameof (count)); return GetStreamAsync (uid, part.PartSpecifier, offset, count, cancellationToken, progress); } /// /// Get a substream of the specified body part. /// /// /// Gets a substream of the body part. If the starting offset is beyond /// the end of the body part, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the body part, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The desired body part. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Stream GetStream (int index, BodyPart part, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (part == null) throw new ArgumentNullException (nameof (part)); if (offset < 0) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0) throw new ArgumentOutOfRangeException (nameof (count)); return GetStream (index, part.PartSpecifier, offset, count, cancellationToken, progress); } /// /// Asynchronously get a substream of the specified body part. /// /// /// Asynchronously gets a substream of the body part. If the starting offset is beyond /// the end of the body part, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the body part, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The desired body part. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task GetStreamAsync (int index, BodyPart part, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (part == null) throw new ArgumentNullException (nameof (part)); if (offset < 0) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0) throw new ArgumentOutOfRangeException (nameof (count)); return GetStreamAsync (index, part.PartSpecifier, offset, count, cancellationToken, progress); } /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// /// /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Stream GetStream (UniqueId uid, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the specified message. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// /// /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetStreamAsync (UniqueId uid, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. If the starting offset is beyond /// the end of the specified section of the message, an empty stream is returned. If /// the number of bytes desired extends beyond the end of the section, a truncated /// stream will be returned. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Stream GetStream (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified message. /// /// /// Asynchronously gets a substream of the specified message. If the starting /// offset is beyond the end of the specified section of the message, an empty stream /// is returned. If the number of bytes desired extends beyond the end of the section, /// a truncated stream will be returned. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetStreamAsync (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Stream GetStream (int index, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified body part. /// /// /// Asynchronously gets a substream of the specified message. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetStreamAsync (int index, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. If the starting offset is beyond /// the end of the specified section of the message, an empty stream is returned. If /// the number of bytes desired extends beyond the end of the section, a truncated /// stream will be returned. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Stream GetStream (int index, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get a substream of the specified body part. /// /// /// Asynchronously gets a substream of the specified message. If the starting /// offset is beyond the end of the specified section of the message, an empty stream /// is returned. If the number of bytes desired extends beyond the end of the section, /// a truncated stream will be returned. /// For more information about how to construct the , /// see Section 6.4.5 of RFC3501. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetStreamAsync (int index, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Store message flags and keywords for a message. /// /// /// Updates the message flags and keywords for a message. /// /// if the store operation was successful; otherwise, . /// The UID of the message. /// The message flags and keywords to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual bool Store (UniqueId uid, IStoreFlagsRequest request, CancellationToken cancellationToken = default) { var uids = Store (new[] { uid }, request, cancellationToken); return uids == null || uids.Count == 0; } /// /// Asynchronously store message flags and keywords for a message. /// /// /// Asynchronously updates the message flags and keywords for a message. /// /// if the store operation was successful; otherwise, . /// The UID of the message. /// The message flags and keywords to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual async Task StoreAsync (UniqueId uid, IStoreFlagsRequest request, CancellationToken cancellationToken = default) { var uids = await StoreAsync (new[] { uid }, request, cancellationToken).ConfigureAwait (false); return uids == null || uids.Count == 0; } /// /// Store message flags and keywords for a set of messages. /// /// /// Updates the message flags and keywords for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Store (IList uids, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store message flags and keywords for a set of messages. /// /// /// Asynchronously updates the message flags and keywords for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> StoreAsync (IList uids, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Store message flags and keywords for a message. /// /// /// Updates the message flags and keywords for a message. /// /// if the store operation was successful; otherwise, . /// The index of the message. /// The message flags and keywords to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual bool Store (int index, IStoreFlagsRequest request, CancellationToken cancellationToken = default) { var indexes = Store (new[] { index }, request, cancellationToken); return indexes == null || indexes.Count == 0; } /// /// Asynchronously store message flags and keywords for a message. /// /// /// Asynchronously updates the message flags and keywords for a message. /// /// if the store operation was successful; otherwise, . /// The index of the message. /// The message flags and keywords to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual async Task StoreAsync (int index, IStoreFlagsRequest request, CancellationToken cancellationToken = default) { var indexes = await StoreAsync (new[] { index }, request, cancellationToken).ConfigureAwait (false); return indexes == null || indexes.Count == 0; } /// /// Store message flags and keywords for a set of messages. /// /// /// Updates the message flags and keywords for a set of messages. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Store (IList indexes, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store message flags and keywords for a set of messages. /// /// /// Asynchronously updates the message flags and keywords for a set of messages. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> StoreAsync (IList indexes, IStoreFlagsRequest request, CancellationToken cancellationToken = default); /// /// Store GMail-style labels for a message. /// /// /// Updates the GMail-style labels for a message. /// /// if the store operation was successful; otherwise, . /// The UID of the message. /// The GMail-style labels to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual bool Store (UniqueId uid, IStoreLabelsRequest request, CancellationToken cancellationToken = default) { var uids = Store (new[] { uid }, request, cancellationToken); return uids == null || uids.Count == 0; } /// /// Asynchronously store GMail-style labels for a message. /// /// /// Asynchronously updates the GMail-style labels for a message. /// /// if the store operation was successful; otherwise, . /// The UID of the message. /// The GMail-style labels to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual async Task StoreAsync (UniqueId uid, IStoreLabelsRequest request, CancellationToken cancellationToken = default) { var uids = await StoreAsync (new[] { uid }, request, cancellationToken).ConfigureAwait (false); return uids == null || uids.Count == 0; } /// /// Store GMail-style labels for a set of messages. /// /// /// Updates the GMail-style labels for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The GMail-style labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Store (IList uids, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store GMail-style labels for a set of messages. /// /// /// Asynchronously updates the GMail-style labels for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The GMail-style labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> StoreAsync (IList uids, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Store GMail-style labels for a message. /// /// /// Updates the GMail-style labels for a message. /// /// if the store operation was successful; otherwise, . /// The index of the message. /// The GMail-style labels to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual bool Store (int index, IStoreLabelsRequest request, CancellationToken cancellationToken = default) { var indexes = Store (new[] { index }, request, cancellationToken); return indexes == null || indexes.Count == 0; } /// /// Asynchronously store GMail-style labels for a message. /// /// /// Asynchronously updates the GMail-style labels for a message. /// /// if the store operation was successful; otherwise, . /// The index of the message. /// The GMail-style labels to store. /// The cancellation token. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual async Task StoreAsync (int index, IStoreLabelsRequest request, CancellationToken cancellationToken = default) { var indexes = await StoreAsync (new[] { index }, request, cancellationToken).ConfigureAwait (false); return indexes == null || indexes.Count == 0; } /// /// Store GMail-style labels for a set of messages. /// /// /// Updates the GMail-style labels for a set of messages. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The GMail-style labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Store (IList indexes, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Asynchronously store GMail-style labels for a set of messages. /// /// /// Asynchronously updates the GMail-style labels for a set of messages. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The GMail-style labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open in read-write mode. /// /// /// The folder does not support storing labels. /// -or- /// The specified an /// value but the folder does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> StoreAsync (IList indexes, IStoreLabelsRequest request, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified message. /// /// /// Stores the annotations for the specified message. /// /// The UID of the message. /// The annotations to store. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual void Store (UniqueId uid, IList annotations, CancellationToken cancellationToken = default) { Store (new [] { uid }, annotations, cancellationToken); } /// /// Asynchronously store the annotations for the specified message. /// /// /// Asynchronously stores the annotations for the specified message. /// /// An asynchronous task context. /// The UID of the message. /// The annotations to store. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task StoreAsync (UniqueId uid, IList annotations, CancellationToken cancellationToken = default) { return StoreAsync (new [] { uid }, annotations, cancellationToken); } /// /// Store the annotations for the specified messages. /// /// /// Stores the annotations for the specified messages. /// /// The UIDs of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Store (IList uids, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified messages. /// /// /// Asynchronously stores the annotations for the specified messages. /// /// An asynchronous task context. /// The UIDs of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task StoreAsync (IList uids, IList annotations, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The UIDs of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Store (IList uids, ulong modseq, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The UIDs of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> StoreAsync (IList uids, ulong modseq, IList annotations, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified message. /// /// /// Stores the annotations for the specified message. /// /// The index of the message. /// The annotations to store. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual void Store (int index, IList annotations, CancellationToken cancellationToken = default) { Store (new[] { index }, annotations, cancellationToken); } /// /// Asynchronously store the annotations for the specified message. /// /// /// Asynchronously stores the annotations for the specified message. /// /// An asynchronous task context. /// The indexes of the message. /// The annotations to store. /// The cancellation token. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task StoreAsync (int index, IList annotations, CancellationToken cancellationToken = default) { return StoreAsync (new [] { index }, annotations, cancellationToken); } /// /// Store the annotations for the specified messages. /// /// /// Stores the annotations for the specified messages. /// /// The indexes of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void Store (IList indexes, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified messages. /// /// /// Asynchronously stores the annotations for the specified messages. /// /// An asynchronous task context. /// The indexes of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task StoreAsync (IList indexes, IList annotations, CancellationToken cancellationToken = default); /// /// Store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The indexes of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Store (IList indexes, ulong modseq, IList annotations, CancellationToken cancellationToken = default); /// /// Asynchronously store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously stores the annotations for the specified messages only if their mod-sequence value is less than the specified value.s /// /// The indexes of the messages that were not updated. /// The indexes of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> StoreAsync (IList indexes, ulong modseq, IList annotations, CancellationToken cancellationToken = default); /// /// Search the folder for messages matching the specified query. /// /// /// The returned array of unique identifiers can be used with methods such as /// . /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported by the mail store. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual IList Search (SearchQuery query, CancellationToken cancellationToken = default) { var results = Search (SearchOptions.None, query, cancellationToken); return results.UniqueIds; } /// /// Asynchronously search the folder for messages matching the specified query. /// /// /// The returned array of unique identifiers can be used with methods such as /// . /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported by the mail store. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual async Task> SearchAsync (SearchQuery query, CancellationToken cancellationToken = default) { var results = await SearchAsync (SearchOptions.None, query, cancellationToken).ConfigureAwait (false); return results.UniqueIds; } /// /// Search the subset of UIDs in the folder for messages matching the specified query. /// /// /// The returned array of unique identifiers can be used with methods such as /// . /// /// An array of matching UIDs in the specified sort order. /// The subset of UIDs /// The search query. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported by the mail store. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual IList Search (IList uids, SearchQuery query, CancellationToken cancellationToken = default) { var uidSet = new UidSearchQuery (uids); if (query == null) throw new ArgumentNullException (nameof (query)); return Search (uidSet.And (query), cancellationToken); } /// /// Asynchronously search the subset of UIDs in the folder for messages matching the specified query. /// /// /// The returned array of unique identifiers can be used with methods such as /// . /// /// An array of matching UIDs in the specified sort order. /// The subset of UIDs /// The search query. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task> SearchAsync (IList uids, SearchQuery query, CancellationToken cancellationToken = default) { var uidSet = new UidSearchQuery (uids); if (query == null) throw new ArgumentNullException (nameof (query)); return SearchAsync (uidSet.And (query), cancellationToken); } /// /// Search the folder for messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract SearchResults Search (SearchOptions options, SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously search the folder for messages matching the specified query. /// /// /// Asynchronously searches the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task SearchAsync (SearchOptions options, SearchQuery query, CancellationToken cancellationToken = default); /// /// Search the subset of UIDs in the folder for messages matching the specified query. /// /// /// Searches the subset of UIDs in the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The subset of UIDs /// The search query. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual SearchResults Search (SearchOptions options, IList uids, SearchQuery query, CancellationToken cancellationToken = default) { var uidSet = new UidSearchQuery (uids); if (query == null) throw new ArgumentNullException (nameof (query)); return Search (options, uidSet.And (query), cancellationToken); } /// /// Asynchronously search the subset of UIDs in the folder for messages matching the specified query. /// /// /// Asynchronously searches the subset of UIDs in the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The subset of UIDs /// The search query. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task SearchAsync (SearchOptions options, IList uids, SearchQuery query, CancellationToken cancellationToken = default) { var uidSet = new UidSearchQuery (uids); if (query == null) throw new ArgumentNullException (nameof (query)); return SearchAsync (options, uidSet.And (query), cancellationToken); } /// /// Sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// /// An array of matching UIDs in the specified sort order. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual IList Sort (SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { var results = Sort (SearchOptions.None, query, orderBy, cancellationToken); return results.UniqueIds; } /// /// Asynchronously sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual async Task> SortAsync (SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { var results = await SortAsync (SearchOptions.None, query, orderBy, cancellationToken).ConfigureAwait (false); return results.UniqueIds; } /// /// Sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The subset of UIDs /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual IList Sort (IList uids, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { var uidSet = new UidSearchQuery (uids); if (query == null) throw new ArgumentNullException (nameof (query)); return Sort (uidSet.And (query), orderBy, cancellationToken); } /// /// Asynchronously sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The subset of UIDs /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task> SortAsync (IList uids, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { var uidSet = new UidSearchQuery (uids); if (query == null) throw new ArgumentNullException (nameof (query)); return SortAsync (uidSet.And (query), orderBy, cancellationToken); } /// /// Sort messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract SearchResults Sort (SearchOptions options, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Asynchronously sort messages matching the specified query. /// /// /// Asynchronously searches the folder for messages matching the specified query, returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task SortAsync (SearchOptions options, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default); /// /// Sort messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The subset of UIDs /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual SearchResults Sort (SearchOptions options, IList uids, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { var uidSet = new UidSearchQuery (uids); if (query == null) throw new ArgumentNullException (nameof (query)); return Sort (options, uidSet.And (query), orderBy, cancellationToken); } /// /// Asynchronously sort messages matching the specified query, returning the search results in the specified sort order. /// /// /// Asynchronously searches the folder for messages matching the specified query, /// returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The subset of UIDs /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// is empty. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support the specified search options. /// -or- /// The server does not support sorting search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task SortAsync (SearchOptions options, IList uids, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { var uidSet = new UidSearchQuery (uids); if (query == null) throw new ArgumentNullException (nameof (query)); return SortAsync (options, uidSet.And (query), orderBy, cancellationToken); } /// /// Thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support threading search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Thread (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support threading search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> ThreadAsync (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default); /// /// Thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The subset of UIDs /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support threading search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract IList Thread (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default); /// /// Asynchronously thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The subset of UIDs /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported. /// -or- /// The server does not support threading search results. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task> ThreadAsync (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default); /// /// Occurs when the folder is opened. /// /// /// The event is emitted when the folder is opened. /// public event EventHandler? Opened; /// /// Raise the opened event. /// /// /// Raises the opened event. /// protected virtual void OnOpened () { Opened?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the folder is closed. /// /// /// The event is emitted when the folder is closed. /// public event EventHandler? Closed; /// /// Raise the closed event. /// /// /// Raises the closed event. /// internal protected virtual void OnClosed () { PermanentFlags = MessageFlags.None; AcceptedFlags = MessageFlags.None; Access = FolderAccess.None; FirstUnread = -1; AnnotationAccess = AnnotationAccess.None; AnnotationScopes = AnnotationScope.None; MaxAnnotationSize = 0; Closed?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the folder is deleted. /// /// /// The event is emitted when the folder is deleted. /// public event EventHandler? Deleted; /// /// Raise the deleted event. /// /// /// Raises the deleted event. /// protected virtual void OnDeleted () { Deleted?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the folder is renamed. /// /// /// The event is emitted when the folder is renamed. /// public event EventHandler? Renamed; /// /// Raise the renamed event. /// /// /// Raises the renamed event. /// /// The old name of the folder. /// The new name of the folder. protected virtual void OnRenamed (string oldName, string newName) { Renamed?.Invoke (this, new FolderRenamedEventArgs (oldName, newName)); } /// /// Notifies the folder that a parent folder has been renamed. /// /// /// implementations should override this method /// to update their state (such as updating their /// property). /// protected virtual void OnParentFolderRenamed () { } void OnParentFolderRenamed (object? sender, FolderRenamedEventArgs e) { var oldFullName = FullName; OnParentFolderRenamed (); if (FullName != oldFullName) OnRenamed (oldFullName, FullName); } /// /// Occurs when the folder is subscribed. /// /// /// The event is emitted when the folder is subscribed. /// public event EventHandler? Subscribed; /// /// Raise the subscribed event. /// /// /// Raises the subscribed event. /// protected virtual void OnSubscribed () { Subscribed?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the folder is unsubscribed. /// /// /// The event is emitted when the folder is unsubscribed. /// public event EventHandler? Unsubscribed; /// /// Raise the unsubscribed event. /// /// /// Raises the unsubscribed event. /// protected virtual void OnUnsubscribed () { Unsubscribed?.Invoke (this, EventArgs.Empty); } /// /// Occurs when a message is expunged from the folder. /// /// /// The event is emitted when a message is expunged from the folder. /// /// /// /// public event EventHandler? MessageExpunged; /// /// Raise the message expunged event. /// /// /// Raises the message expunged event. /// /// The message expunged event args. protected virtual void OnMessageExpunged (MessageEventArgs args) { MessageExpunged?.Invoke (this, args); } /// /// Occurs when a message vanishes from the folder. /// /// /// The event is emitted when messages vanish from the folder. /// public event EventHandler? MessagesVanished; /// /// Raise the messages vanished event. /// /// /// Raises the messages vanished event. /// /// The messages vanished event args. protected virtual void OnMessagesVanished (MessagesVanishedEventArgs args) { MessagesVanished?.Invoke (this, args); } /// /// Occurs when flags changed on a message. /// /// /// The event is emitted when the flags for a message are changed. /// /// /// /// public event EventHandler? MessageFlagsChanged; /// /// Raise the message flags changed event. /// /// /// Raises the message flags changed event. /// /// The message flags changed event args. protected virtual void OnMessageFlagsChanged (MessageFlagsChangedEventArgs args) { MessageFlagsChanged?.Invoke (this, args); } /// /// Occurs when labels changed on a message. /// /// /// The event is emitted when the labels for a message are changed. /// public event EventHandler? MessageLabelsChanged; /// /// Raise the message labels changed event. /// /// /// Raises the message labels changed event. /// /// The message labels changed event args. protected virtual void OnMessageLabelsChanged (MessageLabelsChangedEventArgs args) { MessageLabelsChanged?.Invoke (this, args); } /// /// Occurs when annotations changed on a message. /// /// /// The event is emitted when the annotations for a message are changed. /// public event EventHandler? AnnotationsChanged; /// /// Raise the message annotations changed event. /// /// /// Raises the message annotations changed event. /// /// The message annotations changed event args. protected virtual void OnAnnotationsChanged (AnnotationsChangedEventArgs args) { AnnotationsChanged?.Invoke (this, args); } /// /// Occurs when a message summary is fetched from the folder. /// /// /// Emitted when a message summary is fetched from the folder. /// When multiple message summaries are being fetched from a remote folder, /// it is possible that the connection will drop or some other exception will /// occur, causing the Fetch method to fail and lose all of the data that has been /// downloaded up to that point, requiring the client to request the same set of /// message summaries all over again after it reconnects. This is obviously /// inefficient. To alleviate this potential problem, this event will be emitted /// as soon as the successfully parses each untagged FETCH /// response from the server, allowing the client to commit this data immediately to /// its local cache. /// Depending on the IMAP server, it is possible that the /// event will be emitted for the same message /// multiple times if the IMAP server happens to split the requested fields into /// multiple untagged FETCH responses. Use the /// property to determine which f properties have /// been populated. /// public event EventHandler? MessageSummaryFetched; /// /// Raise the message summary fetched event. /// /// /// Raises the message summary fetched event. /// When multiple message summaries are being fetched from a remote folder, /// it is possible that the connection will drop or some other exception will /// occur, causing the Fetch method to fail and lose all of the data that has been /// downloaded up to that point, requiring the client to request the same set of /// message summaries all over again after it reconnects. This is obviously /// inefficient. To alleviate this potential problem, this event will be emitted /// as soon as the successfully parses each untagged FETCH /// response from the server, allowing the client to commit this data immediately to /// its local cache. /// Depending on the IMAP server, it is possible that /// will be invoked for the same message /// multiple times if the IMAP server happens to split the requested fields into /// multiple untagged FETCH responses. Use the /// property to determine which f properties have /// been populated. /// /// The message summary. protected virtual void OnMessageSummaryFetched (IMessageSummary message) { MessageSummaryFetched?.Invoke (this, new MessageSummaryFetchedEventArgs (message)); } /// /// Occurs when metadata changes. /// /// /// The event is emitted when metadata changes. /// public event EventHandler? MetadataChanged; /// /// Raise the metadata changed event. /// /// /// Raises the metadata changed event. /// /// The metadata that changed. internal protected virtual void OnMetadataChanged (Metadata metadata) { MetadataChanged?.Invoke (this, new MetadataChangedEventArgs (metadata)); } /// /// Occurs when the mod-sequence changed on a message. /// /// /// The event is emitted when the mod-sequence for a message is changed. /// public event EventHandler? ModSeqChanged; /// /// Raise the message mod-sequence changed event. /// /// /// Raises the message mod-sequence changed event. /// /// The mod-sequence changed event args. protected virtual void OnModSeqChanged (ModSeqChangedEventArgs args) { ModSeqChanged?.Invoke (this, args); } /// /// Occurs when the highest mod-sequence changes. /// /// /// The event is emitted whenever the value changes. /// public event EventHandler? HighestModSeqChanged; /// /// Raise the highest mod-sequence changed event. /// /// /// Raises the highest mod-sequence changed event. /// protected virtual void OnHighestModSeqChanged () { HighestModSeqChanged?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the next UID changes. /// /// /// The event is emitted whenever the value changes. /// public event EventHandler? UidNextChanged; /// /// Raise the next UID changed event. /// /// /// Raises the next UID changed event. /// protected virtual void OnUidNextChanged () { UidNextChanged?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the UID validity changes. /// /// /// The event is emitted whenever the value changes. /// public event EventHandler? UidValidityChanged; /// /// Raise the uid validity changed event. /// /// /// Raises the uid validity changed event. /// protected virtual void OnUidValidityChanged () { UidValidityChanged?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the folder ID changes. /// /// /// The event is emitted whenever the value changes. /// public event EventHandler? IdChanged; /// /// Raise the ID changed event. /// /// /// Raises the ID changed event. /// protected virtual void OnIdChanged () { IdChanged?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the folder size changes. /// /// /// The event is emitted whenever the value changes. /// public event EventHandler? SizeChanged; /// /// Raise the size changed event. /// /// /// Raises the size changed event. /// protected virtual void OnSizeChanged () { SizeChanged?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the message count changes. /// /// /// The event is emitted whenever the value changes. /// /// /// /// public event EventHandler? CountChanged; /// /// Raise the message count changed event. /// /// /// Raises the message count changed event. /// protected virtual void OnCountChanged () { CountChanged?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the recent message count changes. /// /// /// The event is emitted whenever the value changes. /// public event EventHandler? RecentChanged; /// /// Raise the recent message count changed event. /// /// /// Raises the recent message count changed event. /// protected virtual void OnRecentChanged () { RecentChanged?.Invoke (this, EventArgs.Empty); } /// /// Occurs when the unread message count changes. /// /// /// The event is emitted whenever the value changes. /// public event EventHandler? UnreadChanged; /// /// Raise the unread message count changed event. /// /// /// Raises the unread message count changed event. /// protected virtual void OnUnreadChanged () { UnreadChanged?.Invoke (this, EventArgs.Empty); } #region IEnumerable implementation /// /// Get an enumerator for the messages in the folder. /// /// /// Gets an enumerator for the messages in the folder. /// /// The enumerator. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// public abstract IEnumerator GetEnumerator (); /// /// Get an enumerator for the messages in the folder. /// /// /// Gets an enumerator for the messages in the folder. /// /// The enumerator. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder is not currently open. /// IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } #endregion /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { return FullName; } } } ================================================ FILE: MailKit/MailKit.csproj ================================================ An Open Source cross-platform .NET mail-client library that is based on MimeKit and optimized for mobile devices. MailKit 4.15.1 Jeffrey Stedfast 12 netstandard2.0;netstandard2.1;net462;net47;net48;net8.0;net10.0 true false MailKit MailKit smtp;pop3;imap;mime;security;dkim;smime;s/mime;openpgp;pgp;mbox;mail;email;parser;tnef https://github.com/jstedfast/MailKit https://github.com/jstedfast/MailKit/blob/master/License.md false false false false false false false false false MailKit enable true mailkit.snk true true true true 1701;1702;CA1068;CA1510;CA1512;CA1513;CA1835;CA2012;IDE0016;IDE0056;IDE0057;IDE0060;IDE0063;IDE0066;IDE0090;IDE0180;IDE0251 full portable full $(DefineConstants);SERIALIZABLE true ================================================ FILE: MailKit/MailKitLite.csproj ================================================ An Open Source cross-platform .NET mail-client library that is based on MimeKit and optimized for mobile devices. MailKit 4.15.1 Jeffrey Stedfast 10 netstandard2.0;netstandard2.1;net462;net47;net48;net8.0;net10.0 true false MailKitLite MailKitLite smtp;pop3;imap;mime;security;dkim;smime;s/mime;openpgp;pgp;mbox;mail;email;parser;tnef https://github.com/jstedfast/MailKit https://github.com/jstedfast/MailKit/blob/master/License.md false false false false false false false false false MailKit true mailkit.snk true true $(DefineConstants);MAILKIT_LITE true true 1701;1702;CA1068;CA1510;CA1512;CA1513;CA1835;CA2012;IDE0016;IDE0056;IDE0057;IDE0060;IDE0063;IDE0066;IDE0090;IDE0180;IDE0251 full portable full $(DefineConstants);SERIALIZABLE true ================================================ FILE: MailKit/MailService.cs ================================================ // // MailService.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Net.Security; using System.Threading.Tasks; using System.Collections.Generic; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using MailKit.Net; using MailKit.Net.Proxy; using MailKit.Security; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit { /// /// An abstract mail service implementation. /// /// /// An abstract mail service implementation. /// public abstract class MailService : IMailService { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The protocol logger. /// /// is . /// protected MailService (IProtocolLogger protocolLogger) { if (protocolLogger == null) throw new ArgumentNullException (nameof (protocolLogger)); #if NETFRAMEWORK // Default the SslProtocols value to whatever the system default is (as defined by ServicePointManager.SecurityProtocol). // // See discussion in https://github.com/jstedfast/MailKit/issues/1952 for details. SslProtocols = (SslProtocols) ServicePointManager.SecurityProtocol; #else // Default the SslProtocols value to `None` which allows the operating system to choose the best // protocol to use and to block protocols that are not secure. SslProtocols = SslProtocols.None; #endif CheckCertificateRevocation = true; ProtocolLogger = protocolLogger; } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// protected MailService () : this (new NullProtocolLogger ()) { } /// /// Releases unmanaged resources and performs other cleanup operations before the /// is reclaimed by garbage collection. /// /// /// Releases unmanaged resources and performs other cleanup operations before the /// is reclaimed by garbage collection. /// ~MailService () { Dispose (false); } /// /// Get an object that can be used to synchronize access to the service. /// /// /// Gets an object that can be used to synchronize access to the service. /// /// The sync root. public abstract object SyncRoot { get; } /// /// Get the protocol supported by the message service. /// /// /// Gets the protocol supported by the message service. /// /// The protocol. protected abstract string Protocol { get; } /// /// Get the protocol logger. /// /// /// Gets the protocol logger. /// /// The protocol logger. public IProtocolLogger ProtocolLogger { get; private set; } /// /// Get or set the set of enabled SSL and/or TLS protocol versions that the client is allowed to use. /// /// /// Gets or sets the enabled SSL and/or TLS protocol versions that the client is allowed to use. /// By default, MailKit initializes this value to which allows the /// operating system to choose the best protocol to use and to block protocols that are not secure. /// This property should be set before calling any of the /// Connect or /// ConnectAsync methods. /// /// The SSL and TLS protocol versions that are enabled. public SslProtocols SslProtocols { get; set; } #if NET5_0_OR_GREATER /// /// Get or set the cipher suites allowed to be used when negotiating an SSL or TLS connection. /// /// /// Specifies the cipher suites allowed to be used when negotiating an SSL or TLS connection. /// When set to , the operating system default is used. Use extreme caution when /// changing this setting. /// This property should be set before calling any of the /// Connect or /// ConnectAsync methods. /// /// The cipher algorithms allowed for use when negotiating SSL or TLS encryption. public CipherSuitesPolicy? SslCipherSuitesPolicy { get; set; } /// /// Get the negotiated SSL or TLS cipher suite. /// /// /// Gets the negotiated SSL or TLS cipher suite once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher suite. public abstract TlsCipherSuite? SslCipherSuite { get; } #endif /// /// Get or set the client SSL certificates. /// /// /// Some servers may require the client SSL certificates in order /// to allow the user to connect. /// This property should be set before calling any of the /// Connect or /// ConnectAsync methods. /// /// The client SSL certificates. public X509CertificateCollection? ClientCertificates { get; set; } /// /// Get or set whether connecting via SSL/TLS should check certificate revocation. /// /// /// Gets or sets whether connecting via SSL/TLS should check certificate revocation. /// Normally, the value of this property should be set to (the default) for security /// reasons, but there are times when it may be necessary to set it to . /// For example, most Certificate Authorities are probably pretty good at keeping their CRL and/or /// OCSP servers up 24/7, but occasionally they do go down or are otherwise unreachable due to other /// network problems between the client and the Certificate Authority. When this happens, it becomes /// impossible to check the revocation status of one or more of the certificates in the chain /// resulting in an being thrown in the /// Connect method. If this becomes a problem, /// it may become desirable to set to . /// /// if certificate revocation should be checked; otherwise, . public bool CheckCertificateRevocation { get; set; } /// /// Get or set a callback function to validate the server certificate. /// /// /// Gets or sets a callback function to validate the server certificate. /// This property should be set before calling any of the /// Connect or /// ConnectAsync methods. /// /// /// /// /// The server certificate validation callback function. public RemoteCertificateValidationCallback? ServerCertificateValidationCallback { get; set; } /// /// Get or set the local IP end point to use when connecting to the remote host. /// /// /// Gets or sets the local IP end point to use when connecting to the remote host. /// /// The local IP end point or to use the default end point. public IPEndPoint? LocalEndPoint { get; set; } /// /// Get or set the proxy client to use when connecting to a remote host. /// /// /// Gets or sets the proxy client to use when connecting to a remote host via any of the /// Connect methods. /// /// /// /// /// The proxy client. public IProxyClient? ProxyClient { get; set; } /// /// Gets the authentication mechanisms supported by the mail server. /// /// /// The authentication mechanisms are queried as part of the /// Connect method. /// /// The authentication mechanisms. public abstract HashSet AuthenticationMechanisms { get; } /// /// Gets whether or not the client is currently connected to an mail server. /// /// ///The state is set to immediately after /// one of the Connect /// methods succeeds and is not set back to until either the client /// is disconnected via or until a /// is thrown while attempting to read or write to /// the underlying network socket. /// When an is caught, the connection state of the /// should be checked before continuing. /// /// if the client is connected; otherwise, . public abstract bool IsConnected { get; } /// /// Get whether or not the connection is secure (typically via SSL or TLS). /// /// /// Gets whether or not the connection is secure (typically via SSL or TLS). /// /// if the connection is secure; otherwise, . public abstract bool IsSecure { get; } /// /// Get whether or not the connection is encrypted (typically via SSL or TLS). /// /// /// Gets whether or not the connection is encrypted (typically via SSL or TLS). /// /// if the connection is encrypted; otherwise, . public abstract bool IsEncrypted { get; } /// /// Get whether or not the connection is signed (typically via SSL or TLS). /// /// /// Gets whether or not the connection is signed (typically via SSL or TLS). /// /// if the connection is signed; otherwise, . public abstract bool IsSigned { get; } /// /// Get the negotiated SSL or TLS protocol version. /// /// /// Gets the negotiated SSL or TLS protocol version once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS protocol version. public abstract SslProtocols SslProtocol { get; } /// /// Get the negotiated SSL or TLS cipher algorithm. /// /// /// Gets the negotiated SSL or TLS cipher algorithm once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public abstract CipherAlgorithmType? SslCipherAlgorithm { get; } /// /// Get the negotiated SSL or TLS cipher algorithm strength. /// /// /// Gets the negotiated SSL or TLS cipher algorithm strength once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public abstract int? SslCipherStrength { get; } /// /// Get the negotiated SSL or TLS hash algorithm. /// /// /// Gets the negotiated SSL or TLS hash algorithm once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS hash algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public abstract HashAlgorithmType? SslHashAlgorithm { get; } /// /// Get the negotiated SSL or TLS hash algorithm strength. /// /// /// Gets the negotiated SSL or TLS hash algorithm strength once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS hash algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public abstract int? SslHashStrength { get; } /// /// Get the negotiated SSL or TLS key exchange algorithm. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS key exchange algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public abstract ExchangeAlgorithmType? SslKeyExchangeAlgorithm { get; } /// /// Get the negotiated SSL or TLS key exchange algorithm strength. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm strength once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS key exchange algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public abstract int? SslKeyExchangeStrength { get; } /// /// Get whether or not the client is currently authenticated with the mail server. /// /// /// Gets whether or not the client is currently authenticated with the mail server. /// To authenticate with the mail server, use one of the /// Authenticate methods /// or any of the Async alternatives. /// /// if the client is authenticated; otherwise, . public abstract bool IsAuthenticated { get; } /// /// Gets or sets the timeout for network streaming operations, in milliseconds. /// /// /// Gets or sets the underlying socket stream's /// and values. /// /// The timeout in milliseconds. public abstract int Timeout { get; set; } /// /// The default server certificate validation callback used when connecting via SSL or TLS. /// /// /// The default server certificate validation callback only succeeds if there are no SSL/TLS certificate validation errors. /// /// if the certificate is deemed valid; otherwise, . /// The object that is connecting via SSL or TLS. /// The server's SSL certificate. /// The server's SSL certificate chain. /// The SSL policy errors. protected static bool DefaultServerCertificateValidationCallback (object? sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) { return sslPolicyErrors == SslPolicyErrors.None; } #if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER /// /// Gets the SSL/TLS client authentication options for use with .NET5's SslStream.AuthenticateAsClient() API. /// /// /// Gets the SSL/TLS client authentication options for use with .NET5's SslStream.AuthenticateAsClient() API. /// /// The target host that the client is connected to. /// The remote certificate validation callback. /// The client SSL/TLS authentication options. protected virtual SslClientAuthenticationOptions GetSslClientAuthenticationOptions (string host, RemoteCertificateValidationCallback remoteCertificateValidationCallback) { return new SslClientAuthenticationOptions { CertificateRevocationCheckMode = CheckCertificateRevocation ? X509RevocationMode.Online : X509RevocationMode.NoCheck, // Note: Not all servers support Application Protocols, so this will break in some cases. //ApplicationProtocols = new List { new SslApplicationProtocol (Protocol) }, RemoteCertificateValidationCallback = remoteCertificateValidationCallback, #if NET5_0_OR_GREATER CipherSuitesPolicy = SslCipherSuitesPolicy, #endif ClientCertificates = ClientCertificates, EnabledSslProtocols = SslProtocols, TargetHost = host }; } #endif internal Stream ConnectNetwork (string host, int port, CancellationToken cancellationToken) { if (ProxyClient != null) { ProxyClient.LocalEndPoint = LocalEndPoint; return ProxyClient.Connect (host, port, Timeout, cancellationToken); } var socket = SocketUtils.Connect (host, port, LocalEndPoint, Timeout, cancellationToken); return new NetworkStream (socket, true); } internal async Task ConnectNetworkAsync (string host, int port, CancellationToken cancellationToken) { if (ProxyClient != null) { ProxyClient.LocalEndPoint = LocalEndPoint; return await ProxyClient.ConnectAsync (host, port, Timeout, cancellationToken).ConfigureAwait (false); } var socket = await SocketUtils.ConnectAsync (host, port, LocalEndPoint, Timeout, cancellationToken).ConfigureAwait (false); return new NetworkStream (socket, true); } /// /// Establish a connection to the specified mail server. /// /// /// Establishes a connection to the specified mail server. /// /// /// /// /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public abstract void Connect (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Asynchronously establish a connection to the specified mail server. /// /// /// Asynchronously establishes a connection to the specified mail server. /// /// An asynchronous task context. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public abstract Task ConnectAsync (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Establish a connection to the specified mail server using the provided socket. /// /// /// Establish a connection to the specified mail server using the provided socket. /// If a successful connection is made, the /// property will be populated. /// /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// public abstract void Connect (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Asynchronously establish a connection to the specified mail server using the provided socket. /// /// /// Asynchronously establishes a connection to the specified mail server using the provided socket. /// If a successful connection is made, the /// property will be populated. /// /// An asynchronous task context. /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// public abstract Task ConnectAsync (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Establish a connection to the specified mail server using the provided stream. /// /// /// Establish a connection to the specified mail server using the provided stream. /// If a successful connection is made, the /// property will be populated. /// /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// public abstract void Connect (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); /// /// Asynchronously establish a connection to the specified mail server using the provided stream. /// /// /// Asynchronously establishes a connection to the specified mail server using the provided stream. /// If a successful connection is made, the /// property will be populated. /// /// An asynchronous task context. /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// public abstract Task ConnectAsync (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default); static bool IsAny (string value, params string[] anyOf) { foreach (var item in anyOf) { if (value.Equals (item, StringComparison.OrdinalIgnoreCase)) return true; } return false; } internal SecureSocketOptions GetSecureSocketOptions (Uri uri) { var query = uri.ParsedQuery (); var protocol = uri.Scheme; // Note: early versions of MailKit used "pop3" and "pop3s" if (protocol.Equals ("pop3s", StringComparison.OrdinalIgnoreCase)) protocol = "pops"; else if (protocol.Equals ("pop3", StringComparison.OrdinalIgnoreCase)) protocol = "pop"; if (protocol.Equals (Protocol + "s", StringComparison.OrdinalIgnoreCase)) return SecureSocketOptions.SslOnConnect; if (!protocol.Equals (Protocol, StringComparison.OrdinalIgnoreCase)) throw new ArgumentException ("Unknown URI scheme.", nameof (uri)); if (query.TryGetValue ("starttls", out string? value)) { if (IsAny (value, "always", "true", "yes")) return SecureSocketOptions.StartTls; if (IsAny (value, "never", "false", "no")) return SecureSocketOptions.None; return SecureSocketOptions.StartTlsWhenAvailable; } return SecureSocketOptions.StartTlsWhenAvailable; } /// /// Establish a connection to the specified mail server. /// /// /// Establishes a connection to the specified mail server. /// /// /// /// /// The server URI. /// The cancellation token. /// /// The is . /// /// /// The is not an absolute URI. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public void Connect (Uri uri, CancellationToken cancellationToken = default) { if (uri == null) throw new ArgumentNullException (nameof (uri)); if (!uri.IsAbsoluteUri) throw new ArgumentException ("The uri must be absolute.", nameof (uri)); var options = GetSecureSocketOptions (uri); Connect (uri.Host, uri.Port < 0 ? 0 : uri.Port, options, cancellationToken); } /// /// Asynchronously establish a connection to the specified mail server. /// /// /// Asynchronously establishes a connection to the specified mail server. /// /// An asynchronous task context. /// The server URI. /// The cancellation token. /// /// The is . /// /// /// The is not an absolute URI. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public Task ConnectAsync (Uri uri, CancellationToken cancellationToken = default) { if (uri == null) throw new ArgumentNullException (nameof (uri)); if (!uri.IsAbsoluteUri) throw new ArgumentException ("The uri must be absolute.", nameof (uri)); var options = GetSecureSocketOptions (uri); return ConnectAsync (uri.Host, uri.Port < 0 ? 0 : uri.Port, options, cancellationToken); } /// /// Establish a connection to the specified mail server. /// /// /// Establishes a connection to the specified mail server. /// /// The argument only controls whether or /// not the client makes an SSL-wrapped connection. In other words, even if the /// parameter is , SSL/TLS may still be used if /// the mail server supports the STARTTLS extension. /// To disable all use of SSL/TLS, use the /// /// overload with a value of /// SecureSocketOptions.None /// instead. /// /// /// The host to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// if the client should make an SSL-wrapped connection to the server; otherwise, . /// The cancellation token. /// /// The is . /// /// /// is out of range (0 to 65535, inclusive). /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public void Connect (string host, int port, bool useSsl, CancellationToken cancellationToken = default) { if (host == null) throw new ArgumentNullException (nameof (host)); if (host.Length == 0) throw new ArgumentException ("The host name cannot be empty.", nameof (host)); if (port < 0 || port > 65535) throw new ArgumentOutOfRangeException (nameof (port)); Connect (host, port, useSsl ? SecureSocketOptions.SslOnConnect : SecureSocketOptions.StartTlsWhenAvailable, cancellationToken); } /// /// Asynchronously establish a connection to the specified mail server. /// /// /// Asynchronously establishes a connection to the specified mail server. /// /// The argument only controls whether or /// not the client makes an SSL-wrapped connection. In other words, even if the /// parameter is , SSL/TLS may still be used if /// the mail server supports the STARTTLS extension. /// To disable all use of SSL/TLS, use the /// /// overload with a value of /// SecureSocketOptions.None /// instead. /// /// /// An asynchronous task context. /// The host to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// if the client should make an SSL-wrapped connection to the server; otherwise, . /// The cancellation token. /// /// The is . /// /// /// is out of range (0 to 65535, inclusive). /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public Task ConnectAsync (string host, int port, bool useSsl, CancellationToken cancellationToken = default) { if (host == null) throw new ArgumentNullException (nameof (host)); if (host.Length == 0) throw new ArgumentException ("The host name cannot be empty.", nameof (host)); if (port < 0 || port > 65535) throw new ArgumentOutOfRangeException (nameof (port)); return ConnectAsync (host, port, useSsl ? SecureSocketOptions.SslOnConnect : SecureSocketOptions.StartTlsWhenAvailable, cancellationToken); } /// /// Authenticate using the supplied credentials. /// /// /// Authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// The encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public abstract void Authenticate (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default); /// /// Asynchronously authenticate using the supplied credentials. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// An asynchronous task context. /// The encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public abstract Task AuthenticateAsync (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default); /// /// Authenticate using the supplied credentials. /// /// /// Authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// The user's credentials. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public void Authenticate (ICredentials credentials, CancellationToken cancellationToken = default) { Authenticate (Encoding.UTF8, credentials, cancellationToken); } /// /// Asynchronously authenticate using the supplied credentials. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// An asynchronous task context. /// The user's credentials. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public Task AuthenticateAsync (ICredentials credentials, CancellationToken cancellationToken = default) { return AuthenticateAsync (Encoding.UTF8, credentials, cancellationToken); } /// /// Authenticate using the specified user name and password. /// /// /// Authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// The encoding to use for the user's credentials. /// The user name. /// The password. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public void Authenticate (Encoding encoding, string userName, string password, CancellationToken cancellationToken = default) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); if (userName == null) throw new ArgumentNullException (nameof (userName)); if (password == null) throw new ArgumentNullException (nameof (password)); var credentials = new NetworkCredential (userName, password); Authenticate (encoding, credentials, cancellationToken); } /// /// Asynchronously authenticate using the specified user name and password. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// An asynchronous task context. /// The encoding to use for the user's credentials. /// The user name. /// The password. /// The cancellation token. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public Task AuthenticateAsync (Encoding encoding, string userName, string password, CancellationToken cancellationToken = default) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); if (userName == null) throw new ArgumentNullException (nameof (userName)); if (password == null) throw new ArgumentNullException (nameof (password)); var credentials = new NetworkCredential (userName, password); return AuthenticateAsync (encoding, credentials, cancellationToken); } /// /// Authenticate using the specified user name and password. /// /// /// Authenticates using the supplied credentials. ///If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// /// /// /// The user name. /// The password. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public void Authenticate (string userName, string password, CancellationToken cancellationToken = default) { Authenticate (Encoding.UTF8, userName, password, cancellationToken); } /// /// Asynchronously authenticate using the specified user name and password. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including any /// OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the default login command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// An asynchronous task context. /// The user name. /// The password. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public Task AuthenticateAsync (string userName, string password, CancellationToken cancellationToken = default) { return AuthenticateAsync (Encoding.UTF8, userName, password, cancellationToken); } /// /// Authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public abstract void Authenticate (SaslMechanism mechanism, CancellationToken cancellationToken = default); /// /// Asynchronously authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// An asynchronous task context. /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected or is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// public abstract Task AuthenticateAsync (SaslMechanism mechanism, CancellationToken cancellationToken = default); /// /// Disconnect the service. /// /// /// If is , a logout/quit command will be issued in order to disconnect cleanly. /// /// /// /// /// If set to , a logout/quit command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// public abstract void Disconnect (bool quit, CancellationToken cancellationToken = default); /// /// Asynchronously disconnect the service. /// /// /// If is , a logout/quit command will be issued in order to disconnect cleanly. /// /// An asynchronous task context. /// If set to , a logout/quit command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// public abstract Task DisconnectAsync (bool quit, CancellationToken cancellationToken = default); /// /// Ping the mail server to keep the connection alive. /// /// /// Mail servers, if left idle for too long, will automatically drop the connection. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// -or- /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// public abstract void NoOp (CancellationToken cancellationToken = default); /// /// Asynchronously ping the mail server to keep the connection alive. /// /// /// Mail servers, if left idle for too long, will automatically drop the connection. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// -or- /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command was rejected by the mail server. /// /// /// The server responded with an unexpected token. /// public abstract Task NoOpAsync (CancellationToken cancellationToken = default); /// /// Occurs when the client has been successfully connected. /// /// /// The event is raised when the client /// successfully connects to the mail server. /// public event EventHandler? Connected; /// /// Raise the connected event. /// /// /// Raises the connected event. /// /// The name of the host that the client connected to. /// The port that the client connected to on the remote host. /// The SSL/TLS options that were used when connecting. protected virtual void OnConnected (string host, int port, SecureSocketOptions options) { Connected?.Invoke (this, new ConnectedEventArgs (host, port, options)); } /// /// Occurs when the client gets disconnected. /// /// /// The event is raised whenever the client /// gets disconnected. /// public event EventHandler? Disconnected; /// /// Raise the disconnected event. /// /// /// Raises the disconnected event. /// /// The name of the host that the client was connected to. /// The port that the client was connected to on the remote host. /// The SSL/TLS options that were used by the client. /// if the disconnect was explicitly requested; otherwise, . protected virtual void OnDisconnected (string host, int port, SecureSocketOptions options, bool requested) { Disconnected?.Invoke (this, new DisconnectedEventArgs (host, port, options, requested)); } /// /// Occurs when the client has been successfully authenticated. /// /// /// The event is raised whenever the client /// has been authenticated. /// public event EventHandler? Authenticated; /// /// Raise the authenticated event. /// /// /// Raises the authenticated event. /// /// The notification sent by the server when the client successfully authenticates. protected virtual void OnAuthenticated (string message) { Authenticated?.Invoke (this, new AuthenticatedEventArgs (message)); } /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected virtual void Dispose (bool disposing) { if (disposing) ProtocolLogger.Dispose (); } /// /// Releases all resource used by the object. /// /// Call when you are finished using the . The /// method leaves the in an unusable state. After /// calling , you must release all references to the so /// the garbage collector can reclaim the memory that the was occupying. public void Dispose () { Dispose (true); GC.SuppressFinalize (this); } } } ================================================ FILE: MailKit/MailSpool.cs ================================================ // // MailSpool.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Threading; using System.Collections; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// An abstract mail spool implementation. /// /// /// An abstract mail spool implementation. /// public abstract class MailSpool : MailService, IMailSpool { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The protocol logger. /// /// is . /// protected MailSpool (IProtocolLogger protocolLogger) : base (protocolLogger) { } /// /// Get the number of messages available in the message spool. /// /// /// Gets the number of messages available in the message spool. /// Once authenticated, the property will be set /// to the number of available messages in the spool. /// /// /// /// /// The message count. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// public abstract int Count { get; } /// /// Get whether or not the service supports referencing messages by UIDs. /// /// /// Not all servers support referencing messages by UID, so this property should /// be checked before using /// and . /// If the server does not support UIDs, then all methods that take UID arguments /// along with and /// will fail. /// /// if supports uids; otherwise, . /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// public abstract bool SupportsUids { get; } /// /// Get the message count. /// /// /// Gets the message count. /// /// The message count. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract int GetMessageCount (CancellationToken cancellationToken = default); /// /// Asynchronously get the message count. /// /// /// Asynchronously gets the message count. /// /// The message count. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task GetMessageCountAsync (CancellationToken cancellationToken = default); /// /// Get the UID of the message at the specified index. /// /// /// Not all servers support UIDs, so you should first check /// the property. /// /// The message UID. /// The message index. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail spool does not support UIDs. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract string GetMessageUid (int index, CancellationToken cancellationToken = default); /// /// Asynchronously get the UID of the message at the specified index. /// /// /// Not all servers support UIDs, so you should first check /// the property. /// /// The message UID. /// The message index. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail spool does not support UIDs. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task GetMessageUidAsync (int index, CancellationToken cancellationToken = default); /// /// Get the full list of available message UIDs. /// /// /// Not all servers support UIDs, so you should first check /// the property. /// /// /// /// /// The message uids. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail spool does not support UIDs. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract IList GetMessageUids (CancellationToken cancellationToken = default); /// /// Get the full list of available message UIDs. /// /// /// Not all servers support UIDs, so you should first check /// the property. /// /// The message uids. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The mail spool does not support UIDs. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task> GetMessageUidsAsync (CancellationToken cancellationToken = default); /// /// Get the size of the specified message, in bytes. /// /// /// Gets the size of the specified message, in bytes. /// /// The message size, in bytes. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract int GetMessageSize (int index, CancellationToken cancellationToken = default); /// /// Asynchronously get the size of the specified message, in bytes. /// /// /// Asynchronously gets the size of the specified message, in bytes. /// /// The message size, in bytes. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task GetMessageSizeAsync (int index, CancellationToken cancellationToken = default); /// /// Get the sizes for all available messages, in bytes. /// /// /// Gets the sizes for all available messages, in bytes. /// /// The message sizes, in bytes. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract IList GetMessageSizes (CancellationToken cancellationToken = default); /// /// Asynchronously get the sizes for all available messages, in bytes. /// /// /// Asynchronously gets the sizes for all available messages, in bytes. /// /// The message sizes, in bytes. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task> GetMessageSizesAsync (CancellationToken cancellationToken = default); /// /// Get the headers for the specified message. /// /// /// Gets the headers for the specified message. /// /// The message headers. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract HeaderList GetMessageHeaders (int index, CancellationToken cancellationToken = default); /// /// Asynchronously get the headers for the specified message. /// /// /// Asynchronously gets the headers for the specified message. /// /// The message headers. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task GetMessageHeadersAsync (int index, CancellationToken cancellationToken = default); /// /// Get the headers for the specified messages. /// /// /// Gets the headers for the specified messages. /// /// The headers for the specified messages. /// The indexes of the messages. /// The cancellation token. /// /// is . /// /// /// One or more of the are invalid. /// -or- /// No indexes were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract IList GetMessageHeaders (IList indexes, CancellationToken cancellationToken = default); /// /// Asynchronously get the headers for the specified messages. /// /// /// Asynchronously gets the headers for the specified messages. /// /// The headers for the specified messages. /// The indexes of the messages. /// The cancellation token. /// /// is . /// /// /// One or more of the are invalid. /// -or- /// No indexes were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task> GetMessageHeadersAsync (IList indexes, CancellationToken cancellationToken = default); /// /// Get the headers of the messages within the specified range. /// /// /// Gets the headers of the messages within the specified range. /// /// The headers of the messages within the specified range. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract IList GetMessageHeaders (int startIndex, int count, CancellationToken cancellationToken = default); /// /// Get the headers of the messages within the specified range. /// /// /// Gets the headers of the messages within the specified range. /// /// The headers of the messages within the specified range. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task> GetMessageHeadersAsync (int startIndex, int count, CancellationToken cancellationToken = default); /// /// Get the message at the specified index. /// /// /// Gets the message at the specified index. /// /// /// /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract MimeMessage GetMessage (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the message at the specified index. /// /// /// Asynchronously gets the message at the specified index. /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task GetMessageAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the messages at the specified indexes. /// /// /// Get the messages at the specified indexes. /// /// The messages. /// The indexes of the messages. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// One or more of the are invalid. /// -or- /// No indexes were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract IList GetMessages (IList indexes, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the messages at the specified indexes. /// /// /// Asynchronously get the messages at the specified indexes. /// /// The messages. /// The indexes of the messages. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// One or more of the are invalid. /// -or- /// No indexes were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task> GetMessagesAsync (IList indexes, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the messages within the specified range. /// /// /// Gets the messages within the specified range. /// /// /// /// /// The messages. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// The progress reporting mechanism. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract IList GetMessages (int startIndex, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the messages within the specified range. /// /// /// Asynchronously gets the messages within the specified range. /// /// The messages. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// The progress reporting mechanism. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task> GetMessagesAsync (int startIndex, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the message or header stream at the specified index. /// /// /// Gets the message or header stream at the specified index. /// /// The message or header stream. /// The index of the message. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Stream GetStream (int index, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the message or header stream at the specified index. /// /// /// Asynchronously gets the message or header stream at the specified index. /// /// The message or header stream. /// The index of the message. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task GetStreamAsync (int index, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the message or header streams at the specified indexes. /// /// /// Get the message or header streams at the specified indexes. /// If the mail server supports pipelining, this method will likely be more /// efficient than using for /// each message because it will batch the commands to reduce latency. /// /// The message or header streams. /// The indexes of the messages. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// One or more of the are invalid. /// -or- /// No indexes were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract IList GetStreams (IList indexes, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the message or header streams at the specified indexes. /// /// /// Asynchronously get the message or header streams at the specified indexes. /// /// The messages. /// The indexes of the messages. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// One or more of the are invalid. /// -or- /// No indexes were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task> GetStreamsAsync (IList indexes, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the message or header streams within the specified range. /// /// /// Gets the message or header streams within the specified range. /// If the mail server supports pipelining, this method will likely be more /// efficient than using for /// each message because it will batch the commands to reduce latency. /// /// The message or header streams. /// The index of the first stream to get. /// The number of streams to get. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract IList GetStreams (int startIndex, int count, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the message or header streams within the specified range. /// /// /// Asynchronously gets the message or header streams within the specified range. /// /// The messages. /// The index of the first stream to get. /// The number of streams to get. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task> GetStreamsAsync (int startIndex, int count, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Mark the specified message for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// /// /// /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract void DeleteMessage (int index, CancellationToken cancellationToken = default); /// /// Asynchronously mark the specified message for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task DeleteMessageAsync (int index, CancellationToken cancellationToken = default); /// /// Mark the specified messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The indexes of the messages. /// The cancellation token. /// /// is . /// /// /// One or more of the are invalid. /// -or- /// No indexes were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract void DeleteMessages (IList indexes, CancellationToken cancellationToken = default); /// /// Asynchronously mark the specified messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The indexes of the messages. /// The cancellation token. /// /// is . /// /// /// One or more of the are invalid. /// -or- /// No indexes were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task DeleteMessagesAsync (IList indexes, CancellationToken cancellationToken = default); /// /// Mark the specified range of messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// /// /// /// The index of the first message to mark for deletion. /// The number of messages to mark for deletion. /// The cancellation token. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract void DeleteMessages (int startIndex, int count, CancellationToken cancellationToken = default); /// /// Asynchronously mark the specified range of messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The index of the first message to mark for deletion. /// The number of messages to mark for deletion. /// The cancellation token. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task DeleteMessagesAsync (int startIndex, int count, CancellationToken cancellationToken = default); /// /// Mark all messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract void DeleteAllMessages (CancellationToken cancellationToken = default); /// /// Asynchronously mark all messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task DeleteAllMessagesAsync (CancellationToken cancellationToken = default); /// /// Reset the state of all messages marked for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract void Reset (CancellationToken cancellationToken = default); /// /// Asynchronously reset the state of all messages marked for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The command failed. /// /// /// A protocol error occurred. /// public abstract Task ResetAsync (CancellationToken cancellationToken = default); /// /// Get an enumerator for the messages in the folder. /// /// /// Gets an enumerator for the messages in the folder. /// /// The enumerator. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A command failed. /// /// /// A protocol error occurred. /// public abstract IEnumerator GetEnumerator (); /// /// Get an enumerator for the messages in the folder. /// /// /// Gets an enumerator for the messages in the folder. /// /// The enumerator. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A command failed. /// /// /// A protocol error occurred. /// IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } } } ================================================ FILE: MailKit/MailStore.cs ================================================ // // MailStore.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; namespace MailKit { /// /// An abstract mail store implementation. /// /// /// An abstract mail store implementation. /// public abstract class MailStore : MailService, IMailStore { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The protocol logger. /// /// is . /// protected MailStore (IProtocolLogger protocolLogger) : base (protocolLogger) { } /// /// Gets the personal namespaces. /// /// /// The personal folder namespaces contain a user's personal mailbox folders. /// /// The personal namespaces. public abstract FolderNamespaceCollection PersonalNamespaces { get; } /// /// Gets the shared namespaces. /// /// /// The shared folder namespaces contain mailbox folders that are shared with the user. /// /// The shared namespaces. public abstract FolderNamespaceCollection SharedNamespaces { get; } /// /// Gets the other namespaces. /// /// /// The other folder namespaces contain other mailbox folders. /// /// The other namespaces. public abstract FolderNamespaceCollection OtherNamespaces { get; } /// /// Get whether or not the mail store supports quotas. /// /// /// Gets whether or not the mail store supports quotas. /// /// if the mail store supports quotas; otherwise, . public abstract bool SupportsQuotas { get; } /// /// Get the threading algorithms supported by the mail store. /// /// /// The threading algorithms are queried as part of the /// Connect /// and Authenticate methods. /// /// /// /// /// The supported threading algorithms. public abstract HashSet ThreadingAlgorithms { get; } /// /// Get the Inbox folder. /// /// /// The Inbox folder is the default folder and always exists on the mail store. /// This property will only be available after the client has been authenticated. /// /// The Inbox folder. public abstract IMailFolder? Inbox { get; } /// /// Enable the quick resynchronization feature. /// /// /// Enables quick resynchronization when a folder is opened using the /// /// method. /// If this feature is enabled, the event is replaced /// with the event. /// This method needs to be called immediately after calling one of the /// Authenticate methods, before /// opening any folders. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Quick resynchronization needs to be enabled before selecting a folder. /// /// /// The mail store does not support quick resynchronization. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// public abstract void EnableQuickResync (CancellationToken cancellationToken = default); /// /// Asynchronously enable the quick resynchronization feature. /// /// /// Enables quick resynchronization when a folder is opened using the /// /// method. /// If this feature is enabled, the event is replaced /// with the event. /// This method needs to be called immediately after calling one of the /// Authenticate methods, before /// opening any folders. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Quick resynchronization needs to be enabled before selecting a folder. /// /// /// The mail store does not support quick resynchronization. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// public abstract Task EnableQuickResyncAsync (CancellationToken cancellationToken = default); /// /// Get the specified special folder. /// /// /// Not all mail stores support special folders. Each implementation /// should provide a way to determine if special folders are supported. /// /// The folder if available; otherwise . /// The type of special folder. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// public abstract IMailFolder? GetFolder (SpecialFolder folder); /// /// Get the folder for the specified namespace. /// /// /// Gets the folder for the specified namespace. /// /// The folder. /// The namespace. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder could not be found. /// public abstract IMailFolder GetFolder (FolderNamespace @namespace); /// /// Get all of the folders within the specified namespace. /// /// /// Gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// public virtual IList GetFolders (FolderNamespace @namespace, bool subscribedOnly, CancellationToken cancellationToken = default) { return GetFolders (@namespace, StatusItems.None, subscribedOnly, cancellationToken); } /// /// Asynchronously get all of the folders within the specified namespace. /// /// /// Asynchronously gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// public virtual Task> GetFoldersAsync (FolderNamespace @namespace, bool subscribedOnly, CancellationToken cancellationToken = default) { return GetFoldersAsync (@namespace, StatusItems.None, subscribedOnly, cancellationToken); } /// /// Get all of the folders within the specified namespace. /// /// /// Gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// public abstract IList GetFolders (FolderNamespace @namespace, StatusItems items = StatusItems.None, bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Asynchronously get all of the folders within the specified namespace. /// /// /// Asynchronously gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// public abstract Task> GetFoldersAsync (FolderNamespace @namespace, StatusItems items = StatusItems.None, bool subscribedOnly = false, CancellationToken cancellationToken = default); /// /// Get the folder for the specified path. /// /// /// Gets the folder for the specified path. /// /// The folder. /// The folder path. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The folder could not be found. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// public abstract IMailFolder GetFolder (string path, CancellationToken cancellationToken = default); /// /// Asynchronously get the folder for the specified path. /// /// /// Asynchronously gets the folder for the specified path. /// /// The folder. /// The folder path. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The folder could not be found. /// /// /// An I/O error occurred. /// /// /// A protocol error occurred. /// /// /// The command failed. /// public abstract Task GetFolderAsync (string path, CancellationToken cancellationToken = default); /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract string? GetMetadata (MetadataTag tag, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetMetadataAsync (MetadataTag tag, CancellationToken cancellationToken = default); /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata tags. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual MetadataCollection GetMetadata (IEnumerable tags, CancellationToken cancellationToken = default) { return GetMetadata (new MetadataOptions (), tags, cancellationToken); } /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata. /// The metadata tags. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public virtual Task GetMetadataAsync (IEnumerable tags, CancellationToken cancellationToken = default) { return GetMetadataAsync (new MetadataOptions (), tags, cancellationToken); } /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract MetadataCollection GetMetadata (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default); /// /// Asynchronously gets the specified metadata. /// /// /// Asynchronously gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task GetMetadataAsync (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default); /// /// Sets the specified metadata. /// /// /// Sets the specified metadata. /// /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract void SetMetadata (MetadataCollection metadata, CancellationToken cancellationToken = default); /// /// Asynchronously sets the specified metadata. /// /// /// Asynchronously sets the specified metadata. /// /// An asynchronous task context. /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder does not support metadata. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public abstract Task SetMetadataAsync (MetadataCollection metadata, CancellationToken cancellationToken = default); /// /// Occurs when a remote message store receives an alert message from the server. /// /// /// The event is raised whenever the mail server sends an /// alert message. /// public event EventHandler? Alert; /// /// Raise the alert event. /// /// /// Raises the alert event. /// /// The alert message. /// /// is . /// protected virtual void OnAlert (string message) { Alert?.Invoke (this, new AlertEventArgs (message)); } /// /// Occurs when a folder is created. /// /// /// The event is emitted when a new folder is created. /// public event EventHandler? FolderCreated; /// /// Raise the folder created event. /// /// /// Raises the folder created event. /// /// The folder that was just created. protected virtual void OnFolderCreated (IMailFolder folder) { FolderCreated?.Invoke (this, new FolderCreatedEventArgs (folder)); } /// /// Occurs when metadata changes. /// /// /// The event is emitted when metadata changes. /// public event EventHandler? MetadataChanged; /// /// Raise the metadata changed event. /// /// /// Raises the metadata changed event. /// /// The metadata that changed. protected virtual void OnMetadataChanged (Metadata metadata) { MetadataChanged?.Invoke (this, new MetadataChangedEventArgs (metadata)); } } } ================================================ FILE: MailKit/MailTransport.cs ================================================ // // MailTransport.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// An abstract mail transport implementation. /// /// /// An abstract mail transport implementation. /// public abstract class MailTransport : MailService, IMailTransport { static readonly FormatOptions DefaultOptions; static MailTransport () { var options = FormatOptions.Default.Clone (); options.HiddenHeaders.Add (HeaderId.ContentLength); options.HiddenHeaders.Add (HeaderId.ResentBcc); options.HiddenHeaders.Add (HeaderId.Bcc); options.NewLineFormat = NewLineFormat.Dos; DefaultOptions = options; } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The protocol logger. /// /// is . /// protected MailTransport (IProtocolLogger protocolLogger) : base (protocolLogger) { } /// /// Send the specified message. /// /// /// Sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// /// /// /// The final free-form text response from the server. /// The message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The send command failed. /// /// /// A protocol exception occurred. /// public virtual string Send (MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Send (DefaultOptions, message, cancellationToken, progress); } /// /// Asynchronously send the specified message. /// /// /// Asynchronously sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// The final free-form text response from the server. /// The message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The send command failed. /// /// /// A protocol exception occurred. /// public virtual Task SendAsync (MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return SendAsync (DefaultOptions, message, cancellationToken, progress); } /// /// Send the specified message using the supplied sender and recipients. /// /// /// Sends the specified message using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The send command failed. /// /// /// A protocol exception occurred. /// public virtual string Send (MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return Send (DefaultOptions, message, sender, recipients, cancellationToken, progress); } /// /// Asynchronously send the specified message using the supplied sender and recipients. /// /// /// Asynchronously sends the specified message using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The send command failed. /// /// /// A protocol exception occurred. /// public virtual Task SendAsync (MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { return SendAsync (DefaultOptions, message, sender, recipients, cancellationToken, progress); } /// /// Send the specified message. /// /// /// Sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// /// /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// The operation has been canceled. /// /// /// Internationalized formatting was requested but is not supported by the transport. /// /// /// An I/O error occurred. /// /// /// The send command failed. /// /// /// A protocol exception occurred. /// public abstract string Send (FormatOptions options, MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously send the specified message. /// /// /// Asynchronously sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// The operation has been canceled. /// /// /// Internationalized formatting was requested but is not supported by the transport. /// /// /// An I/O error occurred. /// /// /// The send command failed. /// /// /// A protocol exception occurred. /// public abstract Task SendAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Send the specified message using the supplied sender and recipients. /// /// /// Sends the specified message using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// The operation has been canceled. /// /// /// Internationalized formatting was requested but is not supported by the transport. /// /// /// An I/O error occurred. /// /// /// The send command failed. /// /// /// A protocol exception occurred. /// public abstract string Send (FormatOptions options, MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously send the specified message using the supplied sender and recipients. /// /// /// Asynchronously sends the specified message using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// The operation has been canceled. /// /// /// Internationalized formatting was requested but is not supported by the transport. /// /// /// An I/O error occurred. /// /// /// The send command failed. /// /// /// A protocol exception occurred. /// public abstract Task SendAsync (FormatOptions options, MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Occurs when a message is successfully sent via the transport. /// /// /// The event will be emitted each time a message is successfully sent. /// public event EventHandler? MessageSent; /// /// Raise the message sent event. /// /// /// Raises the message sent event. /// /// The message sent event args. protected virtual void OnMessageSent (MessageSentEventArgs e) { MessageSent?.Invoke (this, e); } } } ================================================ FILE: MailKit/MessageEventArgs.cs ================================================ // // MessageEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Event args used when the state of a message changes. /// /// /// Event args used when the state of a message changes. /// public class MessageEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// /// is out of range. /// public MessageEventArgs (int index) { if (index < 0) throw new ArgumentOutOfRangeException (nameof (index)); Index = index; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The unique id of the message. /// /// is out of range. /// public MessageEventArgs (int index, UniqueId uid) { if (index < 0) throw new ArgumentOutOfRangeException (nameof (index)); Index = index; UniqueId = uid; } /// /// Gets the index of the message that changed. /// /// /// Gets the index of the message that changed. /// /// The index of the message. public int Index { get; private set; } /// /// Gets the unique ID of the message that changed, if available. /// /// /// Gets the unique ID of the message that changed, if available. /// /// The unique ID of the message. public UniqueId? UniqueId { get; internal set; } } } ================================================ FILE: MailKit/MessageFlags.cs ================================================ // // MessageFlags.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// An enumeration of message flags. /// /// /// An enumeration of message flags. /// [Flags] public enum MessageFlags { /// /// No message flags are set. /// None = 0, /// /// The message has been read. /// Seen = 1 << 0, /// /// The message has been answered (replied to). /// Answered = 1 << 1, /// /// The message has been flagged for importance. /// Flagged = 1 << 2, /// /// The message has been marked for deletion. /// Deleted = 1 << 3, /// /// The message is marked as a draft. /// Draft = 1 << 4, /// /// The message has just recently arrived in the folder. /// Recent = 1 << 5, /// /// User-defined flags are allowed by the folder. /// UserDefined = 1 << 6, } } ================================================ FILE: MailKit/MessageFlagsChangedEventArgs.cs ================================================ // // MessageFlagsChangedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; #if NET5_0_OR_GREATER using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet; #else using IReadOnlySetOfStrings = System.Collections.Generic.ISet; #endif namespace MailKit { /// /// Event args for the event. /// /// /// Event args for the event. /// public class MessageFlagsChangedEventArgs : MessageEventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. internal MessageFlagsChangedEventArgs (int index) : base (index) { Keywords = new HashSet (StringComparer.Ordinal); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The message flags. public MessageFlagsChangedEventArgs (int index, MessageFlags flags) : base (index) { Keywords = new HashSet (StringComparer.Ordinal); Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The message flags. /// The user-defined keywords. /// /// is . /// /// /// is out of range. /// public MessageFlagsChangedEventArgs (int index, MessageFlags flags, IReadOnlySetOfStrings keywords) : base (index) { if (keywords == null) throw new ArgumentNullException (nameof (keywords)); Keywords = keywords; Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The message flags. /// The modification sequence value. /// /// is out of range. /// public MessageFlagsChangedEventArgs (int index, MessageFlags flags, ulong modseq) : base (index) { Keywords = new HashSet (StringComparer.Ordinal); ModSeq = modseq; Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The message flags. /// The user-defined keywords. /// The modification sequence value. /// /// is . /// /// /// is out of range. /// public MessageFlagsChangedEventArgs (int index, MessageFlags flags, IReadOnlySetOfStrings keywords, ulong modseq) : base (index) { if (keywords == null) throw new ArgumentNullException (nameof (keywords)); Keywords = keywords; ModSeq = modseq; Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The unique id of the message. /// The message flags. /// /// is out of range. /// public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags) : base (index, uid) { Keywords = new HashSet (StringComparer.Ordinal); Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The unique id of the message. /// The message flags. /// The user-defined keywords. /// /// is . /// /// /// is out of range. /// public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags, IReadOnlySetOfStrings keywords) : base (index, uid) { if (keywords == null) throw new ArgumentNullException (nameof (keywords)); Keywords = keywords; Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The unique id of the message. /// The message flags. /// The modification sequence value. /// /// is out of range. /// public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags, ulong modseq) : base (index, uid) { Keywords = new HashSet (StringComparer.Ordinal); ModSeq = modseq; Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The unique id of the message. /// The message flags. /// The user-defined message flags. /// The modification sequence value. /// /// is . /// /// /// is out of range. /// public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags, IReadOnlySetOfStrings keywords, ulong modseq) : base (index, uid) { if (keywords == null) throw new ArgumentNullException (nameof (keywords)); Keywords = keywords; ModSeq = modseq; Flags = flags; } /// /// Gets the updated message flags. /// /// /// Gets the updated message flags. /// /// The updated message flags. public MessageFlags Flags { get; internal set; } /// /// Gets the updated user-defined message flags. /// /// /// Gets the updated user-defined message flags. /// /// The updated user-defined message flags. public IReadOnlySetOfStrings Keywords { get; private set; } /// /// Gets the updated mod-sequence value of the message, if available. /// /// /// Gets the updated mod-sequence value of the message, if available. /// /// The mod-sequence value. public ulong? ModSeq { get; internal set; } } } ================================================ FILE: MailKit/MessageLabelsChangedEventArgs.cs ================================================ // // LabelsChangedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using System.Collections.ObjectModel; namespace MailKit { /// /// Event args for the event. /// /// /// Event args for the event. /// public class MessageLabelsChangedEventArgs : MessageEventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The message labels. /// /// is . /// /// /// is out of range. /// public MessageLabelsChangedEventArgs (int index, IList labels) : base (index) { if (labels == null) throw new ArgumentNullException (nameof (labels)); Labels = new ReadOnlyCollection (labels); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The message labels. /// The modification sequence value. /// /// is . /// /// /// is out of range. /// public MessageLabelsChangedEventArgs (int index, IList labels, ulong modseq) : base (index) { if (labels == null) throw new ArgumentNullException (nameof (labels)); Labels = new ReadOnlyCollection (labels); ModSeq = modseq; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The unique id of the message. /// The message labels. /// /// is . /// /// /// is out of range. /// public MessageLabelsChangedEventArgs (int index, UniqueId uid, IList labels) : base (index, uid) { if (labels == null) throw new ArgumentNullException (nameof (labels)); Labels = new ReadOnlyCollection (labels); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The unique id of the message. /// The message labels. /// The modification sequence value. /// /// is . /// /// /// is out of range. /// public MessageLabelsChangedEventArgs (int index, UniqueId uid, IList labels, ulong modseq) : base (index, uid) { if (labels == null) throw new ArgumentNullException (nameof (labels)); Labels = new ReadOnlyCollection (labels); ModSeq = modseq; } /// /// Gets the updated labels. /// /// /// Gets the updated labels. /// /// The updated labels. public IList Labels { get; internal set; } /// /// Gets the updated mod-sequence value of the message, if available. /// /// /// Gets the updated mod-sequence value of the message, if available. /// /// The mod-sequence value. public ulong? ModSeq { get; internal set; } } } ================================================ FILE: MailKit/MessageNotFoundException.cs ================================================ // // MessageNotFoundException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit { /// /// The exception that is thrown when a message (or body part) could not be found. /// /// /// This exception is thrown by methods such as /// IMailFolder.GetMessage, /// IMailFolder.GetBodyPart, or /// IMailFolder.GetStream /// when the server's response does not contain the message, body part, or stream data requested. /// #if SERIALIZABLE [Serializable] #endif public class MessageNotFoundException : Exception { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Deserializes a . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected MessageNotFoundException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// The inner exception. /// /// public MessageNotFoundException (string message, Exception innerException) : base (message, innerException) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public MessageNotFoundException (string message) : base (message) { } } } ================================================ FILE: MailKit/MessageSentEventArgs.cs ================================================ // // MessageSentEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using MimeKit; namespace MailKit { /// /// Event args used when a message is successfully sent. /// /// /// Event args used when message is successfully sent. /// public class MessageSentEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message that was just sent. /// The response from the server. /// /// is . /// -or- /// is . /// public MessageSentEventArgs (MimeMessage message, string response) { if (message == null) throw new ArgumentNullException (nameof (message)); if (response == null) throw new ArgumentNullException (nameof (response)); Message = message; Response = response; } /// /// Get the message that was just sent. /// /// /// Gets the message that was just sent. /// /// The message. public MimeMessage Message { get; private set; } /// /// Get the server's response. /// /// /// Gets the server's response. /// /// The response. public string Response { get; private set; } } } ================================================ FILE: MailKit/MessageSorter.cs ================================================ // // MessageSorter.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using MimeKit; using MailKit.Search; namespace MailKit { /// /// Routines for sorting messages. /// /// /// Routines for sorting messages. /// public static class MessageSorter { class MessageComparer : IComparer where T : IMessageSummary { readonly IList orderBy; public MessageComparer (IList orderBy) { this.orderBy = orderBy; } #region IComparer implementation static int CompareDisplayNames (InternetAddressList list1, InternetAddressList list2) { var m1 = list1.Mailboxes.GetEnumerator (); var m2 = list2.Mailboxes.GetEnumerator (); bool n1 = m1.MoveNext (); bool n2 = m2.MoveNext (); while (n1 && n2) { var name1 = m1.Current.Name ?? string.Empty; var name2 = m2.Current.Name ?? string.Empty; int cmp; if ((cmp = string.Compare (name1, name2, StringComparison.OrdinalIgnoreCase)) != 0) return cmp; n1 = m1.MoveNext (); n2 = m2.MoveNext (); } return n1 ? 1 : (n2 ? -1 : 0); } static int CompareMailboxAddresses (InternetAddressList list1, InternetAddressList list2) { var m1 = list1.Mailboxes.GetEnumerator (); var m2 = list2.Mailboxes.GetEnumerator (); bool n1 = m1.MoveNext (); bool n2 = m2.MoveNext (); while (n1 && n2) { int cmp; if ((cmp = string.Compare (m1.Current.Address, m2.Current.Address, StringComparison.OrdinalIgnoreCase)) != 0) return cmp; n1 = m1.MoveNext (); n2 = m2.MoveNext (); } return n1 ? 1 : (n2 ? -1 : 0); } public int Compare (T? x, T? y) { int cmp = 0; for (int i = 0; i < orderBy.Count; i++) { switch (orderBy[i].Type) { case OrderByType.Annotation: var annotation = (OrderByAnnotation) orderBy[i]; var xannotation = x!.Annotations?.FirstOrDefault (a => a.Entry == annotation.Entry); var yannotation = y!.Annotations?.FirstOrDefault (a => a.Entry == annotation.Entry); var xvalue = xannotation?.Properties[annotation.Attribute] ?? string.Empty; var yvalue = yannotation?.Properties[annotation.Attribute] ?? string.Empty; cmp = string.Compare (xvalue, yvalue, StringComparison.OrdinalIgnoreCase); break; case OrderByType.Arrival: cmp = x!.Index.CompareTo (y!.Index); break; case OrderByType.Cc: cmp = CompareMailboxAddresses (x!.Envelope!.Cc, y!.Envelope!.Cc); break; case OrderByType.Date: cmp = x!.Date.CompareTo (y!.Date); break; case OrderByType.DisplayFrom: cmp = CompareDisplayNames (x!.Envelope!.From, y!.Envelope!.From); break; case OrderByType.From: cmp = CompareMailboxAddresses (x!.Envelope!.From, y!.Envelope!.From); break; case OrderByType.ModSeq: var xmodseq = x!.ModSeq ?? 0; var ymodseq = y!.ModSeq ?? 0; cmp = xmodseq.CompareTo (ymodseq); break; case OrderByType.Size: var xsize = x!.Size ?? 0; var ysize = y!.Size ?? 0; cmp = xsize.CompareTo (ysize); break; case OrderByType.Subject: var xsubject = x!.Envelope!.Subject ?? string.Empty; var ysubject = y!.Envelope!.Subject ?? string.Empty; cmp = string.Compare (xsubject, ysubject, StringComparison.OrdinalIgnoreCase); break; case OrderByType.DisplayTo: cmp = CompareDisplayNames (x!.Envelope!.To, y!.Envelope!.To); break; case OrderByType.To: cmp = CompareMailboxAddresses (x!.Envelope!.To, y!.Envelope!.To); break; } if (cmp == 0) continue; return orderBy[i].Order == SortOrder.Descending ? cmp * -1 : cmp; } return cmp; } #endregion } static MessageSummaryItems GetMessageSummaryItems (IList orderBy) { var items = MessageSummaryItems.None; for (int i = 0; i < orderBy.Count; i++) { switch (orderBy[i].Type) { case OrderByType.Annotation: items |= MessageSummaryItems.Annotations; break; case OrderByType.Arrival: break; case OrderByType.Cc: case OrderByType.Date: case OrderByType.DisplayFrom: case OrderByType.DisplayTo: case OrderByType.From: case OrderByType.Subject: case OrderByType.To: items |= MessageSummaryItems.Envelope; break; case OrderByType.ModSeq: items |= MessageSummaryItems.ModSeq; break; case OrderByType.Size: items |= MessageSummaryItems.Size; break; } } return items; } /// /// Sorts the messages by the specified ordering. /// /// /// Sorts the messages by the specified ordering. /// /// The sorted messages. /// The message items must implement the interface. /// The messages to sort. /// The sort ordering. /// /// is . /// -or- /// is . /// /// /// contains one or more items that is missing information needed for sorting. /// -or- /// is an empty list. /// public static IList Sort (this IEnumerable messages, IList orderBy) where T : IMessageSummary { if (messages == null) throw new ArgumentNullException (nameof (messages)); if (orderBy == null) throw new ArgumentNullException (nameof (orderBy)); if (orderBy.Count == 0) throw new ArgumentException ("No sort order provided.", nameof (orderBy)); var requiredFields = GetMessageSummaryItems (orderBy); var list = new List (); foreach (var message in messages) { if ((message.Fields & requiredFields) != requiredFields) throw new ArgumentException ("One or more messages is missing information needed for sorting.", nameof (messages)); list.Add (message); } if (list.Count < 2) return list; var comparer = new MessageComparer (orderBy); list.Sort (comparer); return list; } /// /// Sorts the messages by the specified ordering. /// /// /// Sorts the messages by the specified ordering. /// /// The sorted messages. /// The message items must implement the interface. /// The messages to sort. /// The sort ordering. /// /// is . /// -or- /// is . /// /// /// contains one or more items that is missing information needed for sorting. /// -or- /// is an empty list. /// public static void Sort (this List messages, IList orderBy) where T : IMessageSummary { if (messages == null) throw new ArgumentNullException (nameof (messages)); if (orderBy == null) throw new ArgumentNullException (nameof (orderBy)); if (orderBy.Count == 0) throw new ArgumentException ("No sort order provided.", nameof (orderBy)); var requiredFields = GetMessageSummaryItems (orderBy); for (int i = 0; i < messages.Count; i++) { if ((messages[i].Fields & requiredFields) != requiredFields) throw new ArgumentException ("One or more messages is missing information needed for sorting.", nameof (messages)); } if (messages.Count < 2) return; var comparer = new MessageComparer (orderBy); messages.Sort (comparer); } } } ================================================ FILE: MailKit/MessageSummary.cs ================================================ // // MessageSummary.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using MimeKit; using MimeKit.Utils; #if NET5_0_OR_GREATER using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet; #else using IReadOnlySetOfStrings = System.Collections.Generic.ISet; #endif namespace MailKit { /// /// A summary of a message. /// /// /// The Fetch and /// FetchAsync methods /// return lists of items. /// The properties of the that will be available /// depend on the passed to the aforementioned method. /// public class MessageSummary : IMessageSummary { IReadOnlySetOfStrings? keywords; int threadableReplyDepth = -1; string? normalizedSubject; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// /// is negative. /// public MessageSummary (int index) { if (index < 0) throw new ArgumentOutOfRangeException (nameof (index)); Index = index; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The folder that the message belongs to. /// The message index. /// /// is . /// /// /// is negative. /// public MessageSummary (IMailFolder folder, int index) : this (index) { if (folder == null) throw new ArgumentNullException (nameof (folder)); Folder = folder; } [MemberNotNull (nameof (normalizedSubject))] void UpdateThreadableSubject () { if (normalizedSubject != null) return; if (Envelope?.Subject != null) { normalizedSubject = MessageThreader.GetThreadableSubject (Envelope.Subject, out threadableReplyDepth); } else { normalizedSubject = string.Empty; threadableReplyDepth = 0; } } /// /// Get the folder that the message belongs to. /// /// /// Gets the folder that the message belongs to, if available. /// /// The folder. public IMailFolder? Folder { get; private set; } /// /// Get a bitmask of fields that have been populated. /// /// /// Gets a bitmask of fields that have been populated. /// /// The fields that have been populated. public MessageSummaryItems Fields { get; internal set; } /// /// Gets the body structure of the message, if available. /// /// /// The body will be one of , /// , , /// or . /// This property will only be set if either the /// flag or the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The body structure of the message. public BodyPart? Body { get; set; } static BodyPart? GetMultipartRelatedRoot (BodyPartMultipart related) { string? start = related.ContentType.Parameters["start"]; string? contentId; if (start == null) return related.BodyParts.Count > 0 ? related.BodyParts[0] : null; if ((contentId = MimeUtils.EnumerateReferences (start).FirstOrDefault ()) == null) contentId = start; var cid = new Uri (string.Format ("cid:{0}", contentId)); for (int i = 0; i < related.BodyParts.Count; i++) { if (related.BodyParts[i] is BodyPartBasic basic && (basic.ContentId == contentId || basic.ContentLocation == cid)) return basic; if (related.BodyParts[i] is BodyPartMultipart multipart && multipart.ContentLocation == cid) return multipart; } return null; } static bool TryGetMultipartAlternativeBody (BodyPartMultipart multipart, bool html, [NotNullWhen (true)] out BodyPartText? body) { // walk the multipart/alternative children backwards from greatest level of faithfulness to the least faithful for (int i = multipart.BodyParts.Count - 1; i >= 0; i--) { BodyPartText? text = null; if (multipart.BodyParts[i] is BodyPartMultipart multi) { if (multi.ContentType.IsMimeType ("multipart", "related")) { text = GetMultipartRelatedRoot (multi) as BodyPartText; } else if (multi.ContentType.IsMimeType ("multipart", "alternative")) { // Note: nested multipart/alternatives make no sense... yet here we are. if (TryGetMultipartAlternativeBody (multi, html, out body)) return true; } } else { text = multipart.BodyParts[i] as BodyPartText; } if (text != null && (html ? text.IsHtml : text.IsPlain)) { body = text; return true; } } body = null; return false; } static bool TryGetMessageBody (BodyPartMultipart multipart, bool html, [NotNullWhen (true)] out BodyPartText? body) { BodyPartMultipart? multi; BodyPartText? text; if (multipart.ContentType.IsMimeType ("multipart", "alternative")) return TryGetMultipartAlternativeBody (multipart, html, out body); if (!multipart.ContentType.IsMimeType ("multipart", "related")) { // Note: This is probably a multipart/mixed... and if not, we can still treat it like it is. for (int i = 0; i < multipart.BodyParts.Count; i++) { multi = multipart.BodyParts[i] as BodyPartMultipart; // descend into nested multiparts, if there are any... if (multi != null) { if (TryGetMessageBody (multi, html, out body)) return true; // The text body should never come after a multipart. break; } text = multipart.BodyParts[i] as BodyPartText; // Look for the first non-attachment text part (realistically, the body text will // precede any attachments, but I'm not sure we can rely on that assumption). if (text != null && !text.IsAttachment) { if (html ? text.IsHtml : text.IsPlain) { body = text; return true; } // Note: the first text/* part in a multipart/mixed is the text body. // If it's not in the format we're looking for, then it doesn't exist. break; } } } else { // Note: If the multipart/related root document is HTML, then this is the droid we are looking for. var root = GetMultipartRelatedRoot (multipart); text = root as BodyPartText; if (text != null) { body = (html ? text.IsHtml : text.IsPlain) ? text : null; return body != null; } // maybe the root is another multipart (like multipart/alternative)? multi = root as BodyPartMultipart; if (multi != null) return TryGetMessageBody (multi, html, out body); } body = null; return false; } /// /// Gets the text body part of the message if it exists. /// /// /// Gets the text/plain body part of the message. /// This property will only be usable if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// /// /// /// The text body if it exists; otherwise, . public BodyPartText? TextBody { get { if (Body is BodyPartMultipart multipart) { if (TryGetMessageBody (multipart, false, out BodyPartText? plain)) return plain; } else { if (Body is BodyPartText text && text.IsPlain) return text; } return null; } } /// /// Gets the html body part of the message if it exists. /// /// /// Gets the text/html body part of the message. /// This property will only be usable if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// /// /// /// The html body if it exists; otherwise, . public BodyPartText? HtmlBody { get { if (Body is BodyPartMultipart multipart) { if (TryGetMessageBody (multipart, true, out BodyPartText? html)) return html; } else { if (Body is BodyPartText text && text.IsHtml) return text; } return null; } } static IEnumerable EnumerateBodyParts (BodyPart? entity, bool attachmentsOnly) { if (entity == null) yield break; if (entity is BodyPartMultipart multipart) { foreach (var subpart in multipart.BodyParts) { foreach (var part in EnumerateBodyParts (subpart, attachmentsOnly)) yield return part; } yield break; } var basic = (BodyPartBasic) entity; if (attachmentsOnly && !basic.IsAttachment) yield break; yield return basic; } /// /// Gets the body parts of the message. /// /// /// Traverses over the , enumerating all of the /// objects. /// This property will only be usable if either the /// flag or the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The body parts. public IEnumerable BodyParts { get { return EnumerateBodyParts (Body, false); } } /// /// Gets the attachments. /// /// /// Traverses over the , enumerating all of the /// objects that have a Content-Disposition /// header set to "attachment". /// This property will only be usable if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// /// /// /// The attachments. public IEnumerable Attachments { get { return EnumerateBodyParts (Body, true); } } /// /// Gets the preview text of the message. /// /// /// The preview text is a short snippet of the beginning of the message /// text, typically shown in a mail client's message list to provide the user /// with a sense of what the message is about. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The preview text. public string? PreviewText { get; set; } /// /// Gets the envelope of the message, if available. /// /// /// The envelope of a message contains information such as the /// date the message was sent, the subject of the message, /// the sender of the message, who the message was sent to, /// which message(s) the message may be in reply to, /// and the message id. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The envelope of the message. public Envelope? Envelope { get; set; } /// /// Gets the normalized subject. /// /// /// A normalized Subject header value where prefixes such as /// "Re:", "Re[#]:", etc have been pruned. /// /// The normalized subject. public string NormalizedSubject { get { UpdateThreadableSubject (); return normalizedSubject; } } /// /// Gets whether or not the message is a reply. /// /// /// This value should be based on whether the message subject contained any "Re:" or "Fwd:" prefixes. /// /// if the message is a reply; otherwise, . public bool IsReply { get { UpdateThreadableSubject (); return threadableReplyDepth != 0; } } /// /// Gets the Date header value. /// /// /// Gets the Date header value. If the Date header is not present, the arrival date is used. /// If neither are known, is returned. /// /// The date. public DateTimeOffset Date { get { return Envelope?.Date ?? InternalDate ?? DateTimeOffset.MinValue; } } /// /// Gets the message flags, if available. /// /// /// Gets the message flags, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The message flags. public MessageFlags? Flags { get; set; } /// /// Gets the user-defined message flags, if available. /// /// /// Gets the user-defined message flags, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The user-defined message flags. public IReadOnlySetOfStrings Keywords { get { keywords ??= new HashSet (StringComparer.Ordinal); return keywords; } set { keywords = value; } } /// /// Gets the message annotations, if available. /// /// /// Gets the message annotations, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The message annotations. public IReadOnlyList? Annotations { get; set; } /// /// Gets the list of headers, if available. /// /// /// Gets the list of headers, if available. /// This property will only be set if the used with /// Fetch or /// FetchAsync has the /// flag set on or if the list is non-empty. /// /// /// The list of headers. public HeaderList? Headers { get; set; } /// /// Gets the internal date of the message (i.e. the "received" date), if available. /// /// /// Gets the internal date of the message (i.e. the "received" date), if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The internal date of the message. public DateTimeOffset? InternalDate { get; set; } /// /// Gets the date and time that the message was saved to the current mailbox, if available. /// /// /// Gets the date and time that the message was saved to the current mailbox, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The save date of the message. public DateTimeOffset? SaveDate { get; set; } /// /// Gets the size of the message, in bytes, if available. /// /// /// Gets the size of the message, in bytes, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The size of the message. public uint? Size { get; set; } /// /// Gets the mod-sequence value for the message, if available. /// /// /// Gets the mod-sequence value for the message, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The mod-sequence value. public ulong? ModSeq { get; set; } /// /// Gets the message-ids that the message references, if available. /// /// /// Gets the message-ids that the message references, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The references. public MessageIdList? References { get; set; } /// /// Get the globally unique identifier for the message, if available. /// /// /// Gets the globally unique identifier of the message, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// This property maps to the EMAILID value defined in the /// OBJECTID extension. /// /// The globally unique message identifier. public string? EmailId { get; set; } /// /// Get the globally unique thread identifier for the message, if available. /// /// /// Gets the globally unique thread identifier for the message, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// This property maps to the THREADID value defined in the /// OBJECTID extension. /// /// The globally unique thread identifier. public string? ThreadId { get; set; } /// /// Gets the unique identifier of the message, if available. /// /// /// Gets the unique identifier of the message, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The uid of the message. public UniqueId UniqueId { get; set; } /// /// Gets the index of the message. /// /// /// Gets the index of the message. /// This property is always set. /// /// The index of the message. public int Index { get; internal set; } #region GMail extension properties /// /// Gets the GMail message identifier, if available. /// /// /// Gets the GMail message identifier, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The GMail message identifier. public ulong? GMailMessageId { get; set; } /// /// Gets the GMail thread identifier, if available. /// /// /// Gets the GMail thread identifier, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The GMail thread identifier. public ulong? GMailThreadId { get; set; } /// /// Gets the list of GMail labels, if available. /// /// /// Gets the list of GMail labels, if available. /// This property will only be set if the /// flag is passed to /// one of the Fetch /// or FetchAsync /// methods. /// /// The GMail labels. public IList? GMailLabels { get; set; } #endregion } } ================================================ FILE: MailKit/MessageSummaryFetchedEventArgs.cs ================================================ // // MessageSummaryFetchedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Event args used when a message summary has been fetched from a folder. /// /// /// Event args used when a message summary has been fetched from a folder. /// public class MessageSummaryFetchedEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new /// /// The message summary. /// /// is . /// public MessageSummaryFetchedEventArgs (IMessageSummary message) { if (message == null) throw new ArgumentNullException (nameof (message)); Message = message; } /// /// Get the message summary. /// /// /// Gets the message summary. /// /// The message summary. public IMessageSummary Message { get; private set; } } } ================================================ FILE: MailKit/MessageSummaryItems.cs ================================================ // // MessageSummaryItems.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// A bitfield of fields. /// /// /// are used to specify which properties /// of should be populated by calls to /// , /// , or /// . /// [Flags] public enum MessageSummaryItems { /// /// Don't fetch any summary items. /// None = 0, /// /// Fetch the . /// Fetches all ANNOTATION values as defined in /// rfc5257. /// Annotations = 1 << 0, /// /// Fetch the . /// Fetches the BODY value as defined in /// rfc3501. /// Unlike , Body will not populate the /// parameters nor will it populate the /// , /// or properties of each /// body part. This makes Body far less useful than BodyStructure especially when /// it is desirable to determine whether or not a body part is an attachment. /// Body = 1 << 1, /// /// Fetch the (but with more details than ). /// Fetches the BODYSTRUCTURE value as defined in /// rfc3501. /// Unlike , BodyStructure will also populate the /// parameters as well as the /// , /// and properties of each /// body part. The Content-Disposition information is especially important when trying to /// determine whether or not a body part is an attachment, for example. /// BodyStructure = 1 << 2, /// /// Fetch the . /// Fetches the ENVELOPE value as defined in /// rfc3501. /// Envelope = 1 << 3, /// /// Fetch the . /// Fetches the FLAGS value as defined in /// rfc3501. /// Flags = 1 << 4, /// /// Fetch the . /// Fetches the INTERNALDATE value as defined in /// rfc3501. /// InternalDate = 1 << 5, /// /// Fetch the . /// Fetches the RFC822.SIZE value as defined in /// rfc3501. /// Size = 1 << 6, /// /// Fetch the . /// Fetches the MODSEQ value as defined in /// rfc4551. /// ModSeq = 1 << 7, /// /// Fetch the . /// References = 1 << 8, /// /// Fetch the . /// Fetches the UID value as defined in /// rfc3501. /// UniqueId = 1 << 9, /// /// Fetch the . /// Fetches the EMAILID value as defined in /// rfc8474. /// EmailId = 1 << 10, /// /// Fetch the . /// Fetches the THREADID value as defined in /// rfc8474. /// ThreadId = 1 << 11, #region GMail extension items /// /// Fetch the . /// Fetches the X-GM-MSGID value as defined in Google's /// IMAP extensions /// documentation. /// GMailMessageId = 1 << 12, /// /// Fetch the . /// Fetches the X-GM-THRID value as defined in Google's /// IMAP extensions /// documentation. /// GMailThreadId = 1 << 13, /// /// Fetch the . /// Fetches the X-GM-LABELS value as defined in Google's /// IMAP extensions /// documentation. /// GMailLabels = 1 << 14, #endregion /// /// Fetch the the complete list of for each message. /// Headers = 1 << 15, /// /// Fetch the . /// This property can be quite expensive to calculate because it is typically not an /// item that is cached on the IMAP server. Instead, MailKit must download a hunk of the /// message body so that it can decode and parse it in order to generate a meaningful /// text snippet. This usually involves downloading the first 512 bytes for text/plain /// message bodies and the first 16 kilobytes for text/html message bodies. If a /// message contains both a text/plain body and a text/html body, then the /// text/plain content is used in order to reduce network traffic. /// PreviewText = 1 << 16, /// /// Fetch the . /// Fetches the SAVEDATE value as defined in /// rfc8514. /// SaveDate = 1 << 17, #region Macros /// /// A macro for fetching the , , /// , and values. /// This macro maps to the equivalent ALL macro as defined in /// rfc3501. /// All = Envelope | Flags | InternalDate | Size, /// /// A macro for fetching the , , and /// values. /// This macro maps to the equivalent FAST macro as defined in /// rfc3501. /// Fast = Flags | InternalDate | Size, /// /// A macro for fetching the , , /// , , and values. /// This macro maps to the equivalent FULL macro as defined in /// rfc3501. /// Full = Body | Envelope | Flags| InternalDate | Size, #endregion } } ================================================ FILE: MailKit/MessageThread.cs ================================================ // // MessageThread.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections.Generic; namespace MailKit { /// /// A message thread. /// /// /// A message thread. /// public class MessageThread { /// /// Initializes a new instance of the class. /// /// /// Creates a new message thread node. /// /// The unique identifier of the message. public MessageThread (UniqueId? uid) { Children = new List (); UniqueId = uid; } /// /// Initializes a new instance of the class. /// /// /// Creates a new message thread node. /// /// The message summary. public MessageThread (IMessageSummary? message) { Children = new List (); if (message != null && message.UniqueId.IsValid) UniqueId = message.UniqueId; Message = message; } /// /// Gets the message summary, if available. /// /// /// Gets the message summary, if available. /// This property will only ever be set if the /// was created by the . s that are /// created by any of the /// Thread or /// ThreadAsync /// methods will always be . /// /// The message summary. public IMessageSummary? Message { get; private set; } /// /// Gets the unique identifier of the message. /// /// /// The unique identifier may be if the message is missing from the /// or from the list of messages provided to the /// . /// /// The unique identifier. public UniqueId? UniqueId { // FIXME: this shouldn't be a nullable since we can just use UniqueId.Invalid get; private set; } /// /// Gets the children. /// /// /// Each child represents a reply to the message referenced by . /// /// The children. public IList Children { get; private set; } } } ================================================ FILE: MailKit/MessageThreader.cs ================================================ // // MessageThreader.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using MimeKit; using MimeKit.Utils; using MailKit.Search; #if NET5_0_OR_GREATER using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet; #else using IReadOnlySetOfStrings = System.Collections.Generic.ISet; #endif namespace MailKit { /// /// Threads messages according to the algorithms defined in rfc5256. /// /// /// Threads messages according to the algorithms defined in rfc5256. /// public static class MessageThreader { internal class ThreadableNode : IMessageSummary { public readonly List Children = new List (); public IMessageSummary? Message; public ThreadableNode? Parent; public ThreadableNode (IMessageSummary? message) { Message = message; } [MemberNotNullWhen (true, nameof (Parent))] public bool HasParent { get { return Parent != null; } } public bool HasChildren { get { return Children.Count > 0; } } public IMailFolder? Folder => null; public MessageSummaryItems Fields { get { return MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.ModSeq | MessageSummaryItems.Size; } } public BodyPart? Body => null; public BodyPartText? TextBody => null; public BodyPartText? HtmlBody => null; public IEnumerable BodyParts => Array.Empty (); public IEnumerable Attachments => Array.Empty (); public string? PreviewText => null; public Envelope? Envelope { get { return Message != null ? Message.Envelope : Children[0].Envelope; } } public string NormalizedSubject { get { return Message != null ? Message.NormalizedSubject : Children[0].NormalizedSubject; } } public DateTimeOffset Date { get { return Message != null ? Message.Date : Children[0].Date; } } public bool IsReply { get { return Message != null && Message.IsReply; } } public MessageFlags? Flags => null; public IReadOnlySetOfStrings Keywords { get { return new HashSet (); } } public IReadOnlyList? Annotations { get { return Message != null ? Message.Annotations : Children[0].Annotations; } } public HeaderList? Headers => null; public DateTimeOffset? InternalDate => null; public DateTimeOffset? SaveDate => null; public uint? Size { get { return Message != null ? Message.Size : Children[0].Size; } } public ulong? ModSeq { get { return Message != null ? Message.ModSeq : Children[0].ModSeq; } } public MessageIdList? References { get { return Message != null ? Message.References : Children[0].References; } } public string? EmailId => null; public string? ThreadId => null; public UniqueId UniqueId { get { return Message != null ? Message.UniqueId : Children[0].UniqueId; } } public int Index { get { return Message != null ? Message.Index : Children[0].Index; } } public ulong? GMailMessageId => null; public ulong? GMailThreadId => null; public IList? GMailLabels => null; } static Dictionary CreateIdTable (IEnumerable messages) { var ids = new Dictionary (StringComparer.OrdinalIgnoreCase); foreach (var message in messages) { if (message.Envelope == null) throw new ArgumentException ("One or more messages is missing information needed for threading.", nameof (messages)); var id = message.Envelope.MessageId; if (string.IsNullOrEmpty (id)) id = MimeUtils.GenerateMessageId (); if (ids.TryGetValue (id!, out var node)) { if (node.Message == null) { // a previously processed message referenced this message node.Message = message; } else { // a duplicate message-id, just create a dummy id and use that id = MimeUtils.GenerateMessageId (); node = null; } } if (node == null) { // create a new ThreadContainer for this message and add it to ids node = new ThreadableNode (message); ids.Add (id!, node); } ThreadableNode? parent = null; if (message.References != null) { foreach (var reference in message.References) { if (!ids.TryGetValue (reference, out var referenced)) { // create a dummy container for the referenced message referenced = new ThreadableNode (null); ids.Add (reference, referenced); } // chain up the references, disallowing loops if (parent != null && referenced.Parent == null && parent != referenced && !parent.Children.Contains (referenced)) { parent.Children.Add (referenced); referenced.Parent = parent; } parent = referenced; } } // don't allow loops if (parent != null && (parent == node || node.Children.Contains (parent))) parent = null; if (node.HasParent) { // unlink from our old parent node.Parent.Children.Remove (node); node.Parent = null; } if (parent != null) { // add it as a child of our new parent parent.Children.Add (node); node.Parent = parent; } } return ids; } static ThreadableNode CreateRoot (IDictionary ids) { var root = new ThreadableNode (null); foreach (var message in ids.Values) { if (message.Parent == null) root.Children.Add (message); } return root; } static void PruneEmptyContainers (ThreadableNode root) { for (int i = 0; i < root.Children.Count; i++) { var node = root.Children[i]; if (node.Message == null && node.Children.Count == 0) { // this is an empty container with no children, nuke it. root.Children.RemoveAt (i); i--; } else if (node.Message == null && node.HasChildren && (node.HasParent || node.Children.Count == 1)) { // If the Container has no Message, but does have children, remove this container but promote // its children to this level (that is, splice them in to the current child list.) // // Do not promote the children if doing so would promote them to the root set -- unless there // is only one child, in which case, do. root.Children.RemoveAt (i); for (int j = 0; j < node.Children.Count; j++) { node.Children[j].Parent = node.Parent; root.Children.Add (node.Children[j]); } node.Children.Clear (); i--; } else if (node.HasChildren) { PruneEmptyContainers (node); } } } static void GroupBySubject (ThreadableNode root) { var subjects = new Dictionary (StringComparer.OrdinalIgnoreCase); ThreadableNode? match; int count = 0; for (int i = 0; i < root.Children.Count; i++) { var current = root.Children[i]; var subject = current.NormalizedSubject; // don't thread messages with empty subjects if (string.IsNullOrEmpty (subject)) continue; if (!subjects.TryGetValue (subject, out match) || (current.Message == null && match.Message != null) || (match.Message != null && match.Message.IsReply && current.Message != null && !current.Message.IsReply)) { subjects[subject] = current; count++; } } if (count == 0) return; for (int i = 0; i < root.Children.Count; i++) { var current = root.Children[i]; var subject = current.NormalizedSubject; // don't thread messages with empty subjects if (string.IsNullOrEmpty (subject)) continue; match = subjects[subject]; if (match == current) continue; // remove the second message with the same subject root.Children.RemoveAt (i--); // group these messages together... if (match.Message == null && current.Message == null) { // If both messages are dummies, append the current message's children // to the children of the message in the subject table (the children of // both messages become siblings), and then delete the current message. match.Children.AddRange (current.Children); } else if (match.Message == null && current.Message != null) { // If the message in the subject table is a dummy and the current message // is not, make the current message a child of the message in the subject // table (a sibling of its children). match.Children.Add (current); } else if (current.IsReply && !match.IsReply) { // If the current message is a reply or forward and the message in the // subject table is not, make the current message a child of the message // in the subject table (a sibling of its children). match.Children.Add (current); } else { // Otherwise, create a new dummy message and make both the current message // and the message in the subject table children of the dummy. Then replace // the message in the subject table with the dummy message. // Note: if we re-use the node already in the subject table and the root, then // we won't have to insert the new dummy node at the matched node's location var dummy = match; // clone the message already in the subject table match = new ThreadableNode (dummy.Message); match.Children.AddRange (dummy.Children); // empty out the old match node (aka the new dummy node) dummy.Children.Clear (); dummy.Message = null; // now add both messages to the dummy dummy.Children.Add (match); dummy.Children.Add (current); } } } static void GetThreads (ThreadableNode root, IList threads, IList orderBy) { root.Children.Sort (orderBy); for (int i = 0; i < root.Children.Count; i++) { var message = root.Children[i].Message; var thread = new MessageThread (message); GetThreads (root.Children[i], thread.Children, orderBy); threads.Add (thread); } } static List ThreadByReferences (IEnumerable messages, IList orderBy) { var threads = new List (); var ids = CreateIdTable (messages); var root = CreateRoot (ids); PruneEmptyContainers (root); GroupBySubject (root); GetThreads (root, threads, orderBy); return threads; } static List ThreadBySubject (IEnumerable messages, IList orderBy) { var threads = new List (); var root = new ThreadableNode (null); foreach (var message in messages) { if (message.Envelope == null) throw new ArgumentException ("One or more messages is missing information needed for threading.", nameof (messages)); var node = new ThreadableNode (message); root.Children.Add (node); } GroupBySubject (root); GetThreads (root, threads, orderBy); return threads; } /// /// Thread the messages according to the specified threading algorithm. /// /// /// Thread the messages according to the specified threading algorithm. /// /// The threaded messages. /// The messages. /// The threading algorithm. /// /// is . /// /// /// is not a valid threading algorithm. /// /// /// contains one or more items that is missing information needed for threading. /// public static IList Thread (this IEnumerable messages, ThreadingAlgorithm algorithm) { return Thread (messages, algorithm, new [] { OrderBy.Arrival }); } /// /// Threads the messages according to the specified threading algorithm /// and sorts the resulting threads by the specified ordering. /// /// /// Threads the messages according to the specified threading algorithm /// and sorts the resulting threads by the specified ordering. /// /// The threaded messages. /// The messages. /// The threading algorithm. /// The requested sort ordering. /// /// is . /// -or- /// is . /// /// /// is not a valid threading algorithm. /// /// /// contains one or more items that is missing information needed for threading or sorting. /// -or- /// is an empty list. /// public static IList Thread (this IEnumerable messages, ThreadingAlgorithm algorithm, IList orderBy) { if (messages == null) throw new ArgumentNullException (nameof (messages)); if (orderBy == null) throw new ArgumentNullException (nameof (orderBy)); if (orderBy.Count == 0) throw new ArgumentException ("No sort order provided.", nameof (orderBy)); switch (algorithm) { case ThreadingAlgorithm.OrderedSubject: return ThreadBySubject (messages, orderBy); case ThreadingAlgorithm.References: return ThreadByReferences (messages, orderBy); default: throw new ArgumentOutOfRangeException (nameof (algorithm)); } } static bool IsForward (string subject, int index) { return (subject[index] == 'F' || subject[index] == 'f') && (subject[index + 1] == 'W' || subject[index + 1] == 'w') && (subject[index + 2] == 'D' || subject[index + 2] == 'd') && subject[index + 3] == ':'; } static bool IsReply (string subject, int index) { return (subject[index] == 'R' || subject[index] == 'r') && (subject[index + 1] == 'E' || subject[index + 1] == 'e'); } static void SkipWhiteSpace (string subject, ref int index) { while (index < subject.Length && char.IsWhiteSpace (subject[index])) index++; } static bool IsMailingListName (char c) { return c == '-' || c == '_' || char.IsLetterOrDigit (c); } static void SkipMailingListName (string subject, ref int index) { while (index < subject.Length && IsMailingListName (subject[index])) index++; } static bool SkipDigits (string subject, ref int index, out int value) { int startIndex = index; value = 0; while (index < subject.Length && char.IsDigit (subject[index])) { value = (value * 10) + (subject[index] - '0'); index++; } return index > startIndex; } /// /// Gets the threadable subject. /// /// /// Gets the threadable subject. /// /// The threadable subject. /// The Subject header value. /// The reply depth. /// /// is . /// public static string GetThreadableSubject (string subject, out int replyDepth) { if (subject == null) throw new ArgumentNullException (nameof (subject)); replyDepth = 0; int endIndex = subject.Length; int startIndex = 0; int index, left; do { SkipWhiteSpace (subject, ref startIndex); index = startIndex; if ((left = (endIndex - index)) < 3) break; if (left >= 4 && IsForward (subject, index)) { // skip over the "Fwd:" prefix startIndex = index + 4; replyDepth++; continue; } if (IsReply (subject, index)) { if (subject[index + 2] == ':') { // skip over the "Re:" prefix startIndex = index + 3; replyDepth++; continue; } if (subject[index + 2] == '[' || subject[index + 2] == '(') { char close = subject[index + 2] == '[' ? ']' : ')'; // skip over "Re[" or "Re(" index += 3; // if this is followed by "###]:" or "###):", then it's a condensed "Re:" if (SkipDigits (subject, ref index, out int count) && (endIndex - index) >= 2 && subject[index] == close && subject[index + 1] == ':') { startIndex = index + 2; replyDepth += count; continue; } } } else if (subject[index] == '[' && char.IsLetterOrDigit (subject[index + 1])) { // possibly a mailing-list prefix index += 2; SkipMailingListName (subject, ref index); if ((endIndex - index) >= 1 && subject[index] == ']') { startIndex = index + 1; continue; } } break; } while (true); // trim trailing whitespace while (endIndex > 0 && char.IsWhiteSpace (subject[endIndex - 1])) endIndex--; // canonicalize the remainder of the subject, condensing multiple spaces into 1 var builder = new StringBuilder (); bool lwsp = false; for (int i = startIndex; i < endIndex; i++) { if (char.IsWhiteSpace (subject[i])) { if (!lwsp) { builder.Append (' '); lwsp = true; } } else { builder.Append (subject[i]); lwsp = false; } } var canonicalized = builder.ToString (); if (canonicalized.Equals ("(no subject)", StringComparison.OrdinalIgnoreCase)) canonicalized = string.Empty; return canonicalized; } } } ================================================ FILE: MailKit/MessagesVanishedEventArgs.cs ================================================ // // MessagesVanishedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using System.Collections.ObjectModel; namespace MailKit { /// /// Event args used when a message vanishes from a folder. /// /// /// Event args used when a message vanishes from a folder. /// public class MessagesVanishedEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The list of unique identifiers. /// If set to , the messages vanished in the past as opposed to just now. /// /// is . /// public MessagesVanishedEventArgs (IList uids, bool earlier) { UniqueIds = new ReadOnlyCollection (uids); Earlier = earlier; } /// /// Gets the unique identifiers of the messages that vanished. /// /// /// Gets the unique identifiers of the messages that vanished. /// /// The unique identifiers. public IList UniqueIds { get; private set; } /// /// Gets whether the messages vanished in the past as opposed to just now. /// /// /// Gets whether the messages vanished in the past as opposed to just now. /// /// if the messages vanished earlier; otherwise, . public bool Earlier { get; private set; } } } ================================================ FILE: MailKit/Metadata.cs ================================================ // // Metadata.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// A metadata tag and value. /// /// /// A metadata tag and value. /// public class Metadata { internal string EncodedName; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The metadata tag. /// The metadata value. public Metadata (MetadataTag tag, string value) { EncodedName = string.Empty; Value = value; Tag = tag; } /// /// Gets the metadata tag. /// /// /// Gets the metadata tag. /// /// The metadata tag. public MetadataTag Tag { get; private set; } /// /// Gets the metadata value. /// /// /// Gets the metadata value. /// /// The metadata value. public string Value { get; private set; } } } ================================================ FILE: MailKit/MetadataChangedEventArgs.cs ================================================ // // MetadataChangedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Event args used when a metadata changes. /// /// /// Event args used when a metadata changes. /// public class MetadataChangedEventArgs : EventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The metadata that changed. /// /// is . /// public MetadataChangedEventArgs (Metadata metadata) { if (metadata == null) throw new ArgumentNullException (nameof (metadata)); Metadata = metadata; } /// /// Get the metadata that changed. /// /// /// Gets the metadata that changed. /// /// The metadata. public Metadata Metadata { get; private set; } } } ================================================ FILE: MailKit/MetadataCollection.cs ================================================ // // MetadataCollection.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections.Generic; namespace MailKit { /// /// A collection of metadata. /// /// /// A collection of metadata. /// public class MetadataCollection : List { /// /// Initializes a new instance of the class. /// /// /// Creates a new /// public MetadataCollection () { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// A collection of metadata. public MetadataCollection (IEnumerable collection) : base (collection) { } } } ================================================ FILE: MailKit/MetadataOptions.cs ================================================ // // MetadataOptions.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// A set of options to use when requesting metadata. /// /// /// A set of options to use when requesting metadata. /// public class MetadataOptions { int depth; /// /// Initializes a new instance of the class. /// /// /// Creates a new set of options to use when requesting metadata. /// public MetadataOptions () { } /// /// Get or set the depth. /// /// /// When the option is specified, it extends the list of metadata tag /// values returned by the GetMetadata() call. For each specified in the /// the GetMetadata() call, the method returns the value of the specified metadata tag (if it exists), /// plus all metadata tags below the specified entry up to the specified depth. /// Three values are allowed for : /// 0 - no entries below the specified metadata tag are returned. /// 1 - only entries immediately below the specified metadata tag are returned. /// - all entries below the specified metadata tag are returned. /// Thus, a depth of 1 for a tag entry of "/a" will match "/a" as well as its children /// entries (e.g., "/a/b"), but will not match grandchildren entries (e.g., "/a/b/c"). /// If the Depth option is not specified, this is the same as specifying 0. /// /// The depth. /// /// is out of range. /// public int Depth { get { return depth; } set { if (!(value == 0 || value == 1 || value == int.MaxValue)) throw new ArgumentOutOfRangeException (nameof (value)); depth = value; } } /// /// Get or set the max size of the metadata tags to request. /// /// /// When specified, the property is used to filter the metadata tags /// returned by the GetMetadata() call to only those with a value shorter than the max size /// specified. /// /// The size of the max. public uint? MaxSize { get; set; } /// /// Get the length of the longest metadata value. /// /// /// If the property is specified, once the GetMetadata() call returns, /// the property will be set to the length of the longest metadata /// value that exceeded the limit, otherwise a value of 0 will /// be set. /// /// The length of the longest metadata value that exceeded the max size. public uint LongEntries { get; set; } } } ================================================ FILE: MailKit/MetadataTag.cs ================================================ // // MetadataTag.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// A metadata tag. /// /// /// A metadata tag. /// public struct MetadataTag { /// /// A metadata tag for specifying the contact information for the server administrator. /// /// /// Used to get the contact information of the administrator on a /// . /// public static readonly MetadataTag SharedAdmin = new MetadataTag ("/shared/admin"); /// /// A metadata tag for private comments. /// /// /// Used to get or set a private comment on a . /// public static readonly MetadataTag PrivateComment = new MetadataTag ("/private/comment"); /// /// A metadata tag for shared comments. /// /// /// Used to get or set a shared comment on a /// or . /// public static readonly MetadataTag SharedComment = new MetadataTag ("/shared/comment"); /// /// A metadata tag for specifying the special use of a folder. /// /// /// Used to get or set the special use of a . /// public static readonly MetadataTag PrivateSpecialUse = new MetadataTag ("/private/specialuse"); /// /// Initializes a new instance of the struct. /// /// /// Creates a new . /// /// The metadata tag identifier. /// /// is . /// /// /// is an empty string. /// public MetadataTag (string id) { if (id == null) throw new ArgumentNullException (nameof (id)); if (id.Length == 0) throw new ArgumentException ("A metadata tag identifier cannot be empty."); Id = id; } /// /// Get the metadata tag identifier. /// /// /// Gets the metadata tag identifier. /// /// The metadata tag identifier. public string Id { get; private set; } /// /// Determine whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// /// The to compare with the current . /// if the specified is equal to the current /// ; otherwise, . public override bool Equals (object? obj) { return obj is MetadataTag tag && tag.Id == Id; } /// /// Serves as a hash function for a object. /// /// /// Serves as a hash function for a object. /// /// A hash code for this instance that is suitable for use in hashing algorithms and data structures such as a hash table. public override int GetHashCode () { return Id.GetHashCode (); } /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { return Id; } internal static MetadataTag Create (string id) { switch (id) { case "/shared/admin": return SharedAdmin; case "/private/comment": return PrivateComment; case "/shared/comment": return SharedComment; case "/private/specialuse": return PrivateSpecialUse; default: return new MetadataTag (id); } } } } ================================================ FILE: MailKit/ModSeqChangedEventArgs.cs ================================================ // // ModSeqChangedEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// Event args for the event. /// /// /// Event args for the event. /// public class ModSeqChangedEventArgs : MessageEventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The modification sequence value. public ModSeqChangedEventArgs (int index, ulong modseq) : base (index) { ModSeq = modseq; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message index. /// The unique id of the message. /// The modification sequence value. public ModSeqChangedEventArgs (int index, UniqueId uid, ulong modseq) : base (index, uid) { ModSeq = modseq; } /// /// Gets the updated mod-sequence value of the message. /// /// /// Gets the updated mod-sequence value of the message. /// /// The mod-sequence value. public ulong ModSeq { get; private set; } } } ================================================ FILE: MailKit/Net/ClientMetrics.cs ================================================ // // ClientMetrics.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET6_0_OR_GREATER using System; using System.Diagnostics; using System.Globalization; using System.Diagnostics.Metrics; using System.Diagnostics.CodeAnalysis; using MailKit.Net.Smtp; using MailKit.Security; namespace MailKit.Net { sealed class ClientMetrics { public readonly Histogram ConnectionDuration; public readonly Counter OperationCounter; public readonly Histogram OperationDuration; public readonly string MeterName; public ClientMetrics (Meter meter, string meterName, string an, string protocol) { MeterName = meterName; ConnectionDuration = meter.CreateHistogram ( name: $"{meterName}.client.connection.duration", unit: "s", description: $"The duration of successfully established connections to {an} {protocol} server."); OperationCounter = meter.CreateCounter ( name: $"{meterName}.client.operation.count", unit: "{operation}", description: $"The number of times a client performed an operation on {an} {protocol} server."); OperationDuration = meter.CreateHistogram ( name: $"{meterName}.client.operation.duration", unit: "ms", description: $"The amount of time it takes for the {protocol} server to perform an operation."); } static bool TryGetErrorType (Exception exception, [NotNullWhen (true)] out string? errorType) { if (SocketMetrics.TryGetErrorType (exception, false, out errorType)) return true; if (exception is SslHandshakeException) { // Note: The string "secure_connection_error" is used by HttpClient for SSL/TLS handshake errors. errorType = "secure_connection_error"; return true; } if (exception is ProtocolException) { // TODO: ProtocolExceptions tend to be either "Unexpectedly disconnected" or "Parse error". // If we add a property to ProtocolException to tell us this, we could report it better here. // // To mimic HttpClient error.type values, we could use "response_ended" and "invalid_response", respectively. // // Alternatively, HttpClient also uses "http_protocol_error" so we could use "smtp/pop3/imap_protocol_error". errorType = "protocol_error"; return true; } if (exception is SmtpCommandException smtp) { errorType = ((int) smtp.StatusCode).ToString (CultureInfo.InvariantCulture); return true; } if (exception is CommandException) { // FIXME: We need to add a property to CommandException to tell us the error type. errorType = "command_error"; return true; } // Fall back to using the exception type name. errorType = exception.GetType ().FullName; return errorType != null; } internal static TagList GetTags (Uri uri, Exception? ex) { var tags = new TagList { { "url.scheme", uri.Scheme }, { "server.address", uri.Host }, { "server.port", uri.Port } }; if (ex is not null && TryGetErrorType (ex, out var errorType)) tags.Add ("error.type", errorType); return tags; } public void RecordClientDisconnected (long startTimestamp, Uri uri, Exception? ex = null) { if (ConnectionDuration.Enabled) { var duration = TimeSpan.FromTicks (Stopwatch.GetTimestamp () - startTimestamp).TotalSeconds; var tags = GetTags (uri, ex); ConnectionDuration.Record (duration, tags); } } } } #endif // NET6_0_OR_GREATER ================================================ FILE: MailKit/Net/IChannelBindingContext.cs ================================================ // // IChannelBindingContext.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Diagnostics.CodeAnalysis; using System.Security.Authentication.ExtendedProtection; namespace MailKit.Net { /// /// An interface for resources that support acquiring channel-binding tokens. /// /// /// An interface for resources that support acquiring channel-binding tokens. /// interface IChannelBindingContext { /// /// Try to get a channel-binding. /// /// /// Tries to get the specified channel-binding. /// /// The kind of channel-binding desired. /// The channel-binding. /// if the channel-binding token was acquired; otherwise, . bool TryGetChannelBinding (ChannelBindingKind kind, [NotNullWhen (true)] out ChannelBinding? channelBinding); /// /// Try to get a channel-binding token. /// /// /// Tries to get the specified channel-binding token. /// /// The kind of channel-binding desired. /// The channel-binding token. /// if the channel-binding token was acquired; otherwise, . bool TryGetChannelBindingToken (ChannelBindingKind kind, [NotNullWhen (true)] out byte[]? token); } } ================================================ FILE: MailKit/Net/Imap/AsyncImapClient.cs ================================================ // // AsyncImapClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Threading.Tasks; using System.Collections.Generic; using MailKit.Security; namespace MailKit.Net.Imap { public partial class ImapClient { /// /// Asynchronously enable compression over the IMAP connection. /// /// /// Asynchronously enables compression over the IMAP connection. /// If the IMAP server supports the extension, /// it is possible at any point after connecting to enable compression to reduce network /// bandwidth usage. Ideally, this method should be called before authenticating. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Compression must be enabled before a folder has been selected. /// /// /// The IMAP server does not support the COMPRESS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the COMPRESS command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// public async Task CompressAsync (CancellationToken cancellationToken = default) { var ic = QueueCompressCommand (cancellationToken); await engine.RunAsync (ic).ConfigureAwait (false); ProcessCompressResponse (ic); } /// /// Asynchronously enable the QRESYNC feature. /// /// /// Enables the QRESYNC feature. /// The QRESYNC extension improves resynchronization performance of folders by /// querying the IMAP server for a list of changes when the folder is opened using the /// /// method. /// If this feature is enabled, the event is replaced /// with the event. /// This method needs to be called immediately after calling one of the /// Authenticate methods, before /// opening any folders. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Quick resynchronization needs to be enabled before selecting a folder. /// /// /// The IMAP server does not support the QRESYNC extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ENABLE command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// public override async Task EnableQuickResyncAsync (CancellationToken cancellationToken = default) { if (!TryQueueEnableQuickResyncCommand (cancellationToken, out var ic)) return; await engine.RunAsync (ic).ConfigureAwait (false); ProcessEnableResponse (ic); } /// /// Asynchronously enable the UTF8=ACCEPT extension. /// /// /// Enables the UTF8=ACCEPT extension. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// UTF8=ACCEPT needs to be enabled before selecting a folder. /// /// /// The IMAP server does not support the UTF8=ACCEPT extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ENABLE command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// public async Task EnableUTF8Async (CancellationToken cancellationToken = default) { if (!TryQueueEnableUTF8Command (cancellationToken, out var ic)) return; await engine.RunAsync (ic).ConfigureAwait (false); ProcessEnableResponse (ic); } /// /// Asynchronously identify the client implementation to the server and obtain the server implementation details. /// /// /// Passes along the client implementation details to the server while also obtaining implementation /// details from the server. /// If the is or no properties have been set, no /// identifying information will be sent to the server. /// /// Security Implications /// This command has the danger of violating the privacy of users if misused. Clients should /// notify users that they send the ID command. /// It is highly desirable that implementations provide a method of disabling ID support, perhaps by /// not calling this method at all, or by passing as the /// argument. /// Implementors must exercise extreme care in adding properties to the . /// Some properties, such as a processor ID number, Ethernet address, or other unique (or mostly unique) identifier /// would allow tracking of users in ways that violate user privacy expectations and may also make it easier for /// attackers to exploit security holes in the client. /// /// /// The implementation details of the server if available; otherwise, . /// The client implementation. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The IMAP server does not support the ID extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ID command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// public async Task IdentifyAsync (ImapImplementation clientImplementation, CancellationToken cancellationToken = default) { var ic = QueueIdentifyCommand (clientImplementation, cancellationToken); await engine.RunAsync (ic).ConfigureAwait (false); return ProcessIdentifyResponse (ic); } async Task OnAuthenticatedAsync (string message, CancellationToken cancellationToken) { await engine.QueryNamespacesAsync (cancellationToken).ConfigureAwait (false); await engine.QuerySpecialFoldersAsync (cancellationToken).ConfigureAwait (false); OnAuthenticated (message); } /// /// Asynchronously authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// An asynchronous task context. /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override async Task AuthenticateAsync (SaslMechanism mechanism, CancellationToken cancellationToken = default) { CheckCanAuthenticate (mechanism, cancellationToken); int capabilitiesVersion = engine.CapabilitiesVersion; ImapCommand? ic = null; ConfigureSaslMechanism (mechanism); var command = string.Format ("AUTHENTICATE {0}", mechanism.MechanismName); if ((engine.Capabilities & ImapCapabilities.SaslIR) != 0 && mechanism.SupportsInitialResponse) { string ir = await mechanism.ChallengeAsync (null, cancellationToken).ConfigureAwait (false); command += " " + ir + "\r\n"; } else { command += "\r\n"; } ic = engine.QueueCommand (cancellationToken, null, command); ic.ContinuationHandler = async (imap, cmd, text, xdoAsync) => { string challenge = await mechanism.ChallengeAsync (text, cmd.CancellationToken).ConfigureAwait (false); var buf = Encoding.ASCII.GetBytes (challenge + "\r\n"); await imap.Stream!.WriteAsync (buf, 0, buf.Length, cmd.CancellationToken).ConfigureAwait (false); await imap.Stream.FlushAsync (cmd.CancellationToken).ConfigureAwait (false); }; using var operation = engine.StartNetworkOperation (NetworkOperationKind.Authenticate); try { detector.IsAuthenticating = true; try { await engine.RunAsync (ic).ConfigureAwait (false); } finally { detector.IsAuthenticating = false; } ProcessAuthenticateResponse (ic, mechanism); // Query the CAPABILITIES again if the server did not include an // untagged CAPABILITIES response to the AUTHENTICATE command. if (engine.CapabilitiesVersion == capabilitiesVersion) await engine.QueryCapabilitiesAsync (cancellationToken).ConfigureAwait (false); await OnAuthenticatedAsync (ic.ResponseText ?? string.Empty, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously authenticate using the supplied credentials. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the IMAP server supports one or more SASL authentication mechanisms, /// then the SASL mechanisms that both the client and server support (not including /// any OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then LOGIN command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// An asynchronous task context. /// The text encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override async Task AuthenticateAsync (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default) { CheckCanAuthenticate (encoding, credentials); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Authenticate); try { int capabilitiesVersion = engine.CapabilitiesVersion; var uri = new Uri ("imap://" + engine.Uri!.Host); NetworkCredential? cred; ImapCommand? ic = null; SaslMechanism? sasl; string id; foreach (var authmech in SaslMechanism.Rank (engine.AuthenticationMechanisms)) { cred = credentials.GetCredential (uri, authmech); if (cred == null || (sasl = SaslMechanism.Create (authmech, encoding, cred)) == null) continue; ConfigureSaslMechanism (sasl, uri); cancellationToken.ThrowIfCancellationRequested (); var command = string.Format ("AUTHENTICATE {0}", sasl.MechanismName); if ((engine.Capabilities & ImapCapabilities.SaslIR) != 0 && sasl.SupportsInitialResponse) { string ir = await sasl.ChallengeAsync (null, cancellationToken).ConfigureAwait (false); command += " " + ir + "\r\n"; } else { command += "\r\n"; } ic = engine.QueueCommand (cancellationToken, null, command); ic.ContinuationHandler = async (imap, cmd, text, xdoAsync) => { string challenge = await sasl.ChallengeAsync (text, cmd.CancellationToken).ConfigureAwait (false); var buf = Encoding.ASCII.GetBytes (challenge + "\r\n"); await imap.Stream!.WriteAsync (buf, 0, buf.Length, cmd.CancellationToken).ConfigureAwait (false); await imap.Stream.FlushAsync (cmd.CancellationToken).ConfigureAwait (false); }; detector.IsAuthenticating = true; try { await engine.RunAsync (ic).ConfigureAwait (false); } finally { detector.IsAuthenticating = false; } if (ic.Response != ImapCommandResponse.Ok) { EmitAndThrowOnAlert (ic); if (ic.Bye) throw ImapProtocolException.Create (ic); continue; } engine.State = ImapEngineState.Authenticated; id = GetSessionIdentifier (cred.UserName); if (id != identifier) { engine.FolderCache.Clear (); identifier = id; } // Query the CAPABILITIES again if the server did not include an // untagged CAPABILITIES response to the AUTHENTICATE command. if (engine.CapabilitiesVersion == capabilitiesVersion) await engine.QueryCapabilitiesAsync (cancellationToken).ConfigureAwait (false); await OnAuthenticatedAsync (ic.ResponseText ?? string.Empty, cancellationToken).ConfigureAwait (false); return; } CheckCanLogin (ic); // fall back to the classic LOGIN command... if ((cred = credentials.GetCredential (uri, "DEFAULT")) == null) throw new AuthenticationException ("No credentials could be found for the IMAP server."); ic = engine.QueueCommand (cancellationToken, null, "LOGIN %S %S\r\n", cred.UserName, cred.Password); detector.IsAuthenticating = true; try { await engine.RunAsync (ic).ConfigureAwait (false); } finally { detector.IsAuthenticating = false; } if (ic.Response != ImapCommandResponse.Ok) throw CreateAuthenticationException (ic); engine.State = ImapEngineState.Authenticated; id = GetSessionIdentifier (cred.UserName); if (id != identifier) { engine.FolderCache.Clear (); identifier = id; } // Query the CAPABILITIES again if the server did not include an // untagged CAPABILITIES response to the LOGIN command. if (engine.CapabilitiesVersion == capabilitiesVersion) await engine.QueryCapabilitiesAsync (cancellationToken).ConfigureAwait (false); await OnAuthenticatedAsync (ic.ResponseText ?? string.Empty, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } async Task SslHandshakeAsync (SslStream ssl, string host, CancellationToken cancellationToken) { #if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER await ssl.AuthenticateAsClientAsync (GetSslClientAuthenticationOptions (host, ValidateRemoteCertificate), cancellationToken).ConfigureAwait (false); #else await ssl.AuthenticateAsClientAsync (host, ClientCertificates, SslProtocols, CheckCertificateRevocation).ConfigureAwait (false); #endif } async Task PostConnectAsync (Stream stream, string host, int port, SecureSocketOptions options, bool starttls, CancellationToken cancellationToken) { try { ProtocolLogger.LogConnect (engine.Uri!); } catch { stream.Dispose (); throw; } connecting = true; var imap = new ImapStream (stream, ProtocolLogger); try { await engine.ConnectAsync (imap, cancellationToken).ConfigureAwait (false); } catch { connecting = false; throw; } try { // Only query the CAPABILITIES if the greeting didn't include them. if (engine.CapabilitiesVersion == 0) await engine.QueryCapabilitiesAsync (cancellationToken).ConfigureAwait (false); if (options == SecureSocketOptions.StartTls && (engine.Capabilities & ImapCapabilities.StartTLS) == 0) throw new NotSupportedException ("The IMAP server does not support the STARTTLS extension."); if (starttls && (engine.Capabilities & ImapCapabilities.StartTLS) != 0) { var ic = engine.QueueCommand (cancellationToken, null, "STARTTLS\r\n"); await engine.RunAsync (ic).ConfigureAwait (false); if (ic.Response == ImapCommandResponse.Ok) { try { var tls = new SslStream (stream, false, ValidateRemoteCertificate); imap.Stream = tls; await SslHandshakeAsync (tls, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { throw SslHandshakeException.Create (ref sslValidationInfo, ex, true, "IMAP", host, port, 993, 143); } engine.IsSecure = true; // Query the CAPABILITIES again if the server did not include an // untagged CAPABILITIES response to the STARTTLS command. if (engine.CapabilitiesVersion == 1) await engine.QueryCapabilitiesAsync (cancellationToken).ConfigureAwait (false); } else if (options == SecureSocketOptions.StartTls) { throw ImapCommandException.Create ("STARTTLS", ic); } } } catch (Exception ex) { engine.Disconnect (ex); throw; } finally { connecting = false; } // Note: we capture the state here in case someone calls Authenticate() from within the Connected event handler. var authenticated = engine.State == ImapEngineState.Authenticated; OnConnected (host, port, options); if (authenticated) await OnAuthenticatedAsync (string.Empty, cancellationToken).ConfigureAwait (false); } /// /// Asynchronously establish a connection to the specified IMAP server. /// /// /// Establishes a connection to the specified IMAP or IMAP/S server. /// If the has a value of 0, then the /// parameter is used to determine the default port to /// connect to. The default port used with /// is 993. All other values will use a default port of 143. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 993, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// /// /// /// /// An asynchronous task context. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the IMAP server does not support the STARTTLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override async Task ConnectAsync (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (host, port); ComputeDefaultValues (host, ref port, ref options, out var uri, out var starttls); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Connect, uri); try { var stream = await ConnectNetworkAsync (host, port, cancellationToken).ConfigureAwait (false); stream.WriteTimeout = timeout; stream.ReadTimeout = timeout; engine.Uri = uri; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { await SslHandshakeAsync (ssl, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "IMAP", host, port, 993, 143); } stream = ssl; } await PostConnectAsync (stream, host, port, options, starttls, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously establish a connection to the specified IMAP or IMAP/S server using the provided socket. /// /// /// Establishes a connection to the specified IMAP or IMAP/S server using /// the provided socket. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 993, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// An asynchronous task context. /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the IMAP server does not support the STARTTLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override Task ConnectAsync (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (socket, host, port); return ConnectAsync (new NetworkStream (socket, true), host, port, options, cancellationToken); } /// /// Asynchronously establish a connection to the specified IMAP or IMAP/S server using the provided stream. /// /// /// Establishes a connection to the specified IMAP or IMAP/S server using /// the provided stream. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 993, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// An asynchronous task context. /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the IMAP server does not support the STARTTLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override async Task ConnectAsync (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (stream, host, port); ComputeDefaultValues (host, ref port, ref options, out var uri, out var starttls); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Connect, uri); try { Stream network; engine.Uri = uri; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { await SslHandshakeAsync (ssl, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "IMAP", host, port, 993, 143); } network = ssl; } else { network = stream; } if (network.CanTimeout) { network.WriteTimeout = timeout; network.ReadTimeout = timeout; } await PostConnectAsync (network, host, port, options, starttls, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously disconnect the service. /// /// /// If is , a LOGOUT command will be issued in order to disconnect cleanly. /// /// /// /// /// An asynchronous task context. /// If set to , a LOGOUT command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// public override async Task DisconnectAsync (bool quit, CancellationToken cancellationToken = default) { CheckDisposed (); if (!engine.IsConnected) return; if (quit) { try { var ic = engine.QueueCommand (cancellationToken, null, "LOGOUT\r\n"); await engine.RunAsync (ic).ConfigureAwait (false); } catch (OperationCanceledException) { } catch (ImapProtocolException) { } catch (ImapCommandException) { } catch (IOException) { } } disconnecting = true; engine.Disconnect (null); } /// /// Asynchronously ping the IMAP server to keep the connection alive. /// /// /// The NOOP command is typically used to keep the connection with the IMAP server /// alive. When a client goes too long (typically 30 minutes) without sending any commands to the /// IMAP server, the IMAP server will close the connection with the client, forcing the client to /// reconnect before it can send any more commands. /// The NOOP command also provides a great way for a client to check for new /// messages. /// When the IMAP server receives a NOOP command, it will reply to the client with a /// list of pending updates such as EXISTS and RECENT counts on the currently /// selected folder. To receive these notifications, subscribe to the /// and events, /// respectively. /// For more information about the NOOP command, see /// rfc3501. /// /// /// /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOOP command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public override async Task NoOpAsync (CancellationToken cancellationToken = default) { var ic = QueueNoOpCommand (cancellationToken); await engine.RunAsync (ic).ConfigureAwait (false); ProcessNoOpResponse (ic); } /// /// Asynchronously toggle the into the IDLE state. /// /// /// When a client enters the IDLE state, the IMAP server will send /// events to the client as they occur on the selected folder. These events /// may include notifications of new messages arriving, expunge notifications, /// flag changes, etc. /// Due to the nature of the IDLE command, a folder must be selected /// before a client can enter into the IDLE state. This can be done by /// opening a folder using /// /// or any of the other variants. /// While the IDLE command is running, no other commands may be issued until the /// is cancelled. /// It is especially important to cancel the /// before cancelling the when using SSL or TLS due to /// the fact that cannot be polled. /// /// An asynchronous task context. /// The cancellation token used to return to the non-idle state. /// The cancellation token. /// /// must be cancellable (i.e. cannot be used). /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// A has not been opened. /// /// /// The IMAP server does not support the IDLE extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the IDLE command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public async Task IdleAsync (CancellationToken doneToken, CancellationToken cancellationToken = default) { CheckCanIdle (doneToken); if (doneToken.IsCancellationRequested) return; using (var context = new ImapIdleContext (engine, doneToken, cancellationToken)) { var ic = QueueIdleCommand (context, cancellationToken); await engine.RunAsync (ic).ConfigureAwait (false); ProcessIdleResponse (ic); } } /// /// Asynchronously request the specified notification events from the IMAP server. /// /// /// The NOTIFY command is used to expand /// which notifications the client wishes to be notified about, including status notifications /// about folders other than the currently selected folder. It can also be used to automatically /// FETCH information about new messages that have arrived in the currently selected folder. /// This, combined with , /// can be used to get instant notifications for changes to any of the specified folders. /// /// An asynchronous task context. /// if the server should immediately notify the client of the /// selected folder's status; otherwise, . /// The specific event groups that the client would like to receive notifications for. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// One or more is invalid. /// /// /// The IMAP server does not support the NOTIFY extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOTIFY command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public async Task NotifyAsync (bool status, IList eventGroups, CancellationToken cancellationToken = default) { var ic = QueueNotifyCommand (status, eventGroups, cancellationToken, out bool notifySelectedNewExpunge); await engine.RunAsync (ic).ConfigureAwait (false); ProcessNotifyResponse (ic, notifySelectedNewExpunge); } /// /// Asynchronously disable any previously requested notification events from the IMAP server. /// /// /// Disables any notification events requested in a prior call to /// . /// request. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the NOTIFY extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOTIFY command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public async Task DisableNotifyAsync (CancellationToken cancellationToken = default) { var ic = QueueDisableNotifyCommand (cancellationToken); await engine.RunAsync (ic).ConfigureAwait (false); ProcessNotifyResponse (ic, false); } /// /// Asynchronously get all of the folders within the specified namespace. /// /// /// Gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The namespace folder could not be found. /// /// /// An I/O error occurred. /// /// /// The server replied to the LIST or LSUB command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public override Task> GetFoldersAsync (FolderNamespace @namespace, StatusItems items = StatusItems.None, bool subscribedOnly = false, CancellationToken cancellationToken = default) { if (@namespace == null) throw new ArgumentNullException (nameof (@namespace)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); return engine.GetFoldersAsync (@namespace, items, subscribedOnly, cancellationToken); } /// /// Asynchronously get the folder for the specified path. /// /// /// Gets the folder for the specified path. /// /// The folder. /// The folder path. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The folder could not be found. /// /// /// An I/O error occurred. /// /// /// The server replied to the LIST command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public override Task GetFolderAsync (string path, CancellationToken cancellationToken = default) { if (path == null) throw new ArgumentNullException (nameof (path)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); return engine.GetFolderAsync (path, cancellationToken); } /// /// Asynchronously gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA or METADATA-SERVER extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetMetadataAsync (MetadataTag tag, CancellationToken cancellationToken = default) { var ic = QueueGetMetadataCommand (tag, cancellationToken); await engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetMetadataResponse (ic, tag); } /// /// Asynchronously gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA or METADATA-SERVER extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetMetadataAsync (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default) { if (!TryQueueGetMetadataCommand (options, tags, cancellationToken, out var ic)) return new MetadataCollection (); await engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetMetadataResponse (ic, options); } /// /// Asynchronously gets the specified metadata. /// /// /// Sets the specified metadata. /// /// An asynchronous task context. /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA or METADATA-SERVER extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task SetMetadataAsync (MetadataCollection metadata, CancellationToken cancellationToken = default) { if (!TryQueueSetMetadataCommand (metadata, cancellationToken, out var ic)) return; await engine.RunAsync (ic).ConfigureAwait (false); ProcessSetMetadataResponse (ic); } } } ================================================ FILE: MailKit/Net/Imap/IImapClient.cs ================================================ // // IImapClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; namespace MailKit.Net.Imap { /// /// An interface for an IMAP client. /// /// /// Implemented by . /// public interface IImapClient : IMailStore { /// /// Get the capabilities supported by the IMAP server. /// /// /// The capabilities will not be known until a successful connection has been made via one of /// the Connect methods and may /// change as a side-effect of calling one of the /// Authenticate /// methods. /// /// /// /// /// The capabilities. /// /// Capabilities cannot be enabled, they may only be disabled. /// ImapCapabilities Capabilities { get; set; } /// /// Get the maximum size of a message that can be appended to a folder. /// /// /// Gets the maximum size of a message, in bytes, that can be appended to a folder. /// If the value is not set, then the limit is unspecified. /// /// The append limit. uint? AppendLimit { get; } /// /// Get the internationalization level supported by the IMAP server. /// /// /// Gets the internationalization level supported by the IMAP server. /// For more information, see /// section 4 of rfc5255. /// /// The internationalization level. int InternationalizationLevel { get; } /// /// Get the access rights supported by the IMAP server. /// /// /// These rights are additional rights supported by the IMAP server beyond the standard rights /// defined in section 2.1 of rfc4314 /// and will not be populated until the client is successfully connected. /// /// /// /// /// The rights. AccessRights Rights { get; } /// /// Get whether or not the client is currently in the IDLE state. /// /// /// Gets whether or not the client is currently in the IDLE state. /// /// if an IDLE command is active; otherwise, . bool IsIdle { get; } /// /// Enable compression over the IMAP connection. /// /// /// Enables compression over the IMAP connection. /// If the IMAP server supports the extension, /// it is possible at any point after connecting to enable compression to reduce network /// bandwidth usage. Ideally, this method should be called before authenticating. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Compression must be enabled before a folder has been selected. /// /// /// The IMAP server does not support the extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the COMPRESS command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// void Compress (CancellationToken cancellationToken = default); /// /// Asynchronously enable compression over the IMAP connection. /// /// /// Asynchronously enables compression over the IMAP connection. /// If the IMAP server supports the extension, /// it is possible at any point after connecting to enable compression to reduce network /// bandwidth usage. Ideally, this method should be called before authenticating. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Compression must be enabled before a folder has been selected. /// /// /// The IMAP server does not support the COMPRESS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the COMPRESS command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// Task CompressAsync (CancellationToken cancellationToken = default); /// /// Enable the UTF8=ACCEPT extension. /// /// /// Enables the UTF8=ACCEPT extension. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// UTF8=ACCEPT needs to be enabled before selecting a folder. /// /// /// The IMAP server does not support the UTF8=ACCEPT extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ENABLE command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// void EnableUTF8 (CancellationToken cancellationToken = default); /// /// Asynchronously enable the UTF8=ACCEPT extension. /// /// /// Enables the UTF8=ACCEPT extension. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// UTF8=ACCEPT needs to be enabled before selecting a folder. /// /// /// The IMAP server does not support the UTF8=ACCEPT extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ENABLE command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// Task EnableUTF8Async (CancellationToken cancellationToken = default); /// /// Identify the client implementation to the server and obtain the server implementation details. /// /// /// Passes along the client implementation details to the server while also obtaining implementation /// details from the server. /// If the is or no properties have been set, no /// identifying information will be sent to the server. /// /// Security Implications /// This command has the danger of violating the privacy of users if misused. Clients should /// notify users that they send the ID command. /// It is highly desirable that implementations provide a method of disabling ID support, perhaps by /// not calling this method at all, or by passing as the /// argument. /// Implementors must exercise extreme care in adding properties to the . /// Some properties, such as a processor ID number, Ethernet address, or other unique (or mostly unique) identifier /// would allow tracking of users in ways that violate user privacy expectations and may also make it easier for /// attackers to exploit security holes in the client. /// /// /// /// /// /// The implementation details of the server if available; otherwise, . /// The client implementation. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The IMAP server does not support the ID extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ID command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// ImapImplementation Identify (ImapImplementation clientImplementation, CancellationToken cancellationToken = default); /// /// Asynchronously identify the client implementation to the server and obtain the server implementation details. /// /// /// Passes along the client implementation details to the server while also obtaining implementation /// details from the server. /// If the is or no properties have been set, no /// identifying information will be sent to the server. /// /// Security Implications /// This command has the danger of violating the privacy of users if misused. Clients should /// notify users that they send the ID command. /// It is highly desirable that implementations provide a method of disabling ID support, perhaps by /// not calling this method at all, or by passing as the /// argument. /// Implementors must exercise extreme care in adding properties to the . /// Some properties, such as a processor ID number, Ethernet address, or other unique (or mostly unique) identifier /// would allow tracking of users in ways that violate user privacy expectations and may also make it easier for /// attackers to exploit security holes in the client. /// /// /// The implementation details of the server if available; otherwise, . /// The client implementation. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The IMAP server does not support the ID extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ID command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// Task IdentifyAsync (ImapImplementation clientImplementation, CancellationToken cancellationToken = default); /// /// Toggle the into the IDLE state. /// /// /// When a client enters the IDLE state, the IMAP server will send /// events to the client as they occur on the selected folder. These events /// may include notifications of new messages arriving, expunge notifications, /// flag changes, etc. /// Due to the nature of the IDLE command, a folder must be selected /// before a client can enter into the IDLE state. This can be done by /// opening a folder using /// /// or any of the other variants. /// While the IDLE command is running, no other commands may be issued until the /// is cancelled. /// It is especially important to cancel the /// before cancelling the when using SSL or TLS due to /// the fact that cannot be polled. /// /// /// /// /// The cancellation token used to return to the non-idle state. /// The cancellation token. /// /// must be cancellable (i.e. cannot be used). /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// A has not been opened. /// /// /// The IMAP server does not support the IDLE extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the IDLE command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// void Idle (CancellationToken doneToken, CancellationToken cancellationToken = default); /// /// Asynchronously toggle the into the IDLE state. /// /// /// When a client enters the IDLE state, the IMAP server will send /// events to the client as they occur on the selected folder. These events /// may include notifications of new messages arriving, expunge notifications, /// flag changes, etc. /// Due to the nature of the IDLE command, a folder must be selected /// before a client can enter into the IDLE state. This can be done by /// opening a folder using /// /// or any of the other variants. /// While the IDLE command is running, no other commands may be issued until the /// is cancelled. /// It is especially important to cancel the /// before cancelling the when using SSL or TLS due to /// the fact that cannot be polled. /// /// An asynchronous task context. /// The cancellation token used to return to the non-idle state. /// The cancellation token. /// /// must be cancellable (i.e. cannot be used). /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// A has not been opened. /// /// /// The IMAP server does not support the IDLE extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the IDLE command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// Task IdleAsync (CancellationToken doneToken, CancellationToken cancellationToken = default); /// /// Request the specified notification events from the IMAP server. /// /// /// The NOTIFY command is used to expand /// which notifications the client wishes to be notified about, including status notifications /// about folders other than the currently selected folder. It can also be used to automatically /// FETCH information about new messages that have arrived in the currently selected folder. /// This, combined with , /// can be used to get instant notifications for changes to any of the specified folders. /// /// if the server should immediately notify the client of the /// selected folder's status; otherwise, . /// The specific event groups that the client would like to receive notifications for. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// One or more is invalid. /// /// /// The IMAP server does not support the NOTIFY extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOTIFY command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// void Notify (bool status, IList eventGroups, CancellationToken cancellationToken = default); /// /// Asynchronously request the specified notification events from the IMAP server. /// /// /// The NOTIFY command is used to expand /// which notifications the client wishes to be notified about, including status notifications /// about folders other than the currently selected folder. It can also be used to automatically /// FETCH information about new messages that have arrived in the currently selected folder. /// This, combined with , /// can be used to get instant notifications for changes to any of the specified folders. /// /// An asynchronous task context. /// if the server should immediately notify the client of the /// selected folder's status; otherwise, . /// The specific event groups that the client would like to receive notifications for. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// One or more is invalid. /// /// /// The IMAP server does not support the NOTIFY extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOTIFY command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// Task NotifyAsync (bool status, IList eventGroups, CancellationToken cancellationToken = default); /// /// Disable any previously requested notification events from the IMAP server. /// /// /// Disables any notification events requested in a prior call to /// . /// request. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the NOTIFY extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOTIFY command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// void DisableNotify (CancellationToken cancellationToken = default); /// /// Asynchronously disable any previously requested notification events from the IMAP server. /// /// /// Disables any notification events requested in a prior call to /// . /// request. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the NOTIFY extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOTIFY command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// Task DisableNotifyAsync (CancellationToken cancellationToken = default); } } ================================================ FILE: MailKit/Net/Imap/IImapFolder.cs ================================================ // // IImapFolder.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; using MailKit.Search; namespace MailKit.Net.Imap { /// /// An interface for an IMAP folder. /// /// /// Implemented by . /// /// /// /// /// /// /// public interface IImapFolder : IMailFolder { /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// HeaderList GetHeaders (UniqueId uid, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task GetHeadersAsync (UniqueId uid, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// HeaderList GetHeaders (int index, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task GetHeadersAsync (int index, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part. /// /// /// Gets the specified body part. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The body part. /// The UID of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// MimeEntity GetBodyPart (UniqueId uid, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part. /// /// /// Gets the specified body part. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The body part. /// The UID of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task GetBodyPartAsync (UniqueId uid, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the specified body part. /// /// /// Gets the specified body part. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The body part. /// The index of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// MimeEntity GetBodyPart (int index, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the specified body part. /// /// /// Gets the specified body part. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The body part. /// The index of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task GetBodyPartAsync (int index, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the streams for the specified messages. /// /// /// Gets the streams for the specified messages. /// /// The uids of the messages. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// void GetStreams (IList uids, ImapFetchStreamCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the streams for the specified messages. /// /// /// Asynchronously gets the streams for the specified messages. /// /// An awaitable task. /// The uids of the messages. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task GetStreamsAsync (IList uids, ImapFetchStreamAsyncCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the streams for the specified messages. /// /// /// Gets the streams for the specified messages. /// /// The indexes of the messages. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// void GetStreams (IList indexes, ImapFetchStreamCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the streams for the specified messages. /// /// /// Asynchronously gets the streams for the specified messages. /// /// An awaitable task. /// The indexes of the messages. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task GetStreamsAsync (IList indexes, ImapFetchStreamAsyncCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Get the streams for the specified messages. /// /// /// Gets the streams for the specified messages. /// /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// void GetStreams (int min, int max, ImapFetchStreamCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Asynchronously get the streams for the specified messages. /// /// /// Asynchronously gets the streams for the specified messages. /// /// An awaitable task. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task GetStreamsAsync (int min, int max, ImapFetchStreamAsyncCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null); /// /// Search the folder for messages matching the specified query. /// /// /// Sends a UID SEARCH command with the specified query passed directly to the IMAP server /// with no interpretation by MailKit. This means that the query may contain any arguments that a /// UID SEARCH command is allowed to have according to the IMAP specifications and any /// extensions that are supported, including RETURN parameters. /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// SearchResults Search (string query, CancellationToken cancellationToken = default); /// /// Asynchronously search the folder for messages matching the specified query. /// /// /// Sends a UID SEARCH command with the specified query passed directly to the IMAP server /// with no interpretation by MailKit. This means that the query may contain any arguments that a /// UID SEARCH command is allowed to have according to the IMAP specifications and any /// extensions that are supported, including RETURN parameters. /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task SearchAsync (string query, CancellationToken cancellationToken = default); /// /// Sort messages matching the specified query. /// /// /// Sends a UID SORT command with the specified query passed directly to the IMAP server /// with no interpretation by MailKit. This means that the query may contain any arguments that a /// UID SORT command is allowed to have according to the IMAP specifications and any /// extensions that are supported, including RETURN parameters. /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The IMAP server does not support the SORT extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// SearchResults Sort (string query, CancellationToken cancellationToken = default); /// /// Asynchronously sort messages matching the specified query. /// /// /// Sends a UID SORT command with the specified query passed directly to the IMAP server /// with no interpretation by MailKit. This means that the query may contain any arguments that a /// UID SORT command is allowed to have according to the IMAP specifications and any /// extensions that are supported, including RETURN parameters. /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The IMAP server does not support the SORT extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// Task SortAsync (string query, CancellationToken cancellationToken = default); } } ================================================ FILE: MailKit/Net/Imap/ImapAuthenticationSecretDetector.cs ================================================ // // ImapAuthenticationSecretDetector.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit.Net.Imap { class ImapAuthenticationSecretDetector : IAuthenticationSecretDetector { static readonly IList EmptyAuthSecrets = Array.Empty (); enum ImapAuthCommandState { None, Command, Authenticate, AuthMechanism, AuthNewLine, AuthToken, Login, UserName, Password, LoginNewLine, Error } enum ImapLoginTokenType { None, Atom, QString, Literal } enum ImapLiteralState { None, Octets, Plus, CloseBrace, Literal, Complete } enum ImapQStringState { None, Escaped, EndQuote, Complete } ImapAuthCommandState commandState; ImapLiteralState literalState; ImapQStringState qstringState; ImapLoginTokenType tokenType; bool isAuthenticating; int literalOctets; int literalSeen; int textIndex; public bool IsAuthenticating { get { return isAuthenticating; } set { commandState = ImapAuthCommandState.None; isAuthenticating = value; ClearLoginTokenState (); textIndex = 0; } } void ClearLoginTokenState () { literalState = ImapLiteralState.None; qstringState = ImapQStringState.None; tokenType = ImapLoginTokenType.None; literalOctets = 0; literalSeen = 0; } bool SkipText (string text, byte[] buffer, ref int index, int endIndex) { while (index < endIndex && textIndex < text.Length) { if (buffer[index] != (byte) text[textIndex]) { commandState = ImapAuthCommandState.Error; break; } textIndex++; index++; } return textIndex == text.Length; } IList DetectAuthSecrets (byte[] buffer, int offset, int endIndex) { int index = offset; if (commandState == ImapAuthCommandState.Authenticate) { if (SkipText ("AUTHENTICATE ", buffer, ref index, endIndex)) commandState = ImapAuthCommandState.AuthMechanism; if (index >= endIndex || commandState == ImapAuthCommandState.Error) return EmptyAuthSecrets; } if (commandState == ImapAuthCommandState.AuthMechanism) { while (index < endIndex && buffer[index] != (byte) ' ' && buffer[index] != (byte) '\r') index++; if (index < endIndex) { if (buffer[index] == (byte) ' ') { commandState = ImapAuthCommandState.AuthToken; } else { commandState = ImapAuthCommandState.AuthNewLine; } index++; } if (index >= endIndex) return EmptyAuthSecrets; } if (commandState == ImapAuthCommandState.AuthNewLine) { if (buffer[index] == (byte) '\n') { commandState = ImapAuthCommandState.AuthToken; index++; } else { commandState = ImapAuthCommandState.Error; } if (index >= endIndex || commandState == ImapAuthCommandState.Error) return EmptyAuthSecrets; } int startIndex = index; while (index < endIndex && buffer[index] != (byte) '\r') index++; if (index < endIndex) commandState = ImapAuthCommandState.AuthNewLine; if (index == startIndex) return EmptyAuthSecrets; var secret = new AuthenticationSecret (startIndex, index - startIndex); if (commandState == ImapAuthCommandState.AuthNewLine) { index++; if (index < endIndex) { if (buffer[index] == (byte) '\n') { commandState = ImapAuthCommandState.AuthToken; } else { commandState = ImapAuthCommandState.Error; } } } return new AuthenticationSecret[] { secret }; } bool SkipLiteralToken (List secrets, byte[] buffer, ref int index, int endIndex, byte sentinel) { if (literalState == ImapLiteralState.Octets) { while (index < endIndex && buffer[index] != (byte) '+' && buffer[index] != (byte) '}') { int digit = buffer[index] - (byte) '0'; literalOctets = literalOctets * 10 + digit; index++; } if (index < endIndex) { if (buffer[index] == (byte) '+') { literalState = ImapLiteralState.Plus; textIndex = 0; } else { literalState = ImapLiteralState.CloseBrace; textIndex = 1; } index++; } if (index >= endIndex) return false; } if (literalState < ImapLiteralState.Literal) { if (SkipText ("}\r\n", buffer, ref index, endIndex)) literalState = ImapLiteralState.Literal; } if (index >= endIndex || commandState == ImapAuthCommandState.Error) return false; if (literalState == ImapLiteralState.Literal) { int skip = Math.Min (literalOctets - literalSeen, endIndex - index); secrets.Add (new AuthenticationSecret (index, skip)); literalSeen += skip; index += skip; if (literalSeen == literalOctets) literalState = ImapLiteralState.Complete; } if (literalState == ImapLiteralState.Complete && index < endIndex && buffer[index] == sentinel) { index++; return true; } return false; } bool SkipLoginToken (List secrets, byte[] buffer, ref int index, int endIndex, byte sentinel) { int startIndex; if (tokenType == ImapLoginTokenType.None) { switch ((char) buffer[index]) { case '{': literalState = ImapLiteralState.Octets; tokenType = ImapLoginTokenType.Literal; index++; break; case '"': tokenType = ImapLoginTokenType.QString; index++; break; default: tokenType = ImapLoginTokenType.Atom; break; } } switch (tokenType) { case ImapLoginTokenType.Literal: return SkipLiteralToken (secrets, buffer, ref index, endIndex, sentinel); case ImapLoginTokenType.QString: if (qstringState != ImapQStringState.Complete) { startIndex = index; while (index < endIndex) { if (qstringState == ImapQStringState.Escaped) { qstringState = ImapQStringState.None; } else if (buffer[index] == (byte) '\\') { qstringState = ImapQStringState.Escaped; } else if (buffer[index] == (byte) '"') { qstringState = ImapQStringState.EndQuote; break; } index++; } if (index > startIndex) secrets.Add (new AuthenticationSecret (startIndex, index - startIndex)); if (qstringState == ImapQStringState.EndQuote) { qstringState = ImapQStringState.Complete; index++; } } if (index >= endIndex) return false; if (buffer[index] != sentinel) { commandState = ImapAuthCommandState.Error; return false; } index++; return true; default: startIndex = index; while (index < endIndex && buffer[index] != sentinel) index++; if (index > startIndex) secrets.Add (new AuthenticationSecret (startIndex, index - startIndex)); if (index >= endIndex) return false; index++; return true; } } IList DetectLoginSecrets (byte[] buffer, int offset, int endIndex) { var secrets = new List (); int index = offset; if (commandState == ImapAuthCommandState.LoginNewLine) return EmptyAuthSecrets; if (commandState == ImapAuthCommandState.Login) { if (SkipText ("LOGIN ", buffer, ref index, endIndex)) commandState = ImapAuthCommandState.UserName; if (index >= endIndex || commandState == ImapAuthCommandState.Error) return EmptyAuthSecrets; } if (commandState == ImapAuthCommandState.UserName) { if (SkipLoginToken (secrets, buffer, ref index, endIndex, (byte) ' ')) { commandState = ImapAuthCommandState.Password; ClearLoginTokenState (); } if (index >= endIndex || commandState == ImapAuthCommandState.Error) return secrets; } if (commandState == ImapAuthCommandState.Password) { if (SkipLoginToken (secrets, buffer, ref index, endIndex, (byte) '\r')) { commandState = ImapAuthCommandState.LoginNewLine; ClearLoginTokenState (); } } return secrets; } public IList DetectSecrets (byte[] buffer, int offset, int count) { if (!IsAuthenticating || commandState == ImapAuthCommandState.Error || count == 0) return EmptyAuthSecrets; int endIndex = offset + count; int index = offset; if (commandState == ImapAuthCommandState.None) { // skip over the tag while (index < endIndex && buffer[index] != (byte) ' ') index++; if (index < endIndex) { commandState = ImapAuthCommandState.Command; index++; } if (index >= endIndex) return EmptyAuthSecrets; } if (commandState == ImapAuthCommandState.Command) { switch ((char) buffer[index]) { case 'A': commandState = ImapAuthCommandState.Authenticate; textIndex = 1; index++; break; case 'L': commandState = ImapAuthCommandState.Login; textIndex = 1; index++; break; default: commandState = ImapAuthCommandState.Error; break; } if (index >= endIndex || commandState == ImapAuthCommandState.Error) return EmptyAuthSecrets; } if (commandState >= ImapAuthCommandState.Authenticate && commandState <= ImapAuthCommandState.AuthToken) return DetectAuthSecrets (buffer, index, endIndex); return DetectLoginSecrets (buffer, index, endIndex); } } } ================================================ FILE: MailKit/Net/Imap/ImapCallbacks.cs ================================================ // // ImapCallbacks.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.IO; using System.Threading; using System.Threading.Tasks; namespace MailKit.Net.Imap { /// /// A callback used when fetching message streams. /// /// /// This callback is meant to be used with the various /// GetStreams /// methods. /// Once this callback returns, the stream argument will be disposed, so /// it is important to consume the stream right away and not add it to a queue /// for later processing. /// /// The IMAP folder that the message belongs to. /// The index of the message in the folder. /// The UID of the message in the folder. /// The raw message (or part) stream. public delegate void ImapFetchStreamCallback (ImapFolder folder, int index, UniqueId uid, Stream stream); /// /// An asynchronous callback used when fetching message streams. /// /// /// This callback is meant to be used with the various /// GetStreamsAsync /// methods. /// Once this callback returns, the stream argument will be disposed, so /// it is important to consume the stream right away and not add it to a queue /// for later processing. /// /// An awaitable task context. /// The IMAP folder that the message belongs to. /// The index of the message in the folder. /// The UID of the message in the folder. /// The raw message (or part) stream. /// The cancellation token. public delegate Task ImapFetchStreamAsyncCallback (ImapFolder folder, int index, UniqueId uid, Stream stream, CancellationToken cancellationToken); } ================================================ FILE: MailKit/Net/Imap/ImapCapabilities.cs ================================================ // // ImapCapabilities.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://datatracker.ietf.org/doc/search/?name=IMAP&rfcs=on&activedrafts=on&by=group // TODO: rfc9208 and rfc9394 using System; namespace MailKit.Net.Imap { /// /// Capabilities supported by an IMAP server. /// /// /// Capabilities are read as part of the response to the CAPABILITY command that /// is issued during the connection and authentication phases of the /// . /// /// /// /// [Flags] public enum ImapCapabilities : ulong { /// /// The server does not support any additional extensions. /// None = 0, /// /// The server implements the core IMAP4 commands. /// IMAP4 = 1L << 0, /// /// The server implements the core IMAP4rev1 commands. /// IMAP4rev1 = 1L << 1, /// /// The server implements the core IMAP4rev2 commands described in rfc9051. /// IMAP4rev2 = 1L << 2, /// /// The server supports the STATUS command. /// Status = 1L << 3, /// /// The server supports the ACL extension defined in rfc2086 /// and rfc4314. /// Acl = 1L << 4, /// /// The server supports the QUOTA extension. /// Quota = 1L << 5, /// /// The server supports the LITERAL+ extension. /// LiteralPlus = 1L << 6, /// /// The server supports the IDLE extension. /// Idle = 1L << 7, /// /// The server supports the MAILBOX-REFERRALS extension. /// MailboxReferrals = 1L << 8, /// /// the server supports the LOGIN-REFERRALS extension. /// LoginReferrals = 1L << 9, /// /// The server supports the NAMESPACE extension. /// Namespace = 1L << 10, /// /// The server supports the ID extension. /// Id = 1L << 11, /// /// The server supports the CHILDREN extension. /// Children = 1L << 12, /// /// The server supports the LOGINDISABLED extension. /// LoginDisabled = 1L << 13, /// /// The server supports the STARTTLS extension. /// StartTLS = 1L << 14, /// /// The server supports the MULTIAPPEND extension. /// MultiAppend = 1L << 15, /// /// The server supports the BINARY content extension. /// Binary = 1L << 16, /// /// The server supports the UNSELECT extension. /// Unselect = 1L << 17, /// /// The server supports the UIDPLUS extension. /// UidPlus = 1L << 18, /// /// The server supports the CATENATE extension. /// Catenate = 1L << 19, /// /// The server supports the CONDSTORE extension. /// CondStore = 1L << 20, /// /// The server supports the ESEARCH extension. /// ESearch = 1L << 21, /// /// The server supports the SASL-IR extension. /// SaslIR = 1L << 22, /// /// The server supports the COMPRESS extension. /// Compress = 1L << 23, /// /// The server supports the WITHIN extension. /// Within = 1L << 24, /// /// The server supports the ENABLE extension. /// Enable = 1L << 25, /// /// The server supports the QRESYNC extension. /// QuickResync = 1L << 26, /// /// The server supports the SEARCHRES extension. /// SearchResults = 1L << 27, /// /// The server supports the SORT extension. /// Sort = 1L << 28, /// /// The server supports the THREAD extension. /// Thread = 1L << 29, /// /// The server supports the ANNOTATE extension. /// Annotate = 1L << 30, /// /// The server supports the LIST-EXTENDED extension. /// ListExtended = 1L << 31, /// /// The server supports the CONVERT extension. /// Convert = 1L << 32, /// /// The server supports the LANGUAGE extension. /// Language = 1L << 33, /// /// The server supports the I18NLEVEL extension. /// I18NLevel = 1L << 34, /// /// The server supports the ESORT extension. /// ESort = 1L << 35, /// /// The server supports the CONTEXT extension. /// Context = 1L << 36, /// /// The server supports the METADATA extension. /// Metadata = 1L << 37, /// /// The server supports the METADATA-SERVER extension. /// MetadataServer = 1L << 38, /// /// The server supports the NOTIFY extension. /// Notify = 1L << 39, /// /// The server supports the FILTERS extension. /// Filters = 1L << 40, /// /// The server supports the LIST-STATUS extension. /// ListStatus = 1L << 41, /// /// The server supports the SORT=DISPLAY extension. /// SortDisplay = 1L << 42, /// /// The server supports the CREATE-SPECIAL-USE extension. /// CreateSpecialUse = 1L << 43, /// /// The server supports the SPECIAL-USE extension. /// SpecialUse = 1L << 44, /// /// The server supports the SEARCH=FUZZY extension. /// FuzzySearch = 1L << 45, /// /// The server supports the MULTISEARCH extension. /// MultiSearch = 1L << 46, /// /// The server supports the MOVE extension. /// Move = 1L << 47, /// /// The server supports the UTF8=ACCEPT extension. /// UTF8Accept = 1L << 48, /// /// The server supports the UTF8=ONLY extension. /// UTF8Only = 1L << 49, /// /// The server supports the LITERAL- extension. /// LiteralMinus = 1L << 50, /// /// The server supports the APPENDLIMIT extension. /// AppendLimit = 1L << 51, /// /// The server supports the UNAUTHENTICATE extension. /// Unauthenticate = 1L << 52, /// /// The server supports the STATUS=SIZE extension. /// StatusSize = 1L << 53, /// /// The server supports the LIST-MYRIGHTS extension. /// ListMyRights = 1L << 54, /// /// The server supports the OBJECTID extension. /// ObjectID = 1L << 55, /// /// The server supports the REPLACE extension. /// Replace = 1L << 56, /// /// The server supports the SAVEDATE extension. /// SaveDate = 1L << 57, /// /// The server supports the PREVIEW extension. /// Preview = 1L << 58, #region GMail Extensions /// /// The server supports the XLIST extension (GMail). /// XList = 1L << 60, /// /// The server supports the X-GM-EXT1 extension (GMail). /// GMailExt1 = 1L << 61 #endregion } } ================================================ FILE: MailKit/Net/Imap/ImapClient.cs ================================================ // // ImapClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Net.Security; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Security.Authentication; using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography.X509Certificates; using MailKit.Security; using SslStream = MailKit.Net.SslStream; using AuthenticationException = MailKit.Security.AuthenticationException; namespace MailKit.Net.Imap { /// /// An IMAP client that can be used to retrieve messages from a server. /// /// /// The class supports both the "imap" and "imaps" /// protocols. The "imap" protocol makes a clear-text connection to the IMAP /// server and does not use SSL or TLS unless the IMAP server supports the /// STARTTLS extension. /// The "imaps" protocol, however, connects to the IMAP server using an /// SSL-wrapped connection. /// /// /// /// /// /// /// public partial class ImapClient : MailStore, IImapClient { static readonly char[] ReservedUriCharacters = { ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '%' }; const string HexAlphabet = "0123456789ABCDEF"; readonly ImapAuthenticationSecretDetector detector = new ImapAuthenticationSecretDetector (); readonly ImapEngine engine; SslCertificateValidationInfo? sslValidationInfo; int timeout = 2 * 60 * 1000; string? identifier; bool disconnecting; bool connecting; bool disposed; /// /// Initializes a new instance of the class. /// /// /// Before you can retrieve messages with the , you must first /// call one of the Connect /// methods and then authenticate with the one of the /// Authenticate /// methods. /// /// /// /// public ImapClient () : this (new NullProtocolLogger ()) { } /// /// Initializes a new instance of the class. /// /// /// Before you can retrieve messages with the , you must first /// call one of the Connect /// methods and then authenticate with the one of the /// Authenticate /// methods. /// /// /// /// /// The protocol logger. /// /// is . /// public ImapClient (IProtocolLogger protocolLogger) : base (protocolLogger) { protocolLogger.AuthenticationSecretDetector = detector; // FIXME: should this take a ParserOptions argument? engine = new ImapEngine (CreateImapFolder); engine.MetadataChanged += OnEngineMetadataChanged; engine.FolderCreated += OnEngineFolderCreated; engine.Disconnected += OnEngineDisconnected; engine.WebAlert += OnEngineWebAlert; engine.Alert += OnEngineAlert; } // Note: This is only needed for UnitTests. internal char TagPrefix { set { engine.TagPrefix = value; } } /// /// Gets an object that can be used to synchronize access to the IMAP server. /// /// /// Gets an object that can be used to synchronize access to the IMAP server. /// When using the non-Async methods from multiple threads, it is important to lock the /// object for thread safety when using the synchronous methods. /// /// The lock object. public override object SyncRoot { get { return engine; } } /// /// Get the protocol supported by the message service. /// /// /// Gets the protocol supported by the message service. /// /// The protocol. protected override string Protocol { get { return "imap"; } } /// /// Get the capabilities supported by the IMAP server. /// /// /// The capabilities will not be known until a successful connection has been made via one of /// the Connect methods and may /// change as a side-effect of calling one of the /// Authenticate /// methods. /// /// /// /// /// The capabilities. /// /// Capabilities cannot be enabled, they may only be disabled. /// public ImapCapabilities Capabilities { get { return engine.Capabilities; } set { if ((engine.Capabilities | value) > engine.Capabilities) throw new ArgumentException ("Capabilities cannot be enabled, they may only be disabled.", nameof (value)); engine.Capabilities = value; } } /// /// Get the maximum size of a message that can be appended to a folder. /// /// /// Gets the maximum size of a message, in bytes, that can be appended to a folder. /// If the value is not set, then the limit is unspecified. /// /// The append limit. public uint? AppendLimit { get { return engine.AppendLimit; } } /// /// Get the internationalization level supported by the IMAP server. /// /// /// Gets the internationalization level supported by the IMAP server. /// For more information, see /// section 4 of rfc5255. /// /// The internationalization level. public int InternationalizationLevel { get { return engine.I18NLevel; } } /// /// Get the access rights supported by the IMAP server. /// /// /// These rights are additional rights supported by the IMAP server beyond the standard rights /// defined in section 2.1 of rfc4314 /// and will not be populated until the client is successfully connected. /// /// /// /// /// The rights. public AccessRights Rights { get { return engine.Rights; } } void CheckDisposed () { if (disposed) throw new ObjectDisposedException (nameof (ImapClient)); } void CheckConnected () { if (!IsConnected) throw new ServiceNotConnectedException ("The ImapClient is not connected."); } void CheckAuthenticated () { if (!IsAuthenticated) throw new ServiceNotAuthenticatedException ("The ImapClient is not authenticated."); } /// /// Instantiate a new . /// /// /// Creates a new instance. /// This method's purpose is to allow subclassing . /// /// The IMAP folder instance. /// The constructor arguments. /// /// is . /// protected virtual ImapFolder CreateImapFolder (ImapFolderConstructorArgs args) { var folder = new ImapFolder (args); folder.UpdateAppendLimit (AppendLimit); return folder; } bool ValidateRemoteCertificate (object? sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) { var host = engine.Uri!.Host; bool valid; sslValidationInfo?.Dispose (); sslValidationInfo = null; if (ServerCertificateValidationCallback != null) { valid = ServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); #if NETFRAMEWORK } else if (ServicePointManager.ServerCertificateValidationCallback != null) { valid = ServicePointManager.ServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); #endif } else { valid = DefaultServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); } if (!valid) { // Note: The SslHandshakeException.Create() method will nullify this once it's done using it. sslValidationInfo = new SslCertificateValidationInfo (host, certificate, chain, sslPolicyErrors); } return valid; } ImapCommand QueueCompressCommand (CancellationToken cancellationToken) { CheckDisposed (); CheckConnected (); if ((engine.Capabilities & ImapCapabilities.Compress) == 0) throw new NotSupportedException ("The IMAP server does not support the COMPRESS extension."); if (engine.State >= ImapEngineState.Selected) throw new InvalidOperationException ("Compression must be enabled before selecting a folder."); #if MAILKIT_LITE throw new NotSupportedException ("MailKitLite does not support the COMPRESS extension."); #else return engine.QueueCommand (cancellationToken, null, "COMPRESS DEFLATE\r\n"); #endif } void ProcessCompressResponse (ImapCommand ic) { #if !MAILKIT_LITE if (ic.Response != ImapCommandResponse.Ok) { for (int i = 0; i < ic.RespCodes.Count; i++) { if (ic.RespCodes[i].Type == ImapResponseCodeType.CompressionActive) return; } throw ImapCommandException.Create ("COMPRESS", ic); } engine.Stream!.Stream = new CompressedStream (engine.Stream.Stream); #endif } /// /// Enable compression over the IMAP connection. /// /// /// Enables compression over the IMAP connection. /// If the IMAP server supports the extension, /// it is possible at any point after connecting to enable compression to reduce network /// bandwidth usage. Ideally, this method should be called before authenticating. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Compression must be enabled before a folder has been selected. /// /// /// The IMAP server does not support the extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the COMPRESS command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// public void Compress (CancellationToken cancellationToken = default) { var ic = QueueCompressCommand (cancellationToken); engine.Run (ic); ProcessCompressResponse (ic); } bool TryQueueEnableQuickResyncCommand (CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (engine.State != ImapEngineState.Authenticated) throw new InvalidOperationException ("QRESYNC needs to be enabled immediately after authenticating."); if ((engine.Capabilities & ImapCapabilities.QuickResync) == 0) throw new NotSupportedException ("The IMAP server does not support the QRESYNC extension."); if (engine.QResyncEnabled) { ic = null; return false; } ic = engine.QueueCommand (cancellationToken, null, "ENABLE QRESYNC CONDSTORE\r\n"); return true; } void ProcessEnableResponse (ImapCommand ic) { ic.ThrowIfNotOk ("ENABLE"); if (engine.QuirksMode == ImapQuirksMode.iCloud) { // Note: iCloud's response to the `ENABLE QRESYNC CONDSTORE` command does not include an untagged response // notifying us that QRESYNC or CONDSTORE have been enabled. Instead, if we get a tagged OK response, we // assume that these features were enabled successfully. // // See https://github.com/jstedfast/MailKit/issues/1871 for details. engine.QResyncEnabled = true; } } /// /// Enable the QRESYNC feature. /// /// /// Enables the QRESYNC feature. /// The QRESYNC extension improves resynchronization performance of folders by /// querying the IMAP server for a list of changes when the folder is opened using the /// /// method. /// If this feature is enabled, the event is replaced /// with the event. /// This method needs to be called immediately after calling one of the /// Authenticate methods, before /// opening any folders. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Quick resynchronization needs to be enabled before selecting a folder. /// /// /// The IMAP server does not support the QRESYNC extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ENABLE command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// public override void EnableQuickResync (CancellationToken cancellationToken = default) { if (!TryQueueEnableQuickResyncCommand (cancellationToken, out var ic)) return; engine.Run (ic); ProcessEnableResponse (ic); } bool TryQueueEnableUTF8Command (CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (engine.State != ImapEngineState.Authenticated) throw new InvalidOperationException ("UTF8=ACCEPT needs to be enabled immediately after authenticating."); if ((engine.Capabilities & ImapCapabilities.UTF8Accept) == 0) throw new NotSupportedException ("The IMAP server does not support the UTF8=ACCEPT extension."); if (engine.UTF8Enabled) { ic = null; return false; } ic = engine.QueueCommand (cancellationToken, null, "ENABLE UTF8=ACCEPT\r\n"); return true; } /// /// Enable the UTF8=ACCEPT extension. /// /// /// Enables the UTF8=ACCEPT extension. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// UTF8=ACCEPT needs to be enabled before selecting a folder. /// /// /// The IMAP server does not support the UTF8=ACCEPT extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ENABLE command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// public void EnableUTF8 (CancellationToken cancellationToken = default) { if (!TryQueueEnableUTF8Command (cancellationToken, out var ic)) return; engine.Run (ic); ProcessEnableResponse (ic); } ImapCommand QueueIdentifyCommand (ImapImplementation clientImplementation, CancellationToken cancellationToken) { CheckDisposed (); CheckConnected (); if ((engine.Capabilities & ImapCapabilities.Id) == 0) throw new NotSupportedException ("The IMAP server does not support the ID extension."); var command = new StringBuilder ("ID "); var args = new List (); if (clientImplementation != null && clientImplementation.Properties.Count > 0) { command.Append ('('); foreach (var property in clientImplementation.Properties) { command.Append ("%Q "); args.Add (property.Key); if (property.Value != null) { command.Append ("%Q "); args.Add (property.Value); } else { command.Append ("NIL "); } } command[command.Length - 1] = ')'; command.Append ("\r\n"); } else { command.Append ("NIL\r\n"); } var ic = new ImapCommand (engine, cancellationToken, null, command.ToString (), args.ToArray ()); ic.RegisterUntaggedHandler ("ID", ImapUtils.UntaggedIdHandler); engine.QueueCommand (ic); return ic; } static ImapImplementation ProcessIdentifyResponse (ImapCommand ic) { ic.ThrowIfNotOk ("ID"); return (ImapImplementation) ic.UserData!; } /// /// Identify the client implementation to the server and obtain the server implementation details. /// /// /// Passes along the client implementation details to the server while also obtaining implementation /// details from the server. /// If the is or no properties have been set, no /// identifying information will be sent to the server. /// /// Security Implications /// This command has the danger of violating the privacy of users if misused. Clients should /// notify users that they send the ID command. /// It is highly desirable that implementations provide a method of disabling ID support, perhaps by /// not calling this method at all, or by passing as the /// argument. /// Implementors must exercise extreme care in adding properties to the . /// Some properties, such as a processor ID number, Ethernet address, or other unique (or mostly unique) identifier /// would allow tracking of users in ways that violate user privacy expectations and may also make it easier for /// attackers to exploit security holes in the client. /// /// /// /// /// /// The implementation details of the server if available; otherwise, . /// The client implementation. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The IMAP server does not support the ID extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the ID command with a NO or BAD response. /// /// /// An IMAP protocol error occurred. /// public ImapImplementation Identify (ImapImplementation clientImplementation, CancellationToken cancellationToken = default) { var ic = QueueIdentifyCommand (clientImplementation, cancellationToken); engine.Run (ic); return ProcessIdentifyResponse (ic); } #region IMailService implementation /// /// Get the authentication mechanisms supported by the IMAP server. /// /// /// The authentication mechanisms are queried as part of the /// Connect /// method. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before authenticating. /// /// /// /// /// The authentication mechanisms. public override HashSet AuthenticationMechanisms { get { return engine.AuthenticationMechanisms; } } /// /// Get the threading algorithms supported by the IMAP server. /// /// /// The threading algorithms are queried as part of the /// Connect /// and Authenticate methods. /// /// /// /// /// The supported threading algorithms. public override HashSet ThreadingAlgorithms { get { return engine.ThreadingAlgorithms; } } /// /// Get or set the timeout for network streaming operations, in milliseconds. /// /// /// Gets or sets the underlying socket stream's /// and values. /// /// The timeout in milliseconds. public override int Timeout { get { return timeout; } set { if (engine.IsConnected && engine.Stream.CanTimeout) { engine.Stream.WriteTimeout = value; engine.Stream.ReadTimeout = value; } timeout = value; } } /// /// Get whether or not the client is currently connected to an IMAP server. /// /// /// The state is set to immediately after /// one of the Connect /// methods succeeds and is not set back to until either the client /// is disconnected via or until an /// is thrown while attempting to read or write to /// the underlying network socket. /// When an is caught, the connection state of the /// should be checked before continuing. /// /// if the client is connected; otherwise, . public override bool IsConnected { get { return engine.IsConnected; } } /// /// Get whether or not the connection is secure (typically via SSL or TLS). /// /// /// Gets whether or not the connection is secure (typically via SSL or TLS). /// /// if the connection is secure; otherwise, . public override bool IsSecure { get { return engine.IsSecure; } } /// /// Get whether or not the connection is encrypted (typically via SSL or TLS). /// /// /// Gets whether or not the connection is encrypted (typically via SSL or TLS). /// /// if the connection is encrypted; otherwise, . public override bool IsEncrypted { get { return engine.IsSecure && (engine.Stream.Stream is SslStream sslStream) && sslStream.IsEncrypted; } } /// /// Get whether or not the connection is signed (typically via SSL or TLS). /// /// /// Gets whether or not the connection is signed (typically via SSL or TLS). /// /// if the connection is signed; otherwise, . public override bool IsSigned { get { return engine.IsSecure && (engine.Stream.Stream is SslStream sslStream) && sslStream.IsSigned; } } /// /// Get the negotiated SSL or TLS protocol version. /// /// /// Gets the negotiated SSL or TLS protocol version once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS protocol version. public override SslProtocols SslProtocol { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.SslProtocol; return SslProtocols.None; } } /// /// Get the negotiated SSL or TLS cipher algorithm. /// /// /// Gets the negotiated SSL or TLS cipher algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS cipher algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override CipherAlgorithmType? SslCipherAlgorithm { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.CipherAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS cipher algorithm strength. /// /// /// Gets the negotiated SSL or TLS cipher algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS cipher algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslCipherStrength { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.CipherStrength; return null; } } #if NET5_0_OR_GREATER /// /// Get the negotiated SSL or TLS cipher suite. /// /// /// Gets the negotiated SSL or TLS cipher suite once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher suite. public override TlsCipherSuite? SslCipherSuite { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.NegotiatedCipherSuite; return null; } } #endif /// /// Get the negotiated SSL or TLS hash algorithm. /// /// /// Gets the negotiated SSL or TLS hash algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS hash algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override HashAlgorithmType? SslHashAlgorithm { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.HashAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS hash algorithm strength. /// /// /// Gets the negotiated SSL or TLS hash algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS hash algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslHashStrength { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.HashStrength; return null; } } /// /// Get the negotiated SSL or TLS key exchange algorithm. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS key exchange algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override ExchangeAlgorithmType? SslKeyExchangeAlgorithm { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.KeyExchangeAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS key exchange algorithm strength. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS key exchange algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslKeyExchangeStrength { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.KeyExchangeStrength; return null; } } /// /// Get whether or not the client is currently authenticated with the IMAP server. /// /// /// Gets whether or not the client is currently authenticated with the IMAP server. /// To authenticate with the IMAP server, use one of the /// Authenticate /// methods. /// /// if the client is connected; otherwise, . public override bool IsAuthenticated { get { return engine.State >= ImapEngineState.Authenticated; } } /// /// Get whether or not the client is currently in the IDLE state. /// /// /// Gets whether or not the client is currently in the IDLE state. /// /// if an IDLE command is active; otherwise, . public bool IsIdle { get { return engine.State == ImapEngineState.Idle; } } static AuthenticationException CreateAuthenticationException (ImapCommand ic) { for (int i = 0; i < ic.RespCodes.Count; i++) { if (ic.RespCodes[i].IsError || ic.RespCodes[i].Type == ImapResponseCodeType.Alert) return new AuthenticationException (ic.RespCodes[i].Message); } if (ic.ResponseText != null) return new AuthenticationException (ic.ResponseText); return new AuthenticationException (); } void EmitAndThrowOnAlert (ImapCommand ic) { for (int i = 0; i < ic.RespCodes.Count; i++) { if (ic.RespCodes[i].Type != ImapResponseCodeType.Alert) continue; OnAlert (ic.RespCodes[i].Message); throw new AuthenticationException (ic.ResponseText ?? ic.RespCodes[i].Message); } } static bool IsHexDigit (char c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } static uint HexUnescape (uint c) { if (c >= 'a') return (c - 'a') + 10; if (c >= 'A') return (c - 'A') + 10; return c - '0'; } static char HexUnescape (string pattern, ref int index) { uint value, c; if (pattern[index++] != '%' || !IsHexDigit (pattern[index]) || !IsHexDigit (pattern[index + 1])) return '%'; c = (uint) pattern[index++]; value = HexUnescape (c) << 4; c = pattern[index++]; value |= HexUnescape (c); return (char) value; } internal static string UnescapeUserName (string escaped) { int index; if ((index = escaped.IndexOf ('%')) == -1) return escaped; var userName = new StringBuilder (escaped.Length); int startIndex = 0; do { userName.Append (escaped, startIndex, index - startIndex); userName.Append (HexUnescape (escaped, ref index)); startIndex = index; if (startIndex >= escaped.Length) break; index = escaped.IndexOf ('%', startIndex); } while (index != -1); if (index == -1) userName.Append (escaped, startIndex, escaped.Length - startIndex); return userName.ToString (); } static void HexEscape (StringBuilder builder, char c) { builder.Append ('%'); builder.Append (HexAlphabet[(c >> 4) & 0xF]); builder.Append (HexAlphabet[c & 0xF]); } internal static void EscapeUserName (StringBuilder builder, string userName) { int index = userName.IndexOfAny (ReservedUriCharacters); int startIndex = 0; while (index != -1) { builder.Append (userName, startIndex, index - startIndex); HexEscape (builder, userName[index++]); startIndex = index; if (startIndex >= userName.Length) break; index = userName.IndexOfAny (ReservedUriCharacters, startIndex); } builder.Append (userName, startIndex, userName.Length - startIndex); } string GetSessionIdentifier (string userName) { var builder = new StringBuilder (); var uri = engine.Uri!; builder.Append (uri.Scheme); builder.Append ("://"); EscapeUserName (builder, userName); builder.Append ('@'); builder.Append (uri.Host); builder.Append (':'); builder.Append (uri.Port.ToString (CultureInfo.InvariantCulture)); return builder.ToString (); } void OnAuthenticated (string message, CancellationToken cancellationToken) { engine.QueryNamespaces (cancellationToken); engine.QuerySpecialFolders (cancellationToken); OnAuthenticated (message); } void CheckCanAuthenticate (SaslMechanism mechanism, CancellationToken cancellationToken) { if (mechanism == null) throw new ArgumentNullException (nameof (mechanism)); CheckDisposed (); CheckConnected (); if (engine.State >= ImapEngineState.Authenticated) throw new InvalidOperationException ("The ImapClient is already authenticated."); cancellationToken.ThrowIfCancellationRequested (); } void ConfigureSaslMechanism (SaslMechanism mechanism, Uri uri) { mechanism.ChannelBindingContext = engine.Stream!.Stream as IChannelBindingContext; mechanism.Uri = uri; } void ConfigureSaslMechanism (SaslMechanism mechanism) { var uri = new Uri ("imap://" + engine.Uri!.Host); ConfigureSaslMechanism (mechanism, uri); } void ProcessAuthenticateResponse (ImapCommand ic, SaslMechanism mechanism) { if (ic.Response != ImapCommandResponse.Ok) { EmitAndThrowOnAlert (ic); throw new AuthenticationException (); } engine.State = ImapEngineState.Authenticated; var id = GetSessionIdentifier (mechanism.Credentials.UserName); if (id != identifier) { engine.FolderCache.Clear (); identifier = id; } } /// /// Authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override void Authenticate (SaslMechanism mechanism, CancellationToken cancellationToken = default) { CheckCanAuthenticate (mechanism, cancellationToken); int capabilitiesVersion = engine.CapabilitiesVersion; ImapCommand? ic = null; ConfigureSaslMechanism (mechanism); var command = string.Format ("AUTHENTICATE {0}", mechanism.MechanismName); if ((engine.Capabilities & ImapCapabilities.SaslIR) != 0 && mechanism.SupportsInitialResponse) { string ir = mechanism.Challenge (null, cancellationToken); command += " " + ir + "\r\n"; } else { command += "\r\n"; } ic = engine.QueueCommand (cancellationToken, null, command); ic.ContinuationHandler = (imap, cmd, text, xdoAsync) => { string challenge = mechanism.Challenge (text, cmd.CancellationToken); var buf = Encoding.ASCII.GetBytes (challenge + "\r\n"); imap.Stream!.Write (buf, 0, buf.Length, cmd.CancellationToken); imap.Stream.Flush (cmd.CancellationToken); return Task.CompletedTask; }; using var operation = engine.StartNetworkOperation (NetworkOperationKind.Authenticate); try { detector.IsAuthenticating = true; try { engine.Run (ic); } finally { detector.IsAuthenticating = false; } ProcessAuthenticateResponse (ic, mechanism); // Query the CAPABILITIES again if the server did not include an // untagged CAPABILITIES response to the AUTHENTICATE command. if (engine.CapabilitiesVersion == capabilitiesVersion) engine.QueryCapabilities (cancellationToken); OnAuthenticated (ic.ResponseText ?? string.Empty, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } void CheckCanAuthenticate (Encoding encoding, ICredentials credentials) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); if (credentials == null) throw new ArgumentNullException (nameof (credentials)); CheckDisposed (); CheckConnected (); if (engine.State >= ImapEngineState.Authenticated) throw new InvalidOperationException ("The ImapClient is already authenticated."); } void CheckCanLogin (ImapCommand? ic) { if ((Capabilities & ImapCapabilities.LoginDisabled) != 0) { if (ic == null) throw new AuthenticationException ("The LOGIN command is disabled."); throw CreateAuthenticationException (ic); } } /// /// Authenticate using the supplied credentials. /// /// /// Authenticates using the supplied credentials. /// If the IMAP server supports one or more SASL authentication mechanisms, /// then the SASL mechanisms that both the client and server support (not including /// any OAUTH mechanisms) are tried in order of greatest security to weakest security. /// Once a SASL authentication mechanism is found that both client and server support, /// the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then LOGIN command is used as a fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// The text encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override void Authenticate (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default) { CheckCanAuthenticate (encoding, credentials); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Authenticate); try { int capabilitiesVersion = engine.CapabilitiesVersion; var uri = new Uri ("imap://" + engine.Uri!.Host); NetworkCredential? cred; ImapCommand? ic = null; SaslMechanism? sasl; string id; foreach (var authmech in SaslMechanism.Rank (engine.AuthenticationMechanisms)) { cred = credentials.GetCredential (uri, authmech); if (cred == null || (sasl = SaslMechanism.Create (authmech, encoding, cred)) == null) continue; ConfigureSaslMechanism (sasl, uri); cancellationToken.ThrowIfCancellationRequested (); var command = string.Format ("AUTHENTICATE {0}", sasl.MechanismName); if ((engine.Capabilities & ImapCapabilities.SaslIR) != 0 && sasl.SupportsInitialResponse) { string ir = sasl.Challenge (null, cancellationToken); command += " " + ir + "\r\n"; } else { command += "\r\n"; } ic = engine.QueueCommand (cancellationToken, null, command); ic.ContinuationHandler = (imap, cmd, text, xdoAsync) => { string challenge = sasl.Challenge (text, cmd.CancellationToken); var buf = Encoding.ASCII.GetBytes (challenge + "\r\n"); imap.Stream!.Write (buf, 0, buf.Length, cmd.CancellationToken); imap.Stream.Flush (cmd.CancellationToken); return Task.CompletedTask; }; detector.IsAuthenticating = true; try { engine.Run (ic); } finally { detector.IsAuthenticating = false; } if (ic.Response != ImapCommandResponse.Ok) { EmitAndThrowOnAlert (ic); if (ic.Bye) throw ImapProtocolException.Create (ic); continue; } engine.State = ImapEngineState.Authenticated; id = GetSessionIdentifier (cred.UserName); if (id != identifier) { engine.FolderCache.Clear (); identifier = id; } // Query the CAPABILITIES again if the server did not include an // untagged CAPABILITIES response to the AUTHENTICATE command. if (engine.CapabilitiesVersion == capabilitiesVersion) engine.QueryCapabilities (cancellationToken); OnAuthenticated (ic.ResponseText ?? string.Empty, cancellationToken); return; } CheckCanLogin (ic); // fall back to the classic LOGIN command... if ((cred = credentials.GetCredential (uri, "DEFAULT")) == null) throw new AuthenticationException ("No credentials could be found for the IMAP server."); ic = engine.QueueCommand (cancellationToken, null, "LOGIN %S %S\r\n", cred.UserName, cred.Password); detector.IsAuthenticating = true; try { engine.Run (ic); } finally { detector.IsAuthenticating = false; } if (ic.Response != ImapCommandResponse.Ok) throw CreateAuthenticationException (ic); engine.State = ImapEngineState.Authenticated; id = GetSessionIdentifier (cred.UserName); if (id != identifier) { engine.FolderCache.Clear (); identifier = id; } // Query the CAPABILITIES again if the server did not include an // untagged CAPABILITIES response to the LOGIN command. if (engine.CapabilitiesVersion == capabilitiesVersion) engine.QueryCapabilities (cancellationToken); OnAuthenticated (ic.ResponseText ?? string.Empty, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } internal static void ComputeDefaultValues (string host, ref int port, ref SecureSocketOptions options, out Uri uri, out bool starttls) { switch (options) { default: if (port == 0) port = 143; break; case SecureSocketOptions.Auto: switch (port) { case 0: port = 143; goto default; case 993: options = SecureSocketOptions.SslOnConnect; break; default: options = SecureSocketOptions.StartTlsWhenAvailable; break; } break; case SecureSocketOptions.SslOnConnect: if (port == 0) port = 993; break; } if (IPAddress.TryParse (host, out var ip) && ip.AddressFamily == AddressFamily.InterNetworkV6) host = "[" + host + "]"; switch (options) { case SecureSocketOptions.StartTlsWhenAvailable: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "imap://{0}:{1}/?starttls=when-available", host, port)); starttls = true; break; case SecureSocketOptions.StartTls: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "imap://{0}:{1}/?starttls=always", host, port)); starttls = true; break; case SecureSocketOptions.SslOnConnect: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "imaps://{0}:{1}", host, port)); starttls = false; break; default: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "imap://{0}:{1}", host, port)); starttls = false; break; } } void CheckCanConnect (string host, int port) { if (host == null) throw new ArgumentNullException (nameof (host)); if (host.Length == 0) throw new ArgumentException ("The host name cannot be empty.", nameof (host)); if (port < 0 || port > 65535) throw new ArgumentOutOfRangeException (nameof (port)); CheckDisposed (); if (IsConnected) throw new InvalidOperationException ("The ImapClient is already connected."); } void SslHandshake (SslStream ssl, string host, CancellationToken cancellationToken) { #if NET5_0_OR_GREATER ssl.AuthenticateAsClient (GetSslClientAuthenticationOptions (host, ValidateRemoteCertificate)); #else ssl.AuthenticateAsClient (host, ClientCertificates, SslProtocols, CheckCertificateRevocation); #endif } void PostConnect (Stream stream, string host, int port, SecureSocketOptions options, bool starttls, CancellationToken cancellationToken) { try { ProtocolLogger.LogConnect (engine.Uri!); } catch { stream.Dispose (); throw; } connecting = true; var imap = new ImapStream (stream, ProtocolLogger); try { engine.Connect (imap, cancellationToken); } catch { connecting = false; throw; } try { // Only query the CAPABILITIES if the greeting didn't include them. if (engine.CapabilitiesVersion == 0) engine.QueryCapabilities (cancellationToken); if (options == SecureSocketOptions.StartTls && (engine.Capabilities & ImapCapabilities.StartTLS) == 0) throw new NotSupportedException ("The IMAP server does not support the STARTTLS extension."); if (starttls && (engine.Capabilities & ImapCapabilities.StartTLS) != 0) { var ic = engine.QueueCommand (cancellationToken, null, "STARTTLS\r\n"); engine.Run (ic); if (ic.Response == ImapCommandResponse.Ok) { try { var tls = new SslStream (stream, false, ValidateRemoteCertificate); imap.Stream = tls; SslHandshake (tls, host, cancellationToken); } catch (Exception ex) { throw SslHandshakeException.Create (ref sslValidationInfo, ex, true, "IMAP", host, port, 993, 143); } engine.IsSecure = true; // Query the CAPABILITIES again if the server did not include an // untagged CAPABILITIES response to the STARTTLS command. if (engine.CapabilitiesVersion == 1) engine.QueryCapabilities (cancellationToken); } else if (options == SecureSocketOptions.StartTls) { throw ImapCommandException.Create ("STARTTLS", ic); } } } catch (Exception ex) { engine.Disconnect (ex); throw; } finally { connecting = false; } // Note: we capture the state here in case someone calls Authenticate() from within the Connected event handler. var authenticated = engine.State == ImapEngineState.Authenticated; OnConnected (host, port, options); if (authenticated) OnAuthenticated (string.Empty, cancellationToken); } /// /// Establish a connection to the specified IMAP server. /// /// /// Establishes a connection to the specified IMAP or IMAP/S server. /// If the has a value of 0, then the /// parameter is used to determine the default port to /// connect to. The default port used with /// is 993. All other values will use a default port of 143. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 993, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// /// /// /// /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the IMAP server does not support the STARTTLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override void Connect (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (host, port); ComputeDefaultValues (host, ref port, ref options, out var uri, out var starttls); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Connect, uri); try { var stream = ConnectNetwork (host, port, cancellationToken); stream.WriteTimeout = timeout; stream.ReadTimeout = timeout; engine.Uri = uri; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { SslHandshake (ssl, host, cancellationToken); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "IMAP", host, port, 993, 143); } stream = ssl; } PostConnect (stream, host, port, options, starttls, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } void CheckCanConnect (Stream stream, string host, int port) { if (stream == null) throw new ArgumentNullException (nameof (stream)); CheckCanConnect (host, port); } void CheckCanConnect (Socket socket, string host, int port) { if (socket == null) throw new ArgumentNullException (nameof (socket)); if (!socket.Connected) throw new ArgumentException ("The socket is not connected.", nameof (socket)); CheckCanConnect (host, port); } /// /// Establish a connection to the specified IMAP or IMAP/S server using the provided socket. /// /// /// Establishes a connection to the specified IMAP or IMAP/S server using /// the provided socket. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 993, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the IMAP server does not support the STARTTLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override void Connect (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (socket, host, port); Connect (new NetworkStream (socket, true), host, port, options, cancellationToken); } /// /// Establish a connection to the specified IMAP or IMAP/S server using the provided stream. /// /// /// Establishes a connection to the specified IMAP or IMAP/S server using /// the provided stream. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 993, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the IMAP server does not support the STARTTLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP command failed. /// /// /// An IMAP protocol error occurred. /// public override void Connect (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (stream, host, port); ComputeDefaultValues (host, ref port, ref options, out var uri, out var starttls); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Connect, uri); try { Stream network; engine.Uri = uri; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { SslHandshake (ssl, host, cancellationToken); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "IMAP", host, port, 993, 143); } network = ssl; } else { network = stream; } if (network.CanTimeout) { network.WriteTimeout = timeout; network.ReadTimeout = timeout; } PostConnect (network, host, port, options, starttls, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Disconnect the service. /// /// /// If is , a LOGOUT command will be issued in order to disconnect cleanly. /// /// /// /// /// If set to , a LOGOUT command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// public override void Disconnect (bool quit, CancellationToken cancellationToken = default) { CheckDisposed (); if (!engine.IsConnected) return; if (quit) { try { var ic = engine.QueueCommand (cancellationToken, null, "LOGOUT\r\n"); engine.Run (ic); } catch (OperationCanceledException) { } catch (ImapProtocolException) { } catch (ImapCommandException) { } catch (IOException) { } } disconnecting = true; engine.Disconnect (null); } ImapCommand QueueNoOpCommand (CancellationToken cancellationToken) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return engine.QueueCommand (cancellationToken, null, "NOOP\r\n"); } static void ProcessNoOpResponse (ImapCommand ic) { ic.ThrowIfNotOk ("NOOP"); } /// /// Ping the IMAP server to keep the connection alive. /// /// /// The NOOP command is typically used to keep the connection with the IMAP server /// alive. When a client goes too long (typically 30 minutes) without sending any commands to the /// IMAP server, the IMAP server will close the connection with the client, forcing the client to /// reconnect before it can send any more commands. /// The NOOP command also provides a great way for a client to check for new /// messages. /// When the IMAP server receives a NOOP command, it will reply to the client with a /// list of pending updates such as EXISTS and RECENT counts on the currently /// selected folder. To receive these notifications, subscribe to the /// and events, /// respectively. /// For more information about the NOOP command, see /// rfc3501. /// /// /// /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOOP command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public override void NoOp (CancellationToken cancellationToken = default) { var ic = QueueNoOpCommand (cancellationToken); engine.Run (ic); ProcessNoOpResponse (ic); } void CheckCanIdle (CancellationToken doneToken) { if (!doneToken.CanBeCanceled) throw new ArgumentException ("The doneToken must be cancellable.", nameof (doneToken)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); if ((engine.Capabilities & ImapCapabilities.Idle) == 0) throw new NotSupportedException ("The IMAP server does not support the IDLE extension."); if (engine.State != ImapEngineState.Selected) throw new InvalidOperationException ("An ImapFolder has not been opened."); } ImapCommand QueueIdleCommand (ImapIdleContext context, CancellationToken cancellationToken) { var ic = engine.QueueCommand (cancellationToken, null, "IDLE\r\n"); ic.ContinuationHandler = context.ContinuationHandler; ic.UserData = context; return ic; } static void ProcessIdleResponse (ImapCommand ic) { ic.ThrowIfNotOk ("IDLE"); } /// /// Toggle the into the IDLE state. /// /// /// When a client enters the IDLE state, the IMAP server will send /// events to the client as they occur on the selected folder. These events /// may include notifications of new messages arriving, expunge notifications, /// flag changes, etc. /// Due to the nature of the IDLE command, a folder must be selected /// before a client can enter into the IDLE state. This can be done by /// opening a folder using /// /// or any of the other variants. /// While the IDLE command is running, no other commands may be issued until the /// is cancelled. /// It is especially important to cancel the /// before cancelling the when using SSL or TLS due to /// the fact that cannot be polled. /// /// /// /// /// The cancellation token used to return to the non-idle state. /// The cancellation token. /// /// must be cancellable (i.e. cannot be used). /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// A has not been opened. /// /// /// The IMAP server does not support the IDLE extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the IDLE command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public void Idle (CancellationToken doneToken, CancellationToken cancellationToken = default) { CheckCanIdle (doneToken); if (doneToken.IsCancellationRequested) return; using (var context = new ImapIdleContext (engine, doneToken, cancellationToken)) { var ic = QueueIdleCommand (context, cancellationToken); engine.Run (ic); ProcessIdleResponse (ic); } } ImapCommand QueueNotifyCommand (bool status, IList eventGroups, CancellationToken cancellationToken, out bool notifySelectedNewExpunge) { if (eventGroups == null) throw new ArgumentNullException (nameof (eventGroups)); if (eventGroups.Count == 0) throw new ArgumentException ("No event groups specified.", nameof (eventGroups)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); if ((engine.Capabilities & ImapCapabilities.Notify) == 0) throw new NotSupportedException ("The IMAP server does not support the NOTIFY extension."); notifySelectedNewExpunge = false; var command = new StringBuilder ("NOTIFY SET"); var args = new List (); if (status) command.Append (" STATUS"); foreach (var group in eventGroups) { command.Append (' '); group.Format (engine, command, args, ref notifySelectedNewExpunge); } command.Append ("\r\n"); var ic = new ImapCommand (engine, cancellationToken, null, command.ToString (), args.ToArray ()); engine.QueueCommand (ic); return ic; } void ProcessNotifyResponse (ImapCommand ic, bool notifySelectedNewExpunge) { ic.ThrowIfNotOk ("NOTIFY"); engine.NotifySelectedNewExpunge = notifySelectedNewExpunge; } /// /// Request the specified notification events from the IMAP server. /// /// /// The NOTIFY command is used to expand /// which notifications the client wishes to be notified about, including status notifications /// about folders other than the currently selected folder. It can also be used to automatically /// FETCH information about new messages that have arrived in the currently selected folder. /// This, combined with , /// can be used to get instant notifications for changes to any of the specified folders. /// /// if the server should immediately notify the client of the /// selected folder's status; otherwise, . /// The specific event groups that the client would like to receive notifications for. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// One or more is invalid. /// /// /// The IMAP server does not support the NOTIFY extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOTIFY command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public void Notify (bool status, IList eventGroups, CancellationToken cancellationToken = default) { var ic = QueueNotifyCommand (status, eventGroups, cancellationToken, out bool notifySelectedNewExpunge); engine.Run (ic); ProcessNotifyResponse (ic, notifySelectedNewExpunge); } ImapCommand QueueDisableNotifyCommand (CancellationToken cancellationToken) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if ((engine.Capabilities & ImapCapabilities.Notify) == 0) throw new NotSupportedException ("The IMAP server does not support the NOTIFY extension."); var ic = new ImapCommand (engine, cancellationToken, null, "NOTIFY NONE\r\n"); engine.QueueCommand (ic); return ic; } /// /// Disable any previously requested notification events from the IMAP server. /// /// /// Disables any notification events requested in a prior call to /// . /// request. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the NOTIFY extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server replied to the NOTIFY command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public void DisableNotify (CancellationToken cancellationToken = default) { var ic = QueueDisableNotifyCommand (cancellationToken); engine.Run (ic); ProcessNotifyResponse (ic, false); } #endregion #region IMailStore implementation /// /// Get the personal namespaces. /// /// /// The personal folder namespaces contain a user's personal mailbox folders. /// /// /// /// /// The personal namespaces. public override FolderNamespaceCollection PersonalNamespaces { get { return engine.PersonalNamespaces; } } /// /// Get the shared namespaces. /// /// /// The shared folder namespaces contain mailbox folders that are shared with the user. /// /// /// /// /// The shared namespaces. public override FolderNamespaceCollection SharedNamespaces { get { return engine.SharedNamespaces; } } /// /// Get the other namespaces. /// /// /// The other folder namespaces contain other mailbox folders. /// /// /// /// /// The other namespaces. public override FolderNamespaceCollection OtherNamespaces { get { return engine.OtherNamespaces; } } /// /// Get whether or not the mail store supports quotas. /// /// /// Gets whether or not the mail store supports quotas. /// /// if the mail store supports quotas; otherwise, . public override bool SupportsQuotas { get { return (engine.Capabilities & ImapCapabilities.Quota) != 0; } } /// /// Get the Inbox folder. /// /// /// The Inbox folder is the default folder and always exists on the server. /// This property will only be available after the client has been authenticated. /// /// /// /// /// The Inbox folder. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// public override IMailFolder? Inbox { get { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return engine.Inbox; } } /// /// Get the specified special folder. /// /// /// Not all IMAP servers support special folders. Only IMAP servers /// supporting the or /// extensions may have /// special folders. /// /// The folder if available; otherwise . /// The type of special folder. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the SPECIAL-USE nor XLIST extensions. /// public override IMailFolder? GetFolder (SpecialFolder folder) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if ((Capabilities & (ImapCapabilities.SpecialUse | ImapCapabilities.XList)) == 0) throw new NotSupportedException ("The IMAP server does not support the SPECIAL-USE nor XLIST extensions."); switch (folder) { case SpecialFolder.All: return engine.All; case SpecialFolder.Archive: return engine.Archive; case SpecialFolder.Drafts: return engine.Drafts; case SpecialFolder.Flagged: return engine.Flagged; case SpecialFolder.Important: return engine.Important; case SpecialFolder.Junk: return engine.Junk; case SpecialFolder.Sent: return engine.Sent; case SpecialFolder.Trash: return engine.Trash; default: throw new ArgumentOutOfRangeException (nameof (folder)); } } /// /// Get the folder for the specified namespace. /// /// /// Gets the folder for the specified namespace. /// /// /// /// /// The folder. /// The namespace. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder could not be found. /// public override IMailFolder GetFolder (FolderNamespace @namespace) { if (@namespace == null) throw new ArgumentNullException (nameof (@namespace)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); var encodedName = engine.EncodeMailboxName (@namespace.Path); if (engine.TryGetCachedFolder (encodedName, out var folder)) return folder; throw new FolderNotFoundException (@namespace.Path); } /// /// Get all of the folders within the specified namespace. /// /// /// Gets all of the folders within the specified namespace. /// /// The folders. /// The namespace. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The namespace folder could not be found. /// /// /// An I/O error occurred. /// /// /// The server replied to the LIST or LSUB command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public override IList GetFolders (FolderNamespace @namespace, StatusItems items = StatusItems.None, bool subscribedOnly = false, CancellationToken cancellationToken = default) { if (@namespace == null) throw new ArgumentNullException (nameof (@namespace)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); return engine.GetFolders (@namespace, items, subscribedOnly, cancellationToken); } /// /// Get the folder for the specified path. /// /// /// Gets the folder for the specified path. /// /// The folder. /// The folder path. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The folder could not be found. /// /// /// An I/O error occurred. /// /// /// The server replied to the LIST command with a NO or BAD response. /// /// /// The server responded with an unexpected token. /// public override IMailFolder GetFolder (string path, CancellationToken cancellationToken = default) { if (path == null) throw new ArgumentNullException (nameof (path)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); return engine.GetFolder (path, cancellationToken); } ImapCommand QueueGetMetadataCommand (MetadataTag tag, CancellationToken cancellationToken) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if ((engine.Capabilities & (ImapCapabilities.Metadata | ImapCapabilities.MetadataServer)) == 0) throw new NotSupportedException ("The IMAP server does not support the METADATA extension."); var ic = new ImapCommand (engine, cancellationToken, null, "GETMETADATA \"\" %S\r\n", tag.Id); ic.RegisterUntaggedHandler ("METADATA", ImapUtils.UntaggedMetadataHandler); var metadata = new MetadataCollection (); ic.UserData = metadata; engine.QueueCommand (ic); return ic; } string? ProcessGetMetadataResponse (ImapCommand ic, MetadataTag tag) { ic.ThrowIfNotOk ("GETMETADATA"); var metadata = (MetadataCollection) ic.UserData!; string? value = null; for (int i = 0; i < metadata.Count; i++) { if (metadata[i].EncodedName.Length == 0 && metadata[i].Tag.Id == tag.Id) { value = metadata[i].Value; metadata.RemoveAt (i); break; } } engine.ProcessMetadataChanges (metadata); return value; } /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA or METADATA-SERVER extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override string? GetMetadata (MetadataTag tag, CancellationToken cancellationToken = default) { var ic = QueueGetMetadataCommand (tag, cancellationToken); engine.Run (ic); return ProcessGetMetadataResponse (ic, tag); } bool TryQueueGetMetadataCommand (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic) { if (options == null) throw new ArgumentNullException (nameof (options)); if (tags == null) throw new ArgumentNullException (nameof (tags)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); if ((engine.Capabilities & (ImapCapabilities.Metadata | ImapCapabilities.MetadataServer)) == 0) throw new NotSupportedException ("The IMAP server does not support the METADATA or METADATA-SERVER extension."); var command = new StringBuilder ("GETMETADATA \"\""); var args = new List (); bool hasOptions = false; if (options.MaxSize.HasValue || options.Depth != 0) { command.Append (" ("); if (options.MaxSize.HasValue) { command.Append ("MAXSIZE "); command.Append (options.MaxSize.Value.ToString (CultureInfo.InvariantCulture)); command.Append (' '); } if (options.Depth > 0) { command.Append ("DEPTH "); command.Append (options.Depth == int.MaxValue ? "infinity" : "1"); command.Append (' '); } command[command.Length - 1] = ')'; command.Append (' '); hasOptions = true; } int startIndex = command.Length; foreach (var tag in tags) { command.Append (" %S"); args.Add (tag.Id); } if (hasOptions) { command[startIndex] = '('; command.Append (')'); } command.Append ("\r\n"); if (args.Count == 0) { ic = null; return false; } ic = new ImapCommand (engine, cancellationToken, null, command.ToString (), args.ToArray ()); ic.RegisterUntaggedHandler ("METADATA", ImapUtils.UntaggedMetadataHandler); ic.UserData = new MetadataCollection (); options.LongEntries = 0; engine.QueueCommand (ic); return true; } MetadataCollection ProcessGetMetadataResponse (ImapCommand ic, MetadataOptions options) { ic.ThrowIfNotOk ("GETMETADATA"); if (ic.RespCodes.Count > 0 && ic.RespCodes[ic.RespCodes.Count - 1].Type == ImapResponseCodeType.Metadata) { var metadata = (MetadataResponseCode) ic.RespCodes[ic.RespCodes.Count - 1]; if (metadata.SubType == MetadataResponseCodeSubType.LongEntries) options.LongEntries = metadata.Value; } return engine.FilterMetadata ((MetadataCollection) ic.UserData!, string.Empty); } /// /// Gets the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA or METADATA-SERVER extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override MetadataCollection GetMetadata (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default) { if (!TryQueueGetMetadataCommand (options, tags, cancellationToken, out var ic)) return new MetadataCollection (); engine.Run (ic); return ProcessGetMetadataResponse (ic, options); } bool TryQueueSetMetadataCommand (MetadataCollection metadata, CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic) { if (metadata == null) throw new ArgumentNullException (nameof (metadata)); CheckDisposed (); CheckConnected (); CheckAuthenticated (); if ((engine.Capabilities & (ImapCapabilities.Metadata | ImapCapabilities.MetadataServer)) == 0) throw new NotSupportedException ("The IMAP server does not support the METADATA or METADATA-SERVER extension."); if (metadata.Count == 0) { ic = null; return false; } var command = new StringBuilder ("SETMETADATA \"\" ("); var args = new List (); for (int i = 0; i < metadata.Count; i++) { if (i > 0) command.Append (' '); if (metadata[i].Value != null) { command.Append ("%S %S"); args.Add (metadata[i].Tag.Id); args.Add (metadata[i].Value); } else { command.Append ("%S NIL"); args.Add (metadata[i].Tag.Id); } } command.Append (")\r\n"); ic = new ImapCommand (engine, cancellationToken, null, command.ToString (), args.ToArray ()); engine.QueueCommand (ic); return true; } static void ProcessSetMetadataResponse (ImapCommand ic) { ic.ThrowIfNotOk ("SETMETADATA"); } /// /// Sets the specified metadata. /// /// /// Sets the specified metadata. /// /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA or METADATA-SERVER extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void SetMetadata (MetadataCollection metadata, CancellationToken cancellationToken = default) { if (!TryQueueSetMetadataCommand (metadata, cancellationToken, out var ic)) return; engine.Run (ic); ProcessSetMetadataResponse (ic); } #endregion void OnEngineMetadataChanged (object? sender, MetadataChangedEventArgs e) { OnMetadataChanged (e.Metadata); } void OnEngineFolderCreated (object? sender, FolderCreatedEventArgs e) { OnFolderCreated (e.Folder); } void OnEngineAlert (object? sender, AlertEventArgs e) { OnAlert (e.Message); } void OnEngineWebAlert (object? sender, WebAlertEventArgs e) { OnWebAlert (e.WebUri, e.Message); } /// /// Occurs when a Google Mail server sends a WEBALERT response code to the client. /// /// /// The event is raised whenever the Google Mail server sends a /// WEBALERT message. /// public event EventHandler? WebAlert; /// /// Raise the web alert event. /// /// /// Raises the web alert event. /// /// The web alert URI. /// The web alert message. /// /// is . /// -or- /// is . /// protected virtual void OnWebAlert (Uri uri, string message) { WebAlert?.Invoke (this, new WebAlertEventArgs (uri, message)); } void OnEngineDisconnected (object? sender, EventArgs e) { if (connecting) return; var requested = disconnecting; var uri = engine.Uri!; disconnecting = false; OnDisconnected (uri.Host, uri.Port, GetSecureSocketOptions (uri), requested); } /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected override void Dispose (bool disposing) { if (disposing && !disposed) { engine.MetadataChanged -= OnEngineMetadataChanged; engine.FolderCreated -= OnEngineFolderCreated; engine.Disconnected -= OnEngineDisconnected; engine.WebAlert -= OnEngineWebAlert; engine.Alert -= OnEngineAlert; engine.Dispose (); disposed = true; } base.Dispose (disposing); } } } ================================================ FILE: MailKit/Net/Imap/ImapCommand.cs ================================================ // // ImapCommand.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Threading; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; using MimeKit.Utils; using SslStream = MailKit.Net.SslStream; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit.Net.Imap { /// /// An IMAP continuation handler. /// /// /// All exceptions thrown by the handler are considered fatal and will /// force-disconnect the connection. If a non-fatal error occurs, set /// it on the property. /// delegate Task ImapContinuationHandler (ImapEngine engine, ImapCommand ic, string text, bool doAsync); /// /// An IMAP untagged response handler. /// /// /// Most IMAP commands return their results in untagged responses. /// delegate Task ImapUntaggedHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync); delegate void ImapCommandResetHandler (ImapCommand ic); enum ImapStringType { Atom, QString, Literal, Nil } /// /// A partial IMAP command. /// /// /// IMAP commands that contain literal strings are broken up into multiple parts /// in case the IMAP server does not support the LITERAL+ extension. These parts /// are then sent individually as we receive "+" responses from the server. /// class ImapCommandPart { public readonly byte[] Command; public readonly ImapLiteral? Literal; public readonly bool WaitForContinuation; public ImapCommandPart (byte[] command, ImapLiteral? literal, bool wait = true) { WaitForContinuation = wait; Command = command; Literal = literal; } } /// /// An IMAP command. /// class ImapCommand { static readonly byte[] UTF8LiteralTokenPrefix = Encoding.ASCII.GetBytes ("UTF8 (~{"); static readonly byte[] LiteralTokenSuffix = { (byte) '}', (byte) '\r', (byte) '\n' }; static readonly byte[] Nil = { (byte) 'N', (byte) 'I', (byte) 'L' }; static readonly byte[] NewLine = { (byte) '\r', (byte) '\n' }; static readonly byte[] LiteralTokenPrefix = { (byte) '{' }; public Dictionary UntaggedHandlers { get; private set; } public ImapContinuationHandler? ContinuationHandler { get; set; } public CancellationToken CancellationToken { get; private set; } public ImapCommandStatus Status { get; internal set; } public ImapCommandResponse Response { get; internal set; } public ITransferProgress? Progress { get; internal set; } public Exception? Exception { get; internal set; } public readonly List RespCodes; public string? ResponseText { get; internal set; } public ImapFolder? Folder { get; private set; } public object? UserData { get; internal set; } public bool ListReturnsSubscribed { get; internal set; } public bool Logout { get; private set; } public bool Lsub { get; internal set; } public string? Tag { get; private set; } public bool Bye { get; internal set; } readonly List parts = new List (); readonly ImapEngine Engine; readonly long totalSize; long nwritten; int current; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The IMAP engine that will be sending the command. /// The cancellation token. /// The IMAP folder that the command operates on. /// The formatting options. /// The command format. /// The command arguments. /// /// is . /// -or- /// is . /// -or- /// is . /// public ImapCommand (ImapEngine engine, CancellationToken cancellationToken, ImapFolder? folder, FormatOptions options, string format, params object[] args) { if (engine == null) throw new ArgumentNullException (nameof (engine)); if (options == null) throw new ArgumentNullException (nameof (options)); if (format == null) throw new ArgumentNullException (nameof (format)); UntaggedHandlers = new Dictionary (StringComparer.OrdinalIgnoreCase); Logout = format.Equals ("LOGOUT\r\n", StringComparison.Ordinal); RespCodes = new List (); CancellationToken = cancellationToken; Response = ImapCommandResponse.None; Status = ImapCommandStatus.Created; Engine = engine; Folder = folder; using (var builder = new ByteArrayBuilder (1024)) { byte[] buf, utf8 = new byte[8]; int argc = 0; string str; for (int i = 0; i < format.Length; i++) { if (format[i] == '%') { switch (format[++i]) { case '%': // a literal % builder.Append ((byte) '%'); break; case 'd': // an integer str = ((int) args[argc++]).ToString (CultureInfo.InvariantCulture); buf = Encoding.ASCII.GetBytes (str); builder.Append (buf, 0, buf.Length); break; case 'u': // an unsigned integer str = ((uint) args[argc++]).ToString (CultureInfo.InvariantCulture); buf = Encoding.ASCII.GetBytes (str); builder.Append (buf, 0, buf.Length); break; case 's': str = (string) args[argc++]; buf = Encoding.ASCII.GetBytes (str); builder.Append (buf, 0, buf.Length); break; case 'F': // an ImapFolder var utf7 = ((ImapFolder) args[argc++]).EncodedName; AppendString (options, true, builder, utf7); break; case 'L': // a MimeMessage or a byte[] var arg = args[argc++]; ImapLiteral literal; byte[] prefix; if (arg is MimeMessage message) { prefix = options.International ? UTF8LiteralTokenPrefix : LiteralTokenPrefix; literal = new ImapLiteral (options, message, UpdateProgress); } else { literal = new ImapLiteral (options, (byte[]) arg); prefix = LiteralTokenPrefix; } var length = literal.Length; bool wait = true; builder.Append (prefix, 0, prefix.Length); buf = Encoding.ASCII.GetBytes (length.ToString (CultureInfo.InvariantCulture)); builder.Append (buf, 0, buf.Length); if (CanUseNonSynchronizedLiteral (Engine, length)) { builder.Append ((byte) '+'); wait = false; } builder.Append (LiteralTokenSuffix, 0, LiteralTokenSuffix.Length); totalSize += length; parts.Add (new ImapCommandPart (builder.ToArray (), literal, wait)); builder.Clear (); if (prefix == UTF8LiteralTokenPrefix) builder.Append ((byte) ')'); break; case 'S': // a string which may need to be quoted or made into a literal AppendString (options, true, builder, (string) args[argc++]); break; case 'Q': // similar to %S but string must be quoted at a minimum AppendString (options, false, builder, (string) args[argc++]); break; default: throw new FormatException ($"The %{format[i]} format specifier is not supported."); } } else if (format[i] < 128) { builder.Append ((byte) format[i]); } else { int nchars = char.IsSurrogate (format[i]) ? 2 : 1; int nbytes = Encoding.UTF8.GetBytes (format, i, nchars, utf8, 0); builder.Append (utf8, 0, nbytes); i += nchars - 1; } } parts.Add (new ImapCommandPart (builder.ToArray (), null)); } } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The IMAP engine that will be sending the command. /// The cancellation token. /// The IMAP folder that the command operates on. /// The command format. /// The command arguments. /// /// is . /// -or- /// is . /// public ImapCommand (ImapEngine engine, CancellationToken cancellationToken, ImapFolder? folder, string format, params object[] args) : this (engine, cancellationToken, folder, FormatOptions.Default, format, args) { } internal static int EstimateCommandLength (ImapEngine engine, FormatOptions options, string format, params object[] args) { const int EstimatedTagLength = 10; var eoln = false; int length = 0; int argc = 0; string str; for (int i = 0; i < format.Length; i++) { if (format[i] == '%') { switch (format[++i]) { //case '%': // a literal % // Note: This is commented out because %% is only ever used in some LIST commands which never need // to split the split the command to keep it under the max line length. //length++; //break; //case 'd': // an integer // Note: This is commented out because %d is only ever used for some REPLACE and GetMessage/GetHeaders/GetBodyPart // commands which never need to split the command to keep it under the max line length. //str = ((int) args[argc++]).ToString (CultureInfo.InvariantCulture); //length += str.Length; //break; //case 'u': // an unsigned integer // Note: This is commented out because %u is only ever used for some GetMessage/GetHeaders/GetBodyPart // commands which never need to split the command to keep it under the max line length. //str = ((uint) args[argc++]).ToString (CultureInfo.InvariantCulture); //length += str.Length; //break; case 's': str = (string) args[argc++]; length += str.Length; break; case 'F': // an ImapFolder var utf7 = ((ImapFolder) args[argc++]).EncodedName; length += EstimateStringLength (engine, true, utf7, out eoln); break; //case 'L': // a MimeMessage or a byte[] // Note: This is commented out because %L is only ever used for APPEND and REPLACE commands which // never need to split the command to keep it under the max line length. //var arg = args[argc++]; //byte[] prefix; //long len; //if (arg is MimeMessage message) { // prefix = options.International ? UTF8LiteralTokenPrefix : LiteralTokenPrefix; // var literal = new ImapLiteral (options, message, null); // len = literal.Length; //} else { // len = ((byte[]) arg).Length; // prefix = LiteralTokenPrefix; //} //length += prefix.Length; //length += Encoding.ASCII.GetByteCount (len.ToString (CultureInfo.InvariantCulture)); //if (CanUseNonSynchronizedLiteral (engine, len)) // length++; //length += LiteralTokenSuffix.Length; //if (prefix == UTF8LiteralTokenPrefix) // length++; //eoln = true; //break; case 'S': // a string which may need to be quoted or made into a literal length += EstimateStringLength (engine, true, (string) args[argc++], out eoln); break; //case 'Q': // similar to %S but string must be quoted at a minimum // Note: This is commented out because %Q is only ever used for the ID command which // never needs to split the command to keep it under the max line length. //length += EstimateStringLength (engine, false, (string) args[argc++], out eoln); //break; default: throw new FormatException ($"The %{format[i]} format specifier is not supported."); } if (eoln) break; } else { length++; } } return length + EstimatedTagLength; } internal static int EstimateCommandLength (ImapEngine engine, string format, params object[] args) { return EstimateCommandLength (engine, FormatOptions.Default, format, args); } void UpdateProgress (int n) { nwritten += n; Progress?.Report (nwritten, totalSize); } internal static bool IsAtom (char c) { return c < 128 && !char.IsControl (c) && "(){ %*\\\"]".IndexOf (c) == -1; } static bool IsQuotedSafe (ImapEngine engine, char c) { return (c < 128 || engine.UTF8Enabled) && !char.IsControl (c); } internal static ImapStringType GetStringType (ImapEngine engine, string value, bool allowAtom) { var type = allowAtom ? ImapStringType.Atom : ImapStringType.QString; if (value == null) return ImapStringType.Nil; if (value.Length == 0) return ImapStringType.QString; for (int i = 0; i < value.Length; i++) { if (!IsAtom (value[i])) { if (!IsQuotedSafe (engine, value[i])) return ImapStringType.Literal; type = ImapStringType.QString; } } return type; } static bool CanUseNonSynchronizedLiteral (ImapEngine engine, long length) { return (engine.Capabilities & ImapCapabilities.LiteralPlus) != 0 || (length <= 4096 && (engine.Capabilities & ImapCapabilities.LiteralMinus) != 0); } static int EstimateStringLength (ImapEngine engine, bool allowAtom, string value, out bool eoln) { eoln = false; switch (GetStringType (engine, value, allowAtom)) { case ImapStringType.Literal: var literal = Encoding.UTF8.GetByteCount (value); var plus = CanUseNonSynchronizedLiteral (engine, literal); int length = "{}\r\n".Length; length += literal.ToString (CultureInfo.InvariantCulture).Length; if (plus) length++; eoln = true; return length++; case ImapStringType.QString: return Encoding.UTF8.GetByteCount (MimeUtils.Quote (value)); case ImapStringType.Nil: return Nil.Length; default: return value.Length; } } void AppendString (FormatOptions options, bool allowAtom, ByteArrayBuilder builder, string value) { byte[] buf; switch (GetStringType (Engine, value, allowAtom)) { case ImapStringType.Literal: var literal = Encoding.UTF8.GetBytes (value); var plus = CanUseNonSynchronizedLiteral (Engine, literal.Length); var length = literal.Length.ToString (CultureInfo.InvariantCulture); buf = Encoding.ASCII.GetBytes (length); builder.Append ((byte) '{'); builder.Append (buf, 0, buf.Length); if (plus) builder.Append ((byte) '+'); builder.Append ((byte) '}'); builder.Append ((byte) '\r'); builder.Append ((byte) '\n'); if (plus) { builder.Append (literal, 0, literal.Length); } else { parts.Add (new ImapCommandPart (builder.ToArray (), new ImapLiteral (options, literal))); builder.Clear (); } break; case ImapStringType.QString: buf = Encoding.UTF8.GetBytes (MimeUtils.Quote (value)); builder.Append (buf, 0, buf.Length); break; case ImapStringType.Atom: buf = Encoding.UTF8.GetBytes (value); builder.Append (buf, 0, buf.Length); break; case ImapStringType.Nil: builder.Append (Nil, 0, Nil.Length); break; } } /// /// Registers the untagged handler for the specified atom token. /// /// The atom token. /// The handler. /// /// is . /// -or- /// is . /// /// /// Untagged handlers must be registered before the command has been queued. /// public void RegisterUntaggedHandler (string atom, ImapUntaggedHandler handler) { if (atom == null) throw new ArgumentNullException (nameof (atom)); if (handler == null) throw new ArgumentNullException (nameof (handler)); if (Status != ImapCommandStatus.Created) throw new InvalidOperationException ("Untagged handlers must be registered before the command has been queued."); UntaggedHandlers.Add (atom, handler); } static bool IsOkNoOrBad (string atom, out ImapCommandResponse response) { if (atom.Equals ("OK", StringComparison.OrdinalIgnoreCase)) { response = ImapCommandResponse.Ok; return true; } if (atom.Equals ("NO", StringComparison.OrdinalIgnoreCase)) { response = ImapCommandResponse.No; return true; } if (atom.Equals ("BAD", StringComparison.OrdinalIgnoreCase)) { response = ImapCommandResponse.Bad; return true; } response = ImapCommandResponse.None; return false; } /// /// Sends the next part of the command to the server. /// /// if there are more command parts to send; otherwise, . /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public bool Step () { var supportsLiteralPlus = (Engine.Capabilities & ImapCapabilities.LiteralPlus) != 0; var response = ImapCommandResponse.None; ImapToken token; // construct and write the command tag if this is the initial state if (current == 0) { Tag = string.Format (CultureInfo.InvariantCulture, "{0}{1:D8}", Engine.TagPrefix, Engine.Tag++); var buf = Encoding.ASCII.GetBytes (Tag + " "); Engine.Stream!.Write (buf, 0, buf.Length, CancellationToken); } do { var part = parts[current]; var command = part.Command; Engine.Stream!.Write (command, 0, command.Length, CancellationToken); // if the server doesn't support LITERAL+ (or LITERAL-), we'll need to wait // for a "+" response before writing out the any literals... if (part.WaitForContinuation || part.Literal == null) break; // otherwise, we can write out any and all literal tokens we have... part.Literal.WriteTo (Engine.Stream, CancellationToken); if (current + 1 >= parts.Count) break; current++; } while (true); Engine.Stream.Flush (CancellationToken); // now we need to read the response... do { if (Engine.State == ImapEngineState.Idle) { int timeout = Timeout.Infinite; if (Engine.Stream.CanTimeout) { timeout = Engine.Stream.ReadTimeout; Engine.Stream.ReadTimeout = Timeout.Infinite; } try { token = Engine.ReadToken (CancellationToken); } finally { if (Engine.Stream != null && Engine.Stream.IsConnected && Engine.Stream.CanTimeout) Engine.Stream.ReadTimeout = timeout; } } else { token = Engine.ReadToken (CancellationToken); } if (token == ImapToken.Plus) { // we've gotten a continuation response from the server var text = Engine.ReadLine (CancellationToken).Trim (); // if we've got a Literal pending, the '+' means we can send it now... var literal = parts[current].Literal; if (!supportsLiteralPlus && literal != null) { literal.WriteTo (Engine.Stream, CancellationToken); break; } if (ContinuationHandler != null) { ContinuationHandler (Engine, this, text, false); } else { Engine.Stream.Write (NewLine, 0, NewLine.Length, CancellationToken); Engine.Stream.Flush (CancellationToken); } } else if (token.Type == ImapTokenType.Asterisk) { // we got an untagged response, let the engine handle this... Engine.ProcessUntaggedResponse (this, CancellationToken); } else if (token.Type == ImapTokenType.Atom && (string) token.Value == Tag) { // the next token should be "OK", "NO", or "BAD" token = Engine.ReadToken (CancellationToken); ImapEngine.AssertToken (token, ImapTokenType.Atom, "Syntax error in tagged response. {0}", token); string atom = (string) token.Value; if (!IsOkNoOrBad (atom, out response)) throw ImapEngine.UnexpectedToken ("Syntax error in tagged response. {0}", token); token = Engine.ReadToken (CancellationToken); if (token.Type == ImapTokenType.OpenBracket) { var code = Engine.ParseResponseCode (true, CancellationToken); RespCodes.Add (code); } else if (token.Type != ImapTokenType.Eoln) { // consume the rest of the line... var line = Engine.ReadLine (CancellationToken).TrimEnd (); ResponseText = token.Value.ToString () + line; } var folder = Folder ?? Engine.Selected; folder?.FlushQueuedEvents (); break; } else if (token.Type == ImapTokenType.OpenBracket) { // Note: this is a work-around for broken IMAP servers like Office365.com that // return RESP-CODES that are not preceded by "* OK " such as the example in // issue #115 (https://github.com/jstedfast/MailKit/issues/115). var code = Engine.ParseResponseCode (false, CancellationToken); RespCodes.Add (code); } else { // no clue what we got... throw ImapEngine.UnexpectedToken ("Syntax error in response. Unexpected token: {0}", token); } } while (Status == ImapCommandStatus.Active); if (Status == ImapCommandStatus.Active) { current++; if (current >= parts.Count || response != ImapCommandResponse.None) { Status = ImapCommandStatus.Complete; Response = response; return false; } return true; } return false; } /// /// Sends the next part of the command to the server. /// /// if there are more command parts to send; otherwise, . /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public async Task StepAsync () { var supportsLiteralPlus = (Engine.Capabilities & ImapCapabilities.LiteralPlus) != 0; var response = ImapCommandResponse.None; ImapToken token; // construct and write the command tag if this is the initial state if (current == 0) { Tag = string.Format (CultureInfo.InvariantCulture, "{0}{1:D8}", Engine.TagPrefix, Engine.Tag++); var buf = Encoding.ASCII.GetBytes (Tag + " "); await Engine.Stream!.WriteAsync (buf, 0, buf.Length, CancellationToken).ConfigureAwait (false); } do { var part = parts[current]; var command = part.Command; await Engine.Stream!.WriteAsync (command, 0, command.Length, CancellationToken).ConfigureAwait (false); // if the server doesn't support LITERAL+ (or LITERAL-), we'll need to wait // for a "+" response before writing out the any literals... if (part.WaitForContinuation || part.Literal == null) break; // otherwise, we can write out any and all literal tokens we have... await part.Literal.WriteToAsync (Engine.Stream, CancellationToken).ConfigureAwait (false); if (current + 1 >= parts.Count) break; current++; } while (true); await Engine.Stream.FlushAsync (CancellationToken).ConfigureAwait (false); // now we need to read the response... do { if (Engine.State == ImapEngineState.Idle) { int timeout = Timeout.Infinite; if (Engine.Stream.CanTimeout) { timeout = Engine.Stream.ReadTimeout; Engine.Stream.ReadTimeout = Timeout.Infinite; } try { token = await Engine.ReadTokenAsync (CancellationToken).ConfigureAwait (false); } finally { if (Engine.Stream != null && Engine.Stream.IsConnected && Engine.Stream.CanTimeout) Engine.Stream.ReadTimeout = timeout; } } else { token = await Engine.ReadTokenAsync (CancellationToken).ConfigureAwait (false); } if (token == ImapToken.Plus) { // we've gotten a continuation response from the server var text = (await Engine.ReadLineAsync (CancellationToken).ConfigureAwait (false)).Trim (); // if we've got a Literal pending, the '+' means we can send it now... var literal = parts[current].Literal; if (!supportsLiteralPlus && literal != null) { await literal.WriteToAsync (Engine.Stream, CancellationToken).ConfigureAwait (false); break; } if (ContinuationHandler != null) { await ContinuationHandler (Engine, this, text, true).ConfigureAwait (false); } else { await Engine.Stream.WriteAsync (NewLine, 0, NewLine.Length, CancellationToken).ConfigureAwait (false); await Engine.Stream.FlushAsync (CancellationToken).ConfigureAwait (false); } } else if (token.Type == ImapTokenType.Asterisk) { // we got an untagged response, let the engine handle this... await Engine.ProcessUntaggedResponseAsync (this, CancellationToken).ConfigureAwait (false); } else if (token.Type == ImapTokenType.Atom && (string) token.Value == Tag) { // the next token should be "OK", "NO", or "BAD" token = await Engine.ReadTokenAsync (CancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.Atom, "Syntax error in tagged response. {0}", token); string atom = (string) token.Value; if (!IsOkNoOrBad (atom, out response)) throw ImapEngine.UnexpectedToken ("Syntax error in tagged response. {0}", token); token = await Engine.ReadTokenAsync (CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenBracket) { var code = await Engine.ParseResponseCodeAsync (true, CancellationToken).ConfigureAwait (false); RespCodes.Add (code); } else if (token.Type != ImapTokenType.Eoln) { // consume the rest of the line... var line = (await Engine.ReadLineAsync (CancellationToken).ConfigureAwait (false)).TrimEnd (); ResponseText = token.Value.ToString () + line; } var folder = Folder ?? Engine.Selected; folder?.FlushQueuedEvents (); break; } else if (token.Type == ImapTokenType.OpenBracket) { // Note: this is a work-around for broken IMAP servers like Office365.com that // return RESP-CODES that are not preceded by "* OK " such as the example in // issue #115 (https://github.com/jstedfast/MailKit/issues/115). var code = await Engine.ParseResponseCodeAsync (false, CancellationToken).ConfigureAwait (false); RespCodes.Add (code); } else { // no clue what we got... throw ImapEngine.UnexpectedToken ("Syntax error in response. Unexpected token: {0}", token); } } while (Status == ImapCommandStatus.Active); if (Status == ImapCommandStatus.Active) { current++; if (current >= parts.Count || response != ImapCommandResponse.None) { Status = ImapCommandStatus.Complete; Response = response; return false; } return true; } return false; } /// /// Get the first response-code of the specified type. /// /// /// Gets the first response-code of the specified type. /// /// The type of response-code. /// The response-code if it exists; otherwise, . public ImapResponseCode? GetResponseCode (ImapResponseCodeType type) { for (int i = 0; i < RespCodes.Count; i++) { if (RespCodes[i].Type == type) return RespCodes[i]; } return null; } /// /// Throw an if the response was not OK. /// /// /// Throws an if the response was not OK. /// public void ThrowIfNotOk (string command) { if (Response != ImapCommandResponse.Ok) throw ImapCommandException.Create (command, this); } } } ================================================ FILE: MailKit/Net/Imap/ImapCommandException.cs ================================================ // // ImapCommandException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit.Net.Imap { /// /// An exception that is thrown when an IMAP command returns NO or BAD. /// /// /// The exception that is thrown when an IMAP command fails. Unlike a , /// a does not require the to be reconnected. /// #if SERIALIZABLE [Serializable] #endif public class ImapCommandException : CommandException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected ImapCommandException (SerializationInfo info, StreamingContext context) : base (info, context) { Response = (ImapCommandResponse) info.GetValue ("Response", typeof (ImapCommandResponse)); ResponseText = info.GetString ("ResponseText"); } #endif /// /// Create a new based on the specified command name and state. /// /// /// Create a new based on the specified command name and state. /// /// A new command exception. /// The command name. /// The command state. internal static ImapCommandException Create (string command, ImapCommand ic) { var result = ic.Response.ToString ().ToUpperInvariant (); string? reason = null; string message; if (string.IsNullOrEmpty (ic.ResponseText)) { for (int i = ic.RespCodes.Count - 1; i >= 0; i--) { if (ic.RespCodes[i].IsError && !string.IsNullOrEmpty (ic.RespCodes[i].Message)) { reason = ic.RespCodes[i].Message; break; } } reason ??= string.Empty; } else { reason = ic.ResponseText!; } if (!string.IsNullOrEmpty (reason)) message = string.Format ("The IMAP server replied to the '{0}' command with a '{1}' response: {2}", command, result, reason); else message = string.Format ("The IMAP server replied to the '{0}' command with a '{1}' response.", command, result); return ic.Exception != null ? new ImapCommandException (ic.Response, reason, message, ic.Exception) : new ImapCommandException (ic.Response, reason, message); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The IMAP command response. /// The error message. /// The human-readable response text. /// The inner exception. public ImapCommandException (ImapCommandResponse response, string responseText, string message, Exception innerException) : base (message, innerException) { ResponseText = responseText; Response = response; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The IMAP command response. /// The human-readable response text. /// The error message. public ImapCommandException (ImapCommandResponse response, string responseText, string message) : base (message) { ResponseText = responseText; Response = response; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The IMAP command response. /// The human-readable response text. public ImapCommandException (ImapCommandResponse response, string responseText) { ResponseText = responseText; Response = response; } /// /// Gets the IMAP command response. /// /// /// Gets the IMAP command response. /// /// The IMAP command response. public ImapCommandResponse Response { get; private set; } /// /// Gets the human-readable IMAP command response text. /// /// /// Gets the human-readable IMAP command response text. /// /// The response text. public string ResponseText { get; private set; } #if SERIALIZABLE /// /// When overridden in a derived class, sets the /// with information about the exception. /// /// /// Serializes the state of the . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecurityCritical] #if NET8_0_OR_GREATER [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] #endif public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("Response", Response, typeof (ImapCommandResponse)); info.AddValue ("ResponseText", ResponseText); } #endif } } ================================================ FILE: MailKit/Net/Imap/ImapCommandResponse.cs ================================================ // // ImapCommandResult.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Net.Imap { /// /// An enumeration of possible IMAP command responses. /// /// /// An enumeration of possible IMAP command responses. /// public enum ImapCommandResponse { /// /// No IMAP command response yet. /// None, /// /// The command resulted in an "OK" response. /// Ok, /// /// The command resulted in a "NO" response. /// No, /// /// The command resulted in a "BAD" response. /// Bad } } ================================================ FILE: MailKit/Net/Imap/ImapCommandStatus.cs ================================================ // // ImapCommandStatus.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Net.Imap { /// /// IMAP command status. /// enum ImapCommandStatus { Created, Queued, Active, Complete, Error } } ================================================ FILE: MailKit/Net/Imap/ImapEncoding.cs ================================================ // // ImapEncoding.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; namespace MailKit.Net.Imap { static class ImapEncoding { const string utf7_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,"; static readonly byte[] utf7_rank = { 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255, 62, 63,255,255,255, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255,255,255,255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, }; public static string Decode (string text) { var decoded = new StringBuilder (text.Length); bool shifted = false; int bits = 0, v = 0; int index = 0; char c; while (index < text.Length) { c = text[index++]; if (shifted) { if (c == '-') { // shifted back out of modified UTF-7 shifted = false; bits = v = 0; } else if (c > 127) { // invalid UTF-7 return text; } else { byte rank = utf7_rank[(byte) c]; if (rank == 0xff) { // invalid UTF-7 return text; } v = (v << 6) | rank; bits += 6; if (bits >= 16) { char u = (char) ((v >> (bits - 16)) & 0xffff); decoded.Append (u); bits -= 16; } } } else if (c == '&' && index < text.Length) { if (text[index] == '-') { decoded.Append ('&'); index++; } else { // shifted into modified UTF-7 shifted = true; } } else { decoded.Append (c); } } return decoded.ToString (); } static void Utf7ShiftOut (StringBuilder output, int u, int bits) { if (bits > 0) { int x = (u << (6 - bits)) & 0x3f; output.Append (utf7_alphabet[x]); } output.Append ('-'); } public static string Encode (string text) { var encoded = new StringBuilder (text.Length * 2); bool shifted = false; int bits = 0, u = 0; for (int index = 0; index < text.Length; index++) { char c = text[index]; if (c >= 0x20 && c < 0x7f) { // characters with octet values 0x20-0x25 and 0x27-0x7e // represent themselves while 0x26 ("&") is represented // by the two-octet sequence "&-" if (shifted) { Utf7ShiftOut (encoded, u, bits); shifted = false; bits = 0; } if (c == 0x26) encoded.Append ("&-"); else encoded.Append (c); } else { // base64 encode if (!shifted) { encoded.Append ('&'); shifted = true; } u = (u << 16) | (c & 0xffff); bits += 16; while (bits >= 6) { int x = (u >> (bits - 6)) & 0x3f; encoded.Append (utf7_alphabet[x]); bits -= 6; } } } if (shifted) Utf7ShiftOut (encoded, u, bits); return encoded.ToString (); } } } ================================================ FILE: MailKit/Net/Imap/ImapEngine.cs ================================================ // // ImapEngine.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Linq; using System.Text; using System.Buffers; using System.Threading; using System.Diagnostics; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using MimeKit; namespace MailKit.Net.Imap { delegate ImapFolder CreateImapFolderDelegate (ImapFolderConstructorArgs args); /// /// The state of the . /// enum ImapEngineState { /// /// The ImapEngine is in the disconnected state. /// Disconnected, /// /// The ImapEngine is in the process of connecting. /// Connecting, /// /// The ImapEngine is connected but not yet authenticated. /// Connected, /// /// The ImapEngine is in the authenticated state. /// Authenticated, /// /// The ImapEngine is in the selected state. /// Selected, /// /// The ImapEngine is in the IDLE state. /// Idle } enum ImapProtocolVersion { Unknown, IMAP4, IMAP4rev1, IMAP4rev2, } enum ImapUntaggedResult { Ok, No, Bad, Handled } enum ImapQuirksMode { None, Courier, Cyrus, Domino, Dovecot, Exchange, Exchange2003, Exchange2007, GMail, hMailServer, iCloud, ProtonMail, QQMail, SmarterMail, UW, Yahoo, Yandex, Zoho } class ImapFolderNameComparer : IEqualityComparer { public char DirectorySeparator; public ImapFolderNameComparer (char directorySeparator) { DirectorySeparator = directorySeparator; } public bool Equals (string? x, string? y) { x = ImapUtils.CanonicalizeMailboxName (x!, DirectorySeparator); y = ImapUtils.CanonicalizeMailboxName (y!, DirectorySeparator); return x == y; } public int GetHashCode (string obj) { return ImapUtils.CanonicalizeMailboxName (obj, DirectorySeparator).GetHashCode (); } } /// /// An IMAP command engine. /// class ImapEngine : IDisposable { internal const string GenericUntaggedResponseSyntaxErrorFormat = "Syntax error in untagged {0} response. {1}"; internal const string GenericItemSyntaxErrorFormat = "Syntax error in {0}. {1}"; internal const string FetchBodySyntaxErrorFormat = "Syntax error in BODY. {0}"; const string GenericResponseCodeSyntaxErrorFormat = "Syntax error in {0} response code. {1}"; const string GreetingSyntaxErrorFormat = "Syntax error in IMAP server greeting. {0}"; const int BufferSize = 4096; static int TagPrefixIndex; #if NET6_0_OR_GREATER readonly ClientMetrics? metrics; #endif internal readonly Dictionary FolderCache; readonly CreateImapFolderDelegate createImapFolder; readonly ImapFolderNameComparer cacheComparer; internal ImapQuirksMode QuirksMode; readonly List queue; long clientConnectedTimestamp; internal char TagPrefix; ImapCommand? current; MimeParser? parser; internal int Tag; bool disposed; bool secure; public ImapEngine (CreateImapFolderDelegate createImapFolderDelegate) { #if NET6_0_OR_GREATER // Use the globally configured Pop3Client metrics. metrics = Telemetry.ImapClient.Metrics; #endif cacheComparer = new ImapFolderNameComparer ('.'); FolderCache = new Dictionary (cacheComparer); ThreadingAlgorithms = new HashSet (); AuthenticationMechanisms = new HashSet (StringComparer.Ordinal); CompressionAlgorithms = new HashSet (StringComparer.Ordinal); SupportedContexts = new HashSet (StringComparer.Ordinal); SupportedCharsets = new HashSet (StringComparer.OrdinalIgnoreCase); Rights = new AccessRights (); PersonalNamespaces = new FolderNamespaceCollection (); SharedNamespaces = new FolderNamespaceCollection (); OtherNamespaces = new FolderNamespaceCollection (); ProtocolVersion = ImapProtocolVersion.Unknown; createImapFolder = createImapFolderDelegate; Capabilities = ImapCapabilities.None; QuirksMode = ImapQuirksMode.None; queue = new List (); TagPrefix = (char) ('A' + (TagPrefixIndex++ % 26)); } /// /// Get the authentication mechanisms supported by the IMAP server. /// /// /// The authentication mechanisms are queried during the /// or methods. /// /// The authentication mechanisms. public HashSet AuthenticationMechanisms { get; private set; } /// /// Get the compression algorithms supported by the IMAP server. /// /// /// The compression algorithms are populated by the /// and /// methods. /// /// The compression algorithms. public HashSet CompressionAlgorithms { get; private set; } /// /// Get the threading algorithms supported by the IMAP server. /// /// /// The threading algorithms are populated by the /// and /// methods. /// /// The threading algorithms. public HashSet ThreadingAlgorithms { get; private set; } /// /// Gets the append limit supported by the IMAP server. /// /// /// Gets the append limit supported by the IMAP server. /// /// The append limit. public uint? AppendLimit { get; private set; } /// /// Gets the I18NLEVEL supported by the IMAP server. /// /// /// Gets the I18NLEVEL supported by the IMAP server. /// /// The internationalization level. public int I18NLevel { get; private set; } /// /// Get the capabilities supported by the IMAP server. /// /// /// The capabilities will not be known until a successful connection has been /// made via the or method. /// /// The capabilities. public ImapCapabilities Capabilities { get; set; } /// /// Indicates whether or not the engine is busy processing commands. /// /// /// Indicates whether or not the engine is busy processing commands. /// /// if th e engine is busy processing commands; otherwise, . internal bool IsBusy { get { return current != null; } } /// /// Get the capabilities version. /// /// /// Every time the engine receives an untagged CAPABILITIES /// response from the server, it increments this value. /// /// The capabilities version. public int CapabilitiesVersion { get; private set; } /// /// Get the IMAP protocol version. /// /// /// Gets the IMAP protocol version. /// /// The IMAP protocol version. public ImapProtocolVersion ProtocolVersion { get; private set; } /// /// Get the rights specified in the capabilities. /// /// /// Gets the rights specified in the capabilities. /// /// The rights. public AccessRights Rights { get; private set; } /// /// Get the supported charsets. /// /// /// Gets the supported charsets. /// /// The supported charsets. public HashSet SupportedCharsets { get; private set; } /// /// Get the supported contexts. /// /// /// Gets the supported contexts. /// /// The supported contexts. public HashSet SupportedContexts { get; private set; } /// /// Get whether or not the QRESYNC feature has been enabled. /// /// /// Gets whether or not the QRESYNC feature has been enabled. /// /// if the QRESYNC feature has been enabled; otherwise, . public bool QResyncEnabled { get; internal set; } /// /// Get whether or not the UTF8=ACCEPT feature has been enabled. /// /// /// Gets whether or not the UTF8=ACCEPT feature has been enabled. /// /// if the UTF8=ACCEPT feature has been enabled; otherwise, . public bool UTF8Enabled { get; internal set; } /// /// Get the URI of the IMAP server. /// /// /// Gets the URI of the IMAP server. /// /// The URI of the IMAP server. public Uri? Uri { get; internal set; } /// /// Get the underlying IMAP stream. /// /// /// Gets the underlying IMAP stream. /// /// The IMAP stream. public ImapStream? Stream { get; private set; } /// /// Get or sets the state of the engine. /// /// /// Gets or sets the state of the engine. /// /// The engine state. public ImapEngineState State { get; internal set; } /// /// Get whether or not the engine is currently connected to a IMAP server. /// /// /// Gets whether or not the engine is currently connected to a IMAP server. /// /// if the engine is connected; otherwise, . [MemberNotNullWhen (true, nameof (Stream))] public bool IsConnected { get { return Stream != null && Stream.IsConnected; } } /// /// Get whether or not the client is currently in the IDLE state. /// /// /// Gets whether or not the client is currently in the IDLE state. /// /// if an IDLE command is active; otherwise, . [MemberNotNullWhen (true, nameof (Stream))] public bool IsIdle { get { return IsConnected && State == ImapEngineState.Idle; } } /// /// Get whether or not the connection is secure (typically via SSL or TLS). /// /// /// Gets whether or not the connection is secure (typically via SSL or TLS). /// /// if the connection is secure; otherwise, . [MemberNotNullWhen (true, nameof (Stream))] public bool IsSecure { get { return IsConnected && secure; } set { secure = value; } } /// /// Gets the personal folder namespaces. /// /// /// Gets the personal folder namespaces. /// /// The personal folder namespaces. public FolderNamespaceCollection PersonalNamespaces { get; private set; } /// /// Gets the shared folder namespaces. /// /// /// Gets the shared folder namespaces. /// /// The shared folder namespaces. public FolderNamespaceCollection SharedNamespaces { get; private set; } /// /// Gets the other folder namespaces. /// /// /// Gets the other folder namespaces. /// /// The other folder namespaces. public FolderNamespaceCollection OtherNamespaces { get; private set; } /// /// Gets the selected folder. /// /// /// Gets the selected folder. /// /// The selected folder. public ImapFolder? Selected { get; internal set; } /// /// Gets a value indicating whether the engine is disposed. /// /// /// Gets a value indicating whether the engine is disposed. /// /// if the engine is disposed; otherwise, . public bool IsDisposed { get { return disposed; } } /// /// Gets whether the current NOTIFY status prevents using indexes and * for referencing messages. /// /// /// Gets whether the current NOTIFY status prevents using indexes and * for referencing messages. This is the case when the client has asked for MessageNew or MessageExpunge events on the SELECTED mailbox. /// /// if the use of indexes and * is prevented; otherwise, . internal bool NotifySelectedNewExpunge { get; set; } #region Special Folders /// /// Gets the Inbox folder. /// /// The Inbox folder. public ImapFolder? Inbox { get; private set; } /// /// Gets the special folder containing an aggregate of all messages. /// /// The folder containing all messages. public ImapFolder? All { get; private set; } /// /// Gets the special archive folder. /// /// The archive folder. public ImapFolder? Archive { get; private set; } /// /// Gets the special folder containing drafts. /// /// The drafts folder. public ImapFolder? Drafts { get; private set; } /// /// Gets the special folder containing flagged messages. /// /// The flagged folder. public ImapFolder? Flagged { get; private set; } /// /// Gets the special folder containing important messages. /// /// The important folder. public ImapFolder? Important { get; private set; } /// /// Gets the special folder containing junk messages. /// /// The junk folder. public ImapFolder? Junk { get; private set; } /// /// Gets the special folder containing sent messages. /// /// The sent. public ImapFolder? Sent { get; private set; } /// /// Gets the folder containing deleted messages. /// /// The trash folder. public ImapFolder? Trash { get; private set; } #endregion internal ImapFolder CreateImapFolder (string encodedName, FolderAttributes attributes, char delim) { var args = new ImapFolderConstructorArgs (this, encodedName, attributes, delim); return createImapFolder (args); } internal static ImapProtocolException UnexpectedToken (string format, params object[] args) { for (int i = 0; i < args.Length; i++) { if (args[i] is ImapToken token) { switch (token.Type) { case ImapTokenType.Atom: args[i] = string.Format ("Unexpected atom token: {0}", token); break; case ImapTokenType.Flag: args[i] = string.Format ("Unexpected flag token: {0}", token); break; case ImapTokenType.QString: args[i] = string.Format ("Unexpected qstring token: {0}", token); break; case ImapTokenType.Literal: args[i] = string.Format ("Unexpected literal token: {0}", token); break; default: args[i] = string.Format ("Unexpected token: {0}", token); break; } break; } } return new ImapProtocolException (string.Format (CultureInfo.InvariantCulture, format, args)) { UnexpectedToken = true }; } internal static void AssertToken (ImapToken token, ImapTokenType type, string format, params object[] args) { if (token.Type != type) throw UnexpectedToken (format, args); } internal static void AssertToken (ImapToken token, ImapTokenType type1, ImapTokenType type2, string format, params object[] args) { if (token.Type != type1 && token.Type != type2) throw UnexpectedToken (format, args); } internal static uint ParseNumber (ImapToken token, bool nonZero, string format, params object[] args) { AssertToken (token, ImapTokenType.Atom, format, args); // Note: Broken IMAP servers such as mail.ru sometimes incorrectly format integers as numbers with decimals and exponents. (e.g. 9.3736e+06) // See https://github.com/jstedfast/MailKit/issues/1838 and https://github.com/jstedfast/MailKit/issues/1840 for details. if (!uint.TryParse ((string) token.Value, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out var value) || (nonZero && value == 0)) throw UnexpectedToken (format, args); return value; } internal static ulong ParseNumber64 (ImapToken token, bool nonZero, string format, params object[] args) { AssertToken (token, ImapTokenType.Atom, format, args); if (!ulong.TryParse ((string) token.Value, NumberStyles.None, CultureInfo.InvariantCulture, out var value) || (nonZero && value == 0)) throw UnexpectedToken (format, args); return value; } internal static bool TryParseNumber64 (ImapToken token, out ulong value) { return ulong.TryParse ((string) token.Value, NumberStyles.None, CultureInfo.InvariantCulture, out value); } internal static UniqueIdSet ParseUidSet (ImapToken token, uint validity, out UniqueId? minValue, out UniqueId? maxValue, string format, params object[] args) { AssertToken (token, ImapTokenType.Atom, format, args); if (!UniqueIdSet.TryParse ((string) token.Value, validity, out var uids, out minValue, out maxValue)) throw UnexpectedToken (format, args); return uids; } /// /// Sets the stream - this is only here to be used by the unit tests. /// /// The IMAP stream. internal void SetStream (ImapStream stream) { Stream = stream; } public NetworkOperation StartNetworkOperation (NetworkOperationKind kind, Uri? uri = null) { #if NET6_0_OR_GREATER return NetworkOperation.Start (kind, uri ?? Uri!, Telemetry.ImapClient.ActivitySource, metrics); #else return NetworkOperation.Start (kind, uri ?? Uri!); #endif } [MemberNotNull (nameof (Stream))] void Initialize (ImapStream stream) { clientConnectedTimestamp = Stopwatch.GetTimestamp (); ProtocolVersion = ImapProtocolVersion.Unknown; Capabilities = ImapCapabilities.None; AuthenticationMechanisms.Clear (); CompressionAlgorithms.Clear (); ThreadingAlgorithms.Clear (); SupportedCharsets.Clear (); SupportedContexts.Clear (); Rights.Clear (); secure = stream.Stream is SslStream; State = ImapEngineState.Connecting; QuirksMode = ImapQuirksMode.None; SupportedCharsets.Add ("US-ASCII"); SupportedCharsets.Add ("UTF-8"); CapabilitiesVersion = 0; QResyncEnabled = false; UTF8Enabled = false; AppendLimit = null; Selected = null; Stream = stream; I18NLevel = 0; Tag = 0; } ImapEngineState ParseConnectedState (ImapToken token, out bool bye) { var atom = (string) token.Value; bye = false; if (atom.Equals ("OK", StringComparison.OrdinalIgnoreCase)) { return ImapEngineState.Connected; } else if (atom.Equals ("BYE", StringComparison.OrdinalIgnoreCase)) { bye = true; return State; } else if (atom.Equals ("PREAUTH", StringComparison.OrdinalIgnoreCase)) { return ImapEngineState.Authenticated; } else { throw UnexpectedToken (GreetingSyntaxErrorFormat, token); } } void DetectQuirksMode (string text) { if (text.StartsWith ("Courier-IMAP ready.", StringComparison.Ordinal)) QuirksMode = ImapQuirksMode.Courier; else if (text.Contains (" Cyrus IMAP ")) QuirksMode = ImapQuirksMode.Cyrus; else if (text.StartsWith ("Domino IMAP4 Server", StringComparison.Ordinal)) QuirksMode = ImapQuirksMode.Domino; else if (text.StartsWith ("Dovecot ready.", StringComparison.Ordinal)) QuirksMode = ImapQuirksMode.Dovecot; else if (text.StartsWith ("Microsoft Exchange Server 2003 IMAP4rev1", StringComparison.Ordinal)) QuirksMode = ImapQuirksMode.Exchange2003; else if (text.StartsWith ("Microsoft Exchange Server 2007 IMAP4 service is ready", StringComparison.Ordinal)) QuirksMode = ImapQuirksMode.Exchange2007; else if (text.StartsWith ("The Microsoft Exchange IMAP4 service is ready.", StringComparison.Ordinal)) QuirksMode = ImapQuirksMode.Exchange; else if (text.StartsWith ("Gimap ready", StringComparison.Ordinal)) QuirksMode = ImapQuirksMode.GMail; else if (text.Contains ("QQMail ")) QuirksMode = ImapQuirksMode.QQMail; else if (text.StartsWith ("IMAPrev1", StringComparison.Ordinal)) // https://github.com/hmailserver/hmailserver/blob/master/hmailserver/source/Server/IMAP/IMAPConnection.cpp#L127 QuirksMode = ImapQuirksMode.hMailServer; else if (text.Contains (" IMAP4rev1 2007f.") || text.Contains (" Panda IMAP ")) QuirksMode = ImapQuirksMode.UW; else if (text.Contains ("SmarterMail")) QuirksMode = ImapQuirksMode.SmarterMail; else if (text.Contains ("Yandex ")) QuirksMode = ImapQuirksMode.Yandex; else if (text.Contains ("Zoho Mail ")) QuirksMode = ImapQuirksMode.Zoho; } /// /// Takes possession of the and reads the greeting. /// /// The IMAP stream. /// The cancellation token. /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public void Connect (ImapStream stream, CancellationToken cancellationToken) { Initialize (stream); try { var token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Asterisk, GreetingSyntaxErrorFormat, token); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Atom, GreetingSyntaxErrorFormat, token); var state = ParseConnectedState (token, out bool bye); var text = string.Empty; token = ReadToken (cancellationToken); if (token.Type == ImapTokenType.OpenBracket) { var code = ParseResponseCode (false, cancellationToken); if (code.Type == ImapResponseCodeType.Alert) { OnAlert (code.Message); if (bye) throw new ImapProtocolException (code.Message); } else { text = code.Message; } } else if (token.Type != ImapTokenType.Eoln) { text = ReadLine (cancellationToken).TrimEnd (); text = token.Value.ToString () + text; if (bye) throw new ImapProtocolException (text); } else if (bye) { throw new ImapProtocolException ("The IMAP server unexpectedly refused the connection."); } DetectQuirksMode (text); State = state; } catch (Exception ex) { Disconnect (ex); throw; } } /// /// Takes possession of the and reads the greeting. /// /// The IMAP stream. /// The cancellation token. /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public async Task ConnectAsync (ImapStream stream, CancellationToken cancellationToken) { Initialize (stream); try { var token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Asterisk, GreetingSyntaxErrorFormat, token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Atom, GreetingSyntaxErrorFormat, token); var state = ParseConnectedState (token, out bool bye); var text = string.Empty; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenBracket) { var code = await ParseResponseCodeAsync (false, cancellationToken).ConfigureAwait (false); if (code.Type == ImapResponseCodeType.Alert) { OnAlert (code.Message); if (bye) throw new ImapProtocolException (code.Message); } else { text = code.Message; } } else if (token.Type != ImapTokenType.Eoln) { text = (await ReadLineAsync (cancellationToken).ConfigureAwait (false)).TrimEnd (); text = token.Value.ToString () + text; if (bye) throw new ImapProtocolException (text); } else if (bye) { throw new ImapProtocolException ("The IMAP server unexpectedly refused the connection."); } DetectQuirksMode (text); State = state; } catch (Exception ex) { Disconnect (ex); throw; } } void RecordClientDisconnected (Exception? ex) { #if NET6_0_OR_GREATER metrics?.RecordClientDisconnected (clientConnectedTimestamp, Uri!, ex); #endif clientConnectedTimestamp = 0; } /// /// Disconnects the . /// /// /// Disconnects the . /// /// The exception that is causing the disconnection. public void Disconnect (Exception? ex) { RecordClientDisconnected (ex); if (Selected != null) { Selected.Reset (); Selected.OnClosed (); Selected = null; } current = null; if (Stream != null) { Stream.Dispose (); Stream = null; } secure = false; if (State != ImapEngineState.Disconnected) { State = ImapEngineState.Disconnected; OnDisconnected (); } } /// /// Reads a single line from the . /// /// The line. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public string ReadLine (CancellationToken cancellationToken) { using (var builder = new ByteArrayBuilder (64)) { bool complete; do { complete = Stream!.ReadLine (builder, cancellationToken); } while (!complete); // FIXME: All callers expect CRLF to be trimmed, but many also want all trailing whitespace trimmed. builder.TrimNewLine (); return builder.ToString (); } } /// /// Asynchronously reads a single line from the . /// /// The line. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public async Task ReadLineAsync (CancellationToken cancellationToken) { using (var builder = new ByteArrayBuilder (64)) { bool complete; do { complete = await Stream!.ReadLineAsync (builder, cancellationToken).ConfigureAwait (false); } while (!complete); // FIXME: All callers expect CRLF to be trimmed, but many also want all trailing whitespace trimmed. builder.TrimNewLine (); return builder.ToString (); } } /// /// Reads the next token. /// /// The token. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public ImapToken ReadToken (CancellationToken cancellationToken) { return Stream!.ReadToken (cancellationToken); } /// /// Asynchronously reads the next token. /// /// The token. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public ValueTask ReadTokenAsync (CancellationToken cancellationToken) { return Stream!.ReadTokenAsync (cancellationToken); } /// /// Reads the next token. /// /// The token. /// A list of characters that are not legal in bare string tokens. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public ImapToken ReadToken (string specials, CancellationToken cancellationToken) { return Stream!.ReadToken (specials, cancellationToken); } /// /// Asynchronously reads the next token. /// /// The token. /// A list of characters that are not legal in bare string tokens. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public ValueTask ReadTokenAsync (string specials, CancellationToken cancellationToken) { return Stream!.ReadTokenAsync (specials, cancellationToken); } /// /// Peeks at the next token. /// /// The next token. /// A list of characters that are not legal in bare string tokens. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public ImapToken PeekToken (string specials, CancellationToken cancellationToken) { var token = Stream!.ReadToken (specials, cancellationToken); Stream.UngetToken (token); return token; } /// /// Asynchronously peeks at the next token. /// /// The next token. /// A list of characters that are not legal in bare string tokens. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public async ValueTask PeekTokenAsync (string specials, CancellationToken cancellationToken) { var token = await Stream!.ReadTokenAsync (specials, cancellationToken).ConfigureAwait (false); Stream.UngetToken (token); return token; } /// /// Peeks at the next token. /// /// The next token. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public ImapToken PeekToken (CancellationToken cancellationToken) { var token = Stream!.ReadToken (cancellationToken); Stream.UngetToken (token); return token; } /// /// Asynchronously peeks at the next token. /// /// The next token. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An IMAP protocol error occurred. /// public async ValueTask PeekTokenAsync (CancellationToken cancellationToken) { var token = await Stream!.ReadTokenAsync (cancellationToken).ConfigureAwait (false); Stream.UngetToken (token); return token; } /// /// Unget a token. /// /// /// Ungets a token. /// /// The token. public void UngetToken (ImapToken token) { Stream!.UngetToken (token); } /// /// Reads the literal as a string. /// /// The literal. /// The cancellation token. /// /// The is not in literal mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public string ReadLiteral (CancellationToken cancellationToken) { if (Stream!.Mode != ImapStreamMode.Literal) throw new InvalidOperationException (); int literalLength = Stream.LiteralLength; var buf = ArrayPool.Shared.Rent (literalLength); try { int n, nread = 0; do { if ((n = Stream.Read (buf, nread, literalLength - nread, cancellationToken)) > 0) nread += n; } while (nread < literalLength); try { return TextEncodings.UTF8.GetString (buf, 0, nread); } catch { return TextEncodings.Latin1.GetString (buf, 0, nread); } } finally { ArrayPool.Shared.Return (buf); } } /// /// Asynchronously reads the literal as a string. /// /// The literal. /// The cancellation token. /// /// The is not in literal mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public async Task ReadLiteralAsync (CancellationToken cancellationToken) { if (Stream!.Mode != ImapStreamMode.Literal) throw new InvalidOperationException (); int literalLength = Stream.LiteralLength; var buf = ArrayPool.Shared.Rent (literalLength); try { int n, nread = 0; do { if ((n = await Stream.ReadAsync (buf, nread, literalLength - nread, cancellationToken).ConfigureAwait (false)) > 0) nread += n; } while (nread < literalLength); try { return TextEncodings.UTF8.GetString (buf, 0, nread); } catch { return TextEncodings.Latin1.GetString (buf, 0, nread); } } finally { ArrayPool.Shared.Return (buf); } } void SkipLine (CancellationToken cancellationToken) { ImapToken token; do { token = ReadToken (cancellationToken); if (token.Type == ImapTokenType.Literal) { var buf = ArrayPool.Shared.Rent (BufferSize); int nread; try { do { nread = Stream!.Read (buf, 0, BufferSize, cancellationToken); } while (nread > 0); } finally { ArrayPool.Shared.Return (buf); } } } while (token.Type != ImapTokenType.Eoln); } async Task SkipLineAsync (CancellationToken cancellationToken) { ImapToken token; do { token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Literal) { var buf = ArrayPool.Shared.Rent (BufferSize); int nread; try { do { nread = await Stream!.ReadAsync (buf, 0, BufferSize, cancellationToken).ConfigureAwait (false); } while (nread > 0); } finally { ArrayPool.Shared.Return (buf); } } } while (token.Type != ImapTokenType.Eoln); } static bool TryParseUInt32 (string text, int startIndex, out uint value) { #if NETSTANDARD2_1_OR_GREATER || NET5_0_OR_GREATER var token = text.AsSpan (startIndex); #else var token = text.Substring (startIndex); #endif return uint.TryParse (token, NumberStyles.None, CultureInfo.InvariantCulture, out value); } void ResetCapabilities () { // Clear the extensions except STARTTLS so that this capability stays set after a STARTTLS command. ProtocolVersion = ImapProtocolVersion.Unknown; Capabilities &= ImapCapabilities.StartTLS; AuthenticationMechanisms.Clear (); CompressionAlgorithms.Clear (); ThreadingAlgorithms.Clear (); SupportedContexts.Clear (); CapabilitiesVersion++; AppendLimit = null; Rights.Clear (); I18NLevel = 0; } void ProcessCapabilityToken (string atom) { if (atom.StartsWith ("AUTH=", StringComparison.OrdinalIgnoreCase)) { AuthenticationMechanisms.Add (atom.Substring ("AUTH=".Length)); } else if (atom.StartsWith ("APPENDLIMIT", StringComparison.OrdinalIgnoreCase)) { if (atom.Length >= "APPENDLIMIT".Length) { if (atom.Length >= "APPENDLIMIT=".Length && TryParseUInt32 (atom, "APPENDLIMIT=".Length, out uint limit)) AppendLimit = limit; Capabilities |= ImapCapabilities.AppendLimit; } } else if (atom.StartsWith ("COMPRESS=", StringComparison.OrdinalIgnoreCase)) { CompressionAlgorithms.Add (atom.Substring ("COMPRESS=".Length)); Capabilities |= ImapCapabilities.Compress; } else if (atom.StartsWith ("CONTEXT=", StringComparison.OrdinalIgnoreCase)) { SupportedContexts.Add (atom.Substring ("CONTEXT=".Length)); Capabilities |= ImapCapabilities.Context; } else if (atom.StartsWith ("I18NLEVEL=", StringComparison.OrdinalIgnoreCase)) { if (TryParseUInt32 (atom, "I18NLEVEL=".Length, out uint level)) I18NLevel = (int) level; Capabilities |= ImapCapabilities.I18NLevel; } else if (atom.StartsWith ("RIGHTS=", StringComparison.OrdinalIgnoreCase)) { var rights = atom.Substring ("RIGHTS=".Length); Rights.AddRange (rights); } else if (atom.StartsWith ("THREAD=", StringComparison.OrdinalIgnoreCase)) { if (string.Compare ("ORDEREDSUBJECT", 0, atom, "THREAD=".Length, "ORDEREDSUBJECT".Length, StringComparison.OrdinalIgnoreCase) == 0) ThreadingAlgorithms.Add (ThreadingAlgorithm.OrderedSubject); else if (string.Compare ("REFERENCES", 0, atom, "THREAD=".Length, "REFERENCES".Length, StringComparison.OrdinalIgnoreCase) == 0) ThreadingAlgorithms.Add (ThreadingAlgorithm.References); Capabilities |= ImapCapabilities.Thread; } else if (atom.Equals ("IMAP4", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.IMAP4; } else if (atom.Equals ("IMAP4REV1", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.IMAP4rev1; } else if (atom.Equals ("IMAP4REV2", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.IMAP4rev2; } else if (atom.Equals ("STATUS", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Status; } else if (atom.Equals ("ACL", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Acl; } else if (atom.Equals ("QUOTA", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Quota; } else if (atom.Equals ("LITERAL+", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.LiteralPlus; } else if (atom.Equals ("IDLE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Idle; } else if (atom.Equals ("MAILBOX-REFERRALS", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.MailboxReferrals; } else if (atom.Equals ("LOGIN-REFERRALS", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.LoginReferrals; } else if (atom.Equals ("NAMESPACE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Namespace; } else if (atom.Equals ("ID", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Id; } else if (atom.Equals ("CHILDREN", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Children; } else if (atom.Equals ("LOGINDISABLED", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.LoginDisabled; } else if (atom.Equals ("STARTTLS", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.StartTLS; } else if (atom.Equals ("MULTIAPPEND", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.MultiAppend; } else if (atom.Equals ("BINARY", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Binary; } else if (atom.Equals ("UNSELECT", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Unselect; } else if (atom.Equals ("UIDPLUS", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.UidPlus; } else if (atom.Equals ("CATENATE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Catenate; } else if (atom.Equals ("CONDSTORE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.CondStore; } else if (atom.Equals ("ESEARCH", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.ESearch; } else if (atom.Equals ("SASL-IR", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.SaslIR; } else if (atom.Equals ("WITHIN", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Within; } else if (atom.Equals ("ENABLE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Enable; } else if (atom.Equals ("QRESYNC", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.QuickResync; } else if (atom.Equals ("SEARCHRES", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.SearchResults; } else if (atom.Equals ("SORT", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Sort; } else if (atom.Equals ("ANNOTATE-EXPERIMENT-1", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Annotate; } else if (atom.Equals ("LIST-EXTENDED", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.ListExtended; } else if (atom.Equals ("CONVERT", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Convert; } else if (atom.Equals ("LANGUAGE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Language; } else if (atom.Equals ("ESORT", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.ESort; } else if (atom.Equals ("METADATA", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Metadata; } else if (atom.Equals ("METADATA-SERVER", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.MetadataServer; } else if (atom.Equals ("NOTIFY", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Notify; } else if (atom.Equals ("FILTERS", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Filters; } else if (atom.Equals ("LIST-STATUS", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.ListStatus; } else if (atom.Equals ("SORT=DISPLAY", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.SortDisplay; } else if (atom.Equals ("CREATE-SPECIAL-USE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.CreateSpecialUse; } else if (atom.Equals ("SPECIAL-USE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.SpecialUse; } else if (atom.Equals ("SEARCH=FUZZY", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.FuzzySearch; } else if (atom.Equals ("MULTISEARCH", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.MultiSearch; } else if (atom.Equals ("MOVE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Move; } else if (atom.Equals ("UTF8=ACCEPT", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.UTF8Accept; } else if (atom.Equals ("UTF8=ONLY", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.UTF8Only; } else if (atom.Equals ("LITERAL-", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.LiteralMinus; } else if (atom.Equals ("UNAUTHENTICATE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Unauthenticate; } else if (atom.Equals ("STATUS=SIZE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.StatusSize; } else if (atom.Equals ("LIST-MYRIGHTS", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.ListMyRights; } else if (atom.Equals ("OBJECTID", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.ObjectID; } else if (atom.Equals ("REPLACE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Replace; } else if (atom.Equals ("SAVEDATE", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.SaveDate; } else if (atom.Equals ("PREVIEW", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.Preview; } else if (atom.Equals ("XLIST", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.XList; } else if (atom.Equals ("X-GM-EXT-1", StringComparison.OrdinalIgnoreCase)) { Capabilities |= ImapCapabilities.GMailExt1; QuirksMode = ImapQuirksMode.GMail; } else if (atom.Equals ("XSTOP", StringComparison.OrdinalIgnoreCase)) { QuirksMode = ImapQuirksMode.ProtonMail; } else if (atom.Equals ("XAPPLEPUSHSERVICE", StringComparison.OrdinalIgnoreCase)) { QuirksMode = ImapQuirksMode.iCloud; } else if (atom.Equals ("XYMHIGHESTMODSEQ", StringComparison.OrdinalIgnoreCase)) { QuirksMode = ImapQuirksMode.Yahoo; } } void StandardizeCapabilities () { if ((Capabilities & ImapCapabilities.IMAP4rev2) != 0) { ProtocolVersion = ImapProtocolVersion.IMAP4rev2; // Rfc9051, Appendix E defines the capabilities that IMAP4rev2 should be assumed to implement: Capabilities |= ImapCapabilities.Status | ImapCapabilities.Namespace | ImapCapabilities.Unselect | ImapCapabilities.UidPlus | ImapCapabilities.ESearch | ImapCapabilities.SearchResults | ImapCapabilities.Enable | ImapCapabilities.Idle | ImapCapabilities.SaslIR | ImapCapabilities.ListExtended | ImapCapabilities.ListStatus | ImapCapabilities.Move | ImapCapabilities.LiteralMinus | ImapCapabilities.SpecialUse; // Note: IMAP4rev2 also supports the FETCH portion of the 'BINARY' extension but not the APPEND portion. Since // we currently have no way to distinguish between them using the ImapCapabilities enum, we do not enable the // ImapCapabilities.Binary extension flag. } else if ((Capabilities & ImapCapabilities.IMAP4rev1) != 0) { ProtocolVersion = ImapProtocolVersion.IMAP4rev1; Capabilities |= ImapCapabilities.Status; } else if ((Capabilities & ImapCapabilities.IMAP4) != 0) { ProtocolVersion = ImapProtocolVersion.IMAP4; } if ((Capabilities & ImapCapabilities.QuickResync) != 0) Capabilities |= ImapCapabilities.CondStore; if ((Capabilities & ImapCapabilities.UTF8Only) != 0) Capabilities |= ImapCapabilities.UTF8Accept; } void UpdateCapabilities (ImapTokenType sentinel, CancellationToken cancellationToken) { ResetCapabilities (); var token = ReadToken (cancellationToken); // Note: Some buggy IMAP servers mistakenly put a space between "LITERAL" and "+" which causes our tokenizer to read // a '+' token thereby causing an "Unexpected token: '+'" exception to be thrown. If we treat '+' tokens as atoms // like we did in v4.1.0 (and older), then we can avoid this exception. // // See https://github.com/jstedfast/MailKit/issues/1654 for details. while (token.Type == ImapTokenType.Atom) { var atom = token.Value.ToString (); ProcessCapabilityToken (atom!); token = ReadToken (cancellationToken); } AssertToken (token, sentinel, GenericItemSyntaxErrorFormat, "CAPABILITIES", token); // unget the sentinel UngetToken (token); StandardizeCapabilities (); } async Task UpdateCapabilitiesAsync (ImapTokenType sentinel, CancellationToken cancellationToken) { ResetCapabilities (); var token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); // Note: Some buggy IMAP servers mistakenly put a space between "LITERAL" and "+" which causes our tokenizer to read // a '+' token thereby causing an "Unexpected token: '+'" exception to be thrown. If we treat '+' tokens as atoms // like we did in v4.1.0 (and older), then we can avoid this exception. // // See https://github.com/jstedfast/MailKit/issues/1654 for details. while (token.Type == ImapTokenType.Atom) { var atom = token.Value.ToString (); ProcessCapabilityToken (atom!); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); } AssertToken (token, sentinel, GenericItemSyntaxErrorFormat, "CAPABILITIES", token); // unget the sentinel UngetToken (token); StandardizeCapabilities (); } void UpdateNamespaces (CancellationToken cancellationToken) { var namespaces = new List { PersonalNamespaces, OtherNamespaces, SharedNamespaces }; ImapToken token; string path; char delim; int n = 0; PersonalNamespaces.Clear (); SharedNamespaces.Clear (); OtherNamespaces.Clear (); token = ReadToken (cancellationToken); do { if (token.Type == ImapTokenType.OpenParen) { // parse the list of namespace pairs... token = ReadToken (cancellationToken); while (token.Type == ImapTokenType.OpenParen) { // parse the namespace pair - first token is the path token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); path = (string) token.Value; // second token is the directory separator token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.QString, ImapTokenType.Nil, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); var qstring = token.Type == ImapTokenType.Nil ? string.Empty : (string) token.Value; if (qstring.Length > 0) { delim = qstring[0]; // canonicalize the namespace path path = path.TrimEnd (delim); } else { delim = '\0'; } namespaces[n].Add (new FolderNamespace (delim, DecodeMailboxName (path))); if (!TryGetCachedFolder (path, out var folder)) { folder = CreateImapFolder (path, FolderAttributes.None, delim); CacheFolder (folder); } folder.UpdateIsNamespace (true); do { token = ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; // NAMESPACE extension AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.OpenParen, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); do { token = ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); } while (true); } while (true); // read the next token - it should either be '(' or ')' token = ReadToken (cancellationToken); } AssertToken (token, ImapTokenType.CloseParen, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); } else { AssertToken (token, ImapTokenType.Nil, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); } token = ReadToken (cancellationToken); n++; } while (n < 3); while (token.Type != ImapTokenType.Eoln) token = ReadToken (cancellationToken); } async ValueTask UpdateNamespacesAsync (CancellationToken cancellationToken) { var namespaces = new List { PersonalNamespaces, OtherNamespaces, SharedNamespaces }; ImapToken token; string path; char delim; int n = 0; PersonalNamespaces.Clear (); SharedNamespaces.Clear (); OtherNamespaces.Clear (); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); do { if (token.Type == ImapTokenType.OpenParen) { // parse the list of namespace pairs... token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); while (token.Type == ImapTokenType.OpenParen) { // parse the namespace pair - first token is the path token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); path = (string) token.Value; // second token is the directory separator token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.QString, ImapTokenType.Nil, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); var qstring = token.Type == ImapTokenType.Nil ? string.Empty : (string) token.Value; if (qstring.Length > 0) { delim = qstring[0]; // canonicalize the namespace path path = path.TrimEnd (delim); } else { delim = '\0'; } namespaces[n].Add (new FolderNamespace (delim, DecodeMailboxName (path))); if (!TryGetCachedFolder (path, out var folder)) { folder = CreateImapFolder (path, FolderAttributes.None, delim); CacheFolder (folder); } folder.UpdateIsNamespace (true); do { token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; // NAMESPACE extension AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.OpenParen, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); do { token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); } while (true); } while (true); // read the next token - it should either be '(' or ')' token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); } AssertToken (token, ImapTokenType.CloseParen, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); } else { AssertToken (token, ImapTokenType.Nil, GenericUntaggedResponseSyntaxErrorFormat, "NAMESPACE", token); } token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); n++; } while (n < 3); while (token.Type != ImapTokenType.Eoln) token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); } void ProcessResponseCodes (ImapCommand ic) { foreach (var code in ic.RespCodes) { switch (code.Type) { case ImapResponseCodeType.Alert: OnAlert (code.Message); break; case ImapResponseCodeType.WebAlert: var webAlert = (WebAlertResponseCode) code; if (webAlert.WebUri != null) OnWebAlert (webAlert.WebUri, code.Message); break; case ImapResponseCodeType.NotificationOverflow: OnNotificationOverflow (); break; } } } void EmitMetadataChanged (Metadata metadata) { var encodedName = metadata.EncodedName; if (encodedName.Length == 0) { OnMetadataChanged (metadata); } else if (FolderCache.TryGetValue (encodedName, out var folder)) { folder.OnMetadataChanged (metadata); } } internal MetadataCollection FilterMetadata (MetadataCollection metadata, string encodedName) { for (int i = 0; i < metadata.Count; i++) { if (metadata[i].EncodedName == encodedName) continue; EmitMetadataChanged (metadata[i]); metadata.RemoveAt (i); i--; } return metadata; } internal void ProcessMetadataChanges (MetadataCollection metadata) { for (int i = 0; i < metadata.Count; i++) EmitMetadataChanged (metadata[i]); } internal static ImapResponseCodeType GetResponseCodeType (string atom) { if (atom.Equals ("ALERT", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Alert; if (atom.Equals ("BADCHARSET", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.BadCharset; if (atom.Equals ("CAPABILITY", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Capability; if (atom.Equals ("NEWNAME", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.NewName; if (atom.Equals ("PARSE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Parse; if (atom.Equals ("PERMANENTFLAGS", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.PermanentFlags; if (atom.Equals ("READ-ONLY", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.ReadOnly; if (atom.Equals ("READ-WRITE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.ReadWrite; if (atom.Equals ("TRYCREATE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.TryCreate; if (atom.Equals ("UIDNEXT", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.UidNext; if (atom.Equals ("UIDVALIDITY", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.UidValidity; if (atom.Equals ("UNSEEN", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Unseen; if (atom.Equals ("REFERRAL", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Referral; if (atom.Equals ("UNKNOWN-CTE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.UnknownCte; if (atom.Equals ("APPENDUID", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.AppendUid; if (atom.Equals ("COPYUID", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.CopyUid; if (atom.Equals ("UIDNOTSTICKY", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.UidNotSticky; if (atom.Equals ("URLMECH", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.UrlMech; if (atom.Equals ("BADURL", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.BadUrl; if (atom.Equals ("TOOBIG", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.TooBig; if (atom.Equals ("HIGHESTMODSEQ", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.HighestModSeq; if (atom.Equals ("MODIFIED", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Modified; if (atom.Equals ("NOMODSEQ", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.NoModSeq; if (atom.Equals ("COMPRESSIONACTIVE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.CompressionActive; if (atom.Equals ("CLOSED", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Closed; if (atom.Equals ("NOTSAVED", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.NotSaved; if (atom.Equals ("BADCOMPARATOR", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.BadComparator; if (atom.Equals ("ANNOTATE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Annotate; if (atom.Equals ("ANNOTATIONS", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Annotations; if (atom.Equals ("MAXCONVERTMESSAGES", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.MaxConvertMessages; if (atom.Equals ("MAXCONVERTPARTS", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.MaxConvertParts; if (atom.Equals ("TEMPFAIL", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.TempFail; if (atom.Equals ("NOUPDATE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.NoUpdate; if (atom.Equals ("METADATA", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Metadata; if (atom.Equals ("NOTIFICATIONOVERFLOW", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.NotificationOverflow; if (atom.Equals ("BADEVENT", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.BadEvent; if (atom.Equals ("UNDEFINED-FILTER", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.UndefinedFilter; if (atom.Equals ("UNAVAILABLE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Unavailable; if (atom.Equals ("AUTHENTICATIONFAILED", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.AuthenticationFailed; if (atom.Equals ("AUTHORIZATIONFAILED", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.AuthorizationFailed; if (atom.Equals ("EXPIRED", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Expired; if (atom.Equals ("PRIVACYREQUIRED", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.PrivacyRequired; if (atom.Equals ("CONTACTADMIN", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.ContactAdmin; if (atom.Equals ("NOPERM", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.NoPerm; if (atom.Equals ("INUSE", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.InUse; if (atom.Equals ("EXPUNGEISSUED", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.ExpungeIssued; if (atom.Equals ("CORRUPTION", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Corruption; if (atom.Equals ("SERVERBUG", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.ServerBug; if (atom.Equals ("CLIENTBUG", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.ClientBug; if (atom.Equals ("CANNOT", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.CanNot; if (atom.Equals ("LIMIT", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.Limit; if (atom.Equals ("OVERQUOTA", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.OverQuota; if (atom.Equals ("ALREADYEXISTS", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.AlreadyExists; if (atom.Equals ("NONEXISTENT", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.NonExistent; if (atom.Equals ("USEATTR", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.UseAttr; if (atom.Equals ("MAILBOXID", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.MailboxId; if (atom.Equals ("WEBALERT", StringComparison.OrdinalIgnoreCase)) return ImapResponseCodeType.WebAlert; return ImapResponseCodeType.Unknown; } /// /// Parses the response code. /// /// The response code. /// Whether or not the resp-code is tagged vs untagged. /// The cancellation token. public ImapResponseCode ParseResponseCode (bool isTagged, CancellationToken cancellationToken) { uint validity = Selected != null ? Selected.UidValidity : 0; ImapResponseCode code; string atom, value; ImapToken token; // token = ReadToken (cancellationToken); // // if (token.Type != ImapTokenType.LeftBracket) { // Debug.WriteLine ("Expected a '[' followed by a RESP-CODE, but got: {0}", token); // throw UnexpectedToken (token, false); // } token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Atom, "Syntax error in response code. {0}", token); atom = (string) token.Value; token = ReadToken (cancellationToken); code = ImapResponseCode.Create (GetResponseCodeType (atom)); code.IsTagged = isTagged; switch (code.Type) { case ImapResponseCodeType.BadCharset: if (token.Type == ImapTokenType.OpenParen) { token = ReadToken (cancellationToken); SupportedCharsets.Clear (); while (token.Type == ImapTokenType.Atom || token.Type == ImapTokenType.QString) { SupportedCharsets.Add ((string) token.Value); token = ReadToken (cancellationToken); } AssertToken (token, ImapTokenType.CloseParen, GenericResponseCodeSyntaxErrorFormat, "BADCHARSET", token); token = ReadToken (cancellationToken); } break; case ImapResponseCodeType.Capability: UngetToken (token); UpdateCapabilities (ImapTokenType.CloseBracket, cancellationToken); token = ReadToken (cancellationToken); break; case ImapResponseCodeType.PermanentFlags: var perm = (PermanentFlagsResponseCode) code; UngetToken (token); perm.Flags = ImapUtils.ParseFlagsList (this, "PERMANENTFLAGS", perm.Keywords, cancellationToken); token = ReadToken (cancellationToken); break; case ImapResponseCodeType.UidNext: var next = (UidNextResponseCode) code; // Note: we allow '0' here because some servers have been known to send "* OK [UIDNEXT 0]". // The *probable* explanation here is that the folder has never been opened and/or no messages // have ever been delivered (yet) to that mailbox and so the UIDNEXT has not (yet) been // initialized. // // See https://github.com/jstedfast/MailKit/issues/1010 for an example. var uid = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "UIDNEXT", token); next.Uid = uid > 0 ? new UniqueId (uid) : UniqueId.Invalid; token = ReadToken (cancellationToken); break; case ImapResponseCodeType.UidValidity: var uidvalidity = (UidValidityResponseCode) code; // Note: we allow '0' here because some servers have been known to send "* OK [UIDVALIDITY 0]". // The *probable* explanation here is that the folder has never been opened and/or no messages // have ever been delivered (yet) to that mailbox and so the UIDVALIDITY has not (yet) been // initialized. // // See https://github.com/jstedfast/MailKit/issues/150 for an example. uidvalidity.UidValidity = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "UIDVALIDITY", token); token = ReadToken (cancellationToken); break; case ImapResponseCodeType.Unseen: var unseen = (UnseenResponseCode) code; // Note: we allow '0' here because some servers have been known to send "* OK [UNSEEN 0]" when the // mailbox contains no messages. // // See https://github.com/jstedfast/MailKit/issues/34 for details. var n = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "UNSEEN", token); unseen.Index = n > 0 ? (int) (n - 1) : 0; token = ReadToken (cancellationToken); break; case ImapResponseCodeType.NewName: var rename = (NewNameResponseCode) code; // Note: this RESP-CODE existed in rfc2060 but has been removed in rfc3501: // // 85) Remove NEWNAME. It can't work because mailbox names can be // literals and can include "]". Functionality can be addressed via // referrals. AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericResponseCodeSyntaxErrorFormat, "NEWNAME", token); rename.OldName = (string) token.Value; // the next token should be another atom or qstring token representing the new name of the folder token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericResponseCodeSyntaxErrorFormat, "NEWNAME", token); rename.NewName = (string) token.Value; token = ReadToken (cancellationToken); break; case ImapResponseCodeType.AppendUid: var append = (AppendUidResponseCode) code; append.UidValidity = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "APPENDUID", token); token = ReadToken (cancellationToken); // The MULTIAPPEND extension redefines APPENDUID's second argument to be a uid-set instead of a single uid. append.UidSet = ParseUidSet (token, append.UidValidity, out _, out _, GenericResponseCodeSyntaxErrorFormat, "APPENDUID", token); token = ReadToken (cancellationToken); break; case ImapResponseCodeType.CopyUid: var copy = (CopyUidResponseCode) code; copy.UidValidity = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "COPYUID", token); token = ReadToken (cancellationToken); // Note: Outlook.com will apparently sometimes issue a [COPYUID nz_number SPACE SPACE] resp-code // in response to a UID COPY or UID MOVE command. Likely this happens only when the source message // didn't exist or something? See https://github.com/jstedfast/MailKit/issues/555 for details. if (token.Type != ImapTokenType.CloseBracket) { copy.SrcUidSet = ParseUidSet (token, validity, out _, out _, GenericResponseCodeSyntaxErrorFormat, "COPYUID", token); } else { copy.SrcUidSet = new UniqueIdSet (); UngetToken (token); } token = ReadToken (cancellationToken); if (token.Type != ImapTokenType.CloseBracket) { copy.DestUidSet = ParseUidSet (token, copy.UidValidity, out _, out _, GenericResponseCodeSyntaxErrorFormat, "COPYUID", token); } else { copy.DestUidSet = new UniqueIdSet (); UngetToken (token); } token = ReadToken (cancellationToken); break; case ImapResponseCodeType.BadUrl: var badurl = (BadUrlResponseCode) code; AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericResponseCodeSyntaxErrorFormat, "BADURL", token); badurl.BadUrl = (string) token.Value; token = ReadToken (cancellationToken); break; case ImapResponseCodeType.HighestModSeq: var highest = (HighestModSeqResponseCode) code; highest.HighestModSeq = ParseNumber64 (token, false, GenericResponseCodeSyntaxErrorFormat, "HIGHESTMODSEQ", token); token = ReadToken (cancellationToken); break; case ImapResponseCodeType.Modified: var modified = (ModifiedResponseCode) code; modified.UidSet = ParseUidSet (token, validity, out _, out _, GenericResponseCodeSyntaxErrorFormat, "MODIFIED", token); token = ReadToken (cancellationToken); break; case ImapResponseCodeType.MaxConvertMessages: case ImapResponseCodeType.MaxConvertParts: var maxConvert = (MaxConvertResponseCode) code; maxConvert.MaxConvert = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, atom, token); token = ReadToken (cancellationToken); break; case ImapResponseCodeType.NoUpdate: var noUpdate = (NoUpdateResponseCode) code; AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericResponseCodeSyntaxErrorFormat, "NOUPDATE", token); noUpdate.Tag = (string) token.Value; token = ReadToken (cancellationToken); break; case ImapResponseCodeType.Annotate: var annotate = (AnnotateResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "ANNOTATE", token); value = (string) token.Value; if (value.Equals ("TOOBIG", StringComparison.OrdinalIgnoreCase)) annotate.SubType = AnnotateResponseCodeSubType.TooBig; else if (value.Equals ("TOOMANY", StringComparison.OrdinalIgnoreCase)) annotate.SubType = AnnotateResponseCodeSubType.TooMany; token = ReadToken (cancellationToken); break; case ImapResponseCodeType.Annotations: var annotations = (AnnotationsResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "ANNOTATIONS", token); value = (string) token.Value; if (value.Equals ("NONE", StringComparison.OrdinalIgnoreCase)) { // nothing } else if (value.Equals ("READ-ONLY", StringComparison.OrdinalIgnoreCase)) { annotations.Access = AnnotationAccess.ReadOnly; } else { annotations.Access = AnnotationAccess.ReadWrite; annotations.MaxSize = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "ANNOTATIONS", token); } token = ReadToken (cancellationToken); if (annotations.Access != AnnotationAccess.None) { annotations.Scopes = AnnotationScope.Both; if (token.Type != ImapTokenType.CloseBracket) { AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "ANNOTATIONS", token); if (((string) token.Value).Equals ("NOPRIVATE", StringComparison.OrdinalIgnoreCase)) annotations.Scopes = AnnotationScope.Shared; token = ReadToken (cancellationToken); } } break; case ImapResponseCodeType.Metadata: var metadata = (MetadataResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "METADATA", token); value = (string) token.Value; if (value.Equals ("LONGENTRIES", StringComparison.OrdinalIgnoreCase)) { metadata.SubType = MetadataResponseCodeSubType.LongEntries; metadata.IsError = false; token = ReadToken (cancellationToken); metadata.Value = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "METADATA LONGENTRIES", token); } else if (value.Equals ("MAXSIZE", StringComparison.OrdinalIgnoreCase)) { metadata.SubType = MetadataResponseCodeSubType.MaxSize; token = ReadToken (cancellationToken); metadata.Value = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "METADATA MAXSIZE", token); } else if (value.Equals ("TOOMANY", StringComparison.OrdinalIgnoreCase)) { metadata.SubType = MetadataResponseCodeSubType.TooMany; } else if (value.Equals ("NOPRIVATE", StringComparison.OrdinalIgnoreCase)) { metadata.SubType = MetadataResponseCodeSubType.NoPrivate; } token = ReadToken (cancellationToken); break; case ImapResponseCodeType.UndefinedFilter: var undefined = (UndefinedFilterResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "UNDEFINED-FILTER", token); undefined.Name = (string) token.Value; token = ReadToken (cancellationToken); break; case ImapResponseCodeType.MailboxId: var mailboxid = (MailboxIdResponseCode) code; AssertToken (token, ImapTokenType.OpenParen, GenericResponseCodeSyntaxErrorFormat, "MAILBOXID", token); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "MAILBOXID", token); mailboxid.MailboxId = (string) token.Value; token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.CloseParen, GenericResponseCodeSyntaxErrorFormat, "MAILBOXID", token); token = ReadToken (cancellationToken); break; case ImapResponseCodeType.WebAlert: var webalert = (WebAlertResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "WEBALERT", token); Uri.TryCreate ((string) token.Value, UriKind.Absolute, out webalert.WebUri); token = ReadToken (cancellationToken); break; default: // Note: This code-path handles: [ALERT], [CLOSED], [READ-ONLY], [READ-WRITE], etc. //if (code.Type == ImapResponseCodeType.Unknown) // Debug.WriteLine (string.Format ("Unknown RESP-CODE encountered: {0}", atom)); // extensions are of the form: "[" atom [SPACE 1*] "]" // skip over tokens until we get to a ']' while (token.Type != ImapTokenType.CloseBracket && token.Type != ImapTokenType.Eoln) token = ReadToken (cancellationToken); break; } AssertToken (token, ImapTokenType.CloseBracket, "Syntax error in response code. {0}", token); code.Message = ReadLine (cancellationToken).Trim (); return code; } /// /// Parses the response code. /// /// The response code. /// Whether or not the resp-code is tagged vs untagged. /// The cancellation token. public async ValueTask ParseResponseCodeAsync (bool isTagged, CancellationToken cancellationToken) { uint validity = Selected != null ? Selected.UidValidity : 0; ImapResponseCode code; string atom, value; ImapToken token; // token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); // // if (token.Type != ImapTokenType.LeftBracket) { // Debug.WriteLine ("Expected a '[' followed by a RESP-CODE, but got: {0}", token); // throw UnexpectedToken (token, false); // } token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Atom, "Syntax error in response code. {0}", token); atom = (string) token.Value; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); code = ImapResponseCode.Create (GetResponseCodeType (atom)); code.IsTagged = isTagged; switch (code.Type) { case ImapResponseCodeType.BadCharset: if (token.Type == ImapTokenType.OpenParen) { token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); SupportedCharsets.Clear (); while (token.Type == ImapTokenType.Atom || token.Type == ImapTokenType.QString) { SupportedCharsets.Add ((string) token.Value); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); } AssertToken (token, ImapTokenType.CloseParen, GenericResponseCodeSyntaxErrorFormat, "BADCHARSET", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); } break; case ImapResponseCodeType.Capability: UngetToken (token); await UpdateCapabilitiesAsync (ImapTokenType.CloseBracket, cancellationToken).ConfigureAwait (false); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.PermanentFlags: var perm = (PermanentFlagsResponseCode) code; UngetToken (token); perm.Flags = await ImapUtils.ParseFlagsListAsync (this, "PERMANENTFLAGS", perm.Keywords, cancellationToken).ConfigureAwait (false); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.UidNext: var next = (UidNextResponseCode) code; // Note: we allow '0' here because some servers have been known to send "* OK [UIDNEXT 0]". // The *probable* explanation here is that the folder has never been opened and/or no messages // have ever been delivered (yet) to that mailbox and so the UIDNEXT has not (yet) been // initialized. // // See https://github.com/jstedfast/MailKit/issues/1010 for an example. var uid = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "UIDNEXT", token); next.Uid = uid > 0 ? new UniqueId (uid) : UniqueId.Invalid; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.UidValidity: var uidvalidity = (UidValidityResponseCode) code; // Note: we allow '0' here because some servers have been known to send "* OK [UIDVALIDITY 0]". // The *probable* explanation here is that the folder has never been opened and/or no messages // have ever been delivered (yet) to that mailbox and so the UIDVALIDITY has not (yet) been // initialized. // // See https://github.com/jstedfast/MailKit/issues/150 for an example. uidvalidity.UidValidity = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "UIDVALIDITY", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.Unseen: var unseen = (UnseenResponseCode) code; // Note: we allow '0' here because some servers have been known to send "* OK [UNSEEN 0]" when the // mailbox contains no messages. // // See https://github.com/jstedfast/MailKit/issues/34 for details. var n = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "UNSEEN", token); unseen.Index = n > 0 ? (int) (n - 1) : 0; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.NewName: var rename = (NewNameResponseCode) code; // Note: this RESP-CODE existed in rfc2060 but has been removed in rfc3501: // // 85) Remove NEWNAME. It can't work because mailbox names can be // literals and can include "]". Functionality can be addressed via // referrals. AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericResponseCodeSyntaxErrorFormat, "NEWNAME", token); rename.OldName = (string) token.Value; // the next token should be another atom or qstring token representing the new name of the folder token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericResponseCodeSyntaxErrorFormat, "NEWNAME", token); rename.NewName = (string) token.Value; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.AppendUid: var append = (AppendUidResponseCode) code; append.UidValidity = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "APPENDUID", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); // The MULTIAPPEND extension redefines APPENDUID's second argument to be a uid-set instead of a single uid. append.UidSet = ParseUidSet (token, append.UidValidity, out _, out _, GenericResponseCodeSyntaxErrorFormat, "APPENDUID", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.CopyUid: var copy = (CopyUidResponseCode) code; copy.UidValidity = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "COPYUID", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); // Note: Outlook.com will apparently sometimes issue a [COPYUID nz_number SPACE SPACE] resp-code // in response to a UID COPY or UID MOVE command. Likely this happens only when the source message // didn't exist or something? See https://github.com/jstedfast/MailKit/issues/555 for details. if (token.Type != ImapTokenType.CloseBracket) { copy.SrcUidSet = ParseUidSet (token, validity, out _, out _, GenericResponseCodeSyntaxErrorFormat, "COPYUID", token); } else { copy.SrcUidSet = new UniqueIdSet (); UngetToken (token); } token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type != ImapTokenType.CloseBracket) { copy.DestUidSet = ParseUidSet (token, copy.UidValidity, out _, out _, GenericResponseCodeSyntaxErrorFormat, "COPYUID", token); } else { copy.DestUidSet = new UniqueIdSet (); UngetToken (token); } token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.BadUrl: var badurl = (BadUrlResponseCode) code; AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericResponseCodeSyntaxErrorFormat, "BADURL", token); badurl.BadUrl = (string) token.Value; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.HighestModSeq: var highest = (HighestModSeqResponseCode) code; highest.HighestModSeq = ParseNumber64 (token, false, GenericResponseCodeSyntaxErrorFormat, "HIGHESTMODSEQ", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.Modified: var modified = (ModifiedResponseCode) code; modified.UidSet = ParseUidSet (token, validity, out _, out _, GenericResponseCodeSyntaxErrorFormat, "MODIFIED", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.MaxConvertMessages: case ImapResponseCodeType.MaxConvertParts: var maxConvert = (MaxConvertResponseCode) code; maxConvert.MaxConvert = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, atom, token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.NoUpdate: var noUpdate = (NoUpdateResponseCode) code; AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, GenericResponseCodeSyntaxErrorFormat, "NOUPDATE", token); noUpdate.Tag = (string) token.Value; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.Annotate: var annotate = (AnnotateResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "ANNOTATE", token); value = (string) token.Value; if (value.Equals ("TOOBIG", StringComparison.OrdinalIgnoreCase)) annotate.SubType = AnnotateResponseCodeSubType.TooBig; else if (value.Equals ("TOOMANY", StringComparison.OrdinalIgnoreCase)) annotate.SubType = AnnotateResponseCodeSubType.TooMany; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.Annotations: var annotations = (AnnotationsResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "ANNOTATIONS", token); value = (string) token.Value; if (value.Equals ("NONE", StringComparison.OrdinalIgnoreCase)) { // nothing } else if (value.Equals ("READ-ONLY", StringComparison.OrdinalIgnoreCase)) { annotations.Access = AnnotationAccess.ReadOnly; } else { annotations.Access = AnnotationAccess.ReadWrite; annotations.MaxSize = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "ANNOTATIONS", token); } token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (annotations.Access != AnnotationAccess.None) { annotations.Scopes = AnnotationScope.Both; if (token.Type != ImapTokenType.CloseBracket) { AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "ANNOTATIONS", token); if (((string) token.Value).Equals ("NOPRIVATE", StringComparison.OrdinalIgnoreCase)) annotations.Scopes = AnnotationScope.Shared; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); } } break; case ImapResponseCodeType.Metadata: var metadata = (MetadataResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "METADATA", token); value = (string) token.Value; if (value.Equals ("LONGENTRIES", StringComparison.OrdinalIgnoreCase)) { metadata.SubType = MetadataResponseCodeSubType.LongEntries; metadata.IsError = false; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); metadata.Value = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "METADATA LONGENTRIES", token); } else if (value.Equals ("MAXSIZE", StringComparison.OrdinalIgnoreCase)) { metadata.SubType = MetadataResponseCodeSubType.MaxSize; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); metadata.Value = ParseNumber (token, false, GenericResponseCodeSyntaxErrorFormat, "METADATA MAXSIZE", token); } else if (value.Equals ("TOOMANY", StringComparison.OrdinalIgnoreCase)) { metadata.SubType = MetadataResponseCodeSubType.TooMany; } else if (value.Equals ("NOPRIVATE", StringComparison.OrdinalIgnoreCase)) { metadata.SubType = MetadataResponseCodeSubType.NoPrivate; } token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.UndefinedFilter: var undefined = (UndefinedFilterResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "UNDEFINED-FILTER", token); undefined.Name = (string) token.Value; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.MailboxId: var mailboxid = (MailboxIdResponseCode) code; AssertToken (token, ImapTokenType.OpenParen, GenericResponseCodeSyntaxErrorFormat, "MAILBOXID", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "MAILBOXID", token); mailboxid.MailboxId = (string) token.Value; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.CloseParen, GenericResponseCodeSyntaxErrorFormat, "MAILBOXID", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapResponseCodeType.WebAlert: var webalert = (WebAlertResponseCode) code; AssertToken (token, ImapTokenType.Atom, GenericResponseCodeSyntaxErrorFormat, "WEBALERT", token); Uri.TryCreate ((string) token.Value, UriKind.Absolute, out webalert.WebUri); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; default: // Note: This code-path handles: [ALERT], [CLOSED], [READ-ONLY], [READ-WRITE], etc. //if (code.Type == ImapResponseCodeType.Unknown) // Debug.WriteLine (string.Format ("Unknown RESP-CODE encountered: {0}", atom)); // extensions are of the form: "[" atom [SPACE 1*] "]" // skip over tokens until we get to a ']' while (token.Type != ImapTokenType.CloseBracket && token.Type != ImapTokenType.Eoln) token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; } AssertToken (token, ImapTokenType.CloseBracket, "Syntax error in response code. {0}", token); code.Message = (await ReadLineAsync (cancellationToken).ConfigureAwait (false)).Trim (); return code; } static bool UpdateSimpleStatusValue (ImapFolder? folder, string atom, ImapToken token) { uint count, uid; ulong modseq; if (atom.Equals ("HIGHESTMODSEQ", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); modseq = ParseNumber64 (token, false, GenericItemSyntaxErrorFormat, atom, token); folder?.UpdateHighestModSeq (modseq); } else if (atom.Equals ("MESSAGES", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); count = ParseNumber (token, false, GenericItemSyntaxErrorFormat, atom, token); folder?.OnExists ((int) count); } else if (atom.Equals ("RECENT", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); count = ParseNumber (token, false, GenericItemSyntaxErrorFormat, atom, token); folder?.OnRecent ((int) count); } else if (atom.Equals ("UIDNEXT", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); uid = ParseNumber (token, false, GenericItemSyntaxErrorFormat, atom, token); folder?.UpdateUidNext (uid > 0 ? new UniqueId (uid) : UniqueId.Invalid); } else if (atom.Equals ("UIDVALIDITY", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); uid = ParseNumber (token, false, GenericItemSyntaxErrorFormat, atom, token); folder?.UpdateUidValidity (uid); } else if (atom.Equals ("UNSEEN", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); count = ParseNumber (token, false, GenericItemSyntaxErrorFormat, atom, token); folder?.UpdateUnread ((int) count); } else if (atom.Equals ("APPENDLIMIT", StringComparison.OrdinalIgnoreCase)) { if (token.Type == ImapTokenType.Atom) { var limit = ParseNumber (token, false, GenericItemSyntaxErrorFormat, atom, token); folder?.UpdateAppendLimit (limit); } else { AssertToken (token, ImapTokenType.Nil, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); folder?.UpdateAppendLimit (null); } } else if (atom.Equals ("SIZE", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); var size = ParseNumber64 (token, false, GenericItemSyntaxErrorFormat, atom, token); folder?.UpdateSize (size); } else { // This is probably the MAILBOXID value which is multiple tokens and can't be handled here. return false; } return true; } void UpdateStatus (CancellationToken cancellationToken) { var token = ReadToken (ImapStream.AtomSpecials, cancellationToken); string name; switch (token.Type) { case ImapTokenType.Literal: name = ReadLiteral (cancellationToken); break; case ImapTokenType.QString: case ImapTokenType.Atom: name = (string) token.Value; break; case ImapTokenType.Nil: // Note: according to rfc3501, section 4.5, NIL is acceptable as a mailbox name. name = (string) token.Value; break; default: throw UnexpectedToken (GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); } // Note: if the folder is null, then it probably means the user is using NOTIFY // and hasn't yet requested the folder. That's ok. TryGetCachedFolder (name, out var folder); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.OpenParen, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); do { token = ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); var atom = (string) token.Value; token = ReadToken (cancellationToken); if (UpdateSimpleStatusValue (folder, atom, token)) continue; if (atom.Equals ("MAILBOXID", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.OpenParen, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Atom, GenericItemSyntaxErrorFormat, atom, token); folder?.UpdateId ((string) token.Value); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.CloseParen, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); } } while (true); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Eoln, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); } async ValueTask UpdateStatusAsync (CancellationToken cancellationToken) { var token = await ReadTokenAsync (ImapStream.AtomSpecials, cancellationToken).ConfigureAwait (false); string name; switch (token.Type) { case ImapTokenType.Literal: name = await ReadLiteralAsync (cancellationToken).ConfigureAwait (false); break; case ImapTokenType.QString: case ImapTokenType.Atom: name = (string) token.Value; break; case ImapTokenType.Nil: // Note: according to rfc3501, section 4.5, NIL is acceptable as a mailbox name. name = (string) token.Value; break; default: throw UnexpectedToken (GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); } // Note: if the folder is null, then it probably means the user is using NOTIFY // and hasn't yet requested the folder. That's ok. TryGetCachedFolder (name, out var folder); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.OpenParen, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); do { token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); var atom = (string) token.Value; token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (UpdateSimpleStatusValue (folder, atom, token)) continue; if (atom.Equals ("MAILBOXID", StringComparison.OrdinalIgnoreCase)) { AssertToken (token, ImapTokenType.OpenParen, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Atom, GenericItemSyntaxErrorFormat, atom, token); folder?.UpdateId ((string) token.Value); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.CloseParen, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); } } while (true); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Eoln, GenericUntaggedResponseSyntaxErrorFormat, "STATUS", token); } static bool IsOkNoOrBad (string atom, out ImapUntaggedResult result) { if (atom.Equals ("OK", StringComparison.OrdinalIgnoreCase)) { result = ImapUntaggedResult.Ok; return true; } if (atom.Equals ("NO", StringComparison.OrdinalIgnoreCase)) { result = ImapUntaggedResult.No; return true; } if (atom.Equals ("BAD", StringComparison.OrdinalIgnoreCase)) { result = ImapUntaggedResult.Bad; return true; } result = ImapUntaggedResult.Ok; return false; } /// /// Processes an untagged response. /// /// The untagged response. /// The IMAP command that is currently being processed. /// The cancellation token. internal void ProcessUntaggedResponse (ImapCommand ic, CancellationToken cancellationToken) { var token = ReadToken (cancellationToken); var folder = ic.Folder ?? Selected; ImapUntaggedHandler? handler; string atom; // Note: work around broken IMAP servers such as home.pl which sends "* [COPYUID ...]" resp-codes // See https://github.com/jstedfast/MailKit/issues/115#issuecomment-313684616 for details. if (token.Type == ImapTokenType.OpenBracket) { // unget the '[' token and then pretend that we got an "OK" UngetToken (token); atom = "OK"; } else if (token.Type != ImapTokenType.Atom) { // if we get anything else here, just ignore it? UngetToken (token); SkipLine (cancellationToken); return; } else { atom = (string) token.Value; } if (atom.Equals ("BYE", StringComparison.OrdinalIgnoreCase)) { token = ReadToken (cancellationToken); if (token.Type == ImapTokenType.OpenBracket) { var code = ParseResponseCode (false, cancellationToken); ic.RespCodes.Add (code); } else { var text = ReadLine (cancellationToken).TrimEnd (); ic.ResponseText = token.Value.ToString () + text; } ic.Bye = true; // Note: Yandex IMAP is broken and will continue sending untagged BYE responses until the client closes // the connection. In order to avoid this scenario, consider this command complete as soon as we receive // the very first untagged BYE response and do not hold out hoping for a tagged response following the // untagged BYE. // // See https://github.com/jstedfast/MailKit/issues/938 for details. if (QuirksMode == ImapQuirksMode.Yandex && !ic.Logout) ic.Status = ImapCommandStatus.Complete; } else if (atom.Equals ("CAPABILITY", StringComparison.OrdinalIgnoreCase)) { UpdateCapabilities (ImapTokenType.Eoln, cancellationToken); // read the eoln token ReadToken (cancellationToken); } else if (atom.Equals ("ENABLED", StringComparison.OrdinalIgnoreCase)) { do { token = ReadToken (cancellationToken); if (token.Type == ImapTokenType.Eoln) break; AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, atom, token); var feature = (string) token.Value; if (feature.Equals ("UTF8=ACCEPT", StringComparison.OrdinalIgnoreCase)) UTF8Enabled = true; else if (feature.Equals ("QRESYNC", StringComparison.OrdinalIgnoreCase)) QResyncEnabled = true; } while (true); } else if (atom.Equals ("FLAGS", StringComparison.OrdinalIgnoreCase)) { var keywords = new HashSet (StringComparer.Ordinal); var flags = ImapUtils.ParseFlagsList (this, atom, keywords, cancellationToken); folder?.UpdateAcceptedFlags (flags, keywords); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Eoln, GenericUntaggedResponseSyntaxErrorFormat, atom, token); } else if (atom.Equals ("NAMESPACE", StringComparison.OrdinalIgnoreCase)) { UpdateNamespaces (cancellationToken); } else if (atom.Equals ("STATUS", StringComparison.OrdinalIgnoreCase)) { UpdateStatus (cancellationToken); } else if (IsOkNoOrBad (atom, out var result)) { token = ReadToken (cancellationToken); if (token.Type == ImapTokenType.OpenBracket) { var code = ParseResponseCode (false, cancellationToken); ic.RespCodes.Add (code); } else if (token.Type != ImapTokenType.Eoln) { var text = ReadLine (cancellationToken).TrimEnd (); ic.ResponseText = token.Value.ToString () + text; } } else { if (uint.TryParse (atom, NumberStyles.None, CultureInfo.InvariantCulture, out uint number)) { // we probably have something like "* 1 EXISTS" token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Atom, "Syntax error in untagged response. {0}", token); atom = (string) token.Value; if (ic.UntaggedHandlers.TryGetValue (atom, out handler)) { // the command registered an untagged handler for this atom... handler (this, ic, (int) number - 1, false).GetAwaiter ().GetResult (); } else if (folder != null) { if (atom.Equals ("EXISTS", StringComparison.OrdinalIgnoreCase)) { folder.OnExists ((int) number); } else if (atom.Equals ("EXPUNGE", StringComparison.OrdinalIgnoreCase)) { if (number == 0) throw UnexpectedToken ("Syntax error in untagged EXPUNGE response. Unexpected message index: 0"); folder.OnExpunge ((int) number - 1); } else if (atom.Equals ("FETCH", StringComparison.OrdinalIgnoreCase)) { // Apparently Courier-IMAP (2004) will reply with "* 0 FETCH ..." sometimes. // See https://github.com/jstedfast/MailKit/issues/428 for details. //if (number == 0) // throw UnexpectedToken ("Syntax error in untagged FETCH response. Unexpected message index: 0"); folder.OnUntaggedFetchResponse (this, (int) number - 1, cancellationToken); } else if (atom.Equals ("RECENT", StringComparison.OrdinalIgnoreCase)) { folder.OnRecent ((int) number); } else { //Debug.WriteLine ("Unhandled untagged response: * {0} {1}", number, atom); } } else { //Debug.WriteLine ("Unhandled untagged response: * {0} {1}", number, atom); } SkipLine (cancellationToken); } else if (ic.UntaggedHandlers.TryGetValue (atom, out handler)) { // the command registered an untagged handler for this atom... handler (this, ic, -1, false).GetAwaiter ().GetResult (); SkipLine (cancellationToken); } else if (atom.Equals ("LIST", StringComparison.OrdinalIgnoreCase)) { // unsolicited LIST response - probably due to NOTIFY MailboxName or MailboxSubscribe event ImapUtils.ParseFolderList (this, null, false, true, cancellationToken); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Eoln, "Syntax error in untagged LIST response. {0}", token); } else if (atom.Equals ("METADATA", StringComparison.OrdinalIgnoreCase)) { // unsolicited METADATA response - probably due to NOTIFY MailboxMetadataChange or ServerMetadataChange var metadata = new MetadataCollection (); ImapUtils.ParseMetadata (this, metadata, cancellationToken); ProcessMetadataChanges (metadata); token = ReadToken (cancellationToken); AssertToken (token, ImapTokenType.Eoln, "Syntax error in untagged LIST response. {0}", token); } else if (atom.Equals ("VANISHED", StringComparison.OrdinalIgnoreCase) && folder != null) { folder.OnVanished (this, cancellationToken); SkipLine (cancellationToken); } else { // don't know how to handle this... eat it? SkipLine (cancellationToken); } } } /// /// Processes an untagged response. /// /// The untagged response. /// The IMAP command that is currently being processed. /// The cancellation token. internal async Task ProcessUntaggedResponseAsync (ImapCommand ic, CancellationToken cancellationToken) { var token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); var folder = ic.Folder ?? Selected; ImapUntaggedHandler? handler; string atom; // Note: work around broken IMAP servers such as home.pl which sends "* [COPYUID ...]" resp-codes // See https://github.com/jstedfast/MailKit/issues/115#issuecomment-313684616 for details. if (token.Type == ImapTokenType.OpenBracket) { // unget the '[' token and then pretend that we got an "OK" UngetToken (token); atom = "OK"; } else if (token.Type != ImapTokenType.Atom) { // if we get anything else here, just ignore it? UngetToken (token); await SkipLineAsync (cancellationToken).ConfigureAwait (false); return; } else { atom = (string) token.Value; } if (atom.Equals ("BYE", StringComparison.OrdinalIgnoreCase)) { token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenBracket) { var code = await ParseResponseCodeAsync (false, cancellationToken).ConfigureAwait (false); ic.RespCodes.Add (code); } else { var text = (await ReadLineAsync (cancellationToken).ConfigureAwait (false)).TrimEnd (); ic.ResponseText = token.Value.ToString () + text; } ic.Bye = true; // Note: Yandex IMAP is broken and will continue sending untagged BYE responses until the client closes // the connection. In order to avoid this scenario, consider this command complete as soon as we receive // the very first untagged BYE response and do not hold out hoping for a tagged response following the // untagged BYE. // // See https://github.com/jstedfast/MailKit/issues/938 for details. if (QuirksMode == ImapQuirksMode.Yandex && !ic.Logout) ic.Status = ImapCommandStatus.Complete; } else if (atom.Equals ("CAPABILITY", StringComparison.OrdinalIgnoreCase)) { await UpdateCapabilitiesAsync (ImapTokenType.Eoln, cancellationToken).ConfigureAwait (false); // read the eoln token await ReadTokenAsync (cancellationToken).ConfigureAwait (false); } else if (atom.Equals ("ENABLED", StringComparison.OrdinalIgnoreCase)) { do { token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Eoln) break; AssertToken (token, ImapTokenType.Atom, GenericUntaggedResponseSyntaxErrorFormat, atom, token); var feature = (string) token.Value; if (feature.Equals ("UTF8=ACCEPT", StringComparison.OrdinalIgnoreCase)) UTF8Enabled = true; else if (feature.Equals ("QRESYNC", StringComparison.OrdinalIgnoreCase)) QResyncEnabled = true; } while (true); } else if (atom.Equals ("FLAGS", StringComparison.OrdinalIgnoreCase)) { var keywords = new HashSet (StringComparer.Ordinal); var flags = await ImapUtils.ParseFlagsListAsync (this, atom, keywords, cancellationToken).ConfigureAwait (false); folder?.UpdateAcceptedFlags (flags, keywords); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Eoln, GenericUntaggedResponseSyntaxErrorFormat, atom, token); } else if (atom.Equals ("NAMESPACE", StringComparison.OrdinalIgnoreCase)) { await UpdateNamespacesAsync (cancellationToken).ConfigureAwait (false); } else if (atom.Equals ("STATUS", StringComparison.OrdinalIgnoreCase)) { await UpdateStatusAsync (cancellationToken).ConfigureAwait (false); } else if (IsOkNoOrBad (atom, out var result)) { token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenBracket) { var code = await ParseResponseCodeAsync (false, cancellationToken).ConfigureAwait (false); ic.RespCodes.Add (code); } else if (token.Type != ImapTokenType.Eoln) { var text = (await ReadLineAsync (cancellationToken).ConfigureAwait (false)).TrimEnd (); ic.ResponseText = token.Value.ToString () + text; } } else { if (uint.TryParse (atom, NumberStyles.None, CultureInfo.InvariantCulture, out uint number)) { // we probably have something like "* 1 EXISTS" token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Atom, "Syntax error in untagged response. {0}", token); atom = (string) token.Value; if (ic.UntaggedHandlers.TryGetValue (atom, out handler)) { // the command registered an untagged handler for this atom... await handler (this, ic, (int) number - 1, doAsync: true).ConfigureAwait (false); } else if (folder != null) { if (atom.Equals ("EXISTS", StringComparison.OrdinalIgnoreCase)) { folder.OnExists ((int) number); } else if (atom.Equals ("EXPUNGE", StringComparison.OrdinalIgnoreCase)) { if (number == 0) throw UnexpectedToken ("Syntax error in untagged EXPUNGE response. Unexpected message index: 0"); folder.OnExpunge ((int) number - 1); } else if (atom.Equals ("FETCH", StringComparison.OrdinalIgnoreCase)) { // Apparently Courier-IMAP (2004) will reply with "* 0 FETCH ..." sometimes. // See https://github.com/jstedfast/MailKit/issues/428 for details. //if (number == 0) // throw UnexpectedToken ("Syntax error in untagged FETCH response. Unexpected message index: 0"); await folder.OnUntaggedFetchResponseAsync (this, (int) number - 1, cancellationToken).ConfigureAwait (false); } else if (atom.Equals ("RECENT", StringComparison.OrdinalIgnoreCase)) { folder.OnRecent ((int) number); } else { //Debug.WriteLine ("Unhandled untagged response: * {0} {1}", number, atom); } } else { //Debug.WriteLine ("Unhandled untagged response: * {0} {1}", number, atom); } await SkipLineAsync (cancellationToken).ConfigureAwait (false); } else if (ic.UntaggedHandlers.TryGetValue (atom, out handler)) { // the command registered an untagged handler for this atom... await handler (this, ic, -1, doAsync: true).ConfigureAwait (false); await SkipLineAsync (cancellationToken).ConfigureAwait (false); } else if (atom.Equals ("LIST", StringComparison.OrdinalIgnoreCase)) { // unsolicited LIST response - probably due to NOTIFY MailboxName or MailboxSubscribe event await ImapUtils.ParseFolderListAsync (this, null, false, true, cancellationToken).ConfigureAwait (false); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Eoln, "Syntax error in untagged LIST response. {0}", token); } else if (atom.Equals ("METADATA", StringComparison.OrdinalIgnoreCase)) { // unsolicited METADATA response - probably due to NOTIFY MailboxMetadataChange or ServerMetadataChange var metadata = new MetadataCollection (); await ImapUtils.ParseMetadataAsync (this, metadata, cancellationToken).ConfigureAwait (false); ProcessMetadataChanges (metadata); token = await ReadTokenAsync (cancellationToken).ConfigureAwait (false); AssertToken (token, ImapTokenType.Eoln, "Syntax error in untagged LIST response. {0}", token); } else if (atom.Equals ("VANISHED", StringComparison.OrdinalIgnoreCase) && folder != null) { await folder.OnVanishedAsync (this, cancellationToken).ConfigureAwait (false); await SkipLineAsync (cancellationToken).ConfigureAwait (false); } else { // don't know how to handle this... eat it? await SkipLineAsync (cancellationToken).ConfigureAwait (false); } } } [MemberNotNull (nameof (current))] void PopNextCommand () { lock (queue) { if (queue.Count == 0) throw new InvalidOperationException ("The IMAP command queue is empty."); if (IsBusy) throw new InvalidOperationException ("The ImapClient is currently busy processing a command in another thread. Lock the SyncRoot property to properly synchronize your threads."); current = queue[0]; queue.RemoveAt (0); try { current.CancellationToken.ThrowIfCancellationRequested (); } catch { queue.RemoveAll (x => x.CancellationToken.IsCancellationRequested); current = null; throw; } } } /// /// Handles an IMAP protocol exception by disconnecting and then potentially throwing a replacement exception. /// /// The current being processed. /// THe that was thrown. /// /// An ALERT or some resp-text was found that would enhance the exception message /// of the provided. /// void OnImapProtocolException (ImapCommand ic, ImapProtocolException ex) { Disconnect (ex); if (ic.Bye) { if (ic.RespCodes.Count > 0) { var code = ic.RespCodes[ic.RespCodes.Count - 1]; if (code.Type == ImapResponseCodeType.Alert) { OnAlert (code.Message); throw new ImapProtocolException (code.Message, ex); } } if (!string.IsNullOrEmpty (ic.ResponseText)) throw new ImapProtocolException (ic.ResponseText!, ex); } } /// /// Iterate the command pipeline. /// void Iterate () { PopNextCommand (); current.Status = ImapCommandStatus.Active; try { while (current.Step ()) { // more literal data to send... } if (current.Bye && !current.Logout) throw new ImapProtocolException ("Bye."); } catch (ImapProtocolException ex) { OnImapProtocolException (current, ex); throw; } catch (Exception ex) { Disconnect (ex); throw; } finally { current = null; } } /// /// Asynchronously iterate the command pipeline. /// async Task IterateAsync () { PopNextCommand (); current.Status = ImapCommandStatus.Active; try { while (await current.StepAsync ().ConfigureAwait (false)) { // more literal data to send... } if (current.Bye && !current.Logout) throw new ImapProtocolException ("Bye."); } catch (ImapProtocolException ex) { OnImapProtocolException (current, ex); throw; } catch (Exception ex) { Disconnect (ex); throw; } finally { current = null; } } /// /// Wait for the specified command to finish. /// /// The IMAP command. /// /// is . /// public ImapCommandResponse Run (ImapCommand ic) { if (ic == null) throw new ArgumentNullException (nameof (ic)); while (ic.Status < ImapCommandStatus.Complete) { // continue processing commands... Iterate (); } ProcessResponseCodes (ic); return ic.Response; } /// /// Wait for the specified command to finish. /// /// The IMAP command. /// /// is . /// public async Task RunAsync (ImapCommand ic) { if (ic == null) throw new ArgumentNullException (nameof (ic)); while (ic.Status < ImapCommandStatus.Complete) { // continue processing commands... await IterateAsync ().ConfigureAwait (false); } ProcessResponseCodes (ic); return ic.Response; } public IEnumerable CreateCommands (CancellationToken cancellationToken, ImapFolder folder, string format, IList uids, params object[] args) { var vargs = new List (); int maxLength; // we assume that uids is the first formatter (with a %s) vargs.Add ("1"); for (int i = 0; i < args.Length; i++) vargs.Add (args[i]); args = vargs.ToArray (); if (QuirksMode == ImapQuirksMode.Courier) { // Courier IMAP's command parser allows each token to be up to 16k in size. maxLength = 16 * 1024; } else { int estimated = ImapCommand.EstimateCommandLength (this, format, args); switch (QuirksMode) { case ImapQuirksMode.Dovecot: // Dovecot, by default, allows commands up to 64k. // See https://github.com/dovecot/core/blob/master/src/imap/imap-settings.c#L94 maxLength = Math.Max ((64 * 1042) - estimated, 24); break; case ImapQuirksMode.GMail: // GMail seems to support command-lines up to at least 16k. maxLength = Math.Max ((16 * 1042) - estimated, 24); break; case ImapQuirksMode.Yahoo: case ImapQuirksMode.UW: // Follow the IMAP4 Implementation Recommendations which states that clients // *SHOULD* limit their command lengths to 1000 octets. maxLength = Math.Max (1000 - estimated, 24); break; default: // Push the boundaries of the IMAP4 Implementation Recommendations which states // that servers *SHOULD* accept command lengths of up to 8000 octets. maxLength = Math.Max (8000 - estimated, 24); break; } } foreach (var subset in UniqueIdSet.EnumerateSerializedSubsets (uids, maxLength)) { args[0] = subset; yield return new ImapCommand (this, cancellationToken, folder, format, args); } } public IEnumerable QueueCommands (CancellationToken cancellationToken, ImapFolder folder, string format, IList uids, params object[] args) { foreach (var ic in CreateCommands (cancellationToken, folder, format, uids, args)) { QueueCommand (ic); yield return ic; } } /// /// Queues the command. /// /// The command. /// The cancellation token. /// The folder that the command operates on. /// The formatting options. /// The command format. /// The command arguments. public ImapCommand QueueCommand (CancellationToken cancellationToken, ImapFolder? folder, FormatOptions options, string format, params object[] args) { var ic = new ImapCommand (this, cancellationToken, folder, options, format, args); QueueCommand (ic); return ic; } /// /// Queues the command. /// /// The command. /// The cancellation token. /// The folder that the command operates on. /// The command format. /// The command arguments. public ImapCommand QueueCommand (CancellationToken cancellationToken, ImapFolder? folder, string format, params object[] args) { return QueueCommand (cancellationToken, folder, FormatOptions.Default, format, args); } /// /// Queues the command. /// /// The IMAP command. public void QueueCommand (ImapCommand ic) { lock (queue) { ic.Status = ImapCommandStatus.Queued; queue.Add (ic); } } /// /// Queries the capabilities. /// /// The command result. /// The cancellation token. public ImapCommandResponse QueryCapabilities (CancellationToken cancellationToken) { var ic = QueueCommand (cancellationToken, null, "CAPABILITY\r\n"); return Run (ic); } /// /// Queries the capabilities. /// /// The command result. /// The cancellation token. public Task QueryCapabilitiesAsync (CancellationToken cancellationToken) { var ic = QueueCommand (cancellationToken, null, "CAPABILITY\r\n"); return RunAsync (ic); } /// /// Cache the specified folder. /// /// The folder. public void CacheFolder (ImapFolder folder) { if ((folder.Attributes & FolderAttributes.Inbox) != 0) cacheComparer.DirectorySeparator = folder.DirectorySeparator; FolderCache.Add (folder.EncodedName, folder); } /// /// Gets the cached folder. /// /// if the folder was retrieved from the cache; otherwise, . /// The encoded folder name. /// The cached folder. public bool TryGetCachedFolder (string encodedName, [NotNullWhen (true)] out ImapFolder? folder) { return FolderCache.TryGetValue (encodedName, out folder); } bool RequiresParentLookup (ImapFolder folder, [NotNullWhen (true)] out string? encodedParentName) { encodedParentName = null; if (folder.ParentFolder != null) return false; int index; // FIXME: should this search EncodedName instead of FullName? if ((index = folder.FullName.LastIndexOf (folder.DirectorySeparator)) != -1) { if (index == 0) return false; var parentName = folder.FullName.Substring (0, index); encodedParentName = EncodeMailboxName (parentName); } else { encodedParentName = string.Empty; } if (TryGetCachedFolder (encodedParentName, out var parent)) { folder.ParentFolder = parent; return false; } return true; } ImapCommand QueueLookupParentFolderCommand (string encodedName, CancellationToken cancellationToken) { // Note: folder names can contain wildcards (including '*' and '%'), so replace '*' with '%' // in order to reduce the list of folders returned by our LIST command. var pattern = encodedName.Replace ('*', '%'); var command = new StringBuilder ("LIST \"\" %S"); var returnsSubscribed = false; if ((Capabilities & ImapCapabilities.ListExtended) != 0) { // Try to get the \Subscribed and \HasChildren or \HasNoChildren attributes command.Append (" RETURN (SUBSCRIBED CHILDREN)"); returnsSubscribed = true; } command.Append ("\r\n"); var ic = new ImapCommand (this, cancellationToken, null, command.ToString (), pattern); ic.RegisterUntaggedHandler ("LIST", ImapUtils.UntaggedListHandler); ic.ListReturnsSubscribed = returnsSubscribed; ic.UserData = new List (); QueueCommand (ic); return ic; } void ProcessLookupParentFolderResponse (ImapCommand ic, List list, ImapFolder folder, string encodedParentName) { if (!TryGetCachedFolder (encodedParentName, out var parent)) { parent = CreateImapFolder (encodedParentName, FolderAttributes.NonExistent, folder.DirectorySeparator); CacheFolder (parent); } else if (parent.ParentFolder == null && !parent.IsNamespace) { list.Add (parent); } folder.ParentFolder = parent; } /// /// Looks up and sets the property of each of the folders. /// /// The IMAP folders. /// The cancellation token. internal void LookupParentFolders (IEnumerable folders, CancellationToken cancellationToken) { var list = new List (folders); // Note: we use a for-loop instead of foreach because we conditionally add items to the list. for (int i = 0; i < list.Count; i++) { var folder = list[i]; if (!RequiresParentLookup (folder, out var encodedParentName)) continue; var ic = QueueLookupParentFolderCommand (encodedParentName, cancellationToken); Run (ic); ProcessLookupParentFolderResponse (ic, list, folder, encodedParentName); } } /// /// Looks up and sets the property of each of the folders. /// /// The IMAP folders. /// The cancellation token. internal async Task LookupParentFoldersAsync (IEnumerable folders, CancellationToken cancellationToken) { var list = new List (folders); // Note: we use a for-loop instead of foreach because we conditionally add items to the list. for (int i = 0; i < list.Count; i++) { var folder = list[i]; if (!RequiresParentLookup (folder, out var encodedParentName)) continue; var ic = QueueLookupParentFolderCommand (encodedParentName, cancellationToken); await RunAsync (ic).ConfigureAwait (false); ProcessLookupParentFolderResponse (ic, list, folder, encodedParentName); } } void ProcessNamespaceResponse (ImapCommand ic) { if (QuirksMode == ImapQuirksMode.Exchange && ic.Response == ImapCommandResponse.Bad) { State = ImapEngineState.Connected; // Reset back to Connected-but-not-Authenticated state throw ImapCommandException.Create ("NAMESPACE", ic); } } ImapCommand QueueListNamespaceCommand (List list, CancellationToken cancellationToken) { var ic = new ImapCommand (this, cancellationToken, null, "LIST \"\" \"\"\r\n"); ic.RegisterUntaggedHandler ("LIST", ImapUtils.UntaggedListHandler); ic.UserData = list; QueueCommand (ic); return ic; } void ProcessListNamespaceResponse (ImapCommand ic, List list) { PersonalNamespaces.Clear (); SharedNamespaces.Clear (); OtherNamespaces.Clear (); if (list.Count > 0) { var empty = list.FirstOrDefault (x => x.EncodedName.Length == 0); if (empty == null) { empty = CreateImapFolder (string.Empty, FolderAttributes.None, list[0].DirectorySeparator); CacheFolder (empty); } PersonalNamespaces.Add (new FolderNamespace (empty.DirectorySeparator, empty.FullName)); empty.UpdateIsNamespace (true); } } /// /// Queries the namespaces. /// /// The command result. /// The cancellation token. public ImapCommandResponse QueryNamespaces (CancellationToken cancellationToken) { ImapCommand ic; // Note: It seems that on Exchange 2003 (maybe Chinese-only version?), the NAMESPACE command causes the server // to immediately drop the connection. Avoid this issue by not using the NAMESPACE command if we detect that // the server is Microsoft Exchange 2003. See https://github.com/jstedfast/MailKit/issues/1512 for details. if (QuirksMode != ImapQuirksMode.Exchange2003 && (Capabilities & ImapCapabilities.Namespace) != 0) { ic = QueueCommand (cancellationToken, null, "NAMESPACE\r\n"); Run (ic); ProcessNamespaceResponse (ic); } else { var list = new List (); ic = QueueListNamespaceCommand (list, cancellationToken); Run (ic); ProcessListNamespaceResponse (ic, list); LookupParentFolders (list, cancellationToken); } return ic.Response; } /// /// Asynchronously queries the namespaces. /// /// The command result. /// The cancellation token. public async Task QueryNamespacesAsync (CancellationToken cancellationToken) { ImapCommand ic; // Note: It seems that on Exchange 2003 (maybe Chinese-only version?), the NAMESPACE command causes the server // to immediately drop the connection. Avoid this issue by not using the NAMESPACE command if we detect that // the server is Microsoft Exchange 2003. See https://github.com/jstedfast/MailKit/issues/1512 for details. if (QuirksMode != ImapQuirksMode.Exchange2003 && (Capabilities & ImapCapabilities.Namespace) != 0) { ic = QueueCommand (cancellationToken, null, "NAMESPACE\r\n"); await RunAsync (ic).ConfigureAwait (false); ProcessNamespaceResponse (ic); } else { var list = new List (); ic = QueueListNamespaceCommand (list, cancellationToken); await RunAsync (ic).ConfigureAwait (false); ProcessListNamespaceResponse (ic, list); await LookupParentFoldersAsync (list, cancellationToken).ConfigureAwait (false); } return ic.Response; } internal static ImapFolder? GetFolder (List folders, string encodedName) { for (int i = 0; i < folders.Count; i++) { if (encodedName.Equals (folders[i].EncodedName, StringComparison.OrdinalIgnoreCase)) return folders[i]; } return null; } /// /// Assigns a folder as a special folder. /// /// The special folder. public void AssignSpecialFolder (ImapFolder folder) { if ((folder.Attributes & FolderAttributes.All) != 0) All = folder; if ((folder.Attributes & FolderAttributes.Archive) != 0) Archive = folder; if ((folder.Attributes & FolderAttributes.Drafts) != 0) Drafts = folder; if ((folder.Attributes & FolderAttributes.Flagged) != 0) Flagged = folder; if ((folder.Attributes & FolderAttributes.Important) != 0) Important = folder; if ((folder.Attributes & FolderAttributes.Junk) != 0) Junk = folder; if ((folder.Attributes & FolderAttributes.Sent) != 0) Sent = folder; if ((folder.Attributes & FolderAttributes.Trash) != 0) Trash = folder; } /// /// Assigns the special folders. /// /// The list of folders. public void AssignSpecialFolders (IList list) { for (int i = 0; i < list.Count; i++) AssignSpecialFolder (list[i]); } ImapCommand QueueListInboxCommand (CancellationToken cancellationToken, out StringBuilder command, out List list) { bool returnsSubscribed = false; command = new StringBuilder ("LIST \"\" \"INBOX\""); list = new List (); if ((Capabilities & ImapCapabilities.ListExtended) != 0) { command.Append (" RETURN (SUBSCRIBED CHILDREN)"); returnsSubscribed = true; } command.Append ("\r\n"); var ic = new ImapCommand (this, cancellationToken, null, command.ToString ()); ic.RegisterUntaggedHandler ("LIST", ImapUtils.UntaggedListHandler); ic.ListReturnsSubscribed = returnsSubscribed; ic.UserData = list; QueueCommand (ic); return ic; } void ProcessListInboxResponse (ImapCommand ic, StringBuilder command, List list) { TryGetCachedFolder ("INBOX", out var folder); Inbox = folder; command.Clear (); list.Clear (); } ImapCommand QueueListSpecialUseCommand (StringBuilder command, List list, CancellationToken cancellationToken) { bool returnsSubscribed = false; command.Append ("LIST "); // Note: Some IMAP servers like ProtonMail respond to SPECIAL-USE LIST queries with BAD, so fall // back to just issuing a standard LIST command and hope we get back some SPECIAL-USE attributes. // // See https://github.com/jstedfast/MailKit/issues/674 for details. if (QuirksMode != ImapQuirksMode.ProtonMail) command.Append ("(SPECIAL-USE) \"\" \"*\""); else command.Append ("\"\" \"%%\""); if ((Capabilities & ImapCapabilities.ListExtended) != 0) { command.Append (" RETURN (SUBSCRIBED CHILDREN)"); returnsSubscribed = true; } command.Append ("\r\n"); var ic = new ImapCommand (this, cancellationToken, null, command.ToString ()); ic.RegisterUntaggedHandler ("LIST", ImapUtils.UntaggedListHandler); ic.ListReturnsSubscribed = returnsSubscribed; ic.UserData = list; QueueCommand (ic); return ic; } ImapCommand QueueXListCommand (List list, CancellationToken cancellationToken) { var ic = new ImapCommand (this, cancellationToken, null, "XLIST \"\" \"*\"\r\n"); ic.RegisterUntaggedHandler ("XLIST", ImapUtils.UntaggedListHandler); ic.UserData = list; QueueCommand (ic); return ic; } /// /// Queries the special folders. /// /// The cancellation token. public void QuerySpecialFolders (CancellationToken cancellationToken) { var ic = QueueListInboxCommand (cancellationToken, out var command, out var list); Run (ic); ProcessListInboxResponse (ic, command, list); if (Inbox == null) { if ((Capabilities & ImapCapabilities.ListExtended) != 0) { // Note: This is a work-around for IMAP servers such as imap.strato.de which do not return a list of folders // for the `LIST "" "INBOX" RETURN (SUBSCRIBED CHILDREN)` command. Disable the LIST-EXTENDED (and dependent) // capabilities since they are clearly broken. // // See https://github.com/jstedfast/MailKit/issues/1957 for details. Capabilities &= ~(ImapCapabilities.ListExtended | ImapCapabilities.ListStatus | ImapCapabilities.SpecialUse); // Send a vanilla `LIST "" "INBOX"` command to get the INBOX folder. ic = QueueListInboxCommand (cancellationToken, out command, out list); Run (ic); ProcessListInboxResponse (ic, command, list); } if (Inbox == null) { // If we still don't have the INBOX folder, just create a placeholder for it. char delim = PersonalNamespaces.Count > 0 ? PersonalNamespaces[0].DirectorySeparator : '/'; var inbox = CreateImapFolder ("INBOX", FolderAttributes.Inbox, delim); CacheFolder (inbox); Inbox = inbox; } } if ((Capabilities & ImapCapabilities.SpecialUse) != 0) { ic = QueueListSpecialUseCommand (command, list, cancellationToken); Run (ic); // Note: We specifically don't throw if we get a LIST error. } else if ((Capabilities & ImapCapabilities.XList) != 0) { ic = QueueXListCommand (list, cancellationToken); Run (ic); // Note: We specifically don't throw if we get a XLIST error. } LookupParentFolders (list, cancellationToken); AssignSpecialFolders (list); } /// /// Queries the special folders. /// /// The cancellation token. public async Task QuerySpecialFoldersAsync (CancellationToken cancellationToken) { var ic = QueueListInboxCommand (cancellationToken, out var command, out var list); await RunAsync (ic).ConfigureAwait (false); ProcessListInboxResponse (ic, command, list); if (Inbox == null) { if ((Capabilities & ImapCapabilities.ListExtended) != 0) { // Note: This is a work-around for IMAP servers such as imap.strato.de which do not return a list of folders // for the `LIST "" "INBOX" RETURN (SUBSCRIBED CHILDREN)` command. Disable the LIST-EXTENDED (and dependent) // capabilities since they are clearly broken. // // See https://github.com/jstedfast/MailKit/issues/1957 for details. Capabilities &= ~(ImapCapabilities.ListExtended | ImapCapabilities.ListStatus | ImapCapabilities.SpecialUse); // Send a vanilla `LIST "" "INBOX"` command to get the INBOX folder. ic = QueueListInboxCommand (cancellationToken, out command, out list); await RunAsync (ic).ConfigureAwait (false); ProcessListInboxResponse (ic, command, list); } if (Inbox == null) { // If we still don't have the INBOX folder, just create a placeholder for it. char delim = PersonalNamespaces.Count > 0 ? PersonalNamespaces[0].DirectorySeparator : '/'; var inbox = CreateImapFolder ("INBOX", FolderAttributes.Inbox, delim); CacheFolder (inbox); Inbox = inbox; } } if ((Capabilities & ImapCapabilities.SpecialUse) != 0) { ic = QueueListSpecialUseCommand (command, list, cancellationToken); await RunAsync (ic).ConfigureAwait (false); // Note: We specifically don't throw if we get a LIST error. } else if ((Capabilities & ImapCapabilities.XList) != 0) { ic = QueueXListCommand (list, cancellationToken); await RunAsync (ic).ConfigureAwait (false); // Note: We specifically don't throw if we get a LIST error. } await LookupParentFoldersAsync (list, cancellationToken).ConfigureAwait (false); AssignSpecialFolders (list); } ImapFolder ProcessGetQuotaRootResponse (ImapCommand ic, string quotaRoot, out List list) { ImapFolder? folder; list = (List) ic.UserData!; ic.ThrowIfNotOk ("LIST"); if ((folder = GetFolder (list, quotaRoot)) == null) { folder = CreateImapFolder (quotaRoot, FolderAttributes.NonExistent, '.'); CacheFolder (folder); } return folder; } /// /// Gets the folder representing the specified quota root. /// /// The folder. /// The name of the quota root. /// The cancellation token. public ImapFolder GetQuotaRootFolder (string quotaRoot, CancellationToken cancellationToken) { if (TryGetCachedFolder (quotaRoot, out var folder)) return folder; var ic = QueueGetFolderCommand (quotaRoot, cancellationToken); Run (ic); folder = ProcessGetQuotaRootResponse (ic, quotaRoot, out var list); LookupParentFolders (list, cancellationToken); return folder; } /// /// Gets the folder representing the specified quota root. /// /// The folder. /// The name of the quota root. /// The cancellation token. public async Task GetQuotaRootFolderAsync (string quotaRoot, CancellationToken cancellationToken) { if (TryGetCachedFolder (quotaRoot, out var folder)) return folder; var ic = QueueGetFolderCommand (quotaRoot, cancellationToken); await RunAsync (ic).ConfigureAwait (false); folder = ProcessGetQuotaRootResponse (ic, quotaRoot, out var list); await LookupParentFoldersAsync (list, cancellationToken).ConfigureAwait (false); return folder; } ImapCommand QueueGetFolderCommand (string encodedName, CancellationToken cancellationToken) { var command = new StringBuilder ("LIST \"\" %S"); var list = new List (); var returnsSubscribed = false; if ((Capabilities & ImapCapabilities.ListExtended) != 0) { command.Append (" RETURN (SUBSCRIBED CHILDREN)"); returnsSubscribed = true; } command.Append ("\r\n"); var ic = new ImapCommand (this, cancellationToken, null, command.ToString (), encodedName); ic.RegisterUntaggedHandler ("LIST", ImapUtils.UntaggedListHandler); ic.ListReturnsSubscribed = returnsSubscribed; ic.UserData = list; QueueCommand (ic); return ic; } static ImapFolder ProcessGetFolderResponse (ImapCommand ic, string path, string encodedName, out List list) { ImapFolder? folder; list = (List) ic.UserData!; ic.ThrowIfNotOk ("LIST"); if ((folder = GetFolder (list, encodedName)) == null) throw new FolderNotFoundException (path); return folder; } /// /// Gets the folder for the specified path. /// /// The folder. /// The folder path. /// The cancellation token. public ImapFolder GetFolder (string path, CancellationToken cancellationToken) { var encodedName = EncodeMailboxName (path); if (TryGetCachedFolder (encodedName, out var folder)) return folder; var ic = QueueGetFolderCommand (encodedName, cancellationToken); Run (ic); folder = ProcessGetFolderResponse (ic, path, encodedName, out var list); LookupParentFolders (list, cancellationToken); return folder; } /// /// Gets the folder for the specified path. /// /// The folder. /// The folder path. /// The cancellation token. public async Task GetFolderAsync (string path, CancellationToken cancellationToken) { var encodedName = EncodeMailboxName (path); if (TryGetCachedFolder (encodedName, out var folder)) return folder; var ic = QueueGetFolderCommand (encodedName, cancellationToken); await RunAsync (ic).ConfigureAwait (false); folder = ProcessGetFolderResponse (ic, path, encodedName, out var list); await LookupParentFoldersAsync (list, cancellationToken).ConfigureAwait (false); return folder; } internal string GetStatusQuery (StatusItems items) { var flags = string.Empty; if ((items & StatusItems.Count) != 0) flags += "MESSAGES "; if ((items & StatusItems.Recent) != 0) flags += "RECENT "; if ((items & StatusItems.UidNext) != 0) flags += "UIDNEXT "; if ((items & StatusItems.UidValidity) != 0) flags += "UIDVALIDITY "; if ((items & StatusItems.Unread) != 0) flags += "UNSEEN "; if ((Capabilities & ImapCapabilities.CondStore) != 0) { if ((items & StatusItems.HighestModSeq) != 0) flags += "HIGHESTMODSEQ "; } // Note: If the IMAP server specifies a limit in the CAPABILITY response, then // it seems we cannot expect to be able to query this in a STATUS command... if ((Capabilities & ImapCapabilities.AppendLimit) != 0 && !AppendLimit.HasValue) { if ((items & StatusItems.AppendLimit) != 0) flags += "APPENDLIMIT "; } if ((Capabilities & ImapCapabilities.StatusSize) != 0) { if ((items & StatusItems.Size) != 0) flags += "SIZE "; } if ((Capabilities & ImapCapabilities.ObjectID) != 0) { if ((items & StatusItems.MailboxId) != 0) flags += "MAILBOXID "; } return flags.TrimEnd (); } ImapCommand QueueGetFoldersCommand (FolderNamespace @namespace, StatusItems items, bool subscribedOnly, CancellationToken cancellationToken, out bool status) { var encodedName = EncodeMailboxName (@namespace.Path); var pattern = encodedName.Length > 0 ? encodedName + @namespace.DirectorySeparator : string.Empty; var list = new List (); var command = new StringBuilder (); var returnsSubscribed = false; var lsub = subscribedOnly; status = items != StatusItems.None; if (!TryGetCachedFolder (encodedName, out var folder)) throw new FolderNotFoundException (@namespace.Path); if (subscribedOnly) { if ((Capabilities & ImapCapabilities.ListExtended) != 0) { command.Append ("LIST (SUBSCRIBED)"); returnsSubscribed = true; lsub = false; } else { command.Append ("LSUB"); } } else { command.Append ("LIST"); } command.Append (" \"\" %S"); if (!lsub) { if (items != StatusItems.None && (Capabilities & ImapCapabilities.ListStatus) != 0) { command.Append (" RETURN ("); if ((Capabilities & ImapCapabilities.ListExtended) != 0) { if (!subscribedOnly) { command.Append ("SUBSCRIBED "); returnsSubscribed = true; } command.Append ("CHILDREN "); } command.Append ("STATUS ("); command.Append (GetStatusQuery (items)); command.Append ("))"); status = false; } else if ((Capabilities & ImapCapabilities.ListExtended) != 0) { command.Append (" RETURN ("); if (!subscribedOnly) { command.Append ("SUBSCRIBED "); returnsSubscribed = true; } command.Append ("CHILDREN"); command.Append (')'); } } command.Append ("\r\n"); var ic = new ImapCommand (this, cancellationToken, null, command.ToString (), pattern + "*"); ic.RegisterUntaggedHandler (lsub ? "LSUB" : "LIST", ImapUtils.UntaggedListHandler); ic.ListReturnsSubscribed = returnsSubscribed; ic.UserData = list; ic.Lsub = lsub; QueueCommand (ic); return ic; } static IList ToListOfIMailFolder (List list) { var folders = new IMailFolder[list.Count]; for (int i = 0; i < folders.Length; i++) folders[i] = list[i]; return folders; } /// /// Get all of the folders within the specified namespace. /// /// /// Gets all of the folders within the specified namespace. /// /// The list of folders. /// The namespace. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. public IList GetFolders (FolderNamespace @namespace, StatusItems items, bool subscribedOnly, CancellationToken cancellationToken) { var ic = QueueGetFoldersCommand (@namespace, items, subscribedOnly, cancellationToken, out bool status); var list = (List) ic.UserData!; Run (ic); ic.ThrowIfNotOk (ic.Lsub ? "LSUB" : "LIST"); LookupParentFolders (list, cancellationToken); if (status) { for (int i = 0; i < list.Count; i++) { if (list[i].Exists) list[i].Status (items, false, cancellationToken); } } return ToListOfIMailFolder (list); } /// /// Get all of the folders within the specified namespace. /// /// /// Gets all of the folders within the specified namespace. /// /// The list of folders. /// The namespace. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. public async Task> GetFoldersAsync (FolderNamespace @namespace, StatusItems items, bool subscribedOnly, CancellationToken cancellationToken) { var ic = QueueGetFoldersCommand (@namespace, items, subscribedOnly, cancellationToken, out bool status); var list = (List) ic.UserData!; await RunAsync (ic).ConfigureAwait (false); ic.ThrowIfNotOk (ic.Lsub ? "LSUB" : "LIST"); await LookupParentFoldersAsync (list, cancellationToken).ConfigureAwait (false); if (status) { for (int i = 0; i < list.Count; i++) { if (list[i].Exists) await list[i].StatusAsync (items, false, cancellationToken).ConfigureAwait (false); } } return ToListOfIMailFolder (list); } /// /// Decodes the name of the mailbox. /// /// The mailbox name. /// The encoded name. public string DecodeMailboxName (string encodedName) { return UTF8Enabled ? encodedName : ImapEncoding.Decode (encodedName); } /// /// Encodes the name of the mailbox. /// /// The mailbox name. /// The encoded mailbox name. public string EncodeMailboxName (string mailboxName) { return UTF8Enabled ? mailboxName : ImapEncoding.Encode (mailboxName); } /// /// Determines whether the mailbox name is valid or not. /// /// if the mailbox name is valid; otherwise, . /// The mailbox name. /// The path delimiter. public static bool IsValidMailboxName (string mailboxName, char delim) { // From rfc6855: // // Mailbox names MUST comply with the Net-Unicode Definition ([RFC5198], Section 2) // with the specific exception that they MUST NOT contain control characters // (U+0000-U+001F and U+0080-U+009F), a delete character (U+007F), a line separator (U+2028), // or a paragraph separator (U+2029). for (int i = 0; i < mailboxName.Length; i++) { char c = mailboxName[i]; if (c <= 0x1F || (c >= 0x80 && c <= 0x9F) || c == 0x7F || c == 0x2028 || c == 0x2029 || c == delim) return false; } return mailboxName.Length > 0; } [MemberNotNull (nameof (parser))] void InitializeParser (Stream stream, bool persistent) { if (parser == null) parser = new MimeParser (ParserOptions.Default, stream, persistent); else parser.SetStream (stream, persistent); } public HeaderList ParseHeaders (Stream stream, CancellationToken cancellationToken) { InitializeParser (stream, false); return parser.ParseHeaders (cancellationToken); } public Task ParseHeadersAsync (Stream stream, CancellationToken cancellationToken) { InitializeParser (stream, false); return parser.ParseHeadersAsync (cancellationToken); } public MimeMessage ParseMessage (Stream stream, bool persistent, CancellationToken cancellationToken) { InitializeParser (stream, persistent); return parser.ParseMessage (cancellationToken); } public Task ParseMessageAsync (Stream stream, bool persistent, CancellationToken cancellationToken) { InitializeParser (stream, persistent); return parser.ParseMessageAsync (cancellationToken); } public MimeEntity ParseEntity (Stream stream, bool persistent, CancellationToken cancellationToken) { InitializeParser (stream, persistent); return parser.ParseEntity (cancellationToken); } public Task ParseEntityAsync (Stream stream, bool persistent, CancellationToken cancellationToken) { InitializeParser (stream, persistent); return parser.ParseEntityAsync (cancellationToken); } /// /// Occurs when the engine receives an alert message from the server. /// public event EventHandler? Alert; internal void OnAlert (string message) { Alert?.Invoke (this, new AlertEventArgs (message)); } /// /// Occurs when the engine receives a webalert message from the server. /// public event EventHandler? WebAlert; internal void OnWebAlert (Uri uri, string message) { WebAlert?.Invoke (this, new WebAlertEventArgs (uri, message)); } /// /// Occurs when the engine receives a notification that a folder has been created. /// public event EventHandler? FolderCreated; internal void OnFolderCreated (IMailFolder folder) { FolderCreated?.Invoke (this, new FolderCreatedEventArgs (folder)); } /// /// Occurs when the engine receives a notification that metadata has changed. /// public event EventHandler? MetadataChanged; internal void OnMetadataChanged (Metadata metadata) { MetadataChanged?.Invoke (this, new MetadataChangedEventArgs (metadata)); } /// /// Occurs when the engine receives a notification overflow message from the server. /// public event EventHandler? NotificationOverflow; internal void OnNotificationOverflow () { // [NOTIFICATIONOVERFLOW] will reset to NOTIFY NONE NotifySelectedNewExpunge = false; NotificationOverflow?.Invoke (this, EventArgs.Empty); } public event EventHandler? Disconnected; void OnDisconnected () { Disconnected?.Invoke (this, EventArgs.Empty); } /// /// Releases all resource used by the object. /// /// Call when you are finished using the . The /// method leaves the in an unusable state. After /// calling , you must release all references to the so /// the garbage collector can reclaim the memory that the was occupying. public void Dispose () { disposed = true; Disconnect (null); } } } ================================================ FILE: MailKit/Net/Imap/ImapEventGroup.cs ================================================ // // ImapFolderFetch.cs // // Authors: Steffen Kieß // Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; using MimeKit; namespace MailKit.Net.Imap { /// /// An IMAP event group used with the NOTIFY command. /// /// /// An IMAP event group used with the NOTIFY command. /// public sealed class ImapEventGroup { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The mailbox filter. /// The list of IMAP events. /// /// is . /// -or- /// is . /// public ImapEventGroup (ImapMailboxFilter mailboxFilter, IList events) { if (mailboxFilter == null) throw new ArgumentNullException (nameof (mailboxFilter)); if (events == null) throw new ArgumentNullException (nameof (events)); MailboxFilter = mailboxFilter; Events = events; } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The mailbox filter. /// The list of IMAP events. /// /// is . /// -or- /// is . /// public ImapEventGroup (ImapMailboxFilter mailboxFilter, params ImapEvent[] events) : this (mailboxFilter, (IList) events) { } /// /// Get the mailbox filter. /// /// /// Gets the mailbox filter. /// /// The mailbox filter. public ImapMailboxFilter MailboxFilter { get; private set; } /// /// Get the list of IMAP events. /// /// /// Gets the list of IMAP events. /// /// The events. public IList Events { get; private set; } /// /// Format the IMAP NOTIFY command for this particular IMAP event group. /// /// /// Formats the IMAP NOTIFY command for this particular IMAP event group. /// /// The IMAP engine. /// The IMAP command builder. /// The IMAP command argument builder. /// Gets set to if the NOTIFY command requests the MessageNew or /// MessageExpunged events for a SELECTED or SELECTED-DELAYED mailbox filter; otherwise it is left unchanged. internal void Format (ImapEngine engine, StringBuilder command, IList args, ref bool notifySelectedNewExpunge) { bool isSelectedFilter = MailboxFilter == ImapMailboxFilter.Selected || MailboxFilter == ImapMailboxFilter.SelectedDelayed; command.Append ('('); MailboxFilter.Format (engine, command, args); command.Append (' '); if (Events.Count > 0) { var haveAnnotationChange = false; var haveMessageExpunge = false; var haveMessageNew = false; var haveFlagChange = false; command.Append ('('); for (int i = 0; i < Events.Count; i++) { var @event = Events[i]; if (isSelectedFilter && !@event.IsMessageEvent) throw new InvalidOperationException ("Only message events may be specified when SELECTED or SELECTED-DELAYED is used."); if (@event is ImapEvent.MessageNew) haveMessageNew = true; else if (@event == ImapEvent.MessageExpunge) haveMessageExpunge = true; else if (@event == ImapEvent.FlagChange) haveFlagChange = true; else if (@event == ImapEvent.AnnotationChange) haveAnnotationChange = true; if (i > 0) command.Append (' '); @event.Format (engine, command, args, isSelectedFilter); } command.Append (')'); // https://tools.ietf.org/html/rfc5465#section-5 if ((haveMessageNew && !haveMessageExpunge) || (!haveMessageNew && haveMessageExpunge)) throw new InvalidOperationException ("If MessageNew or MessageExpunge is specified, both must be specified."); if ((haveFlagChange || haveAnnotationChange) && (!haveMessageNew || !haveMessageExpunge)) throw new InvalidOperationException ("If FlagChange and/or AnnotationChange are specified, MessageNew and MessageExpunge must also be specified."); notifySelectedNewExpunge = (haveMessageNew || haveMessageExpunge) && MailboxFilter == ImapMailboxFilter.Selected; } else { command.Append ("NONE"); } command.Append (')'); } } /// /// An IMAP mailbox filter for use with the NOTIFY command. /// /// /// An IMAP mailbox filter for use with the NOTIFY command. /// public class ImapMailboxFilter { /// /// An IMAP mailbox filter specifying that the client wants immediate notifications for /// the currently selected folder. /// /// /// The SELECTED mailbox specifier requires the server to send immediate /// notifications for the currently selected mailbox about all specified /// message events. /// public static readonly ImapMailboxFilter Selected = new ImapMailboxFilter ("SELECTED"); /// /// An IMAP mailbox filter specifying the currently selected folder but delays notifications /// until a command has been issued. /// /// /// The SELECTED-DELAYED mailbox specifier requires the server to delay a /// event until the client issues a command that allows /// returning information about expunged messages (see /// Section 7.4.1 of RFC3501] /// for more details), for example, till a NOOP or an IDLE command has been issued. /// When SELECTED-DELAYED is specified, the server MAY also delay returning other message /// events until the client issues one of the commands specified above, or it MAY return them /// immediately. /// public static readonly ImapMailboxFilter SelectedDelayed = new ImapMailboxFilter ("SELECTED-DELAYED"); /// /// An IMAP mailbox filter specifying the currently selected folder. /// /// /// The INBOXES mailbox specifier refers to all selectable mailboxes in the user's /// personal namespace(s) to which messages may be delivered by a Message Delivery Agent (MDA). /// /// If the IMAP server cannot easily compute this set, it MUST treat /// as equivalent to . /// public static readonly ImapMailboxFilter Inboxes = new ImapMailboxFilter ("INBOXES"); /// /// An IMAP mailbox filter specifying all selectable folders within the user's personal namespace. /// /// /// The PERSONAL mailbox specifier refers to all selectable folders within the user's personal namespace. /// public static readonly ImapMailboxFilter Personal = new ImapMailboxFilter ("PERSONAL"); /// /// An IMAP mailbox filter that refers to all subscribed folders. /// /// /// The SUBSCRIBED mailbox specifier refers to all folders subscribed to by the user. /// If the subscription list changes, the server MUST reevaluate the list. /// public static readonly ImapMailboxFilter Subscribed = new ImapMailboxFilter ("SUBSCRIBED"); /// /// An IMAP mailbox filter that specifies a list of folders to receive notifications about. /// /// /// An IMAP mailbox filter that specifies a list of folders to receive notifications about. /// public class Mailboxes : ImapMailboxFilter { readonly ImapFolder[] folders; /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The list of folders to watch for events. /// /// is . /// /// /// The list of is empty. /// -or- /// The list of contains folders that are not of /// type . /// public Mailboxes (IList folders) : this ("MAILBOXES", folders) { } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The list of folders to watch for events. /// /// is . /// /// /// The list of is empty. /// -or- /// The list of contains folders that are not of /// type . /// public Mailboxes (params IMailFolder[] folders) : this ((IList) folders) { } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The name of the mailbox filter. /// The list of folders to watch for events. /// /// is . /// /// /// The list of is empty. /// -or- /// The list of contains folders that are not of /// type . /// internal Mailboxes (string name, IList folders) : base (name) { if (folders == null) throw new ArgumentNullException (nameof (folders)); if (folders.Count == 0) throw new ArgumentException ("Must supply at least one folder.", nameof (folders)); this.folders = new ImapFolder[folders.Count]; for (int i = 0; i < folders.Count; i++) { if (folders[i] is not ImapFolder folder) throw new ArgumentException ("All folders must be ImapFolders.", nameof (folders)); this.folders[i] = folder; } } /// /// Format the IMAP NOTIFY command for this particular IMAP mailbox filter. /// /// /// Formats the IMAP NOTIFY command for this particular IMAP mailbox filter. /// /// The IMAP engine. /// The IMAP command builder. /// The IMAP command argument builder. internal override void Format (ImapEngine engine, StringBuilder command, IList args) { command.Append (Name); command.Append (' '); // FIXME: should we verify that each ImapFolder belongs to this ImapEngine? if (folders.Length == 1) { command.Append ("%F"); args.Add (folders[0]); } else { command.Append ('('); for (int i = 0; i < folders.Length; i++) { if (i > 0) command.Append (' '); command.Append ("%F"); args.Add (folders[i]); } command.Append (')'); } } } /// /// An IMAP mailbox filter that specifies a list of folder subtrees to get notifications about. /// /// /// The client will receive notifications for each specified folder plus all selectable /// folders that are subordinate to any of the specified folders. /// public class Subtree : Mailboxes { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The list of folders to watch for events. /// /// is . /// /// /// The list of is empty. /// -or- /// The list of contains folders that are not of /// type . /// public Subtree (IList folders) : base ("SUBTREE", folders) { } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The list of folders to watch for events. /// /// is . /// /// /// The list of is empty. /// -or- /// The list of contains folders that are not of /// type . /// public Subtree (params IMailFolder[] folders) : this ((IList) folders) { } } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The name of the mailbox filter. internal ImapMailboxFilter (string name) { Name = name; } /// /// Get the name of the mailbox filter. /// /// /// Gets the name of the mailbox filter. /// /// The name. public string Name { get; private set; } /// /// Format the IMAP NOTIFY command for this particular IMAP mailbox filter. /// /// /// Formats the IMAP NOTIFY command for this particular IMAP mailbox filter. /// /// The IMAP engine. /// The IMAP command builder. /// The IMAP command argument builder. internal virtual void Format (ImapEngine engine, StringBuilder command, IList args) { command.Append (Name); } } /// /// An IMAP notification event. /// /// /// An IMAP notification event. /// public class ImapEvent { /// /// An IMAP event notification for expunged messages. /// /// /// If the expunged message or messages are in the selected mailbox, the server notifies the client /// using (or if /// the QRESYNC extension has been enabled via /// or /// ). /// If the expunged message or messages are in another mailbox, the /// and properties will be updated and the appropriate /// and events will be /// emitted for the relevant folder. If the QRESYNC /// extension is enabled, the property will also be updated and /// the event will be emitted. /// if a client requests with the /// mailbox specifier, the meaning of a message index can change at any time, so the client cannot use /// message indexes in commands anymore. The client MUST use API variants that take or /// a . The meaning of ** can also change when messages are added or expunged. /// A client wishing to keep using message indexes can either use the /// mailbox specifier or can avoid using the event entirely. /// public static readonly ImapEvent MessageExpunge = new ImapEvent ("MessageExpunge", true); /// /// An IMAP event notification for message flag changes. /// /// /// If the notification arrives for a message located in the currently selected /// folder, then that folder will emit a event as well as a /// event with an appropriately populated /// . /// On the other hand, if the notification arrives for a message that is not /// located in the currently selected folder, then the events that are emitted will depend on the /// of the IMAP server. /// If the server supports the capability (or the /// capability and the client has enabled it via /// ), then the /// event will be emitted as well as the /// event (if the latter has changed). If the number of /// seen messages has changed, then the event may also be emitted. /// If the server does not support either the capability nor /// the capability and the client has not enabled the later capability /// via , then the server may choose /// only to notify the client of changes by emitting the /// event. /// public static readonly ImapEvent FlagChange = new ImapEvent ("FlagChange", true); /// /// An IMAP event notification for message annotation changes. /// /// /// If the notification arrives for a message located in the currently selected /// folder, then that folder will emit a event as well as a /// event with an appropriately populated /// . /// On the other hand, if the notification arrives for a message that is not /// located in the currently selected folder, then the events that are emitted will depend on the /// of the IMAP server. /// If the server supports the capability (or the /// capability and the client has enabled it via /// ), then the /// event will be emitted as well as the /// event (if the latter has changed). If the number of /// seen messages has changed, then the event may also be emitted. /// If the server does not support either the capability nor /// the capability and the client has not enabled the later capability /// via , then the server may choose /// only to notify the client of changes by emitting the /// event. /// public static readonly ImapEvent AnnotationChange = new ImapEvent ("AnnotationChange", true); /// /// AN IMAP event notification for folders that have been created, deleted, or renamed. /// /// /// These notifications are sent if an affected mailbox name was created, deleted, or renamed. /// As these notifications are received by the client, the appropriate will be emitted: /// , , or /// , respectively. /// If the server supports , granting or revocation of the /// right to the current user on the affected folder will also be /// considered folder creation or deletion, respectively. If a folder is created or deleted, the folder itself /// and its direct parent (whether it is an existing folder or not) are considered to be affected. /// public static readonly ImapEvent MailboxName = new ImapEvent ("MailboxName", false); /// /// An IMAP event notification for folders who have had their subscription status changed. /// /// /// This event requests that the server notifies the client of any subscription changes, /// causing the or /// events to be emitted accordingly on the affected . /// public static readonly ImapEvent SubscriptionChange = new ImapEvent ("SubscriptionChange", false); /// /// An IMAP event notification for changes to folder metadata. /// /// /// Support for this event type is OPTIONAL unless is supported /// by the server, in which case support for this event type is REQUIRED. /// If the server does support this event, then the event /// will be emitted whenever metadata changes for any folder included in the . /// public static readonly ImapEvent MailboxMetadataChange = new ImapEvent ("MailboxMetadataChange", false); /// /// An IMAP event notification for changes to server metadata. /// /// /// Support for this event type is OPTIONAL unless is supported /// by the server, in which case support for this event type is REQUIRED. /// If the server does support this event, then the event /// will be emitted whenever metadata changes. /// public static readonly ImapEvent ServerMetadataChange = new ImapEvent ("ServerMetadataChange", false); /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The name of the IMAP event. /// if the event is a message event; otherwise, . internal ImapEvent (string name, bool isMessageEvent) { IsMessageEvent = isMessageEvent; Name = name; } /// /// Get whether or not this is a message event. /// /// /// Gets whether or not this is a message event. /// /// if is message event; otherwise, . internal bool IsMessageEvent { get; private set; } /// /// Get the name of the IMAP event. /// /// /// Gets the name of the IMAP event. /// /// The name of the IMAP event. public string Name { get; private set; } /// /// Format the IMAP NOTIFY command for this particular IMAP mailbox filter. /// /// /// Formats the IMAP NOTIFY command for this particular IMAP mailbox filter. /// /// The IMAP engine. /// The IMAP command builder. /// The IMAP command argument builder. /// if the event is being registered for a /// or /// mailbox filter. internal virtual void Format (ImapEngine engine, StringBuilder command, IList args, bool isSelectedFilter) { command.Append (Name); } /// /// An IMAP event notification for new or appended messages. /// /// /// An IMAP event notification for new or appended messages. /// If the new or appended message is in the selected folder, the folder will emit the /// event, followed by a /// event containing the information requested by the client. /// These events will not be emitted for any message created by the client on this particular folder /// as a result of, for example, a call to /// /// or . /// public class MessageNew : ImapEvent { readonly IFetchRequest request; /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The fetch request to use when new messages arrive. /// /// is . /// public MessageNew (IFetchRequest request) : base ("MessageNew", true) { if (request == null) throw new ArgumentNullException (nameof (request)); this.request = request; } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The message summary items to automatically retrieve for new messages. public MessageNew (MessageSummaryItems items = MessageSummaryItems.None) : this (new FetchRequest (items)) { } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The message summary items to automatically retrieve for new messages. /// Additional message headers to retrieve for new messages. /// /// is . /// /// /// One or more of the specified is invalid. /// public MessageNew (MessageSummaryItems items, IEnumerable headers) : this (new FetchRequest (items, headers)) { } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The message summary items to automatically retrieve for new messages. /// Additional message headers to retrieve for new messages. /// /// is . /// /// /// One or more of the specified is invalid. /// public MessageNew (MessageSummaryItems items, IEnumerable headers) : this (new FetchRequest (items, headers)) { } /// /// Format the IMAP NOTIFY command for this particular IMAP mailbox filter. /// /// /// Formats the IMAP NOTIFY command for this particular IMAP mailbox filter. /// /// The IMAP engine. /// The IMAP command builder. /// The IMAP command argument builder. /// if the event is being registered for a /// or /// mailbox filter. internal override void Format (ImapEngine engine, StringBuilder command, IList args, bool isSelectedFilter) { command.Append (Name); if (ImapFolder.IsEmptyFetchRequest (request)) return; if (!isSelectedFilter) throw new InvalidOperationException ("The MessageNew event cannot have any parameters for mailbox filters other than SELECTED and SELECTED-DELAYED."); command.Append (' '); command.Append (ImapFolder.FormatSummaryItems (engine, request, out _, isNotify: true)); } } } } ================================================ FILE: MailKit/Net/Imap/ImapFolder.cs ================================================ // // ImapFolder.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Threading; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using MimeKit; using MailKit.Search; #if NET5_0_OR_GREATER using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet; #else using IReadOnlySetOfStrings = System.Collections.Generic.ISet; #endif namespace MailKit.Net.Imap { /// /// An IMAP folder. /// /// /// An IMAP folder. /// /// /// /// /// /// /// public partial class ImapFolder : MailFolder, IImapFolder { bool supportsModSeq; bool countChanged; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// If you subclass , you will also need to subclass /// and override the /// /// method in order to return a new instance of your ImapFolder subclass. /// /// The constructor arguments. /// /// is . /// public ImapFolder (ImapFolderConstructorArgs args) : base (args?.FullName ?? string.Empty, args?.DirectorySeparator ?? '.', args?.Attributes ?? FolderAttributes.None) { if (args == null) throw new ArgumentNullException (nameof (args)); EncodedName = args.EncodedName; Engine = args.Engine; } /// /// Get the IMAP command engine. /// /// /// Gets the IMAP command engine. /// /// The engine. internal ImapEngine Engine { get; private set; } /// /// Get the encoded name of the folder. /// /// /// Gets the encoded name of the folder. /// /// The encoded name. internal string EncodedName { get; set; } /// /// Gets an object that can be used to synchronize access to the IMAP server. /// /// /// Gets an object that can be used to synchronize access to the IMAP server. /// When using the non-Async methods from multiple threads, it is important to lock the /// object for thread safety when using the synchronous methods. /// /// The lock object. public override object SyncRoot { get { return Engine; } } /// /// Get the threading algorithms supported by the folder. /// /// /// Get the threading algorithms supported by the folder. /// /// The supported threading algorithms. public override HashSet ThreadingAlgorithms { get { return Engine.ThreadingAlgorithms; } } /// /// Determine whether or not an supports a feature. /// /// /// Determines whether or not an supports a feature. /// /// The desired feature. /// if the feature is supported; otherwise, . public override bool Supports (FolderFeature feature) { switch (feature) { case FolderFeature.AccessRights: return (Engine.Capabilities & ImapCapabilities.Acl) != 0; case FolderFeature.Annotations: return AnnotationAccess != AnnotationAccess.None; case FolderFeature.Metadata: return (Engine.Capabilities & ImapCapabilities.Metadata) != 0; case FolderFeature.ModSequences: return supportsModSeq; case FolderFeature.QuickResync: return Engine.QResyncEnabled; case FolderFeature.Quotas: return (Engine.Capabilities & ImapCapabilities.Quota) != 0; case FolderFeature.Sorting: return (Engine.Capabilities & ImapCapabilities.Sort) != 0; case FolderFeature.Threading: return (Engine.Capabilities & ImapCapabilities.Thread) != 0; case FolderFeature.UTF8: return Engine.UTF8Enabled; default: return false; } } void CheckState (bool open, bool rw) { if (Engine.IsDisposed) throw new ObjectDisposedException (nameof (ImapClient)); if (!Engine.IsConnected) throw new ServiceNotConnectedException ("The ImapClient is not connected."); if (Engine.State < ImapEngineState.Authenticated) throw new ServiceNotAuthenticatedException ("The ImapClient is not authenticated."); if (open) { var access = rw ? FolderAccess.ReadWrite : FolderAccess.ReadOnly; if (!IsOpen || Access < access) throw new FolderNotOpenException (FullName, access); } } void CheckAllowIndexes () { // Indexes ("Message Sequence Numbers" or MSNs in the RFCs) and * are not stable while MessageNew/MessageExpunge is registered for SELECTED and therefore should not be used // https://tools.ietf.org/html/rfc5465#section-5.2 if (Engine.NotifySelectedNewExpunge) throw new InvalidOperationException ("Indexes and '*' cannot be used while MessageNew/MessageExpunge is registered with NOTIFY for SELECTED."); } void CheckValidDestination (IMailFolder destination) { if (destination == null) throw new ArgumentNullException (nameof (destination)); if (destination is not ImapFolder target || (target.Engine != Engine)) throw new ArgumentException ("The destination folder does not belong to this ImapClient.", nameof (destination)); } internal void Reset () { // basic state ((HashSet) PermanentKeywords).Clear (); ((HashSet) AcceptedKeywords).Clear (); PermanentFlags = MessageFlags.None; AcceptedFlags = MessageFlags.None; Access = FolderAccess.None; // annotate state AnnotationAccess = AnnotationAccess.None; AnnotationScopes = AnnotationScope.None; MaxAnnotationSize = 0; // condstore state supportsModSeq = false; HighestModSeq = 0; } /// /// Notifies the folder that a parent folder has been renamed. /// /// /// Updates the property. /// protected override void OnParentFolderRenamed () { var oldEncodedName = EncodedName; FullName = ParentFolder!.FullName + DirectorySeparator + Name; EncodedName = Engine.EncodeMailboxName (FullName); Engine.FolderCache.Remove (oldEncodedName); Engine.FolderCache[EncodedName] = this; Reset (); if (Engine.Selected == this) { Engine.State = ImapEngineState.Authenticated; Engine.Selected = null; OnClosed (); } } void ProcessResponseCodes (ImapCommand ic, IMailFolder? folder, bool throwNotFound = true) { bool tryCreate = false; foreach (var code in ic.RespCodes) { switch (code.Type) { case ImapResponseCodeType.PermanentFlags: var permanent = (PermanentFlagsResponseCode) code; PermanentKeywords = permanent.Keywords; PermanentFlags = permanent.Flags; break; case ImapResponseCodeType.ReadOnly: if (code.IsTagged) Access = FolderAccess.ReadOnly; break; case ImapResponseCodeType.ReadWrite: if (code.IsTagged) Access = FolderAccess.ReadWrite; break; case ImapResponseCodeType.TryCreate: tryCreate = true; break; case ImapResponseCodeType.UidNext: UidNext = ((UidNextResponseCode) code).Uid; break; case ImapResponseCodeType.UidValidity: var uidValidity = ((UidValidityResponseCode) code).UidValidity; if (IsOpen) UpdateUidValidity (uidValidity); else UidValidity = uidValidity; break; case ImapResponseCodeType.Unseen: FirstUnread = ((UnseenResponseCode) code).Index; break; case ImapResponseCodeType.HighestModSeq: var highestModSeq = ((HighestModSeqResponseCode) code).HighestModSeq; supportsModSeq = true; if (IsOpen) UpdateHighestModSeq (highestModSeq); else HighestModSeq = highestModSeq; break; case ImapResponseCodeType.NoModSeq: supportsModSeq = false; HighestModSeq = 0; break; case ImapResponseCodeType.MailboxId: // Note: an untagged MAILBOX resp-code is returned on SELECT/EXAMINE while // a *tagged* MAILBOXID resp-code is returned on CREATE. if (!code.IsTagged) Id = ((MailboxIdResponseCode) code).MailboxId; break; case ImapResponseCodeType.Annotations: var annotations = (AnnotationsResponseCode) code; AnnotationAccess = annotations.Access; AnnotationScopes = annotations.Scopes; MaxAnnotationSize = annotations.MaxSize; break; } } if (tryCreate && throwNotFound && folder != null) throw new FolderNotFoundException (folder.FullName); } #region IMailFolder implementation /// /// Gets a value indicating whether the folder is currently open. /// /// /// Gets a value indicating whether the folder is currently open. /// /// if the folder is currently open; otherwise, . public override bool IsOpen { get { return Engine.Selected == this; } } static string SelectOrExamine (FolderAccess access) { return access == FolderAccess.ReadOnly ? "EXAMINE" : "SELECT"; } static Task UntaggedQResyncFetchHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { var folder = ic.Folder!; if (doAsync) return folder.OnUntaggedFetchResponseAsync (engine, index, ic.CancellationToken); folder.OnUntaggedFetchResponse (engine, index, ic.CancellationToken); return Task.CompletedTask; } ImapCommand QueueOpenCommand (FolderAccess access, uint uidValidity, ulong highestModSeq, IList uids, CancellationToken cancellationToken) { if (access != FolderAccess.ReadOnly && access != FolderAccess.ReadWrite) throw new ArgumentOutOfRangeException (nameof (access)); if (uids == null) throw new ArgumentNullException (nameof (uids)); CheckState (false, false); if ((Engine.Capabilities & ImapCapabilities.QuickResync) == 0) throw new NotSupportedException ("The IMAP server does not support the QRESYNC extension."); if (!Supports (FolderFeature.QuickResync)) throw new InvalidOperationException ("The QRESYNC extension has not been enabled."); string qresync; if ((Engine.Capabilities & ImapCapabilities.Annotate) != 0 && Engine.QuirksMode != ImapQuirksMode.iCloud) qresync = string.Format (CultureInfo.InvariantCulture, "(ANNOTATE QRESYNC ({0} {1}", uidValidity, highestModSeq); else qresync = string.Format (CultureInfo.InvariantCulture, "(QRESYNC ({0} {1}", uidValidity, highestModSeq); if (uids.Count > 0) { var set = UniqueIdSet.ToString (uids); qresync += " " + set; } qresync += "))"; var command = string.Format ("{0} %F {1}\r\n", SelectOrExamine (access), qresync); var ic = new ImapCommand (Engine, cancellationToken, this, command, this); ic.RegisterUntaggedHandler ("FETCH", UntaggedQResyncFetchHandler); Engine.QueueCommand (ic); return ic; } void ProcessOpenResponse (ImapCommand ic, FolderAccess access) { ProcessResponseCodes (ic, this); ic.ThrowIfNotOk (access == FolderAccess.ReadOnly ? "EXAMINE" : "SELECT"); } FolderAccess Open () { if (Engine.Selected != null && Engine.Selected != this) { var folder = Engine.Selected; folder.Reset (); folder.OnClosed (); } Engine.State = ImapEngineState.Selected; Engine.Selected = this; OnOpened (); return Access; } FolderAccess Open (ImapCommand ic, FolderAccess access) { Reset (); if (access == FolderAccess.ReadWrite) { // Note: if the server does not respond with a PERMANENTFLAGS response, // then we need to assume all flags are permanent. PermanentFlags = SettableFlags | MessageFlags.UserDefined; } else { PermanentFlags = MessageFlags.None; } try { Engine.Run (ic); ProcessOpenResponse (ic, access); } catch { PermanentFlags = MessageFlags.None; throw; } return Open (); } async Task OpenAsync (ImapCommand ic, FolderAccess access) { Reset (); if (access == FolderAccess.ReadWrite) { // Note: if the server does not respond with a PERMANENTFLAGS response, // then we need to assume all flags are permanent. PermanentFlags = SettableFlags | MessageFlags.UserDefined; } else { PermanentFlags = MessageFlags.None; } try { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessOpenResponse (ic, access); } catch { PermanentFlags = MessageFlags.None; throw; } return Open (); } /// /// Open the folder using the requested folder access. /// /// /// This variant of the /// method is meant for quick resynchronization of the folder. Before calling this method, /// the method MUST be called. /// You should also make sure to add listeners to the and /// events to get notifications of changes since /// the last time the folder was opened. /// /// The state of the folder. /// The requested folder access. /// The last known value. /// The last known value. /// The last known list of unique message identifiers. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The QRESYNC feature has not been enabled. /// /// /// The IMAP server does not support the QRESYNC extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override FolderAccess Open (FolderAccess access, uint uidValidity, ulong highestModSeq, IList uids, CancellationToken cancellationToken = default) { var ic = QueueOpenCommand (access, uidValidity, highestModSeq, uids, cancellationToken); return Open (ic, access); } /// /// Asynchronously open the folder using the requested folder access. /// /// /// This variant of the /// method is meant for quick resynchronization of the folder. Before calling this method, /// the method MUST be called. /// You should also make sure to add listeners to the and /// events to get notifications of changes since /// the last time the folder was opened. /// /// The state of the folder. /// The requested folder access. /// The last known value. /// The last known value. /// The last known list of unique message identifiers. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The QRESYNC feature has not been enabled. /// /// /// The IMAP server does not support the QRESYNC extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task OpenAsync (FolderAccess access, uint uidValidity, ulong highestModSeq, IList uids, CancellationToken cancellationToken = default) { var ic = QueueOpenCommand (access, uidValidity, highestModSeq, uids, cancellationToken); return OpenAsync (ic, access); } ImapCommand QueueOpenCommand (FolderAccess access, CancellationToken cancellationToken) { if (access != FolderAccess.ReadOnly && access != FolderAccess.ReadWrite) throw new ArgumentOutOfRangeException (nameof (access)); CheckState (false, false); var @params = string.Empty; if ((Engine.Capabilities & ImapCapabilities.CondStore) != 0) @params += "CONDSTORE"; if ((Engine.Capabilities & ImapCapabilities.Annotate) != 0 && Engine.QuirksMode != ImapQuirksMode.iCloud) @params += " ANNOTATE"; if (@params.Length > 0) @params = " (" + @params.TrimStart () + ")"; var command = string.Format ("{0} %F{1}\r\n", SelectOrExamine (access), @params); var ic = new ImapCommand (Engine, cancellationToken, this, command, this); Engine.QueueCommand (ic); return ic; } /// /// Open the folder using the requested folder access. /// /// /// Opens the folder using the requested folder access. /// /// The state of the folder. /// The requested folder access. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override FolderAccess Open (FolderAccess access, CancellationToken cancellationToken = default) { var ic = QueueOpenCommand (access, cancellationToken); return Open (ic, access); } /// /// Asynchronously open the folder using the requested folder access. /// /// /// Opens the folder using the requested folder access. /// /// The state of the folder. /// The requested folder access. /// The cancellation token. /// /// is not a valid value. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task OpenAsync (FolderAccess access, CancellationToken cancellationToken = default) { var ic = QueueOpenCommand (access, cancellationToken); return OpenAsync (ic, access); } ImapCommand? QueueCloseCommand (bool expunge, CancellationToken cancellationToken) { CheckState (true, expunge); ImapCommand? ic; if (expunge) { ic = Engine.QueueCommand (cancellationToken, this, "CLOSE\r\n"); } else if ((Engine.Capabilities & ImapCapabilities.Unselect) != 0) { ic = Engine.QueueCommand (cancellationToken, this, "UNSELECT\r\n"); } else { ic = null; } return ic; } void ProcessCloseResponse (ImapCommand ic, bool expunge) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk (expunge ? "CLOSE" : "UNSELECT"); } void Close () { Reset (); if (Engine.Selected == this) { Engine.State = ImapEngineState.Authenticated; Engine.Selected = null; OnClosed (); } } /// /// Close the folder, optionally expunging the messages marked for deletion. /// /// /// Closes the folder, optionally expunging the messages marked for deletion. /// /// If set to , expunge. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Close (bool expunge = false, CancellationToken cancellationToken = default) { var ic = QueueCloseCommand (expunge, cancellationToken); if (ic != null) { Engine.Run (ic); ProcessCloseResponse (ic, expunge); } Close (); } /// /// Asynchronously close the folder, optionally expunging the messages marked for deletion. /// /// /// Closes the folder, optionally expunging the messages marked for deletion. /// /// An asynchronous task context. /// If set to , expunge. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task CloseAsync (bool expunge = false, CancellationToken cancellationToken = default) { var ic = QueueCloseCommand (expunge, cancellationToken); if (ic != null) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessCloseResponse (ic, expunge); } Close (); } ImapCommand QueueGetCreatedFolderCommand (string encodedName, CancellationToken cancellationToken) { var ic = new ImapCommand (Engine, cancellationToken, null, "LIST \"\" %S\r\n", encodedName); ic.RegisterUntaggedHandler ("LIST", ImapUtils.UntaggedListHandler); ic.UserData = new List (); Engine.QueueCommand (ic); return ic; } IMailFolder? ProcessGetCreatedFolderResponse (ImapCommand ic, string encodedName, string? id, bool specialUse) { var list = (List) ic.UserData!; ImapFolder? folder; ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("LIST"); if ((folder = ImapEngine.GetFolder (list, encodedName)) != null) { folder.ParentFolder = this; folder.Id = id; if (specialUse) Engine.AssignSpecialFolder (folder); Engine.OnFolderCreated (folder); } return folder; } ImapCommand QueueCreateCommand (string name, bool isMessageFolder, CancellationToken cancellationToken, out string encodedName) { if (name == null) throw new ArgumentNullException (nameof (name)); if (!ImapEngine.IsValidMailboxName (name, DirectorySeparator)) throw new ArgumentException ("The name is not a legal folder name.", nameof (name)); CheckState (false, false); if (!string.IsNullOrEmpty (FullName) && DirectorySeparator == '\0') throw new InvalidOperationException ("Cannot create child folders."); var fullName = !string.IsNullOrEmpty (FullName) ? FullName + DirectorySeparator + name : name; encodedName = Engine.EncodeMailboxName (fullName); var createName = encodedName; if (!isMessageFolder && Engine.QuirksMode != ImapQuirksMode.GMail) createName += DirectorySeparator; return Engine.QueueCommand (cancellationToken, null, "CREATE %S\r\n", createName); } MailboxIdResponseCode? ProcessCreateResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok && ic.GetResponseCode (ImapResponseCodeType.AlreadyExists) == null) throw ImapCommandException.Create ("CREATE", ic); return ic.GetResponseCode (ImapResponseCodeType.MailboxId) as MailboxIdResponseCode; } IMailFolder? Create (ImapCommand ic, string encodedName, bool specialUse, CancellationToken cancellationToken) { Engine.Run (ic); var mailboxIdResponseCode = ProcessCreateResponse (ic); var id = mailboxIdResponseCode?.MailboxId; ic = QueueGetCreatedFolderCommand (encodedName, cancellationToken); Engine.Run (ic); return ProcessGetCreatedFolderResponse (ic, encodedName, id, specialUse); } async Task CreateAsync (ImapCommand ic, string encodedName, bool specialUse, CancellationToken cancellationToken) { await Engine.RunAsync (ic).ConfigureAwait (false); var mailboxIdResponseCode = ProcessCreateResponse (ic); var id = mailboxIdResponseCode?.MailboxId; ic = QueueGetCreatedFolderCommand (encodedName, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetCreatedFolderResponse (ic, encodedName, id, specialUse); } /// /// Create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// if the folder will be used to contain messages; otherwise, . /// The cancellation token. /// /// is . /// /// /// is empty or invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IMailFolder? Create (string name, bool isMessageFolder, CancellationToken cancellationToken = default) { var ic = QueueCreateCommand (name, isMessageFolder, cancellationToken, out var encodedName); return Create (ic, encodedName, false, cancellationToken); } /// /// Asynchronously create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// if the folder will be used to contain messages; otherwise, . /// The cancellation token. /// /// is . /// /// /// is empty or invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task CreateAsync (string name, bool isMessageFolder, CancellationToken cancellationToken = default) { var ic = QueueCreateCommand (name, isMessageFolder, cancellationToken, out var encodedName); return CreateAsync (ic, encodedName, false, cancellationToken); } ImapCommand QueueCreateCommand (string name, IEnumerable specialUses, CancellationToken cancellationToken, out string encodedName) { if (name == null) throw new ArgumentNullException (nameof (name)); if (!ImapEngine.IsValidMailboxName (name, DirectorySeparator)) throw new ArgumentException ("The name is not a legal folder name.", nameof (name)); if (specialUses == null) throw new ArgumentNullException (nameof (specialUses)); CheckState (false, false); if (!string.IsNullOrEmpty (FullName) && DirectorySeparator == '\0') throw new InvalidOperationException ("Cannot create child folders."); if ((Engine.Capabilities & ImapCapabilities.CreateSpecialUse) == 0) throw new NotSupportedException ("The IMAP server does not support the CREATE-SPECIAL-USE extension."); var uses = new StringBuilder (); uint used = 0; foreach (var use in specialUses) { var bit = (uint) (1 << ((int) use)); if ((used & bit) != 0) continue; used |= bit; if (uses.Length > 0) uses.Append (' '); switch (use) { case SpecialFolder.All: uses.Append ("\\All"); break; case SpecialFolder.Archive: uses.Append ("\\Archive"); break; case SpecialFolder.Drafts: uses.Append ("\\Drafts"); break; case SpecialFolder.Flagged: uses.Append ("\\Flagged"); break; case SpecialFolder.Important: uses.Append ("\\Important"); break; case SpecialFolder.Junk: uses.Append ("\\Junk"); break; case SpecialFolder.Sent: uses.Append ("\\Sent"); break; case SpecialFolder.Trash: uses.Append ("\\Trash"); break; default: if (uses.Length > 0) uses.Length--; break; } } var fullName = !string.IsNullOrEmpty (FullName) ? FullName + DirectorySeparator + name : name; encodedName = Engine.EncodeMailboxName (fullName); string command; if (uses.Length > 0) command = string.Format ("CREATE %S (USE ({0}))\r\n", uses); else command = "CREATE %S\r\n"; return Engine.QueueCommand (cancellationToken, null, command, encodedName); } /// /// Create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// A list of special uses for the folder being created. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty or invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The IMAP server does not support the CREATE-SPECIAL-USE extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IMailFolder? Create (string name, IEnumerable specialUses, CancellationToken cancellationToken = default) { var ic = QueueCreateCommand (name, specialUses, cancellationToken, out var encodedName); return Create (ic, encodedName, true, cancellationToken); } /// /// Asynchronously create a new subfolder with the given name. /// /// /// Creates a new subfolder with the given name. /// /// The created folder. /// The name of the folder to create. /// A list of special uses for the folder being created. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty or invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is nil, and thus child folders cannot be created. /// /// /// The IMAP server does not support the CREATE-SPECIAL-USE extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task CreateAsync (string name, IEnumerable specialUses, CancellationToken cancellationToken = default) { var ic = QueueCreateCommand (name, specialUses, cancellationToken, out var encodedName); return CreateAsync (ic, encodedName, true, cancellationToken); } ImapCommand QueueRenameCommand (IMailFolder parent, string name, CancellationToken cancellationToken, out string encodedName) { if (parent == null) throw new ArgumentNullException (nameof (parent)); if (parent == this) throw new ArgumentException ("Cannot rename a folder using itself as the new parent folder.", nameof (parent)); if (parent is not ImapFolder || ((ImapFolder) parent).Engine != Engine) throw new ArgumentException ("The parent folder does not belong to this ImapClient.", nameof (parent)); if (name == null) throw new ArgumentNullException (nameof (name)); if (!ImapEngine.IsValidMailboxName (name, DirectorySeparator)) throw new ArgumentException ("The name is not a legal folder name.", nameof (name)); if (IsNamespace || (Attributes & FolderAttributes.Inbox) != 0) throw new InvalidOperationException ("Cannot rename this folder."); CheckState (false, false); string newFullName; if (!string.IsNullOrEmpty (parent.FullName)) newFullName = parent.FullName + parent.DirectorySeparator + name; else newFullName = name; encodedName = Engine.EncodeMailboxName (newFullName); return Engine.QueueCommand (cancellationToken, null, "RENAME %F %S\r\n", this, encodedName); } void ProcessRenameResponse (ImapCommand ic, IMailFolder parent, string name, string encodedName) { var oldFullName = FullName; ProcessResponseCodes (ic, this); ic.ThrowIfNotOk ("RENAME"); Engine.FolderCache.Remove (EncodedName); Engine.FolderCache[encodedName] = this; ParentFolder = parent; FullName = Engine.DecodeMailboxName (encodedName); EncodedName = encodedName; Name = name; Reset (); if (Engine.Selected == this) { Engine.State = ImapEngineState.Authenticated; Engine.Selected = null; OnClosed (); } OnRenamed (oldFullName, FullName); } /// /// Rename the folder to exist with a new name under a new parent folder. /// /// /// Renames the folder to exist with a new name under a new parent folder. /// /// The new parent folder. /// The new name of the folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// does not belong to the . /// -or- /// is not a legal folder name. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The folder cannot be renamed (it is either a namespace or the Inbox). /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Rename (IMailFolder parent, string name, CancellationToken cancellationToken = default) { var ic = QueueRenameCommand (parent, name, cancellationToken, out var encodedName); Engine.Run (ic); ProcessRenameResponse (ic, parent, name, encodedName); } /// /// Asynchronously rename the folder to exist with a new name under a new parent folder. /// /// /// Renames the folder to exist with a new name under a new parent folder. /// /// An awaitable task. /// The new parent folder. /// The new name of the folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// does not belong to the . /// -or- /// is not a legal folder name. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The folder cannot be renamed (it is either a namespace or the Inbox). /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task RenameAsync (IMailFolder parent, string name, CancellationToken cancellationToken = default) { var ic = QueueRenameCommand (parent, name, cancellationToken, out var encodedName); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessRenameResponse (ic, parent, name, encodedName); } ImapCommand QueueDeleteCommand (CancellationToken cancellationToken) { if (IsNamespace || (Attributes & FolderAttributes.Inbox) != 0) throw new InvalidOperationException ("Cannot delete this folder."); CheckState (false, false); return Engine.QueueCommand (cancellationToken, null, "DELETE %F\r\n", this); } void ProcessDeleteResponse (ImapCommand ic) { ProcessResponseCodes (ic, this); ic.ThrowIfNotOk ("DELETE"); Reset (); if (Engine.Selected == this) { Engine.State = ImapEngineState.Authenticated; Engine.Selected = null; OnClosed (); } Attributes |= FolderAttributes.NonExistent; OnDeleted (); } /// /// Delete the folder on the IMAP server. /// /// /// Deletes the folder on the IMAP server. /// This method will not delete any child folders. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be deleted (it is either a namespace or the Inbox). /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Delete (CancellationToken cancellationToken = default) { var ic = QueueDeleteCommand (cancellationToken); Engine.Run (ic); ProcessDeleteResponse (ic); } /// /// Asynchronously delete the folder on the IMAP server. /// /// /// Deletes the folder on the IMAP server. /// This method will not delete any child folders. /// /// An awaitable task. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The folder cannot be deleted (it is either a namespace or the Inbox). /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task DeleteAsync (CancellationToken cancellationToken = default) { var ic = QueueDeleteCommand (cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessDeleteResponse (ic); } ImapCommand QueueSubscribeCommand (CancellationToken cancellationToken) { CheckState (false, false); return Engine.QueueCommand (cancellationToken, null, "SUBSCRIBE %F\r\n", this); } void ProcessSubscribeResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("SUBSCRIBE"); if ((Attributes & FolderAttributes.Subscribed) == 0) { Attributes |= FolderAttributes.Subscribed; OnSubscribed (); } } /// /// Subscribe the folder. /// /// /// Subscribes the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Subscribe (CancellationToken cancellationToken = default) { var ic = QueueSubscribeCommand (cancellationToken); Engine.Run (ic); ProcessSubscribeResponse (ic); } /// /// Asynchronously subscribe the folder. /// /// /// Subscribes the folder. /// /// An awaitable task. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task SubscribeAsync (CancellationToken cancellationToken = default) { var ic = QueueSubscribeCommand (cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessSubscribeResponse (ic); } ImapCommand QueueUnsubscribeCommand (CancellationToken cancellationToken) { CheckState (false, false); return Engine.QueueCommand (cancellationToken, null, "UNSUBSCRIBE %F\r\n", this); } void ProcessUnsubscribeResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("UNSUBSCRIBE"); if ((Attributes & FolderAttributes.Subscribed) != 0) { Attributes &= ~FolderAttributes.Subscribed; OnUnsubscribed (); } } /// /// Unsubscribe the folder. /// /// /// Unsubscribes the folder. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Unsubscribe (CancellationToken cancellationToken = default) { var ic = QueueUnsubscribeCommand (cancellationToken); Engine.Run (ic); ProcessUnsubscribeResponse (ic); } /// /// Asynchronously unsubscribe the folder. /// /// /// Unsubscribes the folder. /// /// An awaitable task. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task UnsubscribeAsync (CancellationToken cancellationToken = default) { var ic = QueueUnsubscribeCommand (cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessUnsubscribeResponse (ic); } bool TryQueueGetSubfoldersCommand (StatusItems items, bool subscribedOnly, CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic, [NotNullWhen (true)] out List? list, out bool status) { CheckState (false, false); // Any folder with a nil directory separator cannot have children. if (DirectorySeparator == '\0') { status = false; list = null; ic = null; return false; } // Note: folder names can contain wildcards (including '*' and '%'), so replace '*' with '%' // in order to reduce the list of folders returned by our LIST command. var pattern = new StringBuilder (EncodedName.Length + 2); pattern.Append (EncodedName); for (int i = 0; i < pattern.Length; i++) { if (pattern[i] == '*') pattern[i] = '%'; } if (pattern.Length > 0) pattern.Append (DirectorySeparator); pattern.Append ('%'); status = items != StatusItems.None; list = new List (); var command = new StringBuilder (); var returnsSubscribed = false; var lsub = subscribedOnly; if (subscribedOnly) { if ((Engine.Capabilities & ImapCapabilities.ListExtended) != 0) { command.Append ("LIST (SUBSCRIBED)"); returnsSubscribed = true; lsub = false; } else { command.Append ("LSUB"); } } else { command.Append ("LIST"); } command.Append (" \"\" %S"); if (!lsub) { if (items != StatusItems.None && (Engine.Capabilities & ImapCapabilities.ListStatus) != 0) { command.Append (" RETURN ("); if ((Engine.Capabilities & ImapCapabilities.ListExtended) != 0) { if (!subscribedOnly) { command.Append ("SUBSCRIBED "); returnsSubscribed = true; } command.Append ("CHILDREN "); } command.Append ("STATUS ("); command.Append (Engine.GetStatusQuery (items)); command.Append ("))"); status = false; } else if ((Engine.Capabilities & ImapCapabilities.ListExtended) != 0) { command.Append (" RETURN ("); if (!subscribedOnly) { command.Append ("SUBSCRIBED "); returnsSubscribed = true; } command.Append ("CHILDREN"); command.Append (')'); } } command.Append ("\r\n"); ic = new ImapCommand (Engine, cancellationToken, null, command.ToString (), pattern.ToString ()); ic.RegisterUntaggedHandler (lsub ? "LSUB" : "LIST", ImapUtils.UntaggedListHandler); ic.ListReturnsSubscribed = returnsSubscribed; ic.UserData = list; ic.Lsub = lsub; Engine.QueueCommand (ic); return true; } IList ProcessGetSubfoldersResponse (ImapCommand ic, List list, out bool unparented) { // Note: Due to the fact that folders can contain wildcards in them, we'll need to // filter out any folders that are not children of this folder. var prefix = FullName.Length > 0 ? FullName + DirectorySeparator : string.Empty; prefix = ImapUtils.CanonicalizeMailboxName (prefix, DirectorySeparator); var children = new List (); unparented = false; foreach (var folder in list) { var canonicalFullName = ImapUtils.CanonicalizeMailboxName (folder.FullName, folder.DirectorySeparator); var canonicalName = ImapUtils.IsInbox (folder.FullName) ? "INBOX" : folder.Name; if (!canonicalFullName.StartsWith (prefix, StringComparison.Ordinal)) { unparented |= folder.ParentFolder == null; continue; } if (string.Compare (canonicalFullName, prefix.Length, canonicalName, 0, canonicalName.Length, StringComparison.Ordinal) != 0) { unparented |= folder.ParentFolder == null; continue; } folder.ParentFolder = this; children.Add (folder); } ProcessResponseCodes (ic, null); ic.ThrowIfNotOk (ic.Lsub ? "LSUB" : "LIST"); return children; } /// /// Get the subfolders. /// /// /// Gets the subfolders. /// /// The subfolders. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList GetSubfolders (StatusItems items, bool subscribedOnly = false, CancellationToken cancellationToken = default) { if (!TryQueueGetSubfoldersCommand (items, subscribedOnly, cancellationToken, out var ic, out var list, out var status)) return Array.Empty (); Engine.Run (ic); var children = ProcessGetSubfoldersResponse (ic, list, out var unparented); // Note: if any folders returned in the LIST command are unparented, have the ImapEngine look up their // parent folders now so that they are not left in an inconsistent state. if (unparented) Engine.LookupParentFolders (list, cancellationToken); if (status) { for (int i = 0; i < children.Count; i++) { if (children[i].Exists) ((ImapFolder) children[i]).Status (items, false, cancellationToken); } } return children; } /// /// Asynchronously get the subfolders. /// /// /// Gets the subfolders. /// /// The subfolders. /// The status items to pre-populate. /// If set to , only subscribed folders will be listed. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> GetSubfoldersAsync (StatusItems items, bool subscribedOnly = false, CancellationToken cancellationToken = default) { if (!TryQueueGetSubfoldersCommand (items, subscribedOnly, cancellationToken, out var ic, out var list, out var status)) return Array.Empty (); await Engine.RunAsync (ic).ConfigureAwait (false); var children = ProcessGetSubfoldersResponse (ic, list, out var unparented); // Note: if any folders returned in the LIST command are unparented, have the ImapEngine look up their // parent folders now so that they are not left in an inconsistent state. if (unparented) await Engine.LookupParentFoldersAsync (list, cancellationToken).ConfigureAwait (false); if (status) { for (int i = 0; i < children.Count; i++) { if (children[i].Exists) await ((ImapFolder) children[i]).StatusAsync (items, false, cancellationToken).ConfigureAwait (false); } } return children; } bool TryQueueGetSubfolderCommand (string name, CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic, [NotNullWhen (true)] out List? list, [NotNullWhen (true)] out string? fullName, [NotNullWhen (true)] out string? encodedName, out ImapFolder? folder) { if (name == null) throw new ArgumentNullException (nameof (name)); if (!ImapEngine.IsValidMailboxName (name, DirectorySeparator)) throw new ArgumentException ("The name of the subfolder is invalid.", nameof (name)); CheckState (false, false); // Any folder with a nil directory separator cannot have children. if (DirectorySeparator == '\0') { encodedName = null; fullName = null; folder = null; list = null; ic = null; return false; } fullName = FullName.Length > 0 ? FullName + DirectorySeparator + name : name; encodedName = Engine.EncodeMailboxName (fullName); if (Engine.TryGetCachedFolder (encodedName, out folder)) { list = null; ic = null; return false; } // Note: folder names can contain wildcards (including '*' and '%'), so replace '*' with '%' // in order to reduce the list of folders returned by our LIST command. var pattern = encodedName.Replace ('*', '%'); ic = new ImapCommand (Engine, cancellationToken, null, "LIST \"\" %S\r\n", pattern); ic.RegisterUntaggedHandler ("LIST", ImapUtils.UntaggedListHandler); ic.UserData = list = new List (); Engine.QueueCommand (ic); return true; } ImapFolder? ProcessGetSubfolderResponse (ImapCommand ic, List list, string encodedName) { ImapFolder? folder; ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("LIST"); if ((folder = ImapEngine.GetFolder (list, encodedName)) != null) folder.ParentFolder = this; return folder; } /// /// Get the specified subfolder. /// /// /// Gets the specified subfolder. /// /// The subfolder. /// The name of the subfolder. /// The cancellation token. /// /// is . /// /// /// is either an empty string or contains the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The requested folder could not be found. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IMailFolder GetSubfolder (string name, CancellationToken cancellationToken = default) { if (!TryQueueGetSubfolderCommand (name, cancellationToken, out var ic, out var list, out var fullName, out var encodedName, out var folder)) return folder ?? throw new FolderNotFoundException (name); Engine.Run (ic); folder = ProcessGetSubfolderResponse (ic, list, encodedName); if (list.Count > 1 || folder == null) { // Note: if any folders returned in the LIST command are unparented, have the ImapEngine look up their // parent folders now so that they are not left in an inconsistent state. Engine.LookupParentFolders (list, cancellationToken); } if (folder == null) throw new FolderNotFoundException (fullName); return folder; } /// /// Asynchronously get the specified subfolder. /// /// /// Gets the specified subfolder. /// /// The subfolder. /// The name of the subfolder. /// The cancellation token. /// /// is . /// /// /// is either an empty string or contains the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The requested folder could not be found. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetSubfolderAsync (string name, CancellationToken cancellationToken = default) { if (!TryQueueGetSubfolderCommand (name, cancellationToken, out var ic, out var list, out var fullName, out var encodedName, out var folder)) return folder ?? throw new FolderNotFoundException (name); await Engine.RunAsync (ic).ConfigureAwait (false); folder = ProcessGetSubfolderResponse (ic, list, encodedName); if (list.Count > 1 || folder == null) { // Note: if any folders returned in the LIST command are unparented, have the ImapEngine look up their // parent folders now so that they are not left in an inconsistent state. await Engine.LookupParentFoldersAsync (list, cancellationToken).ConfigureAwait (false); } if (folder == null) throw new FolderNotFoundException (fullName); return folder; } ImapCommand QueueCheckCommand (CancellationToken cancellationToken) { CheckState (true, false); return Engine.QueueCommand (cancellationToken, this, "CHECK\r\n"); } void ProcessCheckResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("CHECK"); } /// /// Force the server to sync its in-memory state with its disk state. /// /// /// The CHECK command forces the IMAP server to sync its /// in-memory state with its disk state. /// For more information about the CHECK command, see /// rfc350101. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Check (CancellationToken cancellationToken = default) { var ic = QueueCheckCommand (cancellationToken); Engine.Run (ic); ProcessCheckResponse (ic); } /// /// Asynchronously force the server to sync its in-memory state with its disk state. /// /// /// The CHECK command forces the IMAP server to sync its /// in-memory state with its disk state. /// For more information about the CHECK command, see /// rfc350101. /// /// An awaitable task. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task CheckAsync (CancellationToken cancellationToken = default) { var ic = QueueCheckCommand (cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessCheckResponse (ic); } ImapCommand? QueueStatusCommand (StatusItems items, CancellationToken cancellationToken) { if ((Engine.Capabilities & ImapCapabilities.Status) == 0) throw new NotSupportedException ("The IMAP server does not support the STATUS command."); CheckState (false, false); if (items == StatusItems.None) return null; var command = string.Format ("STATUS %F ({0})\r\n", Engine.GetStatusQuery (items)); return Engine.QueueCommand (cancellationToken, null, command, this); } void ProcessStatusResponse (ImapCommand ic, bool throwNotFound) { ProcessResponseCodes (ic, this, throwNotFound); ic.ThrowIfNotOk ("STATUS"); } internal void Status (StatusItems items, bool throwNotFound, CancellationToken cancellationToken) { var ic = QueueStatusCommand (items, cancellationToken); if (ic == null) return; Engine.Run (ic); ProcessStatusResponse (ic, throwNotFound); } internal async Task StatusAsync (StatusItems items, bool throwNotFound, CancellationToken cancellationToken) { var ic = QueueStatusCommand (items, cancellationToken); if (ic == null) return; await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStatusResponse (ic, throwNotFound); } /// /// Update the values of the specified items. /// /// /// Updates the values of the specified items. /// The method /// MUST NOT be used on a folder that is already in the opened state. Instead, other ways /// of getting the desired information should be used. /// For example, a common use for the /// method is to get the number of unread messages in the folder. When the folder is open, however, it is /// possible to use the /// method to query for the list of unread messages. /// For more information about the STATUS command, see /// rfc3501. /// /// The items to update. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The IMAP server does not support the STATUS command. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Status (StatusItems items, CancellationToken cancellationToken = default) { Status (items, true, cancellationToken); } /// /// Asynchronously update the values of the specified items. /// /// /// Updates the values of the specified items. /// The method /// MUST NOT be used on a folder that is already in the opened state. Instead, other ways /// of getting the desired information should be used. /// For example, a common use for the /// method is to get the number of unread messages in the folder. When the folder is open, however, it is /// possible to use the /// method to query for the list of unread messages. /// For more information about the STATUS command, see /// rfc3501. /// /// An awaitable task. /// The items to update. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The does not exist. /// /// /// The IMAP server does not support the STATUS command. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task StatusAsync (StatusItems items, CancellationToken cancellationToken = default) { return StatusAsync (items, true, cancellationToken); } static void ParseAcl (ImapEngine engine, ImapCommand ic) { string format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ACL", "{0}"); var acl = (AccessControlList) ic.UserData!; string name, rights; ImapToken token; // read the mailbox name ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); do { name = ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); rights = ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); acl.Add (new AccessControl (name, rights)); token = engine.PeekToken (ic.CancellationToken); } while (token.Type != ImapTokenType.Eoln); } static async Task ParseAclAsync (ImapEngine engine, ImapCommand ic) { string format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ACL", "{0}"); var acl = (AccessControlList) ic.UserData!; string name, rights; ImapToken token; // read the mailbox name await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); do { name = await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); rights = await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); acl.Add (new AccessControl (name, rights)); token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); } while (token.Type != ImapTokenType.Eoln); } static Task UntaggedAclHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { if (doAsync) return ParseAclAsync (engine, ic); ParseAcl (engine, ic); return Task.CompletedTask; } ImapCommand QueueGetAccessControlListCommand (CancellationToken cancellationToken) { if ((Engine.Capabilities & ImapCapabilities.Acl) == 0) throw new NotSupportedException ("The IMAP server does not support the ACL extension."); CheckState (false, false); var ic = new ImapCommand (Engine, cancellationToken, null, "GETACL %F\r\n", this); ic.RegisterUntaggedHandler ("ACL", UntaggedAclHandler); ic.UserData = new AccessControlList (); Engine.QueueCommand (ic); return ic; } AccessControlList ProcessGetAccessControlListResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("GETACL"); return (AccessControlList) ic.UserData!; } /// /// Get the complete access control list for the folder. /// /// /// Gets the complete access control list for the folder. /// /// The access control list. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override AccessControlList GetAccessControlList (CancellationToken cancellationToken = default) { var ic = QueueGetAccessControlListCommand (cancellationToken); Engine.Run (ic); return ProcessGetAccessControlListResponse (ic); } /// /// Asynchronously get the complete access control list for the folder. /// /// /// Gets the complete access control list for the folder. /// /// The access control list. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override async Task GetAccessControlListAsync (CancellationToken cancellationToken = default) { var ic = QueueGetAccessControlListCommand (cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetAccessControlListResponse (ic); } static void ParseListRights (ImapEngine engine, ImapCommand ic) { string format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "LISTRIGHTS", "{0}"); var access = (AccessRights) ic.UserData!; ImapToken token; // read the mailbox name ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); // read the identity name ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); do { var rights = ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); access.AddRange (rights); token = engine.PeekToken (ic.CancellationToken); } while (token.Type != ImapTokenType.Eoln); } static async Task ParseListRightsAsync (ImapEngine engine, ImapCommand ic) { string format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "LISTRIGHTS", "{0}"); var access = (AccessRights) ic.UserData!; ImapToken token; // read the mailbox name await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); // read the identity name await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); do { var rights = await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); access.AddRange (rights); token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); } while (token.Type != ImapTokenType.Eoln); } static Task UntaggedListRightsHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { if (doAsync) return ParseListRightsAsync (engine, ic); ParseListRights (engine, ic); return Task.CompletedTask; } ImapCommand QueueGetAccessRightsCommand (string name, CancellationToken cancellationToken) { if (name == null) throw new ArgumentNullException (nameof (name)); if ((Engine.Capabilities & ImapCapabilities.Acl) == 0) throw new NotSupportedException ("The IMAP server does not support the ACL extension."); CheckState (false, false); var ic = new ImapCommand (Engine, cancellationToken, null, "LISTRIGHTS %F %S\r\n", this, name); ic.RegisterUntaggedHandler ("LISTRIGHTS", UntaggedListRightsHandler); ic.UserData = new AccessRights (); Engine.QueueCommand (ic); return ic; } AccessRights ProcessGetAccessRightsResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("LISTRIGHTS"); return (AccessRights) ic.UserData!; } /// /// Get the access rights for a particular identifier. /// /// /// Gets the access rights for a particular identifier. /// /// The access rights. /// The identifier name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override AccessRights GetAccessRights (string name, CancellationToken cancellationToken = default) { var ic = QueueGetAccessRightsCommand (name, cancellationToken); Engine.Run (ic); return ProcessGetAccessRightsResponse (ic); } /// /// Asynchronously get the access rights for a particular identifier. /// /// /// Gets the access rights for a particular identifier. /// /// The access rights. /// The identifier name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override async Task GetAccessRightsAsync (string name, CancellationToken cancellationToken = default) { var ic = QueueGetAccessRightsCommand (name, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetAccessRightsResponse (ic); } static void ParseMyRights (ImapEngine engine, ImapCommand ic) { string format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "MYRIGHTS", "{0}"); var access = (AccessRights) ic.UserData!; // read the mailbox name ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); // read the access rights access.AddRange (ImapUtils.ReadStringToken (engine, format, ic.CancellationToken)); } static async Task ParseMyRightsAsync (ImapEngine engine, ImapCommand ic) { string format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "MYRIGHTS", "{0}"); var access = (AccessRights) ic.UserData!; // read the mailbox name await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); // read the access rights access.AddRange (await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false)); } static Task UntaggedMyRightsHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { if (doAsync) return ParseMyRightsAsync (engine, ic); ParseMyRights (engine, ic); return Task.CompletedTask; } ImapCommand QueueGetMyAccessRightsCommand (CancellationToken cancellationToken) { if ((Engine.Capabilities & ImapCapabilities.Acl) == 0) throw new NotSupportedException ("The IMAP server does not support the ACL extension."); CheckState (false, false); var ic = new ImapCommand (Engine, cancellationToken, null, "MYRIGHTS %F\r\n", this); ic.RegisterUntaggedHandler ("MYRIGHTS", UntaggedMyRightsHandler); ic.UserData = new AccessRights (); Engine.QueueCommand (ic); return ic; } AccessRights ProcessGetMyAccessRightsResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("MYRIGHTS"); return (AccessRights) ic.UserData!; } /// /// Get the access rights for the current authenticated user. /// /// /// Gets the access rights for the current authenticated user. /// /// The access rights. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override AccessRights GetMyAccessRights (CancellationToken cancellationToken = default) { var ic = QueueGetMyAccessRightsCommand (cancellationToken); Engine.Run (ic); return ProcessGetMyAccessRightsResponse (ic); } /// /// Asynchronously get the access rights for the current authenticated user. /// /// /// Gets the access rights for the current authenticated user. /// /// The access rights. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override async Task GetMyAccessRightsAsync (CancellationToken cancellationToken = default) { var ic = QueueGetMyAccessRightsCommand (cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetMyAccessRightsResponse (ic); } ImapCommand QueueModifyAccessRightsCommand (string name, string action, AccessRights rights, CancellationToken cancellationToken) { if (name == null) throw new ArgumentNullException (nameof (name)); if (rights == null) throw new ArgumentNullException (nameof (rights)); if (action.Length != 0 && rights.Count == 0) throw new ArgumentException ("No rights were specified.", nameof (rights)); if ((Engine.Capabilities & ImapCapabilities.Acl) == 0) throw new NotSupportedException ("The IMAP server does not support the ACL extension."); CheckState (false, false); return Engine.QueueCommand (cancellationToken, null, "SETACL %F %S %S\r\n", this, name, action + rights); } void ProcessModifyAccessRightsResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("SETACL"); } /// /// Add access rights for the specified identity. /// /// /// Adds the given access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// No rights were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override void AddAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default) { var ic = QueueModifyAccessRightsCommand (name, "+", rights, cancellationToken); Engine.Run (ic); ProcessModifyAccessRightsResponse (ic); } /// /// Asynchronously add access rights for the specified identity. /// /// /// Adds the given access rights for the specified identity. /// /// An asynchronous task context. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// No rights were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override async Task AddAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default) { var ic = QueueModifyAccessRightsCommand (name, "+", rights, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessModifyAccessRightsResponse (ic); } /// /// Remove access rights for the specified identity. /// /// /// Removes the given access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// No rights were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override void RemoveAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default) { var ic = QueueModifyAccessRightsCommand (name, "-", rights, cancellationToken); Engine.Run (ic); ProcessModifyAccessRightsResponse (ic); } /// /// Asynchronously remove access rights for the specified identity. /// /// /// Removes the given access rights for the specified identity. /// /// An asynchronous task context. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// No rights were specified. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override async Task RemoveAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default) { var ic = QueueModifyAccessRightsCommand (name, "-", rights, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessModifyAccessRightsResponse (ic); } /// /// Set the access rights for the specified identity. /// /// /// Sets the access rights for the specified identity. /// /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override void SetAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default) { var ic = QueueModifyAccessRightsCommand (name, string.Empty, rights, cancellationToken); Engine.Run (ic); ProcessModifyAccessRightsResponse (ic); } /// /// Asynchronously get the access rights for the specified identity. /// /// /// Sets the access rights for the specified identity. /// /// An awaitable task. /// The identity name. /// The access rights. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override async Task SetAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default) { var ic = QueueModifyAccessRightsCommand (name, string.Empty, rights, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessModifyAccessRightsResponse (ic); } ImapCommand QueueRemoveAccessCommand (string name, CancellationToken cancellationToken) { if (name == null) throw new ArgumentNullException (nameof (name)); if ((Engine.Capabilities & ImapCapabilities.Acl) == 0) throw new NotSupportedException ("The IMAP server does not support the ACL extension."); CheckState (false, false); return Engine.QueueCommand (cancellationToken, null, "DELETEACL %F %S\r\n", this, name); } void ProcessRemoveAccessResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("DELETEACL"); } /// /// Remove all access rights for the given identity. /// /// /// Removes all access rights for the given identity. /// /// The identity name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override void RemoveAccess (string name, CancellationToken cancellationToken = default) { var ic = QueueRemoveAccessCommand (name, cancellationToken); Engine.Run (ic); ProcessRemoveAccessResponse (ic); } /// /// Asynchronously remove all access rights for the given identity. /// /// /// Removes all access rights for the given identity. /// /// An awaitable task. /// The identity name. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the ACL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The command failed. /// public override async Task RemoveAccessAsync (string name, CancellationToken cancellationToken = default) { var ic = QueueRemoveAccessCommand (name, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessRemoveAccessResponse (ic); } ImapCommand QueueGetMetadataCommand (MetadataTag tag, CancellationToken cancellationToken) { CheckState (false, false); if ((Engine.Capabilities & ImapCapabilities.Metadata) == 0) throw new NotSupportedException ("The IMAP server does not support the METADATA extension."); var ic = new ImapCommand (Engine, cancellationToken, null, "GETMETADATA %F %S\r\n", this, tag.Id); ic.RegisterUntaggedHandler ("METADATA", ImapUtils.UntaggedMetadataHandler); var metadata = new MetadataCollection (); ic.UserData = metadata; Engine.QueueCommand (ic); return ic; } string? ProcessGetMetadataResponse (ImapCommand ic, MetadataTag tag) { var metadata = (MetadataCollection) ic.UserData!; ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("GETMETADATA"); string? value = null; for (int i = 0; i < metadata.Count; i++) { if (metadata[i].EncodedName == EncodedName && metadata[i].Tag.Id == tag.Id) { value = metadata[i].Value; metadata.RemoveAt (i); break; } } Engine.ProcessMetadataChanges (metadata); return value; } /// /// Get the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override string? GetMetadata (MetadataTag tag, CancellationToken cancellationToken = default) { var ic = QueueGetMetadataCommand (tag, cancellationToken); Engine.Run (ic); return ProcessGetMetadataResponse (ic, tag); } /// /// Asynchronously get the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata value. /// The metadata tag. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetMetadataAsync (MetadataTag tag, CancellationToken cancellationToken = default) { var ic = QueueGetMetadataCommand (tag, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetMetadataResponse (ic, tag); } ImapCommand? QueueGetMetadataCommand (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken) { if (options == null) throw new ArgumentNullException (nameof (options)); if (tags == null) throw new ArgumentNullException (nameof (tags)); CheckState (false, false); if ((Engine.Capabilities & ImapCapabilities.Metadata) == 0) throw new NotSupportedException ("The IMAP server does not support the METADATA extension."); var command = new StringBuilder ("GETMETADATA %F"); var args = new List (); bool hasOptions = false; if (options.MaxSize.HasValue || options.Depth != 0) { command.Append (" ("); if (options.MaxSize.HasValue) { command.Append ("MAXSIZE "); command.Append (options.MaxSize.Value.ToString (CultureInfo.InvariantCulture)); command.Append (' '); } if (options.Depth > 0) { command.Append ("DEPTH "); command.Append (options.Depth == int.MaxValue ? "infinity" : "1"); command.Append (' '); } command[command.Length - 1] = ')'; command.Append (' '); hasOptions = true; } args.Add (this); int startIndex = command.Length; foreach (var tag in tags) { command.Append (" %S"); args.Add (tag.Id); } if (hasOptions) { command[startIndex] = '('; command.Append (')'); } command.Append ("\r\n"); if (args.Count == 1) return null; var ic = new ImapCommand (Engine, cancellationToken, null, command.ToString (), args.ToArray ()); ic.RegisterUntaggedHandler ("METADATA", ImapUtils.UntaggedMetadataHandler); ic.UserData = new MetadataCollection (); options.LongEntries = 0; Engine.QueueCommand (ic); return ic; } MetadataCollection ProcessGetMetadataResponse (ImapCommand ic, MetadataOptions options) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("GETMETADATA"); var rc = ic.GetResponseCode (ImapResponseCodeType.Metadata); if (rc is MetadataResponseCode metadata && metadata.SubType == MetadataResponseCodeSubType.LongEntries) options.LongEntries = metadata.Value; return Engine.FilterMetadata ((MetadataCollection) ic.UserData!, EncodedName); } /// /// Get the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override MetadataCollection GetMetadata (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default) { var ic = QueueGetMetadataCommand (options, tags, cancellationToken); if (ic == null) return new MetadataCollection (); Engine.Run (ic); return ProcessGetMetadataResponse (ic, options); } /// /// Asynchronously get the specified metadata. /// /// /// Gets the specified metadata. /// /// The requested metadata. /// The metadata options. /// The metadata tags. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetMetadataAsync (MetadataOptions options, IEnumerable tags, CancellationToken cancellationToken = default) { var ic = QueueGetMetadataCommand (options, tags, cancellationToken); if (ic == null) return new MetadataCollection (); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetMetadataResponse (ic, options); } ImapCommand? QueueSetMetadataCommand (MetadataCollection metadata, CancellationToken cancellationToken) { if (metadata == null) throw new ArgumentNullException (nameof (metadata)); CheckState (false, false); if ((Engine.Capabilities & ImapCapabilities.Metadata) == 0) throw new NotSupportedException ("The IMAP server does not support the METADATA extension."); if (metadata.Count == 0) return null; var command = new StringBuilder ("SETMETADATA %F ("); var args = new List { this }; for (int i = 0; i < metadata.Count; i++) { if (i > 0) command.Append (' '); if (metadata[i].Value != null) { command.Append ("%S %S"); args.Add (metadata[i].Tag.Id); args.Add (metadata[i].Value); } else { command.Append ("%S NIL"); args.Add (metadata[i].Tag.Id); } } command.Append (")\r\n"); var ic = new ImapCommand (Engine, cancellationToken, null, command.ToString (), args.ToArray ()); Engine.QueueCommand (ic); return ic; } void ProcessSetMetadataResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("SETMETADATA"); } /// /// Set the specified metadata. /// /// /// Sets the specified metadata. /// /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void SetMetadata (MetadataCollection metadata, CancellationToken cancellationToken = default) { var ic = QueueSetMetadataCommand (metadata, cancellationToken); if (ic == null) return; Engine.Run (ic); ProcessSetMetadataResponse (ic); } /// /// Asynchronously set the specified metadata. /// /// /// Sets the specified metadata. /// /// An asynchronous task context. /// The metadata. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the METADATA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task SetMetadataAsync (MetadataCollection metadata, CancellationToken cancellationToken = default) { var ic = QueueSetMetadataCommand (metadata, cancellationToken); if (ic == null) return; await Engine.RunAsync (ic).ConfigureAwait (false); ProcessSetMetadataResponse (ic); } class Quota { public uint? MessageLimit; public uint? StorageLimit; public uint? CurrentMessageCount; public uint? CurrentStorageSize; } class QuotaContext { public QuotaContext () { Quotas = new Dictionary (); QuotaRoots = new List (); } public List QuotaRoots { get; private set; } public Dictionary Quotas { get; private set; } } static void ParseQuotaRoot (ImapEngine engine, ImapCommand ic) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "QUOTAROOT", "{0}"); var ctx = (QuotaContext) ic.UserData!; // The first token should be the mailbox name ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); // ...followed by 0 or more quota roots var token = engine.PeekToken (ic.CancellationToken); while (token.Type != ImapTokenType.Eoln) { var root = ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); ctx.QuotaRoots.Add (root); token = engine.PeekToken (ic.CancellationToken); } } static async Task ParseQuotaRootAsync (ImapEngine engine, ImapCommand ic) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "QUOTAROOT", "{0}"); var ctx = (QuotaContext) ic.UserData!; // The first token should be the mailbox name await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); // ...followed by 0 or more quota roots var token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); while (token.Type != ImapTokenType.Eoln) { var root = await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); ctx.QuotaRoots.Add (root); token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); } } /// /// Handles an untagged QUOTAROOT response. /// /// An asynchronous task. /// The IMAP engine. /// The IMAP command. /// The index. /// Whether or not asynchronous IO methods should be used. static Task UntaggedQuotaRootHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { if (doAsync) return ParseQuotaRootAsync (engine, ic); ParseQuotaRoot (engine, ic); return Task.CompletedTask; } static void ParseQuota (ImapEngine engine, ImapCommand ic) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "QUOTA", "{0}"); var quotaRoot = ImapUtils.ReadStringToken (engine, format, ic.CancellationToken); var ctx = (QuotaContext) ic.UserData!; var quota = new Quota (); var token = engine.ReadToken (ic.CancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); while (token.Type != ImapTokenType.CloseParen) { ulong used, limit; string resource; token = engine.ReadToken (ic.CancellationToken); ImapEngine.AssertToken (token, ImapTokenType.Atom, format, token); resource = (string) token.Value; token = engine.ReadToken (ic.CancellationToken); // Note: We parse these quota values as UInt64 because GMail uses 64bit integer values. // See https://github.com/jstedfast/MailKit/issues/1602 for details. used = ImapEngine.ParseNumber64 (token, false, format, token); token = engine.ReadToken (ic.CancellationToken); // Note: We parse these quota values as UInt64 because GMail uses 64bit integer values. // See https://github.com/jstedfast/MailKit/issues/1602 for details. limit = ImapEngine.ParseNumber64 (token, false, format, token); if (resource.Equals ("MESSAGE", StringComparison.OrdinalIgnoreCase)) { quota.CurrentMessageCount = (uint) (used & 0xffffffff); quota.MessageLimit = (uint) (limit & 0xffffffff); } else if (resource.Equals ("STORAGE", StringComparison.OrdinalIgnoreCase)) { quota.CurrentStorageSize = (uint) (used & 0xffffffff); quota.StorageLimit = (uint) (limit & 0xffffffff); } token = engine.PeekToken (ic.CancellationToken); } // read the closing paren engine.ReadToken (ic.CancellationToken); ctx.Quotas[quotaRoot] = quota; } static async Task ParseQuotaAsync (ImapEngine engine, ImapCommand ic) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "QUOTA", "{0}"); var quotaRoot = await ImapUtils.ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); var ctx = (QuotaContext) ic.UserData!; var quota = new Quota (); var token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); while (token.Type != ImapTokenType.CloseParen) { ulong used, limit; string resource; token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.Atom, format, token); resource = (string) token.Value; token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); // Note: We parse these quota values as UInt64 because GMail uses 64bit integer values. // See https://github.com/jstedfast/MailKit/issues/1602 for details. used = ImapEngine.ParseNumber64 (token, false, format, token); token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); // Note: We parse these quota values as UInt64 because GMail uses 64bit integer values. // See https://github.com/jstedfast/MailKit/issues/1602 for details. limit = ImapEngine.ParseNumber64 (token, false, format, token); if (resource.Equals ("MESSAGE", StringComparison.OrdinalIgnoreCase)) { quota.CurrentMessageCount = (uint) (used & 0xffffffff); quota.MessageLimit = (uint) (limit & 0xffffffff); } else if (resource.Equals ("STORAGE", StringComparison.OrdinalIgnoreCase)) { quota.CurrentStorageSize = (uint) (used & 0xffffffff); quota.StorageLimit = (uint) (limit & 0xffffffff); } token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); } // read the closing paren await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ctx.Quotas[quotaRoot] = quota; } /// /// Handles an untagged QUOTA response. /// /// An asynchronous task. /// The IMAP engine. /// The IMAP command. /// The index. /// Whether or not asynchronous IO methods should be used. static Task UntaggedQuotaHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { if (doAsync) return ParseQuotaAsync (engine, ic); ParseQuota (engine, ic); return Task.CompletedTask; } ImapCommand QueueGetQuotaCommand (CancellationToken cancellationToken) { CheckState (false, false); if ((Engine.Capabilities & ImapCapabilities.Quota) == 0) throw new NotSupportedException ("The IMAP server does not support the QUOTA extension."); var ic = new ImapCommand (Engine, cancellationToken, null, "GETQUOTAROOT %F\r\n", this); var ctx = new QuotaContext (); ic.RegisterUntaggedHandler ("QUOTAROOT", UntaggedQuotaRootHandler); ic.RegisterUntaggedHandler ("QUOTA", UntaggedQuotaHandler); ic.UserData = ctx; Engine.QueueCommand (ic); return ic; } bool TryProcessGetQuotaResponse (ImapCommand ic, [NotNullWhen (true)] out string? encodedName, [NotNullWhen (true)] out Quota? quota) { var ctx = (QuotaContext) ic.UserData!; ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("GETQUOTAROOT"); for (int i = 0; i < ctx.QuotaRoots.Count; i++) { encodedName = ctx.QuotaRoots[i]; if (ctx.Quotas.TryGetValue (encodedName, out quota)) return true; } encodedName = null; quota = null; return false; } /// /// Get the quota information for the folder. /// /// /// Gets the quota information for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The folder quota. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the QUOTA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override FolderQuota GetQuota (CancellationToken cancellationToken = default) { var ic = QueueGetQuotaCommand (cancellationToken); Engine.Run (ic); if (!TryProcessGetQuotaResponse (ic, out var encodedName, out var quota)) return new FolderQuota (null); var quotaRoot = Engine.GetQuotaRootFolder (encodedName, cancellationToken); return new FolderQuota (quotaRoot) { CurrentMessageCount = quota.CurrentMessageCount, CurrentStorageSize = quota.CurrentStorageSize, MessageLimit = quota.MessageLimit, StorageLimit = quota.StorageLimit }; } /// /// Asynchronously get the quota information for the folder. /// /// /// Gets the quota information for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The folder quota. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the QUOTA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetQuotaAsync (CancellationToken cancellationToken = default) { var ic = QueueGetQuotaCommand (cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); if (!TryProcessGetQuotaResponse (ic, out var encodedName, out var quota)) return new FolderQuota (null); var quotaRoot = await Engine.GetQuotaRootFolderAsync (encodedName, cancellationToken).ConfigureAwait (false); return new FolderQuota (quotaRoot) { CurrentMessageCount = quota.CurrentMessageCount, CurrentStorageSize = quota.CurrentStorageSize, MessageLimit = quota.MessageLimit, StorageLimit = quota.StorageLimit }; } ImapCommand QueueSetQuotaCommand (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken) { CheckState (false, false); if ((Engine.Capabilities & ImapCapabilities.Quota) == 0) throw new NotSupportedException ("The IMAP server does not support the QUOTA extension."); var command = new StringBuilder ("SETQUOTA %F ("); if (messageLimit.HasValue) { command.Append ("MESSAGE "); command.Append (messageLimit.Value.ToString (CultureInfo.InvariantCulture)); command.Append (' '); } if (storageLimit.HasValue) { command.Append ("STORAGE "); command.Append (storageLimit.Value.ToString (CultureInfo.InvariantCulture)); command.Append (' '); } command[command.Length - 1] = ')'; command.Append ("\r\n"); var ic = new ImapCommand (Engine, cancellationToken, null, command.ToString (), this); var ctx = new QuotaContext (); ic.RegisterUntaggedHandler ("QUOTA", UntaggedQuotaHandler); ic.UserData = ctx; Engine.QueueCommand (ic); return ic; } FolderQuota ProcessSetQuotaResponse (ImapCommand ic) { var ctx = (QuotaContext) ic.UserData!; ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("SETQUOTA"); if (ctx.Quotas.TryGetValue (EncodedName, out var quota)) { return new FolderQuota (this) { CurrentMessageCount = quota.CurrentMessageCount, CurrentStorageSize = quota.CurrentStorageSize, MessageLimit = quota.MessageLimit, StorageLimit = quota.StorageLimit }; } return new FolderQuota (null); } /// /// Set the quota limits for the folder. /// /// /// Sets the quota limits for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The folder quota. /// If not , sets the maximum number of messages to allow. /// If not , sets the maximum storage size (in kilobytes). /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the QUOTA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override FolderQuota SetQuota (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default) { var ic = QueueSetQuotaCommand (messageLimit, storageLimit, cancellationToken); Engine.Run (ic); return ProcessSetQuotaResponse (ic); } /// /// Asynchronously set the quota limits for the folder. /// /// /// Sets the quota limits for the folder. /// To determine if a quotas are supported, check the /// property. /// /// The folder quota. /// If not , sets the maximum number of messages to allow. /// If not , sets the maximum storage size (in kilobytes). /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The IMAP server does not support the QUOTA extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task SetQuotaAsync (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default) { var ic = QueueSetQuotaCommand (messageLimit, storageLimit, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessSetQuotaResponse (ic); } ImapCommand QueueExpungeCommand (CancellationToken cancellationToken) { CheckState (true, true); return Engine.QueueCommand (cancellationToken, this, "EXPUNGE\r\n"); } void ProcessExpungeResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("EXPUNGE"); } /// /// Expunge the folder, permanently removing all messages marked for deletion. /// /// /// The EXPUNGE command permanently removes all messages in the folder /// that have the flag set. /// For more information about the EXPUNGE command, see /// rfc3501. /// Normally, a event will be emitted /// for each message that is expunged. However, if the IMAP server supports the QRESYNC extension /// and it has been enabled via the /// method, then the event will be emitted rather than /// the event. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Expunge (CancellationToken cancellationToken = default) { var ic = QueueExpungeCommand (cancellationToken); Engine.Run (ic); ProcessExpungeResponse (ic); } /// /// Asynchronously expunge the folder, permanently removing all messages marked for deletion. /// /// /// The EXPUNGE command permanently removes all messages in the folder /// that have the flag set. /// For more information about the EXPUNGE command, see /// rfc3501. /// Normally, a event will be emitted /// for each message that is expunged. However, if the IMAP server supports the QRESYNC extension /// and it has been enabled via the /// method, then the event will be emitted rather than /// the event. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not currently open in read-write mode. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task ExpungeAsync (CancellationToken cancellationToken = default) { var ic = QueueExpungeCommand (cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessExpungeResponse (ic); } /// /// Expunge the specified uids, permanently removing them from the folder. /// /// /// Expunges the specified uids, permanently removing them from the folder. /// If the IMAP server supports the UIDPLUS extension (check the /// for the /// flag), then this operation is atomic. Otherwise, MailKit implements this operation /// by first searching for the full list of message uids in the folder that are marked for /// deletion, unmarking the set of message uids that are not within the specified list of /// uids to be be expunged, expunging the folder (thus expunging the requested uids), and /// finally restoring the deleted flag on the collection of message uids that were originally /// marked for deletion that were not included in the list of uids provided. For this reason, /// it is advisable for clients that wish to maintain state to implement this themselves when /// the IMAP server does not support the UIDPLUS extension. /// For more information about the UID EXPUNGE command, see /// rfc4315. /// Normally, a event will be emitted /// for each message that is expunged. However, if the IMAP server supports the QRESYNC extension /// and it has been enabled via the /// method, then the event will be emitted rather than /// the event. /// /// The message uids. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Expunge (IList uids, CancellationToken cancellationToken = default) { if (uids == null) throw new ArgumentNullException (nameof (uids)); CheckState (true, true); if (uids.Count == 0) return; if ((Engine.Capabilities & ImapCapabilities.UidPlus) == 0) { // get the list of messages marked for deletion that should not be expunged var query = SearchQuery.Deleted.And (SearchQuery.Not (SearchQuery.Uids (uids))); var unmark = Search (SearchOptions.None, query, cancellationToken); if (unmark.Count > 0) { // clear the \Deleted flag on all messages except the ones that are to be expunged Store (unmark.UniqueIds, RemoveDeletedFlag, cancellationToken); } // expunge the folder Expunge (cancellationToken); if (unmark.Count > 0) { // restore the \Deleted flags Store (unmark.UniqueIds, AddDeletedFlag, cancellationToken); } return; } foreach (var ic in Engine.QueueCommands (cancellationToken, this, "UID EXPUNGE %s\r\n", uids)) { Engine.Run (ic); ProcessExpungeResponse (ic); } } /// /// Asynchronously expunge the specified uids, permanently removing them from the folder. /// /// /// Expunges the specified uids, permanently removing them from the folder. /// If the IMAP server supports the UIDPLUS extension (check the /// for the /// flag), then this operation is atomic. Otherwise, MailKit implements this operation /// by first searching for the full list of message uids in the folder that are marked for /// deletion, unmarking the set of message uids that are not within the specified list of /// uids to be be expunged, expunging the folder (thus expunging the requested uids), and /// finally restoring the deleted flag on the collection of message uids that were originally /// marked for deletion that were not included in the list of uids provided. For this reason, /// it is advisable for clients that wish to maintain state to implement this themselves when /// the IMAP server does not support the UIDPLUS extension. /// For more information about the UID EXPUNGE command, see /// rfc4315. /// Normally, a event will be emitted /// for each message that is expunged. However, if the IMAP server supports the QRESYNC extension /// and it has been enabled via the /// method, then the event will be emitted rather than /// the event. /// /// An asynchronous task context. /// The message uids. /// The cancellation token. /// /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task ExpungeAsync (IList uids, CancellationToken cancellationToken = default) { if (uids == null) throw new ArgumentNullException (nameof (uids)); CheckState (true, true); if (uids.Count == 0) return; if ((Engine.Capabilities & ImapCapabilities.UidPlus) == 0) { // get the list of messages marked for deletion that should not be expunged var query = SearchQuery.Deleted.And (SearchQuery.Not (SearchQuery.Uids (uids))); var unmark = await SearchAsync (SearchOptions.None, query, cancellationToken).ConfigureAwait (false); if (unmark.Count > 0) { // clear the \Deleted flag on all messages except the ones that are to be expunged await StoreAsync (unmark.UniqueIds, RemoveDeletedFlag, cancellationToken).ConfigureAwait (false); } // expunge the folder await ExpungeAsync (cancellationToken).ConfigureAwait (false); if (unmark.Count > 0) { // restore the \Deleted flags await StoreAsync (unmark.UniqueIds, AddDeletedFlag, cancellationToken).ConfigureAwait (false); } return; } foreach (var ic in Engine.QueueCommands (cancellationToken, this, "UID EXPUNGE %s\r\n", uids)) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessExpungeResponse (ic); } } FormatOptions CreateAppendOptions (FormatOptions options) { if (options.International && (Engine.Capabilities & ImapCapabilities.UTF8Accept) == 0) throw new NotSupportedException ("The IMAP server does not support the UTF8 extension."); var format = options.Clone (); format.NewLineFormat = NewLineFormat.Dos; format.EnsureNewLine = true; if ((Engine.Capabilities & ImapCapabilities.UTF8Only) == ImapCapabilities.UTF8Only) format.International = true; if (format.International && !Engine.UTF8Enabled) throw new InvalidOperationException ("The UTF8 extension has not been enabled."); return format; } ImapCommand QueueAppendCommand (FormatOptions options, IAppendRequest request, CancellationToken cancellationToken) { if (options == null) throw new ArgumentNullException (nameof (options)); if (request == null) throw new ArgumentNullException (nameof (request)); CheckState (false, false); var format = CreateAppendOptions (options); if (request.Annotations != null && request.Annotations.Count > 0 && (Engine.Capabilities & ImapCapabilities.Annotate) == 0) throw new NotSupportedException ("The IMAP server does not support annotations."); int numKeywords = request.Keywords != null ? request.Keywords.Count : 0; var builder = new StringBuilder ("APPEND %F "); var list = new List { this }; if ((request.Flags & SettableFlags) != 0 || numKeywords > 0) { ImapUtils.FormatFlagsList (builder, request.Flags, numKeywords); builder.Append (' '); } if (request.Keywords != null) { foreach (var keyword in request.Keywords) list.Add (keyword); } if (request.InternalDate.HasValue) { builder.Append ('"'); builder.Append (ImapUtils.FormatInternalDate (request.InternalDate.Value)); builder.Append ("\" "); } if (request.Annotations != null && request.Annotations.Count > 0) { ImapUtils.FormatAnnotations (builder, request.Annotations, list, false); if (builder[builder.Length - 1] != ' ') builder.Append (' '); } builder.Append ("%L\r\n"); list.Add (request.Message); var command = builder.ToString (); var args = list.ToArray (); var ic = new ImapCommand (Engine, cancellationToken, null, format, command, args) { Progress = request.TransferProgress }; Engine.QueueCommand (ic); return ic; } UniqueId? ProcessAppendResponse (ImapCommand ic) { ProcessResponseCodes (ic, this); ic.ThrowIfNotOk ("APPEND"); var rc = ic.GetResponseCode (ImapResponseCodeType.AppendUid) as AppendUidResponseCode; return rc?.UidSet?[0]; } /// /// Append a message to the folder. /// /// /// Appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The formatting options. /// The append request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override UniqueId? Append (FormatOptions options, IAppendRequest request, CancellationToken cancellationToken = default) { var ic = QueueAppendCommand (options, request, cancellationToken); Engine.Run (ic); return ProcessAppendResponse (ic); } /// /// Asynchronously append a message to the folder. /// /// /// Asynchronously appends a message to the folder and returns the UniqueId assigned to the message. /// /// The UID of the appended message, if available; otherwise, . /// The formatting options. /// The append request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// The request included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task AppendAsync (FormatOptions options, IAppendRequest request, CancellationToken cancellationToken = default) { var ic = QueueAppendCommand (options, request, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessAppendResponse (ic); } void ValidateArguments (FormatOptions options, IList requests) { if (options == null) throw new ArgumentNullException (nameof (options)); if (requests == null) throw new ArgumentNullException (nameof (requests)); for (int i = 0; i < requests.Count; i++) { if (requests[i] == null) throw new ArgumentException ("One or more of the requests is null."); var annotations = requests[i].Annotations; if (annotations != null && annotations.Count > 0 && (Engine.Capabilities & ImapCapabilities.Annotate) == 0) throw new NotSupportedException ("One ore more requests included annotations but the IMAP server does not support annotations."); } CheckState (false, false); } ImapCommand QueueMultiAppendCommand (FormatOptions options, IList requests, CancellationToken cancellationToken) { var format = CreateAppendOptions (options); var builder = new StringBuilder ("APPEND %F"); var list = new List { this }; for (int i = 0; i < requests.Count; i++) { var keywords = requests[i].Keywords; int numKeywords = keywords != null ? keywords.Count : 0; builder.Append (' '); if ((requests[i].Flags & SettableFlags) != 0 || numKeywords > 0) { ImapUtils.FormatFlagsList (builder, requests[i].Flags, numKeywords); builder.Append (' '); } if (keywords != null) { foreach (var keyword in keywords) list.Add (keyword); } var internalDate = requests[i].InternalDate; if (internalDate.HasValue) { builder.Append ('"'); builder.Append (ImapUtils.FormatInternalDate (internalDate.Value)); builder.Append ("\" "); } var annotations = requests[i].Annotations; if (annotations != null && annotations.Count > 0) { ImapUtils.FormatAnnotations (builder, annotations, list, false); if (builder[builder.Length - 1] != ' ') builder.Append (' '); } builder.Append ("%L"); list.Add (requests[i].Message); } builder.Append ("\r\n"); var command = builder.ToString (); var args = list.ToArray (); var ic = new ImapCommand (Engine, cancellationToken, null, format, command, args) { Progress = requests[0].TransferProgress }; Engine.QueueCommand (ic); return ic; } IList ProcessMultiAppendResponse (ImapCommand ic) { ProcessResponseCodes (ic, this); ic.ThrowIfNotOk ("APPEND"); var rc = ic.GetResponseCode (ImapResponseCodeType.AppendUid) as AppendUidResponseCode; if (rc != null && rc.UidSet != null) return rc.UidSet; return Array.Empty (); } /// /// Append multiple messages to the folder. /// /// /// Appends multiple messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The formatting options. /// The append requests. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Append (FormatOptions options, IList requests, CancellationToken cancellationToken = default) { ValidateArguments (options, requests); if (requests.Count == 0) return Array.Empty (); if ((Engine.Capabilities & ImapCapabilities.MultiAppend) != 0) { var ic = QueueMultiAppendCommand (options, requests, cancellationToken); Engine.Run (ic); return ProcessMultiAppendResponse (ic); } // FIXME: use an aggregate progress reporter var uids = new List (); for (int i = 0; i < requests.Count; i++) { var uid = Append (options, requests[i], cancellationToken); if (uids != null && uid.HasValue) uids.Add (uid.Value); else uids = null; } if (uids == null) return Array.Empty (); return uids; } /// /// Asynchronously append multiple messages to the folder. /// /// /// Asynchronously appends multiple messages to the folder and returns the UniqueIds assigned to the messages. /// /// The UIDs of the appended messages, if available; otherwise an empty array. /// The formatting options. /// The append requests. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// -or- /// One ore more requests included annotations but the folder does not support annotations. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> AppendAsync (FormatOptions options, IList requests, CancellationToken cancellationToken = default) { ValidateArguments (options, requests); if (requests.Count == 0) return Array.Empty (); if ((Engine.Capabilities & ImapCapabilities.MultiAppend) != 0) { var ic = QueueMultiAppendCommand (options, requests, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessMultiAppendResponse (ic); } // FIXME: use an aggregate progress reporter var uids = new List (); for (int i = 0; i < requests.Count; i++) { var uid = await AppendAsync (options, requests[i], cancellationToken).ConfigureAwait (false); if (uids != null && uid.HasValue) uids.Add (uid.Value); else uids = null; } if (uids == null) return Array.Empty (); return uids; } void ValidateArguments (FormatOptions options, UniqueId uid, IReplaceRequest request) { if (options == null) throw new ArgumentNullException (nameof (options)); if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (request == null) throw new ArgumentNullException (nameof (request)); if (request.Destination != null && !(request.Destination is ImapFolder target && target.Engine == Engine)) throw new ArgumentException ("The destination folder does not belong to this ImapClient.", nameof (request)); if (request.Annotations != null && request.Annotations.Count > 0 && (Engine.Capabilities & ImapCapabilities.Annotate) == 0) throw new NotSupportedException ("The IMAP server does not support annotations."); CheckState (true, true); } ImapCommand QueueReplaceCommand (FormatOptions options, UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken) { var format = CreateAppendOptions (options); int numKeywords = request.Keywords != null ? request.Keywords.Count : 0; var builder = new StringBuilder ($"UID REPLACE {uid} %F "); var list = new List { request.Destination ?? this }; if ((request.Flags & SettableFlags) != 0 || numKeywords > 0) { ImapUtils.FormatFlagsList (builder, request.Flags, numKeywords); builder.Append (' '); } if (request.Keywords != null) { foreach (var keyword in request.Keywords) list.Add (keyword); } if (request.InternalDate.HasValue) { builder.Append ('"'); builder.Append (ImapUtils.FormatInternalDate (request.InternalDate.Value)); builder.Append ("\" "); } if (request.Annotations != null && request.Annotations.Count > 0) { ImapUtils.FormatAnnotations (builder, request.Annotations, list, false); if (builder[builder.Length - 1] != ' ') builder.Append (' '); } builder.Append ("%L\r\n"); list.Add (request.Message); var command = builder.ToString (); var args = list.ToArray (); var ic = new ImapCommand (Engine, cancellationToken, null, format, command, args) { Progress = request.TransferProgress }; Engine.QueueCommand (ic); return ic; } UniqueId? ProcessReplaceResponse (ImapCommand ic) { ProcessResponseCodes (ic, this); ic.ThrowIfNotOk ("REPLACE"); var rc = ic.GetResponseCode (ImapResponseCodeType.AppendUid) as AppendUidResponseCode; return rc?.UidSet?[0]; } /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override UniqueId? Replace (FormatOptions options, UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default) { ValidateArguments (options, uid, request); if ((Engine.Capabilities & ImapCapabilities.Replace) == 0) { var destination = request.Destination as ImapFolder ?? this; var appended = destination.Append (options, request, cancellationToken); Store (new[] { uid }, AddDeletedFlag, cancellationToken); if ((Engine.Capabilities & ImapCapabilities.UidPlus) != 0) Expunge (new[] { uid }, cancellationToken); return appended; } var ic = QueueReplaceCommand (options, uid, request, cancellationToken); Engine.Run (ic); return ProcessReplaceResponse (ic); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The UID of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is invalid. /// -or- /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task ReplaceAsync (FormatOptions options, UniqueId uid, IReplaceRequest request, CancellationToken cancellationToken = default) { ValidateArguments (options, uid, request); if ((Engine.Capabilities & ImapCapabilities.Replace) == 0) { var destination = request.Destination as ImapFolder ?? this; var appended = await destination.AppendAsync (options, request, cancellationToken).ConfigureAwait (false); await StoreAsync (new[] { uid }, AddDeletedFlag, cancellationToken).ConfigureAwait (false); if ((Engine.Capabilities & ImapCapabilities.UidPlus) != 0) await ExpungeAsync (new[] { uid }, cancellationToken).ConfigureAwait (false); return appended; } var ic = QueueReplaceCommand (options, uid, request, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessReplaceResponse (ic); } ImapCommand QueueReplaceCommand (FormatOptions options, int index, IReplaceRequest request, CancellationToken cancellationToken) { var format = CreateAppendOptions (options); int numKeywords = request.Keywords != null ? request.Keywords.Count : 0; var builder = new StringBuilder ($"REPLACE %d %F "); var list = new List { index + 1, request.Destination ?? this }; if ((request.Flags & SettableFlags) != 0) { ImapUtils.FormatFlagsList (builder, request.Flags, numKeywords); builder.Append (' '); } if (request.Keywords != null) { foreach (var keyword in request.Keywords) list.Add (keyword); } if (request.InternalDate.HasValue) { builder.Append ('"'); builder.Append (ImapUtils.FormatInternalDate (request.InternalDate.Value)); builder.Append ("\" "); } if (request.Annotations != null && request.Annotations.Count > 0) { ImapUtils.FormatAnnotations (builder, request.Annotations, list, false); if (builder[builder.Length - 1] != ' ') builder.Append (' '); } builder.Append ("%L\r\n"); list.Add (request.Message); var command = builder.ToString (); var args = list.ToArray (); var ic = new ImapCommand (Engine, cancellationToken, null, format, command, args) { Progress = request.TransferProgress }; Engine.QueueCommand (ic); return ic; } void ValidateArguments (FormatOptions options, int index, IReplaceRequest request) { if (options == null) throw new ArgumentNullException (nameof (options)); if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (request == null) throw new ArgumentNullException (nameof (request)); if (request.Destination != null && !(request.Destination is ImapFolder target && target.Engine == Engine)) throw new ArgumentException ("The destination folder does not belong to this ImapClient.", nameof (request)); if (request.Annotations != null && request.Annotations.Count > 0 && (Engine.Capabilities & ImapCapabilities.Annotate) == 0) throw new NotSupportedException ("The IMAP server does not support annotations."); CheckState (true, true); } /// /// Replace a message in the folder. /// /// /// Replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override UniqueId? Replace (FormatOptions options, int index, IReplaceRequest request, CancellationToken cancellationToken = default) { ValidateArguments (options, index, request); if ((Engine.Capabilities & ImapCapabilities.Replace) == 0) { var destination = request.Destination as ImapFolder ?? this; var uid = destination.Append (options, request, cancellationToken); Store (new[] { index }, AddDeletedFlag, cancellationToken); return uid; } var ic = QueueReplaceCommand (options, index, request, cancellationToken); Engine.Run (ic); return ProcessReplaceResponse (ic); } /// /// Asynchronously replace a message in the folder. /// /// /// Asynchronously replaces a message in the folder and returns the UniqueId assigned to the new message. /// /// The UID of the new message, if available; otherwise, . /// The formatting options. /// The index of the message to be replaced. /// The replace request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is out of range. /// /// /// The destination folder does not belong to this . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// Internationalized formatting was requested but has not been enabled. /// /// /// The does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task ReplaceAsync (FormatOptions options, int index, IReplaceRequest request, CancellationToken cancellationToken = default) { ValidateArguments (options, index, request); if ((Engine.Capabilities & ImapCapabilities.Replace) == 0) { var destination = request.Destination as ImapFolder ?? this; var uid = await destination.AppendAsync (options, request, cancellationToken).ConfigureAwait (false); await StoreAsync (new[] { index }, AddDeletedFlag, cancellationToken).ConfigureAwait (false); return uid; } var ic = QueueReplaceCommand (options, index, request, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessReplaceResponse (ic); } ImapCommand QueueGetIndexesCommand (IList uids, CancellationToken cancellationToken) { var command = string.Format ("SEARCH UID {0}\r\n", UniqueIdSet.ToString (uids)); var ic = new ImapCommand (Engine, cancellationToken, this, command); if ((Engine.Capabilities & ImapCapabilities.ESearch) != 0) ic.RegisterUntaggedHandler ("ESEARCH", UntaggedESearchHandler); ic.RegisterUntaggedHandler ("SEARCH", UntaggedSearchHandler); ic.UserData = new SearchResults (SortOrder.Ascending); Engine.QueueCommand (ic); return ic; } IList ProcessGetIndexesResponse (ImapCommand ic) { var results = ProcessSearchResponse (ic); var indexes = new int[results.UniqueIds.Count]; for (int i = 0; i < indexes.Length; i++) indexes[i] = (int) results.UniqueIds[i].Id - 1; return indexes; } IList GetIndexes (IList uids, CancellationToken cancellationToken) { var ic = QueueGetIndexesCommand (uids, cancellationToken); Engine.Run (ic); return ProcessGetIndexesResponse (ic); } async Task> GetIndexesAsync (IList uids, CancellationToken cancellationToken) { var ic = QueueGetIndexesCommand (uids, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetIndexesResponse (ic); } void ValidateArguments (IList uids, IMailFolder destination) { if (uids == null) throw new ArgumentNullException (nameof (uids)); CheckValidDestination (destination); } static void GetCopiedUids (ImapCommand ic, ref UniqueIdSet? src, ref UniqueIdSet? dest) { var rc = ic.GetResponseCode (ImapResponseCodeType.CopyUid); if (rc is CopyUidResponseCode copy && copy.SrcUidSet != null && copy.DestUidSet != null) { if (dest == null) { dest = copy.DestUidSet; src = copy.SrcUidSet; } else { dest.AddRange (copy.DestUidSet); src!.AddRange (copy.SrcUidSet); } } } void ProcessCopyToResponse (ImapCommand ic, IMailFolder destination, ref UniqueIdSet? src, ref UniqueIdSet? dest) { ProcessCopyToResponse (ic, destination); GetCopiedUids (ic, ref src, ref dest); } /// /// Copy the specified messages to the destination folder. /// /// /// Copies the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// does not exist. /// /// /// The is not currently open. /// /// /// The IMAP server does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override UniqueIdMap CopyTo (IList uids, IMailFolder destination, CancellationToken cancellationToken = default) { ValidateArguments (uids, destination); CheckState (true, false); if (uids.Count == 0) return UniqueIdMap.Empty; if ((Engine.Capabilities & ImapCapabilities.UidPlus) == 0) { var indexes = GetIndexes (uids, cancellationToken); CopyTo (indexes, destination, cancellationToken); return UniqueIdMap.Empty; } UniqueIdSet? dest = null; UniqueIdSet? src = null; foreach (var ic in Engine.QueueCommands (cancellationToken, this, "UID COPY %s %F\r\n", uids, destination)) { Engine.Run (ic); ProcessCopyToResponse (ic, destination, ref src, ref dest); } if (src == null || dest == null) return UniqueIdMap.Empty; return new UniqueIdMap (src, dest); } /// /// Asynchronously copy the specified messages to the destination folder. /// /// /// Copies the specified messages to the destination folder. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// does not exist. /// /// /// The is not currently open. /// /// /// The IMAP server does not support the UIDPLUS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task CopyToAsync (IList uids, IMailFolder destination, CancellationToken cancellationToken = default) { ValidateArguments (uids, destination); CheckState (true, false); if (uids.Count == 0) return UniqueIdMap.Empty; if ((Engine.Capabilities & ImapCapabilities.UidPlus) == 0) { var indexes = await GetIndexesAsync (uids, cancellationToken).ConfigureAwait (false); await CopyToAsync (indexes, destination, cancellationToken).ConfigureAwait (false); return UniqueIdMap.Empty; } UniqueIdSet? dest = null; UniqueIdSet? src = null; foreach (var ic in Engine.QueueCommands (cancellationToken, this, "UID COPY %s %F\r\n", uids, destination)) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessCopyToResponse (ic, destination, ref src, ref dest); } if (src == null || dest == null) return UniqueIdMap.Empty; return new UniqueIdMap (src, dest); } void ProcessMoveToResponse (ImapCommand ic, IMailFolder destination, ref UniqueIdSet? src, ref UniqueIdSet? dest) { ProcessMoveToResponse (ic, destination); GetCopiedUids (ic, ref src, ref dest); } /// /// Move the specified messages to the destination folder. /// /// /// Moves the specified messages to the destination folder. /// If the IMAP server supports the MOVE extension (check the /// property for the flag), then this operation will be atomic. /// Otherwise, MailKit implements this by first copying the messages to the destination folder, then /// marking them for deletion in the originating folder, and finally expunging them (see /// for more information about how a /// subset of messages are expunged). Since the server could disconnect at any point between those 3 /// (or more) commands, it is advisable for clients to implement their own logic for moving messages when /// the IMAP server does not support the MOVE command in order to better handle spontaneous server /// disconnects and other error conditions. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override UniqueIdMap MoveTo (IList uids, IMailFolder destination, CancellationToken cancellationToken = default) { if ((Engine.Capabilities & ImapCapabilities.Move) == 0) { var copied = CopyTo (uids, destination, cancellationToken); Store (uids, AddDeletedFlag, cancellationToken); Expunge (uids, cancellationToken); return copied; } if ((Engine.Capabilities & ImapCapabilities.UidPlus) == 0) { var indexes = GetIndexes (uids, cancellationToken); MoveTo (indexes, destination, cancellationToken); return UniqueIdMap.Empty; } ValidateArguments (uids, destination); CheckState (true, true); if (uids.Count == 0) return UniqueIdMap.Empty; UniqueIdSet? dest = null; UniqueIdSet? src = null; foreach (var ic in Engine.QueueCommands (cancellationToken, this, "UID MOVE %s %F\r\n", uids, destination)) { Engine.Run (ic); ProcessMoveToResponse (ic, destination, ref src, ref dest); } if (dest == null) return UniqueIdMap.Empty; return new UniqueIdMap (src!, dest); } /// /// Asynchronously move the specified messages to the destination folder. /// /// /// Moves the specified messages to the destination folder. /// If the IMAP server supports the MOVE extension (check the /// property for the flag), then this operation will be atomic. /// Otherwise, MailKit implements this by first copying the messages to the destination folder, then /// marking them for deletion in the originating folder, and finally expunging them (see /// for more information about how a /// subset of messages are expunged). Since the server could disconnect at any point between those 3 /// (or more) commands, it is advisable for clients to implement their own logic for moving messages when /// the IMAP server does not support the MOVE command in order to better handle spontaneous server /// disconnects and other error conditions. /// /// The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping. /// The UIDs of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task MoveToAsync (IList uids, IMailFolder destination, CancellationToken cancellationToken = default) { if ((Engine.Capabilities & ImapCapabilities.Move) == 0) { var copied = await CopyToAsync (uids, destination, cancellationToken).ConfigureAwait (false); await StoreAsync (uids, AddDeletedFlag, cancellationToken).ConfigureAwait (false); await ExpungeAsync (uids, cancellationToken).ConfigureAwait (false); return copied; } if ((Engine.Capabilities & ImapCapabilities.UidPlus) == 0) { var indexes = await GetIndexesAsync (uids, cancellationToken).ConfigureAwait (false); await MoveToAsync (indexes, destination, cancellationToken).ConfigureAwait (false); return UniqueIdMap.Empty; } ValidateArguments (uids, destination); CheckState (true, true); if (uids.Count == 0) return UniqueIdMap.Empty; UniqueIdSet? dest = null; UniqueIdSet? src = null; foreach (var ic in Engine.QueueCommands (cancellationToken, this, "UID MOVE %s %F\r\n", uids, destination)) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessMoveToResponse (ic, destination, ref src, ref dest); } if (dest == null) return UniqueIdMap.Empty; return new UniqueIdMap (src!, dest); } void ValidateArguments (IList indexes, IMailFolder destination) { if (indexes == null) throw new ArgumentNullException (nameof (indexes)); CheckValidDestination (destination); } ImapCommand? QueueCopyToCommand (IList indexes, IMailFolder destination, CancellationToken cancellationToken) { ValidateArguments (indexes, destination); CheckState (true, false); CheckAllowIndexes (); if (indexes.Count == 0) return null; var command = new StringBuilder ("COPY "); ImapUtils.FormatIndexSet (Engine, command, indexes); command.Append (" %F\r\n"); return Engine.QueueCommand (cancellationToken, this, command.ToString (), destination); } void ProcessCopyToResponse (ImapCommand ic, IMailFolder destination) { ProcessResponseCodes (ic, destination); ic.ThrowIfNotOk ("COPY"); } /// /// Copy the specified messages to the destination folder. /// /// /// Copies the specified messages to the destination folder. /// /// The indexes of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// does not exist. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void CopyTo (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default) { var ic = QueueCopyToCommand (indexes, destination, cancellationToken); if (ic == null) return; Engine.Run (ic); ProcessCopyToResponse (ic, destination); } /// /// Asynchronously copy the specified messages to the destination folder. /// /// /// Copies the specified messages to the destination folder. /// /// An awaitable task. /// The indexes of the messages to copy. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// does not exist. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task CopyToAsync (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default) { var ic = QueueCopyToCommand (indexes, destination, cancellationToken); if (ic == null) return; await Engine.RunAsync (ic).ConfigureAwait (false); ProcessCopyToResponse (ic, destination); } ImapCommand? QueueMoveToCommand (IList indexes, IMailFolder destination, CancellationToken cancellationToken) { ValidateArguments (indexes, destination); CheckState (true, true); CheckAllowIndexes (); if (indexes.Count == 0) return null; var command = new StringBuilder ("MOVE "); ImapUtils.FormatIndexSet (Engine, command, indexes); command.Append (" %F\r\n"); return Engine.QueueCommand (cancellationToken, this, command.ToString (), destination); } void ProcessMoveToResponse (ImapCommand ic, IMailFolder destination) { ProcessResponseCodes (ic, destination); ic.ThrowIfNotOk ("MOVE"); } /// /// Move the specified messages to the destination folder. /// /// /// If the IMAP server supports the MOVE command, then the MOVE command will be used. Otherwise, /// the messages will first be copied to the destination folder and then marked as \Deleted in the /// originating folder. Since the server could disconnect at any point between those 2 operations, it /// may be advisable to implement your own logic for moving messages in this case in order to better /// handle spontaneous server disconnects and other error conditions. /// /// The indexes of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void MoveTo (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default) { if ((Engine.Capabilities & ImapCapabilities.Move) == 0) { CopyTo (indexes, destination, cancellationToken); Store (indexes, AddDeletedFlag, cancellationToken); return; } var ic = QueueMoveToCommand (indexes, destination, cancellationToken); if (ic == null) return; Engine.Run (ic); ProcessMoveToResponse (ic, destination); } /// /// Asynchronously move the specified messages to the destination folder. /// /// /// If the IMAP server supports the MOVE command, then the MOVE command will be used. Otherwise, /// the messages will first be copied to the destination folder and then marked as \Deleted in the /// originating folder. Since the server could disconnect at any point between those 2 operations, it /// may be advisable to implement your own logic for moving messages in this case in order to better /// handle spontaneous server disconnects and other error conditions. /// /// An awaitable task. /// The indexes of the messages to move. /// The destination folder. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// -or- /// The destination folder does not belong to the . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// does not exist. /// /// /// The is not currently open in read-write mode. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task MoveToAsync (IList indexes, IMailFolder destination, CancellationToken cancellationToken = default) { if ((Engine.Capabilities & ImapCapabilities.Move) == 0) { await CopyToAsync (indexes, destination, cancellationToken).ConfigureAwait (false); await StoreAsync (indexes, AddDeletedFlag, cancellationToken).ConfigureAwait (false); return; } var ic = QueueMoveToCommand (indexes, destination, cancellationToken); if (ic == null) return; await Engine.RunAsync (ic).ConfigureAwait (false); ProcessMoveToResponse (ic, destination); } #region IEnumerable implementation /// /// Get an enumerator for the messages in the folder. /// /// /// Gets an enumerator for the messages in the folder. /// /// The enumerator. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// public override IEnumerator GetEnumerator () { CheckState (true, false); for (int i = 0; i < Count; i++) yield return GetMessage (i, CancellationToken.None); yield break; } #endregion #region Untagged response handlers called by ImapEngine internal void OnExists (int count) { countChanged = false; Count = count; OnCountChanged (); } internal void OnExpunge (int index) { // Note: It is not required for the IMAP server to send an explicit untagged `* # EXISTS` response if it sends // untagged `* # EXPUNGE` responses, so we queue a CountChanged event (that is only emitted if the server does // NOT send the `* # EXISTS` response). countChanged = true; Count--; OnMessageExpunged (new MessageEventArgs (index)); } internal void FlushQueuedEvents () { if (countChanged) { countChanged = false; OnCountChanged (); } } void OnFetchAsyncCompleted (MessageSummary message) { int index = message.Index; UniqueId? uid = null; if ((message.Fields & MessageSummaryItems.UniqueId) != 0) uid = message.UniqueId; if (message.Flags.HasValue) { var args = new MessageFlagsChangedEventArgs (index, message.Flags.Value, (HashSet) message.Keywords) { ModSeq = message.ModSeq, UniqueId = uid }; OnMessageFlagsChanged (args); } if (message.GMailLabels != null) { var args = new MessageLabelsChangedEventArgs (index, message.GMailLabels) { ModSeq = message.ModSeq, UniqueId = uid }; OnMessageLabelsChanged (args); } if (message.Annotations != null) { var args = new AnnotationsChangedEventArgs (index, message.Annotations) { ModSeq = message.ModSeq, UniqueId = uid }; OnAnnotationsChanged (args); } if (message.ModSeq.HasValue) { var args = new ModSeqChangedEventArgs (index, message.ModSeq.Value) { UniqueId = uid }; OnModSeqChanged (args); } if (message.Fields != MessageSummaryItems.None) OnMessageSummaryFetched (message); } internal void OnUntaggedFetchResponse (ImapEngine engine, int index, CancellationToken cancellationToken) { var message = new MessageSummary (this, index); ParseSummaryItems (engine, message, OnFetchAsyncCompleted, cancellationToken); } internal Task OnUntaggedFetchResponseAsync (ImapEngine engine, int index, CancellationToken cancellationToken) { var message = new MessageSummary (this, index); return ParseSummaryItemsAsync (engine, message, OnFetchAsyncCompleted, cancellationToken); } internal void OnRecent (int count) { if (Recent == count) return; Recent = count; OnRecentChanged (); } void OnVanished (bool earlier, ImapToken token) { var vanished = ImapEngine.ParseUidSet (token, UidValidity, out _, out _, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "VANISHED", token); OnMessagesVanished (new MessagesVanishedEventArgs (vanished, earlier)); if (!earlier) { Count -= vanished.Count; OnCountChanged (); } } internal void OnVanished (ImapEngine engine, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); bool earlier = false; if (token.Type == ImapTokenType.OpenParen) { do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "VANISHED", token); var atom = (string) token.Value; if (atom.Equals ("EARLIER", StringComparison.OrdinalIgnoreCase)) earlier = true; } while (true); token = engine.ReadToken (cancellationToken); } OnVanished (earlier, token); } internal async Task OnVanishedAsync (ImapEngine engine, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); bool earlier = false; if (token.Type == ImapTokenType.OpenParen) { do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "VANISHED", token); var atom = (string) token.Value; if (atom.Equals ("EARLIER", StringComparison.OrdinalIgnoreCase)) earlier = true; } while (true); token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); } OnVanished (earlier, token); } internal void UpdateAttributes (FolderAttributes attrs) { var unsubscribed = false; var subscribed = false; if ((attrs & FolderAttributes.Subscribed) == 0) unsubscribed = (Attributes & FolderAttributes.Subscribed) != 0; else subscribed = (Attributes & FolderAttributes.Subscribed) == 0; var deleted = ((attrs & FolderAttributes.NonExistent) != 0) && (Attributes & FolderAttributes.NonExistent) == 0; Attributes = attrs; if (unsubscribed) OnUnsubscribed (); if (subscribed) OnSubscribed (); if (deleted) OnDeleted (); } internal void UpdateAcceptedFlags (MessageFlags flags, IReadOnlySetOfStrings keywords) { AcceptedKeywords = keywords; AcceptedFlags = flags; } internal void UnsetAcceptedFlags () { ((HashSet) AcceptedKeywords).Clear (); AcceptedFlags = MessageFlags.None; } internal void UnsetPermanentFlags () { ((HashSet) PermanentKeywords).Clear (); PermanentFlags = MessageFlags.None; } internal void UpdateIsNamespace (bool value) { IsNamespace = value; } internal void UpdateUnread (int count) { if (Unread == count) return; Unread = count; OnUnreadChanged (); } internal void UpdateUidNext (UniqueId uid) { if (UidNext.HasValue && UidNext.Value == uid) return; UidNext = uid; OnUidNextChanged (); } internal void UpdateAppendLimit (uint? limit) { AppendLimit = limit; } internal void UpdateSize (ulong? size) { if (Size == size) return; Size = size; OnSizeChanged (); } internal void UpdateId (string id) { if (Id == id) return; Id = id; OnIdChanged (); } internal void UpdateHighestModSeq (ulong modseq) { if (HighestModSeq == modseq) return; HighestModSeq = modseq; OnHighestModSeqChanged (); } internal void UpdateUidValidity (uint validity) { if (UidValidity == validity) return; UidValidity = validity; OnUidValidityChanged (); } internal void OnRenamed (string encodedName, char delim, FolderAttributes attrs) { var oldFullName = FullName; EncodedName = encodedName; FullName = Engine.DecodeMailboxName (encodedName); Name = GetBaseName (FullName, delim); DirectorySeparator = delim; Attributes = attrs; OnRenamed (oldFullName, FullName); } #endregion #endregion } } ================================================ FILE: MailKit/Net/Imap/ImapFolderAnnotations.cs ================================================ // // ImapFolderAnnotations.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Threading; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace MailKit.Net.Imap { public partial class ImapFolder { IEnumerable QueueStoreCommands (IList uids, ulong? modseq, IList annotations, CancellationToken cancellationToken) { if (uids == null) throw new ArgumentNullException (nameof (uids)); if (modseq.HasValue && !supportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); if (annotations == null) throw new ArgumentNullException (nameof (annotations)); CheckState (true, true); if (AnnotationAccess == AnnotationAccess.None) throw new NotSupportedException ("The ImapFolder does not support annotations."); if (uids.Count == 0 || annotations.Count == 0) return Array.Empty (); var builder = new StringBuilder ("UID STORE %s "); var values = new List (); if (modseq.HasValue) { builder.Append ("(UNCHANGEDSINCE "); builder.Append (modseq.Value.ToString (CultureInfo.InvariantCulture)); builder.Append (") "); } ImapUtils.FormatAnnotations (builder, annotations, values, true); builder.Append ("\r\n"); var command = builder.ToString (); var args = values.ToArray (); return Engine.QueueCommands (cancellationToken, this, command, uids, args); } void ProcessStoreAnnotationsResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) { // TODO: Do something with the AnnotateResponseCode if it exists?? throw ImapCommandException.Create ("STORE", ic); } } /// /// Store the annotations for the specified messages. /// /// /// Stores the annotations for the specified messages. /// /// The UIDs of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Store (IList uids, IList annotations, CancellationToken cancellationToken = default) { foreach (var ic in QueueStoreCommands (uids, null, annotations, cancellationToken)) { Engine.Run (ic); ProcessStoreAnnotationsResponse (ic); } } /// /// Asynchronously store the annotations for the specified messages. /// /// /// Asynchronously stores the annotations for the specified messages. /// /// An asynchronous task context. /// The UIDs of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task StoreAsync (IList uids, IList annotations, CancellationToken cancellationToken = default) { foreach (var ic in QueueStoreCommands (uids, null, annotations, cancellationToken)) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStoreAnnotationsResponse (ic); } } /// /// Store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The UIDs of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Store (IList uids, ulong modseq, IList annotations, CancellationToken cancellationToken = default) { UniqueIdSet? unmodified = null; foreach (var ic in QueueStoreCommands (uids, modseq, annotations, cancellationToken)) { Engine.Run (ic); ProcessStoreAnnotationsResponse (ic); ProcessUnmodified (ic, ref unmodified, modseq); } if (unmodified == null) return Array.Empty (); return unmodified; } /// /// Asynchronously store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The unique IDs of the messages that were not updated. /// The UIDs of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> StoreAsync (IList uids, ulong modseq, IList annotations, CancellationToken cancellationToken = default) { UniqueIdSet? unmodified = null; foreach (var ic in QueueStoreCommands (uids, modseq, annotations, cancellationToken)) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStoreAnnotationsResponse (ic); ProcessUnmodified (ic, ref unmodified, modseq); } if (unmodified == null) return Array.Empty (); return unmodified; } bool TryQueueStoreCommand (IList indexes, ulong? modseq, IList annotations, CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic) { if (indexes == null) throw new ArgumentNullException (nameof (indexes)); if (modseq.HasValue && !supportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); if (annotations == null) throw new ArgumentNullException (nameof (annotations)); CheckState (true, true); if (AnnotationAccess == AnnotationAccess.None) throw new NotSupportedException ("The ImapFolder does not support annotations."); if (indexes.Count == 0 || annotations.Count == 0) { ic = null; return false; } var command = new StringBuilder ("STORE "); var args = new List (); ImapUtils.FormatIndexSet (Engine, command, indexes); command.Append (' '); if (modseq.HasValue) { command.Append ("(UNCHANGEDSINCE "); command.Append (modseq.Value.ToString (CultureInfo.InvariantCulture)); command.Append (") "); } ImapUtils.FormatAnnotations (command, annotations, args, true); command.Append ("\r\n"); ic = Engine.QueueCommand (cancellationToken, this, command.ToString (), args.ToArray ()); return true; } /// /// Store the annotations for the specified messages. /// /// /// Stores the annotations for the specified messages. /// /// The indexes of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override void Store (IList indexes, IList annotations, CancellationToken cancellationToken = default) { if (!TryQueueStoreCommand (indexes, null, annotations, cancellationToken, out var ic)) return; Engine.Run (ic); ProcessStoreAnnotationsResponse (ic); } /// /// Asynchronously store the annotations for the specified messages. /// /// /// Asynchronously stores the annotations for the specified messages. /// /// An asynchronous task context. /// The indexes of the messages. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task StoreAsync (IList indexes, IList annotations, CancellationToken cancellationToken = default) { if (!TryQueueStoreCommand (indexes, null, annotations, cancellationToken, out var ic)) return; await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStoreAnnotationsResponse (ic); } /// /// Store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Stores the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// The indexes of the messages that were not updated. /// The indexes of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Store (IList indexes, ulong modseq, IList annotations, CancellationToken cancellationToken = default) { if (!TryQueueStoreCommand (indexes, modseq, annotations, cancellationToken, out var ic)) return Array.Empty (); Engine.Run (ic); ProcessStoreAnnotationsResponse (ic); return GetUnmodified (ic, modseq); } /// /// Asynchronously store the annotations for the specified messages only if their mod-sequence value is less than the specified value. /// /// /// Asynchronously stores the annotations for the specified messages only if their mod-sequence value is less than the specified value.s /// /// The indexes of the messages that were not updated. /// The indexes of the messages. /// The mod-sequence value. /// The annotations to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// Cannot store annotations without any properties defined. /// /// /// The does not support annotations. /// -or- /// The does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> StoreAsync (IList indexes, ulong modseq, IList annotations, CancellationToken cancellationToken = default) { if (!TryQueueStoreCommand (indexes, modseq, annotations, cancellationToken, out var ic)) return Array.Empty (); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStoreAnnotationsResponse (ic); return GetUnmodified (ic, modseq); } } } ================================================ FILE: MailKit/Net/Imap/ImapFolderConstructorArgs.cs ================================================ // // ImapFolderInfo.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Net.Imap { /// /// Constructor arguments for . /// /// /// Constructor arguments for . /// The are meant only to allow subclassing of /// by overriding the method. /// public sealed class ImapFolderConstructorArgs { internal readonly string EncodedName; internal readonly ImapEngine Engine; /// /// Initializes a new instance of the class. /// /// The IMAP command engine. /// The encoded name. /// The attributes. /// The directory separator. internal ImapFolderConstructorArgs (ImapEngine engine, string encodedName, FolderAttributes attributes, char delim) { FullName = engine.DecodeMailboxName (encodedName); DirectorySeparator = delim; EncodedName = encodedName; Attributes = attributes; Engine = engine; } /// /// Get the folder attributes. /// /// /// Gets the folder attributes. /// /// The folder attributes. public FolderAttributes Attributes { get; private set; } /// /// Get the directory separator. /// /// /// Gets the directory separator. /// /// The directory separator. public char DirectorySeparator { get; private set; } /// /// Get the full name of the folder. /// /// /// This is the equivalent of the full path of a file on a file system. /// /// The full name of the folder. public string FullName { get; private set; } /// /// Get the name of the folder. /// /// /// This is the equivalent of the file name of a file on the file system. /// /// The name of the folder. [Obsolete] public string Name { get { return MailFolder.GetBaseName (FullName, DirectorySeparator); } } } } ================================================ FILE: MailKit/Net/Imap/ImapFolderFetch.cs ================================================ // // ImapFolderFetch.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Text; using System.Buffers; using System.Threading; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using MimeKit; using MimeKit.IO; using MimeKit.Text; using MimeKit.Utils; using MailKit.Search; namespace MailKit.Net.Imap { public partial class ImapFolder { const int PreviewHtmlLength = 16 * 1024; const int PreviewTextLength = 512; const int BufferSize = 4096; class FetchSummaryContext { public readonly List Messages; public FetchSummaryContext (int capacity) { Messages = new List (capacity); } int BinarySearch (int index, bool insert) { int min = 0, max = Messages.Count; if (max == 0) return insert ? 0 : -1; if (insert && index > Messages[max - 1].Index) return max; do { int i = min + ((max - min) / 2); if (index == Messages[i].Index) return i; if (index > Messages[i].Index) { min = i + 1; } else { max = i; } } while (min < max); return insert ? min : -1; } public void Add (int index, MessageSummary message) { int i = BinarySearch (index, true); if (i < Messages.Count) Messages.Insert (i, message); else Messages.Add (message); } public bool TryGetValue (int index, [NotNullWhen (true)] out MessageSummary? message) { int i; if ((i = BinarySearch (index, false)) == -1) { message = null; return false; } message = (MessageSummary) Messages[i]; return true; } public void OnMessageExpunged (object? sender, MessageEventArgs args) { int index = BinarySearch (args.Index, false); if (index == -1) return; Messages.RemoveAt (index); for (int i = index; i < Messages.Count; i++) { var message = (MessageSummary) Messages[i]; message.Index--; } } } static void ReadLiteralData (ImapEngine engine, CancellationToken cancellationToken) { var buf = ArrayPool.Shared.Rent (BufferSize); int nread; try { do { nread = engine.Stream!.Read (buf, 0, BufferSize, cancellationToken); } while (nread > 0); } finally { ArrayPool.Shared.Return (buf); } } static async Task ReadLiteralDataAsync (ImapEngine engine, CancellationToken cancellationToken) { var buf = ArrayPool.Shared.Rent (BufferSize); int nread; try { do { nread = await engine.Stream!.ReadAsync (buf, 0, BufferSize, cancellationToken).ConfigureAwait (false); } while (nread > 0); } finally { ArrayPool.Shared.Return (buf); } } static void SkipParenthesizedList (ImapEngine engine, CancellationToken cancellationToken) { int depth = 1; do { var token = engine.PeekToken (cancellationToken); if (token.Type == ImapTokenType.Eoln) return; // token is safe to read, so pop it off the queue token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) { depth--; } else if (token.Type == ImapTokenType.OpenParen) { depth++; } else if (token.Type == ImapTokenType.Literal) { // consume the literal string ReadLiteralData (engine, cancellationToken); } } while (depth > 0); } static async Task SkipParenthesizedListAsync (ImapEngine engine, CancellationToken cancellationToken) { int depth = 1; do { var token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Eoln) return; // token is safe to read, so pop it off the queue token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) { depth--; } else if (token.Type == ImapTokenType.OpenParen) { depth++; } else if (token.Type == ImapTokenType.Literal) { // consume the literal string await ReadLiteralDataAsync (engine, cancellationToken).ConfigureAwait (false); } } while (depth > 0); } static DateTimeOffset? ReadDateTimeOffsetToken (ImapEngine engine, string atom, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); switch (token.Type) { case ImapTokenType.QString: case ImapTokenType.Atom: return ImapUtils.ParseInternalDate ((string) token.Value); case ImapTokenType.Nil: return null; default: throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } } static async Task ReadDateTimeOffsetTokenAsync (ImapEngine engine, string atom, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); switch (token.Type) { case ImapTokenType.QString: case ImapTokenType.Atom: return ImapUtils.ParseInternalDate ((string) token.Value); case ImapTokenType.Nil: return null; default: throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } } delegate void FetchSummaryItemsCompletedCallback (MessageSummary message); void ParseSummaryItems (ImapEngine engine, MessageSummary message, FetchSummaryItemsCompletedCallback completed, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen || token.Type == ImapTokenType.Eoln) break; bool parenthesized = false; if (engine.QuirksMode == ImapQuirksMode.Domino && token.Type == ImapTokenType.OpenParen) { // Note: Lotus Domino IMAP will (sometimes?) encapsulate the `ENVELOPE` segment of the // response within an extra set of parenthesis. // // See https://github.com/jstedfast/MailKit/issues/943 for details. token = engine.ReadToken (cancellationToken); parenthesized = true; } ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); var atom = (string) token.Value; string format; ulong value64; uint value; int idx; if (atom.Equals ("INTERNALDATE", StringComparison.OrdinalIgnoreCase)) { message.InternalDate = ReadDateTimeOffsetToken (engine, atom, cancellationToken); message.Fields |= MessageSummaryItems.InternalDate; } else if (atom.Equals ("SAVEDATE", StringComparison.OrdinalIgnoreCase)) { message.SaveDate = ReadDateTimeOffsetToken (engine, atom, cancellationToken); message.Fields |= MessageSummaryItems.SaveDate; } else if (atom.Equals ("RFC822.SIZE", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (cancellationToken); message.Size = ImapEngine.ParseNumber (token, false, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.Size; } else if (atom.Equals ("BODYSTRUCTURE", StringComparison.OrdinalIgnoreCase)) { format = string.Format (ImapEngine.GenericItemSyntaxErrorFormat, "BODYSTRUCTURE", "{0}"); message.Body = ImapUtils.ParseBody (engine, format, string.Empty, cancellationToken); message.Fields |= MessageSummaryItems.BodyStructure; } else if (atom.Equals ("BODY", StringComparison.OrdinalIgnoreCase)) { token = engine.PeekToken (cancellationToken); format = ImapEngine.FetchBodySyntaxErrorFormat; if (token.Type == ImapTokenType.OpenBracket) { var referencesField = false; var headerFields = false; // consume the '[' token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenBracket, format, token); // References and/or other headers were requested... do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseBracket) break; if (token.Type == ImapTokenType.OpenParen) { do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; // the header field names will generally be atoms or qstrings but may also be literals engine.UngetToken (token); var field = ImapUtils.ReadStringToken (engine, format, cancellationToken); if (headerFields && !referencesField && field.Equals ("REFERENCES", StringComparison.OrdinalIgnoreCase)) referencesField = true; } while (true); } else { ImapEngine.AssertToken (token, ImapTokenType.Atom, format, token); atom = (string) token.Value; if (atom.Equals ("HEADER", StringComparison.OrdinalIgnoreCase)) { // if we're fetching *all* headers, then it will include the References header (if it exists) referencesField = true; headerFields = false; } else { headerFields = atom.Equals ("HEADER.FIELDS", StringComparison.OrdinalIgnoreCase); } } } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseBracket, format, token); token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.Literal, format, token); try { message.Headers = engine.ParseHeaders (engine.Stream!, cancellationToken); } catch (FormatException) { message.Headers = new HeaderList (); } // consume any remaining literal data... (typically extra blank lines) ReadLiteralData (engine, cancellationToken); message.References = new MessageIdList (); if ((idx = message.Headers.IndexOf (HeaderId.References)) != -1) { var references = message.Headers[idx]; var rawValue = references.RawValue; foreach (var msgid in MimeUtils.EnumerateReferences (rawValue, 0, rawValue.Length)) message.References.Add (msgid); } message.Fields |= MessageSummaryItems.Headers; if (referencesField) message.Fields |= MessageSummaryItems.References; } else { message.Body = ImapUtils.ParseBody (engine, format, string.Empty, cancellationToken); message.Fields |= MessageSummaryItems.Body; } } else if (atom.Equals ("ENVELOPE", StringComparison.OrdinalIgnoreCase)) { message.Envelope = ImapUtils.ParseEnvelope (engine, cancellationToken); message.Fields |= MessageSummaryItems.Envelope; } else if (atom.Equals ("FLAGS", StringComparison.OrdinalIgnoreCase)) { message.Flags = ImapUtils.ParseFlagsList (engine, atom, (HashSet) message.Keywords, cancellationToken); message.Fields |= MessageSummaryItems.Flags; } else if (atom.Equals ("MODSEQ", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); // Note: Some IMAP servers (such as Zoho Mail) will return a MODSEQ of -1 in some cases (not sure why). // // If we get an invalid value, just ignore it. // // See https://github.com/jstedfast/MailKit/issues/1686 for details. if (ImapEngine.TryParseNumber64 (token, out value64)) { message.Fields |= MessageSummaryItems.ModSeq; message.ModSeq = value64; if (value64 > HighestModSeq) UpdateHighestModSeq (value64); } token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else if (atom.Equals ("UID", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (cancellationToken); value = ImapEngine.ParseNumber (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.UniqueId = new UniqueId (UidValidity, value); message.Fields |= MessageSummaryItems.UniqueId; } else if (atom.Equals ("EMAILID", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.EmailId; message.EmailId = (string) token.Value; token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else if (atom.Equals ("THREADID", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.OpenParen) { token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.ThreadId; message.ThreadId = (string) token.Value; token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else { ImapEngine.AssertToken (token, ImapTokenType.Nil, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.ThreadId; message.ThreadId = null; } } else if (atom.Equals ("X-GM-MSGID", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (cancellationToken); value64 = ImapEngine.ParseNumber64 (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.GMailMessageId; message.GMailMessageId = value64; } else if (atom.Equals ("X-GM-THRID", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (cancellationToken); value64 = ImapEngine.ParseNumber64 (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.GMailThreadId; message.GMailThreadId = value64; } else if (atom.Equals ("X-GM-LABELS", StringComparison.OrdinalIgnoreCase)) { message.GMailLabels = ImapUtils.ParseLabelsList (engine, cancellationToken); message.Fields |= MessageSummaryItems.GMailLabels; } else if (atom.Equals ("ANNOTATION", StringComparison.OrdinalIgnoreCase)) { message.Annotations = ImapUtils.ParseAnnotations (engine, cancellationToken); message.Fields |= MessageSummaryItems.Annotations; } else if (atom.Equals ("PREVIEW", StringComparison.OrdinalIgnoreCase)) { format = string.Format (ImapEngine.GenericItemSyntaxErrorFormat, "PREVIEW", "{0}"); message.PreviewText = ImapUtils.ReadNStringToken (engine, format, false, cancellationToken); message.Fields |= MessageSummaryItems.PreviewText; } else { // Unexpected or unknown token (such as XAOL.SPAM.REASON or XAOL-MSGID). Simply read 1 more token (the argument) and ignore. token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.OpenParen) SkipParenthesizedList (engine, cancellationToken); } if (parenthesized) { // Note: This is the second half of the Lotus Domino IMAP server work-around. token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); } } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); completed (message); } async Task ParseSummaryItemsAsync (ImapEngine engine, MessageSummary message, FetchSummaryItemsCompletedCallback completed, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen || token.Type == ImapTokenType.Eoln) break; bool parenthesized = false; if (engine.QuirksMode == ImapQuirksMode.Domino && token.Type == ImapTokenType.OpenParen) { // Note: Lotus Domino IMAP will (sometimes?) encapsulate the `ENVELOPE` segment of the // response within an extra set of parenthesis. // // See https://github.com/jstedfast/MailKit/issues/943 for details. token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); parenthesized = true; } ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); var atom = (string) token.Value; string format; ulong value64; uint value; int idx; if (atom.Equals ("INTERNALDATE", StringComparison.OrdinalIgnoreCase)) { message.InternalDate = await ReadDateTimeOffsetTokenAsync (engine, atom, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.InternalDate; } else if (atom.Equals ("SAVEDATE", StringComparison.OrdinalIgnoreCase)) { message.SaveDate = await ReadDateTimeOffsetTokenAsync (engine, atom, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.SaveDate; } else if (atom.Equals ("RFC822.SIZE", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); message.Size = ImapEngine.ParseNumber (token, false, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.Size; } else if (atom.Equals ("BODYSTRUCTURE", StringComparison.OrdinalIgnoreCase)) { format = string.Format (ImapEngine.GenericItemSyntaxErrorFormat, "BODYSTRUCTURE", "{0}"); message.Body = await ImapUtils.ParseBodyAsync (engine, format, string.Empty, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.BodyStructure; } else if (atom.Equals ("BODY", StringComparison.OrdinalIgnoreCase)) { token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); format = ImapEngine.FetchBodySyntaxErrorFormat; if (token.Type == ImapTokenType.OpenBracket) { var referencesField = false; var headerFields = false; // consume the '[' token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenBracket, format, token); // References and/or other headers were requested... do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseBracket) break; if (token.Type == ImapTokenType.OpenParen) { do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; // the header field names will generally be atoms or qstrings but may also be literals engine.UngetToken (token); var field = await ImapUtils.ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); if (headerFields && !referencesField && field.Equals ("REFERENCES", StringComparison.OrdinalIgnoreCase)) referencesField = true; } while (true); } else { ImapEngine.AssertToken (token, ImapTokenType.Atom, format, token); atom = (string) token.Value; if (atom.Equals ("HEADER", StringComparison.OrdinalIgnoreCase)) { // if we're fetching *all* headers, then it will include the References header (if it exists) referencesField = true; headerFields = false; } else { headerFields = atom.Equals ("HEADER.FIELDS", StringComparison.OrdinalIgnoreCase); } } } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseBracket, format, token); token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.Literal, format, token); try { message.Headers = await engine.ParseHeadersAsync (engine.Stream!, cancellationToken).ConfigureAwait (false); } catch (FormatException) { message.Headers = new HeaderList (); } // consume any remaining literal data... (typically extra blank lines) await ReadLiteralDataAsync (engine, cancellationToken).ConfigureAwait (false); message.References = new MessageIdList (); if ((idx = message.Headers.IndexOf (HeaderId.References)) != -1) { var references = message.Headers[idx]; var rawValue = references.RawValue; foreach (var msgid in MimeUtils.EnumerateReferences (rawValue, 0, rawValue.Length)) message.References.Add (msgid); } message.Fields |= MessageSummaryItems.Headers; if (referencesField) message.Fields |= MessageSummaryItems.References; } else { message.Body = await ImapUtils.ParseBodyAsync (engine, format, string.Empty, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.Body; } } else if (atom.Equals ("ENVELOPE", StringComparison.OrdinalIgnoreCase)) { message.Envelope = await ImapUtils.ParseEnvelopeAsync (engine, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.Envelope; } else if (atom.Equals ("FLAGS", StringComparison.OrdinalIgnoreCase)) { message.Flags = await ImapUtils.ParseFlagsListAsync (engine, atom, (HashSet) message.Keywords, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.Flags; } else if (atom.Equals ("MODSEQ", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); // Note: Some IMAP servers (such as Zoho Mail) will return a MODSEQ of -1 in some cases (not sure why). // // If we get an invalid value, just ignore it. // // See https://github.com/jstedfast/MailKit/issues/1686 for details. if (ImapEngine.TryParseNumber64 (token, out value64)) { message.Fields |= MessageSummaryItems.ModSeq; message.ModSeq = value64; if (value64 > HighestModSeq) UpdateHighestModSeq (value64); } token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else if (atom.Equals ("UID", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); value = ImapEngine.ParseNumber (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.UniqueId = new UniqueId (UidValidity, value); message.Fields |= MessageSummaryItems.UniqueId; } else if (atom.Equals ("EMAILID", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.EmailId; message.EmailId = (string) token.Value; token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else if (atom.Equals ("THREADID", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenParen) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.ThreadId; message.ThreadId = (string) token.Value; token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else { ImapEngine.AssertToken (token, ImapTokenType.Nil, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.ThreadId; message.ThreadId = null; } } else if (atom.Equals ("X-GM-MSGID", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); value64 = ImapEngine.ParseNumber64 (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.GMailMessageId; message.GMailMessageId = value64; } else if (atom.Equals ("X-GM-THRID", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); value64 = ImapEngine.ParseNumber64 (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); message.Fields |= MessageSummaryItems.GMailThreadId; message.GMailThreadId = value64; } else if (atom.Equals ("X-GM-LABELS", StringComparison.OrdinalIgnoreCase)) { message.GMailLabels = await ImapUtils.ParseLabelsListAsync (engine, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.GMailLabels; } else if (atom.Equals ("ANNOTATION", StringComparison.OrdinalIgnoreCase)) { message.Annotations = await ImapUtils.ParseAnnotationsAsync (engine, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.Annotations; } else if (atom.Equals ("PREVIEW", StringComparison.OrdinalIgnoreCase)) { format = string.Format (ImapEngine.GenericItemSyntaxErrorFormat, "PREVIEW", "{0}"); message.PreviewText = await ImapUtils.ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); message.Fields |= MessageSummaryItems.PreviewText; } else { // Unexpected or unknown token (such as XAOL.SPAM.REASON or XAOL-MSGID). Simply read 1 more token (the argument) and ignore. token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenParen) await SkipParenthesizedListAsync (engine, cancellationToken).ConfigureAwait (false); } if (parenthesized) { // Note: This is the second half of the Lotus Domino IMAP server work-around. token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); } } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); completed (message); } Task UntaggedFetchSummaryItemsHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { var ctx = (FetchSummaryContext) ic.UserData!; if (!ctx.TryGetValue (index, out var message)) { message = new MessageSummary (this, index); ctx.Add (index, message); } if (doAsync) return ParseSummaryItemsAsync (engine, message, OnMessageSummaryFetched, ic.CancellationToken); ParseSummaryItems (engine, message, OnMessageSummaryFetched, ic.CancellationToken); return Task.CompletedTask; } static bool IsEmptyExclude (HeaderSet headers, bool requestReferences) { // return whether or not we've got an empty set of excluded headers or if the user has requested the References header *and* asked us to exclude only the References header. return headers.Exclude && (headers.Count == 0 || (headers.Count == 1 && requestReferences && headers.Contains ("REFERENCES"))); } internal static string FormatSummaryItems (ImapEngine engine, IFetchRequest request, out bool previewText, bool isNotify = false) { var items = request.Items; if ((engine.Capabilities & ImapCapabilities.Preview) == 0 && (items & MessageSummaryItems.PreviewText) != 0) { // if the user wants the preview text, we will also need the UIDs and BODYSTRUCTUREs // so that we can request a preview of the body text in subsequent FETCH requests. items |= MessageSummaryItems.BodyStructure | MessageSummaryItems.UniqueId; items &= ~MessageSummaryItems.PreviewText; previewText = true; } else { previewText = false; } if ((items & MessageSummaryItems.BodyStructure) != 0 && (items & MessageSummaryItems.Body) != 0) { // don't query both the BODY and BODYSTRUCTURE, that's just dumb... items &= ~MessageSummaryItems.Body; } if (engine.QuirksMode != ImapQuirksMode.GMail && !isNotify) { if (items == MessageSummaryItems.All) return "ALL"; if (items == MessageSummaryItems.Full) return "FULL"; if (items == MessageSummaryItems.Fast) return "FAST"; } var tokens = new List (); // now add on any additional summary items... if ((items & MessageSummaryItems.UniqueId) != 0) tokens.Add ("UID"); if ((items & MessageSummaryItems.Flags) != 0) tokens.Add ("FLAGS"); if ((items & MessageSummaryItems.InternalDate) != 0) tokens.Add ("INTERNALDATE"); if ((items & MessageSummaryItems.Size) != 0) tokens.Add ("RFC822.SIZE"); if ((items & MessageSummaryItems.Envelope) != 0) tokens.Add ("ENVELOPE"); if ((items & MessageSummaryItems.BodyStructure) != 0) tokens.Add ("BODYSTRUCTURE"); if ((items & MessageSummaryItems.Body) != 0) tokens.Add ("BODY"); if ((engine.Capabilities & ImapCapabilities.CondStore) != 0) { if ((items & MessageSummaryItems.ModSeq) != 0) tokens.Add ("MODSEQ"); } if ((engine.Capabilities & ImapCapabilities.Annotate) != 0) { if ((items & MessageSummaryItems.Annotations) != 0) tokens.Add ("ANNOTATION (/* (value size))"); } if ((engine.Capabilities & ImapCapabilities.ObjectID) != 0) { if ((items & MessageSummaryItems.EmailId) != 0) tokens.Add ("EMAILID"); if ((items & MessageSummaryItems.ThreadId) != 0) tokens.Add ("THREADID"); } if ((engine.Capabilities & ImapCapabilities.SaveDate) != 0) { if ((items & MessageSummaryItems.SaveDate) != 0) tokens.Add ("SAVEDATE"); } if ((engine.Capabilities & ImapCapabilities.Preview) != 0) { if ((items & MessageSummaryItems.PreviewText) != 0) { #if ENABLE_LAZY_PREVIEW_API if (request.PreviewOptions == PreviewOptions.Lazy) tokens.Add ("PREVIEW (LAZY)"); else tokens.Add ("PREVIEW"); #else tokens.Add ("PREVIEW"); #endif } } if ((engine.Capabilities & ImapCapabilities.GMailExt1) != 0) { // now for the GMail extension items if ((items & MessageSummaryItems.GMailMessageId) != 0) tokens.Add ("X-GM-MSGID"); if ((items & MessageSummaryItems.GMailThreadId) != 0) tokens.Add ("X-GM-THRID"); if ((items & MessageSummaryItems.GMailLabels) != 0) tokens.Add ("X-GM-LABELS"); } if (request.Headers != null) { bool requestReferences = (items & MessageSummaryItems.References) != 0; if (IsEmptyExclude (request.Headers, requestReferences)) { tokens.Add ("BODY.PEEK[HEADER]"); } else if (request.Headers.Exclude) { var headerFields = new StringBuilder ("BODY.PEEK[HEADER.FIELDS.NOT ("); foreach (var header in request.Headers) { if (requestReferences && header.Equals ("REFERENCES", StringComparison.Ordinal)) continue; headerFields.Append (header); headerFields.Append (' '); } headerFields[headerFields.Length - 1] = ')'; headerFields.Append (']'); tokens.Add (headerFields.ToString ()); } else { var headerFields = new StringBuilder ("BODY.PEEK[HEADER.FIELDS ("); foreach (var header in request.Headers) { headerFields.Append (header); headerFields.Append (' '); } if (requestReferences && !request.Headers.Contains ("REFERENCES")) headerFields.Append ("REFERENCES "); headerFields[headerFields.Length - 1] = ')'; headerFields.Append (']'); tokens.Add (headerFields.ToString ()); } } else if ((items & MessageSummaryItems.Headers) != 0) { tokens.Add ("BODY.PEEK[HEADER]"); } else if ((items & MessageSummaryItems.References) != 0) { tokens.Add ("BODY.PEEK[HEADER.FIELDS (REFERENCES)]"); } if (tokens.Count == 1 && !isNotify) return tokens[0]; return string.Format ("({0})", string.Join (" ", tokens)); } class FetchPreviewTextContext : FetchStreamContextBase { static readonly PlainTextPreviewer textPreviewer = new PlainTextPreviewer (); static readonly HtmlTextPreviewer htmlPreviewer = new HtmlTextPreviewer (); readonly FetchSummaryContext ctx; readonly ImapFolder folder; public FetchPreviewTextContext (ImapFolder folder, FetchSummaryContext ctx) : base (null) { this.folder = folder; this.ctx = ctx; } public override void Add (Section section, CancellationToken cancellationToken) { if (!ctx.TryGetValue (section.Index, out var message)) return; var body = message.TextBody; TextPreviewer previewer; if (body == null) { previewer = htmlPreviewer; body = message.HtmlBody; } else { previewer = textPreviewer; } if (body == null) return; var charset = body.ContentType.Charset ?? "utf-8"; ContentEncoding encoding; if (string.IsNullOrEmpty (body.ContentTransferEncoding) || !MimeUtils.TryParse (body.ContentTransferEncoding, out encoding)) encoding = ContentEncoding.Default; using (var memory = new MemoryStream ()) { var content = new MimeContent (section.Stream, encoding); content.DecodeTo (memory, cancellationToken); memory.Position = 0; try { message.PreviewText = previewer.GetPreviewText (memory, charset); } catch (DecoderFallbackException) { memory.Position = 0; message.PreviewText = previewer.GetPreviewText (memory, TextEncodings.Latin1); } message.Fields |= MessageSummaryItems.PreviewText; folder.OnMessageSummaryFetched (message); } return; } public override void SetUniqueId (int index, UniqueId uid, CancellationToken cancellationToken) { // no-op } } void ProcessFetchResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("FETCH"); } ImapCommand QueueFetchPreviewTextCommand (FetchSummaryContext sctx, KeyValuePair pair, int octets, CancellationToken cancellationToken) { var uids = pair.Value; string specifier; if (!string.IsNullOrEmpty (pair.Key)) specifier = pair.Key; else specifier = "TEXT"; // TODO: if the IMAP server supports the CONVERT extension, we could possibly use the // CONVERT command instead to decode *and* convert (html) into utf-8 plain text. // // e.g. "UID CONVERT {0} (\"text/plain\" (\"charset\" \"utf-8\")) BINARY[{1}]<0.{2}>\r\n" // // This would allow us to more accurately fetch X number of characters because we wouldn't // need to guesstimate accounting for base64/quoted-printable decoding. var command = string.Format (CultureInfo.InvariantCulture, "UID FETCH {0} (BODY.PEEK[{1}]<0.{2}>)\r\n", uids, specifier, octets); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchPreviewTextContext (this, sctx); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx; Engine.QueueCommand (ic); return ic; } void FetchPreviewText (FetchSummaryContext sctx, Dictionary bodies, int octets, CancellationToken cancellationToken) { foreach (var pair in bodies) { var ic = QueueFetchPreviewTextCommand (sctx, pair, octets, cancellationToken); var ctx = (FetchPreviewTextContext) ic.UserData!; try { Engine.Run (ic); ProcessFetchResponse (ic); } finally { ctx.Dispose (); } } } async Task FetchPreviewTextAsync (FetchSummaryContext sctx, Dictionary bodies, int octets, CancellationToken cancellationToken) { foreach (var pair in bodies) { var ic = QueueFetchPreviewTextCommand (sctx, pair, octets, cancellationToken); var ctx = (FetchPreviewTextContext) ic.UserData!; try { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessFetchResponse (ic); } finally { ctx.Dispose (); } } } void CreateFetchPreviewTextMappings (FetchSummaryContext sctx, out Dictionary textBodies, out Dictionary htmlBodies) { textBodies = new Dictionary (); htmlBodies = new Dictionary (); foreach (var item in sctx.Messages) { Dictionary bodies; var message = (MessageSummary) item; var body = message.TextBody; if (body == null) { body = message.HtmlBody; bodies = htmlBodies; } else { bodies = textBodies; } if (body == null || body.Octets == 0) { message.Fields |= MessageSummaryItems.PreviewText; message.PreviewText = string.Empty; OnMessageSummaryFetched (message); continue; } if (!bodies.TryGetValue (body.PartSpecifier, out var uids)) { uids = new UniqueIdSet (SortOrder.Ascending); bodies.Add (body.PartSpecifier, uids); } uids.Add (message.UniqueId); } } void GetPreviewText (FetchSummaryContext sctx, CancellationToken cancellationToken) { CreateFetchPreviewTextMappings (sctx, out var textBodies, out var htmlBodies); MessageExpunged += sctx.OnMessageExpunged; try { FetchPreviewText (sctx, textBodies, PreviewTextLength, cancellationToken); FetchPreviewText (sctx, htmlBodies, PreviewHtmlLength, cancellationToken); } finally { MessageExpunged -= sctx.OnMessageExpunged; } } async Task GetPreviewTextAsync (FetchSummaryContext sctx, CancellationToken cancellationToken) { CreateFetchPreviewTextMappings (sctx, out var textBodies, out var htmlBodies); MessageExpunged += sctx.OnMessageExpunged; try { await FetchPreviewTextAsync (sctx, textBodies, PreviewTextLength, cancellationToken).ConfigureAwait (false); await FetchPreviewTextAsync (sctx, htmlBodies, PreviewHtmlLength, cancellationToken).ConfigureAwait (false); } finally { MessageExpunged -= sctx.OnMessageExpunged; } } internal static bool IsEmptyFetchRequest (IFetchRequest request) { return request.Items == MessageSummaryItems.None && (request.Headers == null || (request.Headers.Count == 0 && !request.Headers.Exclude)); } bool CheckCanFetch (IList uids, IFetchRequest request) { if (uids == null) throw new ArgumentNullException (nameof (uids)); if (request == null) throw new ArgumentNullException (nameof (request)); if (request.ChangedSince.HasValue && !supportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); CheckState (true, false); return uids.Count > 0 && !IsEmptyFetchRequest (request); } string CreateFetchCommand (IList uids, IFetchRequest request, out bool previewText) { var query = FormatSummaryItems (Engine, request, out previewText); var changedSince = string.Empty; if (request.ChangedSince.HasValue) { var vanished = Engine.QResyncEnabled ? " VANISHED" : string.Empty; changedSince = string.Format (CultureInfo.InvariantCulture, " (CHANGEDSINCE {0}{1})", request.ChangedSince.Value, vanished); } return string.Format ("UID FETCH %s {0}{1}\r\n", query, changedSince); } static int EstimateInitialCapacity (IList uids) { if (uids is UniqueIdRange || uids is UniqueIdSet) { // UniqueIdRange is likely to refer to UIDs that have not yet been assigned or have been expunged, // so cap our maximum initial capacity to 1024 (a reasonable limit?). return Math.Min (uids.Count, 1024); } // If the user supplied an exact set of UIDs, then we'll assume they all exist // and therefore we can use the capacity of `uids` as our initial capacity. return uids.Count; } /// /// Fetches the message summaries for the specified message UIDs. /// /// /// Fetches the message summaries for the specified message UIDs. /// It should be noted that if another client has modified any message /// in the folder, the IMAP server may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// /// /// /// An enumeration of summaries for the requested messages. /// The UIDs. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The does not support mod-sequences. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Fetch (IList uids, IFetchRequest request, CancellationToken cancellationToken = default) { if (!CheckCanFetch (uids, request)) return Array.Empty (); var command = CreateFetchCommand (uids, request, out bool previewText); var ctx = new FetchSummaryContext (EstimateInitialCapacity (uids)); MessageExpunged += ctx.OnMessageExpunged; try { foreach (var ic in Engine.CreateCommands (cancellationToken, this, command, uids)) { ic.RegisterUntaggedHandler ("FETCH", UntaggedFetchSummaryItemsHandler); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Run (ic); ProcessFetchResponse (ic); } } finally { MessageExpunged -= ctx.OnMessageExpunged; } if (previewText) GetPreviewText (ctx, cancellationToken); return ctx.Messages.AsReadOnly (); } /// /// Asynchronously fetches the message summaries for the specified message UIDs. /// /// /// Fetches the message summaries for the specified message UIDs. /// It should be noted that if another client has modified any message /// in the folder, the IMAP server may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// /// /// /// An enumeration of summaries for the requested messages. /// The UIDs. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The does not support mod-sequences. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> FetchAsync (IList uids, IFetchRequest request, CancellationToken cancellationToken = default) { if (!CheckCanFetch (uids, request)) return Array.Empty (); var command = CreateFetchCommand (uids, request, out bool previewText); var ctx = new FetchSummaryContext (EstimateInitialCapacity (uids)); MessageExpunged += ctx.OnMessageExpunged; try { foreach (var ic in Engine.CreateCommands (cancellationToken, this, command, uids)) { ic.RegisterUntaggedHandler ("FETCH", UntaggedFetchSummaryItemsHandler); ic.UserData = ctx; Engine.QueueCommand (ic); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessFetchResponse (ic); } } finally { MessageExpunged -= ctx.OnMessageExpunged; } if (previewText) await GetPreviewTextAsync (ctx, cancellationToken).ConfigureAwait (false); return ctx.Messages.AsReadOnly (); } bool CheckCanFetch (IList indexes, IFetchRequest request) { if (indexes == null) throw new ArgumentNullException (nameof (indexes)); if (request == null) throw new ArgumentNullException (nameof (request)); if (request.ChangedSince.HasValue && !supportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); CheckState (true, false); CheckAllowIndexes (); return indexes.Count > 0 && !IsEmptyFetchRequest (request); } ImapCommand QueueFetchCommand (IList indexes, IFetchRequest request, CancellationToken cancellationToken, out bool previewText) { var query = FormatSummaryItems (Engine, request, out previewText); var set = ImapUtils.FormatIndexSet (Engine, indexes); var changedSince = string.Empty; if (request.ChangedSince.HasValue) changedSince = string.Format (CultureInfo.InvariantCulture, " (CHANGEDSINCE {0})", request.ChangedSince.Value); var command = string.Format ("FETCH {0} {1}{2}\r\n", set, query, changedSince); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchSummaryContext (indexes.Count); ic.RegisterUntaggedHandler ("FETCH", UntaggedFetchSummaryItemsHandler); ic.UserData = ctx; Engine.QueueCommand (ic); return ic; } /// /// Fetches the message summaries for the specified message indexes. /// /// /// Fetches the message summaries for the specified message indexes. /// It should be noted that if another client has modified any message /// in the folder, the IMAP server may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The indexes. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The does not support mod-sequences. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Fetch (IList indexes, IFetchRequest request, CancellationToken cancellationToken = default) { if (!CheckCanFetch (indexes, request)) return Array.Empty (); var ic = QueueFetchCommand (indexes, request, cancellationToken, out bool previewText); var ctx = (FetchSummaryContext) ic.UserData!; Engine.Run (ic); ProcessFetchResponse (ic); if (previewText) GetPreviewText (ctx, cancellationToken); return ctx.Messages.AsReadOnly (); } /// /// Asynchronously fetches the message summaries for the specified message indexes. /// /// /// Fetches the message summaries for the specified message indexes. /// It should be noted that if another client has modified any message /// in the folder, the IMAP server may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The indexes. /// The fetch request. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The does not support mod-sequences. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> FetchAsync (IList indexes, IFetchRequest request, CancellationToken cancellationToken = default) { if (!CheckCanFetch (indexes, request)) return Array.Empty (); var ic = QueueFetchCommand (indexes, request, cancellationToken, out bool previewText); var ctx = (FetchSummaryContext) ic.UserData!; await Engine.RunAsync (ic).ConfigureAwait (false); ProcessFetchResponse (ic); if (previewText) await GetPreviewTextAsync (ctx, cancellationToken).ConfigureAwait (false); return ctx.Messages.AsReadOnly (); } static string GetFetchRange (int min, int max) { var minValue = (min + 1).ToString (CultureInfo.InvariantCulture); if (min == max) return minValue; var maxValue = max != -1 ? (max + 1).ToString (CultureInfo.InvariantCulture) : "*"; return string.Format (CultureInfo.InvariantCulture, "{0}:{1}", minValue, maxValue); } bool CheckCanFetch (int min, int max, IFetchRequest request) { if (min < 0) throw new ArgumentOutOfRangeException (nameof (min)); if (max != -1 && max < min) throw new ArgumentOutOfRangeException (nameof (max)); if (request == null) throw new ArgumentNullException (nameof (request)); if (request.ChangedSince.HasValue && !supportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); CheckState (true, false); CheckAllowIndexes (); return Count > 0 && !IsEmptyFetchRequest (request); } ImapCommand QueueFetchCommand (int min, int max, IFetchRequest request, CancellationToken cancellationToken, out bool previewText) { int capacity = Math.Max (max < 0 || max > Count ? Count : max, min) - min; var query = FormatSummaryItems (Engine, request, out previewText); var set = GetFetchRange (min, max); var changedSince = string.Empty; if (request.ChangedSince.HasValue) changedSince = string.Format (CultureInfo.InvariantCulture, " (CHANGEDSINCE {0})", request.ChangedSince.Value); var command = string.Format ("FETCH {0} {1}{2}\r\n", set, query, changedSince); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchSummaryContext (capacity); ic.RegisterUntaggedHandler ("FETCH", UntaggedFetchSummaryItemsHandler); ic.UserData = ctx; Engine.QueueCommand (ic); return ic; } /// /// Fetches the message summaries for the messages between the two indexes, inclusive. /// /// /// Fetches the message summaries for the messages between the two /// indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the IMAP server may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The fetch request. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The does not support mod-sequences. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Fetch (int min, int max, IFetchRequest request, CancellationToken cancellationToken = default) { if (!CheckCanFetch (min, max, request)) return Array.Empty (); var ic = QueueFetchCommand (min, max, request, cancellationToken, out bool previewText); var ctx = (FetchSummaryContext) ic.UserData!; Engine.Run (ic); ProcessFetchResponse (ic); if (previewText) GetPreviewText (ctx, cancellationToken); return ctx.Messages.AsReadOnly (); } /// /// Asynchronously fetches the message summaries for the messages between the two indexes, inclusive. /// /// /// Fetches the message summaries for the messages between the two /// indexes, inclusive. /// It should be noted that if another client has modified any message /// in the folder, the IMAP server may choose to return information that was /// not explicitly requested. It is therefore important to be prepared to /// handle both additional fields on a for /// messages that were requested as well as summaries for messages that were /// not requested at all. /// /// An enumeration of summaries for the requested messages. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// The fetch request. /// The cancellation token. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not currently open. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The does not support mod-sequences. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> FetchAsync (int min, int max, IFetchRequest request, CancellationToken cancellationToken = default) { if (!CheckCanFetch (min, max, request)) return Array.Empty (); var ic = QueueFetchCommand (min, max, request, cancellationToken, out bool previewText); var ctx = (FetchSummaryContext) ic.UserData!; await Engine.RunAsync (ic).ConfigureAwait (false); ProcessFetchResponse (ic); if (previewText) await GetPreviewTextAsync (ctx, cancellationToken).ConfigureAwait (false); return ctx.Messages.AsReadOnly (); } /// /// Create a backing stream for use with the GetMessage, GetBodyPart, and GetStream methods. /// /// /// Allows subclass implementations to override the type of stream /// created for use with the GetMessage, GetBodyPart and GetStream methods. /// This could be useful for subclass implementations that intend to implement /// support for caching and/or for subclass implementations that want to use /// temporary file streams instead of memory-based streams for larger amounts of /// message data. /// Subclasses that implement caching using this API should wait for /// before adding the stream to their cache. /// Streams returned by this method SHOULD clean up any allocated resources /// such as deleting temporary files from the file system. /// The will not be available for the various /// GetMessage(), GetBodyPart() and GetStream() methods that take a message index rather /// than a . It may also not be available if the IMAP server /// response does not specify the UID value prior to sending the literal-string /// token containing the message stream. /// /// /// The stream. /// The unique identifier of the message, if available. /// The section of the message that is being fetched. /// The starting offset of the message section being fetched. /// The length of the stream being fetched, measured in bytes. protected virtual Stream CreateStream (UniqueId? uid, string section, int offset, int length) { if (length > 4096) return new MemoryBlockStream (); return new MemoryStream (length); } /// /// Commit a stream returned by . /// /// /// Commits a stream returned by . /// This method is called only after both the message data has successfully /// been written to the stream returned by and a /// has been obtained for the associated message. /// For subclasses implementing caching, this method should be used for /// committing the stream to their cache. /// Subclass implementations may take advantage of the fact that /// allows returning a new /// reference if they move a file on the file system and wish to return a new /// based on the new path, for example. /// /// /// The stream. /// The stream. /// The unique identifier of the message. /// The section of the message that the stream represents. /// The starting offset of the message section. /// The length of the stream, measured in bytes. protected virtual Stream CommitStream (Stream stream, UniqueId uid, string section, int offset, int length) { return stream; } HeaderList ParseHeaders (Stream stream, CancellationToken cancellationToken) { try { return Engine.ParseHeaders (stream, cancellationToken); } finally { stream.Dispose (); } } async Task ParseHeadersAsync (Stream stream, CancellationToken cancellationToken) { try { return await Engine.ParseHeadersAsync (stream, cancellationToken).ConfigureAwait (false); } finally { stream.Dispose (); } } MimeMessage ParseMessage (Stream stream, CancellationToken cancellationToken) { bool dispose = !(stream is MemoryStream || stream is MemoryBlockStream); try { return Engine.ParseMessage (stream, !dispose, cancellationToken); } finally { if (dispose) stream.Dispose (); } } async Task ParseMessageAsync (Stream stream, CancellationToken cancellationToken) { bool dispose = !(stream is MemoryStream || stream is MemoryBlockStream); try { return await Engine.ParseMessageAsync (stream, !dispose, cancellationToken).ConfigureAwait (false); } finally { if (dispose) stream.Dispose (); } } MimeEntity ParseEntity (Stream stream, bool dispose, CancellationToken cancellationToken) { try { return Engine.ParseEntity (stream, !dispose, cancellationToken); } finally { if (dispose) stream.Dispose (); } } async Task ParseEntityAsync (Stream stream, bool dispose, CancellationToken cancellationToken) { try { return await Engine.ParseEntityAsync (stream, !dispose, cancellationToken).ConfigureAwait (false); } finally { if (dispose) stream.Dispose (); } } class Section { public int Index; public UniqueId? UniqueId; public Stream Stream; public string Name; public int Offset; public int Length; public Section (Stream stream, int index, UniqueId? uid, string name, int offset, int length) { Stream = stream; Offset = offset; Length = length; UniqueId = uid; Index = index; Name = name; } } abstract class FetchStreamContextBase : IDisposable { public readonly List
Sections = new List
(); readonly ITransferProgress? progress; protected FetchStreamContextBase (ITransferProgress? progress) { this.progress = progress; } public abstract void Add (Section section, CancellationToken cancellationToken); public virtual Task AddAsync (Section section, CancellationToken cancellationToken) { Add (section, cancellationToken); return Task.CompletedTask; } public virtual bool Contains (int index, string specifier, [NotNullWhen (true)] out Section? section) { section = null; return false; } public abstract void SetUniqueId (int index, UniqueId uid, CancellationToken cancellationToken); public virtual Task SetUniqueIdAsync (int index, UniqueId uid, CancellationToken cancellationToken) { SetUniqueId (index, uid, cancellationToken); return Task.CompletedTask; } public void Report (long nread, long total) { if (progress == null) return; progress.Report (nread, total); } public void Dispose () { for (int i = 0; i < Sections.Count; i++) { var section = Sections[i]; try { section.Stream.Dispose (); } catch (IOException) { } } } } class FetchStreamContext : FetchStreamContextBase { public FetchStreamContext (ITransferProgress? progress) : base (progress) { } public override void Add (Section section, CancellationToken cancellationToken) { Sections.Add (section); } public bool TryGetSection (UniqueId uid, string specifier, [NotNullWhen (true)] out Section? section, bool remove = false) { for (int i = 0; i < Sections.Count; i++) { var item = Sections[i]; if (!item.UniqueId.HasValue || item.UniqueId.Value != uid) continue; if (item.Name.Equals (specifier, StringComparison.OrdinalIgnoreCase)) { if (remove) Sections.RemoveAt (i); section = item; return true; } } section = null; return false; } public bool TryGetSection (int index, string specifier, [NotNullWhen (true)] out Section? section, bool remove = false) { for (int i = 0; i < Sections.Count; i++) { var item = Sections[i]; if (item.Index != index) continue; if (item.Name.Equals (specifier, StringComparison.OrdinalIgnoreCase)) { if (remove) Sections.RemoveAt (i); section = item; return true; } } section = null; return false; } public override void SetUniqueId (int index, UniqueId uid, CancellationToken cancellationToken) { for (int i = 0; i < Sections.Count; i++) { if (Sections[i].Index == index) Sections[i].UniqueId = uid; } } } void FetchStream (ImapEngine engine, ImapCommand ic, int index) { var token = engine.ReadToken (ic.CancellationToken); var ctx = (FetchStreamContextBase) ic.UserData!; var sectionBuilder = new StringBuilder (); IList? annotations = null; MessageFlags flags = MessageFlags.None; HashSet? keywords = null; IList? labels = null; long nread = 0, size = 0; UniqueId? uid = null; ulong? modseq = null; Stream stream; string name; byte[] buf; int n; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); do { token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.Eoln) { // Note: Most likely the message body was calculated to be 1 or 2 bytes too // short (e.g. did not include the trailing ) and that is the EOLN we just // reached. Ignore it and continue as normal. // // See https://github.com/jstedfast/MailKit/issues/954 for details. token = engine.ReadToken (ic.CancellationToken); } if (token.Type == ImapTokenType.CloseParen) break; ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); var atom = (string) token.Value; int offset = 0, length; uint value; if (atom.Equals ("BODY", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (ic.CancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenBracket, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); sectionBuilder.Clear (); do { token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.CloseBracket) break; if (token.Type == ImapTokenType.OpenParen) { sectionBuilder.Append (" ("); do { token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.CloseParen) break; // the header field names will generally be atoms or qstrings but may also be literals engine.UngetToken (token); var field = ImapUtils.ReadStringToken (engine, ImapEngine.FetchBodySyntaxErrorFormat, ic.CancellationToken); sectionBuilder.Append (field); sectionBuilder.Append (' '); } while (true); if (sectionBuilder[sectionBuilder.Length - 1] == ' ') sectionBuilder.Length--; sectionBuilder.Append (')'); } else { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); sectionBuilder.Append ((string) token.Value); } } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseBracket, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.Atom) { // this might be a region ("<###>") var expr = (string) token.Value; if (expr.Length > 2 && expr[0] == '<' && expr[expr.Length - 1] == '>') { var region = expr.Substring (1, expr.Length - 2); int.TryParse (region, NumberStyles.None, CultureInfo.InvariantCulture, out offset); token = engine.ReadToken (ic.CancellationToken); } } name = sectionBuilder.ToString (); switch (token.Type) { case ImapTokenType.Literal: length = (int) token.Value; size += length; stream = CreateStream (uid, name, offset, length); buf = ArrayPool.Shared.Rent (BufferSize); try { do { n = engine.Stream!.Read (buf, 0, BufferSize, ic.CancellationToken); if (n > 0) { stream.Write (buf, 0, n); nread += n; ctx.Report (nread, size); } else { break; } } while (true); stream.Position = 0; } catch { stream?.Dispose (); throw; } finally { ArrayPool.Shared.Return (buf); } break; case ImapTokenType.QString: case ImapTokenType.Atom: buf = Encoding.UTF8.GetBytes ((string) token.Value); length = buf.Length; nread += length; size += length; stream = CreateStream (uid, name, offset, length); try { stream.Write (buf, 0, length); ctx.Report (nread, size); stream.Position = 0; } catch { stream?.Dispose (); throw; } break; case ImapTokenType.Nil: stream = CreateStream (uid, name, offset, 0); length = 0; break; case ImapTokenType.CloseParen: // Note: Yandex IMAP servers sometimes do not include the BODY[
] content value in the FETCH response. // // See https://github.com/jstedfast/MailKit/issues/1708 for details. // // Unget the ')' token and pretend we got a NIL token. engine.UngetToken (token); goto case ImapTokenType.Nil; default: throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } if (uid.HasValue) stream = CommitStream (stream, uid.Value, name, offset, length); // prevent leaks in the (invalid) case where a section may be returned twice if (ctx.Contains (index, name, out var section)) section.Stream.Dispose (); section = new Section (stream, index, uid, name, offset, length); ctx.Add (section, ic.CancellationToken); } else if (atom.Equals ("UID", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (ic.CancellationToken); value = ImapEngine.ParseNumber (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); uid = new UniqueId (UidValidity, value); ctx.SetUniqueId (index, uid.Value, ic.CancellationToken); } else if (atom.Equals ("MODSEQ", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (ic.CancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); token = engine.ReadToken (ic.CancellationToken); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); // Note: Some IMAP servers (such as Zoho Mail) will return a MODSEQ of -1 in some cases (not sure why). // // If we get an invalid value, just ignore it. // // See https://github.com/jstedfast/MailKit/issues/1686 for details. if (ImapEngine.TryParseNumber64 (token, out ulong n64)) { if (n64 > HighestModSeq) UpdateHighestModSeq (n64); modseq = n64; } token = engine.ReadToken (ic.CancellationToken); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else if (atom.Equals ("FLAGS", StringComparison.OrdinalIgnoreCase)) { // even though we didn't request this piece of information, the IMAP server // may send it if another client has recently modified the message flags. keywords = new HashSet (StringComparer.Ordinal); flags = ImapUtils.ParseFlagsList (engine, atom, keywords, ic.CancellationToken); } else if (atom.Equals ("X-GM-LABELS", StringComparison.OrdinalIgnoreCase)) { // even though we didn't request this piece of information, the IMAP server // may send it if another client has recently modified the message labels. labels = ImapUtils.ParseLabelsList (engine, ic.CancellationToken); } else if (atom.Equals ("ANNOTATION", StringComparison.OrdinalIgnoreCase)) { // even though we didn't request this piece of information, the IMAP server // may send it if another client has recently modified the message annotations. annotations = ImapUtils.ParseAnnotations (engine, ic.CancellationToken); } else { // Unexpected or unknown token (such as XAOL.SPAM.REASON or XAOL-MSGID). Simply read 1 more token (the argument) and ignore. token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.OpenParen) SkipParenthesizedList (engine, ic.CancellationToken); } } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); if (keywords != null) OnMessageFlagsChanged (new MessageFlagsChangedEventArgs (index, flags, keywords) { UniqueId = uid, ModSeq = modseq }); if (labels != null) OnMessageLabelsChanged (new MessageLabelsChangedEventArgs (index, labels) { UniqueId = uid, ModSeq = modseq }); if (annotations != null) OnAnnotationsChanged (new AnnotationsChangedEventArgs (index, annotations) { UniqueId = uid, ModSeq = modseq }); if (modseq.HasValue) OnModSeqChanged (new ModSeqChangedEventArgs (index, modseq.Value) { UniqueId = uid }); } async Task FetchStreamAsync (ImapEngine engine, ImapCommand ic, int index) { var token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); var ctx = (FetchStreamContextBase) ic.UserData!; var sectionBuilder = new StringBuilder (); IList? annotations = null; MessageFlags flags = MessageFlags.None; HashSet? keywords = null; IList? labels = null; long nread = 0, size = 0; UniqueId? uid = null; ulong? modseq = null; Stream stream; string name; byte[] buf; int n; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); do { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Eoln) { // Note: Most likely the message body was calculated to be 1 or 2 bytes too // short (e.g. did not include the trailing ) and that is the EOLN we just // reached. Ignore it and continue as normal. // // See https://github.com/jstedfast/MailKit/issues/954 for details. token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); } if (token.Type == ImapTokenType.CloseParen) break; ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); var atom = (string) token.Value; int offset = 0, length; uint value; if (atom.Equals ("BODY", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenBracket, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); sectionBuilder.Clear (); do { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseBracket) break; if (token.Type == ImapTokenType.OpenParen) { sectionBuilder.Append (" ("); do { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; // the header field names will generally be atoms or qstrings but may also be literals engine.UngetToken (token); var field = await ImapUtils.ReadStringTokenAsync (engine, ImapEngine.FetchBodySyntaxErrorFormat, ic.CancellationToken).ConfigureAwait (false); sectionBuilder.Append (field); sectionBuilder.Append (' '); } while (true); if (sectionBuilder[sectionBuilder.Length - 1] == ' ') sectionBuilder.Length--; sectionBuilder.Append (')'); } else { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); sectionBuilder.Append ((string) token.Value); } } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseBracket, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Atom) { // this might be a region ("<###>") var expr = (string) token.Value; if (expr.Length > 2 && expr[0] == '<' && expr[expr.Length - 1] == '>') { var region = expr.Substring (1, expr.Length - 2); int.TryParse (region, NumberStyles.None, CultureInfo.InvariantCulture, out offset); token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); } } name = sectionBuilder.ToString (); switch (token.Type) { case ImapTokenType.Literal: length = (int) token.Value; size += length; stream = CreateStream (uid, name, offset, length); buf = ArrayPool.Shared.Rent (BufferSize); try { do { n = await engine.Stream!.ReadAsync (buf, 0, BufferSize, ic.CancellationToken).ConfigureAwait (false); if (n > 0) { stream.Write (buf, 0, n); nread += n; ctx.Report (nread, size); } else { break; } } while (true); stream.Position = 0; } catch { stream?.Dispose (); throw; } finally { ArrayPool.Shared.Return (buf); } break; case ImapTokenType.QString: case ImapTokenType.Atom: buf = Encoding.UTF8.GetBytes ((string) token.Value); length = buf.Length; nread += length; size += length; stream = CreateStream (uid, name, offset, length); try { stream.Write (buf, 0, length); ctx.Report (nread, size); stream.Position = 0; } catch { stream?.Dispose (); throw; } break; case ImapTokenType.Nil: stream = CreateStream (uid, name, offset, 0); length = 0; break; case ImapTokenType.CloseParen: // Note: Yandex IMAP servers sometimes do not include the BODY[
] content value in the FETCH response. // // See https://github.com/jstedfast/MailKit/issues/1708 for details. // // Unget the ')' token and pretend we got a NIL token. engine.UngetToken (token); goto case ImapTokenType.Nil; default: throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } if (uid.HasValue) stream = CommitStream (stream, uid.Value, name, offset, length); // prevent leaks in the (invalid) case where a section may be returned twice if (ctx.Contains (index, name, out var section)) section.Stream.Dispose (); section = new Section (stream, index, uid, name, offset, length); await ctx.AddAsync (section, ic.CancellationToken).ConfigureAwait (false); } else if (atom.Equals ("UID", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); value = ImapEngine.ParseNumber (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); uid = new UniqueId (UidValidity, value); await ctx.SetUniqueIdAsync (index, uid.Value, ic.CancellationToken).ConfigureAwait (false); } else if (atom.Equals ("MODSEQ", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); // Note: Some IMAP servers (such as Zoho Mail) will return a MODSEQ of -1 in some cases (not sure why). // // If we get an invalid value, just ignore it. // // See https://github.com/jstedfast/MailKit/issues/1686 for details. if (ImapEngine.TryParseNumber64 (token, out ulong n64)) { if (n64 > HighestModSeq) UpdateHighestModSeq (n64); modseq = n64; } token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else if (atom.Equals ("FLAGS", StringComparison.OrdinalIgnoreCase)) { // even though we didn't request this piece of information, the IMAP server // may send it if another client has recently modified the message flags. keywords = new HashSet (StringComparer.Ordinal); flags = await ImapUtils.ParseFlagsListAsync (engine, atom, keywords, ic.CancellationToken).ConfigureAwait (false); } else if (atom.Equals ("X-GM-LABELS", StringComparison.OrdinalIgnoreCase)) { // even though we didn't request this piece of information, the IMAP server // may send it if another client has recently modified the message labels. labels = await ImapUtils.ParseLabelsListAsync (engine, ic.CancellationToken).ConfigureAwait (false); } else if (atom.Equals ("ANNOTATION", StringComparison.OrdinalIgnoreCase)) { // even though we didn't request this piece of information, the IMAP server // may send it if another client has recently modified the message annotations. annotations = await ImapUtils.ParseAnnotationsAsync (engine, ic.CancellationToken).ConfigureAwait (false); } else { // Unexpected or unknown token (such as XAOL.SPAM.REASON or XAOL-MSGID). Simply read 1 more token (the argument) and ignore. token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenParen) await SkipParenthesizedListAsync (engine, ic.CancellationToken).ConfigureAwait (false); } } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "FETCH", token); if (keywords != null) OnMessageFlagsChanged (new MessageFlagsChangedEventArgs (index, flags, keywords) { UniqueId = uid, ModSeq = modseq }); if (labels != null) OnMessageLabelsChanged (new MessageLabelsChangedEventArgs (index, labels) { UniqueId = uid, ModSeq = modseq }); if (annotations != null) OnAnnotationsChanged (new AnnotationsChangedEventArgs (index, annotations) { UniqueId = uid, ModSeq = modseq }); if (modseq.HasValue) OnModSeqChanged (new ModSeqChangedEventArgs (index, modseq.Value) { UniqueId = uid }); } Task FetchStreamHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { if (doAsync) return FetchStreamAsync (engine, ic, index); FetchStream (engine, ic, index); return Task.CompletedTask; } static string GetBodyPartQuery (string partSpec, bool headersOnly, out string[] tags) { string query; if (headersOnly) { tags = new string[1]; if (partSpec.Length > 0) { query = string.Format ("BODY.PEEK[{0}.MIME]", partSpec); tags[0] = partSpec + ".MIME"; } else { query = "BODY.PEEK[HEADER]"; tags[0] = "HEADER"; } } else if (partSpec.Length > 0) { tags = new string[] { partSpec + ".MIME", partSpec }; query = string.Format ("BODY.PEEK[{0}] BODY.PEEK[{1}]", tags[0], tags[1]); } else { tags = new string[] { string.Empty }; query = "BODY.PEEK[]"; } return query; } ImapCommand QueueGetHeadersCommand (UniqueId uid, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); CheckState (true, false); var ic = new ImapCommand (Engine, cancellationToken, this, "UID FETCH %u (BODY.PEEK[HEADER])\r\n", uid.Id); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } Stream ProcessGetHeadersResponse (ImapCommand ic, FetchStreamContext ctx, UniqueId uid) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (uid, "HEADER", out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested message headers."); return section.Stream; } /// /// Get the specified message headers. /// /// /// Gets the specified message headers. /// /// The message headers. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override HeaderList GetHeaders (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetHeadersCommand (uid, cancellationToken, progress, out var ctx); try { Engine.Run (ic); var stream = ProcessGetHeadersResponse (ic, ctx, uid); return ParseHeaders (stream, cancellationToken); } finally { ctx.Dispose (); } } /// /// Asynchronously get the specified message headers. /// /// /// Gets the specified message headers. /// /// The message headers. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetHeadersAsync (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetHeadersCommand (uid, cancellationToken, progress, out var ctx); try { await Engine.RunAsync (ic).ConfigureAwait (false); var stream = ProcessGetHeadersResponse (ic, ctx, uid); return await ParseHeadersAsync (stream, cancellationToken).ConfigureAwait (false); } finally { ctx.Dispose (); } } ImapCommand QueueGetHeadersCommand (UniqueId uid, string partSpecifier, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx, out string[] tags) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (partSpecifier == null) throw new ArgumentNullException (nameof (partSpecifier)); CheckState (true, false); var command = string.Format ("UID FETCH {0} ({1})\r\n", uid, GetBodyPartQuery (partSpecifier, true, out tags)); var ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } Stream ProcessGetHeadersResponse (ImapCommand ic, FetchStreamContext ctx, UniqueId uid, string[] tags) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (uid, tags[0], out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested body part headers."); return section.Stream; } /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual HeaderList GetHeaders (UniqueId uid, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetHeadersCommand (uid, partSpecifier, cancellationToken, progress, out var ctx, out var tags); try { Engine.Run (ic); var stream = ProcessGetHeadersResponse (ic, ctx, uid, tags); return ParseHeaders (stream, cancellationToken); } finally { ctx.Dispose (); } } /// /// Asynchronously get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task GetHeadersAsync (UniqueId uid, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetHeadersCommand (uid, partSpecifier, cancellationToken, progress, out var ctx, out var tags); try { await Engine.RunAsync (ic).ConfigureAwait (false); var stream = ProcessGetHeadersResponse (ic, ctx, uid, tags); return await ParseHeadersAsync (stream, cancellationToken).ConfigureAwait (false); } finally { ctx.Dispose (); } } /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override HeaderList GetHeaders (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetHeaders (uid, part.PartSpecifier, cancellationToken, progress); } /// /// Asynchronously get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task GetHeadersAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetHeadersAsync (uid, part.PartSpecifier, cancellationToken, progress); } ImapCommand QueueGetHeadersCommand (int index, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); CheckState (true, false); var ic = new ImapCommand (Engine, cancellationToken, this, "FETCH %d (BODY.PEEK[HEADER])\r\n", index + 1); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } Stream ProcessGetHeadersResponse (ImapCommand ic, FetchStreamContext ctx, int index) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (index, "HEADER", out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested message headers."); return section.Stream; } /// /// Get the specified message headers. /// /// /// Gets the specified message headers. /// /// The message headers. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override HeaderList GetHeaders (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetHeadersCommand (index, cancellationToken, progress, out var ctx); try { Engine.Run (ic); var stream = ProcessGetHeadersResponse (ic, ctx, index); return ParseHeaders (stream, cancellationToken); } finally { ctx.Dispose (); } } /// /// Asynchronously get the specified message headers. /// /// /// Gets the specified message headers. /// /// The message headers. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetHeadersAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetHeadersCommand (index, cancellationToken, progress, out var ctx); try { await Engine.RunAsync (ic).ConfigureAwait (false); var stream = ProcessGetHeadersResponse (ic, ctx, index); return await ParseHeadersAsync (stream, cancellationToken).ConfigureAwait (false); } finally { ctx.Dispose (); } } ImapCommand QueueGetHeadersCommand (int index, string partSpecifier, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx, out string[] tags) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (partSpecifier == null) throw new ArgumentNullException (nameof (partSpecifier)); CheckState (true, false); var command = string.Format ("FETCH {0} ({1})\r\n", index + 1, GetBodyPartQuery (partSpecifier, true, out tags)); var ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } Stream ProcessGetHeadersResponse (ImapCommand ic, FetchStreamContext ctx, int index, string[] tags) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (index, tags[0], out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested body part headers."); return section.Stream; } /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual HeaderList GetHeaders (int index, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetHeadersCommand (index, partSpecifier, cancellationToken, progress, out var ctx, out var tags); try { Engine.Run (ic); var stream = ProcessGetHeadersResponse (ic, ctx, index, tags); return ParseHeaders (stream, cancellationToken); } finally { ctx.Dispose (); } } /// /// Asynchronously get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task GetHeadersAsync (int index, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetHeadersCommand (index, partSpecifier, cancellationToken, progress, out var ctx, out var tags); try { await Engine.RunAsync (ic).ConfigureAwait (false); var stream = ProcessGetHeadersResponse (ic, ctx, index, tags); return await ParseHeadersAsync (stream, cancellationToken).ConfigureAwait (false); } finally { ctx.Dispose (); } } /// /// Get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override HeaderList GetHeaders (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetHeaders (index, part.PartSpecifier, cancellationToken, progress); } /// /// Asynchronously get the specified body part headers. /// /// /// Gets the specified body part headers. /// /// The body part headers. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested body part headers. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task GetHeadersAsync (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetHeadersAsync (index, part.PartSpecifier, cancellationToken, progress); } ImapCommand QueueGetMessageCommand (UniqueId uid, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); CheckState (true, false); var ic = new ImapCommand (Engine, cancellationToken, this, "UID FETCH %u (BODY.PEEK[])\r\n", uid.Id); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } Stream ProcessGetMessageResponse (ImapCommand ic, FetchStreamContext ctx, UniqueId uid) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (uid, string.Empty, out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested message."); return section.Stream; } /// /// Get the specified message. /// /// /// Gets the specified message. /// /// The message. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override MimeMessage GetMessage (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetMessageCommand (uid, cancellationToken, progress, out var ctx); try { Engine.Run (ic); var stream = ProcessGetMessageResponse (ic, ctx, uid); return ParseMessage (stream, cancellationToken); } finally { ctx.Dispose (); } } /// /// Asynchronously get the specified message. /// /// /// Gets the specified message. /// /// The message. /// The UID of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetMessageAsync (UniqueId uid, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetMessageCommand (uid, cancellationToken, progress, out var ctx); try { await Engine.RunAsync (ic).ConfigureAwait (false); var stream = ProcessGetMessageResponse (ic, ctx, uid); return await ParseMessageAsync (stream, cancellationToken).ConfigureAwait (false); } finally { ctx.Dispose (); } } ImapCommand QueueGetMessageCommand (int index, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); CheckState (true, false); var ic = new ImapCommand (Engine, cancellationToken, this, "FETCH %d (BODY.PEEK[])\r\n", index + 1); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } Stream ProcessGetMessageResponse (ImapCommand ic, FetchStreamContext ctx, int index) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (index, string.Empty, out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested message."); return section.Stream; } /// /// Get the specified message. /// /// /// Gets the specified message. /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override MimeMessage GetMessage (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetMessageCommand (index, cancellationToken, progress, out var ctx); try { Engine.Run (ic); var stream = ProcessGetMessageResponse (ic, ctx, index); return ParseMessage (stream, cancellationToken); } finally { ctx.Dispose (); } } /// /// Asynchronously get the specified message. /// /// /// Gets the specified message. /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetMessageAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetMessageCommand (index, cancellationToken, progress, out var ctx); try { await Engine.RunAsync (ic).ConfigureAwait (false); var stream = ProcessGetMessageResponse (ic, ctx, index); return await ParseMessageAsync (stream, cancellationToken).ConfigureAwait (false); } finally { ctx.Dispose (); } } ImapCommand QueueGetBodyPartCommand (UniqueId uid, string partSpecifier, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx, out string[] tags) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (partSpecifier == null) throw new ArgumentNullException (nameof (partSpecifier)); CheckState (true, false); var command = string.Format ("UID FETCH {0} ({1})\r\n", uid, GetBodyPartQuery (partSpecifier, false, out tags)); var ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } void ProcessGetBodyPartResponse (ImapCommand ic, FetchStreamContext ctx, UniqueId uid, string[] tags, out ChainedStream chained, out bool dispose) { ProcessFetchResponse (ic); chained = new ChainedStream (); dispose = false; try { foreach (var tag in tags) { if (!ctx.TryGetSection (uid, tag, out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested body part."); if (!(section.Stream is MemoryStream || section.Stream is MemoryBlockStream)) dispose = true; chained.Add (section.Stream); } } catch { chained.Dispose (); throw; } } void RemoveMessageHeaders (MimeEntity entity) { for (int i = entity.Headers.Count; i > 0; i--) { var header = entity.Headers[i - 1]; if (!header.Field.StartsWith ("Content-", StringComparison.OrdinalIgnoreCase)) entity.Headers.RemoveAt (i - 1); } } /// /// Get the specified body part. /// /// /// Gets the specified body part. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// /// /// /// The body part. /// The UID of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual MimeEntity GetBodyPart (UniqueId uid, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetBodyPartCommand (uid, partSpecifier, cancellationToken, progress, out var ctx, out var tags); ChainedStream chained; bool dispose; try { Engine.Run (ic); ProcessGetBodyPartResponse (ic, ctx, uid, tags, out chained, out dispose); } finally { ctx.Dispose (); } var entity = ParseEntity (chained, dispose, cancellationToken); if (partSpecifier.Length == 0) RemoveMessageHeaders (entity); return entity; } /// /// Asynchronously get the specified body part. /// /// /// Gets the specified body part. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// /// /// /// The body part. /// The UID of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task GetBodyPartAsync (UniqueId uid, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetBodyPartCommand (uid, partSpecifier, cancellationToken, progress, out var ctx, out var tags); ChainedStream chained; bool dispose; try { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessGetBodyPartResponse (ic, ctx, uid, tags, out chained, out dispose); } finally { ctx.Dispose (); } var entity = await ParseEntityAsync (chained, dispose, cancellationToken).ConfigureAwait (false); if (partSpecifier.Length == 0) RemoveMessageHeaders (entity); return entity; } /// /// Get the specified body part. /// /// /// Gets the specified body part. /// /// /// /// /// The body part. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override MimeEntity GetBodyPart (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetBodyPart (uid, part.PartSpecifier, cancellationToken, progress); } /// /// Asynchronously get the specified body part. /// /// /// Gets the specified body part. /// /// /// /// /// The body part. /// The UID of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message body. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task GetBodyPartAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetBodyPartAsync (uid, part.PartSpecifier, cancellationToken, progress); } ImapCommand QueueGetBodyPartCommand (int index, string partSpecifier, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx, out string[] tags) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (partSpecifier == null) throw new ArgumentNullException (nameof (partSpecifier)); CheckState (true, false); var seqid = (index + 1).ToString (CultureInfo.InvariantCulture); var command = string.Format ("FETCH {0} ({1})\r\n", seqid, GetBodyPartQuery (partSpecifier, false, out tags)); var ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } void ProcessGetBodyPartResponse (ImapCommand ic, FetchStreamContext ctx, int index, string[] tags, out ChainedStream chained, out bool dispose) { ProcessFetchResponse (ic); chained = new ChainedStream (); dispose = false; try { foreach (var tag in tags) { if (!ctx.TryGetSection (index, tag, out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested body part."); if (!(section.Stream is MemoryStream || section.Stream is MemoryBlockStream)) dispose = true; chained.Add (section.Stream); } } catch { chained.Dispose (); throw; } } /// /// Get the specified body part. /// /// /// Gets the specified body part. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The body part. /// The index of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual MimeEntity GetBodyPart (int index, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetBodyPartCommand (index, partSpecifier, cancellationToken, progress, out var ctx, out var tags); ChainedStream chained; bool dispose; try { Engine.Run (ic); ProcessGetBodyPartResponse (ic, ctx, index, tags, out chained, out dispose); } finally { ctx.Dispose (); } var entity = ParseEntity (chained, dispose, cancellationToken); if (partSpecifier.Length == 0) RemoveMessageHeaders (entity); return entity; } /// /// Asynchronously get the specified body part. /// /// /// Gets the specified body part. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The body part. /// The index of the message. /// The body part specifier. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task GetBodyPartAsync (int index, string partSpecifier, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetBodyPartCommand (index, partSpecifier, cancellationToken, progress, out var ctx, out var tags); ChainedStream chained; bool dispose; try { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessGetBodyPartResponse (ic, ctx, index, tags, out chained, out dispose); } finally { ctx.Dispose (); } var entity = await ParseEntityAsync (chained, dispose, cancellationToken).ConfigureAwait (false); if (partSpecifier.Length == 0) RemoveMessageHeaders (entity); return entity; } /// /// Get the specified body part. /// /// /// Gets the specified body part. /// /// The body part. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override MimeEntity GetBodyPart (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetBodyPart (index, part.PartSpecifier, cancellationToken, progress); } /// /// Asynchronously get the specified body part. /// /// /// Gets the specified body part. /// /// The body part. /// The index of the message. /// The body part. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task GetBodyPartAsync (int index, BodyPart part, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (part == null) throw new ArgumentNullException (nameof (part)); return GetBodyPartAsync (index, part.PartSpecifier, cancellationToken, progress); } bool TryQueueGetStreamCommand (UniqueId uid, int offset, int count, CancellationToken cancellationToken, ITransferProgress? progress, [NotNullWhen (true)] out ImapCommand? ic, [NotNullWhen (true)] out FetchStreamContext? ctx) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (offset < 0) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0) throw new ArgumentOutOfRangeException (nameof (count)); CheckState (true, false); if (count == 0) { ctx = null; ic = null; return false; } ic = new ImapCommand (Engine, cancellationToken, this, "UID FETCH %u (BODY.PEEK[]<%d.%d>)\r\n", uid.Id, offset, count); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return true; } Stream ProcessGetStreamResponse (ImapCommand ic, FetchStreamContext ctx, UniqueId uid) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (uid, string.Empty, out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested stream."); return section.Stream; } /// /// Get a substream of the specified message. /// /// /// Fetches a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, the stream will /// end where the message ends. /// /// The stream. /// The UID of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Stream GetStream (UniqueId uid, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!TryQueueGetStreamCommand (uid, offset, count, cancellationToken, progress, out var ic, out var ctx)) return new MemoryStream (); try { Engine.Run (ic); return ProcessGetStreamResponse (ic, ctx, uid); } finally { ctx.Dispose (); } } /// /// Asynchronously gets a substream of the specified message. /// /// /// Fetches a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, the stream will /// end where the message ends. /// /// The stream. /// The UID of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetStreamAsync (UniqueId uid, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!TryQueueGetStreamCommand (uid, offset, count, cancellationToken, progress, out var ic, out var ctx)) return new MemoryStream (); try { await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetStreamResponse (ic, ctx, uid); } finally { ctx.Dispose (); } } bool TryQueueGetStreamCommand (int index, int offset, int count, CancellationToken cancellationToken, ITransferProgress? progress, [NotNullWhen (true)] out ImapCommand? ic, [NotNullWhen (true)] out FetchStreamContext? ctx) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (offset < 0) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0) throw new ArgumentOutOfRangeException (nameof (count)); CheckState (true, false); if (count == 0) { ctx = null; ic = null; return false; } ic = new ImapCommand (Engine, cancellationToken, this, "FETCH %d (BODY.PEEK[]<%d.%d>)\r\n", index + 1, offset, count); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return true; } Stream ProcessGetStreamResponse (ImapCommand ic, FetchStreamContext ctx, int index) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (index, string.Empty, out var section, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested stream."); return section.Stream; } /// /// Get a substream of the specified message. /// /// /// Fetches a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Stream GetStream (int index, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!TryQueueGetStreamCommand (index, offset, count, cancellationToken, progress, out var ic, out var ctx)) return new MemoryStream (); try { Engine.Run (ic); return ProcessGetStreamResponse (ic, ctx, index); } finally { ctx.Dispose (); } } /// /// Asynchronously gets a substream of the specified message. /// /// /// Fetches a substream of the message. If the starting offset is beyond /// the end of the message, an empty stream is returned. If the number of /// bytes desired extends beyond the end of the message, a truncated stream /// will be returned. /// /// The stream. /// The index of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetStreamAsync (int index, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!TryQueueGetStreamCommand (index, offset, count, cancellationToken, progress, out var ic, out var ctx)) return new MemoryStream (); try { await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetStreamResponse (ic, ctx, index); } finally { ctx.Dispose (); } } ImapCommand QueueGetStreamCommand (UniqueId uid, string section, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (section == null) throw new ArgumentNullException (nameof (section)); CheckState (true, false); var command = string.Format ("UID FETCH {0} (BODY.PEEK[{1}])\r\n", uid, section); var ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } Stream ProcessGetStreamResponse (ImapCommand ic, FetchStreamContext ctx, UniqueId uid, string section) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (uid, section, out var s, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested stream."); return s.Stream; } /// /// Get a substream of the specified body part. /// /// /// Gets a substream of the specified message. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// /// /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Stream GetStream (UniqueId uid, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetStreamCommand (uid, section, cancellationToken, progress, out var ctx); try { Engine.Run (ic); return ProcessGetStreamResponse (ic, ctx, uid, section); } finally { ctx.Dispose (); } } /// /// Asynchronously gets a substream of the specified body part. /// /// /// Gets a substream of the specified message. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// /// /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetStreamAsync (UniqueId uid, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetStreamCommand (uid, section, cancellationToken, progress, out var ctx); try { await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetStreamResponse (ic, ctx, uid, section); } finally { ctx.Dispose (); } } bool TryQueueGetStreamCommand (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken, ITransferProgress? progress, [NotNullWhen (true)] out ImapCommand? ic, [NotNullWhen (true)] out FetchStreamContext? ctx) { if (!uid.IsValid) throw new ArgumentException ("The uid is invalid.", nameof (uid)); if (section == null) throw new ArgumentNullException (nameof (section)); if (offset < 0) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0) throw new ArgumentOutOfRangeException (nameof (count)); CheckState (true, false); if (count == 0) { ctx = null; ic = null; return false; } var range = string.Format (CultureInfo.InvariantCulture, "{0}.{1}", offset, count); var command = string.Format ("UID FETCH {0} (BODY.PEEK[{1}]<{2}>)\r\n", uid, section, range); ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return true; } /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. If the starting offset is beyond /// the end of the specified section of the message, an empty stream is returned. If /// the number of bytes desired extends beyond the end of the section, a truncated /// stream will be returned. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Stream GetStream (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!TryQueueGetStreamCommand (uid, section, offset, count, cancellationToken, progress, out var ic, out var ctx)) return new MemoryStream (); try { Engine.Run (ic); return ProcessGetStreamResponse (ic, ctx, uid, section); } finally { ctx.Dispose (); } } /// /// Asynchronously gets a substream of the specified message. /// /// /// Gets a substream of the specified message. If the starting offset is beyond /// the end of the specified section of the message, an empty stream is returned. If /// the number of bytes desired extends beyond the end of the section, a truncated /// stream will be returned. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The stream. /// The UID of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is invalid. /// /// /// is . /// /// /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetStreamAsync (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!TryQueueGetStreamCommand (uid, section, offset, count, cancellationToken, progress, out var ic, out var ctx)) return new MemoryStream (); try { await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetStreamResponse (ic, ctx, uid, section); } finally { ctx.Dispose (); } } ImapCommand QueueGetStreamCommand (int index, string section, CancellationToken cancellationToken, ITransferProgress? progress, out FetchStreamContext ctx) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (section == null) throw new ArgumentNullException (nameof (section)); CheckState (true, false); var seqid = (index + 1).ToString (CultureInfo.InvariantCulture); var command = string.Format ("FETCH {0} (BODY.PEEK[{1}])\r\n", seqid, section); var ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return ic; } Stream ProcessGetStreamResponse (ImapCommand ic, FetchStreamContext ctx, int index, string section) { ProcessFetchResponse (ic); if (!ctx.TryGetSection (index, section, out var sect, true)) throw new MessageNotFoundException ("The IMAP server did not return the requested stream."); return sect.Stream; } /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Stream GetStream (int index, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetStreamCommand (index, section, cancellationToken, progress, out var ctx); try { Engine.Run (ic); return ProcessGetStreamResponse (ic, ctx, index, section); } finally { ctx.Dispose (); } } /// /// Asynchronously gets a substream of the specified message. /// /// /// Gets a substream of the specified message. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetStreamAsync (int index, string section, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var ic = QueueGetStreamCommand (index, section, cancellationToken, progress, out var ctx); try { await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetStreamResponse (ic, ctx, index, section); } finally { ctx.Dispose (); } } bool TryQueueGetStreamCommand (int index, string section, int offset, int count, CancellationToken cancellationToken, ITransferProgress? progress, [NotNullWhen (true)] out ImapCommand? ic, [NotNullWhen (true)] out FetchStreamContext? ctx) { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (section == null) throw new ArgumentNullException (nameof (section)); if (offset < 0) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0) throw new ArgumentOutOfRangeException (nameof (count)); CheckState (true, false); if (count == 0) { ctx = null; ic = null; return false; } var seqid = (index + 1).ToString (CultureInfo.InvariantCulture); var range = string.Format (CultureInfo.InvariantCulture, "{0}.{1}", offset, count); var command = string.Format ("FETCH {0} (BODY.PEEK[{1}]<{2}>)\r\n", seqid, section, range); ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx = new FetchStreamContext (progress); Engine.QueueCommand (ic); return true; } /// /// Get a substream of the specified message. /// /// /// Gets a substream of the specified message. If the starting offset is beyond /// the end of the specified section of the message, an empty stream is returned. If /// the number of bytes desired extends beyond the end of the section, a truncated /// stream will be returned. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Stream GetStream (int index, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!TryQueueGetStreamCommand (index, section, offset, count, cancellationToken, progress, out var ic, out var ctx)) return new MemoryStream (); try { Engine.Run (ic); return ProcessGetStreamResponse (ic, ctx, index, section); } finally { ctx.Dispose (); } } /// /// Asynchronously gets a substream of the specified message. /// /// /// Gets a substream of the specified message. If the starting offset is beyond /// the end of the specified section of the message, an empty stream is returned. If /// the number of bytes desired extends beyond the end of the section, a truncated /// stream will be returned. /// For more information about how to construct the , /// see RFC3501, Section 6.4.5. /// /// The stream. /// The index of the message. /// The desired section of the message. /// The starting offset of the first desired byte. /// The number of bytes desired. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// is out of range. /// -or- /// is negative. /// -or- /// is negative. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The IMAP server did not return the requested message stream. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task GetStreamAsync (int index, string section, int offset, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!TryQueueGetStreamCommand (index, section, offset, count, cancellationToken, progress, out var ic, out var ctx)) return new MemoryStream (); try { await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessGetStreamResponse (ic, ctx, index, section); } finally { ctx.Dispose (); } } class FetchStreamCallbackContext : FetchStreamContextBase { readonly ImapFolder folder; readonly object callback; public FetchStreamCallbackContext (ImapFolder folder, object callback, ITransferProgress? progress) : base (progress) { this.folder = folder; this.callback = callback; } void InvokeCallback (ImapFolder folder, int index, UniqueId uid, Stream stream, CancellationToken cancellationToken) { ((ImapFetchStreamCallback) callback) (folder, index, uid, stream); } Task InvokeCallbackAsync (ImapFolder folder, int index, UniqueId uid, Stream stream, CancellationToken cancellationToken) { return ((ImapFetchStreamAsyncCallback) callback) (folder, index, uid, stream, cancellationToken); } public override void Add (Section section, CancellationToken cancellationToken) { if (section.UniqueId.HasValue) { InvokeCallback (folder, section.Index, section.UniqueId.Value, section.Stream, cancellationToken); section.Stream.Dispose (); } else { Sections.Add (section); } } public override async Task AddAsync (Section section, CancellationToken cancellationToken) { if (section.UniqueId.HasValue) { await InvokeCallbackAsync (folder, section.Index, section.UniqueId.Value, section.Stream, cancellationToken).ConfigureAwait (false); section.Stream.Dispose (); } else { Sections.Add (section); } } public override void SetUniqueId (int index, UniqueId uid, CancellationToken cancellationToken) { for (int i = 0; i < Sections.Count; i++) { if (Sections[i].Index == index) { InvokeCallback (folder, index, uid, Sections[i].Stream, cancellationToken); Sections[i].Stream.Dispose (); Sections.RemoveAt (i); break; } } } public override async Task SetUniqueIdAsync (int index, UniqueId uid, CancellationToken cancellationToken) { for (int i = 0; i < Sections.Count; i++) { if (Sections[i].Index == index) { await InvokeCallbackAsync (folder, index, uid, Sections[i].Stream, cancellationToken).ConfigureAwait (false); Sections[i].Stream.Dispose (); Sections.RemoveAt (i); break; } } } } void ValidateArguments (IList uids, object callback) { if (uids == null) throw new ArgumentNullException (nameof (uids)); if (callback == null) throw new ArgumentNullException (nameof (callback)); CheckState (true, false); } IEnumerable QueueGetStreamsCommands (FetchStreamCallbackContext ctx, IList uids, object callback, CancellationToken cancellationToken) { foreach (var ic in Engine.CreateCommands (cancellationToken, this, "UID FETCH %s (BODY.PEEK[])\r\n", uids)) { ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx; Engine.QueueCommand (ic); yield return ic; } } /// /// Get the streams for the specified messages. /// /// /// Gets the streams for the specified messages. /// /// The uids of the messages. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual void GetStreams (IList uids, ImapFetchStreamCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { ValidateArguments (uids, callback); if (uids.Count == 0) return; using (var ctx = new FetchStreamCallbackContext (this, callback, progress)) { foreach (var ic in QueueGetStreamsCommands (ctx, uids, callback, cancellationToken)) { Engine.Run (ic); ProcessFetchResponse (ic); } } } /// /// Asynchronously get the streams for the specified messages. /// /// /// Asynchronously gets the streams for the specified messages. /// /// An awaitable task. /// The uids of the messages. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task GetStreamsAsync (IList uids, ImapFetchStreamAsyncCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { ValidateArguments (uids, callback); if (uids.Count == 0) return; using (var ctx = new FetchStreamCallbackContext (this, callback, progress)) { foreach (var ic in QueueGetStreamsCommands (ctx, uids, callback, cancellationToken)) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessFetchResponse (ic); } } } void ValidateArguments (IList indexes, object callback) { if (indexes == null) throw new ArgumentNullException (nameof (indexes)); if (callback == null) throw new ArgumentNullException (nameof (callback)); CheckState (true, false); CheckAllowIndexes (); } ImapCommand QueueGetStreamsCommand (FetchStreamCallbackContext ctx, IList indexes, CancellationToken cancellationToken) { var command = new StringBuilder ("FETCH "); ImapUtils.FormatIndexSet (Engine, command, indexes); command.Append (" (UID BODY.PEEK[])\r\n"); var ic = new ImapCommand (Engine, cancellationToken, this, command.ToString ()); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx; Engine.QueueCommand (ic); return ic; } /// /// Get the streams for the specified messages. /// /// /// Gets the streams for the specified messages. /// /// The indexes of the messages. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual void GetStreams (IList indexes, ImapFetchStreamCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { ValidateArguments (indexes, callback); if (indexes.Count == 0) return; using (var ctx = new FetchStreamCallbackContext (this, callback, progress)) { var ic = QueueGetStreamsCommand (ctx, indexes, cancellationToken); Engine.Run (ic); ProcessFetchResponse (ic); } } /// /// Asynchronously get the streams for the specified messages. /// /// /// Asynchronously gets the streams for the specified messages. /// /// An awaitable task. /// The indexes of the messages. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task GetStreamsAsync (IList indexes, ImapFetchStreamAsyncCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { ValidateArguments (indexes, callback); if (indexes.Count == 0) return; using (var ctx = new FetchStreamCallbackContext (this, callback, progress)) { var ic = QueueGetStreamsCommand (ctx, indexes, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessFetchResponse (ic); } } void ValidateArguments (int min, int max, object callback) { if (min < 0) throw new ArgumentOutOfRangeException (nameof (min)); if (max != -1 && max < min) throw new ArgumentOutOfRangeException (nameof (max)); if (callback == null) throw new ArgumentNullException (nameof (callback)); CheckState (true, false); CheckAllowIndexes (); } ImapCommand QueueGetStreamsCommand (FetchStreamCallbackContext ctx, int min, int max, CancellationToken cancellationToken) { var command = string.Format ("FETCH {0} (UID BODY.PEEK[])\r\n", GetFetchRange (min, max)); var ic = new ImapCommand (Engine, cancellationToken, this, command); ic.RegisterUntaggedHandler ("FETCH", FetchStreamHandler); ic.UserData = ctx; Engine.QueueCommand (ic); return ic; } /// /// Get the streams for the specified messages. /// /// /// Gets the streams for the specified messages. /// /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual void GetStreams (int min, int max, ImapFetchStreamCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { ValidateArguments (min, max, callback); if (min == Count) return; using (var ctx = new FetchStreamCallbackContext (this, callback, progress)) { var ic = QueueGetStreamsCommand (ctx, min, max, cancellationToken); Engine.Run (ic); ProcessFetchResponse (ic); } } /// /// Asynchronously get the streams for the specified messages. /// /// /// Asynchronously gets the streams for the specified messages. /// /// An awaitable task. /// The minimum index. /// The maximum index, or -1 to specify no upper bound. /// A callback method that gets called for each stream as it is received. /// The cancellation token. /// The progress reporting mechanism. /// /// is out of range. /// -or- /// is out of range. /// /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task GetStreamsAsync (int min, int max, ImapFetchStreamAsyncCallback callback, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { ValidateArguments (min, max, callback); if (min == Count) return; using (var ctx = new FetchStreamCallbackContext (this, callback, progress)) { var ic = QueueGetStreamsCommand (ctx, min, max, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessFetchResponse (ic); } } } } ================================================ FILE: MailKit/Net/Imap/ImapFolderFlags.cs ================================================ // // ImapFolderFlags.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using System.Text; using System.Threading; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace MailKit.Net.Imap { public partial class ImapFolder { static readonly IStoreFlagsRequest AddDeletedFlag = new StoreFlagsRequest (StoreAction.Add, MessageFlags.Deleted) { Silent = true }; static readonly IStoreFlagsRequest RemoveDeletedFlag = new StoreFlagsRequest (StoreAction.Remove, MessageFlags.Deleted) { Silent = true }; static void ProcessUnmodified (ImapCommand ic, ref UniqueIdSet? uids, ulong? modseq) { if (modseq.HasValue) { foreach (var rc in ic.RespCodes.OfType ()) { if (uids != null && rc.UidSet != null) uids.AddRange (rc.UidSet); else uids = rc.UidSet; } } } void ProcessStoreResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("STORE"); } static IList GetUnmodified (ImapCommand ic, ulong? modseq) { if (modseq.HasValue) { var rc = ic.RespCodes.OfType ().FirstOrDefault (); if (rc != null && rc.UidSet != null) { var unmodified = new int[rc.UidSet.Count]; for (int i = 0; i < unmodified.Length; i++) unmodified[i] = (int) (rc.UidSet[i].Id - 1); return unmodified; } } return Array.Empty (); } IEnumerable QueueStoreCommands (IList uids, IStoreFlagsRequest request, CancellationToken cancellationToken) { if (uids == null) throw new ArgumentNullException (nameof (uids)); if (request == null) throw new ArgumentNullException (nameof (request)); if (request.UnchangedSince.HasValue && !supportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); CheckState (true, true); if (uids.Count == 0) return Array.Empty (); int numKeywords = request.Keywords != null ? request.Keywords.Count : 0; string action; switch (request.Action) { case StoreAction.Add: if ((request.Flags & SettableFlags) == 0 && numKeywords == 0) return Array.Empty (); action = request.Silent ? "+FLAGS.SILENT" : "+FLAGS"; break; case StoreAction.Remove: if ((request.Flags & SettableFlags) == 0 && numKeywords == 0) return Array.Empty (); action = request.Silent ? "-FLAGS.SILENT" : "-FLAGS"; break; default: action = request.Silent ? "FLAGS.SILENT" : "FLAGS"; break; } var flaglist = ImapUtils.FormatFlagsList (request.Flags & PermanentFlags, request.Keywords != null ? request.Keywords.Count : 0); var keywordList = request.Keywords != null ? request.Keywords.ToArray () : Array.Empty (); var @params = string.Empty; if (request.UnchangedSince.HasValue) @params = string.Format (CultureInfo.InvariantCulture, " (UNCHANGEDSINCE {0})", request.UnchangedSince.Value); var command = string.Format ("UID STORE %s{0} {1} {2}\r\n", @params, action, flaglist); return Engine.QueueCommands (cancellationToken, this, command, uids, keywordList); } /// /// Store message flags and keywords for a set of messages. /// /// /// Updates the message flags and keywords for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The specified an value /// but the does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Store (IList uids, IStoreFlagsRequest request, CancellationToken cancellationToken = default) { UniqueIdSet? unmodified = null; foreach (var ic in QueueStoreCommands (uids, request, cancellationToken)) { Engine.Run (ic); ProcessStoreResponse (ic); ProcessUnmodified (ic, ref unmodified, request.UnchangedSince); } if (unmodified == null) return Array.Empty (); return unmodified; } /// /// Asynchronously store message flags and keywords for a set of messages. /// /// /// Asynchronously updates the message flags and keywords for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The specified an value /// but the does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> StoreAsync (IList uids, IStoreFlagsRequest request, CancellationToken cancellationToken = default) { UniqueIdSet? unmodified = null; foreach (var ic in QueueStoreCommands (uids, request, cancellationToken)) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStoreResponse (ic); ProcessUnmodified (ic, ref unmodified, request.UnchangedSince); } if (unmodified == null) return Array.Empty (); return unmodified; } bool TryQueueStoreCommand (IList indexes, IStoreFlagsRequest request, CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic) { if (indexes == null) throw new ArgumentNullException (nameof (indexes)); if (request == null) throw new ArgumentNullException (nameof (request)); if (request.UnchangedSince.HasValue && !supportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); CheckState (true, true); ic = null; if (indexes.Count == 0) return false; int numKeywords = request.Keywords != null ? request.Keywords.Count : 0; string action; switch (request.Action) { case StoreAction.Add: if ((request.Flags & SettableFlags) == 0 && numKeywords == 0) return false; action = request.Silent ? "+FLAGS.SILENT" : "+FLAGS"; break; case StoreAction.Remove: if ((request.Flags & SettableFlags) == 0 && numKeywords == 0) return false; action = request.Silent ? "-FLAGS.SILENT" : "-FLAGS"; break; default: action = request.Silent ? "FLAGS.SILENT" : "FLAGS"; break; } var keywordList = request.Keywords != null ? request.Keywords.ToArray () : Array.Empty (); var command = new StringBuilder ("STORE "); ImapUtils.FormatIndexSet (Engine, command, indexes); command.Append (' '); if (request.UnchangedSince.HasValue) { command.Append ("(UNCHANGEDSINCE "); command.Append (request.UnchangedSince.Value.ToString (CultureInfo.InvariantCulture)); command.Append (") "); } command.Append (action); command.Append (' '); ImapUtils.FormatFlagsList (command, request.Flags & PermanentFlags, request.Keywords != null ? request.Keywords.Count : 0); command.Append ("\r\n"); ic = Engine.QueueCommand (cancellationToken, this, command.ToString (), keywordList); return true; } /// /// Store message flags and keywords for a set of messages. /// /// /// Updates the message flags and keywords for a set of message. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The specified an value /// but the does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Store (IList indexes, IStoreFlagsRequest request, CancellationToken cancellationToken = default) { if (!TryQueueStoreCommand (indexes, request, cancellationToken, out var ic)) return Array.Empty (); Engine.Run (ic); ProcessStoreResponse (ic); return GetUnmodified (ic, request.UnchangedSince); } /// /// Asynchronously store message flags and keywords for a set of messages. /// /// /// Asynchronously updates the message flags and keywords for a set of messages. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The message flags and keywords to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The specified an value /// but the does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> StoreAsync (IList indexes, IStoreFlagsRequest request, CancellationToken cancellationToken = default) { if (!TryQueueStoreCommand (indexes, request, cancellationToken, out var ic)) return Array.Empty (); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStoreResponse (ic); return GetUnmodified (ic, request.UnchangedSince); } void AppendLabelList (StringBuilder command, ISet labels, List args) { command.Append ('('); if (labels != null) { int index = 0; foreach (var label in labels) { if (index > 0) command.Append (' '); index++; if (label == null) { command.Append ("NIL"); continue; } switch (label) { case "\\AllMail": case "\\Drafts": case "\\Important": case "\\Inbox": case "\\Spam": case "\\Sent": case "\\Starred": case "\\Trash": command.Append (label); break; default: command.Append ("%S"); args.Add (Engine.EncodeMailboxName (label)); break; } } } command.Append (')'); } IEnumerable QueueStoreCommands (IList uids, IStoreLabelsRequest request, CancellationToken cancellationToken) { if (uids == null) throw new ArgumentNullException (nameof (uids)); if (request == null) throw new ArgumentNullException (nameof (request)); if ((Engine.Capabilities & ImapCapabilities.GMailExt1) == 0) throw new NotSupportedException ("The IMAP server does not support the Google Mail extensions."); CheckState (true, true); if (uids.Count == 0) return Array.Empty (); string action; switch (request.Action) { case StoreAction.Add: if (request.Labels == null || request.Labels.Count == 0) return Array.Empty (); action = request.Silent ? "+X-GM-LABELS.SILENT" : "+X-GM-LABELS"; break; case StoreAction.Remove: if (request.Labels == null || request.Labels.Count == 0) return Array.Empty (); action = request.Silent ? "-X-GM-LABELS.SILENT" : "-X-GM-LABELS"; break; default: action = request.Silent ? "X-GM-LABELS.SILENT" : "X-GM-LABELS"; break; } var command = new StringBuilder ("UID STORE %s "); var args = new List (); if (request.UnchangedSince.HasValue) { command.Append ("(UNCHANGEDSINCE "); command.Append (request.UnchangedSince.Value.ToString (CultureInfo.InvariantCulture)); command.Append (") "); } command.Append (action); command.Append (' '); AppendLabelList (command, request.Labels, args); command.Append ("\r\n"); return Engine.QueueCommands (cancellationToken, this, command.ToString (), uids, args.ToArray ()); } /// /// Store GMail-style labels for a set of messages. /// /// /// Updates the GMail-style labels for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The GMail-style labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The specified an value /// but the does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Store (IList uids, IStoreLabelsRequest request, CancellationToken cancellationToken = default) { UniqueIdSet? unmodified = null; foreach (var ic in QueueStoreCommands (uids, request, cancellationToken)) { Engine.Run (ic); ProcessStoreResponse (ic); ProcessUnmodified (ic, ref unmodified, request.UnchangedSince); } if (unmodified == null) return Array.Empty (); return unmodified; } /// /// Asynchronously store GMail-style labels for a set of messages. /// /// /// Asynchronously updates the GMail-style labels for a set of messages. /// /// The UIDs of the messages that were not updated. /// The message UIDs. /// The GMail-style labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The specified an value /// but the does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> StoreAsync (IList uids, IStoreLabelsRequest request, CancellationToken cancellationToken = default) { UniqueIdSet? unmodified = null; foreach (var ic in QueueStoreCommands (uids, request, cancellationToken)) { await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStoreResponse (ic); ProcessUnmodified (ic, ref unmodified, request.UnchangedSince); } if (unmodified == null) return Array.Empty (); return unmodified; } bool TryQueueStoreCommand (IList indexes, IStoreLabelsRequest request, CancellationToken cancellationToken, [NotNullWhen (true)] out ImapCommand? ic) { if (indexes == null) throw new ArgumentNullException (nameof (indexes)); if (request == null) throw new ArgumentNullException (nameof (request)); if ((Engine.Capabilities & ImapCapabilities.GMailExt1) == 0) throw new NotSupportedException ("The IMAP server does not support the Google Mail extensions."); CheckState (true, true); ic = null; if (indexes.Count == 0) return false; string action; switch (request.Action) { case StoreAction.Add: if (request.Labels == null || request.Labels.Count == 0) return false; action = request.Silent ? "+X-GM-LABELS.SILENT" : "+X-GM-LABELS"; break; case StoreAction.Remove: if (request.Labels == null || request.Labels.Count == 0) return false; action = request.Silent ? "-X-GM-LABELS.SILENT" : "-X-GM-LABELS"; break; default: action = request.Silent ? "X-GM-LABELS.SILENT" : "X-GM-LABELS"; break; } var command = new StringBuilder ("STORE "); var args = new List (); ImapUtils.FormatIndexSet (Engine, command, indexes); command.Append (' '); if (request.UnchangedSince.HasValue) { command.Append ("(UNCHANGEDSINCE "); command.Append (request.UnchangedSince.Value.ToString (CultureInfo.InvariantCulture)); command.Append (") "); } command.Append (action); command.Append (' '); AppendLabelList (command, request.Labels, args); command.Append ("\r\n"); ic = Engine.QueueCommand (cancellationToken, this, command.ToString (), args.ToArray ()); return true; } /// /// Store GMail-style labels for a set of messages. /// /// /// Updates the GMail-style labels for a set of message. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The GMail-style labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The specified an value /// but the does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Store (IList indexes, IStoreLabelsRequest request, CancellationToken cancellationToken = default) { if (!TryQueueStoreCommand (indexes, request, cancellationToken, out var ic)) return Array.Empty (); Engine.Run (ic); ProcessStoreResponse (ic); return GetUnmodified (ic, request.UnchangedSince); } /// /// Asynchronously store GMail-style labels for a set of messages. /// /// /// Asynchronously updates the GMail-style labels for a set of messages. /// /// The indexes of the messages that were not updated. /// The message indexes. /// The GMail-style labels to store. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// One or more of the is invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open in read-write mode. /// /// /// The specified an value /// but the does not support mod-sequences. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override async Task> StoreAsync (IList indexes, IStoreLabelsRequest request, CancellationToken cancellationToken = default) { if (!TryQueueStoreCommand (indexes, request, cancellationToken, out var ic)) return Array.Empty (); await Engine.RunAsync (ic).ConfigureAwait (false); ProcessStoreResponse (ic); return GetUnmodified (ic, request.UnchangedSince); } } } ================================================ FILE: MailKit/Net/Imap/ImapFolderSearch.cs ================================================ // // ImapFolderSearch.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using System.Text; using System.Threading; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using MailKit.Search; namespace MailKit.Net.Imap { public partial class ImapFolder { static bool IsAscii (string text) { for (int i = 0; i < text.Length; i++) { if (text[i] > 127) return false; } return true; } static string FormatDateTime (DateTime date) { return date.ToString ("d-MMM-yyyy", CultureInfo.InvariantCulture); } bool IsBadCharset (ImapCommand ic, string? charset) { // Note: if `charset` is null, then the charset is actually US-ASCII... return ic.Response == ImapCommandResponse.No && ic.RespCodes.Any (rc => rc.Type == ImapResponseCodeType.BadCharset) && charset != null && !Engine.SupportedCharsets.Contains (charset); } void AddTextArgument (StringBuilder builder, List args, string text, ref string? charset) { if (IsAscii (text)) { builder.Append ("%S"); args.Add (text); return; } if (Engine.SupportedCharsets.Contains ("UTF-8")) { builder.Append ("%S"); charset = "UTF-8"; args.Add (text); return; } // force the text into US-ASCII... var buffer = new byte[text.Length]; for (int i = 0; i < text.Length; i++) buffer[i] = (byte) text[i]; builder.Append ("%L"); args.Add (buffer); } void AddKeywordArgument (StringBuilder builder, List args, string text, ref string? charset) { // Note: Technically, the IMAP RFC states that keywords are not allowed to start with '\', // but some non-rfc-compliant IMAP servers do it anyway, so we need to allow it here. // See https://github.com/jstedfast/MailKit/issues/1906 for details. int startIndex = text[0] == '\\' ? 1 : 0; bool isAtom = true; for (int i = startIndex; i < text.Length; i++) { if (!ImapCommand.IsAtom (text[i])) { isAtom = false; break; } } if (isAtom) { builder.Append ("%s"); args.Add (text); } else { AddTextArgument (builder, args, text, ref charset); } } void BuildQuery (StringBuilder builder, SearchQuery query, List args, bool parens, ref string? charset) { AnnotationSearchQuery annotation; NumericSearchQuery numeric; FilterSearchQuery filter; HeaderSearchQuery header; BinarySearchQuery binary; UnarySearchQuery unary; DateSearchQuery date; TextSearchQuery text; UidSearchQuery uid; switch (query.Term) { case SearchTerm.All: builder.Append ("ALL"); break; case SearchTerm.And: binary = (BinarySearchQuery) query; if (parens) builder.Append ('('); BuildQuery (builder, binary.Left, args, false, ref charset); builder.Append (' '); BuildQuery (builder, binary.Right, args, false, ref charset); if (parens) builder.Append (')'); break; case SearchTerm.Annotation: if ((Engine.Capabilities & ImapCapabilities.Annotate) == 0) throw new NotSupportedException ("The ANNOTATION search term is not supported by the IMAP server."); annotation = (AnnotationSearchQuery) query; builder.Append ("ANNOTATION "); builder.Append (annotation.Entry); builder.Append (' '); builder.Append (annotation.Attribute); builder.Append (" %S"); args.Add (annotation.Value); break; case SearchTerm.Answered: builder.Append ("ANSWERED"); break; case SearchTerm.BccContains: text = (TextSearchQuery) query; builder.Append ("BCC "); AddTextArgument (builder, args, text.Text, ref charset); break; case SearchTerm.BodyContains: text = (TextSearchQuery) query; builder.Append ("BODY "); AddTextArgument (builder, args, text.Text, ref charset); break; case SearchTerm.CcContains: text = (TextSearchQuery) query; builder.Append ("CC "); AddTextArgument (builder, args, text.Text, ref charset); break; case SearchTerm.Deleted: builder.Append ("DELETED"); break; case SearchTerm.DeliveredAfter: date = (DateSearchQuery) query; builder.Append ("SINCE "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.DeliveredBefore: date = (DateSearchQuery) query; builder.Append ("BEFORE "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.DeliveredOn: date = (DateSearchQuery) query; builder.Append ("ON "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.Draft: builder.Append ("DRAFT"); break; case SearchTerm.Filter: if ((Engine.Capabilities & ImapCapabilities.Filters) == 0) throw new NotSupportedException ("The FILTER search term is not supported by the IMAP server."); filter = (FilterSearchQuery) query; builder.Append ("FILTER %S"); args.Add (filter.Name); break; case SearchTerm.Flagged: builder.Append ("FLAGGED"); break; case SearchTerm.FromContains: text = (TextSearchQuery) query; builder.Append ("FROM "); AddTextArgument (builder, args, text.Text, ref charset); break; case SearchTerm.Fuzzy: if ((Engine.Capabilities & ImapCapabilities.FuzzySearch) == 0) throw new NotSupportedException ("The FUZZY search term is not supported by the IMAP server."); builder.Append ("FUZZY "); unary = (UnarySearchQuery) query; BuildQuery (builder, unary.Operand, args, true, ref charset); break; case SearchTerm.HeaderContains: header = (HeaderSearchQuery) query; builder.Append ("HEADER "); builder.Append (header.Field); builder.Append (' '); AddTextArgument (builder, args, header.Value, ref charset); break; case SearchTerm.Keyword: text = (TextSearchQuery) query; builder.Append ("KEYWORD "); AddKeywordArgument (builder, args, text.Text, ref charset); break; case SearchTerm.LargerThan: numeric = (NumericSearchQuery) query; builder.Append ("LARGER "); builder.Append (numeric.Value.ToString (CultureInfo.InvariantCulture)); break; case SearchTerm.MessageContains: text = (TextSearchQuery) query; builder.Append ("TEXT "); AddTextArgument (builder, args, text.Text, ref charset); break; case SearchTerm.ModSeq: numeric = (NumericSearchQuery) query; builder.Append ("MODSEQ "); builder.Append (numeric.Value.ToString (CultureInfo.InvariantCulture)); break; case SearchTerm.New: builder.Append ("NEW"); break; case SearchTerm.Not: builder.Append ("NOT "); unary = (UnarySearchQuery) query; BuildQuery (builder, unary.Operand, args, true, ref charset); break; case SearchTerm.NotAnswered: builder.Append ("UNANSWERED"); break; case SearchTerm.NotDeleted: builder.Append ("UNDELETED"); break; case SearchTerm.NotDraft: builder.Append ("UNDRAFT"); break; case SearchTerm.NotFlagged: builder.Append ("UNFLAGGED"); break; case SearchTerm.NotKeyword: text = (TextSearchQuery) query; builder.Append ("UNKEYWORD "); AddKeywordArgument (builder, args, text.Text, ref charset); break; case SearchTerm.NotRecent: builder.Append ("OLD"); break; case SearchTerm.NotSeen: builder.Append ("UNSEEN"); break; case SearchTerm.Older: if ((Engine.Capabilities & ImapCapabilities.Within) == 0) throw new NotSupportedException ("The OLDER search term is not supported by the IMAP server."); numeric = (NumericSearchQuery) query; builder.Append ("OLDER "); builder.Append (numeric.Value.ToString (CultureInfo.InvariantCulture)); break; case SearchTerm.Or: builder.Append ("OR "); binary = (BinarySearchQuery) query; BuildQuery (builder, binary.Left, args, true, ref charset); builder.Append (' '); BuildQuery (builder, binary.Right, args, true, ref charset); break; case SearchTerm.Recent: builder.Append ("RECENT"); break; case SearchTerm.SaveDateSupported: if ((Engine.Capabilities & ImapCapabilities.SaveDate) == 0) throw new NotSupportedException ("The SAVEDATESUPPORTED search term is not supported by the IMAP server."); builder.Append ("SAVEDATESUPPORTED"); break; case SearchTerm.SavedBefore: if ((Engine.Capabilities & ImapCapabilities.SaveDate) == 0) throw new NotSupportedException ("The SAVEDBEFORE search term is not supported by the IMAP server."); date = (DateSearchQuery) query; builder.Append ("SAVEDBEFORE "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.SavedOn: if ((Engine.Capabilities & ImapCapabilities.SaveDate) == 0) throw new NotSupportedException ("The SAVEDON search term is not supported by the IMAP server."); date = (DateSearchQuery) query; builder.Append ("SAVEDON "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.SavedSince: if ((Engine.Capabilities & ImapCapabilities.SaveDate) == 0) throw new NotSupportedException ("The SAVEDSINCE search term is not supported by the IMAP server."); date = (DateSearchQuery) query; builder.Append ("SAVEDSINCE "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.Seen: builder.Append ("SEEN"); break; case SearchTerm.SentBefore: date = (DateSearchQuery) query; builder.Append ("SENTBEFORE "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.SentOn: date = (DateSearchQuery) query; builder.Append ("SENTON "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.SentSince: date = (DateSearchQuery) query; builder.Append ("SENTSINCE "); builder.Append (FormatDateTime (date.Date)); break; case SearchTerm.SmallerThan: numeric = (NumericSearchQuery) query; builder.Append ("SMALLER "); builder.Append (numeric.Value.ToString (CultureInfo.InvariantCulture)); break; case SearchTerm.SubjectContains: text = (TextSearchQuery) query; builder.Append ("SUBJECT "); AddTextArgument (builder, args, text.Text, ref charset); break; case SearchTerm.ToContains: text = (TextSearchQuery) query; builder.Append ("TO "); AddTextArgument (builder, args, text.Text, ref charset); break; case SearchTerm.Uid: uid = (UidSearchQuery) query; builder.Append ("UID "); builder.Append (UniqueIdSet.ToString (uid.Uids)); break; case SearchTerm.Younger: if ((Engine.Capabilities & ImapCapabilities.Within) == 0) throw new NotSupportedException ("The YOUNGER search term is not supported by the IMAP server."); numeric = (NumericSearchQuery) query; builder.Append ("YOUNGER "); builder.Append (numeric.Value.ToString (CultureInfo.InvariantCulture)); break; case SearchTerm.GMailMessageId: if ((Engine.Capabilities & ImapCapabilities.GMailExt1) == 0) throw new NotSupportedException ("The X-GM-MSGID search term is not supported by the IMAP server."); numeric = (NumericSearchQuery) query; builder.Append ("X-GM-MSGID "); builder.Append (numeric.Value.ToString (CultureInfo.InvariantCulture)); break; case SearchTerm.GMailThreadId: if ((Engine.Capabilities & ImapCapabilities.GMailExt1) == 0) throw new NotSupportedException ("The X-GM-THRID search term is not supported by the IMAP server."); numeric = (NumericSearchQuery) query; builder.Append ("X-GM-THRID "); builder.Append (numeric.Value.ToString (CultureInfo.InvariantCulture)); break; case SearchTerm.GMailLabels: if ((Engine.Capabilities & ImapCapabilities.GMailExt1) == 0) throw new NotSupportedException ("The X-GM-LABELS search term is not supported by the IMAP server."); text = (TextSearchQuery) query; builder.Append ("X-GM-LABELS "); AddTextArgument (builder, args, text.Text, ref charset); break; case SearchTerm.GMailRaw: if ((Engine.Capabilities & ImapCapabilities.GMailExt1) == 0) throw new NotSupportedException ("The X-GM-RAW search term is not supported by the IMAP server."); text = (TextSearchQuery) query; builder.Append ("X-GM-RAW "); AddTextArgument (builder, args, text.Text, ref charset); break; } } string BuildQueryExpression (SearchQuery query, List args, out string? charset) { var builder = new StringBuilder (); charset = null; BuildQuery (builder, query, args, false, ref charset); return builder.ToString (); } string BuildSortOrder (IList orderBy) { var builder = new StringBuilder (); builder.Append ('('); for (int i = 0; i < orderBy.Count; i++) { if (builder.Length > 1) builder.Append (' '); if (orderBy[i].Order == SortOrder.Descending) builder.Append ("REVERSE "); switch (orderBy[i].Type) { case OrderByType.Annotation: if ((Engine.Capabilities & ImapCapabilities.Annotate) == 0) throw new NotSupportedException ("The ANNOTATION search term is not supported by the IMAP server."); var annotation = (OrderByAnnotation) orderBy[i]; builder.Append ("ANNOTATION "); builder.Append (annotation.Entry); builder.Append (' '); builder.Append (annotation.Attribute); break; case OrderByType.Arrival: builder.Append ("ARRIVAL"); break; case OrderByType.Cc: builder.Append ("CC"); break; case OrderByType.Date: builder.Append ("DATE"); break; case OrderByType.DisplayFrom: if ((Engine.Capabilities & ImapCapabilities.SortDisplay) == 0) throw new NotSupportedException ("The IMAP server does not support the SORT=DISPLAY extension."); builder.Append ("DISPLAYFROM"); break; case OrderByType.DisplayTo: if ((Engine.Capabilities & ImapCapabilities.SortDisplay) == 0) throw new NotSupportedException ("The IMAP server does not support the SORT=DISPLAY extension."); builder.Append ("DISPLAYTO"); break; case OrderByType.From: builder.Append ("FROM"); break; case OrderByType.Size: builder.Append ("SIZE"); break; case OrderByType.Subject: builder.Append ("SUBJECT"); break; case OrderByType.To: builder.Append ("TO"); break; } } builder.Append (')'); return builder.ToString (); } static void ParseESearchResults (ImapEngine engine, ImapCommand ic, SearchResults results) { var token = engine.ReadToken (ic.CancellationToken); UniqueId? minValue = null, maxValue = null; var folder = ic.Folder!; bool hasCount = false; int parenDepth = 0; //bool uid = false; string atom, tag; if (token.Type == ImapTokenType.OpenParen) { // optional search correlator do { token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.CloseParen) break; ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); atom = (string) token.Value; if (atom == "TAG") { token = engine.ReadToken (ic.CancellationToken); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); tag = (string) token.Value; if (tag != ic.Tag) throw new ImapProtocolException ("Unexpected TAG value in untagged ESEARCH response: " + tag); } } while (true); token = engine.ReadToken (ic.CancellationToken); } if (token.Type == ImapTokenType.Atom && ((string) token.Value) == "UID") { token = engine.ReadToken (ic.CancellationToken); //uid = true; } do { if (token.Type == ImapTokenType.CloseParen) { if (parenDepth == 0) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); token = engine.ReadToken (ic.CancellationToken); parenDepth--; } if (token.Type == ImapTokenType.Eoln) { // unget the eoln token engine.UngetToken (token); break; } if (token.Type == ImapTokenType.OpenParen) { token = engine.ReadToken (ic.CancellationToken); parenDepth++; } ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); atom = (string) token.Value; token = engine.ReadToken (ic.CancellationToken); if (atom.Equals ("RELEVANCY", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); results.Relevancy = new List (); do { token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.CloseParen) break; var score = ImapEngine.ParseNumber (token, true, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); if (score > 100) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); results.Relevancy.Add ((byte) score); } while (true); } else if (atom.Equals ("MODSEQ", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); results.ModSeq = ImapEngine.ParseNumber64 (token, false, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else if (atom.Equals ("COUNT", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); var count = ImapEngine.ParseNumber (token, false, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Count = (int) count; hasCount = true; } else if (atom.Equals ("MIN", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); var min = ImapEngine.ParseNumber (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Min = new UniqueId (folder.UidValidity, min); } else if (atom.Equals ("MAX", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); var max = ImapEngine.ParseNumber (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Max = new UniqueId (folder.UidValidity, max); } else if (atom.Equals ("ALL", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); var uids = ImapEngine.ParseUidSet (token, folder.UidValidity, out minValue, out maxValue, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); if (!hasCount) results.Count = uids.Count; results.UniqueIds = uids; } else { throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); } token = engine.ReadToken (ic.CancellationToken); } while (true); if (!results.Min.HasValue) results.Min = minValue; if (!results.Max.HasValue) results.Max = maxValue; } static async Task ParseESearchResultsAsync (ImapEngine engine, ImapCommand ic, SearchResults results) { var token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); UniqueId? minValue = null, maxValue = null; var folder = ic.Folder!; bool hasCount = false; int parenDepth = 0; //bool uid = false; string atom, tag; if (token.Type == ImapTokenType.OpenParen) { // optional search correlator do { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); atom = (string) token.Value; if (atom == "TAG") { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); tag = (string) token.Value; if (tag != ic.Tag) throw new ImapProtocolException ("Unexpected TAG value in untagged ESEARCH response: " + tag); } } while (true); token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); } if (token.Type == ImapTokenType.Atom && ((string) token.Value) == "UID") { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); //uid = true; } do { if (token.Type == ImapTokenType.CloseParen) { if (parenDepth == 0) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); parenDepth--; } if (token.Type == ImapTokenType.Eoln) { // unget the eoln token engine.UngetToken (token); break; } if (token.Type == ImapTokenType.OpenParen) { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); parenDepth++; } ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); atom = (string) token.Value; token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (atom.Equals ("RELEVANCY", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); results.Relevancy = new List (); do { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; var score = ImapEngine.ParseNumber (token, true, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); if (score > 100) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); results.Relevancy.Add ((byte) score); } while (true); } else if (atom.Equals ("MODSEQ", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); results.ModSeq = ImapEngine.ParseNumber64 (token, false, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } else if (atom.Equals ("COUNT", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); var count = ImapEngine.ParseNumber (token, false, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Count = (int) count; hasCount = true; } else if (atom.Equals ("MIN", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); var min = ImapEngine.ParseNumber (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Min = new UniqueId (folder.UidValidity, min); } else if (atom.Equals ("MAX", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); var max = ImapEngine.ParseNumber (token, true, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Max = new UniqueId (folder.UidValidity, max); } else if (atom.Equals ("ALL", StringComparison.OrdinalIgnoreCase)) { ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); var uids = ImapEngine.ParseUidSet (token, folder.UidValidity, out minValue, out maxValue, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); if (!hasCount) results.Count = uids.Count; results.UniqueIds = uids; } else { throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); } token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); } while (true); if (!results.Min.HasValue) results.Min = minValue; if (!results.Max.HasValue) results.Max = maxValue; } static Task UntaggedESearchHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { var results = (SearchResults) ic.UserData!; if (doAsync) return ParseESearchResultsAsync (engine, ic, results); ParseESearchResults (engine, ic, results); return Task.CompletedTask; } static void ParseSearchResults (ImapEngine engine, ImapCommand ic, SearchResults results) { var folder = ic.Folder!; var uids = results.UniqueIds; uint min = uint.MaxValue; uint uid, max = 0; ImapToken token; do { token = engine.PeekToken (ic.CancellationToken); // keep reading UIDs until we get to the end of the line or until we get a "(MODSEQ ####)" if (token.Type == ImapTokenType.Eoln || token.Type == ImapTokenType.OpenParen) break; token = engine.ReadToken (ic.CancellationToken); uid = ImapEngine.ParseNumber (token, true, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "SEARCH", token); uids.Add (new UniqueId (folder.UidValidity, uid)); min = Math.Min (min, uid); max = Math.Max (max, uid); } while (true); if (token.Type == ImapTokenType.OpenParen) { engine.ReadToken (ic.CancellationToken); do { token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.CloseParen) break; ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "SEARCH", token); var atom = (string) token.Value; if (atom.Equals ("MODSEQ", StringComparison.OrdinalIgnoreCase)) { token = engine.ReadToken (ic.CancellationToken); results.ModSeq = ImapEngine.ParseNumber64 (token, false, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } token = engine.PeekToken (ic.CancellationToken); } while (token.Type != ImapTokenType.Eoln); } results.UniqueIds = uids; results.Count = uids.Count; if (uids.Count > 0) { results.Min = new UniqueId (folder.UidValidity, min); results.Max = new UniqueId (folder.UidValidity, max); } } static async Task ParseSearchResultsAsync (ImapEngine engine, ImapCommand ic, SearchResults results) { var folder = ic.Folder!; var uids = results.UniqueIds; uint min = uint.MaxValue; uint uid, max = 0; ImapToken token; do { token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); // keep reading UIDs until we get to the end of the line or until we get a "(MODSEQ ####)" if (token.Type == ImapTokenType.Eoln || token.Type == ImapTokenType.OpenParen) break; token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); uid = ImapEngine.ParseNumber (token, true, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "SEARCH", token); uids.Add (new UniqueId (folder.UidValidity, uid)); min = Math.Min (min, uid); max = Math.Max (max, uid); } while (true); if (token.Type == ImapTokenType.OpenParen) { await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); do { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "SEARCH", token); var atom = (string) token.Value; if (atom.Equals ("MODSEQ", StringComparison.OrdinalIgnoreCase)) { token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); results.ModSeq = ImapEngine.ParseNumber64 (token, false, ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); } while (token.Type != ImapTokenType.Eoln); } results.UniqueIds = uids; results.Count = uids.Count; if (uids.Count > 0) { results.Min = new UniqueId (folder.UidValidity, min); results.Max = new UniqueId (folder.UidValidity, max); } } static Task UntaggedSearchHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { var results = (SearchResults) ic.UserData!; if (doAsync) return ParseSearchResultsAsync (engine, ic, results); ParseSearchResults (engine, ic, results); return Task.CompletedTask; } ImapCommand QueueSearchCommand (string query, CancellationToken cancellationToken) { if (query == null) throw new ArgumentNullException (nameof (query)); query = query.Trim (); if (query.Length == 0) throw new ArgumentException ("Cannot search using an empty query.", nameof (query)); CheckState (true, false); var command = "UID SEARCH " + query + "\r\n"; var ic = new ImapCommand (Engine, cancellationToken, this, command); if ((Engine.Capabilities & ImapCapabilities.ESearch) != 0) ic.RegisterUntaggedHandler ("ESEARCH", UntaggedESearchHandler); // Note: always register the untagged SEARCH handler because some servers will brokenly // respond with "* SEARCH ..." instead of "* ESEARCH ..." even when using the extended // search syntax. ic.RegisterUntaggedHandler ("SEARCH", UntaggedSearchHandler); ic.UserData = new SearchResults (UidValidity, SortOrder.Ascending); Engine.QueueCommand (ic); return ic; } SearchResults ProcessSearchResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("SEARCH"); return (SearchResults) ic.UserData!; } /// /// Search the folder for messages matching the specified query. /// /// /// Sends a UID SEARCH command with the specified query passed directly to the IMAP server /// with no interpretation by MailKit. This means that the query may contain any arguments that a /// UID SEARCH command is allowed to have according to the IMAP specifications and any /// extensions that are supported, including RETURN parameters. /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual SearchResults Search (string query, CancellationToken cancellationToken = default) { var ic = QueueSearchCommand (query, cancellationToken); Engine.Run (ic); return ProcessSearchResponse (ic); } /// /// Asynchronously search the folder for messages matching the specified query. /// /// /// Sends a UID SEARCH command with the specified query passed directly to the IMAP server /// with no interpretation by MailKit. This means that the query may contain any arguments that a /// UID SEARCH command is allowed to have according to the IMAP specifications and any /// extensions that are supported, including RETURN parameters. /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task SearchAsync (string query, CancellationToken cancellationToken = default) { var ic = QueueSearchCommand (query, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessSearchResponse (ic); } ImapCommand QueueSearchCommand (SearchOptions options, SearchQuery query, CancellationToken cancellationToken, out string? charset) { if (query == null) throw new ArgumentNullException (nameof (query)); CheckState (true, false); if (options != SearchOptions.None && (Engine.Capabilities & ImapCapabilities.ESearch) == 0) throw new NotSupportedException ("The IMAP server does not support the ESEARCH extension."); var args = new List (); var optimized = query.Optimize (new ImapSearchQueryOptimizer ()); var expr = BuildQueryExpression (optimized, args, out charset); var command = "UID SEARCH "; if ((Engine.Capabilities & ImapCapabilities.ESearch) != 0) { command += "RETURN ("; if (options != SearchOptions.All && options != SearchOptions.None) { if ((options & SearchOptions.All) != 0) command += "ALL "; if ((options & SearchOptions.Relevancy) != 0) command += "RELEVANCY "; if ((options & SearchOptions.Count) != 0) command += "COUNT "; if ((options & SearchOptions.Min) != 0) command += "MIN "; if ((options & SearchOptions.Max) != 0) command += "MAX "; command = command.TrimEnd (); } else { command += "ALL"; } command += ") "; } if (charset != null && args.Count > 0 && !Engine.UTF8Enabled) command += "CHARSET " + charset + " "; command += expr + "\r\n"; var ic = new ImapCommand (Engine, cancellationToken, this, command, args.ToArray ()) { UserData = new SearchResults (UidValidity, SortOrder.Ascending) }; if ((Engine.Capabilities & ImapCapabilities.ESearch) != 0) ic.RegisterUntaggedHandler ("ESEARCH", UntaggedESearchHandler); // Note: always register the untagged SEARCH handler because some servers will brokenly // respond with "* SEARCH ..." instead of "* ESEARCH ..." even when using the extended // search syntax. ic.RegisterUntaggedHandler ("SEARCH", UntaggedSearchHandler); Engine.QueueCommand (ic); return ic; } bool TryProcessSearchResponse (ImapCommand ic, string? charset, bool retry, [NotNullWhen (true)] out SearchResults? results) { ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) { if (retry && IsBadCharset (ic, charset)) { results = null; return false; } throw ImapCommandException.Create ("SEARCH", ic); } results = (SearchResults) ic.UserData!; return true; } SearchResults Search (SearchOptions options, SearchQuery query, bool retry, CancellationToken cancellationToken) { var ic = QueueSearchCommand (options, query, cancellationToken, out string? charset); Engine.Run (ic); if (TryProcessSearchResponse (ic, charset, retry, out var results)) return results; return Search (options, query, false, cancellationToken); } /// /// Search the folder for messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The IMAP server does not support the ESEARCH extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override SearchResults Search (SearchOptions options, SearchQuery query, CancellationToken cancellationToken = default) { return Search (options, query, true, cancellationToken); } async Task SearchAsync (SearchOptions options, SearchQuery query, bool retry, CancellationToken cancellationToken) { var ic = QueueSearchCommand (options, query, cancellationToken, out string? charset); await Engine.RunAsync (ic).ConfigureAwait (false); if (TryProcessSearchResponse (ic, charset, retry, out var results)) return results; return await SearchAsync (options, query, false, cancellationToken).ConfigureAwait (false); } /// /// Asynchronously search the folder for messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, /// returning only the specified search results. /// /// The search results. /// The search options. /// The search query. /// The cancellation token. /// /// is . /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The IMAP server does not support the ESEARCH extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task SearchAsync (SearchOptions options, SearchQuery query, CancellationToken cancellationToken = default) { return SearchAsync (options, query, true, cancellationToken); } ImapCommand QueueSortCommand (string query, CancellationToken cancellationToken) { if (query == null) throw new ArgumentNullException (nameof (query)); query = query.Trim (); if (query.Length == 0) throw new ArgumentException ("Cannot sort using an empty query.", nameof (query)); if ((Engine.Capabilities & ImapCapabilities.Sort) == 0) throw new NotSupportedException ("The IMAP server does not support the SORT extension."); CheckState (true, false); var command = "UID SORT " + query + "\r\n"; var ic = new ImapCommand (Engine, cancellationToken, this, command); if ((Engine.Capabilities & ImapCapabilities.ESort) != 0) ic.RegisterUntaggedHandler ("ESEARCH", UntaggedESearchHandler); ic.RegisterUntaggedHandler ("SORT", UntaggedSearchHandler); ic.UserData = new SearchResults (UidValidity); Engine.QueueCommand (ic); return ic; } SearchResults ProcessSortResponse (ImapCommand ic) { ProcessResponseCodes (ic, null); ic.ThrowIfNotOk ("SORT"); return (SearchResults) ic.UserData!; } /// /// Sort messages matching the specified query. /// /// /// Sends a UID SORT command with the specified query passed directly to the IMAP server /// with no interpretation by MailKit. This means that the query may contain any arguments that a /// UID SORT command is allowed to have according to the IMAP specifications and any /// extensions that are supported, including RETURN parameters. /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The IMAP server does not support the SORT extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual SearchResults Sort (string query, CancellationToken cancellationToken = default) { var ic = QueueSortCommand (query, cancellationToken); Engine.Run (ic); return ProcessSortResponse (ic); } /// /// Asynchronously sort messages matching the specified query. /// /// /// Sends a UID SORT command with the specified query passed directly to the IMAP server /// with no interpretation by MailKit. This means that the query may contain any arguments that a /// UID SORT command is allowed to have according to the IMAP specifications and any /// extensions that are supported, including RETURN parameters. /// /// An array of matching UIDs. /// The search query. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The IMAP server does not support the SORT extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public virtual async Task SortAsync (string query, CancellationToken cancellationToken = default) { var ic = QueueSortCommand (query, cancellationToken); await Engine.RunAsync (ic).ConfigureAwait (false); return ProcessSortResponse (ic); } ImapCommand QueueSortCommand (SearchQuery query, IList orderBy, CancellationToken cancellationToken, out string? charset) { if (query == null) throw new ArgumentNullException (nameof (query)); if (orderBy == null) throw new ArgumentNullException (nameof (orderBy)); if (orderBy.Count == 0) throw new ArgumentException ("No sort order provided.", nameof (orderBy)); CheckState (true, false); if ((Engine.Capabilities & ImapCapabilities.Sort) == 0) throw new NotSupportedException ("The IMAP server does not support the SORT extension."); var args = new List (); var optimized = query.Optimize (new ImapSearchQueryOptimizer ()); var expr = BuildQueryExpression (optimized, args, out charset); var order = BuildSortOrder (orderBy); var command = "UID SORT "; if ((Engine.Capabilities & ImapCapabilities.ESort) != 0) command += "RETURN (ALL) "; command += order + " " + (charset ?? "US-ASCII") + " " + expr + "\r\n"; var ic = new ImapCommand (Engine, cancellationToken, this, command, args.ToArray ()) { UserData = new SearchResults (UidValidity) }; if ((Engine.Capabilities & ImapCapabilities.ESort) != 0) ic.RegisterUntaggedHandler ("ESEARCH", UntaggedESearchHandler); else ic.RegisterUntaggedHandler ("SORT", UntaggedSearchHandler); Engine.QueueCommand (ic); return ic; } bool TryProcessSortResponse (ImapCommand ic, string? charset, bool retry, [NotNullWhen (true)] out IList? results) { ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) { if (retry && IsBadCharset (ic, charset)) { results = null; return false; } throw ImapCommandException.Create ("SORT", ic); } results = ((SearchResults) ic.UserData!).UniqueIds; return true; } IList Sort (SearchQuery query, IList orderBy, bool retry, CancellationToken cancellationToken) { var ic = QueueSortCommand (query, orderBy, cancellationToken, out string? charset); Engine.Run (ic); if (TryProcessSortResponse (ic, charset, retry, out IList? results)) return results; return Sort (query, orderBy, false, cancellationToken); } /// /// Sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The server does not support the SORT extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Sort (SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { return Sort (query, orderBy, true, cancellationToken); } async Task> SortAsync (SearchQuery query, IList orderBy, bool retry, CancellationToken cancellationToken) { var ic = QueueSortCommand (query, orderBy, cancellationToken, out string? charset); await Engine.RunAsync (ic).ConfigureAwait (false); if (TryProcessSortResponse (ic, charset, retry, out IList? results)) return results; return await SortAsync (query, orderBy, false, cancellationToken).ConfigureAwait (false); } /// /// Asynchronously sort messages matching the specified query. /// /// /// The returned array of unique identifiers will be sorted in the preferred order and /// can be used with . /// /// An array of matching UIDs in the specified sort order. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The server does not support the SORT extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task> SortAsync (SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { return SortAsync (query, orderBy, true, cancellationToken); } ImapCommand QueueSortCommand (SearchOptions options, SearchQuery query, IList orderBy, CancellationToken cancellationToken, out string? charset) { if (query == null) throw new ArgumentNullException (nameof (query)); if (orderBy == null) throw new ArgumentNullException (nameof (orderBy)); if (orderBy.Count == 0) throw new ArgumentException ("No sort order provided.", nameof (orderBy)); CheckState (true, false); if (options != SearchOptions.None && (Engine.Capabilities & ImapCapabilities.ESort) == 0) throw new NotSupportedException ("The IMAP server does not support the ESORT extension."); var args = new List (); var optimized = query.Optimize (new ImapSearchQueryOptimizer ()); var expr = BuildQueryExpression (optimized, args, out charset); var order = BuildSortOrder (orderBy); var command = "UID SORT "; if ((Engine.Capabilities & ImapCapabilities.ESort) != 0) { command += "RETURN ("; if (options != SearchOptions.All && options != SearchOptions.None) { if ((options & SearchOptions.All) != 0) command += "ALL "; if ((options & SearchOptions.Relevancy) != 0) command += "RELEVANCY "; if ((options & SearchOptions.Count) != 0) command += "COUNT "; if ((options & SearchOptions.Min) != 0) command += "MIN "; if ((options & SearchOptions.Max) != 0) command += "MAX "; command = command.TrimEnd (); } else { command += "ALL"; } command += ") "; } command += order + " " + (charset ?? "US-ASCII") + " " + expr + "\r\n"; var ic = new ImapCommand (Engine, cancellationToken, this, command, args.ToArray ()) { UserData = new SearchResults (UidValidity) }; if ((Engine.Capabilities & ImapCapabilities.ESort) != 0) ic.RegisterUntaggedHandler ("ESEARCH", UntaggedESearchHandler); else ic.RegisterUntaggedHandler ("SORT", UntaggedSearchHandler); Engine.QueueCommand (ic); return ic; } bool TryProcessSortResponse (ImapCommand ic, string? charset, bool retry, [NotNullWhen (true)] out SearchResults? results) { ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) { if (retry && IsBadCharset (ic, charset)) { results = null; return false; } throw ImapCommandException.Create ("SORT", ic); } results = (SearchResults) ic.UserData!; return true; } SearchResults Sort (SearchOptions options, SearchQuery query, IList orderBy, bool retry, CancellationToken cancellationToken) { var ic = QueueSortCommand (options, query, orderBy, cancellationToken, out string? charset); Engine.Run (ic); if (TryProcessSortResponse (ic, charset, retry, out SearchResults? results)) return results; return Sort (options, query, orderBy, false, cancellationToken); } /// /// Sort messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The IMAP server does not support the ESORT extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override SearchResults Sort (SearchOptions options, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { return Sort (options, query, orderBy, true, cancellationToken); } async Task SortAsync (SearchOptions options, SearchQuery query, IList orderBy, bool retry, CancellationToken cancellationToken) { var ic = QueueSortCommand (options, query, orderBy, cancellationToken, out string? charset); await Engine.RunAsync (ic).ConfigureAwait (false); if (TryProcessSortResponse (ic, charset, retry, out SearchResults? results)) return results; return await SortAsync (options, query, orderBy, false, cancellationToken).ConfigureAwait (false); } /// /// Asynchronously sort messages matching the specified query. /// /// /// Searches the folder for messages matching the specified query, returning the search results in the specified sort order. /// /// The search results. /// The search options. /// The search query. /// The sort order. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is empty. /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The IMAP server does not support the ESORT extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task SortAsync (SearchOptions options, SearchQuery query, IList orderBy, CancellationToken cancellationToken = default) { return SortAsync (options, query, orderBy, true, cancellationToken); } ImapCommand QueueThreadCommand (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken, out string? charset) { if ((Engine.Capabilities & ImapCapabilities.Thread) == 0) throw new NotSupportedException ("The IMAP server does not support the THREAD extension."); if (!Engine.ThreadingAlgorithms.Contains (algorithm)) throw new ArgumentOutOfRangeException (nameof (algorithm), "The specified threading algorithm is not supported."); if (query == null) throw new ArgumentNullException (nameof (query)); CheckState (true, false); var method = algorithm.ToString ().ToUpperInvariant (); var args = new List (); var optimized = query.Optimize (new ImapSearchQueryOptimizer ()); var expr = BuildQueryExpression (optimized, args, out charset); var command = "UID THREAD " + method + " " + (charset ?? "US-ASCII") + " "; command += expr + "\r\n"; var ic = new ImapCommand (Engine, cancellationToken, this, command, args.ToArray ()); ic.RegisterUntaggedHandler ("THREAD", ImapUtils.UntaggedThreadHandler); Engine.QueueCommand (ic); return ic; } bool TryProcessThreadResponse (ImapCommand ic, string? charset, bool retry, [NotNullWhen (true)] out IList? threads) { ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) { if (retry && IsBadCharset (ic, charset)) { threads = null; return false; } throw ImapCommandException.Create ("THREAD", ic); } threads = (IList) ic.UserData! ?? Array.Empty (); return true; } IList Thread (ThreadingAlgorithm algorithm, SearchQuery query, bool retry, CancellationToken cancellationToken) { var ic = QueueThreadCommand (algorithm, query, cancellationToken, out string? charset); Engine.Run (ic); if (TryProcessThreadResponse (ic, charset, retry, out IList? threads)) return threads; return Thread (algorithm, query, false, cancellationToken); } /// /// Thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The server does not support the THREAD extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Thread (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default) { return Thread (algorithm, query, true, cancellationToken); } async Task> ThreadAsync (ThreadingAlgorithm algorithm, SearchQuery query, bool retry, CancellationToken cancellationToken) { var ic = QueueThreadCommand (algorithm, query, cancellationToken, out string? charset); await Engine.RunAsync (ic).ConfigureAwait (false); if (TryProcessThreadResponse (ic, charset, retry, out IList? threads)) return threads; return await ThreadAsync (algorithm, query, false, cancellationToken).ConfigureAwait (false); } /// /// Asynchronously thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The server does not support the THREAD extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task> ThreadAsync (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default) { return ThreadAsync (algorithm, query, true, cancellationToken); } ImapCommand? QueueThreadCommand (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken, out string? charset) { if (uids == null) throw new ArgumentNullException (nameof (uids)); if ((Engine.Capabilities & ImapCapabilities.Thread) == 0) throw new NotSupportedException ("The IMAP server does not support the THREAD extension."); if (!Engine.ThreadingAlgorithms.Contains (algorithm)) throw new ArgumentOutOfRangeException (nameof (algorithm), "The specified threading algorithm is not supported."); if (query == null) throw new ArgumentNullException (nameof (query)); CheckState (true, false); if (uids.Count == 0) { charset = null; return null; } var method = algorithm.ToString ().ToUpperInvariant (); var set = UniqueIdSet.ToString (uids); var args = new List (); var optimized = query.Optimize (new ImapSearchQueryOptimizer ()); var expr = BuildQueryExpression (optimized, args, out charset); var command = "UID THREAD " + method + " " + (charset ?? "US-ASCII") + " "; command += "UID " + set + " " + expr + "\r\n"; var ic = new ImapCommand (Engine, cancellationToken, this, command, args.ToArray ()); ic.RegisterUntaggedHandler ("THREAD", ImapUtils.UntaggedThreadHandler); Engine.QueueCommand (ic); return ic; } IList Thread (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, bool retry, CancellationToken cancellationToken) { var ic = QueueThreadCommand (uids, algorithm, query, cancellationToken, out string? charset); if (ic == null) return Array.Empty (); Engine.Run (ic); if (TryProcessThreadResponse (ic, charset!, retry, out IList? threads)) return threads; return Thread (uids, algorithm, query, false, cancellationToken); } /// /// Thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The subset of UIDs /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The server does not support the THREAD extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override IList Thread (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default) { return Thread (uids, algorithm, query, true, cancellationToken); } async Task> ThreadAsync (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, bool retry, CancellationToken cancellationToken) { var ic = QueueThreadCommand (uids, algorithm, query, cancellationToken, out string? charset); if (ic == null) return Array.Empty (); await Engine.RunAsync (ic).ConfigureAwait (false); if (TryProcessThreadResponse (ic, charset!, retry, out IList? threads)) return threads; return await ThreadAsync (uids, algorithm, query, false, cancellationToken).ConfigureAwait (false); } /// /// Asynchronously thread the messages in the folder that match the search query using the specified threading algorithm. /// /// /// The can be used with methods such as /// . /// /// An array of message threads. /// The subset of UIDs /// The threading algorithm to use. /// The search query. /// The cancellation token. /// /// is not supported. /// /// /// is . /// -or- /// is . /// /// /// is empty. /// -or- /// One or more of the is invalid. /// /// /// One or more search terms in the are not supported by the IMAP server. /// -or- /// The server does not support the THREAD extension. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The is not currently open. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The server's response contained unexpected tokens. /// /// /// The server replied with a NO or BAD response. /// public override Task> ThreadAsync (IList uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default) { return ThreadAsync (uids, algorithm, query, true, cancellationToken); } } } ================================================ FILE: MailKit/Net/Imap/ImapIdleContext.cs ================================================ // // ImapIdleContext.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Threading; using System.Threading.Tasks; namespace MailKit.Net.Imap { /// /// An IMAP IDLE context. /// /// /// An IMAP IDLE command does not work like normal commands. Unlike most commands, /// the IDLE command does not end until the client sends a separate "DONE" command. /// In order to facilitate this, the way this works is that the consumer of MailKit's /// IMAP APIs provides a 'doneToken' which signals to the command-processing loop to /// send the "DONE" command. Since, like every other IMAP command, it is also necessary to /// provide a means of cancelling the IDLE command, it becomes necessary to link the /// 'doneToken' and the 'cancellationToken' together. /// sealed class ImapIdleContext : IDisposable { static readonly byte[] DoneCommand = Encoding.ASCII.GetBytes ("DONE\r\n"); CancellationTokenRegistration registration; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The IMAP engine. /// The done token. /// The cancellation token. public ImapIdleContext (ImapEngine engine, CancellationToken doneToken, CancellationToken cancellationToken) { CancellationToken = cancellationToken; DoneToken = doneToken; Engine = engine; } /// /// Get the engine. /// /// /// Gets the engine. /// /// The engine. public ImapEngine Engine { get; private set; } /// /// Get the cancellation token. /// /// /// Get the cancellation token. /// /// The cancellation token. public CancellationToken CancellationToken { get; private set; } /// /// Get the done token. /// /// /// Gets the done token. /// /// The done token. public CancellationToken DoneToken { get; private set; } #if false /// /// Get whether or not cancellation has been requested. /// /// /// Gets whether or not cancellation has been requested. /// /// if cancellation has been requested; otherwise, . public bool IsCancellationRequested { get { return CancellationToken.IsCancellationRequested; } } /// /// Get whether or not the IDLE command should be ended. /// /// /// Gets whether or not the IDLE command should be ended. /// /// if the IDLE command should end; otherwise, . public bool IsDoneRequested { get { return DoneToken.IsCancellationRequested; } } #endif void IdleComplete () { if (Engine.IsIdle) { try { Engine.Stream.Write (DoneCommand, 0, DoneCommand.Length, CancellationToken); Engine.Stream.Flush (CancellationToken); } catch { return; } Engine.State = ImapEngineState.Selected; } } /// /// Callback method to be used as the ImapCommand's ContinuationHandler. /// /// /// Callback method to be used as the ImapCommand's ContinuationHandler. /// /// The ImapEngine. /// The ImapCommand. /// The text. /// if the command is being run asynchronously; otherwise, . /// public Task ContinuationHandler (ImapEngine engine, ImapCommand ic, string text, bool doAsync) { Engine.State = ImapEngineState.Idle; registration = DoneToken.Register (IdleComplete); return Task.CompletedTask; } /// /// Releases all resource used by the object. /// /// Call when you are finished using the . The /// method leaves the in an unusable state. After /// calling , you must release all references to the /// so the garbage collector can reclaim the memory that the /// was occupying. public void Dispose () { registration.Dispose (); } } } ================================================ FILE: MailKit/Net/Imap/ImapImplementation.cs ================================================ // // ImapImplementation.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections.Generic; namespace MailKit.Net.Imap { /// /// The details of an IMAP client or server implementation. /// /// /// Allows an IMAP client and server to share their implementation details /// with each other for the purposes of debugging. /// /// /// /// public class ImapImplementation { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// /// /// public ImapImplementation () { Properties = new Dictionary (); } string? GetProperty (string property) { Properties.TryGetValue (property, out var value); return value; } /// /// Get the identification properties. /// /// /// Gets the dictionary of raw identification properties. /// /// /// /// /// The properties. public Dictionary Properties { get; private set; } /// /// Get or set the name of the program. /// /// /// Gets or sets the name of the program. /// /// /// /// /// The program name. public string? Name { get { return GetProperty ("name"); } set { Properties["name"] = value; } } /// /// Get or set the version of the program. /// /// /// Gets or sets the version of the program. /// /// /// /// /// The program version. public string? Version { get { return GetProperty ("version"); } set { Properties["version"] = value; } } /// /// Get or set the name of the operating system. /// /// /// Gets or sets the name of the operating system. /// /// The name of the operation system. public string? OS { get { return GetProperty ("os"); } set { Properties["os"] = value; } } /// /// Get or set the version of the operating system. /// /// /// Gets or sets the version of the operating system. /// /// The version of the operation system. public string? OSVersion { get { return GetProperty ("os-version"); } set { Properties["os-version"] = value; } } /// /// Get or set the name of the vendor. /// /// /// Gets or sets the name of the vendor. /// /// The name of the vendor. public string? Vendor { get { return GetProperty ("vendor"); } set { Properties["vendor"] = value; } } /// /// Get or set the support URL. /// /// /// Gets or sets the support URL. /// /// The support URL. public string? SupportUrl { get { return GetProperty ("support-url"); } set { Properties["support-url"] = value; } } /// /// Get or set the postal address of the vendor. /// /// /// Gets or sets the postal address of the vendor. /// /// The postal address. public string? Address { get { return GetProperty ("address"); } set { Properties["address"] = value; } } /// /// Get or set the release date of the program. /// /// /// Gets or sets the release date of the program. /// /// The release date. public string? ReleaseDate { get { return GetProperty ("date"); } set { Properties["date"] = value; } } /// /// Get or set the command used to start the program. /// /// /// Gets or sets the command used to start the program. /// /// The command used to start the program. public string? Command { get { return GetProperty ("command"); } set { Properties["command"] = value; } } /// /// Get or set the command-line arguments used to start the program. /// /// /// Gets or sets the command-line arguments used to start the program. /// /// The command-line arguments used to start the program. public string? Arguments { get { return GetProperty ("arguments"); } set { Properties["arguments"] = value; } } /// /// Get or set the environment variables available to the program. /// /// /// Get or set the environment variables available to the program. /// /// The environment variables. public string? Environment { get { return GetProperty ("environment"); } set { Properties["environment"] = value; } } } } ================================================ FILE: MailKit/Net/Imap/ImapLiteral.cs ================================================ // // ImapLiteral.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Threading; using System.Threading.Tasks; using MimeKit; using MimeKit.IO; namespace MailKit.Net.Imap { enum ImapLiteralType { String, //Stream, MimeMessage } /// /// An IMAP literal object. /// /// /// The literal can be a string, byte[], Stream, or a MimeMessage. /// class ImapLiteral { public readonly ImapLiteralType Type; public readonly object Literal; readonly FormatOptions format; readonly Action update; static void DefaultUpdate (int value) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The formatting options. /// The message. /// The progress update action. public ImapLiteral (FormatOptions options, MimeMessage message, Action action) { format = options.Clone (); format.NewLineFormat = NewLineFormat.Dos; update = action; Type = ImapLiteralType.MimeMessage; Literal = message; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The formatting options. /// The literal. public ImapLiteral (FormatOptions options, byte[] literal) { format = options.Clone (); format.NewLineFormat = NewLineFormat.Dos; update = DefaultUpdate; Type = ImapLiteralType.String; Literal = literal; } /// /// Get the length of the literal, in bytes. /// /// /// Gets the length of the literal, in bytes. /// /// The length. public long Length { get { if (Type == ImapLiteralType.String) return ((byte[]) Literal).Length; using (var measure = new MeasuringStream ()) { //if (Type == ImapLiteralType.Stream) { // var stream = (Stream) Literal; // stream.CopyTo (measure, 4096); // stream.Position = 0; // return measure.Length; //} ((MimeMessage) Literal).WriteTo (format, measure); return measure.Length; } } } /// /// Write the literal to the specified stream. /// /// /// Writes the literal to the specified stream. /// /// The stream. /// The cancellation token. public void WriteTo (ImapStream stream, CancellationToken cancellationToken) { if (Type == ImapLiteralType.String) { var bytes = (byte[]) Literal; stream.Write (bytes, 0, bytes.Length, cancellationToken); stream.Flush (cancellationToken); return; } //if (Type == ImapLiteralType.Stream) { // var literal = (Stream) Literal; // var buf = new byte[4096]; // int nread; // while ((nread = literal.Read (buf, 0, buf.Length)) > 0) // stream.Write (buf, 0, nread, cancellationToken); // stream.Flush (cancellationToken); // return; //} var message = (MimeMessage) Literal; using (var s = new ProgressStream (stream, update)) { message.WriteTo (format, s, cancellationToken); s.Flush (cancellationToken); } } /// /// Asynchronously write the literal to the specified stream. /// /// /// Asynchronously writes the literal to the specified stream. /// /// The stream. /// The cancellation token. public async Task WriteToAsync (ImapStream stream, CancellationToken cancellationToken) { if (Type == ImapLiteralType.String) { var bytes = (byte[]) Literal; await stream.WriteAsync (bytes, 0, bytes.Length, cancellationToken).ConfigureAwait (false); await stream.FlushAsync (cancellationToken).ConfigureAwait (false); return; } //if (Type == ImapLiteralType.Stream) { // var literal = (Stream) Literal; // var buf = new byte[4096]; // int nread; // while ((nread = await literal.ReadAsync (buf, 0, buf.Length, cancellationToken).ConfigureAwait (false)) > 0) // await stream.WriteAsync (buf, 0, nread, cancellationToken).ConfigureAwait (false); // await stream.FlushAsync (cancellationToken).ConfigureAwait (false); // return; //} var message = (MimeMessage) Literal; using (var s = new ProgressStream (stream, update)) { await message.WriteToAsync (format, s, cancellationToken).ConfigureAwait (false); await s.FlushAsync (cancellationToken).ConfigureAwait (false); } } } } ================================================ FILE: MailKit/Net/Imap/ImapProtocolException.cs ================================================ // // ImapException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit.Net.Imap { /// /// An IMAP protocol exception. /// /// /// The exception that is thrown when there is an error communicating with an IMAP server. An /// is typically fatal and requires the /// to be reconnected. /// #if SERIALIZABLE [Serializable] #endif public class ImapProtocolException : ProtocolException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected ImapProtocolException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// An inner exception. public ImapProtocolException (string message, Exception innerException) : base (message, innerException) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public ImapProtocolException (string message) : base (message) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public ImapProtocolException () { } /// /// Gets or sets whether or not this exception was thrown due to an unexpected token. /// /// /// Gets or sets whether or not this exception was thrown due to an unexpected token. /// /// if an unexpected token was encountered; otherwise, . internal bool UnexpectedToken { get; set; } /// /// Create a new based on the state. /// /// /// Create a new based on the state. /// /// A new protocol exception. /// The command state. internal static ImapProtocolException Create (ImapCommand ic) { string? message = null; if (string.IsNullOrEmpty (ic.ResponseText)) { for (int i = ic.RespCodes.Count - 1; i >= 0; i--) { if (ic.RespCodes[i].IsError && !string.IsNullOrEmpty (ic.RespCodes[i].Message)) { message = ic.RespCodes[i].Message; break; } } message ??= string.Empty; } else { message = ic.ResponseText!; } return ic.Exception != null ? new ImapProtocolException (message, ic.Exception) : new ImapProtocolException (message); } } } ================================================ FILE: MailKit/Net/Imap/ImapResponseCode.cs ================================================ // // ImapResponseCode.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit.Net.Imap { enum ImapResponseCodeType : byte { Alert, BadCharset, Capability, NewName, Parse, PermanentFlags, ReadOnly, ReadWrite, TryCreate, UidNext, UidValidity, Unseen, // RESP-CODES introduced in rfc2221: Referral, // RESP-CODES introduced in rfc3516, UnknownCte, // RESP-CODES introduced in rfc4315: AppendUid, CopyUid, UidNotSticky, // RESP-CODES introduced in rfc4467: UrlMech, // RESP-CODES introduced in rfc4469: BadUrl, TooBig, // RESP-CODES introduced in rfc4551: HighestModSeq, Modified, NoModSeq, // RESP-CODES introduced in rfc4978: CompressionActive, // RESP-CODES introduced in rfc5162: Closed, // RESP-CODES introduced in rfc5182: NotSaved, // RESP-CODES introduced in rfc5255: BadComparator, // RESP-CODES introduced in rfc5257: Annotate, Annotations, // RESP-CODES introduced in rfc5259: MaxConvertMessages, MaxConvertParts, TempFail, // RESP-CODES introduced in rfc5267: NoUpdate, // RESP-CODES introduced in rfc5464: Metadata, // RESP-CODES introduced in rfc5465: NotificationOverflow, BadEvent, // RESP-CODES introduced in rfc5466: UndefinedFilter, // RESP-CODES introduced in rfc5530: Unavailable, AuthenticationFailed, AuthorizationFailed, Expired, PrivacyRequired, ContactAdmin, NoPerm, InUse, ExpungeIssued, Corruption, ServerBug, ClientBug, CanNot, Limit, OverQuota, AlreadyExists, NonExistent, // RESP-CODES introduced in rfc6154: UseAttr, // RESP-CODES introduced in rfc8474: MailboxId, // GMail-specific RESP-CODES WebAlert, Unknown = 255 } class ImapResponseCode { public readonly ImapResponseCodeType Type; public bool IsTagged, IsError; public string Message; internal ImapResponseCode (ImapResponseCodeType type, bool isError) { Message = string.Empty; IsError = isError; Type = type; } public static ImapResponseCode Create (ImapResponseCodeType type) { switch (type) { case ImapResponseCodeType.Alert: return new ImapResponseCode (type, false); case ImapResponseCodeType.BadCharset: return new ImapResponseCode (type, true); case ImapResponseCodeType.Capability: return new ImapResponseCode (type, false); case ImapResponseCodeType.NewName: return new NewNameResponseCode (type); case ImapResponseCodeType.Parse: return new ImapResponseCode (type, true); case ImapResponseCodeType.PermanentFlags: return new PermanentFlagsResponseCode (type); case ImapResponseCodeType.ReadOnly: return new ImapResponseCode (type, false); case ImapResponseCodeType.ReadWrite: return new ImapResponseCode (type, false); case ImapResponseCodeType.TryCreate: return new ImapResponseCode (type, true); case ImapResponseCodeType.UidNext: return new UidNextResponseCode (type); case ImapResponseCodeType.UidValidity: return new UidValidityResponseCode (type); case ImapResponseCodeType.Unseen: return new UnseenResponseCode (type); case ImapResponseCodeType.Referral: return new ImapResponseCode (type, false); case ImapResponseCodeType.UnknownCte: return new ImapResponseCode (type, true); case ImapResponseCodeType.AppendUid: return new AppendUidResponseCode (type); case ImapResponseCodeType.CopyUid: return new CopyUidResponseCode (type); case ImapResponseCodeType.UidNotSticky: return new ImapResponseCode (type, false); case ImapResponseCodeType.UrlMech: return new ImapResponseCode (type, false); case ImapResponseCodeType.BadUrl: return new BadUrlResponseCode (type); case ImapResponseCodeType.TooBig: return new ImapResponseCode (type, true); case ImapResponseCodeType.HighestModSeq: return new HighestModSeqResponseCode (type); case ImapResponseCodeType.Modified: return new ModifiedResponseCode (type); case ImapResponseCodeType.NoModSeq: return new ImapResponseCode (type, false); case ImapResponseCodeType.CompressionActive: return new ImapResponseCode (type, true); case ImapResponseCodeType.Closed: return new ImapResponseCode (type, false); case ImapResponseCodeType.NotSaved: return new ImapResponseCode (type, true); case ImapResponseCodeType.BadComparator: return new ImapResponseCode (type, true); case ImapResponseCodeType.Annotate: return new AnnotateResponseCode (type); case ImapResponseCodeType.Annotations: return new AnnotationsResponseCode (type); case ImapResponseCodeType.MaxConvertMessages: return new MaxConvertResponseCode (type); case ImapResponseCodeType.MaxConvertParts: return new MaxConvertResponseCode (type); case ImapResponseCodeType.TempFail: return new ImapResponseCode (type, true); case ImapResponseCodeType.NoUpdate: return new NoUpdateResponseCode (type); case ImapResponseCodeType.Metadata: return new MetadataResponseCode (type); case ImapResponseCodeType.NotificationOverflow: return new ImapResponseCode (type, false); case ImapResponseCodeType.BadEvent: return new ImapResponseCode (type, true); case ImapResponseCodeType.UndefinedFilter: return new UndefinedFilterResponseCode (type); case ImapResponseCodeType.Unavailable: return new ImapResponseCode (type, true); case ImapResponseCodeType.AuthenticationFailed: return new ImapResponseCode (type, true); case ImapResponseCodeType.AuthorizationFailed: return new ImapResponseCode (type, true); case ImapResponseCodeType.Expired: return new ImapResponseCode (type, true); case ImapResponseCodeType.PrivacyRequired: return new ImapResponseCode (type, true); case ImapResponseCodeType.ContactAdmin: return new ImapResponseCode (type, true); case ImapResponseCodeType.NoPerm: return new ImapResponseCode (type, true); case ImapResponseCodeType.InUse: return new ImapResponseCode (type, true); case ImapResponseCodeType.ExpungeIssued: return new ImapResponseCode (type, true); case ImapResponseCodeType.Corruption: return new ImapResponseCode (type, true); case ImapResponseCodeType.ServerBug: return new ImapResponseCode (type, true); case ImapResponseCodeType.ClientBug: return new ImapResponseCode (type, true); case ImapResponseCodeType.CanNot: return new ImapResponseCode (type, true); case ImapResponseCodeType.Limit: return new ImapResponseCode (type, true); case ImapResponseCodeType.OverQuota: return new ImapResponseCode (type, true); case ImapResponseCodeType.AlreadyExists: return new ImapResponseCode (type, true); case ImapResponseCodeType.NonExistent: return new ImapResponseCode (type, true); case ImapResponseCodeType.UseAttr: return new ImapResponseCode (type, true); case ImapResponseCodeType.MailboxId: return new MailboxIdResponseCode (type); case ImapResponseCodeType.WebAlert: return new WebAlertResponseCode (type); default: return new ImapResponseCode (type, true); } } } class NewNameResponseCode : ImapResponseCode { public string? OldName; public string? NewName; internal NewNameResponseCode (ImapResponseCodeType type) : base (type, false) { } } class PermanentFlagsResponseCode : ImapResponseCode { public HashSet Keywords; public MessageFlags Flags; internal PermanentFlagsResponseCode (ImapResponseCodeType type) : base (type, false) { Keywords = new HashSet (StringComparer.Ordinal); } } class UidNextResponseCode : ImapResponseCode { public UniqueId Uid; internal UidNextResponseCode (ImapResponseCodeType type) : base (type, false) { } } class UidValidityResponseCode : ImapResponseCode { public uint UidValidity; internal UidValidityResponseCode (ImapResponseCodeType type) : base (type, false) { } } class UnseenResponseCode : ImapResponseCode { public int Index; internal UnseenResponseCode (ImapResponseCodeType type) : base (type, false) { } } class AppendUidResponseCode : UidValidityResponseCode { public UniqueIdSet? UidSet; internal AppendUidResponseCode (ImapResponseCodeType type) : base (type) { } } class CopyUidResponseCode : UidValidityResponseCode { public UniqueIdSet? SrcUidSet, DestUidSet; internal CopyUidResponseCode (ImapResponseCodeType type) : base (type) { } } class BadUrlResponseCode : ImapResponseCode { public string? BadUrl; internal BadUrlResponseCode (ImapResponseCodeType type) : base (type, true) { } } class HighestModSeqResponseCode : ImapResponseCode { public ulong HighestModSeq; internal HighestModSeqResponseCode (ImapResponseCodeType type) : base (type, false) { } } class ModifiedResponseCode : ImapResponseCode { public UniqueIdSet? UidSet; internal ModifiedResponseCode (ImapResponseCodeType type) : base (type, false) { } } class MaxConvertResponseCode : ImapResponseCode { public uint MaxConvert; internal MaxConvertResponseCode (ImapResponseCodeType type) : base (type, true) { } } class NoUpdateResponseCode : ImapResponseCode { public string? Tag; internal NoUpdateResponseCode (ImapResponseCodeType type) : base (type, true) { } } enum AnnotateResponseCodeSubType { TooBig, TooMany } class AnnotateResponseCode : ImapResponseCode { public AnnotateResponseCodeSubType SubType; internal AnnotateResponseCode (ImapResponseCodeType type) : base (type, true) { } } class AnnotationsResponseCode : ImapResponseCode { public AnnotationAccess Access; public AnnotationScope Scopes; public uint MaxSize; internal AnnotationsResponseCode (ImapResponseCodeType type) : base (type, false) { } } enum MetadataResponseCodeSubType { LongEntries, MaxSize, TooMany, NoPrivate } class MetadataResponseCode : ImapResponseCode { public MetadataResponseCodeSubType SubType; public uint Value; internal MetadataResponseCode (ImapResponseCodeType type) : base (type, true) { } } class UndefinedFilterResponseCode : ImapResponseCode { public string? Name; internal UndefinedFilterResponseCode (ImapResponseCodeType type) : base (type, true) { } } class MailboxIdResponseCode : ImapResponseCode { public string? MailboxId; internal MailboxIdResponseCode (ImapResponseCodeType type) : base (type, false) { } } class WebAlertResponseCode : ImapResponseCode { public Uri? WebUri; internal WebAlertResponseCode (ImapResponseCodeType type) : base (type, false) { } } } ================================================ FILE: MailKit/Net/Imap/ImapSearchQueryOptimizer.cs ================================================ // // ImapSearchQueryOptimizer.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit.Search; namespace MailKit.Net.Imap { class ImapSearchQueryOptimizer : ISearchQueryOptimizer { #region ISearchQueryOptimizer implementation public SearchQuery Reduce (SearchQuery expr) { if (expr.Term == SearchTerm.And) { var and = (BinarySearchQuery) expr; if (and.Left.Term == SearchTerm.All) return and.Right.Optimize (this); if (and.Right.Term == SearchTerm.All) return and.Left.Optimize (this); } else if (expr.Term == SearchTerm.Or) { var or = (BinarySearchQuery) expr; if (or.Left.Term == SearchTerm.All) return SearchQuery.All; if (or.Right.Term == SearchTerm.All) return SearchQuery.All; } else if (expr.Term == SearchTerm.Not) { var unary = (UnarySearchQuery) expr; switch (unary.Operand.Term) { case SearchTerm.Not: return ((UnarySearchQuery) unary.Operand).Operand.Optimize (this); case SearchTerm.NotAnswered: return SearchQuery.Answered; case SearchTerm.Answered: return SearchQuery.NotAnswered; case SearchTerm.NotDeleted: return SearchQuery.Deleted; case SearchTerm.Deleted: return SearchQuery.NotDeleted; case SearchTerm.NotDraft: return SearchQuery.Draft; case SearchTerm.Draft: return SearchQuery.NotDraft; case SearchTerm.NotFlagged: return SearchQuery.Flagged; case SearchTerm.Flagged: return SearchQuery.NotFlagged; case SearchTerm.NotRecent: return SearchQuery.Recent; case SearchTerm.Recent: return SearchQuery.NotRecent; case SearchTerm.NotSeen: return SearchQuery.Seen; case SearchTerm.Seen: return SearchQuery.NotSeen; } if (unary.Operand.Term == SearchTerm.Keyword) return new TextSearchQuery (SearchTerm.NotKeyword, ((TextSearchQuery) unary.Operand).Text); if (unary.Operand.Term == SearchTerm.NotKeyword) return new TextSearchQuery (SearchTerm.Keyword, ((TextSearchQuery) unary.Operand).Text); } return expr; } #endregion } } ================================================ FILE: MailKit/Net/Imap/ImapStream.cs ================================================ // // ImapStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Threading; using System.Net.Sockets; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit.IO; using Buffer = System.Buffer; using SslStream = MailKit.Net.SslStream; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit.Net.Imap { /// /// An enumeration of the possible IMAP streaming modes. /// /// /// Normal operation is done in the mode, /// but when reading literal string data, the /// mode should be used. /// enum ImapStreamMode { /// /// Reads 1 token at a time. /// Token, /// /// Reads literal string data. /// Literal } class ImapStream : Stream, ICancellableStream { public const string AtomSpecials = "(){%*\\\""; public const string DefaultSpecials = "[]" + AtomSpecials; const int ReadAheadSize = 128; const int BlockSize = 4096; const int PadSize = 4; // I/O buffering readonly byte[] input = new byte[ReadAheadSize + BlockSize + PadSize]; const int inputStart = ReadAheadSize; int inputIndex = ReadAheadSize; int inputEnd = ReadAheadSize; readonly byte[] output = new byte[BlockSize]; int outputIndex; readonly Stack tokens; readonly IProtocolLogger logger; int literalDataLeft; bool disposed; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The underlying network stream. /// The protocol logger. public ImapStream (Stream source, IProtocolLogger protocolLogger) { tokens = new Stack (); logger = protocolLogger; IsConnected = true; Stream = source; } /// /// Get or sets the underlying network stream. /// /// /// Gets or sets the underlying network stream. /// /// The underlying network stream. public Stream Stream { get; internal set; } /// /// Get or sets the mode used for reading. /// /// /// Gets or sets the mode used for reading. /// /// The mode. public ImapStreamMode Mode { get; set; } /// /// Get the length of the literal. /// /// /// Gets the length of the literal. /// /// The length of the literal. public int LiteralLength { get { return literalDataLeft; } internal set { literalDataLeft = value; } } /// /// Get whether or not the stream is connected. /// /// /// Gets whether or not the stream is connected. /// /// if the stream is connected; otherwise, . public bool IsConnected { get; private set; } /// /// Get whether the stream supports reading. /// /// /// Gets whether the stream supports reading. /// /// if the stream supports reading; otherwise, . public override bool CanRead { get { return Stream.CanRead; } } /// /// Get whether the stream supports writing. /// /// /// Gets whether the stream supports writing. /// /// if the stream supports writing; otherwise, . public override bool CanWrite { get { return Stream.CanWrite; } } /// /// Get whether the stream supports seeking. /// /// /// Gets whether the stream supports seeking. /// /// if the stream supports seeking; otherwise, . public override bool CanSeek { get { return false; } } /// /// Get whether the stream supports I/O timeouts. /// /// /// Gets whether the stream supports I/O timeouts. /// /// if the stream supports I/O timeouts; otherwise, . public override bool CanTimeout { get { return Stream.CanTimeout; } } /// /// Get or set a value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// The read timeout. public override int ReadTimeout { get { return Stream.ReadTimeout; } set { Stream.ReadTimeout = value; } } /// /// Get or set a value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// The write timeout. public override int WriteTimeout { get { return Stream.WriteTimeout; } set { Stream.WriteTimeout = value; } } /// /// Get or set the position within the current stream. /// /// /// Gets or sets the position within the current stream. /// /// The current position within the stream. /// The position of the stream. /// /// An I/O error occurred. /// /// /// The stream does not support seeking. /// /// /// The stream has been disposed. /// public override long Position { get { return Stream.Position; } set { throw new NotSupportedException (); } } /// /// Get the length of the stream, in bytes. /// /// /// Gets the length of the stream, in bytes. /// /// A long value representing the length of the stream in bytes. /// The length of the stream. /// /// The stream does not support seeking. /// /// /// The stream has been disposed. /// public override long Length { get { return Stream.Length; } } bool AlignReadAheadBuffer (int atleast, out int left, out int start, out int end) { left = inputEnd - inputIndex; start = inputStart; end = inputEnd; if (left >= atleast) return false; if (left > 0) { int index = inputIndex; // attempt to align the end of the remaining input with ReadAheadSize if (index >= start) { start -= Math.Min (ReadAheadSize, left); Buffer.BlockCopy (input, index, input, start, left); index = start; start += left; } else if (index > 0) { int shift = Math.Min (index, end - start); Buffer.BlockCopy (input, index, input, index - shift, left); index -= shift; start = index + left; } else { // we can't shift... start = end; } inputIndex = index; inputEnd = start; } else { inputIndex = start; inputEnd = start; } end = input.Length - PadSize; return true; } int ReadAhead (int atleast, CancellationToken cancellationToken) { if (!AlignReadAheadBuffer (atleast, out int left, out int start, out int end)) return left; try { var network = Stream as NetworkStream; int nread; cancellationToken.ThrowIfCancellationRequested (); network?.Poll (SelectMode.SelectRead, cancellationToken); if ((nread = Stream.Read (input, start, end - start)) > 0) { logger.LogServer (input, start, nread); inputEnd += nread; } else { throw new ImapProtocolException ("The IMAP server has unexpectedly disconnected."); } if (network == null) cancellationToken.ThrowIfCancellationRequested (); } catch { IsConnected = false; throw; } return inputEnd - inputIndex; } async ValueTask ReadAheadAsync (int atleast, CancellationToken cancellationToken) { if (!AlignReadAheadBuffer (atleast, out int left, out int start, out int end)) return left; try { int nread; cancellationToken.ThrowIfCancellationRequested (); if ((nread = await Stream.ReadAsync (input, start, end - start, cancellationToken).ConfigureAwait (false)) > 0) { logger.LogServer (input, start, nread); inputEnd += nread; } else { throw new ImapProtocolException ("The IMAP server has unexpectedly disconnected."); } if (Stream is not NetworkStream) cancellationToken.ThrowIfCancellationRequested (); } catch { IsConnected = false; throw; } return inputEnd - inputIndex; } static void ValidateArguments (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0 || count > (buffer.Length - offset)) throw new ArgumentOutOfRangeException (nameof (count)); } void CheckDisposed () { if (disposed) throw new ObjectDisposedException (nameof (ImapStream)); } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream is in token mode (see ). /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public int Read (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); if (Mode != ImapStreamMode.Literal) return 0; count = Math.Min (count, literalDataLeft); int length = inputEnd - inputIndex; int n; if (length < count && length <= ReadAheadSize) ReadAhead (BlockSize, cancellationToken); length = inputEnd - inputIndex; n = Math.Min (count, length); Buffer.BlockCopy (input, inputIndex, buffer, offset, n); literalDataLeft -= n; inputIndex += n; if (literalDataLeft == 0) Mode = ImapStreamMode.Token; return n; } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream is in token mode (see ). /// /// /// An I/O error occurred. /// public override int Read (byte[] buffer, int offset, int count) { return Read (buffer, offset, count, CancellationToken.None); } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override async Task ReadAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); if (Mode != ImapStreamMode.Literal) return 0; count = Math.Min (count, literalDataLeft); int length = inputEnd - inputIndex; int n; if (length < count && length <= ReadAheadSize) await ReadAheadAsync (BlockSize, cancellationToken).ConfigureAwait (false); length = inputEnd - inputIndex; n = Math.Min (count, length); Buffer.BlockCopy (input, inputIndex, buffer, offset, n); literalDataLeft -= n; inputIndex += n; if (literalDataLeft == 0) Mode = ImapStreamMode.Token; return n; } static bool IsAtom (byte c, string specials) { return !IsCtrl (c) && c != (byte) ' ' && specials.IndexOf ((char) c) == -1; } static bool IsCtrl (byte c) { return c <= 0x1f || c == 0x7f; } static bool IsWhiteSpace (byte c) { return c == (byte) ' ' || c == (byte) '\r'; } bool TryReadQuotedString (ByteArrayBuilder builder, ref bool escaped) { do { while (inputIndex < inputEnd) { if (input[inputIndex] == (byte) '"' && !escaped) break; if (input[inputIndex] == (byte) '\\' && !escaped) { escaped = true; } else { builder.Append (input[inputIndex]); escaped = false; } inputIndex++; } if (inputIndex + 1 < inputEnd) { // skip over closing '"' inputIndex++; // Note: Some IMAP servers do not properly escape double-quotes inside // of a qstring token and so, as an attempt at working around this // problem, check that the closing '"' character is not immediately // followed by any character that we would expect immediately following // a qstring token. // // See https://github.com/jstedfast/MailKit/issues/485 for details. if ("]) \r\n".IndexOf ((char) input[inputIndex]) != -1) return true; builder.Append ((byte) '"'); continue; } return false; } while (true); } ImapToken ReadQuotedStringToken (CancellationToken cancellationToken) { bool escaped = false; // skip over the opening '"' inputIndex++; using (var builder = new ByteArrayBuilder (64)) { while (!TryReadQuotedString (builder, ref escaped)) ReadAhead (2, cancellationToken); var qstring = builder.ToString (); return ImapToken.Create (ImapTokenType.QString, qstring); } } async ValueTask ReadQuotedStringTokenAsync (CancellationToken cancellationToken) { bool escaped = false; // skip over the opening '"' inputIndex++; using (var builder = new ByteArrayBuilder (64)) { while (!TryReadQuotedString (builder, ref escaped)) await ReadAheadAsync (2, cancellationToken).ConfigureAwait (false); var qstring = builder.ToString (); return ImapToken.Create (ImapTokenType.QString, qstring); } } bool TryReadAtomString (ImapTokenType type, ByteArrayBuilder builder, string specials) { input[inputEnd] = (byte) '\n'; if (type == ImapTokenType.Flag && builder.Length == 1 && input[inputIndex] == (byte) '*') { // this is a special wildcard flag builder.Append (input[inputIndex++]); } while (IsAtom (input[inputIndex], specials)) builder.Append (input[inputIndex++]); return inputIndex < inputEnd; } ImapToken ReadAtomString (ImapTokenType type, string specials, CancellationToken cancellationToken) { using (var builder = new ByteArrayBuilder (32)) { if (type == ImapTokenType.Flag) builder.Append ((byte) '\\'); while (!TryReadAtomString (type, builder, specials)) ReadAhead (1, cancellationToken); return ImapToken.Create (type, builder); } } async ValueTask ReadAtomStringAsync (ImapTokenType type, string specials, CancellationToken cancellationToken) { using (var builder = new ByteArrayBuilder (32)) { if (type == ImapTokenType.Flag) builder.Append ((byte) '\\'); while (!TryReadAtomString (type, builder, specials)) await ReadAheadAsync (1, cancellationToken).ConfigureAwait (false); return ImapToken.Create (type, builder); } } ImapToken ReadAtomToken (string specials, CancellationToken cancellationToken) { return ReadAtomString (ImapTokenType.Atom, specials, cancellationToken); } ValueTask ReadAtomTokenAsync (string specials, CancellationToken cancellationToken) { return ReadAtomStringAsync (ImapTokenType.Atom, specials, cancellationToken); } ImapToken ReadFlagToken (string specials, CancellationToken cancellationToken) { inputIndex++; return ReadAtomString (ImapTokenType.Flag, specials, cancellationToken); } ValueTask ReadFlagTokenAsync (string specials, CancellationToken cancellationToken) { inputIndex++; return ReadAtomStringAsync (ImapTokenType.Flag, specials, cancellationToken); } bool TryReadLiteralTokenValue (ByteArrayBuilder builder) { input[inputEnd] = (byte) '}'; while (input[inputIndex] != (byte) '}' && input[inputIndex] != '+') builder.Append (input[inputIndex++]); return inputIndex < inputEnd; } bool TryReadUntilCloseCurlyBrace (ByteArrayBuilder builder) { input[inputEnd] = (byte) '}'; while (input[inputIndex] != (byte) '}') builder.Append (input[inputIndex++]); return inputIndex < inputEnd; } bool TrySkipUntilNewLine () { input[inputEnd] = (byte) '\n'; while (input[inputIndex] != (byte) '\n') inputIndex++; return inputIndex < inputEnd; } ImapToken ReadLiteralToken (CancellationToken cancellationToken) { using (var builder = new ByteArrayBuilder (16)) { // skip over the '{' builder.Append (input[inputIndex++]); while (!TryReadLiteralTokenValue (builder)) ReadAhead (1, cancellationToken); int endIndex = builder.Length; if (input[inputIndex] == (byte) '+') builder.Append (input[inputIndex++]); // technically, we need "}\r\n", but in order to be more lenient, we'll accept "}\n" ReadAhead (2, cancellationToken); if (input[inputIndex] != (byte) '}') { // PROTOCOL ERROR... but maybe we can work around it? while (!TryReadUntilCloseCurlyBrace (builder)) ReadAhead (1, cancellationToken); } // skip over the '}' builder.Append (input[inputIndex++]); // read until we get a new line... while (!TrySkipUntilNewLine ()) ReadAhead (1, cancellationToken); // skip over the '\n' inputIndex++; if (!builder.TryParse (1, endIndex, out literalDataLeft)) return ImapToken.Create (ImapTokenType.Error, builder.ToString ()); Mode = ImapStreamMode.Literal; return ImapToken.Create (ImapTokenType.Literal, literalDataLeft); } } async ValueTask ReadLiteralTokenAsync (CancellationToken cancellationToken) { using (var builder = new ByteArrayBuilder (16)) { // skip over the '{' builder.Append (input[inputIndex++]); while (!TryReadLiteralTokenValue (builder)) await ReadAheadAsync (1, cancellationToken).ConfigureAwait (false); int endIndex = builder.Length; if (input[inputIndex] == (byte) '+') builder.Append (input[inputIndex++]); // technically, we need "}\r\n", but in order to be more lenient, we'll accept "}\n" await ReadAheadAsync (2, cancellationToken).ConfigureAwait (false); if (input[inputIndex] != (byte) '}') { // PROTOCOL ERROR... but maybe we can work around it? while (!TryReadUntilCloseCurlyBrace (builder)) await ReadAheadAsync (1, cancellationToken).ConfigureAwait (false); } // skip over the '}' builder.Append (input[inputIndex++]); // read until we get a new line... while (!TrySkipUntilNewLine ()) await ReadAheadAsync (1, cancellationToken).ConfigureAwait (false); // skip over the '\n' inputIndex++; if (!builder.TryParse (1, endIndex, out literalDataLeft) || literalDataLeft < 0) return ImapToken.Create (ImapTokenType.Error, builder.ToString ()); Mode = ImapStreamMode.Literal; return ImapToken.Create (ImapTokenType.Literal, literalDataLeft); } } bool TrySkipWhiteSpace () { input[inputEnd] = (byte) '\n'; while (IsWhiteSpace (input[inputIndex])) inputIndex++; return inputIndex < inputEnd; } /// /// Reads the next available token from the stream. /// /// The token. /// The special characters that are not allowed in an atom token. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public ImapToken ReadToken (string specials, CancellationToken cancellationToken) { CheckDisposed (); if (tokens.Count > 0) return tokens.Pop (); // skip over white space between tokens... while (!TrySkipWhiteSpace ()) ReadAhead (1, cancellationToken); char c = (char) input[inputIndex]; if (c == '"') return ReadQuotedStringToken (cancellationToken); if (c == '{') return ReadLiteralToken (cancellationToken); if (c == '\\') return ReadFlagToken (specials, cancellationToken); if (IsAtom (input[inputIndex], specials)) return ReadAtomToken (specials, cancellationToken); // special character token inputIndex++; return ImapToken.Create ((ImapTokenType) c, c); } /// /// Asynchronously reads the next available token from the stream. /// /// The token. /// The special characters that are not allowed in an atom token. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public async ValueTask ReadTokenAsync (string specials, CancellationToken cancellationToken) { CheckDisposed (); if (tokens.Count > 0) return tokens.Pop (); // skip over white space between tokens... while (!TrySkipWhiteSpace ()) await ReadAheadAsync (1, cancellationToken).ConfigureAwait (false); char c = (char) input[inputIndex]; if (c == '"') return await ReadQuotedStringTokenAsync (cancellationToken).ConfigureAwait (false); if (c == '{') return await ReadLiteralTokenAsync (cancellationToken).ConfigureAwait (false); if (c == '\\') return await ReadFlagTokenAsync (specials, cancellationToken).ConfigureAwait (false); if (IsAtom (input[inputIndex], specials)) return await ReadAtomTokenAsync (specials, cancellationToken).ConfigureAwait (false); // special character token inputIndex++; return ImapToken.Create ((ImapTokenType) c, c); } /// /// Reads the next available token from the stream. /// /// The token. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public ImapToken ReadToken (CancellationToken cancellationToken) { return ReadToken (DefaultSpecials, cancellationToken); } /// /// Asynchronously reads the next available token from the stream. /// /// The token. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public ValueTask ReadTokenAsync (CancellationToken cancellationToken) { return ReadTokenAsync (DefaultSpecials, cancellationToken); } /// /// Unget a token. /// /// /// Ungets a token. /// /// The token. public void UngetToken (ImapToken token) { if (token == null) throw new ArgumentNullException (nameof (token)); tokens.Push (token); } unsafe bool TryReadLine (ByteArrayBuilder builder) { fixed (byte* inbuf = input) { byte* start, inptr, inend; int offset = inputIndex; int count; start = inbuf + inputIndex; inend = inbuf + inputEnd; *inend = (byte) '\n'; inptr = start; // FIXME: use SIMD to optimize this while (*inptr != (byte) '\n') inptr++; inputIndex = (int) (inptr - inbuf); count = (int) (inptr - start); if (inptr == inend) { builder.Append (input, offset, count); return false; } // consume the '\n' inputIndex++; count++; builder.Append (input, offset, count); return true; } } /// /// Reads a single line of input from the stream. /// /// /// This method should be called in a loop until it returns . /// /// , if reading the line is complete, otherwise. /// The output buffer write the line data into. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// internal bool ReadLine (ByteArrayBuilder builder, CancellationToken cancellationToken) { CheckDisposed (); if (inputIndex == inputEnd) ReadAhead (1, cancellationToken); return TryReadLine (builder); } /// /// Asynchronously reads a single line of input from the stream. /// /// /// This method should be called in a loop until it returns . /// /// , if reading the line is complete, otherwise. /// The output buffer write the line data into. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// internal async ValueTask ReadLineAsync (ByteArrayBuilder builder, CancellationToken cancellationToken) { CheckDisposed (); if (inputIndex == inputEnd) await ReadAheadAsync (1, cancellationToken).ConfigureAwait (false); return TryReadLine (builder); } void AppendToOutputBuffer (byte[] buffer, ref int index, ref int left) { int n = Math.Min (BlockSize - outputIndex, left); if (outputIndex > 0 || n < BlockSize) { // append the data to the output buffer Buffer.BlockCopy (buffer, index, output, outputIndex, n); outputIndex += n; index += n; left -= n; } } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public void Write (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); try { var network = NetworkStream.Get (Stream); int index = offset; int left = count; while (left > 0) { AppendToOutputBuffer (buffer, ref index, ref left); if (outputIndex == BlockSize) { // flush the output buffer network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (output, 0, BlockSize); logger.LogClient (output, 0, BlockSize); outputIndex = 0; } if (outputIndex == 0) { // write blocks of data to the stream without buffering while (left >= BlockSize) { network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (buffer, index, BlockSize); logger.LogClient (buffer, index, BlockSize); index += BlockSize; left -= BlockSize; } } } } catch (Exception ex) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); throw; } } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Write (byte[] buffer, int offset, int count) { Write (buffer, offset, count, CancellationToken.None); } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// A task that represents the asynchronous write operation. /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override async Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); try { int index = offset; int left = count; while (left > 0) { AppendToOutputBuffer (buffer, ref index, ref left); if (outputIndex == BlockSize) { // flush the output buffer await Stream.WriteAsync (output, 0, BlockSize, cancellationToken).ConfigureAwait (false); logger.LogClient (output, 0, BlockSize); outputIndex = 0; } if (outputIndex == 0) { // write blocks of data to the stream without buffering while (left >= BlockSize) { await Stream.WriteAsync (buffer, index, BlockSize, cancellationToken).ConfigureAwait (false); logger.LogClient (buffer, index, BlockSize); index += BlockSize; left -= BlockSize; } } } } catch (Exception ex) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); throw; } } /// /// Clears all output buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all output buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// The cancellation token. /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public void Flush (CancellationToken cancellationToken) { CheckDisposed (); if (outputIndex == 0) return; try { var network = NetworkStream.Get (Stream); network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (output, 0, outputIndex); Stream.Flush (); logger.LogClient (output, 0, outputIndex); outputIndex = 0; } catch (Exception ex) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); throw; } } /// /// Clears all output buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all output buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Flush () { Flush (CancellationToken.None); } /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// A task that represents the asynchronous flush operation. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override async Task FlushAsync (CancellationToken cancellationToken) { CheckDisposed (); if (outputIndex == 0) return; try { await Stream.WriteAsync (output, 0, outputIndex, cancellationToken).ConfigureAwait (false); await Stream.FlushAsync (cancellationToken).ConfigureAwait (false); logger.LogClient (output, 0, outputIndex); outputIndex = 0; } catch (Exception ex) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); throw; } } /// /// Sets the position within the current stream. /// /// /// It is not possible to seek within a . /// /// The new position within the stream. /// The offset into the stream relative to the . /// The origin to seek from. /// /// The stream does not support seeking. /// public override long Seek (long offset, SeekOrigin origin) { throw new NotSupportedException (); } /// /// Sets the length of the stream. /// /// /// It is not possible to set the length of a . /// /// The desired length of the stream in bytes. /// /// The stream does not support setting the length. /// public override void SetLength (long value) { throw new NotSupportedException (); } /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected override void Dispose (bool disposing) { if (disposing && !disposed) { IsConnected = false; Stream.Dispose (); } disposed = true; base.Dispose (disposing); } } } ================================================ FILE: MailKit/Net/Imap/ImapToken.cs ================================================ // // ImapToken.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Globalization; using System.Collections.Generic; using MimeKit.Utils; namespace MailKit.Net.Imap { enum ImapTokenType { NoData = -7, Error = -6, Nil = -5, Atom = -4, Flag = -3, QString = -2, Literal = -1, // character tokens: Eoln = (int) '\n', OpenParen = (int) '(', CloseParen = (int) ')', Asterisk = (int) '*', OpenBracket = (int) '[', CloseBracket = (int) ']', } class ImapToken { public static readonly ImapToken Plus = new ImapToken (ImapTokenType.Atom, "+"); public static readonly ImapToken Asterisk = new ImapToken (ImapTokenType.Asterisk, '*'); public static readonly ImapToken OpenParen = new ImapToken (ImapTokenType.OpenParen, '('); public static readonly ImapToken CloseParen = new ImapToken (ImapTokenType.CloseParen, ')'); public static readonly ImapToken OpenBracket = new ImapToken (ImapTokenType.OpenBracket, '['); public static readonly ImapToken CloseBracket = new ImapToken (ImapTokenType.CloseBracket, ']'); public static readonly ImapToken Nil = new ImapToken (ImapTokenType.Nil, "NIL"); public static readonly ImapToken Eoln = new ImapToken (ImapTokenType.Eoln, '\n'); static readonly ImapToken[] CommonMessageFlagTokens = new ImapToken[] { new ImapToken (ImapTokenType.Flag, "\\Answered"), new ImapToken (ImapTokenType.Flag, "\\Deleted"), new ImapToken (ImapTokenType.Flag, "\\Draft"), new ImapToken (ImapTokenType.Flag, "\\Flagged"), new ImapToken (ImapTokenType.Flag, "\\Recent"), new ImapToken (ImapTokenType.Flag, "\\Seen"), new ImapToken (ImapTokenType.Flag, "\\*") }; static readonly List NilTokens = new List (6) { Nil }; static readonly ImapToken Ok = new ImapToken (ImapTokenType.Atom, "OK"); static readonly ImapToken Fetch = new ImapToken (ImapTokenType.Atom, "FETCH"); //static readonly ImapToken Annotation = new ImapToken (ImapTokenType.Atom, "ANNOTATION"); static readonly ImapToken Body = new ImapToken (ImapTokenType.Atom, "BODY"); static readonly ImapToken BodyStructure = new ImapToken (ImapTokenType.Atom, "BODYSTRUCTURE"); //static readonly ImapToken EmailId = new ImapToken (ImapTokenType.Atom, "EMAILID"); static readonly ImapToken Envelope = new ImapToken (ImapTokenType.Atom, "ENVELOPE"); static readonly ImapToken Flags = new ImapToken (ImapTokenType.Atom, "FLAGS"); //static readonly ImapToken Header = new ImapToken (ImapTokenType.Atom, "HEADER"); //static readonly ImapToken HeaderFields = new ImapToken (ImapTokenType.Atom, "HEADER.FIELDS"); static readonly ImapToken InternalDate = new ImapToken (ImapTokenType.Atom, "INTERNALDATE"); static readonly ImapToken ModSeq = new ImapToken (ImapTokenType.Atom, "MODSEQ"); static readonly ImapToken Rfc822Size = new ImapToken (ImapTokenType.Atom, "RFC822.SIZE"); //static readonly ImapToken SaveDate = new ImapToken (ImapTokenType.Atom, "SAVEDATE"); //static readonly ImapToken ThreadId = new ImapToken (ImapTokenType.Atom, "THREADID"); static readonly ImapToken Uid = new ImapToken (ImapTokenType.Atom, "UID"); static readonly ImapToken XGMLabels = new ImapToken (ImapTokenType.Atom, "X-GM-LABELS"); static readonly ImapToken XGMMsgId = new ImapToken (ImapTokenType.Atom, "X-GM-MSGID"); static readonly ImapToken XGMThrId = new ImapToken (ImapTokenType.Atom, "X-GM-THRID"); public readonly ImapTokenType Type; public readonly object Value; ImapToken (ImapTokenType type, object value) { Value = value; Type = type; //System.Console.WriteLine ("token: {0}", this); } public static ImapToken Create (ImapTokenType type, char c) { switch (type) { case ImapTokenType.Asterisk: return Asterisk; case ImapTokenType.OpenParen: return OpenParen; case ImapTokenType.CloseParen: return CloseParen; case ImapTokenType.OpenBracket: return OpenBracket; case ImapTokenType.CloseBracket: return CloseBracket; case ImapTokenType.Eoln: return Eoln; } return new ImapToken (type, c); } public static ImapToken Create (ImapTokenType type, int literalLength) { return new ImapToken (type, literalLength); } public static ImapToken Create (ImapTokenType type, ByteArrayBuilder builder) { string value; if (type == ImapTokenType.Flag) { foreach (var token in CommonMessageFlagTokens) { value = (string) token.Value; if (builder.Equals (value, true)) return token; } } else if (type == ImapTokenType.Atom) { if (builder.Equals ("NIL", true)) { // Look for the cached NIL token that matches this capitalization. lock (NilTokens) { foreach (var token in NilTokens) { value = (string) token.Value; if (builder.Equals (value)) return token; } // Add this new variation to our NIL token cache. var nil = new ImapToken (ImapTokenType.Nil, builder.ToString ()); NilTokens.Add (nil); return nil; } } if (builder.Equals ("+", false)) return Plus; if (builder.Equals ("OK", false)) return Ok; if (builder.Equals ("FETCH", false)) return Fetch; if (builder.Equals ("BODY", false)) return Body; if (builder.Equals ("BODYSTRUCTURE", false)) return BodyStructure; if (builder.Equals ("ENVELOPE", false)) return Envelope; if (builder.Equals ("FLAGS", false)) return Flags; if (builder.Equals ("INTERNALDATE", false)) return InternalDate; if (builder.Equals ("MODSEQ", false)) return ModSeq; if (builder.Equals ("RFC822.SIZE", false)) return Rfc822Size; if (builder.Equals ("UID", false)) return Uid; if (builder.Equals ("X-GM-LABELS", false)) return XGMLabels; if (builder.Equals ("X-GM-MSGID", false)) return XGMMsgId; if (builder.Equals ("X-GM-THRID", false)) return XGMThrId; } value = builder.ToString (); return new ImapToken (type, value); } public static ImapToken Create (ImapTokenType type, string value) { return new ImapToken (type, value); } public override string ToString () { switch (Type) { case ImapTokenType.NoData: return ""; case ImapTokenType.Nil: return (string) Value; case ImapTokenType.Atom: return (string) Value; case ImapTokenType.Flag: return (string) Value; case ImapTokenType.QString: return MimeUtils.Quote ((string) Value); case ImapTokenType.Literal: return string.Format (CultureInfo.InvariantCulture, "{{{0}}}", (int) Value); case ImapTokenType.Eoln: return "'\\n'"; case ImapTokenType.OpenParen: return "'('"; case ImapTokenType.CloseParen: return "')'"; case ImapTokenType.Asterisk: return "'*'"; case ImapTokenType.OpenBracket: return "'['"; case ImapTokenType.CloseBracket: return "']'"; default: return string.Format (CultureInfo.InvariantCulture, "[{0}: '{1}']", Type, Value); } } } } ================================================ FILE: MailKit/Net/Imap/ImapUtils.cs ================================================ // // ImapUtils.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using System.Text; using System.Threading; using System.Diagnostics; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; using MimeKit; using MimeKit.Utils; namespace MailKit.Net.Imap { /// /// IMAP utility functions. /// static class ImapUtils { const FolderAttributes SpecialUseAttributes = FolderAttributes.All | FolderAttributes.Archive | FolderAttributes.Drafts | FolderAttributes.Flagged | FolderAttributes.Important | FolderAttributes.Inbox | FolderAttributes.Junk | FolderAttributes.Sent | FolderAttributes.Trash; const string QuotedSpecials = " \t()<>@,;:\\\"/[]?="; static readonly int InboxLength = "INBOX".Length; static readonly string[] Months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; /// /// Formats a date in a format suitable for use with the APPEND command. /// /// The formatted date string. /// The date. public static string FormatInternalDate (DateTimeOffset date) { return string.Format (CultureInfo.InvariantCulture, "{0:D2}-{1}-{2:D4} {3:D2}:{4:D2}:{5:D2} {6:+00;-00}{7:00}", date.Day, Months[date.Month - 1], date.Year, date.Hour, date.Minute, date.Second, date.Offset.Hours, Math.Abs (date.Offset.Minutes)); } static bool TryGetInt32 (string text, ref int index, out int value) { int startIndex = index; value = 0; while (index < text.Length && text[index] >= '0' && text[index] <= '9') { int digit = text[index] - '0'; if (value > int.MaxValue / 10 || (value == int.MaxValue / 10 && digit > int.MaxValue % 10)) { // integer overflow return false; } value = (value * 10) + digit; index++; } return index > startIndex; } static bool TryGetInt32 (string text, ref int index, char delim, out int value) { return TryGetInt32 (text, ref index, out value) && index < text.Length && text[index] == delim; } static bool TryGetMonth (string text, ref int index, char delim, out int month) { int startIndex = index; month = 0; if ((index = text.IndexOf (delim, index)) == -1 || (index - startIndex) != 3) return false; for (int i = 0; i < Months.Length; i++) { if (string.Compare (Months[i], 0, text, startIndex, 3, StringComparison.OrdinalIgnoreCase) == 0) { month = i + 1; return true; } } return false; } static bool TryGetTimeZone (string text, ref int index, out TimeSpan timezone) { int sign = 1; if (text[index] == '-') { sign = -1; index++; } else if (text[index] == '+') { index++; } if (!TryGetInt32 (text, ref index, out var tzone)) { timezone = new TimeSpan (); return false; } tzone *= sign; while (tzone < -1400) tzone += 2400; while (tzone > 1400) tzone -= 2400; int minutes = tzone % 100; int hours = tzone / 100; timezone = new TimeSpan (hours, minutes, 0); return true; } /// /// Parses the internal date string. /// /// The date. /// The text to parse. public static DateTimeOffset ParseInternalDate (string text) { int index = 0; while (index < text.Length && char.IsWhiteSpace (text[index])) index++; if (index >= text.Length || !TryGetInt32 (text, ref index, '-', out int day) || day < 1 || day > 31) return DateTimeOffset.MinValue; index++; if (index >= text.Length || !TryGetMonth (text, ref index, '-', out int month)) return DateTimeOffset.MinValue; index++; if (index >= text.Length || !TryGetInt32 (text, ref index, ' ', out int year) || year < 1969) return DateTimeOffset.MinValue; index++; if (index >= text.Length || !TryGetInt32 (text, ref index, ':', out int hour) || hour > 23) return DateTimeOffset.MinValue; index++; if (index >= text.Length || !TryGetInt32 (text, ref index, ':', out int minute) || minute > 59) return DateTimeOffset.MinValue; index++; if (index >= text.Length || !TryGetInt32 (text, ref index, ' ', out int second) || second > 59) return DateTimeOffset.MinValue; index++; if (index >= text.Length || !TryGetTimeZone (text, ref index, out var timezone)) return DateTimeOffset.MinValue; while (index < text.Length && char.IsWhiteSpace (text[index])) index++; if (index < text.Length) return DateTimeOffset.MinValue; // return DateTimeOffset.ParseExact (text.Trim (), "d-MMM-yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture.DateTimeFormat); return new DateTimeOffset (year, month, day, hour, minute, second, timezone); } /// /// Formats a list of annotations for a STORE or APPEND command. /// /// The command builder. /// The annotations. /// the argument list. /// Throw an exception if there are any annotations without properties. public static void FormatAnnotations (StringBuilder command, IList annotations, List args, bool throwOnError) { int length = command.Length; int added = 0; command.Append ("ANNOTATION ("); for (int i = 0; i < annotations.Count; i++) { var annotation = annotations[i]; if (annotation.Properties.Count == 0) { if (throwOnError) throw new ArgumentException ("One or more annotations does not define any attributes.", nameof (annotations)); continue; } command.Append (annotation.Entry); command.Append (" ("); foreach (var property in annotation.Properties) { command.Append (property.Key); if (property.Value != null) { command.Append (" %S "); args.Add (property.Value); } else { command.Append (" NIL "); } } command[command.Length - 1] = ')'; command.Append (' '); added++; } if (added > 0) command[command.Length - 1] = ')'; else command.Length = length; } /// /// Formats the array of indexes as a string suitable for use with IMAP commands. /// /// The IMAP engine. /// The string builder. /// The indexes. /// /// is . /// -or- /// is . /// -or- /// is . /// /// /// One or more of the indexes has a negative value. /// public static void FormatIndexSet (ImapEngine engine, StringBuilder builder, IList indexes) { if (engine == null) throw new ArgumentNullException (nameof (engine)); if (builder == null) throw new ArgumentNullException (nameof (builder)); if (indexes == null) throw new ArgumentNullException (nameof (indexes)); if (indexes.Count == 0) throw new ArgumentException ("No indexes were specified.", nameof (indexes)); int index = 0; while (index < indexes.Count) { if (indexes[index] < 0) throw new ArgumentException ("One or more of the indexes is negative.", nameof (indexes)); int begin = indexes[index]; int end = indexes[index]; int i = index + 1; if (i < indexes.Count) { if (indexes[i] == end + 1) { end = indexes[i++]; while (i < indexes.Count && indexes[i] == end + 1) { end++; i++; } } else if (indexes[i] == end - 1 && engine.QuirksMode != ImapQuirksMode.hMailServer) { end = indexes[i++]; while (i < indexes.Count && indexes[i] == end - 1) { end--; i++; } } } if (index > 0) builder.Append (','); builder.Append ((begin + 1).ToString (CultureInfo.InvariantCulture)); if (begin != end) { builder.Append (':'); builder.Append ((end + 1).ToString (CultureInfo.InvariantCulture)); } index = i; } } /// /// Formats the array of indexes as a string suitable for use with IMAP commands. /// /// The index set. /// The IMAP engine. /// The indexes. /// /// is . /// -or- /// is . /// /// /// One or more of the indexes has a negative value. /// public static string FormatIndexSet (ImapEngine engine, IList indexes) { var builder = new StringBuilder (); FormatIndexSet (engine, builder, indexes); return builder.ToString (); } /// /// Parses an untagged ID response. /// /// The IMAP engine. /// The IMAP command. static void ParseImplementation (ImapEngine engine, ImapCommand ic) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ID", "{0}"); var token = engine.ReadToken (ic.CancellationToken); ImapImplementation implementation; if (token.Type == ImapTokenType.Nil) return; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); token = engine.PeekToken (ic.CancellationToken); implementation = new ImapImplementation (); while (token.Type != ImapTokenType.CloseParen) { var property = ReadStringToken (engine, format, ic.CancellationToken); var value = ReadNStringToken (engine, format, false, ic.CancellationToken); implementation.Properties[property] = value; token = engine.PeekToken (ic.CancellationToken); } ic.UserData = implementation; // read the ')' token engine.ReadToken (ic.CancellationToken); } /// /// Asynchronously parses an untagged ID response. /// /// The IMAP engine. /// The IMAP command. static async Task ParseImplementationAsync (ImapEngine engine, ImapCommand ic) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ID", "{0}"); var token = await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); ImapImplementation implementation; if (token.Type == ImapTokenType.Nil) return; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); implementation = new ImapImplementation (); while (token.Type != ImapTokenType.CloseParen) { var property = await ReadStringTokenAsync (engine, format, ic.CancellationToken).ConfigureAwait (false); var value = await ReadNStringTokenAsync (engine, format, false, ic.CancellationToken).ConfigureAwait (false); implementation.Properties[property] = value; token = await engine.PeekTokenAsync (ic.CancellationToken).ConfigureAwait (false); } ic.UserData = implementation; // read the ')' token await engine.ReadTokenAsync (ic.CancellationToken).ConfigureAwait (false); } /// /// Handles an untagged ID response. /// /// An asynchronous task. /// The IMAP engine. /// The IMAP command. /// The index. /// Whether or not asynchronous IO methods should be used. public static Task UntaggedIdHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { if (doAsync) return ParseImplementationAsync (engine, ic); ParseImplementation (engine, ic); return Task.CompletedTask; } /// /// Canonicalize the name of the mailbox. /// /// /// Canonicalizes the name of the mailbox by replacing various /// capitalizations of "INBOX" with the literal "INBOX" string. /// /// The mailbox name. /// The encoded mailbox name. /// The directory separator. public static string CanonicalizeMailboxName (string mailboxName, char directorySeparator) { if (!mailboxName.StartsWith ("INBOX", StringComparison.OrdinalIgnoreCase)) return mailboxName; if (mailboxName.Length > InboxLength && mailboxName[InboxLength] == directorySeparator) return "INBOX" + mailboxName.Substring (InboxLength); if (mailboxName.Length == InboxLength) return "INBOX"; return mailboxName; } /// /// Determines whether the specified mailbox is the Inbox. /// /// if the specified mailbox name is the Inbox; otherwise, . /// The mailbox name. public static bool IsInbox (string mailboxName) { return string.Compare (mailboxName, "INBOX", StringComparison.OrdinalIgnoreCase) == 0; } static string ReadFolderName (ImapEngine engine, char delim, string format, CancellationToken cancellationToken) { var token = engine.ReadToken (ImapStream.AtomSpecials, cancellationToken); string encodedName; switch (token.Type) { case ImapTokenType.Literal: encodedName = engine.ReadLiteral (cancellationToken); break; case ImapTokenType.QString: case ImapTokenType.Atom: encodedName = (string) token.Value; // Note: Exchange (Office365 and potentially 2016/2019/other versions) has a bug where it doesn't quote folder names that contain CTRL characters (including tab). // // See https://github.com/jstedfast/MailKit/issues/945 for details. if (token.Type == ImapTokenType.Atom && engine.QuirksMode == ImapQuirksMode.Exchange) { var line = engine.ReadLine (cancellationToken); // unget the \r\n sequence engine.UngetToken (ImapToken.Eoln); encodedName += line; } break; case ImapTokenType.Nil: // Note: according to rfc3501, section 4.5, NIL is acceptable as a mailbox name. return "NIL"; default: throw ImapEngine.UnexpectedToken (format, token); } return encodedName.TrimEnd (delim); } static async Task ReadFolderNameAsync (ImapEngine engine, char delim, string format, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (ImapStream.AtomSpecials, cancellationToken).ConfigureAwait (false); string encodedName; switch (token.Type) { case ImapTokenType.Literal: encodedName = await engine.ReadLiteralAsync (cancellationToken).ConfigureAwait (false); break; case ImapTokenType.QString: case ImapTokenType.Atom: encodedName = (string) token.Value; // Note: Exchange (Office365 and potentially 2016/2019/other versions) has a bug where it doesn't quote folder names that contain CTRL characters (including tab). // // See https://github.com/jstedfast/MailKit/issues/945 for details. if (token.Type == ImapTokenType.Atom && engine.QuirksMode == ImapQuirksMode.Exchange) { var line = await engine.ReadLineAsync (cancellationToken).ConfigureAwait (false); // unget the \r\n sequence engine.UngetToken (ImapToken.Eoln); encodedName += line; } break; case ImapTokenType.Nil: // Note: according to rfc3501, section 4.5, NIL is acceptable as a mailbox name. return "NIL"; default: throw ImapEngine.UnexpectedToken (format, token); } return encodedName.TrimEnd (delim); } static void AddFolderAttribute (ref FolderAttributes attrs, string atom) { if (atom.Equals ("\\noinferiors", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.NoInferiors; else if (atom.Equals ("\\noselect", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.NoSelect; else if (atom.Equals ("\\marked", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Marked; else if (atom.Equals ("\\unmarked", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Unmarked; else if (atom.Equals ("\\nonexistent", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.NonExistent; else if (atom.Equals ("\\subscribed", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Subscribed; else if (atom.Equals ("\\remote", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Remote; else if (atom.Equals ("\\haschildren", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.HasChildren; else if (atom.Equals ("\\hasnochildren", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.HasNoChildren; else if (atom.Equals ("\\all", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.All; else if (atom.Equals ("\\archive", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Archive; else if (atom.Equals ("\\drafts", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Drafts; else if (atom.Equals ("\\flagged", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Flagged; else if (atom.Equals ("\\important", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Important; else if (atom.Equals ("\\junk", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Junk; else if (atom.Equals ("\\sent", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Sent; else if (atom.Equals ("\\trash", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Trash; // XLIST flags: else if (atom.Equals ("\\allmail", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.All; else if (atom.Equals ("\\inbox", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Inbox; else if (atom.Equals ("\\spam", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Junk; else if (atom.Equals ("\\starred", StringComparison.OrdinalIgnoreCase)) attrs |= FolderAttributes.Flagged; } static void AddFolder (ImapEngine engine, List? list, ImapFolder? folder, string encodedName, char delim, FolderAttributes attrs, bool isLsub, bool returnsSubscribed) { if (folder != null || engine.TryGetCachedFolder (encodedName, out folder)) { if ((attrs & FolderAttributes.NonExistent) != 0) { folder.UnsetPermanentFlags (); folder.UnsetAcceptedFlags (); folder.UpdateUidNext (UniqueId.Invalid); folder.UpdateHighestModSeq (0); folder.UpdateUidValidity (0); folder.UpdateUnread (0); } if (isLsub) { // Note: merge all pre-existing attributes since the LSUB response will not contain them attrs |= folder.Attributes | FolderAttributes.Subscribed; } else { // Note: only merge the SPECIAL-USE and \Subscribed attributes for a LIST command attrs |= folder.Attributes & SpecialUseAttributes; // Note: only merge \Subscribed if the LIST command isn't expected to include it if (!returnsSubscribed) attrs |= folder.Attributes & FolderAttributes.Subscribed; } folder.UpdateAttributes (attrs); } else { folder = engine.CreateImapFolder (encodedName, attrs, delim); engine.CacheFolder (folder); if (list == null) engine.OnFolderCreated (folder); } // Note: list will be null if this is an unsolicited LIST response due to an active NOTIFY request list?.Add (folder); } static void ProcessListExtensionProperty (ImapEngine engine, ref ImapFolder? folder, string encodedName, char delim, FolderAttributes attrs, string property, string? value) { if (property.Equals ("OLDNAME", StringComparison.OrdinalIgnoreCase) && value != null) { var oldEncodedName = value.TrimEnd (delim); if (engine.FolderCache.TryGetValue (oldEncodedName, out ImapFolder? oldFolder)) { engine.FolderCache.Remove (oldEncodedName); engine.FolderCache[encodedName] = oldFolder; oldFolder.OnRenamed (encodedName, delim, attrs); folder = oldFolder; } } } static char ParseFolderSeparator (ImapToken token, string format) { if (token.Type == ImapTokenType.QString) { var qstring = (string) token.Value; return qstring.Length > 0 ? qstring[0] : '\0'; } else if (token.Type == ImapTokenType.Nil) { return '\0'; } else { throw ImapEngine.UnexpectedToken (format, token); } } /// /// Parses an untagged LIST or LSUB response. /// /// The IMAP engine. /// The list of folders to be populated. /// if it is an LSUB response; otherwise, . /// if the LIST response is expected to return \Subscribed flags; otherwise, . /// The cancellation token. public static void ParseFolderList (ImapEngine engine, List? list, bool isLsub, bool returnsSubscribed, CancellationToken cancellationToken) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, isLsub ? "LSUB" : "LIST", "{0}"); var token = engine.ReadToken (cancellationToken); var attrs = FolderAttributes.None; ImapFolder? folder = null; string encodedName; char delim; // parse the folder attributes list ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); token = engine.ReadToken (cancellationToken); while (token.Type == ImapTokenType.Flag || token.Type == ImapTokenType.Atom) { var atom = (string) token.Value; AddFolderAttribute (ref attrs, atom); token = engine.ReadToken (cancellationToken); } ImapEngine.AssertToken (token, ImapTokenType.CloseParen, format, token); // parse the path delimiter token = engine.ReadToken (cancellationToken); delim = ParseFolderSeparator (token, format); encodedName = ReadFolderName (engine, delim, format, cancellationToken); if (IsInbox (encodedName)) attrs |= FolderAttributes.Inbox; // peek at the next token to see if we have a LIST extension token = engine.PeekToken (cancellationToken); if (token.Type == ImapTokenType.OpenParen) { // read the '(' token engine.ReadToken (cancellationToken); do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; // A LIST extension (rfc5258). ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, format, token); var property = (string) token.Value; token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; engine.UngetToken (token); var value = ReadNStringToken (engine, format, false, cancellationToken); ProcessListExtensionProperty (engine, ref folder, encodedName, delim, attrs, property, value); } while (true); } while (true); } else { ImapEngine.AssertToken (token, ImapTokenType.Eoln, format, token); } AddFolder (engine, list, folder, encodedName, delim, attrs, isLsub, returnsSubscribed); } /// /// Asynchronously parses an untagged LIST or LSUB response. /// /// The IMAP engine. /// The list of folders to be populated. /// if it is an LSUB response; otherwise, . /// if the LIST response is expected to return \Subscribed flags; otherwise, . /// The cancellation token. public static async Task ParseFolderListAsync (ImapEngine engine, List? list, bool isLsub, bool returnsSubscribed, CancellationToken cancellationToken) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, isLsub ? "LSUB" : "LIST", "{0}"); var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); var attrs = FolderAttributes.None; ImapFolder? folder = null; string encodedName; char delim; // parse the folder attributes list ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); while (token.Type == ImapTokenType.Flag || token.Type == ImapTokenType.Atom) { var atom = (string) token.Value; AddFolderAttribute (ref attrs, atom); token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); } ImapEngine.AssertToken (token, ImapTokenType.CloseParen, format, token); // parse the path delimiter token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); delim = ParseFolderSeparator (token, format); encodedName = await ReadFolderNameAsync (engine, delim, format, cancellationToken).ConfigureAwait (false); if (IsInbox (encodedName)) attrs |= FolderAttributes.Inbox; // peek at the next token to see if we have a LIST extension token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenParen) { // read the '(' token await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; // A LIST extension (rfc5258). ImapEngine.AssertToken (token, ImapTokenType.Atom, ImapTokenType.QString, format, token); var property = (string) token.Value; token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; engine.UngetToken (token); var value = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); ProcessListExtensionProperty (engine, ref folder, encodedName, delim, attrs, property, value); } while (true); } while (true); } else { ImapEngine.AssertToken (token, ImapTokenType.Eoln, format, token); } AddFolder (engine, list, folder, encodedName, delim, attrs, isLsub, returnsSubscribed); } /// /// Handles an untagged LIST or LSUB response. /// /// The IMAP engine. /// The IMAP command. /// The index. /// Whether or not asynchronous IO methods should be used. public static Task UntaggedListHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { var list = (List) ic.UserData!; if (doAsync) return ParseFolderListAsync (engine, list, ic.Lsub, ic.ListReturnsSubscribed, ic.CancellationToken); ParseFolderList (engine, list, ic.Lsub, ic.ListReturnsSubscribed, ic.CancellationToken); return Task.CompletedTask; } /// /// Parses an untagged METADATA response. /// /// The encoded name of the folder that the metadata belongs to. /// The IMAP engine. /// The metadata collection to be populated. /// The cancellation token. public static void ParseMetadata (ImapEngine engine, MetadataCollection metadata, CancellationToken cancellationToken) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "METADATA", "{0}"); var encodedName = ReadStringToken (engine, format, cancellationToken); var token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); while (token.Type != ImapTokenType.CloseParen) { var tag = ReadStringToken (engine, format, cancellationToken); var value = ReadStringToken (engine, format, cancellationToken); metadata.Add (new Metadata (MetadataTag.Create (tag), value) { EncodedName = encodedName }); token = engine.PeekToken (cancellationToken); } // read the closing paren engine.ReadToken (cancellationToken); } /// /// Asynchronously parses an untagged METADATA response. /// /// The encoded name of the folder that the metadata belongs to. /// The IMAP engine. /// The metadata collection to be populated. /// The cancellation token. public static async Task ParseMetadataAsync (ImapEngine engine, MetadataCollection metadata, CancellationToken cancellationToken) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "METADATA", "{0}"); var encodedName = await ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); while (token.Type != ImapTokenType.CloseParen) { var tag = await ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); var value = await ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); metadata.Add (new Metadata (MetadataTag.Create (tag), value) { EncodedName = encodedName }); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } // read the closing paren await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); } /// /// Handles an untagged METADATA response. /// /// The IMAP engine. /// The IMAP command. /// The index. /// Whether or not asynchronous IO methods should be used. public static Task UntaggedMetadataHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { var metadata = (MetadataCollection) ic.UserData!; if (doAsync) return ParseMetadataAsync (engine, metadata, ic.CancellationToken); ParseMetadata (engine, metadata, ic.CancellationToken); return Task.CompletedTask; } internal static string ReadStringToken (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); switch (token.Type) { case ImapTokenType.Literal: return engine.ReadLiteral (cancellationToken); case ImapTokenType.QString: case ImapTokenType.Atom: return (string) token.Value; default: throw ImapEngine.UnexpectedToken (format, token); } } internal static async ValueTask ReadStringTokenAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); switch (token.Type) { case ImapTokenType.Literal: return await engine.ReadLiteralAsync (cancellationToken).ConfigureAwait (false); case ImapTokenType.QString: case ImapTokenType.Atom: return (string) token.Value; default: throw ImapEngine.UnexpectedToken (format, token); } } internal static string? ReadNStringToken (ImapEngine engine, string format, bool rfc2047, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); string value; switch (token.Type) { case ImapTokenType.Literal: value = engine.ReadLiteral (cancellationToken); break; case ImapTokenType.QString: case ImapTokenType.Atom: value = (string) token.Value; break; case ImapTokenType.Nil: return null; default: throw ImapEngine.UnexpectedToken (format, token); } if (rfc2047) return Rfc2047.DecodeText (TextEncodings.UTF8.GetBytes (value)); return value; } internal static async ValueTask ReadNStringTokenAsync (ImapEngine engine, string format, bool rfc2047, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); string value; switch (token.Type) { case ImapTokenType.Literal: value = await engine.ReadLiteralAsync (cancellationToken).ConfigureAwait (false); break; case ImapTokenType.QString: case ImapTokenType.Atom: value = (string) token.Value; break; case ImapTokenType.Nil: return null; default: throw ImapEngine.UnexpectedToken (format, token); } if (rfc2047) return Rfc2047.DecodeText (TextEncodings.UTF8.GetBytes (value)); return value; } static uint ParseNumberToken (ImapToken token, string format) { // Note: this is a work-around for broken IMAP servers that return negative integer values for things // like octet counts and line counts. if (token.Type == ImapTokenType.Atom) { var atom = (string) token.Value; if (atom.Length > 0 && atom[0] == '-') { if (!int.TryParse (atom, NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out _)) throw ImapEngine.UnexpectedToken (format, token); // Note: since Octets & Lines are the only 2 values this method is responsible for parsing, // it seems the only sane value to return would be 0. return 0; } } return ImapEngine.ParseNumber (token, false, format, token); } static uint ReadNumber (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); return ParseNumberToken (token, format); } static async ValueTask ReadNumberAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); return ParseNumberToken (token, format); } static bool NeedsQuoting (string value) { for (int i = 0; i < value.Length; i++) { if (value[i] > 127 || char.IsControl (value[i])) return true; if (QuotedSpecials.IndexOf (value[i]) != -1) return true; } return value.Length == 0; } static void ParseParameterList (StringBuilder builder, ImapEngine engine, string format, CancellationToken cancellationToken) { ImapToken token; do { token = engine.PeekToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; var name = ReadStringToken (engine, format, cancellationToken); // Note: technically, the value should also be a 'string' token and not an 'nstring', // but issue #124 reveals a server that is sending NIL for boundary values. var value = ReadNStringToken (engine, format, false, cancellationToken) ?? string.Empty; builder.Append ("; ").Append (name).Append ('='); if (NeedsQuoting (value)) MimeUtils.AppendQuoted (builder, value); else builder.Append (value); } while (true); // read the ')' engine.ReadToken (cancellationToken); } static async Task ParseParameterListAsync (StringBuilder builder, ImapEngine engine, string format, CancellationToken cancellationToken) { ImapToken token; do { token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; var name = await ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); // Note: technically, the value should also be a 'string' token and not an 'nstring', // but issue #124 reveals a server that is sending NIL for boundary values. var value = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false) ?? string.Empty; builder.Append ("; ").Append (name).Append ('='); if (NeedsQuoting (value)) MimeUtils.AppendQuoted (builder, value); else builder.Append (value); } while (true); // read the ')' await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); } //static readonly string[] MediaTypes = new string[] { "text", "application", "audio", "image", "message", "multipart", "video" }; static bool IsMediaTypeWithDefaultSubtype (string type, [NotNullWhen (true)] out string? subtype) { if (type.Equals ("text", StringComparison.OrdinalIgnoreCase)) { subtype = "plain"; return true; } if (type.Equals ("application", StringComparison.OrdinalIgnoreCase)) { subtype = "octet-stream"; return true; } if (type.Equals ("multipart", StringComparison.OrdinalIgnoreCase)) { subtype = "mixed"; return true; } // Note: if we ever decide to uncomment this, we'll *probably* have to modify ParseBodyPartAsync() unless // we want it to construct a BodyPartMessage. Most likely this will depend on an actual test-case to know // what the "correct" behavior should be. //if (type.Equals ("message", StringComparison.OrdinalIgnoreCase)) { // subtype = "rfc822"; // return true; //} subtype = null; return false; } static ContentType ParseContentType (ImapEngine engine, string format, CancellationToken cancellationToken) { var type = ReadNStringToken (engine, format, false, cancellationToken); var token = engine.PeekToken (cancellationToken); string? subtype; if (token.Type == ImapTokenType.OpenParen || token.Type == ImapTokenType.Nil) { // Note: work around broken IMAP server implementations... if (type == null) { if (token.Type == ImapTokenType.Nil) { // The type and subtype tokens are both NIL. We probably got something like: // (NIL NIL NIL NIL NIL "7BIT" 0 NIL NIL NIL NIL) // Consume the NIL subtype token. engine.ReadToken (cancellationToken); } type = "application"; subtype = "octet-stream"; } else { // Note: In some IMAP server implementations, such as the one found in // https://github.com/jstedfast/MailKit/issues/371, if the server comes // across something like "Content-Type: X-ZIP", it will only send an // empty string as the media-type. // // e.g. ( "X-ZIP" NIL ...) or ( "PLAIN" ("CHARSET" "US-ASCII") ...) // // Take special note of the leading character after the '('. if (!IsMediaTypeWithDefaultSubtype (type, out subtype)) { subtype = type; type = "application"; } } } else { type ??= "application"; subtype = ReadStringToken (engine, format, cancellationToken); } token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.Nil) return new ContentType (type, subtype); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); var builder = new StringBuilder (); builder.Append (type); builder.Append ('/'); builder.Append (subtype); ParseParameterList (builder, engine, format, cancellationToken); if (!ContentType.TryParse (builder.ToString (), out var contentType)) contentType = new ContentType (type, subtype); return contentType; } static async Task ParseContentTypeAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { var type = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); var token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); string? subtype; if (token.Type == ImapTokenType.OpenParen || token.Type == ImapTokenType.Nil) { // Note: work around broken IMAP server implementations... if (type == null) { if (token.Type == ImapTokenType.Nil) { // The type and subtype tokens are both NIL. We probably got something like: // (NIL NIL NIL NIL NIL "7BIT" 0 NIL NIL NIL NIL) // Consume the NIL subtype token. await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); } type = "application"; subtype = "octet-stream"; } else { // Note: In some IMAP server implementations, such as the one found in // https://github.com/jstedfast/MailKit/issues/371, if the server comes // across something like "Content-Type: X-ZIP", it will only send an // empty string as the media-type. // // e.g. ( "X-ZIP" NIL ...) or ( "PLAIN" ("CHARSET" "US-ASCII") ...) // // Take special note of the leading character after the '('. if (!IsMediaTypeWithDefaultSubtype (type, out subtype)) { subtype = type; type = "application"; } } } else { type ??= "application"; subtype = await ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); } token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Nil) return new ContentType (type, subtype); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); var builder = new StringBuilder (); builder.Append (type); builder.Append ('/'); builder.Append (subtype); await ParseParameterListAsync (builder, engine, format, cancellationToken).ConfigureAwait (false); if (!ContentType.TryParse (builder.ToString (), out var contentType)) contentType = new ContentType (type, subtype); return contentType; } static ContentDisposition? ParseContentDisposition (ImapEngine engine, string format, CancellationToken cancellationToken) { // body-fld-dsp = "(" string SP body-fld-param ")" / nil var token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.Nil) return null; if (token.Type != ImapTokenType.OpenParen) { // Note: this is a work-around for issue #919 where Exchange sends `"inline"` instead of `("inline" NIL)` if (token.Type == ImapTokenType.Atom || token.Type == ImapTokenType.QString) return new ContentDisposition ((string) token.Value); throw ImapEngine.UnexpectedToken (format, token); } // Exchange bug: ... (NIL NIL) ... var dsp = ReadNStringToken (engine, format, false, cancellationToken); var builder = new StringBuilder (); bool isNil = false; // Note: These are work-arounds for some bugs in some mail clients that // either leave out the disposition value or quote it. // // See https://github.com/jstedfast/MailKit/issues/486 for details. if (string.IsNullOrEmpty (dsp)) builder.Append (ContentDisposition.Attachment); else builder.Append (dsp!.Trim ('"')); token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.OpenParen) ParseParameterList (builder, engine, format, cancellationToken); else if (token.Type != ImapTokenType.Nil) throw ImapEngine.UnexpectedToken (format, token); else isNil = true; token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, format, token); if (dsp == null && isNil) return null; ContentDisposition.TryParse (builder.ToString (), out var disposition); return disposition; } static async Task ParseContentDispositionAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { // body-fld-dsp = "(" string SP body-fld-param ")" / nil var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Nil) return null; if (token.Type != ImapTokenType.OpenParen) { // Note: this is a work-around for issue #919 where Exchange sends `"inline"` instead of `("inline" NIL)` if (token.Type == ImapTokenType.Atom || token.Type == ImapTokenType.QString) return new ContentDisposition ((string) token.Value); throw ImapEngine.UnexpectedToken (format, token); } // Exchange bug: ... (NIL NIL) ... var dsp = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); var builder = new StringBuilder (); bool isNil = false; // Note: These are work-arounds for some bugs in some mail clients that // either leave out the disposition value or quote it. // // See https://github.com/jstedfast/MailKit/issues/486 for details. if (string.IsNullOrEmpty (dsp)) builder.Append (ContentDisposition.Attachment); else builder.Append (dsp!.Trim ('"')); token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenParen) await ParseParameterListAsync (builder, engine, format, cancellationToken).ConfigureAwait (false); else if (token.Type != ImapTokenType.Nil) throw ImapEngine.UnexpectedToken (format, token); else isNil = true; token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, format, token); if (dsp == null && isNil) return null; ContentDisposition.TryParse (builder.ToString (), out var disposition); return disposition; } static string[]? ParseContentLanguage (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); var languages = new List (); string? language; switch (token.Type) { case ImapTokenType.Literal: language = engine.ReadLiteral (cancellationToken); languages.Add (language); break; case ImapTokenType.QString: case ImapTokenType.Atom: language = (string) token.Value; languages.Add (language); break; case ImapTokenType.Nil: return null; case ImapTokenType.OpenParen: do { token = engine.PeekToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; // Note: Some broken IMAP servers send `NIL` tokens in this list. Just ignore them. // // See https://github.com/jstedfast/MailKit/issues/953 language = ReadNStringToken (engine, format, false, cancellationToken); if (language != null) languages.Add (language); } while (true); // read the ')' engine.ReadToken (cancellationToken); break; default: throw ImapEngine.UnexpectedToken (format, token); } return languages.ToArray (); } static async Task ParseContentLanguageAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); var languages = new List (); string? language; switch (token.Type) { case ImapTokenType.Literal: language = await engine.ReadLiteralAsync (cancellationToken).ConfigureAwait (false); languages.Add (language); break; case ImapTokenType.QString: case ImapTokenType.Atom: language = (string) token.Value; languages.Add (language); break; case ImapTokenType.Nil: return null; case ImapTokenType.OpenParen: do { token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; // Note: Some broken IMAP servers send `NIL` tokens in this list. Just ignore them. // // See https://github.com/jstedfast/MailKit/issues/953 language = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); if (language != null) languages.Add (language); } while (true); // read the ')' await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; default: throw ImapEngine.UnexpectedToken (format, token); } return languages.ToArray (); } static Uri? ParseContentLocation (string? location) { if (string.IsNullOrWhiteSpace (location)) return null; if (Uri.IsWellFormedUriString (location, UriKind.Absolute)) return new Uri (location, UriKind.Absolute); if (Uri.IsWellFormedUriString (location, UriKind.Relative)) return new Uri (location, UriKind.Relative); return null; } static Uri? ParseContentLocation (ImapEngine engine, string format, CancellationToken cancellationToken) { var location = ReadNStringToken (engine, format, false, cancellationToken); return ParseContentLocation (location); } static async Task ParseContentLocationAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { var location = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); return ParseContentLocation (location); } static void SkipBodyExtension (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); switch (token.Type) { case ImapTokenType.OpenParen: do { token = engine.PeekToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; SkipBodyExtension (engine, format, cancellationToken); } while (true); // read the ')' engine.ReadToken (cancellationToken); break; case ImapTokenType.Literal: engine.ReadLiteral (cancellationToken); break; case ImapTokenType.QString: case ImapTokenType.Atom: case ImapTokenType.Nil: break; default: throw ImapEngine.UnexpectedToken (format, token); } } static async Task SkipBodyExtensionAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); switch (token.Type) { case ImapTokenType.OpenParen: do { token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; await SkipBodyExtensionAsync (engine, format, cancellationToken).ConfigureAwait (false); } while (true); // read the ')' await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); break; case ImapTokenType.Literal: await engine.ReadLiteralAsync (cancellationToken).ConfigureAwait (false); break; case ImapTokenType.QString: case ImapTokenType.Atom: case ImapTokenType.Nil: break; default: throw ImapEngine.UnexpectedToken (format, token); } } static BodyPart ParseMultipart (ImapEngine engine, string format, string path, CancellationToken cancellationToken) { var prefix = path.Length > 0 ? path + "." : string.Empty; var bodyParts = new BodyPartCollection (); ImapToken token; int index = 1; token = engine.PeekToken (cancellationToken); if (token.Type != ImapTokenType.Nil) { do { var part = ParseBody (engine, format, prefix + index, cancellationToken); if (part != null) bodyParts.Add (part); token = engine.PeekToken (cancellationToken); index++; } while (token.Type == ImapTokenType.OpenParen); } else { // Note: Sometimes, when a multipart contains no children, IMAP servers (even Dovecot!) // will reply with a BODYSTRUCTURE that looks like (NIL "alternative" ("boundary" "... // Obviously, this is not a body-type-1part because "alternative" is a multipart subtype. // This suggests that the NIL represents an empty list of children. // // See https://github.com/jstedfast/MailKit/issues/1393 for more details. engine.ReadToken (cancellationToken); } var subtype = ReadStringToken (engine, format, cancellationToken); var contentType = new ContentType ("multipart", subtype); var body = new BodyPartMultipart (contentType, path, bodyParts); token = engine.PeekToken (cancellationToken); if (token.Type != ImapTokenType.CloseParen) { token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapTokenType.Nil, format, token); var builder = new StringBuilder (); builder.Append (body.ContentType.MediaType); builder.Append ('/'); builder.Append (body.ContentType.MediaSubtype); if (token.Type == ImapTokenType.OpenParen) ParseParameterList (builder, engine, format, cancellationToken); if (ContentType.TryParse (builder.ToString (), out contentType)) body.ContentType = contentType; token = engine.PeekToken (cancellationToken); } if (token.Type == ImapTokenType.QString) { // Note: This is a work-around for broken Exchange servers. // // See https://stackoverflow.com/questions/33481604/mailkit-fetch-unexpected-token-in-imap-response-qstring-multipart-message // for details. // Read what appears to be a Content-Description. token = engine.ReadToken (cancellationToken); // Peek ahead at the next token. It has been suggested that this next token seems to be the Content-Language value. token = engine.PeekToken (cancellationToken); } else if (token.Type != ImapTokenType.CloseParen) { body.ContentDisposition = ParseContentDisposition (engine, format, cancellationToken); token = engine.PeekToken (cancellationToken); } if (token.Type != ImapTokenType.CloseParen) { body.ContentLanguage = ParseContentLanguage (engine, format, cancellationToken); token = engine.PeekToken (cancellationToken); } if (token.Type != ImapTokenType.CloseParen) { body.ContentLocation = ParseContentLocation (engine, format, cancellationToken); token = engine.PeekToken (cancellationToken); } while (token.Type != ImapTokenType.CloseParen) { SkipBodyExtension (engine, format, cancellationToken); token = engine.PeekToken (cancellationToken); } // read the ')' engine.ReadToken (cancellationToken); return body; } static async Task ParseMultipartAsync (ImapEngine engine, string format, string path, CancellationToken cancellationToken) { var prefix = path.Length > 0 ? path + "." : string.Empty; var bodyParts = new BodyPartCollection (); ImapToken token; int index = 1; token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type != ImapTokenType.Nil) { do { var part = await ParseBodyAsync (engine, format, prefix + index, cancellationToken).ConfigureAwait (false); if (part != null) bodyParts.Add (part); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); index++; } while (token.Type == ImapTokenType.OpenParen); } else { // Note: Sometimes, when a multipart contains no children, IMAP servers (even Dovecot!) // will reply with a BODYSTRUCTURE that looks like (NIL "alternative" ("boundary" "... // Obviously, this is not a body-type-1part because "alternative" is a multipart subtype. // This suggests that the NIL represents an empty list of children. // // See https://github.com/jstedfast/MailKit/issues/1393 for more details. await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); } var subtype = await ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); var contentType = new ContentType ("multipart", subtype); var body = new BodyPartMultipart (contentType, path, bodyParts); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type != ImapTokenType.CloseParen) { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapTokenType.Nil, format, token); var builder = new StringBuilder (); builder.Append (body.ContentType.MediaType); builder.Append ('/'); builder.Append (body.ContentType.MediaSubtype); if (token.Type == ImapTokenType.OpenParen) await ParseParameterListAsync (builder, engine, format, cancellationToken).ConfigureAwait (false); if (ContentType.TryParse (builder.ToString (), out contentType)) body.ContentType = contentType; token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } if (token.Type == ImapTokenType.QString) { // Note: This is a work-around for broken Exchange servers. // // See https://stackoverflow.com/questions/33481604/mailkit-fetch-unexpected-token-in-imap-response-qstring-multipart-message // for details. // Read what appears to be a Content-Description. token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); // Peek ahead at the next token. It has been suggested that this next token seems to be the Content-Language value. token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } else if (token.Type != ImapTokenType.CloseParen) { body.ContentDisposition = await ParseContentDispositionAsync (engine, format, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } if (token.Type != ImapTokenType.CloseParen) { body.ContentLanguage = await ParseContentLanguageAsync (engine, format, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } if (token.Type != ImapTokenType.CloseParen) { body.ContentLocation = await ParseContentLocationAsync (engine, format, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } while (token.Type != ImapTokenType.CloseParen) { await SkipBodyExtensionAsync (engine, format, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } // read the ')' await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); return body; } static bool ShouldParseMultipart (ImapEngine engine, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); ImapToken nextToken; switch (token.Type) { case ImapTokenType.Atom: // Note: Technically, we should never get an Atom here, but if we do, we'll treat it as a QString. case ImapTokenType.QString: case ImapTokenType.Literal: if (engine.QuirksMode is ImapQuirksMode.GMail or ImapQuirksMode.QQMail or ImapQuirksMode.Yandex && token.Type != ImapTokenType.Literal) { // Note: GMail's IMAP server implementation breaks when it encounters nested multiparts with the same // boundary and returns a BODYSTRUCTURE like the example in https://github.com/jstedfast/MailKit/issues/205 // or like the example in https://github.com/jstedfast/MailKit/issues/777. There's also an issue with BODY // responses like the one in https://github.com/jstedfast/MailKit/issues/1841. // // ("ALTERNATIVE" ("BOUNDARY" "==alternative_xad5934455aeex") NIL NIL) // or // ("RELATED" NIL ("ATTACHMENT" NIL) NIL) // or // ("ALTERNATIVE") // // Check if the next token is either a '(', ')' or NIL. // // If it is '(', then that would indicate the start of the Content-Type parameter list. // If it is ')', then that would indicate a BODY response without a Content-Type parameter list. // If it is NIL, then it would signify that the Content-Type has no parameters. // // Note: Yandex also has this problem. See https://github.com/jstedfast/MailKit/issues/1861 // As does QQMail: https://github.com/jstedfast/MailKit/issues/1076 // Peek at the next token to see what we've got. If we get a '(' or NIL, then treat this as a multipart. nextToken = engine.PeekToken (cancellationToken); if (nextToken.Type == ImapTokenType.OpenParen || nextToken.Type == ImapTokenType.CloseParen || nextToken.Type == ImapTokenType.Nil) { // Unget the multipart subtype. engine.UngetToken (token); // Now unget a fake NIL token that represents an empty set of children. engine.UngetToken (ImapToken.Nil); return true; } // Fall through and treat things normally. } // We've got a string which normally means it's the first token of a mime-type. engine.UngetToken (token); return false; case ImapTokenType.OpenParen: // We've got children, so this is definitely a multipart. engine.UngetToken (token); return true; case ImapTokenType.Nil: // We've got a NIL token. Technically, this is illegal syntax, but we need to be able to handle it. // // There are currently 2 known examples of this: // // 1. Sometimes, when a multipart contains no children, IMAP servers (even Dovecot!) // will reply with a BODYSTRUCTURE that looks like (NIL "alternative" ("boundary" "... // Obviously, this is not a body-type-1part because "alternative" is a multipart subtype. // This suggests that the NIL represents an empty list of children. // // For an example of this particular case, see https://github.com/jstedfast/MailKit/issues/1393. // // 2. There have been several reports of Office365 sending body-type-1parts of the following form: // (NIL NIL NIL NIL NIL "7BIT" 0 NIL NIL NIL NIL) // // Presumably this is a text/plain part with no headers? // // For examples of this, see: // https://github.com/jstedfast/MailKit/issues/1415#issuecomment-1206533214 and // https://github.com/jstedfast/MailKit/issues/1446 nextToken = engine.PeekToken (cancellationToken); engine.UngetToken (token); if (nextToken.Type == ImapTokenType.Nil) { // Looks like we've probably encountered the `(NIL NIL NIL NIL NIL "7BIT" 0 NIL NIL NIL NIL)` variant. return false; } // Assume (NIL "alternative" ("boundary" "... return true; default: engine.UngetToken (token); return false; } } static async Task ShouldParseMultipartAsync (ImapEngine engine, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapToken nextToken; switch (token.Type) { case ImapTokenType.Atom: // Note: Technically, we should never get an Atom here, but if we do, we'll treat it as a QString. case ImapTokenType.QString: case ImapTokenType.Literal: if (engine.QuirksMode is ImapQuirksMode.GMail or ImapQuirksMode.QQMail or ImapQuirksMode.Yandex && token.Type != ImapTokenType.Literal) { // Note: GMail's IMAP server implementation breaks when it encounters nested multiparts with the same // boundary and returns a BODYSTRUCTURE like the example in https://github.com/jstedfast/MailKit/issues/205 // or like the example in https://github.com/jstedfast/MailKit/issues/777. There's also an issue with BODY // responses like the one in https://github.com/jstedfast/MailKit/issues/1841. // // ("ALTERNATIVE" ("BOUNDARY" "==alternative_xad5934455aeex") NIL NIL) // or // ("RELATED" NIL ("ATTACHMENT" NIL) NIL) // or // ("ALTERNATIVE") // // Check if the next token is either a '(', ')' or NIL. // // If it is '(', then that would indicate the start of the Content-Type parameter list. // If it is ')', then that would indicate a BODY response without a Content-Type parameter list. // If it is NIL, then it would signify that the Content-Type has no parameters. // // Note: Yandex also has this problem. See https://github.com/jstedfast/MailKit/issues/1861 // As does QQMail: https://github.com/jstedfast/MailKit/issues/1076 // Peek at the next token to see what we've got. If we get a '(' or NIL, then treat this as a multipart. nextToken = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (nextToken.Type == ImapTokenType.OpenParen || nextToken.Type == ImapTokenType.CloseParen || nextToken.Type == ImapTokenType.Nil) { // Unget the multipart subtype. engine.UngetToken (token); // Now unget a fake NIL token that represents an empty set of children. engine.UngetToken (ImapToken.Nil); return true; } // Fall through and treat things nomrally. } // We've got a string which normally means it's the first token of a mime-type. engine.UngetToken (token); return false; case ImapTokenType.OpenParen: // We've got children, so this is definitely a multipart. engine.UngetToken (token); return true; case ImapTokenType.Nil: // We've got a NIL token. Technically, this is illegal syntax, but we need to be able to handle it. // // There are currently 2 known examples of this: // // 1. Sometimes, when a multipart contains no children, IMAP servers (even Dovecot!) // will reply with a BODYSTRUCTURE that looks like (NIL "alternative" ("boundary" "... // Obviously, this is not a body-type-1part because "alternative" is a multipart subtype. // This suggests that the NIL represents an empty list of children. // // For an example of this particular case, see https://github.com/jstedfast/MailKit/issues/1393. // // 2. There have been several reports of Office365 sending body-type-1parts of the following form: // (NIL NIL NIL NIL NIL "7BIT" 0 NIL NIL NIL NIL) // // Presumably this is a text/plain part with no headers? // // For examples of this, see: // https://github.com/jstedfast/MailKit/issues/1415#issuecomment-1206533214 and // https://github.com/jstedfast/MailKit/issues/1446 nextToken = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); engine.UngetToken (token); if (nextToken.Type == ImapTokenType.Nil) { // Looks like we've probably encountered the `(NIL NIL NIL NIL NIL "7BIT" 0 NIL NIL NIL NIL)` variant. return false; } // Assume (NIL "alternative" ("boundary" "... return true; default: engine.UngetToken (token); return false; } } public static BodyPart? ParseBody (ImapEngine engine, string format, string path, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.Nil) return null; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); token = engine.PeekToken (cancellationToken); // Note: If we immediately get a closing ')', then treat it the same as if we had gotten a `NIL` `body` token. // // See https://github.com/jstedfast/MailKit/issues/944 for details. if (token.Type == ImapTokenType.CloseParen) { engine.ReadToken (cancellationToken); return null; } if (ShouldParseMultipart (engine, cancellationToken)) return ParseMultipart (engine, format, path, cancellationToken); var type = ParseContentType (engine, format, cancellationToken); var id = ReadNStringToken (engine, format, false, cancellationToken); var desc = ReadNStringToken (engine, format, true, cancellationToken); // Note: technically, body-fld-enc, is not allowed to be NIL, but we need to deal with broken servers... var enc = ReadNStringToken (engine, format, false, cancellationToken); var octets = ReadNumber (engine, format, cancellationToken); var isMultipart = false; BodyPartBasic body; if (type.IsMimeType ("message", "rfc822")) { var rfc822 = new BodyPartMessage (type, path); // Note: GMail (and potentially other IMAP servers) will send body-part-basic // expressions instead of body-part-msg expressions when they encounter // message/rfc822 MIME parts that are illegally encoded using base64 (or // quoted-printable?). According to rfc3501, IMAP servers are REQUIRED to // send body-part-msg expressions for message/rfc822 parts, however, it is // understandable why GMail (and other IMAP servers?) do what they do in this // particular case. // // For examples, see issue #32 and issue #59. // // The workaround is to check for the expected '(' signifying an envelope token. // If we do not get an '(', then we are likely looking at the Content-MD5 token // which gets handled below. token = engine.PeekToken (cancellationToken); if (token.Type == ImapTokenType.OpenParen) { rfc822.Envelope = ParseEnvelope (engine, cancellationToken); rfc822.Body = ParseBody (engine, format, path, cancellationToken); rfc822.Lines = ReadNumber (engine, format, cancellationToken); } body = rfc822; } else if (type.IsMimeType ("text", "*")) { var text = new BodyPartText (type, path) { Lines = ReadNumber (engine, format, cancellationToken) }; body = text; } else { isMultipart = type.IsMimeType ("multipart", "*"); body = new BodyPartBasic (type, path); } body.ContentTransferEncoding = enc; body.ContentDescription = desc; body.ContentId = id; body.Octets = octets; // if we are parsing a BODYSTRUCTURE, we may get some more tokens before the ')' token = engine.PeekToken (cancellationToken); if (!isMultipart) { if (token.Type != ImapTokenType.CloseParen) { body.ContentMd5 = ReadNStringToken (engine, format, false, cancellationToken); token = engine.PeekToken (cancellationToken); } if (token.Type != ImapTokenType.CloseParen) { body.ContentDisposition = ParseContentDisposition (engine, format, cancellationToken); token = engine.PeekToken (cancellationToken); } if (token.Type != ImapTokenType.CloseParen) { body.ContentLanguage = ParseContentLanguage (engine, format, cancellationToken); token = engine.PeekToken (cancellationToken); } if (token.Type != ImapTokenType.CloseParen && token.Type != ImapTokenType.OpenParen) { body.ContentLocation = ParseContentLocation (engine, format, cancellationToken); token = engine.PeekToken (cancellationToken); } } while (token.Type != ImapTokenType.CloseParen) { SkipBodyExtension (engine, format, cancellationToken); token = engine.PeekToken (cancellationToken); } // read the ')' engine.ReadToken (cancellationToken); return body; } public static async Task ParseBodyAsync (ImapEngine engine, string format, string path, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Nil) return null; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); // Note: If we immediately get a closing ')', then treat it the same as if we had gotten a `NIL` `body` token. // // See https://github.com/jstedfast/MailKit/issues/944 for details. if (token.Type == ImapTokenType.CloseParen) { await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); return null; } if (await ShouldParseMultipartAsync (engine, cancellationToken).ConfigureAwait (false)) return await ParseMultipartAsync (engine, format, path, cancellationToken).ConfigureAwait (false); var type = await ParseContentTypeAsync (engine, format, cancellationToken).ConfigureAwait (false); var id = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); var desc = await ReadNStringTokenAsync (engine, format, true, cancellationToken).ConfigureAwait (false); // Note: technically, body-fld-enc, is not allowed to be NIL, but we need to deal with broken servers... var enc = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); var octets = await ReadNumberAsync (engine, format, cancellationToken).ConfigureAwait (false); var isMultipart = false; BodyPartBasic body; if (type.IsMimeType ("message", "rfc822")) { var rfc822 = new BodyPartMessage (type, path); // Note: GMail (and potentially other IMAP servers) will send body-part-basic // expressions instead of body-part-msg expressions when they encounter // message/rfc822 MIME parts that are illegally encoded using base64 (or // quoted-printable?). According to rfc3501, IMAP servers are REQUIRED to // send body-part-msg expressions for message/rfc822 parts, however, it is // understandable why GMail (and other IMAP servers?) do what they do in this // particular case. // // For examples, see issue #32 and issue #59. // // The workaround is to check for the expected '(' signifying an envelope token. // If we do not get an '(', then we are likely looking at the Content-MD5 token // which gets handled below. token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.OpenParen) { rfc822.Envelope = await ParseEnvelopeAsync (engine, cancellationToken).ConfigureAwait (false); rfc822.Body = await ParseBodyAsync (engine, format, path, cancellationToken).ConfigureAwait (false); rfc822.Lines = await ReadNumberAsync (engine, format, cancellationToken).ConfigureAwait (false); } body = rfc822; } else if (type.IsMimeType ("text", "*")) { var text = new BodyPartText (type, path) { Lines = await ReadNumberAsync (engine, format, cancellationToken).ConfigureAwait (false) }; body = text; } else { isMultipart = type.IsMimeType ("multipart", "*"); body = new BodyPartBasic (type, path); } body.ContentTransferEncoding = enc; body.ContentDescription = desc; body.ContentId = id; body.Octets = octets; // if we are parsing a BODYSTRUCTURE, we may get some more tokens before the ')' token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (!isMultipart) { if (token.Type != ImapTokenType.CloseParen) { body.ContentMd5 = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } if (token.Type != ImapTokenType.CloseParen) { body.ContentDisposition = await ParseContentDispositionAsync (engine, format, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } if (token.Type != ImapTokenType.CloseParen) { body.ContentLanguage = await ParseContentLanguageAsync (engine, format, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } if (token.Type != ImapTokenType.CloseParen && token.Type != ImapTokenType.OpenParen) { body.ContentLocation = await ParseContentLocationAsync (engine, format, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } } while (token.Type != ImapTokenType.CloseParen) { await SkipBodyExtensionAsync (engine, format, cancellationToken).ConfigureAwait (false); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); } // read the ')' await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); return body; } readonly struct EnvelopeAddress { public readonly string? Name; public readonly string? Route; public readonly string? Mailbox; public readonly string? Domain; public EnvelopeAddress (string?[] values) { Name = values[0]; Route = values[1]; Mailbox = values[2]; Domain = values[3]; } public bool IsGroupStart { get { return Name == null && Route == null && Mailbox != null && Domain == null; } } public bool IsGroupEnd { get { return Name == null && Route == null && Mailbox == null && Domain == null; } } public MailboxAddress ToMailboxAddress (ImapEngine engine) { if (engine.QuirksMode == ImapQuirksMode.GMail && Name != null && Name[0] == '<' && Name[Name.Length - 1] == '>' && Mailbox != null && Domain == null) { // For whatever reason, GMail seems to sometimes break by reversing the Name and Mailbox tokens. // For an example, see the second error report in https://github.com/jstedfast/MailKit/issues/494 // where the Sender: address in the ENVELOPE has the name and address tokens flipped. // // Another example can be seen in https://github.com/jstedfast/MailKit/pull/1319. var reversed = string.Format ("{0} {1}", Mailbox, Name); try { return MailboxAddress.Parse (reversed); } catch (ParseException) { // fall through to normal processing } } var mailbox = Mailbox; var domain = Domain; string? name = null; string address; if (Name != null) name = Rfc2047.DecodePhrase (TextEncodings.UTF8.GetBytes (Name)); // Note: When parsing mailbox addresses w/o a domain, Dovecot will // use "MISSING_DOMAIN" as the domain string to prevent it from // appearing as a group address in the IMAP ENVELOPE response. if (domain == "MISSING_DOMAIN" || domain == ".MISSING-HOST-NAME.") domain = null; else if (domain != null) domain = domain.TrimEnd ('>'); if (mailbox != null) { mailbox = mailbox.TrimStart ('<'); address = domain != null ? mailbox + "@" + domain : mailbox; } else { address = string.Empty; } if (Route != null && DomainList.TryParse (Route, out var route)) return new MailboxAddress (name, route, address); return new MailboxAddress (name, address); } public GroupAddress ToGroupAddress (ImapEngine engine) { var name = string.Empty; if (Mailbox != null) name = Rfc2047.DecodePhrase (TextEncodings.UTF8.GetBytes (Mailbox)); return new GroupAddress (name); } } static bool TryAddEnvelopeAddressToken (ImapToken token, ref int index, string?[] values, bool[] qstrings, string format) { // This is a work-around for mail servers which output too many tokens for an ENVELOPE address. In at least 1 case, this happened // because the server sent a literal token as the name component and miscalculated the literal length as 38 when it was actually 69 // (likely using Unicode characters instead of UTF-8 bytes). // // The work-around is to keep merging tokens at the beginning of the list until we end up with only 4 tokens. // // See https://github.com/jstedfast/MailKit/issues/1369 for details. if (index >= 4) { if (qstrings[0]) values[0] = MimeUtils.Quote (values[0]!); if (qstrings[1]) values[1] = MimeUtils.Quote (values[1]!); values[0] = values[0] + ' ' + values[1]; qstrings[0] = false; qstrings[1] = qstrings[2]; values[1] = values[2]; qstrings[2] = qstrings[3]; values[2] = values[3]; index = 3; } switch (token.Type) { case ImapTokenType.Literal: // Return control to our caller so that it can read the literal token. qstrings[index] = false; return false; case ImapTokenType.QString: values[index] = (string) token.Value; qstrings[index] = true; break; case ImapTokenType.Atom: values[index] = (string) token.Value; qstrings[index] = false; break; case ImapTokenType.Nil: values[index] = null; qstrings[index] = false; break; default: throw ImapEngine.UnexpectedToken (format, token); } return true; } static EnvelopeAddress ParseEnvelopeAddress (ImapEngine engine, string format, CancellationToken cancellationToken) { var values = new string?[4]; var qstrings = new bool[4]; ImapToken token; int index = 0; do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; if (!TryAddEnvelopeAddressToken (token, ref index, values, qstrings, format)) values[index] = engine.ReadLiteral (cancellationToken); index++; } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, format, token); return new EnvelopeAddress (values); } static async Task ParseEnvelopeAddressAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { var values = new string?[4]; var qstrings = new bool[4]; ImapToken token; int index = 0; do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; if (!TryAddEnvelopeAddressToken (token, ref index, values, qstrings, format)) values[index] = await engine.ReadLiteralAsync (cancellationToken).ConfigureAwait (false); index++; } while (true); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, format, token); return new EnvelopeAddress (values); } static void AddEnvelopeAddress (ImapEngine engine, List stack, ref int sp, EnvelopeAddress address) { if (address.IsGroupStart && engine.QuirksMode != ImapQuirksMode.GMail) { var group = address.ToGroupAddress (engine); stack[sp].Add (group); stack.Add (group.Members); sp++; } else if (address.IsGroupEnd) { if (sp > 0) { stack.RemoveAt (sp); sp--; } } else { try { // Note: We need to do a try/catch around ToMailboxAddress() because some addresses // returned by the IMAP server might be completely horked. For an example, see the // second error report in https://github.com/jstedfast/MailKit/issues/494 where one // of the addresses in the ENVELOPE has the name and address tokens flipped. var mailbox = address.ToMailboxAddress (engine); stack[sp].Add (mailbox); } catch { return; } } } static void ParseEnvelopeAddressList (InternetAddressList list, ImapEngine engine, string format, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.Nil) return; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); var stack = new List (); int sp = 0; stack.Add (list); do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; // Note: As seen in https://github.com/jstedfast/MailKit/issues/991, it seems that SmarterMail IMAP // servers will sometimes include a NIL address token within the address list. Just ignore it. if (token.Type == ImapTokenType.Nil) continue; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); var address = ParseEnvelopeAddress (engine, format, cancellationToken); AddEnvelopeAddress (engine, stack, ref sp, address); } while (true); } static async Task ParseEnvelopeAddressListAsync (InternetAddressList list, ImapEngine engine, string format, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Nil) return; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); var stack = new List (); int sp = 0; stack.Add (list); do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; // Note: As seen in https://github.com/jstedfast/MailKit/issues/991, it seems that SmarterMail IMAP // servers will sometimes include a NIL address token within the address list. Just ignore it. if (token.Type == ImapTokenType.Nil) continue; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); var address = await ParseEnvelopeAddressAsync (engine, format, cancellationToken).ConfigureAwait (false); AddEnvelopeAddress (engine, stack, ref sp, address); } while (true); } static DateTimeOffset? ParseEnvelopeDate (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); string value; switch (token.Type) { case ImapTokenType.Literal: value = engine.ReadLiteral (cancellationToken); break; case ImapTokenType.QString: case ImapTokenType.Atom: value = (string) token.Value; break; case ImapTokenType.Nil: return null; default: throw ImapEngine.UnexpectedToken (format, token); } if (!DateUtils.TryParse (value, out var date)) return null; return date; } static async Task ParseEnvelopeDateAsync (ImapEngine engine, string format, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); string value; switch (token.Type) { case ImapTokenType.Literal: value = await engine.ReadLiteralAsync (cancellationToken).ConfigureAwait (false); break; case ImapTokenType.QString: case ImapTokenType.Atom: value = (string) token.Value; break; case ImapTokenType.Nil: return null; default: throw ImapEngine.UnexpectedToken (format, token); } if (!DateUtils.TryParse (value, out var date)) return null; return date; } /// /// Parses the ENVELOPE parenthesized list. /// /// The envelope. /// The IMAP engine. /// The cancellation token. public static Envelope ParseEnvelope (ImapEngine engine, CancellationToken cancellationToken) { string format = string.Format (ImapEngine.GenericItemSyntaxErrorFormat, "ENVELOPE", "{0}"); var token = engine.ReadToken (cancellationToken); string? nstring; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); var envelope = new Envelope (); envelope.Date = ParseEnvelopeDate (engine, format, cancellationToken); envelope.Subject = ReadNStringToken (engine, format, true, cancellationToken); ParseEnvelopeAddressList (envelope.From, engine, format, cancellationToken); ParseEnvelopeAddressList (envelope.Sender, engine, format, cancellationToken); ParseEnvelopeAddressList (envelope.ReplyTo, engine, format, cancellationToken); ParseEnvelopeAddressList (envelope.To, engine, format, cancellationToken); ParseEnvelopeAddressList (envelope.Cc, engine, format, cancellationToken); ParseEnvelopeAddressList (envelope.Bcc, engine, format, cancellationToken); // Note: Some broken IMAP servers will forget to include the In-Reply-To token (I guess if the header isn't set?). // // See https://github.com/jstedfast/MailKit/issues/932 token = engine.PeekToken (cancellationToken); if (token.Type != ImapTokenType.CloseParen) { if ((nstring = ReadNStringToken (engine, format, false, cancellationToken)) != null) envelope.InReplyTo = MimeUtils.EnumerateReferences (nstring).FirstOrDefault (); // Note: Some broken IMAP servers will forget to include the Message-Id token (I guess if the header isn't set?). // // See https://github.com/jstedfast/MailKit/issues/669 token = engine.PeekToken (cancellationToken); if (token.Type != ImapTokenType.CloseParen) { if ((nstring = ReadNStringToken (engine, format, false, cancellationToken)) != null) { try { envelope.MessageId = MimeUtils.ParseMessageId (nstring); } catch { envelope.MessageId = nstring; } } } } token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, format, token); return envelope; } /// /// Parses the ENVELOPE parenthesized list. /// /// The envelope. /// The IMAP engine. /// The cancellation token. public static async Task ParseEnvelopeAsync (ImapEngine engine, CancellationToken cancellationToken) { string format = string.Format (ImapEngine.GenericItemSyntaxErrorFormat, "ENVELOPE", "{0}"); var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); string? nstring; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, format, token); var envelope = new Envelope (); envelope.Date = await ParseEnvelopeDateAsync (engine, format, cancellationToken).ConfigureAwait (false); envelope.Subject = await ReadNStringTokenAsync (engine, format, true, cancellationToken).ConfigureAwait (false); await ParseEnvelopeAddressListAsync (envelope.From, engine, format, cancellationToken).ConfigureAwait (false); await ParseEnvelopeAddressListAsync (envelope.Sender, engine, format, cancellationToken).ConfigureAwait (false); await ParseEnvelopeAddressListAsync (envelope.ReplyTo, engine, format, cancellationToken).ConfigureAwait (false); await ParseEnvelopeAddressListAsync (envelope.To, engine, format, cancellationToken).ConfigureAwait (false); await ParseEnvelopeAddressListAsync (envelope.Cc, engine, format, cancellationToken).ConfigureAwait (false); await ParseEnvelopeAddressListAsync (envelope.Bcc, engine, format, cancellationToken).ConfigureAwait (false); // Note: Some broken IMAP servers will forget to include the In-Reply-To token (I guess if the header isn't set?). // // See https://github.com/jstedfast/MailKit/issues/932 token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type != ImapTokenType.CloseParen) { if ((nstring = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false)) != null) envelope.InReplyTo = MimeUtils.EnumerateReferences (nstring).FirstOrDefault (); // Note: Some broken IMAP servers will forget to include the Message-Id token (I guess if the header isn't set?). // // See https://github.com/jstedfast/MailKit/issues/669 token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type != ImapTokenType.CloseParen) { if ((nstring = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false)) != null) { try { envelope.MessageId = MimeUtils.ParseMessageId (nstring); } catch { envelope.MessageId = nstring; } } } } token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.CloseParen, format, token); return envelope; } /// /// Formats a flags list suitable for use with the APPEND command. /// /// The message flags. /// The string builder. /// The number of keywords. public static void FormatFlagsList (StringBuilder builder, MessageFlags flags, int numKeywords) { builder.Append ('('); if ((flags & MessageFlags.Answered) != 0) builder.Append ("\\Answered "); if ((flags & MessageFlags.Deleted) != 0) builder.Append ("\\Deleted "); if ((flags & MessageFlags.Draft) != 0) builder.Append ("\\Draft "); if ((flags & MessageFlags.Flagged) != 0) builder.Append ("\\Flagged "); if ((flags & MessageFlags.Seen) != 0) builder.Append ("\\Seen "); for (int i = 0; i < numKeywords; i++) builder.Append ("%S "); if (builder.Length > 1) builder.Length--; builder.Append (')'); } /// /// Formats a flags list suitable for use with the APPEND command. /// /// The flags list string. /// The message flags. /// The number of keywords. public static string FormatFlagsList (MessageFlags flags, int numKeywords) { var builder = new StringBuilder (); FormatFlagsList (builder, flags, numKeywords); return builder.ToString (); } static void AddFlag (ImapToken token, ref MessageFlags flags, HashSet keywords) { if (token.Type != ImapTokenType.Nil) { var flag = (string) token.Value; if (flag.Equals ("\\Answered", StringComparison.OrdinalIgnoreCase)) flags |= MessageFlags.Answered; else if (flag.Equals ("\\Deleted", StringComparison.OrdinalIgnoreCase)) flags |= MessageFlags.Deleted; else if (flag.Equals ("\\Draft", StringComparison.OrdinalIgnoreCase)) flags |= MessageFlags.Draft; else if (flag.Equals ("\\Flagged", StringComparison.OrdinalIgnoreCase)) flags |= MessageFlags.Flagged; else if (flag.Equals ("\\Seen", StringComparison.OrdinalIgnoreCase)) flags |= MessageFlags.Seen; else if (flag.Equals ("\\Recent", StringComparison.OrdinalIgnoreCase)) flags |= MessageFlags.Recent; else if (flag.Equals ("\\*", StringComparison.OrdinalIgnoreCase)) flags |= MessageFlags.UserDefined; else if (keywords != null) keywords.Add (flag); } } /// /// Parses the flags list. /// /// The message flags. /// The IMAP engine. /// The name of the flags being parsed. /// A hash set of user-defined message flags that will be populated if non-null. /// The cancellation token. public static MessageFlags ParseFlagsList (ImapEngine engine, string name, HashSet keywords, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); var flags = MessageFlags.None; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, name, token); token = engine.ReadToken (ImapStream.AtomSpecials, cancellationToken); while (token.Type == ImapTokenType.Atom || token.Type == ImapTokenType.Flag || token.Type == ImapTokenType.QString || token.Type == ImapTokenType.Nil) { AddFlag (token, ref flags, keywords); token = engine.ReadToken (ImapStream.AtomSpecials, cancellationToken); } ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, name, token); return flags; } /// /// Parses the flags list. /// /// The message flags. /// The IMAP engine. /// The name of the flags being parsed. /// A hash set of user-defined message flags that will be populated if non-null. /// The cancellation token. public static async Task ParseFlagsListAsync (ImapEngine engine, string name, HashSet keywords, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); var flags = MessageFlags.None; ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, name, token); token = await engine.ReadTokenAsync (ImapStream.AtomSpecials, cancellationToken).ConfigureAwait (false); while (token.Type == ImapTokenType.Atom || token.Type == ImapTokenType.Flag || token.Type == ImapTokenType.QString || token.Type == ImapTokenType.Nil) { AddFlag (token, ref flags, keywords); token = await engine.ReadTokenAsync (ImapStream.AtomSpecials, cancellationToken).ConfigureAwait (false); } ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, name, token); return flags; } /// /// Parses the ANNOTATION list. /// /// The list of annotations. /// The IMAP engine. /// The cancellation token. public static ReadOnlyCollection ParseAnnotations (ImapEngine engine, CancellationToken cancellationToken) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ANNOTATION", "{0}"); var token = engine.ReadToken (cancellationToken); var annotations = new List (); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, "ANNOTATION", token); do { token = engine.PeekToken (ImapStream.AtomSpecials, cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; var path = ReadStringToken (engine, format, cancellationToken); var entry = AnnotationEntry.Parse (path); var annotation = new Annotation (entry); annotations.Add (annotation); token = engine.PeekToken (cancellationToken); // Note: Unsolicited FETCH responses that include ANNOTATION data do not include attribute values. if (token.Type == ImapTokenType.OpenParen) { // consume the '(' engine.ReadToken (cancellationToken); // read the attribute/value pairs do { token = engine.PeekToken (ImapStream.AtomSpecials, cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; var name = ReadStringToken (engine, format, cancellationToken); var value = ReadNStringToken (engine, format, false, cancellationToken); var attribute = new AnnotationAttribute (name); annotation.Properties[attribute] = value; } while (true); // consume the ')' engine.ReadToken (cancellationToken); } } while (true); // consume the ')' engine.ReadToken (cancellationToken); return new ReadOnlyCollection (annotations); } /// /// Parses the ANNOTATION list. /// /// The list of annotations. /// The IMAP engine. /// The cancellation token. public static async Task> ParseAnnotationsAsync (ImapEngine engine, CancellationToken cancellationToken) { var format = string.Format (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ANNOTATION", "{0}"); var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); var annotations = new List (); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, "ANNOTATION", token); do { token = await engine.PeekTokenAsync (ImapStream.AtomSpecials, cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; var path = await ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); var entry = AnnotationEntry.Parse (path); var annotation = new Annotation (entry); annotations.Add (annotation); token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); // Note: Unsolicited FETCH responses that include ANNOTATION data do not include attribute values. if (token.Type == ImapTokenType.OpenParen) { // consume the '(' await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); // read the attribute/value pairs do { token = await engine.PeekTokenAsync (ImapStream.AtomSpecials, cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; var name = await ReadStringTokenAsync (engine, format, cancellationToken).ConfigureAwait (false); var value = await ReadNStringTokenAsync (engine, format, false, cancellationToken).ConfigureAwait (false); var attribute = new AnnotationAttribute (name); annotation.Properties[attribute] = value; } while (true); // consume the ')' await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); } } while (true); // consume the ')' await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); return new ReadOnlyCollection (annotations); } /// /// Parses the X-GM-LABELS list. /// /// The message labels. /// The IMAP engine. /// The cancellation token. public static ReadOnlyCollection ParseLabelsList (ImapEngine engine, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); var labels = new List (); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, "X-GM-LABELS", token); token = engine.ReadToken (ImapStream.AtomSpecials, cancellationToken); while (token.Type == ImapTokenType.Flag || token.Type == ImapTokenType.Atom || token.Type == ImapTokenType.QString || token.Type == ImapTokenType.Nil) { // Apparently it's possible to set a NIL label in GMail... // // See https://github.com/jstedfast/MailKit/issues/244 for an example. if (token.Type != ImapTokenType.Nil) { var label = engine.DecodeMailboxName ((string) token.Value); labels.Add (label); } else { labels.Add ((string) token.Value); } token = engine.ReadToken (ImapStream.AtomSpecials, cancellationToken); } ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, "X-GM-LABELS", token); return new ReadOnlyCollection (labels); } /// /// Parses the X-GM-LABELS list. /// /// The message labels. /// The IMAP engine. /// The cancellation token. public static async Task> ParseLabelsListAsync (ImapEngine engine, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); var labels = new List (); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericItemSyntaxErrorFormat, "X-GM-LABELS", token); token = await engine.ReadTokenAsync (ImapStream.AtomSpecials, cancellationToken).ConfigureAwait (false); while (token.Type == ImapTokenType.Flag || token.Type == ImapTokenType.Atom || token.Type == ImapTokenType.QString || token.Type == ImapTokenType.Nil) { // Apparently it's possible to set a NIL label in GMail... // // See https://github.com/jstedfast/MailKit/issues/244 for an example. if (token.Type != ImapTokenType.Nil) { var label = engine.DecodeMailboxName ((string) token.Value); labels.Add (label); } else { labels.Add ((string) token.Value); } token = await engine.ReadTokenAsync (ImapStream.AtomSpecials, cancellationToken).ConfigureAwait (false); } ImapEngine.AssertToken (token, ImapTokenType.CloseParen, ImapEngine.GenericItemSyntaxErrorFormat, "X-GM-LABELS", token); return new ReadOnlyCollection (labels); } static MessageThread ParseThread (ImapEngine engine, uint uidValidity, CancellationToken cancellationToken) { var token = engine.ReadToken (cancellationToken); MessageThread thread, node, child; uint uid; if (token.Type == ImapTokenType.OpenParen) { thread = new MessageThread ((UniqueId?) null /*UniqueId.Invalid*/); do { child = ParseThread (engine, uidValidity, cancellationToken); thread.Children.Add (child); token = engine.ReadToken (cancellationToken); } while (token.Type != ImapTokenType.CloseParen); return thread; } uid = ImapEngine.ParseNumber (token, true, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "THREAD", token); node = thread = new MessageThread (new UniqueId (uidValidity, uid)); do { token = engine.ReadToken (cancellationToken); if (token.Type == ImapTokenType.CloseParen) break; if (token.Type == ImapTokenType.OpenParen) { child = ParseThread (engine, uidValidity, cancellationToken); node.Children.Add (child); } else { uid = ImapEngine.ParseNumber (token, true, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "THREAD", token); child = new MessageThread (new UniqueId (uidValidity, uid)); node.Children.Add (child); node = child; } } while (true); return thread; } static async Task ParseThreadAsync (ImapEngine engine, uint uidValidity, CancellationToken cancellationToken) { var token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); MessageThread thread, node, child; uint uid; if (token.Type == ImapTokenType.OpenParen) { thread = new MessageThread ((UniqueId?) null /*UniqueId.Invalid*/); do { child = await ParseThreadAsync (engine, uidValidity, cancellationToken).ConfigureAwait (false); thread.Children.Add (child); token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); } while (token.Type != ImapTokenType.CloseParen); return thread; } uid = ImapEngine.ParseNumber (token, true, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "THREAD", token); node = thread = new MessageThread (new UniqueId (uidValidity, uid)); do { token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.CloseParen) break; if (token.Type == ImapTokenType.OpenParen) { child = await ParseThreadAsync (engine, uidValidity, cancellationToken).ConfigureAwait (false); node.Children.Add (child); } else { uid = ImapEngine.ParseNumber (token, true, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "THREAD", token); child = new MessageThread (new UniqueId (uidValidity, uid)); node.Children.Add (child); node = child; } } while (true); return thread; } /// /// Parses an untagged THREAD response. /// /// The task. /// The IMAP engine. /// The UIDVALIDITY of the folder. /// The list of message threads that this method will append to. /// The cancellation token. public static void ParseThreads (ImapEngine engine, uint uidValidity, List threads, CancellationToken cancellationToken) { ImapToken token; do { token = engine.PeekToken (cancellationToken); if (token.Type == ImapTokenType.Eoln) break; token = engine.ReadToken (cancellationToken); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "THREAD", token); threads.Add (ParseThread (engine, uidValidity, cancellationToken)); } while (true); } /// /// Parses the threads. /// /// The task. /// The IMAP engine. /// The UIDVALIDITY of the folder. /// THe list of message threads that will be appended to. /// The cancellation token. public static async Task ParseThreadsAsync (ImapEngine engine, uint uidValidity, List threads, CancellationToken cancellationToken) { ImapToken token; do { token = await engine.PeekTokenAsync (cancellationToken).ConfigureAwait (false); if (token.Type == ImapTokenType.Eoln) break; token = await engine.ReadTokenAsync (cancellationToken).ConfigureAwait (false); ImapEngine.AssertToken (token, ImapTokenType.OpenParen, ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "THREAD", token); threads.Add (await ParseThreadAsync (engine, uidValidity, cancellationToken).ConfigureAwait (false)); } while (true); } /// /// Handles an untagged THREAD response. /// /// The task. /// The IMAP engine. /// The IMAP command. /// THe index. /// Whether or not asynchronous IO methods should be used. public static Task UntaggedThreadHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { var threads = new List (); var folder = ic.Folder!; ic.UserData = threads; if (doAsync) return ParseThreadsAsync (engine, folder.UidValidity, threads, ic.CancellationToken); ParseThreads (engine, folder.UidValidity, threads, ic.CancellationToken); return Task.CompletedTask; } } } ================================================ FILE: MailKit/Net/NetworkOperation.cs ================================================ // // NetworkOperation.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Diagnostics; namespace MailKit.Net { enum NetworkOperationKind { Authenticate, Connect, Send } class NetworkOperation : IDisposable { #if NET6_0_OR_GREATER static readonly string[] ActivityNames = { "Authenticate", "Connect", "Send" }; static readonly string[] OperationValues = { "authenticate", "connect", "send" }; readonly NetworkOperationKind kind; readonly ClientMetrics? metrics; readonly Activity? activity; readonly long startTimestamp; readonly Uri uri; Exception? ex; NetworkOperation (NetworkOperationKind kind, Uri uri, Activity? activity, ClientMetrics? metrics) { this.kind = kind; this.uri = uri; this.activity = activity; this.metrics = metrics; if (activity is not null) { activity.AddTag ("url.scheme", uri.Scheme); activity.AddTag ("server.address", uri.Host); activity.AddTag ("server.port", uri.Port); } startTimestamp = Stopwatch.GetTimestamp (); } #else Exception? ex; NetworkOperation () { } #endif public void SetError (Exception ex) { this.ex = ex; } #if NET6_0_OR_GREATER // TagList is a huge struct, so we avoid storing it in a field to reduce the amount we allocate on the heap. TagList GetTags () { var tags = ClientMetrics.GetTags (uri, ex); tags.Add ("network.operation", OperationValues[(int) kind]); return tags; } #endif public void Dispose () { #if NET6_0_OR_GREATER if (metrics is not null && (metrics.OperationCounter.Enabled || metrics.OperationDuration.Enabled)) { var tags = GetTags (); if (metrics.OperationDuration.Enabled) { var duration = TimeSpan.FromTicks (Stopwatch.GetTimestamp () - startTimestamp).TotalMilliseconds; metrics.OperationDuration.Record (duration, tags); } if (metrics.OperationCounter.Enabled) metrics.OperationCounter.Add (1, tags); } if (activity is not null) { if (ex is not null) activity.SetStatus (ActivityStatusCode.Error); else activity.SetStatus (ActivityStatusCode.Ok); activity.Dispose (); } #endif } #if NET6_0_OR_GREATER public static NetworkOperation Start (NetworkOperationKind kind, Uri uri, ActivitySource source, ClientMetrics? metrics) { var activity = source?.StartActivity (ActivityNames[(int) kind], ActivityKind.Client); return new NetworkOperation (kind, uri, activity, metrics); } #else public static NetworkOperation Start (NetworkOperationKind kind, Uri uri) { return new NetworkOperation (); } #endif } } ================================================ FILE: MailKit/Net/NetworkStream.cs ================================================ // // NetworkStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Threading; using System.Net.Sockets; using System.Threading.Tasks; namespace MailKit.Net { class NetworkStream : Stream { SocketAsyncEventArgs? send; SocketAsyncEventArgs? recv; bool ownsSocket; bool connected; public NetworkStream (Socket socket, bool ownsSocket) { send = new SocketAsyncEventArgs (); send.Completed += AsyncOperationCompleted; send.AcceptSocket = socket; recv = new SocketAsyncEventArgs (); recv.Completed += AsyncOperationCompleted; recv.AcceptSocket = socket; this.ownsSocket = ownsSocket; connected = socket.Connected; Socket = socket; } public Socket Socket { get; private set; } public bool DataAvailable { get { return connected && Socket.Available > 0; } } public override bool CanRead { get { return connected; } } public override bool CanWrite { get { return connected; } } public override bool CanSeek { get { return false; } } public override bool CanTimeout { get { return connected; } } public override long Length { get { throw new NotSupportedException (); } } public override long Position { get { throw new NotSupportedException (); } set { throw new NotSupportedException (); } } public override int ReadTimeout { get { int timeout = Socket.ReceiveTimeout; return timeout == 0 ? Timeout.Infinite : timeout; } set { if (value <= 0 && value != Timeout.Infinite) throw new ArgumentOutOfRangeException (nameof (value)); Socket.ReceiveTimeout = value; } } public override int WriteTimeout { get { int timeout = Socket.SendTimeout; return timeout == 0 ? Timeout.Infinite : timeout; } set { if (value <= 0 && value != Timeout.Infinite) throw new ArgumentOutOfRangeException (nameof (value)); Socket.SendTimeout = value; } } void AsyncOperationCompleted (object? sender, SocketAsyncEventArgs args) { var tcs = (TaskCompletionSource) args.UserToken!; if (args.SocketError == SocketError.Success) { tcs.TrySetResult (true); return; } tcs.TrySetException (new SocketException ((int) args.SocketError)); } void Cleanup () { if (send != null) { send.Completed -= AsyncOperationCompleted; send.AcceptSocket = null; send?.Dispose (); send = null; } if (recv != null) { recv.Completed -= AsyncOperationCompleted; recv.AcceptSocket = null; recv.Dispose (); recv = null; } } void Disconnect () { try { Socket.Disconnect (false); Socket.Dispose (); } catch { return; } finally { connected = false; Cleanup (); } } public override int Read (byte[] buffer, int offset, int count) { try { return Socket.Receive (buffer, offset, count, SocketFlags.None); } catch (SocketException ex) { throw new IOException (ex.Message, ex); } } public override async Task ReadAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested (); var tcs = new TaskCompletionSource (); // Capture the ReadTimeout so even if we get an exception and disconnect the socket, we still have it. int readTimeout = ReadTimeout; using (var timeout = new CancellationTokenSource (readTimeout)) { using (var linked = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken, timeout.Token)) { using (var registration = linked.Token.Register (() => tcs.TrySetCanceled (), false)) { recv!.SetBuffer (buffer, offset, count); recv.UserToken = tcs; if (!Socket.ReceiveAsync (recv)) AsyncOperationCompleted (null, recv); try { await tcs.Task.ConfigureAwait (false); return recv.BytesTransferred; } catch (OperationCanceledException ex) { Disconnect (); if (timeout.IsCancellationRequested) throw new TimeoutException ($"Operation timed out after {readTimeout} milliseconds", ex); throw; } catch (Exception ex) { Disconnect (); if (ex is SocketException) throw new IOException (ex.Message, ex); throw; } } } } } public override void Write (byte[] buffer, int offset, int count) { try { Socket.Send (buffer, offset, count, SocketFlags.None); } catch (SocketException ex) { throw new IOException (ex.Message, ex); } } public override async Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested (); var tcs = new TaskCompletionSource (); // Capture the WriteTimeout so even if we get an exception and disconnect the socket, we still have it. int writeTimeout = WriteTimeout; using (var timeout = new CancellationTokenSource (writeTimeout)) { using (var linked = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken, timeout.Token)) { using (var registration = linked.Token.Register (() => tcs.TrySetCanceled (), false)) { send!.SetBuffer (buffer, offset, count); send.UserToken = tcs; if (!Socket.SendAsync (send)) AsyncOperationCompleted (null, send); try { await tcs.Task.ConfigureAwait (false); } catch (OperationCanceledException ex) { Disconnect (); if (timeout.IsCancellationRequested) throw new TimeoutException ($"Operation timed out after {writeTimeout} milliseconds", ex); throw; } catch (Exception ex) { Disconnect (); if (ex is SocketException) throw new IOException (ex.Message, ex); throw; } } } } } public override void Flush () { } public override Task FlushAsync (CancellationToken cancellationToken) { return Task.CompletedTask; } public override long Seek (long offset, SeekOrigin origin) { throw new NotSupportedException (); } public override void SetLength (long value) { throw new NotSupportedException (); } public static NetworkStream? Get (Stream stream) { #if !MAILKIT_LITE if (stream is CompressedStream compressed) stream = compressed.InnerStream; #endif if (stream is SslStream ssl) stream = ssl.InnerStream; return stream as NetworkStream; } public void Poll (SelectMode mode, CancellationToken cancellationToken) { if (!cancellationToken.CanBeCanceled) return; do { cancellationToken.ThrowIfCancellationRequested (); // wait 1/4 second and then re-check for cancellation } while (!Socket.Poll (250000, mode)); cancellationToken.ThrowIfCancellationRequested (); } protected override void Dispose (bool disposing) { if (disposing) { if (ownsSocket && connected) { ownsSocket = false; Disconnect (); } else { Cleanup (); } } base.Dispose (disposing); } } } ================================================ FILE: MailKit/Net/Pop3/AsyncPop3Client.cs ================================================ // // AsyncPop3Client.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Threading.Tasks; using System.Collections.Generic; using System.Collections.ObjectModel; using MimeKit; using MailKit.Security; namespace MailKit.Net.Pop3 { public partial class Pop3Client { Task SendCommandAsync (CancellationToken token, string command) { engine.QueueCommand (null, Encoding.ASCII, command); return engine.RunAsync (true, token); } Task SendCommandAsync (CancellationToken token, string format, params object[] args) { return SendCommandAsync (token, Encoding.ASCII, format, args); } async Task SendCommandAsync (CancellationToken token, Encoding encoding, string format, params object[] args) { var pc = engine.QueueCommand (null, encoding, format, args); await engine.RunAsync (true, token).ConfigureAwait (false); return pc.StatusText ?? string.Empty; } async Task ProbeCapabilitiesAsync (CancellationToken cancellationToken) { if ((engine.Capabilities & Pop3Capabilities.UIDL) == 0 && (probed & ProbedCapabilities.UIDL) == 0) { // if the message count is > 0, we can probe the UIDL command if (total > 0) { try { await GetMessageUidAsync (0, cancellationToken).ConfigureAwait (false); } catch (NotSupportedException) { } } } } async Task UpdateMessageCountAsync (CancellationToken cancellationToken) { engine.QueueCommand (ProcessStatResponse, "STAT\r\n"); await engine.RunAsync (true, cancellationToken).ConfigureAwait (false); return Count; } async Task OnAuthenticatedAsync (string message, CancellationToken cancellationToken) { engine.State = Pop3EngineState.Transaction; await engine.QueryCapabilitiesAsync (cancellationToken).ConfigureAwait (false); await UpdateMessageCountAsync (cancellationToken).ConfigureAwait (false); await ProbeCapabilitiesAsync (cancellationToken).ConfigureAwait (false); OnAuthenticated (message); } /// /// Asynchronously authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// An asynchronous task context. /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// An POP3 protocol error occurred. /// public override async Task AuthenticateAsync (SaslMechanism mechanism, CancellationToken cancellationToken = default) { var saslUri = CheckCanAuthenticate (mechanism, cancellationToken); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Authenticate); try { var ctx = GetSaslAuthContext (mechanism, saslUri); var pc = await ctx.AuthenticateAsync (cancellationToken).ConfigureAwait (false); if (pc.Status == Pop3CommandStatus.Error) throw new AuthenticationException (); pc.ThrowIfError (); await OnAuthenticatedAsync (ctx.AuthMessage!, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously authenticates using the supplied credentials. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the POP3 server supports the APOP authentication mechanism, /// then APOP is used. /// If the APOP authentication mechanism is not supported and the /// server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including /// any OAUTH mechanisms) are tried in order of greatest security to weakest /// security. Once a SASL authentication mechanism is found that both client /// and server support, the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the USER and PASS commands are used as a /// fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// In the case of the APOP authentication mechanism, remove it from the /// property instead. /// /// An asynchronous task context. /// The text encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// An POP3 protocol error occurred. /// public override async Task AuthenticateAsync (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default) { var saslUri = CheckCanAuthenticate (encoding, credentials, cancellationToken); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Authenticate); try { string userName, password; NetworkCredential? cred; string? message = null; if ((engine.Capabilities & Pop3Capabilities.Apop) != 0 && (cred = credentials.GetCredential (saslUri, "APOP")) != null) { var apop = GetApopCommand (encoding, cred); detector.IsAuthenticating = true; try { message = await SendCommandAsync (cancellationToken, encoding, apop).ConfigureAwait (false); engine.State = Pop3EngineState.Transaction; } catch (Pop3CommandException) { } finally { detector.IsAuthenticating = false; } if (engine.State == Pop3EngineState.Transaction) { await OnAuthenticatedAsync (message ?? string.Empty, cancellationToken).ConfigureAwait (false); return; } } if ((engine.Capabilities & Pop3Capabilities.Sasl) != 0) { foreach (var authmech in SaslMechanism.Rank (engine.AuthenticationMechanisms)) { SaslMechanism? sasl; cred = credentials.GetCredential (saslUri, authmech); if (cred == null || (sasl = SaslMechanism.Create (authmech, encoding, cred)) == null) continue; cancellationToken.ThrowIfCancellationRequested (); var ctx = GetSaslAuthContext (sasl, saslUri); var pc = await ctx.AuthenticateAsync (cancellationToken).ConfigureAwait (false); if (pc.Status == Pop3CommandStatus.Error) continue; pc.ThrowIfError (); await OnAuthenticatedAsync (ctx.AuthMessage!, cancellationToken).ConfigureAwait (false); return; } } // fall back to the classic USER & PASS commands... if ((cred = credentials.GetCredential (saslUri, "DEFAULT")) == null) throw new AuthenticationException ("No credentials could be found for the POP3 server."); userName = utf8 ? SaslMechanism.SaslPrep (cred.UserName) : cred.UserName; password = utf8 ? SaslMechanism.SaslPrep (cred.Password) : cred.Password; detector.IsAuthenticating = true; try { await SendCommandAsync (cancellationToken, encoding, "USER {0}\r\n", userName).ConfigureAwait (false); message = await SendCommandAsync (cancellationToken, encoding, "PASS {0}\r\n", password).ConfigureAwait (false); } catch (Pop3CommandException) { throw new AuthenticationException (); } finally { detector.IsAuthenticating = false; } await OnAuthenticatedAsync (message, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } async Task SslHandshakeAsync (SslStream ssl, string host, CancellationToken cancellationToken) { #if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER await ssl.AuthenticateAsClientAsync (GetSslClientAuthenticationOptions (host, ValidateRemoteCertificate), cancellationToken).ConfigureAwait (false); #else await ssl.AuthenticateAsClientAsync (host, ClientCertificates, SslProtocols, CheckCertificateRevocation).ConfigureAwait (false); #endif } async Task PostConnectAsync (Stream stream, string host, int port, SecureSocketOptions options, bool starttls, CancellationToken cancellationToken) { probed = ProbedCapabilities.None; try { ProtocolLogger.LogConnect (engine.Uri!); } catch { stream.Dispose (); throw; } var pop3 = new Pop3Stream (stream, ProtocolLogger); await engine.ConnectAsync (pop3, cancellationToken).ConfigureAwait (false); try { await engine.QueryCapabilitiesAsync (cancellationToken).ConfigureAwait (false); if (options == SecureSocketOptions.StartTls && (engine.Capabilities & Pop3Capabilities.StartTLS) == 0) throw new NotSupportedException ("The POP3 server does not support the STLS extension."); if (starttls && (engine.Capabilities & Pop3Capabilities.StartTLS) != 0) { await SendCommandAsync (cancellationToken, "STLS\r\n").ConfigureAwait (false); try { var tls = new SslStream (stream, false, ValidateRemoteCertificate); pop3.Stream = tls; await SslHandshakeAsync (tls, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { throw SslHandshakeException.Create (ref sslValidationInfo, ex, true, "POP3", host, port, 995, 110); } engine.IsSecure = true; // re-issue a CAPA command await engine.QueryCapabilitiesAsync (cancellationToken).ConfigureAwait (false); } } catch (Exception ex) { engine.Disconnect (ex); throw; } engine.Disconnected += OnEngineDisconnected; OnConnected (host, port, options); } /// /// Asynchronously establish a connection to the specified POP3 or POP3/S server. /// /// /// Establishes a connection to the specified POP3 or POP3/S server. /// If the has a value of 0, then the /// parameter is used to determine the default port to /// connect to. The default port used with /// is 995. All other values will use a default port of 110. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 995, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// /// /// /// /// An asynchronous task context. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// was set to /// /// and the POP3 server does not support the STLS extension. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override async Task ConnectAsync (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (host, port); ComputeDefaultValues (host, ref port, ref options, out var uri, out var starttls); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Connect, uri); try { var stream = await ConnectNetworkAsync (host, port, cancellationToken).ConfigureAwait (false); stream.WriteTimeout = timeout; stream.ReadTimeout = timeout; engine.Uri = uri; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { await SslHandshakeAsync (ssl, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "POP3", host, port, 995, 110); } stream = ssl; } await PostConnectAsync (stream, host, port, options, starttls, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously establish a connection to the specified POP3 or POP3/S server using the provided socket. /// /// /// Establishes a connection to the specified POP3 or POP3/S server using /// the provided socket. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 995, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// An asynchronous task context. /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the POP3 server does not support the STLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task ConnectAsync (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (socket, host, port); return ConnectAsync (new NetworkStream (socket, true), host, port, options, cancellationToken); } /// /// Asynchronously establish a connection to the specified POP3 or POP3/S server using the provided stream. /// /// /// Establishes a connection to the specified POP3 or POP3/S server using /// the provided stream. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 995, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// An asynchronous task context. /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the POP3 server does not support the STLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override async Task ConnectAsync (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (stream, host, port); Stream network; ComputeDefaultValues (host, ref port, ref options, out var uri, out var starttls); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Connect, uri); try { engine.Uri = uri; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { await SslHandshakeAsync (ssl, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "POP3", host, port, 995, 110); } network = ssl; } else { network = stream; } if (network.CanTimeout) { network.WriteTimeout = timeout; network.ReadTimeout = timeout; } await PostConnectAsync (network, host, port, options, starttls, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously disconnect the service. /// /// /// If is , a QUIT command will be issued in order to disconnect cleanly. /// /// /// /// /// An asynchronous task context. /// If set to , a QUIT command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// public override async Task DisconnectAsync (bool quit, CancellationToken cancellationToken = default) { CheckDisposed (); if (!engine.IsConnected) return; if (quit) { try { await SendCommandAsync (cancellationToken, "QUIT\r\n").ConfigureAwait (false); } catch (OperationCanceledException) { } catch (Pop3ProtocolException) { } catch (Pop3CommandException) { } catch (IOException) { } } disconnecting = true; engine.Disconnect (null); } /// /// Asynchronously get the message count. /// /// /// Asynchronously gets the message count. /// /// The message count. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task GetMessageCountAsync (CancellationToken cancellationToken = default) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return UpdateMessageCountAsync (cancellationToken); } /// /// Ping the POP3 server to keep the connection alive. /// /// Mail servers, if left idle for too long, will automatically drop the connection. /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task NoOpAsync (CancellationToken cancellationToken = default) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return SendCommandAsync (cancellationToken, "NOOP\r\n"); } /// /// Asynchronously enable UTF8 mode. /// /// /// The POP3 UTF8 extension allows the client to retrieve messages in the UTF-8 encoding and /// may also allow the user to authenticate using a UTF-8 encoded username or password. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The has already been authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the UTF8 extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public async Task EnableUTF8Async (CancellationToken cancellationToken = default) { if (!CheckCanEnableUTF8 ()) return; await SendCommandAsync (cancellationToken, "UTF8\r\n").ConfigureAwait (false); utf8 = true; } static async Task ReadLangResponseAsync (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { var langs = (List) pc.UserData!; do { var response = await engine.ReadLineAsync (cancellationToken).ConfigureAwait (false); if (response == ".") break; var tokens = response.Split (Space, 2); if (tokens.Length != 2) continue; langs.Add (new Pop3Language (tokens[0], tokens[1])); } while (true); } /// /// Asynchronously get the list of languages supported by the POP3 server. /// /// /// If the POP3 server supports the LANG extension, it is possible to /// query the list of languages supported by the POP3 server that can /// be used for error messages. /// /// The supported languages. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the LANG extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public async Task> GetLanguagesAsync (CancellationToken cancellationToken = default) { var pc = QueueLangCommand (out var langs); await engine.RunAsync (true, cancellationToken).ConfigureAwait (false); return new ReadOnlyCollection (langs); } /// /// Asynchronously set the language used by the POP3 server for error messages. /// /// /// If the POP3 server supports the LANG extension, it is possible to /// set the language used by the POP3 server for error messages. /// /// An asynchronous task context. /// The language code. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the LANG extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public Task SetLanguageAsync (string lang, CancellationToken cancellationToken = default) { CheckCanSetLanguage (lang); return SendCommandAsync (cancellationToken, $"LANG {lang}\r\n"); } /// /// Asynchronously get the UID of the message at the specified index. /// /// /// Gets the UID of the message at the specified index. /// Not all servers support UIDs, so you should first check the /// property for the flag or /// the convenience property. /// /// The message UID. /// The message index. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override async Task GetMessageUidAsync (int index, CancellationToken cancellationToken = default) { var pc = QueueUidlCommand (index); await engine.RunAsync (false, cancellationToken).ConfigureAwait (false); return OnUidlComplete (pc); } static async Task ReadUidlAllResponseAsync (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { do { var response = await engine.ReadLineAsync (cancellationToken).ConfigureAwait (false); if (response == ".") break; if (pc.Exception != null) continue; ParseUidlAllResponse (pc, response); } while (true); } /// /// Asynchronously get the full list of available message UIDs. /// /// /// Gets the full list of available message UIDs. /// Not all servers support UIDs, so you should first check the /// property for the flag or /// the convenience property. /// /// /// /// /// The message uids. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override async Task> GetMessageUidsAsync (CancellationToken cancellationToken = default) { var pc = QueueUidlCommand (); await engine.RunAsync (false, cancellationToken).ConfigureAwait (false); return OnUidlComplete> (pc); } /// /// Asynchronously get the size of the specified message, in bytes. /// /// /// Gets the size of the specified message, in bytes. /// /// The message size, in bytes. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override async Task GetMessageSizeAsync (int index, CancellationToken cancellationToken = default) { var pc = QueueListCommand (index); await engine.RunAsync (true, cancellationToken).ConfigureAwait (false); return (int) pc.UserData!; } static async Task ReadListAllResponseAsync (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { do { var response = await engine.ReadLineAsync (cancellationToken).ConfigureAwait (false); if (response == ".") break; if (pc.Exception != null) continue; ParseListAllResponse (pc, response); } while (true); } /// /// Asynchronously get the sizes for all available messages, in bytes. /// /// /// Gets the sizes for all available messages, in bytes. /// /// The message sizes, in bytes. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override async Task> GetMessageSizesAsync (CancellationToken cancellationToken = default) { var sizes = QueueListCommand (); await engine.RunAsync (true, cancellationToken).ConfigureAwait (false); return sizes; } /// /// Asynchronously get the headers for the message at the specified index. /// /// /// Gets the headers for the message at the specified index. /// /// The message headers. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task GetMessageHeadersAsync (int index, CancellationToken cancellationToken = default) { CheckCanDownload (index); var ctx = new DownloadHeaderContext (this, parser); return ctx.DownloadAsync (index, true, cancellationToken); } /// /// Asynchronously get the headers for the messages at the specified indexes. /// /// /// Gets the headers for the messages at the specified indexes. /// When the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message because /// it will batch the commands to reduce latency. /// /// The headers for the specified messages. /// The indexes of the messages. /// The cancellation token. /// /// is . /// /// /// One or more of the are invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task> GetMessageHeadersAsync (IList indexes, CancellationToken cancellationToken = default) { if (!CheckCanDownload (indexes)) return Task.FromResult ((IList) Array.Empty ()); var ctx = new DownloadHeaderContext (this, parser); return ctx.DownloadAsync (indexes, true, cancellationToken); } /// /// Asynchronously get the headers of the messages within the specified range. /// /// /// Gets the headers of the messages within the specified range. /// When the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message because /// it will batch the commands to reduce latency. /// /// The headers of the messages within the specified range. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task> GetMessageHeadersAsync (int startIndex, int count, CancellationToken cancellationToken = default) { if (!CheckCanDownload (startIndex, count)) return Task.FromResult ((IList) Array.Empty ()); var ctx = new DownloadHeaderContext (this, parser); return ctx.DownloadAsync (startIndex, count, true, cancellationToken); } /// /// Asynchronously get the message at the specified index. /// /// /// Gets the message at the specified index. /// /// /// /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task GetMessageAsync (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { CheckCanDownload (index); var ctx = new DownloadMessageContext (this, parser, progress); return ctx.DownloadAsync (index, false, cancellationToken); } /// /// Asynchronously get the messages at the specified indexes. /// /// /// Gets the messages at the specified indexes. /// When the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message /// because it will batch the commands to reduce latency. /// /// The messages. /// The indexes of the messages. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// One or more of the are invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task> GetMessagesAsync (IList indexes, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!CheckCanDownload (indexes)) return Task.FromResult ((IList) Array.Empty ()); var ctx = new DownloadMessageContext (this, parser, progress); return ctx.DownloadAsync (indexes, false, cancellationToken); } /// /// Asynchronously get the messages within the specified range. /// /// /// Gets the messages within the specified range. /// When the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message /// because it will batch the commands to reduce latency. /// /// /// /// /// The messages. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// The progress reporting mechanism. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task> GetMessagesAsync (int startIndex, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!CheckCanDownload (startIndex, count)) return Task.FromResult ((IList) Array.Empty ()); var ctx = new DownloadMessageContext (this, parser, progress); return ctx.DownloadAsync (startIndex, count, false, cancellationToken); } /// /// Asynchronously get the message or header stream at the specified index. /// /// /// Gets the message or header stream at the specified index. /// /// The message or header stream. /// The index of the message. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task GetStreamAsync (int index, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { CheckCanDownload (index); var ctx = new DownloadStreamContext (this, progress); return ctx.DownloadAsync (index, headersOnly, cancellationToken); } /// /// Asynchronously get the message or header streams at the specified indexes. /// /// /// Get the message or header streams at the specified indexes. /// If the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message /// because it will batch the commands to reduce latency. /// /// The message or header streams. /// The indexes of the messages. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// One or more of the are invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task> GetStreamsAsync (IList indexes, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!CheckCanDownload (indexes)) return Task.FromResult ((IList) Array.Empty ()); var ctx = new DownloadStreamContext (this, progress); return ctx.DownloadAsync (indexes, headersOnly, cancellationToken); } /// /// Asynchronously get the message or header streams within the specified range. /// /// /// Gets the message or header streams within the specified range. /// If the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message /// because it will batch the commands to reduce latency. /// /// The message or header streams. /// The index of the first stream to get. /// The number of streams to get. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task> GetStreamsAsync (int startIndex, int count, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!CheckCanDownload (startIndex, count)) return Task.FromResult ((IList) Array.Empty ()); var ctx = new DownloadStreamContext (this, progress); return ctx.DownloadAsync (startIndex, count, headersOnly, cancellationToken); } /// /// Asynchronously mark the specified message for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// /// /// /// An asynchronous task context. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task DeleteMessageAsync (int index, CancellationToken cancellationToken = default) { CheckCanDelete (index, out string seqid); return SendCommandAsync (cancellationToken, $"DELE {seqid}\r\n"); } /// /// Asynchronously mark the specified messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The indexes of the messages. /// The cancellation token. /// /// is . /// /// /// One or more of the are invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override async Task DeleteMessagesAsync (IList indexes, CancellationToken cancellationToken = default) { if (!CheckCanDelete (indexes)) return; if ((Capabilities & Pop3Capabilities.Pipelining) == 0) { for (int i = 0; i < indexes.Count; i++) await SendCommandAsync (cancellationToken, "DELE {0}\r\n", indexes[i] + 1).ConfigureAwait (false); return; } for (int i = 0; i < indexes.Count; i++) engine.QueueCommand (null, "DELE {0}\r\n", indexes[i] + 1); await engine.RunAsync (true, cancellationToken).ConfigureAwait (false); } /// /// Asynchronously mark the specified range of messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// /// /// /// An asynchronous task context. /// The index of the first message to mark for deletion. /// The number of messages to mark for deletion. /// The cancellation token. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override async Task DeleteMessagesAsync (int startIndex, int count, CancellationToken cancellationToken = default) { if (!CheckCanDelete (startIndex, count)) return; if ((Capabilities & Pop3Capabilities.Pipelining) == 0) { for (int i = 0; i < count; i++) await SendCommandAsync (cancellationToken, "DELE {0}\r\n", startIndex + i + 1).ConfigureAwait (false); return; } for (int i = 0; i < count; i++) engine.QueueCommand (null, "DELE {0}\r\n", startIndex + i + 1); await engine.RunAsync (true, cancellationToken).ConfigureAwait (false); } /// /// Asynchronously mark all messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task DeleteAllMessagesAsync (CancellationToken cancellationToken = default) { if (total > 0) return DeleteMessagesAsync (0, total, cancellationToken); return Task.CompletedTask; } /// /// Asynchronously reset the state of all messages marked for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// An awaitable task. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Task ResetAsync (CancellationToken cancellationToken = default) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return SendCommandAsync (cancellationToken, "RSET\r\n"); } } } ================================================ FILE: MailKit/Net/Pop3/IPop3Client.cs ================================================ // // IPop3Client.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; namespace MailKit.Net.Pop3 { /// /// An interface for a POP3 client. /// /// /// Implemented by . /// public interface IPop3Client : IMailSpool { /// /// Gets the capabilities supported by the POP3 server. /// /// /// The capabilities will not be known until a successful connection has been made /// and may change once the client is authenticated. /// /// /// /// /// The capabilities. /// /// Capabilities cannot be enabled, they may only be disabled. /// Pop3Capabilities Capabilities { get; set; } /// /// Gets the expiration policy. /// /// /// If the server supports the EXPIRE capability (), the value /// of the property will reflect the value advertized by the server. /// A value of -1 indicates that messages will never expire. /// A value of 0 indicates that messages that have been retrieved during the current session /// will be purged immediately after the connection is closed via the QUIT command. /// Values larger than 0 indicate the minimum number of days that the server will retain /// messages which have been retrieved. /// /// /// /// /// The expiration policy. int ExpirePolicy { get; } /// /// Gets the implementation details of the server. /// /// /// If the server advertizes its implementation details, this value will be set to a string containing the /// information details provided by the server. /// /// The implementation details. string? Implementation { get; } /// /// Gets the minimum delay, in milliseconds, between logins. /// /// /// If the server supports the LOGIN-DELAY capability (), this value /// will be set to the minimum number of milliseconds that the client must wait between logins. /// /// /// /// /// The login delay. int LoginDelay { get; } /// /// Enable UTF8 mode. /// /// /// The POP3 UTF8 extension allows the client to retrieve messages in the UTF-8 encoding and /// may also allow the user to authenticate using a UTF-8 encoded username or password. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The has already been authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the UTF8 extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// void EnableUTF8 (CancellationToken cancellationToken = default); /// /// Asynchronously enable UTF8 mode. /// /// /// The POP3 UTF8 extension allows the client to retrieve messages in the UTF-8 encoding and /// may also allow the user to authenticate using a UTF-8 encoded username or password. /// /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The has already been authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the UTF8 extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// Task EnableUTF8Async (CancellationToken cancellationToken = default); /// /// Get the list of languages supported by the POP3 server. /// /// /// If the POP3 server supports the LANG extension, it is possible to /// query the list of languages supported by the POP3 server that can /// be used for error messages. /// /// The supported languages. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the LANG extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// IList GetLanguages (CancellationToken cancellationToken = default); /// /// Asynchronously get the list of languages supported by the POP3 server. /// /// /// If the POP3 server supports the LANG extension, it is possible to /// query the list of languages supported by the POP3 server that can /// be used for error messages. /// /// The supported languages. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the LANG extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// Task> GetLanguagesAsync (CancellationToken cancellationToken = default); /// /// Set the language used by the POP3 server for error messages. /// /// /// If the POP3 server supports the LANG extension, it is possible to /// set the language used by the POP3 server for error messages. /// /// The language code. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the LANG extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// void SetLanguage (string lang, CancellationToken cancellationToken = default); /// /// Asynchronously set the language used by the POP3 server for error messages. /// /// /// If the POP3 server supports the LANG extension, it is possible to /// set the language used by the POP3 server for error messages. /// /// An asynchronous task context. /// The language code. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the LANG extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// Task SetLanguageAsync (string lang, CancellationToken cancellationToken = default); } } ================================================ FILE: MailKit/Net/Pop3/Pop3AuthenticationSecretDetector.cs ================================================ // // Pop3AuthenticationSecretDetector.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit.Net.Pop3 { class Pop3AuthenticationSecretDetector : IAuthenticationSecretDetector { static readonly IList EmptyAuthSecrets = Array.Empty (); enum Pop3AuthCommandState { None, A, Apop, ApopUserName, ApopToken, ApopNewLine, Auth, AuthMechanism, AuthNewLine, AuthToken, User, UserName, UserNewLine, Pass, Password, PassNewLine, Error } Pop3AuthCommandState state; bool isAuthenticating; int commandIndex; public bool IsAuthenticating { get { return isAuthenticating; } set { state = Pop3AuthCommandState.None; isAuthenticating = value; commandIndex = 0; } } bool SkipCommand (string command, byte[] buffer, ref int index, int endIndex) { while (index < endIndex && commandIndex < command.Length) { if (buffer[index] != (byte) command[commandIndex]) { state = Pop3AuthCommandState.Error; break; } commandIndex++; index++; } return commandIndex == command.Length; } IList DetectApopSecrets (byte[] buffer, int offset, int endIndex) { var secrets = new List (); int index = offset; int startIndex; if (state == Pop3AuthCommandState.ApopNewLine) return EmptyAuthSecrets; if (state == Pop3AuthCommandState.Apop) { if (SkipCommand ("APOP ", buffer, ref index, endIndex)) state = Pop3AuthCommandState.ApopUserName; if (index >= endIndex || state == Pop3AuthCommandState.Error) return EmptyAuthSecrets; } if (state == Pop3AuthCommandState.ApopUserName) { startIndex = index; while (index < endIndex && buffer[index] != (byte) ' ') index++; if (index > startIndex) secrets.Add (new AuthenticationSecret (startIndex, index - startIndex)); if (index < endIndex) { state = Pop3AuthCommandState.ApopToken; index++; } if (index >= endIndex) return secrets; } startIndex = index; while (index < endIndex && buffer[index] != (byte) '\r') index++; if (index < endIndex) state = Pop3AuthCommandState.ApopNewLine; if (index > startIndex) secrets.Add (new AuthenticationSecret (startIndex, index - startIndex)); return secrets; } IList DetectAuthSecrets (byte[] buffer, int offset, int endIndex) { int index = offset; if (state == Pop3AuthCommandState.Auth) { if (SkipCommand ("AUTH ", buffer, ref index, endIndex)) state = Pop3AuthCommandState.AuthMechanism; if (index >= endIndex || state == Pop3AuthCommandState.Error) return EmptyAuthSecrets; } if (state == Pop3AuthCommandState.AuthMechanism) { while (index < endIndex && buffer[index] != (byte) ' ' && buffer[index] != (byte) '\r') index++; if (index < endIndex) { if (buffer[index] == (byte) ' ') { state = Pop3AuthCommandState.AuthToken; } else { state = Pop3AuthCommandState.AuthNewLine; } index++; } if (index >= endIndex) return EmptyAuthSecrets; } if (state == Pop3AuthCommandState.AuthNewLine) { if (buffer[index] == (byte) '\n') { state = Pop3AuthCommandState.AuthToken; index++; } else { state = Pop3AuthCommandState.Error; } if (index >= endIndex || state == Pop3AuthCommandState.Error) return EmptyAuthSecrets; } int startIndex = index; while (index < endIndex && buffer[index] != (byte) '\r') index++; if (index < endIndex) state = Pop3AuthCommandState.AuthNewLine; if (index == startIndex) return EmptyAuthSecrets; var secret = new AuthenticationSecret (startIndex, index - startIndex); if (state == Pop3AuthCommandState.AuthNewLine) { index++; if (index < endIndex) { if (buffer[index] == (byte) '\n') { state = Pop3AuthCommandState.AuthToken; } else { state = Pop3AuthCommandState.Error; } } } return new AuthenticationSecret[] { secret }; } IList DetectUserPassSecrets (byte[] buffer, int offset, int endIndex) { var secrets = new List (); int index = offset; if (state == Pop3AuthCommandState.User) { if (SkipCommand ("USER ", buffer, ref index, endIndex)) state = Pop3AuthCommandState.UserName; if (index >= endIndex || state == Pop3AuthCommandState.Error) return EmptyAuthSecrets; } if (state == Pop3AuthCommandState.UserName) { int startIndex = index; while (index < endIndex && buffer[index] != (byte) '\r') index++; if (index > startIndex) secrets.Add (new AuthenticationSecret (startIndex, index - startIndex)); if (index < endIndex) { state = Pop3AuthCommandState.UserNewLine; index++; } if (index >= endIndex) return secrets; } if (state == Pop3AuthCommandState.UserNewLine) { if (buffer[index] == (byte) '\n') { state = Pop3AuthCommandState.Pass; commandIndex = 0; index++; } else { state = Pop3AuthCommandState.Error; } if (index >= endIndex || state == Pop3AuthCommandState.Error) return secrets; } if (state == Pop3AuthCommandState.Pass) { if (SkipCommand ("PASS ", buffer, ref index, endIndex)) state = Pop3AuthCommandState.Password; if (index >= endIndex || state == Pop3AuthCommandState.Error) return EmptyAuthSecrets; } if (state == Pop3AuthCommandState.Password) { int startIndex = index; while (index < endIndex && buffer[index] != (byte) '\r') index++; if (index > startIndex) secrets.Add (new AuthenticationSecret (startIndex, index - startIndex)); if (index < endIndex) { state = Pop3AuthCommandState.PassNewLine; index++; } if (index >= endIndex) return secrets; } if (state == Pop3AuthCommandState.PassNewLine) { if (buffer[index] == (byte) '\n') { state = Pop3AuthCommandState.None; commandIndex = 0; index++; } else { state = Pop3AuthCommandState.Error; } } return secrets; } public IList DetectSecrets (byte[] buffer, int offset, int count) { if (!IsAuthenticating || state == Pop3AuthCommandState.Error || count == 0) return EmptyAuthSecrets; int endIndex = offset + count; int index = offset; if (state == Pop3AuthCommandState.None) { switch ((char) buffer[index]) { case 'A': state = Pop3AuthCommandState.A; index++; break; case 'U': state = Pop3AuthCommandState.User; commandIndex = 1; index++; break; default: state = Pop3AuthCommandState.Error; break; } if (index >= endIndex || state == Pop3AuthCommandState.Error) return EmptyAuthSecrets; } if (state == Pop3AuthCommandState.A) { switch ((char) buffer[index]) { case 'P': state = Pop3AuthCommandState.Apop; commandIndex = 2; index++; break; case 'U': state = Pop3AuthCommandState.Auth; commandIndex = 2; index++; break; default: state = Pop3AuthCommandState.Error; break; } if (index >= endIndex || state == Pop3AuthCommandState.Error) return EmptyAuthSecrets; } if (state >= Pop3AuthCommandState.Apop && state <= Pop3AuthCommandState.ApopNewLine) return DetectApopSecrets (buffer, index, endIndex); if (state >= Pop3AuthCommandState.Auth && state <= Pop3AuthCommandState.AuthToken) return DetectAuthSecrets (buffer, index, endIndex); return DetectUserPassSecrets (buffer, index, endIndex); } } } ================================================ FILE: MailKit/Net/Pop3/Pop3Capabilities.cs ================================================ // // Pop3Capabilities.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Net.Pop3 { /// /// Capabilities supported by a POP3 server. /// /// /// Capabilities are read as part of the response to the CAPA command that /// is issued during the connection and authentication phases of the /// . /// /// /// /// [Flags] public enum Pop3Capabilities : uint { /// /// The server does not support any additional extensions. /// None = 0, /// /// The server supports APOP /// authentication. /// Apop = 1 << 0, /// /// The server supports the EXPIRE extension /// and defines the expiration policy for messages (see ). /// Expire = 1 << 1, /// /// The server supports the LOGIN-DELAY extension, /// allowing the server to specify to the client a minimum number of seconds between login attempts /// (see ). /// LoginDelay = 1 << 2, /// /// The server supports the PIPELINING extension, /// allowing the client to batch multiple requests to the server at at time. /// Pipelining = 1 << 3, /// /// The server supports the RESP-CODES extension, /// allowing the server to provide clients with extended information in error responses. /// ResponseCodes = 1 << 4, /// /// The server supports the SASL authentication /// extension, allowing the client to authenticate using the advertized authentication mechanisms /// (see ). /// Sasl = 1 << 5, /// /// The server supports the STLS extension, /// allowing clients to switch to an encrypted SSL/TLS connection after connecting. /// StartTLS = 1 << 6, /// /// The server supports the TOP command, /// allowing clients to fetch the headers plus an arbitrary number of lines. /// Top = 1 << 7, /// /// The server supports the UIDL command, /// allowing the client to refer to messages via a UID as opposed to a sequence ID. /// UIDL = 1 << 8, /// /// The server supports the USER /// authentication command, allowing the client to authenticate via a plain-text username /// and password command (not recommended unless no other authentication mechanisms exist). /// User = 1 << 9, /// /// The server supports the UTF8 extension, /// allowing clients to retrieve messages in the UTF-8 encoding. /// UTF8 = 1 << 10, /// /// The server supports the UTF8=USER extension, /// allowing clients to authenticate using UTF-8 encoded usernames and passwords. /// UTF8User = 1 << 11, /// /// The server supports the LANG extension, /// allowing clients to specify which language the server should use for error strings. /// Lang = 1 << 12, } } ================================================ FILE: MailKit/Net/Pop3/Pop3Client.cs ================================================ // // Pop3Client.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Buffers; using System.Threading; using System.Net.Sockets; using System.Net.Security; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Security.Cryptography; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using MimeKit; using MimeKit.IO; using MailKit.Security; using SslStream = MailKit.Net.SslStream; using AuthenticationException = MailKit.Security.AuthenticationException; namespace MailKit.Net.Pop3 { /// /// A POP3 client that can be used to retrieve messages from a server. /// /// /// The class supports both the "pop" and "pops" protocols. The "pop" protocol /// makes a clear-text connection to the POP3 server and does not use SSL or TLS unless the POP3 server /// supports the STLS extension. The "pops" protocol, /// however, connects to the POP3 server using an SSL-wrapped connection. /// /// /// /// public partial class Pop3Client : MailSpool, IPop3Client { [Flags] enum ProbedCapabilities : byte { None = 0, Top = (1 << 0), UIDL = (1 << 1) } static readonly char[] Space = new char[] { ' ' }; readonly Pop3AuthenticationSecretDetector detector = new Pop3AuthenticationSecretDetector (); readonly MimeParser parser = new MimeParser (Stream.Null); readonly Pop3Engine engine; SslCertificateValidationInfo? sslValidationInfo; ProbedCapabilities probed; bool disposed, disconnecting, utf8; int timeout = 2 * 60 * 1000; long octets; int total; /// /// Initializes a new instance of the class. /// /// /// Before you can retrieve messages with the , you must first call /// one of the Connect methods /// and authenticate using one of the /// Authenticate methods. /// /// /// /// /// The protocol logger. /// /// is . /// public Pop3Client (IProtocolLogger protocolLogger) : base (protocolLogger) { protocolLogger.AuthenticationSecretDetector = detector; engine = new Pop3Engine (); } /// /// Initializes a new instance of the class. /// /// /// Before you can retrieve messages with the , you must first call /// one of the Connect methods /// and authenticate using one of the /// Authenticate methods. /// public Pop3Client () : this (new NullProtocolLogger ()) { } /// /// Gets an object that can be used to synchronize access to the POP3 server. /// /// /// Gets an object that can be used to synchronize access to the POP3 server. /// When using the non-Async methods from multiple threads, it is important to lock the /// object for thread safety when using the synchronous methods. /// /// The lock object. public override object SyncRoot { get { return engine; } } /// /// Gets the protocol supported by the message service. /// /// /// Gets the protocol supported by the message service. /// /// The protocol. protected override string Protocol { get { return "pop"; } } /// /// Gets the capabilities supported by the POP3 server. /// /// /// The capabilities will not be known until a successful connection has been made /// and may change once the client is authenticated. /// /// /// /// /// The capabilities. /// /// Capabilities cannot be enabled, they may only be disabled. /// public Pop3Capabilities Capabilities { get { return engine.Capabilities; } set { if ((engine.Capabilities | value) > engine.Capabilities) throw new ArgumentException ("Capabilities cannot be enabled, they may only be disabled.", nameof (value)); engine.Capabilities = value; } } /// /// Gets the expiration policy. /// /// /// If the server supports the EXPIRE capability (), the value /// of the property will reflect the value advertized by the server. /// A value of -1 indicates that messages will never expire. /// A value of 0 indicates that messages that have been retrieved during the current session /// will be purged immediately after the connection is closed via the QUIT command. /// Values larger than 0 indicate the minimum number of days that the server will retain /// messages which have been retrieved. /// /// /// /// /// The expiration policy. public int ExpirePolicy { get { return engine.ExpirePolicy; } } /// /// Gets the implementation details of the server. /// /// /// If the server advertizes its implementation details, this value will be set to a string containing the /// information details provided by the server. /// /// The implementation details. public string? Implementation { get { return engine.Implementation; } } /// /// Gets the minimum delay, in milliseconds, between logins. /// /// /// If the server supports the LOGIN-DELAY capability (), this value /// will be set to the minimum number of milliseconds that the client must wait between logins. /// /// /// /// /// The login delay. public int LoginDelay { get { return engine.LoginDelay; } } /// /// Get the size of the POP3 mailbox, in bytes. /// /// /// Gets the size of the POP3 mailbox, in bytes. /// This value is updated as a side-effect of calling or . /// /// The size of the mailbox if available. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// public long Size { get { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return octets; } } void CheckDisposed () { if (disposed) throw new ObjectDisposedException (nameof (Pop3Client)); } void CheckConnected () { if (!IsConnected) throw new ServiceNotConnectedException ("The Pop3Client is not connected."); } void CheckAuthenticated () { if (!IsAuthenticated) throw new ServiceNotAuthenticatedException ("The Pop3Client has not been authenticated."); } bool ValidateRemoteCertificate (object? sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) { var host = engine.Uri!.Host; bool valid; sslValidationInfo?.Dispose (); sslValidationInfo = null; if (ServerCertificateValidationCallback != null) { valid = ServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); #if NETFRAMEWORK } else if (ServicePointManager.ServerCertificateValidationCallback != null) { valid = ServicePointManager.ServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); #endif } else { valid = DefaultServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); } if (!valid) { // Note: The SslHandshakeException.Create() method will nullify this once it's done using it. sslValidationInfo = new SslCertificateValidationInfo (host, certificate, chain, sslPolicyErrors); } return valid; } static ProtocolException CreatePop3ParseException (Exception innerException, string format, params object[] args) { return new Pop3ProtocolException (string.Format (CultureInfo.InvariantCulture, format, args), innerException); } static ProtocolException CreatePop3ParseException (string format, params object[] args) { return new Pop3ProtocolException (string.Format (CultureInfo.InvariantCulture, format, args)); } static int GetExpectedSequenceId (Pop3Command pc) { int index = pc.Command.IndexOf (' ') + 1; int endIndex = pc.Command.IndexOf ('\r', index); #if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER var seqid = pc.Command.AsSpan (index, endIndex - index); #else var seqid = pc.Command.Substring (index, endIndex - index); #endif return int.Parse (seqid, NumberStyles.None, CultureInfo.InvariantCulture); } void SendCommand (CancellationToken token, string command) { engine.QueueCommand (null, Encoding.ASCII, command); engine.Run (true, token); } string SendCommand (CancellationToken token, string format, params object[] args) { return SendCommand (token, Encoding.ASCII, format, args); } string SendCommand (CancellationToken token, Encoding encoding, string format, params object[] args) { var pc = engine.QueueCommand (null, encoding, format, args); engine.Run (true, token); return pc.StatusText ?? string.Empty; } #region IMailService implementation /// /// Gets the authentication mechanisms supported by the POP3 server. /// /// /// The authentication mechanisms are queried as part of the /// connection process. /// Servers that do not support the SASL capability will typically /// support either the APOP authentication mechanism /// () or the ability to login using the /// USER and PASS commands (). /// /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before authenticating. /// In the case of the APOP authentication mechanism, remove it from the /// property instead. /// /// /// /// /// The authentication mechanisms. public override HashSet AuthenticationMechanisms { get { return engine.AuthenticationMechanisms; } } /// /// Gets or sets the timeout for network streaming operations, in milliseconds. /// /// /// Gets or sets the underlying socket stream's /// and values. /// /// The timeout in milliseconds. public override int Timeout { get { return timeout; } set { if (engine.IsConnected && engine.Stream.CanTimeout) { engine.Stream.WriteTimeout = value; engine.Stream.ReadTimeout = value; } timeout = value; } } /// /// Gets whether or not the client is currently connected to an POP3 server. /// /// /// The state is set to immediately after /// one of the Connect /// methods succeeds and is not set back to until either the client /// is disconnected via or until a /// is thrown while attempting to read or write to /// the underlying network socket. /// When an is caught, the connection state of the /// should be checked before continuing. /// /// /// /// /// if the client is connected; otherwise, . public override bool IsConnected { get { return engine.IsConnected; } } /// /// Get whether or not the connection is secure (typically via SSL or TLS). /// /// /// Gets whether or not the connection is secure (typically via SSL or TLS). /// /// if the connection is secure; otherwise, . public override bool IsSecure { get { return engine.IsSecure; } } /// /// Get whether or not the connection is encrypted (typically via SSL or TLS). /// /// /// Gets whether or not the connection is encrypted (typically via SSL or TLS). /// /// if the connection is encrypted; otherwise, . public override bool IsEncrypted { get { return engine.IsSecure && (engine.Stream.Stream is SslStream sslStream) && sslStream.IsEncrypted; } } /// /// Get whether or not the connection is signed (typically via SSL or TLS). /// /// /// Gets whether or not the connection is signed (typically via SSL or TLS). /// /// if the connection is signed; otherwise, . public override bool IsSigned { get { return engine.IsSecure && (engine.Stream.Stream is SslStream sslStream) && sslStream.IsSigned; } } /// /// Get the negotiated SSL or TLS protocol version. /// /// /// Gets the negotiated SSL or TLS protocol version once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS protocol version. public override SslProtocols SslProtocol { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.SslProtocol; return SslProtocols.None; } } /// /// Get the negotiated SSL or TLS cipher algorithm. /// /// /// Gets the negotiated SSL or TLS cipher algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS cipher algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override CipherAlgorithmType? SslCipherAlgorithm { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.CipherAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS cipher algorithm strength. /// /// /// Gets the negotiated SSL or TLS cipher algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS cipher algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslCipherStrength { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.CipherStrength; return null; } } #if NET5_0_OR_GREATER /// /// Get the negotiated SSL or TLS cipher suite. /// /// /// Gets the negotiated SSL or TLS cipher suite once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher suite. public override TlsCipherSuite? SslCipherSuite { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.NegotiatedCipherSuite; return null; } } #endif /// /// Get the negotiated SSL or TLS hash algorithm. /// /// /// Gets the negotiated SSL or TLS hash algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS hash algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override HashAlgorithmType? SslHashAlgorithm { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.HashAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS hash algorithm strength. /// /// /// Gets the negotiated SSL or TLS hash algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS hash algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslHashStrength { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.HashStrength; return null; } } /// /// Get the negotiated SSL or TLS key exchange algorithm. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS key exchange algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override ExchangeAlgorithmType? SslKeyExchangeAlgorithm { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.KeyExchangeAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS key exchange algorithm strength. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS key exchange algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslKeyExchangeStrength { get { if (engine.IsSecure && (engine.Stream.Stream is SslStream sslStream)) return sslStream.KeyExchangeStrength; return null; } } /// /// Get whether or not the client is currently authenticated with the POP3 server. /// /// /// Gets whether or not the client is currently authenticated with the POP3 server. /// To authenticate with the POP3 server, use one of the /// Authenticate methods. /// /// if the client is authenticated; otherwise, . public override bool IsAuthenticated { get { return engine.State == Pop3EngineState.Transaction; } } Task ProcessStatResponse (Pop3Engine engine, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (pc.Status != Pop3CommandStatus.Ok) return Task.CompletedTask; // the response should be " " var tokens = text.Split (Space, StringSplitOptions.RemoveEmptyEntries); if (tokens.Length < 2) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an incomplete response to the STAT command: {0}", text); return Task.CompletedTask; } if (!int.TryParse (tokens[0], NumberStyles.None, CultureInfo.InvariantCulture, out total) || total < 0) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an invalid response to the STAT command: {0}", text); return Task.CompletedTask; } if (!long.TryParse (tokens[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out octets)) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an invalid response to the STAT command: {0}", text); return Task.CompletedTask; } return Task.CompletedTask; } int UpdateMessageCount (CancellationToken cancellationToken) { engine.QueueCommand (ProcessStatResponse, "STAT\r\n"); engine.Run (true, cancellationToken); return Count; } void ProbeCapabilities (CancellationToken cancellationToken) { if ((engine.Capabilities & Pop3Capabilities.UIDL) == 0 && (probed & ProbedCapabilities.UIDL) == 0) { // if the message count is > 0, we can probe the UIDL command if (total > 0) { try { GetMessageUid (0, cancellationToken); } catch (NotSupportedException) { } } } } class SaslAuthContext { readonly SaslMechanism mechanism; readonly Pop3Client client; public SaslAuthContext (Pop3Client client, SaslMechanism mechanism) { this.mechanism = mechanism; this.client = client; } public string? AuthMessage { get; private set; } Pop3Engine Engine { get { return client.engine; } } void OnDataReceived (Pop3Engine pop3, Pop3Command pc, string text, CancellationToken cancellationToken) { pop3.CheckConnected (); while (pc.Status == Pop3CommandStatus.Continue && !mechanism.IsAuthenticated) { var challenge = mechanism.Challenge (text, cancellationToken); var buf = Encoding.ASCII.GetBytes (challenge + "\r\n"); pop3.Stream.Write (buf, 0, buf.Length, cancellationToken); pop3.Stream.Flush (cancellationToken); var response = pop3.ReadLine (cancellationToken).TrimEnd (); pc.Status = Pop3Engine.GetCommandStatus (response, out text); pc.StatusText = text; if (pc.Status == Pop3CommandStatus.ProtocolError) throw new Pop3ProtocolException (string.Format ("Unexpected response from server: {0}", response)); } AuthMessage = text; } async Task OnDataReceivedAsync (Pop3Engine pop3, Pop3Command pc, string text, CancellationToken cancellationToken) { pop3.CheckConnected (); while (pc.Status == Pop3CommandStatus.Continue && !mechanism.IsAuthenticated) { var challenge = await mechanism.ChallengeAsync (text, cancellationToken).ConfigureAwait (false); var buf = Encoding.ASCII.GetBytes (challenge + "\r\n"); await pop3.Stream.WriteAsync (buf, 0, buf.Length, cancellationToken).ConfigureAwait (false); await pop3.Stream.FlushAsync (cancellationToken).ConfigureAwait (false); var response = (await pop3.ReadLineAsync (cancellationToken).ConfigureAwait (false)).TrimEnd (); pc.Status = Pop3Engine.GetCommandStatus (response, out text); pc.StatusText = text; if (pc.Status == Pop3CommandStatus.ProtocolError) throw new Pop3ProtocolException (string.Format ("Unexpected response from server: {0}", response)); } AuthMessage = text; } Task OnDataReceived (Pop3Engine pop3, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (doAsync) return OnDataReceivedAsync (pop3, pc, text, cancellationToken); OnDataReceived (pop3, pc, text, cancellationToken); return Task.CompletedTask; } public Pop3Command Authenticate (CancellationToken cancellationToken) { var pc = Engine.QueueCommand (OnDataReceived, "AUTH {0}\r\n", mechanism.MechanismName); AuthMessage = string.Empty; client.detector.IsAuthenticating = true; try { // Note: We defer throwing exceptions on command failure so that our caller can continue trying other authentication mechanisms. Engine.Run (false, cancellationToken); } finally { client.detector.IsAuthenticating = false; } return pc; } public async Task AuthenticateAsync (CancellationToken cancellationToken) { var pc = Engine.QueueCommand (OnDataReceived, "AUTH {0}\r\n", mechanism.MechanismName); AuthMessage = string.Empty; client.detector.IsAuthenticating = true; try { // Note: We defer throwing exceptions on command failure so that our caller can continue trying other authentication mechanisms. await Engine.RunAsync (false, cancellationToken).ConfigureAwait (false); } finally { client.detector.IsAuthenticating = false; } return pc; } } Uri CheckCanAuthenticate (SaslMechanism mechanism, CancellationToken cancellationToken) { if (mechanism == null) throw new ArgumentNullException (nameof (mechanism)); if (!engine.IsConnected) throw new ServiceNotConnectedException ("The Pop3Client must be connected before you can authenticate."); if (IsAuthenticated) throw new InvalidOperationException ("The Pop3Client is already authenticated."); CheckDisposed (); cancellationToken.ThrowIfCancellationRequested (); return new Uri ("pop://" + engine.Uri.Host); } SaslAuthContext GetSaslAuthContext (SaslMechanism mechanism, Uri saslUri) { mechanism.ChannelBindingContext = engine.Stream!.Stream as IChannelBindingContext; mechanism.Uri = saslUri; return new SaslAuthContext (this, mechanism); } void OnAuthenticated (string message, CancellationToken cancellationToken) { engine.State = Pop3EngineState.Transaction; engine.QueryCapabilities (cancellationToken); UpdateMessageCount (cancellationToken); ProbeCapabilities (cancellationToken); OnAuthenticated (message); } /// /// Authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// An POP3 protocol error occurred. /// public override void Authenticate (SaslMechanism mechanism, CancellationToken cancellationToken = default) { var saslUri = CheckCanAuthenticate (mechanism, cancellationToken); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Authenticate); try { var ctx = GetSaslAuthContext (mechanism, saslUri); var pc = ctx.Authenticate (cancellationToken); if (pc.Status == Pop3CommandStatus.Error) throw new AuthenticationException (); pc.ThrowIfError (); OnAuthenticated (ctx.AuthMessage!, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } Uri CheckCanAuthenticate (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); if (credentials == null) throw new ArgumentNullException (nameof (credentials)); if (!engine.IsConnected) throw new ServiceNotConnectedException ("The Pop3Client must be connected before you can authenticate."); if (IsAuthenticated) throw new InvalidOperationException ("The Pop3Client is already authenticated."); CheckDisposed (); cancellationToken.ThrowIfCancellationRequested (); return new Uri ("pop://" + engine.Uri.Host); } string GetApopCommand (Encoding encoding, NetworkCredential cred) { var userName = utf8 ? SaslMechanism.SaslPrep (cred.UserName) : cred.UserName; var password = utf8 ? SaslMechanism.SaslPrep (cred.Password) : cred.Password; var challenge = engine.ApopToken + password; var md5sum = new StringBuilder (); byte[] digest; using (var md5 = MD5.Create ()) digest = md5.ComputeHash (encoding.GetBytes (challenge)); for (int i = 0; i < digest.Length; i++) md5sum.Append (digest[i].ToString ("x2")); return $"APOP {userName} {md5sum}\r\n"; } /// /// Authenticate using the supplied credentials. /// /// /// Authenticates using the supplied credentials. /// If the POP3 server supports the APOP authentication mechanism, /// then APOP is used. /// If the APOP authentication mechanism is not supported and the /// server supports one or more SASL authentication mechanisms, then /// the SASL mechanisms that both the client and server support (not including /// any OAUTH mechanisms) are tried in order of greatest security to weakest /// security. Once a SASL authentication mechanism is found that both client /// and server support, the credentials are used to authenticate. /// If the server does not support SASL or if no common SASL mechanisms /// can be found, then the USER and PASS commands are used as a /// fallback. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// In the case of the APOP authentication mechanism, remove it from the /// property instead. /// /// The text encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// An POP3 protocol error occurred. /// public override void Authenticate (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default) { var saslUri = CheckCanAuthenticate (encoding, credentials, cancellationToken); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Authenticate); try { string userName, password; NetworkCredential? cred; string? message = null; if ((engine.Capabilities & Pop3Capabilities.Apop) != 0 && (cred = credentials.GetCredential (saslUri, "APOP")) != null) { var apop = GetApopCommand (encoding, cred); detector.IsAuthenticating = true; try { message = SendCommand (cancellationToken, encoding, apop); engine.State = Pop3EngineState.Transaction; } catch (Pop3CommandException) { } finally { detector.IsAuthenticating = false; } if (engine.State == Pop3EngineState.Transaction) { OnAuthenticated (message ?? string.Empty, cancellationToken); return; } } if ((engine.Capabilities & Pop3Capabilities.Sasl) != 0) { foreach (var authmech in SaslMechanism.Rank (engine.AuthenticationMechanisms)) { SaslMechanism? sasl; cred = credentials.GetCredential (saslUri, authmech); if (cred == null || (sasl = SaslMechanism.Create (authmech, encoding, cred)) == null) continue; cancellationToken.ThrowIfCancellationRequested (); var ctx = GetSaslAuthContext (sasl, saslUri); var pc = ctx.Authenticate (cancellationToken); if (pc.Status == Pop3CommandStatus.Error) continue; pc.ThrowIfError (); OnAuthenticated (ctx.AuthMessage!, cancellationToken); return; } } // fall back to the classic USER & PASS commands... if ((cred = credentials.GetCredential (saslUri, "DEFAULT")) == null) throw new AuthenticationException ("No credentials could be found for the POP3 server."); userName = utf8 ? SaslMechanism.SaslPrep (cred.UserName) : cred.UserName; password = utf8 ? SaslMechanism.SaslPrep (cred.Password) : cred.Password; detector.IsAuthenticating = true; try { SendCommand (cancellationToken, encoding, "USER {0}\r\n", userName); message = SendCommand (cancellationToken, encoding, "PASS {0}\r\n", password); } catch (Pop3CommandException) { throw new AuthenticationException (); } finally { detector.IsAuthenticating = false; } OnAuthenticated (message, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } internal static void ComputeDefaultValues (string host, ref int port, ref SecureSocketOptions options, out Uri uri, out bool starttls) { switch (options) { default: if (port == 0) port = 110; break; case SecureSocketOptions.Auto: switch (port) { case 0: port = 110; goto default; case 995: options = SecureSocketOptions.SslOnConnect; break; default: options = SecureSocketOptions.StartTlsWhenAvailable; break; } break; case SecureSocketOptions.SslOnConnect: if (port == 0) port = 995; break; } if (IPAddress.TryParse (host, out var ip) && ip.AddressFamily == AddressFamily.InterNetworkV6) host = "[" + host + "]"; switch (options) { case SecureSocketOptions.StartTlsWhenAvailable: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "pop://{0}:{1}/?starttls=when-available", host, port)); starttls = true; break; case SecureSocketOptions.StartTls: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "pop://{0}:{1}/?starttls=always", host, port)); starttls = true; break; case SecureSocketOptions.SslOnConnect: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "pops://{0}:{1}", host, port)); starttls = false; break; default: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "pop://{0}:{1}", host, port)); starttls = false; break; } } void CheckCanConnect (string host, int port) { if (host == null) throw new ArgumentNullException (nameof (host)); if (host.Length == 0) throw new ArgumentException ("The host name cannot be empty.", nameof (host)); if (port < 0 || port > 65535) throw new ArgumentOutOfRangeException (nameof (port)); CheckDisposed (); if (IsConnected) throw new InvalidOperationException ("The Pop3Client is already connected."); } void SslHandshake (SslStream ssl, string host, CancellationToken cancellationToken) { #if NET5_0_OR_GREATER ssl.AuthenticateAsClient (GetSslClientAuthenticationOptions (host, ValidateRemoteCertificate)); #else ssl.AuthenticateAsClient (host, ClientCertificates, SslProtocols, CheckCertificateRevocation); #endif } void PostConnect (Stream stream, string host, int port, SecureSocketOptions options, bool starttls, CancellationToken cancellationToken) { probed = ProbedCapabilities.None; try { ProtocolLogger.LogConnect (engine.Uri!); } catch { stream.Dispose (); throw; } var pop3 = new Pop3Stream (stream, ProtocolLogger); engine.Connect (pop3, cancellationToken); try { engine.QueryCapabilities (cancellationToken); if (options == SecureSocketOptions.StartTls && (engine.Capabilities & Pop3Capabilities.StartTLS) == 0) throw new NotSupportedException ("The POP3 server does not support the STLS extension."); if (starttls && (engine.Capabilities & Pop3Capabilities.StartTLS) != 0) { SendCommand (cancellationToken, "STLS\r\n"); try { var tls = new SslStream (stream, false, ValidateRemoteCertificate); pop3.Stream = tls; SslHandshake (tls, host, cancellationToken); } catch (Exception ex) { throw SslHandshakeException.Create (ref sslValidationInfo, ex, true, "POP3", host, port, 995, 110); } engine.IsSecure = true; // re-issue a CAPA command engine.QueryCapabilities (cancellationToken); } } catch (Exception ex) { engine.Disconnect (ex); throw; } engine.Disconnected += OnEngineDisconnected; OnConnected (host, port, options); } /// /// Establish a connection to the specified POP3 or POP3/S server. /// /// /// Establishes a connection to the specified POP3 or POP3/S server. /// If the has a value of 0, then the /// parameter is used to determine the default port to /// connect to. The default port used with /// is 995. All other values will use a default port of 110. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 995, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// /// /// /// /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// was set to /// /// and the POP3 server does not support the STLS extension. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void Connect (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (host, port); ComputeDefaultValues (host, ref port, ref options, out var uri, out var starttls); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Connect, uri); try { var stream = ConnectNetwork (host, port, cancellationToken); stream.WriteTimeout = timeout; stream.ReadTimeout = timeout; engine.Uri = uri; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { SslHandshake (ssl, host, cancellationToken); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "POP3", host, port, 995, 110); } stream = ssl; } PostConnect (stream, host, port, options, starttls, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } void CheckCanConnect (Stream stream, string host, int port) { if (stream == null) throw new ArgumentNullException (nameof (stream)); CheckCanConnect (host, port); } void CheckCanConnect (Socket socket, string host, int port) { if (socket == null) throw new ArgumentNullException (nameof (socket)); if (!socket.Connected) throw new ArgumentException ("The socket is not connected.", nameof (socket)); CheckCanConnect (host, port); } /// /// Establish a connection to the specified POP3 or POP3/S server using the provided socket. /// /// /// Establishes a connection to the specified POP3 or POP3/S server using /// the provided socket. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 995, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the POP3 server does not support the STLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void Connect (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (socket, host, port); Connect (new NetworkStream (socket, true), host, port, options, cancellationToken); } /// /// Establish a connection to the specified POP3 or POP3/S server using the provided stream. /// /// /// Establishes a connection to the specified POP3 or POP3/S server using /// the provided stream. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 995, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the POP3 server does not support the STLS extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void Connect (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { CheckCanConnect (stream, host, port); Stream network; ComputeDefaultValues (host, ref port, ref options, out var uri, out var starttls); using var operation = engine.StartNetworkOperation (NetworkOperationKind.Connect, uri); try { engine.Uri = uri; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { SslHandshake (ssl, host, cancellationToken); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "POP3", host, port, 995, 110); } network = ssl; } else { network = stream; } if (network.CanTimeout) { network.WriteTimeout = timeout; network.ReadTimeout = timeout; } PostConnect (network, host, port, options, starttls, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Disconnect the service. /// /// /// If is , a QUIT command will be issued in order to disconnect cleanly. /// /// /// /// /// If set to , a QUIT command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// public override void Disconnect (bool quit, CancellationToken cancellationToken = default) { CheckDisposed (); if (!engine.IsConnected) return; if (quit) { try { SendCommand (cancellationToken, "QUIT\r\n"); } catch (OperationCanceledException) { } catch (Pop3ProtocolException) { } catch (Pop3CommandException) { } catch (IOException) { } } disconnecting = true; engine.Disconnect (null); } /// /// Get the message count. /// /// /// Gets the message count. /// /// The message count. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override int GetMessageCount (CancellationToken cancellationToken = default) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return UpdateMessageCount (cancellationToken); } /// /// Ping the POP3 server to keep the connection alive. /// /// Mail servers, if left idle for too long, will automatically drop the connection. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void NoOp (CancellationToken cancellationToken = default) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); SendCommand (cancellationToken, "NOOP\r\n"); } void OnEngineDisconnected (object? sender, EventArgs e) { var options = SecureSocketOptions.None; bool requested = disconnecting; string? host = null; int port = 0; if (engine.Uri != null) { options = GetSecureSocketOptions (engine.Uri); host = engine.Uri.Host; port = engine.Uri.Port; } engine.Disconnected -= OnEngineDisconnected; disconnecting = utf8 = false; octets = total = 0; engine.Uri = null; if (host != null) OnDisconnected (host, port, options, requested); } #endregion bool CheckCanEnableUTF8 () { CheckDisposed (); CheckConnected (); if (engine.State != Pop3EngineState.Connected) throw new InvalidOperationException ("You must enable UTF-8 mode before authenticating."); if ((engine.Capabilities & Pop3Capabilities.UTF8) == 0) throw new NotSupportedException ("The POP3 server does not support the UTF8 extension."); return !utf8; } /// /// Enable UTF8 mode. /// /// /// The POP3 UTF8 extension allows the client to retrieve messages in the UTF-8 encoding and /// may also allow the user to authenticate using a UTF-8 encoded username or password. /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The has already been authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the UTF8 extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public void EnableUTF8 (CancellationToken cancellationToken = default) { if (!CheckCanEnableUTF8 ()) return; SendCommand (cancellationToken, "UTF8\r\n"); utf8 = true; } static void ReadLangResponse (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { var langs = (List) pc.UserData!; do { var response = engine.ReadLine (cancellationToken); if (response == ".") break; var tokens = response.Split (Space, 2); if (tokens.Length != 2) continue; langs.Add (new Pop3Language (tokens[0], tokens[1])); } while (true); } static Task ProcessLangResponse (Pop3Engine engine, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (pc.Status != Pop3CommandStatus.Ok) return Task.CompletedTask; if (doAsync) return ReadLangResponseAsync (engine, pc, cancellationToken); ReadLangResponse (engine, pc, cancellationToken); return Task.CompletedTask; } Pop3Command QueueLangCommand (out List langs) { CheckDisposed (); CheckConnected (); if ((Capabilities & Pop3Capabilities.Lang) == 0) throw new NotSupportedException ("The POP3 server does not support the LANG extension."); var pc = engine.QueueCommand (ProcessLangResponse, "LANG\r\n"); pc.UserData = langs = new List (); return pc; } /// /// Get the list of languages supported by the POP3 server. /// /// /// If the POP3 server supports the LANG extension, it is possible to /// query the list of languages supported by the POP3 server that can /// be used for error messages. /// /// The supported languages. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the LANG extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public IList GetLanguages (CancellationToken cancellationToken = default) { var pc = QueueLangCommand (out var langs); engine.Run (true, cancellationToken); return new ReadOnlyCollection (langs); } void CheckCanSetLanguage (string lang) { CheckDisposed (); CheckConnected (); if (lang == null) throw new ArgumentNullException (nameof (lang)); if (lang.Length == 0) throw new ArgumentException ("The language code cannot be empty.", nameof (lang)); if ((Capabilities & Pop3Capabilities.Lang) == 0) throw new NotSupportedException ("The POP3 server does not support the LANG extension."); } /// /// Set the language used by the POP3 server for error messages. /// /// /// If the POP3 server supports the LANG extension, it is possible to /// set the language used by the POP3 server for error messages. /// /// The language code. /// The cancellation token. /// /// is . /// /// /// is empty. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// The POP3 server does not support the LANG extension. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public void SetLanguage (string lang, CancellationToken cancellationToken = default) { CheckCanSetLanguage (lang); SendCommand (cancellationToken, $"LANG {lang}\r\n"); } #region IMailSpool implementation /// /// Get the number of messages available in the message spool. /// /// /// Gets the number of messages available on the POP3 server. /// Once authenticated, the property will be set /// to the number of available messages on the POP3 server. /// /// /// /// /// The message count. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// public override int Count { get { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return total; } } /// /// Gets whether or not the supports referencing messages by UIDs. /// /// /// Not all servers support referencing messages by UID, so this property should /// be checked before using /// and . /// If the server does not support UIDs, then all methods that take UID arguments /// along with and /// will fail. /// /// if supports UIDs; otherwise, . /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// public override bool SupportsUids { get { CheckDisposed (); CheckConnected (); CheckAuthenticated (); return (engine.Capabilities & Pop3Capabilities.UIDL) != 0; } } static Task ProcessUidlResponse (Pop3Engine engine, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (pc.Status != Pop3CommandStatus.Ok) return Task.CompletedTask; var tokens = text.Split (Space, StringSplitOptions.RemoveEmptyEntries); int seqid = GetExpectedSequenceId (pc); if (tokens.Length < 2) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an incomplete response to the UIDL command."); return Task.CompletedTask; } if (!int.TryParse (tokens[0], NumberStyles.None, CultureInfo.InvariantCulture, out int id) || id != seqid) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an unexpected response to the UIDL command."); return Task.CompletedTask; } pc.UserData = tokens[1]; return Task.CompletedTask; } Pop3Command QueueUidlCommand (int index) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (index < 0 || index >= total) throw new ArgumentOutOfRangeException (nameof (index)); if (!SupportsUids && (probed & ProbedCapabilities.UIDL) != 0) throw new NotSupportedException ("The POP3 server does not support the UIDL extension."); return engine.QueueCommand (ProcessUidlResponse, "UIDL {0}\r\n", index + 1); } T OnUidlComplete (Pop3Command pc) { probed |= ProbedCapabilities.UIDL; if (pc.Status != Pop3CommandStatus.Ok && !SupportsUids) throw new NotSupportedException ("The POP3 server does not support the UIDL extension."); pc.ThrowIfError (); engine.Capabilities |= Pop3Capabilities.UIDL; return (T) pc.UserData!; } /// /// Get the UID of the message at the specified index. /// /// /// Gets the UID of the message at the specified index. /// Not all servers support UIDs, so you should first check the /// property for the flag or /// the convenience property. /// /// The message UID. /// The message index. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override string GetMessageUid (int index, CancellationToken cancellationToken = default) { var pc = QueueUidlCommand (index); engine.Run (false, cancellationToken); return OnUidlComplete (pc); } static void ParseUidlAllResponse (Pop3Command pc, string response) { var tokens = response.Split (Space, StringSplitOptions.RemoveEmptyEntries); var uids = (List) pc.UserData!; if (tokens.Length < 2) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an incomplete response to the UIDL command."); return; } if (!int.TryParse (tokens[0], NumberStyles.None, CultureInfo.InvariantCulture, out int seqid) || seqid != uids.Count + 1) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an invalid response to the UIDL command."); return; } uids.Add (tokens[1]); } static void ReadUidlAllResponse (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { do { var response = engine.ReadLine (cancellationToken); if (response == ".") break; if (pc.Exception != null) continue; ParseUidlAllResponse (pc, response); } while (true); } static Task ProcessUidlAllResponse (Pop3Engine engine, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (pc.Status != Pop3CommandStatus.Ok) return Task.CompletedTask; if (doAsync) return ReadUidlAllResponseAsync (engine, pc, cancellationToken); ReadUidlAllResponse (engine, pc, cancellationToken); return Task.CompletedTask; } Pop3Command QueueUidlCommand () { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (!SupportsUids && (probed & ProbedCapabilities.UIDL) != 0) throw new NotSupportedException ("The POP3 server does not support the UIDL extension."); var pc = engine.QueueCommand (ProcessUidlAllResponse, "UIDL\r\n"); var uids = new List (); pc.UserData = uids; return pc; } /// /// Get the full list of available message UIDs. /// /// /// Gets the full list of available message UIDs. /// Not all servers support UIDs, so you should first check the /// property for the flag or /// the convenience property. /// /// /// /// /// The message uids. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IList GetMessageUids (CancellationToken cancellationToken = default) { var pc = QueueUidlCommand (); engine.Run (false, cancellationToken); return OnUidlComplete> (pc); } Task ProcessListResponse (Pop3Engine pop3, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (pc.Status != Pop3CommandStatus.Ok) return Task.CompletedTask; var tokens = text.Split (Space, StringSplitOptions.RemoveEmptyEntries); int seqid = GetExpectedSequenceId (pc); if (tokens.Length < 2) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an incomplete response to the LIST command: {0}", text); return Task.CompletedTask; } if (!int.TryParse (tokens[0], NumberStyles.None, CultureInfo.InvariantCulture, out int id) || id != seqid) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an unexpected sequence-id token to the LIST command: {0}", tokens[0]); return Task.CompletedTask; } if (!int.TryParse (tokens[1], NumberStyles.None, CultureInfo.InvariantCulture, out int size) || size < 0) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an unexpected size token to the LIST command: {0}", tokens[1]); return Task.CompletedTask; } pc.UserData = size; return Task.CompletedTask; } Pop3Command QueueListCommand (int index) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (index < 0 || index >= total) throw new ArgumentOutOfRangeException (nameof (index)); return engine.QueueCommand (ProcessListResponse, "LIST {0}\r\n", index + 1); } /// /// Get the size of the specified message, in bytes. /// /// /// Gets the size of the specified message, in bytes. /// /// The message size, in bytes. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override int GetMessageSize (int index, CancellationToken cancellationToken = default) { var pc = QueueListCommand (index); engine.Run (true, cancellationToken); return (int) pc.UserData!; } static void ParseListAllResponse (Pop3Command pc, string response) { var tokens = response.Split (Space, StringSplitOptions.RemoveEmptyEntries); var sizes = (List) pc.UserData!; if (tokens.Length < 2) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an incomplete response to the LIST command: {0}", response); return; } if (!int.TryParse (tokens[0], NumberStyles.None, CultureInfo.InvariantCulture, out int seqid) || seqid != sizes.Count + 1) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an unexpected sequence-id token to the LIST command: {0}", tokens[0]); return; } if (!int.TryParse (tokens[1], NumberStyles.None, CultureInfo.InvariantCulture, out int size) || size < 0) { pc.Exception = CreatePop3ParseException ("Pop3 server returned an unexpected size token to the LIST command: {0}", tokens[1]); return; } sizes.Add (size); } static void ReadListAllResponse (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { do { var response = engine.ReadLine (cancellationToken); if (response == ".") break; if (pc.Exception != null) continue; ParseListAllResponse (pc, response); } while (true); } static Task ProcessListAllResponse (Pop3Engine engine, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (pc.Status != Pop3CommandStatus.Ok) return Task.CompletedTask; if (doAsync) return ReadListAllResponseAsync (engine, pc, cancellationToken); ReadListAllResponse (engine, pc, cancellationToken); return Task.CompletedTask; } List QueueListCommand () { CheckDisposed (); CheckConnected (); CheckAuthenticated (); var pc = engine.QueueCommand (ProcessListAllResponse, "LIST\r\n"); var sizes = new List (); pc.UserData = sizes; return sizes; } /// /// Get the sizes for all available messages, in bytes. /// /// /// Gets the sizes for all available messages, in bytes. /// /// The message sizes, in bytes. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IList GetMessageSizes (CancellationToken cancellationToken = default) { var sizes = QueueListCommand (); engine.Run (true, cancellationToken); return sizes; } abstract class DownloadContext { readonly ITransferProgress? progress; readonly Pop3Client client; T[]? downloaded; long nread; int idx; protected DownloadContext (Pop3Client client, ITransferProgress? progress) { this.progress = progress; this.client = client; } protected Pop3Engine Engine { get { return client.engine; } } protected abstract T Parse (Pop3Stream data, CancellationToken cancellationToken); protected abstract Task ParseAsync (Pop3Stream data, CancellationToken cancellationToken); protected void Update (int n) { if (progress == null) return; nread += n; progress.Report (nread); } void OnDataReceived (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { engine.CheckConnected (); try { engine.Stream.Mode = Pop3StreamMode.Data; var item = Parse (engine.Stream, cancellationToken); downloaded![idx++] = item; } catch (FormatException ex) { pc.Exception = CreatePop3ParseException (ex, "Failed to parse data."); engine.Stream.CopyTo (Stream.Null, 4096); } finally { engine.Stream.Mode = Pop3StreamMode.Line; } } async Task OnDataReceivedAsync (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { engine.CheckConnected (); try { engine.Stream.Mode = Pop3StreamMode.Data; var item = await ParseAsync (engine.Stream, cancellationToken).ConfigureAwait (false); downloaded![idx++] = item; } catch (FormatException ex) { pc.Exception = CreatePop3ParseException (ex, "Failed to parse data."); await engine.Stream.CopyToAsync (Stream.Null, 4096, cancellationToken).ConfigureAwait (false); } finally { engine.Stream.Mode = Pop3StreamMode.Line; } } Task OnDataReceived (Pop3Engine engine, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (pc.Status != Pop3CommandStatus.Ok) return Task.CompletedTask; if (doAsync) return OnDataReceivedAsync (engine, pc, cancellationToken); OnDataReceived (engine, pc, cancellationToken); return Task.CompletedTask; } Pop3Command QueueCommand (int index, bool headersOnly) { if (headersOnly) return Engine.QueueCommand (OnDataReceived, "TOP {0} 0\r\n", index + 1); return Engine.QueueCommand (OnDataReceived, "RETR {0}\r\n", index + 1); } void DownloadItem (int index, bool headersOnly, CancellationToken cancellationToken) { QueueCommand (index, headersOnly); Engine.Run (true, cancellationToken); } async Task DownloadItemAsync (int index, bool headersOnly, CancellationToken cancellationToken) { QueueCommand (index, headersOnly); await Engine.RunAsync (true, cancellationToken).ConfigureAwait (false); } public T Download (int index, bool headersOnly, CancellationToken cancellationToken) { downloaded = new T[1]; idx = 0; DownloadItem (index, headersOnly, cancellationToken); return downloaded[0]; } public async Task DownloadAsync (int index, bool headersOnly, CancellationToken cancellationToken) { downloaded = new T[1]; idx = 0; await DownloadItemAsync (index, headersOnly, cancellationToken).ConfigureAwait (false); return downloaded[0]; } public IList Download (IList indexes, bool headersOnly, CancellationToken cancellationToken) { downloaded = new T[indexes.Count]; idx = 0; if ((Engine.Capabilities & Pop3Capabilities.Pipelining) == 0) { for (int i = 0; i < indexes.Count; i++) DownloadItem (indexes[i], headersOnly, cancellationToken); return downloaded; } for (int i = 0; i < indexes.Count; i++) QueueCommand (indexes[i], headersOnly); Engine.Run (true, cancellationToken); return downloaded; } public async Task> DownloadAsync (IList indexes, bool headersOnly, CancellationToken cancellationToken) { downloaded = new T[indexes.Count]; idx = 0; if ((Engine.Capabilities & Pop3Capabilities.Pipelining) == 0) { for (int i = 0; i < indexes.Count; i++) await DownloadItemAsync (indexes[i], headersOnly, cancellationToken).ConfigureAwait (false); return downloaded; } for (int i = 0; i < indexes.Count; i++) QueueCommand (indexes[i], headersOnly); await Engine.RunAsync (true, cancellationToken).ConfigureAwait (false); return downloaded; } public IList Download (int startIndex, int count, bool headersOnly, CancellationToken cancellationToken) { downloaded = new T[count]; idx = 0; if ((Engine.Capabilities & Pop3Capabilities.Pipelining) == 0) { for (int i = 0; i < count; i++) DownloadItem (startIndex + i, headersOnly, cancellationToken); return downloaded; } for (int i = 0; i < count; i++) QueueCommand (startIndex + i, headersOnly); Engine.Run (true, cancellationToken); return downloaded; } public async Task> DownloadAsync (int startIndex, int count, bool headersOnly, CancellationToken cancellationToken) { downloaded = new T[count]; idx = 0; if ((Engine.Capabilities & Pop3Capabilities.Pipelining) == 0) { for (int i = 0; i < count; i++) await DownloadItemAsync (startIndex + i, headersOnly, cancellationToken).ConfigureAwait (false); return downloaded; } for (int i = 0; i < count; i++) QueueCommand (startIndex + i, headersOnly); await Engine.RunAsync (true, cancellationToken).ConfigureAwait (false); return downloaded; } } class DownloadStreamContext : DownloadContext { const int BufferSize = 4096; public DownloadStreamContext (Pop3Client client, ITransferProgress? progress = null) : base (client, progress) { } protected override Stream Parse (Pop3Stream data, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested (); var buffer = ArrayPool.Shared.Rent (BufferSize); var stream = new MemoryBlockStream (); try { int nread; while ((nread = data.Read (buffer, 0, BufferSize, cancellationToken)) > 0) { stream.Write (buffer, 0, nread); Update (nread); } stream.Position = 0; return stream; } catch { stream.Dispose (); throw; } finally { ArrayPool.Shared.Return (buffer); } } protected override async Task ParseAsync (Pop3Stream data, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested (); var buffer = ArrayPool.Shared.Rent (BufferSize); var stream = new MemoryBlockStream (); try { int nread; while ((nread = await data.ReadAsync (buffer, 0, BufferSize, cancellationToken).ConfigureAwait (false)) > 0) { stream.Write (buffer, 0, nread); Update (nread); } stream.Position = 0; return stream; } catch { stream.Dispose (); throw; } finally { ArrayPool.Shared.Return (buffer); } } } class DownloadHeaderContext : DownloadContext { readonly MimeParser parser; public DownloadHeaderContext (Pop3Client client, MimeParser parser) : base (client, null) { this.parser = parser; } protected override HeaderList Parse (Pop3Stream data, CancellationToken cancellationToken) { using (var stream = new ProgressStream (data, Update)) { parser.SetStream (stream); return parser.ParseMessage (cancellationToken).Headers; } } protected override async Task ParseAsync (Pop3Stream data, CancellationToken cancellationToken) { using (var stream = new ProgressStream (data, Update)) { parser.SetStream (stream); return (await parser.ParseMessageAsync (cancellationToken).ConfigureAwait (false)).Headers; } } } class DownloadMessageContext : DownloadContext { readonly MimeParser parser; public DownloadMessageContext (Pop3Client client, MimeParser parser, ITransferProgress? progress = null) : base (client, progress) { this.parser = parser; } protected override MimeMessage Parse (Pop3Stream data, CancellationToken cancellationToken) { using (var stream = new ProgressStream (data, Update)) { parser.SetStream (stream); return parser.ParseMessage (cancellationToken); } } protected override Task ParseAsync (Pop3Stream data, CancellationToken cancellationToken) { using (var stream = new ProgressStream (data, Update)) { parser.SetStream (stream); return parser.ParseMessageAsync (cancellationToken); } } } void CheckCanDownload (int index) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (index < 0 || index >= total) throw new ArgumentOutOfRangeException (nameof (index)); } bool CheckCanDownload (IList indexes) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (indexes == null) throw new ArgumentNullException (nameof (indexes)); if (indexes.Count == 0) return false; for (int i = 0; i < indexes.Count; i++) { if (indexes[i] < 0 || indexes[i] >= total) throw new ArgumentException ("One or more of the indexes are invalid.", nameof (indexes)); } return true; } bool CheckCanDownload (int startIndex, int count) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (startIndex < 0 || startIndex >= total) throw new ArgumentOutOfRangeException (nameof (startIndex)); if (count < 0 || count > (total - startIndex)) throw new ArgumentOutOfRangeException (nameof (count)); return count > 0; } /// /// Get the headers for the message at the specified index. /// /// /// Gets the headers for the message at the specified index. /// /// The message headers. /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override HeaderList GetMessageHeaders (int index, CancellationToken cancellationToken = default) { CheckCanDownload (index); var ctx = new DownloadHeaderContext (this, parser); return ctx.Download (index, true, cancellationToken); } /// /// Get the headers for the messages at the specified indexes. /// /// /// Gets the headers for the messages at the specified indexes. /// When the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message because /// it will batch the commands to reduce latency. /// /// The headers for the specified messages. /// The indexes of the messages. /// The cancellation token. /// /// is . /// /// /// One or more of the are invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IList GetMessageHeaders (IList indexes, CancellationToken cancellationToken = default) { if (!CheckCanDownload (indexes)) return Array.Empty (); var ctx = new DownloadHeaderContext (this, parser); return ctx.Download (indexes, true, cancellationToken); } /// /// Get the headers of the messages within the specified range. /// /// /// Gets the headers of the messages within the specified range. /// When the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message because /// it will batch the commands to reduce latency. /// /// The headers of the messages within the specified range. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IList GetMessageHeaders (int startIndex, int count, CancellationToken cancellationToken = default) { if (!CheckCanDownload (startIndex, count)) return Array.Empty (); var ctx = new DownloadHeaderContext (this, parser); return ctx.Download (startIndex, count, true, cancellationToken); } /// /// Get the message at the specified index. /// /// /// Gets the message at the specified index. /// /// /// /// /// The message. /// The index of the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override MimeMessage GetMessage (int index, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { CheckCanDownload (index); var ctx = new DownloadMessageContext (this, parser, progress); return ctx.Download (index, false, cancellationToken); } /// /// Get the messages at the specified indexes. /// /// /// Gets the messages at the specified indexes. /// When the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message /// because it will batch the commands to reduce latency. /// /// The messages. /// The indexes of the messages. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// One or more of the are invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IList GetMessages (IList indexes, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!CheckCanDownload (indexes)) return Array.Empty (); var ctx = new DownloadMessageContext (this, parser, progress); return ctx.Download (indexes, false, cancellationToken); } /// /// Get the messages within the specified range. /// /// /// Gets the messages within the specified range. /// When the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message /// because it will batch the commands to reduce latency. /// /// /// /// /// The messages. /// The index of the first message to get. /// The number of messages to get. /// The cancellation token. /// The progress reporting mechanism. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IList GetMessages (int startIndex, int count, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!CheckCanDownload (startIndex, count)) return Array.Empty (); var ctx = new DownloadMessageContext (this, parser, progress); return ctx.Download (startIndex, count, false, cancellationToken); } /// /// Get the message or header stream at the specified index. /// /// /// Gets the message or header stream at the specified index. /// /// The message or header stream. /// The index of the message. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override Stream GetStream (int index, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { CheckCanDownload (index); var ctx = new DownloadStreamContext (this, progress); return ctx.Download (index, headersOnly, cancellationToken); } /// /// Get the message or header streams at the specified indexes. /// /// /// Get the message or header streams at the specified indexes. /// If the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message /// because it will batch the commands to reduce latency. /// /// The message or header streams. /// The indexes of the messages. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// /// /// One or more of the are invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IList GetStreams (IList indexes, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!CheckCanDownload (indexes)) return Array.Empty (); var ctx = new DownloadStreamContext (this, progress); return ctx.Download (indexes, headersOnly, cancellationToken); } /// /// Get the message or header streams within the specified range. /// /// /// Gets the message or header streams within the specified range. /// If the POP3 server supports the /// extension, this method will likely be more efficient than using /// for each message /// because it will batch the commands to reduce latency. /// /// The message or header streams. /// The index of the first stream to get. /// The number of streams to get. /// if only the headers should be retrieved; otherwise, . /// The cancellation token. /// The progress reporting mechanism. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The POP3 server does not support the UIDL extension. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IList GetStreams (int startIndex, int count, bool headersOnly = false, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { if (!CheckCanDownload (startIndex, count)) return Array.Empty (); var ctx = new DownloadStreamContext (this, progress); return ctx.Download (startIndex, count, headersOnly, cancellationToken); } void CheckCanDelete (int index, out string seqid) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (index < 0 || index >= total) throw new ArgumentOutOfRangeException (nameof (index)); seqid = (index + 1).ToString (CultureInfo.InvariantCulture); } /// /// Mark the specified message for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// /// /// /// The index of the message. /// The cancellation token. /// /// is not a valid message index. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void DeleteMessage (int index, CancellationToken cancellationToken = default) { CheckCanDelete (index, out string seqid); SendCommand (cancellationToken, $"DELE {seqid}\r\n"); } bool CheckCanDelete (IList indexes) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (indexes == null) throw new ArgumentNullException (nameof (indexes)); if (indexes.Count == 0) return false; for (int i = 0; i < indexes.Count; i++) { if (indexes[i] < 0 || indexes[i] >= total) throw new ArgumentException ("One or more of the indexes are invalid.", nameof (indexes)); } return true; } /// /// Mark the specified messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The indexes of the messages. /// The cancellation token. /// /// is . /// /// /// One or more of the are invalid. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void DeleteMessages (IList indexes, CancellationToken cancellationToken = default) { if (!CheckCanDelete (indexes)) return; if ((Capabilities & Pop3Capabilities.Pipelining) == 0) { for (int i = 0; i < indexes.Count; i++) SendCommand (cancellationToken, "DELE {0}\r\n", indexes[i] + 1); return; } for (int i = 0; i < indexes.Count; i++) engine.QueueCommand (null, "DELE {0}\r\n", indexes[i] + 1); engine.Run (true, cancellationToken); } bool CheckCanDelete (int startIndex, int count) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); if (startIndex < 0 || startIndex >= total) throw new ArgumentOutOfRangeException (nameof (startIndex)); if (count < 0 || count > (total - startIndex)) throw new ArgumentOutOfRangeException (nameof (count)); return count >= 0; } /// /// Mark the specified range of messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// /// /// /// The index of the first message to mark for deletion. /// The number of messages to mark for deletion. /// The cancellation token. /// /// and do not specify /// a valid range of messages. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void DeleteMessages (int startIndex, int count, CancellationToken cancellationToken = default) { if (!CheckCanDelete (startIndex, count)) return; if ((Capabilities & Pop3Capabilities.Pipelining) == 0) { for (int i = 0; i < count; i++) SendCommand (cancellationToken, "DELE {0}\r\n", startIndex + i + 1); return; } for (int i = 0; i < count; i++) engine.QueueCommand (null, "DELE {0}\r\n", startIndex + i + 1); engine.Run (true, cancellationToken); } /// /// Mark all messages for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void DeleteAllMessages (CancellationToken cancellationToken = default) { if (total > 0) DeleteMessages (0, total, cancellationToken); } /// /// Reset the state of all messages marked for deletion. /// /// /// Messages marked for deletion are not actually deleted until the session /// is cleanly disconnected /// (see ). /// /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// The POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override void Reset (CancellationToken cancellationToken = default) { CheckDisposed (); CheckConnected (); CheckAuthenticated (); SendCommand (cancellationToken, "RSET\r\n"); } #endregion #region IEnumerable implementation /// /// Get an enumerator for the messages in the folder. /// /// /// Gets an enumerator for the messages in the folder. /// /// The enumerator. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The is not authenticated. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// A POP3 command failed. /// /// /// A POP3 protocol error occurred. /// public override IEnumerator GetEnumerator () { CheckDisposed (); CheckConnected (); CheckAuthenticated (); for (int i = 0; i < total; i++) yield return GetMessage (i, CancellationToken.None); yield break; } #endregion /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected override void Dispose (bool disposing) { if (disposing && !disposed) { engine.Disconnect (null); disposed = true; } base.Dispose (disposing); } } } ================================================ FILE: MailKit/Net/Pop3/Pop3Command.cs ================================================ // // Pop3Command.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Threading; using System.Globalization; using System.Threading.Tasks; namespace MailKit.Net.Pop3 { /// /// POP3 command handler. /// /// /// All exceptions thrown by the handler are considered fatal and will /// force-disconnect the connection. If a non-fatal error occurs, set /// it on the property. /// delegate Task Pop3CommandHandler (Pop3Engine engine, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken); enum Pop3CommandStatus { Queued = -5, Active = -4, Continue = -3, ProtocolError = -2, Error = -1, Ok = 0 } class Pop3Command { public Pop3CommandHandler? Handler { get; private set; } public Encoding Encoding { get; private set; } public string Command { get; private set; } // output public Pop3CommandStatus Status { get; internal set; } public ProtocolException? Exception { get; set; } public string? StatusText { get; set; } public object? UserData { get; set; } public Pop3Command (Pop3CommandHandler? handler, Encoding encoding, string format, params object[] args) { Command = string.Format (CultureInfo.InvariantCulture, format, args); Encoding = encoding; Handler = handler; } static Exception CreatePop3Exception (Pop3Command pc) { var command = pc.Command.Split (' ')[0].TrimEnd (); var message = string.Format ("POP3 server did not respond with a +OK response to the {0} command.", command); if (pc.Status == Pop3CommandStatus.Error) return new Pop3CommandException (message, pc.StatusText!); return new Pop3ProtocolException (message); } public void ThrowIfError () { if (Status != Pop3CommandStatus.Ok) throw CreatePop3Exception (this); if (Exception != null) throw Exception; } } } ================================================ FILE: MailKit/Net/Pop3/Pop3CommandException.cs ================================================ // // Pop3CommandException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit.Net.Pop3 { /// /// A POP3 command exception. /// /// /// The exception that is thrown when a POP3 command fails. Unlike a , /// a does not require the to be reconnected. /// /// /// /// #if SERIALIZABLE [Serializable] #endif public class Pop3CommandException : CommandException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected Pop3CommandException (SerializationInfo info, StreamingContext context) : base (info, context) { StatusText = info.GetString ("StatusText"); } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// An inner exception. public Pop3CommandException (string message, Exception innerException) : base (message, innerException) { StatusText = string.Empty; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// The response status text. /// An inner exception. /// /// is . /// public Pop3CommandException (string message, string statusText, Exception innerException) : base (message, innerException) { if (statusText == null) throw new ArgumentNullException (nameof (statusText)); StatusText = statusText; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public Pop3CommandException (string message) : base (message) { StatusText = string.Empty; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// The response status text. /// /// is . /// public Pop3CommandException (string message, string statusText) : base (message) { if (statusText == null) throw new ArgumentNullException (nameof (statusText)); StatusText = statusText; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public Pop3CommandException () { StatusText = string.Empty; } /// /// Get the response status text. /// /// /// Gets the response status text. /// /// /// /// /// The response status text. public string StatusText { get; private set; } #if SERIALIZABLE /// /// When overridden in a derived class, sets the /// with information about the exception. /// /// /// Serializes the state of the . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecurityCritical] #if NET8_0_OR_GREATER [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] #endif public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("StatusText", StatusText); } #endif } } ================================================ FILE: MailKit/Net/Pop3/Pop3Engine.cs ================================================ // // Pop3Engine.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Threading; using System.Diagnostics; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace MailKit.Net.Pop3 { /// /// The state of the . /// enum Pop3EngineState { /// /// The Pop3Engine is in the disconnected state. /// Disconnected, /// /// The Pop3Engine is in the connected state. /// Connected, /// /// The Pop3Engine is in the transaction state, indicating that it is /// authenticated and may retrieve messages from the server. /// Transaction } /// /// A POP3 command engine. /// class Pop3Engine { #if NET6_0_OR_GREATER readonly ClientMetrics? metrics; #endif readonly List queue; long clientConnectedTimestamp; bool secure; /// /// Initializes a new instance of the class. /// public Pop3Engine () { AuthenticationMechanisms = new HashSet (StringComparer.Ordinal); Capabilities = Pop3Capabilities.User; queue = new List (); #if NET6_0_OR_GREATER // Use the globally configured Pop3Client metrics. metrics = Telemetry.Pop3Client.Metrics; #endif } /// /// Gets the URI of the POP3 server. /// /// /// Gets the URI of the POP3 server. /// /// The URI of the POP3 server. public Uri? Uri { get; internal set; } /// /// Gets the authentication mechanisms supported by the POP3 server. /// /// /// The authentication mechanisms are queried during the /// method. /// /// The authentication mechanisms. public HashSet AuthenticationMechanisms { get; private set; } /// /// Gets the capabilities supported by the POP3 server. /// /// /// The capabilities will not be known until a successful connection /// has been made via the method. /// /// The capabilities. public Pop3Capabilities Capabilities { get; set; } /// /// Gets the underlying POP3 stream. /// /// /// Gets the underlying POP3 stream. /// /// The pop3 stream. public Pop3Stream? Stream { get; private set; } /// /// Gets or sets the state of the engine. /// /// /// Gets or sets the state of the engine. /// /// The engine state. public Pop3EngineState State { get; internal set; } /// /// Gets whether or not the engine is currently connected to a POP3 server. /// /// /// Gets whether or not the engine is currently connected to a POP3 server. /// /// if the engine is connected; otherwise, . [MemberNotNullWhen (true, new[] { nameof (Stream), nameof (Uri) })] public bool IsConnected { get { return Stream != null && Stream.IsConnected; } } /// /// Get whether or not the connection is secure (typically via SSL or TLS). /// /// /// Gets whether or not the connection is secure (typically via SSL or TLS). /// /// if the connection is secure; otherwise, . [MemberNotNullWhen (true, new[] { nameof (Stream), nameof (Uri) })] public bool IsSecure { get { return IsConnected && secure; } set { secure = value; } } /// /// Gets the APOP authentication token. /// /// /// Gets the APOP authentication token. /// /// The APOP authentication token. public string? ApopToken { get; private set; } /// /// Gets the EXPIRE extension policy value. /// /// /// Gets the EXPIRE extension policy value. /// /// The EXPIRE policy. public int ExpirePolicy { get; private set; } /// /// Gets the implementation details of the server. /// /// /// Gets the implementation details of the server. /// /// The implementation details. public string? Implementation { get; private set; } /// /// Gets the login delay. /// /// /// Gets the login delay. /// /// The login delay. public int LoginDelay { get; private set; } [MemberNotNull (nameof (Stream))] internal void CheckConnected () { if (Stream == null) throw new InvalidOperationException (); } [MemberNotNull (nameof (Stream))] void Initialize (Pop3Stream pop3) { Stream?.Dispose (); clientConnectedTimestamp = Stopwatch.GetTimestamp (); Capabilities = Pop3Capabilities.User; AuthenticationMechanisms.Clear (); State = Pop3EngineState.Disconnected; ApopToken = null; secure = pop3.Stream is SslStream; Stream = pop3; } void ParseGreeting (string greeting) { int index = greeting.IndexOf (' '); string token, text; if (index != -1) { token = greeting.Substring (0, index); while (index < greeting.Length && char.IsWhiteSpace (greeting[index])) index++; if (index < greeting.Length) text = greeting.Substring (index); else text = string.Empty; } else { text = string.Empty; token = greeting; } if (token != "+OK") { Stream!.Dispose (); Stream = null; throw new Pop3ProtocolException (string.Format ("Unexpected greeting from server: {0}", greeting)); } index = text.IndexOf ('<'); if (index != -1 && index + 1 < text.Length) { int endIndex = text.IndexOf ('>', index + 1); if (endIndex++ != -1) { ApopToken = text.Substring (index, endIndex - index); Capabilities |= Pop3Capabilities.Apop; } } State = Pop3EngineState.Connected; } public NetworkOperation StartNetworkOperation (NetworkOperationKind kind, Uri? uri = null) { #if NET6_0_OR_GREATER return NetworkOperation.Start (kind, uri ?? Uri!, Telemetry.Pop3Client.ActivitySource, metrics); #else return NetworkOperation.Start (kind, uri ?? Uri!); #endif } /// /// Takes possession of the and reads the greeting. /// /// /// Takes possession of the and reads the greeting. /// /// The pop3 stream. /// The cancellation token public void Connect (Pop3Stream pop3, CancellationToken cancellationToken) { Initialize (pop3); // read the pop3 server greeting var greeting = ReadLine (cancellationToken).TrimEnd (); ParseGreeting (greeting); } /// /// Takes possession of the and reads the greeting. /// /// /// Takes possession of the and reads the greeting. /// /// The pop3 stream. /// The cancellation token public async Task ConnectAsync (Pop3Stream pop3, CancellationToken cancellationToken) { Initialize (pop3); // read the pop3 server greeting var greeting = (await ReadLineAsync (cancellationToken).ConfigureAwait (false)).TrimEnd (); ParseGreeting (greeting); } public event EventHandler? Disconnected; void OnDisconnected () { Disconnected?.Invoke (this, EventArgs.Empty); } void RecordClientDisconnected (Exception? ex) { #if NET6_0_OR_GREATER metrics?.RecordClientDisconnected (clientConnectedTimestamp, Uri!, ex); #endif clientConnectedTimestamp = 0; } /// /// Disconnects the . /// /// /// Disconnects the . /// /// The exception that is causing the disconnection. public void Disconnect (Exception? ex) { RecordClientDisconnected (ex); if (Stream != null) { Stream.Dispose (); Stream = null; } secure = false; if (State != Pop3EngineState.Disconnected) { State = Pop3EngineState.Disconnected; OnDisconnected (); } } /// /// Reads a single line from the . /// /// The line. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public string ReadLine (CancellationToken cancellationToken) { CheckConnected (); using (var builder = new ByteArrayBuilder (64)) { bool complete; do { complete = Stream.ReadLine (builder, cancellationToken); } while (!complete); // FIXME: All callers expect CRLF to be trimmed, but many also want all trailing whitespace trimmed. builder.TrimNewLine (); return builder.ToString (); } } /// /// Reads a single line from the . /// /// The line. /// The cancellation token. /// /// The engine is not connected. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public async Task ReadLineAsync (CancellationToken cancellationToken) { CheckConnected (); using (var builder = new ByteArrayBuilder (64)) { bool complete; do { complete = await Stream.ReadLineAsync (builder, cancellationToken).ConfigureAwait (false); } while (!complete); // FIXME: All callers expect CRLF to be trimmed, but many also want all trailing whitespace trimmed. builder.TrimNewLine (); return builder.ToString (); } } public static Pop3CommandStatus GetCommandStatus (string response, out string text) { int index = response.IndexOf (' '); string token; if (index != -1) { token = response.Substring (0, index); while (index < response.Length && char.IsWhiteSpace (response[index])) index++; if (index < response.Length) text = response.Substring (index); else text = string.Empty; } else { text = string.Empty; token = response; } if (token == "+OK") return Pop3CommandStatus.Ok; if (token == "-ERR") return Pop3CommandStatus.Error; if (token == "+") return Pop3CommandStatus.Continue; return Pop3CommandStatus.ProtocolError; } void ReadResponse (Pop3Command pc, CancellationToken cancellationToken) { string response; try { response = ReadLine (cancellationToken).TrimEnd (); } catch (Exception ex) { pc.Status = Pop3CommandStatus.ProtocolError; Disconnect (ex); throw; } pc.Status = GetCommandStatus (response, out string text); pc.StatusText = text; switch (pc.Status) { case Pop3CommandStatus.ProtocolError: var pex = new Pop3ProtocolException (string.Format ("Unexpected response from server: {0}", response)); Disconnect (pex); throw pex; case Pop3CommandStatus.Continue: case Pop3CommandStatus.Ok: if (pc.Handler != null) { try { pc.Handler (this, pc, text, false, cancellationToken); } catch (Exception ex) { pc.Status = Pop3CommandStatus.ProtocolError; Disconnect (ex); throw; } } break; } } async Task ReadResponseAsync (Pop3Command pc, CancellationToken cancellationToken) { string response; try { response = (await ReadLineAsync (cancellationToken).ConfigureAwait (false)).TrimEnd (); } catch (Exception ex) { pc.Status = Pop3CommandStatus.ProtocolError; Disconnect (ex); throw; } pc.Status = GetCommandStatus (response, out string text); pc.StatusText = text; switch (pc.Status) { case Pop3CommandStatus.ProtocolError: var pex = new Pop3ProtocolException (string.Format ("Unexpected response from server: {0}", response)); Disconnect (pex); throw pex; case Pop3CommandStatus.Continue: case Pop3CommandStatus.Ok: if (pc.Handler != null) { try { await pc.Handler (this, pc, text, true, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { pc.Status = Pop3CommandStatus.ProtocolError; Disconnect (ex); throw; } } break; } } [MemberNotNull (nameof (Stream))] void CheckCanRun (CancellationToken cancellationToken) { CheckConnected (); if (cancellationToken.IsCancellationRequested) { queue.Clear (); cancellationToken.ThrowIfCancellationRequested (); } } /// /// Run the command pipeline. /// /// if exceptions should be thrown for failed commands; otherwise, . /// The cancellation token. /// /// The engine is not connected. /// public void Run (bool throwOnError, CancellationToken cancellationToken) { CheckCanRun (cancellationToken); try { for (int i = 0; i < queue.Count; i++) { var pc = queue[i]; pc.Status = Pop3CommandStatus.Active; Stream.QueueCommand (pc.Encoding, pc.Command, cancellationToken); } Stream.Flush (cancellationToken); for (int i = 0; i < queue.Count; i++) ReadResponse (queue[i], cancellationToken); for (int i = 0; i < queue.Count && throwOnError; i++) queue[i].ThrowIfError (); } finally { queue.Clear (); } } /// /// Asynchronously run the command pipeline. /// /// if exceptions should be thrown for failed commands; otherwise, . /// The cancellation token. /// /// The engine is not connected. /// public async Task RunAsync (bool throwOnError, CancellationToken cancellationToken) { CheckCanRun (cancellationToken); try { for (int i = 0; i < queue.Count; i++) { var pc = queue[i]; pc.Status = Pop3CommandStatus.Active; await Stream.QueueCommandAsync (pc.Encoding, pc.Command, cancellationToken).ConfigureAwait (false); } await Stream.FlushAsync (cancellationToken).ConfigureAwait (false); for (int i = 0; i < queue.Count; i++) await ReadResponseAsync (queue[i], cancellationToken).ConfigureAwait (false); for (int i = 0; i < queue.Count && throwOnError; i++) queue[i].ThrowIfError (); } finally { queue.Clear (); } } public Pop3Command QueueCommand (Pop3CommandHandler? handler, Encoding encoding, string format, params object[] args) { var pc = new Pop3Command (handler, encoding, format, args); queue.Add (pc); return pc; } public Pop3Command QueueCommand (Pop3CommandHandler? handler, string format, params object[] args) { return QueueCommand (handler, Encoding.ASCII, format, args); } static bool IsCapability (string capability, string text, int length, bool hasValue = false) { if (hasValue) { if (length < capability.Length) return false; } else { if (length != capability.Length) return false; } if (string.Compare (text, 0, capability, 0, capability.Length, StringComparison.OrdinalIgnoreCase) != 0) return false; if (hasValue) { int index = capability.Length; return length == capability.Length || text[index] == ' ' || text[index] == '='; } return true; } static bool IsToken (string token, string text, int startIndex, int length) { return length == token.Length && string.Compare (text, startIndex, token, 0, token.Length, StringComparison.OrdinalIgnoreCase) == 0; } static bool ReadNextToken (string text, ref int index, out int startIndex, out int length) { while (index < text.Length && char.IsWhiteSpace (text[index])) index++; startIndex = index; while (index < text.Length && !char.IsWhiteSpace (text[index])) index++; length = index - startIndex; return length > 0; } void AddAuthenticationMechanisms (string text, int startIndex) { int index = startIndex; while (ReadNextToken (text, ref index, out var tokenIndex, out var length)) { var mechanism = text.Substring (tokenIndex, length); AuthenticationMechanisms.Add (mechanism); } } static bool TryParseInt32 (string text, int startIndex, int length, out int value) { #if NETSTANDARD2_1_OR_GREATER || NET5_0_OR_GREATER var token = text.AsSpan (startIndex, length); #else var token = text.Substring (startIndex, length); #endif return int.TryParse (token, NumberStyles.None, CultureInfo.InvariantCulture, out value); } static void ParseCapaResponse (Pop3Engine engine, string response) { int index = response.IndexOf (' '); int startIndex, length, value; if (index == -1) index = response.Length; if (IsCapability ("EXPIRE", response, index, true)) { engine.Capabilities |= Pop3Capabilities.Expire; if (ReadNextToken (response, ref index, out startIndex, out length)) { if (IsToken ("NEVER", response, startIndex, length)) { engine.ExpirePolicy = -1; } else if (TryParseInt32 (response, startIndex, length, out value)) { engine.ExpirePolicy = value; } } } else if (IsCapability ("IMPLEMENTATION", response, index, true)) { engine.Implementation = response.Substring (index + 1); } else if (IsCapability ("LANG", response, index)) { engine.Capabilities |= Pop3Capabilities.Lang; } else if (IsCapability ("LOGIN-DELAY", response, index, true)) { if (ReadNextToken (response, ref index, out startIndex, out length)) { if (TryParseInt32 (response, startIndex, length, out value)) { engine.Capabilities |= Pop3Capabilities.LoginDelay; engine.LoginDelay = value; } } } else if (IsCapability ("PIPELINING", response, index)) { engine.Capabilities |= Pop3Capabilities.Pipelining; } else if (IsCapability ("RESP-CODES", response, index)) { engine.Capabilities |= Pop3Capabilities.ResponseCodes; } else if (IsCapability ("SASL", response, index, true)) { engine.Capabilities |= Pop3Capabilities.Sasl; engine.AddAuthenticationMechanisms (response, index); } else if (IsCapability ("STLS", response, index)) { engine.Capabilities |= Pop3Capabilities.StartTLS; } else if (IsCapability ("TOP", response, index)) { engine.Capabilities |= Pop3Capabilities.Top; } else if (IsCapability ("UIDL", response, index)) { engine.Capabilities |= Pop3Capabilities.UIDL; } else if (IsCapability ("USER", response, index)) { engine.Capabilities |= Pop3Capabilities.User; } else if (IsCapability ("UTF8", response, index, true)) { engine.Capabilities |= Pop3Capabilities.UTF8; while (ReadNextToken (response, ref index, out startIndex, out length)) { if (IsToken ("USER", response, startIndex, length)) { engine.Capabilities |= Pop3Capabilities.UTF8User; } } } } static void ReadCapaResponse (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { string response; do { if ((response = engine.ReadLine (cancellationToken)) == ".") break; ParseCapaResponse (engine, response); } while (true); } static async Task ReadCapaResponseAsync (Pop3Engine engine, Pop3Command pc, CancellationToken cancellationToken) { string response; do { if ((response = await engine.ReadLineAsync (cancellationToken).ConfigureAwait (false)) == ".") break; ParseCapaResponse (engine, response); } while (true); } static Task ProcessCapaResponse (Pop3Engine engine, Pop3Command pc, string text, bool doAsync, CancellationToken cancellationToken) { if (pc.Status != Pop3CommandStatus.Ok) return Task.CompletedTask; if (doAsync) return ReadCapaResponseAsync (engine, pc, cancellationToken); ReadCapaResponse (engine, pc, cancellationToken); return Task.CompletedTask; } Pop3Command QueueCapabilitiesCommand () { CheckConnected (); // Clear all CAPA response capabilities (except the APOP, USER, and STLS capabilities). Capabilities &= Pop3Capabilities.Apop | Pop3Capabilities.User | Pop3Capabilities.StartTLS; AuthenticationMechanisms.Clear (); Implementation = null; ExpirePolicy = 0; LoginDelay = 0; return QueueCommand (ProcessCapaResponse, "CAPA\r\n"); } public void QueryCapabilities (CancellationToken cancellationToken) { QueueCapabilitiesCommand (); Run (false, cancellationToken); } public Task QueryCapabilitiesAsync (CancellationToken cancellationToken) { QueueCapabilitiesCommand (); return RunAsync (false, cancellationToken); } } } ================================================ FILE: MailKit/Net/Pop3/Pop3Language.cs ================================================ // // Pop3Language.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Net.Pop3 { /// /// A POP3 language. /// /// /// A POP3 language. /// public class Pop3Language { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// internal Pop3Language (string lang, string desc) { Language = lang; Description = desc; } /// /// Get the language code. /// /// /// Gets the language code. This is the value that should be given to /// . /// /// The language. public string Language { get; private set; } /// /// Get the description. /// /// /// Gets the description. /// /// The description. public string Description { get; private set; } } } ================================================ FILE: MailKit/Net/Pop3/Pop3ProtocolException.cs ================================================ // // Pop3ProtocolException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit.Net.Pop3 { /// /// A POP3 protocol exception. /// /// /// The exception that is thrown when there is an error communicating with a POP3 server. A /// is typically fatal and requires the /// to be reconnected. /// /// /// /// #if SERIALIZABLE [Serializable] #endif public class Pop3ProtocolException : ProtocolException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected Pop3ProtocolException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// An inner exception. public Pop3ProtocolException (string message, Exception innerException) : base (message, innerException) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public Pop3ProtocolException (string message) : base (message) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public Pop3ProtocolException () { } } } ================================================ FILE: MailKit/Net/Pop3/Pop3Stream.cs ================================================ // // Pop3Stream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Text; using System.Threading; using System.Net.Sockets; using System.Threading.Tasks; using MimeKit.IO; using Buffer = System.Buffer; using SslStream = MailKit.Net.SslStream; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit.Net.Pop3 { /// /// An enumeration of the possible POP3 streaming modes. /// /// /// Normal operation is done in the mode, /// but when retrieving messages (via RETR) or headers (via TOP), the /// mode should be used. /// enum Pop3StreamMode { /// /// Reads 1 line at a time. /// Line, /// /// Reads data in chunks, ignoring line state. /// Data } /// /// A stream for communicating with a POP3 server. /// /// /// A stream capable of reading data line-by-line () /// or by raw byte streams (). /// class Pop3Stream : Stream, ICancellableStream { const int ReadAheadSize = 128; const int BlockSize = 4096; const int PadSize = 4; // I/O buffering readonly byte[] input = new byte[ReadAheadSize + BlockSize + PadSize]; const int inputStart = ReadAheadSize; readonly byte[] output = new byte[BlockSize]; int outputIndex; readonly IProtocolLogger logger; int inputIndex = ReadAheadSize; int inputEnd = ReadAheadSize; Pop3StreamMode mode; bool disposed; bool midline; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The underlying network stream. /// The protocol logger. public Pop3Stream (Stream source, IProtocolLogger protocolLogger) { logger = protocolLogger; IsConnected = true; Stream = source; } /// /// Get or sets the underlying network stream. /// /// /// Gets or sets the underlying network stream. /// /// The underlying network stream. public Stream Stream { get; internal set; } /// /// Gets or sets the mode used for reading. /// /// The mode. public Pop3StreamMode Mode { get { return mode; } set { IsEndOfData = false; mode = value; } } /// /// Get whether or not the stream is connected. /// /// /// Gets whether or not the stream is connected. /// /// if the stream is connected; otherwise, . public bool IsConnected { get; private set; } /// /// Get whether or not the end of the raw data has been reached in mode. /// /// /// When reading the response to a command such as RETR, the end of the data is marked by line matching ".\r\n". /// /// if the end of the data has been reached; otherwise, . public bool IsEndOfData { get; private set; } /// /// Get whether the stream supports reading. /// /// /// Gets whether the stream supports reading. /// /// if the stream supports reading; otherwise, . public override bool CanRead { get { return Stream.CanRead; } } /// /// Get whether the stream supports writing. /// /// /// Gets whether the stream supports writing. /// /// if the stream supports writing; otherwise, . public override bool CanWrite { get { return Stream.CanWrite; } } /// /// Get whether the stream supports seeking. /// /// /// Gets whether the stream supports seeking. /// /// if the stream supports seeking; otherwise, . public override bool CanSeek { get { return false; } } /// /// Get whether the stream supports I/O timeouts. /// /// /// Gets whether the stream supports I/O timeouts. /// /// if the stream supports I/O timeouts; otherwise, . public override bool CanTimeout { get { return Stream.CanTimeout; } } /// /// Get or set a value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// The read timeout. public override int ReadTimeout { get { return Stream.ReadTimeout; } set { Stream.ReadTimeout = value; } } /// /// Get or set a value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// The write timeout. public override int WriteTimeout { get { return Stream.WriteTimeout; } set { Stream.WriteTimeout = value; } } /// /// Get or set the position within the current stream. /// /// /// Gets or sets the position within the current stream. /// /// The current position within the stream. /// The position of the stream. /// /// An I/O error occurred. /// /// /// The stream does not support seeking. /// /// /// The stream has been disposed. /// public override long Position { get { return Stream.Position; } set { throw new NotSupportedException (); } } /// /// Get the length of the stream, in bytes. /// /// /// Gets the length of the stream, in bytes. /// /// A long value representing the length of the stream in bytes. /// The length of the stream. /// /// The stream does not support seeking. /// /// /// The stream has been disposed. /// public override long Length { get { return Stream.Length; } } void AlignReadAheadBuffer (out int start, out int end) { int left = inputEnd - inputIndex; start = inputStart; end = inputEnd; if (left > 0) { int index = inputIndex; // attempt to align the end of the remaining input with ReadAheadSize if (index >= start) { start -= Math.Min (ReadAheadSize, left); Buffer.BlockCopy (input, index, input, start, left); index = start; start += left; } else if (index > 0) { int shift = Math.Min (index, end - start); Buffer.BlockCopy (input, index, input, index - shift, left); index -= shift; start = index + left; } else { // we can't shift... start = end; } inputIndex = index; inputEnd = start; } else { inputIndex = start; inputEnd = start; } end = input.Length - PadSize; } void OnReadAhead (int start, int nread) { if (nread > 0) { logger.LogServer (input, start, nread); inputEnd += nread; } else { throw new Pop3ProtocolException ("The POP3 server has unexpectedly disconnected."); } } int ReadAhead (CancellationToken cancellationToken) { AlignReadAheadBuffer (out int start, out int end); try { var network = Stream as NetworkStream; int nread; cancellationToken.ThrowIfCancellationRequested (); network?.Poll (SelectMode.SelectRead, cancellationToken); nread = Stream.Read (input, start, end - start); OnReadAhead (start, nread); } catch { IsConnected = false; throw; } return inputEnd - inputIndex; } async Task ReadAheadAsync (CancellationToken cancellationToken) { AlignReadAheadBuffer (out int start, out int end); try { int nread; cancellationToken.ThrowIfCancellationRequested (); nread = await Stream.ReadAsync (input, start, end - start, cancellationToken).ConfigureAwait (false); OnReadAhead (start, nread); } catch { IsConnected = false; throw; } return inputEnd - inputIndex; } static void ValidateArguments (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0 || count > (buffer.Length - offset)) throw new ArgumentOutOfRangeException (nameof (count)); } void CheckDisposed () { if (disposed) throw new ObjectDisposedException (nameof (Pop3Stream)); } bool NeedInput (int index, int inputLeft) { if (inputLeft == 2 && input[index] == (byte) '.' && input[index + 1] == '\n') return false; return true; } void Read (byte[] buffer, ref int index, int endIndex) { // terminate the input buffer with a '\n' to remove bounds checking in our inner loop input[inputEnd] = (byte) '\n'; while (inputIndex < inputEnd) { if (midline) { // read until end-of-line while (index < endIndex && input[inputIndex] != (byte) '\n') buffer[index++] = input[inputIndex++]; if (inputIndex == inputEnd || index == endIndex) break; // consume the '\n' character buffer[index++] = input[inputIndex++]; midline = false; } if (inputIndex == inputEnd) break; if (input[inputIndex] == (byte) '.') { int inputLeft = inputEnd - inputIndex; // check for ".\r\n" which signifies the end of the data stream if (inputLeft >= 3 && input[inputIndex + 1] == (byte) '\r' && input[inputIndex + 2] == (byte) '\n') { IsEndOfData = true; midline = false; inputIndex += 3; break; } // check for ".\n" which is used by some broken UNIX servers in place of ".\r\n" if (inputLeft >= 2 && input[inputIndex + 1] == (byte) '\n') { IsEndOfData = true; midline = false; inputIndex += 2; break; } // check for "." or ".\r" which might be an incomplete termination sequence if (inputLeft == 1 || (inputLeft == 2 && input[inputIndex + 1] == (byte) '\r')) { // not enough data... break; } // check for lines beginning with ".." which should be transformed into "." if (input[inputIndex + 1] == (byte) '.') inputIndex++; } midline = true; } } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream is in line mode (see ). /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public int Read (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); if (Mode != Pop3StreamMode.Data) throw new InvalidOperationException (); if (IsEndOfData || count == 0) return 0; int endIndex = offset + count; int index = offset; int inputLeft; do { inputLeft = inputEnd - inputIndex; // we need at least 3 bytes: ".\r\n" if (inputLeft < 3 && (midline || NeedInput (inputIndex, inputLeft))) { if (index > offset) break; ReadAhead (cancellationToken); } Read (buffer, ref index, endIndex); } while (index < endIndex && !IsEndOfData); return index - offset; } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream is in line mode (see ). /// /// /// An I/O error occurred. /// public override int Read (byte[] buffer, int offset, int count) { return Read (buffer, offset, count, CancellationToken.None); } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream is in line mode (see ). /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override async Task ReadAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); if (Mode != Pop3StreamMode.Data) throw new InvalidOperationException (); if (IsEndOfData || count == 0) return 0; int endIndex = offset + count; int index = offset; int inputLeft; do { inputLeft = inputEnd - inputIndex; // we need at least 3 bytes: ".\r\n" if (inputLeft < 3 && (midline || NeedInput (inputIndex, inputLeft))) { if (index > offset) break; await ReadAheadAsync (cancellationToken).ConfigureAwait (false); } Read (buffer, ref index, endIndex); } while (index < endIndex && !IsEndOfData); return index - offset; } bool TryReadLine (ByteArrayBuilder builder) { unsafe { fixed (byte* inbuf = input) { byte* start, inptr, inend; int offset = inputIndex; int count; start = inbuf + inputIndex; inend = inbuf + inputEnd; *inend = (byte) '\n'; inptr = start; // FIXME: use SIMD to optimize this while (*inptr != (byte) '\n') inptr++; inputIndex = (int) (inptr - inbuf); count = (int) (inptr - start); if (inptr == inend) { builder.Append (input, offset, count); midline = true; return false; } // consume the '\n' midline = false; inputIndex++; count++; builder.Append (input, offset, count); return true; } } } /// /// Reads a single line of input from the stream. /// /// /// This method should be called in a loop until it returns . /// /// , if reading the line is complete, otherwise. /// The output buffer to write the line data into. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// internal bool ReadLine (ByteArrayBuilder builder, CancellationToken cancellationToken) { CheckDisposed (); if (inputIndex == inputEnd) ReadAhead (cancellationToken); return TryReadLine (builder); } /// /// Asynchronously reads a single line of input from the stream. /// /// /// This method should be called in a loop until it returns . /// /// , if reading the line is complete, otherwise. /// The output buffer to write the line data into. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// internal async Task ReadLineAsync (ByteArrayBuilder builder, CancellationToken cancellationToken) { CheckDisposed (); if (inputIndex == inputEnd) await ReadAheadAsync (cancellationToken).ConfigureAwait (false); return TryReadLine (builder); } unsafe bool TryQueueCommand (Encoder encoder, string command, ref int index) { fixed (char* cmd = command) { int outputLeft = output.Length - outputIndex; int charCount = command.Length - index; char* chars = cmd + index; var needed = encoder.GetByteCount (chars, charCount, true); if (needed > output.Length) { // If the command we are trying to queue is larger than the output buffer and we // already have some commands queued in the output buffer, then flush the queue // before queuing this command. if (outputIndex > 0) return false; } else if (needed > outputLeft && index == 0) { // If we are trying to queue a new command (index == 0) and we need more space than // what remains in the output buffer, then flush the output buffer before queueing // the new command. Some servers do not handle receiving partial commands well. return false; } fixed (byte* outbuf = output) { byte* outptr = outbuf + outputIndex; encoder.Convert (chars, charCount, outptr, outputLeft, true, out int charsUsed, out int bytesUsed, out bool completed); outputIndex += bytesUsed; index += charsUsed; return completed; } } } /// /// Queue a command to the POP3 server. /// /// /// Queues a command to the POP3 server. /// /// The character encoding. /// The command. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public void QueueCommand (Encoding encoding, string command, CancellationToken cancellationToken) { var encoder = encoding.GetEncoder (); int index = 0; while (!TryQueueCommand (encoder, command, ref index)) Flush (cancellationToken); } /// /// Asynchronously queue a command to the POP3 server. /// /// /// Asynchronously queues a command to the POP3 server. /// /// The character encoding. /// The command. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public async Task QueueCommandAsync (Encoding encoding, string command, CancellationToken cancellationToken) { var encoder = encoding.GetEncoder (); int index = 0; while (!TryQueueCommand (encoder, command, ref index)) await FlushAsync (cancellationToken).ConfigureAwait (false); } void OnWriteException (Exception ex, CancellationToken cancellationToken) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public void Write (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); try { var network = NetworkStream.Get (Stream); int index = offset; int left = count; while (left > 0) { int n = Math.Min (BlockSize - outputIndex, left); if (outputIndex > 0 || n < BlockSize) { // append the data to the output buffer Buffer.BlockCopy (buffer, index, output, outputIndex, n); outputIndex += n; index += n; left -= n; } if (outputIndex == BlockSize) { // flush the output buffer network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (output, 0, BlockSize); logger.LogClient (output, 0, BlockSize); outputIndex = 0; } if (outputIndex == 0) { // write blocks of data to the stream without buffering while (left >= BlockSize) { network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (buffer, index, BlockSize); logger.LogClient (buffer, index, BlockSize); index += BlockSize; left -= BlockSize; } } } } catch (Exception ex) { OnWriteException (ex, cancellationToken); throw; } IsEndOfData = false; } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Write (byte[] buffer, int offset, int count) { Write (buffer, offset, count, CancellationToken.None); } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// A task that represents the asynchronous write operation. /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override async Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); try { int index = offset; int left = count; while (left > 0) { int n = Math.Min (BlockSize - outputIndex, left); if (outputIndex > 0 || n < BlockSize) { // append the data to the output buffer Buffer.BlockCopy (buffer, index, output, outputIndex, n); outputIndex += n; index += n; left -= n; } if (outputIndex == BlockSize) { // flush the output buffer await Stream.WriteAsync (output, 0, BlockSize, cancellationToken).ConfigureAwait (false); logger.LogClient (output, 0, BlockSize); outputIndex = 0; } if (outputIndex == 0) { // write blocks of data to the stream without buffering while (left >= BlockSize) { await Stream.WriteAsync (buffer, index, BlockSize, cancellationToken).ConfigureAwait (false); logger.LogClient (buffer, index, BlockSize); index += BlockSize; left -= BlockSize; } } } } catch (Exception ex) { OnWriteException (ex, cancellationToken); throw; } IsEndOfData = false; } /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// The cancellation token. /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public void Flush (CancellationToken cancellationToken) { CheckDisposed (); if (outputIndex == 0) return; try { var network = NetworkStream.Get (Stream); network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (output, 0, outputIndex); Stream.Flush (); logger.LogClient (output, 0, outputIndex); outputIndex = 0; } catch (Exception ex) { OnWriteException (ex, cancellationToken); throw; } } /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Flush () { Flush (CancellationToken.None); } /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// A task that represents the asynchronous flush operation. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override async Task FlushAsync (CancellationToken cancellationToken) { CheckDisposed (); if (outputIndex == 0) return; try { await Stream.WriteAsync (output, 0, outputIndex, cancellationToken).ConfigureAwait (false); await Stream.FlushAsync (cancellationToken).ConfigureAwait (false); logger.LogClient (output, 0, outputIndex); outputIndex = 0; } catch (Exception ex) { OnWriteException (ex, cancellationToken); throw; } } /// /// Sets the position within the current stream. /// /// The new position within the stream. /// The offset into the stream relative to the . /// The origin to seek from. /// /// The stream does not support seeking. /// public override long Seek (long offset, SeekOrigin origin) { throw new NotSupportedException (); } /// /// Sets the length of the stream. /// /// The desired length of the stream in bytes. /// /// The stream does not support setting the length. /// public override void SetLength (long value) { throw new NotSupportedException (); } /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected override void Dispose (bool disposing) { if (disposing && !disposed) { IsConnected = false; Stream.Dispose (); } disposed = true; base.Dispose (disposing); } } } ================================================ FILE: MailKit/Net/Proxy/HttpProxyClient.cs ================================================ // // HttpProxyClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Buffers; using System.Threading; using System.Net.Sockets; using System.Globalization; using System.Threading.Tasks; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit.Net.Proxy { /// /// An HTTP proxy client. /// /// /// An HTTP proxy client. /// public class HttpProxyClient : ProxyClient { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// public HttpProxyClient (string host, int port) : base (host, port) { } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// The credentials to use to authenticate with the proxy server. /// /// is . /// -or- /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// public HttpProxyClient (string host, int port, NetworkCredential credentials) : base (host, port, credentials) { } internal static byte[] GetConnectCommand (string host, int port, NetworkCredential? proxyCredentials) { var builder = new StringBuilder (); builder.AppendFormat (CultureInfo.InvariantCulture, "CONNECT {0}:{1} HTTP/1.1\r\n", host, port); builder.AppendFormat (CultureInfo.InvariantCulture, "Host: {0}:{1}\r\n", host, port); if (proxyCredentials != null) { var token = Encoding.UTF8.GetBytes (string.Format (CultureInfo.InvariantCulture, "{0}:{1}", proxyCredentials.UserName, proxyCredentials.Password)); var base64 = Convert.ToBase64String (token); builder.AppendFormat (CultureInfo.InvariantCulture, "Proxy-Authorization: Basic {0}\r\n", base64); } builder.Append ("\r\n"); return Encoding.UTF8.GetBytes (builder.ToString ()); } internal static bool TryConsumeHeaders (ByteArrayBuilder builder, byte c, ref bool newLine) { var endOfHeaders = false; switch ((char) c) { case '\r': break; case '\n': endOfHeaders = newLine; newLine = true; break; default: newLine = false; break; } builder.Append (c); return endOfHeaders; } internal static void ValidateHttpResponse (string response, string host, int port) { // Verify that the response starts with something like "HTTP/1.1 200 ..." if (response.Length >= 15 && response.StartsWith ("HTTP/1.", StringComparison.OrdinalIgnoreCase) && (response[7] == '1' || response[7] == '0') && response[8] == ' ' && response[9] == '2' && response[10] == '0' && response[11] == '0' && response[12] == ' ') { return; } throw new ProxyProtocolException (string.Format (CultureInfo.InvariantCulture, "Failed to connect to {0}:{1}: {2}", host, port, response)); } /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override Stream Connect (string host, int port, CancellationToken cancellationToken = default) { ValidateArguments (host, port); cancellationToken.ThrowIfCancellationRequested (); var command = GetConnectCommand (host, port, ProxyCredentials); var socket = SocketUtils.Connect (ProxyHost, ProxyPort, LocalEndPoint, cancellationToken); try { Send (socket, command, 0, command.Length, cancellationToken); var builder = new ByteArrayBuilder (256); var buffer = new byte[1]; var newline = false; string response; try { // read until we consume the end of the headers do { int nread = Receive (socket, buffer, 0, 1, cancellationToken); if (nread < 1 || TryConsumeHeaders (builder, buffer[0], ref newline)) break; } while (true); response = builder.ToString (); } finally { builder.Dispose (); } ValidateHttpResponse (response, host, port); return new NetworkStream (socket, true); } catch { if (socket.Connected) socket.Disconnect (false); socket.Dispose (); throw; } } /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override async Task ConnectAsync (string host, int port, CancellationToken cancellationToken = default) { ValidateArguments (host, port); cancellationToken.ThrowIfCancellationRequested (); var socket = await SocketUtils.ConnectAsync (ProxyHost, ProxyPort, LocalEndPoint, cancellationToken).ConfigureAwait (false); var command = GetConnectCommand (host, port, ProxyCredentials); try { await SendAsync (socket, command, 0, command.Length, cancellationToken).ConfigureAwait (false); var builder = new ByteArrayBuilder (256); var buffer = new byte[1]; var newline = false; string response; try { // read until we consume the end of the headers do { int nread = await ReceiveAsync (socket, buffer, 0, 1, cancellationToken).ConfigureAwait (false); if (nread < 1 || TryConsumeHeaders (builder, buffer[0], ref newline)) break; } while (true); response = builder.ToString (); } finally { builder.Dispose (); } ValidateHttpResponse (response, host, port); return new NetworkStream (socket, true); } catch { if (socket.Connected) socket.Disconnect (false); socket.Dispose (); throw; } } } } ================================================ FILE: MailKit/Net/Proxy/HttpsProxyClient.cs ================================================ // // HttpsProxyClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Buffers; using System.Threading; using System.Net.Security; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using MailKit.Security; using SslStream = MailKit.Net.SslStream; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit.Net.Proxy { /// /// An HTTPS proxy client. /// /// /// An HTTPS proxy client. /// public class HttpsProxyClient : ProxyClient { #if NET48_OR_GREATER || NET5_0_OR_GREATER const SslProtocols DefaultSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13; #else const SslProtocols DefaultSslProtocols = SslProtocols.Tls12 | (SslProtocols) 12288; #endif /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// public HttpsProxyClient (string host, int port) : base (host, port) { SslProtocols = DefaultSslProtocols; } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// The credentials to use to authenticate with the proxy server. /// /// is . /// -or- /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// public HttpsProxyClient (string host, int port, NetworkCredential credentials) : base (host, port, credentials) { SslProtocols = DefaultSslProtocols; } /// /// Gets or sets the set of enabled SSL and/or TLS protocol versions that the client is allowed to use. /// /// /// Gets or sets the enabled SSL and/or TLS protocol versions that the client is allowed to use. /// By default, MailKit initializes this value to enable only TLS v1.2 and greater. /// TLS v1.1, TLS v1.0 and all versions of SSL are not enabled by default due to them all being /// susceptible to security vulnerabilities such as POODLE. /// This property should be set before calling any of the /// Connect methods. /// /// The SSL and TLS protocol versions that are enabled. public SslProtocols SslProtocols { get; set; } #if NET5_0_OR_GREATER /// /// Gets or sets the cipher suites allowed to be used when negotiating an SSL or TLS connection. /// /// /// Specifies the cipher suites allowed to be used when negotiating an SSL or TLS connection. /// When set to , the operating system default is used. Use extreme caution when /// changing this setting. /// /// The cipher algorithms allowed for use when negotiating SSL or TLS encryption. public CipherSuitesPolicy? SslCipherSuitesPolicy { get; set; } #endif /// /// Gets or sets the client SSL certificates. /// /// /// Some servers may require the client SSL certificates in order /// to allow the user to connect. /// This property should be set before calling any of the /// Connect methods. /// /// The client SSL certificates. public X509CertificateCollection? ClientCertificates { get; set; } /// /// Get or set whether connecting via SSL/TLS should check certificate revocation. /// /// /// Gets or sets whether connecting via SSL/TLS should check certificate revocation. /// Normally, the value of this property should be set to (the default) for security /// reasons, but there are times when it may be necessary to set it to . /// For example, most Certificate Authorities are probably pretty good at keeping their CRL and/or /// OCSP servers up 24/7, but occasionally they do go down or are otherwise unreachable due to other /// network problems between the client and the Certificate Authority. When this happens, it becomes /// impossible to check the revocation status of one or more of the certificates in the chain /// resulting in an being thrown in the /// Connect method. If this becomes a problem, /// it may become desirable to set to . /// /// if certificate revocation should be checked; otherwise, . public bool CheckCertificateRevocation { get; set; } /// /// Get or sets a callback function to validate the server certificate. /// /// /// Gets or sets a callback function to validate the server certificate. /// This property should be set before calling any of the /// Connect methods. /// /// The server certificate validation callback function. public RemoteCertificateValidationCallback? ServerCertificateValidationCallback { get; set; } // Note: This is used by SslHandshakeException to build the exception message. SslCertificateValidationInfo? sslValidationInfo; bool ValidateRemoteCertificate (object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) { bool valid; sslValidationInfo?.Dispose (); sslValidationInfo = null; if (ServerCertificateValidationCallback != null) { valid = ServerCertificateValidationCallback (ProxyHost, certificate, chain, sslPolicyErrors); #if NETFRAMEWORK } else if (ServicePointManager.ServerCertificateValidationCallback != null) { valid = ServicePointManager.ServerCertificateValidationCallback (ProxyHost, certificate, chain, sslPolicyErrors); #endif } else { valid = sslPolicyErrors == SslPolicyErrors.None; } if (!valid) { // Note: The SslHandshakeException.Create() method will nullify this once it's done using it. sslValidationInfo = new SslCertificateValidationInfo (ProxyHost, certificate, chain, sslPolicyErrors); } return valid; } #if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER /// /// Gets the SSL/TLS client authentication options for use with .NET5's SslStream.AuthenticateAsClient() API. /// /// /// Gets the SSL/TLS client authentication options for use with .NET5's SslStream.AuthenticateAsClient() API. /// /// The target host that the client is connected to. /// The remote certificate validation callback. /// The client SSL/TLS authentication options. SslClientAuthenticationOptions GetSslClientAuthenticationOptions (string host, RemoteCertificateValidationCallback remoteCertificateValidationCallback) { return new SslClientAuthenticationOptions { CertificateRevocationCheckMode = CheckCertificateRevocation ? X509RevocationMode.Online : X509RevocationMode.NoCheck, ApplicationProtocols = new List { SslApplicationProtocol.Http11 }, RemoteCertificateValidationCallback = remoteCertificateValidationCallback, #if NET5_0_OR_GREATER CipherSuitesPolicy = SslCipherSuitesPolicy, #endif ClientCertificates = ClientCertificates, EnabledSslProtocols = SslProtocols, TargetHost = host }; } #endif /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override Stream Connect (string host, int port, CancellationToken cancellationToken = default) { ValidateArguments (host, port); cancellationToken.ThrowIfCancellationRequested (); var socket = SocketUtils.Connect (ProxyHost, ProxyPort, LocalEndPoint, cancellationToken); var ssl = new SslStream (new NetworkStream (socket, true), false, ValidateRemoteCertificate); try { #if NET5_0_OR_GREATER ssl.AuthenticateAsClient (GetSslClientAuthenticationOptions (host, ValidateRemoteCertificate)); #else ssl.AuthenticateAsClient (host, ClientCertificates, SslProtocols, CheckCertificateRevocation); #endif } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "HTTP", host, port, 443, 80); } var command = HttpProxyClient.GetConnectCommand (host, port, ProxyCredentials); try { ssl.Write (command, 0, command.Length); var builder = new ByteArrayBuilder (256); var buffer = new byte[1]; var newline = false; string response; try { // read until we consume the end of the headers do { int nread = ssl.Read (buffer, 0, 1); if (nread < 1 || HttpProxyClient.TryConsumeHeaders (builder, buffer[0], ref newline)) break; } while (true); response = builder.ToString (); } finally { builder.Dispose (); } HttpProxyClient.ValidateHttpResponse (response, host, port); return ssl; } catch { ssl.Dispose (); throw; } } /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override async Task ConnectAsync (string host, int port, CancellationToken cancellationToken = default) { ValidateArguments (host, port); cancellationToken.ThrowIfCancellationRequested (); var socket = await SocketUtils.ConnectAsync (ProxyHost, ProxyPort, LocalEndPoint, cancellationToken).ConfigureAwait (false); var ssl = new SslStream (new NetworkStream (socket, true), false, ValidateRemoteCertificate); try { #if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER await ssl.AuthenticateAsClientAsync (GetSslClientAuthenticationOptions (host, ValidateRemoteCertificate), cancellationToken).ConfigureAwait (false); #else await ssl.AuthenticateAsClientAsync (host, ClientCertificates, SslProtocols, CheckCertificateRevocation).ConfigureAwait (false); #endif } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "HTTP", host, port, 443, 80); } var command = HttpProxyClient.GetConnectCommand (host, port, ProxyCredentials); try { await ssl.WriteAsync (command, 0, command.Length, cancellationToken).ConfigureAwait (false); var builder = new ByteArrayBuilder (256); var buffer = new byte[1]; var newline = false; string response; try { // read until we consume the end of the headers do { int nread = ssl.Read (buffer, 0, 1); if (HttpProxyClient.TryConsumeHeaders (builder, buffer[0], ref newline)) break; } while (true); response = builder.ToString (); } finally { builder.Dispose (); } HttpProxyClient.ValidateHttpResponse (response, host, port); return ssl; } catch { ssl.Dispose (); throw; } } } } ================================================ FILE: MailKit/Net/Proxy/IProxyClient.cs ================================================ // // IProxyClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Threading; using System.Net.Sockets; using System.Threading.Tasks; namespace MailKit.Net.Proxy { /// /// An interface for connecting to services via a proxy. /// /// /// Implemented by , , /// , and . /// /// /// /// public interface IProxyClient { /// /// Gets the proxy credentials. /// /// /// Gets the credentials to use when authenticating with the proxy server. /// /// The proxy credentials. NetworkCredential? ProxyCredentials { get; } /// /// Get the proxy host. /// /// /// Gets the host name of the proxy server. /// /// The host name of the proxy server. string ProxyHost { get; } /// /// Get the proxy port. /// /// /// Gets the port to use when connecting to the proxy server. /// /// The proxy port. int ProxyPort { get; } /// /// Get or set the local IP end point to use when connecting to a remote host. /// /// /// Gets or sets the local IP end point to use when connecting to a remote host. /// /// The local IP end point or to use the default end point. IPEndPoint? LocalEndPoint { get; set; } /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// Stream Connect (string host, int port, CancellationToken cancellationToken = default); /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// Task ConnectAsync (string host, int port, CancellationToken cancellationToken = default); /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The timeout, in milliseconds. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// The operation timed out. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// Stream Connect (string host, int port, int timeout, CancellationToken cancellationToken = default); /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The timeout, in milliseconds. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// The operation timed out. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// Task ConnectAsync (string host, int port, int timeout, CancellationToken cancellationToken = default); } } ================================================ FILE: MailKit/Net/Proxy/ProxyClient.cs ================================================ // // ProxyClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Threading; using System.Net.Sockets; using System.Threading.Tasks; #if NET6_0_OR_GREATER using System.Net.Http; #endif namespace MailKit.Net.Proxy { /// /// An abstract proxy client base class. /// /// /// A proxy client can be used to connect to a service through a firewall that /// would otherwise be blocked. /// /// /// /// public abstract class ProxyClient : IProxyClient { #if NET6_0_OR_GREATER static IProxyClient? systemProxy; /// /// Get a client for the default system proxy. /// /// /// Gets a client for the default system proxy. /// /// A client for the default system proxy. public static IProxyClient SystemProxy { get { systemProxy ??= new WebProxyClient (HttpClient.DefaultProxy); return systemProxy; } } #endif /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// protected ProxyClient (string host, int port) { if (host == null) throw new ArgumentNullException (nameof (host)); if (host.Length == 0 || host.Length > 255) throw new ArgumentException ("The length of the host name must be between 0 and 256 characters.", nameof (host)); if (port < 0 || port > 65535) throw new ArgumentOutOfRangeException (nameof (port)); ProxyHost = host; ProxyPort = port == 0 ? 1080 : port; } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// The credentials to use to authenticate with the proxy server. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// protected ProxyClient (string host, int port, NetworkCredential credentials) : this (host, port) { if (credentials == null) throw new ArgumentNullException (nameof (credentials)); ProxyCredentials = credentials; } /// /// Gets the proxy credentials. /// /// /// Gets the credentials to use when authenticating with the proxy server. /// /// The proxy credentials. public NetworkCredential? ProxyCredentials { get; private set; } /// /// Get the proxy host. /// /// /// Gets the host name of the proxy server. /// /// The host name of the proxy server. public string ProxyHost { get; private set; } /// /// Get the proxy port. /// /// /// Gets the port to use when connecting to the proxy server. /// /// The proxy port. public int ProxyPort { get; private set; } /// /// Get or set the local IP end point to use when connecting to a remote host. /// /// /// Gets or sets the local IP end point to use when connecting to a remote host. /// /// The local IP end point or to use the default end point. public IPEndPoint? LocalEndPoint { get; set; } internal static void ValidateArguments (string host, int port) { if (host == null) throw new ArgumentNullException (nameof (host)); if (host.Length == 0 || host.Length > 255) throw new ArgumentException ("The length of the host name must be between 0 and 256 characters.", nameof (host)); if (port <= 0 || port > 65535) throw new ArgumentOutOfRangeException (nameof (port)); } static void ValidateArguments (string host, int port, int timeout) { ValidateArguments (host, port); if (timeout < -1) throw new ArgumentOutOfRangeException (nameof (timeout)); } static void AsyncOperationCompleted (object? sender, SocketAsyncEventArgs args) { var tcs = (TaskCompletionSource) args.UserToken!; if (args.SocketError == SocketError.Success) { tcs.TrySetResult (true); return; } tcs.TrySetException (new SocketException ((int) args.SocketError)); } internal static void Send (Socket socket, byte[] buffer, int offset, int length, CancellationToken cancellationToken) { if (cancellationToken.CanBeCanceled) { var tcs = new TaskCompletionSource (); using (var registration = cancellationToken.Register (() => tcs.TrySetCanceled (), false)) { using (var args = new SocketAsyncEventArgs ()) { args.Completed += AsyncOperationCompleted; args.SetBuffer (buffer, offset, length); args.AcceptSocket = socket; args.UserToken = tcs; if (!socket.SendAsync (args)) AsyncOperationCompleted (null, args); tcs.Task.GetAwaiter ().GetResult (); return; } } } SocketUtils.Poll (socket, SelectMode.SelectWrite, cancellationToken); socket.Send (buffer, offset, length, SocketFlags.None); } internal static async Task SendAsync (Socket socket, byte[] buffer, int offset, int length, CancellationToken cancellationToken) { var tcs = new TaskCompletionSource (); using (var registration = cancellationToken.Register (() => tcs.TrySetCanceled (), false)) { using (var args = new SocketAsyncEventArgs ()) { args.Completed += AsyncOperationCompleted; args.SetBuffer (buffer, offset, length); args.AcceptSocket = socket; args.UserToken = tcs; if (!socket.SendAsync (args)) AsyncOperationCompleted (null, args); await tcs.Task.ConfigureAwait (false); } } } internal static int Receive (Socket socket, byte[] buffer, int offset, int length, CancellationToken cancellationToken) { if (cancellationToken.CanBeCanceled) { var tcs = new TaskCompletionSource (); using (var registration = cancellationToken.Register (() => tcs.TrySetCanceled (), false)) { using (var args = new SocketAsyncEventArgs ()) { args.Completed += AsyncOperationCompleted; args.SetBuffer (buffer, offset, length); args.AcceptSocket = socket; args.UserToken = tcs; if (!socket.ReceiveAsync (args)) AsyncOperationCompleted (null, args); tcs.Task.GetAwaiter ().GetResult (); return args.BytesTransferred; } } } SocketUtils.Poll (socket, SelectMode.SelectRead, cancellationToken); return socket.Receive (buffer, offset, length, SocketFlags.None); } internal static async Task ReceiveAsync (Socket socket, byte[] buffer, int offset, int length, CancellationToken cancellationToken) { var tcs = new TaskCompletionSource (); using (var registration = cancellationToken.Register (() => tcs.TrySetCanceled (), false)) { using (var args = new SocketAsyncEventArgs ()) { args.Completed += AsyncOperationCompleted; args.SetBuffer (buffer, offset, length); args.AcceptSocket = socket; args.UserToken = tcs; if (!socket.ReceiveAsync (args)) AsyncOperationCompleted (null, args); await tcs.Task.ConfigureAwait (false); return args.BytesTransferred; } } } /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public abstract Stream Connect (string host, int port, CancellationToken cancellationToken = default); /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public abstract Task ConnectAsync (string host, int port, CancellationToken cancellationToken = default); /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The timeout, in milliseconds. /// The cancellation token. /// /// is . /// /// /// is not between 1 and 65535. /// -or- /// is less than -1. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// The operation timed out. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public virtual Stream Connect (string host, int port, int timeout, CancellationToken cancellationToken = default) { ValidateArguments (host, port, timeout); using (var ts = new CancellationTokenSource (timeout)) { using (var linked = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken, ts.Token)) { try { return Connect (host, port, linked.Token); } catch (OperationCanceledException) { if (!cancellationToken.IsCancellationRequested) throw new TimeoutException (); throw; } } } } /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The timeout, in milliseconds. /// The cancellation token. /// /// is . /// /// /// is not between 1 and 65535. /// -or- /// is less than -1. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// The operation timed out. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public async virtual Task ConnectAsync (string host, int port, int timeout, CancellationToken cancellationToken = default) { ValidateArguments (host, port, timeout); using (var ts = new CancellationTokenSource (timeout)) { using (var linked = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken, ts.Token)) { try { return await ConnectAsync (host, port, linked.Token).ConfigureAwait (false); } catch (OperationCanceledException) { if (!cancellationToken.IsCancellationRequested) throw new TimeoutException (); throw; } } } } } } ================================================ FILE: MailKit/Net/Proxy/ProxyProtocolException.cs ================================================ // // ProxyProtocolException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit.Net.Proxy { /// /// A proxy protocol exception. /// /// /// The exception that is thrown when there is an error communicating with a proxy server. /// #if SERIALIZABLE [Serializable] #endif public class ProxyProtocolException : ProtocolException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected ProxyProtocolException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// An inner exception. public ProxyProtocolException (string message, Exception innerException) : base (message, innerException) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public ProxyProtocolException (string message) : base (message) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public ProxyProtocolException () { } } } ================================================ FILE: MailKit/Net/Proxy/Socks4Client.cs ================================================ // // Socks4Client.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Globalization; using System.Threading.Tasks; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit.Net.Proxy { /// /// A SOCKS4 proxy client. /// /// /// A SOCKS4 proxy client. /// /// /// /// public class Socks4Client : SocksClient { static readonly byte[] InvalidIPAddress = { 0, 0, 0, 1 }; /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// public Socks4Client (string host, int port) : base (4, host, port) { } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// The credentials to use to authenticate with the proxy server. /// /// is . /// -or- /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// public Socks4Client (string host, int port, NetworkCredential credentials) : base (4, host, port, credentials) { } /// /// Get or set whether this is a Socks4a client. /// /// /// Gets or sets whether this is a Socks4a client. /// /// if is is a Socks4a client; otherwise, . protected bool IsSocks4a { get; set; } enum Socks4Command : byte { Connect = 0x01, Bind = 0x02, } enum Socks4Reply : byte { RequestGranted = 0x5a, RequestRejected = 0x5b, RequestFailedNoIdentd = 0x5c, RequestFailedWrongId = 0x5d } static string GetFailureReason (byte reply) { switch ((Socks4Reply) reply) { case Socks4Reply.RequestRejected: return "Request rejected or failed."; case Socks4Reply.RequestFailedNoIdentd: return "Request failed; unable to contact client machine's identd service."; case Socks4Reply.RequestFailedWrongId: return "Request failed; client ID does not match specified username."; default: return "Unknown error."; } } static IPAddress Resolve (string host, IPAddress[] ipAddresses) { for (int i = 0; i < ipAddresses.Length; i++) { if (ipAddresses[i].AddressFamily == AddressFamily.InterNetwork) return ipAddresses[i]; } throw new ArgumentException ($"Could not resolve a suitable IPv4 address for '{host}'.", nameof (host)); } static IPAddress Resolve (string host, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested (); var ipAddresses = Dns.GetHostAddresses (host); return Resolve (host, ipAddresses); } static async Task ResolveAsync (string host, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested (); #if NET6_0_OR_GREATER var ipAddresses = await Dns.GetHostAddressesAsync (host, cancellationToken).ConfigureAwait (false); #else var ipAddresses = await Dns.GetHostAddressesAsync (host).ConfigureAwait (false); #endif return Resolve (host, ipAddresses); } byte[] GetConnectCommand (byte[]? domain, byte[] addr, int port) { // +----+-----+----------+----------+----------+-------+--------------+-------+ // |VER | CMD | DST.PORT | DST.ADDR | USERID | NULL | DST.DOMAIN | NULL | // +----+-----+----------+----------+----------+-------+--------------+-------+ // | 1 | 1 | 2 | 4 | VARIABLE | X'00' | VARIABLE | X'00' | // +----+-----+----------+----------+----------+-------+--------------+-------+ var user = ProxyCredentials != null ? Encoding.UTF8.GetBytes (ProxyCredentials.UserName) : Array.Empty (); int bufferSize = 9 + user.Length + (domain != null ? domain.Length + 1 : 0); var buffer = new byte[bufferSize]; int n = 0; buffer[n++] = (byte) SocksVersion; buffer[n++] = (byte) Socks4Command.Connect; buffer[n++] = (byte) (port >> 8); buffer[n++] = (byte) port; Buffer.BlockCopy (addr, 0, buffer, n, 4); n += 4; Buffer.BlockCopy (user, 0, buffer, n, user.Length); n += user.Length; buffer[n++] = 0x00; if (domain != null) { Buffer.BlockCopy (domain, 0, buffer, n, domain.Length); n += domain.Length; buffer[n++] = 0x00; } return buffer; } /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the proxy server. /// The proxy server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override Stream Connect (string host, int port, CancellationToken cancellationToken = default) { byte[]? domain = null; byte[] addr; ValidateArguments (host, port); if (!IPAddress.TryParse (host, out var ip)) { if (IsSocks4a) { domain = Encoding.UTF8.GetBytes (host); addr = InvalidIPAddress; } else { ip = Resolve (host, cancellationToken); addr = ip.GetAddressBytes (); } } else { if (ip.AddressFamily != AddressFamily.InterNetwork) throw new ArgumentException ("The specified host address must be IPv4.", nameof (host)); addr = ip.GetAddressBytes (); } cancellationToken.ThrowIfCancellationRequested (); var socket = SocketUtils.Connect (ProxyHost, ProxyPort, LocalEndPoint, cancellationToken); try { var buffer = GetConnectCommand (domain, addr, port); Send (socket, buffer, 0, buffer.Length, cancellationToken); // +-----+-----+----------+----------+ // | VER | REP | BND.PORT | BND.ADDR | // +-----+-----+----------+----------+ // | 1 | 1 | 2 | 4 | // +-----+-----+----------+----------+ int nread, n = 0; do { if ((nread = Receive (socket, buffer, 0 + n, 8 - n, cancellationToken)) > 0) n += nread; } while (n < 8); if (buffer[1] != (byte) Socks4Reply.RequestGranted) throw new ProxyProtocolException (string.Format (CultureInfo.InvariantCulture, "Failed to connect to {0}:{1}: {2}", host, port, GetFailureReason (buffer[1]))); // TODO: do we care about BND.ADDR and BND.PORT? return new NetworkStream (socket, true); } catch { if (socket.Connected) socket.Disconnect (false); socket.Dispose (); throw; } } /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the proxy server. /// The proxy server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override async Task ConnectAsync (string host, int port, CancellationToken cancellationToken = default) { byte[]? domain = null; byte[] addr; ValidateArguments (host, port); if (!IPAddress.TryParse (host, out var ip)) { if (IsSocks4a) { domain = Encoding.UTF8.GetBytes (host); addr = InvalidIPAddress; } else { ip = await ResolveAsync (host, cancellationToken).ConfigureAwait (false); addr = ip.GetAddressBytes (); } } else { if (ip.AddressFamily != AddressFamily.InterNetwork) throw new ArgumentException ("The specified host address must be IPv4.", nameof (host)); addr = ip.GetAddressBytes (); } cancellationToken.ThrowIfCancellationRequested (); var socket = await SocketUtils.ConnectAsync (ProxyHost, ProxyPort, LocalEndPoint, cancellationToken).ConfigureAwait (false); try { var buffer = GetConnectCommand (domain, addr, port); await SendAsync (socket, buffer, 0, buffer.Length, cancellationToken).ConfigureAwait (false); // +-----+-----+----------+----------+ // | VER | REP | BND.PORT | BND.ADDR | // +-----+-----+----------+----------+ // | 1 | 1 | 2 | 4 | // +-----+-----+----------+----------+ int nread, n = 0; do { if ((nread = await ReceiveAsync (socket, buffer, 0 + n, 8 - n, cancellationToken).ConfigureAwait (false)) > 0) n += nread; } while (n < 8); if (buffer[1] != (byte) Socks4Reply.RequestGranted) throw new ProxyProtocolException (string.Format (CultureInfo.InvariantCulture, "Failed to connect to {0}:{1}: {2}", host, port, GetFailureReason (buffer[1]))); // TODO: do we care about BND.ADDR and BND.PORT? return new NetworkStream (socket, true); } catch { if (socket.Connected) socket.Disconnect (false); socket.Dispose (); throw; } } } } ================================================ FILE: MailKit/Net/Proxy/Socks4aClient.cs ================================================ // // Socks4aClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Net; namespace MailKit.Net.Proxy { /// /// A SOCKS4a proxy client. /// /// /// A SOCKS4a proxy client. /// /// /// /// public class Socks4aClient : Socks4Client { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// public Socks4aClient (string host, int port) : base (host, port) { IsSocks4a = true; } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The host name of the proxy server. /// The proxy server port. /// The credentials to use to authenticate with the proxy server. /// /// is . /// -or- /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// public Socks4aClient (string host, int port, NetworkCredential credentials) : base (host, port, credentials) { IsSocks4a = true; } } } ================================================ FILE: MailKit/Net/Proxy/Socks5Client.cs ================================================ // // Socks5Client.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Globalization; using System.Threading.Tasks; using MailKit.Security; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit.Net.Proxy { /// /// A SOCKS5 proxy client. /// /// /// A SOCKS5 proxy client. /// /// /// /// public class Socks5Client : SocksClient { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// /// /// /// The host name of the proxy server. /// The proxy server port. /// /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// public Socks5Client (string host, int port) : base (5, host, port) { } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// /// /// /// The host name of the proxy server. /// The proxy server port. /// The credentials to use to authenticate with the proxy server. /// /// is . /// -or- /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// -or- /// The length of is greater than 255 characters. /// public Socks5Client (string host, int port, NetworkCredential credentials) : base (5, host, port, credentials) { } internal enum Socks5AddressType : byte { None = 0x00, IPv4 = 0x01, Domain = 0x03, IPv6 = 0x04 } enum Socks5AuthMethod : byte { Anonymous = 0x00, GSSAPI = 0x01, UserPassword = 0x02, NotSupported = 0xff } enum Socks5Command : byte { Connect = 0x01, Bind = 0x02, UdpAssociate = 0x03, } internal enum Socks5Reply : byte { Success = 0x00, GeneralServerFailure = 0x01, ConnectionNotAllowed = 0x02, NetworkUnreachable = 0x03, HostUnreachable = 0x04, ConnectionRefused = 0x05, TTLExpired = 0x06, CommandNotSupported = 0x07, AddressTypeNotSupported = 0x08 } internal static string GetFailureReason (byte reply) { switch ((Socks5Reply) reply) { case Socks5Reply.GeneralServerFailure: return "General server failure."; case Socks5Reply.ConnectionNotAllowed: return "Connection not allowed."; case Socks5Reply.NetworkUnreachable: return "Network unreachable."; case Socks5Reply.HostUnreachable: return "Host unreachable."; case Socks5Reply.ConnectionRefused: return "Connection refused."; case Socks5Reply.TTLExpired: return "TTL expired."; case Socks5Reply.CommandNotSupported: return "Command not supported."; case Socks5Reply.AddressTypeNotSupported: return "Address type not supported."; default: return string.Format (CultureInfo.InvariantCulture, "Unknown error ({0}).", (int) reply); } } internal static Socks5AddressType GetAddressType (string host, out IPAddress? ip) { if (!IPAddress.TryParse (host, out ip)) return Socks5AddressType.Domain; switch (ip.AddressFamily) { case AddressFamily.InterNetworkV6: return Socks5AddressType.IPv6; case AddressFamily.InterNetwork: return Socks5AddressType.IPv4; default: throw new ArgumentException ("The host address must be an IPv4 or IPv6 address.", nameof (host)); } } void VerifySocksVersion (byte version) { if (version != (byte) SocksVersion) throw new ProxyProtocolException (string.Format (CultureInfo.InvariantCulture, "Proxy server responded with unknown SOCKS version: {0}", (int) version)); } byte[] GetNegotiateAuthMethodCommand (Socks5AuthMethod[] methods) { // +-----+----------+----------+ // | VER | NMETHODS | METHODS | // +-----+----------+----------+ // | 1 | 1 | 1 to 255 | // +-----+----------+----------+ var buffer = new byte[2 + methods.Length]; int n = 0; buffer[n++] = (byte) SocksVersion; buffer[n++] = (byte) methods.Length; for (int i = 0; i < methods.Length; i++) buffer[n++] = (byte) methods[i]; return buffer; } Socks5AuthMethod NegotiateAuthMethod (Socket socket, CancellationToken cancellationToken, params Socks5AuthMethod[] methods) { var buffer = GetNegotiateAuthMethodCommand (methods); Send (socket, buffer, 0, buffer.Length, cancellationToken); // +-----+--------+ // | VER | METHOD | // +-----+--------+ // | 1 | 1 | // +-----+--------+ int nread, n = 0; do { if ((nread = Receive (socket, buffer, 0 + n, 2 - n, cancellationToken)) > 0) n += nread; } while (n < 2); VerifySocksVersion (buffer[0]); return (Socks5AuthMethod) buffer[1]; } async Task NegotiateAuthMethodAsync (Socket socket, CancellationToken cancellationToken, params Socks5AuthMethod[] methods) { var buffer = GetNegotiateAuthMethodCommand (methods); await SendAsync (socket, buffer, 0, buffer.Length, cancellationToken).ConfigureAwait (false); // +-----+--------+ // | VER | METHOD | // +-----+--------+ // | 1 | 1 | // +-----+--------+ int nread, n = 0; do { if ((nread = await ReceiveAsync (socket, buffer, 0 + n, 2 - n, cancellationToken).ConfigureAwait (false)) > 0) n += nread; } while (n < 2); VerifySocksVersion (buffer[0]); return (Socks5AuthMethod) buffer[1]; } byte[] GetAuthenticateCommand () { var user = Encoding.UTF8.GetBytes (ProxyCredentials!.UserName); if (user.Length > 255) throw new AuthenticationException ("User name too long."); var passwd = Encoding.UTF8.GetBytes (ProxyCredentials.Password); if (passwd.Length > 255) { Array.Clear (passwd, 0, passwd.Length); throw new AuthenticationException ("Password too long."); } var buffer = new byte[user.Length + passwd.Length + 3]; int n = 0; buffer[n++] = 1; buffer[n++] = (byte) user.Length; Buffer.BlockCopy (user, 0, buffer, n, user.Length); n += user.Length; buffer[n++] = (byte) passwd.Length; Buffer.BlockCopy (passwd, 0, buffer, n, passwd.Length); Array.Clear (passwd, 0, passwd.Length); return buffer; } void Authenticate (Socket socket, CancellationToken cancellationToken) { var buffer = GetAuthenticateCommand (); Send (socket, buffer, 0, buffer.Length, cancellationToken); int nread, n = 0; do { if ((nread = Receive (socket, buffer, 0 + n, 2 - n, cancellationToken)) > 0) n += nread; } while (n < 2); if (buffer[1] != (byte) Socks5Reply.Success) throw new AuthenticationException ("Failed to authenticate with SOCKS5 proxy server."); } async Task AuthenticateAsync (Socket socket, CancellationToken cancellationToken) { var buffer = GetAuthenticateCommand (); await SendAsync (socket, buffer, 0, buffer.Length, cancellationToken).ConfigureAwait (false); int nread, n = 0; do { if ((nread = await ReceiveAsync (socket, buffer, 0 + n, 2 - n, cancellationToken).ConfigureAwait (false)) > 0) n += nread; } while (n < 2); if (buffer[1] != (byte) Socks5Reply.Success) throw new AuthenticationException ("Failed to authenticate with SOCKS5 proxy server."); } byte[] GetConnectCommand (Socks5AddressType addrType, byte[]? domain, IPAddress? ip, int port, out int n) { // +----+-----+-------+------+----------+----------+ // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ var buffer = new byte[4 + 257 + 2]; byte[] addr; n = 0; buffer[n++] = (byte) SocksVersion; buffer[n++] = (byte) Socks5Command.Connect; buffer[n++] = 0x00; buffer[n++] = (byte) addrType; switch (addrType) { case Socks5AddressType.Domain: buffer[n++] = (byte) domain!.Length; Buffer.BlockCopy (domain, 0, buffer, n, domain.Length); n += domain.Length; break; case Socks5AddressType.IPv6: addr = ip!.GetAddressBytes (); Buffer.BlockCopy (addr, 0, buffer, n, addr.Length); n += 16; break; case Socks5AddressType.IPv4: addr = ip!.GetAddressBytes (); Buffer.BlockCopy (addr, 0, buffer, n, addr.Length); n += 4; break; } buffer[n++] = (byte) (port >> 8); buffer[n++] = (byte) port; return buffer; } int ProcessPartialConnectResponse (string host, int port, byte[] buffer) { VerifySocksVersion (buffer[0]); if (buffer[1] != (byte) Socks5Reply.Success) throw new ProxyProtocolException (string.Format (CultureInfo.InvariantCulture, "Failed to connect to {0}:{1}: {2}", host, port, GetFailureReason (buffer[1]))); // +-----+-----+-------+------+----------+----------+ // | VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | // +-----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +-----+-----+-------+------+----------+----------+ var addrType = (Socks5AddressType) buffer[3]; switch (addrType) { case Socks5AddressType.Domain: return 4 + buffer[4] + 2; case Socks5AddressType.IPv6: return 4 + 16 + 2; case Socks5AddressType.IPv4: return 4 + 4 + 2; default: throw new ProxyProtocolException ("Proxy server returned unknown address type."); } } /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override Stream Connect (string host, int port, CancellationToken cancellationToken = default) { ValidateArguments (host, port); cancellationToken.ThrowIfCancellationRequested (); var socket = SocketUtils.Connect (ProxyHost, ProxyPort, LocalEndPoint, cancellationToken); var addrType = GetAddressType (host, out var ip); byte[]? domain = null; if (addrType == Socks5AddressType.Domain) domain = Encoding.UTF8.GetBytes (host); try { Socks5AuthMethod method; if (ProxyCredentials != null) method = NegotiateAuthMethod (socket, cancellationToken, Socks5AuthMethod.UserPassword, Socks5AuthMethod.Anonymous); else method = NegotiateAuthMethod (socket, cancellationToken, Socks5AuthMethod.Anonymous); switch (method) { case Socks5AuthMethod.UserPassword: Authenticate (socket, cancellationToken); break; case Socks5AuthMethod.Anonymous: break; default: throw new ProxyProtocolException ("Failed to negotiate authentication method with the proxy server."); } var buffer = GetConnectCommand (addrType, domain, ip, port, out int n); Send (socket, buffer, 0, n, cancellationToken); // +-----+-----+-------+------+----------+----------+ // | VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | // +-----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +-----+-----+-------+------+----------+----------+ // Note: We know we'll need at least 4 bytes of header + a minimum of 1 byte // to determine the length of the BND.ADDR field if ATYP is a domain. int nread, need = 5; n = 0; do { if ((nread = Receive (socket, buffer, 0 + n, need - n, cancellationToken)) > 0) n += nread; } while (n < need); need = ProcessPartialConnectResponse (host, port, buffer); do { if ((nread = Receive (socket, buffer, 0 + n, need - n, cancellationToken)) > 0) n += nread; } while (n < need); // TODO: do we care about BND.ADDR and BND.PORT? return new NetworkStream (socket, true); } catch { if (socket.Connected) socket.Disconnect (false); socket.Dispose (); throw; } } /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override async Task ConnectAsync (string host, int port, CancellationToken cancellationToken = default) { ValidateArguments (host, port); cancellationToken.ThrowIfCancellationRequested (); var socket = await SocketUtils.ConnectAsync (ProxyHost, ProxyPort, LocalEndPoint, cancellationToken).ConfigureAwait (false); var addrType = GetAddressType (host, out var ip); byte[]? domain = null; if (addrType == Socks5AddressType.Domain) domain = Encoding.UTF8.GetBytes (host); try { Socks5AuthMethod method; if (ProxyCredentials != null) method = await NegotiateAuthMethodAsync (socket, cancellationToken, Socks5AuthMethod.UserPassword, Socks5AuthMethod.Anonymous).ConfigureAwait (false); else method = await NegotiateAuthMethodAsync (socket, cancellationToken, Socks5AuthMethod.Anonymous).ConfigureAwait (false); switch (method) { case Socks5AuthMethod.UserPassword: await AuthenticateAsync (socket, cancellationToken).ConfigureAwait (false); break; case Socks5AuthMethod.Anonymous: break; default: throw new ProxyProtocolException ("Failed to negotiate authentication method with the proxy server."); } var buffer = GetConnectCommand (addrType, domain, ip, port, out int n); await SendAsync (socket, buffer, 0, n, cancellationToken).ConfigureAwait (false); // +-----+-----+-------+------+----------+----------+ // | VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | // +-----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +-----+-----+-------+------+----------+----------+ // Note: We know we'll need at least 4 bytes of header + a minimum of 1 byte // to determine the length of the BND.ADDR field if ATYP is a domain. int nread, need = 5; n = 0; do { if ((nread = await ReceiveAsync (socket, buffer, 0 + n, need - n, cancellationToken).ConfigureAwait (false)) > 0) n += nread; } while (n < need); need = ProcessPartialConnectResponse (host, port, buffer); do { if ((nread = await ReceiveAsync (socket, buffer, 0 + n, need - n, cancellationToken).ConfigureAwait (false)) > 0) n += nread; } while (n < need); // TODO: do we care about BND.ADDR and BND.PORT? return new NetworkStream (socket, true); } catch { if (socket.Connected) socket.Disconnect (false); socket.Dispose (); throw; } } } } ================================================ FILE: MailKit/Net/Proxy/SocksClient.cs ================================================ // // SocksClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; namespace MailKit.Net.Proxy { /// /// An abstract SOCKS proxy client. /// /// /// An abstract SOCKS proxy client. /// public abstract class SocksClient : ProxyClient { /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The SOCKS protocol version. /// The host name of the proxy server. /// The proxy server port. /// /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// protected SocksClient (int version, string host, int port) : base (host, port) { SocksVersion = version; } /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The SOCKS protocol version. /// The host name of the proxy server. /// The proxy server port. /// The credentials to use to authenticate with the proxy server. /// /// is . /// -or- /// is . /// /// /// is not between 1 and 65535. /// /// /// The is a zero-length string. /// protected SocksClient (int version, string host, int port, NetworkCredential credentials) : base (host, port, credentials) { SocksVersion = version; } /// /// Get the SOCKS protocol version. /// /// /// Gets the SOCKS protocol version. /// /// The SOCKS protocol version. public int SocksVersion { get; private set; } } } ================================================ FILE: MailKit/Net/Proxy/WebProxyClient.cs ================================================ // // WebProxyClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET6_0_OR_GREATER using System; using System.IO; using System.Net; using System.Threading; using System.Threading.Tasks; namespace MailKit.Net.Proxy { /// /// A proxy client that makes use of a . /// /// /// A proxy client that makes use of a . /// internal class WebProxyClient : ProxyClient { readonly IWebProxy proxy; /// /// Initializes a new instance of the class. /// /// /// Initializes a new instance of the class. /// /// The web proxy. /// /// is . /// public WebProxyClient (IWebProxy proxy) : base ("System", 0) { if (proxy is null) throw new ArgumentNullException (nameof (proxy)); this.proxy = proxy; } static Uri GetTargetUri (string host, int port) { string scheme; switch (port) { case 25: case 465: case 587: scheme = "smtp"; break; case 110: case 995: scheme = "pop"; break; case 143: case 993: scheme = "imap"; break; default: scheme = "http"; break; } return new Uri ($"{scheme}://{host}:{port}"); } static NetworkCredential? GetNetworkCredential (ICredentials? credentials, Uri uri) { if (credentials == null) return null; if (credentials is NetworkCredential network) return network; return credentials.GetCredential (uri, "Basic"); } internal static ProxyClient GetProxyClient (Uri proxyUri, ICredentials? credentials) { var credential = GetNetworkCredential (credentials, proxyUri); if (proxyUri.Scheme.Equals ("https", StringComparison.OrdinalIgnoreCase)) { if (credential != null) return new HttpsProxyClient (proxyUri.Host, proxyUri.Port, credential); return new HttpsProxyClient (proxyUri.Host, proxyUri.Port); } if (proxyUri.Scheme.Equals ("http", StringComparison.OrdinalIgnoreCase)) { if (credential != null) return new HttpProxyClient (proxyUri.Host, proxyUri.Port, credential); return new HttpProxyClient (proxyUri.Host, proxyUri.Port); } if (proxyUri.Scheme.Equals ("socks4", StringComparison.OrdinalIgnoreCase)) { if (credential != null) return new Socks4Client (proxyUri.Host, proxyUri.Port, credential); return new Socks4Client (proxyUri.Host, proxyUri.Port); } if (proxyUri.Scheme.Equals ("socks4a", StringComparison.OrdinalIgnoreCase)) { if (credential != null) return new Socks4aClient (proxyUri.Host, proxyUri.Port, credential); return new Socks4aClient (proxyUri.Host, proxyUri.Port); } if (proxyUri.Scheme.Equals ("socks5", StringComparison.OrdinalIgnoreCase)) { if (credential != null) return new Socks5Client (proxyUri.Host, proxyUri.Port, credential); return new Socks5Client (proxyUri.Host, proxyUri.Port); } throw new NotSupportedException ($"The default system proxy does not support {proxyUri.Scheme}."); } /// /// Connect to the target host. /// /// /// Connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override Stream Connect (string host, int port, CancellationToken cancellationToken = default) { ValidateArguments (host, port); var targetUri = GetTargetUri (host, port); var proxyUri = proxy.GetProxy (targetUri); if (proxyUri is null || proxy.IsBypassed (targetUri)) { // Note: if the proxy URI is null, then it means that the proxy should be bypassed. var socket = SocketUtils.Connect (host, port, LocalEndPoint, cancellationToken); return new NetworkStream (socket, true); } var proxyClient = GetProxyClient (proxyUri, proxy.Credentials); return proxyClient.Connect (host, port, cancellationToken); } /// /// Asynchronously connect to the target host. /// /// /// Asynchronously connects to the target host and port through the proxy server. /// /// The connected network stream. /// The host name of the target server. /// The target server port. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The operation was canceled via the cancellation token. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An I/O error occurred. /// public override async Task ConnectAsync (string host, int port, CancellationToken cancellationToken = default) { ValidateArguments (host, port); var targetUri = GetTargetUri (host, port); var proxyUri = proxy.GetProxy (targetUri); if (proxyUri is null) { // Note: if the proxy URI is null, then it means that the proxy should be bypassed. var socket = await SocketUtils.ConnectAsync (host, port, LocalEndPoint, cancellationToken).ConfigureAwait (false); return new NetworkStream (socket, true); } var proxyClient = GetProxyClient (proxyUri, proxy.Credentials); return await proxyClient.ConnectAsync (host, port, cancellationToken); } } } #endif ================================================ FILE: MailKit/Net/SelectMode.cs ================================================ // // SelectMode.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Net { enum SelectMode { SelectRead, SelectWrite, SelectError } } ================================================ FILE: MailKit/Net/Smtp/AsyncSmtpClient.cs ================================================ // // AsyncSmtpClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Diagnostics; using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; using MimeKit; using MimeKit.IO; using MailKit.Security; namespace MailKit.Net.Smtp { public partial class SmtpClient { async Task QueueCommandAsync (SmtpCommand type, string command, CancellationToken cancellationToken) { await Stream!.QueueCommandAsync (command, cancellationToken).ConfigureAwait (false); queued.Add (type); } async Task FlushCommandQueueAsync (MimeMessage message, MailboxAddress sender, IList recipients, CancellationToken cancellationToken) { try { // Note: Queued commands are buffered by the stream await Stream!.FlushAsync (cancellationToken).ConfigureAwait (false); } catch { queued.Clear (); throw; } var responses = new List (queued.Count); Exception? rex = null; // Note: We need to read all responses from the server before we can process // them in case any of them have any errors so that we can RSET the state. try { for (int i = 0; i < queued.Count; i++) { var response = await Stream.ReadResponseAsync (cancellationToken).ConfigureAwait (false); responses.Add (response); } } catch (Exception ex) { // Note: Most likely this exception is due to an unexpected disconnect. // Usually, before an SMTP server disconnects the client, it will send an // error code response that will be more useful to the user than an error // stating that the server has unexpected disconnected. Save this exception // in case the server didn't give us a response with an error code. rex = ex; } return ParseCommandQueueResponses (message, sender, recipients, responses, rex); } async Task SendCommandInternalAsync (string command, CancellationToken cancellationToken) { try { return await Stream!.SendCommandAsync (command, cancellationToken).ConfigureAwait (false); } catch { Disconnect (uri!.Host, uri.Port, GetSecureSocketOptions (uri), false); throw; } } /// /// Asynchronously send a custom command to the SMTP server. /// /// /// Asynchronously sends a custom command to the SMTP server. /// The command string should not include the terminating \r\n sequence. /// /// The command response. /// The command. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// An SMTP protocol exception occurred. /// protected Task SendCommandAsync (string command, CancellationToken cancellationToken = default) { if (command == null) throw new ArgumentNullException (nameof (command)); CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient must be connected before you can send commands."); if (!command.EndsWith ("\r\n", StringComparison.Ordinal)) command += "\r\n"; return SendCommandInternalAsync (command, cancellationToken); } Task SendEhloAsync (bool connecting, string helo, CancellationToken cancellationToken) { var command = CreateEhloCommand (helo); if (connecting) return Stream!.SendCommandAsync (command, cancellationToken); return SendCommandInternalAsync (command, cancellationToken); } async Task EhloAsync (bool connecting, CancellationToken cancellationToken) { var response = await SendEhloAsync (connecting, "EHLO", cancellationToken).ConfigureAwait (false); if (response.StatusCode != SmtpStatusCode.Ok) { // Try sending HELO instead... response = await SendEhloAsync (connecting, "HELO", cancellationToken).ConfigureAwait (false); if (response.StatusCode != SmtpStatusCode.Ok) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); } else { UpdateCapabilities (response); } } /// /// Asynchronously authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// An asynchronous task context. /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The SMTP server does not support authentication. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override async Task AuthenticateAsync (SaslMechanism mechanism, CancellationToken cancellationToken = default) { ValidateArguments (mechanism); cancellationToken.ThrowIfCancellationRequested (); using var operation = StartNetworkOperation (NetworkOperationKind.Authenticate); try { SaslException? saslException = null; SmtpResponse response; string challenge; string command; // send an initial challenge if the mechanism supports it if (mechanism.SupportsInitialResponse) { challenge = await mechanism.ChallengeAsync (null, cancellationToken).ConfigureAwait (false); command = string.Format ("AUTH {0} {1}\r\n", mechanism.MechanismName, challenge); } else { command = string.Format ("AUTH {0}\r\n", mechanism.MechanismName); } detector.IsAuthenticating = true; try { response = await SendCommandInternalAsync (command, cancellationToken).ConfigureAwait (false); if (response.StatusCode == SmtpStatusCode.AuthenticationMechanismTooWeak) throw new AuthenticationException (response.Response); try { while (response.StatusCode == SmtpStatusCode.AuthenticationChallenge) { challenge = await mechanism.ChallengeAsync (response.Response, cancellationToken).ConfigureAwait (false); response = await SendCommandInternalAsync (challenge + "\r\n", cancellationToken).ConfigureAwait (false); } saslException = null; } catch (SaslException ex) { // reset the authentication state response = await SendCommandInternalAsync ("\r\n", cancellationToken).ConfigureAwait (false); saslException = ex; } } finally { detector.IsAuthenticating = false; } if (response.StatusCode == SmtpStatusCode.AuthenticationSuccessful) { if (mechanism.NegotiatedSecurityLayer) await EhloAsync (false, cancellationToken).ConfigureAwait (false); authenticated = true; OnAuthenticated (response.Response); return; } var message = string.Format (CultureInfo.InvariantCulture, "{0}: {1}", (int) response.StatusCode, response.Response); if (saslException != null) throw new AuthenticationException (message, saslException); throw new AuthenticationException (message); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously authenticate using the supplied credentials. /// /// /// Asynchronously authenticates using the supplied credentials. /// If the SMTP server supports authentication, then the SASL mechanisms /// that both the client and server support (not including any OAUTH mechanisms) /// are tried in order of greatest security to weakest security. Once a SASL /// authentication mechanism is found that both client and server support, the /// credentials are used to authenticate. /// If, on the other hand, authentication is not supported by the SMTP /// server, then this method will throw . /// The property can be checked for the /// flag to make sure the /// SMTP server supports authentication before calling this method. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// An asynchronous task context. /// The text encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The SMTP server does not support authentication. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override async Task AuthenticateAsync (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default) { ValidateArguments (encoding, credentials); using var operation = StartNetworkOperation (NetworkOperationKind.Authenticate); try { var saslUri = new Uri ($"smtp://{uri.Host}"); AuthenticationException? authException = null; SaslException? saslException; SmtpResponse response; SaslMechanism? sasl; bool tried = false; string challenge; string command; foreach (var authmech in SaslMechanism.Rank (AuthenticationMechanisms)) { var cred = credentials.GetCredential (uri, authmech); if (cred == null || (sasl = SaslMechanism.Create (authmech, encoding, cred)) == null) continue; sasl.ChannelBindingContext = Stream.Stream as IChannelBindingContext; sasl.Uri = saslUri; tried = true; cancellationToken.ThrowIfCancellationRequested (); // send an initial challenge if the mechanism supports it if (sasl.SupportsInitialResponse) { challenge = await sasl.ChallengeAsync (null, cancellationToken).ConfigureAwait (false); command = string.Format ("AUTH {0} {1}\r\n", authmech, challenge); } else { command = string.Format ("AUTH {0}\r\n", authmech); } detector.IsAuthenticating = true; saslException = null; try { response = await SendCommandInternalAsync (command, cancellationToken).ConfigureAwait (false); if (response.StatusCode == SmtpStatusCode.AuthenticationMechanismTooWeak) continue; try { while (!sasl.IsAuthenticated) { if (response.StatusCode != SmtpStatusCode.AuthenticationChallenge) break; challenge = await sasl.ChallengeAsync (response.Response, cancellationToken).ConfigureAwait (false); response = await SendCommandInternalAsync (challenge + "\r\n", cancellationToken).ConfigureAwait (false); } saslException = null; } catch (SaslException ex) { // reset the authentication state response = await SendCommandInternalAsync ("\r\n", cancellationToken).ConfigureAwait (false); saslException = ex; } } finally { detector.IsAuthenticating = false; } if (response.StatusCode == SmtpStatusCode.AuthenticationSuccessful) { if (sasl.NegotiatedSecurityLayer) await EhloAsync (false, cancellationToken).ConfigureAwait (false); authenticated = true; OnAuthenticated (response.Response); return; } var message = string.Format (CultureInfo.InvariantCulture, "{0}: {1}", (int) response.StatusCode, response.Response); Exception inner; if (saslException != null) inner = new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response, saslException); else inner = new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); authException = new AuthenticationException (message, inner); } if (tried) throw authException ?? new AuthenticationException (); throw new NotSupportedException ("No compatible authentication mechanisms found."); } catch (Exception ex) { operation.SetError (ex); throw; } } async Task SslHandshakeAsync (SslStream ssl, string host, CancellationToken cancellationToken) { #if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER await ssl.AuthenticateAsClientAsync (GetSslClientAuthenticationOptions (host, ValidateRemoteCertificate), cancellationToken).ConfigureAwait (false); #else await ssl.AuthenticateAsClientAsync (host, ClientCertificates, SslProtocols, CheckCertificateRevocation).ConfigureAwait (false); #endif } async Task PostConnectAsync (Stream stream, string host, int port, SecureSocketOptions options, bool starttls, CancellationToken cancellationToken) { clientConnectedTimestamp = Stopwatch.GetTimestamp (); try { ProtocolLogger.LogConnect (uri!); } catch { stream.Dispose (); secure = false; throw; } Stream = new SmtpStream (stream, ProtocolLogger); try { // read the greeting var response = await Stream.ReadResponseAsync (cancellationToken).ConfigureAwait (false); if (response.StatusCode != SmtpStatusCode.ServiceReady) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); // Send EHLO and get a list of supported extensions await EhloAsync (true, cancellationToken).ConfigureAwait (false); if (options == SecureSocketOptions.StartTls && (capabilities & SmtpCapabilities.StartTLS) == 0) throw new NotSupportedException ("The SMTP server does not support the STARTTLS extension."); if (starttls && (capabilities & SmtpCapabilities.StartTLS) != 0) { response = await Stream.SendCommandAsync ("STARTTLS\r\n", cancellationToken).ConfigureAwait (false); if (response.StatusCode != SmtpStatusCode.ServiceReady) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); try { var tls = new SslStream (stream, false, ValidateRemoteCertificate); Stream.Stream = tls; await SslHandshakeAsync (tls, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { throw SslHandshakeException.Create (ref sslValidationInfo, ex, true, "SMTP", host, port, 465, 25, 587); } secure = true; // Send EHLO again and get the new list of supported extensions await EhloAsync (true, cancellationToken).ConfigureAwait (false); } connected = true; } catch (Exception ex) { RecordClientDisconnected (ex); Stream.Dispose (); secure = false; Stream = null; throw; } OnConnected (host, port, options); } /// /// Asynchronously establish a connection to the specified SMTP or SMTP/S server. /// /// /// Establishes a connection to the specified SMTP or SMTP/S server. /// If the has a value of 0, then the /// parameter is used to determine the default port to /// connect to. The default port used with /// is 465. All other values will use a default port of 25. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 465, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// The connection established by any of the /// Connect /// methods may be re-used if an application wishes to send multiple messages /// to the same SMTP server. Since connecting and authenticating can be expensive /// operations, re-using a connection can significantly improve performance when /// sending a large number of messages to the same SMTP server over a short /// period of time. /// /// /// /// /// An asynchronous task context. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the SMTP server does not support the STARTTLS extension. /// /// /// The operation was canceled. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override async Task ConnectAsync (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { ValidateArguments (host, port); capabilities = SmtpCapabilities.None; AuthenticationMechanisms.Clear (); MaxSize = 0; ComputeDefaultValues (host, ref port, ref options, out uri, out var starttls); using var operation = StartNetworkOperation (NetworkOperationKind.Connect); try { var stream = await ConnectNetworkAsync (host, port, cancellationToken).ConfigureAwait (false); stream.WriteTimeout = timeout; stream.ReadTimeout = timeout; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { await SslHandshakeAsync (ssl, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "SMTP", host, port, 465, 25, 587); } secure = true; stream = ssl; } else { secure = false; } await PostConnectAsync (stream, host, port, options, starttls, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously establish a connection to the specified SMTP or SMTP/S server using the provided socket. /// /// /// Establishes a connection to the specified SMTP or SMTP/S server using the provided socket. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 465, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// An asynchronous task context. /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the SMTP server does not support the STARTTLS extension. /// /// /// The operation was canceled. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override Task ConnectAsync (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { ValidateArguments (socket, host, port); return ConnectAsync (new NetworkStream (socket, true), host, port, options, cancellationToken); } /// /// Asynchronously establish a connection to the specified SMTP or SMTP/S server using the provided socket. /// /// /// Establishes a connection to the specified SMTP or SMTP/S server using the provided socket. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 465, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// An asynchronous task context. /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the SMTP server does not support the STARTTLS extension. /// /// /// The operation was canceled. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override async Task ConnectAsync (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { ValidateArguments (stream, host, port); capabilities = SmtpCapabilities.None; AuthenticationMechanisms.Clear (); MaxSize = 0; ComputeDefaultValues (host, ref port, ref options, out uri, out var starttls); using var operation = StartNetworkOperation (NetworkOperationKind.Connect); try { Stream network; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { await SslHandshakeAsync (ssl, host, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "SMTP", host, port, 465, 25, 587); } network = ssl; secure = true; } else { network = stream; secure = false; } if (network.CanTimeout) { network.WriteTimeout = timeout; network.ReadTimeout = timeout; } await PostConnectAsync (network, host, port, options, starttls, cancellationToken).ConfigureAwait (false); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Asynchronously disconnect the service. /// /// /// If is , a QUIT command will be issued in order to disconnect cleanly. /// /// /// /// /// An asynchronous task context. /// If set to , a QUIT command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// public override async Task DisconnectAsync (bool quit, CancellationToken cancellationToken = default) { CheckDisposed (); if (!IsConnected) return; if (quit) { try { await Stream.SendCommandAsync ("QUIT\r\n", cancellationToken).ConfigureAwait (false); } catch (OperationCanceledException) { } catch (SmtpProtocolException) { } catch (SmtpCommandException) { } catch (IOException) { } } Disconnect (uri.Host, uri.Port, GetSecureSocketOptions (uri), true); } /// /// Asynchronously ping the SMTP server to keep the connection alive. /// /// Mail servers, if left idle for too long, will automatically drop the connection. /// An asynchronous task context. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override async Task NoOpAsync (CancellationToken cancellationToken = default) { CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient is not connected."); var response = await SendCommandInternalAsync ("NOOP\r\n", cancellationToken).ConfigureAwait (false); if (response.StatusCode != SmtpStatusCode.Ok) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); } /// /// Asynchronously get the size of the message. /// /// /// Asynchronously calculates the size of the message in bytes. /// This method is called by SendAsync /// methods in the following conditions: /// /// The SMTP server supports the SIZE= parameter in the MAIL FROM command. /// The parameter is non-null. /// The SMTP server supports the CHUNKING extension. /// /// /// The size of the message, in bytes. /// The formatting options. /// The message. /// The cancellation token. protected virtual async Task GetSizeAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) { using (var measure = new MeasuringStream ()) { await message.WriteToAsync (options, measure, cancellationToken).ConfigureAwait (false); return measure.Length; } } async Task MailFromAsync (FormatOptions options, MimeMessage message, MailboxAddress mailbox, SmtpExtensions extensions, long size, bool pipeline, CancellationToken cancellationToken) { var command = CreateMailFromCommand (options, message, mailbox, extensions, size); if (pipeline) { await QueueCommandAsync (SmtpCommand.MailFrom, command, cancellationToken).ConfigureAwait (false); return; } var response = await Stream!.SendCommandAsync (command, cancellationToken).ConfigureAwait (false); ParseMailFromResponse (message, mailbox, response); } async Task RcptToAsync (FormatOptions options, MimeMessage message, MailboxAddress mailbox, bool pipeline, CancellationToken cancellationToken) { var command = CreateRcptToCommand (options, message, mailbox); if (pipeline) { await QueueCommandAsync (SmtpCommand.RcptTo, command, cancellationToken).ConfigureAwait (false); return false; } var response = await Stream!.SendCommandAsync (command, cancellationToken).ConfigureAwait (false); return ParseRcptToResponse (message, mailbox, response); } async Task BdatAsync (FormatOptions options, MimeMessage message, long size, CancellationToken cancellationToken, ITransferProgress? progress) { var command = string.Format (CultureInfo.InvariantCulture, "BDAT {0} LAST\r\n", size); await Stream!.QueueCommandAsync (command, cancellationToken).ConfigureAwait (false); if (progress != null) { var ctx = new SendContext (progress, size); using (var stream = new ProgressStream (Stream, ctx.Update)) { await message.WriteToAsync (options, stream, cancellationToken).ConfigureAwait (false); await stream.FlushAsync (cancellationToken).ConfigureAwait (false); } } else { await message.WriteToAsync (options, Stream, cancellationToken).ConfigureAwait (false); await Stream.FlushAsync (cancellationToken).ConfigureAwait (false); } var response = await Stream.ReadResponseAsync (cancellationToken).ConfigureAwait (false); return ParseBdatResponse (message, response); } async Task MessageDataAsync (FormatOptions options, MimeMessage message, long size, CancellationToken cancellationToken, ITransferProgress? progress) { if (progress != null) { var ctx = new SendContext (progress, size); using (var stream = new ProgressStream (Stream!, ctx.Update)) { using (var filtered = new FilteredStream (stream)) { filtered.Add (new SmtpDataFilter ()); await message.WriteToAsync (options, filtered, cancellationToken).ConfigureAwait (false); await filtered.FlushAsync (cancellationToken).ConfigureAwait (false); } } } else { using (var filtered = new FilteredStream (Stream!)) { filtered.Add (new SmtpDataFilter ()); await message.WriteToAsync (options, filtered, cancellationToken).ConfigureAwait (false); await filtered.FlushAsync (cancellationToken).ConfigureAwait (false); } } await Stream!.WriteAsync (EndData, 0, EndData.Length, cancellationToken).ConfigureAwait (false); await Stream.FlushAsync (cancellationToken).ConfigureAwait (false); var response = await Stream.ReadResponseAsync (cancellationToken).ConfigureAwait (false); return ParseMessageDataResponse (message, response); } async Task ResetAsync (CancellationToken cancellationToken) { SmtpResponse response; try { response = await SendCommandInternalAsync ("RSET\r\n", cancellationToken).ConfigureAwait (false); } catch { // Swallow RSET exceptions so that we do not obscure the exception that caused the need for the RSET command in the first place. return; } if (response.StatusCode != SmtpStatusCode.Ok) Disconnect (uri!.Host, uri.Port, GetSecureSocketOptions (uri), false); } async Task SendAsync (FormatOptions options, MimeMessage message, MailboxAddress sender, IList recipients, CancellationToken cancellationToken, ITransferProgress? progress) { var format = Prepare (options, message, sender, recipients, out var extensions); var pipeline = (capabilities & SmtpCapabilities.Pipelining) != 0; var bdat = UseBdatCommand (extensions); long size; if (bdat || (Capabilities & SmtpCapabilities.Size) != 0 || progress != null) { size = await GetSizeAsync (format, message, cancellationToken).ConfigureAwait (false); } else { size = -1; } using var operation = StartNetworkOperation (NetworkOperationKind.Send); try { // Note: if PIPELINING is supported, MailFrom() and RcptTo() will // queue their commands instead of sending them immediately. await MailFromAsync (format, message, sender, extensions, size, pipeline, cancellationToken).ConfigureAwait (false); int recipientsAccepted = 0; for (int i = 0; i < recipients.Count; i++) { if (await RcptToAsync (format, message, recipients[i], pipeline, cancellationToken).ConfigureAwait (false)) recipientsAccepted++; } if (queued.Count > 0) { // Note: if PIPELINING is supported, this will flush all outstanding // MAIL FROM and RCPT TO commands to the server and then process // all of their responses. var results = await FlushCommandQueueAsync (message, sender, recipients, cancellationToken).ConfigureAwait (false); recipientsAccepted = results.RecipientsAccepted; if (results.FirstException != null) throw results.FirstException; } if (recipientsAccepted == 0) { OnNoRecipientsAccepted (message); throw new SmtpCommandException (SmtpErrorCode.MessageNotAccepted, SmtpStatusCode.TransactionFailed, "No recipients were accepted."); } if (bdat) return await BdatAsync (format, message, size, cancellationToken, progress).ConfigureAwait (false); var dataResponse = await Stream.SendCommandAsync ("DATA\r\n", cancellationToken).ConfigureAwait (false); ParseDataResponse (dataResponse); return await MessageDataAsync (format, message, size, cancellationToken, progress).ConfigureAwait (false); } catch (ServiceNotAuthenticatedException ex) { operation.SetError (ex); // do not disconnect await ResetAsync (cancellationToken).ConfigureAwait (false); throw; } catch (SmtpCommandException ex) { operation.SetError (ex); // do not disconnect await ResetAsync (cancellationToken).ConfigureAwait (false); throw; } catch (Exception ex) { operation.SetError (ex); Disconnect (uri!.Host, uri.Port, GetSecureSocketOptions (uri), false); throw; } } /// /// Asynchronously send the specified message. /// /// /// Sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// /// /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// public override Task SendAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { ValidateArguments (options, message, out var sender, out var recipients); return SendAsync (options, message, sender, recipients, cancellationToken, progress); } /// /// Asynchronously send the specified message using the supplied sender and recipients. /// /// /// Sends the message by uploading it to an SMTP server using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// public override Task SendAsync (FormatOptions options, MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var rcpts = ValidateArguments (options, message, sender, recipients); return SendAsync (options, message, sender, rcpts, cancellationToken, progress); } /// /// Asynchronously expand a mailing address alias. /// /// /// Expands a mailing address alias. /// /// /// /// /// The expanded list of mailbox addresses. /// The mailing address alias. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before expanding an alias. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// public async Task ExpandAsync (string alias, CancellationToken cancellationToken = default) { var response = await SendCommandInternalAsync (CreateExpandCommand (alias), cancellationToken).ConfigureAwait (false); return ParseExpandResponse (response); } /// /// Asynchronously verify the existence of a mailbox address. /// /// /// Verifies the existence a mailbox address with the SMTP server, returning the expanded /// mailbox address if it exists. /// /// /// /// /// The expanded mailbox address. /// The mailbox address. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before verifying the existence of an address. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// public async Task VerifyAsync (string address, CancellationToken cancellationToken = default) { var response = await SendCommandInternalAsync (CreateVerifyCommand (address), cancellationToken).ConfigureAwait (false); return ParseVerifyResponse (response); } } } ================================================ FILE: MailKit/Net/Smtp/ISmtpClient.cs ================================================ // // ISmtpClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Threading; using System.Threading.Tasks; using MimeKit; namespace MailKit.Net.Smtp { /// /// An interface for an SMTP client. /// /// /// Implemented by . /// public interface ISmtpClient : IMailTransport { /// /// Get the capabilities supported by the SMTP server. /// /// /// The capabilities will not be known until a successful connection has been made /// and may change once the client is authenticated. /// /// /// /// /// The capabilities. /// /// Capabilities cannot be enabled, they may only be disabled. /// SmtpCapabilities Capabilities { get; } /// /// Get or set the local domain. /// /// /// The local domain is used in the HELO or EHLO commands sent to /// the SMTP server. If left unset, the local IP address will be /// used instead. /// /// The local domain. string? LocalDomain { get; set; } /// /// Get the maximum message size supported by the server. /// /// /// The maximum message size will not be known until a successful connection has /// been made and may change once the client is authenticated. /// This value is only relevant if the includes /// the flag. /// /// /// /// /// The maximum message size supported by the server. uint MaxSize { get; } /// /// Get or set whether the client should use the REQUIRETLS extension if it is available. /// /// /// Gets or sets whether the client should use the REQUIRETLS extension if it is available. /// The REQUIRETLS extension (as defined in rfc8689) is a way to ensure that every SMTP server /// that a message passes through on its way to the recipient is required to use a TLS connection in /// order to transfer the message to the next SMTP server. /// This feature is only available if contains the /// flag when sending the message. /// /// if the REQUIRETLS extension should be used; otherwise, . bool RequireTLS { get; set; } /// /// Get or set how much of the message to include in any failed delivery status notifications. /// /// /// Gets or sets how much of the message to include in any failed delivery status notifications. /// /// /// /// /// A value indicating how much of the message to include in a failure delivery status notification. DeliveryStatusNotificationType DeliveryStatusNotificationType { get; set; } /// /// Expand a mailing address alias. /// /// /// Expands a mailing address alias. /// /// The expanded list of mailbox addresses. /// The mailing address alias. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before verifying the existence of an address. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// InternetAddressList Expand (string alias, CancellationToken cancellationToken = default); /// /// Asynchronously expand a mailing address alias. /// /// /// Expands a mailing address alias. /// /// The expanded list of mailbox addresses. /// The mailing address alias. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before verifying the existence of an address. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// Task ExpandAsync (string alias, CancellationToken cancellationToken = default); /// /// Verify the existence of a mailbox address. /// /// /// Verifies the existence a mailbox address with the SMTP server, returning the expanded /// mailbox address if it exists. /// /// The expanded mailbox address. /// The mailbox address. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before verifying the existence of an address. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// MailboxAddress Verify (string address, CancellationToken cancellationToken = default); /// /// Asynchronously verify the existence of a mailbox address. /// /// /// Verifies the existence a mailbox address with the SMTP server, returning the expanded /// mailbox address if it exists. /// /// The expanded mailbox address. /// The mailbox address. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before verifying the existence of an address. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// Task VerifyAsync (string address, CancellationToken cancellationToken = default); } } ================================================ FILE: MailKit/Net/Smtp/SmtpAuthenticationSecretDetector.cs ================================================ // // SmtpAuthenticationSecretDetector.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit.Net.Smtp { class SmtpAuthenticationSecretDetector : IAuthenticationSecretDetector { static readonly IList EmptyAuthSecrets = Array.Empty(); enum SmtpAuthCommandState { Auth, AuthMechanism, AuthNewLine, AuthToken, Error } SmtpAuthCommandState state; bool isAuthenticating; int commandIndex; public bool IsAuthenticating { get { return isAuthenticating; } set { state = SmtpAuthCommandState.Auth; isAuthenticating = value; commandIndex = 0; } } bool SkipCommand (string command, byte[] buffer, ref int index, int endIndex) { while (index < endIndex && commandIndex < command.Length) { if (buffer[index] != (byte) command[commandIndex]) { state = SmtpAuthCommandState.Error; break; } commandIndex++; index++; } return commandIndex == command.Length; } public IList DetectSecrets (byte[] buffer, int offset, int count) { if (!IsAuthenticating || state == SmtpAuthCommandState.Error || count == 0) return EmptyAuthSecrets; int endIndex = offset + count; int index = offset; if (state == SmtpAuthCommandState.Auth) { if (SkipCommand ("AUTH ", buffer, ref index, endIndex)) state = SmtpAuthCommandState.AuthMechanism; if (index >= endIndex || state == SmtpAuthCommandState.Error) return EmptyAuthSecrets; } if (state == SmtpAuthCommandState.AuthMechanism) { while (index < endIndex && buffer[index] != (byte) ' ' && buffer[index] != (byte) '\r') index++; if (index < endIndex) { if (buffer[index] == (byte) ' ') { state = SmtpAuthCommandState.AuthToken; } else { state = SmtpAuthCommandState.AuthNewLine; } index++; } if (index >= endIndex) return EmptyAuthSecrets; } if (state == SmtpAuthCommandState.AuthNewLine) { if (buffer[index] == (byte) '\n') { state = SmtpAuthCommandState.AuthToken; index++; } else { state = SmtpAuthCommandState.Error; } if (index >= endIndex || state == SmtpAuthCommandState.Error) return EmptyAuthSecrets; } int startIndex = index; while (index < endIndex && buffer[index] != (byte) '\r') index++; if (index < endIndex) state = SmtpAuthCommandState.AuthNewLine; if (index == startIndex) return EmptyAuthSecrets; var secret = new AuthenticationSecret (startIndex, index - startIndex); if (state == SmtpAuthCommandState.AuthNewLine) { index++; if (index < endIndex) { if (buffer[index] == (byte) '\n') { state = SmtpAuthCommandState.AuthToken; } else { state = SmtpAuthCommandState.Error; } } } return new AuthenticationSecret[] { secret }; } } } ================================================ FILE: MailKit/Net/Smtp/SmtpCapabilities.cs ================================================ // // SmtpCapabilities.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitations the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Net.Smtp { /// /// Capabilities supported by an SMTP server. /// /// /// Capabilities are read as part of the response to the EHLO command that /// is issued during the connection phase of the . /// /// /// /// [Flags] public enum SmtpCapabilities : uint { /// /// The server does not support any additional extensions. /// None = 0, /// /// The server supports the SIZE extension /// and may have a maximum message size limitation (see ). /// Size = 1 << 0, /// /// The server supports the DSN extension, /// allowing clients to specify which (if any) recipients they would like to receive delivery /// notifications for. /// Dsn = 1 << 1, /// /// The server supports the ENHANCEDSTATUSCODES /// extension. /// EnhancedStatusCodes = 1 << 2, /// /// The server supports the AUTH extension, /// allowing clients to authenticate via supported SASL mechanisms. /// Authentication = 1 << 3, /// /// The server supports the 8BITMIME extension, /// allowing clients to send messages using the "8bit" Content-Transfer-Encoding. /// EightBitMime = 1 << 4, /// /// The server supports the PIPELINING extension, /// allowing clients to send multiple commands at once in order to reduce round-trip latency. /// Pipelining = 1 << 5, /// /// The server supports the BINARYMIME extension. /// BinaryMime = 1 << 6, /// /// The server supports the CHUNKING extension, /// allowing clients to upload messages in chunks. /// Chunking = 1 << 7, /// /// The server supports the STARTTLS extension, /// allowing clients to switch to an encrypted SSL/TLS connection after connecting. /// StartTLS = 1 << 8, /// /// The server supports the SMTPUTF8 extension. /// UTF8 = 1 << 9, /// /// The server supports the REQUIRETLS extension. /// RequireTLS = 1 << 10, } } ================================================ FILE: MailKit/Net/Smtp/SmtpClient.cs ================================================ // // SmtpClient.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Linq; using System.Text; using System.Buffers; using System.Threading; using System.Diagnostics; using System.Net.Sockets; using System.Net.Security; using System.Globalization; using System.Collections.Generic; #if NET6_0_OR_GREATER using System.Diagnostics.Metrics; #endif using System.Net.NetworkInformation; using System.Security.Authentication; using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography.X509Certificates; using MimeKit; using MimeKit.IO; using MimeKit.Cryptography; using MailKit.Security; using SslStream = MailKit.Net.SslStream; using AuthenticationException = MailKit.Security.AuthenticationException; namespace MailKit.Net.Smtp { /// /// An SMTP client that can be used to send email messages. /// /// /// The class supports both the "smtp" and "smtps" protocols. The "smtp" /// protocol makes a clear-text connection to the SMTP server and does not use SSL or TLS unless the SMTP /// server supports the STARTTLS extension. The "smtps" /// protocol, however, connects to the SMTP server using an SSL-wrapped connection. /// The connection established by any of the /// Connect methods may be re-used if an /// application wishes to send multiple messages to the same SMTP server. Since connecting and authenticating /// can be expensive operations, re-using a connection can significantly improve performance when sending a /// large number of messages to the same SMTP server over a short period of time. /// /// /// /// public partial class SmtpClient : MailTransport, ISmtpClient { static readonly byte[] EndData = Encoding.ASCII.GetBytes (".\r\n"); static readonly char[] NewLineCharacters = { '\r', '\n' }; internal static string DefaultLocalDomain; const int MaxLineLength = 998; enum SmtpCommand { MailFrom, RcptTo } readonly HashSet authenticationMechanisms = new HashSet (StringComparer.Ordinal); readonly SmtpAuthenticationSecretDetector detector = new SmtpAuthenticationSecretDetector (); readonly List queued = new List (); SslCertificateValidationInfo? sslValidationInfo; #if NET6_0_OR_GREATER readonly ClientMetrics? metrics; #endif long clientConnectedTimestamp; SmtpCapabilities capabilities; int timeout = 2 * 60 * 1000; bool authenticated; bool connected; bool disposed; bool secure; Uri? uri; internal static string? GetSafeHostName (string? hostName) { var idn = new IdnMapping (); if (!string.IsNullOrEmpty (hostName)) { hostName = hostName!.Replace ('_', '-'); try { return idn.GetAscii (hostName); } catch { // This can happen if the hostName contains illegal unicode characters. var ascii = new StringBuilder (); for (int i = 0; i < hostName.Length; i++) { if (hostName[i] <= 0x7F) ascii.Append (hostName[i]); } return ascii.Length > 0 ? ascii.ToString () : null; } } else { return null; } } static SmtpClient () { var hostName = GetSafeHostName (IPGlobalProperties.GetIPGlobalProperties ().HostName); DefaultLocalDomain = hostName ?? "localhost"; } /// /// Initializes a new instance of the class. /// /// /// Before you can send messages with the , you must first call one of /// the Connect methods. /// Depending on whether the SMTP server requires authenticating or not, you may also need to /// authenticate using one of the /// Authenticate methods. /// /// /// /// public SmtpClient () : this (new NullProtocolLogger ()) { } /// /// Initializes a new instance of the class. /// /// /// Before you can send messages with the , you must first call one of /// the Connect methods. /// Depending on whether the SMTP server requires authenticating or not, you may also need to /// authenticate using one of the /// Authenticate methods. /// /// The protocol logger. /// /// is . /// /// /// /// public SmtpClient (IProtocolLogger protocolLogger) : base (protocolLogger) { protocolLogger.AuthenticationSecretDetector = detector; #if NET6_0_OR_GREATER // Use the globally configured SmtpClient metrics. metrics = Telemetry.SmtpClient.Metrics; #endif } #if NET8_0_OR_GREATER /// /// Initializes a new instance of the class. /// /// /// Before you can send messages with the , you must first call one of /// the Connect methods. /// Depending on whether the SMTP server requires authenticating or not, you may also need to /// authenticate using one of the /// Authenticate methods. /// /// The protocol logger. /// The meter factory. /// /// is . /// -or- /// is . /// /// /// /// public SmtpClient (IProtocolLogger protocolLogger, IMeterFactory meterFactory) : base (protocolLogger) { if (meterFactory == null) throw new ArgumentNullException (nameof (meterFactory)); protocolLogger.AuthenticationSecretDetector = detector; var meter = meterFactory.Create (Telemetry.SmtpClient.MeterName, Telemetry.SmtpClient.MeterVersion); metrics = Telemetry.SmtpClient.CreateMetrics (meter); } #endif /// /// Get the underlying SMTP stream. /// /// /// Gets the underlying SMTP stream. /// /// The SMTP stream. SmtpStream? Stream { get; set; } /// /// Gets an object that can be used to synchronize access to the SMTP server. /// /// /// Gets an object that can be used to synchronize access to the SMTP server between multiple threads. /// When using methods from multiple threads, it is important to lock the /// object for thread safety. /// /// The lock object. public override object SyncRoot { get { return this; } } /// /// Get the protocol supported by the message service. /// /// /// Gets the protocol supported by the message service. /// /// The protocol. protected override string Protocol { get { return "smtp"; } } /// /// Get the capabilities supported by the SMTP server. /// /// /// The capabilities will not be known until a successful connection has been made /// and may change once the client is authenticated. /// /// /// /// /// The capabilities. /// /// Capabilities cannot be enabled, they may only be disabled. /// public SmtpCapabilities Capabilities { get { return capabilities; } set { if ((capabilities | value) > capabilities) throw new ArgumentException ("Capabilities cannot be enabled, they may only be disabled.", nameof (value)); capabilities = value; } } /// /// Get or set the local domain. /// /// /// The local domain is used in the HELO or EHLO commands sent to /// the SMTP server. If left unset, the local IP address will be /// used instead. /// /// The local domain. public string? LocalDomain { get; set; } /// /// Get whether or not the BDAT command is preferred over the DATA command. /// /// /// Gets whether or not the BDAT command is preferred over the standard DATA /// command. /// The BDAT command is normally only used when the message being sent contains binary data /// (e.g. one or more MIME parts contains a Content-Transfer-Encoding: binary header). This /// option provides a way to override this behavior, forcing the to send /// messages using the BDAT command instead of the DATA command even when it is not /// necessary to do so. /// /// if the BDAT command is preferred over the DATA command; otherwise, . protected virtual bool PreferSendAsBinaryData { get { return false; } } /// /// Get the maximum message size supported by the server. /// /// /// The maximum message size will not be known until a successful connection has /// been made and may change once the client is authenticated. /// This value is only relevant if the includes /// the flag. /// /// /// /// /// The maximum message size supported by the server. public uint MaxSize { get; private set; } /// /// Get or set whether the client should use the REQUIRETLS extension if it is available. /// /// /// Gets or sets whether the client should use the REQUIRETLS extension if it is available. /// The REQUIRETLS extension (as defined in rfc8689) is a way to ensure that every SMTP server /// that a message passes through on its way to the recipient is required to use a TLS connection in /// order to transfer the message to the next SMTP server. /// This feature is only available if contains the /// flag when sending the message. /// /// if the REQUIRETLS extension should be used; otherwise, . public bool RequireTLS { get; set; } void CheckDisposed () { if (disposed) throw new ObjectDisposedException (nameof (SmtpClient)); } #region IMailService implementation /// /// Get the authentication mechanisms supported by the SMTP server. /// /// /// The authentication mechanisms are queried as part of the connection /// process. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before authenticating. /// /// /// /// /// The authentication mechanisms. public override HashSet AuthenticationMechanisms { get { return authenticationMechanisms; } } /// /// Get or set the timeout for network streaming operations, in milliseconds. /// /// /// Gets or sets the underlying socket stream's /// and values. /// /// The timeout in milliseconds. public override int Timeout { get { return timeout; } set { if (IsConnected && Stream.CanTimeout) { Stream.WriteTimeout = value; Stream.ReadTimeout = value; } timeout = value; } } /// /// Get whether or not the client is currently connected to an SMTP server. /// /// /// The state is set to immediately after /// one of the Connect /// methods succeeds and is not set back to until either the client /// is disconnected via or until an /// is thrown while attempting to read or write to /// the underlying network socket. /// When an is caught, the connection state of the /// should be checked before continuing. /// /// /// /// /// if the client is connected; otherwise, . [MemberNotNullWhen (true, new[] { nameof (Stream), nameof (uri) })] public override bool IsConnected { get { return connected; } } /// /// Get whether or not the connection is secure (typically via SSL or TLS). /// /// /// Gets whether or not the connection is secure (typically via SSL or TLS). /// /// if the connection is secure; otherwise, . [MemberNotNullWhen (true, new[] { nameof (Stream), nameof (uri) })] public override bool IsSecure { get { return IsConnected && secure; } } /// /// Get whether or not the connection is encrypted (typically via SSL or TLS). /// /// /// Gets whether or not the connection is encrypted (typically via SSL or TLS). /// /// if the connection is encrypted; otherwise, . public override bool IsEncrypted { get { return IsSecure && (Stream.Stream is SslStream sslStream) && sslStream.IsEncrypted; } } /// /// Get whether or not the connection is signed (typically via SSL or TLS). /// /// /// Gets whether or not the connection is signed (typically via SSL or TLS). /// /// if the connection is signed; otherwise, . public override bool IsSigned { get { return IsSecure && (Stream.Stream is SslStream sslStream) && sslStream.IsSigned; } } /// /// Get the negotiated SSL or TLS protocol version. /// /// /// Gets the negotiated SSL or TLS protocol version once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS protocol version. public override SslProtocols SslProtocol { get { if (IsSecure && (Stream.Stream is SslStream sslStream)) return sslStream.SslProtocol; return SslProtocols.None; } } /// /// Get the negotiated SSL or TLS cipher algorithm. /// /// /// Gets the negotiated SSL or TLS cipher algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS cipher algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override CipherAlgorithmType? SslCipherAlgorithm { get { if (IsSecure && (Stream.Stream is SslStream sslStream)) return sslStream.CipherAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS cipher algorithm strength. /// /// /// Gets the negotiated SSL or TLS cipher algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS cipher algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslCipherStrength { get { if (IsSecure && (Stream.Stream is SslStream sslStream)) return sslStream.CipherStrength; return null; } } #if NET5_0_OR_GREATER /// /// Get the negotiated SSL or TLS cipher suite. /// /// /// Gets the negotiated SSL or TLS cipher suite once an SSL or TLS connection has been made. /// /// The negotiated SSL or TLS cipher suite. public override TlsCipherSuite? SslCipherSuite { get { if (IsSecure && (Stream.Stream is SslStream sslStream)) return sslStream.NegotiatedCipherSuite; return null; } } #endif /// /// Get the negotiated SSL or TLS hash algorithm. /// /// /// Gets the negotiated SSL or TLS hash algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS hash algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override HashAlgorithmType? SslHashAlgorithm { get { if (IsSecure && (Stream.Stream is SslStream sslStream)) return sslStream.HashAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS hash algorithm strength. /// /// /// Gets the negotiated SSL or TLS hash algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS hash algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslHashStrength { get { if (IsSecure && (Stream.Stream is SslStream sslStream)) return sslStream.HashStrength; return null; } } /// /// Get the negotiated SSL or TLS key exchange algorithm. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS key exchange algorithm. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override ExchangeAlgorithmType? SslKeyExchangeAlgorithm { get { if (IsSecure && (Stream.Stream is SslStream sslStream)) return sslStream.KeyExchangeAlgorithm; return null; } } /// /// Get the negotiated SSL or TLS key exchange algorithm strength. /// /// /// Gets the negotiated SSL or TLS key exchange algorithm strength once an SSL or TLS connection has been made. /// /// /// /// /// The negotiated SSL or TLS key exchange algorithm strength. #if NET10_0_OR_GREATER [Obsolete ("Use SslCipherSuite instead.")] #endif public override int? SslKeyExchangeStrength { get { if (IsSecure && (Stream.Stream is SslStream sslStream)) return sslStream.KeyExchangeStrength; return null; } } /// /// Get whether or not the client is currently authenticated with the SMTP server. /// /// /// Gets whether or not the client is currently authenticated with the SMTP server. /// To authenticate with the SMTP server, use one of the /// Authenticate /// methods. /// /// if the client is authenticated; otherwise, . public override bool IsAuthenticated { get { return authenticated; } } NetworkOperation StartNetworkOperation (NetworkOperationKind kind) { #if NET6_0_OR_GREATER return NetworkOperation.Start (kind, uri!, Telemetry.SmtpClient.ActivitySource, metrics); #else return NetworkOperation.Start (kind, uri!); #endif } bool ValidateRemoteCertificate (object? sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) { var host = uri!.Host; bool valid; sslValidationInfo?.Dispose (); sslValidationInfo = null; if (ServerCertificateValidationCallback != null) { valid = ServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); #if NETFRAMEWORK } else if (ServicePointManager.ServerCertificateValidationCallback != null) { valid = ServicePointManager.ServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); #endif } else { valid = DefaultServerCertificateValidationCallback (host, certificate, chain, sslPolicyErrors); } if (!valid) { // Note: The SslHandshakeException.Create() method will nullify this once it's done using it. sslValidationInfo = new SslCertificateValidationInfo (host, certificate, chain, sslPolicyErrors); } return valid; } /// /// Invoked only when no recipients were accepted by the SMTP server. /// /// /// If is overridden to not throw /// an exception, this method should be overridden to throw an appropriate /// exception instead. /// /// The message being sent. protected virtual void OnNoRecipientsAccepted (MimeMessage message) { } void QueueCommand (SmtpCommand type, string command, CancellationToken cancellationToken) { Stream!.QueueCommand (command, cancellationToken); queued.Add (type); } struct QueueResults { public readonly int RecipientsAccepted; public Exception? FirstException; public QueueResults (int recipientsAccepted, Exception? firstException) { RecipientsAccepted = recipientsAccepted; FirstException = firstException; } } QueueResults ParseCommandQueueResponses (MimeMessage message, MailboxAddress sender, IList recipients, List responses, Exception? readResponseException) { Exception? firstException = null; int recipientsAccepted = 0; int rcpt = 0; try { // process the responses for (int i = 0; i < responses.Count; i++) { switch (queued[i]) { case SmtpCommand.MailFrom: try { ParseMailFromResponse (message, sender, responses[i]); } catch (Exception ex) { firstException ??= ex; } break; case SmtpCommand.RcptTo: try { if (ParseRcptToResponse (message, recipients[rcpt++], responses[i])) recipientsAccepted++; } catch (Exception ex) { firstException ??= ex; } break; } } } finally { queued.Clear (); } return new QueueResults (recipientsAccepted, firstException ?? readResponseException); } QueueResults FlushCommandQueue (MimeMessage message, MailboxAddress sender, IList recipients, CancellationToken cancellationToken) { try { // Note: Queued commands are buffered by the stream Stream!.Flush (cancellationToken); } catch { queued.Clear (); throw; } var responses = new List (queued.Count); Exception? rex = null; // Note: We need to read all responses from the server before we can process // them in case any of them have any errors so that we can RSET the state. try { for (int i = 0; i < queued.Count; i++) { var response = Stream.ReadResponse (cancellationToken); responses.Add (response); } } catch (Exception ex) { // Note: Most likely this exception is due to an unexpected disconnect. // Usually, before an SMTP server disconnects the client, it will send an // error code response that will be more useful to the user than an error // stating that the server has unexpected disconnected. Save this exception // in case the server didn't give us a response with an error code. rex = ex; } return ParseCommandQueueResponses (message, sender, recipients, responses, rex); } SmtpResponse SendCommandInternal (string command, CancellationToken cancellationToken) { try { return Stream!.SendCommand (command, cancellationToken); } catch { Disconnect (uri!.Host, uri.Port, GetSecureSocketOptions (uri), false); throw; } } /// /// Send a custom command to the SMTP server. /// /// /// Sends a custom command to the SMTP server. /// The command string should not include the terminating \r\n sequence. /// /// The command response. /// The command. /// The cancellation token. /// /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// An SMTP protocol exception occurred. /// protected SmtpResponse SendCommand (string command, CancellationToken cancellationToken = default) { if (command == null) throw new ArgumentNullException (nameof (command)); CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient must be connected before you can send commands."); if (!command.EndsWith ("\r\n", StringComparison.Ordinal)) command += "\r\n"; return SendCommandInternal (command, cancellationToken); } static bool ReadNextLine (string text, ref int index, out int lineStartIndex, out int lineEndIndex) { lineStartIndex = 0; lineEndIndex = 0; if (index >= text.Length) return false; lineStartIndex = index; lineEndIndex = index; do { char c = text[index++]; if (c == '\n') break; // Only update lineEndIndex when we see a non-whitespace character. This effectively Trim()'s the end. if (!char.IsWhiteSpace (c)) lineEndIndex = index; } while (index < text.Length); return true; } static bool IsCapability (string capability, string text, int startIndex, int endIndex, bool hasValue = false) { int length = endIndex - startIndex; if (hasValue) { if (length <= capability.Length) return false; } else { if (length != capability.Length) return false; } if (string.Compare (text, startIndex, capability, 0, capability.Length, StringComparison.OrdinalIgnoreCase) != 0) return false; if (hasValue) { int index = startIndex + capability.Length; return length > capability.Length && (text[index] == ' ' || text[index] == '='); } return true; } void AddAuthenticationMechanisms (string mechanisms, int startIndex, int endIndex) { int index = startIndex; do { while (index < endIndex && char.IsWhiteSpace (mechanisms[index])) index++; int mechanismIndex = index; while (index < endIndex && !char.IsWhiteSpace (mechanisms[index])) index++; if (index > mechanismIndex) { var mechanism = mechanisms.Substring (mechanismIndex, index - mechanismIndex); AuthenticationMechanisms.Add (mechanism); } } while (index < endIndex); } void SetMaxSize (string capability, int startIndex, int endIndex) { int index = startIndex; while (index < endIndex && char.IsWhiteSpace (capability[index])) index++; #if NETSTANDARD2_1_OR_GREATER || NET5_0_OR_GREATER var value = capability.AsSpan (index, endIndex - index); #else var value = capability.Substring (index, endIndex - index); #endif if (index < endIndex && uint.TryParse (value, NumberStyles.None, CultureInfo.InvariantCulture, out uint size)) MaxSize = size; } void UpdateCapabilities (SmtpResponse response) { // Clear the extensions except STARTTLS so that this capability stays set after a STARTTLS command. capabilities &= SmtpCapabilities.StartTLS; AuthenticationMechanisms.Clear (); MaxSize = 0; string text = response.Response; int index = 0; while (ReadNextLine (text, ref index, out int lineStartIndex, out int lineEndIndex)) { if (IsCapability ("AUTH", text, lineStartIndex, lineEndIndex, true)) { int startIndex = lineStartIndex + 5; AddAuthenticationMechanisms (text, startIndex, lineEndIndex); capabilities |= SmtpCapabilities.Authentication; } else if (IsCapability ("X-EXPS", text, lineStartIndex, lineEndIndex, true)) { int startIndex = lineStartIndex + 7; AddAuthenticationMechanisms (text, startIndex, lineEndIndex); capabilities |= SmtpCapabilities.Authentication; } else if (IsCapability ("SIZE", text, lineStartIndex, lineEndIndex, true)) { int startIndex = lineStartIndex + 5; SetMaxSize (text, startIndex, lineEndIndex); capabilities |= SmtpCapabilities.Size; } else if (IsCapability ("DSN", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.Dsn; } else if (IsCapability ("BINARYMIME", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.BinaryMime; } else if (IsCapability ("CHUNKING", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.Chunking; } else if (IsCapability ("ENHANCEDSTATUSCODES", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.EnhancedStatusCodes; } else if (IsCapability ("8BITMIME", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.EightBitMime; } else if (IsCapability ("PIPELINING", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.Pipelining; } else if (IsCapability ("STARTTLS", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.StartTLS; } else if (IsCapability ("SMTPUTF8", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.UTF8; } else if (IsCapability ("REQUIRETLS", text, lineStartIndex, lineEndIndex)) { capabilities |= SmtpCapabilities.RequireTLS; } } } string CreateEhloCommand (string helo) { string domain; if (!string.IsNullOrEmpty (LocalDomain)) { if (IPAddress.TryParse (LocalDomain, out var ip)) { if (ip.IsIPv4MappedToIPv6) { try { ip = ip.MapToIPv4 (); } catch (ArgumentOutOfRangeException) { // .NET 4.5.2 bug on Windows 7 SP1 (issue #814) } } if (ip.AddressFamily == AddressFamily.InterNetworkV6) return string.Format ("{0} [IPv6:{1}]\r\n", helo, ip); return string.Format ("{0} [{1}]\r\n", helo, ip); } else { domain = LocalDomain!; } } else { domain = DefaultLocalDomain; } return string.Format ("{0} {1}\r\n", helo, domain); } SmtpResponse SendEhlo (bool connecting, string helo, CancellationToken cancellationToken) { var command = CreateEhloCommand (helo); if (connecting) return Stream!.SendCommand (command, cancellationToken); return SendCommandInternal (command, cancellationToken); } void Ehlo (bool connecting, CancellationToken cancellationToken) { var response = SendEhlo (connecting, "EHLO", cancellationToken); if (response.StatusCode != SmtpStatusCode.Ok) { // Try sending HELO instead... response = SendEhlo (connecting, "HELO", cancellationToken); if (response.StatusCode != SmtpStatusCode.Ok) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); } else { UpdateCapabilities (response); } } void ValidateArguments (SaslMechanism mechanism) { if (mechanism == null) throw new ArgumentNullException (nameof (mechanism)); CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient must be connected before you can authenticate."); if (IsAuthenticated) throw new InvalidOperationException ("The SmtpClient is already authenticated."); if ((capabilities & SmtpCapabilities.Authentication) == 0) throw new NotSupportedException ("The SMTP server does not support authentication."); mechanism.ChannelBindingContext = Stream.Stream as IChannelBindingContext; mechanism.Uri = new Uri ($"smtp://{uri.Host}"); } /// /// Authenticate using the specified SASL mechanism. /// /// /// Authenticates using the specified SASL mechanism. /// For a list of available SASL authentication mechanisms supported by the server, /// check the property after the service has been /// connected. /// /// The SASL mechanism. /// The cancellation token. /// /// is . /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The SMTP server does not support authentication. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override void Authenticate (SaslMechanism mechanism, CancellationToken cancellationToken = default) { ValidateArguments (mechanism); cancellationToken.ThrowIfCancellationRequested (); using var operation = StartNetworkOperation (NetworkOperationKind.Authenticate); try { SaslException? saslException = null; SmtpResponse response; string challenge; string command; // send an initial challenge if the mechanism supports it if (mechanism.SupportsInitialResponse) { challenge = mechanism.Challenge (null, cancellationToken); command = string.Format ("AUTH {0} {1}\r\n", mechanism.MechanismName, challenge); } else { command = string.Format ("AUTH {0}\r\n", mechanism.MechanismName); } detector.IsAuthenticating = true; try { response = SendCommandInternal (command, cancellationToken); if (response.StatusCode == SmtpStatusCode.AuthenticationMechanismTooWeak) throw new AuthenticationException (response.Response); try { while (response.StatusCode == SmtpStatusCode.AuthenticationChallenge) { challenge = mechanism.Challenge (response.Response, cancellationToken); response = SendCommandInternal (challenge + "\r\n", cancellationToken); } saslException = null; } catch (SaslException ex) { // reset the authentication state response = SendCommandInternal ("\r\n", cancellationToken); saslException = ex; } } finally { detector.IsAuthenticating = false; } if (response.StatusCode == SmtpStatusCode.AuthenticationSuccessful) { if (mechanism.NegotiatedSecurityLayer) Ehlo (false, cancellationToken); authenticated = true; OnAuthenticated (response.Response); return; } var message = string.Format (CultureInfo.InvariantCulture, "{0}: {1}", (int) response.StatusCode, response.Response); if (saslException != null) throw new AuthenticationException (message, saslException); throw new AuthenticationException (message); } catch (Exception ex) { operation.SetError (ex); throw; } } [MemberNotNull (nameof (Stream), nameof (uri))] void ValidateArguments (Encoding encoding, ICredentials credentials) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); if (credentials == null) throw new ArgumentNullException (nameof (credentials)); CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient must be connected before you can authenticate."); if (IsAuthenticated) throw new InvalidOperationException ("The SmtpClient is already authenticated."); if ((capabilities & SmtpCapabilities.Authentication) == 0) throw new NotSupportedException ("The SMTP server does not support authentication."); } /// /// Authenticate using the supplied credentials. /// /// /// Authenticates using the supplied credentials. /// If the SMTP server supports authentication, then the SASL mechanisms /// that both the client and server support (not including any OAUTH mechanisms) /// are tried in order of greatest security to weakest security. Once a SASL /// authentication mechanism is found that both client and server support, the /// credentials are used to authenticate. /// If, on the other hand, authentication is not supported by the SMTP /// server, then this method will throw . /// The property can be checked for the /// flag to make sure the /// SMTP server supports authentication before calling this method. /// To prevent the usage of certain authentication mechanisms, /// simply remove them from the hash set /// before calling this method. /// /// The text encoding to use for the user's credentials. /// The user's credentials. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// The is not connected. /// /// /// The is already authenticated. /// /// /// The SMTP server does not support authentication. /// /// /// The operation was canceled via the cancellation token. /// /// /// Authentication using the supplied credentials has failed. /// /// /// A SASL authentication error occurred. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override void Authenticate (Encoding encoding, ICredentials credentials, CancellationToken cancellationToken = default) { ValidateArguments (encoding, credentials); using var operation = StartNetworkOperation (NetworkOperationKind.Authenticate); try { var saslUri = new Uri ($"smtp://{uri.Host}"); AuthenticationException? authException = null; SaslException? saslException; SmtpResponse response; SaslMechanism? sasl; bool tried = false; string challenge; string command; foreach (var authmech in SaslMechanism.Rank (AuthenticationMechanisms)) { var cred = credentials.GetCredential (uri, authmech); if (cred == null || (sasl = SaslMechanism.Create (authmech, encoding, cred)) == null) continue; sasl.ChannelBindingContext = Stream.Stream as IChannelBindingContext; sasl.Uri = saslUri; tried = true; cancellationToken.ThrowIfCancellationRequested (); // send an initial challenge if the mechanism supports it if (sasl.SupportsInitialResponse) { challenge = sasl.Challenge (null, cancellationToken); command = string.Format ("AUTH {0} {1}\r\n", authmech, challenge); } else { command = string.Format ("AUTH {0}\r\n", authmech); } detector.IsAuthenticating = true; saslException = null; try { response = SendCommandInternal (command, cancellationToken); if (response.StatusCode == SmtpStatusCode.AuthenticationMechanismTooWeak) continue; try { while (response.StatusCode == SmtpStatusCode.AuthenticationChallenge) { challenge = sasl.Challenge (response.Response, cancellationToken); response = SendCommandInternal (challenge + "\r\n", cancellationToken); } saslException = null; } catch (SaslException ex) { // reset the authentication state response = SendCommandInternal ("\r\n", cancellationToken); saslException = ex; } } finally { detector.IsAuthenticating = false; } if (response.StatusCode == SmtpStatusCode.AuthenticationSuccessful) { if (sasl.NegotiatedSecurityLayer) Ehlo (false, cancellationToken); authenticated = true; OnAuthenticated (response.Response); return; } var message = string.Format (CultureInfo.InvariantCulture, "{0}: {1}", (int) response.StatusCode, response.Response); Exception inner; if (saslException != null) inner = new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response, saslException); else inner = new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); authException = new AuthenticationException (message, inner); } if (tried) throw authException ?? new AuthenticationException (); throw new NotSupportedException ("No compatible authentication mechanisms found."); } catch (Exception ex) { operation.SetError (ex); throw; } } internal static void ComputeDefaultValues (string host, ref int port, ref SecureSocketOptions options, out Uri uri, out bool starttls) { switch (options) { default: if (port == 0) port = 25; break; case SecureSocketOptions.Auto: switch (port) { case 0: port = 25; goto default; case 465: options = SecureSocketOptions.SslOnConnect; break; default: options = SecureSocketOptions.StartTlsWhenAvailable; break; } break; case SecureSocketOptions.SslOnConnect: if (port == 0) port = 465; break; } if (IPAddress.TryParse (host, out var ip) && ip.AddressFamily == AddressFamily.InterNetworkV6) host = "[" + host + "]"; switch (options) { case SecureSocketOptions.StartTlsWhenAvailable: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "smtp://{0}:{1}/?starttls=when-available", host, port)); starttls = true; break; case SecureSocketOptions.StartTls: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "smtp://{0}:{1}/?starttls=always", host, port)); starttls = true; break; case SecureSocketOptions.SslOnConnect: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "smtps://{0}:{1}", host, port)); starttls = false; break; default: uri = new Uri (string.Format (CultureInfo.InvariantCulture, "smtp://{0}:{1}", host, port)); starttls = false; break; } } void SslHandshake (SslStream ssl, string host, CancellationToken cancellationToken) { #if NET5_0_OR_GREATER ssl.AuthenticateAsClient (GetSslClientAuthenticationOptions (host, ValidateRemoteCertificate)); #else ssl.AuthenticateAsClient (host, ClientCertificates, SslProtocols, CheckCertificateRevocation); #endif } void RecordClientDisconnected (Exception? ex) { #if NET6_0_OR_GREATER metrics?.RecordClientDisconnected (clientConnectedTimestamp, uri!, ex); #endif clientConnectedTimestamp = 0; } void PostConnect (Stream stream, string host, int port, SecureSocketOptions options, bool starttls, CancellationToken cancellationToken) { clientConnectedTimestamp = Stopwatch.GetTimestamp (); try { ProtocolLogger.LogConnect (uri!); } catch { stream.Dispose (); secure = false; throw; } Stream = new SmtpStream (stream, ProtocolLogger); try { // read the greeting var response = Stream.ReadResponse (cancellationToken); if (response.StatusCode != SmtpStatusCode.ServiceReady) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); // Send EHLO and get a list of supported extensions Ehlo (true, cancellationToken); if (options == SecureSocketOptions.StartTls && (capabilities & SmtpCapabilities.StartTLS) == 0) throw new NotSupportedException ("The SMTP server does not support the STARTTLS extension."); if (starttls && (capabilities & SmtpCapabilities.StartTLS) != 0) { response = Stream.SendCommand ("STARTTLS\r\n", cancellationToken); if (response.StatusCode != SmtpStatusCode.ServiceReady) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); try { var tls = new SslStream (stream, false, ValidateRemoteCertificate); Stream.Stream = tls; SslHandshake (tls, host, cancellationToken); } catch (Exception ex) { throw SslHandshakeException.Create (ref sslValidationInfo, ex, true, "SMTP", host, port, 465, 25, 587); } secure = true; // Send EHLO again and get the new list of supported extensions Ehlo (true, cancellationToken); } connected = true; } catch (Exception ex) { RecordClientDisconnected (ex); Stream.Dispose (); secure = false; Stream = null; throw; } OnConnected (host, port, options); } void ValidateArguments (string host, int port) { if (host == null) throw new ArgumentNullException (nameof (host)); if (host.Length == 0) throw new ArgumentException ("The host name cannot be empty.", nameof (host)); if (port < 0 || port > 65535) throw new ArgumentOutOfRangeException (nameof (port)); CheckDisposed (); if (IsConnected) throw new InvalidOperationException ("The SmtpClient is already connected."); } /// /// Establish a connection to the specified SMTP or SMTP/S server. /// /// /// Establishes a connection to the specified SMTP or SMTP/S server. /// If the has a value of 0, then the /// parameter is used to determine the default port to /// connect to. The default port used with /// is 465. All other values will use a default port of 25. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 465, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// The connection established by any of the /// Connect /// methods may be re-used if an application wishes to send multiple messages /// to the same SMTP server. Since connecting and authenticating can be expensive /// operations, re-using a connection can significantly improve performance when /// sending a large number of messages to the same SMTP server over a short /// period of time. /// /// /// /// /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the SMTP server does not support the STARTTLS extension. /// /// /// The operation was canceled. /// /// /// A socket error occurred trying to connect to the remote host. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override void Connect (string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { ValidateArguments (host, port); capabilities = SmtpCapabilities.None; AuthenticationMechanisms.Clear (); MaxSize = 0; ComputeDefaultValues (host, ref port, ref options, out uri, out var starttls); using var operation = StartNetworkOperation (NetworkOperationKind.Connect); try { var stream = ConnectNetwork (host, port, cancellationToken); stream.WriteTimeout = timeout; stream.ReadTimeout = timeout; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { SslHandshake (ssl, host, cancellationToken); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "SMTP", host, port, 465, 25, 587); } secure = true; stream = ssl; } else { secure = false; } PostConnect (stream, host, port, options, starttls, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } void ValidateArguments (Socket socket, string host, int port) { if (socket == null) throw new ArgumentNullException (nameof (socket)); if (!socket.Connected) throw new ArgumentException ("The socket is not connected.", nameof (socket)); ValidateArguments (host, port); } /// /// Establish a connection to the specified SMTP or SMTP/S server using the provided socket. /// /// /// Establishes a connection to the specified SMTP or SMTP/S server using the provided socket. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 465, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// The socket to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// is not connected. /// -or- /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the SMTP server does not support the STARTTLS extension. /// /// /// The operation was canceled. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override void Connect (Socket socket, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { ValidateArguments (socket, host, port); Connect (new NetworkStream (socket, true), host, port, options, cancellationToken); } void ValidateArguments (Stream stream, string host, int port) { if (stream == null) throw new ArgumentNullException (nameof (stream)); ValidateArguments (host, port); } /// /// Establish a connection to the specified SMTP or SMTP/S server using the provided stream. /// /// /// Establishes a connection to the specified SMTP or SMTP/S server using the provided stream. /// If the has a value of /// , then the is used /// to determine the default security options. If the has a value /// of 465, then the default options used will be /// . All other values will use /// . /// Once a connection is established, properties such as /// and will be /// populated. /// With the exception of using the to determine the /// default to use when the value /// is , the and /// parameters are only used for logging purposes. /// /// The stream to use for the connection. /// The host name to connect to. /// The port to connect to. If the specified port is 0, then the default port will be used. /// The secure socket options to when connecting. /// The cancellation token. /// /// is . /// -or- /// is . /// /// /// is not between 0 and 65535. /// /// /// The is a zero-length string. /// /// /// The has been disposed. /// /// /// The is already connected. /// /// /// was set to /// /// and the SMTP server does not support the STARTTLS extension. /// /// /// The operation was canceled. /// /// /// An error occurred during the SSL/TLS negotiations. /// /// /// An I/O error occurred. /// /// /// An SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override void Connect (Stream stream, string host, int port = 0, SecureSocketOptions options = SecureSocketOptions.Auto, CancellationToken cancellationToken = default) { ValidateArguments (stream, host, port); capabilities = SmtpCapabilities.None; AuthenticationMechanisms.Clear (); MaxSize = 0; ComputeDefaultValues (host, ref port, ref options, out uri, out var starttls); using var operation = StartNetworkOperation (NetworkOperationKind.Connect); try { Stream network; if (options == SecureSocketOptions.SslOnConnect) { var ssl = new SslStream (stream, false, ValidateRemoteCertificate); try { SslHandshake (ssl, host, cancellationToken); } catch (Exception ex) { ssl.Dispose (); throw SslHandshakeException.Create (ref sslValidationInfo, ex, false, "SMTP", host, port, 465, 25, 587); } network = ssl; secure = true; } else { network = stream; secure = false; } if (network.CanTimeout) { network.WriteTimeout = timeout; network.ReadTimeout = timeout; } PostConnect (network, host, port, options, starttls, cancellationToken); } catch (Exception ex) { operation.SetError (ex); throw; } } /// /// Disconnect the service. /// /// /// If is , a QUIT command will be issued in order to disconnect cleanly. /// /// /// /// /// If set to , a QUIT command will be issued in order to disconnect cleanly. /// The cancellation token. /// /// The has been disposed. /// public override void Disconnect (bool quit, CancellationToken cancellationToken = default) { CheckDisposed (); if (!IsConnected) return; if (quit) { try { Stream.SendCommand ("QUIT\r\n", cancellationToken); } catch (OperationCanceledException) { } catch (SmtpProtocolException) { } catch (SmtpCommandException) { } catch (IOException) { } } Disconnect (uri.Host, uri.Port, GetSecureSocketOptions (uri), true); } /// /// Ping the SMTP server to keep the connection alive. /// /// Mail servers, if left idle for too long, will automatically drop the connection. /// The cancellation token. /// /// The has been disposed. /// /// /// The is not connected. /// /// /// The operation was canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol error occurred. /// public override void NoOp (CancellationToken cancellationToken = default) { CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient is not connected."); var response = SendCommandInternal ("NOOP\r\n", cancellationToken); if (response.StatusCode != SmtpStatusCode.Ok) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); } void Disconnect (string? host, int port, SecureSocketOptions options, bool requested) { // Note: if the uri is null, then the user manually disconnected already. if (uri != null) RecordClientDisconnected (null); capabilities = SmtpCapabilities.None; authenticated = false; connected = false; secure = false; queued.Clear (); uri = null; if (Stream != null) { Stream.Dispose (); Stream = null; } if (host != null) OnDisconnected (host, port, options, requested); } #endregion #region IMailTransport implementation static MailboxAddress? GetMessageSender (MimeMessage message) { if (message.ResentSender != null) return message.ResentSender; if (message.ResentFrom.Count > 0) return message.ResentFrom.Mailboxes.FirstOrDefault (); if (message.Sender != null) return message.Sender; return message.From.Mailboxes.FirstOrDefault (); } static void AddUnique (List recipients, HashSet unique, IEnumerable mailboxes) { foreach (var mailbox in mailboxes) { if (unique.Add (mailbox.Address)) recipients.Add (mailbox); } } static IList GetMessageRecipients (MimeMessage message) { var unique = new HashSet (StringComparer.OrdinalIgnoreCase); var recipients = new List (); if (message.ResentSender != null || message.ResentFrom.Count > 0) { AddUnique (recipients, unique, message.ResentTo.Mailboxes); AddUnique (recipients, unique, message.ResentCc.Mailboxes); AddUnique (recipients, unique, message.ResentBcc.Mailboxes); } else { AddUnique (recipients, unique, message.To.Mailboxes); AddUnique (recipients, unique, message.Cc.Mailboxes); AddUnique (recipients, unique, message.Bcc.Mailboxes); } return recipients; } /// /// Invoked when the sender is accepted by the SMTP server. /// /// /// The default implementation does nothing. /// /// The message being sent. /// The mailbox used in the MAIL FROM command. /// The response to the MAIL FROM command. protected virtual void OnSenderAccepted (MimeMessage message, MailboxAddress mailbox, SmtpResponse response) { } /// /// Invoked when the sender is not accepted by the SMTP server. /// /// /// The default implementation throws an appropriate . /// /// The message being sent. /// The mailbox used in the MAIL FROM command. /// The response to the MAIL FROM command. protected virtual void OnSenderNotAccepted (MimeMessage message, MailboxAddress mailbox, SmtpResponse response) { throw new SmtpCommandException (SmtpErrorCode.SenderNotAccepted, response.StatusCode, mailbox, response.Response); } /// /// Get the envelope identifier to be used with delivery status notifications. /// /// /// The envelope identifier, if non-empty, is useful in determining which message a delivery /// status notification was issued for. /// The envelope identifier should be unique and may be up to 100 characters in length, but /// must consist only of printable ASCII characters and no white space. /// For more information, see /// rfc3461, section 4.4. /// /// /// /// /// The envelope identifier. /// The message. protected virtual string? GetEnvelopeId (MimeMessage message) { return null; } /// /// Get or set how much of the message to include in any failed delivery status notifications. /// /// /// Gets or sets how much of the message to include in any failed delivery status notifications. /// /// /// /// /// A value indicating how much of the message to include in a failure delivery status notification. public DeliveryStatusNotificationType DeliveryStatusNotificationType { get; set; } static void AppendHexEncoded (StringBuilder builder, string value) { int index = 0; while (index < value.Length) { char c = value[index]; if (c < 33 || c > 126 || c == (byte) '+' || c == (byte) '=') break; index++; } builder.Append (value, 0, index); if (index == value.Length) return; int length = value.Length - index; var buffer = ArrayPool.Shared.Rent (length * 3); try { int n = Encoding.UTF8.GetBytes (value, index, length, buffer, 0); const string HexAlphabet = "0123456789ABCDEF"; for (index = 0; index < n; index++) { byte c = buffer[index]; if (c >= 33 && c <= 126 && c != (byte) '+' && c != (byte) '=') { builder.Append ((char) c); } else { builder.Append ('+'); builder.Append (HexAlphabet[(c >> 4) & 0xF]); builder.Append (HexAlphabet[c & 0xF]); } } } finally { ArrayPool.Shared.Return (buffer); } } [Flags] enum SmtpExtensions { None = 0, EightBitMime = 1 << 0, BinaryMime = 1 << 1, UTF8 = 1 << 2, } string CreateMailFromCommand (FormatOptions options, MimeMessage message, MailboxAddress mailbox, SmtpExtensions extensions, long size) { var idnEncode = (extensions & SmtpExtensions.UTF8) == 0; var builder = new StringBuilder ("MAIL FROM:<"); var addrspec = mailbox.GetAddress (idnEncode); builder.Append (addrspec); builder.Append ('>'); if (!idnEncode) builder.Append (" SMTPUTF8"); if ((Capabilities & SmtpCapabilities.Size) != 0 && size != -1) { builder.Append (" SIZE="); builder.Append (size.ToString (CultureInfo.InvariantCulture)); } if ((extensions & SmtpExtensions.BinaryMime) != 0) builder.Append (" BODY=BINARYMIME"); else if ((extensions & SmtpExtensions.EightBitMime) != 0) builder.Append (" BODY=8BITMIME"); if ((capabilities & SmtpCapabilities.Dsn) != 0) { var envid = GetEnvelopeId (message); if (!string.IsNullOrEmpty (envid)) { builder.Append (" ENVID="); AppendHexEncoded (builder, envid!); } switch (DeliveryStatusNotificationType) { case DeliveryStatusNotificationType.HeadersOnly: builder.Append (" RET=HDRS"); break; case DeliveryStatusNotificationType.Full: builder.Append (" RET=FULL"); break; } } if (RequireTLS && (Capabilities & SmtpCapabilities.RequireTLS) != 0) { // Check to see if the message has a TLS-Required header. If it does, then the only defined value it can have is "No". var index = message.Headers.IndexOf (HeaderId.TLSRequired); if (index == -1) builder.Append (" REQUIRETLS"); } builder.Append ("\r\n"); return builder.ToString (); } void ParseMailFromResponse (MimeMessage message, MailboxAddress mailbox, SmtpResponse response) { if (response.StatusCode >= SmtpStatusCode.Ok && response.StatusCode < (SmtpStatusCode) 260) { OnSenderAccepted (message, mailbox, response); return; } if (response.StatusCode == SmtpStatusCode.AuthenticationRequired) throw new ServiceNotAuthenticatedException (response.Response); OnSenderNotAccepted (message, mailbox, response); } void MailFrom (FormatOptions options, MimeMessage message, MailboxAddress mailbox, SmtpExtensions extensions, long size, bool pipeline, CancellationToken cancellationToken) { var command = CreateMailFromCommand (options, message, mailbox, extensions, size); if (pipeline) { QueueCommand (SmtpCommand.MailFrom, command, cancellationToken); return; } var response = Stream!.SendCommand (command, cancellationToken); ParseMailFromResponse (message, mailbox, response); } /// /// Invoked when a recipient is accepted by the SMTP server. /// /// /// The default implementation does nothing. /// /// The message being sent. /// The mailbox used in the RCPT TO command. /// The response to the RCPT TO command. protected virtual void OnRecipientAccepted (MimeMessage message, MailboxAddress mailbox, SmtpResponse response) { } /// /// Invoked when a recipient is not accepted by the SMTP server. /// /// /// The default implementation throws an appropriate . /// /// The message being sent. /// The mailbox used in the RCPT TO command. /// The response to the RCPT TO command. protected virtual void OnRecipientNotAccepted (MimeMessage message, MailboxAddress mailbox, SmtpResponse response) { throw new SmtpCommandException (SmtpErrorCode.RecipientNotAccepted, response.StatusCode, mailbox, response.Response); } /// /// Get the types of delivery status notification desired for the specified recipient mailbox. /// /// /// Gets the types of delivery status notification desired for the specified recipient mailbox. /// /// /// /// /// The desired delivery status notification type. /// The message being sent. /// The recipient mailbox. protected virtual DeliveryStatusNotification? GetDeliveryStatusNotifications (MimeMessage message, MailboxAddress mailbox) { return null; } /// /// Get the original intended recipient address and address type. /// /// /// Gets the original intended recipient address and address type for the purpose of delivery status notification. /// When initially submitting a message via SMTP, the address returned by this method MUST be identical to the /// address. Likewise, when a mailing list submits a message via SMTP to be distributed to the list subscribers, the address returned by /// this method MUST match the new RCPT TO address of each recipient, not the address specified by the original sender of the message.) /// /// The message being sent. /// The recipient mailbox. /// The original recipient address type. /// The original recipient address. void GetOriginalRecipientAddress (MimeMessage message, MailboxAddress mailbox, out string addrType, out string address) { var idnEncode = (Capabilities & SmtpCapabilities.UTF8) == 0; addrType = "rfc822"; address = mailbox.GetAddress (idnEncode); } static string GetNotifyString (DeliveryStatusNotification notify) { string value = string.Empty; if (notify == DeliveryStatusNotification.Never) return "NEVER"; if ((notify & DeliveryStatusNotification.Success) != 0) value += "SUCCESS,"; if ((notify & DeliveryStatusNotification.Failure) != 0) value += "FAILURE,"; if ((notify & DeliveryStatusNotification.Delay) != 0) value += "DELAY"; return value.TrimEnd (','); } string CreateRcptToCommand (FormatOptions options, MimeMessage message, MailboxAddress mailbox) { var idnEncode = (Capabilities & SmtpCapabilities.UTF8) == 0; var command = new StringBuilder ("RCPT TO:<"); command.Append (mailbox.GetAddress (idnEncode)); command.Append ('>'); if ((capabilities & SmtpCapabilities.Dsn) != 0) { var notify = GetDeliveryStatusNotifications (message, mailbox); if (notify.HasValue) { command.Append (" NOTIFY="); command.Append (GetNotifyString (notify.Value)); GetOriginalRecipientAddress (message, mailbox, out var addrType, out var address); command.Append (" ORCPT="); command.Append (addrType); command.Append (';'); AppendHexEncoded (command, address); } } command.Append ("\r\n"); return command.ToString (); } bool ParseRcptToResponse (MimeMessage message, MailboxAddress mailbox, SmtpResponse response) { if (response.StatusCode < (SmtpStatusCode) 300) { OnRecipientAccepted (message, mailbox, response); return true; } if (response.StatusCode == SmtpStatusCode.AuthenticationRequired) throw new ServiceNotAuthenticatedException (response.Response); OnRecipientNotAccepted (message, mailbox, response); return false; } bool RcptTo (FormatOptions options, MimeMessage message, MailboxAddress mailbox, bool pipeline, CancellationToken cancellationToken) { var command = CreateRcptToCommand (options, message, mailbox); if (pipeline) { QueueCommand (SmtpCommand.RcptTo, command, cancellationToken); return false; } var response = Stream!.SendCommand (command, cancellationToken); return ParseRcptToResponse (message, mailbox, response); } class SendContext { readonly ITransferProgress progress; readonly long size; long nwritten; public SendContext (ITransferProgress progress, long size) { this.progress = progress; this.size = size; } public void Update (int n) { nwritten += n; if (size != -1) progress.Report (nwritten, size); else progress.Report (nwritten); } } string ParseBdatResponse (MimeMessage message, SmtpResponse response) { switch (response.StatusCode) { default: throw new SmtpCommandException (SmtpErrorCode.MessageNotAccepted, response.StatusCode, response.Response); case SmtpStatusCode.AuthenticationRequired: throw new ServiceNotAuthenticatedException (response.Response); case SmtpStatusCode.Ok: OnMessageSent (new MessageSentEventArgs (message, response.Response)); return response.Response; } } string Bdat (FormatOptions options, MimeMessage message, long size, CancellationToken cancellationToken, ITransferProgress? progress) { var command = string.Format (CultureInfo.InvariantCulture, "BDAT {0} LAST\r\n", size); Stream!.QueueCommand (command, cancellationToken); if (progress != null) { var ctx = new SendContext (progress, size); using (var stream = new ProgressStream (Stream, ctx.Update)) { message.WriteTo (options, stream, cancellationToken); stream.Flush (cancellationToken); } } else { message.WriteTo (options, Stream, cancellationToken); Stream.Flush (cancellationToken); } var response = Stream.ReadResponse (cancellationToken); return ParseBdatResponse (message, response); } static void ParseDataResponse (SmtpResponse response) { if (response.StatusCode != SmtpStatusCode.StartMailInput) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); } string ParseMessageDataResponse (MimeMessage message, SmtpResponse response) { switch (response.StatusCode) { default: throw new SmtpCommandException (SmtpErrorCode.MessageNotAccepted, response.StatusCode, response.Response); case SmtpStatusCode.AuthenticationRequired: throw new ServiceNotAuthenticatedException (response.Response); case SmtpStatusCode.Ok: OnMessageSent (new MessageSentEventArgs (message, response.Response)); return response.Response; } } string MessageData (FormatOptions options, MimeMessage message, long size, CancellationToken cancellationToken, ITransferProgress? progress) { if (progress != null) { var ctx = new SendContext (progress, size); using (var stream = new ProgressStream (Stream!, ctx.Update)) { using (var filtered = new FilteredStream (stream)) { filtered.Add (new SmtpDataFilter ()); message.WriteTo (options, filtered, cancellationToken); filtered.Flush (cancellationToken); } } } else { using (var filtered = new FilteredStream (Stream!)) { filtered.Add (new SmtpDataFilter ()); message.WriteTo (options, filtered, cancellationToken); filtered.Flush (cancellationToken); } } Stream!.Write (EndData, 0, EndData.Length, cancellationToken); Stream.Flush (cancellationToken); var response = Stream.ReadResponse (cancellationToken); return ParseMessageDataResponse (message, response); } void Reset (CancellationToken cancellationToken) { SmtpResponse response; try { response = SendCommandInternal ("RSET\r\n", cancellationToken); } catch { // Swallow RSET exceptions so that we do not obscure the exception that caused the need for the RSET command in the first place. return; } if (response.StatusCode != SmtpStatusCode.Ok) Disconnect (uri!.Host, uri.Port, GetSecureSocketOptions (uri), false); } /// /// Prepare the message for transport with the specified constraints. /// /// /// Prepares the message for transport with the specified constraints. /// Typically, this involves calling on /// the message with the provided constraints. /// /// The format options. /// The message. /// The encoding constraint. /// The max line length supported by the server. protected virtual void Prepare (FormatOptions options, MimeMessage message, EncodingConstraint constraint, int maxLineLength) { if (!message.Headers.Contains (HeaderId.DomainKeySignature) && !message.Headers.Contains (HeaderId.DkimSignature) && !message.Headers.Contains (HeaderId.ArcSeal)) { // prepare the message message.Prepare (constraint, maxLineLength); } else { // Note: we do not want to risk reformatting of headers to the international // UTF-8 encoding, so disable it. options.International = false; } } /// /// Get the size of the message. /// /// /// Calculates the size of the message in bytes. /// This method is called by Send /// methods in the following conditions: /// /// The SMTP server supports the SIZE= parameter in the MAIL FROM command. /// The parameter is non-null. /// The SMTP server supports the CHUNKING extension. /// /// /// The size of the message, in bytes. /// The formatting options. /// The message. /// The cancellation token. protected virtual long GetSize (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) { using (var measure = new MeasuringStream ()) { message.WriteTo (options, measure, cancellationToken); return measure.Length; } } [MemberNotNull (nameof (Stream), nameof (uri))] FormatOptions Prepare (FormatOptions options, MimeMessage message, MailboxAddress sender, IList recipients, out SmtpExtensions extensions) { CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient is not connected."); var format = options.Clone (); format.NewLineFormat = NewLineFormat.Dos; format.EnsureNewLine = true; if (format.International && (Capabilities & SmtpCapabilities.UTF8) == 0) format.International = false; if (format.International && (Capabilities & SmtpCapabilities.EightBitMime) == 0) throw new NotSupportedException ("The SMTP server does not support the 8BITMIME extension."); EncodingConstraint constraint; if ((Capabilities & SmtpCapabilities.BinaryMime) != 0) constraint = EncodingConstraint.None; else if ((Capabilities & SmtpCapabilities.EightBitMime) != 0) constraint = EncodingConstraint.EightBit; else constraint = EncodingConstraint.SevenBit; Prepare (format, message, constraint, MaxLineLength); // figure out which SMTP extensions we need to use extensions = SmtpExtensions.None; using (var iter = new MimeIterator (message)) { while (iter.MoveNext ()) { if (iter.Current is MimePart part) { if (part.ContentTransferEncoding == ContentEncoding.EightBit) { if ((capabilities & SmtpCapabilities.EightBitMime) != 0) { extensions |= SmtpExtensions.EightBitMime; if ((capabilities & SmtpCapabilities.BinaryMime) == 0) { // BINARYMIME is not supported, so there's no sense in continuing to scan more MimeParts. break; } } } else if (part.ContentTransferEncoding == ContentEncoding.Binary) { if ((capabilities & SmtpCapabilities.BinaryMime) != 0) { // Once we've decided we require BINARYMIME, no sense continuing to check for 8BITMIME. extensions |= SmtpExtensions.BinaryMime; break; } } } } } if ((Capabilities & SmtpCapabilities.UTF8) != 0 && (format.International || sender.IsInternational || recipients.Any (x => x.IsInternational))) extensions |= SmtpExtensions.UTF8; return format; } [MethodImpl (MethodImplOptions.AggressiveInlining)] bool UseBdatCommand (SmtpExtensions extensions) { return (extensions & SmtpExtensions.BinaryMime) != 0 || (PreferSendAsBinaryData && (Capabilities & (SmtpCapabilities.BinaryMime | SmtpCapabilities.Chunking)) != 0); } string Send (FormatOptions options, MimeMessage message, MailboxAddress sender, IList recipients, CancellationToken cancellationToken, ITransferProgress? progress) { var format = Prepare (options, message, sender, recipients, out var extensions); var pipeline = (capabilities & SmtpCapabilities.Pipelining) != 0; var bdat = UseBdatCommand (extensions); long size; if (bdat || (Capabilities & SmtpCapabilities.Size) != 0 || progress != null) { size = GetSize (format, message, cancellationToken); } else { size = -1; } using var operation = StartNetworkOperation (NetworkOperationKind.Send); try { // Note: if PIPELINING is supported, MailFrom() and RcptTo() will // queue their commands instead of sending them immediately. MailFrom (format, message, sender, extensions, size, pipeline, cancellationToken); int recipientsAccepted = 0; for (int i = 0; i < recipients.Count; i++) { if (RcptTo (format, message, recipients[i], pipeline, cancellationToken)) recipientsAccepted++; } if (queued.Count > 0) { // Note: if PIPELINING is supported, this will flush all outstanding // MAIL FROM and RCPT TO commands to the server and then process // all of their responses. var results = FlushCommandQueue (message, sender, recipients, cancellationToken); recipientsAccepted = results.RecipientsAccepted; if (results.FirstException != null) throw results.FirstException; } if (recipientsAccepted == 0) { OnNoRecipientsAccepted (message); throw new SmtpCommandException (SmtpErrorCode.MessageNotAccepted, SmtpStatusCode.TransactionFailed, "No recipients were accepted."); } if (bdat) return Bdat (format, message, size, cancellationToken, progress); var dataResponse = Stream.SendCommand ("DATA\r\n", cancellationToken); ParseDataResponse (dataResponse); return MessageData (format, message, size, cancellationToken, progress); } catch (ServiceNotAuthenticatedException ex) { operation.SetError (ex); // do not disconnect Reset (cancellationToken); throw; } catch (SmtpCommandException ex) { operation.SetError (ex); // do not disconnect Reset (cancellationToken); throw; } catch (Exception ex) { operation.SetError (ex); Disconnect (uri.Host, uri.Port, GetSecureSocketOptions (uri), false); throw; } } static void ValidateArguments (FormatOptions options, MimeMessage message, out MailboxAddress sender, out IList recipients) { if (options == null) throw new ArgumentNullException (nameof (options)); if (message == null) throw new ArgumentNullException (nameof (message)); var mailbox = GetMessageSender (message); if (mailbox == null) throw new InvalidOperationException ("No sender has been specified."); sender = mailbox; recipients = GetMessageRecipients (message); if (recipients.Count == 0) throw new InvalidOperationException ("No recipients have been specified."); } /// /// Send the specified message. /// /// /// Sends the specified message. /// The sender address is determined by checking the following /// message headers (in order of precedence): Resent-Sender, /// Resent-From, Sender, and From. /// If either the Resent-Sender or Resent-From addresses are present, /// the recipients are collected from the Resent-To, Resent-Cc, and /// Resent-Bcc headers, otherwise the To, Cc, and Bcc headers are used. /// /// /// /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// public override string Send (FormatOptions options, MimeMessage message, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { ValidateArguments (options, message, out var sender, out var recipients); return Send (options, message, sender, recipients, cancellationToken, progress); } static List ValidateArguments (FormatOptions options, MimeMessage message, MailboxAddress sender, IEnumerable recipients) { if (options == null) throw new ArgumentNullException (nameof (options)); if (message == null) throw new ArgumentNullException (nameof (message)); if (sender == null) throw new ArgumentNullException (nameof (sender)); if (recipients == null) throw new ArgumentNullException (nameof (recipients)); var unique = new HashSet (StringComparer.OrdinalIgnoreCase); var rcpts = new List (); AddUnique (rcpts, unique, recipients); if (rcpts.Count == 0) throw new InvalidOperationException ("No recipients have been specified."); return rcpts; } /// /// Send the specified message using the supplied sender and recipients. /// /// /// Sends the message by uploading it to an SMTP server using the supplied sender and recipients. /// /// The final free-form text response from the server. /// The formatting options. /// The message. /// The mailbox address to use for sending the message. /// The mailbox addresses that should receive the message. /// The cancellation token. /// The progress reporting mechanism. /// /// is . /// -or- /// is . /// -or- /// is . /// -or- /// is . /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before sending a message. /// /// /// A sender has not been specified. /// -or- /// No recipients have been specified. /// /// /// Internationalized formatting was requested but is not supported by the server. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// public override string Send (FormatOptions options, MimeMessage message, MailboxAddress sender, IEnumerable recipients, CancellationToken cancellationToken = default, ITransferProgress? progress = null) { var rcpts = ValidateArguments (options, message, sender, recipients); return Send (options, message, sender, rcpts, cancellationToken, progress); } #endregion string CreateExpandCommand (string alias) { if (alias == null) throw new ArgumentNullException (nameof (alias)); if (alias.Length == 0) throw new ArgumentException ("The alias cannot be empty.", nameof (alias)); if (alias.IndexOfAny (NewLineCharacters) != -1) throw new ArgumentException ("The alias cannot contain newline characters.", nameof (alias)); CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient is not connected."); return string.Format ("EXPN {0}\r\n", alias); } static InternetAddressList ParseExpandResponse (SmtpResponse response) { if (response.StatusCode != SmtpStatusCode.Ok) throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); var lines = response.Response.Split ('\n'); var list = new InternetAddressList (); for (int i = 0; i < lines.Length; i++) { if (InternetAddress.TryParse (lines[i], out var address)) list.Add (address); } return list; } /// /// Expand a mailing address alias. /// /// /// Expands a mailing address alias. /// /// /// /// /// The expanded list of mailbox addresses. /// The mailing address alias. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before expanding an alias. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// public InternetAddressList Expand (string alias, CancellationToken cancellationToken = default) { var response = SendCommandInternal (CreateExpandCommand (alias), cancellationToken); return ParseExpandResponse (response); } string CreateVerifyCommand (string address) { if (address == null) throw new ArgumentNullException (nameof (address)); if (address.Length == 0) throw new ArgumentException ("The address cannot be empty.", nameof (address)); if (address.IndexOfAny (NewLineCharacters) != -1) throw new ArgumentException ("The address cannot contain newline characters.", nameof (address)); CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient is not connected."); return string.Format ("VRFY {0}\r\n", address); } static MailboxAddress ParseVerifyResponse (SmtpResponse response) { if (response.StatusCode == SmtpStatusCode.Ok) return MailboxAddress.Parse (response.Response); throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response); } /// /// Verify the existence of a mailbox address. /// /// /// Verifies the existence a mailbox address with the SMTP server, returning the expanded /// mailbox address if it exists. /// /// /// /// /// The expanded mailbox address. /// The mailbox address. /// The cancellation token. /// /// is . /// /// /// is an empty string. /// /// /// The has been disposed. /// /// /// The is not connected. /// /// /// Authentication is required before verifying the existence of an address. /// /// /// The operation has been canceled. /// /// /// An I/O error occurred. /// /// /// The SMTP command failed. /// /// /// An SMTP protocol exception occurred. /// public MailboxAddress Verify (string address, CancellationToken cancellationToken = default) { var response = SendCommandInternal (CreateVerifyCommand (address), cancellationToken); return ParseVerifyResponse (response); } /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected override void Dispose (bool disposing) { if (disposing && !disposed) { disposed = true; Disconnect (null, 0, SecureSocketOptions.None, false); } base.Dispose (disposed); } } } ================================================ FILE: MailKit/Net/Smtp/SmtpCommandException.cs ================================================ // // SmtpCommandException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif using MimeKit; namespace MailKit.Net.Smtp { /// /// An SMTP protocol exception. /// /// /// The exception that is thrown when an SMTP command fails. Unlike a , /// a does not require the to be reconnected. /// /// /// /// #if SERIALIZABLE [Serializable] #endif public class SmtpCommandException : CommandException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected SmtpCommandException (SerializationInfo info, StreamingContext context) : base (info, context) { var value = info.GetString ("Mailbox"); if (!string.IsNullOrEmpty (value) && MailboxAddress.TryParse (value, out var mailbox)) Mailbox = mailbox; ErrorCode = (SmtpErrorCode) info.GetValue ("ErrorCode", typeof (SmtpErrorCode)); StatusCode = (SmtpStatusCode) info.GetValue ("StatusCode", typeof (SmtpStatusCode)); } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error code. /// The status code. /// The rejected mailbox. /// The error message. /// The inner exception. public SmtpCommandException (SmtpErrorCode code, SmtpStatusCode status, MailboxAddress mailbox, string message, Exception innerException) : base (message, innerException) { StatusCode = status; Mailbox = mailbox; ErrorCode = code; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error code. /// The status code. /// The rejected mailbox. /// The error message. public SmtpCommandException (SmtpErrorCode code, SmtpStatusCode status, MailboxAddress mailbox, string message) : base (message) { StatusCode = status; Mailbox = mailbox; ErrorCode = code; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error code. /// The status code.> /// The error message. /// The inner exception. public SmtpCommandException (SmtpErrorCode code, SmtpStatusCode status, string message, Exception innerException) : base (message, innerException) { StatusCode = status; ErrorCode = code; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error code. /// The status code.> /// The error message. public SmtpCommandException (SmtpErrorCode code, SmtpStatusCode status, string message) : base (message) { StatusCode = status; ErrorCode = code; } #if SERIALIZABLE /// /// When overridden in a derived class, sets the /// with information about the exception. /// /// /// Serializes the state of the . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecurityCritical] #if NET8_0_OR_GREATER [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] #endif public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); if (Mailbox != null) info.AddValue ("Mailbox", Mailbox.ToString ()); else info.AddValue ("Mailbox", string.Empty); info.AddValue ("ErrorCode", ErrorCode, typeof (SmtpErrorCode)); info.AddValue ("StatusCode", StatusCode, typeof (SmtpStatusCode)); } #endif /// /// Get the error code which may provide additional information. /// /// /// The error code can be used to programmatically deal with the /// exception without necessarily needing to display the raw /// exception message to the user. /// /// /// /// /// The status code. public SmtpErrorCode ErrorCode { get; private set; } /// /// Get the mailbox that the error occurred on. /// /// /// This property will only be available when the /// value is either or /// and may be used /// to help the user decide how to proceed. /// /// /// /// /// The mailbox. public MailboxAddress? Mailbox { get; private set; } /// /// Get the status code returned by the SMTP server. /// /// /// The raw SMTP status code that resulted in the /// being thrown. /// /// /// /// /// The status code. public SmtpStatusCode StatusCode { get; private set; } } } ================================================ FILE: MailKit/Net/Smtp/SmtpDataFilter.cs ================================================ // // SmtpDataFilter.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MimeKit.IO.Filters; namespace MailKit.Net.Smtp { /// /// An SMTP filter designed to format a message stream for the DATA command. /// /// /// A special stream filter that can encode or decode lines beginning with a '.' as /// needed when sending/receiving a message via the SMTP protocol or when saving a /// message to an IIS message pickup directory. /// /// /// /// /// public class SmtpDataFilter : MimeFilterBase { readonly bool decode; bool bol; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// if the filter should decode the content; otherwise, . /// /// /// /// public SmtpDataFilter (bool decode = false) { this.decode = decode; bol = true; } byte[] Encode (byte[] input, int startIndex, int length, out int outputIndex, out int outputLength, bool flush) { int inputEnd = startIndex + length; bool escape = bol; int ndots = 0; int crlf = 0; for (int i = startIndex; i < inputEnd; i++) { byte c = input[i]; if (c == (byte) '.' && escape) { escape = false; ndots++; } else { escape = c == (byte) '\n'; } } if (flush && !escape) crlf = 2; if (ndots + crlf == 0) { outputIndex = startIndex; outputLength = length; bol = escape; return input; } EnsureOutputSize (length + ndots + crlf, false); int index = 0; for (int i = startIndex; i < inputEnd; i++) { byte c = input[i]; if (c == (byte) '.' && bol) { OutputBuffer[index++] = (byte) '.'; bol = false; } else { bol = c == (byte) '\n'; } OutputBuffer[index++] = c; } if (crlf > 0) { OutputBuffer[index++] = (byte) '\r'; OutputBuffer[index++] = (byte) '\n'; } outputLength = index; outputIndex = 0; return OutputBuffer; } byte[] Decode (byte[] input, int startIndex, int length, out int outputIndex, out int outputLength, bool flush) { int inputEnd = startIndex + length; int index = startIndex; EnsureOutputSize (length, false); outputLength = 0; outputIndex = 0; while (index < inputEnd) { byte c = input[index++]; if (bol && c == (byte) '.') { bol = false; } else { OutputBuffer[outputLength++] = c; bol = c == (byte) '\n'; } } return OutputBuffer; } /// /// Filter the specified input. /// /// /// Filters the specified input buffer starting at the given index, /// spanning across the specified number of bytes. /// /// The filtered output. /// The input buffer. /// The starting index of the input buffer. /// The length of the input buffer, starting at . /// The output index. /// The output length. /// If set to , all internally buffered data should be flushed to the output buffer. protected override byte[] Filter (byte[] input, int startIndex, int length, out int outputIndex, out int outputLength, bool flush) { if (decode) return Decode (input, startIndex, length, out outputIndex, out outputLength, flush); return Encode (input, startIndex, length, out outputIndex, out outputLength, flush); } /// /// Reset the filter. /// /// /// Resets the filter. /// public override void Reset () { base.Reset (); bol = true; } } } ================================================ FILE: MailKit/Net/Smtp/SmtpErrorCode.cs ================================================ // // SmtpErrorCode.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Net.Smtp { /// /// An enumeration of the possible error codes that may be reported by a . /// /// /// An enumeration of the possible error codes that may be reported by a . /// /// /// /// public enum SmtpErrorCode { /// /// The message was not accepted for delivery. This may happen if /// the server runs out of available disk space. /// MessageNotAccepted, /// /// The sender's mailbox address was not accepted. Check the /// property for the /// mailbox used as the sender's mailbox address. /// SenderNotAccepted, /// /// A recipient's mailbox address was not accepted. Check the /// property for the /// particular recipient mailbox that was not accepted. /// RecipientNotAccepted, /// /// An unexpected status code was returned by the server. /// For more details, the /// property may provide some additional hints. /// UnexpectedStatusCode, } } ================================================ FILE: MailKit/Net/Smtp/SmtpProtocolException.cs ================================================ // // SmtpProtocolException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit.Net.Smtp { /// /// An SMTP protocol exception. /// /// /// The exception that is thrown when there is an error communicating with an SMTP server. An /// is typically fatal and requires the /// to be reconnected. /// /// /// /// #if SERIALIZABLE [Serializable] #endif public class SmtpProtocolException : ProtocolException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected SmtpProtocolException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// The inner exception. public SmtpProtocolException (string message, Exception innerException) : base (message, innerException) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public SmtpProtocolException (string message) : base (message) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public SmtpProtocolException () { } } } ================================================ FILE: MailKit/Net/Smtp/SmtpResponse.cs ================================================ // // SmtpResponse.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Net.Smtp { /// /// An SMTP command response. /// /// /// An SMTP command response. /// public class SmtpResponse { /// /// Get the status code. /// /// /// Gets the status code. /// /// The status code. public SmtpStatusCode StatusCode { get; private set; } /// /// Get the response text. /// /// /// Gets the response text. /// /// The response text. public string Response { get; private set; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The status code. /// The response text. public SmtpResponse (SmtpStatusCode code, string response) { StatusCode = code; Response = response; } } } ================================================ FILE: MailKit/Net/Smtp/SmtpStatusCode.cs ================================================ // // SmtpStatusCode.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Net.Smtp { /// /// An enumeration of possible SMTP status codes. /// /// /// An enumeration of possible SMTP status codes. /// public enum SmtpStatusCode { /// /// The "system status" status code. /// SystemStatus = 211, /// /// The "help" status code. /// HelpMessage = 214, /// /// The "service ready" status code. /// ServiceReady = 220, /// /// The "service closing transmission channel" status code. /// ServiceClosingTransmissionChannel = 221, /// /// The "authentication successful" status code. /// AuthenticationSuccessful = 235, /// /// The general purpose "OK" status code. /// Ok = 250, /// /// The "User not local; will forward" status code. /// UserNotLocalWillForward = 251, /// /// The "cannot verify user; will attempt delivery" status code. /// CannotVerifyUserWillAttemptDelivery = 252, /// /// The "authentication challenge" status code. /// AuthenticationChallenge = 334, /// /// The "start mail input" status code. /// StartMailInput = 354, /// /// The "service not available" status code. /// ServiceNotAvailable = 421, /// /// The "password transition needed" status code. /// PasswordTransitionNeeded = 432, /// /// The "mailbox busy" status code. /// MailboxBusy = 450, /// /// The "error in processing" status code. /// ErrorInProcessing = 451, /// /// The "insufficient storage" status code. /// InsufficientStorage = 452, /// /// The "temporary authentication failure" status code. /// TemporaryAuthenticationFailure = 454, /// /// The "command unrecognized" status code. /// CommandUnrecognized = 500, /// /// The "syntax error" status code. /// SyntaxError = 501, /// /// The "command not implemented" status code. /// CommandNotImplemented = 502, /// /// The "bad command sequence" status code. /// BadCommandSequence = 503, /// /// The "command parameter not implemented" status code. /// CommandParameterNotImplemented = 504, /// /// The "authentication required" status code. /// AuthenticationRequired = 530, /// /// The "authentication mechanism too weak" status code. /// AuthenticationMechanismTooWeak = 534, /// /// The "authentication invalid credentials" status code. /// AuthenticationInvalidCredentials = 535, /// /// The "encryption required for authentication mechanism" status code. /// EncryptionRequiredForAuthenticationMechanism = 538, /// /// The "mailbox unavailable" status code. /// MailboxUnavailable = 550, /// /// The "user not local try alternate path" status code. /// UserNotLocalTryAlternatePath = 551, /// /// The "exceeded storage allocation" status code. /// ExceededStorageAllocation = 552, /// /// The "mailbox name not allowed" status code. /// MailboxNameNotAllowed = 553, /// /// The "transaction failed" status code. /// TransactionFailed = 554, /// /// The "mail from/rcpt to parameters not recognized or not implemented" status code. /// MailFromOrRcptToParametersNotRecognizedOrNotImplemented = 555, } } ================================================ FILE: MailKit/Net/Smtp/SmtpStream.cs ================================================ // // SmtpStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Text; using System.Threading; using System.Net.Sockets; using System.Net.Security; using System.Threading.Tasks; using MimeKit.IO; using Buffer = System.Buffer; using NetworkStream = MailKit.Net.NetworkStream; namespace MailKit.Net.Smtp { /// /// A stream for communicating with an SMTP server. /// /// /// A stream capable of reading SMTP server responses. /// class SmtpStream : Stream, ICancellableStream { const int BlockSize = 4096; const int PadSize = 4; // I/O buffering readonly byte[] input = new byte[BlockSize + PadSize]; readonly byte[] output = new byte[BlockSize]; int outputIndex; readonly IProtocolLogger logger; int inputIndex, inputEnd; string? lastResponse; bool disposed; /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The underlying network stream. /// The protocol logger. public SmtpStream (Stream source, IProtocolLogger protocolLogger) { logger = protocolLogger; IsConnected = true; Stream = source; } /// /// Get or sets the underlying network stream. /// /// /// Gets or sets the underlying network stream. /// /// The underlying network stream. public Stream Stream { get; internal set; } /// /// Get whether or not the stream is connected. /// /// /// Gets whether or not the stream is connected. /// /// if the stream is connected; otherwise, . public bool IsConnected { get; private set; } /// /// Get whether the stream supports reading. /// /// /// Gets whether the stream supports reading. /// /// if the stream supports reading; otherwise, . public override bool CanRead { get { return Stream.CanRead; } } /// /// Get whether the stream supports writing. /// /// /// Gets whether the stream supports writing. /// /// if the stream supports writing; otherwise, . public override bool CanWrite { get { return Stream.CanWrite; } } /// /// Get whether the stream supports seeking. /// /// /// Gets whether the stream supports seeking. /// /// if the stream supports seeking; otherwise, . public override bool CanSeek { get { return false; } } /// /// Get whether the stream supports I/O timeouts. /// /// /// Gets whether the stream supports I/O timeouts. /// /// if the stream supports I/O timeouts; otherwise, . public override bool CanTimeout { get { return Stream.CanTimeout; } } /// /// Get or set a value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to read before timing out. /// The read timeout. public override int ReadTimeout { get { return Stream.ReadTimeout; } set { Stream.ReadTimeout = value; } } /// /// Get or set a value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// /// /// Gets or sets a value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// /// A value, in milliseconds, that determines how long the stream will attempt to write before timing out. /// The write timeout. public override int WriteTimeout { get { return Stream.WriteTimeout; } set { Stream.WriteTimeout = value; } } /// /// Get or set the position within the current stream. /// /// /// Gets or sets the position within the current stream. /// /// The current position within the stream. /// The position of the stream. /// /// An I/O error occurred. /// /// /// The stream does not support seeking. /// /// /// The stream has been disposed. /// public override long Position { get { return Stream.Position; } set { throw new NotSupportedException (); } } /// /// Get the length of the stream, in bytes. /// /// /// Gets the length of the stream, in bytes. /// /// A long value representing the length of the stream in bytes. /// The length of the stream. /// /// The stream does not support seeking. /// /// /// The stream has been disposed. /// public override long Length { get { return Stream.Length; } } void AlignReadAheadBuffer (out int offset, out int count) { int left = inputEnd - inputIndex; if (left > 0) { if (inputIndex > 0) { // move all of the remaining input to the beginning of the buffer Buffer.BlockCopy (input, inputIndex, input, 0, left); inputEnd = left; inputIndex = 0; } } else { inputIndex = 0; inputEnd = 0; } count = BlockSize - inputEnd; offset = inputEnd; } int ReadAhead (CancellationToken cancellationToken) { AlignReadAheadBuffer (out int offset, out int count); try { var network = Stream as NetworkStream; cancellationToken.ThrowIfCancellationRequested (); network?.Poll (SelectMode.SelectRead, cancellationToken); int nread = Stream.Read (input, offset, count); if (nread > 0) { logger.LogServer (input, offset, nread); inputEnd += nread; // Optimization hack used by ReadResponse input[inputEnd] = (byte) '\n'; } else if (lastResponse is not null) { throw new SmtpProtocolException ($"The SMTP server has unexpectedly disconnected: {lastResponse}"); } else { throw new SmtpProtocolException ("The SMTP server has unexpectedly disconnected."); } } catch { IsConnected = false; throw; } return inputEnd - inputIndex; } async Task ReadAheadAsync (CancellationToken cancellationToken) { AlignReadAheadBuffer (out int offset, out int count); try { var network = Stream as NetworkStream; cancellationToken.ThrowIfCancellationRequested (); int nread = await Stream.ReadAsync (input, offset, count, cancellationToken).ConfigureAwait (false); if (nread > 0) { logger.LogServer (input, offset, nread); inputEnd += nread; // Optimization hack used by ReadResponse input[inputEnd] = (byte) '\n'; } else if (lastResponse is not null) { throw new SmtpProtocolException ($"The SMTP server has unexpectedly disconnected: {lastResponse}"); } else { throw new SmtpProtocolException ("The SMTP server has unexpectedly disconnected."); } } catch { IsConnected = false; throw; } return inputEnd - inputIndex; } static void ValidateArguments (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0 || count > (buffer.Length - offset)) throw new ArgumentOutOfRangeException (nameof (count)); } void CheckDisposed () { if (disposed) throw new ObjectDisposedException (nameof (SmtpStream)); } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public int Read (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { #if false // Note: this code will never get called as we always use ReadResponse() instead. CheckDisposed (); ValidateArguments (buffer, offset, count); int length = inputEnd - inputIndex; int n; if (length < count && length <= ReadAheadSize) await ReadAheadAsync (cancellationToken).ConfigureAwait (false); length = inputEnd - inputIndex; n = Math.Min (count, length); Buffer.BlockCopy (input, inputIndex, buffer, offset, n); inputIndex += n; return n; #else throw new NotImplementedException (); #endif } /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// An I/O error occurred. /// public override int Read (byte[] buffer, int offset, int count) { return Read (buffer, offset, count, CancellationToken.None); } /// /// Asynchronously reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// /// Reads a sequence of bytes from the stream and advances the position /// within the stream by the number of bytes read. /// /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many /// bytes are not currently available, or zero (0) if the end of the stream has been reached. /// The buffer. /// The buffer offset. /// The number of bytes to read. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override Task ReadAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { #if false // Note: this code will never get called as we always use ReadResponse() instead. CheckDisposed (); ValidateArguments (buffer, offset, count); int length = inputEnd - inputIndex; int n; if (length < count && length <= ReadAheadSize) await ReadAheadAsync (cancellationToken).ConfigureAwait (false); length = inputEnd - inputIndex; n = Math.Min (count, length); Buffer.BlockCopy (input, inputIndex, buffer, offset, n); inputIndex += n; return n; #else throw new NotImplementedException (); #endif } static bool TryParseStatusCode (byte[] text, int startIndex, out int code) { int endIndex = startIndex + 3; code = 0; for (int index = startIndex; index < endIndex; index++) { if (text[index] < (byte) '0' || text[index] > (byte) '9') return false; int digit = text[index] - (byte) '0'; code = (code * 10) + digit; } return true; } static bool IsLegalAfterStatusCode (byte c) { return c == (byte) '-' || c == (byte) ' ' || c == (byte) '\r' || c == (byte) '\n'; } bool ReadResponse (ByteArrayBuilder builder, ref bool newLine, ref bool more, ref int code) { do { int startIndex = inputIndex; if (newLine) { if (inputIndex + 3 < inputEnd) { if (!TryParseStatusCode (input, inputIndex, out int value)) throw new SmtpProtocolException ("Unable to parse status code returned by the server."); inputIndex += 3; if (value < 100 || !IsLegalAfterStatusCode (input[inputIndex])) throw new SmtpProtocolException ("Invalid status code returned by the server."); if (code == 0) { code = value; } else if (value != code) { throw new SmtpProtocolException ("The status codes returned by the server did not match."); } newLine = false; more = input[inputIndex] == (byte) '-'; if (more || input[inputIndex] == (byte) ' ') inputIndex++; startIndex = inputIndex; } else { // Need input. return true; } } // Note: This depends on ReadAhead[Async] setting input[inputEnd] = '\n' while (input[inputIndex] != (byte) '\n') inputIndex++; int endIndex = inputIndex; if (inputIndex > startIndex && input[inputIndex - 1] == (byte) '\r') endIndex--; builder.Append (input, startIndex, endIndex - startIndex); if (inputIndex < inputEnd && input[inputIndex] == (byte) '\n') { if (more) builder.Append ((byte) '\n'); newLine = true; inputIndex++; } } while (more && inputIndex < inputEnd); return inputIndex == inputEnd; } /// /// Read an SMTP server response. /// /// /// Reads a full command response from the SMTP server. /// /// The response. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An SMTP protocol error occurred. /// public SmtpResponse ReadResponse (CancellationToken cancellationToken) { CheckDisposed (); using (var builder = new ByteArrayBuilder (256)) { bool needInput = inputIndex == inputEnd; bool newLine = true; bool more = true; int code = 0; do { if (needInput) ReadAhead (cancellationToken); needInput = ReadResponse (builder, ref newLine, ref more, ref code); } while (more || !newLine); var message = builder.ToString (); lastResponse = message; return new SmtpResponse ((SmtpStatusCode) code, message); } } /// /// Asynchronously read an SMTP server response. /// /// /// Reads a full command response from the SMTP server. /// /// The response. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An SMTP protocol error occurred. /// public async Task ReadResponseAsync (CancellationToken cancellationToken) { CheckDisposed (); using (var builder = new ByteArrayBuilder (256)) { bool needInput = inputIndex == inputEnd; bool newLine = true; bool more = true; int code = 0; do { if (needInput) await ReadAheadAsync (cancellationToken).ConfigureAwait (false); needInput = ReadResponse (builder, ref newLine, ref more, ref code); } while (more || !newLine); var message = builder.ToString (); lastResponse = message; return new SmtpResponse ((SmtpStatusCode) code, message); } } unsafe bool TryQueueCommand (Encoder encoder, string command, ref int index) { fixed (char* cmd = command) { int outputLeft = output.Length - outputIndex; int charCount = command.Length - index; char* chars = cmd + index; var needed = encoder.GetByteCount (chars, charCount, true); if (needed > output.Length) { // If the command we are trying to queue is larger than the output buffer and we // already have some commands queued in the output buffer, then flush the queue // before queuing this command. if (outputIndex > 0) return false; } else if (needed > outputLeft && index == 0) { // If we are trying to queue a new command (index == 0) and we need more space than // what remains in the output buffer, then flush the output buffer before queueing // the new command. Some servers do not handle receiving partial commands well. return false; } fixed (byte* outbuf = output) { byte* outptr = outbuf + outputIndex; encoder.Convert (chars, charCount, outptr, outputLeft, true, out int charsUsed, out int bytesUsed, out bool completed); outputIndex += bytesUsed; index += charsUsed; return completed; } } } /// /// Queue a command to the SMTP server. /// /// /// Queues a command to the SMTP server. /// /// The command. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public void QueueCommand (string command, CancellationToken cancellationToken) { var encoder = Encoding.UTF8.GetEncoder (); int index = 0; while (!TryQueueCommand (encoder, command, ref index)) Flush (cancellationToken); } /// /// Asynchronously queue a command to the SMTP server. /// /// /// Asynchronously queues a command to the SMTP server. /// /// The command. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public async Task QueueCommandAsync (string command, CancellationToken cancellationToken) { var encoder = Encoding.UTF8.GetEncoder (); int index = 0; while (!TryQueueCommand (encoder, command, ref index)) await FlushAsync (cancellationToken).ConfigureAwait (false); } /// /// Send a command to the SMTP server. /// /// /// Sends a command to the SMTP server and reads the response. /// /// The response. /// The command. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An SMTP protocol error occurred. /// public SmtpResponse SendCommand (string command, CancellationToken cancellationToken) { QueueCommand (command, cancellationToken); Flush (cancellationToken); return ReadResponse (cancellationToken); } /// /// Asynchronously send a command to the SMTP server. /// /// /// Asynchronously sends a command to the SMTP server and reads the response. /// /// The response. /// The command. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// /// /// An SMTP protocol error occurred. /// public async Task SendCommandAsync (string command, CancellationToken cancellationToken) { await QueueCommandAsync (command, cancellationToken).ConfigureAwait (false); await FlushAsync (cancellationToken).ConfigureAwait (false); return await ReadResponseAsync (cancellationToken).ConfigureAwait (false); } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public void Write (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); try { var network = NetworkStream.Get (Stream); int index = offset; int left = count; while (left > 0) { int n = Math.Min (BlockSize - outputIndex, left); if (outputIndex > 0 || n < BlockSize) { // append the data to the output buffer Buffer.BlockCopy (buffer, index, output, outputIndex, n); outputIndex += n; index += n; left -= n; } if (outputIndex == BlockSize) { // flush the output buffer network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (output, 0, BlockSize); logger.LogClient (output, 0, BlockSize); outputIndex = 0; } if (outputIndex == 0) { // write blocks of data to the stream without buffering while (left >= BlockSize) { network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (buffer, index, BlockSize); logger.LogClient (buffer, index, BlockSize); index += BlockSize; left -= BlockSize; } } } } catch (Exception ex) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); throw; } } /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Write (byte[] buffer, int offset, int count) { Write (buffer, offset, count, CancellationToken.None); } /// /// Asynchronously writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// /// Writes a sequence of bytes to the stream and advances the current /// position within this stream by the number of bytes written. /// /// A task that represents the asynchronous write operation. /// The buffer to write. /// The offset of the first byte to write. /// The number of bytes to write. /// The cancellation token. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override async Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { CheckDisposed (); ValidateArguments (buffer, offset, count); try { var network = NetworkStream.Get (Stream); int index = offset; int left = count; while (left > 0) { int n = Math.Min (BlockSize - outputIndex, left); if (outputIndex > 0 || n < BlockSize) { // append the data to the output buffer Buffer.BlockCopy (buffer, index, output, outputIndex, n); outputIndex += n; index += n; left -= n; } if (outputIndex == BlockSize) { // flush the output buffer await Stream.WriteAsync (output, 0, BlockSize, cancellationToken).ConfigureAwait (false); logger.LogClient (output, 0, BlockSize); outputIndex = 0; } if (outputIndex == 0) { // write blocks of data to the stream without buffering while (left >= BlockSize) { await Stream.WriteAsync (buffer, index, BlockSize, cancellationToken).ConfigureAwait (false); logger.LogClient (buffer, index, BlockSize); index += BlockSize; left -= BlockSize; } } } } catch (Exception ex) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); throw; } } /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// The cancellation token. /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public void Flush (CancellationToken cancellationToken) { CheckDisposed (); if (outputIndex == 0) return; try { var network = NetworkStream.Get (Stream); network?.Poll (SelectMode.SelectWrite, cancellationToken); Stream.Write (output, 0, outputIndex); Stream.Flush (); logger.LogClient (output, 0, outputIndex); outputIndex = 0; } catch (Exception ex) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); throw; } } /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// An I/O error occurred. /// public override void Flush () { Flush (CancellationToken.None); } /// /// Asynchronously clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// /// Clears all buffers for this stream and causes any buffered data to be written /// to the underlying device. /// /// A task that represents the asynchronous flush operation. /// The cancellation token. /// /// The stream has been disposed. /// /// /// The stream does not support writing. /// /// /// The operation was canceled via the cancellation token. /// /// /// An I/O error occurred. /// public override async Task FlushAsync (CancellationToken cancellationToken) { CheckDisposed (); if (outputIndex == 0) return; try { await Stream.WriteAsync (output, 0, outputIndex, cancellationToken).ConfigureAwait (false); await Stream.FlushAsync (cancellationToken).ConfigureAwait (false); logger.LogClient (output, 0, outputIndex); outputIndex = 0; } catch (Exception ex) { IsConnected = false; if (ex is not OperationCanceledException) cancellationToken.ThrowIfCancellationRequested (); throw; } } /// /// Sets the position within the current stream. /// /// The new position within the stream. /// The offset into the stream relative to the . /// The origin to seek from. /// /// The stream does not support seeking. /// public override long Seek (long offset, SeekOrigin origin) { throw new NotSupportedException (); } /// /// Sets the length of the stream. /// /// The desired length of the stream in bytes. /// /// The stream does not support setting the length. /// public override void SetLength (long value) { throw new NotSupportedException (); } /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected override void Dispose (bool disposing) { if (disposing && !disposed) { IsConnected = false; Stream.Dispose (); } disposed = true; base.Dispose (disposing); } } } ================================================ FILE: MailKit/Net/SocketMetrics.cs ================================================ // // SocketMetrics.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET6_0_OR_GREATER using System; using System.Net; using System.Net.Sockets; using System.Diagnostics; using System.Diagnostics.Metrics; using System.Diagnostics.CodeAnalysis; namespace MailKit.Net { sealed class SocketMetrics { readonly Counter connectCounter; readonly Histogram connectDuration; public SocketMetrics (Meter meter) { connectCounter = meter.CreateCounter ( name: $"{Telemetry.Socket.MeterName}.connect.count", unit: "{attempt}", description: "The number of times a socket attempted to connect to a remote host."); connectDuration = meter.CreateHistogram ( name: $"{Telemetry.Socket.MeterName}.connect.duration", unit: "ms", description: "The number of milliseconds taken for a socket to connect to a remote host."); } static SocketException? GetSocketException (Exception exception) { Exception? ex = exception; do { if (ex is SocketException se) return se; ex = ex.InnerException; } while (ex is not null); return null; } internal static bool TryGetErrorType (Exception exception, bool exceptionTypeFallback, [NotNullWhen (true)] out string? errorType) { if (exception is OperationCanceledException) { errorType = "cancelled"; return true; } var socketException = GetSocketException (exception); if (socketException is not null) { switch (socketException.SocketErrorCode) { case SocketError.HostNotFound: errorType = "host_not_found"; return true; case SocketError.HostUnreachable: errorType = "host_unreachable"; return true; case SocketError.NetworkUnreachable: errorType = "network_unreachable"; return true; case SocketError.ConnectionAborted: errorType = "connection_aborted"; return true; case SocketError.ConnectionRefused: errorType = "connection_refused"; return true; case SocketError.ConnectionReset: errorType = "connection_reset"; return true; case SocketError.TimedOut: errorType = "timed_out"; return true; case SocketError.TooManyOpenSockets: errorType = "too_many_open_sockets"; return true; } } if (exceptionTypeFallback) errorType = exception.GetType ().FullName; else errorType = null; return errorType != null; } static TagList GetTags (IPAddress ip, string host, int port, Exception? ex = null) { var tags = new TagList { { "network.peer.address", ip.ToString () }, { "server.address", host }, { "server.port", port }, }; if (ex is not null && TryGetErrorType (ex, true, out var errorType)) tags.Add ("error.type", errorType); return tags; } public void RecordConnected (long connectStartedTimestamp, IPAddress ip, string host, int port) { if (connectCounter.Enabled || connectDuration.Enabled) { var tags = GetTags (ip, host, port); if (connectDuration.Enabled) { var duration = TimeSpan.FromTicks (Stopwatch.GetTimestamp () - connectStartedTimestamp).TotalMilliseconds; connectDuration.Record (duration, tags); } if (connectCounter.Enabled) connectCounter.Add (1, tags); } } public void RecordConnectFailed (long connectStartedTimestamp, IPAddress ip, string host, int port, bool cancelled, Exception? ex = null) { if (connectCounter.Enabled || connectDuration.Enabled) { var tags = GetTags (ip, host, port, ex); if (connectDuration.Enabled) { var duration = TimeSpan.FromTicks (Stopwatch.GetTimestamp () - connectStartedTimestamp).TotalMilliseconds; connectDuration.Record (duration, tags); } if (connectCounter.Enabled) connectCounter.Add (1, tags); } } } } #endif // NET6_0_OR_GREATER ================================================ FILE: MailKit/Net/SocketUtils.cs ================================================ // // SocketUtils.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net; using System.Threading; using System.Net.Sockets; using System.Diagnostics; using System.Threading.Tasks; namespace MailKit.Net { static class SocketUtils { class SocketConnectState { readonly TaskCompletionSource tcs = new TaskCompletionSource (); #if NET6_0_OR_GREATER readonly long connectStartTicks = Stopwatch.GetTimestamp (); #endif readonly Socket socket; readonly IPAddress ip; readonly string host; readonly int port; public SocketConnectState (Socket socket, IPAddress ip, string host, int port) { this.socket = socket; this.ip = ip; this.host = host; this.port = port; } public Task Task { get { return tcs.Task; } } public void OnCanceled () { tcs.TrySetCanceled (); } public void OnEndConnect (IAsyncResult ar) { try { socket.EndConnect (ar); } catch (Exception ex) { // The connection failed. Try setting an exception in case the connection hasn't also been cancelled. #if NET6_0_OR_GREATER bool cancelled = !tcs.TrySetException (ex); Telemetry.Socket.Metrics?.RecordConnectFailed (connectStartTicks, ip, host, port, cancelled, ex); #else tcs.TrySetException (ex); #endif socket.Dispose (); return; } // The connection was successful. if (tcs.TrySetResult (true)) { #if NET6_0_OR_GREATER Telemetry.Socket.Metrics?.RecordConnected (connectStartTicks, ip, host, port); #endif return; } // Note: If we get this far, then it means that the connection has been cancelled. #if NET6_0_OR_GREATER Telemetry.Socket.Metrics?.RecordConnectFailed (connectStartTicks, ip, host, port, true); #endif try { socket.Disconnect (false); socket.Dispose (); } catch { return; } } } static void OnEndConnect (IAsyncResult ar) { var state = (SocketConnectState) ar.AsyncState!; state.OnEndConnect (ar); } public static Socket Connect (string host, int port, IPEndPoint? localEndPoint, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested (); var ipAddresses = Dns.GetHostAddresses (host); for (int i = 0; i < ipAddresses.Length; i++) { cancellationToken.ThrowIfCancellationRequested (); var socket = new Socket (ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { if (localEndPoint != null) socket.Bind (localEndPoint); } catch { socket.Dispose (); if (i + 1 == ipAddresses.Length) throw; continue; } #if NET6_0_OR_GREATER long connectStartTicks = Stopwatch.GetTimestamp (); #endif try { if (cancellationToken.CanBeCanceled) { var state = new SocketConnectState (socket, ipAddresses[i], host, port); using (var registration = cancellationToken.Register (state.OnCanceled, false)) { var ar = socket.BeginConnect (ipAddresses[i], port, OnEndConnect, state); state.Task.GetAwaiter ().GetResult (); } } else { socket.Connect (ipAddresses[i], port); #if NET6_0_OR_GREATER Telemetry.Socket.Metrics?.RecordConnected (connectStartTicks, ipAddresses[i], host, port); #endif } return socket; } catch (OperationCanceledException) { throw; } catch (Exception ex) { if (!cancellationToken.CanBeCanceled) { #if NET6_0_OR_GREATER Telemetry.Socket.Metrics?.RecordConnectFailed (connectStartTicks, ipAddresses[i], host, port, false, ex); #endif socket.Dispose (); } if (i + 1 == ipAddresses.Length) throw; } } throw new IOException (string.Format ("Failed to resolve host: {0}", host)); } public static async Task ConnectAsync (string host, int port, IPEndPoint? localEndPoint, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested (); #if NET6_0_OR_GREATER var ipAddresses = await Dns.GetHostAddressesAsync (host, cancellationToken).ConfigureAwait (false); #else var ipAddresses = await Dns.GetHostAddressesAsync (host).ConfigureAwait (false); #endif for (int i = 0; i < ipAddresses.Length; i++) { cancellationToken.ThrowIfCancellationRequested (); var socket = new Socket (ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { if (localEndPoint != null) socket.Bind (localEndPoint); } catch { socket.Dispose (); if (i + 1 == ipAddresses.Length) throw; continue; } try { var state = new SocketConnectState (socket, ipAddresses[i], host, port); using (var registration = cancellationToken.Register (state.OnCanceled, false)) { var ar = socket.BeginConnect (ipAddresses[i], port, OnEndConnect, state); await state.Task.ConfigureAwait (false); } return socket; } catch (OperationCanceledException) { throw; } catch { if (i + 1 == ipAddresses.Length) throw; } } throw new IOException (string.Format ("Failed to resolve host: {0}", host)); } public static Socket Connect (string host, int port, IPEndPoint? localEndPoint, int timeout, CancellationToken cancellationToken) { using (var ts = new CancellationTokenSource (timeout)) { using (var linked = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken, ts.Token)) { try { return Connect (host, port, localEndPoint, linked.Token); } catch (OperationCanceledException) { if (!cancellationToken.IsCancellationRequested) throw new TimeoutException (); throw; } } } } public static async Task ConnectAsync (string host, int port, IPEndPoint? localEndPoint, int timeout, CancellationToken cancellationToken) { using (var ts = new CancellationTokenSource (timeout)) { using (var linked = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken, ts.Token)) { try { return await ConnectAsync (host, port, localEndPoint, linked.Token).ConfigureAwait (false); } catch (OperationCanceledException) { if (!cancellationToken.IsCancellationRequested) throw new TimeoutException (); throw; } } } } public static void Poll (Socket socket, SelectMode mode, CancellationToken cancellationToken) { do { cancellationToken.ThrowIfCancellationRequested (); // wait 1/4 second and then re-check for cancellation } while (!socket.Poll (250000, mode)); } } } ================================================ FILE: MailKit/Net/SslStream.cs ================================================ // // SslStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Net.Security; using System.Diagnostics.CodeAnalysis; using System.Security.Authentication.ExtendedProtection; namespace MailKit.Net { class SslStream : System.Net.Security.SslStream, IChannelBindingContext { ChannelBinding? tlsServerEndPoint; ChannelBinding? tlsUnique; public SslStream (Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback) : base (innerStream, leaveInnerStreamOpen, userCertificateValidationCallback) { } new public Stream InnerStream { get { return base.InnerStream; } } ChannelBinding? GetChannelBinding (ChannelBindingKind kind) { ChannelBinding? channelBinding; try { // Note: Documentation for TransportContext.GetChannelBinding() states that it will return null if the // requested channel binding type is not supported, but it also states that it will throw // NotSupportedException, so we handle both. channelBinding = TransportContext?.GetChannelBinding (kind); } catch (NotSupportedException) { return null; } if (channelBinding == null || channelBinding.IsClosed || channelBinding.IsInvalid) return null; return channelBinding; } /// /// Try to get a channel-binding. /// /// /// Tries to get the specified channel-binding. /// /// The kind of channel-binding desired. /// The channel-binding. /// if the channel-binding token was acquired; otherwise, . public bool TryGetChannelBinding (ChannelBindingKind kind, [NotNullWhen (true)] out ChannelBinding? channelBinding) { int identifierLength; if (kind == ChannelBindingKind.Endpoint) { channelBinding = tlsServerEndPoint ??= GetChannelBinding (kind); identifierLength = "tls-server-end-point:".Length; } else if (kind == ChannelBindingKind.Unique) { channelBinding = tlsUnique ??= GetChannelBinding (kind); identifierLength = "tls-unique:".Length; } else { channelBinding = null; return false; } if (channelBinding == null || channelBinding.Size <= 32 + identifierLength) return false; return true; } /// /// Try to get a channel-binding token. /// /// /// Tries to get the specified channel-binding. /// /// The kind of channel-binding desired. /// The channel-binding token. /// if the channel-binding token was acquired; otherwise, . public bool TryGetChannelBindingToken (ChannelBindingKind kind, [NotNullWhen (true)] out byte[]? token) { token = null; if (!TryGetChannelBinding (kind, out var channelBinding)) return false; int identifierLength; if (kind == ChannelBindingKind.Endpoint) { identifierLength = "tls-server-end-point:".Length; } else if (kind == ChannelBindingKind.Unique) { identifierLength = "tls-unique:".Length; } else { return false; } int tokenLength = (channelBinding.Size - 32) - identifierLength; token = new byte[tokenLength]; unsafe { byte* inbuf = (byte*) channelBinding.DangerousGetHandle ().ToPointer (); byte* inptr = inbuf + 32 + identifierLength; byte* inend = inbuf + channelBinding.Size; fixed (byte* outbuf = token) { byte* outptr = outbuf; while (inptr < inend) *outptr++ = *inptr++; } } return true; } protected override void Dispose (bool disposing) { if (disposing) { tlsServerEndPoint?.Close (); tlsServerEndPoint = null; tlsUnique?.Close (); tlsUnique = null; } base.Dispose (disposing); } } } ================================================ FILE: MailKit/NullProtocolLogger.cs ================================================ // // NullProtocolLogger.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// A protocol logger that does not log to anywhere. /// /// /// By default, the , /// , and /// all use a /// . /// public sealed class NullProtocolLogger : IProtocolLogger { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public NullProtocolLogger () { } #region IProtocolLogger implementation /// /// Get or set the authentication secret detector. /// /// /// Gets or sets the authentication secret detector. /// /// The authentication secret detector. public IAuthenticationSecretDetector? AuthenticationSecretDetector { get; set; } /// /// Logs a connection to the specified URI. /// /// /// This method does nothing. /// /// The URI. public void LogConnect (Uri uri) { } /// /// Logs a sequence of bytes sent by the client. /// /// /// This method does nothing. /// /// The buffer to log. /// The offset of the first byte to log. /// The number of bytes to log. /// /// is . /// public void LogClient (byte[] buffer, int offset, int count) { } /// /// Logs a sequence of bytes sent by the server. /// /// /// This method does nothing. /// /// The buffer to log. /// The offset of the first byte to log. /// The number of bytes to log. /// /// is . /// public void LogServer (byte[] buffer, int offset, int count) { } #endregion #region IDisposable implementation /// /// Releases all resource used by the object. /// /// Call when you are finished using the . The /// method leaves the in an unusable state. After /// calling , you must release all references to the so /// the garbage collector can reclaim the memory that the was occupying. public void Dispose () { } #endregion } } ================================================ FILE: MailKit/PreviewOptions.cs ================================================ // // PreviewOptions.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { #if ENABLE_LAZY_PREVIEW_API /// /// A set of options for fetching the preview text for messages. /// public enum PreviewOptions { /// /// No options specified. /// None, /// /// The preview text should only be fetched if the server has it instantly available (cached). /// Lazy } #endif } ================================================ FILE: MailKit/ProgressStream.cs ================================================ // // ProgressStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Threading; using System.Threading.Tasks; using MimeKit.IO; namespace MailKit { class ProgressStream : Stream, ICancellableStream { readonly ICancellableStream? cancellable; public ProgressStream (Stream source, Action update) { if (source == null) throw new ArgumentNullException (nameof (source)); if (update == null) throw new ArgumentNullException (nameof (update)); cancellable = source as ICancellableStream; Source = source; Update = update; } public Stream Source { get; private set; } Action Update { get; set; } public override bool CanRead { get { return Source.CanRead; } } public override bool CanWrite { get { return Source.CanWrite; } } public override bool CanSeek { get { return false; } } public override bool CanTimeout { get { return Source.CanTimeout; } } public override long Length { get { return Source.Length; } } public override long Position { get { return Source.Position; } set { Seek (value, SeekOrigin.Begin); } } public override int ReadTimeout { get { return Source.ReadTimeout; } set { Source.ReadTimeout = value; } } public override int WriteTimeout { get { return Source.WriteTimeout; } set { Source.WriteTimeout = value; } } public int Read (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { int n; if (cancellable != null) { if ((n = cancellable.Read (buffer, offset, count, cancellationToken)) > 0) Update (n); } else { if ((n = Source.Read (buffer, offset, count)) > 0) Update (n); } return n; } public override int Read (byte[] buffer, int offset, int count) { int n; if ((n = Source.Read (buffer, offset, count)) > 0) Update (n); return n; } public override async Task ReadAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { int n; if ((n = await Source.ReadAsync (buffer, offset, count, cancellationToken).ConfigureAwait (false)) > 0) Update (n); return n; } public void Write (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { if (cancellable != null) cancellable.Write (buffer, offset, count, cancellationToken); else Source.Write (buffer, offset, count); if (count > 0) Update (count); } public override void Write (byte[] buffer, int offset, int count) { Source.Write (buffer, offset, count); if (count > 0) Update (count); } public override async Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { await Source.WriteAsync (buffer, offset, count, cancellationToken).ConfigureAwait (false); if (count > 0) Update (count); } public override long Seek (long offset, SeekOrigin origin) { throw new NotSupportedException ("The stream does not support seeking."); } public void Flush (CancellationToken cancellationToken) { if (cancellable != null) cancellable.Flush (cancellationToken); else Source.Flush (); } public override void Flush () { Source.Flush (); } public override Task FlushAsync (CancellationToken cancellationToken) { return Source.FlushAsync (cancellationToken); } public override void SetLength (long value) { throw new NotSupportedException ("The stream does not support resizing."); } } } ================================================ FILE: MailKit/Properties/AssemblyInfo.cs ================================================ // // AssemblyInfo.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle ("MailKit")] [assembly: AssemblyDescription ("A cross-platform mail client library.")] [assembly: AssemblyConfiguration ("")] [assembly: AssemblyCompany (".NET Foundation")] [assembly: AssemblyProduct ("MailKit")] [assembly: AssemblyCopyright ("Copyright © 2013-2026 .NET Foundation and Contributors")] [assembly: AssemblyTrademark (".NET Foundation")] [assembly: AssemblyCulture ("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible (true)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid ("2fe79b66-d107-45da-9493-175f59c4a53c")] [assembly: InternalsVisibleTo ("UnitTests, PublicKey=002400000480000094000000060200" + "0000240000525341310004000011000000cde209732ce60a8fa70ee643cb32e9bf8149b61018c5" + "b166489b8a5cae44f1f88ca97ab9d9e035421933a6f0d556acc7c2219ae1464e35386ca1e239aa" + "42508b9edbb4164bfa82aa2a0f4cd983d9e5ba2acfe08a10a2093e2b2bf8408eef43114db89b39" + "99c59af1d3dc2c9f0cdbf51074e9a482cf09c9116ae1c5543ce8ff9b")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Micro Version // Build Number // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] // // Note: AssemblyVersion is what the CLR matches against at runtime, so be careful // about updating it. The AssemblyFileVersion is the official release version while // the AssemblyInformationalVersion is just used as a display version. // // Based on my current understanding, AssemblyVersion is essentially the "API Version" // and so should only be updated when the API changes. The other 2 Version attributes // represent the "Release Version". // // Making releases: // // If any classes, methods, or enum values have been added, bump the Micro Version // in all version attributes and set the Build Number back to 0. // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. [assembly: AssemblyInformationalVersion ("4.15.1.0")] [assembly: AssemblyFileVersion ("4.15.1.0")] [assembly: AssemblyVersion ("4.15.0.0")] ================================================ FILE: MailKit/ProtocolException.cs ================================================ // // ProtocolException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit { /// /// The exception that is thrown when there is a protocol error. /// /// /// A can be thrown by any of the various client /// methods in MailKit. /// Since many protocol exceptions are fatal, it is important to check whether /// or not the client is still connected using the /// property when this exception is thrown. /// #if SERIALIZABLE [Serializable] #endif public abstract class ProtocolException : Exception { const string ProtocolLogHelpLink = "https://github.com/jstedfast/MailKit/blob/master/FAQ.md#protocol-log"; #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The serialization info. /// The streaming context. [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected ProtocolException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// An inner exception. protected ProtocolException (string message, Exception innerException) : base (message, innerException) { HelpLink = ProtocolLogHelpLink; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. protected ProtocolException (string message) : base (message) { HelpLink = ProtocolLogHelpLink; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// protected ProtocolException () { HelpLink = ProtocolLogHelpLink; } } } ================================================ FILE: MailKit/ProtocolLogger.cs ================================================ // // ProtocolLogger.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using System.Text; using System.Globalization; namespace MailKit { /// /// A default protocol logger for logging the communication between a client and server. /// /// /// A default protocol logger for logging the communication between a client and server. /// /// /// /// public class ProtocolLogger : IProtocolLogger { static byte[] defaultClientPrefix = Encoding.ASCII.GetBytes ("C: "); static byte[] defaultServerPrefix = Encoding.ASCII.GetBytes ("S: "); static readonly byte[] Secret = Encoding.ASCII.GetBytes ("********"); static readonly byte[] Space = new byte[] { (byte) ' ' }; const string DefaultTimestampFormat = "yyyy-MM-ddTHH:mm:ssZ"; byte[] clientPrefix = defaultClientPrefix; byte[] serverPrefix = defaultServerPrefix; readonly Stream stream; readonly bool leaveOpen; bool clientMidline; bool serverMidline; /// /// Initializes a new instance of the class. /// /// /// Creates a new to log to a specified file. The file is created if it does not exist. /// /// /// /// /// The file name. /// if the file should be appended to; otherwise, . Defaults to . public ProtocolLogger (string fileName, bool append = true) { stream = File.Open (fileName, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read); TimestampFormat = DefaultTimestampFormat; RedactSecrets = true; } /// /// Initializes a new instance of the class. /// /// /// Creates a new to log to a specified stream. /// /// The stream. /// if the stream should be left open after the protocol logger is disposed. public ProtocolLogger (Stream stream, bool leaveOpen = false) { if (stream == null) throw new ArgumentNullException (nameof (stream)); TimestampFormat = DefaultTimestampFormat; RedactSecrets = true; this.leaveOpen = leaveOpen; this.stream = stream; } /// /// Releases unmanaged resources and performs other cleanup operations before the /// is reclaimed by garbage collection. /// /// /// Releases unmanaged resources and performs other cleanup operations before the /// is reclaimed by garbage collection. /// ~ProtocolLogger () { Dispose (false); } /// /// Get the log stream. /// /// /// Gets the log stream. /// /// The log sstream. public Stream Stream { get { return stream; } } /// /// Get or set the default client prefix to use when creating new instances. /// /// /// Get or set the default client prefix to use when creating new instances. /// /// The default client prefix. public static string DefaultClientPrefix { get { return Encoding.UTF8.GetString (defaultClientPrefix); } set { defaultClientPrefix = Encoding.UTF8.GetBytes (value); } } /// /// Get or set the default server prefix to use when creating new instances. /// /// /// Get or set the default server prefix to use when creating new instances. /// /// The default server prefix. public static string DefaultServerPrefix { get { return Encoding.UTF8.GetString (defaultServerPrefix); } set { defaultServerPrefix = Encoding.UTF8.GetBytes (value); } } /// /// Get or set the client prefix to use when logging client messages. /// /// /// Gets or sets the client prefix to use when logging client messages. /// /// The client prefix. public string ClientPrefix { get { return Encoding.UTF8.GetString (clientPrefix); } set { clientPrefix = Encoding.UTF8.GetBytes (value); } } /// /// Get or set the server prefix to use when logging server messages. /// /// /// Gets or sets the server prefix to use when logging server messages. /// /// The server prefix. public string ServerPrefix { get { return Encoding.UTF8.GetString (serverPrefix); } set { serverPrefix = Encoding.UTF8.GetBytes (value); } } /// /// Get or set whether or not authentication secrets should be redacted. /// /// /// Gets or sets whether or not authentication secrets should be redacted. /// /// if authentication secrets should be redacted; otherwise, . public bool RedactSecrets { get; set; } /// /// Get or set whether timestamps should be logged. /// /// /// Gets or sets whether or not timestamps should be logged. /// /// if timestamps should be logged; otherwise, . public bool LogTimestamps { get; set; } /// /// Get or set the date and time serialization format that should be used when logging timestamps. /// /// /// Gets or sets the date and time serialization format that should be used when logging timestamps. /// /// The date and time serialization format that should be used when logging timestamps. public string TimestampFormat { get; set; } #region IProtocolLogger implementation /// /// Get or set the authentication secret detector. /// /// /// Gets or sets the authentication secret detector. /// /// The authentication secret detector. public IAuthenticationSecretDetector? AuthenticationSecretDetector { get; set; } static void ValidateArguments (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0 || count > (buffer.Length - offset)) throw new ArgumentOutOfRangeException (nameof (count)); } void Log (byte[] prefix, ref bool midline, byte[] buffer, int offset, int count, bool isClient) { int endIndex = offset + count; int index = offset; int start; while (index < endIndex) { start = index; while (index < endIndex && buffer[index] != (byte) '\n') index++; if (!midline) { if (LogTimestamps) { var timestamp = Encoding.ASCII.GetBytes (DateTime.UtcNow.ToString (TimestampFormat, CultureInfo.InvariantCulture)); stream.Write (timestamp, 0, timestamp.Length); stream.Write (Space, 0, Space.Length); } stream.Write (prefix, 0, prefix.Length); } if (index < endIndex && buffer[index] == (byte) '\n') { midline = false; index++; } else { midline = true; } if (isClient && RedactSecrets && AuthenticationSecretDetector != null) { var secrets = AuthenticationSecretDetector.DetectSecrets (buffer, start, index - start); foreach (var secret in secrets) { if (secret.StartIndex > start) stream.Write (buffer, start, secret.StartIndex - start); start = secret.StartIndex + secret.Length; stream.Write (Secret, 0, Secret.Length); } } stream.Write (buffer, start, index - start); } stream.Flush (); } /// /// Logs a connection to the specified URI. /// /// /// Logs a connection to the specified URI. /// /// The URI. /// /// is . /// /// /// The logger has been disposed. /// /// /// An I/O error occurred. /// public void LogConnect (Uri uri) { if (uri == null) throw new ArgumentNullException (nameof (uri)); string message; if (LogTimestamps) { message = string.Format ("{0} Connected to {1}\r\n", DateTime.UtcNow.ToString (TimestampFormat, CultureInfo.InvariantCulture), uri); } else { message = string.Format ("Connected to {0}\r\n", uri); } var buf = Encoding.ASCII.GetBytes (message); if (clientMidline || serverMidline) { stream.WriteByte ((byte) '\r'); stream.WriteByte ((byte) '\n'); clientMidline = false; serverMidline = false; } stream.Write (buf, 0, buf.Length); stream.Flush (); } /// /// Logs a sequence of bytes sent by the client. /// /// /// Logs a sequence of bytes sent by the client. /// is called by the upon every successful /// write operation to its underlying network stream, passing the exact same , /// , and arguments to the logging function. /// /// The buffer to log. /// The offset of the first byte to log. /// The number of bytes to log. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The logger has been disposed. /// /// /// An I/O error occurred. /// public void LogClient (byte[] buffer, int offset, int count) { ValidateArguments (buffer, offset, count); Log (clientPrefix, ref clientMidline, buffer, offset, count, true); } /// /// Logs a sequence of bytes sent by the server. /// /// /// Logs a sequence of bytes sent by the server. /// is called by the upon every successful /// read of its underlying network stream with the exact buffer that was read. /// /// The buffer to log. /// The offset of the first byte to log. /// The number of bytes to log. /// /// is . /// /// /// is less than zero or greater than the length of . /// -or- /// The is not large enough to contain bytes starting /// at the specified . /// /// /// The logger has been disposed. /// /// /// An I/O error occurred. /// public void LogServer (byte[] buffer, int offset, int count) { ValidateArguments (buffer, offset, count); Log (serverPrefix, ref serverMidline, buffer, offset, count, false); } #endregion #region IDisposable implementation /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// to release both managed and unmanaged resources; /// to release only the unmanaged resources. protected virtual void Dispose (bool disposing) { if (disposing && !leaveOpen) stream.Dispose (); } /// /// Releases all resource used by the object. /// /// Call when you are finished using the . The /// method leaves the in an unusable state. After calling /// , you must release all references to the so the garbage /// collector can reclaim the memory that the was occupying. public void Dispose () { Dispose (true); GC.SuppressFinalize (this); } #endregion } } ================================================ FILE: MailKit/ReplaceRequest.cs ================================================ // // ReplaceRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; using MimeKit; namespace MailKit { /// /// A request for replacing a message in a folder. /// /// /// A request for replacing a message in a folder. /// public class ReplaceRequest : AppendRequest, IReplaceRequest { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message. /// The message flags. /// /// is . /// public ReplaceRequest (MimeMessage message, MessageFlags flags = MessageFlags.None) : base (message, flags) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message. /// The message flags. /// The message keywords. /// /// is . /// -or- /// is . /// public ReplaceRequest (MimeMessage message, MessageFlags flags, IEnumerable keywords) : base (message, flags, keywords) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message. /// The message flags. /// The internal date of the message. /// /// is . /// public ReplaceRequest (MimeMessage message, MessageFlags flags, DateTimeOffset internalDate) : base (message, flags, internalDate) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The message. /// The message flags. /// The message keywords. /// The internal date of the message. /// /// is . /// -or- /// is . /// public ReplaceRequest (MimeMessage message, MessageFlags flags, IEnumerable keywords, DateTimeOffset internalDate) : base (message, flags, keywords, internalDate) { } /// /// Get or set the folder where the replacement message should be appended. /// /// /// Gets or sets the folder where the replacement message should be appended. /// If no destination folder is specified, then the replacement message will be /// appended to the original folder. /// /// The destination folder. public IMailFolder? Destination { get; set; } } } ================================================ FILE: MailKit/Search/AnnotationSearchQuery.cs ================================================ // // AnnotationSearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// An annotation-based search query. /// /// /// An annotation-based search query. /// public class AnnotationSearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new annotation-based search query. /// /// The annotation entry. /// The annotation attribute. /// The annotation attribute value. /// /// is . /// -or- /// is . /// /// /// is not a valid attribute for searching. /// public AnnotationSearchQuery (AnnotationEntry entry, AnnotationAttribute attribute, string value) : base (SearchTerm.Annotation) { if (entry is null) throw new ArgumentNullException (nameof (entry)); if (attribute is null) throw new ArgumentNullException (nameof (attribute)); if (attribute.Name != "value") throw new ArgumentException ("Only the \"value\", \"value.priv\", and \"value.shared\" attributes can be searched.", nameof (attribute)); Attribute = attribute; Entry = entry; Value = value; } /// /// Get the annotation entry. /// /// /// Gets the annotation entry. /// /// The annotation entry. public AnnotationEntry Entry { get; private set; } /// /// Get the annotation attribute. /// /// /// Gets the annotation attribute. /// /// The annotation attribute. public AnnotationAttribute Attribute { get; private set; } /// /// Get the annotation attribute value. /// /// /// Gets the annotation attribute value. /// /// The annotation attribute value. public string Value { get; private set; } } } ================================================ FILE: MailKit/Search/BinarySearchQuery.cs ================================================ // // BinarySearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// A binary search query such as an AND or OR expression. /// /// /// A binary search query such as an AND or OR expression. /// public class BinarySearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new binary search query. /// /// THe search term. /// The left expression. /// The right expression. /// /// is . /// -or- /// is . /// public BinarySearchQuery (SearchTerm term, SearchQuery left, SearchQuery right) : base (term) { if (left == null) throw new ArgumentNullException (nameof (left)); if (right == null) throw new ArgumentNullException (nameof (right)); Right = right; Left = left; } /// /// Gets the left operand of the expression. /// /// /// Gets the left operand of the expression. /// /// The left operand. public SearchQuery Left { get; private set; } /// /// Gets the right operand of the expression. /// /// /// Gets the right operand of the expression. /// /// The right operand. public SearchQuery Right { get; private set; } internal override SearchQuery Optimize (ISearchQueryOptimizer optimizer) { var right = Right.Optimize (optimizer); var left = Left.Optimize (optimizer); SearchQuery binary; if (left != Left || right != Right) binary = new BinarySearchQuery (Term, left, right); else binary = this; return optimizer.Reduce (binary); } } } ================================================ FILE: MailKit/Search/DateSearchQuery.cs ================================================ // // DateSearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// A date-based search query. /// /// /// A date-based search query. /// public class DateSearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new date-based search query. /// /// The search term. /// The date. public DateSearchQuery (SearchTerm term, DateTime date) : base (term) { Date = date; } /// /// Gets the date value of the search query. /// /// /// Gets the date value of the search query. /// /// The date. public DateTime Date { get; private set; } } } ================================================ FILE: MailKit/Search/FilterSearchQuery.cs ================================================ // // FilterSearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// A filter-based search query. /// /// /// A filter-based search query. /// public class FilterSearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// A search query that references a predefined filter. /// /// The name of the filter. /// /// is . /// /// /// is empty. /// public FilterSearchQuery (string name) : base (SearchTerm.Filter) { if (name == null) throw new ArgumentNullException (nameof (name)); if (name.Length == 0) throw new ArgumentException ("The filter name cannot be empty.", nameof (name)); Name = name; } /// /// Initializes a new instance of the class. /// /// /// A search query that references a predefined filter. /// /// The metadata tag representing the filter. /// /// does not reference a valid filter. /// public FilterSearchQuery (MetadataTag filter) : base (SearchTerm.Filter) { if (filter.Id.StartsWith ("/private/filters/values/", StringComparison.Ordinal)) Name = filter.Id.Substring ("/private/filters/values/".Length); else if (filter.Id.StartsWith ("/shared/filters/values/", StringComparison.Ordinal)) Name = filter.Id.Substring ("/shared/filters/values/".Length); else throw new ArgumentException ("Metadata tag does not reference a valid filter.", nameof (filter)); } /// /// Get the name of the filter. /// /// /// Gets the name of the filter. /// /// The name of the filter. public string Name { get; private set; } } } ================================================ FILE: MailKit/Search/HeaderSearchQuery.cs ================================================ // // HeaderSearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// A header-based search query. /// /// /// A header-based search query. /// public class HeaderSearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new header search query. /// /// The header field name. /// The value to match against. /// /// is . /// -or- /// is . /// /// /// is empty. /// public HeaderSearchQuery (string field, string value) : base (SearchTerm.HeaderContains) { if (field == null) throw new ArgumentNullException (nameof (field)); if (field.Length == 0) throw new ArgumentException ("Cannot search an empty header field name.", nameof (field)); if (value == null) throw new ArgumentNullException (nameof (value)); Field = field; Value = value; } /// /// Gets the header field name. /// /// /// Gets the header field name. /// /// The header field. public string Field { get; private set; } /// /// Gets the value to match against. /// /// /// Gets the value to match against. /// /// The value. public string Value { get; private set; } } } ================================================ FILE: MailKit/Search/ISearchQueryOptimizer.cs ================================================ // // ISearchQueryOptimizer.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Search { interface ISearchQueryOptimizer { SearchQuery Reduce (SearchQuery expr); } } ================================================ FILE: MailKit/Search/NumericSearchQuery.cs ================================================ // // NumericSearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Search { /// /// A numeric search query. /// /// /// A numeric search query. /// public class NumericSearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new numeric search query. /// /// The search term. /// The numeric value. public NumericSearchQuery (SearchTerm term, ulong value) : base (term) { Value = value; } /// /// Gets the numeric value to match against. /// /// /// Gets the numeric value to match against. /// /// The numeric value. public ulong Value { get; private set; } } } ================================================ FILE: MailKit/Search/OrderBy.cs ================================================ // // OrderBy.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// Specifies a sort order for search results. /// /// /// You can combine multiple rules to specify the sort /// order that /// should return the results in. /// public class OrderBy { /// /// Initializes a new instance of the class. /// /// /// Creates a new instance. /// /// The field to sort by. /// The sort order. /// /// cannot be . /// public OrderBy (OrderByType type, SortOrder order) { if (order == SortOrder.None) throw new ArgumentOutOfRangeException (nameof (order)); Order = order; Type = type; } /// /// Gets the field used for sorting. /// /// /// Gets the field used for sorting. /// /// The field used for sorting. public OrderByType Type { get; private set; } /// /// Gets the sort order. /// /// /// Gets the sort order. /// /// The sort order. public SortOrder Order { get; private set; } /// /// Sort results by arrival date in ascending order. /// /// /// Sort results by arrival date in ascending order. /// public static readonly OrderBy Arrival = new OrderBy (OrderByType.Arrival, SortOrder.Ascending); /// /// Sort results by arrival date in descending order. /// /// /// Sort results by arrival date in descending order. /// public static readonly OrderBy ReverseArrival = new OrderBy (OrderByType.Arrival, SortOrder.Descending); /// /// Sort results by the first email address in the Cc header in ascending order. /// /// /// Sort results by the first email address in the Cc header in ascending order. /// public static readonly OrderBy Cc = new OrderBy (OrderByType.Cc, SortOrder.Ascending); /// /// Sort results by the first email address in the Cc header in descending order. /// /// /// Sort results by the first email address in the Cc header in descending order. /// public static readonly OrderBy ReverseCc = new OrderBy (OrderByType.Cc, SortOrder.Descending); /// /// Sort results by the sent date in ascending order. /// /// /// Sort results by the sent date in ascending order. /// public static readonly OrderBy Date = new OrderBy (OrderByType.Date, SortOrder.Ascending); /// /// Sort results by the sent date in descending order. /// /// /// Sort results by the sent date in descending order. /// public static readonly OrderBy ReverseDate = new OrderBy (OrderByType.Date, SortOrder.Descending); /// /// Sort results by the first email address in the From header in ascending order. /// /// /// Sort results by the first email address in the From header in ascending order. /// public static readonly OrderBy From = new OrderBy (OrderByType.From, SortOrder.Ascending); /// /// Sort results by the first email address in the From header in descending order. /// /// /// Sort results by the first email address in the From header in descending order. /// public static readonly OrderBy ReverseFrom = new OrderBy (OrderByType.From, SortOrder.Descending); /// /// Sort results by the first display name in the From header in ascending order. /// /// /// Sort results by the first display name in the From header in ascending order. /// public static readonly OrderBy DisplayFrom = new OrderBy (OrderByType.DisplayFrom, SortOrder.Ascending); /// /// Sort results by the first display name in the From header in descending order. /// /// /// Sort results by the first display name in the From header in descending order. /// public static readonly OrderBy ReverseDisplayFrom = new OrderBy (OrderByType.DisplayFrom, SortOrder.Descending); /// /// Sort results by the message size in ascending order. /// /// /// Sort results by the message size in ascending order. /// public static readonly OrderBy Size = new OrderBy (OrderByType.Size, SortOrder.Ascending); /// /// Sort results by the message size in descending order. /// /// /// Sort results by the message size in descending order. /// public static readonly OrderBy ReverseSize = new OrderBy (OrderByType.Size, SortOrder.Descending); /// /// Sort results by the Subject header in ascending order. /// /// /// Sort results by the Subject header in ascending order. /// public static readonly OrderBy Subject = new OrderBy (OrderByType.Subject, SortOrder.Ascending); /// /// Sort results by the Subject header in descending order. /// /// /// Sort results by the Subject header in descending order. /// public static readonly OrderBy ReverseSubject = new OrderBy (OrderByType.Subject, SortOrder.Descending); /// /// Sort results by the first email address in the To header in ascending order. /// /// /// Sort results by the first email address in the To header in ascending order. /// public static readonly OrderBy To = new OrderBy (OrderByType.To, SortOrder.Ascending); /// /// Sort results by the first email address in the To header in descending order. /// /// /// Sort results by the first email address in the To header in descending order. /// public static readonly OrderBy ReverseTo = new OrderBy (OrderByType.To, SortOrder.Descending); /// /// Sort results by the first display name in the To header in ascending order. /// /// /// Sort results by the first display name in the To header in ascending order. /// public static readonly OrderBy DisplayTo = new OrderBy (OrderByType.DisplayTo, SortOrder.Ascending); /// /// Sort results by the first display name in the To header in descending order. /// /// /// Sort results by the first display name in the To header in descending order. /// public static readonly OrderBy ReverseDisplayTo = new OrderBy (OrderByType.DisplayTo, SortOrder.Descending); } } ================================================ FILE: MailKit/Search/OrderByAnnotation.cs ================================================ // // OrderByAnnotation.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// Specifies an annotation-based sort order for search results. /// /// /// You can combine multiple rules to specify the sort /// order that /// should return the results in. /// public class OrderByAnnotation : OrderBy { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The annotation entry to sort by. /// The annotation attribute to use for sorting. /// The sort order. /// /// is . /// -or- /// is . /// /// /// is not a valid attribute for sorting. /// public OrderByAnnotation (AnnotationEntry entry, AnnotationAttribute attribute, SortOrder order) : base (OrderByType.Annotation, order) { if (entry is null) throw new ArgumentNullException (nameof (entry)); if (attribute is null) throw new ArgumentNullException (nameof (attribute)); if (attribute.Name != "value" || attribute.Scope == AnnotationScope.Both) throw new ArgumentException ("Only the \"value.priv\" and \"value.shared\" attributes can be used for sorting.", nameof (attribute)); Entry = entry; Attribute = attribute; } /// /// Get the annotation entry. /// /// /// Gets the annotation entry. /// /// The annotation entry. public AnnotationEntry Entry { get; private set; } /// /// Get the annotation attribute. /// /// /// Gets the annotation attribute. /// /// The annotation attribute. public AnnotationAttribute Attribute { get; private set; } } } ================================================ FILE: MailKit/Search/OrderByType.cs ================================================ // // OrderByType.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Search { /// /// The field to sort by. /// /// /// The field to sort by. /// public enum OrderByType { /// /// Sort by an annotation value. /// Annotation, /// /// Sort by the arrival date. /// Arrival, /// /// Sort by the Cc header. /// Cc, /// /// Sort by the Date header. /// Date, /// /// Sort by the Display Name of the From header. /// DisplayFrom, /// /// Sort by the Display Name of the To header. /// DisplayTo, /// /// Sort by the From header. /// From, /// /// Sort by the mod-sequence. /// ModSeq, /// /// Sort by the message size. /// Size, /// /// Sort by the message subject. /// Subject, /// /// Sort by the To header. /// To } } ================================================ FILE: MailKit/Search/SearchOptions.cs ================================================ // // SearchOptions.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// Advanced search options. /// /// /// Advanced search options. /// [Flags] public enum SearchOptions { /// /// No options specified. /// None = 0, /// /// Returns all of the matching unique identifiers. /// All = 1 << 0, /// /// Returns the number of messages that match the search query. /// Count = 1 << 1, /// /// Returns the minimum unique identifier of the messages that match the search query. /// Min = 1 << 2, /// /// Returns the maximum unique identifier of the messages that match the search query. /// Max = 1 << 3, /// /// Returns the relevancy scores of the messages that match the query. Can only be used /// when using FUZZY search. /// Relevancy = 1 << 4 } } ================================================ FILE: MailKit/Search/SearchQuery.cs ================================================ // // SearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit.Search { /// /// A specialized query for searching messages in a . /// /// /// A specialized query for searching messages in a . /// public class SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new that matches all messages. /// public SearchQuery () : this (SearchTerm.All) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new with the specified search term. /// /// The search term. protected SearchQuery (SearchTerm term) { Term = term; } /// /// Get the search term used by the search query. /// /// /// Gets the search term used by the search query. /// /// The term. public SearchTerm Term { get; private set; } /// /// Match all messages in the folder. /// /// /// Matches all messages in the folder. /// This is equivalent to the ALL search key as defined in rfc3501. /// public static readonly SearchQuery All = new SearchQuery (SearchTerm.All); /// /// Create a conditional AND operation. /// /// /// A conditional AND operation only evaluates the second operand if the first operand evaluates to true. /// /// A representing the conditional AND operation. /// The first operand. /// The second operand. /// /// is . /// -or- /// is . /// public static BinarySearchQuery And (SearchQuery left, SearchQuery right) { if (left == null) throw new ArgumentNullException (nameof (left)); if (right == null) throw new ArgumentNullException (nameof (right)); return new BinarySearchQuery (SearchTerm.And, left, right); } /// /// Create a conditional AND operation. /// /// /// A conditional AND operation only evaluates the second operand if the first operand evaluates to true. /// /// A representing the conditional AND operation. /// An additional query to execute. /// /// is . /// public BinarySearchQuery And (SearchQuery expr) { if (expr == null) throw new ArgumentNullException (nameof (expr)); return new BinarySearchQuery (SearchTerm.And, this, expr); } /// /// Match messages with the specified annotation. /// /// /// Matches messages with the specified annotation. /// This is equivalent to the ANNOTATION search key as defined in rfc5257 /// and is therefor only available for use with IMAP servers that support the ANNOTATE extension. /// /// /// /// The annotation entry. /// The annotation attribute. /// The annotation attribute value. /// A . /// /// is . /// -or- /// is . /// /// /// is not a valid attribute for searching. /// public static AnnotationSearchQuery AnnotationsContain (AnnotationEntry entry, AnnotationAttribute attribute, string value) { return new AnnotationSearchQuery (entry, attribute, value); } /// /// Match messages with the flag set. /// /// /// Matches messages with the flag set. /// This is equivalent to the ANSWERED search key as defined in rfc3501. /// public static readonly SearchQuery Answered = new SearchQuery (SearchTerm.Answered); /// /// Match messages where the Bcc header contains the specified text. /// /// /// Matches messages where the Bcc header contains the specified text. /// This is equivalent to the BCC search key as defined in rfc3501. /// /// A . /// The text to match against. /// /// is . /// /// /// is empty. /// public static TextSearchQuery BccContains (string text) { return new TextSearchQuery (SearchTerm.BccContains, text); } /// /// Match messages where the message body contains the specified text. /// /// /// Matches messages where the message body contains the specified text. /// This is equivalent to the BODY search key as defined in rfc3501. /// /// A . /// The text to match against. /// /// is . /// /// /// is empty. /// public static TextSearchQuery BodyContains (string text) { return new TextSearchQuery (SearchTerm.BodyContains, text); } /// /// Match messages where the Cc header contains the specified text. /// /// /// Matches messages where the Cc header contains the specified text. /// This is equivalent to the CC search key as defined in rfc3501. /// /// A . /// The text to match against. /// /// is . /// /// /// is empty. /// public static TextSearchQuery CcContains (string text) { return new TextSearchQuery (SearchTerm.CcContains, text); } /// /// Match messages that have mod-sequence values greater than or equal to the specified mod-sequence value. /// /// /// Matches messages that have mod-sequence values greater than or equal to the specified mod-sequence value. /// This is equivalent to the MODSEQ search key as defined in rfc4551 /// and is therefor only available for use with IMAP servers that support the CONDSTORE extension. /// /// /// /// A . /// The mod-sequence value. public static SearchQuery ChangedSince (ulong modseq) { return new NumericSearchQuery (SearchTerm.ModSeq, modseq); } /// /// Match messages with the flag set. /// /// /// Matches messages with the flag set. /// This is equivalent to the DELETED search key as defined in rfc3501. /// public static readonly SearchQuery Deleted = new SearchQuery (SearchTerm.Deleted); /// /// Match messages that were delivered after the specified date. /// /// /// Matches messages that were delivered after the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the SINCE search key as defined in rfc3501. /// /// A . /// The date. public static DateSearchQuery DeliveredAfter (DateTime date) { return new DateSearchQuery (SearchTerm.DeliveredAfter, date); } /// /// Match messages that were delivered before the specified date. /// /// /// Matches messages that were delivered before the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the BEFORE search key as defined in rfc3501. /// /// A . /// The date. public static DateSearchQuery DeliveredBefore (DateTime date) { return new DateSearchQuery (SearchTerm.DeliveredBefore, date); } /// /// Match messages that were delivered on the specified date. /// /// /// Matches messages that were delivered on the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the ON search key as defined in rfc3501. /// /// A . /// The date. public static DateSearchQuery DeliveredOn (DateTime date) { return new DateSearchQuery (SearchTerm.DeliveredOn, date); } /// /// Match messages with the flag set. /// /// /// Matches messages with the flag set. /// This is equivalent to the DRAFT search key as defined in rfc3501. /// public static readonly SearchQuery Draft = new SearchQuery (SearchTerm.Draft); /// /// Match messages using a saved search filter. /// /// /// Matches messages using a saved search filter. /// This is equivalent to the FILTER search key as defined in rfc5466 and is therefor only available /// for use with IMAP servers that support the FILTERS extension. /// /// /// /// A . /// The name of the saved search. public static SearchQuery Filter (string name) { return new FilterSearchQuery (name); } /// /// Match messages using a saved search filter. /// /// /// Matches messages using a saved search filter. /// This is equivalent to the FILTER search key as defined in rfc5466 and is therefor only available /// for use with IMAP servers that support the FILTERS extension. /// /// /// /// A . /// The name of the saved search. public static SearchQuery Filter (MetadataTag filter) { return new FilterSearchQuery (filter); } /// /// Match messages with the flag set. /// /// /// Matches messages with the flag set. /// This is equivalent to the FLAGGED search key as defined in rfc3501. /// public static readonly SearchQuery Flagged = new SearchQuery (SearchTerm.Flagged); /// /// Match messages where the From header contains the specified text. /// /// /// Matches messages where the From header contains the specified text. /// This is equivalent to the FROM search key as defined in rfc3501. /// /// A . /// The text to match against. /// /// is . /// /// /// is empty. /// public static TextSearchQuery FromContains (string text) { return new TextSearchQuery (SearchTerm.FromContains, text); } /// /// Apply a fuzzy matching algorithm to the specified expression. /// /// /// Applies a fuzzy matching algorithm to the specified expression. /// This is equivalent to the OLDER search key as defined in rfc6203 and is therefor only available /// for use with IMAP servers that support the SEARCH=FUZZY extension. /// /// /// /// A . /// The expression /// /// is . /// public static UnarySearchQuery Fuzzy (SearchQuery expr) { if (expr == null) throw new ArgumentNullException (nameof (expr)); return new UnarySearchQuery (SearchTerm.Fuzzy, expr); } /// /// Match messages that have the specified flags set. /// /// /// Matches messages that have the specified flag(s) set. /// Maps each flag to the corresponding search key (ANSWERED, DELETED, DRAFT, FLAGGED, /// RECENT or SEEN) as defined in rfc3501. /// /// A . /// The message flags. /// /// does not specify any valid message flags. /// public static SearchQuery HasFlags (MessageFlags flags) { var list = new List (); if ((flags & MessageFlags.Seen) != 0) list.Add (Seen); if ((flags & MessageFlags.Answered) != 0) list.Add (Answered); if ((flags & MessageFlags.Flagged) != 0) list.Add (Flagged); if ((flags & MessageFlags.Deleted) != 0) list.Add (Deleted); if ((flags & MessageFlags.Draft) != 0) list.Add (Draft); if ((flags & MessageFlags.Recent) != 0) list.Add (Recent); if (list.Count == 0) throw new ArgumentException ("No flags specified.", nameof (flags)); var query = list[0]; for (int i = 1; i < list.Count; i++) query = query.And (list[i]); return query; } /// /// Match messages that do not have any of the specified flags set. /// /// /// Matches messages that do not have any of the specified flags set. /// Maps each flag to the corresponding search key (UNANSWERED, UNDELETED, UNDRAFT, UNFLAGGED, /// OLD or UNSEEN) as defined in rfc3501. /// /// A . /// The message flags. /// /// does not specify any valid message flags. /// public static SearchQuery NotFlags (MessageFlags flags) { var list = new List (); if ((flags & MessageFlags.Seen) != 0) list.Add (NotSeen); if ((flags & MessageFlags.Answered) != 0) list.Add (NotAnswered); if ((flags & MessageFlags.Flagged) != 0) list.Add (NotFlagged); if ((flags & MessageFlags.Deleted) != 0) list.Add (NotDeleted); if ((flags & MessageFlags.Draft) != 0) list.Add (NotDraft); if ((flags & MessageFlags.Recent) != 0) list.Add (NotRecent); if (list.Count == 0) throw new ArgumentException ("No flags specified.", nameof (flags)); var query = list[0]; for (int i = 1; i < list.Count; i++) query = query.And (list[i]); return query; } /// /// Match messages that have the specified keyword set. /// /// /// Matches messages that have the specified keyword set. /// A keyword is a user-defined message flag that can be set (or unset) on a message. /// This is equivalent to the KEYWORD search key as defined in rfc3501. /// /// A . /// The keyword. /// /// is . /// /// /// is empty. /// public static TextSearchQuery HasKeyword (string keyword) { if (keyword == null) throw new ArgumentNullException (nameof (keyword)); if (keyword.Length == 0) throw new ArgumentException ("The keyword cannot be an empty string.", nameof (keyword)); return new TextSearchQuery (SearchTerm.Keyword, keyword); } /// /// Match messages that have all of the specified keywords set. /// /// /// Matches messages that have all of the specified keywords set. /// A keyword is a user-defined message flag that can be set (or unset) on a message. /// This is equivalent to AND-ing multiple KEYWORD search keys as defined in rfc3501. /// /// A . /// The keywords. /// /// is . /// /// /// One or more of the is or empty. /// -or- /// No keywords were given. /// public static SearchQuery HasKeywords (params string[] keywords) { return HasKeywords ((IEnumerable) keywords); } /// /// Match messages that have all of the specified keywords set. /// /// /// Matches messages that have all of the specified keywords set. /// A keyword is a user-defined message flag that can be set (or unset) on a message. /// This is equivalent to AND-ing multiple KEYWORD search keys as defined in rfc3501. /// /// A . /// The keywords. /// /// is . /// /// /// One or more of the is or empty. /// -or- /// No keywords were given. /// public static SearchQuery HasKeywords (IEnumerable keywords) { if (keywords == null) throw new ArgumentNullException (nameof (keywords)); var list = new List (); foreach (var keyword in keywords) { if (string.IsNullOrEmpty (keyword)) throw new ArgumentException ("Cannot search for null or empty keywords.", nameof (keywords)); list.Add (new TextSearchQuery (SearchTerm.Keyword, keyword)); } if (list.Count == 0) throw new ArgumentException ("No keywords specified.", nameof (keywords)); var query = list[0]; for (int i = 1; i < list.Count; i++) query = query.And (list[i]); return query; } /// /// Match messages that do not have the specified keyword set. /// /// /// Matches messages that do not have the specified keyword set. /// A keyword is a user-defined message flag that can be set (or unset) on a message. /// This is equivalent to the UNKEYWORD search key as defined in rfc3501. /// /// A . /// The keyword. /// /// is . /// /// /// is empty. /// public static TextSearchQuery NotKeyword (string keyword) { if (keyword == null) throw new ArgumentNullException (nameof (keyword)); if (keyword.Length == 0) throw new ArgumentException ("The keyword cannot be an empty string.", nameof (keyword)); return new TextSearchQuery (SearchTerm.NotKeyword, keyword); } /// /// Match messages that do not have any of the specified keywords set. /// /// /// Matches messages that do not have any of the specified keywords set. /// A keyword is a user-defined message flag that can be set (or unset) on a message. /// This is equivalent to AND-ing multiple UNKEYWORD search keys as defined in rfc3501. /// /// A . /// The keywords. /// /// is . /// /// /// One or more of the is or empty. /// -or- /// No keywords were given. /// public static SearchQuery NotKeywords (params string[] keywords) { return NotKeywords ((IEnumerable) keywords); } /// /// Match messages that do not have any of the specified keywords set. /// /// /// Matches messages that do not have any of the specified keywords set. /// A keyword is a user-defined message flag that can be set (or unset) on a message. /// This is equivalent to AND-ing multiple UNKEYWORD search keys as defined in rfc3501. /// /// A . /// The keywords. /// /// is . /// /// /// One or more of the is or empty. /// -or- /// No keywords were given. /// public static SearchQuery NotKeywords (IEnumerable keywords) { if (keywords == null) throw new ArgumentNullException (nameof (keywords)); var list = new List (); foreach (var keyword in keywords) { if (string.IsNullOrEmpty (keyword)) throw new ArgumentException ("Cannot search for null or empty keywords.", nameof (keywords)); list.Add (new TextSearchQuery (SearchTerm.NotKeyword, keyword)); } if (list.Count == 0) throw new ArgumentException ("No flags specified.", nameof (keywords)); var query = list[0]; for (int i = 1; i < list.Count; i++) query = query.And (list[i]); return query; } /// /// Match messages where the specified header contains the specified text. /// /// /// Matches messages where the specified header contains the specified text. /// This is equivalent to the HEADER search key as defined in rfc3501. /// /// A . /// The header field to match against. /// The text to match against. /// /// is . /// -or- /// is . /// /// /// is empty. /// public static HeaderSearchQuery HeaderContains (string field, string text) { if (field == null) throw new ArgumentNullException (nameof (field)); if (field.Length == 0) throw new ArgumentException ("Cannot search an empty header field name.", nameof (field)); if (text == null) throw new ArgumentNullException (nameof (text)); return new HeaderSearchQuery (field, text); } /// /// Match messages that are larger than the specified number of octets. /// /// /// Matches messages that are larger than the specified number of octets. /// This is equivalent to the LARGER search key as defined in rfc3501. /// /// A . /// The number of octets. /// /// is a negative value. /// public static NumericSearchQuery LargerThan (int octets) { if (octets < 0) throw new ArgumentOutOfRangeException (nameof (octets)); return new NumericSearchQuery (SearchTerm.LargerThan, (ulong) octets); } /// /// Match messages that contain the specified text in either the header or the body. /// /// /// Matches messages that contain the specified text in either the header or the body. /// This is equivalent to the TEXT search key as defined in rfc3501. /// /// A . /// The text to match against. /// /// is . /// /// /// is empty. /// public static TextSearchQuery MessageContains (string text) { return new TextSearchQuery (SearchTerm.MessageContains, text); } /// /// Match messages with the flag set but not the . /// /// /// Matches messages with the flag set but not the . /// This is equivalent to the NEW search key as defined in rfc3501. /// public static readonly SearchQuery New = new SearchQuery (SearchTerm.New); /// /// Create a logical negation of the specified expression. /// /// /// Creates a logical negation of the specified expression. /// This is equivalent to the NOT search key as defined in rfc3501. /// /// A . /// The expression /// /// is . /// public static UnarySearchQuery Not (SearchQuery expr) { if (expr == null) throw new ArgumentNullException (nameof (expr)); return new UnarySearchQuery (SearchTerm.Not, expr); } /// /// Match messages that do not have the flag set. /// /// /// Matches messages that do not have the flag set. /// This is equivalent to the UNANSWERED search key as defined in rfc3501. /// public static readonly SearchQuery NotAnswered = new SearchQuery (SearchTerm.NotAnswered); /// /// Match messages that do not have the flag set. /// /// /// Matches messages that do not have the flag set. /// This is equivalent to the UNDELETED search key as defined in rfc3501. /// public static readonly SearchQuery NotDeleted = new SearchQuery (SearchTerm.NotDeleted); /// /// Match messages that do not have the flag set. /// /// /// Matches messages that do not have the flag set. /// This is equivalent to the UNDRAFT search key as defined in rfc3501. /// public static readonly SearchQuery NotDraft = new SearchQuery (SearchTerm.NotDraft); /// /// Match messages that do not have the flag set. /// /// /// Matches messages that do not have the flag set. /// This is equivalent to the UNFLAGGED search key as defined in rfc3501. /// public static readonly SearchQuery NotFlagged = new SearchQuery (SearchTerm.NotFlagged); /// /// Match messages that do not have the flag set. /// /// /// Matches messages that do not have the flag set. /// This is equivalent to the OLD search key as defined in rfc3501. /// public static readonly SearchQuery NotRecent = new SearchQuery (SearchTerm.NotRecent); /// /// Match messages that do not have the flag set. /// /// /// Matches messages that do not have the flag set. /// This is equivalent to the UNSEEN search key as defined in rfc3501. /// public static readonly SearchQuery NotSeen = new SearchQuery (SearchTerm.NotSeen); /// /// Match messages that do not have the flag set. /// /// /// Matches messages that do not have the flag set. /// This is equivalent to the OLD search key as defined in rfc3501. /// public static readonly SearchQuery Old = new SearchQuery (SearchTerm.NotRecent); /// /// Match messages older than the specified number of seconds. /// /// /// Matches messages older than the specified number of seconds. /// This is equivalent to the OLDER search key as defined in rfc5032 and is therefor only available /// for use with IMAP servers that support the WITHIN extension. /// /// /// /// A . /// The number of seconds. /// /// The number of seconds cannot be less than 1. /// public static NumericSearchQuery OlderThan (int seconds) { if (seconds < 1) throw new ArgumentOutOfRangeException (nameof (seconds)); return new NumericSearchQuery (SearchTerm.Older, (ulong) seconds); } /// /// Create a conditional OR operation. /// /// /// A conditional OR operation only evaluates the second operand if the first operand evaluates to false. /// This is equivalent to the OR search key as defined in rfc3501. /// /// A representing the conditional OR operation. /// The first operand. /// The second operand. /// /// is . /// -or- /// is . /// public static BinarySearchQuery Or (SearchQuery left, SearchQuery right) { if (left == null) throw new ArgumentNullException (nameof (left)); if (right == null) throw new ArgumentNullException (nameof (right)); return new BinarySearchQuery (SearchTerm.Or, left, right); } /// /// Create a conditional OR operation. /// /// /// A conditional OR operation only evaluates the second operand if the first operand evaluates to true. /// This is equivalent to the OR search key as defined in rfc3501. /// /// A representing the conditional AND operation. /// An additional query to execute. /// /// is . /// public BinarySearchQuery Or (SearchQuery expr) { if (expr == null) throw new ArgumentNullException (nameof (expr)); return new BinarySearchQuery (SearchTerm.Or, this, expr); } /// /// Match messages with the flag set. /// /// /// Matches messages with the flag set. /// This is equivalent to the RECENT search key as defined in rfc3501. /// public static readonly SearchQuery Recent = new SearchQuery (SearchTerm.Recent); /// /// Match all messages in the mailbox when the underlying storage of that mailbox supports /// the save date attribute. /// /// /// Matches all messages in the mailbox when the underlying storage of that mailbox supports /// the save date attribute. Conversely, it matches no messages in the mailbox when the save /// date attribute is not supported. /// This is equivalent to the SAVEDATESUPPORTED search key as defined in rfc8514, section 4.3 /// and is therefor only available for use with IMAP servers that support the SAVEDATE extension. /// /// /// public static readonly SearchQuery SaveDateSupported = new SearchQuery (SearchTerm.SaveDateSupported); /// /// Match messages that were saved to the mailbox before the specified date. /// /// /// Matches messages that were saved to the mailbox before the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the SAVEDBEFORE search key as defined in rfc8514, section 4.3 /// and is therefor only available for use with IMAP servers that support the SAVEDATE extension. /// /// /// /// A . /// The date. public static DateSearchQuery SavedBefore (DateTime date) { return new DateSearchQuery (SearchTerm.SavedBefore, date); } /// /// Match messages that were saved to the mailbox on the specified date. /// /// /// Matches messages that were saved to the mailbox on the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the SAVEDON search key as defined in rfc8514, section 4.3 /// and is therefor only available for use with IMAP servers that support the SAVEDATE extension. /// /// /// /// A . /// The date. public static DateSearchQuery SavedOn (DateTime date) { return new DateSearchQuery (SearchTerm.SavedOn, date); } /// /// Match messages that were saved to the mailbox since the specified date. /// /// /// Matches messages that were saved to the mailbox since the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the SAVEDSINCE search key as defined in rfc8514, section 4.3 /// and is therefor only available for use with IMAP servers that support the SAVEDATE extension. /// /// /// /// A . /// The date. public static DateSearchQuery SavedSince (DateTime date) { return new DateSearchQuery (SearchTerm.SavedSince, date); } /// /// Match messages with the flag set. /// /// /// Matches messages with the flag set. /// This is equivalent to the SEEN search key as defined in rfc3501. /// public static readonly SearchQuery Seen = new SearchQuery (SearchTerm.Seen); /// /// Match messages that were sent before the specified date. /// /// /// Matches messages that were sent before the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the SENTBEFORE search key as defined in rfc3501. /// /// A . /// The date. public static DateSearchQuery SentBefore (DateTime date) { return new DateSearchQuery (SearchTerm.SentBefore, date); } /// /// Match messages that were sent on the specified date. /// /// /// Matches messages that were sent on the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the SENTON search key as defined in rfc3501. /// /// A . /// The date. public static DateSearchQuery SentOn (DateTime date) { return new DateSearchQuery (SearchTerm.SentOn, date); } /// /// Match messages that were sent since the specified date. /// /// /// Matches messages that were sent since the specified date. /// The resolution of this search query does not include the time. /// This is equivalent to the SENTSINCE search key as defined in rfc3501. /// /// A . /// The date. public static DateSearchQuery SentSince (DateTime date) { return new DateSearchQuery (SearchTerm.SentSince, date); } /// /// Match messages that are smaller than the specified number of octets. /// /// /// Matches messages that are smaller than the specified number of octets. /// This is equivalent to the SMALLER search key as defined in rfc3501. /// /// A . /// The number of octets. /// /// is a negative value. /// public static NumericSearchQuery SmallerThan (int octets) { if (octets < 0) throw new ArgumentOutOfRangeException (nameof (octets)); return new NumericSearchQuery (SearchTerm.SmallerThan, (ulong) octets); } /// /// Match messages where the Subject header contains the specified text. /// /// /// Matches messages where the Subject header contains the specified text. /// This is equivalent to the SUBJECT search key as defined in rfc3501. /// /// A . /// The text to match against. /// /// is . /// /// /// is empty. /// public static TextSearchQuery SubjectContains (string text) { return new TextSearchQuery (SearchTerm.SubjectContains, text); } /// /// Match messages where the To header contains the specified text. /// /// /// Matches messages where the To header contains the specified text. /// This is equivalent to the TO search key as defined in rfc3501. /// /// A . /// The text to match against. /// /// is . /// /// /// is empty. /// public static TextSearchQuery ToContains (string text) { return new TextSearchQuery (SearchTerm.ToContains, text); } /// /// Limit the search query to messages with the specified unique identifiers. /// /// /// Limits the search query to messages with the specified unique identifiers. /// This is equivalent to the UID search key as defined in rfc3501. /// /// A . /// The unique identifiers. /// /// is . /// /// /// is empty. /// public static UidSearchQuery Uids (IList uids) { return new UidSearchQuery (uids); } /// /// Match messages younger than the specified number of seconds. /// /// /// Matches messages younger than the specified number of seconds. /// This is equivalent to the YOUNGER search key as defined in rfc5032 and is therefor only available /// for use with IMAP servers that support the WITHIN extension. /// /// /// /// A . /// The number of seconds. /// /// The number of seconds cannot be less than 1. /// public static NumericSearchQuery YoungerThan (int seconds) { if (seconds < 1) throw new ArgumentOutOfRangeException (nameof (seconds)); return new NumericSearchQuery (SearchTerm.Younger, (ulong) seconds); } #region GMail extensions /// /// Match messages that have the specified GMail message identifier. /// /// /// Matches messages that have the specified GMail message identifier. /// This is equivalent to the X-GM-MSGID search key as defined in Google's IMAP extensions and is therefor only available /// for use with IMAP servers that support the X-GM-EXT1 extension. /// /// /// /// A . /// The GMail message identifier. public static NumericSearchQuery GMailMessageId (ulong id) { return new NumericSearchQuery (SearchTerm.GMailMessageId, id); } /// /// Match messages belonging to the specified GMail thread. /// /// /// Matches messages belonging to the specified GMail thread. /// This is equivalent to the X-GM-THRID search key as defined in Google's IMAP extensions and is therefor only available /// for use with IMAP servers that support the X-GM-EXT1 extension. /// /// /// /// A . /// The GMail thread. public static NumericSearchQuery GMailThreadId (ulong thread) { return new NumericSearchQuery (SearchTerm.GMailThreadId, thread); } /// /// Match messages that have the specified GMail label. /// /// /// Matches messages that have the specified GMail label. /// This is equivalent to the X-GM-LABELS search key as defined in Google's IMAP extensions and is therefor only available /// for use with IMAP servers that support the X-GM-EXT1 extension. /// /// /// /// A . /// The GMail label. /// /// is . /// /// /// is empty. /// public static TextSearchQuery HasGMailLabel (string label) { if (label == null) throw new ArgumentNullException (nameof (label)); if (label.Length == 0) throw new ArgumentException ("Cannot search for an empty string.", nameof (label)); return new TextSearchQuery (SearchTerm.GMailLabels, label); } /// /// Match messages using the GMail search expression. /// /// /// Matches messages using Google's custom message search syntax. /// This is equivalent to the X-GM-RAW search key as defined in Google's IMAP extensions and is therefor only available /// for use with IMAP servers that support the X-GM-EXT1 extension. /// /// /// /// A . /// The raw GMail search text. /// /// is . /// /// /// is empty. /// public static TextSearchQuery GMailRawSearch (string expression) { if (expression == null) throw new ArgumentNullException (nameof (expression)); if (expression.Length == 0) throw new ArgumentException ("Cannot search for an empty string.", nameof (expression)); return new TextSearchQuery (SearchTerm.GMailRaw, expression); } #endregion internal virtual SearchQuery Optimize (ISearchQueryOptimizer optimizer) { return optimizer.Reduce (this); } } } ================================================ FILE: MailKit/Search/SearchResults.cs ================================================ // // SearchResults.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections.Generic; namespace MailKit.Search { /// /// The results of a search. /// /// /// The results of a search. /// public class SearchResults { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The UID validity value. /// The sort-order to use for the unique identifiers. public SearchResults (uint uidValidity, SortOrder order = SortOrder.None) { UniqueIds = new UniqueIdSet (uidValidity, order); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The sort-order to use for the unique identifiers. public SearchResults (SortOrder order = SortOrder.None) { UniqueIds = new UniqueIdSet (order); } /// /// Get or set the unique identifiers of the messages that matched the search query. /// /// /// Gets or sets the unique identifiers of the messages that matched the search query. /// /// The unique identifiers. public IList UniqueIds { get; set; } /// /// Get or set the number of messages that matched the search query. /// /// /// Gets or sets the number of messages that matched the search query. /// /// The count. public int Count { get; set; } /// /// Get or set the minimum unique identifier that matched the search query. /// /// /// Gets or sets the minimum unique identifier that matched the search query. /// /// The minimum unique identifier. public UniqueId? Min { get; set; } /// /// Get or set the maximum unique identifier that matched the search query. /// /// /// Gets or sets the maximum unique identifier that matched the search query. /// /// The maximum unique identifier. public UniqueId? Max { get; set; } /// /// Gets or sets the mod-sequence identifier of the messages that matched the search query. /// /// /// Gets or sets the mod-sequence identifier of the messages that matched the search query. /// /// The mod-sequence identifier. public ulong? ModSeq { get; set; } /// /// Gets or sets the relevancy scores of the messages that matched the search query. /// /// /// Gets or sets the relevancy scores of the messages that matched the search query. /// /// The relevancy scores. public IList? Relevancy { get; set; } } } ================================================ FILE: MailKit/Search/SearchTerm.cs ================================================ // // SearchTerm.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Search { /// /// A search term. /// /// /// The search term as used by . /// public enum SearchTerm { /// /// A search term that matches all messages. /// All, /// /// A search term that logically combines 2 or more other /// search expressions such that messages must match both /// expressions. /// And, /// /// A search term that matches messages that have the specified annotation. /// Annotation, /// /// A search term that matches answered messages. /// Answered, /// /// A search term that matches messages that contain a specified /// string within the Bcc header. /// BccContains, /// /// A search term that matches messages that contain a specified /// string within the body of the message. /// BodyContains, /// /// A search term that matches messages that contain a specified /// string within the Cc header. /// CcContains, /// /// A search term that matches deleted messages. /// Deleted, /// /// A search term that matches messages delivered after a specified date. /// DeliveredAfter, /// /// A search term that matches messages delivered before a specified date. /// DeliveredBefore, /// /// A search term that matches messages delivered on a specified date. /// DeliveredOn, /// /// A search term that matches draft messages. /// Draft, /// /// A search term that makes use of a predefined filter. /// Filter, /// /// A search term that matches flagged messages. /// Flagged, /// /// A search term that matches messages that contain a specified /// string within the From header. /// FromContains, /// /// A search term that modifies another search expression to allow /// fuzzy matching. /// Fuzzy, /// /// A search term that matches messages that contain a specified /// string within a particular header. /// HeaderContains, /// /// A search term that matches messages that contain a specified /// keyword. /// Keyword, /// /// A search term that matches messages that are larger than a /// specified number of bytes. /// LargerThan, /// /// A search term that matches messages that contain a specified /// string anywhere within the message. /// MessageContains, /// /// A search term that matches messages that have the specified /// modification sequence value. /// ModSeq, /// /// A search term that matches new messages. /// New, /// /// A search term that modifies another search expression such that /// messages must match the logical inverse of the expression. /// Not, /// /// A search term that matches messages that have not been answered. /// NotAnswered, /// /// A search term that matches messages that have not been deleted. /// NotDeleted, /// /// A search term that matches messages that are not drafts. /// NotDraft, /// /// A search term that matches messages that have not been flagged. /// NotFlagged, /// /// A search term that matches messages that do not contain a specified /// keyword. /// NotKeyword, /// /// A search term that matches messages that are not recent. /// NotRecent, /// /// A search term that matches messages that have not been seen. /// NotSeen, /// /// A search term that matches messages that are older than a specified date. /// Older, /// /// A search term that logically combines 2 or more other /// search expressions such that messages only need to match /// one of the expressions. /// Or, /// /// A search term that matches messages that are recent. /// Recent, /// /// A search term that matches all messages in the mailbox when the underlying storage of /// that mailbox supports the save date attribute. Conversely, it matches no messages in /// the mailbox when the save date attribute is not supported. /// SaveDateSupported, /// /// A search term that matches messages that were saved to the mailbox before a specified date. /// SavedBefore, /// /// A search term that matches messages that were saved to the mailbox on a specified date. /// SavedOn, /// /// A search term that matches messages that were saved to the mailbox since a specified date. /// SavedSince, /// /// A search term that matches messages that have been seen. /// Seen, /// /// A search term that matches messages that were sent before a specified date. /// SentBefore, /// /// A search term that matches messages that were sent on a specified date. /// SentOn, /// /// A search term that matches messages that were sent since a specified date. /// SentSince, /// /// A search term that matches messages that are smaller than a /// specified number of bytes. /// SmallerThan, /// /// A search term that matches messages that contain a specified /// string within the Subject header. /// SubjectContains, /// /// A search term that matches messages that contain a specified /// string within the To header. /// ToContains, /// /// A search term that matches messages included within a specified /// set of unique identifiers. /// Uid, /// /// A search term that matches messages that are younger than a specified date. /// Younger, // GMail SEARCH extensions /// /// A search term that matches messages with a specified GMail message identifier. /// GMailMessageId, /// /// A search term that matches messages with a specified GMail thread (conversation) /// identifier. /// GMailThreadId, /// /// A search term that matches messages with the specified GMail labels. /// GMailLabels, /// /// A search term that uses the GMail search syntax. /// GMailRaw, } } ================================================ FILE: MailKit/Search/SortOrder.cs ================================================ // // SortOrder.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Search { /// /// An enumeration of sort orders. /// /// /// An enumeration of sort orders. /// public enum SortOrder { /// /// No sorting order. /// None, /// /// Sort in ascending order. /// Ascending, /// /// Sort in descending order. /// Descending } } ================================================ FILE: MailKit/Search/TextSearchQuery.cs ================================================ // // TextSearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// A text-based search query. /// /// /// A text-based search query. /// public class TextSearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new text-based search query. /// /// The search term. /// The text to match against. /// /// is . /// /// /// is empty. /// public TextSearchQuery (SearchTerm term, string text) : base (term) { if (text == null) throw new ArgumentNullException (nameof (text)); if (text.Length == 0) throw new ArgumentException ("Cannot search for an empty string.", nameof (text)); Text = text; } /// /// Gets the text to match against. /// /// /// Gets the text to match against. /// /// The text. public string Text { get; private set; } } } ================================================ FILE: MailKit/Search/UidSearchQuery.cs ================================================ // // UidSearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit.Search { /// /// A unique identifier-based search query. /// /// /// A unique identifier-based search query. /// public class UidSearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new unique identifier-based search query. /// /// The unique identifiers to match against. /// /// is . /// /// /// is empty. /// public UidSearchQuery (IList uids) : base (SearchTerm.Uid) { if (uids == null) throw new ArgumentNullException (nameof (uids)); if (uids.Count == 0) throw new ArgumentException ("Cannot search for an empty set of unique identifiers.", nameof (uids)); Uids = uids; } /// /// Initializes a new instance of the class. /// /// /// Creates a new unique identifier-based search query. /// /// The unique identifier to match against. /// /// is an invalid unique identifier. /// public UidSearchQuery (UniqueId uid) : base (SearchTerm.Uid) { if (!uid.IsValid) throw new ArgumentException ("Cannot search for an invalid unique identifier.", nameof (uid)); Uids = new UniqueIdSet (SortOrder.Ascending) { uid }; } /// /// Gets the unique identifiers to match against. /// /// /// Gets the unique identifiers to match against. /// /// The unique identifiers. public new IList Uids { get; private set; } } } ================================================ FILE: MailKit/Search/UnarySearchQuery.cs ================================================ // // UnarySearchQuery.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit.Search { /// /// A unary search query such as a NOT expression. /// /// /// A unary search query such as a NOT expression. /// public class UnarySearchQuery : SearchQuery { /// /// Initializes a new instance of the class. /// /// /// Creates a new unary search query. /// /// The search term. /// The operand. /// /// is . /// public UnarySearchQuery (SearchTerm term, SearchQuery operand) : base (term) { if (operand == null) throw new ArgumentNullException (nameof (operand)); Operand = operand; } /// /// Gets the inner operand. /// /// /// Gets the inner operand. /// /// The operand. public SearchQuery Operand { get; private set; } internal override SearchQuery Optimize (ISearchQueryOptimizer optimizer) { var operand = Operand.Optimize (optimizer); SearchQuery unary; if (operand != Operand) unary = new UnarySearchQuery (Term, operand); else unary = this; return optimizer.Reduce (unary); } } } ================================================ FILE: MailKit/Security/AuthenticationException.cs ================================================ // // AuthenticationException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Runtime.Serialization; #endif namespace MailKit.Security { /// /// The exception that is thrown when there is an authentication error. /// /// /// The exception that is thrown when there is an authentication error. /// #if SERIALIZABLE [Serializable] #endif public class AuthenticationException : Exception { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected AuthenticationException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// An inner exception. public AuthenticationException (string message, Exception innerException) : base (message, innerException) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public AuthenticationException (string message) : base (message) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public AuthenticationException () : base ("Authentication failed.") { } } } ================================================ FILE: MailKit/Security/KeyedHashAlgorithm.cs ================================================ // // KeyedHashAlgorithm.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using Windows.Storage.Streams; using Windows.Security.Cryptography; using Windows.Security.Cryptography.Core; namespace MailKit.Security { /// /// A keyed hash algorithm. /// /// /// A keyed hash algorithm. /// public abstract class KeyedHashAlgorithm : IDisposable { CryptographicHash hmac; /// /// Initializes a new instance of the class. /// /// /// Creates a new keyed hash algorithm context. /// /// The MAC algorithm name. /// The secret key. protected KeyedHashAlgorithm (string algorithm, byte[] key) { var mac = MacAlgorithmProvider.OpenAlgorithm (algorithm); var buf = CryptographicBuffer.CreateFromByteArray (key); hmac = mac.CreateHash (buf); } /// /// Computes the hash code for the buffer. /// /// /// Computes the hash code for the buffer. /// /// The computed hash code. /// The buffer. /// /// is null. /// /// /// The keyed hash algorithm context has been disposed. /// public byte[] ComputeHash (byte[] buffer) { if (buffer == null) throw new ArgumentNullException ("data"); hmac.Append (CryptographicBuffer.CreateFromByteArray (buffer)); var value = hmac.GetValueAndReset (); byte[] hash; CryptographicBuffer.CopyToByteArray (value, out hash); return hash; } /// /// Releases all resource used by the object. /// /// Call when you are finished using the . The /// method leaves the in an unusable state. After calling /// , you must release all references to the so the /// garbage collector can reclaim the memory that the was occupying. public void Dispose () { } } /// /// The HMAC SHA-1 algorithm. /// /// /// The HMAC SHA-1 algorithm. /// public class HMACSHA1 : KeyedHashAlgorithm { /// /// Initializes a new instance of the class. /// /// /// Creates a new HMAC SHA-1 context. /// /// The secret key. public HMACSHA1 (byte[] key) : base (MacAlgorithmNames.HmacSha1, key) { } } /// /// The HMAC SHA-256 algorithm. /// /// /// The HMAC SHA-256 algorithm. /// public class HMACSHA256 : KeyedHashAlgorithm { /// /// Initializes a new instance of the class. /// /// /// Creates a new HMAC SHA-256 context. /// /// The secret key. public HMACSHA256 (byte[] key) : base (MacAlgorithmNames.HmacSha256, key) { } } } ================================================ FILE: MailKit/Security/Ntlm/BitConverterLE.cs ================================================ // // Mono.Security.BitConverterLE.cs // Like System.BitConverter but always little endian // // Author: Bernie Solomon // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace MailKit.Security.Ntlm { static class BitConverterLE { unsafe static byte[] GetULongBytes (byte *bytes) { if (BitConverter.IsLittleEndian) return new [] { bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7] }; return new [] { bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0] }; } unsafe internal static byte[] GetBytes (long value) { return GetULongBytes ((byte *) &value); } unsafe static void UShortFromBytes (byte *dst, byte[] src, int startIndex) { if (BitConverter.IsLittleEndian) { dst[0] = src[startIndex]; dst[1] = src[startIndex + 1]; } else { dst[0] = src[startIndex + 1]; dst[1] = src[startIndex]; } } unsafe static void UIntFromBytes (byte *dst, byte[] src, int startIndex) { if (BitConverter.IsLittleEndian) { dst[0] = src[startIndex]; dst[1] = src[startIndex + 1]; dst[2] = src[startIndex + 2]; dst[3] = src[startIndex + 3]; } else { dst[0] = src[startIndex + 3]; dst[1] = src[startIndex + 2]; dst[2] = src[startIndex + 1]; dst[3] = src[startIndex]; } } public unsafe static short ToInt16 (byte[] value, int startIndex) { short ret; UShortFromBytes ((byte *) &ret, value, startIndex); return ret; } public unsafe static int ToInt32 (byte[] value, int startIndex) { int ret; UIntFromBytes ((byte *) &ret, value, startIndex); return ret; } public unsafe static ushort ToUInt16 (byte[] value, int startIndex) { ushort ret; UShortFromBytes ((byte *) &ret, value, startIndex); return ret; } public unsafe static uint ToUInt32 (byte[] value, int startIndex) { uint ret; UIntFromBytes ((byte *) &ret, value, startIndex); return ret; } } } ================================================ FILE: MailKit/Security/Ntlm/DES.cs ================================================ // // DES.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2017 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Security.Cryptography; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Parameters; namespace MailKit.Security.Ntlm { class DES : SymmetricAlgorithm { DES () { BlockSize = 64; KeySize = 64; } public static DES Create () { return new DES (); } public override KeySizes[] LegalBlockSizes { get { return new [] { new KeySizes (64, 64, 0) }; } } public override KeySizes[] LegalKeySizes { get { return new [] { new KeySizes (64, 64, 0) }; } } public override void GenerateIV () { var iv = new byte[8]; using (var rng = RandomNumberGenerator.Create ()) rng.GetBytes (iv); IV = iv; } public override void GenerateKey () { var key = new byte[8]; using (var rng = RandomNumberGenerator.Create ()) { do { rng.GetBytes (key); } while (IsWeakKey (key) || IsSemiWeakKey (key)); } Key = key; } class DesTransform : ICryptoTransform { readonly DesEngine engine; public DesTransform (bool encryption, byte[] key) { engine = new DesEngine (); engine.Init (encryption, new KeyParameter (key)); } public bool CanReuseTransform { get { return false; } } public bool CanTransformMultipleBlocks { get { return false; } } public int InputBlockSize { get { return 8; } } public int OutputBlockSize { get { return 8; } } public int TransformBlock (byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { if (inputBuffer == null) throw new ArgumentNullException ("inputBuffer"); if (inputOffset < 0 || inputOffset > inputBuffer.Length) throw new ArgumentOutOfRangeException ("inputOffset"); if (inputCount < 0 || inputOffset > inputBuffer.Length - inputCount) throw new ArgumentOutOfRangeException ("inputCount"); if (inputCount != 8) throw new ArgumentOutOfRangeException ("inputCount", "Can only transform 8 bytes at a time."); if (outputBuffer == null) throw new ArgumentNullException ("outputBuffer"); if (outputOffset < 0 || outputOffset > outputBuffer.Length - 8) throw new ArgumentOutOfRangeException ("outputOffset"); return engine.ProcessBlock (inputBuffer, inputOffset, outputBuffer, outputOffset); } public byte[] TransformFinalBlock (byte[] inputBuffer, int inputOffset, int inputCount) { if (inputBuffer == null) throw new ArgumentNullException ("inputBuffer"); if (inputOffset < 0 || inputOffset > inputBuffer.Length) throw new ArgumentOutOfRangeException ("inputOffset"); if (inputCount < 0 || inputOffset > inputBuffer.Length - inputCount) throw new ArgumentOutOfRangeException ("inputCount"); var output = new byte[8]; engine.ProcessBlock (inputBuffer, inputOffset, output, 0); return output; } public void Dispose () { } } public override ICryptoTransform CreateDecryptor (byte[] rgbKey, byte[] rgbIV) { return new DesTransform (false, rgbKey); } public override ICryptoTransform CreateEncryptor (byte[] rgbKey, byte[] rgbIV) { return new DesTransform (true, rgbKey); } // The following code is Copyright (C) Microsoft Corporation. All rights reserved. public static bool IsWeakKey (byte[] rgbKey) { if (!IsLegalKeySize (rgbKey)) throw new CryptographicException ("Invalid key size."); byte[] rgbOddParityKey = FixupKeyParity (rgbKey); ulong key = QuadWordFromBigEndian (rgbOddParityKey); return ((key == 0x0101010101010101) || (key == 0xfefefefefefefefe) || (key == 0x1f1f1f1f0e0e0e0e) || (key == 0xe0e0e0e0f1f1f1f1)); } public static bool IsSemiWeakKey (byte[] rgbKey) { if (!IsLegalKeySize (rgbKey)) throw new CryptographicException ("Invalid key size."); byte[] rgbOddParityKey = FixupKeyParity (rgbKey); ulong key = QuadWordFromBigEndian (rgbOddParityKey); return ((key == 0x01fe01fe01fe01fe) || (key == 0xfe01fe01fe01fe01) || (key == 0x1fe01fe00ef10ef1) || (key == 0xe01fe01ff10ef10e) || (key == 0x01e001e001f101f1) || (key == 0xe001e001f101f101) || (key == 0x1ffe1ffe0efe0efe) || (key == 0xfe1ffe1ffe0efe0e) || (key == 0x011f011f010e010e) || (key == 0x1f011f010e010e01) || (key == 0xe0fee0fef1fef1fe) || (key == 0xfee0fee0fef1fef1)); } static byte[] FixupKeyParity (byte[] key) { byte[] oddParityKey = new byte[key.Length]; for (int index = 0; index < key.Length; index++) { // Get the bits we are interested in oddParityKey[index] = (byte) (key[index] & 0xfe); // Get the parity of the sum of the previous bits byte tmp1 = (byte) ((oddParityKey[index] & 0xF) ^ (oddParityKey[index] >> 4)); byte tmp2 = (byte) ((tmp1 & 0x3) ^ (tmp1 >> 2)); byte sumBitsMod2 = (byte) ((tmp2 & 0x1) ^ (tmp2 >> 1)); // We need to set the last bit in oddParityKey[index] to the negation // of the last bit in sumBitsMod2 if (sumBitsMod2 == 0) oddParityKey[index] |= 1; } return oddParityKey; } static bool IsLegalKeySize (byte[] rgbKey) { return rgbKey != null && rgbKey.Length == 8; } static ulong QuadWordFromBigEndian (byte[] block) { return (((ulong) block[0]) << 56) | (((ulong) block[1]) << 48) | (((ulong) block[2]) << 40) | (((ulong) block[3]) << 32) | (((ulong) block[4]) << 24) | (((ulong) block[5]) << 16) | (((ulong) block[6]) << 8) | ((ulong) block[7]); } } } ================================================ FILE: MailKit/Security/Ntlm/HMACMD5.cs ================================================ // // HMACMD5.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2017 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.IO; using Org.BouncyCastle.Crypto.Macs; using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Parameters; namespace MailKit.Security.Ntlm { class HMACMD5 : IDisposable { readonly HMac hash = new HMac (new MD5Digest ()); byte[] hashValue, key; bool disposed; public HMACMD5 (byte[] key) { Key = key; } ~HMACMD5 () { Dispose (false); } public byte[] Hash { get { if (hashValue == null) throw new InvalidOperationException ("No hash value computed."); return hashValue; } } public byte[] Key { get { return key; } set { if (value == null) throw new ArgumentNullException (nameof (value)); if (key != null) Array.Clear (key, 0, key.Length); key = value; Initialize (); } } void HashCore (byte[] block, int offset, int size) { hash.BlockUpdate (block, offset, size); } byte[] HashFinal () { var value = new byte[hash.GetMacSize ()]; hash.DoFinal (value, 0); hash.Reset (); return value; } public void Initialize () { hash.Init (new KeyParameter (Key)); } public void Clear () { Dispose (false); } public byte[] ComputeHash (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0 || offset > buffer.Length - count) throw new ArgumentOutOfRangeException (nameof (count)); if (disposed) throw new ObjectDisposedException ("HashAlgorithm"); HashCore (buffer, offset, count); hashValue = HashFinal (); return hashValue; } public byte[] ComputeHash (byte[] buffer) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); return ComputeHash (buffer, 0, buffer.Length); } public byte[] ComputeHash (Stream inputStream) { // don't read stream unless object is ready to use if (disposed) throw new ObjectDisposedException ("HashAlgorithm"); var buffer = new byte[4096]; int nread; do { if ((nread = inputStream.Read (buffer, 0, buffer.Length)) > 0) HashCore (buffer, 0, nread); } while (nread > 0); hashValue = HashFinal (); return hashValue; } public int TransformBlock (byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { if (inputBuffer == null) throw new ArgumentNullException (nameof (inputBuffer)); if (inputOffset < 0 || inputOffset > inputBuffer.Length) throw new ArgumentOutOfRangeException (nameof (inputOffset)); if (inputCount < 0 || inputOffset > inputBuffer.Length - inputCount) throw new ArgumentOutOfRangeException (nameof (inputCount)); if (outputBuffer != null) { if (outputOffset < 0 || outputOffset > outputBuffer.Length - inputCount) throw new ArgumentOutOfRangeException (nameof (outputOffset)); } HashCore (inputBuffer, inputOffset, inputCount); if (outputBuffer != null) Buffer.BlockCopy (inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount); return inputCount; } public byte[] TransformFinalBlock (byte[] inputBuffer, int inputOffset, int inputCount) { if (inputCount < 0) throw new ArgumentOutOfRangeException (nameof (inputCount)); var outputBuffer = new byte[inputCount]; // note: other exceptions are handled by Buffer.BlockCopy Buffer.BlockCopy (inputBuffer, inputOffset, outputBuffer, 0, inputCount); HashCore (inputBuffer, inputOffset, inputCount); hashValue = HashFinal (); return outputBuffer; } void Dispose (bool disposing) { if (key != null) { Array.Clear (key, 0, Key.Length); key = null; } } public void Dispose () { Dispose (true); GC.SuppressFinalize (this); disposed = true; } } } ================================================ FILE: MailKit/Security/Ntlm/MD4.cs ================================================ // // MD4.cs // // Authors: Sebastien Pouliot // Jeffrey Stedfast // // Copyright (c) 2003 Motus Technologies Inc. (http://www.motus.com) // Copyright (c) 2004-2005, 2010 Novell, Inc (http://www.novell.com) // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; namespace MailKit.Security.Ntlm { sealed class MD4 : IDisposable { const int S11 = 3; const int S12 = 7; const int S13 = 11; const int S14 = 19; const int S21 = 3; const int S22 = 5; const int S23 = 9; const int S24 = 13; const int S31 = 3; const int S32 = 9; const int S33 = 11; const int S34 = 15; readonly byte[] buffered; readonly uint[] state; readonly uint[] count; readonly uint[] x; byte[]? hashValue; bool disposed; public MD4 () { // we allocate the context memory buffered = new byte[64]; state = new uint[4]; count = new uint[2]; // temporary buffer in MD4Transform that we don't want to allocate on each iteration x = new uint[16]; // the initialize our context Initialize (); } ~MD4 () { Dispose (false); } public byte[] Hash { get { if (hashValue == null) throw new InvalidOperationException ("No hash value computed."); return hashValue; } } void HashCore (byte[] block, int offset, int size) { // Compute number of bytes mod 64 int index = (int) ((count[0] >> 3) & 0x3F); // Update number of bits count[0] += (uint) (size << 3); if (count[0] < (size << 3)) count[1]++; count[1] += (uint) (size >> 29); int partLen = 64 - index; int i = 0; // Transform as many times as possible. if (size >= partLen) { Buffer.BlockCopy (block, offset, buffered, index, partLen); MD4Transform (buffered, 0); for (i = partLen; i + 63 < size; i += 64) MD4Transform (block, offset + i); index = 0; } // Buffer remaining input Buffer.BlockCopy (block, offset + i, buffered, index, size - i); } byte[] HashFinal () { // Save number of bits var bits = new byte[8]; Encode (bits, count); // Pad out to 56 mod 64. uint index = ((count [0] >> 3) & 0x3f); int padLen = (int) ((index < 56) ? (56 - index) : (120 - index)); HashCore (Padding (padLen), 0, padLen); // Append length (before padding) HashCore (bits, 0, 8); // Store state in digest var digest = new byte[16]; Encode (digest, state); return digest; } public void Initialize () { count[0] = 0; count[1] = 0; state[0] = 0x67452301; state[1] = 0xefcdab89; state[2] = 0x98badcfe; state[3] = 0x10325476; // Clear sensitive information Array.Clear (buffered, 0, 64); Array.Clear (x, 0, 16); } static byte[] Padding (int length) { if (length > 0) { var padding = new byte[length]; padding[0] = 0x80; return padding; } return Array.Empty (); } // F, G and H are basic MD4 functions. static uint F (uint x, uint y, uint z) { return (x & y) | (~x & z); } static uint G (uint x, uint y, uint z) { return (x & y) | (x & z) | (y & z); } static uint H (uint x, uint y, uint z) { return x ^ y ^ z; } // ROTATE_LEFT rotates x left n bits. static uint ROL (uint x, byte n) { return (x << n) | (x >> (32 - n)); } /* FF, GG and HH are transformations for rounds 1, 2 and 3 */ /* Rotation is separate from addition to prevent recomputation */ static void FF (ref uint a, uint b, uint c, uint d, uint x, byte s) { a += F (b, c, d) + x; a = ROL (a, s); } static void GG (ref uint a, uint b, uint c, uint d, uint x, byte s) { a += G (b, c, d) + x + 0x5a827999; a = ROL (a, s); } static void HH (ref uint a, uint b, uint c, uint d, uint x, byte s) { a += H (b, c, d) + x + 0x6ed9eba1; a = ROL (a, s); } static void Encode (byte[] output, uint[] input) { for (int i = 0, j = 0; j < output.Length; i++, j += 4) { output[j + 0] = (byte) (input[i]); output[j + 1] = (byte) (input[i] >> 8); output[j + 2] = (byte) (input[i] >> 16); output[j + 3] = (byte) (input[i] >> 24); } } static void Decode (uint[] output, byte[] input, int index) { for (int i = 0, j = index; i < output.Length; i++, j += 4) output[i] = (uint) ((input[j]) | (input[j + 1] << 8) | (input[j + 2] << 16) | (input[j + 3] << 24)); } void MD4Transform (byte[] block, int index) { uint a = state[0]; uint b = state[1]; uint c = state[2]; uint d = state[3]; Decode (x, block, index); /* Round 1 */ FF (ref a, b, c, d, x[ 0], S11); /* 1 */ FF (ref d, a, b, c, x[ 1], S12); /* 2 */ FF (ref c, d, a, b, x[ 2], S13); /* 3 */ FF (ref b, c, d, a, x[ 3], S14); /* 4 */ FF (ref a, b, c, d, x[ 4], S11); /* 5 */ FF (ref d, a, b, c, x[ 5], S12); /* 6 */ FF (ref c, d, a, b, x[ 6], S13); /* 7 */ FF (ref b, c, d, a, x[ 7], S14); /* 8 */ FF (ref a, b, c, d, x[ 8], S11); /* 9 */ FF (ref d, a, b, c, x[ 9], S12); /* 10 */ FF (ref c, d, a, b, x[10], S13); /* 11 */ FF (ref b, c, d, a, x[11], S14); /* 12 */ FF (ref a, b, c, d, x[12], S11); /* 13 */ FF (ref d, a, b, c, x[13], S12); /* 14 */ FF (ref c, d, a, b, x[14], S13); /* 15 */ FF (ref b, c, d, a, x[15], S14); /* 16 */ /* Round 2 */ GG (ref a, b, c, d, x[ 0], S21); /* 17 */ GG (ref d, a, b, c, x[ 4], S22); /* 18 */ GG (ref c, d, a, b, x[ 8], S23); /* 19 */ GG (ref b, c, d, a, x[12], S24); /* 20 */ GG (ref a, b, c, d, x[ 1], S21); /* 21 */ GG (ref d, a, b, c, x[ 5], S22); /* 22 */ GG (ref c, d, a, b, x[ 9], S23); /* 23 */ GG (ref b, c, d, a, x[13], S24); /* 24 */ GG (ref a, b, c, d, x[ 2], S21); /* 25 */ GG (ref d, a, b, c, x[ 6], S22); /* 26 */ GG (ref c, d, a, b, x[10], S23); /* 27 */ GG (ref b, c, d, a, x[14], S24); /* 28 */ GG (ref a, b, c, d, x[ 3], S21); /* 29 */ GG (ref d, a, b, c, x[ 7], S22); /* 30 */ GG (ref c, d, a, b, x[11], S23); /* 31 */ GG (ref b, c, d, a, x[15], S24); /* 32 */ HH (ref a, b, c, d, x[ 0], S31); /* 33 */ HH (ref d, a, b, c, x[ 8], S32); /* 34 */ HH (ref c, d, a, b, x[ 4], S33); /* 35 */ HH (ref b, c, d, a, x[12], S34); /* 36 */ HH (ref a, b, c, d, x[ 2], S31); /* 37 */ HH (ref d, a, b, c, x[10], S32); /* 38 */ HH (ref c, d, a, b, x[ 6], S33); /* 39 */ HH (ref b, c, d, a, x[14], S34); /* 40 */ HH (ref a, b, c, d, x[ 1], S31); /* 41 */ HH (ref d, a, b, c, x[ 9], S32); /* 42 */ HH (ref c, d, a, b, x[ 5], S33); /* 43 */ HH (ref b, c, d, a, x[13], S34); /* 44 */ HH (ref a, b, c, d, x[ 3], S31); /* 45 */ HH (ref d, a, b, c, x[11], S32); /* 46 */ HH (ref c, d, a, b, x[ 7], S33); /* 47 */ HH (ref b, c, d, a, x[15], S34); /* 48 */ state [0] += a; state [1] += b; state [2] += c; state [3] += d; } public byte[] ComputeHash (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException (nameof (offset)); if (count < 0 || offset > buffer.Length - count) throw new ArgumentOutOfRangeException (nameof (count)); if (disposed) throw new ObjectDisposedException (nameof (MD4)); HashCore (buffer, offset, count); hashValue = HashFinal (); Initialize (); return hashValue; } public byte[] ComputeHash (byte[] buffer) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); return ComputeHash (buffer, 0, buffer.Length); } public byte[] ComputeHash (Stream inputStream) { if (inputStream == null) throw new ArgumentNullException (nameof (inputStream)); // don't read stream unless object is ready to use if (disposed) throw new ObjectDisposedException (nameof (MD4)); var buffer = new byte[4096]; int nread; do { if ((nread = inputStream.Read (buffer, 0, buffer.Length)) > 0) HashCore (buffer, 0, nread); } while (nread > 0); hashValue = HashFinal (); Initialize (); return hashValue; } public int TransformBlock (byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { if (inputBuffer == null) throw new ArgumentNullException (nameof (inputBuffer)); if (inputOffset < 0 || inputOffset > inputBuffer.Length) throw new ArgumentOutOfRangeException (nameof (inputOffset)); if (inputCount < 0 || inputOffset > inputBuffer.Length - inputCount) throw new ArgumentOutOfRangeException (nameof (inputCount)); if (outputBuffer != null) { if (outputOffset < 0 || outputOffset > outputBuffer.Length - inputCount) throw new ArgumentOutOfRangeException (nameof (outputOffset)); } HashCore (inputBuffer, inputOffset, inputCount); if (outputBuffer != null) Buffer.BlockCopy (inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount); return inputCount; } public byte[] TransformFinalBlock (byte[] inputBuffer, int inputOffset, int inputCount) { if (inputCount < 0) throw new ArgumentOutOfRangeException (nameof (inputCount)); var outputBuffer = new byte[inputCount]; // note: other exceptions are handled by Buffer.BlockCopy Buffer.BlockCopy (inputBuffer, inputOffset, outputBuffer, 0, inputCount); HashCore (inputBuffer, inputOffset, inputCount); hashValue = HashFinal (); Initialize (); return outputBuffer; } void Dispose (bool disposing) { if (disposing && !disposed) { Array.Clear (buffered, 0, buffered.Length); Array.Clear (state, 0, state.Length); Array.Clear (count, 0, count.Length); Array.Clear (x, 0, x.Length); disposed = true; } } public void Dispose () { Dispose (true); GC.SuppressFinalize (this); } } } ================================================ FILE: MailKit/Security/Ntlm/NtlmAttribute.cs ================================================ // // NtlmAttribute.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 namespace MailKit.Security.Ntlm { enum NtlmAttribute : short { EOL = 0, ServerName = 1, DomainName = 2, DnsServerName = 3, DnsDomainName = 4, DnsTreeName = 5, Flags = 6, Timestamp = 7, SingleHost = 8, TargetName = 9, ChannelBinding = 10 } } ================================================ FILE: MailKit/Security/Ntlm/NtlmAttributeValuePair.cs ================================================ // // NtlmAttributeValuePair.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; using System.Text; using System.Diagnostics; namespace MailKit.Security.Ntlm { /// /// An abstract NTLM attribute and value pair. /// /// /// An abstract NTLM attribute and value pair. /// abstract class NtlmAttributeValuePair { /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM attribute and value pair. /// /// The NTLM attribute. protected NtlmAttributeValuePair (NtlmAttribute attr) { Attribute = attr; } /// /// Get the NTLM attribute that this pair represents. /// /// /// Gets the NTLM attribute that this pair represents. /// /// The NTLM attribute. public NtlmAttribute Attribute { get; private set; } protected static void EncodeInt16 (byte[] buf, ref int index, short value) { buf[index++] = (byte) (value); buf[index++] = (byte) (value >> 8); } protected static void EncodeInt32 (byte[] buf, ref int index, int value) { buf[index++] = (byte) (value); buf[index++] = (byte) (value >> 8); buf[index++] = (byte) (value >> 16); buf[index++] = (byte) (value >> 24); } protected static void EncodeTypeAndLength (byte[] buf, ref int index, NtlmAttribute attr, short length) { EncodeInt16 (buf, ref index, (short) attr); EncodeInt16 (buf, ref index, length); } /// /// Get the number of bytes needed for encoding the attribute value. /// /// /// Gets the number of bytes needed for encoding the attribute value. /// /// The text encoding. /// The number of bytes needed to encode the value. public abstract int GetEncodedLength (Encoding encoding); /// /// Encode the attribute value to the specified buffer. /// /// /// Encodes the attribute value to the specified buffer. /// /// The text encoding. /// The output buffer. /// The index into the buffer to start appending the encoded attribute. public abstract void EncodeTo (Encoding encoding, byte[] buffer, ref int index); } /// /// An NTLM attribute and value pair consisting of a string value. /// /// /// An NTLM attribute and value pair consisting of a string value. /// [DebuggerDisplay ("{Attribute} = {Value}")] sealed class NtlmAttributeStringValuePair : NtlmAttributeValuePair { /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM attribute and value pair consisting of a string value. /// /// The NTLM attribute. /// The NTLM attribute value. public NtlmAttributeStringValuePair (NtlmAttribute attr, string value) : base (attr) { Value = value; } /// /// Get or set the value of the attribute. /// /// /// Gets or sets the value of the attribute. /// /// The attribute value. public string Value { get; set; } /// /// Get the number of bytes needed for encoding the attribute value. /// /// /// Gets the number of bytes needed for encoding the attribute value. /// /// The text encoding. /// The number of bytes needed to encode the value. public override int GetEncodedLength (Encoding encoding) { return 4 + encoding.GetByteCount (Value); } /// /// Encode the attribute value to the specified buffer. /// /// /// Encodes the attribute value to the specified buffer. /// /// The text encoding. /// The output buffer. /// The index into the buffer to start appending the encoded attribute. public override void EncodeTo (Encoding encoding, byte[] buffer, ref int index) { int length = encoding.GetByteCount (Value); EncodeTypeAndLength (buffer, ref index, Attribute, (short) length); encoding.GetBytes (Value, 0, Value.Length, buffer, index); index += length; } } /// /// An NTLM attribute and value pair consisting of a flags value. /// /// /// An NTLM attribute and value pair consisting of a flags value. /// [DebuggerDisplay ("{Attribute} = {Value}")] sealed class NtlmAttributeFlagsValuePair : NtlmAttributeValuePair { /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM attribute and value pair consisting of a flags value. /// /// The NTLM attribute. /// The NTLM attribute value. /// The size of the encoded flags value. internal NtlmAttributeFlagsValuePair (NtlmAttribute attr, int value, short size) : base (attr) { Value = value; Size = size; } /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM attribute and value pair consisting of a flags value. /// /// The NTLM attribute. /// The NTLM attribute value. public NtlmAttributeFlagsValuePair (NtlmAttribute attr, int value) : this (attr, value, 4) { } /// /// Get or set the size of the encoded flags value. /// /// /// Gets or sets the size of the encoded flags value. /// public short Size { get; internal set; } /// /// Get or set the value of the attribute. /// /// /// Gets or sets the value of the attribute. /// /// The attribute value. public int Value { get; set; } /// /// Get the number of bytes needed for encoding the attribute value. /// /// /// Gets the number of bytes needed for encoding the attribute value. /// /// The text encoding. /// The number of bytes needed to encode the value. public override int GetEncodedLength (Encoding encoding) { return 4 + Size; } /// /// Encode the attribute value to the specified buffer. /// /// /// Encodes the attribute value to the specified buffer. /// /// The text encoding. /// The output buffer. /// The index into the buffer to start appending the encoded attribute. public override void EncodeTo (Encoding encoding, byte[] buffer, ref int index) { EncodeTypeAndLength (buffer, ref index, Attribute, Size); switch (Size) { case 2: EncodeInt16 (buffer, ref index, (short) Value); break; default: EncodeInt32 (buffer, ref index, Value); break; } } } /// /// An NTLM attribute and value pair consisting of a timestamp value. /// /// /// An NTLM attribute and value pair consisting of a timestamp value. /// [DebuggerDisplay ("{Attribute} = {Value}")] sealed class NtlmAttributeTimestampValuePair : NtlmAttributeValuePair { /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM attribute and value pair consisting of a timestamp value. /// /// The NTLM attribute. /// The NTLM attribute value. /// The size of the encoded flags value. internal NtlmAttributeTimestampValuePair (NtlmAttribute attr, long value, short size) : base (attr) { Value = value; Size = size; } /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM attribute and value pair consisting of a timestamp value. /// /// The NTLM attribute. /// The NTLM attribute value. public NtlmAttributeTimestampValuePair (NtlmAttribute attr, long value) : this (attr, value, 8) { } /// /// Get or set the size of the encoded timestamp value. /// /// /// Gets or sets the size of the encoded timestamp value. /// public short Size { get; internal set; } /// /// Get or set the value of the attribute. /// /// /// Gets or sets the value of the attribute. /// /// The attribute value. public long Value { get; set; } /// /// Get the number of bytes needed for encoding the attribute value. /// /// /// Gets the number of bytes needed for encoding the attribute value. /// /// The text encoding. /// The number of bytes needed to encode the value. public override int GetEncodedLength (Encoding encoding) { return 4 + Size; } /// /// Encode the attribute value to the specified buffer. /// /// /// Encodes the attribute value to the specified buffer. /// /// The text encoding. /// The output buffer. /// The index into the buffer to start appending the encoded attribute. public override void EncodeTo (Encoding encoding, byte[] buffer, ref int index) { EncodeTypeAndLength (buffer, ref index, Attribute, Size); switch (Size) { case 2: EncodeInt16 (buffer, ref index, (short) (Value & 0xffff)); break; case 4: EncodeInt32 (buffer, ref index, (int) (Value & 0xffffffff)); break; default: EncodeInt32 (buffer, ref index, (int) (Value & 0xffffffff)); EncodeInt32 (buffer, ref index, (int) (Value >> 32)); break; } } } /// /// An NTLM attribute and value pair consisting of a byte array value. /// /// /// An NTLM attribute and value pair consisting of a byte array value. /// sealed class NtlmAttributeByteArrayValuePair : NtlmAttributeValuePair { /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM attribute and value pair consisting of a byte array value. /// /// The NTLM attribute. /// The NTLM attribute value. public NtlmAttributeByteArrayValuePair (NtlmAttribute attr, byte[] value) : base (attr) { Value = value; } /// /// Get or set the value of the attribute. /// /// /// Gets or sets the value of the attribute. /// /// The attribute value. public byte[] Value { get; set; } /// /// Get the number of bytes needed for encoding the attribute value. /// /// /// Gets the number of bytes needed for encoding the attribute value. /// /// The text encoding. /// The number of bytes needed to encode the value. public override int GetEncodedLength (Encoding encoding) { return 4 + Value.Length; } /// /// Encode the attribute value to the specified buffer. /// /// /// Encodes the attribute value to the specified buffer. /// /// The text encoding. /// The output buffer. /// The index into the buffer to start appending the encoded attribute. public override void EncodeTo (Encoding encoding, byte[] buffer, ref int index) { EncodeTypeAndLength (buffer, ref index, Attribute, (short) Value.Length); Buffer.BlockCopy (Value, 0, buffer, index, Value.Length); index += Value.Length; } } } ================================================ FILE: MailKit/Security/Ntlm/NtlmAuthenticateMessage.cs ================================================ // // NtlmAuthenticateMessage.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; using System.Text; using System.Diagnostics.CodeAnalysis; namespace MailKit.Security.Ntlm { class NtlmAuthenticateMessage : NtlmMessageBase { static readonly byte[] Z16 = new byte[16]; readonly NtlmNegotiateMessage? negotiate; readonly NtlmChallengeMessage? challenge; byte[] clientChallenge; public NtlmAuthenticateMessage (NtlmNegotiateMessage negotiate, NtlmChallengeMessage challenge, string userName, string password, string domain, string workstation) : base (3) { if (negotiate == null) throw new ArgumentNullException (nameof (negotiate)); if (challenge == null) throw new ArgumentNullException (nameof (challenge)); if (userName == null) throw new ArgumentNullException (nameof (userName)); if (password == null) throw new ArgumentNullException (nameof (password)); clientChallenge = NtlmUtils.NONCE (8); this.negotiate = negotiate; this.challenge = challenge; if (!string.IsNullOrEmpty (domain)) { Domain = domain; } else if ((challenge.Flags & NtlmFlags.TargetTypeDomain) != 0) { // The server is domain-joined, so the TargetName will be the domain. Domain = challenge.TargetName ?? string.Empty; } else if (challenge.TargetInfo != null) { // The server is not domain-joined, so the TargetName will be the machine name of the server. Domain = challenge.TargetInfo.DomainName ?? string.Empty; } else { Domain = string.Empty; } Workstation = workstation; UserName = userName; Password = password; // Use only the features supported by both the client and server. Flags = negotiate.Flags & challenge.Flags; // If the client and server both support NEGOTIATE_UNICODE, disable NEGOTIATE_OEM. if ((Flags & NtlmFlags.NegotiateUnicode) != 0) Flags &= ~NtlmFlags.NegotiateOem; // TODO: throw if Unicode && Oem are both unset? // If the client and server both support NEGOTIATE_EXTENDED_SESSIONSECURITY, disable NEGOTIATE_LM_KEY. if ((Flags & NtlmFlags.NegotiateExtendedSessionSecurity) != 0) Flags &= ~NtlmFlags.NegotiateLanManagerKey; // Disable NEGOTIATE_KEY_EXCHANGE if neither NEGOTIATE_SIGN nor NEGOTIATE_SEAL are also present. if ((Flags & NtlmFlags.NegotiateKeyExchange) != 0 && (Flags & (NtlmFlags.NegotiateSign | NtlmFlags.NegotiateSeal)) == 0) Flags &= ~NtlmFlags.NegotiateKeyExchange; // If we had RequestTarget in our initial NEGOTIATE_MESSAGE, include it again in this message(?) if ((negotiate.Flags & NtlmFlags.RequestTarget) != 0) Flags |= NtlmFlags.RequestTarget; // If NEGOTIATE_VERSION is set, grab the OSVersion from our original negotiate message. if ((Flags & NtlmFlags.NegotiateVersion) != 0) OSVersion = negotiate.OSVersion ?? OSVersion; } // Note: This .ctor is for debugging purposes only. It allows us to decode an NTLM AUTHENTICATE_MESSAGE without having to go through the entire NTLM authentication process. public NtlmAuthenticateMessage (byte[] message, int startIndex, int length) : base (3) { Decode (message, startIndex, length); clientChallenge = Array.Empty (); challenge = null; Password = string.Empty; } ~NtlmAuthenticateMessage () { if (clientChallenge != null && clientChallenge.Length > 0) Array.Clear (clientChallenge, 0, clientChallenge.Length); if (LmChallengeResponse != null) Array.Clear (LmChallengeResponse, 0, LmChallengeResponse.Length); if (NtChallengeResponse != null) Array.Clear (NtChallengeResponse, 0, NtChallengeResponse.Length); if (ExportedSessionKey != null) Array.Clear (ExportedSessionKey, 0, ExportedSessionKey.Length); if (EncryptedRandomSessionKey != null) Array.Clear (EncryptedRandomSessionKey, 0, EncryptedRandomSessionKey.Length); } /// /// This is only used for unit testing purposes. /// internal byte[]? ClientChallenge { get { return clientChallenge; } set { if (value == null) return; if (value.Length != 8) throw new ArgumentException ("Invalid nonce length (should be 8 bytes).", nameof (value)); Array.Clear (clientChallenge, 0, clientChallenge.Length); clientChallenge = value; } } /// /// This is only used for unit testing purposes. /// internal long? Timestamp { get; set; } public string Domain { get; private set; } public string Workstation { get; private set; } public string Password { get; private set; } public string UserName { get; private set; } public byte[]? Mic { get; private set; } public byte[]? LmChallengeResponse { get; private set; } public byte[]? NtChallengeResponse { get; private set; } public byte[]? ExportedSessionKey { get; private set; } public byte[]? EncryptedRandomSessionKey { get; private set; } [MemberNotNull (nameof (LmChallengeResponse), nameof (NtChallengeResponse), nameof (Domain), nameof (UserName), nameof (Workstation), nameof (EncryptedRandomSessionKey))] void Decode (byte[] message, int startIndex, int length) { int payloadOffset = length; int micOffset = 64; ValidateArguments (message, startIndex, length); if (message.Length >= 64) Flags = (NtlmFlags) BitConverterLE.ToUInt32 (message, startIndex + 60); else Flags = (NtlmFlags) 0x8201; int lmLength = BitConverterLE.ToUInt16 (message, startIndex + 12); int lmOffset = BitConverterLE.ToUInt16 (message, startIndex + 16); LmChallengeResponse = new byte[lmLength]; Buffer.BlockCopy (message, startIndex + lmOffset, LmChallengeResponse, 0, lmLength); payloadOffset = Math.Min (payloadOffset, lmOffset); int ntLength = BitConverterLE.ToUInt16 (message, startIndex + 20); int ntOffset = BitConverterLE.ToUInt16 (message, startIndex + 24); NtChallengeResponse = new byte[ntLength]; Buffer.BlockCopy (message, startIndex + ntOffset, NtChallengeResponse, 0, ntLength); payloadOffset = Math.Min (payloadOffset, ntOffset); int domainLength = BitConverterLE.ToUInt16 (message, startIndex + 28); int domainOffset = BitConverterLE.ToUInt16 (message, startIndex + 32); Domain = DecodeString (message, startIndex + domainOffset, domainLength); payloadOffset = Math.Min (payloadOffset, domainOffset); int userLength = BitConverterLE.ToUInt16 (message, startIndex + 36); int userOffset = BitConverterLE.ToUInt16 (message, startIndex + 40); UserName = DecodeString (message, startIndex + userOffset, userLength); payloadOffset = Math.Min (payloadOffset, userOffset); int workstationLength = BitConverterLE.ToUInt16 (message, startIndex + 44); int workstationOffset = BitConverterLE.ToUInt16 (message, startIndex + 48); Workstation = DecodeString (message, startIndex + workstationOffset, workstationLength); payloadOffset = Math.Min (payloadOffset, workstationOffset); int skeyLength = BitConverterLE.ToUInt16 (message, startIndex + 52); int skeyOffset = BitConverterLE.ToUInt16 (message, startIndex + 56); EncryptedRandomSessionKey = new byte[skeyLength]; Buffer.BlockCopy (message, startIndex + skeyOffset, EncryptedRandomSessionKey, 0, skeyLength); payloadOffset = Math.Min (payloadOffset, skeyOffset); // OSVersion if ((Flags & NtlmFlags.NegotiateVersion) != 0 && length >= 72) { // decode the OS Version int major = message[startIndex + 64]; int minor = message[startIndex + 65]; int build = BitConverterLE.ToUInt16 (message, startIndex + 66); OSVersion = new Version (major, minor, build); micOffset += 8; } // MIC if (micOffset + 16 <= payloadOffset) { Mic = new byte[16]; Buffer.BlockCopy (message, startIndex + micOffset, Mic, 0, Mic.Length); } } string DecodeString (byte[] buffer, int offset, int len) { var encoding = (Flags & NtlmFlags.NegotiateUnicode) != 0 ? Encoding.Unicode : Encoding.UTF8; return encoding.GetString (buffer, offset, len); } byte[] EncodeString (string text) { if (text == null) return Array.Empty (); var encoding = (Flags & NtlmFlags.NegotiateUnicode) != 0 ? Encoding.Unicode : Encoding.UTF8; return encoding.GetBytes (text); } public void ComputeNtlmV2 (string? targetName, bool unverifiedTargetName, byte[]? channelBinding) { if (challenge == null || negotiate == null) return; var targetInfo = new NtlmTargetInfo (); int avFlags = 0; // If the CHALLENGE_MESSAGE contains a TargetInfo field if (challenge.TargetInfo != null) { challenge.TargetInfo.CopyTo (targetInfo); if (targetInfo.Flags.HasValue) avFlags = targetInfo.Flags.Value; // If the CHALLENGE_MESSAGE TargetInfo field (section 2.2.1.2) has an MsvAvTimestamp present, the client SHOULD provide a MIC. if (challenge.TargetInfo?.Timestamp != null) { // If there is an AV_PAIR structure (section 2.2.2.1) with the AvId field set to MsvAvFlags, then in the Value field, set bit 0x2 to 1. // Else add an AV_PAIR structure and set the AvId field to MsvAvFlags and the Value field bit 0x2 to 1. targetInfo.Flags = avFlags |= 0x2; // Temporarily set the MIC to Z16. Mic = Z16; } // If ClientSuppliedTargetName (section 3.1.1.2) is not NULL if (targetName != null) { // If UnverifiedTargetName (section 3.1.1.2) is TRUE, then in AvId field = MsvAvFlags set 0x00000004 bit. if (unverifiedTargetName) targetInfo.Flags = avFlags |= 0x4; // Add an AV_PAIR structure and set the AvId field to MsvAvTargetName and the Value field to ClientSuppliedTargetName without // terminating NULL. targetInfo.TargetName = targetName; } else { // Else add an AV_PAIR structure and set the AvId field to MsvAvTargetName and the Value field to an empty string without terminating NULL. targetInfo.TargetName = string.Empty; } // The client SHOULD send the channel binding AV_PAIR: // If the ClientChannelBindingsUnhashed (section 3.1.1.2) is not NULL if (channelBinding != null) { // Add an AV_PAIR structure and set the AvId field to MsvAvChannelBindings and the Value field to MD5_HASH(ClientChannelBindingsUnhashed). targetInfo.ChannelBinding = NtlmUtils.MD5 (channelBinding); } else { // Else add an AV_PAIR structure and set the AvId field to MsvAvChannelBindings and the Value field to Z(16). targetInfo.ChannelBinding = Z16; } } var encodedTargetInfo = targetInfo.Encode ((Flags & NtlmFlags.NegotiateUnicode) != 0); // Note: For NTLMv2, the sessionBaseKey is the same as the keyExchangeKey. NtlmUtils.ComputeNtlmV2 (challenge, Domain, UserName, Password, encodedTargetInfo, clientChallenge, Timestamp, out var ntChallengeResponse, out var lmChallengeResponse, out var keyExchangeKey); NtChallengeResponse = ntChallengeResponse; LmChallengeResponse = lmChallengeResponse; if ((Flags & NtlmFlags.NegotiateKeyExchange) != 0 && (Flags & (NtlmFlags.NegotiateSign | NtlmFlags.NegotiateSeal)) != 0) { ExportedSessionKey = NtlmUtils.NONCE (16); EncryptedRandomSessionKey = NtlmUtils.RC4K (keyExchangeKey, ExportedSessionKey); } else { ExportedSessionKey = keyExchangeKey; EncryptedRandomSessionKey = null; } // If the CHALLENGE_MESSAGE TargetInfo field (section 2.2.1.2) has an MsvAvTimestamp present, the client SHOULD provide a MIC. if ((avFlags & 0x2) != 0) Mic = NtlmUtils.HMACMD5 (ExportedSessionKey, NtlmUtils.ConcatenationOf (negotiate.Encode (), challenge.Encode (), Encode ())); } public override byte[] Encode () { var target = EncodeString (Domain); var user = EncodeString (UserName); var workstation = EncodeString (Workstation); int payloadOffset = 72, micOffset = -1; if (Mic != null) { micOffset = payloadOffset; payloadOffset += Mic.Length; } var lmResponseLength = LmChallengeResponse != null ? LmChallengeResponse.Length : 0; var ntResponseLength = NtChallengeResponse != null ? NtChallengeResponse.Length : 0; int skeyLength = EncryptedRandomSessionKey != null ? EncryptedRandomSessionKey.Length : 0; var message = PrepareMessage (payloadOffset + target.Length + user.Length + workstation.Length + lmResponseLength + ntResponseLength + skeyLength); // LmChallengeResponse short lmResponseOffset = (short) (payloadOffset + target.Length + user.Length + workstation.Length); message[12] = (byte) lmResponseLength; message[13] = (byte) 0x00; message[14] = message[12]; message[15] = message[13]; message[16] = (byte) lmResponseOffset; message[17] = (byte) (lmResponseOffset >> 8); //message[18] = (byte) (lmResponseOffset >> 16); //message[19] = (byte) (lmResponseOffset >> 24); // NtChallengeResponse short ntResponseOffset = (short) (lmResponseOffset + lmResponseLength); message[20] = (byte) ntResponseLength; message[21] = (byte) (ntResponseLength >> 8); message[22] = message[20]; message[23] = message[21]; message[24] = (byte) ntResponseOffset; message[25] = (byte) (ntResponseOffset >> 8); //message[26] = (byte) (ntResponseOffset >> 16); //message[27] = (byte) (ntResponseOffset >> 24); // Target short domainLength = (short) target.Length; short domainOffset = (short) payloadOffset; message[28] = (byte) domainLength; message[29] = (byte) (domainLength >> 8); message[30] = message[28]; message[31] = message[29]; message[32] = (byte) domainOffset; message[33] = (byte) (domainOffset >> 8); //message[34] = (byte) (domainOffset >> 16); //message[35] = (byte) (domainOffset >> 24); // UserName short userLength = (short) user.Length; short userOffset = (short) (domainOffset + domainLength); message[36] = (byte) userLength; message[37] = (byte) (userLength >> 8); message[38] = message[36]; message[39] = message[37]; message[40] = (byte) userOffset; message[41] = (byte) (userOffset >> 8); //message[42] = (byte) (userOffset >> 16); //message[43] = (byte) (userOffset >> 24); // Workstation short workstationLength = (short) workstation.Length; short workstationOffset = (short) (userOffset + userLength); message[44] = (byte) workstationLength; message[45] = (byte) (workstationLength >> 8); message[46] = message[44]; message[47] = message[45]; message[48] = (byte) workstationOffset; message[49] = (byte) (workstationOffset >> 8); //message[50] = (byte) (workstationOffset >> 16); //message[51] = (byte) (workstationOffset >> 24); // EncryptedRandomSessionKey short skeyOffset = (short) (ntResponseOffset + ntResponseLength); message[52] = (byte) skeyLength; message[53] = (byte) (skeyLength >> 8); message[54] = message[52]; message[55] = message[53]; message[56] = (byte) skeyOffset; message[57] = (byte) (skeyOffset >> 8); //message[58] = (byte) (skeyOffset >> 16); //message[59] = (byte) (skeyOffset >> 24); // options flags message[60] = (byte) Flags; message[61] = (byte)((uint) Flags >> 8); message[62] = (byte)((uint) Flags >> 16); message[63] = (byte)((uint) Flags >> 24); if (challenge != null && (challenge.Flags & NtlmFlags.NegotiateVersion) != 0) { if (OSVersion != null) { message[64] = (byte) OSVersion.Major; message[65] = (byte) OSVersion.Minor; message[66] = (byte) OSVersion.Build; message[67] = (byte)(OSVersion.Build >> 8); } message[68] = 0x00; message[69] = 0x00; message[70] = 0x00; message[71] = 0x0f; } if (Mic != null) Buffer.BlockCopy (Mic, 0, message, micOffset, Mic.Length); Buffer.BlockCopy (target, 0, message, domainOffset, target.Length); Buffer.BlockCopy (user, 0, message, userOffset, user.Length); Buffer.BlockCopy (workstation, 0, message, workstationOffset, workstation.Length); if (LmChallengeResponse != null) Buffer.BlockCopy (LmChallengeResponse, 0, message, lmResponseOffset, LmChallengeResponse.Length); if (NtChallengeResponse != null) Buffer.BlockCopy (NtChallengeResponse, 0, message, ntResponseOffset, NtChallengeResponse.Length); if ((Flags & NtlmFlags.NegotiateKeyExchange) != 0 && EncryptedRandomSessionKey != null) Buffer.BlockCopy (EncryptedRandomSessionKey, 0, message, skeyOffset, EncryptedRandomSessionKey.Length); return message; } } } ================================================ FILE: MailKit/Security/Ntlm/NtlmChallengeMessage.cs ================================================ // // NtlmChallengeMessage.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; using System.Text; namespace MailKit.Security.Ntlm { class NtlmChallengeMessage : NtlmMessageBase { const NtlmFlags DefaultFlags = NtlmFlags.NegotiateNtlm | NtlmFlags.NegotiateUnicode /*| NtlmFlags.NegotiateAlwaysSign*/; byte[] serverChallenge; byte[]? cached; public NtlmChallengeMessage (NtlmFlags flags, Version? osVersion = null) : base (2) { serverChallenge = NtlmUtils.NONCE (8); OSVersion = osVersion; Flags = flags; } public NtlmChallengeMessage (Version? osVersion = null) : this (DefaultFlags, osVersion) { } public NtlmChallengeMessage (byte[] message, int startIndex, int length) : base (2) { serverChallenge = new byte[8]; Decode (message, startIndex, length); cached = new byte[length]; Buffer.BlockCopy (message, startIndex, cached, 0, length); } ~NtlmChallengeMessage () { if (serverChallenge != null) Array.Clear (serverChallenge, 0, serverChallenge.Length); } public byte[] ServerChallenge { get { return serverChallenge; } set { if (value == null) throw new ArgumentNullException (nameof (value)); if (value.Length != 8) throw new ArgumentException ("Invalid nonce length (should be 8 bytes).", nameof (value)); Array.Clear (serverChallenge, 0, serverChallenge.Length); serverChallenge = value; } } public string? TargetName { get; set; } public NtlmTargetInfo? TargetInfo { get; set; } public byte[]? GetEncodedTargetInfo () { return TargetInfo?.Encode ((Flags & NtlmFlags.NegotiateUnicode) != 0); } void Decode (byte[] message, int startIndex, int length) { ValidateArguments (message, startIndex, length); Flags = (NtlmFlags) BitConverterLE.ToUInt32 (message, startIndex + 20); Buffer.BlockCopy (message, startIndex + 24, serverChallenge, 0, 8); var targetNameLength = BitConverterLE.ToUInt16 (message, startIndex + 12); //var targetNameMaxLength = BitConverterLE.ToUInt16 (message, startIndex + 14); var targetNameOffset = BitConverterLE.ToInt32 (message, startIndex + 16); if (targetNameLength > 0) { var encoding = (Flags & NtlmFlags.NegotiateUnicode) != 0 ? Encoding.Unicode : Encoding.UTF8; TargetName = encoding.GetString (message, startIndex + targetNameOffset, targetNameLength); } if ((Flags & NtlmFlags.NegotiateVersion) != 0 && length >= 56) { // decode the OS Version int major = message[startIndex + 48]; int minor = message[startIndex + 49]; int build = BitConverterLE.ToUInt16 (message, startIndex + 50); OSVersion = new Version (major, minor, build); } // The Target Info block is optional. if (length >= 48 && targetNameOffset >= 48) { var targetInfoLength = BitConverterLE.ToUInt16 (message, startIndex + 40); var targetInfoOffset = BitConverterLE.ToUInt16 (message, startIndex + 44); if (targetInfoLength > 0 && targetInfoOffset < length && targetInfoLength <= (length - targetInfoOffset)) TargetInfo = new NtlmTargetInfo (message, startIndex + targetInfoOffset, targetInfoLength, (Flags & NtlmFlags.NegotiateUnicode) != 0); } } public override byte[] Encode () { if (cached != null) return cached; var targetInfo = GetEncodedTargetInfo (); int targetNameOffset = 48; int targetInfoOffset = 56; byte[]? targetName = null; int size = 48; if (TargetName != null) { var encoding = (Flags & NtlmFlags.NegotiateUnicode) != 0 ? Encoding.Unicode : Encoding.UTF8; targetName = encoding.GetBytes (TargetName); targetInfoOffset += targetName.Length; size += targetName.Length; } if (targetInfo != null) { size += 8 + targetInfo.Length; targetNameOffset += 8; } // 12 bytes var message = PrepareMessage (size); // TargetName (8 bytes) if (targetName != null) { message[12] = (byte) targetName.Length; message[13] = (byte)(targetName.Length >> 8); message[14] = (byte)targetName.Length; message[15] = (byte)(targetName.Length >> 8); message[16] = (byte) targetNameOffset; message[17] = (byte)(targetNameOffset >> 8); //message[18] = (byte) (targetNameOffset >> 16); //message[19] = (byte) (targetNameOffset >> 24); // TargetName Payload Buffer.BlockCopy (targetName, 0, message, targetNameOffset, targetName.Length); } // NegotiateFlags (4 bytes) message[20] = (byte) Flags; message[21] = (byte) ((uint) Flags >> 8); message[22] = (byte) ((uint) Flags >> 16); message[23] = (byte) ((uint) Flags >> 24); // ServerChallenge (8 bytes) Buffer.BlockCopy (serverChallenge, 0, message, 24, serverChallenge.Length); // Reserved (8 bytes) // TargetInfo (8 bytes) if (targetInfo != null) { message[40] = (byte) targetInfo.Length; message[41] = (byte)(targetInfo.Length >> 8); message[42] = (byte) targetInfo.Length; message[43] = (byte)(targetInfo.Length >> 8); message[44] = (byte) targetInfoOffset; message[45] = (byte)(targetInfoOffset >> 8); // TargetInfo Payload Buffer.BlockCopy (targetInfo, 0, message, targetInfoOffset, targetInfo.Length); } if ((Flags & NtlmFlags.NegotiateVersion) != 0) { if (OSVersion != null) { message[48] = (byte) OSVersion.Major; message[49] = (byte) OSVersion.Minor; message[50] = (byte) OSVersion.Build; message[51] = (byte)(OSVersion.Build >> 8); } message[52] = 0x00; message[53] = 0x00; message[54] = 0x00; message[55] = 0x0f; } cached = message; return message; } } } ================================================ FILE: MailKit/Security/Ntlm/NtlmFlags.cs ================================================ // // NtlmFlags.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; namespace MailKit.Security.Ntlm { /// /// The NTLM message header flags. /// /// /// More details here: http://davenport.sourceforge.net/ntlm.html#theNtlmMessageHeaderLayout /// and at https://msdn.microsoft.com/en-us/library/cc236650.aspx /// [Flags] enum NtlmFlags { /// /// Indicates that Unicode strings are supported for use in security buffer data. /// NegotiateUnicode = 0x00000001, /// /// Indicates that OEM strings are supported for use in security buffer data. /// NegotiateOem = 0x00000002, /// /// Requests that the server's authentication realm be included in the Type 2 message. /// RequestTarget = 0x00000004, /// /// This flag's usage has not been identified. /// R10 = 0x00000008, /// /// Specifies that authenticated communication between the client and server should carry a digital signature (message integrity). /// NegotiateSign = 0x00000010, /// /// Specifies that authenticated communication between the client and server should be encrypted (message confidentiality). /// NegotiateSeal = 0x00000020, /// /// Indicates that datagram authentication is being used. /// NegotiateDatagramStyle = 0x00000040, /// /// Indicates that the Lan Manager Session Key should be used for signing /// and sealing authenticated communications. /// NegotiateLanManagerKey = 0x00000080, /// /// This flag is unused and MUST be zero. (r8) /// R9 = 0x00000100, /// /// Indicates that NTLM authentication is being used. /// NegotiateNtlm = 0x00000200, /// /// This flag is unused and MUST be zero. (r8) /// R8 = 0x00000400, /// /// Sent by the client in the Type 3 message to indicate that an anonymous /// context has been established. This also affects the response fields. /// NegotiateAnonymous = 0x00000800, /// /// Sent by the client in the Type 1 message to indicate that the name of the /// domain in which the client workstation has membership is included in the /// message. This is used by the server to determine whether the client is /// eligible for local authentication. /// NegotiateDomainSupplied = 0x00001000, /// /// Sent by the client in the Type 1 message to indicate that the client /// workstation's name is included in the message. This is used by the server /// to determine whether the client is eligible for local authentication. /// NegotiateWorkstationSupplied = 0x00002000, /// /// Sent by the server to indicate that the server and client are on the same /// machine. Implies that the client may use the established local credentials /// for authentication instead of calculating a response to the challenge. /// NegotiateLocalCall = 0x00004000, R7 = NegotiateLocalCall, /// /// Indicates that authenticated communication between the client and server /// should be signed with a "dummy" signature. /// NegotiateAlwaysSign = 0x00008000, /// /// Sent by the server in the Type 2 message to indicate that the target /// authentication realm is a domain. /// TargetTypeDomain = 0x00010000, /// /// Sent by the server in the Type 2 message to indicate that the target /// authentication realm is a server. /// TargetTypeServer = 0x00020000, /// /// Sent by the server in the Type 2 message to indicate that the target /// authentication realm is a share. Presumably, this is for share-level /// authentication. Usage is unclear. /// TargetTypeShare = 0x00040000, R6 = TargetTypeShare, /// /// If set, requests usage of the NTLM v2 session security. NTLM v2 session /// security is a misnomer because it is not NTLM v2. It is NTLM v1 using the /// extended session security that is also in NTLM v2. NTLMSSP_NEGOTIATE_LM_KEY /// and NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY are mutually exclusive. If /// both NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY and NTLMSSP_NEGOTIATE_LM_KEY /// are requested, NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY alone MUST be /// returned to the client. NTLM v2 authentication session key generation MUST /// be supported by both the client and the DC in order to be used, and extended /// session security signing and sealing requires support from the client and /// the server in order to be used. /// NegotiateExtendedSessionSecurity = 0x00080000, /// /// This flag's usage has not been identified. /// NegotiateIdentify = 0x00100000, /// /// This flag is unused and MUST be zero. (r5) /// R5 = 0x00200000, /// /// Indicates that the LMOWF function should be used to generate a session key. /// RequestNonNTSessionKey = 0x00400000, /// /// Sent by the server in the Type 2 message to indicate that it is including /// a Target Information block in the message. The Target Information block /// is used in the calculation of the NTLMv2 response. /// NegotiateTargetInfo = 0x00800000, /// /// This flag is unused and MUST be zero. (r4) /// R4 = 0x01000000, /// /// Indicates that the version field is present. /// NegotiateVersion = 0x02000000, /// /// This flag is unused and MUST be zero. (r3) /// R3 = 0x04000000, /// /// This flag is unused and MUST be zero. (r2) /// R2 = 0x08000000, /// /// This flag is unused and MUST be zero. (r1) /// R1 = 0x10000000, /// /// Indicates that 128-bit encryption is supported. /// Negotiate128 = 0x20000000, /// /// Indicates that the client will provide an encrypted master key in the /// "Session Key" field of the Type 3 message. /// NegotiateKeyExchange = 0x40000000, /// /// Indicates that 56-bit encryption is supported. /// Negotiate56 = (unchecked ((int) 0x80000000)) } } ================================================ FILE: MailKit/Security/Ntlm/NtlmMessageBase.cs ================================================ // // NtlmMessageBase.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; using System.Globalization; namespace MailKit.Security.Ntlm { abstract class NtlmMessageBase { static readonly byte[] Signature = { (byte) 'N', (byte) 'T', (byte) 'L', (byte) 'M', (byte) 'S', (byte) 'S', (byte) 'P', 0x00 }; protected NtlmMessageBase (int type) { Type = type; } public NtlmFlags Flags { get; protected set; } public Version? OSVersion { get; protected set; } public int Type { get; private set; } protected byte[] PrepareMessage (int size) { var message = new byte[size]; Buffer.BlockCopy (Signature, 0, message, 0, 8); message[ 8] = (byte) Type; message[ 9] = (byte)(Type >> 8); message[10] = (byte)(Type >> 16); message[11] = (byte)(Type >> 24); return message; } bool CheckSignature (byte[] message, int startIndex) { for (int i = 0; i < Signature.Length; i++) { if (message[startIndex + i] != Signature[i]) return false; } return BitConverterLE.ToUInt32 (message, startIndex + 8) == Type; } protected void ValidateArguments (byte[] message, int startIndex, int length) { if (message == null) throw new ArgumentNullException (nameof (message)); if (startIndex < 0 || startIndex > message.Length) throw new ArgumentOutOfRangeException (nameof (startIndex)); if (length < 12 || length > (message.Length - startIndex)) throw new ArgumentOutOfRangeException (nameof (length)); if (!CheckSignature (message, startIndex)) throw new ArgumentException (string.Format (CultureInfo.InvariantCulture, "Invalid Type{0} message.", Type), nameof (message)); var messageType = BitConverterLE.ToUInt32 (message, 8); if (messageType != Type) throw new ArgumentException (string.Format (CultureInfo.InvariantCulture, "Invalid Type{0} message.", Type), nameof (message)); } public abstract byte[] Encode (); } } ================================================ FILE: MailKit/Security/Ntlm/NtlmNegotiateMessage.cs ================================================ // // NtlmNegotiateMessage.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // NTLM specification: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 // // NTLM registry key documentation: https://learn.microsoft.com/en-us/troubleshoot/windows-client/windows-security/enable-ntlm-2-authentication // Note: Ideally, we'd default our flags based on the registry settings of the OS. using System; using System.Text; using System.Diagnostics.CodeAnalysis; namespace MailKit.Security.Ntlm { class NtlmNegotiateMessage : NtlmMessageBase { // System.Net.Mail seems to default to: NtlmFlags.Negotiate56 | NtlmFlags.NegotiateUnicode | NtlmFlags.NegotiateOem | NtlmFlags.RequestTarget | NtlmFlags.NegotiateNtlm | NtlmFlags.NegotiateAlwaysSign | NtlmFlags.NegotiateExtendedSessionSecurity | NtlmFlags.NegotiateVersion | NtlmFlags.Negotiate128 internal const NtlmFlags DefaultFlags = NtlmFlags.Negotiate56 | NtlmFlags.NegotiateUnicode | NtlmFlags.NegotiateOem | NtlmFlags.RequestTarget | NtlmFlags.NegotiateNtlm | NtlmFlags.NegotiateAlwaysSign | NtlmFlags.NegotiateExtendedSessionSecurity | NtlmFlags.Negotiate128; byte[]? cached; public NtlmNegotiateMessage (NtlmFlags flags, string? domain, string? workstation, Version? osVersion = null) : base (1) { Flags = flags & ~(NtlmFlags.NegotiateDomainSupplied | NtlmFlags.NegotiateWorkstationSupplied | NtlmFlags.NegotiateVersion); // Note: If the NTLMSSP_NEGOTIATE_VERSION flag is set by the client application, the Version field // MUST be set to the current version (section 2.2.2.10), the DomainName field MUST be set to // a zero-length string, and the Workstation field MUST be set to a zero-length string. if (osVersion != null) { Flags |= NtlmFlags.NegotiateVersion; Workstation = string.Empty; Domain = string.Empty; OSVersion = osVersion; } else { if (!string.IsNullOrEmpty (workstation)) { Flags |= NtlmFlags.NegotiateWorkstationSupplied; Workstation = workstation!.ToUpperInvariant (); } else { Workstation = string.Empty; } if (!string.IsNullOrEmpty (domain)) { Flags |= NtlmFlags.NegotiateDomainSupplied; Domain = domain!.ToUpperInvariant (); } else { Domain = string.Empty; } } } public NtlmNegotiateMessage (string? domain = null, string? workstation = null, Version? osVersion = null) : this (DefaultFlags, domain, workstation, osVersion) { } public NtlmNegotiateMessage (byte[] message, int startIndex, int length) : base (1) { Decode (message, startIndex, length); cached = new byte[length]; Buffer.BlockCopy (message, startIndex, cached, 0, length); } public string Domain { get; private set; } public string Workstation { get; private set; } [MemberNotNull (nameof (Domain), nameof (Workstation))] void Decode (byte[] message, int startIndex, int length) { ValidateArguments (message, startIndex, length); Flags = (NtlmFlags) BitConverterLE.ToUInt32 (message, startIndex + 12); // decode the domain var domainLength = BitConverterLE.ToUInt16 (message, startIndex + 16); var domainOffset = BitConverterLE.ToUInt16 (message, startIndex + 20); Domain = Encoding.UTF8.GetString (message, startIndex + domainOffset, domainLength); // decode the workstation/host var workstationLength = BitConverterLE.ToUInt16 (message, startIndex + 24); var workstationOffset = BitConverterLE.ToUInt16 (message, startIndex + 28); Workstation = Encoding.UTF8.GetString (message, startIndex + workstationOffset, workstationLength); if ((Flags & NtlmFlags.NegotiateVersion) != 0 && length >= 40) { // decode the OS Version int major = message[startIndex + 32]; int minor = message[startIndex + 33]; int build = BitConverterLE.ToUInt16 (message, startIndex + 34); OSVersion = new Version (major, minor, build); } } public override byte[] Encode () { if (cached != null) return cached; var workstation = Encoding.UTF8.GetBytes (Workstation); var domain = Encoding.UTF8.GetBytes (Domain); const int versionLength = 8; int workstationOffset = 32 + versionLength; int domainOffset = workstationOffset + workstation.Length; var message = PrepareMessage (32 + domain.Length + workstation.Length + versionLength); message[12] = (byte) Flags; message[13] = (byte)((uint) Flags >> 8); message[14] = (byte)((uint) Flags >> 16); message[15] = (byte)((uint) Flags >> 24); message[16] = (byte) domain.Length; message[17] = (byte)(domain.Length >> 8); message[18] = message[16]; message[19] = message[17]; message[20] = (byte) domainOffset; message[21] = (byte)(domainOffset >> 8); message[24] = (byte) workstation.Length; message[25] = (byte)(workstation.Length >> 8); message[26] = message[24]; message[27] = message[25]; message[28] = (byte) workstationOffset; message[29] = (byte)(workstationOffset >> 8); if ((Flags & NtlmFlags.NegotiateVersion) != 0) { if (OSVersion != null) { message[32] = (byte) OSVersion.Major; message[33] = (byte) OSVersion.Minor; message[34] = (byte) OSVersion.Build; message[35] = (byte)(OSVersion.Build >> 8); } message[36] = 0x00; message[37] = 0x00; message[38] = 0x00; message[39] = 0x0f; } Buffer.BlockCopy (workstation, 0, message, workstationOffset, workstation.Length); Buffer.BlockCopy (domain, 0, message, domainOffset, domain.Length); cached = message; return message; } } } ================================================ FILE: MailKit/Security/Ntlm/NtlmSingleHostData.cs ================================================ // // NtlmSingleHostData.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; using System.Diagnostics.CodeAnalysis; namespace MailKit.Security.Ntlm { /// /// An NTLM SingleHostData structure. /// /// /// An NTLM SingleHostData structure. /// class NtlmSingleHostData { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The raw target info buffer to decode. /// The starting index of the single host data structure. /// The length of the single host data structure. public NtlmSingleHostData (byte[] buffer, int startIndex, int length) { Decode (buffer, startIndex, length); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The 8-byte platform-specific blob. /// The 256-bit randomly generated machine id. /// /// is . /// -or- /// is . /// /// /// is not 8 bytes. /// -or- /// is not 32 bytes. /// public NtlmSingleHostData (byte[] customData, byte[] machineId) { if (customData == null) throw new ArgumentNullException (nameof (customData)); if (customData.Length != 8) throw new ArgumentException ("The custom data must be 8 bytes.", nameof (customData)); if (machineId == null) throw new ArgumentNullException (nameof (machineId)); if (machineId.Length != 32) throw new ArgumentException ("The machine id must be 32 bytes.", nameof (machineId)); CustomData = customData; MachineId = machineId; Size = 48; } /// /// Get or set an 8-byte platform-specific blob. /// /// /// Gets or sets an 8-byte platform-specific blob. /// public byte[] CustomData { get; private set; } /// /// Get the 256-bit randomly generated machine ID. /// /// /// Gets the 256-bit randomly generated machine ID. /// /// The 256-bit randomly generated machine ID. public byte[] MachineId { get; private set; } /// /// Get the size of the SingleHostData structure. /// /// /// Gets the size of the SingleHostData structure. /// /// The size of the SingleHostData structure. public int Size { get; private set; } [MemberNotNull (nameof (CustomData), nameof (MachineId))] void Decode (byte[] buffer, int startIndex, int length) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (startIndex < 0 || startIndex > buffer.Length) throw new ArgumentOutOfRangeException (nameof (startIndex)); if (length < 48 || length > (buffer.Length - startIndex)) throw new ArgumentOutOfRangeException (nameof (length)); int index = startIndex; // Size (4 bytes): A 32-bit unsigned integer that defines the length, in bytes, of the Value field in the AV_PAIR (section 2.2.2.1) structure. Size = BitConverterLE.ToInt32 (buffer, index); index += 4; // Z4 (4 bytes): A 32-bit integer value containing 0x00000000. index += 4; // CustomData (8 bytes): An 8-byte platform-specific blob containing info only relevant when the client and the server are on the same host. CustomData = new byte[8]; Buffer.BlockCopy (buffer, index, CustomData, 0, 8); index += 8; // MachineID (32 bytes): A 256-bit random number created at computer startup to identify the calling machine. MachineId = new byte[32]; Buffer.BlockCopy (buffer, index, MachineId, 0, 32); } /// /// Encode the SingleHostData structure. /// /// /// Encodes the SingleHostData structure. /// /// The encoded SingleHostData structure. public byte[] Encode () { var buffer = new byte[Size]; int index = 0; // Size (4 bytes): A 32-bit unsigned integer that defines the length, in bytes, of the Value field in the AV_PAIR (section 2.2.2.1) structure. buffer[index++] = (byte) (Size); buffer[index++] = (byte) (Size >> 8); buffer[index++] = (byte) (Size >> 16); buffer[index++] = (byte) (Size >> 24); // Z4 (4 bytes): A 32-bit integer value containing 0x00000000. index += 4; // CustomData (8 bytes): An 8-byte platform-specific blob containing info only relevant when the client and the server are on the same host. Buffer.BlockCopy (CustomData, 0, buffer, index, 8); index += 8; // MachineID (32 bytes): A 256-bit random number created at computer startup to identify the calling machine. Buffer.BlockCopy (MachineId, 0, buffer, index, 32); return buffer; } } } ================================================ FILE: MailKit/Security/Ntlm/NtlmTargetInfo.cs ================================================ // // NtlmTargetInfo.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; using System.Text; using System.Collections.Generic; namespace MailKit.Security.Ntlm { /// /// An NTLM TargetInfo structure. /// /// /// An NTLM TargetInfo structure. /// class NtlmTargetInfo { readonly List attributes = new List (); /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The raw target info buffer to decode. /// The starting index of the target info structure. /// The length of the target info structure. /// if the target info strings are unicode; otherwise, . public NtlmTargetInfo (byte[] buffer, int startIndex, int length, bool unicode) { Decode (buffer, startIndex, length, unicode); } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public NtlmTargetInfo () { } /// /// Copy the attribute value pairs to another TargetInfo. /// /// /// Copies the attribute value pairs to another TargetInfo. /// public void CopyTo (NtlmTargetInfo targetInfo) { targetInfo.attributes.Clear (); foreach (var attribute in attributes) { if (attribute is NtlmAttributeTimestampValuePair timestamp) targetInfo.attributes.Add (new NtlmAttributeTimestampValuePair (timestamp.Attribute, timestamp.Value, timestamp.Size)); else if (attribute is NtlmAttributeFlagsValuePair flags) targetInfo.attributes.Add (new NtlmAttributeFlagsValuePair (flags.Attribute, flags.Value, flags.Size)); else if (attribute is NtlmAttributeByteArrayValuePair array) targetInfo.attributes.Add (new NtlmAttributeByteArrayValuePair (array.Attribute, array.Value)); else if (attribute is NtlmAttributeStringValuePair str) targetInfo.attributes.Add (new NtlmAttributeStringValuePair (str.Attribute, str.Value)); } } internal NtlmAttributeValuePair? GetAvPair (NtlmAttribute attr) { for (int i = 0; i < attributes.Count; i++) { if (attributes[i].Attribute == attr) return attributes[i]; } return null; } string? GetAvPairString (NtlmAttribute attr) { return ((NtlmAttributeStringValuePair?) GetAvPair (attr))?.Value; } void SetAvPairString (NtlmAttribute attr, string? value) { var pair = (NtlmAttributeStringValuePair?) GetAvPair (attr); if (pair == null) { if (value != null) attributes.Add (new NtlmAttributeStringValuePair (attr, value)); } else if (value != null) { pair.Value = value; } else { attributes.Remove (pair); } } byte[]? GetAvPairByteArray (NtlmAttribute attr) { return ((NtlmAttributeByteArrayValuePair?) GetAvPair (attr))?.Value; } void SetAvPairByteArray (NtlmAttribute attr, byte[]? value) { var pair = (NtlmAttributeByteArrayValuePair?) GetAvPair (attr); if (pair == null) { if (value != null) attributes.Add (new NtlmAttributeByteArrayValuePair (attr, value)); } else if (value != null) { pair.Value = value; } else { attributes.Remove (pair); } } /// /// Get or set the server's NetBIOS computer name. /// /// /// Gets or sets the server's NetBIOS computer name. /// /// The server's NetBIOS computer name if available; otherwise, . public string? ServerName { get { return GetAvPairString (NtlmAttribute.ServerName); } set { SetAvPairString (NtlmAttribute.ServerName, value); } } /// /// Get or set the server's NetBIOS domain name. /// /// /// Gets or sets the server's NetBIOS domain name. /// /// The server's NetBIOS domain name if available; otherwise, . public string? DomainName { get { return GetAvPairString (NtlmAttribute.DomainName); } set { SetAvPairString (NtlmAttribute.DomainName, value); } } /// /// Get or set the fully qualified domain name (FQDN) of the server. /// /// /// Gets or sets the fully qualified domain name (FQDN) of the server. /// /// The fully qualified domain name (FQDN) of the server if available; otherwise, . public string? DnsServerName { get { return GetAvPairString (NtlmAttribute.DnsServerName); } set { SetAvPairString (NtlmAttribute.DnsServerName, value); } } /// /// Get or set the fully qualified domain name (FQDN) of the domain. /// /// /// Gets or sets the fully qualified domain name (FQDN) of the domain. /// /// The fully qualified domain name (FQDN) of the domain if available; otherwise, . public string? DnsDomainName { get { return GetAvPairString (NtlmAttribute.DnsDomainName); } set { SetAvPairString (NtlmAttribute.DnsDomainName, value); } } /// /// Get or set the fully qualified domain name (FQDN) of the forest. /// /// /// Gets or sets the fully qualified domain name (FQDN) of the forest. /// /// The fully qualified domain name (FQDN) of the forest if available; otherwise, . public string? DnsTreeName { get { return GetAvPairString (NtlmAttribute.DnsTreeName); } set { SetAvPairString (NtlmAttribute.DnsTreeName, value); } } /// /// Get or set a 32-bit value indicating server or client configuration. /// /// /// Gets or sets a 32-bit value indicating server or client configuration. /// 0x00000001: Indicates to the client that the account authentication is constrained. /// 0x00000002: Indicates that the client is providing message integrity in the MIC field (section 2.2.1.3) in the AUTHENTICATE_MESSAGE. /// 0x00000004: Indicates that the client is providing a target SPN generated from an untrusted source. /// /// The 32-bit flags value if available; otherwise, . public int? Flags { get { return ((NtlmAttributeFlagsValuePair?) GetAvPair (NtlmAttribute.Flags))?.Value; } set { var pair = (NtlmAttributeFlagsValuePair?) GetAvPair (NtlmAttribute.Flags); if (pair == null) { if (value != null) attributes.Add (new NtlmAttributeFlagsValuePair (NtlmAttribute.Flags, value.Value)); } else if (value != null) { pair.Size = Math.Max (pair.Size, (short) (value.Value > short.MaxValue ? 4 : 2)); pair.Value = value.Value; } else { attributes.Remove (pair); } } } /// /// Get or set a timestamp that contains the server local time. /// /// /// Gets or sets a timestamp that contains the server local time. /// A FILETIME structure ([MS-DTYP] section 2.3.3) in little-endian byte order that contains /// the server local time. This structure is always sent in the CHALLENGE_MESSAGE. /// /// The local time of the server, if available; otherwise . public long? Timestamp { get { return ((NtlmAttributeTimestampValuePair?) GetAvPair (NtlmAttribute.Timestamp))?.Value; } set { var pair = (NtlmAttributeTimestampValuePair?) GetAvPair (NtlmAttribute.Timestamp); if (pair == null) { if (value != null) attributes.Add (new NtlmAttributeTimestampValuePair (NtlmAttribute.Timestamp, value.Value)); } else if (value != null) { pair.Size = Math.Max (pair.Size, (short) (value.Value > int.MaxValue ? 8 : 4)); pair.Value = value.Value; } else { attributes.Remove (pair); } } } /// /// Get or set the single host data structure. /// /// /// Gets or sets the single host data structure. /// The Value field contains a platform-specific blob, as well as a MachineID created at computer startup to identify the calling machine. /// /// The single host data structure, if available; otherwise, . public byte[]? SingleHost { get { return GetAvPairByteArray (NtlmAttribute.SingleHost); } set { SetAvPairByteArray (NtlmAttribute.SingleHost, value); } } /// /// Get or set the Service Principal Name (SPN) of the server. /// /// /// Gets or sets the Service Principal Name (SPN) of the server. /// /// The Service Principal Name (SPN) of the server, if available; otherwise, . public string? TargetName { get { return GetAvPairString (NtlmAttribute.TargetName); } set { SetAvPairString (NtlmAttribute.TargetName, value); } } /// /// Get or set the channel binding hash. /// /// /// Gets or sets the channel binding hash. /// /// An MD5 hash of the channel binding data, if available; otherwise . public byte[]? ChannelBinding { get { return GetAvPairByteArray (NtlmAttribute.ChannelBinding); } set { SetAvPairByteArray (NtlmAttribute.ChannelBinding, value); } } static byte[] DecodeByteArray (byte[] buffer, ref int index) { var length = BitConverterLE.ToInt16 (buffer, index); var value = new byte[length]; Buffer.BlockCopy (buffer, index + 2, value, 0, length); index += 2 + length; return value; } static string DecodeString (byte[] buffer, ref int index, bool unicode) { var encoding = unicode ? Encoding.Unicode : Encoding.UTF8; var length = BitConverterLE.ToInt16 (buffer, index); var value = encoding.GetString (buffer, index + 2, length); index += 2 + length; return value; } static int DecodeFlags (byte[] buffer, ref int index, out short size) { size = BitConverterLE.ToInt16 (buffer, index); int flags; index += 2; switch (size) { case 4: flags = BitConverterLE.ToInt32 (buffer, index); break; case 2: flags = BitConverterLE.ToInt16 (buffer, index); break; default: flags = 0; break; } index += size; return flags; } static long DecodeTimestamp (byte[] buffer, ref int index, out short size) { size = BitConverterLE.ToInt16 (buffer, index); long value; index += 2; switch (size) { case 8: long lo = BitConverterLE.ToUInt32 (buffer, index); long hi = BitConverterLE.ToUInt32 (buffer, index + 4); value = (hi << 32) | lo; break; case 4: value = BitConverterLE.ToUInt32 (buffer, index); break; case 2: value = BitConverterLE.ToUInt16 (buffer, index); break; default: value = 0; break; } index += size; return value; } void Decode (byte[] buffer, int startIndex, int length, bool unicode) { if (buffer == null) throw new ArgumentNullException (nameof (buffer)); if (startIndex < 0 || startIndex > buffer.Length) throw new ArgumentOutOfRangeException (nameof (startIndex)); if (length < 12 || length > (buffer.Length - startIndex)) throw new ArgumentOutOfRangeException (nameof (length)); int index = startIndex; do { var attr = (NtlmAttribute) BitConverterLE.ToInt16 (buffer, index); short size; index += 2; switch (attr) { case NtlmAttribute.EOL: index = startIndex + length; break; case NtlmAttribute.ServerName: case NtlmAttribute.DomainName: case NtlmAttribute.DnsServerName: case NtlmAttribute.DnsDomainName: case NtlmAttribute.DnsTreeName: case NtlmAttribute.TargetName: attributes.Add (new NtlmAttributeStringValuePair (attr, DecodeString (buffer, ref index, unicode))); break; case NtlmAttribute.Flags: attributes.Add (new NtlmAttributeFlagsValuePair (attr, DecodeFlags (buffer, ref index, out size), size)); break; case NtlmAttribute.Timestamp: attributes.Add (new NtlmAttributeTimestampValuePair (attr, DecodeTimestamp (buffer, ref index, out size), size)); break; default: attributes.Add (new NtlmAttributeByteArrayValuePair (attr, DecodeByteArray (buffer, ref index))); break; } } while (index < startIndex + length); } int CalculateSize (Encoding encoding) { int length = 4; foreach (var attribute in attributes) length += attribute.GetEncodedLength (encoding); return length; } /// /// Encode the TargetInfo structure. /// /// /// Encodes the TargetInfo structure. /// /// if the strings should be encoded in Unicode; otherwise, . /// The encoded TargetInfo. public byte[] Encode (bool unicode) { var encoding = unicode ? Encoding.Unicode : Encoding.UTF8; var buf = new byte[CalculateSize (encoding)]; int index = 0; foreach (var attribute in attributes) attribute.EncodeTo (encoding, buf, ref index); return buf; } } } ================================================ FILE: MailKit/Security/Ntlm/NtlmUtils.cs ================================================ // // NtlmUtils.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; using System.Text; using System.Security.Cryptography; using SSCMD5 = System.Security.Cryptography.MD5; namespace MailKit.Security.Ntlm { static class NtlmUtils { //static readonly byte[] ClientSealMagic = Encoding.ASCII.GetBytes ("session key to client-to-server sealing key magic constant"); //static readonly byte[] ServerSealMagic = Encoding.ASCII.GetBytes ("session key to server-to-client sealing key magic constant"); //static readonly byte[] ClientSignMagic = Encoding.ASCII.GetBytes ("session key to client-to-server signing key magic constant"); //static readonly byte[] ServerSignMagic = Encoding.ASCII.GetBytes ("session key to server-to-client signing key magic constant"); //static readonly byte[] SealKeySuffix40 = new byte[] { 0xe5, 0x38, 0xb0 }; //static readonly byte[] SealKeySuffix56 = new byte[] { 0xa0 }; static readonly byte[] Responserversion = new byte[] { 1 }; static readonly byte[] HiResponserversion = new byte[] { 1 }; static readonly byte[] Z0 = Array.Empty (); static readonly byte[] Z24 = new byte[24]; static readonly byte[] Z6 = new byte[6]; static readonly byte[] Z4 = new byte[4]; static readonly byte[] Z1 = new byte[1]; public static byte[] ConcatenationOf (params string[] values) { var concatenatedValue = string.Concat (values); return Encoding.Unicode.GetBytes (concatenatedValue); } public static byte[] ConcatenationOf (params byte[][] values) { int index = 0, length = 0; for (int i = 0; i < values.Length; i++) length += values[i].Length; var concatenated = new byte[length]; for (int i = 0; i < values.Length; i++) { length = values[i].Length; Buffer.BlockCopy (values[i], 0, concatenated, index, length); index += length; } return concatenated; } static byte[] MD4 (byte[] buffer) { using (var md4 = new MD4 ()) return md4.ComputeHash (buffer); } static byte[] MD4 (string password) { var unicode = Encoding.Unicode.GetBytes (password); var hash = MD4 (unicode); Array.Clear (unicode, 0, unicode.Length); return hash; } public static byte[] MD5 (byte[] buffer) { using (var md5 = SSCMD5.Create ()) return md5.ComputeHash (buffer); } public static byte[] HMACMD5 (byte[] key, params byte[][] values) { using (var md5 = new HMACMD5 (key)) { int i; for (i = 0; i < values.Length - 1; i++) md5.TransformBlock (values[i], 0, values[i].Length, null, 0); md5.TransformFinalBlock (values[i], 0, values[i].Length); return md5.Hash!; } } public static byte[] NONCE (int size) { var nonce = new byte[size]; using (var rng = RandomNumberGenerator.Create ()) rng.GetBytes (nonce); return nonce; } public static byte[] RC4K (byte[] key, byte[] message) { try { using (var rc4 = new RC4 ()) { rc4.Key = key; return rc4.TransformFinalBlock (message, 0, message.Length); } } finally { Array.Clear (key, 0, key.Length); } } #if false public static byte[] SEALKEY (NtlmFlags flags, byte[] exportedSessionKey, bool client = true) { if ((flags & NtlmFlags.NegotiateExtendedSessionSecurity) != 0) { byte[] subkey; if ((flags & NtlmFlags.Negotiate128) != 0) { subkey = exportedSessionKey; } else if ((flags & NtlmFlags.Negotiate56) != 0) { subkey = new byte[7]; Buffer.BlockCopy (exportedSessionKey, 0, subkey, 0, subkey.Length); } else { subkey = new byte[5]; Buffer.BlockCopy (exportedSessionKey, 0, subkey, 0, subkey.Length); } var magic = client ? ClientSealMagic : ServerSealMagic; var sealKey = MD5 (ConcatenationOf (subkey, magic)); if (subkey != exportedSessionKey) Array.Clear (subkey, 0, subkey.Length); return sealKey; } else if ((flags & NtlmFlags.NegotiateLanManagerKey) != 0) { byte[] suffix; int length; if ((flags & NtlmFlags.Negotiate56) != 0) { suffix = SealKeySuffix56; length = 7; } else { suffix = SealKeySuffix40; length = 5; } var sealKey = new byte[length + suffix.Length]; Buffer.BlockCopy (exportedSessionKey, 0, sealKey, 0, length); Buffer.BlockCopy (suffix, 0, sealKey, length, suffix.Length); return sealKey; } else { return exportedSessionKey; } } #endif #if false public static byte[] SIGNKEY (NtlmFlags flags, byte[] exportedSessionKey, bool client = true) { if ((flags & NtlmFlags.NegotiateExtendedSessionSecurity) != 0) { var magic = client ? ClientSignMagic : ServerSignMagic; return MD5 (ConcatenationOf (exportedSessionKey, magic)); } else { return null; } } #endif static byte[] NTOWFv2 (string domain, string userName, string password) { var hash = MD4 (password); byte[] responseKey; using (var md5 = new HMACMD5 (hash)) { var userDom = ConcatenationOf (userName.ToUpperInvariant (), domain); responseKey = md5.ComputeHash (userDom); } Array.Clear (hash, 0, hash.Length); return responseKey; } public static void ComputeNtlmV2 (NtlmChallengeMessage type2, string domain, string userName, string password, byte[] targetInfo, byte[] clientChallenge, long? time, out byte[]? ntChallengeResponse, out byte[] lmChallengeResponse, out byte[] sessionBaseKey) { if (userName.Length == 0 && password.Length == 0) { // Special case for anonymous authentication ntChallengeResponse = null; lmChallengeResponse = Z1; sessionBaseKey = Z0; return; } var timestamp = (time ?? DateTime.UtcNow.Ticks) - 504911232000000000; var responseKey = NTOWFv2 (domain, userName, password); // Note: If NTLM v2 authentication is used, the client SHOULD send the timestamp in the CHALLENGE_MESSAGE. if (type2.TargetInfo?.Timestamp != null) timestamp = type2.TargetInfo.Timestamp.Value; // Set temp to ConcatenationOf(Responserversion, HiResponserversion, Z(6), Time, ClientChallenge, Z(4), ServerName, Z(4)) var temp = ConcatenationOf (Responserversion, HiResponserversion, Z6, BitConverterLE.GetBytes (timestamp), clientChallenge, Z4, targetInfo, Z4); // Set NTProofStr to HMAC_MD5(ResponseKeyNT, ConcatenationOf(CHALLENGE_MESSAGE.ServerChallenge, temp)) var proof = HMACMD5 (responseKey, type2.ServerChallenge, temp); // Set SessionBaseKey to HMAC_MD5(ResponseKeyNT, NTProofStr) sessionBaseKey = HMACMD5 (responseKey, proof); // Set NtChallengeResponse to ConcatenationOf(NTProofStr, temp) ntChallengeResponse = ConcatenationOf (proof, temp); Array.Clear (proof, 0, proof.Length); Array.Clear (temp, 0, temp.Length); // Note: If NTLM v2 authentication is used and the CHALLENGE_MESSAGE TargetInfo field (section 2.2.1.2) has an // MsvAvTimestamp present, the client SHOULD NOT send the LmChallengeResponse and SHOULD send Z(24) instead. if (type2.TargetInfo?.Timestamp == null) { // Set LmChallengeResponse to ConcatenationOf(HMAC_MD5(ResponseKeyLM, ConcatenationOf(CHALLENGE_MESSAGE.ServerChallenge, ClientChallenge)), ClientChallenge) var hash = HMACMD5 (responseKey, type2.ServerChallenge, clientChallenge); lmChallengeResponse = ConcatenationOf (hash, clientChallenge); Array.Clear (hash, 0, hash.Length); } else { lmChallengeResponse = Z24; } Array.Clear (responseKey, 0, responseKey.Length); } } } ================================================ FILE: MailKit/Security/Ntlm/RC4.cs ================================================ // // ARC4Managed.cs: Alleged RC4(tm) compatible symmetric stream cipher // RC4 is a trademark of RSA Security // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Security.Cryptography; namespace MailKit.Security.Ntlm { // References: // a. Usenet 1994 - RC4 Algorithm revealed // http://www.qrst.de/html/dsds/rc4.htm class RC4 : SymmetricAlgorithm, ICryptoTransform { byte[] state; byte[]? key; byte x, y; bool disposed; public RC4 () : base () { state = new byte[256]; KeySizeValue = 64; } ~RC4 () { Dispose (false); } public bool CanReuseTransform { get { return false; } } public bool CanTransformMultipleBlocks { get { return true; } } public int InputBlockSize { get { return 1; } } public int OutputBlockSize { get { return 1; } } public override byte[] Key { get { if (key == null) throw new InvalidOperationException (); return (byte[]) key.Clone (); } set { if (value == null) throw new ArgumentNullException (nameof (value)); if (value.Length == 0) throw new ArgumentException ("Invalid key length.", nameof (value)); KeySizeValue = value.Length << 3; key = (byte[]) value.Clone (); KeySetup (key); } } public override ICryptoTransform CreateEncryptor (byte[] rgbKey, byte[]? rgvIV) { return new RC4 { Key = rgbKey }; } public override ICryptoTransform CreateDecryptor (byte[] rgbKey, byte[]? rgvIV) { return new RC4 { Key = rgbKey }; } public override void GenerateIV () { // not used for a stream cipher IV = Array.Empty (); } public override void GenerateKey () { key = new byte[KeySizeValue >> 3]; using (var rng = RandomNumberGenerator.Create ()) rng.GetBytes (key); KeySetup (key); } void KeySetup (byte[] key) { byte index1 = 0; byte index2 = 0; for (int counter = 0; counter < 256; counter++) state[counter] = (byte) counter; x = y = 0; for (int counter = 0; counter < 256; counter++) { index2 = (byte) (key[index1] + state[counter] + index2); // swap byte byte tmp = state[counter]; state[counter] = state[index2]; state[index2] = tmp; index1 = (byte) ((index1 + 1) % key.Length); } } static void CheckInput (byte[] inputBuffer, int inputOffset, int inputCount) { if (inputBuffer == null) throw new ArgumentNullException (nameof (inputBuffer)); if (inputOffset < 0 || inputOffset > inputBuffer.Length) throw new ArgumentOutOfRangeException (nameof (inputOffset)); if (inputCount < 0 || inputOffset > inputBuffer.Length - inputCount) throw new ArgumentOutOfRangeException (nameof (inputCount)); } public int TransformBlock (byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { CheckInput (inputBuffer, inputOffset, inputCount); // check output parameters if (outputBuffer == null) throw new ArgumentNullException (nameof (outputBuffer)); if (outputOffset < 0 || outputOffset > outputBuffer.Length - inputCount) throw new ArgumentOutOfRangeException (nameof (outputOffset)); return InternalTransformBlock (inputBuffer, inputOffset, inputCount, outputBuffer, outputOffset); } int InternalTransformBlock (byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { byte xorIndex; for (int counter = 0; counter < inputCount; counter++) { x = (byte) (x + 1); y = (byte) (state[x] + y); // swap byte byte tmp = state[x]; state[x] = state[y]; state[y] = tmp; xorIndex = (byte) (state[x] + state[y]); outputBuffer[outputOffset + counter] = (byte) (inputBuffer[inputOffset + counter] ^ state[xorIndex]); } return inputCount; } public byte[] TransformFinalBlock (byte[] inputBuffer, int inputOffset, int inputCount) { CheckInput (inputBuffer, inputOffset, inputCount); var output = new byte[inputCount]; InternalTransformBlock (inputBuffer, inputOffset, inputCount, output, 0); return output; } protected override void Dispose (bool disposing) { if (disposed) return; x = y = 0; if (key != null) Array.Clear (key, 0, key.Length); Array.Clear (state, 0, state.Length); if (disposing) key = null; disposed = true; } } } ================================================ FILE: MailKit/Security/RandomNumberGenerator.cs ================================================ // // RandomNumberGenerator.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using Windows.Security.Cryptography; namespace MailKit.Security { class RandomNumberGenerator : IDisposable { public static RandomNumberGenerator Create () { return new RandomNumberGenerator (); } public void GetBytes (byte[] bytes) { var buffer = CryptographicBuffer.GenerateRandom ((uint) bytes.Length); byte[] rand; CryptographicBuffer.CopyToByteArray (buffer, out rand); Array.Copy (rand, 0, bytes, 0, rand.Length); } public void Dispose () { } } } ================================================ FILE: MailKit/Security/SaslException.cs ================================================ // // SaslException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Security; using System.Runtime.Serialization; namespace MailKit.Security { /// /// An enumeration of the possible error codes that may be reported by a . /// /// /// An enumeration of the possible error codes that may be reported by a . /// public enum SaslErrorCode { /// /// The server's challenge was too long. /// ChallengeTooLong, /// /// The server's response contained an incomplete challenge. /// IncompleteChallenge, /// /// The server's challenge was invalid. /// InvalidChallenge, /// /// The server's response did not contain a challenge. /// MissingChallenge, /// /// The server's challenge contained an incorrect hash. /// IncorrectHash } /// /// A SASL authentication exception. /// /// /// Typically indicates an error while parsing a server's challenge token. /// #if SERIALIZABLE [Serializable] #endif public class SaslException : AuthenticationException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Deserializes a . /// /// The serialization info. /// The streaming context. [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected SaslException (SerializationInfo info, StreamingContext context) : base (info, context) { ErrorCode = (SaslErrorCode) info.GetInt32 ("ErrorCode"); Mechanism = info.GetString ("Mechanism"); } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The SASL mechanism. /// The error code. /// The error message. /// /// is . /// public SaslException (string mechanism, SaslErrorCode code, string message) : base (message) { if (mechanism == null) throw new ArgumentNullException (nameof (mechanism)); Mechanism = mechanism; ErrorCode = code; } #if SERIALIZABLE /// /// When overridden in a derived class, sets the /// with information about the exception. /// /// /// Serializes the state of the . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecurityCritical] #if NET8_0_OR_GREATER [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] #endif public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("ErrorCode", (int) ErrorCode); info.AddValue ("Mechanism", Mechanism); } #endif /// /// Gets the error code. /// /// /// Gets the error code. /// /// The error code. public SaslErrorCode ErrorCode { get; private set; } /// /// Gets the name of the SASL mechanism that had the error. /// /// /// Gets the name of the SASL mechanism that had the error. /// /// The name of the SASL mechanism. public string Mechanism { get; private set; } } } ================================================ FILE: MailKit/Security/SaslMechanism.cs ================================================ // // SaslMechanism.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using System.Security.Cryptography; using System.Diagnostics.CodeAnalysis; using System.Security.Authentication.ExtendedProtection; using MailKit.Net; namespace MailKit.Security { /// /// A SASL authentication mechanism. /// /// /// Authenticating via a SASL mechanism may be a multi-step process. /// To determine if the mechanism has completed the necessary steps /// to authentication, check the after /// each call to . /// public abstract class SaslMechanism { /// /// The supported authentication mechanisms in order of strongest to weakest. /// /// /// Used by the various clients when authenticating via SASL to determine /// which order the SASL mechanisms supported by the server should be tried. /// static readonly string[] RankedAuthenticationMechanisms; #if NET7_0_OR_GREATER static Lazy NativeNtlmSupported = new Lazy (CheckNativeNtlmSupported, LazyThreadSafetyMode.ExecutionAndPublication); static Lazy GssapiSupported = new Lazy (CheckGssapiSupported, LazyThreadSafetyMode.ExecutionAndPublication); #endif static readonly bool Md5Supported; static SaslMechanism () { try { using (var md5 = MD5.Create ()) Md5Supported = true; } catch { Md5Supported = false; } var supported = new List { "SCRAM-SHA-512", "SCRAM-SHA-256", "SCRAM-SHA-1", // Note: NTLM is considered less secure than even SCRAM-SHA-1 (even though SHA-1 is considered weak) // because it is vulnerable to replay and MitM attacks. The cryptography used by NTLM is also very // weak at this point (DES for NTLMv1 and HMAC-MD5 for NTLMv2). "NTLM" }; if (Md5Supported) { supported.Add ("DIGEST-MD5"); supported.Add ("CRAM-MD5"); } supported.Add ("PLAIN"); supported.Add ("LOGIN"); RankedAuthenticationMechanisms = supported.ToArray (); } #if NET7_0_OR_GREATER static bool CheckNativeNtlmSupported () { return SaslMechanismNegotiateBase.CheckSupported ("NTLM"); } static bool CheckGssapiSupported () { return SaslMechanismNegotiateBase.CheckSupported ("GSSAPI"); } #endif /// /// Rank authentication mechanisms in order of security. /// /// /// Ranks authentication mechanisms in order of security. /// /// The authentication mechanisms supported by the server. /// The supported authentication mechanisms in ranked order. internal static IEnumerable Rank (HashSet authenticationMechanisms) { foreach (var mechanism in RankedAuthenticationMechanisms) { if (mechanism.StartsWith ("SCRAM-SHA", StringComparison.Ordinal)) { var plus = mechanism + "-PLUS"; if (authenticationMechanisms.Contains (plus)) { // Note: If the server supports SCRAM-SHA-#-PLUS, we opt for the -PLUS variant and do not include the non-PLUS variant. yield return plus; continue; } } if (authenticationMechanisms.Contains (mechanism)) yield return mechanism; } yield break; } /// /// Initializes a new instance of the class. /// /// /// Creates a new SASL context. /// /// The user's credentials. /// /// is . /// protected SaslMechanism (NetworkCredential credentials) { if (credentials == null) throw new ArgumentNullException (nameof (credentials)); Credentials = credentials; } /// /// Initializes a new instance of the class. /// /// /// Creates a new SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// protected SaslMechanism (string userName, string password) { if (userName == null) throw new ArgumentNullException (nameof (userName)); if (password == null) throw new ArgumentNullException (nameof (password)); Credentials = new NetworkCredential (userName, password); } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the mechanism. public abstract string MechanismName { get; } /// /// Get the user's credentials. /// /// /// Gets the user's credentials. /// /// The user's credentials. public NetworkCredential Credentials { get; private set; } /// /// Get whether or not the SASL mechanism supports channel binding. /// /// /// Gets whether or not the SASL mechanism supports channel binding. /// /// if the SASL mechanism supports channel binding; otherwise, . public virtual bool SupportsChannelBinding { get { return false; } } /// /// Get whether or not the SASL mechanism supports an initial response (SASL-IR). /// /// /// Gets whether or not the SASL mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the SASL mechanism supports an initial response; otherwise, . public virtual bool SupportsInitialResponse { get { return false; } } /// /// Get or set whether the SASL mechanism has finished authenticating. /// /// /// Gets or sets whether the SASL mechanism has finished authenticating. /// /// if the SASL mechanism has finished authenticating; otherwise, . public bool IsAuthenticated { get; protected set; } /// /// Get whether or not channel-binding was negotiated by the SASL mechanism. /// /// /// Gets whether or not channel-binding has been negotiated by the SASL mechanism. /// Some SASL mechanisms, such as SCRAM-SHA1-PLUS and NTLM, are able to negotiate /// channel-bindings. /// /// if channel-binding was negotiated; otherwise, . public virtual bool NegotiatedChannelBinding { get { return false; } } /// /// Get whether or not a security layer was negotiated by the SASL mechanism. /// /// /// Gets whether or not a security layer has been negotiated by the SASL mechanism. /// Some SASL mechanisms, such as GSSAPI, are able to negotiate security layers /// such as integrity and confidentiality protection. /// /// if a security layer was negotiated; otherwise, . public virtual bool NegotiatedSecurityLayer { get { return false; } } /// /// Get or set the channel-binding context. /// /// /// Gets or sets the channel-binding context. /// /// The channel-binding context. internal IChannelBindingContext? ChannelBindingContext { get; set; } /// /// Get or set the URI of the service. /// /// /// Gets or sets the URI of the service. /// /// The URI of the service. internal Uri? Uri { get; set; } #if NET8_0_OR_GREATER /// /// Try to get a channel-binding. /// /// /// Tries to get the specified channel-binding. /// /// The kind of channel-binding desired. /// A buffer containing the channel-binding. /// if the channel-binding token was acquired; otherwise, . protected bool TryGetChannelBinding (ChannelBindingKind kind, [NotNullWhen (true)] out ChannelBinding? channelBinding) { if (ChannelBindingContext == null) { channelBinding = null; return false; } return ChannelBindingContext.TryGetChannelBinding (kind, out channelBinding); } #endif /// /// Try to get a channel-binding token. /// /// /// Tries to get the specified channel-binding. /// /// The kind of channel-binding desired. /// A buffer containing the channel-binding token. /// if the channel-binding token was acquired; otherwise, . protected bool TryGetChannelBindingToken (ChannelBindingKind kind, [NotNullWhen (true)] out byte[]? token) { if (ChannelBindingContext == null) { token = null; return false; } return ChannelBindingContext.TryGetChannelBindingToken (kind, out token); } static byte[]? Base64Decode (string? token, out int length) { byte[]? decoded = null; length = 0; if (token != null) { try { decoded = Convert.FromBase64String (token); length = decoded.Length; } catch (FormatException) { } } return decoded; } static string Base64Encode (byte[]? challenge) { if (challenge == null || challenge.Length == 0) return string.Empty; return Convert.ToBase64String (challenge); } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected abstract byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken); /// /// Decode the base64-encoded server challenge and return the next challenge response encoded in base64. /// /// /// Decodes the base64-encoded server challenge and returns the next challenge response encoded in base64. /// /// The next base64-encoded challenge response. /// The server's base64-encoded challenge token. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// public string Challenge (string? token, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested (); byte[]? decoded = Base64Decode (token?.Trim (), out int length); var challenge = Challenge (decoded, 0, length, cancellationToken); return Base64Encode (challenge); } /// /// Asynchronously parse the server's challenge token and return the next challenge response. /// /// /// Asynchronously parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected virtual Task ChallengeAsync (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { return Task.FromResult (Challenge (token, startIndex, length, cancellationToken)); } /// /// Asynchronously decode the base64-encoded server challenge and return the next challenge response encoded in base64. /// /// /// Asynchronously decodes the base64-encoded server challenge and returns the next challenge response encoded in base64. /// /// The next base64-encoded challenge response. /// The server's base64-encoded challenge token. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// public async Task ChallengeAsync (string? token, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested (); byte[]? decoded = Base64Decode (token?.Trim (), out int length); var challenge = await ChallengeAsync (decoded, 0, length, cancellationToken).ConfigureAwait (false); return Base64Encode (challenge); } /// /// Reset the state of the SASL mechanism. /// /// /// Resets the state of the SASL mechanism. /// public virtual void Reset () { IsAuthenticated = false; } /// /// Determine if the specified SASL mechanism is supported by MailKit. /// /// /// Use this method to make sure that a SASL mechanism is supported before calling /// . /// /// if the specified SASL mechanism is supported; otherwise, . /// The name of the SASL mechanism. /// /// is . /// public static bool IsSupported (string mechanism) { if (mechanism == null) throw new ArgumentNullException (nameof (mechanism)); switch (mechanism) { case "SCRAM-SHA-512-PLUS": return true; case "SCRAM-SHA-512": return true; case "SCRAM-SHA-256-PLUS": return true; case "SCRAM-SHA-256": return true; case "SCRAM-SHA-1-PLUS": return true; case "SCRAM-SHA-1": return true; case "DIGEST-MD5": return Md5Supported; case "CRAM-MD5": return Md5Supported; case "OAUTHBEARER": return true; case "XOAUTH2": return true; case "PLAIN": return true; case "LOGIN": return true; case "NTLM": return true; case "ANONYMOUS": return true; #if NET7_0_OR_GREATER case "GSSAPI": return GssapiSupported.Value; #endif default: return false; } } /// /// Create an instance of the specified SASL mechanism using the supplied credentials. /// /// /// If unsure that a particular SASL mechanism is supported, you should first call /// . /// /// An instance of the requested SASL mechanism if supported; otherwise . /// The name of the SASL mechanism. /// The text encoding to use for the credentials. /// The user's credentials. /// /// is . /// -or- /// is . /// -or- /// is . /// public static SaslMechanism? Create (string mechanism, Encoding encoding, NetworkCredential credentials) { // FIXME: This API should throw NotSupportedException rather than returning null if the mechanism is not supported. if (mechanism == null) throw new ArgumentNullException (nameof (mechanism)); if (encoding == null) throw new ArgumentNullException (nameof (encoding)); if (credentials == null) throw new ArgumentNullException (nameof (credentials)); switch (mechanism) { //case "KERBEROS_V4": return null; case "SCRAM-SHA-512-PLUS": return new SaslMechanismScramSha512Plus (credentials); case "SCRAM-SHA-512": return new SaslMechanismScramSha512 (credentials); case "SCRAM-SHA-256-PLUS": return new SaslMechanismScramSha256Plus (credentials); case "SCRAM-SHA-256": return new SaslMechanismScramSha256 (credentials); case "SCRAM-SHA-1-PLUS": return new SaslMechanismScramSha1Plus (credentials); case "SCRAM-SHA-1": return new SaslMechanismScramSha1 (credentials); case "DIGEST-MD5": return Md5Supported ? new SaslMechanismDigestMd5 (credentials) : null; case "CRAM-MD5": return Md5Supported ? new SaslMechanismCramMd5 (credentials) : null; case "OAUTHBEARER": return new SaslMechanismOAuthBearer (credentials); case "XOAUTH2": return new SaslMechanismOAuth2 (credentials); case "PLAIN": return new SaslMechanismPlain (encoding, credentials); case "LOGIN": return new SaslMechanismLogin (encoding, credentials); #if NET7_0_OR_GREATER case "GSSAPI": return GssapiSupported.Value ? new SaslMechanismGssapi (credentials) : null; case "NTLM": return NativeNtlmSupported.Value ? new SaslMechanismNtlmNative (credentials) : new SaslMechanismNtlm (credentials); #else case "NTLM": return new SaslMechanismNtlm (credentials); #endif case "ANONYMOUS": return new SaslMechanismAnonymous (encoding, credentials); default: return null; } } /// /// Create an instance of the specified SASL mechanism using the supplied credentials. /// /// /// If unsure that a particular SASL mechanism is supported, you should first call /// . /// /// An instance of the requested SASL mechanism if supported; otherwise . /// The name of the SASL mechanism. /// The user's credentials. /// /// is . /// -or- /// is . /// public static SaslMechanism? Create (string mechanism, NetworkCredential credentials) { return Create (mechanism, Encoding.UTF8, credentials); } /// /// Determine if the character is a non-ASCII space. /// /// /// This list was obtained from http://tools.ietf.org/html/rfc3454#appendix-C.1.2 /// /// if the character is a non-ASCII space; otherwise, . /// The character. static bool IsNonAsciiSpace (char c) { switch (c) { case '\u00A0': // NO-BREAK SPACE case '\u1680': // OGHAM SPACE MARK case '\u2000': // EN QUAD case '\u2001': // EM QUAD case '\u2002': // EN SPACE case '\u2003': // EM SPACE case '\u2004': // THREE-PER-EM SPACE case '\u2005': // FOUR-PER-EM SPACE case '\u2006': // SIX-PER-EM SPACE case '\u2007': // FIGURE SPACE case '\u2008': // PUNCTUATION SPACE case '\u2009': // THIN SPACE case '\u200A': // HAIR SPACE case '\u200B': // ZERO WIDTH SPACE case '\u202F': // NARROW NO-BREAK SPACE case '\u205F': // MEDIUM MATHEMATICAL SPACE case '\u3000': // IDEOGRAPHIC SPACE return true; default: return false; } } /// /// Determine if the character is commonly mapped to nothing. /// /// /// This list was obtained from http://tools.ietf.org/html/rfc3454#appendix-B.1 /// /// if the character is commonly mapped to nothing; otherwise, . /// The character. static bool IsCommonlyMappedToNothing (char c) { switch (c) { case '\u00AD': case '\u034F': case '\u1806': case '\u180B': case '\u180C': case '\u180D': case '\u200B': case '\u200C': case '\u200D': case '\u2060': case '\uFE00': case '\uFE01': case '\uFE02': case '\uFE03': case '\uFE04': case '\uFE05': case '\uFE06': case '\uFE07': case '\uFE08': case '\uFE09': case '\uFE0A': case '\uFE0B': case '\uFE0C': case '\uFE0D': case '\uFE0E': case '\uFE0F': case '\uFEFF': return true; default: return false; } } /// /// Determine if the character is prohibited. /// /// /// This list was obtained from http://tools.ietf.org/html/rfc3454#appendix-C.3 /// /// if the character is prohibited; otherwise, . /// The string. /// The character index. static bool IsProhibited (string s, int index) { int u = char.ConvertToUtf32 (s, index); // Private Use characters: http://tools.ietf.org/html/rfc3454#appendix-C.3 if ((u >= 0xE000 && u <= 0xF8FF) || (u >= 0xF0000 && u <= 0xFFFFD) || (u >= 0x100000 && u <= 0x10FFFD)) return true; // Non-character code points: http://tools.ietf.org/html/rfc3454#appendix-C.4 if ((u >= 0xFDD0 && u <= 0xFDEF) || (u >= 0xFFFE && u <= 0xFFFF) || (u >= 0x1FFFE && u <= 0x1FFFF) || (u >= 0x2FFFE && u <= 0x2FFFF) || (u >= 0x3FFFE && u <= 0x3FFFF) || (u >= 0x4FFFE && u <= 0x4FFFF) || (u >= 0x5FFFE && u <= 0x5FFFF) || (u >= 0x6FFFE && u <= 0x6FFFF) || (u >= 0x7FFFE && u <= 0x7FFFF) || (u >= 0x8FFFE && u <= 0x8FFFF) || (u >= 0x9FFFE && u <= 0x9FFFF) || (u >= 0xAFFFE && u <= 0xAFFFF) || (u >= 0xBFFFE && u <= 0xBFFFF) || (u >= 0xCFFFE && u <= 0xCFFFF) || (u >= 0xDFFFE && u <= 0xDFFFF) || (u >= 0xEFFFE && u <= 0xEFFFF) || (u >= 0xFFFFE && u <= 0xFFFFF) || (u >= 0x10FFFE && u <= 0x10FFFF)) return true; // Surrogate code points: http://tools.ietf.org/html/rfc3454#appendix-C.5 if (u >= 0xD800 && u <= 0xDFFF) return true; // Inappropriate for plain text characters: http://tools.ietf.org/html/rfc3454#appendix-C.6 switch (u) { case 0xFFF9: // INTERLINEAR ANNOTATION ANCHOR case 0xFFFA: // INTERLINEAR ANNOTATION SEPARATOR case 0xFFFB: // INTERLINEAR ANNOTATION TERMINATOR case 0xFFFC: // OBJECT REPLACEMENT CHARACTER case 0xFFFD: // REPLACEMENT CHARACTER return true; } // Inappropriate for canonical representation: http://tools.ietf.org/html/rfc3454#appendix-C.7 if (u >= 0x2FF0 && u <= 0x2FFB) return true; // Change display properties or are deprecated: http://tools.ietf.org/html/rfc3454#appendix-C.8 switch (u) { case 0x0340: // COMBINING GRAVE TONE MARK case 0x0341: // COMBINING ACUTE TONE MARK case 0x200E: // LEFT-TO-RIGHT MARK case 0x200F: // RIGHT-TO-LEFT MARK case 0x202A: // LEFT-TO-RIGHT EMBEDDING case 0x202B: // RIGHT-TO-LEFT EMBEDDING case 0x202C: // POP DIRECTIONAL FORMATTING case 0x202D: // LEFT-TO-RIGHT OVERRIDE case 0x202E: // RIGHT-TO-LEFT OVERRIDE case 0x206A: // INHIBIT SYMMETRIC SWAPPING case 0x206B: // ACTIVATE SYMMETRIC SWAPPING case 0x206C: // INHIBIT ARABIC FORM SHAPING case 0x206D: // ACTIVATE ARABIC FORM SHAPING case 0x206E: // NATIONAL DIGIT SHAPES case 0x206F: // NOMINAL DIGIT SHAPES return true; } // Tagging characters: http://tools.ietf.org/html/rfc3454#appendix-C.9 if (u == 0xE0001 || (u >= 0xE0020 && u <= 0xE007F)) return true; return false; } /// /// Prepare the user name or password string. /// /// /// Prepares a user name or password string according to the rules of rfc4013. /// /// The prepared string. /// The string to prepare. /// /// is . /// /// /// contains prohibited characters. /// public static string SaslPrep (string s) { if (s == null) throw new ArgumentNullException (nameof (s)); if (s.Length == 0) return s; var builder = new StringBuilder (s.Length); for (int i = 0; i < s.Length; i++) { if (IsNonAsciiSpace (s[i])) { // non-ASCII space characters [StringPrep, C.1.2] that can be // mapped to SPACE (U+0020). builder.Append (' '); } else if (IsCommonlyMappedToNothing (s[i])) { // the "commonly mapped to nothing" characters [StringPrep, B.1] // that can be mapped to nothing. } else if (char.IsControl (s[i])) { throw new ArgumentException ("Control characters are prohibited.", nameof (s)); } else if (IsProhibited (s, i)) { throw new ArgumentException ("One or more characters in the string are prohibited.", nameof (s)); } else { builder.Append (s[i]); } } return builder.ToString ().Normalize (NormalizationForm.FormKC); } internal static string GenerateEntropy (int n) { var entropy = new byte[n]; using (var rng = RandomNumberGenerator.Create ()) rng.GetBytes (entropy); return Convert.ToBase64String (entropy); } } } ================================================ FILE: MailKit/Security/SaslMechanismAnonymous.cs ================================================ // // SaslMechanismAnonymous.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Text; using System.Threading; namespace MailKit.Security { /// /// The ANONYMOUS SASL mechanism. /// /// /// The ANONYMOUS SASL mechanism provides a way to authenticate with servers /// that allow anonymous access. /// public class SaslMechanismAnonymous : SaslMechanism { readonly Encoding encoding; /// /// Initializes a new instance of the class. /// /// /// Creates a new ANONYMOUS SASL context. /// /// The encoding to use for the user's credentials. /// The user's credentials. /// /// is . /// -or- /// is . /// public SaslMechanismAnonymous (Encoding encoding, NetworkCredential credentials) : base (credentials) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); this.encoding = encoding; } /// /// Initializes a new instance of the class. /// /// /// Creates a new ANONYMOUS SASL context. /// /// The encoding to use for the user's credentials. /// The user name. /// /// is . /// -or- /// is . /// public SaslMechanismAnonymous (Encoding encoding, string userName) : base (userName, string.Empty) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); this.encoding = encoding; } /// /// Initializes a new instance of the class. /// /// /// Creates a new ANONYMOUS SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismAnonymous (NetworkCredential credentials) : this (Encoding.UTF8, credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new ANONYMOUS SASL context. /// /// The user name. /// /// is . /// public SaslMechanismAnonymous (string userName) : this (Encoding.UTF8, userName) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "ANONYMOUS"; } } /// /// Get whether or not the mechanism supports an initial response (SASL-IR). /// /// /// Gets whether or not the mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the mechanism supports an initial response; otherwise, . public override bool SupportsInitialResponse { get { return true; } } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (IsAuthenticated) return null; var buffer = encoding.GetBytes (Credentials.UserName); IsAuthenticated = true; return buffer; } } } ================================================ FILE: MailKit/Security/SaslMechanismCramMd5.cs ================================================ // // SaslMechanismCramMd5.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Text; using System.Threading; using System.Security.Cryptography; namespace MailKit.Security { /// /// The CRAM-MD5 SASL mechanism. /// /// /// A SASL mechanism based on HMAC-MD5. /// public class SaslMechanismCramMd5 : SaslMechanism { static readonly byte[] HexAlphabet = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // '0' -> '7' 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // '8' -> 'f' }; /// /// Initializes a new instance of the class. /// /// /// Creates a new CRAM-MD5 SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismCramMd5 (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new CRAM-MD5 SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismCramMd5 (string userName, string password) : base (userName, password) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "CRAM-MD5"; } } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (token == null) throw new NotSupportedException ("CRAM-MD5 does not support SASL-IR."); if (IsAuthenticated) return null; var userName = Encoding.UTF8.GetBytes (Credentials.UserName); var password = Encoding.UTF8.GetBytes (Credentials.Password); var ipad = new byte[64]; var opad = new byte[64]; byte[] digest, passwd; if (password.Length > 64) { using (var md5 = MD5.Create ()) passwd = md5.ComputeHash (password); } else { passwd = password; } Array.Copy (passwd, ipad, passwd.Length); Array.Copy (passwd, opad, passwd.Length); Array.Clear (password, 0, password.Length); for (int i = 0; i < 64; i++) { ipad[i] ^= 0x36; opad[i] ^= 0x5c; } using (var md5 = MD5.Create ()) { md5.TransformBlock (ipad, 0, ipad.Length, null, 0); md5.TransformFinalBlock (token, startIndex, length); digest = md5.Hash!; } using (var md5 = MD5.Create ()) { md5.TransformBlock (opad, 0, opad.Length, null, 0); md5.TransformFinalBlock (digest, 0, digest.Length); digest = md5.Hash!; } var buffer = new byte[userName.Length + 1 + (digest.Length * 2)]; int offset = 0; for (int i = 0; i < userName.Length; i++) buffer[offset++] = userName[i]; buffer[offset++] = 0x20; for (int i = 0; i < digest.Length; i++) { byte c = digest[i]; buffer[offset++] = HexAlphabet[(c >> 4) & 0x0f]; buffer[offset++] = HexAlphabet[c & 0x0f]; } IsAuthenticated = true; return buffer; } } } ================================================ FILE: MailKit/Security/SaslMechanismDigestMd5.cs ================================================ // // SaslMechanismDigestMd5.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Text; using System.Threading; using System.Globalization; using System.Collections.Generic; using System.Security.Cryptography; using System.Diagnostics.CodeAnalysis; using MimeKit.Utils; namespace MailKit.Security { /// /// The DIGEST-MD5 SASL mechanism. /// /// /// Unlike the PLAIN and LOGIN SASL mechanisms, the DIGEST-MD5 mechanism /// provides some level of protection and should be relatively safe to /// use even with a clear-text connection. /// public class SaslMechanismDigestMd5 : SaslMechanism { enum LoginState { Auth, Final } DigestChallenge? challenge; DigestResponse? response; internal string? cnonce; Encoding? encoding; LoginState state; /// /// Initializes a new instance of the class. /// /// /// Creates a new DIGEST-MD5 SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismDigestMd5 (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new DIGEST-MD5 SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismDigestMd5 (string userName, string password) : base (userName, password) { } /// /// Get or set the authorization identifier. /// /// /// The authorization identifier is the desired user account that the server should use /// for all accesses. This is separate from the user name used for authentication. /// /// The authorization identifier. public string? AuthorizationId { get; set; } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "DIGEST-MD5"; } } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (IsAuthenticated) return null; if (Uri is null) throw new InvalidOperationException (); switch (state) { case LoginState.Auth: if (token == null) throw new NotSupportedException ("DIGEST-MD5 does not support SASL-IR."); if (token.Length > 2048) throw new SaslException (MechanismName, SaslErrorCode.ChallengeTooLong, "Server challenge too long."); challenge = DigestChallenge.Parse (Encoding.UTF8.GetString (token, startIndex, length)); encoding = challenge.Charset != null ? Encoding.UTF8 : TextEncodings.Latin1; cnonce ??= GenerateEntropy (15); response = new DigestResponse (challenge, encoding, Uri.Scheme, Uri.DnsSafeHost, AuthorizationId, Credentials.UserName, Credentials.Password, cnonce); state = LoginState.Final; return response.Encode (encoding); case LoginState.Final: if (token == null || token.Length == 0) throw new SaslException (MechanismName, SaslErrorCode.MissingChallenge, "Server response did not contain any authentication data."); var text = encoding!.GetString (token, startIndex, length); string? key, value; if (!DigestChallenge.TryParseKeyValuePair (text, out key, out value)) throw new SaslException (MechanismName, SaslErrorCode.IncompleteChallenge, "Server response contained incomplete authentication data."); if (!key.Equals ("rspauth", StringComparison.OrdinalIgnoreCase)) throw new SaslException (MechanismName, SaslErrorCode.InvalidChallenge, "Server response contained invalid data."); var expected = response!.ComputeHash (encoding, Credentials.Password, false); if (value != expected) throw new SaslException (MechanismName, SaslErrorCode.IncorrectHash, "Server response did not contain the expected hash."); IsAuthenticated = true; break; } return null; } /// /// Reset the state of the SASL mechanism. /// /// /// Resets the state of the SASL mechanism. /// public override void Reset () { state = LoginState.Auth; challenge = null; response = null; cnonce = null; base.Reset (); } } class DigestChallenge { public string[]? Realms { get; private set; } public string? Nonce { get; private set; } public HashSet Qop { get; private set; } public bool? Stale { get; private set; } public int? MaxBuf { get; private set; } public string? Charset { get; private set; } public string? Algorithm { get; private set; } public HashSet Ciphers { get; private set; } DigestChallenge (string nonce, string? algorithm, string? charset, string[]? ciphers, string[]? realms, string[]? qop, bool? stale, int? maxbuf) { Ciphers = ciphers != null ? new HashSet (ciphers, StringComparer.Ordinal) : new HashSet (StringComparer.Ordinal); Qop = qop != null ? new HashSet (qop, StringComparer.Ordinal) : new HashSet (StringComparer.Ordinal); Algorithm = algorithm; Charset = charset; MaxBuf = maxbuf; Realms = realms; Nonce = nonce; Stale = stale; } static bool SkipWhiteSpace (string text, ref int index) { int startIndex = index; while (index < text.Length && char.IsWhiteSpace (text[index])) index++; return index > startIndex; } static string GetKey (string text, ref int index) { int startIndex = index; while (index < text.Length && !char.IsWhiteSpace (text[index]) && text[index] != '=' && text[index] != ',') index++; return text.Substring (startIndex, index - startIndex); } static bool TryParseQuoted (string text, ref int index, [NotNullWhen (true)] out string? value) { var builder = new StringBuilder (); bool escaped = false; value = null; // skip over leading '"' index++; while (index < text.Length) { if (text[index] == '\\') { if (escaped) builder.Append (text[index]); escaped = !escaped; } else if (!escaped) { if (text[index] == '"') break; builder.Append (text[index]); } else { escaped = false; } index++; } if (index >= text.Length || text[index] != '"') return false; index++; value = builder.ToString (); return true; } static bool TryParseValue (string text, ref int index, [NotNullWhen (true)] out string? value) { if (text[index] == '"') return TryParseQuoted (text, ref index, out value); int startIndex = index; while (index < text.Length && !char.IsWhiteSpace (text[index]) && text[index] != ',') index++; value = text.Substring (startIndex, index - startIndex); return true; } static bool TryParseKeyValuePair (string text, ref int index, [NotNullWhen (true)] out string? key, [NotNullWhen (true)] out string? value) { value = null; key = GetKey (text, ref index); SkipWhiteSpace (text, ref index); if (index >= text.Length || text[index] != '=') return false; // skip over '=' index++; SkipWhiteSpace (text, ref index); if (index >= text.Length) return false; return TryParseValue (text, ref index, out value); } public static bool TryParseKeyValuePair (string text, [NotNullWhen (true)] out string? key, [NotNullWhen (true)] out string? value) { int index = 0; value = null; key = null; SkipWhiteSpace (text, ref index); if (index >= text.Length || !TryParseKeyValuePair (text, ref index, out key, out value)) return false; return true; } static readonly char[] Comma = new char[] { ',' }; public static DigestChallenge Parse (string token) { string[]? realms = null, qop = null, ciphers = null; string? algorithm = null; string? charset = null; string? nonce = null; bool? stale = null; int maxbuf = -1; int index = 0; SkipWhiteSpace (token, ref index); while (index < token.Length) { if (!TryParseKeyValuePair (token, ref index, out var key, out var value)) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); switch (key.ToLowerInvariant ()) { case "realm": if (realms != null) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); realms = value.Split (Comma, StringSplitOptions.RemoveEmptyEntries); break; case "nonce": if (nonce != null) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); nonce = value; break; case "qop": if (qop != null) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); qop = value.Split (Comma, StringSplitOptions.RemoveEmptyEntries); break; case "stale": if (stale.HasValue) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); stale = value.Equals ("true", StringComparison.OrdinalIgnoreCase); break; case "maxbuf": if (maxbuf != -1 || !int.TryParse (value, NumberStyles.None, CultureInfo.InvariantCulture, out maxbuf)) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); break; case "charset": if (charset != null || !value.Equals ("utf-8", StringComparison.OrdinalIgnoreCase)) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); charset = "utf-8"; break; case "algorithm": if (algorithm != null) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); algorithm = value; break; case "cipher": if (ciphers != null) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); ciphers = value.Split (Comma, StringSplitOptions.RemoveEmptyEntries); break; } SkipWhiteSpace (token, ref index); if (index < token.Length && token[index] == ',') { index++; SkipWhiteSpace (token, ref index); } } if (nonce == null) throw new SaslException ("DIGEST-MD5", SaslErrorCode.InvalidChallenge, string.Format ("Invalid SASL challenge from the server: {0}", token)); return new DigestChallenge (nonce, algorithm, charset, ciphers, realms, qop, stale, maxbuf != -1 ? maxbuf : null); } } class DigestResponse { public string UserName { get; private set; } public string Realm { get; private set; } public string? Nonce { get; private set; } public string CNonce { get; private set; } public int Nc { get; private set; } public string Qop { get; private set; } public string DigestUri { get; private set; } public string Response { get; private set; } public int? MaxBuf { get; private set; } public string? Charset { get; private set; } public string? Algorithm { get; private set; } public string? Cipher { get; private set; } public string? AuthZid { get; private set; } public DigestResponse (DigestChallenge challenge, Encoding encoding, string protocol, string hostName, string? authzid, string userName, string password, string cnonce) { UserName = userName; if (challenge.Realms != null && challenge.Realms.Length > 0) Realm = challenge.Realms[0]; else Realm = string.Empty; Nonce = challenge.Nonce; CNonce = cnonce; Nc = 1; // FIXME: make sure this is supported Qop = "auth"; DigestUri = string.Format ("{0}/{1}", protocol, hostName); Algorithm = challenge.Algorithm; Charset = challenge.Charset; MaxBuf = challenge.MaxBuf; AuthZid = authzid; Cipher = null; Response = ComputeHash (encoding, password, true); } static string HexEncode (byte[] digest) { var hex = new StringBuilder (); for (int i = 0; i < digest.Length; i++) hex.Append (digest[i].ToString ("x2")); return hex.ToString (); } public string ComputeHash (Encoding encoding, string password, bool client) { string text, a1, a2; byte[] buf, digest; // compute A1 text = string.Format ("{0}:{1}:{2}", UserName, Realm, password); buf = encoding.GetBytes (text); using (var md5 = MD5.Create ()) digest = md5.ComputeHash (buf); using (var md5 = MD5.Create ()) { md5.TransformBlock (digest, 0, digest.Length, null, 0); text = string.Format (":{0}:{1}", Nonce, CNonce); if (!string.IsNullOrEmpty (AuthZid)) text += ":" + AuthZid; buf = encoding.GetBytes (text); md5.TransformFinalBlock (buf, 0, buf.Length); a1 = HexEncode (md5.Hash!); } // compute A2 text = client ? "AUTHENTICATE:" : ":"; text += DigestUri; if (Qop == "auth-int" || Qop == "auth-conf") text += ":00000000000000000000000000000000"; buf = encoding.GetBytes (text); using (var md5 = MD5.Create ()) digest = md5.ComputeHash (buf); a2 = HexEncode (digest); // compute KD text = string.Format ("{0}:{1}:{2:x8}:{3}:{4}:{5}", a1, Nonce, Nc, CNonce, Qop, a2); buf = encoding.GetBytes (text); using (var md5 = MD5.Create ()) digest = md5.ComputeHash (buf); return HexEncode (digest); } public byte[] Encode (Encoding encoding) { var builder = new StringBuilder (); builder.Append ("username="); MimeUtils.AppendQuoted (builder, UserName); builder.AppendFormat (",realm=\"{0}\"", Realm); builder.AppendFormat (",nonce=\"{0}\"", Nonce); builder.AppendFormat (",cnonce=\"{0}\"", CNonce); builder.AppendFormat (",nc={0:x8}", Nc); builder.AppendFormat (",qop=\"{0}\"", Qop); builder.AppendFormat (",digest-uri=\"{0}\"", DigestUri); builder.AppendFormat (",response={0}", Response); if (MaxBuf.HasValue) builder.AppendFormat (CultureInfo.InvariantCulture, ",maxbuf={0}", MaxBuf.Value); if (!string.IsNullOrEmpty (Charset)) builder.AppendFormat (",charset={0}", Charset); if (!string.IsNullOrEmpty (Algorithm)) builder.AppendFormat (",algorithm={0}", Algorithm); if (!string.IsNullOrEmpty (Cipher)) builder.AppendFormat (",cipher=\"{0}\"", Cipher); if (!string.IsNullOrEmpty (AuthZid)) builder.AppendFormat (",authzid=\"{0}\"", AuthZid); return encoding.GetBytes (builder.ToString ()); } } } ================================================ FILE: MailKit/Security/SaslMechanismGssapi.cs ================================================ // // SaslMechanismGssapi.cs // // Authors: Roman Konecny // Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET7_0_OR_GREATER using System; using System.Net; using System.Net.Security; namespace MailKit.Security { /// /// A SASL mechanism that uses the Kerberos/GSSAPI protocol. /// /// /// Implements the GSSAPI for KERBEROS SASL mechanism. /// public class SaslMechanismGssapi : SaslMechanismNegotiateBase { /// /// Initializes a new instance of the class. /// /// /// Creates a new GSSAPI SASL context using the default network credentials. /// public SaslMechanismGssapi () : this (CredentialCache.DefaultNetworkCredentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new GSSAPI SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismGssapi (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new GSSAPI SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismGssapi (string userName, string password) : base (userName, password) { } /// /// Get the name of the authentication mechanism. /// /// /// Gets the name of the authentication mechanism. /// This value MUST be one of the following: "NTLM", "Kerberos" or "Negotiate". /// /// The name of the authentication mechanism. protected override string AuthMechanism { get { return "Kerberos"; } } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "GSSAPI"; } } /// /// Get whether or not the SASL mechanism supports negotiating a security layer. /// /// /// Gets whether or not the SASL mechanism supports negotiating a security layer. /// /// if the SASL mechanism supports negotiating a security layer; otherwise, . protected override bool SupportsSecurityLayer { get { return true; } } /// /// Get the required protection level. /// /// /// Gets the required protection level. /// /// The required protection level. protected override ProtectionLevel RequiredProtectionLevel { get { // Work-around for https://github.com/gssapi/gss-ntlmssp/issues/77 // GSSAPI NTLM SSP does not support gss_wrap/gss_unwrap unless confidentiality // is negotiated. if (OperatingSystem.IsLinux ()) return ProtectionLevel.EncryptAndSign; return ProtectionLevel.Sign; } } /// /// Create the . /// /// /// Creates the . /// /// The client options. protected override NegotiateAuthenticationClientOptions CreateClientOptions () { var options = base.CreateClientOptions (); if (Uri is null) throw new InvalidOperationException (); // Provide a default TargetName (the base implementation already sets the // TargetName to the ServicePrincipalName if the value was provided). options.TargetName ??= $"SMTPSVC/{Uri.Host}"; return options; } } } #endif // NET7_0_OR_GREATER ================================================ FILE: MailKit/Security/SaslMechanismLogin.cs ================================================ // // SaslMechanismLogin.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Text; using System.Threading; namespace MailKit.Security { /// /// The LOGIN SASL mechanism. /// /// /// The LOGIN SASL mechanism provides little protection over the use /// of plain-text passwords by obscuring the user name and password within /// individual base64-encoded blobs and should be avoided unless used in /// combination with an SSL or TLS connection. /// public class SaslMechanismLogin : SaslMechanism { enum LoginState { UserName, Password } readonly Encoding encoding; LoginState state; /// /// Initializes a new instance of the class. /// /// /// Creates a new LOGIN SASL context. /// /// The encoding to use for the user's credentials. /// The user's credentials. /// /// is . /// -or- /// is . /// public SaslMechanismLogin (Encoding encoding, NetworkCredential credentials) : base (credentials) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); this.encoding = encoding; } /// /// Initializes a new instance of the class. /// /// /// Creates a new LOGIN SASL context. /// /// The encoding to use for the user's credentials. /// The user name. /// The password. /// /// is . /// -or- /// is . /// -or- /// is . /// public SaslMechanismLogin (Encoding encoding, string userName, string password) : base (userName, password) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); this.encoding = encoding; } /// /// Initializes a new instance of the class. /// /// /// Creates a new LOGIN SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismLogin (NetworkCredential credentials) : this (Encoding.UTF8, credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new LOGIN SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismLogin (string userName, string password) : this (Encoding.UTF8, userName, password) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "LOGIN"; } } /// /// Get whether or not the mechanism supports an initial response (SASL-IR). /// /// /// Gets whether or not the mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the mechanism supports an initial response; otherwise, . public override bool SupportsInitialResponse { get { return false; } } /// /// Parses the server's challenge token and returns the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (IsAuthenticated) return null; byte[]? challenge = null; switch (state) { case LoginState.UserName: if (token == null) throw new NotSupportedException ("LOGIN does not support SASL-IR."); challenge = encoding.GetBytes (Credentials.UserName); state = LoginState.Password; break; case LoginState.Password: challenge = encoding.GetBytes (Credentials.Password); IsAuthenticated = true; break; } return challenge; } /// /// Resets the state of the SASL mechanism. /// /// /// Resets the state of the SASL mechanism. /// public override void Reset () { state = LoginState.UserName; base.Reset (); } } } ================================================ FILE: MailKit/Security/SaslMechanismNegotiateBase.cs ================================================ // // SaslMechanismNegotiateBase.cs // // Authors: Roman Konecny // Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET7_0_OR_GREATER using System; using System.Net; using System.Buffers; using System.Threading; using System.Net.Security; using System.Security.Authentication.ExtendedProtection; namespace MailKit.Security { /// /// The base class for .NET Core's NegotiateAuthentication-based SASL mechanisms. /// /// /// The base class for .NET Core's -based SASL mechanisms. /// public abstract class SaslMechanismNegotiateBase : SaslMechanism { static ReadOnlySpan SaslNoSecurityLayerToken => new byte[] { 1, 0, 0, 0 }; NegotiateAuthentication? negotiate; bool negotiatedChannelBinding; bool requestedChannelBinding; bool negotiatedSecurityLayer; static SaslException GetSaslException (string mechanismName, NegotiateAuthenticationStatusCode statusCode) { var errorCode = SaslErrorCode.InvalidChallenge; string message; switch (statusCode) { case NegotiateAuthenticationStatusCode.GenericFailure: message = "Operation resulted in failure but no specific error code was given."; break; case NegotiateAuthenticationStatusCode.BadBinding: message = "Channel binding mismatch between client and server."; break; case NegotiateAuthenticationStatusCode.Unsupported: message = "Unsupported authentication package was requested."; break; case NegotiateAuthenticationStatusCode.MessageAltered: message = "Message was altered and failed an integrity check validation."; break; case NegotiateAuthenticationStatusCode.ContextExpired: message = "Referenced authentication context has expired."; break; case NegotiateAuthenticationStatusCode.CredentialsExpired: message = "Authentication credentials have expired."; break; case NegotiateAuthenticationStatusCode.InvalidCredentials: message = "Consistency checks performed on the credential failed."; break; case NegotiateAuthenticationStatusCode.InvalidToken: message = "Checks performed on the authentication token failed."; break; case NegotiateAuthenticationStatusCode.UnknownCredentials: message = "The supplied credentials were not valid for context acceptance, or the credential handle did not reference any credentials."; break; case NegotiateAuthenticationStatusCode.QopNotSupported: message = "Requested protection level is not supported."; break; case NegotiateAuthenticationStatusCode.OutOfSequence: message = "Authentication token was identfied as duplicate, old, or out of expected sequence."; break; case NegotiateAuthenticationStatusCode.SecurityQosFailed: message = "Validation of RequiredProtectionLevel against negotiated protection level failed."; break; case NegotiateAuthenticationStatusCode.TargetUnknown: message = "Validation of the target name failed."; break; case NegotiateAuthenticationStatusCode.ImpersonationValidationFailed: message = "Validation of the impersonation level failed."; break; default: message = $"Failed with unknown status code {statusCode}."; break; } return new SaslException (mechanismName, errorCode, $"{mechanismName} authentication error: {message}"); } /// /// Initializes a new instance of the class. /// /// /// Creates a new -based SASL context. /// /// The user's credentials. /// /// is . /// protected SaslMechanismNegotiateBase (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new -based SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// protected SaslMechanismNegotiateBase (string userName, string password) : base (userName, password) { } /// /// Get whether or not the SASL mechanism supports an initial response (SASL-IR). /// /// /// Gets whether or not the SASL mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the SASL mechanism supports an initial response; otherwise, . public override bool SupportsInitialResponse { get { return true; } } /// /// Get the name of the authentication mechanism. /// /// /// Gets the name of the authentication mechanism. /// This value MUST be one of the following: "NTLM", "Kerberos" or "Negotiate". /// /// The name of the authentication mechanism. protected abstract string AuthMechanism { get; } /// /// Get the required protection level. /// /// /// Gets the required protection level. /// /// The required protection level. protected virtual ProtectionLevel RequiredProtectionLevel { get { return ProtectionLevel.None; } } /// /// Get whether or not the SASL mechanism supports channel binding. /// /// /// Gets whether or not the SASL mechanism supports channel binding. /// /// if the SASL mechanism supports channel binding; otherwise, . public override bool SupportsChannelBinding { get { return true; } } /// /// Get whether or not channel-binding was negotiated by the SASL mechanism. /// /// /// Gets whether or not channel-binding has been negotiated by the SASL mechanism. /// Some SASL mechanisms, such as SCRAM-SHA1-PLUS and NTLM, are able to negotiate /// channel-bindings. /// /// if channel-binding was negotiated; otherwise, . public override bool NegotiatedChannelBinding { get { return negotiatedChannelBinding; } } /// /// Get or set the desired channel-binding to be negotiated by the SASL mechanism. /// /// /// Gets or sets the desired channel-binding to be negotiated by the SASL mechanism. /// This value is optional. /// /// The type of channel-binding. public ChannelBindingKind DesiredChannelBinding { get; set; } /// /// Get whether or not the SASL mechanism supports negotiating a security layer. /// /// /// Gets whether or not the SASL mechanism supports negotiating a security layer. /// /// if the SASL mechanism supports negotiating a security layer; otherwise, . protected virtual bool SupportsSecurityLayer { get { return false; } } /// /// Get whether or not a security layer was negotiated by the SASL mechanism. /// /// /// Gets whether or not a security layer has been negotiated by the SASL mechanism. /// Some SASL mechanisms, such as GSSAPI, are able to negotiate security layers /// such as integrity and confidentiality protection. /// /// if a security layer was negotiated; otherwise, . public override bool NegotiatedSecurityLayer { get { return negotiatedSecurityLayer; } } /// /// Get or set the service principal name (SPN) of the service that the client wishes to authenticate with. /// /// /// Get or set the service principal name (SPN) of the service that the client wishes to authenticate with. /// This value is optional. /// /// The service principal name (SPN) of the service that the client wishes to authenticate with. public string? ServicePrincipalName { get; set; } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken = default) { if (!SupportsSecurityLayer && IsAuthenticated) return null; cancellationToken.ThrowIfCancellationRequested (); // On the first call, initialize the NegotiateAuthentication if needed. negotiate ??= new NegotiateAuthentication (CreateClientOptions ()); var challenge = token != null ? token.AsSpan (startIndex, length) : ReadOnlySpan.Empty; if (IsAuthenticated) { // If auth completed and another challenge was received, then the server // may be doing "correct" form of GSSAPI SASL. Validate the incoming and // produce outgoing SASL security layer negotiate message. return GetSecurityLayerNegotiationResponse (challenge); } // Calculate the challenge response. return GetChallengeResponse (challenge); } /// /// Create the . /// /// /// Creates the . /// /// The client options. protected virtual NegotiateAuthenticationClientOptions CreateClientOptions () { var options = new NegotiateAuthenticationClientOptions { RequiredProtectionLevel = RequiredProtectionLevel, Credential = Credentials, Package = AuthMechanism, }; if (DesiredChannelBinding != ChannelBindingKind.Unknown && TryGetChannelBinding (DesiredChannelBinding, out var channelBinding)) { options.Binding = channelBinding; requestedChannelBinding = true; } if (!string.IsNullOrEmpty (ServicePrincipalName)) options.TargetName = ServicePrincipalName; return options; } byte[]? GetChallengeResponse (ReadOnlySpan challenge) { var response = negotiate!.GetOutgoingBlob (challenge, out NegotiateAuthenticationStatusCode statusCode); switch (statusCode) { case NegotiateAuthenticationStatusCode.Completed: // Authentication is completed (but may receive a Security Layer negotiation challenge next). negotiatedChannelBinding = requestedChannelBinding; IsAuthenticated = true; break; case NegotiateAuthenticationStatusCode.ContinueNeeded: break; default: throw GetSaslException (MechanismName, statusCode); } return response; } // Function for SASL security layer negotiation after authorization completes. // // Returns null for failure. // // Cloned from: https://github.com/dotnet/runtime/blob/4631ecec883a90ae9c29c058eea4527f9f2cb473/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpNegotiateAuthenticationModule.cs#L107 byte[]? GetSecurityLayerNegotiationResponse (ReadOnlySpan challenge) { NegotiateAuthenticationStatusCode statusCode; byte[] input = challenge.ToArray (); Span unwrapped; statusCode = negotiate!.UnwrapInPlace (input, out int unwrappedOffset, out int unwrappedLength, out _); if (statusCode != NegotiateAuthenticationStatusCode.Completed) return null; unwrapped = input.AsSpan (unwrappedOffset, unwrappedLength); // Per RFC 2222 Section 7.2.2: // the client should then expect the server to issue a // token in a subsequent challenge. The client passes // this token to GSS_Unwrap and interprets the first // octet of cleartext as a bit-mask specifying the // security layers supported by the server and the // second through fourth octets as the maximum size // output_message to send to the server. // Section 7.2.3 // The security layer and their corresponding bit-masks // are as follows: // 1 No security layer // 2 Integrity protection // Sender calls GSS_Wrap with conf_flag set to FALSE // 4 Privacy protection // Sender calls GSS_Wrap with conf_flag set to TRUE // // Exchange 2007 and our client only support // "No security layer". We verify that the server offers // option to use no security layer and negotiate that if // possible. if (unwrapped.Length != 4 || (unwrapped[0] & 0x01) != 0x01) return null; // Continuing with RFC 2222 section 7.2.2: // The client then constructs data, with the first octet // containing the bit-mask specifying the selected security // layer, the second through fourth octets containing in // network byte order the maximum size output_message the client // is able to receive, and the remaining octets containing the // authorization identity. // // So now this constructs the "wrapped" response. // let MakeSignature figure out length of output ArrayBufferWriter writer = new ArrayBufferWriter (); statusCode = negotiate.Wrap (SaslNoSecurityLayerToken, writer, false, out _); if (statusCode != NegotiateAuthenticationStatusCode.Completed) return null; negotiatedSecurityLayer = true; return writer.WrittenSpan.ToArray (); } /// /// Reset the state of the SASL mechanism. /// /// /// Resets the state of the SASL mechanism. /// public override void Reset () { if (negotiate != null) { negotiatedChannelBinding = false; requestedChannelBinding = false; negotiatedSecurityLayer = false; negotiate.Dispose (); negotiate = null; } base.Reset (); } internal static bool CheckSupported (string mechanismName) { try { var options = new NegotiateAuthenticationClientOptions { Credential = new NetworkCredential ("username", "password"), Package = mechanismName, }; var negotiate = new NegotiateAuthentication (options); negotiate.GetOutgoingBlob (Array.Empty (), out NegotiateAuthenticationStatusCode statusCode); return statusCode == NegotiateAuthenticationStatusCode.Completed; } catch { return false; } } } } #endif // NET7_0_OR_GREATER ================================================ FILE: MailKit/Security/SaslMechanismNtlm.cs ================================================ // // SaslMechanismNtlm.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b38c36ed-2804-4868-a9ff-8dd3182128e4 using System; using System.Net; using System.Threading; using System.Security.Authentication.ExtendedProtection; using MailKit.Security.Ntlm; namespace MailKit.Security { /// /// The NTLM SASL mechanism. /// /// /// A SASL mechanism based on NTLM. /// /// NTLM is a legacy challenge-response authentication mechanism introduced by Microsoft /// in the 1990's and suffers from the following weaknesses: /// /// Pass-the-Hash Attacks: Stolen NTLM hashes can be reused without knowing the password. /// Relay Attacks: NTLM does not protect against credential forwarding. /// Cryptography: NTLMv1 relies on DES and MD4 which are both very weak. NTLMv2 relies on HMAC-MD5 /// which is better but still considered very weak by modern standards. /// /// Microsoft recommends disabling NTLM and migrating to Kerberos /// (GSSAPI) /// or modern alternatives. /// /// public class SaslMechanismNtlm : SaslMechanism { static readonly Version DefaultOSVersion; enum LoginState { Negotiate, Challenge } NtlmNegotiateMessage? negotiate; bool negotiatedChannelBinding; LoginState state; static SaslMechanismNtlm () { if (Environment.OSVersion.Platform == PlatformID.Win32NT) DefaultOSVersion = Environment.OSVersion.Version; else DefaultOSVersion = new Version (10, 0, 22000, 0); } #if NET48_OR_GREATER || NET5_0_OR_GREATER || NETSTANDARD2_0_OR_GREATER /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM SASL context using the default network credentials. /// public SaslMechanismNtlm () : this (CredentialCache.DefaultNetworkCredentials) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismNtlm (NetworkCredential credentials) : base (credentials) { OSVersion = DefaultOSVersion; Workstation = Environment.MachineName; } /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismNtlm (string userName, string password) : base (userName, password) { OSVersion = DefaultOSVersion; Workstation = Environment.MachineName; } /// /// This is only used for unit testing purposes. /// internal byte[]? Nonce { get; set; } /// /// This is only used for unit testing purposes. /// internal long? Timestamp { get; set; } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "NTLM"; } } /// /// Get whether or not the SASL mechanism supports channel binding. /// /// /// Gets whether or not the SASL mechanism supports channel binding. /// /// if the SASL mechanism supports channel binding; otherwise, . public override bool SupportsChannelBinding { get { return true; } } /// /// Get whether or not channel-binding was negotiated by the SASL mechanism. /// /// /// Gets whether or not channel-binding has been negotiated by the SASL mechanism. /// Some SASL mechanisms, such as SCRAM-SHA1-PLUS and NTLM, are able to negotiate /// channel-bindings. /// /// if channel-binding was negotiated; otherwise, . public override bool NegotiatedChannelBinding { get { return negotiatedChannelBinding; } } /// /// Get whether or not the mechanism supports an initial response (SASL-IR). /// /// /// Gets whether or not the mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the mechanism supports an initial response; otherwise, . public override bool SupportsInitialResponse { get { return true; } } /// /// Get or set a value indicating whether or not the NTLM SASL mechanism should allow channel-binding. /// /// /// Gets or sets a value indicating whether or not the NTLM SASL mechanism should allow channel-binding. /// In the future, this option will disappear as channel-binding will become the default. For now, /// it is only an option because this feature has not been thoroughly tested. /// /// if the NTLM SASL mechanism should allow channel-binding; otherwise, . public bool AllowChannelBinding { get; set; } /// /// Get or set the Windows OS version to use in the NTLM negotiation (used for debugging purposes). /// /// /// Gets or sets the Windows OS version to use in the NTLM negotiation (used for debugging purposes). /// /// The Windows OS version. public Version OSVersion { get; set; } /// /// Get or set the workstation name to use for authentication. /// /// /// Gets or sets the workstation name to use for authentication. /// /// The workstation name. public string Workstation { get; set; } /// /// Get or set the service principal name (SPN) of the service that the client wishes to authenticate with. /// /// /// Get or set the service principal name (SPN) of the service that the client wishes to authenticate with. /// This value is optional. /// /// The service principal name (SPN) of the service that the client wishes to authenticate with. public string? ServicePrincipalName { get; set; } /// /// Get or set a value indicating that the caller generated the target's SPN from an untrusted source. /// /// /// Gets or sets a value indicating that the caller generated the target's SPN from an untrusted source. /// /// if the is unverified; otherwise, . public bool IsUnverifiedServicePrincipalName { get; set; } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (IsAuthenticated) return null; string userName = Credentials.UserName; string domain = Credentials.Domain; NtlmMessageBase? message = null; if (string.IsNullOrEmpty (domain)) { int index; if ((index = userName.LastIndexOf ('@')) != -1) { domain = userName.Substring (index + 1); userName = userName.Substring (0, index); } else { if ((index = userName.IndexOf ('\\')) == -1) index = userName.IndexOf ('/'); if (index >= 0) { domain = userName.Substring (0, index); userName = userName.Substring (index + 1); } } } switch (state) { case LoginState.Negotiate: message = negotiate = new NtlmNegotiateMessage (domain, Workstation, OSVersion); state = LoginState.Challenge; break; case LoginState.Challenge: if (token == null) throw new SaslException (MechanismName, SaslErrorCode.MissingChallenge, "Server response did not contain any authentication data."); var password = Credentials.Password; message = GetChallengeResponse (domain, userName, password, token, startIndex, length); IsAuthenticated = true; break; } return message?.Encode (); } NtlmAuthenticateMessage GetChallengeResponse (string domain, string userName, string password, byte[] token, int startIndex, int length) { var challenge = new NtlmChallengeMessage (token, startIndex, length); var authenticate = new NtlmAuthenticateMessage (negotiate!, challenge, userName, password, domain, Workstation) { ClientChallenge = Nonce, Timestamp = Timestamp }; byte[]? channelBindingToken = null; if (AllowChannelBinding && challenge.TargetInfo != null) { // Only bother with attempting to channel-bind if the CHALLENGE_MESSAGE's TargetInfo is not NULL. // Not sure which channel-binding types are supported by NTLM, but I am told that supposedly the // System.Net.Mail.SmtpClient uses tls-unique, so we'll go with that... negotiatedChannelBinding = TryGetChannelBindingToken (ChannelBindingKind.Endpoint, out channelBindingToken); } authenticate.ComputeNtlmV2 (ServicePrincipalName, IsUnverifiedServicePrincipalName, channelBindingToken); if (channelBindingToken != null) Array.Clear (channelBindingToken, 0, channelBindingToken.Length); negotiate = null; return authenticate; } /// /// Reset the state of the SASL mechanism. /// /// /// Resets the state of the SASL mechanism. /// public override void Reset () { negotiatedChannelBinding = false; state = LoginState.Negotiate; negotiate = null; base.Reset (); } } } ================================================ FILE: MailKit/Security/SaslMechanismNtlmNative.cs ================================================ // // SaslMechanismNtlmNative.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET7_0_OR_GREATER using System.Net; using System.Net.Security; namespace MailKit.Security { /// /// The NTLM SASL mechanism. /// /// /// A SASL mechanism based on NTLM that uses .NET Core's class for authenticating. /// /// NTLM is a legacy challenge-response authentication mechanism introduced by Microsoft /// in the 1990's and suffers from the following weaknesses: /// /// Pass-the-Hash Attacks: Stolen NTLM hashes can be reused without knowing the password. /// Relay Attacks: NTLM does not protect against credential forwarding. /// Cryptography: NTLMv1 relies on DES and MD4 which are both very weak. NTLMv2 relies on HMAC-MD5 /// which is better but still considered very weak by modern standards. /// /// Microsoft recommends disabling NTLM and migrating to Kerberos /// (GSSAPI) /// or modern alternatives. /// /// public class SaslMechanismNtlmNative : SaslMechanismNegotiateBase { /// /// Initializes a new instance of the class. /// /// /// Creates a new SASL context using the default network credentials. /// public SaslMechanismNtlmNative () : this (CredentialCache.DefaultNetworkCredentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismNtlmNative (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new NTLM SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismNtlmNative (string userName, string password) : base (userName, password) { } /// /// Get the name of the authentication mechanism. /// /// /// Gets the name of the authentication mechanism. /// This value MUST be one of the following: "NTLM", "Kerberos" or "Negotiate". /// /// The name of the authentication mechanism. protected override string AuthMechanism { get { return MechanismName; } } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "NTLM"; } } } } #endif // NET7_0_OR_GREATER ================================================ FILE: MailKit/Security/SaslMechanismOAuth2.cs ================================================ // // SaslMechanismOAuth2.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Threading; namespace MailKit.Security { /// /// The OAuth2 SASL mechanism. /// /// /// A SASL mechanism used by Google that makes use of a short-lived /// OAuth 2.0 access token. /// /// /// /// /// public class SaslMechanismOAuth2 : SaslMechanism { const string AuthBearer = "auth=Bearer "; const string UserEquals = "user="; /// /// Initializes a new instance of the class. /// /// /// Creates a new XOAUTH2 SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismOAuth2 (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new XOAUTH2 SASL context. /// /// /// /// /// /// The user name. /// The auth token. /// /// is . /// -or- /// is . /// public SaslMechanismOAuth2 (string userName, string auth_token) : base (userName, auth_token) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "XOAUTH2"; } } /// /// Get whether or not the mechanism supports an initial response (SASL-IR). /// /// /// Gets whether or not the mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the mechanism supports an initial response; otherwise, . public override bool SupportsInitialResponse { get { return true; } } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (IsAuthenticated) return null; var authToken = Credentials.Password; var userName = Credentials.UserName; int index = 0; var buf = new byte[UserEquals.Length + userName.Length + AuthBearer.Length + authToken.Length + 3]; for (int i = 0; i < UserEquals.Length; i++) buf[index++] = (byte) UserEquals[i]; for (int i = 0; i < userName.Length; i++) buf[index++] = (byte) userName[i]; buf[index++] = 1; for (int i = 0; i < AuthBearer.Length; i++) buf[index++] = (byte) AuthBearer[i]; for (int i = 0; i < authToken.Length; i++) buf[index++] = (byte) authToken[i]; buf[index++] = 1; buf[index++] = 1; IsAuthenticated = true; return buf; } } } ================================================ FILE: MailKit/Security/SaslMechanismOAuthBearer.cs ================================================ // // SaslMechanismOAuthBearer.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Text; using System.Threading; using System.Globalization; namespace MailKit.Security { /// /// The OAuth Bearer SASL mechanism. /// /// /// A SASL mechanism that makes use of a short-lived OAuth Bearer access tokens. /// /// /// /// /// public class SaslMechanismOAuthBearer : SaslMechanism { static readonly byte[] ErrorResponse = new byte[1] { 0x01 }; const string AuthBearer = "auth=Bearer "; const string HostEquals = "host="; const string PortEquals = "port="; /// /// Initializes a new instance of the class. /// /// /// Creates a new OAUTHBEARER SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismOAuthBearer (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new OAUTHBEARER SASL context. /// /// /// /// /// /// The user name. /// The auth token. /// /// is . /// -or- /// is . /// public SaslMechanismOAuthBearer (string userName, string auth_token) : base (userName, auth_token) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "OAUTHBEARER"; } } /// /// Get whether or not the mechanism supports an initial response (SASL-IR). /// /// /// Gets whether or not the mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the mechanism supports an initial response; otherwise, . public override bool SupportsInitialResponse { get { return true; } } static int CalculateBufferSize (byte[] authzid, byte[] host, string port, string token) { int length = 0; length += 2; // channel binding ("n,") length += 2; // a= length += authzid.Length; length += 1; // ',' length++; // ^A length += HostEquals.Length; length += host.Length; length++; // ^A length += PortEquals.Length; length += port.Length; length++; // ^A length += AuthBearer.Length; length += token.Length; length += 2; // ^A^A return length; } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (IsAuthenticated) return ErrorResponse; if (Uri is null) throw new InvalidOperationException (); var authzid = Encoding.UTF8.GetBytes (Credentials.UserName); var port = Uri.Port.ToString (CultureInfo.InvariantCulture); var host = Encoding.UTF8.GetBytes (Uri.Host); var authToken = Credentials.Password; var buf = new byte[CalculateBufferSize (authzid, host, port, authToken)]; int index = 0; buf[index++] = (byte) 'n'; // channel binding not supported buf[index++] = (byte) ','; buf[index++] = (byte) 'a'; buf[index++] = (byte) '='; for (int i = 0; i < authzid.Length; i++) buf[index++] = authzid[i]; buf[index++] = (byte) ','; buf[index++] = 0x01; for (int i = 0; i < HostEquals.Length; i++) buf[index++] = (byte) HostEquals[i]; for (int i = 0; i < host.Length; i++) buf[index++] = host[i]; buf[index++] = 0x01; for (int i = 0; i < PortEquals.Length; i++) buf[index++] = (byte) PortEquals[i]; for (int i = 0; i < port.Length; i++) buf[index++] = (byte) port[i]; buf[index++] = 0x01; for (int i = 0; i < AuthBearer.Length; i++) buf[index++] = (byte) AuthBearer[i]; for (int i = 0; i < authToken.Length; i++) buf[index++] = (byte) authToken[i]; buf[index++] = 0x01; buf[index++] = 0x01; IsAuthenticated = true; return buf; } } } ================================================ FILE: MailKit/Security/SaslMechanismPlain.cs ================================================ // // SaslMechanismPlain.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Text; using System.Threading; namespace MailKit.Security { /// /// The PLAIN SASL mechanism. /// /// /// The PLAIN SASL mechanism provides little protection over the use /// of plain-text passwords by combining the user name and password and /// obscuring them within a base64-encoded blob and should be avoided /// unless used in combination with an SSL or TLS connection. /// public class SaslMechanismPlain : SaslMechanism { readonly Encoding encoding; /// /// Initializes a new instance of the class. /// /// /// Creates a new PLAIN SASL context. /// /// The encoding to use for the user's credentials. /// The user's credentials. /// /// is . /// -or- /// is . /// public SaslMechanismPlain (Encoding encoding, NetworkCredential credentials) : base (credentials) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); this.encoding = encoding; } /// /// Initializes a new instance of the class. /// /// /// Creates a new PLAIN SASL context. /// /// The encoding to use for the user's credentials. /// The user name. /// The password. /// /// is . /// -or- /// is . /// -or- /// is . /// public SaslMechanismPlain (Encoding encoding, string userName, string password) : base (userName, password) { if (encoding == null) throw new ArgumentNullException (nameof (encoding)); this.encoding = encoding; } /// /// Initializes a new instance of the class. /// /// /// Creates a new PLAIN SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismPlain (NetworkCredential credentials) : this (Encoding.UTF8, credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new PLAIN SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismPlain (string userName, string password) : this (Encoding.UTF8, userName, password) { } /// /// Get or set the authorization identifier. /// /// /// The authorization identifier is the desired user account that the server should use /// for all accesses. This is separate from the user name used for authentication. /// /// The authorization identifier. public string? AuthorizationId { get; set; } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "PLAIN"; } } /// /// Get whether or not the mechanism supports an initial response (SASL-IR). /// /// /// Gets whether or not the mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the mechanism supports an initial response; otherwise, . public override bool SupportsInitialResponse { get { return true; } } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (IsAuthenticated) return null; var authzid = encoding.GetBytes (AuthorizationId ?? string.Empty); var authcid = encoding.GetBytes (Credentials.UserName); var passwd = encoding.GetBytes (Credentials.Password); var buffer = new byte[authzid.Length + authcid.Length + passwd.Length + 2]; int offset = 0; for (int i = 0; i < authzid.Length; i++) buffer[offset++] = authzid[i]; buffer[offset++] = 0; for (int i = 0; i < authcid.Length; i++) buffer[offset++] = authcid[i]; buffer[offset++] = 0; for (int i = 0; i < passwd.Length; i++) buffer[offset++] = passwd[i]; Array.Clear (passwd, 0, passwd.Length); IsAuthenticated = true; return buffer; } } } ================================================ FILE: MailKit/Security/SaslMechanismScramBase.cs ================================================ // // SaslMechanismScramBase.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Text; using System.Threading; using System.Globalization; using System.Collections.Generic; using System.Security.Cryptography; using System.Security.Authentication.ExtendedProtection; namespace MailKit.Security { /// /// The base class for SCRAM-based SASL mechanisms. /// /// /// SCRAM-based SASL mechanisms are salted challenge/response authentication mechanisms. /// public abstract class SaslMechanismScramBase : SaslMechanism { enum LoginState { Initial, Final, Validate } ChannelBindingKind channelBindingKind; bool negotiatedChannelBinding; byte[]? channelBindingToken; internal string? cnonce; string? client, server; byte[]? salted, auth; LoginState state; /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-based SASL context. /// /// The user's credentials. /// /// is . /// protected SaslMechanismScramBase (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-based SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// protected SaslMechanismScramBase (string userName, string password) : base (userName, password) { } /// /// Get or set the authorization identifier. /// /// /// The authorization identifier is the desired user account that the server should use /// for all accesses. This is separate from the user name used for authentication. /// /// The authorization identifier. public string? AuthorizationId { get; set; } /// /// Get whether or not the mechanism supports an initial response (SASL-IR). /// /// /// Get whether or not the mechanism supports an initial response (SASL-IR). /// SASL mechanisms that support sending an initial client response to the server /// should return . /// /// if the mechanism supports an initial response; otherwise, . public override bool SupportsInitialResponse { get { return true; } } /// /// Get whether or not channel-binding was negotiated by the SASL mechanism. /// /// /// Gets whether or not channel-binding has been negotiated by the SASL mechanism. /// Some SASL mechanisms, such as SCRAM-SHA1-PLUS and NTLM, are able to negotiate /// channel-bindings. /// /// if channel-binding was negotiated; otherwise, . public override bool NegotiatedChannelBinding { get { return negotiatedChannelBinding; } } static string Normalize (string str) { var prepared = SaslPrep (str); if (prepared.Length == 0) return prepared; var builder = new StringBuilder (); for (int i = 0; i < prepared.Length; i++) { switch (prepared[i]) { case ',': builder.Append ("=2C"); break; case '=': builder.Append ("=3D"); break; default: builder.Append (prepared[i]); break; } } return builder.ToString (); } /// /// Create the HMAC context. /// /// /// Creates the HMAC context using the secret key. /// /// The HMAC context. /// The secret key. protected abstract KeyedHashAlgorithm CreateHMAC (byte[] key); /// /// Apply the HMAC keyed algorithm. /// /// /// HMAC(key, str): Apply the HMAC keyed hash algorithm (defined in /// [RFC2104]) using the octet string represented by "key" as the key /// and the octet string "str" as the input string. The size of the /// result is the hash result size for the hash function in use. For /// example, it is 20 octets for SHA-1 (see [RFC3174]). /// /// The results of the HMAC keyed algorithm. /// The key. /// The string. byte[] HMAC (byte[] key, byte[] str) { using (var hmac = CreateHMAC (key)) return hmac.ComputeHash (str); } /// /// Apply the cryptographic hash function. /// /// /// H(str): Apply the cryptographic hash function to the octet string /// "str", producing an octet string as a result. The size of the /// result depends on the hash result size for the hash function in /// use. /// /// The results of the hash. /// The string. protected abstract byte[] Hash (byte[] str); /// /// Apply the exclusive-or operation to combine two octet strings. /// /// /// Apply the exclusive-or operation to combine the octet string /// on the left of this operator with the octet string on the right of /// this operator. The length of the output and each of the two /// inputs will be the same for this use. /// /// The alpha component. /// The blue component. static void Xor (byte[] a, byte[] b) { for (int i = 0; i < a.Length; i++) a[i] = (byte) (a[i] ^ b[i]); } // Hi(str, salt, i): // // U1 := HMAC(str, salt + INT(1)) // U2 := HMAC(str, U1) // ... // Ui-1 := HMAC(str, Ui-2) // Ui := HMAC(str, Ui-1) // // Hi := U1 XOR U2 XOR ... XOR Ui // // where "i" is the iteration count, "+" is the string concatenation // operator, and INT(g) is a 4-octet encoding of the integer g, most // significant octet first. // // Hi() is, essentially, PBKDF2 [RFC2898] with HMAC() as the // pseudorandom function (PRF) and with dkLen == output length of // HMAC() == output length of H(). byte[] Hi (byte[] str, byte[] salt, int count) { using (var hmac = CreateHMAC (str)) { var salt1 = new byte[salt.Length + 4]; byte[] hi, u1; Buffer.BlockCopy (salt, 0, salt1, 0, salt.Length); salt1[salt1.Length - 1] = (byte) 1; hi = u1 = hmac.ComputeHash (salt1); for (int i = 1; i < count; i++) { var u2 = hmac.ComputeHash (u1); Xor (hi, u2); u1 = u2; } return hi; } } static Dictionary ParseServerChallenge (string challenge) { var results = new Dictionary (); foreach (var pair in challenge.Split (',')) { if (pair.Length < 2 || pair[1] != '=') continue; results.Add (pair[0], pair.Substring (2)); } return results; } static string GetChannelBindingName (ChannelBindingKind kind) { return kind == ChannelBindingKind.Endpoint ? "tls-server-end-point" : "tls-unique"; } static string GetChannelBindingInput (ChannelBindingKind kind, string? authzid) { string flag; if (kind != ChannelBindingKind.Unknown) { flag = "p=" + GetChannelBindingName (kind); } else { flag = "n"; } authzid ??= string.Empty; return flag + "," + Normalize (authzid) + ","; } /// /// Parse the server's challenge token and return the next challenge response. /// /// /// Parses the server's challenge token and returns the next challenge response. /// /// The next challenge response. /// The server's challenge token. /// The index into the token specifying where the server's challenge begins. /// The length of the server's challenge. /// The cancellation token. /// /// The SASL mechanism does not support SASL-IR. /// /// /// The operation was canceled via the cancellation token. /// /// /// An error has occurred while parsing the server's challenge token. /// protected override byte[]? Challenge (byte[]? token, int startIndex, int length, CancellationToken cancellationToken) { if (IsAuthenticated) return null; byte[] response, signature; string input; switch (state) { case LoginState.Initial: cnonce ??= GenerateEntropy (18); client = "n=" + Normalize (Credentials.UserName) + ",r=" + cnonce; // Note: RFC7677 states: // // After publication of [RFC5802], it was discovered that Transport // Layer Security (TLS) [RFC5246] does not have the expected properties // for the "tls-unique" channel binding to be secure[RFC7627]. // // Based on this, we attempt to use "tls-server-end-point" instead of "tls-unique" when available. if (SupportsChannelBinding) { if (TryGetChannelBindingToken (ChannelBindingKind.Endpoint, out channelBindingToken)) { channelBindingKind = ChannelBindingKind.Endpoint; } else if (TryGetChannelBindingToken (ChannelBindingKind.Unique, out channelBindingToken)) { channelBindingKind = ChannelBindingKind.Unique; } else { channelBindingKind = ChannelBindingKind.Unknown; } } input = GetChannelBindingInput (channelBindingKind, AuthorizationId); response = Encoding.UTF8.GetBytes (input + client); state = LoginState.Final; break; case LoginState.Final: if (token == null) throw new SaslException (MechanismName, SaslErrorCode.MissingChallenge, "Server response did not contain any authentication data."); server = Encoding.UTF8.GetString (token, startIndex, length); var tokens = ParseServerChallenge (server); string? salt, nonce, iterations; int count; if (!tokens.TryGetValue ('s', out salt)) throw new SaslException (MechanismName, SaslErrorCode.IncompleteChallenge, "Challenge did not contain a salt."); if (!tokens.TryGetValue ('r', out nonce)) throw new SaslException (MechanismName, SaslErrorCode.IncompleteChallenge, "Challenge did not contain a nonce."); if (!tokens.TryGetValue ('i', out iterations)) throw new SaslException (MechanismName, SaslErrorCode.IncompleteChallenge, "Challenge did not contain an iteration count."); if (!nonce.StartsWith (cnonce!, StringComparison.Ordinal)) throw new SaslException (MechanismName, SaslErrorCode.InvalidChallenge, "Challenge contained an invalid nonce."); if (!int.TryParse (iterations, NumberStyles.None, CultureInfo.InvariantCulture, out count) || count < 1) throw new SaslException (MechanismName, SaslErrorCode.InvalidChallenge, "Challenge contained an invalid iteration count."); var password = Encoding.UTF8.GetBytes (SaslPrep (Credentials.Password)); salted = Hi (password, Convert.FromBase64String (salt), count); Array.Clear (password, 0, password.Length); input = GetChannelBindingInput (channelBindingKind, AuthorizationId); var inputBuffer = Encoding.ASCII.GetBytes (input); string base64; if (SupportsChannelBinding && channelBindingToken != null) { var binding = new byte[inputBuffer.Length + channelBindingToken.Length]; Buffer.BlockCopy (inputBuffer, 0, binding, 0, inputBuffer.Length); Buffer.BlockCopy (channelBindingToken, 0, binding, inputBuffer.Length, channelBindingToken.Length); // Zero the channel binding token. We don't need it anymore. Array.Clear (channelBindingToken, 0, channelBindingToken.Length); channelBindingToken = null; base64 = Convert.ToBase64String (binding); } else { base64 = Convert.ToBase64String (inputBuffer); } var withoutProof = "c=" + base64 + ",r=" + nonce; auth = Encoding.UTF8.GetBytes (client + "," + server + "," + withoutProof); var key = HMAC (salted, Encoding.ASCII.GetBytes ("Client Key")); signature = HMAC (Hash (key), auth); Xor (key, signature); response = Encoding.UTF8.GetBytes (withoutProof + ",p=" + Convert.ToBase64String (key)); state = LoginState.Validate; break; case LoginState.Validate: if (token == null) throw new SaslException (MechanismName, SaslErrorCode.MissingChallenge, "Server response did not contain any authentication data."); var challenge = Encoding.UTF8.GetString (token, startIndex, length); if (!challenge.StartsWith ("v=", StringComparison.Ordinal)) throw new SaslException (MechanismName, SaslErrorCode.InvalidChallenge, "Challenge did not start with a signature."); signature = Convert.FromBase64String (challenge.Substring (2)); var serverKey = HMAC (salted!, Encoding.ASCII.GetBytes ("Server Key")); var calculated = HMAC (serverKey, auth!); if (signature.Length != calculated.Length) throw new SaslException (MechanismName, SaslErrorCode.IncorrectHash, "Challenge contained a signature with an invalid length."); for (int i = 0; i < signature.Length; i++) { if (signature[i] != calculated[i]) throw new SaslException (MechanismName, SaslErrorCode.IncorrectHash, $"Challenge contained an invalid signature. Expected: {Convert.ToBase64String (calculated)}"); } negotiatedChannelBinding = channelBindingKind != ChannelBindingKind.Unknown; IsAuthenticated = true; response = Array.Empty (); break; default: throw new IndexOutOfRangeException ("state"); } return response; } /// /// Reset the state of the SASL mechanism. /// /// /// Resets the state of the SASL mechanism. /// public override void Reset () { if (channelBindingToken != null) { Array.Clear (channelBindingToken, 0, channelBindingToken.Length); channelBindingToken = null; } channelBindingKind = ChannelBindingKind.Unknown; negotiatedChannelBinding = false; state = LoginState.Initial; client = null; server = null; salted = null; cnonce = null; auth = null; base.Reset (); } } } ================================================ FILE: MailKit/Security/SaslMechanismScramSha1.cs ================================================ // // SaslMechanismScramSha1.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Security.Cryptography; namespace MailKit.Security { /// /// The SCRAM-SHA-1 SASL mechanism. /// /// /// A salted challenge/response SASL mechanism that uses the HMAC SHA-1 algorithm. /// public class SaslMechanismScramSha1 : SaslMechanismScramBase { /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-1 SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismScramSha1 (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-1 SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismScramSha1 (string userName, string password) : base (userName, password) { } /// /// Get the name of the mechanism. /// /// /// Gets the name of the mechanism. /// /// The name of the mechanism. public override string MechanismName { get { return "SCRAM-SHA-1"; } } /// /// Create the HMAC context. /// /// /// Creates the HMAC context using the secret key. /// /// The HMAC context. /// The secret key. protected override KeyedHashAlgorithm CreateHMAC (byte[] key) { return new HMACSHA1 (key); } /// /// Apply the cryptographic hash function. /// /// /// H(str): Apply the cryptographic hash function to the octet string /// "str", producing an octet string as a result. The size of the /// result depends on the hash result size for the hash function in /// use. /// /// The results of the hash. /// The string. protected override byte[] Hash (byte[] str) { using (var sha1 = SHA1.Create ()) return sha1.ComputeHash (str); } } /// /// The SCRAM-SHA-1-PLUS SASL mechanism. /// /// /// A salted challenge/response SASL mechanism that uses the HMAC SHA-1 algorithm and Transport Layer Security (TLS) channel binding. /// public class SaslMechanismScramSha1Plus : SaslMechanismScramSha1 { /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-1-PLUS SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismScramSha1Plus (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-1-PLUS SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismScramSha1Plus (string userName, string password) : base (userName, password) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "SCRAM-SHA-1-PLUS"; } } /// /// Get whether or not the SASL mechanism supports channel binding. /// /// /// Gets whether or not the SASL mechanism supports channel binding. /// /// if the SASL mechanism supports channel binding; otherwise, . public override bool SupportsChannelBinding { get { return true; } } } } ================================================ FILE: MailKit/Security/SaslMechanismScramSha256.cs ================================================ // // SaslMechanismScramSha256.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Security.Cryptography; namespace MailKit.Security { /// /// The SCRAM-SHA-256 SASL mechanism. /// /// /// A salted challenge/response SASL mechanism that uses the HMAC SHA-256 algorithm. /// public class SaslMechanismScramSha256 : SaslMechanismScramBase { /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-256 SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismScramSha256 (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-256 SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismScramSha256 (string userName, string password) : base (userName, password) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "SCRAM-SHA-256"; } } /// /// Create the HMAC context. /// /// /// Creates the HMAC context using the secret key. /// /// The HMAC context. /// The secret key. protected override KeyedHashAlgorithm CreateHMAC (byte[] key) { return new HMACSHA256 (key); } /// /// Apply the cryptographic hash function. /// /// /// H(str): Apply the cryptographic hash function to the octet string /// "str", producing an octet string as a result. The size of the /// result depends on the hash result size for the hash function in /// use. /// /// The results of the hash. /// The string. protected override byte[] Hash (byte[] str) { using (var sha256 = SHA256.Create ()) return sha256.ComputeHash (str); } } /// /// The SCRAM-SHA-256-PLUS SASL mechanism. /// /// /// A salted challenge/response SASL mechanism that uses the HMAC SHA-256 algorithm and Transport Layer Security (TLS) channel binding. /// public class SaslMechanismScramSha256Plus : SaslMechanismScramSha256 { /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-256-PLUS SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismScramSha256Plus (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-256-PLUS SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismScramSha256Plus (string userName, string password) : base (userName, password) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "SCRAM-SHA-256-PLUS"; } } /// /// Get whether or not the SASL mechanism supports channel binding. /// /// /// Gets whether or not the SASL mechanism supports channel binding. /// /// if the SASL mechanism supports channel binding; otherwise, . public override bool SupportsChannelBinding { get { return true; } } } } ================================================ FILE: MailKit/Security/SaslMechanismScramSha512.cs ================================================ // // SaslMechanismScramSha512.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Net; using System.Security.Cryptography; namespace MailKit.Security { /// /// The SCRAM-SHA-512 SASL mechanism. /// /// /// A salted challenge/response SASL mechanism that uses the HMAC SHA-512 algorithm. /// public class SaslMechanismScramSha512 : SaslMechanismScramBase { /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-512 SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismScramSha512 (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-512 SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismScramSha512 (string userName, string password) : base (userName, password) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "SCRAM-SHA-512"; } } /// /// Create the HMAC context. /// /// /// Creates the HMAC context using the secret key. /// /// The HMAC context. /// The secret key. protected override KeyedHashAlgorithm CreateHMAC (byte[] key) { return new HMACSHA512 (key); } /// /// Apply the cryptographic hash function. /// /// /// H(str): Apply the cryptographic hash function to the octet string /// "str", producing an octet string as a result. The size of the /// result depends on the hash result size for the hash function in /// use. /// /// The results of the hash. /// The string. protected override byte[] Hash (byte[] str) { using (var sha512 = SHA512.Create ()) return sha512.ComputeHash (str); } } /// /// The SCRAM-SHA-512-PLUS SASL mechanism. /// /// /// A salted challenge/response SASL mechanism that uses the HMAC SHA-512 algorithm and Transport Layer Security (TLS) channel binding. /// public class SaslMechanismScramSha512Plus : SaslMechanismScramSha512 { /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-512-PLUS SASL context. /// /// The user's credentials. /// /// is . /// public SaslMechanismScramSha512Plus (NetworkCredential credentials) : base (credentials) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new SCRAM-SHA-512-PLUS SASL context. /// /// The user name. /// The password. /// /// is . /// -or- /// is . /// public SaslMechanismScramSha512Plus (string userName, string password) : base (userName, password) { } /// /// Get the name of the SASL mechanism. /// /// /// Gets the name of the SASL mechanism. /// /// The name of the SASL mechanism. public override string MechanismName { get { return "SCRAM-SHA-512-PLUS"; } } /// /// Get whether or not the SASL mechanism supports channel binding. /// /// /// Gets whether or not the SASL mechanism supports channel binding. /// /// if the SASL mechanism supports channel binding; otherwise, . public override bool SupportsChannelBinding { get { return true; } } } } ================================================ FILE: MailKit/Security/SecureSocketOptions.cs ================================================ // // SecureSocketOptions.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit.Security { /// /// Secure socket options. /// /// /// Provides a way of specifying the SSL and/or TLS encryption that /// should be used for a connection. /// public enum SecureSocketOptions { /// /// No SSL or TLS encryption should be used. /// None, /// /// Allow the to decide which SSL or TLS /// options to use (default). If the server does not support SSL or TLS, /// then the connection will continue without any encryption. /// Auto, /// /// The connection should use SSL or TLS encryption immediately. /// SslOnConnect, /// /// Elevates the connection to use TLS encryption immediately after /// reading the greeting and capabilities of the server. If the server /// does not support the STARTTLS extension, then the connection will /// fail and a will be thrown. /// StartTls, /// /// Elevates the connection to use TLS encryption immediately after /// reading the greeting and capabilities of the server, but only if /// the server supports the STARTTLS extension. /// StartTlsWhenAvailable, } } ================================================ FILE: MailKit/Security/SslHandshakeException.cs ================================================ // // SslHandshakeException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Linq; using System.Text; using System.Formats.Asn1; using System.Net.Security; using System.Globalization; using System.Collections.Generic; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif using System.Security.Cryptography.X509Certificates; namespace MailKit.Security { /// /// The exception that is thrown when there is an error during the SSL/TLS handshake. /// /// /// The exception that is thrown when there is an error during the SSL/TLS handshake. /// When this exception occurs, it typically means that the IMAP, POP3 or SMTP server that /// you are connecting to is using an SSL certificate that is either expired or untrusted by /// your system. /// Often times, mail servers will use self-signed certificates instead of using a certificate /// that has been signed by a trusted Certificate Authority. When your system is unable to validate /// the mail server's certificate because it is not signed by a known and trusted Certificate Authority, /// this exception will occur. /// You can work around this problem by supplying a custom /// and setting it on the client's property. /// Most likely, you'll want to compare the thumbprint of the server's certificate with a known /// value and/or prompt the user to accept the certificate (similar to what you've probably seen web /// browsers do when they encounter untrusted certificates). /// #if SERIALIZABLE [Serializable] #endif public class SslHandshakeException : Exception { const string SslHandshakeHelpLink = "https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ssl-handshake-exception"; const string DefaultMessage = "An error occurred while attempting to establish an SSL or TLS connection."; #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Creates a new from the serialized data. /// /// The serialization info. /// The streaming context. /// /// is . /// [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected SslHandshakeException (SerializationInfo info, StreamingContext context) : base (info, context) { var base64 = info.GetString ("ServerCertificate"); if (base64 != null) ServerCertificate = new X509Certificate2 (Convert.FromBase64String (base64)); base64 = info.GetString ("RootCertificateAuthority"); if (base64 != null) RootCertificateAuthority = new X509Certificate2 (Convert.FromBase64String (base64)); } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// An inner exception. public SslHandshakeException (string message, Exception innerException) : base (message, innerException) { HelpLink = SslHandshakeHelpLink; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public SslHandshakeException (string message) : base (message) { HelpLink = SslHandshakeHelpLink; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public SslHandshakeException () : base (DefaultMessage) { HelpLink = SslHandshakeHelpLink; } /// /// Get the server's SSL certificate. /// /// /// Gets the server's SSL certificate, if it is available. /// /// The server's SSL certificate. public X509Certificate? ServerCertificate { get; private set; } /// /// Get the certificate for the Root Certificate Authority. /// /// /// Gets the certificate for the Root Certificate Authority, if it is available. /// /// The Root Certificate Authority certificate. public X509Certificate? RootCertificateAuthority { get; private set; } #if SERIALIZABLE /// /// When overridden in a derived class, sets the /// with information about the exception. /// /// /// Sets the /// with information about the exception. /// /// The serialization info. /// The streaming context. /// /// is . /// [SecurityCritical] #if NET8_0_OR_GREATER [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] #endif public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); if (ServerCertificate != null) info.AddValue ("ServerCertificate", Convert.ToBase64String (ServerCertificate.GetRawCertData ())); else info.AddValue ("ServerCertificate", null, typeof (string)); if (RootCertificateAuthority != null) info.AddValue ("RootCertificateAuthority", Convert.ToBase64String (RootCertificateAuthority.GetRawCertData ())); else info.AddValue ("RootCertificateAuthority", null, typeof (string)); } #endif internal static SslHandshakeException Create (ref SslCertificateValidationInfo? validationInfo, Exception ex, bool starttls, string protocol, string host, int port, int sslPort, params int[] standardPorts) { var message = new StringBuilder (DefaultMessage); X509Certificate2? certificate = null; X509Certificate2? root = null; if (ex is AggregateException aggregate) { aggregate = aggregate.Flatten (); if (aggregate.InnerExceptions.Count == 1) ex = aggregate.InnerExceptions[0]; else ex = aggregate; } message.AppendLine (); message.AppendLine (); if (validationInfo != null) { try { int rootIndex = validationInfo.ChainElements.Count - 1; if (rootIndex > 0) { #if NET10_0_OR_GREATER root = X509CertificateLoader.LoadCertificate (validationInfo.ChainElements[rootIndex].Certificate.RawData); #else root = new X509Certificate2 (validationInfo.ChainElements[rootIndex].Certificate.RawData); #endif } if (validationInfo.Certificate != null) { #if NET10_0_OR_GREATER certificate = X509CertificateLoader.LoadCertificate (validationInfo.Certificate.RawData); #else certificate = new X509Certificate2 (validationInfo.Certificate.RawData); #endif } if ((validationInfo.SslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) != 0) { message.AppendLine ("The SSL certificate for the server was not available."); } else if ((validationInfo.SslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) != 0) { var dnsNames = GetDnsNames (certificate); if (dnsNames.Count == 1) { message.AppendLine ($"The host name ({host}) did not match the name given in the server's SSL certificate ({dnsNames.Single ()})."); } else { var formattedDnsNames = string.Join (Environment.NewLine, dnsNames.Select (dnsName => $" \u2022 {dnsName}")); message.AppendLine ($"The host name ({host}) did not match any of the names given in the server's SSL certificate:{Environment.NewLine}{formattedDnsNames}"); } } else { message.AppendLine ("The server's SSL certificate could not be validated for the following reasons:"); bool haveReason = false; for (int chainIndex = 0; chainIndex < validationInfo.ChainElements.Count; chainIndex++) { var element = validationInfo.ChainElements[chainIndex]; if (element.ChainElementStatus == null || element.ChainElementStatus.Length == 0) continue; if (chainIndex == 0) { message.AppendLine ("\u2022 The server certificate has the following errors:"); } else if (chainIndex == rootIndex) { message.AppendLine ("\u2022 The root certificate has the following errors:"); } else { message.AppendLine ("\u2022 An intermediate certificate has the following errors:"); } foreach (var status in element.ChainElementStatus) { message.Append (" \u2022 "); message.AppendLine (status.StatusInformation); } haveReason = true; } // Note: Because Mono does not include any elements in the chain (at least on macOS), we need // to find the inner-most exception and append its Message. if (!haveReason) { var innerException = ex; while (innerException.InnerException != null) innerException = innerException.InnerException; message.AppendLine ("\u2022 " + innerException.Message); } } } finally { validationInfo.Dispose (); validationInfo = null; } } else if (!starttls && standardPorts.Contains (port)) { string an = "AEHIOS".IndexOf (protocol[0]) != -1 ? "an" : "a"; message.AppendFormat (CultureInfo.InvariantCulture, "When connecting to {0} {1} service, port {2} is typically reserved for plain-text connections. If{3}", an, protocol, port, Environment.NewLine); message.AppendFormat (CultureInfo.InvariantCulture, "you intended to connect to {0} on the SSL port, try connecting to port {1} instead. Otherwise,{2}", protocol, sslPort, Environment.NewLine); message.AppendLine ("if you intended to use STARTTLS, make sure to use the following code:"); message.AppendLine (); message.AppendFormat (CultureInfo.InvariantCulture, "client.Connect (\"{0}\", {1}, SecureSocketOptions.StartTls);{2}", host, port, Environment.NewLine); } else { message.AppendLine ("This usually means that the SSL certificate presented by the server is not trusted by the system for one or more of"); message.AppendLine ("the following reasons:"); message.AppendLine (); message.AppendLine ("1. The server is using a self-signed certificate which cannot be verified."); message.AppendLine ("2. The local system is missing a Root or Intermediate certificate needed to verify the server's certificate."); message.AppendLine ("3. A Certificate Authority CRL server for one or more of the certificates in the chain is temporarily unavailable."); message.AppendLine ("4. The certificate presented by the server is expired or invalid."); message.AppendLine ("5. The set of SSL/TLS protocols supported by the client and server do not match."); if (!starttls) message.AppendLine ("6. You are trying to connect to a port which does not support SSL/TLS."); message.AppendLine (); message.AppendLine ("See " + SslHandshakeHelpLink + " for possible solutions."); } return new SslHandshakeException (message.ToString (), ex) { ServerCertificate = certificate, RootCertificateAuthority = root }; } // Adapted from Sebastian Krysmanski's https://github.com/skrysmanski/AppMotor/blob/main/src/AppMotor.Core/Certificates/SanExtensionHelpers.cs under the MIT license static IReadOnlyCollection GetDnsNames (X509Certificate2? certificate) { const string subjectAlternativeNameOid = "2.5.29.17"; var dnsNames = new SortedSet (); if (certificate == null) return dnsNames; var dnsNameInfo = certificate.GetNameInfo (X509NameType.DnsName, forIssuer: false); if (dnsNameInfo != null) dnsNames.Add (dnsNameInfo); var extension = certificate.Extensions[subjectAlternativeNameOid]; if (extension == null) return dnsNames; try { // Tag value "2" is defined by: // // dNSName [2] IA5String, // // in: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.6 var dnsNameTag = new Asn1Tag (TagClass.ContextSpecific, tagValue: 2, isConstructed: false); var asnReader = new AsnReader (extension.RawData, AsnEncodingRules.BER); var sequenceReader = asnReader.ReadSequence (Asn1Tag.Sequence); while (sequenceReader.HasData) { var tag = sequenceReader.PeekTag (); if (tag != dnsNameTag) { sequenceReader.ReadEncodedValue (); continue; } var dnsName = sequenceReader.ReadCharacterString (UniversalTagNumber.IA5String, dnsNameTag); dnsNames.Add (dnsName); } } catch { // ignore, the error message will not include subject alternative names } return dnsNames; } } sealed class SslChainElement : IDisposable { public readonly X509Certificate2 Certificate; public readonly X509ChainStatus[] ChainElementStatus; public readonly string Information; public SslChainElement (X509ChainElement element) { #if NET10_0_OR_GREATER Certificate = X509CertificateLoader.LoadCertificate (element.Certificate.RawData); #else Certificate = new X509Certificate2 (element.Certificate.RawData); #endif ChainElementStatus = element.ChainElementStatus; Information = element.Information; } public void Dispose () { Certificate.Dispose (); } } sealed class SslCertificateValidationInfo : IDisposable { public readonly List ChainElements; public readonly X509ChainStatus[] ChainStatus; public readonly SslPolicyErrors SslPolicyErrors; public readonly X509Certificate2? Certificate; public readonly string Host; public SslCertificateValidationInfo (string host, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) { #if NET10_0_OR_GREATER Certificate = certificate != null ? X509CertificateLoader.LoadCertificate (certificate.Export (X509ContentType.Cert)) : null; #else Certificate = certificate != null ? new X509Certificate2 (certificate.Export (X509ContentType.Cert)) : null; #endif ChainElements = new List (); SslPolicyErrors = sslPolicyErrors; Host = host; // Note: we need to copy the ChainElements because the chain will be destroyed if (chain != null) { ChainStatus = chain.ChainStatus; foreach (var element in chain.ChainElements) ChainElements.Add (new SslChainElement (element)); } else { ChainStatus = Array.Empty (); } } public void Dispose () { Certificate?.Dispose (); foreach (var element in ChainElements) element.Dispose (); } } } ================================================ FILE: MailKit/ServiceNotAuthenticatedException.cs ================================================ // // ServiceNotAuthenticatedException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit { /// /// The exception that is thrown when the is not authenticated. /// /// /// This exception is thrown when an operation on a service could not be completed /// due to the service not being authenticated. /// #if SERIALIZABLE [Serializable] #endif public class ServiceNotAuthenticatedException : InvalidOperationException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Deserializes a . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected ServiceNotAuthenticatedException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// The inner exception. public ServiceNotAuthenticatedException (string message, Exception innerException) : base (message, innerException) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public ServiceNotAuthenticatedException (string message) : base (message) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public ServiceNotAuthenticatedException () { } } } ================================================ FILE: MailKit/ServiceNotConnectedException.cs ================================================ // // ServiceNotConnectedException.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; #if SERIALIZABLE using System.Security; using System.Runtime.Serialization; #endif namespace MailKit { /// /// The exception that is thrown when the is not connected. /// /// /// This exception is thrown when an operation on a service could not be completed /// due to the service not being connected. /// #if SERIALIZABLE [Serializable] #endif public class ServiceNotConnectedException : InvalidOperationException { #if SERIALIZABLE /// /// Initializes a new instance of the class. /// /// /// Deserializes a . /// /// The serialization info. /// The streaming context. /// /// is . /// [SecuritySafeCritical] [Obsolete ("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.")] protected ServiceNotConnectedException (SerializationInfo info, StreamingContext context) : base (info, context) { } #endif /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. /// The inner exception. public ServiceNotConnectedException (string message, Exception innerException) : base (message, innerException) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The error message. public ServiceNotConnectedException (string message) : base (message) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// public ServiceNotConnectedException () { } } } ================================================ FILE: MailKit/SpecialFolder.cs ================================================ // // SpecialFolder.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// An enumeration of special folders. /// /// /// An enumeration of special folders. /// public enum SpecialFolder { /// /// The special folder containing an aggregate of all messages. /// All, /// /// The special folder that contains archived messages. /// Archive, /// /// The special folder that contains message drafts. /// Drafts, /// /// The special folder that contains flagged messages. /// Flagged, /// /// The special folder that contains important messages. /// Important, /// /// The special folder that contains spam messages. /// Junk, /// /// The special folder that contains sent messages. /// Sent, /// /// The special folder that contains deleted messages. /// Trash } } ================================================ FILE: MailKit/StatusItems.cs ================================================ // // StatusItems.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Status items. /// /// /// Used with /// [Flags] public enum StatusItems { /// /// No status requested. /// None = 0, /// /// Updates . /// Count = 1 << 0, /// /// Updates . /// Recent = 1 << 1, /// /// Updates . /// UidNext = 1 << 2, /// /// Updates . /// UidValidity = 1 << 3, /// /// Updates . /// Unread = 1 << 4, /// /// Updates . /// HighestModSeq = 1 << 5, /// /// Updates . /// AppendLimit = 1 << 6, /// /// Updates . /// Size = 1 << 7, /// /// Updates . /// MailboxId = 1 << 8, } } ================================================ FILE: MailKit/StoreAction.cs ================================================ // // StoreAction.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// The action to perform when storing flags, keywords, or labels. /// /// /// Used to specify whether the flags, keywords, or labels should be added, removed, or set for the message(s). /// public enum StoreAction { /// /// Add the specified flags, keywords or labels. /// Add, /// /// Remove the specified flags, keywords or labels. /// Remove, /// /// Replace the specified flags, keywords or labels. /// Set } } ================================================ FILE: MailKit/StoreFlagsRequest.cs ================================================ // // StoreFlagsRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit { /// /// A request for storing message flags and keywords. /// /// /// A request suitable for storing message flags and keywords. /// This request is designed to be used with the Store and /// StoreAsync methods. /// public class StoreFlagsRequest : IStoreFlagsRequest { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The store action to perform. /// The message flags to add, remove or set on the message. public StoreFlagsRequest (StoreAction action, MessageFlags flags) { Keywords = new HashSet (); Action = action; Flags = flags; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The store action to perform. /// The custom keywords to add, remove or set on the message. /// /// is . /// public StoreFlagsRequest (StoreAction action, IEnumerable keywords) { if (keywords == null) throw new ArgumentNullException (nameof (keywords)); Keywords = keywords as ISet ?? new HashSet (keywords); Action = action; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The store action to perform. /// The message flags to add, remove or set on the message. /// The custom keywords to add, remove or set on the message. /// /// is . /// public StoreFlagsRequest (StoreAction action, MessageFlags flags, IEnumerable keywords) { if (keywords == null) throw new ArgumentNullException (nameof (keywords)); Keywords = keywords as ISet ?? new HashSet (keywords); Action = action; Flags = flags; } /// /// Get the store action to perform. /// /// /// Gets the store action to perform. /// /// The store action. public StoreAction Action { get; private set; } /// /// Get or set the flags to add, remove or set on the message. /// /// /// Gets or sets the flags to add, remove or set on the message. /// /// The message flags. public MessageFlags Flags { get; set; } /// /// Get or set the keywords to add, remove or set on the message. /// /// /// Gets or sets the keywords to add, remove or set on the message. /// /// The keywords. public ISet Keywords { get; } /// /// Get or set whether the store operation should run silently. /// /// /// Gets or sets whether the store operation should run silently. /// Normally, when flags or keywords are changed on a message, a event is emitted. /// By setting to , this event will not be emitted as a result of this store operation. /// /// if the store operation should run silently (not emitting events for flag changes); otherwise, . public bool Silent { get; set; } /// /// Get or set a mod-sequence number that the store operation should use to decide if the flags of a message should be updated or not. /// /// /// Gets or sets a mod-sequence number that the store operation should use to decide if the flags of a message should be updated or not. /// For each message specified in the message set, the server performs the following. If the mod-sequence of every metadata item of the /// message affected by the store operation is equal to or less than the specified value, then the requested operation /// is performed. /// However, if the mod-sequence of any metadata item of the message is greater than the specified value, then the /// requested operation WILL NOT be performed. In this case, the mod-sequence attribute of the message is not updated, and the message index /// (or unique identifier in cases where or /// is used) is added to the list of /// messages that failed the UNCHANGEDSINCE test. /// The mod-sequence number can only be used if the server supports the /// feature. /// /// The mod-sequence number. public ulong? UnchangedSince { get; set; } } } ================================================ FILE: MailKit/StoreLabelsRequest.cs ================================================ // // StoreLabelsRequest.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit { /// /// A request for storing GMail-style labels. /// /// /// A request suitable for storing GMail-style labels. /// This request is designed to be used with the Store and /// StoreAsync methods. /// public class StoreLabelsRequest : IStoreLabelsRequest { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The store action to perform. public StoreLabelsRequest (StoreAction action) { Labels = new HashSet (); Action = action; } /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The store action to perform. /// The custom keywords to add, remove or set on the message. /// /// is . /// public StoreLabelsRequest (StoreAction action, IEnumerable labels) { if (labels == null) throw new ArgumentNullException (nameof (labels)); Labels = labels as ISet ?? new HashSet (labels); Action = action; } /// /// Get the store action to perform. /// /// /// Gets the store action to perform. /// /// The store action. public StoreAction Action { get; private set; } /// /// Get the GMail-style labels to add, remove or set on the message. /// /// /// Gets the GMail-style labels to add, remove or set on the message. /// /// The GMail-style labels. public ISet Labels { get; } /// /// Get or set whether the store operation should run silently. /// /// /// Gets or sets whether the store operation should run silently. /// Normally, when flags or keywords are changed on a message, a event is emitted. /// By setting to , this event will not be emitted as a result of this store operation. /// /// if the store operation should run silently (not emitting events for label changes); otherwise, . public bool Silent { get; set; } /// /// Get or set a mod-sequence number that the store operation should use to decide if the labels of a message should be updated or not. /// /// /// Gets or sets a mod-sequence number that the store operation should use to decide if the labels of a message should be updated or not. /// For each message specified in the message set, the server performs the following. If the mod-sequence of every metadata item of the /// message affected by the store operation is equal to or less than the specified value, then the requested operation /// is performed. /// However, if the mod-sequence of any metadata item of the message is greater than the specified value, then the /// requested operation WILL NOT be performed. In this case, the mod-sequence attribute of the message is not updated, and the message index /// (or unique identifier in cases where or /// is used) is added to the list of /// messages that failed the UNCHANGEDSINCE test. /// The mod-sequence number can only be used if the server supports the /// feature. /// /// The mod-sequence number. public ulong? UnchangedSince { get; set; } } } ================================================ FILE: MailKit/Telemetry.cs ================================================ // // Telemetry.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET6_0_OR_GREATER using System; using System.Diagnostics; using System.Diagnostics.Metrics; using MailKit.Net; namespace MailKit { /// /// Telemetry constants for MailKit. /// /// /// Telemetry constants for MailKit. /// public static class Telemetry { /// /// The socket-level telemetry information. /// /// /// The socket-level telemetry information. /// public static class Socket { /// /// The name of the socket-level meter. /// /// /// The name of the socket-level meter. /// public const string MeterName = "mailkit.net.socket"; /// /// The version of the socket-level meter. /// /// /// The version of the socket-level meter. /// public const string MeterVersion = "0.1"; static Meter? Meter; internal static SocketMetrics? Metrics { get; private set; } /// /// Configure socket metering. /// /// /// Configures socket metering. /// public static void Configure () { Meter ??= new Meter (MeterName, MeterVersion); Metrics ??= new SocketMetrics (Meter); } #if NET8_0_OR_GREATER /// /// Configure socket telemetry. /// /// /// Configures socket telemetry. /// /// The meter factory. /// /// is . /// public static void Configure (IMeterFactory meterFactory) { if (meterFactory is null) throw new ArgumentNullException (nameof (meterFactory)); Meter ??= meterFactory.Create (MeterName, MeterVersion); Metrics ??= new SocketMetrics (Meter); } #endif } /// /// The SmtpClient-level telemetry information. /// /// /// The SmtpClient-level telemetry information. /// public static class SmtpClient { /// /// The name of the SmtpClient activity source used for tracing. /// /// /// The name of the SmtpClient activity source used for tracing. /// public const string ActivitySourceName = "MailKit.Net.SmtpClient"; /// /// The version of the SmtpClient activity source used for tracing. /// /// /// The version of the SmtpClient activity source used for tracing. /// public const string ActivitySourceVersion = "0.1"; internal static readonly ActivitySource ActivitySource = new ActivitySource (ActivitySourceName, ActivitySourceVersion); /// /// The name of the SmtpClient meter. /// /// /// The name of the SmtpClient meter. /// public const string MeterName = "mailkit.net.smtp"; /// /// The version of the SmtpClient meter. /// /// /// The version of the SmtpClient meter. /// public const string MeterVersion = "0.1"; static Meter? Meter; internal static ClientMetrics? Metrics { get; private set; } internal static ClientMetrics CreateMetrics (Meter meter) { return new ClientMetrics (meter, MeterName, "an", "SMTP"); } /// /// Configure SmtpClient telemetry. /// /// /// Configures SmtpClient telemetry. /// public static void Configure () { Meter ??= new Meter (MeterName, MeterVersion); Metrics ??= CreateMetrics (Meter); } #if NET8_0_OR_GREATER /// /// Configure SmtpClient telemetry. /// /// /// Configures SmtpClient telemetry. /// /// The meter factory. /// /// is . /// public static void Configure (IMeterFactory meterFactory) { if (meterFactory is null) throw new ArgumentNullException (nameof (meterFactory)); Meter ??= meterFactory.Create (MeterName, MeterVersion); Metrics ??= CreateMetrics (Meter); } #endif } /// /// The Pop3Client-level telemetry information. /// /// /// The Pop3Client-level telemetry information. /// public static class Pop3Client { /// /// The name of the Pop3Client activity source used for tracing. /// /// /// The name of the Pop3Client activity source used for tracing. /// public const string ActivitySourceName = "MailKit.Net.Pop3Client"; /// /// The version of the Pop3Client activity source used for tracing. /// /// /// The version of the Pop3Client activity source used for tracing. /// public const string ActivitySourceVersion = "0.1"; internal static readonly ActivitySource ActivitySource = new ActivitySource (ActivitySourceName, ActivitySourceVersion); /// /// The name of the Pop3Client meter. /// /// /// The name of the Pop3Client meter. /// public const string MeterName = "mailkit.net.pop3"; /// /// The version of the Pop3Client meter. /// /// /// The version of the Pop3Client meter. /// public const string MeterVersion = "0.1"; static Meter? Meter; internal static ClientMetrics? Metrics { get; private set; } internal static ClientMetrics CreateMetrics (Meter meter) { return new ClientMetrics (meter, MeterName, "a", "POP3"); } /// /// Configure Pop3Client telemetry. /// /// /// Configures Pop3Client telemetry. /// public static void Configure () { Meter ??= new Meter (MeterName, MeterVersion); Metrics ??= CreateMetrics (Meter); } #if NET8_0_OR_GREATER /// /// Configure Pop3Client telemetry. /// /// /// Configures Pop3Client telemetry. /// /// The meter factory. /// /// is . /// public static void Configure (IMeterFactory meterFactory) { if (meterFactory is null) throw new ArgumentNullException (nameof (meterFactory)); Meter ??= meterFactory.Create (MeterName, MeterVersion); Metrics ??= CreateMetrics (Meter); } #endif } /// /// The ImapClient-level telemetry information. /// /// /// The ImapClient-level telemetry information. /// public static class ImapClient { /// /// The name of the ImapClient activity source used for tracing. /// /// /// The name of the ImapClient activity source used for tracing. /// public const string ActivitySourceName = "MailKit.Net.ImapClient"; /// /// The version of the ImapClient activity source used for tracing. /// /// /// The version of the ImapClient activity source used for tracing. /// public const string ActivitySourceVersion = "0.1"; internal static readonly ActivitySource ActivitySource = new ActivitySource (ActivitySourceName, ActivitySourceVersion); /// /// The name of the ImapClient meter. /// /// /// The name of the ImapClient meter. /// public const string MeterName = "mailkit.net.imap"; /// /// The version of the ImapClient meter. /// /// /// The version of the ImapClient meter. /// public const string MeterVersion = "0.1"; static Meter? Meter; internal static ClientMetrics? Metrics { get; private set; } internal static ClientMetrics CreateMetrics (Meter meter) { return new ClientMetrics (meter, MeterName, "an", "IMAP"); } /// /// Configure ImapClient telemetry. /// /// /// Configures ImapClient telemetry. /// public static void Configure () { Meter ??= new Meter (MeterName, MeterVersion); Metrics ??= CreateMetrics (Meter); } #if NET8_0_OR_GREATER /// /// Configure ImapClient telemetry. /// /// /// Configures ImapClient telemetry. /// /// The meter factory. /// /// is . /// public static void Configure (IMeterFactory meterFactory) { if (meterFactory is null) throw new ArgumentNullException (nameof (meterFactory)); Meter ??= meterFactory.Create (MeterName, MeterVersion); Metrics ??= CreateMetrics (Meter); } #endif } /// /// Configure telemetry in MailKit. /// /// /// Configures telemetry in MailKit. /// public static void Configure () { Socket.Configure (); SmtpClient.Configure (); Pop3Client.Configure (); ImapClient.Configure (); } #if NET8_0_OR_GREATER /// /// Configure telemetry in MailKit. /// /// /// Configures telemetry in MailKit. /// /// The meter factory. /// /// is . /// public static void Configure (IMeterFactory meterFactory) { if (meterFactory is null) throw new ArgumentNullException (nameof (meterFactory)); Socket.Configure (meterFactory); SmtpClient.Configure (meterFactory); Pop3Client.Configure (meterFactory); ImapClient.Configure (meterFactory); } #endif } } #endif // NET6_0_OR_GREATER ================================================ FILE: MailKit/TextEncodings.cs ================================================ // // TextEncodings.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; namespace MailKit { internal static class TextEncodings { public static readonly Encoding Latin1; public static readonly Encoding UTF8; static TextEncodings () { UTF8 = Encoding.GetEncoding (65001, new EncoderExceptionFallback (), new DecoderExceptionFallback ()); try { Latin1 = Encoding.GetEncoding (28591); } catch (NotSupportedException) { Latin1 = Encoding.ASCII; } } } } ================================================ FILE: MailKit/ThreadingAlgorithm.cs ================================================ // // ThreadingAlgorithm.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace MailKit { /// /// An enumeration of threading algorithms. /// /// /// A threading algorithm is used to group messages and their /// replies together. /// public enum ThreadingAlgorithm { /// /// Thread messages based on their Subject headers. /// OrderedSubject, /// /// Threads messages based on their References, In-Reply-To, and Message-Id headers. /// This algorithm is far better than but is also more /// expensive to calculate. /// References, } } ================================================ FILE: MailKit/UniqueId.cs ================================================ // // UniqueId.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Globalization; namespace MailKit { /// /// A unique identifier. /// /// /// Represents a unique identifier for messages in a . /// A 32-bit value assigned to each message, which when used with the /// unique identifier validity value (see below) forms a 64-bit value /// that MUST NOT refer to any other message in the mailbox or any /// subsequent mailbox with the same name forever.Unique identifiers /// are assigned in a strictly ascending fashion in the mailbox; as each /// message is added to the mailbox it is assigned a higher UID than the /// message(s) which were added previously. Unlike message sequence /// numbers, unique identifiers are not necessarily contiguous. /// The unique identifier of a message MUST NOT change during the /// session, and SHOULD NOT change between sessions. Any change of /// unique identifiers between sessions MUST be detectable using the /// UIDVALIDITY mechanism discussed below. Persistent unique identifiers /// are required for a client to resynchronize its state from a previous /// session with the server (e.g., disconnected or offline access /// clients); this is discussed further in /// [IMAP-DISC]. /// For more information about unique identifiers, see /// RFC 3501, section 2.3.1.1. /// public readonly struct UniqueId : IComparable, IEquatable { /// /// The invalid value. /// /// /// The invalid value. /// public static readonly UniqueId Invalid; /// /// The minimum value. /// /// /// The minimum value. /// public static readonly UniqueId MinValue = new UniqueId (1); /// /// The maximum value. /// /// /// The maximum value. /// public static readonly UniqueId MaxValue = new UniqueId (uint.MaxValue); readonly uint validity; readonly uint id; /// /// Initializes a new instance of the struct. /// /// /// Creates a new with the specified validity and value. /// /// The uid validity. /// The unique identifier. /// /// is 0. /// public UniqueId (uint validity, uint id) { if (id == 0) throw new ArgumentOutOfRangeException (nameof (id)); this.validity = validity; this.id = id; } /// /// Initializes a new instance of the struct. /// /// /// Creates a new with the specified value. /// /// The unique identifier. /// /// is 0. /// public UniqueId (uint id) { if (id == 0) throw new ArgumentOutOfRangeException (nameof (id)); this.validity = 0; this.id = id; } /// /// Gets the identifier. /// /// /// The identifier. /// /// The identifier. public uint Id { get { return id; } } /// /// Gets the validity, if non-zero. /// /// /// Gets the UidValidity of the containing folder. /// /// The UidValidity of the containing folder or 0 if not known. public uint Validity { get { return validity; } } /// /// Gets whether or not the unique identifier is valid. /// /// /// Gets whether or not the unique identifier is valid. /// /// if the unique identifier is valid; otherwise, . public bool IsValid { get { return Id != 0; } } #region IComparable implementation /// /// Compares two objects. /// /// /// Compares two objects. /// Validity values are not used in the comparison. /// /// /// A value less than 0 if this is less than , /// a value of 0 if this is equal to , or /// a value greater than 0 if this is greater than . /// /// The other unique identifier. public int CompareTo (UniqueId other) { return Id.CompareTo (other.Id); } #endregion #region IEquatable implementation /// /// Determines whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// Validity values are not used in the comparison. /// /// The to compare with the current . /// if the specified is equal to the current /// ; otherwise, . public bool Equals (UniqueId other) { return other.Id == Id; } #endregion /// /// Determines whether two unique identifiers are equal. /// /// /// Determines whether two unique identifiers are equal. /// Validity values are not used in the comparison. /// /// if and are equal; otherwise, . /// The first unique id to compare. /// The second unique id to compare. public static bool operator == (UniqueId uid1, UniqueId uid2) { return uid1.Id == uid2.Id; } /// /// Determines whether one unique identifier is greater than another unique identifier. /// /// /// Determines whether one unique identifier is greater than another unique identifier. /// Validity values are not used in the comparison. /// /// if is greater than ; otherwise, . /// The first unique id to compare. /// The second unique id to compare. public static bool operator > (UniqueId uid1, UniqueId uid2) { return uid1.Id > uid2.Id; } /// /// Determines whether one unique identifier is greater than or equal to another unique identifier. /// /// /// Determines whether one unique identifier is greater than or equal to another unique identifier. /// Validity values are not used in the comparison. /// /// if is greater than or equal to ; otherwise, . /// The first unique id to compare. /// The second unique id to compare. public static bool operator >= (UniqueId uid1, UniqueId uid2) { return uid1.Id >= uid2.Id; } /// /// Determines whether two unique identifiers are not equal. /// /// /// Determines whether two unique identifiers are not equal. /// Validity values are not used in the comparison. /// /// if and are not equal; otherwise, . /// The first unique id to compare. /// The second unique id to compare. public static bool operator != (UniqueId uid1, UniqueId uid2) { return uid1.Id != uid2.Id; } /// /// Determines whether one unique identifier is less than another unique identifier. /// /// /// Determines whether one unique identifier is less than another unique identifier. /// Validity values are not used in the comparison. /// /// if is less than ; otherwise, . /// The first unique id to compare. /// The second unique id to compare. public static bool operator < (UniqueId uid1, UniqueId uid2) { return uid1.Id < uid2.Id; } /// /// Determines whether one unique identifier is less than or equal to another unique identifier. /// /// /// Determines whether one unique identifier is less than or equal to another unique identifier. /// Validity values are not used in the comparison. /// /// if is less than or equal to ; otherwise, . /// The first unique id to compare. /// The second unique id to compare. public static bool operator <= (UniqueId uid1, UniqueId uid2) { return uid1.Id <= uid2.Id; } /// /// Determines whether the specified is equal to the current . /// /// /// Determines whether the specified is equal to the current . /// Validity values are not used in the comparison. /// /// The to compare with the current . /// if the specified is equal to the current ; /// otherwise, . public override bool Equals (object? obj) { return obj is UniqueId uid && uid.Id == Id; } /// /// Serves as a hash function for a object. /// /// /// Serves as a hash function for a object. /// /// A hash code for this instance that is suitable for use in hashing algorithms and data structures such as a hash table. public override int GetHashCode () { return Id.GetHashCode (); } /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { return Id.ToString (CultureInfo.InvariantCulture); } /// /// Attempt to parse a unique identifier. /// /// /// Attempts to parse a unique identifier. /// /// if the unique identifier was successfully parsed; otherwise, false.. /// The token to parse. /// The index to start parsing. /// The unique identifier. internal static bool TryParse (string token, ref int index, out uint uid) { uint value = 0; while (index < token.Length) { char c = token[index]; uint v; if (c < '0' || c > '9') break; v = (uint) (c - '0'); if (value > uint.MaxValue / 10 || (value == uint.MaxValue / 10 && v > uint.MaxValue % 10)) { uid = 0; return false; } value = (value * 10) + v; index++; } uid = value; return uid != 0; } /// /// Attempt to parse a unique identifier. /// /// /// Attempts to parse a unique identifier. /// /// if the unique identifier was successfully parsed; otherwise, false.. /// The token to parse. /// The UIDVALIDITY value. /// The unique identifier. /// /// is . /// public static bool TryParse (string token, uint validity, out UniqueId uid) { if (token == null) throw new ArgumentNullException (nameof (token)); if (!uint.TryParse (token, NumberStyles.None, CultureInfo.InvariantCulture, out uint id) || id == 0) { uid = Invalid; return false; } uid = new UniqueId (validity, id); return true; } /// /// Attempt to parse a unique identifier. /// /// /// Attempts to parse a unique identifier. /// /// if the unique identifier was successfully parsed; otherwise, false.. /// The token to parse. /// The unique identifier. /// /// is . /// public static bool TryParse (string token, out UniqueId uid) { return TryParse (token, 0, out uid); } /// /// Parse a unique identifier. /// /// /// Parses a unique identifier. /// /// The unique identifier. /// A string containing the unique identifier. /// The UIDVALIDITY. /// /// is . /// /// /// is not in the correct format. /// /// /// The unique identifier is greater than . /// public static UniqueId Parse (string token, uint validity) { return new UniqueId (validity, uint.Parse (token, NumberStyles.None, CultureInfo.InvariantCulture)); } /// /// Parse a unique identifier. /// /// /// Parses a unique identifier. /// /// The unique identifier. /// A string containing the unique identifier. /// /// is . /// /// /// is not in the correct format. /// /// /// The unique identifier is greater than . /// public static UniqueId Parse (string token) { return new UniqueId (uint.Parse (token, NumberStyles.None, CultureInfo.InvariantCulture)); } } } ================================================ FILE: MailKit/UniqueIdMap.cs ================================================ // // UniqueIdMap.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; namespace MailKit { /// /// A mapping of unique identifiers. /// /// /// A can be used to discover the mapping of one set of unique identifiers /// to another. /// For example, when copying or moving messages from one folder to another, it is often desirable /// to know what the unique identifiers are for each of the messages in the destination folder. /// public class UniqueIdMap : IReadOnlyDictionary { /// /// Any empty mapping of unique identifiers. /// /// /// Any empty mapping of unique identifiers. /// public static readonly UniqueIdMap Empty = new UniqueIdMap (); /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The unique identifiers used in the source folder. /// The unique identifiers used in the destination folder. /// /// is . /// -or- /// is . /// public UniqueIdMap (IList source, IList destination) { if (source == null) throw new ArgumentNullException (nameof (source)); if (destination == null) throw new ArgumentNullException (nameof (destination)); Destination = destination; Source = source; } UniqueIdMap () { Destination = Source = Array.Empty (); } /// /// Gets the list of unique identifiers used in the source folder. /// /// /// Gets the list of unique identifiers used in the source folder. /// /// The unique identifiers used in the source folder. public IList Source { get; private set; } /// /// Gets the list of unique identifiers used in the destination folder. /// /// /// Gets the list of unique identifiers used in the destination folder. /// /// The unique identifiers used in the destination folder. public IList Destination { get; private set; } /// /// Gets the number of unique identifiers that have been remapped. /// /// /// Gets the number of unique identifiers that have been remapped. /// /// The count. public int Count { get { return Source.Count; } } /// /// Gets the keys. /// /// /// Gets the keys. /// /// The keys. public IEnumerable Keys { get { return Source; } } /// /// Gets the values. /// /// /// Gets the values. /// /// The values. public IEnumerable Values { get { return Destination; } } /// /// Checks if the specified unique identifier has been remapped. /// /// /// Checks if the specified unique identifier has been remapped. /// /// if the unique identifier has been remapped; otherwise, . /// The unique identifier. public bool ContainsKey (UniqueId key) { return Source.Contains (key); } /// /// Tries to get the remapped unique identifier. /// /// /// Attempts to get the remapped unique identifier. /// /// on success; otherwise, . /// The unique identifier of the message in the source folder. /// The unique identifier of the message in the destination folder. public bool TryGetValue (UniqueId key, out UniqueId value) { int index = Source.IndexOf (key); if (index == -1 || index >= Destination.Count) { value = UniqueId.Invalid; return false; } value = Destination[index]; return true; } /// /// Gets the remapped unique identifier. /// /// /// Gets the remapped unique identifier. /// /// The unique identifier of the message in the source folder. /// The remapped unique identifier. /// /// is out of range. /// public UniqueId this [UniqueId index] { get { if (!TryGetValue (index, out var uid)) throw new ArgumentOutOfRangeException (nameof (index)); return uid; } } /// /// Gets the enumerator for the remapped unique identifiers. /// /// /// Gets the enumerator for the remapped unique identifiers. /// /// The enumerator. public IEnumerator> GetEnumerator () { var dst = Destination.GetEnumerator (); var src = Source.GetEnumerator (); while (src.MoveNext () && dst.MoveNext ()) yield return new KeyValuePair (src.Current, dst.Current); yield break; } /// /// Gets the enumerator for the remapped unique identifiers. /// /// /// Gets the enumerator for the remapped unique identifiers. /// /// The enumerator. IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } } } ================================================ FILE: MailKit/UniqueIdRange.cs ================================================ // // UniqueIdRange.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections; using System.Globalization; using System.Collections.Generic; using MailKit.Search; namespace MailKit { /// /// A range of items. /// /// /// When dealing with a large range, it is more efficient to use a /// than a typical /// IList<>. /// public class UniqueIdRange : IList { /// /// A that encompasses all messages in the folder. /// /// /// Represents the range of messages from to /// . /// public static readonly UniqueIdRange All = new UniqueIdRange (UniqueId.MinValue, UniqueId.MaxValue); static readonly UniqueIdRange Invalid = new UniqueIdRange (); readonly uint validity; internal uint start; internal uint end; /// /// Initializes a new instance of the class. /// /// /// Creates a new (invalid) range of unique identifiers. /// UniqueIdRange () { } /// /// Initializes a new instance of the class. /// /// /// Creates a new range of unique identifiers. /// /// The uid validity. /// The first unique identifier in the range. /// The last unique identifier in the range. public UniqueIdRange (uint validity, uint start, uint end) { if (start == 0) throw new ArgumentOutOfRangeException (nameof (start)); if (end == 0) throw new ArgumentOutOfRangeException (nameof (end)); this.validity = validity; this.start = start; this.end = end; } /// /// Initializes a new instance of the class. /// /// /// Creates a new range of unique identifiers. /// /// The first in the range. /// The last in the range. /// /// is invalid. /// -or- /// is invalid. /// public UniqueIdRange (UniqueId start, UniqueId end) { if (!start.IsValid) throw new ArgumentOutOfRangeException (nameof (start)); if (!end.IsValid) throw new ArgumentOutOfRangeException (nameof (end)); this.validity = start.Validity; this.start = start.Id; this.end = end.Id; } /// /// Gets the sort order of the unique identifiers. /// /// /// Gets the sort order of the unique identifiers. /// /// The sort order. public SortOrder SortOrder { get { return start <= end ? SortOrder.Ascending : SortOrder.Descending; } } /// /// Gets the validity, if non-zero. /// /// /// Gets the UidValidity of the containing folder. /// /// The UidValidity of the containing folder. public uint Validity { get { return validity; } } /// /// Gets the minimum unique identifier in the range. /// /// /// Gets the minimum unique identifier in the range. /// /// The minimum unique identifier. public UniqueId Min { get { return start < end ? new UniqueId (validity, start) : new UniqueId (validity, end); } } /// /// Gets the maximum unique identifier in the range. /// /// /// Gets the maximum unique identifier in the range. /// /// The maximum unique identifier. public UniqueId Max { get { return start > end ? new UniqueId (validity, start) : new UniqueId (validity, end); } } /// /// Get the start of the unique identifier range. /// /// /// Gets the start of the unique identifier range. /// /// The start of the range. public UniqueId Start { get { return new UniqueId (validity, start); } } /// /// Get the end of the unique identifier range. /// /// /// Gets the end of the unique identifier range. /// /// The end of the range. public UniqueId End { get { return new UniqueId (validity, end); } } #region ICollection implementation /// /// Get the number of unique identifiers in the range. /// /// /// Gets the number of unique identifiers in the range. /// /// The count. public int Count { get { return (int) Math.Min ((start <= end ? end - start : start - end) + 1, int.MaxValue); } } /// /// Get whether or not the range is read only. /// /// /// A is always read-only. /// /// if the range is read only; otherwise, . public bool IsReadOnly { get { return true; } } /// /// Adds the unique identifier to the range. /// /// /// Since a is read-only, unique ids cannot /// be added to the range. /// /// The unique identifier to add. /// /// The list does not support adding items. /// public void Add (UniqueId uid) { throw new NotSupportedException (); } /// /// Clears the list. /// /// /// Since a is read-only, the range cannot be cleared. /// /// /// The list does not support being cleared. /// public void Clear () { throw new NotSupportedException (); } /// /// Checks if the range contains the specified unique id. /// /// /// Determines whether or not the range contains the specified unique id. /// /// if the specified unique identifier is in the range; otherwise, . /// The unique id. public bool Contains (UniqueId uid) { if (start <= end) return uid.Id >= start && uid.Id <= end; return uid.Id <= start && uid.Id >= end; } /// /// Copies all of the unique ids in the range to the specified array. /// /// /// Copies all of the unique ids within the range into the array, /// starting at the specified array index. /// /// The array to copy the unique ids to. /// The index into the array. /// /// is . /// /// /// is out of range. /// public void CopyTo (UniqueId[] array, int arrayIndex) { if (array == null) throw new ArgumentNullException (nameof (array)); if (arrayIndex < 0 || arrayIndex > (array.Length - Count)) throw new ArgumentOutOfRangeException (nameof (arrayIndex)); int index = arrayIndex; if (start <= end) { for (uint uid = start; uid <= end; uid++, index++) array[index] = new UniqueId (validity, uid); } else { for (uint uid = start; uid >= end; uid--, index++) array[index] = new UniqueId (validity, uid); } } /// /// Removes the unique identifier from the range. /// /// /// Since a is read-only, unique ids cannot be removed. /// /// if the unique identifier was removed; otherwise, . /// The unique identifier to remove. /// /// The list does not support removing items. /// public bool Remove (UniqueId uid) { throw new NotSupportedException (); } #endregion #region IList implementation /// /// Gets the index of the specified unique id, if it exists. /// /// /// Finds the index of the specified unique id, if it exists. /// /// The index of the specified unique id; otherwise -1. /// The unique id. public int IndexOf (UniqueId uid) { if (start <= end) { if (uid.Id < start || uid.Id > end) return -1; return (int) (uid.Id - start); } if (uid.Id > start || uid.Id < end) return -1; return (int) (start - uid.Id); } /// /// Inserts the specified unique identifier at the given index. /// /// /// Inserts the unique identifier at the specified index in the range. /// /// The index to insert the unique id. /// The unique id. /// /// The list does not support inserting items. /// public void Insert (int index, UniqueId uid) { throw new NotSupportedException (); } /// /// Removes the unique identifier at the specified index. /// /// /// Removes the unique identifier at the specified index. /// /// The index. /// /// The list does not support removing items. /// public void RemoveAt (int index) { throw new NotSupportedException (); } /// /// Gets or sets the unique identifier at the specified index. /// /// /// Gets or sets the unique identifier at the specified index. /// /// The unique identifier at the specified index. /// The index. /// /// is out of range. /// /// /// The list does not support setting items. /// public UniqueId this [int index] { get { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); uint uid = start <= end ? start + (uint) index : start - (uint) index; return new UniqueId (validity, uid); } set { throw new NotSupportedException (); } } #endregion #region IEnumerable implementation /// /// Gets an enumerator for the range of unique ids. /// /// /// Gets an enumerator for the range of unique ids. /// /// The enumerator. public IEnumerator GetEnumerator () { if (start <= end) { for (uint uid = start; uid <= end; uid++) yield return new UniqueId (validity, uid); } else { for (uint uid = start; uid >= end; uid--) yield return new UniqueId (validity, uid); } yield break; } #endregion #region IEnumerable implementation /// /// Gets an enumerator for the range of unique ids. /// /// /// Gets an enumerator for the range of unique ids. /// /// The enumerator. IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } #endregion /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { if (end == uint.MaxValue) return string.Format (CultureInfo.InvariantCulture, "{0}:*", start); return string.Format (CultureInfo.InvariantCulture, "{0}:{1}", start, end); } /// /// Attempt to parse a unique identifier range. /// /// /// Attempts to parse a unique identifier range. /// /// if the unique identifier range was successfully parsed; otherwise, false.. /// The token to parse. /// The UIDVALIDITY value. /// The unique identifier range. /// /// is . /// public static bool TryParse (string token, uint validity, out UniqueIdRange range) { if (token == null) throw new ArgumentNullException (nameof (token)); uint start, end; int index = 0; if (!UniqueId.TryParse (token, ref index, out start) || index + 2 > token.Length || token[index++] != ':') { range = Invalid; return false; } if (token[index] != '*') { if (!UniqueId.TryParse (token, ref index, out end) || index < token.Length) { range = Invalid; return false; } } else if (index + 1 != token.Length) { range = Invalid; return false; } else { end = uint.MaxValue; } range = new UniqueIdRange (validity, start, end); return true; } /// /// Attempt to parse a unique identifier range. /// /// /// Attempts to parse a unique identifier range. /// /// if the unique identifier range was successfully parsed; otherwise, false.. /// The token to parse. /// The unique identifier range. /// /// is . /// public static bool TryParse (string token, out UniqueIdRange range) { return TryParse (token, 0, out range); } } } ================================================ FILE: MailKit/UniqueIdSet.cs ================================================ // // UniqueIdSet.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Text; using System.Collections; using System.Globalization; using System.Collections.Generic; using MailKit.Search; namespace MailKit { /// /// A set of unique identifiers. /// /// /// When dealing with a large number of unique identifiers, it may be more efficient to use a /// than a typical IList<>. /// public class UniqueIdSet : IList { struct Range { public uint Start; public uint End; public Range (uint start, uint end) { Start = start; End = end; } public int Count { get { return (int) (Start <= End ? End - Start : Start - End) + 1; } } public bool Contains (uint uid) { if (Start <= End) return uid >= Start && uid <= End; return uid <= Start && uid >= End; } public int IndexOf (uint uid) { if (Start <= End) { if (uid < Start || uid > End) return -1; return (int) (uid - Start); } if (uid > Start || uid < End) return -1; return (int) (Start - uid); } public uint this [int index] { get { return Start <= End ? Start + (uint) index : Start - (uint) index; } } public IEnumerator GetEnumerator () { if (Start <= End) { for (uint uid = Start; uid <= End; uid++) yield return uid; } else { for (uint uid = Start; uid >= End; uid--) yield return uid; } yield break; } public override string ToString () { if (Start == End) return Start.ToString (CultureInfo.InvariantCulture); if (Start <= End && End == uint.MaxValue) return string.Format (CultureInfo.InvariantCulture, "{0}:*", Start); return string.Format (CultureInfo.InvariantCulture, "{0}:{1}", Start, End); } } readonly List ranges = new List (); long count; /// /// Initializes a new instance of the class. /// /// /// Creates a new unique identifier set. /// /// The uid validity. /// The sorting order to use for the unique identifiers. /// /// is invalid. /// public UniqueIdSet (uint validity, SortOrder order = SortOrder.None) { switch (order) { case SortOrder.Descending: case SortOrder.Ascending: case SortOrder.None: break; default: throw new ArgumentOutOfRangeException (nameof (order)); } Validity = validity; SortOrder = order; } /// /// Initializes a new instance of the class. /// /// /// Creates a new unique identifier set. /// /// The sorting order to use for the unique identifiers. /// /// is invalid. /// public UniqueIdSet (SortOrder order = SortOrder.None) : this (0, order) { } /// /// Initializes a new instance of the class. /// /// /// Creates a new set of unique identifier set containing the specified uids. /// /// An initial set of unique ids. /// The sorting order to use for the unique identifiers. /// /// is invalid. /// public UniqueIdSet (IEnumerable uids, SortOrder order = SortOrder.None) : this (order) { foreach (var uid in uids) Add (uid); } /// /// Gets the sort order of the unique identifiers. /// /// /// Gets the sort order of the unique identifiers. /// /// The sort order. public SortOrder SortOrder { get; private set; } /// /// Gets the validity, if non-zero. /// /// /// Gets the UidValidity of the containing folder. /// /// The UidValidity of the containing folder. public uint Validity { get; private set; } #region ICollection implementation /// /// Get the number of unique ids in the set. /// /// /// Gets the number of unique ids in the set. /// /// The count. public int Count { get { return (int) Math.Min (count, int.MaxValue); } } /// /// Get whether or not the set is read only. /// /// /// Gets whether or not the set is read-only. /// /// if the set is read only; otherwise, . public bool IsReadOnly { get { return false; } } int BinarySearch (uint uid) { int min = 0, max = ranges.Count; if (max == 0) return -1; do { int i = min + ((max - min) / 2); if (SortOrder == SortOrder.Ascending) { // sorted ascending: 1:3,5:7,9 if (uid >= ranges[i].Start) { if (uid <= ranges[i].End) return i; min = i + 1; } else { max = i; } } else { // sorted descending: 9,7:5,3:1 if (uid >= ranges[i].End) { if (uid <= ranges[i].Start) return i; max = i; } else { min = i + 1; } } } while (min < max); return -1; } int IndexOfRange (uint uid) { if (SortOrder != SortOrder.None) return BinarySearch (uid); for (int i = 0; i < ranges.Count; i++) { if (ranges[i].Contains (uid)) return i; } return -1; } void BinaryInsertAscending (uint uid) { int min = 0, max = ranges.Count; int i; do { i = min + ((max - min) / 2); if (uid >= ranges[i].Start) { if (uid <= ranges[i].End) return; if (uid == ranges[i].End + 1) { if (i + 1 < ranges.Count && uid + 1 >= ranges[i + 1].Start) { // merge the 2 ranges together ranges[i] = new Range (ranges[i].Start, ranges[i + 1].End); ranges.RemoveAt (i + 1); count++; return; } ranges[i] = new Range (ranges[i].Start, uid); count++; return; } min = i + 1; i = min; } else { if (uid == ranges[i].Start - 1) { if (i > 0 && uid - 1 <= ranges[i - 1].End) { // merge the 2 ranges together ranges[i - 1] = new Range (ranges[i - 1].Start, ranges[i].End); ranges.RemoveAt (i); count++; return; } ranges[i] = new Range (uid, ranges[i].End); count++; return; } max = i; } } while (min < max); var range = new Range (uid, uid); if (i < ranges.Count) ranges.Insert (i, range); else ranges.Add (range); count++; } void BinaryInsertDescending (uint uid) { int min = 0, max = ranges.Count; int i; do { i = min + ((max - min) / 2); if (uid <= ranges[i].Start) { if (uid >= ranges[i].End) return; if (uid == ranges[i].End - 1) { if (i + 1 < ranges.Count && uid - 1 <= ranges[i + 1].Start) { // merge the 2 ranges together ranges[i] = new Range (ranges[i].Start, ranges[i + 1].End); ranges.RemoveAt (i + 1); count++; return; } ranges[i] = new Range (ranges[i].Start, uid); count++; return; } min = i + 1; i = min; } else { if (uid == ranges[i].Start + 1) { if (i > 0 && uid + 1 >= ranges[i - 1].End) { // merge the 2 ranges together ranges[i - 1] = new Range (ranges[i - 1].Start, ranges[i].End); ranges.RemoveAt (i); count++; return; } ranges[i] = new Range (uid, ranges[i].End); count++; return; } max = i; } } while (min < max); var range = new Range (uid, uid); if (i < ranges.Count) ranges.Insert (i, range); else ranges.Add (range); count++; } void Append (uint uid) { if (IndexOfRange (uid) != -1) return; count++; if (ranges.Count > 0) { int index = ranges.Count - 1; var range = ranges[index]; if (range.Start == range.End) { if (uid == range.End + 1 || uid == range.End - 1) { ranges[index] = new Range (range.Start, uid); return; } } else if (range.Start < range.End) { if (uid == range.End + 1) { ranges[index] = new Range (range.Start, uid); return; } } else if (range.Start > range.End) { if (uid == range.End - 1) { ranges[index] = new Range (range.Start, uid); return; } } } ranges.Add (new Range (uid, uid)); } /// /// Adds the unique identifier to the set. /// /// /// Adds the unique identifier to the set. /// /// The unique identifier to add. /// /// is invalid. /// public void Add (UniqueId uid) { if (!uid.IsValid) throw new ArgumentException ("Invalid unique identifier.", nameof (uid)); if (ranges.Count == 0) { ranges.Add (new Range (uid.Id, uid.Id)); count++; return; } switch (SortOrder) { case SortOrder.Descending: BinaryInsertDescending (uid.Id); break; case SortOrder.Ascending: BinaryInsertAscending (uid.Id); break; default: Append (uid.Id); break; } } /// /// Adds all of the uids to the set. /// /// /// Adds all of the uids to the set. /// /// The collection of uids. public void AddRange (IEnumerable uids) { if (uids == null) throw new ArgumentNullException (nameof (uids)); foreach (var uid in uids) Add (uid); } /// /// Clears the list. /// /// /// Clears the list. /// /// /// The collection is readonly. /// public void Clear () { ranges.Clear (); count = 0; } /// /// Checks if the set contains the specified unique id. /// /// /// Determines whether or not the set contains the specified unique id. /// /// if the specified unique identifier is in the set; otherwise, . /// The unique id. public bool Contains (UniqueId uid) { return IndexOfRange (uid.Id) != -1; } /// /// Copies all of the unique ids in the set to the specified array. /// /// /// Copies all of the unique ids within the set into the array, /// starting at the specified array index. /// /// The array to copy the unique ids to. /// The index into the array. /// /// is . /// /// /// is out of set. /// public void CopyTo (UniqueId[] array, int arrayIndex) { if (array == null) throw new ArgumentNullException (nameof (array)); if (arrayIndex < 0 || arrayIndex > (array.Length - Count)) throw new ArgumentOutOfRangeException (nameof (arrayIndex)); int index = arrayIndex; for (int i = 0; i < ranges.Count; i++) { foreach (var uid in ranges[i]) array[index++] = new UniqueId (Validity, uid); } } void Remove (int index, uint uid) { var range = ranges[index]; if (uid == range.Start) { // remove the first item in the range if (range.Start != range.End) { if (range.Start <= range.End) ranges[index] = new Range (uid + 1, range.End); else ranges[index] = new Range (uid - 1, range.End); } else { ranges.RemoveAt (index); } } else if (uid == range.End) { // remove the last item in the range if (range.Start <= range.End) ranges[index] = new Range (range.Start, uid - 1); else ranges[index] = new Range (range.Start, uid + 1); } else { // remove a uid from the middle of the range if (range.Start < range.End) { ranges.Insert (index, new Range (range.Start, uid - 1)); ranges[index + 1] = new Range (uid + 1, range.End); } else { ranges.Insert (index, new Range (range.Start, uid + 1)); ranges[index + 1] = new Range (uid - 1, range.End); } } count--; } /// /// Removes the unique identifier from the set. /// /// /// Removes the unique identifier from the set. /// /// if the unique identifier was removed; otherwise, . /// The unique identifier to remove. public bool Remove (UniqueId uid) { int index = IndexOfRange (uid.Id); if (index == -1) return false; Remove (index, uid.Id); return true; } #endregion #region IList implementation /// /// Gets the index of the specified unique id, if it exists. /// /// /// Finds the index of the specified unique id, if it exists. /// /// The index of the specified unique id; otherwise -1. /// The unique id. public int IndexOf (UniqueId uid) { int index = 0; for (int i = 0; i < ranges.Count; i++) { if (ranges[i].Contains (uid.Id)) return index + ranges[i].IndexOf (uid.Id); index += ranges[i].Count; } return -1; } /// /// Inserts the specified unique identifier at the given index. /// /// /// Inserts the unique identifier at the specified index in the set. /// /// The index to insert the unique id. /// The unique id. /// /// The list does not support inserting items. /// public void Insert (int index, UniqueId uid) { throw new NotSupportedException (); } /// /// Removes the unique identifier at the specified index. /// /// /// Removes the unique identifier at the specified index. /// /// The index. /// /// is out of range. /// public void RemoveAt (int index) { if (index < 0 || index >= count) throw new ArgumentOutOfRangeException (nameof (index)); int offset = 0; for (int i = 0; i < ranges.Count; i++) { if (index >= offset + ranges[i].Count) { offset += ranges[i].Count; continue; } var uid = ranges[i][index - offset]; Remove (i, uid); return; } } /// /// Gets or sets the unique identifier at the specified index. /// /// /// Gets or sets the unique identifier at the specified index. /// /// The unique identifier at the specified index. /// The index. /// /// is out of range. /// /// /// The list does not support setting items. /// public UniqueId this [int index] { get { if (index < 0 || index >= count) throw new ArgumentOutOfRangeException (nameof (index)); int offset = 0; for (int i = 0; i < ranges.Count; i++) { if (index >= offset + ranges[i].Count) { offset += ranges[i].Count; continue; } uint uid = ranges[i][index - offset]; return new UniqueId (Validity, uid); } throw new ArgumentOutOfRangeException (nameof (index)); } set { throw new NotSupportedException (); } } #endregion #region IEnumerable implementation /// /// Gets an enumerator for the set of unique ids. /// /// /// Gets an enumerator for the set of unique ids. /// /// The enumerator. public IEnumerator GetEnumerator () { for (int i = 0; i < ranges.Count; i++) { foreach (var uid in ranges[i]) yield return new UniqueId (Validity, uid); } yield break; } #endregion #region IEnumerable implementation /// /// Gets an enumerator for the set of unique ids. /// /// /// Gets an enumerator for the set of unique ids. /// /// The enumerator. IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } #endregion /// /// Returns a that represents the current . /// /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { foreach (var subset in EnumerateSerializedSubsets (int.MaxValue)) return subset; return string.Empty; } /// /// Format a generic list of unique identifiers as a string. /// /// /// Formats a generic list of unique identifiers as a string. /// /// The string representation of the collection of unique identifiers. /// The unique identifiers. /// /// is . /// /// /// One or more of the unique identifiers is invalid (has a value of 0). /// public static string ToString (IList uids) { foreach (var subset in EnumerateSerializedSubsets (uids, int.MaxValue)) return subset; return string.Empty; } /// /// Format the set of unique identifiers as multiple strings that fit within the maximum defined character length. /// /// /// Formats the set of unique identifiers as multiple strings that fit within the maximum defined character length. /// /// A list of strings representing the collection of unique identifiers. /// The maximum length of any returned string of UIDs. /// /// is negative. /// IEnumerable EnumerateSerializedSubsets (int maxLength) { if (maxLength < 0) throw new ArgumentOutOfRangeException (nameof (maxLength)); var builder = new StringBuilder (); for (int i = 0; i < ranges.Count; i++) { var range = ranges[i].ToString (); if (builder.Length > 0) { if (builder.Length + 1 + range.Length > maxLength) { yield return builder.ToString (); builder.Clear (); } else { builder.Append (','); } } builder.Append (range); } yield return builder.ToString (); } /// /// Format a generic list of unique identifiers as multiple strings that fit within the maximum defined character length. /// /// /// Formats a generic list of unique identifiers as multiple strings that fit within the maximum defined character length. /// /// A list of strings representing the collection of unique identifiers. /// The unique identifiers. /// The maximum length of any returned string of UIDs. /// /// is . /// /// /// One or more of the unique identifiers is invalid (has a value of 0). /// /// /// is negative. /// internal static IEnumerable EnumerateSerializedSubsets (IList uids, int maxLength) { if (uids == null) throw new ArgumentNullException (nameof (uids)); if (maxLength < 0) throw new ArgumentOutOfRangeException (nameof (maxLength)); if (uids.Count == 0) { yield return string.Empty; yield break; } if (uids is UniqueIdRange range) { yield return range.ToString (); yield break; } if (uids is UniqueIdSet set) { foreach (var subset in set.EnumerateSerializedSubsets (maxLength)) yield return subset; yield break; } var builder = new StringBuilder (); int index = 0; while (index < uids.Count) { if (!uids[index].IsValid) throw new ArgumentException ("One or more of the uids is invalid.", nameof (uids)); uint start = uids[index].Id; uint end = uids[index].Id; int i = index + 1; if (i < uids.Count) { if (uids[i].Id == end + 1) { end = uids[i++].Id; while (i < uids.Count && uids[i].Id == end + 1) { end++; i++; } } else if (uids[i].Id == end - 1) { end = uids[i++].Id; while (i < uids.Count && uids[i].Id == end - 1) { end--; i++; } } } string next; if (start != end) next = string.Format (CultureInfo.InvariantCulture, "{0}:{1}", start, end); else next = start.ToString (); if (builder.Length > 0) { if (builder.Length + 1 + next.Length > maxLength) { yield return builder.ToString (); builder.Clear (); } else { builder.Append (','); } } builder.Append (next); index = i; } yield return builder.ToString (); } /// /// Attempt to parse the specified token as a set of unique identifiers. /// /// /// Attempts to parse the specified token as a set of unique identifiers. /// /// if the set of unique identifiers were successfully parsed; otherwise, . /// The token containing the set of unique identifiers. /// The UIDVALIDITY value. /// The set of unique identifiers. /// The minimum unique identifier value parsed. /// The maximum unique identifier value parsed. /// /// is . /// internal static bool TryParse (string token, uint validity, out UniqueIdSet uids, out UniqueId? minValue, out UniqueId? maxValue) { if (token == null) throw new ArgumentNullException (nameof (token)); uids = new UniqueIdSet (validity); minValue = maxValue = null; var order = SortOrder.None; uint min = uint.MaxValue; uint max = 0; bool sorted = true; uint prev = 0; int index = 0; do { if (!UniqueId.TryParse (token, ref index, out uint start)) return false; min = Math.Min (min, start); max = Math.Max (max, start); if (index < token.Length && token[index] == ':') { index++; if (!UniqueId.TryParse (token, ref index, out uint end)) return false; min = Math.Min (min, end); max = Math.Max (max, end); var range = new Range (start, end); uids.count += range.Count; uids.ranges.Add (range); if (sorted) { switch (order) { default: order = start <= end ? SortOrder.Ascending : SortOrder.Descending; break; case SortOrder.Descending: sorted = start >= end && start <= prev; break; case SortOrder.Ascending: sorted = start <= end && start >= prev; break; } } prev = end; } else { uids.ranges.Add (new Range (start, start)); uids.count++; if (sorted && uids.ranges.Count > 1) { switch (order) { default: order = start >= prev ? SortOrder.Ascending : SortOrder.Descending; break; case SortOrder.Descending: sorted = start <= prev; break; case SortOrder.Ascending: sorted = start >= prev; break; } } prev = start; } if (index >= token.Length) break; if (token[index++] != ',') return false; } while (true); uids.SortOrder = sorted ? order : SortOrder.None; if (min <= max) { minValue = new UniqueId (validity, min); maxValue = new UniqueId (validity, max); } return true; } /// /// Attempt to parse the specified token as a set of unique identifiers. /// /// /// Attempts to parse the specified token as a set of unique identifiers. /// /// if the set of unique identifiers were successfully parsed; otherwise, . /// The token containing the set of unique identifiers. /// The UIDVALIDITY value. /// The set of unique identifiers. /// /// is . /// public static bool TryParse (string token, uint validity, out UniqueIdSet uids) { return TryParse (token, validity, out uids, out _, out _); } /// /// Attempt to parse the specified token as a set of unique identifiers. /// /// /// Attempts to parse the specified token as a set of unique identifiers. /// /// if the set of unique identifiers were successfully parsed; otherwise, . /// The token containing the set of unique identifiers. /// The set of unique identifiers. /// /// is . /// public static bool TryParse (string token, out UniqueIdSet uids) { return TryParse (token, 0, out uids, out _, out _); } } } ================================================ FILE: MailKit/UriExtensions.cs ================================================ // // UriExtensions.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using System.Collections.Generic; namespace MailKit { static class UriExtensions { public static IDictionary ParsedQuery (this Uri uri) { var properties = new Dictionary (StringComparer.OrdinalIgnoreCase); int index = 1; if (string.IsNullOrEmpty (uri.Query)) return properties; // Note: the query string begins with '?' while (index < uri.Query.Length) { int startIndex = index; while (index < uri.Query.Length && uri.Query[index] != '=') index++; var name = uri.Query.Substring (startIndex, index - startIndex); if (index >= uri.Query.Length) { properties.Add (name, string.Empty); break; } startIndex = ++index; while (index < uri.Query.Length && uri.Query[index] != '&') index++; var value = uri.Query.Substring (startIndex, index - startIndex); properties.Add (name, Uri.UnescapeDataString (value)); index++; } return properties; } } } ================================================ FILE: MailKit/WebAlertEventArgs.cs ================================================ // // WebAlertEventArgs.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; namespace MailKit { /// /// Alert event arguments. /// /// /// Some implementations, such as /// , will emit WebAlert /// events when they receive web alert messages from the server. /// public class WebAlertEventArgs : AlertEventArgs { /// /// Initializes a new instance of the class. /// /// /// Creates a new . /// /// The web URI. /// The alert message. /// /// is . /// -or- /// is . /// public WebAlertEventArgs (Uri uri, string message) : base (message) { if (uri == null) throw new ArgumentNullException (nameof (uri)); WebUri = uri; } /// /// Gets the web URI. /// /// /// The URI that the user should visit to resolve the issue. /// /// The web URI. public Uri WebUri { get; private set; } } } ================================================ FILE: MailKit.Coverity.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30711.63 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{BB3237C7-E19C-4232-B875-6658ABDD184A}" ProjectSection(SolutionItems) = preProject .nuget\packages.config = .nuget\packages.config EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit", "submodules\MimeKit\MimeKit\MimeKit.csproj", "{4453C1EF-9C6A-4305-B70B-9154AE48B63C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MailKit", "MailKit\MailKit.csproj", "{67EBBC81-9334-49CE-BF7B-17DA659E9736}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {4453C1EF-9C6A-4305-B70B-9154AE48B63C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4453C1EF-9C6A-4305-B70B-9154AE48B63C}.Debug|Any CPU.Build.0 = Debug|Any CPU {4453C1EF-9C6A-4305-B70B-9154AE48B63C}.Release|Any CPU.ActiveCfg = Release|Any CPU {4453C1EF-9C6A-4305-B70B-9154AE48B63C}.Release|Any CPU.Build.0 = Release|Any CPU {67EBBC81-9334-49CE-BF7B-17DA659E9736}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {67EBBC81-9334-49CE-BF7B-17DA659E9736}.Debug|Any CPU.Build.0 = Debug|Any CPU {67EBBC81-9334-49CE-BF7B-17DA659E9736}.Release|Any CPU.ActiveCfg = Release|Any CPU {67EBBC81-9334-49CE-BF7B-17DA659E9736}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AE4FD452-949D-40F5-B83B-B439EBA814AA} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = MailKit\MailKit.Net45.csproj Policies = $0 $0.TextStylePolicy = $1 $1.inheritsSet = null $1.scope = text/x-csharp $0.CSharpFormattingPolicy = $2 $2.AlignEmbeddedUsingStatements = False $2.AlignEmbeddedIfStatements = False $2.NamespaceBraceStyle = EndOfLine $2.StructBraceStyle = EndOfLine $2.EnumBraceStyle = EndOfLine $2.BeforeIndexerDeclarationBracket = False $2.AfterDelegateDeclarationParameterComma = True $2.BeforeSizeOfParentheses = True $2.BeforeTypeOfParentheses = True $2.SpacesAfterTypecast = True $2.BlankLinesBeforeUsings = 1 $2.inheritsSet = Mono $2.inheritsScope = text/x-csharp $2.scope = text/x-csharp $0.StandardHeader = $3 $3.Text = @\r\n${FileName}\n \nAuthor: ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) ${Year} ${CopyrightHolder}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n $3.IncludeInNewFiles = True EndGlobalSection EndGlobal ================================================ FILE: MailKit.Documentation.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29926.136 MinimumVisualStudioVersion = 10.0.40219.1 Project("{7CF6DF6D-3B04-46F8-A40B-537D21BCA0B4}") = "Documentation", "Documentation\Documentation.shfbproj", "{59115814-A1E3-46AE-AE30-4065AE8F4CAF}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit", "submodules\MimeKit\MimeKit\MimeKit.csproj", "{FAEC8A91-6983-4ED9-A414-09C6B65B13BB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MailKit", "MailKit\MailKit.csproj", "{E543A427-93DE-4E65-ADF2-44412E440FB1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {59115814-A1E3-46AE-AE30-4065AE8F4CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59115814-A1E3-46AE-AE30-4065AE8F4CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU {59115814-A1E3-46AE-AE30-4065AE8F4CAF}.Release|Any CPU.Build.0 = Release|Any CPU {FAEC8A91-6983-4ED9-A414-09C6B65B13BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FAEC8A91-6983-4ED9-A414-09C6B65B13BB}.Debug|Any CPU.Build.0 = Debug|Any CPU {FAEC8A91-6983-4ED9-A414-09C6B65B13BB}.Release|Any CPU.ActiveCfg = Release|Any CPU {FAEC8A91-6983-4ED9-A414-09C6B65B13BB}.Release|Any CPU.Build.0 = Release|Any CPU {E543A427-93DE-4E65-ADF2-44412E440FB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E543A427-93DE-4E65-ADF2-44412E440FB1}.Debug|Any CPU.Build.0 = Debug|Any CPU {E543A427-93DE-4E65-ADF2-44412E440FB1}.Release|Any CPU.ActiveCfg = Release|Any CPU {E543A427-93DE-4E65-ADF2-44412E440FB1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EB22C82D-37B9-4F33-9228-B5FD1B590B1F} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution Policies = $0 $0.StandardHeader = $1 $1.Text = @\n${FileName}\n \nAuthor: ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) ${Year} ${CopyrightHolder}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n $1.IncludeInNewFiles = True $0.TextStylePolicy = $2 $2.FileWidth = 120 $2.TabsToSpaces = False $2.inheritsSet = VisualStudio $2.inheritsScope = text/plain EndGlobalSection EndGlobal ================================================ FILE: MailKit.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32516.85 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D5001AA9-4C61-475F-8EA3-4C15949D849F}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit", "submodules\MimeKit\MimeKit\MimeKit.csproj", "{B0E5B7C4-710E-4DDE-9C00-1234844ADA76}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MailKit", "MailKit\MailKit.csproj", "{12F096E4-8CDC-4D5B-87B8-8AD71A3B5BED}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests", "UnitTests\UnitTests.csproj", "{1B670279-AEA7-4D9B-A854-CB4CC177B277}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {B0E5B7C4-710E-4DDE-9C00-1234844ADA76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0E5B7C4-710E-4DDE-9C00-1234844ADA76}.Debug|Any CPU.Build.0 = Debug|Any CPU {B0E5B7C4-710E-4DDE-9C00-1234844ADA76}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0E5B7C4-710E-4DDE-9C00-1234844ADA76}.Release|Any CPU.Build.0 = Release|Any CPU {12F096E4-8CDC-4D5B-87B8-8AD71A3B5BED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12F096E4-8CDC-4D5B-87B8-8AD71A3B5BED}.Debug|Any CPU.Build.0 = Debug|Any CPU {12F096E4-8CDC-4D5B-87B8-8AD71A3B5BED}.Release|Any CPU.ActiveCfg = Release|Any CPU {12F096E4-8CDC-4D5B-87B8-8AD71A3B5BED}.Release|Any CPU.Build.0 = Release|Any CPU {1B670279-AEA7-4D9B-A854-CB4CC177B277}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B670279-AEA7-4D9B-A854-CB4CC177B277}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B670279-AEA7-4D9B-A854-CB4CC177B277}.Release|Any CPU.ActiveCfg = Release|Any CPU {1B670279-AEA7-4D9B-A854-CB4CC177B277}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {80311676-045A-4523-8BD6-AEAD1F21474C} EndGlobalSection EndGlobal ================================================ FILE: MailKitLite.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D5001AA9-4C61-475F-8EA3-4C15949D849F}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKitLite", "submodules\MimeKit\MimeKit\MimeKitLite.csproj", "{23F999AF-CF50-42FF-A011-D56D68E60FB9}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MailKitLite", "MailKit\MailKitLite.csproj", "{D6EBFBF3-5806-43A0-B3B3-02EF25C47A9C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Debug|Any CPU.Build.0 = Debug|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Release|Any CPU.ActiveCfg = Release|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Release|Any CPU.Build.0 = Release|Any CPU {D6EBFBF3-5806-43A0-B3B3-02EF25C47A9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D6EBFBF3-5806-43A0-B3B3-02EF25C47A9C}.Debug|Any CPU.Build.0 = Debug|Any CPU {D6EBFBF3-5806-43A0-B3B3-02EF25C47A9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {D6EBFBF3-5806-43A0-B3B3-02EF25C47A9C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {80311676-045A-4523-8BD6-AEAD1F21474C} EndGlobalSection EndGlobal ================================================ FILE: README.md ================================================ # MailKit | Package |Latest Release|Latest Build| |:----------|:------------:|:----------:| |**MimeKit**|[![MimeKit NuGet](https://img.shields.io/nuget/v/MimeKit.svg?logo=nuget&style=flat-square)](https://www.nuget.org/packages/MimeKit)![MimeKit NuGet Downloads](https://img.shields.io/nuget/dt/MimeKit.svg?style=flat-square)|[![MimeKit MyGet](https://img.shields.io/myget/mimekit/v/MimeKit.svg?logo=nuget&style=flat-square&label=myget)](https://www.myget.org/feed/mimekit/package/nuget/MimeKit)| |**MimeKitLite**|[![MimeKitLite NuGet](https://img.shields.io/nuget/v/MimeKitLite.svg?logo=nuget&style=flat-square)](https://www.nuget.org/packages/MimeKitLite)![MimeKitLite NuGet Downloads](https://img.shields.io/nuget/dt/MimeKitLite.svg?style=flat-square)|| |**MailKit**|[![MailKit NuGet](https://img.shields.io/nuget/v/MailKit.svg?logo=nuget&style=flat-square)](https://www.nuget.org/packages/MailKit)![MailKit NuGet Downloads](https://img.shields.io/nuget/dt/MailKit.svg?style=flat-square)|[![MailKit MyGet](https://img.shields.io/myget/mimekit/v/MailKit.svg?logo=nuget&style=flat-square&label=myget)](https://www.myget.org/feed/mimekit/package/nuget/MailKit)| |**MailKitLite**|[![MailKitLite NuGet](https://img.shields.io/nuget/v/MailKitLite.svg?logo=nuget&style=flat-square)](https://www.nuget.org/packages/MailKitLite)![MailKitLite NuGet Downloads](https://img.shields.io/nuget/dt/MailKitLite.svg?style=flat-square)|| | Platform |Build Status|Code Coverage|Static Analysis| |:------------|:----------:|:-----------:|:-------------:| |**Linux/Mac**|[![Build Status](https://github.com/jstedfast/MailKit/actions/workflows/main.yml/badge.svg?event=push)](https://github.com/jstedfast/MailKit/actions/workflows/main.yml)|[![Code Coverage](https://img.shields.io/coverallsCoverage/github/jstedfast/MailKit?branch=master)](https://coveralls.io/r/jstedfast/MailKit?branch=master)|[![Static Analysis](https://img.shields.io/coverity/scan/3202)](https://scan.coverity.com/projects/3202)| |**Windows** |[![Build Status](https://github.com/jstedfast/MailKit/actions/workflows/main.yml/badge.svg?event=push)](https://github.com/jstedfast/MailKit/actions/workflows/main.yml)|[![Code Coverage](https://img.shields.io/coverallsCoverage/github/jstedfast/MailKit?branch=master)](https://coveralls.io/r/jstedfast/MailKit?branch=master)|[![Static Analysis](https://img.shields.io/coverity/scan/3202)](https://scan.coverity.com/projects/3202)| ## What is MailKit? MailKit is a cross-platform mail client library built on top of [MimeKit](https://github.com/jstedfast/MimeKit). ## Donate MailKit is a personal open source project that I have put thousands of hours into perfecting with the goal of making it the very best email framework for .NET. I need your help to achieve this. Donating helps pay for things such as web hosting, domain registration and licenses for developer tools such as a performance profiler, memory profiler, a static code analysis tool, and more. It also helps motivate me to continue working on the project. Click here to lend your support to MailKit by making a donation! ## Features * SASL Authentication * Supports the following mechanisms: [CRAM-MD5](https://tools.ietf.org/html/rfc2195), [DIGEST-MD5](https://tools.ietf.org/html/rfc2831), [LOGIN](https://tools.ietf.org/html/draft-murchison-sasl-login-00), [NTLM](https://davenport.sourceforge.net/ntlm.html), [PLAIN](https://tools.ietf.org/html/rfc2595), [SCRAM-SHA-1[-PLUS]](https://tools.ietf.org/html/rfc5802), [SCRAM-SHA-256[-PLUS]](https://tools.ietf.org/html/rfc5802), [SCRAM-SHA-512[-PLUS]](https://tools.ietf.org/html/draft-melnikov-scram-sha-512-04), [OAUTHBEARER](https://tools.ietf.org/html/rfc7628) and XOAUTH2 * Proxy Support * Supports the following types of proxies: [SOCKS4/4a](https://www.openssh.com/txt/socks4.protocol), [SOCKS5](https://tools.ietf.org/html/rfc1928), and [HTTP/S](https://tools.ietf.org/html/rfc2616) * SMTP Client * Supports all of the SASL mechanisms listed above. * Supports SSL-wrapped connections via the "smtps" protocol. * Supports client SSL/TLS certificates. * Supports the following extensions: [SIZE](https://tools.ietf.org/html/rfc1870), [DSN](https://tools.ietf.org/html/rfc1891), [AUTH](https://tools.ietf.org/html/rfc2554), [8BITMIME](https://tools.ietf.org/html/rfc2821), [PIPELINING](https://tools.ietf.org/html/rfc2920), [BINARYMIME](https://tools.ietf.org/html/rfc3030), [CHUNKING](https://tools.ietf.org/html/rfc3030), [STARTTLS](https://tools.ietf.org/html/rfc3207), and [SMTPUTF8](https://tools.ietf.org/html/rfc6531) * All APIs are cancellable. * Async APIs are available. * POP3 Client * Supports all of the SASL mechanisms listed above. * Also supports authentication via [APOP](https://tools.ietf.org/html/rfc1939#page-15) and `USER`/`PASS`. * Supports SSL-wrapped connections via the "pops" protocol. * Supports client SSL/TLS certificates. * Supports the following extensions: [TOP](https://tools.ietf.org/html/rfc1939#page-11), [UIDL](https://tools.ietf.org/html/rfc1939#page-12), [EXPIRE](https://tools.ietf.org/html/rfc2449), [LOGIN-DELAY](https://tools.ietf.org/html/rfc2449), [PIPELINING](https://tools.ietf.org/html/rfc2449), [SASL](https://tools.ietf.org/html/rfc2449), [STLS](https://tools.ietf.org/html/rfc2595), [UTF8](https://tools.ietf.org/html/rfc6856), [UTF8=USER](https://tools.ietf.org/html/rfc6856), and [LANG](https://tools.ietf.org/html/rfc6856) * All APIs are cancellable. * Async APIs are available. * IMAP4 Client * Supports all of the SASL mechanisms listed above. * Supports SSL-wrapped connections via the "imaps" protocol. * Supports client SSL/TLS certificates. * Supports the following extensions: [ACL](https://tools.ietf.org/html/rfc4314), [QUOTA](https://tools.ietf.org/html/rfc2087), [LITERAL+](https://tools.ietf.org/html/rfc2088), [IDLE](https://tools.ietf.org/html/rfc2177), [NAMESPACE](https://tools.ietf.org/html/rfc2342), [ID](https://tools.ietf.org/html/rfc2971), [CHILDREN](https://tools.ietf.org/html/rfc3348), [LOGINDISABLED](https://tools.ietf.org/html/rfc3501), [STARTTLS](https://tools.ietf.org/html/rfc3501), [MULTIAPPEND](https://tools.ietf.org/html/rfc3502), [UNSELECT](https://tools.ietf.org/html/rfc3691), [UIDPLUS](https://tools.ietf.org/html/rfc4315), [CONDSTORE](https://tools.ietf.org/html/rfc4551), [ESEARCH](https://tools.ietf.org/html/rfc4731), [SASL-IR](https://tools.ietf.org/html/rfc4959), [COMPRESS](https://tools.ietf.org/html/rfc4978), [WITHIN](https://tools.ietf.org/html/rfc5032), [ENABLE](https://tools.ietf.org/html/rfc5161), [QRESYNC](https://tools.ietf.org/html/rfc5162), [SORT](https://tools.ietf.org/html/rfc5256), [THREAD](https://tools.ietf.org/html/rfc5256), [ANNOTATE](https://tools.ietf.org/html/rfc5257), [LIST-EXTENDED](https://tools.ietf.org/html/rfc5258), [ESORT](https://tools.ietf.org/html/rfc5267), [METADATA / METADATA-SERVER](https://tools.ietf.org/html/rfc5464), [NOTIFY](https://tools.ietf.org/html/rfc5465), [FILTERS](https://tools.ietf.org/html/rfc5466), [LIST-STATUS](https://tools.ietf.org/html/rfc5819), [SORT=DISPLAY](https://tools.ietf.org/html/rfc5957), [SPECIAL-USE / CREATE-SPECIAL-USE](https://tools.ietf.org/html/rfc6154), [SEARCH=FUZZY](https://tools.ietf.org/html/rfc6203), [MOVE](https://tools.ietf.org/html/rfc6851), [UTF8=ACCEPT / UTF8=ONLY](https://tools.ietf.org/html/rfc6855), [LITERAL-](https://tools.ietf.org/html/rfc7888), [APPENDLIMIT](https://tools.ietf.org/html/rfc7889), [STATUS=SIZE](https://tools.ietf.org/html/rfc8438), [OBJECTID](https://tools.ietf.org/html/rfc8474), [REPLACE](https://tools.ietf.org/html/rfc8508), [SAVEDATE](https://tools.ietf.org/html/rfc8514), [XLIST](https://developers.google.com/gmail/imap_extensions), and [X-GM-EXT1](https://developers.google.com/gmail/imap_extensions) (X-GM-MSGID, X-GM-THRID, X-GM-RAW and X-GM-LABELS) * All APIs are cancellable. * Async APIs are available. * Client-side sorting and threading of messages. ## Goals The main goal of this project is to provide the .NET world with robust, fully featured and RFC-compliant SMTP, POP3, and IMAP client implementations. All of the other .NET IMAP client implementations that I could find suffer from major architectural problems such as ignoring unexpected untagged responses, assuming that literal string tokens will never be used for anything other than message bodies (when in fact they could be used for pretty much any string token in a response), assuming that the way to find the end of a message body in a FETCH response is by scanning for `") UID"`, and not properly handling mailbox names with international characters to simply name a few. IMAP requires a LOT of time spent laboriously reading and re-reading the IMAP specifications (as well as the MIME specifications) to understand all of the subtleties of the protocol and most (all?) of the other Open Source .NET IMAP libraries, at least, were written by developers that only cared enough that it worked for their simple needs. There's nothing necessarily wrong with doing that, but the web is full of half-working, non-RFC-compliant IMAP implementations out there that it was finally time for a carefully designed and implemented IMAP client library to be written. For POP3, libraries such as OpenPOP.NET are actually fairly decent, although the MIME parser is far too strict - throwing exceptions any time it encounters a Content-Type or Content-Disposition parameter that it doesn't already know about, which, if you read over the mailing-list, is a problem that OpenPOP.NET users are constantly running into. MailKit's Pop3Client, of course, doesn't have this problem. It also parses messages directly from the socket instead of downloading the message into a large string buffer before parsing it, so you'll probably find that not only is MailKit faster (MailKit's MIME parser, [MimeKit](https://github.com/jstedfast/MimeKit), parses messages from disk 25x faster than OpenPOP.NET's parser), but also uses far less memory. For SMTP, most developers use System.Net.Mail.SmtpClient which suits their needs more-or-less satisfactorily and so is probably not high on their list of needs. However, the SmtpClient implementation included with MailKit is a much better option if cross-platform support is needed or if the developer wants to be able to save and re-load MIME messages before sending them via SMTP. MailKit's SmtpClient also supports PIPELINING which should improve performance of sending messages (although might not be very noticeable). ## License Information ```text MIT License Copyright (C) 2013-2026 .NET Foundation and Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` ## Installing via NuGet The easiest way to install MailKit is via [NuGet](https://www.nuget.org/packages/MailKit/). In Visual Studio's [Package Manager Console](https://docs.nuget.org/docs/start-here/using-the-package-manager-console), enter the following command: Install-Package MailKit ## Getting the Source Code First, you'll need to clone MailKit from my GitHub repository. To do this using the command-line version of Git, you'll need to issue the following command in your terminal: git clone --recursive https://github.com/jstedfast/MailKit.git If you are using [TortoiseGit](https://tortoisegit.org) on Windows, you'll need to right-click in the directory where you'd like to clone MailKit and select **Git Clone...** in the menu. Once you do that, you'll get the following dialog: ![Download the source code using TortoiseGit](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/clone.png) Fill in the areas outlined in red and then click **OK**. This will recursively clone MailKit onto your local machine. ## Updating the Source Code Occasionally you might want to update your local copy of the source code if I have made changes to MailKit since you downloaded the source code in the step above. To do this using the command-line version of Git, you'll need to issue the following commands in your terminal within the MailKit directory: git pull git submodule update If you are using [TortoiseGit](https://tortoisegit.org) on Windows, you'll need to right-click on the MailKit directory and select **Git Sync...** in the menu. Once you do that, you'll need to click the **Pull** and **Submodule Update** buttons in the following dialog: ![Update the source code using TortoiseGit](https://github.com/jstedfast/MailKit/blob/master/Documentation/media/update.png) ## Building In the top-level MailKit directory, there are a number of solution files; they are: * **MailKit.sln** - includes the projects for .NET Framework 4.6.2/4.7/4.8, .NETStandard 2.0/2.1, .NET6.0 as well as the unit tests. * **MailKit.Coverity.sln** - this is used to generate Coverity static analysis builds and is not generally useful. * **MailKit.Documentation.sln** - this is used to generate the documentation found at https://mimekit.net/docs Once you've opened the appropriate MailKit solution file in [Visual Studio](https://www.visualstudio.com/downloads/), you can choose the **Debug** or **Release** build configuration and then build. Both Visual Studio 2017 and Visual Studio 2019 should be able to build MailKit without any issues, but older versions such as Visual Studio 2015 will require modifications to the projects in order to build correctly. It has been reported that adding NuGet package references to [Microsoft.Net.Compilers](https://www.nuget.org/packages/Microsoft.Net.Compilers/) >= 3.6.0 and [System.ValueTuple](https://www.nuget.org/packages/System.ValueTuple/) >= 4.5.0 to the MimeKit and MailKit projects will allow them to build successfully. Note: The **Release** build will generate the xml API documentation, but the **Debug** build will not. ## Using MailKit ### Sending Messages One of the more common operations that MailKit is meant for is sending email messages. ```csharp using System; using MailKit.Net.Smtp; using MailKit; using MimeKit; namespace TestClient { class Program { public static void Main (string[] args) { var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Joey Tribbiani", "joey@friends.com")); message.To.Add (new MailboxAddress ("Mrs. Chanandler Bong", "chandler@friends.com")); message.Subject = "How you doin'?"; message.Body = new TextPart ("plain") { Text = @"Hey Chandler, I just wanted to let you know that Monica and I were going to go play some paintball, you in? -- Joey" }; using (var client = new SmtpClient ()) { client.Connect ("smtp.friends.com", 587, false); // Note: only needed if the SMTP server requires authentication client.Authenticate ("joey", "password"); client.Send (message); client.Disconnect (true); } } } } ``` ## Retrieving Messages (via Pop3) One of the other main uses of MailKit is retrieving messages from pop3 servers. ```csharp using System; using MailKit.Net.Pop3; using MailKit; using MimeKit; namespace TestClient { class Program { public static void Main (string[] args) { using (var client = new Pop3Client ()) { client.Connect ("pop.friends.com", 110, false); client.Authenticate ("joey", "password"); for (int i = 0; i < client.Count; i++) { var message = client.GetMessage (i); Console.WriteLine ("Subject: {0}", message.Subject); } client.Disconnect (true); } } } } ``` ## Using IMAP More important than POP3 support is the IMAP support. Here's a simple use-case of retrieving messages from an IMAP server: ```csharp using System; using MimeKit; using MailKit; using MailKit.Search; using MailKit.Net.Imap; namespace TestClient { class Program { public static void Main (string[] args) { using (var client = new ImapClient ()) { client.Connect ("imap.friends.com", 993, true); client.Authenticate ("joey", "password"); // The Inbox folder is always available on all IMAP servers... var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); Console.WriteLine ("Total messages: {0}", inbox.Count); Console.WriteLine ("Recent messages: {0}", inbox.Recent); for (int i = 0; i < inbox.Count; i++) { var message = inbox.GetMessage (i); Console.WriteLine ("Subject: {0}", message.Subject); } client.Disconnect (true); } } } } ``` ### Fetching Information About the Messages in an IMAP Folder One of the advantages of IMAP over POP3 is that the IMAP protocol allows clients to retrieve information about the messages in a folder without having to first download all of them. Using the [Fetch](https://www.mimekit.net/docs/html/Overload_MailKit_Net_Imap_ImapFolder_Fetch.htm) and [FetchAsync](https://www.mimekit.net/docs/html/Overload_MailKit_Net_Imap_ImapFolder_FetchAsync.htm) method overloads (or the convenient [extension methods](https://www.mimekit.net/docs/html/Overload_MailKit_IMailFolderExtensions_Fetch.htm)), it's possible to obtain any subset of summary information for any range of messages in a given folder. ```csharp foreach (var summary in inbox.Fetch (0, -1, MessageSummaryItems.Envelope)) { Console.WriteLine ("[summary] {0:D2}: {1}", summary.Index, summary.Envelope.Subject); ``` It's also possible to use Fetch/FetchAsync APIs that take an [IFetchRequest](https://www.mimekit.net/docs/html/T_MailKit_IFetchRequest.htm) argument to get even more control over what to fetch: ```csharp // Let's Fetch non-Received headers: var request = new FetchRequest { Headers = new HeaderSet (new HeaderId[] { HeaderId.Received }) { Exclude = true } }; foreach (var summary in inbox.Fetch (0, -1, request)) { Console.WriteLine ("[summary] {0:D2}: {1}", summary.Index, summary.Headers[HeaderId.Subject]); ``` The results of a Fetch method can also be used to download individual MIME parts rather than downloading the entire message. For example: ```csharp foreach (var summary in inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure)) { if (summary.TextBody != null) { // this will download *just* the text/plain part var text = inbox.GetBodyPart (summary.UniqueId, summary.TextBody); } if (summary.HtmlBody != null) { // this will download *just* the text/html part var html = inbox.GetBodyPart (summary.UniqueId, summary.HtmlBody); } // if you'd rather grab, say, an image attachment... it might look something like this: if (summary.Body is BodyPartMultipart) { var multipart = (BodyPartMultipart) summary.Body; var attachment = multipart.BodyParts.OfType ().FirstOrDefault (x => x.FileName == "logo.jpg"); if (attachment != null) { // this will download *just* the attachment var part = inbox.GetBodyPart (summary.UniqueId, attachment); } } } ``` ### Setting Message Flags in IMAP In order to set or update the flags on a particular message, what is actually needed is the UID or index of the message and the folder that it belongs to. An obvious reason to want to update message flags is to mark a message as "read" (aka "seen") after a user has opened a message and read it. ```csharp folder.Store (uid, new StoreFlagsRequest (StoreAction.Add, MessageFlags.Seen) { Silent = true }); ``` ### Deleting Messages in IMAP Deleting messages in IMAP involves setting a `\Deleted` flag on a message and, optionally, expunging it from the folder. The way to mark a message as `\Deleted` works the same way as marking a message as `\Seen`. ```csharp folder.Store (uid, new StoreFlagsRequest (StoreAction.Add, MessageFlags.Deleted) { Silent = true }); folder.Expunge (); ``` ### Searching an IMAP Folder You may also be interested in sorting and searching... ```csharp // let's search for all messages received after Jan 12, 2013 with "MailKit" in the subject... var query = SearchQuery.DeliveredAfter (DateTime.Parse ("2013-01-12")) .And (SearchQuery.SubjectContains ("MailKit")).And (SearchQuery.Seen); foreach (var uid in inbox.Search (query)) { var message = inbox.GetMessage (uid); Console.WriteLine ("[match] {0}: {1}", uid, message.Subject); } // let's do the same search, but this time sort them in reverse arrival order var orderBy = new [] { OrderBy.ReverseArrival }; foreach (var uid in inbox.Sort (query, orderBy)) { var message = inbox.GetMessage (uid); Console.WriteLine ("[match] {0}: {1}", uid, message.Subject); } // you'll notice that the orderBy argument is an array... this is because you // can actually sort the search results based on multiple columns: orderBy = new [] { OrderBy.ReverseArrival, OrderBy.Subject }; foreach (var uid in inbox.Sort (query, orderBy)) { var message = inbox.GetMessage (uid); Console.WriteLine ("[match] {0}: {1}", uid, message.Subject); } ``` Of course, instead of downloading the message, you could also fetch the summary information for the matching messages or do any of a number of other things with the UIDs that are returned. ### Navigating Folders in IMAP How about navigating folders? MailKit can do that, too: ```csharp // Get the first personal namespace and list the toplevel folders under it. var personal = client.GetFolder (client.PersonalNamespaces[0]); foreach (var folder in personal.GetSubfolders (false)) Console.WriteLine ("[folder] {0}", folder.Name); ``` If the IMAP server supports the SPECIAL-USE or the XLIST (GMail) extension, you can get a hold of the pre-defined All, Drafts, Flagged (aka Important), Junk, Sent, Trash, etc folders like this: ```csharp if ((client.Capabilities & (ImapCapabilities.SpecialUse | ImapCapabilities.XList)) != 0) { var drafts = client.GetFolder (SpecialFolder.Drafts); } else { // maybe check the user's preferences for the Drafts folder? } ``` In cases where the IMAP server does *not* support the SPECIAL-USE or XLIST extensions, you'll have to come up with your own heuristics for getting the Sent, Drafts, Trash, etc folders. For example, you might use logic similar to this: ```csharp static string[] CommonSentFolderNames = { "Sent Items", "Sent Mail", "Sent Messages", /* maybe add some translated names */ }; static IFolder GetSentFolder (ImapClient client, CancellationToken cancellationToken) { var personal = client.GetFolder (client.PersonalNamespaces[0]); foreach (var folder in personal.GetSubfolders (false, cancellationToken)) { foreach (var name in CommonSentFolderNames) { if (folder.Name == name) return folder; } } return null; } ``` Using LINQ, you could simplify this down to something more like this: ```csharp static string[] CommonSentFolderNames = { "Sent Items", "Sent Mail", "Sent Messages", /* maybe add some translated names */ }; static IFolder GetSentFolder (ImapClient client, CancellationToken cancellationToken) { var personal = client.GetFolder (client.PersonalNamespaces[0]); return personal.GetSubfolders (false, cancellationToken).FirstOrDefault (x => CommonSentFolderNames.Contains (x.Name)); } ``` Another option might be to allow the user of your application to configure which folder he or she wants to use as their Sent folder, Drafts folder, Trash folder, etc. How you handle this is up to you. ## Contributing The first thing you'll need to do is fork MailKit to your own GitHub repository. For instructions on how to do that, see the section titled **Getting the Source Code**. If you use [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/) or [MonoDevelop](https://monodevelop.com), all of the solution files are configured with the coding style used by MailKit. If you use Visual Studio on Windows or some other editor, please try to maintain the existing coding style as best as you can. Once you've got some changes that you'd like to submit upstream to the official MailKit repository, send me a **Pull Request** and I will try to review your changes in a timely manner. If you'd like to contribute but don't have any particular features in mind to work on, check out the issue tracker and look for something that might pique your interest! ## Reporting Bugs Have a bug or a feature request? Please open a new [bug report](https://github.com/jstedfast/MailKit/issues/new?template=bug_report.md) or [feature request](https://github.com/jstedfast/MailKit/issues/new?template=feature_request.md). Before opening a new issue, please search through any [existing issues](https://github.com/jstedfast/MailKit/issues) to avoid submitting duplicates. It may also be worth checking the [FAQ](https://github.com/jstedfast/MailKit/blob/master/FAQ.md) for common questions that other developers have had. If MailKit does not work with your mail server, please include a [protocol log](https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog) in your bug report, otherwise there is nothing I can do to fix the problem. If you are getting an exception from somewhere within MailKit, don't just provide the `Exception.Message` string. Please include the `Exception.StackTrace` as well. The `Message`, by itself, is often useless. ## Documentation API documentation can be found at [https://www.mimekit.net/docs](https://www.mimekit.net/docs). Some example snippets can be found in the [`Documentation/Examples`](https://github.com/jstedfast/MailKit/tree/master/Documentation/Examples) directory. Sample applications can be found in the [`samples`](https://github.com/jstedfast/MailKit/tree/master/samples) directory. A copy of the XML-formatted API reference documentation is also included in the NuGet package. ## .NET Foundation MailKit is a [.NET Foundation](https://www.dotnetfoundation.org/projects) project. This project has adopted the code of conduct defined by the [Contributor Covenant](https://contributor-covenant.org/) to clarify expected behavior in our community. For more information, see the [.NET Foundation Code of Conduct](https://www.dotnetfoundation.org/code-of-conduct). General .NET OSS discussions: [.NET Foundation forums](https://forums.dotnetfoundation.org) ================================================ FILE: RFCs.md ================================================ ### Specifications The following IETF specifications define the IMAP, POP3 and SMTP protocols: * [821](https://tools.ietf.org/html/rfc821): SIMPLE MAIL TRANSFER PROTOCOL * [822](https://tools.ietf.org/html/rfc822): STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES * [974](https://tools.ietf.org/html/rfc974): MAIL ROUTING AND THE DOMAIN SYSTEM * [1081](https://tools.ietf.org/html/rfc1081): Post Office Protocol - Version 3 * [1123](https://tools.ietf.org/html/rfc1123): Requirements for Internet Hosts -- Application and Support * [1225](https://tools.ietf.org/html/rfc1225): Post Office Protocol - Version 3 (Obsoletes rfc1081) * [1425](https://tools.ietf.org/html/rfc1425): SMTP Service Extensions * [1426](https://tools.ietf.org/html/rfc1426): SMTP Service Extension for 8bit-MIME transport * [1460](https://tools.ietf.org/html/rfc1460): Post Office Protocol - Version 3 (Obsoletes rfc1225) * [1651](https://tools.ietf.org/html/rfc1651): SMTP Service Extensions (Obsoletes rfc1425) * [1652](https://tools.ietf.org/html/rfc1652): SMTP Service Extension for 8bit-MIME transport (Obsoletes rfc1426) * [1653](https://tools.ietf.org/html/rfc1653): SMTP Service Extension for Message Size Declaration * [1725](https://tools.ietf.org/html/rfc1725): Post Office Protocol - Version 3 (Obsoletes rfc1460) * [1730](https://tools.ietf.org/html/rfc1730): INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4 * [1731](https://tools.ietf.org/html/rfc1731): IMAP4 Authentication Mechanisms * [1734](https://tools.ietf.org/html/rfc1734): POP3 AUTHentication command * [1830](https://tools.ietf.org/html/rfc1830): SMTP Service Extensions for Transmission of Large and Binary MIME Messages * [1854](https://tools.ietf.org/html/rfc1854): SMTP Service Extension for Command Pipelining * [1870](https://tools.ietf.org/html/rfc1870): SMTP Service Extension for Message Size Declaration (Obsoletes rfc1653) * [1869](https://tools.ietf.org/html/rfc1869): SMTP Service Extensions * [1891](https://tools.ietf.org/html/rfc1891): SMTP Service Extension for Delivery Status Notifications * [1928](https://tools.ietf.org/html/rfc1928): SOCKS Protocol Version 5 * [1929](https://tools.ietf.org/html/rfc1929): Username/Password Authentication for SOCKS V5 * [1939](https://tools.ietf.org/html/rfc1939): Post Office Protocol - Version 3 (Obsoletes rfc1725) * [1961](https://tools.ietf.org/html/rfc1961): GSS-API Authentication Method for SOCKS Version 5 * [2034](https://tools.ietf.org/html/rfc2034): SMTP Service Extension for Returning Enhanced Error Codes * [2060](https://tools.ietf.org/html/rfc2060): INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 (Obsoletes rfc1730) * [2086](https://tools.ietf.org/html/rfc2086): IMAP4 ACL extension * [2087](https://tools.ietf.org/html/rfc2087): IMAP4 QUOTA extension * [2088](https://tools.ietf.org/html/rfc2088): IMAP4 non-synchronizing literals * [2095](https://tools.ietf.org/html/rfc2095): IMAP/POP AUTHorize Extension for Simple Challenge/Response * [2177](https://tools.ietf.org/html/rfc2177): IMAP4 IDLE command * [2193](https://tools.ietf.org/html/rfc2193): IMAP4 Mailbox Referrals * [2195](https://tools.ietf.org/html/rfc2195): IMAP/POP AUTHorize Extension for Simple Challenge/Response (Obsoletes rfc2095) * [2197](https://tools.ietf.org/html/rfc2197): SMTP Service Extension for Command Pipelining (Obsoletes rfc1854) * [2221](https://tools.ietf.org/html/rfc2221): IMAP4 Login Referrals * [2222](https://tools.ietf.org/html/rfc2222): Simple Authentication and Security Layer (SASL) * [2245](https://tools.ietf.org/html/rfc2245): Anonymous SASL Mechanism * [2342](https://tools.ietf.org/html/rfc2342): IMAP4 Namespace * [2359](https://tools.ietf.org/html/rfc2359): IMAP4 UIDPLUS extension * [2449](https://tools.ietf.org/html/rfc2449): POP3 Extension Mechanism (Updates rfc1939) * [2487](https://tools.ietf.org/html/rfc2487): SMTP Service Extension for Secure SMTP over TLS * [2554](https://tools.ietf.org/html/rfc2554): SMTP Service Extension for Authentication * [2595](https://tools.ietf.org/html/rfc2595): Using TLS with IMAP, POP3 and ACAP * [2683](https://tools.ietf.org/html/rfc2683): IMAP4 Implementation Recommendations * [2821](https://tools.ietf.org/html/rfc2821): Simple Mail Transfer Protocol (Obsoletes rfc0821, rfc0974, rfc1869) (Updates rfc1123) * [2822](https://tools.ietf.org/html/rfc2822): Internet Message Format (Obsoletes rfc0822) * [2831](https://tools.ietf.org/html/rfc2831): Using Digest Authentication as a SASL Mechanism * [2920](https://tools.ietf.org/html/rfc2920): SMTP Service Extension for Command Pipelining (Obsoletes rfc2197) * [2971](https://tools.ietf.org/html/rfc2971): IMAP4 ID extension * [3030](https://tools.ietf.org/html/rfc3030): SMTP Service Extensions for Transmission of Large and Binary MIME Messages (Obsoletes rfc1830) * [3207](https://tools.ietf.org/html/rfc3207): SMTP Service Extension for Secure SMTP over Transport Layer Security (Obsoletes rfc2487) * [3348](https://tools.ietf.org/html/rfc3348): The Internet Message Action Protocol (IMAP4) Child Mailbox Extension * [3461](https://tools.ietf.org/html/rfc3461): Simple Mail Transfer Protocol (SMTP) Service Extension for Delivery Status Notifications (DSNs) (Obsoletes rfc1891) * [3501](https://tools.ietf.org/html/rfc3501): INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 (Obsoletes rfc2060) * [3502](https://tools.ietf.org/html/rfc3502): Internet Message Access Protocol (IMAP) - MULTIAPPEND Extension * [3516](https://tools.ietf.org/html/rfc3516): IMAP4 Binary Content Extension * [3691](https://tools.ietf.org/html/rfc3691): Handle System Namespace and Service Definition * [4013](https://tools.ietf.org/html/rfc4013): SASLprep: Stringprep Profile for User Names and Passwords * [4314](https://tools.ietf.org/html/rfc4314): IMAP4 Access Control List (ACL) Extension (Obsoletes rfc2086) * [4315](https://tools.ietf.org/html/rfc4315): Internet Message Access Protocol (IMAP) - UIDPLUS extension (Obsoletes rfc2359) * [4466](https://tools.ietf.org/html/rfc4466): Collected Extensions to IMAP4 ABNF (Updates rfc2088, rfc2342, rfc3501, rfc3502, rfc3516) * [4469](https://tools.ietf.org/html/rfc4469): Internet Message Access Protocol (IMAP) CATENATE Extension (Updates rfc3501, rfc3502) * [4505](https://tools.ietf.org/html/rfc4505): Anonymous Simple Authentication and Security Layer (SASL) Mechanism (Obsoletes rfc2245) * [4551](https://tools.ietf.org/html/rfc4551): IMAP Extension for Conditional STORE Operation or Quick Flag Changes Resynchronization (Updates rfc3501) * [4616](https://tools.ietf.org/html/rfc4616): The PLAIN Simple Authentication and Security Layer (SASL) Mechanism (Updates rfc2595) * [4731](https://tools.ietf.org/html/rfc4731): IMAP4 Extension to SEARCH Command for Controlling What Kind of Information Is Returned * [4952](https://tools.ietf.org/html/rfc4952): Overview and Framework for Internationalized Email * [4959](https://tools.ietf.org/html/rfc4959): IMAP Extension for Simple Authentication and Security Layer (SASL) Initial Client Response * [4978](https://tools.ietf.org/html/rfc4978): The IMAP COMPRESS Extension * [5032](https://tools.ietf.org/html/rfc5032): WITHIN Search Extension to the IMAP Protocol (Updates rfc3501) * [5161](https://tools.ietf.org/html/rfc5161): The IMAP ENABLE Extension * [5162](https://tools.ietf.org/html/rfc5162): IMAP4 Extensions for Quick Mailbox Resynchronization * [5182](https://tools.ietf.org/html/rfc5182): IMAP Extension for Referencing the Last SEARCH Result (Updates rfc3501) * [5255](https://tools.ietf.org/html/rfc5255): Internet Message Access Protocol Internationalization * [5256](https://tools.ietf.org/html/rfc5256): Internet Message Access Protocol - SORT and THREAD Extensions * [5257](https://tools.ietf.org/html/rfc5257): Internet Message Access Protocol - ANNOTATE Extension * [5258](https://tools.ietf.org/html/rfc5258): Internet Message Access Protocol version 4 - LIST Command Extensions (Obsoletes rfc3348) (Updates rfc2193) * [5259](https://tools.ietf.org/html/rfc5259): Internet Message Access Protocol - CONVERT Extension * [5267](https://tools.ietf.org/html/rfc5267): Contexts for IMAP4 * [5321](https://tools.ietf.org/html/rfc5321): Simple Mail Transfer Protocol (Obsoletes rfc2821) (Updates rfc1123) * [5336](https://tools.ietf.org/html/rfc5336): SMTP Extension for Internationalized Email Addresses (Updates rfc2821, rfc2822, rfc4952) * [5464](https://tools.ietf.org/html/rfc5464): The IMAP METADATA Extension * [5465](https://tools.ietf.org/html/rfc5465): The IMAP NOTIFY Extension (Updates rfc5267) * [5466](https://tools.ietf.org/html/rfc5466): IMAP4 Extension for Named Searches (Filters) * [5530](https://tools.ietf.org/html/rfc5530): IMAP Response Codes * [5721](https://tools.ietf.org/html/rfc5721): POP3 Support for UTF-8 * [5738](https://tools.ietf.org/html/rfc5738): IMAP Support for UTF-8 (Updates rfc3501) * [5788](https://tools.ietf.org/html/rfc5788): IMAP4 Keyword Registry * [5801](https://tools.ietf.org/html/rfc5801): Using Generic Security Service Application Program Interface (GSS-API) Mechanisms in Simple Authentication and Security Layer (SASL): The GS2 Mechanism Family * [5802](https://tools.ietf.org/html/rfc5802): Salted Challenge Response Authentication Mechanism (SCRAM) SASL and GSS-API Mechanisms * [5819](https://tools.ietf.org/html/rfc5819): IMAP4 Extension for Returning STATUS Information in Extended LIST * [5957](https://tools.ietf.org/html/rfc5957): Display-Based Address Sorting for the IMAP4 SORT Extension (Updates rfc5256) * [6154](https://tools.ietf.org/html/rfc6154): IMAP LIST Extension for Special-Use Mailboxes * [6203](https://tools.ietf.org/html/rfc6203): IMAP4 Extension for Fuzzy Search * [6237](https://tools.ietf.org/html/rfc6237): IMAP4 Multimailbox SEARCH Extension (Obsoletes rfc4466) * [6531](https://tools.ietf.org/html/rfc6531): SMTP Extension for Internationalized Email (Obsoletes rfc5336) * [6851](https://tools.ietf.org/html/rfc6851): Internet Message Access Protocol (IMAP) - MOVE Extension * [6855](https://tools.ietf.org/html/rfc6855): IMAP Support for UTF-8 (Obsoletes rfc5738) * [6856](https://tools.ietf.org/html/rfc6856): Post Office Protocol Version 3 (POP3) Support for UTF-8 (Obsoletes rfc5721) * [7162](https://tools.ietf.org/html/rfc7162): IMAP Extensions: Quick Flag Changes Resynchronization (CONDSTORE) and Quick Mailbox Resynchronization (QRESYNC) (Obsoletes rfc4551, rfc5162) (Updates rfc2683) * [7377](https://tools.ietf.org/html/rfc7377): IMAP4 Multimailbox SEARCH Extension (Obsoletes rfc6237) (Updates rfc4466) * [7628](https://tools.ietf.org/html/rfc7628): A Set of Simple Authentication and Security Layer (SASL) Mechanisms for OAuth * [7677](https://tools.ietf.org/html/rfc7677): SCRAM-SHA-256 and SCRAM-SHA-256-PLUS Simple Authentication and Security Layer (SASL) Mechanisms (Updates rfc5802) * [7888](https://tools.ietf.org/html/rfc7888): IMAP4 Non-synchronizing Literals (Obsoletes rfc2088) * [7889](https://tools.ietf.org/html/rfc7889): The IMAP APPENDLIMIT Extension * [8437](https://tools.ietf.org/html/rfc8437): IMAP UNAUTHENTICATE Extension for Connection Reuse (Updates rfc3501) * [8438](https://tools.ietf.org/html/rfc8438): IMAP Extension for STATUS=SIZE * [8440](https://tools.ietf.org/html/rfc8440): IMAP4 Extension for Returning MYRIGHTS Information in Extended LIST * [8457](https://tools.ietf.org/html/rfc8457): IMAP "$Important" Keyword and "\Important" Special-Use Attribute * [8474](https://tools.ietf.org/html/rfc8474): IMAP Extension for Object Identifiers * [8508](https://tools.ietf.org/html/rfc8508): IMAP REPLACE Extension (Updates rfc3501) * [8514](https://tools.ietf.org/html/rfc8514): Internet Message Access Protocol (IMAP) - SAVEDATE Extension * [8689](https://tools.ietf.org/html/rfc8689): SMTP Require TLS Option * [8970](https://tools.ietf.org/html/rfc8970): IMAP4 Extension: Message Preview Generation * [9051](https://tools.ietf.org/html/rfc9051): Internet Message Access Protocol (IMAP) - Version 4rev2 * [9208](https://tools.ietf.org/html/rfc9208): IMAP QUOTA Extension (Obsoletes rfc2087) * [9394](https://tools.ietf.org/html/rfc9394): IMAP PARTIAL Extension for Paged SEARCH and FETCH ================================================ FILE: ReleaseNotes.md ================================================ # Release Notes ## MailKit 4.15.1 (2026-03-04) * SECURITY: Bumped MimeKit to 4.15.1 for a security fix that prevents mailbox addresses from being allowed to contain CRLF sequences which can be used to inject SMTP commands in the SmtpClient when it sends `MAIL FROM` or `RCPT TO` commands. ## MailKit 4.15.0 (2026-02-15) * Default the SmtpClient/Pop3Client/ImapClient.SslProtocols to the ServicePointManager.SecurityProtocol value in .NET Framework (net4x). (issue [#1952](https://github.com/jstedfast/MailKit/issues/1952)) * Added support for.NET 10. * Marked IMailService.SslCipherAlgorithm, SslCipherStrength, SslHashAlgorithm, SslHashStrength, SslKeyExchangeAlgorithm, and SslKeyExchangeStrength as Obsolete in .NET 10 in favor of the IMailService.SslCipherSuite property (.NET 10 only). * Bumped MimeKit dependency to 4.15.0. ## MailKit 4.14.1 (2025-10-13) * Re-added NTLM to the list of mechanisms to try by default. (issue [#1953](https://github.com/jstedfast/MailKit/issues/1953)) * Fixed IMAP to treat '+' as a normal Atom token. (issue [#1956](https://github.com/jstedfast/MailKit/issues/1956)) * Added fallback logic for imap.strato.de if LIST doesn't return the INBOX. (issue [#1957](https://github.com/jstedfast/MailKit/issues/1957)) ## MailKit 4.14.0 (2025-09-28) * Updated MailService::GetSslClientAuthenticationOptions to be protected virtual. (issue [#1931](https://github.com/jstedfast/MailKit/issues/1931)) * Fixed initialization of SaslMechanism to lazily check if GSSAPI and/or NTLM are supported (natively) to avoid undesirable error messages appearing in dotnet logs on Linux systems. (issue [#1924](https://github.com/jstedfast/MailKit/issues/1924)) * Bumped MimeKit dependency to 4.14.0. ## MailKit 4.13.0 (2025-06-25) * Fixed tokenization of IMAP atom tokens that start with '+'. (issue [#1914](https://github.com/jstedfast/MailKit/issues/1914)) * Fixed the Imap/Pop3/Smtp clients to no longer fallback to using the ServicePointManager.ServerCertificateValidationCallback method on .NET Core. (issue [#1925](https://github.com/jstedfast/MailKit/issues/1925)) * Bumped MimeKit dependency to 4.13.0. ## MailKit 4.12.1 (2025-05-17) * Fixed authentication bugs introduced into 4.12.0 related to adding GSSAPI and native NTLM auth support which causes problems on Linux/Mac. (issue [#1910](https://github.com/jstedfast/MailKit/issues/1910)) (issue [#1911](https://github.com/jstedfast/MailKit/issues/1911)) * Reverted System.Threading.Tasks.Extensions dependency back to 4.6.2. * Reverted System.Formats.Asn1 dependency back to 8.0.1. ## MailKit 4.12.0 (2025-04-28) * Added support for native NTLM auth (using .NET Core's NegotiateAuthentication API). This new class is called SaslMechanismNtlmNative and is the default NTLM mechanism used by MailKit clients on net8.0+. * Added support for the GSSAPI SASL mechanism for net8.0+. (issue [#1249](https://github.com/jstedfast/MailKit/issues/1249)) * Fixed MailFolder.FirstUnread to be initialized to -1 to indicate unknown. (issue [#1898](https://github.com/jstedfast/MailKit/issues/1898)) * Added support for non-compliant keywords that begin with '\'. (issue [#1906](https://github.com/jstedfast/MailKit/issues/1906)) * Added SearchQuery.HasKeywords/NotKeywords() overloads that take params instead of IEnumerable<string>. * Bumped System.Threading.Tasks.Extensions from 4.6.2 to 4.6.3. * Bumped System.Formats.Asn1 from 8.0.1 to 8.0.2. * Bumped MimeKit dependency to 4.12.0. ## MailKit 4.11.0 (2025-03-08) * Default MailService.SslProtocols to SslProtocols.None which is what the dotnet SslStream team recommends. (As weird as it may seem, SslProtocols.None does not mean "don't support any SSL protocols", it means don't override the default system settings.) * Bumped MimeKit dependency to 4.11.0. ## MailKit 4.10.0 (2025-01-26) * Work around a QQMail/Yandex IMAP BODYSTRUCTURE response for empty multipart. (issue [#1861](https://github.com/jstedfast/MailKit/issues/1861)) * Added exception documentation for methods in IMailFolder. (issue [#1868](https://github.com/jstedfast/MailKit/issues/1868)) * Added IMailFolder.CanOpen property that checks IMailFolder.Attributes for NoSelect and NonExistent flags. * Bumped MimeKit dependency to 4.10.0. ## MailKit 4.9.0 (2024-12-09) * Added an IMAP work-around for mail.ru which sometimes sends integer tokens as decimals in its responses. (issue [#1838](https://github.com/jstedfast/MailKit/issues/1838)) * Added a workaround for GMail IMAP BODY responses that include multipart expressions without any children (e.g. `("ALTERNATIVE")`). (issue [#1841](https://github.com/jstedfast/MailKit/issues/1841)) * Fixed default system proxy to handle null credentials and check if the targetUri is bypassed. (issue [#1852](https://github.com/jstedfast/MailKit/issues/1852)) * Dropped support for net6.0 (Microsoft support ended Nov 12, 2024). * Bumped System.Threading.Tasks.Extensions dependency to 4.6.0. * Bumped MimeKit dependency to 4.9.0. ## MailKit 4.8.0 (2024-09-29) * Added a UniqueIdRange.SortOrder property. * Updated the protocol log help link for ProtocolExceptions. (issue [#1800](https://github.com/jstedfast/MailKit/issues/1800)) * Fix SmtpClient.Dispose() when telemetry is configured. (issue [#1816](https://github.com/jstedfast/MailKit/issues/1816)) * Added ProxyClient.SystemProxy as a convenience property that wraps the default system proxy (aka HttpClient.DefaultProxy) on net6.0+. ## MailKit 4.7.1 (2024-07-12) * Fixed ImapClient and Pop3Client.Connect/Async() when OTEL is enabled. (issue [#1765](https://github.com/jstedfast/MailKit/issues/1765)) * Bumped MimeKit dependency to 4.7.1 to fix a denial of service security issue in the System.Formats.Asn1 dependency. ## MailKit 4.7.0 (2024-06-29) * Added Activity/Metrics for Imap/Pop3/SmtpClient. (issue [#1499](https://github.com/jstedfast/MailKit/issues/1499)) * Bumped MimeKit dependency to 4.7.0. ## MailKit 4.6.0 (2024-05-17) * Swallow SMTP RSET exceptions. These obscure other Send/SendAsync exceptions. Fixes a regression introduced in 4.4.0. (issue [#1748](https://github.com/jstedfast/MailKit/issues/1748)) * Fixed ImapUtils.FormatInternalDate() to properly handle negative timezone offsets with non-zero minutes. (issue [#1743](https://github.com/jstedfast/MailKit/pull/1753)) * Bumped MimeKit dependency to 4.6.0. ## MailKit 4.5.0 (2024-04-13) * Added a new SmtpClient.RequireTLS property to fix sending mail via Strato.de. (issue [#1737](https://github.com/jstedfast/MailKit/issues/1737)) * Fixed SmtpClient to track the most recent response from the SMTP server in order to include it in SmtpProtocolExceptions caused by unexpected server disconnects to provide more context. (issue [#1744](https://github.com/jstedfast/MailKit/issues/1744)) * Bumped MimeKit dependency to 4.5.0. ## MailKit 4.4.0 (2024-03-02) * Added net8.0 targets * Split more sync/async logic to reduce allocations made by async state machines when calling the synchronous public APIs instead of the async APIs. (issue [#1335](https://github.com/jstedfast/MailKit/issues/1335)) * Fixed logic for formatting IMAP FETCH HEADER.FIELDS.NOT corner case that was exposed by newly added unit tests. * Fixed SmtpClient to disconnect during Authenticate/Async on socket errors. * Fixed SmtpClient's re-EHLO logic to disconnect on errors. * Added workaround for Zoho IMAP servers returning MODSEQ -1. (issue [#1686](https://github.com/jstedfast/MailKit/issues/1686)) * Added workaround for some IMAP servers that use () instead of NIL for an unset Content-Location header in the BODYSTRUCTURE response. (issue [#1700](https://github.com/jstedfast/MailKit/issues/1700)) * Fixed an issue in the Socket.ConnectAsync logic that could result in unhandled exceptions on the async thread if the ConnectAsync was cancelled. (issue [#1703](https://github.com/jstedfast/MailKit/issues/1703)) * Added work-around for Yandex IMAP GetBodyPart() response not including content. (issue [#1708](https://github.com/jstedfast/MailKit/issues/1708)) * Bumped MimeKit dependency to 4.4.0. ## MailKit 4.3.0 (2023-11-11) * Fixed an ArgumentOutOfRangeException error in Fetch(int min, int max, ...) where min and max were greater than folder.Count. (issue [#1640](https://github.com/jstedfast/MailKit/issues/1640)) * Fixed parsing of IMAP FETCH (message/stream) responses with unsolicited FLAGS. * Fixed support for the IMAP FILTERS extension. Previously this extension was not properly detected. * When parsing IMAP CAPABILITIES, treat lone '+' tokens as atoms. (issue [#1654](https://github.com/jstedfast/MailKit/issues/1654)) * Bumped MimeKit dependency to 4.3.0. ## MailKit 4.2.0 (2023-09-02) * Fixed a bug where the HttpProxyClient and HttpsProxyClient could end up reading the mail server greeting, causing a connection failure for the ImapClient/Pop3Client/SmtpClient. (issue [#1603](https://github.com/jstedfast/MailKit/issues/1603)) * Parse IMAP quota values as ulongs instead of uints for GMail compatibility. (issue [#1602](https://github.com/jstedfast/MailKit/issues/1602)) * Added support for decoding SMTP DATA to the SmtpDataFilter. (issue [#1607](https://github.com/jstedfast/MailKit/issues/1607)) * Added a Pop3Client.Size property. (issue [#1623](https://github.com/jstedfast/MailKit/issues/1623)) * Refactored more ImapClient commands to split sync/async implementations in order to improve performance and reduce GC pressure. (issue [#1335](https://github.com/jstedfast/MailKit/issues/1335)) * Added new IMailFolder.GetStream() methods that just take a uid/index and a BodyPart. * Added IMailFolder.GetStream/Async() methods that just take a uid or index. * Improved initial `List` capacity estimation for `Fetch (IList, ...)`. * Fixed ByteArrayBuilder.TrimNewLine() to check array bounds properly. (issue [#1634](https://github.com/jstedfast/MailKit/issues/1634)) * Bumped MimeKit dependency to 4.2.0. ## MailKit 4.1.0 (2023-06-17) * Fixed queueing logic for pipelining SMTP and POP3 commands. (issue [#1568](https://github.com/jstedfast/MailKit/issues/1568)) * Improve SslHandshakeException diagnostic messages. (issue [#1554](https://github.com/jstedfast/MailKit/issues/1554)) * Bumped System.Formats.Asn1 dependency to 7.0.0. * Bumped MimeKit dependency to 4.1.0. ## MailKit 4.0.0 (2023-04-15) * Marked the AccessRight and UniqueId structs as readonly. * Fixed POP3 client logic to calculate the needed bytes before converting commands into into the output buffer. * Ported to MimeKit v4.0 and BouncyCastle v2.1.1. ## MailKit 3.6.0 (2023-03-04) * Decrement ImapFolder.Count when ImapClient receives an untagged EXPUNGE notification and emit a CountChanged event. (issue [#1509](https://github.com/jstedfast/MailKit/issues/1509)) * Avoid using the NAMESPACE command for Exchange 2003. (issue [#1512](https://github.com/jstedfast/MailKit/issues/1512)) * Added support for rfc8970 (IMAP4 Extension: Message Preview Generation). ## MailKit 3.5.0 (2023-01-27) * Fixed bitmasking logic in SmtpClient.cs for deciding whether to use the BDAT command. * Fixed HttpProxyClient to call GetConnectCommand() *before* connecting a socket to prevent memory leaks when connecting fails. * Improved the IMAP BODYSTRUCTURE parser to better handle broken responses. * Fixed bug in Envelope.Parse/TryParse when given `(NIL NIL "" "localhost")` (issue [#1471](https://github.com/jstedfast/MailKit/issues/1471)) * Fixed SMTP client logic to calculate the needed bytes before converting commands into into the output buffer. (issue [#1498](https://github.com/jstedfast/MailKit/issues/1498)) * Fixed SmtpClient to replace _'s with -'s in the default LocalDomain string (used in HELO/EHLO commands). (issue [#1501](https://github.com/jstedfast/MailKit/issues/1501)) ## MailKit 3.4.3 (2022-11-25) * Fixed potential memory leaks in Pop3Client. * Reverted SMTP pipelining of the DATA command. (issue [#1459](https://github.com/jstedfast/MailKit/issues/1459)) * Fixed ImapFolder.Rename() to disallow renaming a folder to be a child of itself. * Fixed SmtpStream.ReadResponse/Async() to handle buffers that do not contain a complete line. (issue [#1467](https://github.com/jstedfast/MailKit/issues/1467)) ## MailKit 3.4.2 (2022-10-24) * Fixed fetching of MessageSummaryItems.PreviewText if the octet count of the message body is 0. (issue [#1430](https://github.com/jstedfast/MailKit/issues/1430)) * Modified ImapFolder.Search(SearchOptions.None, query) work the same as ImapFolder.Search(query). (issue [#1437](https://github.com/jstedfast/MailKit/issues/1437)) * Improved performance of SmtpClient by reducing memory allocations and pipelining the DATA command when the PIPELINING extension is available. * Refactored sync and async SmtpClient APIs such that the synchronous APIs no longer call methods marked with async in order to reduce AsyncMethodBuilder state machines/allocations. * Modified SmtpClient to only send the ORCPT argument to RCPT TO if NOTIFY is specified. * Improved performance of Pop3Client by reducing memory allocations. * Refactored sync and async Pop3Client APIs such that the synchronous APIs no longer call methods marked with async in order to reduce AsyncMethodBuilder state machines/allocations. * Improved IMAP's BODY/BODYSTRUCTURE parser to be able to scan ahead multiple tokens in order to better handle syntactically incorrect responses in a more graceful way. (issue [#1446](https://github.com/jstedfast/MailKit/issues/1446)) * Improved IMAP's ENVELOPE parser to handle ("Microsoft Exchange Server" NIL NIL ".MISSING-HOST-NAME.") in a more graceful way. (issue [#1451](https://github.com/jstedfast/MailKit/issues/1451)) ## MailKit 3.4.1 (2022-09-12) * Reverted the socket connection change to allow Socket.Connect() to do DNS lookups for us. Turns out, Socket.Connect() doesn't iterate over all returned IP addresses until it finds an IP address that it can successfully connect to for a given hostname which is what we need to do. ## MailKit 3.4.0 (2022-09-05) * Fixed a bug that caused ImapFolder.Fetch/FetchAsync to throw TaskCanceledException instead of allowing the correct exception to bubble up. (issue [#1415](https://github.com/jstedfast/MailKit/issues/1415)) * Simplified socket connection logic to allow Socket.Connect() to do DNS lookups for us. * Updated common mail server SSL certificates. * Dropped net5.0 support. ## MailKit 3.3.0 (2022-06-11) * Added work-around for IMAP BODYSTRUCTURE responses that have a NIL multipart body. (issue [#1393](https://github.com/jstedfast/MailKit/issues/1393)) * Considerably reduced memory overhead from compiler-generated async/await Tasks allocations in the IMAP implementation (mostly focused on FETCH commands/responses). (issue [#1335](https://github.com/jstedfast/MailKit/issues/1335)) * Optimized FETCH response processing for the common case where FETCH responses are returned in sorted order. * Fixed the IMAP Literal string reader to use UTF-8 with fallback to iso-8859-1 (previously just used iso-8859-1). * Modified the IMAP ENVELOPE parser to combine ENVELOPE mailbox tokens if there are more than 4. (issue [#1369](https://github.com/jstedfast/MailKit/issues/1369)) * Prevent TypeLoadExceptions in the SmtpClient static .ctor by catching NotSupportedExceptions thrown by IPGlobalProperties.GetIPGlobalProperties() on platforms like WASM. (issue [#1381](https://github.com/jstedfast/MailKit/issues/1381)) * Updated Google, GMX, and Yahoo! Mail SSL certificates. * Dropped support for net452 and net461. * Added support for net462. ## MailKit 3.2.0 (2022-03-26) * Do not use ApplicationProtocols with SSL. (issue [#1352](https://github.com/jstedfast/MailKit/issues/1352)) * Updated GMail, Yahoo, and Outlook.com certificates. * Lazy-initialize MessageSummary.Keywords. This reduces memory usage when the client isn't requesting Flags/Keywords. * Hard-cache some IMAP FETCH-related tokens in order to relieve GC pressure for commands like FETCH where there can be a LOT of responses containing the same tokens over and over again. * Converted some IMAP async Task methods to use ValueTask to reduce GC pressure. * Reduced string allocations in the IMAP logic by avoiding use of ToUpperInvariant(). * Added non-async implementations for ImapStream APIs to be used by the synchronous public APIs to avoid some async overhead. * Reduce MemoryStream (and thus byte[]) allocations by using a new ByteArrayBuilder. * Rewrote the IMAP CAPABILITY parser to avoid allocating strings. * Fixed some cases where IMAP NIL tokens were not compared case insensitively. * Always include the VERSION block in NTLM messages. (issue [#1340](https://github.com/jstedfast/MailKit/issues/1340)) * Target .NET Framework v4.6.1 instead of v4.6 to match the changes in MimeKit. * Capture the Socket timeout value in Read/WriteAsync() to have it in case of exceptions. (issue [#1327](https://github.com/jstedfast/MailKit/issues/1327)) ## MailKit 3.1.1 (2022-01-30) * Reduced string allocations in Pop3Engine's capability parser. * Updated GMail and Outlook.com SSL certificates. * Modified SmtpClient to try and use the system hostname in EHLO/HELO commands. (issue [#1314](https://github.com/jstedfast/MailKit/issues/1314)) ## MailKit 3.1.0 (2022-01-14) * Fixed NTLM to always prefer the supplied domain over the TargetName or TargetInfo.DomainName. (issue [#582](https://github.com/jstedfast/MailKit/issues/582)) * Updated GMail and Outlook.com SSL certificate info. * Added a new SslCipherSuite property to each client that allows developers to get information about the SSL/TLS cipher suite that was negotiated with the server. (pull [#1312](https://github.com/jstedfast/MailKit/pull/1312)) * Reduced string allocations in SmtpClient's EHLO capability parsing logic. * Default ProtocolLogger.RedactSecrets to true for added added security. * Added work-around for parsing malformed GMail ENVELOPE responses that reverse the name and address components of the Sender address. (pull [#1319](https://github.com/jstedfast/MailKit/pull/1319)) * Added net6.0 to the list of TargetFrameworks. ## MailKit 3.0.0 (2021-12-11) * Removed APIs marked as \[Obsolete\] in 2.x. * Simplify Fetch()/FetchAsync() APIs by using a new IFetchRequest parameter instead. Made previous APIs into extension methods to aid in porting from 2.x. * Replaced Add/Remove/SetFlags() APIs with Store()/StoreAsync() and simplified the APIs by using a new IStoreFlagsRequest parameter. Made previous APIs into extension methods to aid in porting from 2.x. * Replaced Add/Remove/SetLabels() APIs with Store()/StoreAsync() and simplified the APIs by using a new IStoreLabelsRequest parameter. Made previous APIs into extension methods to aid in porting from 2.x. * Simplify Append()/AppendAsync() APIs by using a new IAppendRequest parameter instead. Made previous APIs into extension methods to aid in porting from 2.x. * Simplify Replace()/ReplaceAsync() APIs by using a new IReplaceRequest parameter instead. Made previous APIs into extension methods to aid in porting from 2.x. * Updated SmtpClient.Send()/SendAsync() methods to return a string. (issue [#1161](https://github.com/jstedfast/MailKit/issues/1161)) * Added support for the SCRAM-SHA*-PLUS SASL mechanisms. (issue [#950](https://github.com/jstedfast/MailKit/issues/950)) * Added authzid support for SCRAM SASL mechanisms. * Added support for the ANONYMOUS SASL mechanism. * Added support for an HttpsProxyClient. (issue [#1251](https://github.com/jstedfast/MailKit/issues/1251)) * Added AcceptedKeywords and PermanentKeywords to IMailFolder. (issue [#1256](https://github.com/jstedfast/MailKit/issues/1256)) * Rewrote NTLM support based on official specs. Now supports channel-binding and using the default system credentials. * Modified ImapFolder.Fetch(int, int, ...) to shortcut if ImapFolder.Count == 0. * Updated SmtpClient to append an ORCPT arg to RCPT TO commands and to hex-encode the ENVID parameter value. * Improved/simplified logic for ranking SASL authentication mechanisms for each client. * Added SaslMechanism.ChallengeAsync() to facilitate future SASL mechanisms that may need to make network requests such as Kerberos/GSSAPI and perhaps even future/custom OAuth2 implementations. * Always set SearchResults.Count/Min/Max properties if we can. * Throw TimeoutException is case of a network time out. (issue [#1269](https://github.com/jstedfast/MailKit/issues/1269)) * Fixed parsing of IMAP flag lists to handle lowercase flag names. (issue [#1277](https://github.com/jstedfast/MailKit/issues/1277)) * Use OrdinalIgnoreCase when comparing "EARLIER" atom token. * Avoid unnecessary string copies. (issue [#1292](https://github.com/jstedfast/MailKit/pull/1292)) * Drop support for .NET 4.5 and replace it with .NET 4.5.2 * Simplified event emissions based on EXISTS and EXPUNGED notifications. A CountChanged event is now *always* emitted when the server sends an EXISTS notification. (issue [#1288](https://github.com/jstedfast/MailKit/issues/1288)) ## MailKit 2.15.0 (2021-08-18) * Use DebugType=full for .NET Framework v4.x. (issue [#1239](https://github.com/jstedfast/MailKit/issues/1239)) * Updated GMail SSL certificate serial numbers and fingerprints. * Small NTLM code improvements. ## MailKit 2.14.0 (2021-07-28) * Added support for logging timestamps in the `ProtocolLogger` (see the `LogTimestamps` and `TimestampFormat` properties on `ProtocolLogger`). * Added support for automatically redacting user credentials in protocol logs. To enable this, set the `ProtocolLogger.RedactSecrets` property to `true`. (issue [#1174](https://github.com/jstedfast/MailKit/issues/1174)) * Added the GetMessageSizeAsync() method to the IMailSpool interface. (issue [#1233](https://github.com/jstedfast/MailKit/issues/1233)) * Added a work-around to the IMAP INTERNALDATE parser to handle invalid dates such as "00-Jan-0000 00:00:00 +0000" which appears in Domino IMAP server responses, likely when the INTERNALDATE value is uninitialized in the database. (issue [#1236](https://github.com/jstedfast/MailKit/issues/1236)) * Make sure to dispose X509Certificates in .NET >= 4.6. * Re-added NTLM as one of the default supported SASL mechanisms. * Updated GMail SSL certificate serial numbers and fingerprints. ## MailKit 2.13.0 (2021-06-12) * Added new properties to all clients to get SSL cipher/hash/protocol/key-exchange info. (issue [#1175](https://github.com/jstedfast/MailKit/issues/1175)) * Added support for GMail's WEBALERT resp-code. (issue [#1214](https://github.com/jstedfast/MailKit/issues/1214)) * Updated GMail SSL certificate serial numbers and fingerprints. ## MailKit 2.12.0 (2021-05-12) * Fixed the .NET 5.0 build to include .NET 5.0-specific features. Previous releases incorrectly used #if NET50 instead of #if NET5_0. (issue [#1140](https://github.com/jstedfast/MailKit/issues/1140)) * Added support for NETStandard 2.1. (issue [#1181](https://github.com/jstedfast/MailKit/issues/1181)) * .NETStandard 2.1 and .NET 5.0 versions of MailKit now use the newer SslStream.AuthenticateAsClientAsync() methods that take SslClientAuthenticationOptions and CancellationToken arguments. In theory, this should make upgrading a TCP/IP connection to SSL/TLS cancellable. Older .NET frameworks remain uncancellable for this operation. * Fixed a NullReferenceException bug in the NTLM SASL mechanism logic. * Updated hard-coded SSL certificate serial numbers and fingerprints for common mail servers. ## MailKit 2.11.1 (2021-03-16) * Added work-around for IMAP servers that do not correctly handle the ESEARCH `RETURN ()` syntax the same as `RETURN (ALL)`. (issue [#1177](https://github.com/jstedfast/MailKit/issues/1177)) ## MailKit 2.11.0 (2021-03-12) * Handle BAD responses to the NAMESPACE command for Exchange. (issue [#1135](https://github.com/jstedfast/MailKit/issues/1135)) * Added support for configuring SSL/TLS cipher algorithms (only available in the .NET 5.0 API). (issue [#1140](https://github.com/jstedfast/MailKit/issues/1140)) * Updated GMail and Yahoo! Mail SSL certificate info. * Protect against NREs in NTLM authentication of no OSVersion is set. (issue [#1148](https://github.com/jstedfast/MailKit/issues/1148)) * Added work-around for hMailServer bug that doesn't accept seq-ranges in descending order. (issue [#1150](https://github.com/jstedfast/MailKit/issues/1150)) * Properly escape IPv6 addresses for Uri in order to allow Connect/Async methods to work with IPv6 addresses. (issue [#1165](https://github.com/jstedfast/MailKit/issues/1165)) * Added IsEncrypted and IsSigned properties to IMailService. (issue [#1175](https://github.com/jstedfast/MailKit/issues/1175)) ## MailKit 2.10.1 (2021-01-02) * A few NTLM improvements that I hope are correct. ## MailKit 2.10.0 (2020-11-20) * Don't enable support for TLS v1.1 by default anymore. (issue [#1077](https://github.com/jstedfast/MailKit/issues/1077)) * Added support for the SCRAM-SHA-512 SASL mechanism. (issue [#1097](https://github.com/jstedfast/MailKit/issues/1097)) * Added support for the OAUTHBEARER SASL mechanism. * Updated SSL certificate info for the common mail servers (GMail, outlook.com, Yahoo! Mail, etc). * Improved the SslHandshakeException error message to report common mistakes like trying to initiate an SSL connection on a non-SSL port. * Improved IMAP's "Unexpected token" exception messages a bit * Updated code to use ArrayPools from System.Buffers. ## MailKit 2.9.0 (2020-09-12) * Refactored Connect/ConnectAsync() logic to set timeouts *before* calling SslStream.AuthenticateAsClient() when connecting to an SSL-wrapped service. (issue [#1059](https://github.com/jstedfast/MailKit/issues/1059)) * Hardcode the value of SslProtocols.Tls13 for frameworks that do not support it and add it to the client's default SslProtocols. This adds TLS v1.3 support, by default, for apps using .NETStandard2.0 where the app project is built against a version of .NETCore that supports TLS v1.3. (issue [#1058](https://github.com/jstedfast/MailKit/issues/1058)) * Initialize IMAP SearchResults with the UIDVALIDITY value. (issue [#1060](https://github.com/jstedfast/MailKit/issues/1060)) * Make sure the ImapStream is not null (can be null if user calls Disconnect() causing IDLE to abort). (issue [#1025](https://github.com/jstedfast/MailKit/issues/1025)) * Case-insensitively match IMAP folder attribute flags (e.g. \HasNoChildren and \NoSelect). * Added support for the IMAP SAVEDATE extension. * Added support for detecting SMTP's REQUIRETLS extension. ## MailKit 2.8.0 (2020-07-11) * Make sure to use the InvariantCulture when converting port values to a string. (issue [#1040](https://github.com/jstedfast/MailKit/issues/1040)) * Fixed other instances of string formatting for integer values to always use CultureInfo.InvariantCulture. * Added a work-around for broken IMAP servers that allow NIL message flags. (issue [#1042](https://github.com/jstedfast/MailKit/issues/1042)) ## MailKit 2.7.0 (2020-05-30) * Added a MessageSummary.Folder property and MessageThread.Message property to allow developers to thread messages from multiple IMAP folders and be able to figure out which folder each message belongs to. * Added a work-around for IMAP servers that send a UIDNEXT response with a value of '0'. (issue [#1010](https://github.com/jstedfast/MailKit/issues/1010)) * Added an IMailFolder.Supports(FolderFeature) method so that developers can check whether a feature is supported by the folder without needing a reference to the corresponding ImapClient object in order to check the Capabilities. * Fixed the HTTP proxy client to accept "200 OK" with an empty body as a successful connection. (issue [#1015](https://github.com/jstedfast/MailKit/issues/1015)) * Fixed the SOCKS5 proxy client to correctly send an authentication request. (issue [#1019](https://github.com/jstedfast/MailKit/issues/1019)) * Added support for customizable ProtocolLogger client/server prefixes. (issue [#1024](https://github.com/jstedfast/MailKit/issues/1024)) * Fixed an NRE in SslHandshakeException.Create() when running on Mono/Linux. * Modified the SmtpClient to take advantage of the SMTPUTF8 extension for the `MAIL FROM` and `RCPT TO` commands even if a `options.International` is not explicitly set to `true` if any of the mailbox addresses are international addresses. (issue [#1026](https://github.com/jstedfast/MailKit/issues/1026)) * Added support for a new Important SpecialFolder ([rfc8457](https://tools.ietf.org/html/rfc8457)). * Added support for the IMAP REPLACE extension ([rfc8508](https://tools.ietf.org/html/rfc8508)). * NuGet packages now include the portable pdb's. ## MailKit 2.6.0 (2020-04-03) * Properly handle connection drops in SmtpClient.NoOp() and NoOpAsync() methods. * Improved default SSL certificate validation logic to be more secure and to recognize the most commonly used mail servers even if their Root CA Certificates are not available on the system. * SslHandshakeException's Message has been improved to be based on the errors reported in the ServerCertificateValidationCallback and also now has 2 new X509Certificate properties which represent the ServerCertificate and the RootCertificateAuthority in order to help developers diagnose problems. (issue [#1002](https://github.com/jstedfast/MailKit/issues/1002)) * Improved the IMAP PreviewText to extract text from HTML bodies. (issue [#1001](https://github.com/jstedfast/MailKit/issues/1001)) * Renamed MessageSummaryItems.Id to MessageSummaryItems.EmailId to better map to the property name used in the IMAP OBJECTID specification. * Updated NetworkStream.ReadAsync() and WriteAsync() methods to make use of timeouts. (issue [#827](https://github.com/jstedfast/MailKit/issues/827)) ## MailKit 2.5.2 (2020-03-14) * Added work-around for ENVELOPE responses with a NIL address token in an address-list. (issue [#991](https://github.com/jstedfast/MailKit/issues/991)) ## MailKit 2.5.1 (2020-02-15) * Fixed the IMAP ENVELOPE parser to have a more lenient fallback if it fails to be able to parse the Message-Id token value. (issue [#976](https://github.com/jstedfast/MailKit/issues/976)) * Fixed MailService.DefaultServerCertificateValidationCallback() to compare certificates by their hashes rather than via Object.Equals(). (issue [#977](https://github.com/jstedfast/MailKit/issues/977)) * Added work-around for IMAP servers that send `-1` as a line count or octet count in the BODYSTRUCTURE response. ## MailKit 2.5.0 (2020-01-18) * Ignore NIL tokens in the body-fld-lang token list. (issue [#953](https://github.com/jstedfast/MailKit/issues/953)) * Added logic to handle unexpected `` in untagged FETCH responses. (issue [#954](https://github.com/jstedfast/MailKit/issues/954)) * Added a way to override SmtpClient's preference for using BDAT vs DATA via a new PreferSendAsBinaryData virtual property. * Update SslHandshakeException message to mention the possibility of SSL/TLS version mismatch. (issue [#957](https://github.com/jstedfast/MailKit/issues/957)) * Fixed ImapFolder.GetStreamsAsync() to use an async callback delegate. (issue [#958](https://github.com/jstedfast/MailKit/issues/958)) * Added protocol-specific interfaces that inherit from IMailFolder, IMailStore, etc. (issue [#960](https://github.com/jstedfast/MailKit/issues/960)) * Maintain the STARTTLS capability bit flag after a STARTTLS command. * Don't send the optional ANNOTATE parameter to SELECT/EXAMINE for SUN IMAP servers (such as Apple's IMAP servers). (issue [#970](https://github.com/jstedfast/MailKit/issues/970)) Note: Developers using ImapFolder.GetStreamsAsync() will need to update their code as this release breaks API/ABI. ## MailKit 2.4.1 (2019-11-10) * Don't use PublicSign on non-Windows NT machines when building. * Work-around broken BODYSTRUCTUREs with `()` as a message/rfc822 body token. (issue [#944](https://github.com/jstedfast/MailKit/issues/944)) * Added work-around for an Exchange bug that forgets to quote folder names containing tabs. (issue [#945](https://github.com/jstedfast/MailKit/issues/945)) * Moved the SmtpDataFilter into the public API and updated the FAQ to show how to use it when writing messages into an IIS "pickup directory". (issue [#948](https://github.com/jstedfast/MailKit/issues/948)) ## MailKit 2.4.0 (2019-11-02) * Added work-around for IMAP ENVELOPE responses that do not include an In-Reply-To token. (issue [#932](https://github.com/jstedfast/MailKit/issues/932)) * Dropped support for WindowsPhone/Universal v8.1. * Added a net48 assembly to the NuGet package which supports TLS v1.3. * Added work-around for Yandex IMAP servers to disconnect immediately upon `* BYE`. (issue [#938](https://github.com/jstedfast/MailKit/issues/938)) * Fixed ImapClient.Idle() and IdleAsync(). (issue [#942](https://github.com/jstedfast/MailKit/issues/942)) * Added work-around for Lotus Domino where it adds extra ()'s around some FETCH items. (issue [#943](https://github.com/jstedfast/MailKit/issues/943)) ## MailKit 2.3.2 (2019-10-12) * Fixed trimming delimiters from the end of IMAP folder names. * Fixed fetching of IMAP PreviewText when message bodies do not contain any text parts. * Fixed Pop3Client to never emit Authenticated events w/ null messages. * Dropped SslProtocols.Tls (aka TLSv1.0) from the default SslProtocols used by IMAP, POP3 and SMTP clients. To override this behavior, use the client.SslProtocols property to set the preferred SslProtocol(s). * Fixed ImapFolder.Search(string query) to properly encode the query string when the query contains unicode characters. * If an IMAP SEARCH fails due to BADCHARSET, retry the search query after flattening the query strings into US-ASCII. This *may* fix issues such as issue [#808](https://github.com/jstedfast/MailKit/issues/808). * Added work-arounds for Exchange IMAP bugs causing it to send mal-formed body-fld-dsp parameters. (issue [#919](https://github.com/jstedfast/MailKit/issues/919)) * Go back to only using the BDAT command when the user is sending BINARYMIME in the SmtpClient. (issue [#921](https://github.com/jstedfast/MailKit/issues/921)) ## MailKit 2.3.1 (2019-09-08) * Fixed SmtpClient.Send*() to make sure never to add an extra CRLF sequence to the end of messages when sending via the DATA command. (issue [#895](https://github.com/jstedfast/MailKit/issues/895)) * Added assemblies for net46 and net47 to the NuGet package. ## MailKit 2.3.0 (2019-08-24) * Improved the default SSL/TLS certificate validation logic. * Improved exception messages for the POP3 LIST and STAT commands. * Modified Pop3Client to accept negative values for the 'octets' value in the STAT response. (issue [#872](https://github.com/jstedfast/MailKit/issues/872)) * Added work-around for IMAP BODYSTRUCTURE responses that treat multiparts as basic parts. (issue [#878](https://github.com/jstedfast/MailKit/issues/878)) * Added check to make sure that MD5 is supported by the runtime and automatically disable support for CRAM-MD5 and DIGEST-MD5 SASL mechanisms when MD5 is not supported. * Added a Stream property to ProtocolLogger. * Fixed fetching of PreviewText items if the body's ContentTransferEncoding is NIL. (issue [#881](https://github.com/jstedfast/MailKit/issues/881)) * Improved processing of pipelined SMTP commands to provide better exception messages. (issue [#883](https://github.com/jstedfast/MailKit/issues/883)) * Modified SmtpClient.Send*() to not call MimeMessage.Prepare() if any DKIM or ARC headers are present in order to avoid the potential risk of altering the message and breaking the signatures within those headers. * Added SmtpClient.SendCommand() and SendCommandAsync() to allow custom subclasses the ability to send custom commands to the SMTP server. (issue [#891](https://github.com/jstedfast/MailKit/issues/891)) * Allow SmtpClient subclasses to override message preparation by overriding a new SmtpClient.Prepare() method. (issue [#891](https://github.com/jstedfast/MailKit/issues/891)) * Improved ImapFolder's ModSeqChanged event to set the UniqueId property if available in unsolicited FETCH notifications including a MODSEQ and UID value. * Fixed the IMAP client logic to properly handle lower or mixed case IMAP tokens. (issue [#893](https://github.com/jstedfast/MailKit/issues/893)) * Added support for IMAP's ANNOTATE-EXPERIMENT-1 extension. (issue [#818](https://github.com/jstedfast/MailKit/issues/818)) * Always use the SMTP BDAT command instead of DATA if CHUNKING is supported. (issue [#896](https://github.com/jstedfast/MailKit/issues/896)) * Improved SmtpClient to include a SIZE= parameter in the MAIL FROM command if the SIZE extension is supported. Progress reporting will now always have the expected message size available as well. ## MailKit 2.2.0 (2019-06-11) * Optimized MailKit's logic for breaking apart long IMAP commands for GMail, Dovecot, and Yahoo! Mail. * Fixed the IMAP stream tokenizer to properly handle UTF8 atom tokens. (issue [#859](https://github.com/jstedfast/MailKit/issues/859)) * Fixed IMAP search code to always handle untagged SEARCH responses even when the response SHOULD be an untagged ESEARCH response. (issue [#863](https://github.com/jstedfast/MailKit/issues/863)) * Replaced SearchQuery.SentAfter with SentSince to be more consistent with IMAP terminology. ## MailKit 2.1.5 (2019-05-13) * Bumped the System.Net.Security dependency for security fixes (CVE-2017-0249). * Reduced explicit nuget dependencies. * Added a work-around for Microsoft Exchange IMAP servers that sometimes erroneously respond with unneeded continuation responses. (issue [#852](https://github.com/jstedfast/MailKit/issues/852)) * Fixed the ImapClient to Stop looping over SASL mechanisms if the server disconnects us. (issue [#851](https://github.com/jstedfast/MailKit/issues/851)) * Added support for HTTP proxies. (issue [#847](https://github.com/jstedfast/MailKit/issues/847)) * Fixed IMAP to properly handle EXPUNGE notifications during a FETCH request. (issue [#850](https://github.com/jstedfast/MailKit/issues/850)) ## MailKit 2.1.4 (2019-04-13) * Fixed ImapUtils.GetUniqueHeaders() to accept all valid header field name characters. (issue [#806](https://github.com/jstedfast/MailKit/issues/806)) * Catch all exceptions thrown in IdleComplete(). (issue [#825](https://github.com/jstedfast/MailKit/issues/825)) * Improved cancellability of IMAP, POP3 and SMTP clients when sending commands to the server. (issue [#827](https://github.com/jstedfast/MailKit/issues/827)) * Break apart IMAP commands with really long uid-sets. (issue [#834](https://github.com/jstedfast/MailKit/issues/834)) * Rewrote Connect logic to use Socket.Connect (IPAddress, int) instead of Connect (string, int) in an attempt to fix [StackOverflow 87117](https://stackoverflow.com/q/55382267/87117) * Fixed SmtpStream.ReadAheadAsync() to preserve remaining input. (issue [#842](https://github.com/jstedfast/MailKit/issues/842)) ## MailKit 2.1.3 (2019-02-24) * Fixed IMAP GetFolder() methods to match LIST responses case-insensitively. (issue [#803](https://github.com/jstedfast/MailKit/issues/803)) * Added a work-around to SmtpClient for a .NET 4.5.2 bug on Windows 7 SP1. (issue [#814](https://github.com/jstedfast/MailKit/issues/814)) * Added DeliveryStatusNotificationType and a property to SmtpClient to allow developers to specify the `RET` parameter value to the `MAIL FROM` command. * Fixed a number of locations in the code to clear password buffers after using them. * SmtpClient.Send() and SendAsync() methods that accept a FormatOptions argument will no longer hide Bcc, Resent-Bcc, nor Content-Length headers when uploading the raw message to the SMTP server. It is now up to callers to add these values to their custom FormatOptions.HiddenHeaders property. (issue [#360](https://github.com/jstedfast/MailKit/issues/360)) ## MailKit 2.1.2 (2018-12-30) * Fixed a bug in SmtpDataFilter. (issue [#788](https://github.com/jstedfast/MailKit/issues/788)) * Fixed ImapFolder.Sort() to always return the UIDs in the correct order. (issue [#789](https://github.com/jstedfast/MailKit/issues/789)) * Fixed *Client.ConnectAsync() to more reliably abort when the cancellation token is cancelled. (issue [#798](https://github.com/jstedfast/MailKit/issues/798)) ## MailKit 2.1.1 (2018-12-16) * Fixed ImapFolder.CopyTo() and ImapFolder.MoveTo() for IMAP servers that do not support UIDPLUS. (issue [#787](https://github.com/jstedfast/MailKit/issues/787)) * Fixed ImapClient.Connect() to capture authenticated state *before* calling OnConnected() so that developers that call Authenticate() inside of the Connected event handler do not receive 2 Authenticated events. (issue [#784](https://github.com/jstedfast/MailKit/issues/784)) ## MailKit 2.1.0 (2018-12-01) * A number of fixes to bugs exposed in new unit tests for NTLM authentication. * Made SmtpClient, Pop3Client, and ImapClient's Connect() methods truly cancellable as well as made the underlying socket.Connect() call adhere to any specified client.Timeout value. * Added support for connecting via a SOCKS4, SOCKS4a, or SOCKS5 proxy server. * Fixed ImapClient's OnAuthenticated() method to protect against throwing an ArgumentNullException when trying to emit the Authenticated event if the server did not supply any resp-code-text in the OK response to the AUTHENTICATE command. (issue [#774](https://github.com/jstedfast/MailKit/issues/774)) * Modified ImapFolder.Create() to handle [ALREADYEXISTS] resp-codes. * Fixed ImapFolder.Create() for GMail when the isMessageFolder parameter is false (GMail doesn't handle it when the client attempts to create a folder ending with a directory separator). * Optimized ImapFolder's fallback for UID COPY command when UIDPLUS is not supported. * Reduced string allocations in the Connect(Uri) wrapper. * Added new ConnectedEventArgs and DisconnectedEventArgs that are used with the Connected and Disconnected events to provide developers with even more useful information about what server, port and SecureSocketOptions were used when connecting the client. * Fixed SmtpClient to immediately throw stream reading exceptions instead of ignoring them. (issue [#776](https://github.com/jstedfast/MailKit/issues/776)) * Fixed ImapClient.GetFoldersAsync() to call ImapFolder.StatusAsync() instead of Status() when StatusItems are specified. * Changed ImapFolder.GetSubfolders() to return IList<IMailFolder> instead of IEnumerable<IMailFolder>. * Fixed ImapClient's NAMESPACE parser - it had Shared and Other namespace ordering reversed. * Fixed ImapFolder.Create() (for special-use) to only use unique uses if any were specified multiple times. * Modified ImapFolder.Open() to allow devs to re-Open() a folder with the same access in case they need to do this to work around an IMAP server bug(?). * Fixed adding/removing/setting of GMail labels to use UTF-8 when enabled. * Added support for the IMAP STATUS=SIZE extension which now provides a ImapFolder.Size property that specifies how large a folder is (in bytes). Clients can request this information using the StatusItems.Size enum with either ImapFolder.GetSubfolders() or ImapFolder.Status(). * Added support for the IMAP OBJECTID extension. ImapFolder and IMessageSummary now both have an Id property which is a globally unique identifier. IMessageSummary also now has a ThreadId property which is a unique identifier for the message thread/conversation that the message belongs to. This information can be retrieved for ImapFolders using ImapFolder.Status() with the new StatusItems.MailboxId enum value. The IMessageSummary.Id and ThreadId properties have the corresponding MessageSummaryItems enum values of Id and ThreadId, respectively. * Added another work-around for bad GMail IMAP BODYSTRUCTURE responses. (issue [#777](https://github.com/jstedfast/MailKit/issues/777)) * Fixed all integer TryParse methods to use NumberStyles.None and CultureInfo.InvariantCulture. * Added Connect() and ConnectAsync() overloads which accept a Stream instead of a Socket. * All ImapFolder.MessageFlagsChanged, ModSeqChanged, and LabelsChanged events will now also be followed by a MessageSummaryFetched event containing the combined information of those events. * Added support for IMAP's NOTIFY extension. Many thanks to [Steffen Kieß](https://github.com/steffen-kiess) for getting the ball rolling on this feature by implementing the necessary ImapEvent, ImapEventGroup, and ImapMailboxFilter classes as well as the initial support. API Changes Since 2.0.x: * Obsoleted SearchQuery.HasCustomFlags() and SearchQuery.DoesNotHaveCustomFlags(). These are now SearchQuery.HasKeywords() and SearchQuery.NotKeywords(), respectively. * Obsoleted SearchQuery.DoesNotHaveFlags() in favor of SearchQuery.NotFlags(). * Obsoleted the IMessageSummary.UserFlags property in favor of IMessageSummary.Keywords. * Obsoleted the MessageFlagsChangedEventArgs.UserFlags property in favor of MessageFlagsChangedEventArgs.Keywords. * All IMailFolder.Fetch and IMailFolder.FetchAsync methods that took a HashSet<string> userFlags argument now take an IEnumerable<string> keywords argument. Note: this only affects you if your code used named method parameters (e.g. userFlags: myUserFlags). ## MailKit 2.0.7 (2018-10-28) * Added a work-around for Exchange IMAP servers that send broken multipart BODYSTRUCTURE responses without a `body-fld-dsp` token. * Added support for detecting (but not using) the UNAUTHENTICATE IMAP extension. * Reintroduced the Pop3Client.GetMessageCount() and GetMessageCountAsync() methods to allow developers to poll POP3 servers for new messages. (issue [#762](https://github.com/jstedfast/MailKit/issues/762)) * Fixed SmtpClient's status code logic to handle more than the expected error codes for the `MAIL FROM` and `RCPT TO` commands. (issue [#764](https://github.com/jstedfast/MailKit/issues/764)) * Added a work-around for IMAP servers that quote FLAGS responses. (issue [#771](https://github.com/jstedfast/MailKit/issues/771)) * Optimized SmtpClient's logic for byte-stuffing the message when writing it to the socket during the `DATA` command. * Added an `SslProtocols` property to IMailService (was already in MailService). * Fixed the DIGEST-MD5 charset handling. * Fixed a bug in the BodyPart.TryParse() method that could be used when serializing and deserializing FETCH'd responses from an IMAP server. * Fixed BodyPartCollection.IndexOf(Uri). * Fixed Envelope.ToString() and TryParse() to properly deal with the rfc822 group address syntax. * Fixed the ImapClient logic to properly handle parsing nested group addresses (not likely that anyone would hit this). * Improved ImapClient's state tracking so that it is possible to re-connect the ImapClient in the Disconnected event handler. (issue [#770](https://github.com/jstedfast/MailKit/issues/770)) * Fixed IMAP API's that take IList of UIDs or indexes to accept 0 UIDs/indexes. * Fixed ImapClient's BODYSTRUCTURE parser to properly handle multiple body-extensions tokens. * Fixed ImapClient to properly handle the `* PREAUTH` greeting when connecting to an IMAP server. ## MailKit 2.0.6 (2018-08-04) * Fixed ImapFolder.GetSubfolders (StatusItems) to make sure that the child folders exist before calling STATUS on them when the server does not support the LIST-STATUS command. * Catch ArgumentExceptions when calling Encoding.GetEncoding(string). (issue [#740](https://github.com/jstedfast/MailKit/issues/740)) * Fixed parsing of IMAP threads where the root of a subtree is empty. (issue [#739](https://github.com/jstedfast/MailKit/issues/739)) * Added AuthorizationId property for PLAIN and DIGEST-MD5 SASL mechanisms. * Added MessageSummaryItems.Headers enum to fetch all headers. (issue [#738](https://github.com/jstedfast/MailKit/issues/738)) ## MailKit 2.0.5 (2018-07-07) * When throwing AuthenticationException within SmtpClient, add an SmtpCommandException as the InnerException property to help consumers diagnose authentication problems. (issue [#717](https://github.com/jstedfast/MailKit/issues/717)) * Added support for the authzid to the SASL PLAIN mechanism. * Modified ProtocolLogger file constructor to support Shared Read and an Append/Overwrite option. (issue [#730](https://github.com/jstedfast/MailKit/issues/730)) ## MailKit 2.0.4 (2018-05-21) * Fixed SmtpClient to use the IPv4 literal if the socket is IPv4 address mapped to IPv6. (issue [#704](https://github.com/jstedfast/MailKit/issues/704)) * Updated SmtpClient and ImapFolder.Append to use FormatOptions.EnsureNewLine. (MimeKit issue [#251](https://github.com/jstedfast/MimeKit/issues/251)) ## MailKit 2.0.3 (2018-04-15) * Fixed IMAP IDLE support. * Ignore unknown tokens in IMAP untagged FETCH responses such as XAOL.SPAM.REASON. ## MailKit 2.0.2 (2018-03-18) * Added work-around for ProtonMail's IMAP server. (issue [#674](https://github.com/jstedfast/MailKit/issues/674)) * Added work-around for IMAP servers that do not include msgid in the ENVELOPE response. (issue [#669](https://github.com/jstedfast/MailKit/issues/669)) * Added MessageSummaryItems.PreviewText to allow fetching a small preview of the message. (issue [#650](https://github.com/jstedfast/MailKit/issues/650)) * Added support for batch fetching IMAP message streams. (issue [#650](https://github.com/jstedfast/MailKit/issues/650)) ## MailKit 2.0.1 (2018-01-06) * Obsoleted all SaslMechanism constructors that took a Uri argument and replaced them with variants that no longer require the Uri and instead take a NetworkCredential or a set of strings for the user name and password. This simplifies authenticating with OAuth 2.0: ```csharp var oauth2 = new SaslMechanismOAuth2 (username, auth_token); client.Authenticate (oauth2); ``` ## MailKit 2.0.0 (2017-12-22) * Updated MailKit to fully support async IO instead of using Task.Run() wrappers. * Fixed a resource leak when fetching IMAP body parts gets an exception. * Fixed each of the Client.Connect() implementations to catch exceptions thrown by IProtocolLogger.LogConnect(). * Removed the ImapFolder.MessagesArrived event. * Added new Authenticate() methods that take a SaslMechanism to avoid the need to manipulate Client.AuthenticationMechanisms in order to tweak which SASL mechanisms you'd like the client to use in Authenticate(). * Added new SslHandshakeException with a helpful error message that can be thrown by the Connect() methods. This replaces the obscure SocketExceptions previously thrown by SslStream. * Fixed support for the IMAP UTF8=ACCEPT extension. * Improved ImapFolder.CommitStream() API to provide section, offset and length. * Treat the SMTP X-EXPS capability in an EHLO response the same as AUTH. (issue [#603](https://github.com/jstedfast/MailKit/issues/603)) * Dropped support for .NET 4.0. Note: As of 2.0, XOAUTH2 is no longer in the list of SASL mechanisms that is tried when using the Authenticate() methods that have existed pre-MailKit 2.0. Instead, you must now use Authenticate(SaslMechanism, CancellationToken). An example usage might look like this: ```csharp // Note: The Uri isn't used except with ICredentials.GetCredential (Uri) so unless // you implemented your own ICredentials class, the Uri is a dummy argument. var uri = new Uri ("imap://imap.gmail.com"); var oauth2 = new SaslMechanismOAuth2 (uri, username, auth_token); client.Authenticate (oauth2); ``` ## MailKit 1.22.0 (2017-11-24) * Enable TLSv1.1 and 1.2 for .NETStandard. * Read any remaining literal data after parsing headers. Fixes an issue when requesting specific headers in an ImapFolder.Fetch() request if the server sends an extra newline. ## MailKit 1.20.0 (2017-10-28) * Fixed UniqueIdRange.ToString() to always output a string in the form ${start}:${end} even if start == end. (issue [#572](https://github.com/jstedfast/MailKit/issues/572)) ## MailKit 1.18.1 (2017-09-03) * Gracefully handle IMAP COPYUID resp-codes without src or dest uid-set tokens. (issue [#555](https://github.com/jstedfast/MailKit/issues/555)) * Be more lenient with unquoted IMAP folder names containing ']'. (issue [#557](https://github.com/jstedfast/MailKit/issues/557)) ## MailKit 1.18.0 (2017-08-07) * Improved logic for cached FolderAttributes on ImapFolder objects. * If/when the \NonExistent flag is present, reset ImapFolder state as it probably means another client has deleted the folder. * Added work-around for home.pl which sends an untagged `* [COPYUID ...]` response without an `OK` (technically, the COPYUID resp-code should only appear in the tagged response, but accept it anyway). ## MailKit 1.16.2 (2017-07-01) * Added a leaveOpen param to the ProtocolLogger .ctor. (issue [#506](https://github.com/jstedfast/MailKit/issues/506)) * Added a CheckCertificateRevocation property on MailService. (issue [#520](https://github.com/jstedfast/MailKit/issues/520)) * Fixed ImapFolder to update the Count property and emit CountChanged when the IMAP server sends an untagged VANISHED response. (issue [#521](https://github.com/jstedfast/MailKit/issues/521)) * Fixed ImapEngine to properly handle converting character tokens into strings. (issue [#522](https://github.com/jstedfast/MailKit/issues/522)) * Fixed SmtpClient to properly handle DIGEST-MD5 auth errors in order to fall back to the next authentication mechanism. * Fixed Pop3Client to properly detect APOP tokens after arbitrary text. (issue [#529](https://github.com/jstedfast/MailKit/issues/529)) * Disabled NTLM authentication since it often doesn't work properly. (issue [#532](https://github.com/jstedfast/MailKit/issues/532)) ## MailKit 1.16.1 (2017-05-05) * Properly handle a NIL body-fld-params token for body-part-mpart. (issue [#503](https://github.com/jstedfast/MailKit/issues/503)) ## MailKit 1.16.0 (2017-04-21) * Improved IMAP ENVELOPE parser to prevent exceptions when parsing invalid mailbox addresses. (issue [#494](https://github.com/jstedfast/MailKit/issues/494)) * Fixed UniqueId and UniqueIdRange to prevent developers from creating invalid UIDs and ranges. * Fixed ImapFolder.FetchStream() to properly emit MODSEQ changes if the server sends them. * Fixed SmtpClient to call OnNoRecipientsAccepted even in the non-PIPELINE case. (issue [#491](https://github.com/jstedfast/MailKit/issues/491)) ## MailKit 1.14.0 (2017-04-09) * Improved IMAP's BODYSTRUCTURE parser to sanitize the Content-Disposition values. (issue [#486](https://github.com/jstedfast/MailKit/issues/486)) * Improved robustness of IMAP's BODYSTRUCTURE parser in cases where qstring tokens have unescaped quotes. (issue [#485](https://github.com/jstedfast/MailKit/issues/485)) * Fixed IMAP to properly handle NIL as a folder name in LIST, LSUB and STATUS responses. (issue [#482](https://github.com/jstedfast/MailKit/issues/482)) * Added ImapFolder.GetHeaders() to allow developers to download the entire set of message headers. * Added SMTP support for International Domain Names in email addresses used in the MAIL FROM and RCPT TO commands. * Modified SmtpClient to no longer throw a NotSupportedException when trying to send messages to a recipient with a unicode local-part in the email address when the SMTP server does not support the SMTPUTF8 extension. Instead, the local-part is passed through as UTF-8, leaving it up to the server to reject either the command or the message. This seems to provide the best interoperability. ## MailKit 1.12.0 (2017-03-12) * Allow an empty string text argument for SearchQuery.ContainsHeader(). (issue [#451](https://github.com/jstedfast/MailKit/issues/451)) * Fixed SaslMechanism.IsProhibited() logic to properly use logical ands. Thanks to Stefan Seering for this fix. ## MailKit 1.10.2 (2017-01-28) * Added an IsAuthenticated property to IMailService. * Fixed the ImapFolder.Quota class to not be public. ## MailKit 1.10.1 (2016-12-04) * Modified the ImapClient to always LIST the INBOX even if it is a namespace in order to get any flags set on it. * Fixed ImapFolder to handle Quota Roots that do not match an existing folder. (issue [#433](https://github.com/jstedfast/MailKit/issues/433)) * Added work-around for Courier-IMAP sending "* 0 FETCH ..." on flag changes. (issue [#428](https://github.com/jstedfast/MailKit/issues/428)) * Updated MessageSorter to be smarter about validating arguments such that it will only check for IMessageSummary fields that it will *actually* need in order to perform the specified sort. * Fixed SmtpClient.Authenticate() to throw an AuthenticationException with a message from the SMTP server if available. ## MailKit 1.10.0 (2016-10-31) * Added SearchQuery.Uids() to allow more powerful search expressions involving sets of uids. * Changed ImapClient.GetFolders() to return IList instead of IEnumerable. * Fixed a bug in MessageThreader. * Fixed bugs in Envelope.ToString() and Envelope.TryParse(). * Fixed NTLM's Type2Message.Encode() logic to properly handle a null TargetInfo field. * Obsoleted some ImapFolder.Search() methods and replaced them with an equivalent ImapFolder.Sort() method. * Added a ResponseText property to ImapCommandException. * Fixed ImapFolder to emit a HighestModSeqChanged event when we get untagged FETCH responses with a higher MODSEQ value. * Improved SearchQuery optimization for IMAP. * Added SearchOptions.None. ## MailKit 1.8.1 (2016-09-26) * Fixed the NuGet packages to reference MimeKit 1.8.0. * Added an SmtpClient.QueryCapabilitiesAfterAuthenticating property to work around broken SMTP servers where sending EHLO after a successful AUTH command incorrectly resets their authenticated state. ## MailKit 1.8.0 (2016-09-26) * Added a new Search()/SearchAsync() to ImapFolder that take a raw query string. * Implemented support for the IMAP FILTERS extension and improved support for the METADATA extension. * Fixed NTLM authentication support to use NTLMv2. (issue [#397](https://github.com/jstedfast/MailKit/issues/397)) * Added support for IMAP's SEARCH=FUZZY relevancy scores. * Added an IMailFolder.ModSeqChanged event. * Added UniqueIdRange.All for convenience. ## MailKit 1.6.0 (2016-09-11) * Added support for the new IMAP LITERAL- extension. * Added support for the new IMAP APPENDLIMIT extension. * Fixed APOP authentication in the Pop3Client. (issue [#395](https://github.com/jstedfast/MailKit/issues/395)) * Reset the SmtpClient's Capabilities after disconnecting. * Modified ImapFolder.Search() to return a UniqueIdSet for IMAP servers that do not support the ESEARCH extension (which already returns a UniqueIdSet). * Added mail.shaw.ca to the list of SMTP servers that break when sending EHLO after AUTH. (issue [#393](https://github.com/jstedfast/MailKit/issues/393)) * Work around broken POP3 servers that reply "+OK" instead of "+" in SASL negotiations. (issue [#391](https://github.com/jstedfast/MailKit/issues/391)) * Modified the IMAP parser to properly allow "[" to appear within flag tokens. (issue [#390](https://github.com/jstedfast/MailKit/issues/390)) ## MailKit 1.4.2.1 (2016-08-16) * Fixed a regression in 1.4.2 where using a bad password in ImapClient.Authenticate() did not properly throw an exception when using a SASL mechanism. (issue [#383](https://github.com/jstedfast/MailKit/issues/383)) ## MailKit 1.4.2 (2016-08-14) * Properly initialize the private Uri fields in Connect() for Windows Universal 8.1. (issue [#381, #382](https://github.com/jstedfast/MailKit/issues/381, #382)) * Added SecuritySafeCritical attributes to try and match base Exception in case that matters. * Added missing GetObjectData() implementation to Pop3CommandException. * Strong-name the .NET Core assemblies. * Make sure to process Alert resp-codes in ImapClient. (issue [#377](https://github.com/jstedfast/MailKit/issues/377)) ## MailKit 1.4.1 (2016-07-17) * Updated the NTLM SASL mechanism to include a Windows OS version in the response if the server requests it (apparently this should only happen if the server is in debug mode). * Updated the IMAP BODYSTRUCTURE parser to try and work around BODYSTRUCTURE responses that do not properly encode the mime-type of a part where it only provides the media-subtype token instead of both the media-type and media-subtype tokens. (issue [#371](https://github.com/jstedfast/MailKit/issues/371)) * Added smtp.dm.aliyun.com to the list of broken SMTP servers that failed to read the SMTP specifications and improperly reset their state after sending an EHLO command after authenticating (which the specifications explicitly state the clients SHOULD do). (issue [#370](https://github.com/jstedfast/MailKit/issues/370)) ## MailKit 1.4.0 (2016-07-01) * Added support for .NET Core 1.0 ## MailKit 1.2.24 (2016-06-16) * Fixed logic for constructing the HELO command on WP8. (issue [#351](https://github.com/jstedfast/MailKit/issues/351)) * Modified ImapFolder.Search() to not send the optional CHARSET search param if the charset is US-ASCII. This way work around some broken IMAP servers that do not properly implement support for the CHARSET parameter. (issue [#348](https://github.com/jstedfast/MailKit/issues/348)) * Added more MailService methods to IMailService. ## MailKit 1.2.23 (2016-05-22) * Properly apply SecurityCriticalAttribute to GetObjectData() on custom Exceptions. (issue [#340](https://github.com/jstedfast/MailKit/issues/340)) ## MailKit 1.2.22 (2016-05-07) * Updated IMAP BODY parser to handle a NIL media type by treating it as "application". * Updated IMAP SEARCH response parser to work around search-return-data pairs within parens. * Added a missing SmtpStatusCode enum value for code 555. (issue [#327](https://github.com/jstedfast/MailKit/issues/327)) * Opened up more of the SearchQuery API to make it possible to serialize/deserialize via JSON. (issue [#331](https://github.com/jstedfast/MailKit/issues/331)) * Updated to reference BouncyCastle via NuGet.org packages rather than via project references. ## MailKit 1.2.21 (2016-03-13) * Replaced SmtpClient's virtual ProcessRcptToResponse() method with OnRecipientAccepted() and OnRecipientNotAccepted(). (issue [#309](https://github.com/jstedfast/MailKit/issues/309)) * Added MailService.DefaultServerCertificateValidationCallback() which accepts all self-signed certificates (a common operation that consumers want). * Fixed encoding and decoding of IMAP folder names that include surrogate pairs. * Fixed IMAP SEARCH logic for X-GM-LABELS. ## MailKit 1.2.20 (2016-02-28) * Added a work-around for GoDaddy's ASP.NET web host which does not support the iso-8859-1 System.Text.Encoding (used as a fallback encoding within MailKit) by falling back to Windows-1252 instead. * Improved NTLM support. ## MailKit 1.2.19 (2016-02-13) * Added support for the SMTP VRFY and EXPN commands. ## MailKit 1.2.18 (2016-01-29) * If the IMAP server sends a `* ID NIL` response, return null for ImapClient.Identify(). * Allow developers to override the charset used when authenticating. (issue [#292](https://github.com/jstedfast/MailKit/issues/292)) ## MailKit 1.2.17 (2016-01-24) * Exposed MailKit.Search.OrderByType and MailKit.Search.SortOrder to the public API. * Modified IMailFolder.CopyTo() and MoveTo() to return a UniqueIdMap instead of a UniqueIdSet. * Improved ImapProtocolException error messages to be more informative. * Added an IsSecure property to ImapClient, Pop3Client and SmtpClient. * Fixed support for the IMAP COMPRESS=DEFLATE extension to work properly. * Modified UniqueId.Id and .Validity to be properties instead of fields. * Reduced memory usage for UniqueIdRange (-33%) and UniqueIdSet (-50%). * Vastly improved the performance of UniqueIdSet (~2x). * Added an ImapClient.GetFolders() overload that also requests the status of each folder. * Modified the headersOnly parameter to the various Pop3Client.GetStream() methods to default to false instead of forcing developers to pass in a value. * Updated the IMAP, POP3 and SMTP clients to be stricter with validating SSL certificates. ## MailKit 1.2.16 (2016-01-01) * Added support for the SCRAM-SHA-256 SASL mechanism. * Added support for the CREATE-SPECIAL-USE IMAP extension. * Added support for the METADATA IMAP extension. * Added support for the LIST-STATUS IMAP extension. ## MailKit 1.2.15 (2015-11-29) * Be more forgiving during SASL auth when a POP3 server sends unexpected text after a + response. (issue [#268](https://github.com/jstedfast/MailKit/issues/268)) ## MailKit 1.2.14 (2015-11-22) * Fixed ImapFolder.Search() to not capitalize the date strings in date queries. (issue [#252](https://github.com/jstedfast/MailKit/issues/252)) * Fixed filtering logic in ImapFolder.GetSubfolders() to not filter out subfolders named Inbox. (issue [#255](https://github.com/jstedfast/MailKit/issues/255)) * Exposed SmtpClient.ProcessRcptToResponse() as virtual protected to allow subclasses to override error handling. (issue [#256](https://github.com/jstedfast/MailKit/issues/256)) * Modified SmtpCommandException .ctors to be public and fixed serialization logic. (issue [#257](https://github.com/jstedfast/MailKit/issues/257)) * Added workaround for broken smtp.sina.com mail server. * Throw a custom ImapProtocolException on "* BYE" during connection instead of "unexpected token". (issue [#262](https://github.com/jstedfast/MailKit/issues/262)) ## MailKit 1.2.13 (2015-10-18) * Fixed SmtpClient to not double dispose the socket. * Added a BodyPartVisitor class. * Fixed ImapFolder to allow NIL tokens for body parts. (issue [#244](https://github.com/jstedfast/MailKit/issues/244)) ## MailKit 1.2.12 (2015-09-20) * Allow developers to specify a local IPEndPoint to use for connecting to remote servers. (issue [#247](https://github.com/jstedfast/MailKit/issues/247)) * Added support for NIL GMail labels. (issue [#244](https://github.com/jstedfast/MailKit/issues/244)) ## MailKit 1.2.11.1 (2015-09-08) * Fixed ImapFolder.GetSubfolders() to work with Yahoo! Mail and other IMAP servers that do not use the canonical INBOX naming convention for the INBOX folder. (issue [#242](https://github.com/jstedfast/MailKit/issues/242)) ## MailKit 1.2.11 (2015-09-06) * Fixed SmtpStream logic for determining if a call to ReadAhead() is needed. (issue [#232](https://github.com/jstedfast/MailKit/issues/232)) * Fixed ImapFolder.Close() to change the state to Closed even if the IMAP server does not support the UNSELECT command. * Allow the UIDVALIDITY argument to the COPYUID and APPENDUID resp-codes to be 0 even though that value is illegal. Improves compatibility with SmarterMail. (issue [#240](https://github.com/jstedfast/MailKit/issues/240)) ## MailKit 1.2.10 (2015-08-16) * Added an SslProtocols property to ImapClient, Pop3Client, and SmtpClient to allow developers to override which SSL protocols are to be allowed for SSL connections. (issue [#229](https://github.com/jstedfast/MailKit/issues/229)) * Added a work-around for GMail IMAP (and other IMAP servers) that sometimes send an illegal MODSEQ value of 0. (issue [#228](https://github.com/jstedfast/MailKit/issues/228)) ## MailKit 1.2.9 (2015-08-08) * Fixed ImapFolder.Append() methods to make sure to encode the message with `` line endings. * Added UniqueId.Invalid that can be used for error conditions. * Added UniqueId.IsValid property to check that the UniqueId is valid. * Added Opened and Closed events to IMailFolder. * Fixed the QRESYNC version of the IMailFolder.Open() method to take a uint uidValidity instead of a UniqueId uidValidity argument for consistency. * Updated MessageSorter.Sort() to be an extension method and added a List<T> overload. * Updated MessageThreader.Thread() to be extension methods (required reordering of args). * Merged ISortable and IThreadable interfaces into IMessageSummary in order to remove duplicated properties and simplify things. * Renamed IMessageSummary.MessageSize to IMessageSummary.Size. * Modified IMessageSummary.UniqueId to no longer be nullable. * Added TextBody, HtmlBody, BodyParts and Attachments properties to IMessageSummary. * Modified the IMAP parser to allow NIL for the Content-Type and subtype strings in BODY and BODYSTRUCTURE values even though it is illegal. (issue [#226](https://github.com/jstedfast/MailKit/issues/226)) * Modified the IMAP parser to properly handle Message-Id tokens that are not properly encapsulated within angle brackets. (issue [#224](https://github.com/jstedfast/MailKit/issues/224)) * Fixed IMAP to properly deal with folder names that contained unescaped square brackets. (issue [#222](https://github.com/jstedfast/MailKit/issues/222)) ## MailKit 1.2.8 (2015-07-19) * Fixed ImapFolder to dispose the temporary streams used in GetMessage and GetBodyPart. * Added a MessageNotFoundException. * Added an ImapCommandResponse property to ImapCommandException. * Fixed SmtpClient to filter out duplicate recipient addresses in RCPT TO. * Modified MessageSorter/Threader to take IList<OrderBy> arguments instead of OrderBy[]. * Added support for parsing group addresses in IMAP ENVELOPE responses. * Disable SASL-IR support for the LOGIN mechanism. (issue [#216](https://github.com/jstedfast/MailKit/issues/216)) * Capture whether or not the IMAP server supports the I18NLEVEL and LANGUAGE extensions. ## MailKit 1.2.7 (2015-07-06) * Fixed ImapFolder.Rename() to properly emit the Renamed event for child folders as well. * Fixed ImapFolder.Fetch() to always fill in the Headers property when requesting specific headers even if the server replies with an empty list. (issue [#210](https://github.com/jstedfast/MailKit/issues/210)) ## MailKit 1.2.6 (2015-06-25) * Fixed UniqueIdSet.CopyTo() to work properly (also fixes LINQ usage). * Fixed ImapFolder.Status() where StatusItems.HighestModSeq is used. ## MailKit 1.2.5 (2015-06-22) * Added support for extended IMAP search options (see the SearchOptions flags). * Added TryParse() convenience methods for UniqueIdSet, UniqueIdRange, and UniqueId. * Added a workaround for a GMail IMAP BODYSTRUCTURE bug. (issue [#205](https://github.com/jstedfast/MailKit/issues/205)) * Added a ProtocolLogger property for ImapClient, Pop3Client, and SmtpClient. * Fixed the ImapFolder.GetStream() methods that take a BodyPart to call the proper overload. ## MailKit 1.2.4 (2015-06-14) * Updated SmtpClient to use MimeMessage.Prepare() instead of implementing its own logic. * Added a new ITransferProgress interface and updated IMAP, POP3 and SMTP methods to take an optional ITransferProgress parameter to allow for progress reporting. * Implemented client-side UID EXPUNGE for IMAP servers that do not support the UIDPLUS extension. * Improved API documentation. ## MailKit 1.2.3 (2015-06-01) * Fixed ImapFolder.AddFlags() to throw FolderNotOpenException if the folder is not opened in read-write mode. (issue [#202](https://github.com/jstedfast/MailKit/issues/202)) * Fixed ImapFolder.GetMessage/BodyPart/Stream() to not modify a dictionary while looping over it. (issue [#201](https://github.com/jstedfast/MailKit/issues/201)) * Fixed ImapFolder to throw FolderNotFoundException instead of ArgumentException when the command fails due to the folder not existing. ## MailKit 1.2.2 (2015-05-31) * Added ImapClient.GetFolders(FolderNamespace, ...) to allow getting the full (recursive) list of folders for a particular namespace. * Added a FolderAttributes.Inbox flag that gets set on the Inbox folder. * Fixed the IMAP code to properly treat the INBOX folder name case-insensitively. * Added ServiceNotConnectedException, ServiceNotAuthenticatedException, and FolderNotOpenException as a more specific errors than InvalidOperationException. (Note: they all subclass InvalidOperationException so old code continues to work). * Added Pop3Client.GetStream() to allow fetching messages or headers as an unparsed stream. (issue [#198](https://github.com/jstedfast/MailKit/issues/198)) * Fixed usage of Socket.Poll() to not loop 1000 times per second. * Added more ImapFolder.GetStream() overloads. * Added ImapFolder.CreateStream() and CommitStream() protected methods which are meant for subclasses that intend to implement caching. ## MailKit 1.2.1 (2015-05-26) * Added hooks to allow subclassing ImapFolder. ## MailKit 1.2.0 (2015-05-24) * Added new ImapFolder.GetStream() overloads that allow fetching only the TEXT stream. * Fixed ImapFolder.Search() to always treat the search results as UIDs even when the server (such as AOL) does not include the required UID tag in the ESEARCH response. (issue [#191](https://github.com/jstedfast/MailKit/issues/191)) * Fixed ImapClient to set the engine.Uri even for Windows*81 profiles (fixes a NullReferenceException for the various Windows*81 profiles). (issue [#192](https://github.com/jstedfast/MailKit/issues/192)) * Work around a GMail bug where it does not quote flags containing []'s. (issue [#193](https://github.com/jstedfast/MailKit/issues/193)) * Fixed the IMAP code to accept GMail label names that start with a '+'. (issue [#195](https://github.com/jstedfast/MailKit/issues/195)) * Delay throwing ProtocolException due to an unexpected disconnect when reading responses to PIPELINE'd SMTP commands in case one of the responses to those commands contains an error code that might hint at why the server disconnected. (issue [#194](https://github.com/jstedfast/MailKit/issues/194)) ## MailKit 1.0.17 (2015-05-12) * Fixed a STARTTLS regression in SmtpClient that was introduced in 1.0.15. (issue [#187](https://github.com/jstedfast/MailKit/issues/187)) ## MailKit 1.0.16 (2015-05-10) * Modified the Pop3Client to immediately query for the message count once the client is authenticated. This allows the Pop3Client to now have a Count property that replaces the need for calling GetMessageCount(). (issue [#184](https://github.com/jstedfast/MailKit/issues/184)) ## MailKit 1.0.15 (2015-05-09) * Added SearchQuery.HeaderContains() and obsoleted SearchQuery.Header() for API consistency. * Added workaround for GMail's broken FETCH command parser that does not accept aliases. (issue [#183](https://github.com/jstedfast/MailKit/issues/183)) ## MailKit 1.0.14 (2015-04-11) * Added a ServerCertificateValidationCallback property to all clients so that it is not necessary to set the global System.Net.ServicePointManager.ServerCertificateValidationCallback property. * Fixed MailService.Connect(Uri) to properly handle Uri's with Port value that had not been explicitly set. (issue [#170](https://github.com/jstedfast/MailKit/issues/170)) * Added logic to properly handle MODSEQ-based search responses. (issue [#166 and issue #173](https://github.com/jstedfast/MailKit/issues/166 and issue #173)) * When an ImapClient gets disconnected, if an ImapFolder was in an opened state, update its state to closed to prevent confusion once the ImapClient is reconnected. * Fixed a bug in Pop3Client.Authenticate() for servers that just reply with "+OK\r\n" to the SASL challenge. (issue [#171](https://github.com/jstedfast/MailKit/issues/171)) * Clear the POP3 capability flags if the POP3 server responds with -ERR at any time. Some servers will reply with a list of capabilities until the client is authenticated, and then reply with -ERR meaning that the client should not attempt to use previously listed capabilities. (issue [#174](https://github.com/jstedfast/MailKit/issues/174)) ## MailKit 1.0.13 (2015-03-29) * Added a FileName convenience property to BodyPartBasic which works the same way as the MimeKit.MimePart.FileName property. * Added a MessageSummaryFetched event to IMailFolder to better enable developers to both provide progress feedback to their users as well as enable them to better recover from exceptions (such as a dropped connection) occurring during the fetching of message summaries. * Added support for the IMAP SORT=DISPLAY extension. * Added a work-around for Cyrus IMAP 2.4.16 sending untagged SEARCH responses when untagged ESEARCH responses are expected. ## MailKit 1.0.12 (2015-03-21) * Fixed ImapFolder.GetMessage(), GetBodyPart() and GetStream() to throw an ImapCommandException rather than returning null if the server did not response with the message data. * Added new, much more usable, Connect() methods to ImapClient, Pop3Client, and SmtpClient that take a hostname, port, and SecureSocketOptions. * Added a workaround for smtp.strato.de's blatant disregard for standards. (issue [#162](https://github.com/jstedfast/MailKit/issues/162)) * Fixed ImapFolder.Close() to require ReadWrite access if expunge is true. * Fixed IMAP SORT queries to inject "RETURN" before the orderBy param. (issue [#164](https://github.com/jstedfast/MailKit/issues/164)) * Implemented support for the IMAP ACL extension. ## MailKit 1.0.11 (2015-03-14) * Make sure that the IMAP stream supports timeouts before using them (fixes a regression introduced in 1.0.10). * Added BodyParts and Attachments convenience properties to MessageSummary. * Added TextBody and HtmlBody convenience properties to MessageSummary. * Added ImapClient.IsAuthenticated, Pop3Client.IsAuthenticated and SmtpClient.IsAuthenticated properties. * Changed the ImapClient.Inbox property to throw InvalidOperationException if you try to access it before authenticating instead of returning null. * Added an ImapClient.IsIdle property to check if the ImapClient is currently in the IDLE state. ## MailKit 1.0.10 (2015-03-08) * Added support for the IMAP ID extension. ## MailKit 1.0.9 (2015-03-02) * Modified UniqueId to contain a Validity value. This allows ImapFolder.Append(), CopyTo(), and MoveTo() to provide the caller with a way to make sure that the UIDs are (still) valid in the destination folder at a future point in time. * Modified ImapFolder.UidValidity to be a uint instead of a UniqueId which not only makes more sense but also simplifies comparison. * Fixed GMail Label APIs to use the modified UTF-7 encoding logic meant for folder names as it appears that GMail wants label names to be encoded in this way. (issue [#154](https://github.com/jstedfast/MailKit/issues/154)) ## MailKit 1.0.8 (2015-02-19) * Fixed the SMTP BINARYMIME extension support to work properly. (issue [#151](https://github.com/jstedfast/MailKit/issues/151)) * Fixed ImapFolder.Open() to not set the PermanentFlags to None if another folder was open (preventing SetFlags/AddFlags/RemoveFlags from functioning properly). (issue [#153](https://github.com/jstedfast/MailKit/issues/153)) ## MailKit 1.0.7 (2015-02-17) * Marked Pop3Client methods that take UIDs as [Obsolete]. It is suggested that the equivalent methods that take indexes be used instead and that UID-to-index mapping is done by the developer. This takes the burden off of the Pop3Client to maintain a mapping of UIDs to indexes that it cannot easily maintain. * Fixed SmtpCommandException to only serialize the Mailbox property when it is non-null. (issue [#148](https://github.com/jstedfast/MailKit/issues/148)) * Fixed IMAP support to accept a UIDVALIDITY value of 0 (even though it is technically illegal) to work around a bug in SmarterMail 13.0. (issue [#150](https://github.com/jstedfast/MailKit/issues/150)) * Fixed ImapFolder.GetSubfolders() to filter out non-child folders from the list that it returns (once again, a work-around for a SmarterMail 13.0 bug). (issue [#149](https://github.com/jstedfast/MailKit/issues/149)) ## MailKit 1.0.6 (2015-01-18) * Fixed some issues revealed by source analysis. * Migrated the iOS assemblies to Xamarin.iOS Unified API for 64-bit support. Note: If you are not yet ready to port your iOS application to the Unified API, you will need to stick with the 1.0.5 release. The Classic MonoTouch API is no longer supported. ## MailKit 1.0.5 (2015-01-08) * Added Connect() overloads which takes a Socket argument (issue [#128](https://github.com/jstedfast/MailKit/issues/128)). * Added support for SMTP Delivery Status Notifications (issue [#136](https://github.com/jstedfast/MailKit/issues/136)). * Modified the ImapFolder logic such that if the IMAP server does not send a PERMANENTFLAGS resp-code when SELECTing the folder, then it will assume that all flags are permanent (issue [#140](https://github.com/jstedfast/MailKit/issues/140)). ## MailKit 1.0.4 (2014-12-13) * Modified the IMAP BODYSTRUCTURE parser to allow NIL tokens for Content-Type and Content-Disposition parameter values. (issue [#124](https://github.com/jstedfast/MailKit/issues/124)) * Added ImapFolder.GetBodyPart() overrides to allow fetching body parts based on a part specifier string. (issue [#130](https://github.com/jstedfast/MailKit/issues/130)) ## MailKit 1.0.3 (2014-12-05) * Added a new ImapFolder.Fetch() overload that takes a HashSet<string> of header fields to fetch instead of a HashSet<HeaderId> for developers that need the ability to request custom headers not defined in the HeaderId enum. * Added an SmtpClient.MessageSent event and an OnMessageSent() method that can be overridden. ## MailKit 1.0.2 (2014-11-23) * Modified ProtocolLogger to flush the stream at the end of each Log(). * Fixed IMAP SEARCH queries with empty string arguments. * Fixed the IMAP FETCH parser to accept qstrings and literals for header field names. * Improved documentation. ## MailKit 1.0.1 (2014-10-27) * Fixed Pop3Client.GetMessages (int startIndex, int count, ...) to use 1-based sequence numbers. * Fixed POP3 PIPELINING support to work as intended (issue [#114](https://github.com/jstedfast/MailKit/issues/114)). * Added a work-around for Office365.com IMAP to avoid ImapProtocolExceptions about unexpected '[' tokens when moving or copying messages between folders (issue [#115](https://github.com/jstedfast/MailKit/issues/115)). * Disabled SSLv3 for security reasons (POODLE), opting instead to use TLS. ================================================ FILE: SECURITY.md ================================================ # Security Policy The MailKit team takes the security of our software products and services seriously. If you believe you have found a security vulnerability in the MailKit repository, please report it to us as described below. ## Supported Versions Due to the fact that the MailKit team is small (currently only myself), I can only support security fixes for the latest version. | Version | Supported | | ------- | ------------------ | | 4.x | :white_check_mark: | | < 4.0 | :x: | ## Reporting a Vulnerability **Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them via a [Private Security Advisory](https://github.com/jstedfast/MailKit/security/advisories/new) submission. For more information about the fields available and guidance on filling in the form, see "[Creating a repository security advisory](https://docs.github.com/en/code-security/security-advisories/working-with-repository-security-advisories/creating-a-repository-security-advisory)" and "[Best practices for writing repository security advisories.](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/best-practices-for-writing-repository-security-advisories)" You should receive a response within 24 hours. If for some reason you do not, please follow up via [email](mailto:jestedfa@microsoft.com?subject=MailKit%20Security%20Advisory) to ensure we received your original message. ## Preferred Languages All communications should be in English. ================================================ FILE: TODO.md ================================================ ## TODO * SASL Authentication * Include code to fetch an OAuth2 token? * IMAP4 Client * Consolidate MessageFlagsChanged, MessageLabelsChanged, and ModSeqChanged events into a single event? * Extensions: * BINARY * CATENATE * LIST-EXTENDED (Note: partially implemented already) * CONVERT (Note: none of the mainstream IMAP servers seem to support this) * MULTISEARCH (Note: none of the mainstream IMAP servers seem to support this) * UNAUTHENTICATE * MessageThreader * Fix UniqueId property to be just a UniqueId instead of Nullable. * IMailFolder * Modify Append() methods to simply return UniqueId instead of Nullable? * Modify CopyTo/MoveTo() methods to also return UniqueId instead of Nullable? * Maildir * Thunderbird-style mbox folder trees? ================================================ FILE: Telemetry.md ================================================ # MailKit Telemetry Documentation ## Socket Metrics ### Metric: `mailkit.net.socket.connect.count` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.socket.connect.count` | Counter | `{attempt}` | The number of times a socket attempted to connect to a remote host. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `network.peer.address` | string | Peer IP address of the socket connection. | `142.251.167.109` | Always | | `server.address` | string | The host name that the socket is connecting to. | `smtp.gmail.com` | Always | | `server.port` | int | The port that the socket is connecting to. | `465` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | This metric tracks the number of times a socket attempted to connect to a remote host. `error.type` has the following values: | **Value** | **Description** | |:------------------------|:-------------------------------------------------------------------------------| | `cancelled` | The operation was cancelled. | | `host_not_found` | No such host is known. The name is not an official host name or alias. | | `host_unreachable` | There is no network route to the specified host. | | `network_unreachable` | No route to the remote host exists. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_refused` | The remote host is actively refusing a connection. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `too_many_open_sockets` | There are too many open sockets in the underlying socket provider. | Available starting in: MailKit v4.7.0 ### Metric: `mailkit.net.socket.connect.duration` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.socket.connect.duration` | Histogram | `ms` | The number of milliseconds taken for a socket to connect to a remote host. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `network.peer.address` | string | Peer IP address of the socket connection. | `142.251.167.109` | Always | | `server.address` | string | The host name that the socket is connecting to. | `smtp.gmail.com` | Always | | `server.port` | int | The port that the socket is connecting to. | `465` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | This metric measures the time it takes to connect a socket to a remote host. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `host_not_found` | No such host is known. The name is not an official host name or alias. | | `host_unreachable` | There is no network route to the specified host. | | `network_unreachable` | No route to the remote host exists. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_refused` | The remote host is actively refusing a connection. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `too_many_open_sockets` | There are too many open sockets in the underlying socket provider. | Available starting in: MailKit v4.7.0 ## SmtpClient Metrics ### Metric: `mailkit.net.smtp.client.connection.duration` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.smtp.client.connection.duration` | Histogram | `s` | The duration of successfully established connections to an SMTP server. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `smtp.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `25`, `465`, `587` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `smtp` or `smtps` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, `send`, ... | Always | This metric tracks the connection duration of each SmtpClient connection and records any error details if the connection was terminated involuntarily. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ### Metric: `mailkit.net.smtp.client.operation.count` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.smtp.client.operation.count` | Counter | `{operation}` | The number of times a client performed an operation on an SMTP server. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `smtp.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `25`, `465`, `587` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `smtp` or `smtps` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, `send`, ... | Always | This metric tracks the number of times an SmtpClient has performed an operation on an SMTP server. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `host_not_found` | No such host is known. The name is not an official host name or alias. | | `host_unreachable` | There is no network route to the specified host. | | `network_unreachable` | No route to the remote host exists. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_refused` | The remote host is actively refusing a connection. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `too_many_open_sockets` | There are too many open sockets in the underlying socket provider. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ### Metric: `mailkit.net.smtp.client.operation.duration` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.smtp.client.operation.duration` | Histogram | `ms` | The amount of time it takes for the SMTP server to perform an operation. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `smtp.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `25`, `465`, `587` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `smtp` or `smtps` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, `send`, ... | Always | This metric tracks the amount of time it takes an SMTP server to perform an operation. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `host_not_found` | No such host is known. The name is not an official host name or alias. | | `host_unreachable` | There is no network route to the specified host. | | `network_unreachable` | No route to the remote host exists. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_refused` | The remote host is actively refusing a connection. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `too_many_open_sockets` | There are too many open sockets in the underlying socket provider. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ## Pop3Client Metrics ### Metric: `mailkit.net.pop3.client.connection.duration` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.pop3.client.connection.duration` | Histogram | `s` | The duration of successfully established connections to a POP3 server. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `pop.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `110`, `995` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `pop3` or `pop3s` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, ... | Always | This metric tracks the connection duration of each Pop3Client connection and records any error details if the connection was terminated involuntarily. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ### Metric: `mailkit.net.pop3.client.operation.count` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.pop3.client.operation.count` | Counter | `{operation}` | The number of times a client performed an operation on a POP3 server. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `pop.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `110`, `995` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `pop3` or `pop3s` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, ... | Always | This metric tracks the number of times an Pop3Client has performed an operation on a POP3 server. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `host_not_found` | No such host is known. The name is not an official host name or alias. | | `host_unreachable` | There is no network route to the specified host. | | `network_unreachable` | No route to the remote host exists. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_refused` | The remote host is actively refusing a connection. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `too_many_open_sockets` | There are too many open sockets in the underlying socket provider. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ### Metric: `mailkit.net.pop3.client.operation.duration` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.pop3.client.operation.duration` | Histogram | `ms` | The amount of time it takes for the POP3 server to perform an operation. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `pop.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `110`, `995` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `pop3` or `pop3s` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, ... | Always | This metric tracks the amount of time it takes a POP3 server to perform an operation. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `host_not_found` | No such host is known. The name is not an official host name or alias. | | `host_unreachable` | There is no network route to the specified host. | | `network_unreachable` | No route to the remote host exists. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_refused` | The remote host is actively refusing a connection. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `too_many_open_sockets` | There are too many open sockets in the underlying socket provider. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ## ImapClient Metrics ### Metric: `mailkit.net.imap.client.connection.duration` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.imap.client.connection.duration` | Histogram | `s` | The duration of successfully established connections to an IMAP server. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `imap.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `143`, `993` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `imap` or `imaps` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, ... | Always | This metric tracks the connection duration of each ImapClient connection and records any error details if the connection was terminated involuntarily. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ### Metric: `mailkit.net.imap.client.operation.count` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.imap.client.operation.count` | Counter | `{operation}` | The number of times a client performed an operation on an IMAP server. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `imap.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `143`, `993` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `imap` or `imaps` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, ... | Always | This metric tracks the number of times an ImapClient has performed an operation on an IMAP server. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `host_not_found` | No such host is known. The name is not an official host name or alias. | | `host_unreachable` | There is no network route to the specified host. | | `network_unreachable` | No route to the remote host exists. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_refused` | The remote host is actively refusing a connection. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `too_many_open_sockets` | There are too many open sockets in the underlying socket provider. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ### Metric: `mailkit.net.imap.client.operation.duration` **Status:** [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/document-status.md) | **Name** | **Instrument Type** | **Unit** | **Description** | |:----------------------------------------------|:--------------------|:----------------|:---------------------------------------------------------------------------| | `mailkit.net.imap.client.operation.duration` | Histogram | `ms` | The amount of time it takes for the IMAP server to perform an operation. | | **Attribute** | **Type** | **Description** | **Examples** | **Presence** | |:---------------------------|:---------|:-------------------------------------------------|:------------------------------------------------|:----------------------| | `server.address` | string | The host name that the client is connected to. | `imap.gmail.com` | Always | | `server.port` | int | The port that the client is connected to. | `143`, `993` | Always | | `url.scheme` | string | The URL scheme of the protocol used. | `imap` or `imaps` | Always | | `error.type` | string | The type of error encountered. | `host_not_found`, `host_unreachable`, ... | If an error occurred. | | `network.operation` | string | The name of the operation. | `connect`, `authenticate`, ... | Always | This metric tracks the amount of time it takes an IMAP server to perform an operation. `error.type` has the following values: | **Value** | **Description** | |:--------------------------|:----------------------------------------------------------------------------------------| | `cancelled` | An operation was cancelled. | | `host_not_found` | No such host is known. The name is not an official host name or alias. | | `host_unreachable` | There is no network route to the specified host. | | `network_unreachable` | No route to the remote host exists. | | `connection_aborted` | The connection was aborted by .NET or the underlying socket provider. | | `connection_refused` | The remote host is actively refusing a connection. | | `connection_reset` | The connection was reset by the remote peer. | | `timed_out` | The connection attempt timed out, or the connected host has failed to respond. | | `too_many_open_sockets` | There are too many open sockets in the underlying socket provider. | | `secure_connection_error` | An SSL or TLS connection could not be negotiated. | | `protocol_error` | The connection was terminated due to an incomplete or invalid response from the server. | Available starting in: MailKit v4.7.0 ================================================ FILE: UnitTests/AccessControlListTests.cs ================================================ // // AccessControlListTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections; using MailKit; namespace UnitTests { [TestFixture] public class AccessControlListTests { [Test] public void TestArgumentExceptions () { var enumeratedRights = new [] { AccessRight.OpenFolder, AccessRight.CreateFolder }; var array = new AccessRight[10]; var rights = new AccessRights (enumeratedRights); Assert.Throws (() => rights.AddRange ((string) null)); Assert.Throws (() => rights.AddRange ((IEnumerable) null)); Assert.Throws (() => new AccessRights ((string) null)); Assert.Throws (() => new AccessRights ((IEnumerable) null)); Assert.Throws (() => { var x = rights [-1]; }); Assert.Throws (() => rights.CopyTo (null, 0)); Assert.Throws (() => rights.CopyTo (array, -1)); var control = new AccessControl ("control"); Assert.Throws (() => new AccessControl (null)); Assert.Throws (() => new AccessControl (null, "rk")); Assert.Throws (() => new AccessControl (null, enumeratedRights)); Assert.Throws (() => new AccessControl ("name", (string) null)); Assert.Throws (() => new AccessControl ("name", (IEnumerable) null)); var list = new AccessControlList (); Assert.Throws (() => new AccessControlList (null)); //Assert.Throws (() => list.Add (null)); Assert.Throws (() => list.AddRange (null)); } [Test] public void TestAccessRight () { Assert.That (AccessRight.Administer == new AccessRight (AccessRight.Administer.Right), Is.True, "=="); Assert.That (AccessRight.Administer == new AccessRight (AccessRight.OpenFolder.Right), Is.False, "=="); Assert.That (AccessRight.Administer != new AccessRight (AccessRight.Administer.Right), Is.False, "!="); Assert.That (AccessRight.Administer != new AccessRight (AccessRight.OpenFolder.Right), Is.True, "!="); Assert.That (AccessRight.Administer.Equals ((object) new AccessRight (AccessRight.Administer.Right)), Is.True, "Equals"); Assert.That (new AccessRight (AccessRight.Administer.Right).GetHashCode (), Is.EqualTo (AccessRight.Administer.GetHashCode ()), "GetHashCode"); Assert.That (AccessRight.Administer.ToString (), Is.EqualTo ("a"), "ToString"); } [Test] public void TestAccessRights () { var expected = new [] { AccessRight.OpenFolder, AccessRight.CreateFolder, AccessRight.DeleteFolder, AccessRight.ExpungeFolder, AccessRight.AppendMessages, AccessRight.SetMessageDeleted }; var rights = new AccessRights (); int i; Assert.That (rights.IsReadOnly, Is.False, "IsReadOnly"); Assert.That (rights.Add (AccessRight.OpenFolder), Is.True, "Add OpenFolder"); Assert.That (rights, Has.Count.EqualTo (1), "Count after adding OpenFolder"); Assert.That (rights.Add (AccessRight.OpenFolder), Is.False, "Add OpenFolder again"); Assert.That (rights, Has.Count.EqualTo (1), "Count after adding OpenFolder again"); Assert.That (rights.Add (AccessRight.CreateFolder.Right), Is.True, "Add CreateFolder"); Assert.That (rights, Has.Count.EqualTo (2), "Count after adding CreateFolder"); Assert.That (rights.Add (AccessRight.CreateFolder), Is.False, "Add CreateFolder again"); Assert.That (rights, Has.Count.EqualTo (2), "Count after adding OpenFolder again"); rights.AddRange (new [] { AccessRight.DeleteFolder, AccessRight.ExpungeFolder }); Assert.That (rights, Has.Count.EqualTo (4), "Count after adding DeleteFolder and ExpungeFolder"); Assert.That (rights, Does.Contain (AccessRight.DeleteFolder), "Contains DeleteFolder"); Assert.That (rights, Does.Contain (AccessRight.ExpungeFolder), "Contains ExpungeFolder"); Assert.That (rights, Does.Not.Contain (AccessRight.Administer), "Contains Administer"); rights.AddRange ("it"); Assert.That (rights, Has.Count.EqualTo (6), "Count after adding AppendMessages and SetMessageDeleted"); Assert.That (rights, Does.Contain (AccessRight.AppendMessages), "Contains AppendMessages"); Assert.That (rights, Does.Contain (AccessRight.SetMessageDeleted), "Contains SetMessageDeleted"); Assert.That (rights, Does.Not.Contain (AccessRight.Administer), "Contains Administer"); for (i = 0; i < 6; i++) Assert.That (rights[i], Is.EqualTo (expected[i]), $"rights[{i}]"); ((ICollection) rights).Add (AccessRight.Administer); Assert.That (rights.Remove (AccessRight.Administer), Is.True, "Remove Administer"); Assert.That (rights.Remove (AccessRight.Administer), Is.False, "Remove Administer again"); i = 0; foreach (var right in rights) Assert.That (right, Is.EqualTo (expected[i]), $"foreach rights[{i++}]"); i = 0; foreach (AccessRight right in ((IEnumerable) rights)) Assert.That (right, Is.EqualTo (expected[i]), $"generic foreach rights[{i++}]"); var array = new AccessRight[rights.Count]; rights.CopyTo (array, 0); for (i = 0; i < 6; i++) Assert.That (array[i], Is.EqualTo (expected[i]), $"CopyTo[{i}]"); Assert.That (rights.ToString (), Is.EqualTo ("rkxeit"), "ToString"); } [Test] public void TestAccessControl () { var control = new AccessControl ("empty"); Assert.That (control.Name, Is.EqualTo ("empty"), "Name"); Assert.That (control.Rights.ToString (), Is.EqualTo (""), "Rights (empty)"); control = new AccessControl ("admin", "a"); Assert.That (control.Name, Is.EqualTo ("admin"), "Name"); Assert.That (control.Rights.ToString (), Is.EqualTo ("a"), "Rights (admin)"); control = new AccessControl ("it", new [] { AccessRight.AppendMessages, AccessRight.SetMessageDeleted }); Assert.That (control.Name, Is.EqualTo ("it"), "Name"); Assert.That (control.Rights.ToString (), Is.EqualTo ("it"), "Rights (it)"); } [Test] public void TestAccessControlList () { var list = new AccessControlList (new [] { new AccessControl ("admin", new [] { AccessRight.Administer }) }); Assert.That (list, Has.Count.EqualTo (1), "Count"); Assert.That (list[0].Name, Is.EqualTo ("admin"), "list[0].Name"); } } } ================================================ FILE: UnitTests/AnnotationAttributeTests.cs ================================================ // // AnnotationAttributeTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit; namespace UnitTests { [TestFixture] public class AnnotationAttributeTests { [Test] public void TestArgumentExceptions () { Assert.Throws (() => new AnnotationAttribute (null)); Assert.Throws (() => new AnnotationAttribute (string.Empty)); Assert.Throws (() => new AnnotationAttribute ("*")); Assert.Throws (() => new AnnotationAttribute ("%")); Assert.Throws (() => new AnnotationAttribute ("w*ldcard")); Assert.Throws (() => new AnnotationAttribute ("w%ldcard")); } [Test] public void TestBasicFunctionality () { AnnotationAttribute attr; attr = new AnnotationAttribute ("value"); Assert.That (attr.Name, Is.EqualTo ("value"), "Name"); Assert.That (attr.Specifier, Is.EqualTo ("value"), "Specifier"); Assert.That (attr.Scope, Is.EqualTo (AnnotationScope.Both), "Scope"); attr = new AnnotationAttribute ("value.priv"); Assert.That (attr.Name, Is.EqualTo ("value"), "Name"); Assert.That (attr.Specifier, Is.EqualTo ("value.priv"), "Specifier"); Assert.That (attr.Scope, Is.EqualTo (AnnotationScope.Private), "Scope"); attr = new AnnotationAttribute ("value.shared"); Assert.That (attr.Name, Is.EqualTo ("value"), "Name"); Assert.That (attr.Specifier, Is.EqualTo ("value.shared"), "Specifier"); Assert.That (attr.Scope, Is.EqualTo (AnnotationScope.Shared), "Scope"); } [Test] public void TestEquality () { var value = new AnnotationAttribute ("value"); Assert.That (value, Is.EqualTo (AnnotationAttribute.Value), "AreEqual"); Assert.That (AnnotationAttribute.Value.Equals (value), Is.True, ".Equals"); Assert.That (value == AnnotationAttribute.Value, Is.True, "value == value"); Assert.That (AnnotationAttribute.PrivateValue != AnnotationAttribute.SharedValue, Is.True, "value.priv != value.shared"); Assert.That (AnnotationAttribute.Value.Equals ((object) null), Is.False, "value.Equals ((object) null)"); Assert.That (AnnotationAttribute.Value.Equals ((AnnotationAttribute) null), Is.False, "value.Equals ((AnnotationAttribute) null)"); Assert.That (AnnotationAttribute.Value == null, Is.False, "value == null"); Assert.That (AnnotationAttribute.Value != null, Is.True, "/comment != null"); } } } ================================================ FILE: UnitTests/AnnotationEntryTests.cs ================================================ // // AnnotationEntryTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MimeKit; using MailKit; namespace UnitTests { [TestFixture] public class AnnotationEntryTests { [Test] public void TestArgumentExceptions () { Assert.Throws (() => new AnnotationEntry (null)); Assert.Throws (() => new AnnotationEntry (string.Empty)); Assert.Throws (() => new AnnotationEntry ("x")); // paths must begin with '/' Assert.Throws (() => new AnnotationEntry ("/1.2.3.4.5")); // paths must not begin with a part-spec Assert.Throws (() => new AnnotationEntry ("/台北/日本語")); // paths may not contain non-ascii characters Assert.Throws (() => new AnnotationEntry ("/path/0wnz")); // path components must not begin with a number Assert.Throws (() => new AnnotationEntry ("/root//node")); // path components must not contain "//" Assert.Throws (() => new AnnotationEntry ("/root/")); // path components must not end with '/' Assert.Throws (() => new AnnotationEntry ("/root..node")); // path components must not contain ".." Assert.Throws (() => new AnnotationEntry ("/root./node")); // path components must not end with '.' Assert.Throws (() => new AnnotationEntry ("/root.")); // path components must not end with '.' Assert.Throws (() => new AnnotationEntry ((string) null, "/comment")); Assert.Throws (() => new AnnotationEntry ("1", null)); Assert.Throws (() => new AnnotationEntry ("abc", "/comment")); // invalid part-spec Assert.Throws (() => new AnnotationEntry ("1.", "/comment")); // invalid part-spec Assert.Throws (() => new AnnotationEntry ("1..", "/comment")); // invalid part-spec Assert.Throws (() => new AnnotationEntry ("1..2", "/comment")); // invalid part-spec Assert.Throws (() => new AnnotationEntry ((BodyPart) null, "/comment")); Assert.Throws (() => AnnotationEntry.Parse (null)); } [Test] public void TestBasicFunctionality () { var body = new BodyPartBasic (new ContentType ("image", "jpeg"), "1.2.3.4"); AnnotationEntry entry; entry = new AnnotationEntry ("/comment"); Assert.That (entry.Entry, Is.EqualTo ("/comment"), "Entry"); Assert.That (entry.PartSpecifier, Is.Null, "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Both), "Scope"); entry = new AnnotationEntry ("/comment", AnnotationScope.Private); Assert.That (entry.Entry, Is.EqualTo ("/comment.priv"), "Entry"); Assert.That (entry.PartSpecifier, Is.Null, "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Private), "Scope"); entry = new AnnotationEntry ("/comment", AnnotationScope.Shared); Assert.That (entry.Entry, Is.EqualTo ("/comment.shared"), "Entry"); Assert.That (entry.PartSpecifier, Is.Null, "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Shared), "Scope"); entry = new AnnotationEntry ("1.2.3.4", "/comment"); Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Both), "Scope"); entry = new AnnotationEntry ("1.2.3.4", "/comment", AnnotationScope.Private); Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment.priv"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Private), "Scope"); entry = new AnnotationEntry ("1.2.3.4", "/comment", AnnotationScope.Shared); Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment.shared"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Shared), "Scope"); entry = new AnnotationEntry (body, "/comment"); Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Both), "Scope"); entry = new AnnotationEntry (body, "/comment", AnnotationScope.Private); Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment.priv"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Private), "Scope"); entry = new AnnotationEntry (body, "/comment", AnnotationScope.Shared); Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment.shared"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Shared), "Scope"); } [Test] public void TestEquality () { var comment = new AnnotationEntry ("/comment"); Assert.That (comment, Is.EqualTo (AnnotationEntry.Comment), "AreEqual"); Assert.That (AnnotationEntry.Comment.Equals (comment), Is.True, ".Equals"); Assert.That (comment == AnnotationEntry.Comment, Is.True, "/comment == /comment"); Assert.That (AnnotationEntry.PrivateComment != AnnotationEntry.SharedComment, Is.True, "/comment.priv != /comment.shared"); Assert.That (AnnotationEntry.Comment.Equals ((object) null), Is.False, "/comment.Equals ((object) null)"); Assert.That (AnnotationEntry.Comment.Equals ((AnnotationEntry) null), Is.False, "/comment.Equals ((AnnotationEntry) null)"); Assert.That (AnnotationEntry.Comment == null, Is.False, "/comment == null"); Assert.That (AnnotationEntry.Comment != null, Is.True, "/comment != null"); } [Test] public void TestParse () { AnnotationEntry entry; Assert.Throws (() => AnnotationEntry.Parse (string.Empty), "string.Empty"); // invalid part-specs Assert.Throws (() => AnnotationEntry.Parse ("/1./comment"), "/1./comment"); Assert.Throws (() => AnnotationEntry.Parse ("/1../comment"), "/1../comment"); Assert.Throws (() => AnnotationEntry.Parse ("/1..2/comment"), "/1..2/comment"); // invalid paths Assert.Throws (() => AnnotationEntry.Parse ("x"), "x"); // paths must begin with '/' Assert.Throws (() => AnnotationEntry.Parse ("/1a/comment"), "/1a/comment"); // invalid character in part-spec Assert.Throws (() => AnnotationEntry.Parse ("/1.2.3.4.5"), "/1.2.3.4.5"); // paths must not contain only a part-spec Assert.Throws (() => AnnotationEntry.Parse ("/台北/日本語"), "/台北/日本語"); // paths may not contain non-ascii characters Assert.Throws (() => AnnotationEntry.Parse ("/path/0wnz"), "/path/0wnz"); // path components must not begin with a number Assert.Throws (() => AnnotationEntry.Parse ("/root//node"), "/root//node"); // path components must not contain "//" Assert.Throws (() => AnnotationEntry.Parse ("/root/"), "/root/"); // path components must not end with '/' Assert.Throws (() => AnnotationEntry.Parse ("/root..node"), "/root..node"); // path components must not contain ".." Assert.Throws (() => AnnotationEntry.Parse ("/root./node"), "/root./node"); // path components must not end with '.' Assert.Throws (() => AnnotationEntry.Parse ("/root."), "/root."); // path components must not end with '.' try { entry = AnnotationEntry.Parse ("/comment"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry.Entry, Is.EqualTo ("/comment"), "Entry"); Assert.That (entry.PartSpecifier, Is.Null, "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Both), "Scope"); try { entry = AnnotationEntry.Parse ("/comment.priv"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry.Entry, Is.EqualTo ("/comment.priv"), "Entry"); Assert.That (entry.PartSpecifier, Is.Null, "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Private), "Scope"); try { entry = AnnotationEntry.Parse ("/comment.shared"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } entry = new AnnotationEntry ("/comment", AnnotationScope.Shared); Assert.That (entry.Entry, Is.EqualTo ("/comment.shared"), "Entry"); Assert.That (entry.PartSpecifier, Is.Null, "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Shared), "Scope"); try { entry = AnnotationEntry.Parse ("/1.2.3.4/comment"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Both), "Scope"); try { entry = AnnotationEntry.Parse ("/1.2.3.4/comment.priv"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment.priv"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Private), "Scope"); try { entry = AnnotationEntry.Parse ("/1.2.3.4/comment.shared"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment.shared"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Shared), "Scope"); } [Test] public void TestCreate () { AnnotationEntry entry; try { entry = AnnotationEntry.Create ("/comment"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.Comment), "/comment"); try { entry = AnnotationEntry.Create ("/comment.priv"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.PrivateComment), "/comment.priv"); try { entry = AnnotationEntry.Create ("/comment.shared"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.SharedComment), "/comment.shared"); try { entry = AnnotationEntry.Create ("/flags"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.Flags), "/flags"); try { entry = AnnotationEntry.Create ("/flags.priv"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.PrivateFlags), "/flags.priv"); try { entry = AnnotationEntry.Create ("/flags.shared"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.SharedFlags), "/flags.shared"); try { entry = AnnotationEntry.Create ("/altsubject"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.AltSubject), "/altsubject"); try { entry = AnnotationEntry.Create ("/altsubject.priv"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.PrivateAltSubject), "/altsubject.priv"); try { entry = AnnotationEntry.Create ("/altsubject.shared"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry, Is.EqualTo (AnnotationEntry.SharedAltSubject), "/altsubject.shared"); try { entry = AnnotationEntry.Create ("/1.2.3.4/comment"); } catch (Exception ex) { Assert.Fail ($"Did not expect: {ex}"); return; } Assert.That (entry.Entry, Is.EqualTo ("/1.2.3.4/comment"), "Entry"); Assert.That (entry.PartSpecifier, Is.EqualTo ("1.2.3.4"), "PartSpecifier"); Assert.That (entry.Path, Is.EqualTo ("/comment"), "Path"); Assert.That (entry.Scope, Is.EqualTo (AnnotationScope.Both), "Scope"); } } } ================================================ FILE: UnitTests/AnnotationTests.cs ================================================ // // AnnotationTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit; namespace UnitTests { [TestFixture] public class AnnotationTests { [Test] public void TestArgumentExceptions () { Assert.Throws (() => new Annotation (null)); } [Test] public void TestBasicFunctionality () { var annotation = new Annotation (AnnotationEntry.AltSubject); annotation.Properties.Add (AnnotationAttribute.SharedValue, "Shared altsubject"); annotation.Properties.Add (AnnotationAttribute.PrivateValue, "Private altsubject"); Assert.That (annotation.Entry, Is.EqualTo (AnnotationEntry.AltSubject), "Entry"); Assert.That (annotation.Properties, Has.Count.EqualTo (2), "Count"); } } } ================================================ FILE: UnitTests/AppendRequestTests.cs ================================================ // // AppendRequestTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MimeKit; using MailKit; namespace UnitTests { [TestFixture] public class AppendRequestTests { [Test] public void TestArgumentExceptions () { var keywords = new string[] { "$Forwarded" }; var message = new MimeMessage (); Assert.Throws (() => new AppendRequest (null)); Assert.Throws (() => new AppendRequest (null, MessageFlags.Seen)); Assert.Throws (() => new AppendRequest (null, MessageFlags.Seen, DateTimeOffset.Now)); Assert.Throws (() => new AppendRequest (null, MessageFlags.Seen, keywords)); Assert.Throws (() => new AppendRequest (message, MessageFlags.Seen, null)); Assert.Throws (() => new AppendRequest (null, MessageFlags.Seen, keywords, DateTimeOffset.Now)); Assert.Throws (() => new AppendRequest (message, MessageFlags.Seen, null, DateTimeOffset.Now)); } [Test] public void TestConstructors () { //var annotation = new Annotation (AnnotationEntry.AltSubject); //annotation.Properties[AnnotationAttribute.PrivateValue] = string.Format ("Alternate subject"); //var annotations = new Annotation[] { annotation }; var keywords = new string[] { "$Forwarded", "$Junk" }; var keywordSet = new HashSet (keywords); var flags = MessageFlags.Seen | MessageFlags.Draft; var internalDate = DateTimeOffset.Now; var message = new MimeMessage (); AppendRequest request; request = new AppendRequest (message); Assert.That (request.Message, Is.EqualTo (message), "Message #1"); Assert.That (request.Flags, Is.EqualTo (MessageFlags.None), "Flags #1"); Assert.That (request.Keywords, Is.Null, "Keywords #1"); Assert.That (request.InternalDate, Is.Null, "InternalDate #1"); Assert.That (request.Annotations, Is.Null, "Annotations #1"); request = new AppendRequest (message, flags); Assert.That (request.Message, Is.EqualTo (message), "Message #2"); Assert.That (request.Flags, Is.EqualTo (flags), "Flags #2"); Assert.That (request.Keywords, Is.Null, "Keywords #2"); Assert.That (request.InternalDate, Is.Null, "InternalDate #2"); Assert.That (request.Annotations, Is.Null, "Annotations #2"); request = new AppendRequest (message, flags, keywords); Assert.That (request.Message, Is.EqualTo (message), "Message #3"); Assert.That (request.Flags, Is.EqualTo (flags), "Flags #3"); Assert.That (request.Keywords, Is.InstanceOf> (), "Keywords Type #3"); Assert.That (request.Keywords, Has.Count.EqualTo (keywords.Length), "Keywords #3"); Assert.That (request.InternalDate, Is.Null, "InternalDate #3"); Assert.That (request.Annotations, Is.Null, "Annotations #3"); request = new AppendRequest (message, flags, keywordSet); Assert.That (request.Message, Is.EqualTo (message), "Message #4"); Assert.That (request.Flags, Is.EqualTo (flags), "Flags #4"); Assert.That (request.Keywords, Is.InstanceOf> (), "Keywords Type #4"); Assert.That (request.Keywords, Is.EqualTo (keywordSet), "Keywords #4"); Assert.That (request.InternalDate, Is.Null, "InternalDate #4"); Assert.That (request.Annotations, Is.Null, "Annotations #4"); request = new AppendRequest (message, flags, internalDate); Assert.That (request.Message, Is.EqualTo (message), "Message #5"); Assert.That (request.Flags, Is.EqualTo (flags), "Flags #5"); Assert.That (request.Keywords, Is.Null, "Keywords #5"); Assert.That (request.InternalDate.Value, Is.EqualTo (internalDate), "InternalDate #5"); Assert.That (request.Annotations, Is.Null, "Annotations #5"); request = new AppendRequest (message, flags, keywords, internalDate); Assert.That (request.Message, Is.EqualTo (message), "Message #6"); Assert.That (request.Flags, Is.EqualTo (flags), "Flags #6"); Assert.That (request.Keywords, Is.InstanceOf> (), "Keywords Type #6"); Assert.That (request.Keywords, Has.Count.EqualTo (keywords.Length), "Keywords #6"); Assert.That (request.InternalDate.Value, Is.EqualTo (internalDate), "InternalDate #6"); Assert.That (request.Annotations, Is.Null, "Annotations #6"); request = new AppendRequest (message, flags, keywordSet, internalDate); Assert.That (request.Message, Is.EqualTo (message), "Message #7"); Assert.That (request.Flags, Is.EqualTo (flags), "Flags #7"); Assert.That (request.Keywords, Is.InstanceOf> (), "Keywords Type #7"); Assert.That (request.Keywords, Is.EqualTo (keywordSet), "Keywords #7"); Assert.That (request.InternalDate.Value, Is.EqualTo (internalDate), "InternalDate #7"); Assert.That (request.Annotations, Is.Null, "Annotations #7"); } } } ================================================ FILE: UnitTests/ArgumentExceptionTests.cs ================================================ // // ArgumentExceptionTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit; using MailKit.Search; namespace UnitTests { [TestFixture] public class ArgumentExceptionTests { [Test] public void TestArgumentExceptions () { Assert.Throws (() => new OrderBy (OrderByType.To, SortOrder.None)); Assert.Throws (() => new OrderByAnnotation (null, AnnotationAttribute.PrivateValue, SortOrder.Ascending)); Assert.Throws (() => new OrderByAnnotation (AnnotationEntry.AltSubject, null, SortOrder.Ascending)); Assert.Throws (() => new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.Size, SortOrder.Ascending)); Assert.Throws (() => new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.PrivateSize, SortOrder.Ascending)); Assert.Throws (() => new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedSize, SortOrder.Ascending)); } } } ================================================ FILE: UnitTests/BodyPartTests.cs ================================================ // // BodyPartTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using System.Collections; using MimeKit; using MailKit; // Note: These tests are for BodyPart and Envelope's custom format. While the format is similar // to IMAP, it is not exactly the same. Do not assume that IMAP strings will work properly // with these parsers. namespace UnitTests { [TestFixture] public class BodyPartTests { [Test] public void TestBodyPartBasic () { var uri = new Uri ("https://www.nationalgeographic.com/travel/contests/photographer-of-the-year-2018/wallpapers/week-9-nature/2/"); const string expected = "(\"image\" \"jpeg\" (\"name\" \"wallpaper.jpg\") \"id@localhost\" \"A majestic supercell storm approaching a house in Kansas, 2016.\" \"base64\" 0 \"8criUiOQmpfifOuOmYFtEQ==\" (\"attachment\" (\"filename\" \"wallpaper.jpg\")) (\"en\" \"fr\") \"https://www.nationalgeographic.com/travel/contests/photographer-of-the-year-2018/wallpapers/week-9-nature/2/\")"; var contentType = new ContentType ("image", "jpeg") { Name = "wallpaper.jpg" }; BodyPartBasic basic, parsed; BodyPart body; basic = new BodyPartBasic (contentType, string.Empty) { ContentId = "id@localhost", ContentMd5 = "8criUiOQmpfifOuOmYFtEQ==", ContentLanguage = new string[] { "en", "fr" }, ContentLocation = uri, ContentDescription = "A majestic supercell storm approaching a house in Kansas, 2016.", ContentDisposition = new ContentDisposition (ContentDisposition.Attachment) { FileName = "wallpaper.jpg" }, ContentTransferEncoding = "base64" }; Assert.That (basic.IsAttachment, Is.True); Assert.That (basic.FileName, Is.EqualTo ("wallpaper.jpg")); Assert.That (basic.ToString (), Is.EqualTo (expected)); Assert.That (BodyPart.TryParse (expected, out body), Is.True); Assert.That (body, Is.InstanceOf ()); parsed = (BodyPartBasic) body; Assert.That (parsed.ToString (), Is.EqualTo (expected)); } [Test] public void TestNilSerialization () { var builder = new StringBuilder (); BodyPart.Encode (builder, (BodyPart) null); Assert.That (builder.ToString (), Is.EqualTo ("NIL"), "BodyPart"); builder.Clear (); BodyPart.Encode (builder, (BodyPartCollection) null); Assert.That (builder.ToString (), Is.EqualTo ("NIL"), "BodyPartCollection"); builder.Clear (); BodyPart.Encode (builder, (ContentDisposition) null); Assert.That (builder.ToString (), Is.EqualTo ("NIL"), "ContentDisposition"); //builder.Clear (); //BodyPart.Encode (builder, (ContentType) null); //Assert.That (builder.ToString (), Is.EqualTo ("NIL"), "ContentType"); builder.Clear (); BodyPart.Encode (builder, (Envelope) null); Assert.That (builder.ToString (), Is.EqualTo ("NIL"), "Envelope"); builder.Clear (); BodyPart.Encode (builder, (IList) null); Assert.That (builder.ToString (), Is.EqualTo ("NIL"), "IEnumerable"); } [Test] public void TestSimplePlainTextBody () { const string expected = "(\"text\" \"plain\" (\"charset\" \"us-ascii\" \"name\" \"body.txt\") NIL NIL \"7bit\" 3028 NIL NIL NIL NIL 92)"; var contentType = new ContentType ("text", "plain") { Charset = "us-ascii", Name = "body.txt" }; BodyPartText text, parsed; BodyPart body; text = new BodyPartText (contentType, string.Empty) { ContentTransferEncoding = "7bit", Octets = 3028, Lines = 92, }; Assert.That (text.IsPlain, Is.True); Assert.That (text.IsHtml, Is.False); Assert.That (text.IsAttachment, Is.False); Assert.That (text.FileName, Is.EqualTo ("body.txt")); Assert.That (text.ToString (), Is.EqualTo (expected)); Assert.That (BodyPart.TryParse (expected, out body), Is.True); Assert.That (body, Is.InstanceOf ()); parsed = (BodyPartText) body; Assert.That (parsed.ContentType.IsMimeType ("text", "plain"), Is.True, "Content-Type did not match."); Assert.That (parsed.ContentType.Charset, Is.EqualTo ("us-ascii"), "charset param did not match"); Assert.That (parsed.ContentType.Name, Is.EqualTo ("body.txt"), "name param did not match"); Assert.That (parsed.ContentTransferEncoding, Is.EqualTo ("7bit"), "Content-Transfer-Encoding did not match."); Assert.That (parsed.Octets, Is.EqualTo (3028), "Octet count did not match."); Assert.That (parsed.Lines, Is.EqualTo (92), "Line count did not match."); Assert.That (parsed.ToString (), Is.EqualTo (expected)); } [Test] public void TestBodyPartCollection () { var text = new BodyPartText (new ContentType ("text", "plain"), string.Empty) { ContentLocation = new Uri ("body", UriKind.Relative) }; var image1 = new BodyPartBasic (new ContentType ("image", "jpeg"), string.Empty) { ContentLocation = new Uri ("http://localhost/image1.jpg") }; var image2 = new BodyPartBasic (new ContentType ("image", "jpeg"), string.Empty) { ContentId = "image2@localhost" }; var list = new BodyPartCollection (); var parts = new BodyPart[3]; int i = 0; Assert.Throws (() => list.Add (null)); Assert.Throws (() => list.Remove (null)); Assert.Throws (() => list.Contains (null)); Assert.Throws (() => list.IndexOf (null)); Assert.Throws (() => list.CopyTo (null, 0)); Assert.Throws (() => list.CopyTo (parts, -1)); Assert.Throws (() => { var x = list[0]; }); Assert.That (list.IsReadOnly, Is.False); Assert.That (list, Is.Empty); list.Add (text); Assert.That (list, Has.Count.EqualTo (1)); Assert.That (list, Does.Contain (text)); Assert.That (list, Does.Not.Contain (image1)); Assert.That (list.IndexOf (new Uri ("body", UriKind.Relative)), Is.EqualTo (0)); Assert.That (list.IndexOf (new Uri ("http://localhost/image1.jpg")), Is.EqualTo (-1)); Assert.That (list.IndexOf (new Uri ("cid:image2@localhost")), Is.EqualTo (-1)); Assert.That (list[0], Is.EqualTo (text)); list.Add (image1); Assert.That (list, Has.Count.EqualTo (2)); Assert.That (list, Does.Contain (text)); Assert.That (list, Does.Contain (image1)); Assert.That (list.IndexOf (new Uri ("body", UriKind.Relative)), Is.EqualTo (0)); Assert.That (list.IndexOf (new Uri ("http://localhost/image1.jpg")), Is.EqualTo (1)); Assert.That (list.IndexOf (new Uri ("cid:image2@localhost")), Is.EqualTo (-1)); Assert.That (list[0], Is.EqualTo (text)); Assert.That (list[1], Is.EqualTo (image1)); Assert.That (list.Remove (text), Is.True); Assert.That (list, Has.Count.EqualTo (1)); Assert.That (list, Does.Not.Contain (text)); Assert.That (list, Does.Contain (image1)); Assert.That (list.IndexOf (new Uri ("body", UriKind.Relative)), Is.EqualTo (-1)); Assert.That (list.IndexOf (new Uri ("http://localhost/image1.jpg")), Is.EqualTo (0)); Assert.That (list.IndexOf (new Uri ("cid:image2@localhost")), Is.EqualTo (-1)); Assert.That (list[0], Is.EqualTo (image1)); list.Clear (); Assert.That (list, Is.Empty); list.Add (text); list.Add (image1); list.Add (image2); list.CopyTo (parts, 0); Assert.That (list.IndexOf (new Uri ("body", UriKind.Relative)), Is.EqualTo (0)); Assert.That (list.IndexOf (new Uri ("http://localhost/image1.jpg")), Is.EqualTo (1)); Assert.That (list.IndexOf (new Uri ("cid:image2@localhost")), Is.EqualTo (2)); foreach (var part in list) Assert.That (part, Is.EqualTo (parts[i++])); i = 0; foreach (var part in (IEnumerable) list) Assert.That (part, Is.EqualTo (parts[i++])); } [Test] public void TestNestedBodyStructure () { const string text = "(((\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 28 NIL NIL NIL NIL 2) (\"text\" \"html\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 1707 NIL NIL NIL NIL 65) \"alternative\" (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") NIL NIL NIL) (\"message\" \"rfc822\" NIL NIL NIL \"7bit\" 641 NIL (\"attachment\" NIL) NIL NIL (\"Sat, 08 Jan 2011 14:16:36 +0100\" \"Subj 2\" ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Recipient\" NIL \"example\" \"gmail.com\")) NIL NIL NIL NIL) (\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 185 NIL NIL (\"cs\") NIL 18) 31) (\"message\" \"rfc822\" NIL NIL NIL \"7bit\" 50592 NIL (\"attachment\" NIL) NIL NIL (\"Sat, 08 Jan 2011 13:58:39 +0100\" \"Subj 1\" ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Recipient\" NIL \"example\" \"gmail.com\")) NIL NIL NIL NIL) ((\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 4296 NIL NIL NIL NIL 345) (\"text\" \"html\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 45069 NIL NIL NIL NIL 1295) \"alternative\" (\"boundary\" \"----=_NextPart_000_0073_01CBB179.57530990\") NIL (\"cs\") NIL) 1669) \"mixed\" (\"boundary\" \"----=_NextPart_000_0077_01CBB179.57530990\") NIL (\"cs\") NIL)"; BodyPartMultipart multipart; BodyPart body; Assert.That (BodyPart.TryParse (text, out body), Is.True, "Failed to parse body."); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("----=_NextPart_000_0077_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child does not match."); // FIXME: assert more stuff } [Test] public void TestMultipartWithNoChildren () { var original = new BodyPartMultipart (new ContentType ("multipart", "mixed") { Boundary = "----=_NextPart_000_001" }, string.Empty); original.BodyParts.Add (new BodyPartMultipart (new ContentType ("multipart", "alternative") { Boundary = "----=_AlternativePart_001_001" }, string.Empty)); var serialized = original.ToString (); Assert.That (BodyPart.TryParse (serialized, out var body), Is.True, "Failed to parse."); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Boundary, Is.EqualTo (original.ContentType.Boundary), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); var alternative = (BodyPartMultipart) multipart.BodyParts[0]; Assert.That (alternative.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "Inner Content-Type did not match."); Assert.That (alternative.ContentType.Boundary, Is.EqualTo (original.BodyParts[0].ContentType.Boundary), "Inner boundary param did not match"); Assert.That (alternative.BodyParts, Is.Empty, "Inner BodyParts count does not match."); } static ContentType CreateContentType (string type, string subtype, string partSpecifier) { var contentType = new ContentType (type, subtype); contentType.Parameters.Add ("part-specifier", partSpecifier); return contentType; } static BodyPartMessage CreateMessage (string type, string subtype, string partSpecifier, BodyPart body) { var message = new BodyPartMessage (CreateContentType (type, subtype, partSpecifier), partSpecifier) { Body = body }; return message; } static BodyPartMultipart CreateMultipart (string type, string subtype, string partSpecifier, params BodyPart[] bodyParts) { var multipart = new BodyPartMultipart (CreateContentType (type, subtype, partSpecifier), partSpecifier); foreach (var bodyPart in bodyParts) multipart.BodyParts.Add (bodyPart); return multipart; } static BodyPartBasic CreateBasic (string type, string subtype, string partSpecifier) { return new BodyPartBasic (CreateContentType (type, subtype, partSpecifier), partSpecifier); } static BodyPartText CreateText (string type, string subtype, string partSpecifier) { return new BodyPartText (CreateContentType (type, subtype, partSpecifier), partSpecifier); } static void VerifyPartSpecifier (BodyPart part) { var expected = part.ContentType.Parameters["part-specifier"]; Assert.That (part.PartSpecifier, Is.EqualTo (expected), $"The part-specifier does not match for {part.ContentType.MimeType}"); if (part is BodyPartMessage message) { VerifyPartSpecifier (message.Body); return; } if (part is BodyPartMultipart multipart) { for (int i = 0; i < multipart.BodyParts.Count; i++) VerifyPartSpecifier (multipart.BodyParts[i]); return; } } class TestVisitor : BodyPartVisitor { readonly StringBuilder builder = new StringBuilder (); int indent; public override void Visit (BodyPart body) { builder.Length = 0; indent = 0; base.Visit (body); } protected internal override void VisitBodyPart (BodyPart entity) { builder.Append (' ', indent); builder.Append (entity.ContentType.MimeType); builder.Append ('\n'); base.VisitBodyPart (entity); } protected override void VisitMessage (BodyPart message) { indent++; base.VisitMessage (message); indent--; } protected override void VisitChildren (BodyPartMultipart multipart) { indent++; base.VisitChildren (multipart); indent--; } public override string ToString () { return builder.ToString (); } } [Test] public void TestComplexPartSpecifiersExampleRfc3501 () { const string expected = "MULTIPART/MIXED\n TEXT/PLAIN\n APPLICATION/OCTET-STREAM\n MESSAGE/RFC822\n MULTIPART/MIXED\n TEXT/PLAIN\n APPLICATION/OCTET-STREAM\n MULTIPART/MIXED\n IMAGE/GIF\n MESSAGE/RFC822\n MULTIPART/MIXED\n TEXT/PLAIN\n MULTIPART/ALTERNATIVE\n TEXT/PLAIN\n TEXT/RICHTEXT\n"; var visitor = new TestVisitor (); BodyPart body = CreateMultipart ("MULTIPART", "MIXED", "", CreateText ("TEXT", "PLAIN", "1"), CreateBasic ("APPLICATION", "OCTET-STREAM", "2"), CreateMessage ("MESSAGE", "RFC822", "3", CreateMultipart ("MULTIPART", "MIXED", "3", CreateText ("TEXT", "PLAIN", "3.1"), CreateBasic ("APPLICATION", "OCTET-STREAM", "3.2") ) ), CreateMultipart ("MULTIPART", "MIXED", "4", CreateBasic ("IMAGE", "GIF", "4.1"), CreateMessage ("MESSAGE", "RFC822", "4.2", CreateMultipart ("MULTIPART", "MIXED", "4.2", CreateText ("TEXT", "PLAIN", "4.2.1"), CreateMultipart ("MULTIPART", "ALTERNATIVE", "4.2.2", CreateText ("TEXT", "PLAIN", "4.2.2.1"), CreateText ("TEXT", "RICHTEXT", "4.2.2.2") ) ) ) ) ); visitor.Visit (body); Assert.That (visitor.ToString (), Is.EqualTo (expected)); Assert.Throws (() => new BodyPartText (new ContentType ("text", "plain"), string.Empty).Accept (null)); Assert.Throws (() => new BodyPartBasic (new ContentType ("image", "jpeg"), string.Empty).Accept (null)); Assert.Throws (() => new BodyPartMessage (new ContentType ("message", "rfc822"), string.Empty).Accept (null)); Assert.Throws (() => new BodyPartMultipart (new ContentType ("multipart", "mixed"), string.Empty).Accept (null)); var encoded = body.ToString (); Assert.Throws (() => BodyPart.TryParse (null, out body)); Assert.That (BodyPart.TryParse (encoded, out body), Is.True); VerifyPartSpecifier (body); } } } ================================================ FILE: UnitTests/CompressedStreamTests.cs ================================================ // // CompressedStreamTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using MailKit; using UnitTests.Net; namespace UnitTests { [TestFixture] public class CompressedStreamTests { [Test] public void TestArgumentExceptions () { using (var stream = new CompressedStream (new DummyNetworkStream ())) { var buffer = new byte[16]; Assert.Throws (() => stream.Read (null, 0, buffer.Length)); Assert.Throws (() => stream.Read (buffer, -1, buffer.Length)); Assert.Throws (() => stream.Read (buffer, 0, -1)); Assert.That (stream.Read (buffer, 0, 0), Is.EqualTo (0)); Assert.ThrowsAsync (async () => await stream.ReadAsync (null, 0, buffer.Length)); Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, -1, buffer.Length)); Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, 0, -1)); Assert.Throws (() => stream.Write (null, 0, buffer.Length)); Assert.Throws (() => stream.Write (buffer, -1, buffer.Length)); Assert.Throws (() => stream.Write (buffer, 0, -1)); stream.Write (buffer, 0, 0); Assert.ThrowsAsync (async () => await stream.WriteAsync (null, 0, buffer.Length)); Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, -1, buffer.Length)); Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, 0, -1)); } } [Test] public void TestCanReadWriteSeek () { using (var stream = new CompressedStream (new DummyNetworkStream ())) { Assert.That (stream.CanRead, Is.True); Assert.That (stream.CanWrite, Is.True); Assert.That (stream.CanSeek, Is.False); Assert.That (stream.CanTimeout, Is.True); } } [Test] public void TestGetSetTimeouts () { using (var stream = new CompressedStream (new DummyNetworkStream ())) { stream.ReadTimeout = 5; Assert.That (stream.ReadTimeout, Is.EqualTo (5), "ReadTimeout"); stream.WriteTimeout = 7; Assert.That (stream.WriteTimeout, Is.EqualTo (7), "WriteTimeout"); } } [Test] public void TestReadWrite () { using (var stream = new CompressedStream (new DummyNetworkStream ())) { string command = "A00000001 APPEND INBOX (\\Seen \\Draft) {4096+}\r\nFrom: Sample Sender \r\nTo: Sample Recipient \r\nSubject: This is a test message...\r\nDate: Mon, 22 Oct 2018 18:22:56 EDT\r\nMessage-Id: \r\n\r\nTesting... 1. 2. 3.\r\nTesting.\r\nOver and out.\r\n"; var output = Encoding.ASCII.GetBytes (command); const int compressedLength = 221; var buffer = new byte[1024]; int n; stream.Write (output, 0, output.Length); stream.Flush (); Assert.That (stream.InnerStream.Position, Is.EqualTo (compressedLength), "Compressed output length"); stream.InnerStream.Position = 0; n = stream.Read (buffer, 0, buffer.Length); Assert.That (n, Is.EqualTo (output.Length), "Decompressed input length"); var text = Encoding.ASCII.GetString (buffer, 0, n); Assert.That (text, Is.EqualTo (command)); } } [Test] public async Task TestReadWriteAsync () { using (var stream = new CompressedStream (new DummyNetworkStream ())) { string command = "A00000001 APPEND INBOX (\\Seen \\Draft) {4096+}\r\nFrom: Sample Sender \r\nTo: Sample Recipient \r\nSubject: This is a test message...\r\nDate: Mon, 22 Oct 2018 18:22:56 EDT\r\nMessage-Id: \r\n\r\nTesting... 1. 2. 3.\r\nTesting.\r\nOver and out.\r\n"; var output = Encoding.ASCII.GetBytes (command); const int compressedLength = 221; var buffer = new byte[1024]; int n; await stream.WriteAsync (output, 0, output.Length); await stream.FlushAsync (); Assert.That (stream.InnerStream.Position, Is.EqualTo (compressedLength), "Compressed output length"); stream.InnerStream.Position = 0; n = await stream.ReadAsync (buffer, 0, buffer.Length); Assert.That (n, Is.EqualTo (output.Length), "Decompressed input length"); var text = Encoding.ASCII.GetString (buffer, 0, n); Assert.That (text, Is.EqualTo (command)); } } [Test] public void TestSeek () { using (var stream = new CompressedStream (new DummyNetworkStream ())) { Assert.Throws (() => stream.Seek (0, SeekOrigin.Begin)); Assert.Throws (() => { var x = stream.Position; }); Assert.Throws (() => stream.Position = 500); } } [Test] public void TestSetLength () { using (var stream = new CompressedStream (new DummyNetworkStream ())) { Assert.Throws (() => { var x = stream.Length; }); Assert.Throws (() => stream.SetLength (500)); } } } } ================================================ FILE: UnitTests/DuplexStreamTests.cs ================================================ // // DuplexStreamTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit; using UnitTests.Net; namespace UnitTests { [TestFixture] public class DuplexStreamTests { [Test] public void TestArgumentExceptions () { Assert.Throws (() => new DuplexStream (null, Stream.Null)); Assert.Throws (() => new DuplexStream (Stream.Null, null)); using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { var buffer = new byte[16]; Assert.Throws (() => stream.Read (null, 0, buffer.Length)); Assert.Throws (() => stream.Read (buffer, -1, buffer.Length)); Assert.Throws (() => stream.Read (buffer, 0, -1)); Assert.ThrowsAsync (async () => await stream.ReadAsync (null, 0, buffer.Length)); Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, -1, buffer.Length)); Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, 0, -1)); Assert.Throws (() => stream.Write (null, 0, buffer.Length)); Assert.Throws (() => stream.Write (buffer, -1, buffer.Length)); Assert.Throws (() => stream.Write (buffer, 0, -1)); Assert.ThrowsAsync (async () => await stream.WriteAsync (null, 0, buffer.Length)); Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, -1, buffer.Length)); Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, 0, -1)); } } [Test] public void TestCanReadWriteSeek () { using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { Assert.That (stream.CanRead, Is.True); Assert.That (stream.CanWrite, Is.True); Assert.That (stream.CanSeek, Is.False); Assert.That (stream.CanTimeout, Is.True); } } [Test] public void TestGetSetTimeouts () { using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { stream.ReadTimeout = 5; Assert.That (stream.ReadTimeout, Is.EqualTo (5), "ReadTimeout"); stream.WriteTimeout = 7; Assert.That (stream.WriteTimeout, Is.EqualTo (7), "WriteTimeout"); } } [Test] public void TestRead () { using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { var buffer = new byte[1024]; int n; stream.InputStream.Write (buffer, 0, buffer.Length); stream.InputStream.Position = 0; n = stream.Read (buffer, 0, buffer.Length); Assert.That (n, Is.EqualTo (buffer.Length)); } } [Test] public async Task TestReadAsync () { using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { var buffer = new byte[1024]; int n; stream.InputStream.Write (buffer, 0, buffer.Length); stream.InputStream.Position = 0; n = await stream.ReadAsync (buffer, 0, buffer.Length); Assert.That (n, Is.EqualTo (buffer.Length)); } } [Test] public void TestSeek () { using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { Assert.Throws (() => stream.Seek (0, SeekOrigin.Begin)); Assert.Throws (() => { var x = stream.Position; }); Assert.Throws (() => stream.Position = 500); } } [Test] public void TestSetLength () { using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { Assert.Throws (() => { var x = stream.Length; }); Assert.Throws (() => stream.SetLength (500)); } } [Test] public void TestWrite () { using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { var buffer = new byte[1024]; stream.Write (buffer, 0, buffer.Length); stream.Flush (); Assert.That (stream.OutputStream.Position, Is.EqualTo (buffer.Length)); } } [Test] public async Task TestWriteAsync () { using (var stream = new DuplexStream (new DummyNetworkStream (), new DummyNetworkStream ())) { var buffer = new byte[1024]; await stream.WriteAsync (buffer, 0, buffer.Length); await stream.FlushAsync (); Assert.That (stream.OutputStream.Position, Is.EqualTo (buffer.Length)); } } } } ================================================ FILE: UnitTests/EnvelopeTests.cs ================================================ // // EnvelopeTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MimeKit; using MimeKit.Utils; using MailKit; namespace UnitTests { [TestFixture] public class EnvelopeTests { [Test] public void TestArgumentExceptions () { Assert.Throws (() => Envelope.TryParse (null, out _)); } [Test] public void TestSerialization () { var original = new Envelope (); original.Bcc.Add (new MailboxAddress ("Bcc Recipient", "unit-tests@mimekit.org")); original.Cc.Add (new MailboxAddress ("Routed Mailbox", new string[] { "domain.org" }, "unit-tests@mimekit.org")); original.Date = DateTimeOffset.Now; original.From.Add (new MailboxAddress ("MailKit Unit Tests", "unit-tests@mimekit.org")); original.InReplyTo = ""; original.MessageId = ""; original.ReplyTo.Add (new MailboxAddress ("Reply-To", "unit-tests@mimekit.org")); original.Sender.Add (new MailboxAddress ("The Real Sender", "unit-tests@mimekit.org")); original.Subject = "This is the subject"; original.To.Add (new GroupAddress ("Group Address", new MailboxAddress[] { new MailboxAddress ("John \"Q.\" Recipient", "unit-tests@mimekit.org"), new MailboxAddress ("Sarah Connor", "unit-tests@mimekit.org") })); var text = original.ToString (); Envelope envelope; Assert.That (Envelope.TryParse (text, out envelope), Is.True); var text2 = envelope.ToString (); Assert.That (text2, Is.EqualTo (text)); } [Test] public void TestUnixAddressSerialization () { var original = new Envelope (); original.Date = DateTimeOffset.Now; original.From.Add (new MailboxAddress ((string) null, "fejj")); original.To.Add (new MailboxAddress ((string) null, "notzed")); original.InReplyTo = ""; original.MessageId = ""; original.ReplyTo.Add (new MailboxAddress ("Reply-To", "unit-tests@mimekit.org")); original.Sender.Add (new MailboxAddress ("The Real Sender", string.Empty)); original.Subject = "This is the subject"; var text = original.ToString (); Assert.That (Envelope.TryParse (text, out var envelope), Is.True); Assert.That (envelope.Sender.Mailboxes.First ().LocalPart, Is.EqualTo (string.Empty)); Assert.That (envelope.From.Mailboxes.First ().LocalPart, Is.EqualTo ("fejj")); Assert.That (envelope.To.Mailboxes.First ().LocalPart, Is.EqualTo ("notzed")); var text2 = envelope.ToString (); Assert.That (text2, Is.EqualTo (text)); } [Test] public void TestExampleEnvelopeRfc3501 () { const string text = "(\"Wed, 17 Jul 1996 02:23:25 -0700 (PDT)\" \"IMAP4rev1 WG mtg summary and minutes\" ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((NIL NIL \"imap\" \"cac.washington.edu\")) ((NIL NIL \"minutes\" \"CNRI.Reston.VA.US\") (\"John Klensin\" NIL \"KLENSIN\" \"MIT.EDU\")) NIL NIL \"\")"; Envelope envelope; Assert.That (Envelope.TryParse (text, out envelope), Is.True, "Failed to parse envelope."); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Wed, 17 Jul 1996 02:23:25 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("IMAP4rev1 WG mtg summary and minutes"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Terry Gray\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Reply-To does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("imap@cac.washington.edu"), "To does not match."); Assert.That (envelope.Cc, Has.Count.EqualTo (2), "Cc counts do not match."); Assert.That (envelope.Cc.ToString (), Is.EqualTo ("minutes@CNRI.Reston.VA.US, \"John Klensin\" "), "Cc does not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("B27397-0100000@cac.washington.edu"), "Message-Id does not match."); } [Test] public void TestEmptyEnvelope () { const string expected = "(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)"; var envelope = new Envelope (); Assert.That (envelope.ToString (), Is.EqualTo (expected)); Assert.That (Envelope.TryParse (expected, out envelope), Is.True); Assert.That (envelope.ToString (), Is.EqualTo (expected)); } [Test] public void TestGroupAddress () { const string expected = "(NIL NIL NIL NIL NIL ((NIL NIL \"Agents of Shield\" NIL)(\"Skye\" NIL \"skye\" \"shield.gov\")(\"Leo Fitz\" NIL \"fitz\" \"shield.gov\")(\"Melinda May\" NIL \"may\" \"shield.gov\")(NIL NIL NIL NIL)) NIL NIL NIL NIL)"; var group = GroupAddress.Parse ("Agents of Shield: Skye , Leo Fitz , Melinda May ;"); var envelope = new Envelope (); envelope.To.Add (group); Assert.That (envelope.ToString (), Is.EqualTo (expected)); Assert.That (Envelope.TryParse (expected, out envelope), Is.True); Assert.That (envelope.ToString (), Is.EqualTo (expected)); Assert.That (envelope.To, Has.Count.EqualTo (1)); Assert.That (envelope.To[0].ToString (), Is.EqualTo (group.ToString ())); } [Test] public void TestNestedGroupAddresses () { const string expected = "(NIL NIL NIL NIL NIL ((NIL NIL \"Agents of Shield\" NIL)(NIL NIL \"Mutants\" NIL)(\"Skye\" NIL \"skye\" \"shield.gov\")(NIL NIL NIL NIL)(\"Leo Fitz\" NIL \"fitz\" \"shield.gov\")(\"Melinda May\" NIL \"may\" \"shield.gov\")(NIL NIL NIL NIL)) NIL NIL NIL NIL)"; var group = GroupAddress.Parse ("Agents of Shield: Mutants: Skye ;, Leo Fitz , Melinda May ;"); var envelope = new Envelope (); envelope.To.Add (group); Assert.That (envelope.ToString (), Is.EqualTo (expected)); Assert.That (Envelope.TryParse (expected, out envelope), Is.True); Assert.That (envelope.ToString (), Is.EqualTo (expected)); Assert.That (envelope.To, Has.Count.EqualTo (1)); Assert.That (envelope.To[0].ToString (), Is.EqualTo (group.ToString ())); } } } ================================================ FILE: UnitTests/EventArgsTests.cs ================================================ // // EventArgsTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MimeKit; using MailKit; namespace UnitTests { [TestFixture] public class EventArgsTests { [Test] public void TestAlertEventArgs () { var args = new AlertEventArgs ("Klingons on the starboard bow!"); Assert.That (args.Message, Is.EqualTo ("Klingons on the starboard bow!")); Assert.Throws (() => new AlertEventArgs (null)); } [Test] public void TestWebAlertEventArgs () { var args = new WebAlertEventArgs (new Uri ("http://www.google.com/"), "Klingons on the starboard bow!"); Assert.That (args.WebUri.AbsoluteUri, Is.EqualTo ("http://www.google.com/")); Assert.That (args.Message, Is.EqualTo ("Klingons on the starboard bow!")); Assert.Throws (() => new WebAlertEventArgs (null, "message text.")); Assert.Throws (() => new WebAlertEventArgs (new Uri ("http://www.google.com/"), null)); } [Test] public void TestAnnotationsChangedEventArgs () { var annotations = new List (); var args = new AnnotationsChangedEventArgs (0, annotations); Assert.That (args.Annotations, Is.Empty); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq.HasValue, Is.False); Assert.That (args.Index, Is.EqualTo (0)); Assert.Throws (() => new AnnotationsChangedEventArgs (0, null)); } [Test] public void TestAuthenticatedEventArgs () { var args = new AuthenticatedEventArgs ("Access Granted."); Assert.That (args.Message, Is.EqualTo ("Access Granted.")); Assert.Throws (() => new AuthenticatedEventArgs (null)); } [Test] public void TestFolderCreatedEventArgs () { Assert.Throws (() => new FolderCreatedEventArgs (null)); } [Test] public void TestFolderRenamedEventArgs () { var args = new FolderRenamedEventArgs ("Istanbul", "Constantinople"); Assert.That (args.OldName, Is.EqualTo ("Istanbul")); Assert.That (args.NewName, Is.EqualTo ("Constantinople")); Assert.Throws (() => new FolderRenamedEventArgs (null, "name")); Assert.Throws (() => new FolderRenamedEventArgs ("name", null)); } [Test] public void TestMessageEventArgs () { var args = new MessageEventArgs (0); Assert.That (args.Index, Is.EqualTo (0)); Assert.Throws (() => new MessageEventArgs (-1)); } [Test] public void TestMessageFlagsChangedEventArgs () { var keywords = new HashSet (new [] { "custom1", "custom2" }); MessageFlagsChangedEventArgs args; var uid = new UniqueId (5); ulong modseq = 724; args = new MessageFlagsChangedEventArgs (0); Assert.That (args.Keywords, Is.Empty); Assert.That (args.Flags, Is.EqualTo (MessageFlags.None)); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq.HasValue, Is.False); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageFlagsChangedEventArgs (0, MessageFlags.Answered); Assert.That (args.Keywords, Is.Empty); Assert.That (args.Flags, Is.EqualTo (MessageFlags.Answered)); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq.HasValue, Is.False); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageFlagsChangedEventArgs (0, MessageFlags.Answered, modseq); Assert.That (args.Keywords, Is.Empty); Assert.That (args.Flags, Is.EqualTo (MessageFlags.Answered)); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq, Is.EqualTo (modseq)); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageFlagsChangedEventArgs (0, MessageFlags.Answered, keywords); Assert.That (args.Keywords, Has.Count.EqualTo (keywords.Count)); Assert.That (args.Flags, Is.EqualTo (MessageFlags.Answered)); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq.HasValue, Is.False); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageFlagsChangedEventArgs (0, MessageFlags.Answered, keywords, modseq); Assert.That (args.Keywords, Has.Count.EqualTo (keywords.Count)); Assert.That (args.Flags, Is.EqualTo (MessageFlags.Answered)); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq, Is.EqualTo (modseq)); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageFlagsChangedEventArgs (0, uid, MessageFlags.Answered); Assert.That (args.Keywords, Is.Empty); Assert.That (args.Flags, Is.EqualTo (MessageFlags.Answered)); Assert.That (args.UniqueId, Is.EqualTo (uid)); Assert.That (args.ModSeq.HasValue, Is.False); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageFlagsChangedEventArgs (0, uid, MessageFlags.Answered, modseq); Assert.That (args.Keywords, Is.Empty); Assert.That (args.Flags, Is.EqualTo (MessageFlags.Answered)); Assert.That (args.UniqueId, Is.EqualTo (uid)); Assert.That (args.ModSeq, Is.EqualTo (modseq)); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageFlagsChangedEventArgs (0, uid, MessageFlags.Answered, keywords); Assert.That (args.Keywords, Has.Count.EqualTo (keywords.Count)); Assert.That (args.Flags, Is.EqualTo (MessageFlags.Answered)); Assert.That (args.UniqueId, Is.EqualTo (uid)); Assert.That (args.ModSeq.HasValue, Is.False); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageFlagsChangedEventArgs (0, uid, MessageFlags.Answered, keywords, modseq); Assert.That (args.Keywords, Has.Count.EqualTo (keywords.Count)); Assert.That (args.Flags, Is.EqualTo (MessageFlags.Answered)); Assert.That (args.UniqueId, Is.EqualTo (uid)); Assert.That (args.ModSeq, Is.EqualTo (modseq)); Assert.That (args.Index, Is.EqualTo (0)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1, MessageFlags.Answered)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1, MessageFlags.Answered, modseq)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1, MessageFlags.Answered, keywords)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1, MessageFlags.Answered, keywords, modseq)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1, uid, MessageFlags.Answered)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1, uid, MessageFlags.Answered, modseq)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1, uid, MessageFlags.Answered, keywords)); Assert.Throws (() => new MessageFlagsChangedEventArgs (-1, uid, MessageFlags.Answered, keywords, modseq)); Assert.Throws (() => new MessageFlagsChangedEventArgs (0, MessageFlags.Answered, null)); Assert.Throws (() => new MessageFlagsChangedEventArgs (0, MessageFlags.Answered, null, modseq)); Assert.Throws (() => new MessageFlagsChangedEventArgs (0, uid, MessageFlags.Answered, null)); Assert.Throws (() => new MessageFlagsChangedEventArgs (0, uid, MessageFlags.Answered, null, modseq)); } [Test] public void TestMessageLabelsChangedEventArgs () { var labels = new string[] { "label1", "label2" }; MessageLabelsChangedEventArgs args; var uid = new UniqueId (5); ulong modseq = 724; args = new MessageLabelsChangedEventArgs (0, labels); Assert.That (args.Labels, Has.Count.EqualTo (labels.Length)); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq.HasValue, Is.False); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageLabelsChangedEventArgs (0, labels, modseq); Assert.That (args.Labels, Has.Count.EqualTo (labels.Length)); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq, Is.EqualTo (modseq)); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageLabelsChangedEventArgs (0, uid, labels); Assert.That (args.Labels, Has.Count.EqualTo (labels.Length)); Assert.That (args.UniqueId, Is.EqualTo (uid)); Assert.That (args.ModSeq.HasValue, Is.False); Assert.That (args.Index, Is.EqualTo (0)); args = new MessageLabelsChangedEventArgs (0, uid, labels, modseq); Assert.That (args.Labels, Has.Count.EqualTo (labels.Length)); Assert.That (args.UniqueId, Is.EqualTo (uid)); Assert.That (args.ModSeq, Is.EqualTo (modseq)); Assert.That (args.Index, Is.EqualTo (0)); Assert.Throws (() => new MessageLabelsChangedEventArgs (-1, labels)); Assert.Throws (() => new MessageLabelsChangedEventArgs (-1, labels, modseq)); Assert.Throws (() => new MessageLabelsChangedEventArgs (-1, uid, labels)); Assert.Throws (() => new MessageLabelsChangedEventArgs (-1, uid, labels, modseq)); Assert.Throws (() => new MessageLabelsChangedEventArgs (0, null)); Assert.Throws (() => new MessageLabelsChangedEventArgs (0, null, modseq)); Assert.Throws (() => new MessageLabelsChangedEventArgs (0, uid, null)); Assert.Throws (() => new MessageLabelsChangedEventArgs (0, uid, null, modseq)); } [Test] public void TestMessageSentEventArgs () { var message = new MimeMessage (); MessageSentEventArgs args; args = new MessageSentEventArgs (message, "response"); Assert.That (args.Message, Is.EqualTo (message)); Assert.That (args.Response, Is.EqualTo ("response")); Assert.Throws (() => new MessageSentEventArgs (null, "response")); Assert.Throws (() => new MessageSentEventArgs (message, null)); } [Test] public void TestMessageSummaryFetchedEventArgs () { var message = new MessageSummary (0); MessageSummaryFetchedEventArgs args; args = new MessageSummaryFetchedEventArgs (message); Assert.That (args.Message, Is.EqualTo (message)); Assert.Throws (() => new MessageSummaryFetchedEventArgs (null)); } [Test] public void TestMessagesVanishedEventArgs () { var uids = new UniqueIdRange (0, 5, 7); MessagesVanishedEventArgs args; args = new MessagesVanishedEventArgs (uids, true); Assert.That (args.UniqueIds, Is.EqualTo (uids)); Assert.That (args.Earlier, Is.True); Assert.Throws (() => new MessagesVanishedEventArgs (null, false)); } [Test] public void TestMetadataChangedEventArgs () { var args = new MetadataChangedEventArgs (new Metadata (MetadataTag.PrivateComment, "this is a comment")); Assert.That (args.Metadata.Tag, Is.EqualTo (MetadataTag.PrivateComment), "Tag"); Assert.That (args.Metadata.Value, Is.EqualTo ("this is a comment"), "Value"); Assert.Throws (() => new MetadataChangedEventArgs (null)); } [Test] public void TestModSeqChangedEventArgs () { ModSeqChangedEventArgs args; ulong modseq = 724; args = new ModSeqChangedEventArgs (0, modseq); Assert.That (args.UniqueId.HasValue, Is.False); Assert.That (args.ModSeq, Is.EqualTo (modseq)); Assert.That (args.Index, Is.EqualTo (0)); args = new ModSeqChangedEventArgs (0, UniqueId.MinValue, modseq); Assert.That (args.UniqueId, Is.EqualTo (UniqueId.MinValue)); Assert.That (args.ModSeq, Is.EqualTo (modseq)); Assert.That (args.Index, Is.EqualTo (0)); Assert.Throws (() => new ModSeqChangedEventArgs (-1, modseq)); Assert.Throws (() => new ModSeqChangedEventArgs (-1, UniqueId.MinValue, modseq)); } } } ================================================ FILE: UnitTests/ExceptionTests.cs ================================================ // // ExceptionTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET6_0 using System.Runtime.Serialization.Formatters.Binary; using MailKit; using MailKit.Net.Imap; using MailKit.Net.Pop3; namespace UnitTests { [TestFixture] public class ExceptionTests { [Test] public void TestFolderNotFoundException () { var expected = new FolderNotFoundException ("Inbox"); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (FolderNotFoundException) formatter.Deserialize (stream); Assert.That (ex.FolderName, Is.EqualTo (expected.FolderName), "Unexpected FolderName."); } expected = new FolderNotFoundException ("This is the error message.", "Inbox"); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (FolderNotFoundException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); Assert.That (ex.FolderName, Is.EqualTo (expected.FolderName), "Unexpected FolderName."); } expected = new FolderNotFoundException ("This is the error message.", "Inbox", new IOException ("Inner Exception")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (FolderNotFoundException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); Assert.That (ex.FolderName, Is.EqualTo (expected.FolderName), "Unexpected FolderName."); } Assert.Throws (() => new FolderNotFoundException (null)); Assert.Throws (() => new FolderNotFoundException ("message", null)); Assert.Throws (() => new FolderNotFoundException ("message", null, new Exception ("message"))); } [Test] public void TestFolderNotOpenException () { var expected = new FolderNotOpenException ("Inbox", FolderAccess.ReadWrite); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (FolderNotOpenException) formatter.Deserialize (stream); Assert.That (ex.FolderName, Is.EqualTo (expected.FolderName), "Unexpected FolderName."); Assert.That (ex.FolderAccess, Is.EqualTo (expected.FolderAccess), "Unexpected FolderAccess."); } expected = new FolderNotOpenException ("Inbox", FolderAccess.ReadWrite, "This is the error message."); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (FolderNotOpenException) formatter.Deserialize (stream); Assert.That (ex.FolderName, Is.EqualTo (expected.FolderName), "Unexpected FolderName."); Assert.That (ex.FolderAccess, Is.EqualTo (expected.FolderAccess), "Unexpected FolderAccess."); } expected = new FolderNotOpenException ("Inbox", FolderAccess.ReadWrite, "This is the error message.", new IOException ("Inner Exception")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (FolderNotOpenException) formatter.Deserialize (stream); Assert.That (ex.FolderName, Is.EqualTo (expected.FolderName), "Unexpected FolderName."); Assert.That (ex.FolderAccess, Is.EqualTo (expected.FolderAccess), "Unexpected FolderAccess."); } Assert.Throws (() => new FolderNotOpenException (null, FolderAccess.ReadOnly)); Assert.Throws (() => new FolderNotOpenException (null, FolderAccess.ReadOnly, "message")); Assert.Throws (() => new FolderNotOpenException (null, FolderAccess.ReadOnly, "message", new Exception ("message"))); } [Test] public void TestMessageNotFoundException () { var expected = new MessageNotFoundException ("This is the message."); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (MessageNotFoundException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); } expected = new MessageNotFoundException ("This is the message.", new IOException ("Inner Exception")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (MessageNotFoundException)formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); } } [Test] public void TestServiceNotAuthenticatedException () { var expected = new ServiceNotAuthenticatedException (); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ServiceNotAuthenticatedException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); } expected = new ServiceNotAuthenticatedException ("This is the message."); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ServiceNotAuthenticatedException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); } expected = new ServiceNotAuthenticatedException ("This is the message.", new IOException ("Inner Exception")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ServiceNotAuthenticatedException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); } } [Test] public void TestServiceNotConnectedException () { var expected = new ServiceNotConnectedException (); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ServiceNotConnectedException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); } expected = new ServiceNotConnectedException ("This is the message."); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ServiceNotConnectedException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); } expected = new ServiceNotConnectedException ("This is the message.", new IOException ("Inner Exception")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ServiceNotConnectedException) formatter.Deserialize (stream); Assert.That (ex.Message, Is.EqualTo (expected.Message), "Unexpected Message."); } } [Test] public void TestImapCommandException () { var expected = new ImapCommandException (ImapCommandResponse.Bad, "Bad boys, bad boys. Whatcha gonna do?", "Message", new Exception ("InnerException")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ImapCommandException)formatter.Deserialize (stream); Assert.That (ex.Response, Is.EqualTo (expected.Response), "Unexpected Response."); Assert.That (ex.ResponseText, Is.EqualTo (expected.ResponseText), "Unexpected ResponseText."); } expected = new ImapCommandException (ImapCommandResponse.Bad, "Bad boys, bad boys. Whatcha gonna do?", "Message"); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ImapCommandException) formatter.Deserialize (stream); Assert.That (ex.Response, Is.EqualTo (expected.Response), "Unexpected Response."); Assert.That (ex.ResponseText, Is.EqualTo (expected.ResponseText), "Unexpected ResponseText."); } } [Test] public void TestImapProtocolException () { var expected = new ImapProtocolException ("Bad boys, bad boys. Whatcha gonna do?", new Exception ("InnerException")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ImapProtocolException) formatter.Deserialize (stream); Assert.That (ex.HelpLink, Is.EqualTo (expected.HelpLink), "Unexpected HelpLink."); } expected = new ImapProtocolException ("Bad boys, bad boys. Whatcha gonna do?"); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ImapProtocolException) formatter.Deserialize (stream); Assert.That (ex.HelpLink, Is.EqualTo (expected.HelpLink), "Unexpected HelpLink."); } expected = new ImapProtocolException (); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ImapProtocolException) formatter.Deserialize (stream); Assert.That (ex.HelpLink, Is.EqualTo (expected.HelpLink), "Unexpected HelpLink."); } } [Test] public void TestPop3CommandException () { var expected = new Pop3CommandException ("Message", "Bad boys, bad boys. Whatcha gonna do?"); Assert.Throws (() => new Pop3CommandException ("Message", (string) null)); Assert.Throws (() => new Pop3CommandException ("Message", null, new Exception ("inner"))); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (Pop3CommandException) formatter.Deserialize (stream); Assert.That (ex.StatusText, Is.EqualTo (expected.StatusText), "Unexpected StatusText."); } } [Test] public void TestPop3ProtocolException () { var expected = new Pop3ProtocolException ("Bad boys, bad boys. Whatcha gonna do?", new Exception ("InnerException")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (Pop3ProtocolException) formatter.Deserialize (stream); Assert.That (ex.HelpLink, Is.EqualTo (expected.HelpLink), "Unexpected HelpLink."); } expected = new Pop3ProtocolException ("Bad boys, bad boys. Whatcha gonna do?"); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (Pop3ProtocolException) formatter.Deserialize (stream); Assert.That (ex.HelpLink, Is.EqualTo (expected.HelpLink), "Unexpected HelpLink."); } expected = new Pop3ProtocolException (); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (Pop3ProtocolException) formatter.Deserialize (stream); Assert.That (ex.HelpLink, Is.EqualTo (expected.HelpLink), "Unexpected HelpLink."); } } } } #endif // NET6_0 ================================================ FILE: UnitTests/ExceptionalProtocolLogger.cs ================================================ // // ExceptionalProtocolLogger.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit; namespace UnitTests { enum ExceptionalProtocolLoggerMode { ThrowOnLogConnect, ThrowOnLogClient, ThrowOnLogServer, } class ExceptionalProtocolLogger : IProtocolLogger { readonly ExceptionalProtocolLoggerMode mode; public IAuthenticationSecretDetector AuthenticationSecretDetector { get; set; } public ExceptionalProtocolLogger (ExceptionalProtocolLoggerMode mode) { this.mode = mode; } public void LogConnect (Uri uri) { if (mode == ExceptionalProtocolLoggerMode.ThrowOnLogConnect) throw new NotImplementedException (); } public void LogClient (byte[] buffer, int offset, int count) { if (mode == ExceptionalProtocolLoggerMode.ThrowOnLogClient) throw new NotImplementedException (); } public void LogServer (byte[] buffer, int offset, int count) { if (mode == ExceptionalProtocolLoggerMode.ThrowOnLogServer) throw new NotImplementedException (); } public void Dispose () { } } } ================================================ FILE: UnitTests/FolderNamespaceTests.cs ================================================ // // FolderNamespaceTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections; using MailKit; namespace UnitTests { [TestFixture] public class FolderNamespaceTests { [Test] public void TestFolderNamespace () { Assert.Throws (() => new FolderNamespace ('.', null)); } [Test] public void TestFolderNamespaceCollection () { var namespaces = new FolderNamespaceCollection (); FolderNamespace ns; int i = 0; Assert.Throws (() => namespaces.Add (null)); Assert.Throws (() => namespaces.Contains (null)); Assert.Throws (() => namespaces.Remove (null)); Assert.Throws (() => ns = namespaces[-1]); Assert.Throws (() => namespaces[-1] = new FolderNamespace ('.', "")); Assert.That (namespaces, Is.Empty); ns = new FolderNamespace ('.', ""); namespaces.Add (ns); Assert.That (namespaces, Has.Count.EqualTo (1)); Assert.That (namespaces.Contains (ns), Is.True); Assert.Throws (() => namespaces[0] = null); ns = new FolderNamespace ('\\', ""); namespaces[0] = ns; Assert.That (namespaces, Has.Count.EqualTo (1)); Assert.That (namespaces.Contains (ns), Is.True); Assert.That (namespaces.Remove (ns), Is.True); Assert.That (namespaces, Is.Empty); Assert.That (namespaces.Contains (ns), Is.False); namespaces.Add (new FolderNamespace ('.', "")); namespaces.Add (new FolderNamespace ('\\', "")); foreach (var item in namespaces) Assert.That (item, Is.EqualTo (namespaces[i++])); i = 0; foreach (object item in (IEnumerable) namespaces) Assert.That (item, Is.EqualTo (namespaces[i++])); Assert.That (namespaces.ToString (), Is.EqualTo ("((\".\" \"\")(\"\\\\\" \"\"))")); } } } ================================================ FILE: UnitTests/HeaderSetTests.cs ================================================ // // HeaderSetTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections; using MimeKit; using MailKit; namespace UnitTests { [TestFixture] public class HeaderSetTests { [Test] public void TestArgumentExceptions () { var headers = new HeaderSet (); var array = new string[10]; Assert.Throws (() => headers.Add (HeaderId.Unknown)); Assert.Throws (() => headers.AddRange ((IEnumerable) null)); Assert.Throws (() => headers.AddRange (new HeaderId[] { HeaderId.Unknown })); Assert.Throws (() => headers.Add (null)); Assert.Throws (() => headers.Add (string.Empty)); Assert.Throws (() => headers.Add ("This is invalid")); Assert.Throws (() => headers.AddRange ((IEnumerable) null)); Assert.Throws (() => headers.AddRange (new string[] { "This is invalid" })); Assert.Throws (() => ((ICollection) headers).Add (null)); Assert.Throws (() => ((ICollection) headers).Add (string.Empty)); Assert.Throws (() => ((ICollection) headers).Add ("This is invalid")); Assert.Throws (() => headers.CopyTo (null, 0)); Assert.Throws (() => headers.CopyTo (array, -1)); Assert.Throws (() => headers.CopyTo (array, 11)); Assert.Throws (() => headers.Contains (HeaderId.Unknown)); Assert.Throws (() => headers.Contains (null)); Assert.Throws (() => headers.Remove (HeaderId.Unknown)); Assert.Throws (() => headers.Remove (null)); } [Test] public void TestBasicFunctionality () { var headers = new HeaderSet (); Assert.That (headers.Add ("From"), Is.True, "Adding From"); Assert.That (headers.Add ("From"), Is.False, "Adding From duplicate #1"); Assert.That (headers.Add ("FROM"), Is.False, "Adding From duplicate #2"); Assert.That (headers.Add ("fRoM"), Is.False, "Adding From duplicate #3"); Assert.That (headers.Add (HeaderId.From), Is.False, "Adding From duplicate #4"); Assert.That (headers, Has.Count.EqualTo (1), "Count #1"); Assert.That (headers.Remove (HeaderId.From), Is.True, "Removing From"); Assert.That (headers.Remove ("From"), Is.False, "Removing From duplicate #1"); Assert.That (headers.Remove (HeaderId.From), Is.False, "Removing From duplicate #2"); Assert.That (headers, Is.Empty, "Count #2"); headers.AddRange (new HeaderId[] { HeaderId.Sender, HeaderId.From, HeaderId.ReplyTo }); Assert.That (headers, Has.Count.EqualTo (3), "Count #3"); headers.AddRange (new string[] { "to", "cc", "bcc" }); Assert.That (headers, Has.Count.EqualTo (6), "Count #4"); Assert.That (headers.Contains (HeaderId.To), Is.True, "Contains #1"); Assert.That (headers.Contains ("reply-to"), Is.True, "Contains #2"); var results = new string[headers.Count]; headers.CopyTo (results, 0); Array.Sort (results); Assert.That (results[0], Is.EqualTo ("BCC")); Assert.That (results[1], Is.EqualTo ("CC")); Assert.That (results[2], Is.EqualTo ("FROM")); Assert.That (results[3], Is.EqualTo ("REPLY-TO")); Assert.That (results[4], Is.EqualTo ("SENDER")); Assert.That (results[5], Is.EqualTo ("TO")); foreach (var header in headers) Assert.That (results, Does.Contain (header)); foreach (string header in ((IEnumerable) headers)) Assert.That (results, Does.Contain (header)); headers.Clear (); Assert.That (headers, Is.Empty, "Count after Clear"); } } } ================================================ FILE: UnitTests/MailServiceTests.cs ================================================ // // MailServiceTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Net.Security; using System.Security.Cryptography.X509Certificates; using MailKit; using MailKit.Security; using MailKit.Net.Imap; using MailKit.Net.Pop3; using MailKit.Net.Smtp; namespace UnitTests { [TestFixture] public class MailServiceTests { bool SslCertificateValidationCallback (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { var certificate2 = certificate as X509Certificate2; Assert.That (certificate2, Is.Not.Null, "Cast"); return true; } [Test] public void TestIsKnownMailServerCertificate () { var servers = new string[] { "imap://imap.gmail.com:993", "pop://pop.gmail.com:995", "smtp://smtp.gmail.com:587", "imap://outlook.office365.com:993", "pop://outlook.office365.com:995", "smtp://smtp.office365.com:587", }; foreach (var server in servers) { var uri = new Uri (server); MailService client; switch (uri.Scheme) { case "imap": client = new ImapClient (); break; case "pop": client = new Pop3Client (); break; case "smtp": client = new SmtpClient (); break; default: throw new Exception ("Unsupported protocol"); } using (client) { client.ServerCertificateValidationCallback = SslCertificateValidationCallback; try { client.Connect (uri.Host, uri.Port, SecureSocketOptions.Auto); } catch { continue; } client.Disconnect (true); } } } } } ================================================ FILE: UnitTests/MessageSortingTests.cs ================================================ // // MessageSortingTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MimeKit; using MailKit.Search; using MailKit; namespace UnitTests { [TestFixture] public class MessageSortingTests { [Test] public void TestArgumentExceptions () { var messages = new List { new MessageSummary (0) }; var orderBy = new OrderBy[] { OrderBy.Subject }; var emptyOrderBy = Array.Empty (); Assert.Throws (() => MessageSorter.Sort ((List) null, orderBy)); Assert.Throws (() => MessageSorter.Sort (messages, null)); Assert.Throws (() => MessageSorter.Sort (messages, emptyOrderBy)); Assert.Throws (() => MessageSorter.Sort (messages, orderBy)); Assert.Throws (() => MessageSorter.Sort ((IEnumerable) null, orderBy)); Assert.Throws (() => MessageSorter.Sort ((IEnumerable) messages, null)); Assert.Throws (() => MessageSorter.Sort ((IEnumerable) messages, emptyOrderBy)); Assert.Throws (() => MessageSorter.Sort ((IEnumerable) messages, orderBy)); } static List Create () { var messages = new List (); MessageSummary summary; summary = new MessageSummary (0); summary.Fields = MessageSummaryItems.Annotations | MessageSummaryItems.Envelope | MessageSummaryItems.Size | MessageSummaryItems.ModSeq; summary.Annotations = new List (new [] { new Annotation (AnnotationEntry.AltSubject) }); summary.Annotations[0].Properties.Add (AnnotationAttribute.SharedValue, "aaaa"); summary.Envelope = new Envelope (); summary.Envelope.Date = DateTimeOffset.Now.AddSeconds (-2); summary.Envelope.Subject = "aaaa"; summary.Envelope.From.Add (new MailboxAddress ("A", "a@a.com")); summary.Envelope.To.Add (new MailboxAddress ("A", "a@a.com")); summary.Envelope.Cc.Add (new MailboxAddress ("A", "a@a.com")); summary.ModSeq = 80290; summary.Size = 520; messages.Add (summary); summary = new MessageSummary (1); summary.Fields = MessageSummaryItems.Annotations | MessageSummaryItems.Envelope | MessageSummaryItems.Size | MessageSummaryItems.ModSeq; summary.Annotations = new List (new [] { new Annotation (AnnotationEntry.AltSubject) }); summary.Annotations[0].Properties.Add (AnnotationAttribute.SharedValue, "bbbb"); summary.Envelope = new Envelope (); summary.Envelope.Date = DateTimeOffset.Now.AddSeconds (-1); summary.Envelope.Subject = "bbbb"; summary.Envelope.From.Add (new MailboxAddress ("B", "b@b.com")); summary.Envelope.To.Add (new MailboxAddress ("B", "b@b.com")); summary.Envelope.Cc.Add (new MailboxAddress ("B", "b@b.com")); summary.ModSeq = 70642; summary.Size = 265; messages.Add (summary); summary = new MessageSummary (2); summary.Fields = MessageSummaryItems.Annotations | MessageSummaryItems.Envelope | MessageSummaryItems.Size | MessageSummaryItems.ModSeq; summary.Annotations = new List (new [] { new Annotation (AnnotationEntry.AltSubject) }); summary.Annotations[0].Properties.Add (AnnotationAttribute.SharedValue, "cccc"); summary.Envelope = new Envelope (); summary.Envelope.Date = DateTimeOffset.Now; summary.Envelope.Subject = "cccc"; summary.Envelope.From.Add (new MailboxAddress ("C", "c@c.com")); summary.Envelope.To.Add (new MailboxAddress ("C", "c@c.com")); summary.Envelope.Cc.Add (new MailboxAddress ("C", "c@c.com")); summary.ModSeq = 80290; summary.Size = 520; messages.Add (summary); return messages; } [Test] public void TestSorting () { var messages = Create (); messages.Sort (new[] { OrderBy.Arrival }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by arrival failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by arrival failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by arrival failed."); messages.Sort (new [] { OrderBy.ReverseArrival }); Assert.That (messages[0].Index, Is.EqualTo (2), "Sorting by reverse arrival failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by reverse arrival failed."); Assert.That (messages[2].Index, Is.EqualTo (0), "Sorting by reverse arrival failed."); messages.Sort (new [] { OrderBy.Subject }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by subject failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by subject failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by subject failed."); messages.Sort (new [] { OrderBy.ReverseSubject }); Assert.That (messages[0].Index, Is.EqualTo (2), "Sorting by reverse subject failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by reverse subject failed."); Assert.That (messages[2].Index, Is.EqualTo (0), "Sorting by reverse subject failed."); messages.Sort (new [] { OrderBy.Size, OrderBy.Arrival }); Assert.That (messages[0].Index, Is.EqualTo (1), "Sorting by size failed."); Assert.That (messages[1].Index, Is.EqualTo (0), "Sorting by size failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by size failed."); messages.Sort (new [] { OrderBy.Date }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by date failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by date failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by date failed."); messages.Sort (new [] { OrderBy.Size, OrderBy.Subject }); Assert.That (messages[0].Index, Is.EqualTo (1), "Sorting by size+subject failed."); Assert.That (messages[1].Index, Is.EqualTo (0), "Sorting by size+subject failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by size+subject failed."); messages.Sort (new [] { OrderBy.ReverseSize, OrderBy.ReverseSubject }); Assert.That (messages[0].Index, Is.EqualTo (2), "Sorting by reversed size+subject failed."); Assert.That (messages[1].Index, Is.EqualTo (0), "Sorting by reversed size+subject failed."); Assert.That (messages[2].Index, Is.EqualTo (1), "Sorting by reversed size+subject failed."); messages.Sort (new[] { OrderBy.DisplayFrom }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by display-from failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by display-from failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by display-from failed."); messages.Sort (new[] { OrderBy.From }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by from failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by from failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by from failed."); messages.Sort (new[] { OrderBy.DisplayTo }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by display-to failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by display-to failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by display-to failed."); messages.Sort (new[] { OrderBy.To }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by to failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by to failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by to failed."); messages.Sort (new[] { OrderBy.Cc }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by cc failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by cc failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by cc failed."); messages.Sort (new [] { new OrderBy (OrderByType.ModSeq, SortOrder.Ascending), OrderBy.Arrival }); Assert.That (messages[0].Index, Is.EqualTo (1), "Sorting by modseq failed."); Assert.That (messages[1].Index, Is.EqualTo (0), "Sorting by modseq failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by modseq failed."); messages.Sort (new[] { new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedValue, SortOrder.Ascending) }); Assert.That (messages[0].Index, Is.EqualTo (0), "Sorting by altsubject failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by altsubject failed."); Assert.That (messages[2].Index, Is.EqualTo (2), "Sorting by altsubject failed."); messages.Sort (new[] { new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedValue, SortOrder.Descending) }); Assert.That (messages[0].Index, Is.EqualTo (2), "Sorting by reverse altsubject failed."); Assert.That (messages[1].Index, Is.EqualTo (1), "Sorting by reverse altsubject failed."); Assert.That (messages[2].Index, Is.EqualTo (0), "Sorting by reverse altsubject failed."); } [Test] public void TestSortingEnumerable () { var messages = Create (); IEnumerable enumerable = messages; IList sorted; sorted = enumerable.Sort (new [] { OrderBy.Arrival }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by arrival failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by arrival failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by arrival failed."); sorted = enumerable.Sort (new [] { OrderBy.ReverseArrival }); Assert.That (sorted[0].Index, Is.EqualTo (2), "Sorting by reverse arrival failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by reverse arrival failed."); Assert.That (sorted[2].Index, Is.EqualTo (0), "Sorting by reverse arrival failed."); sorted = enumerable.Sort (new [] { OrderBy.Subject }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by subject failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by subject failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by subject failed."); sorted = enumerable.Sort (new [] { OrderBy.ReverseSubject }); Assert.That (sorted[0].Index, Is.EqualTo (2), "Sorting by reverse subject failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by reverse subject failed."); Assert.That (sorted[2].Index, Is.EqualTo (0), "Sorting by reverse subject failed."); sorted = enumerable.Sort (new [] { OrderBy.Size, OrderBy.Arrival }); Assert.That (sorted[0].Index, Is.EqualTo (1), "Sorting by size failed."); Assert.That (sorted[1].Index, Is.EqualTo (0), "Sorting by size failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by size failed."); sorted = enumerable.Sort (new [] { OrderBy.Date }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by date failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by date failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by date failed."); sorted = enumerable.Sort (new [] { OrderBy.Size, OrderBy.Subject }); Assert.That (sorted[0].Index, Is.EqualTo (1), "Sorting by size+subject failed."); Assert.That (sorted[1].Index, Is.EqualTo (0), "Sorting by size+subject failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by size+subject failed."); sorted = enumerable.Sort (new [] { OrderBy.ReverseSize, OrderBy.ReverseSubject }); Assert.That (sorted[0].Index, Is.EqualTo (2), "Sorting by reversed size+subject failed."); Assert.That (sorted[1].Index, Is.EqualTo (0), "Sorting by reversed size+subject failed."); Assert.That (sorted[2].Index, Is.EqualTo (1), "Sorting by reversed size+subject failed."); sorted = enumerable.Sort (new [] { OrderBy.DisplayFrom }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by display-from failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by display-from failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by display-from failed."); sorted = enumerable.Sort (new [] { OrderBy.From }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by from failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by from failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by from failed."); sorted = enumerable.Sort (new [] { OrderBy.DisplayTo }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by display-to failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by display-to failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by display-to failed."); sorted = enumerable.Sort (new [] { OrderBy.To }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by to failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by to failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by to failed."); sorted = enumerable.Sort (new [] { OrderBy.Cc }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by cc failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by cc failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by cc failed."); sorted = enumerable.Sort (new [] { new OrderBy (OrderByType.ModSeq, SortOrder.Ascending), OrderBy.Arrival }); Assert.That (sorted[0].Index, Is.EqualTo (1), "Sorting by modseq failed."); Assert.That (sorted[1].Index, Is.EqualTo (0), "Sorting by modseq failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by modseq failed."); sorted = enumerable.Sort (new[] { new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedValue, SortOrder.Ascending) }); Assert.That (sorted[0].Index, Is.EqualTo (0), "Sorting by subject failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by subject failed."); Assert.That (sorted[2].Index, Is.EqualTo (2), "Sorting by subject failed."); sorted = enumerable.Sort (new[] { new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedValue, SortOrder.Descending) }); Assert.That (sorted[0].Index, Is.EqualTo (2), "Sorting by reverse subject failed."); Assert.That (sorted[1].Index, Is.EqualTo (1), "Sorting by reverse subject failed."); Assert.That (sorted[2].Index, Is.EqualTo (0), "Sorting by reverse subject failed."); } } } ================================================ FILE: UnitTests/MessageSummaryTests.cs ================================================ // // MessageSummaryTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MimeKit; using MailKit; namespace UnitTests { [TestFixture] public class MessageSummaryTests { [Test] public void TestArgumentExceptions () { Assert.Throws (() => new MessageSummary (-1)); Assert.Throws (() => new MessageSummary (null, 0)); } [Test] public void TestDefaultValues () { var summary = new MessageSummary (17); Assert.That (summary.Attachments.Count (), Is.EqualTo (0), "Attachments"); Assert.That (summary.Body, Is.Null, "Body"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (0), "BodyParts"); Assert.That (summary.Date, Is.EqualTo (DateTimeOffset.MinValue), "Date"); Assert.That (summary.Envelope, Is.Null, "Envelope"); Assert.That (summary.Flags, Is.Null, "Flags"); Assert.That (summary.GMailLabels, Is.Null, "GMailLabels"); Assert.That (summary.GMailMessageId, Is.Null, "GMailMessageId"); Assert.That (summary.GMailThreadId, Is.Null, "GMailThreadId"); Assert.That (summary.Headers, Is.Null, "Headers"); Assert.That (summary.HtmlBody, Is.Null, "HtmlBody"); Assert.That (summary.Index, Is.EqualTo (17), "Index"); Assert.That (summary.InternalDate, Is.Null, "InternalDate"); Assert.That (summary.IsReply, Is.False, "IsReply"); Assert.That (summary.ModSeq, Is.Null, "ModSeq"); Assert.That (summary.NormalizedSubject, Is.EqualTo (string.Empty), "NormalizedSubject"); Assert.That (summary.PreviewText, Is.Null, "PreviewText"); Assert.That (summary.References, Is.Null, "References"); Assert.That (summary.Size, Is.Null, "Size"); Assert.That (summary.TextBody, Is.Null, "TextBody"); Assert.That (summary.UniqueId, Is.EqualTo (UniqueId.Invalid), "UniqueId"); Assert.That (summary.Keywords, Is.Not.Null, "Keywords"); Assert.That (summary.Keywords, Is.Empty, "Keywords"); } [Test] public void TestGMailProperties () { ulong msgid = 179111; ulong thrid = 7192564; var summary = new MessageSummary (0) { GMailLabels = new List (), GMailMessageId = msgid, GMailThreadId = thrid }; Assert.That (summary.GMailLabels, Is.Empty, "GMailLabels"); Assert.That (summary.GMailMessageId, Is.EqualTo (msgid), "GMailMessageId"); Assert.That (summary.GMailThreadId, Is.EqualTo (thrid), "GMailThreadId"); } static ContentType CreateContentType (string type, string subtype, string partSpecifier) { var contentType = new ContentType (type, subtype); contentType.Parameters.Add ("part-specifier", partSpecifier); return contentType; } static BodyPartMessage CreateMessage (string type, string subtype, string partSpecifier, BodyPart body, bool attachment) { var message = new BodyPartMessage (CreateContentType (type, subtype, partSpecifier), partSpecifier); if (attachment) message.ContentDisposition = new ContentDisposition (ContentDisposition.Attachment); message.Body = body; return message; } static BodyPartMultipart CreateMultipart (string type, string subtype, string partSpecifier, params BodyPart [] bodyParts) { var multipart = new BodyPartMultipart (CreateContentType (type, subtype, partSpecifier), partSpecifier); foreach (var bodyPart in bodyParts) multipart.BodyParts.Add (bodyPart); return multipart; } static BodyPartBasic CreateBasic (string type, string subtype, string partSpecifier, bool attachment) { var basic = new BodyPartBasic (CreateContentType (type, subtype, partSpecifier), partSpecifier); basic.ContentDisposition = new ContentDisposition (attachment ? ContentDisposition.Attachment : ContentDisposition.Inline); return basic; } static BodyPartText CreateText (string type, string subtype, string partSpecifier, bool attachment) { var text = new BodyPartText (CreateContentType (type, subtype, partSpecifier), partSpecifier); if (attachment) text.ContentDisposition = new ContentDisposition (ContentDisposition.Attachment); return text; } [Test] public void TestTextPlainBody () { var summary = new MessageSummary (0) { Body = CreateText ("TEXT", "PLAIN", "1", false) }; var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Null, "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (0), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (1), "BodyParts"); } [Test] public void TestTextHtmlBody () { var summary = new MessageSummary (0) { Body = CreateText ("TEXT", "HTML", "1", false) }; var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("1"), "HtmlBody"); var plain = summary.TextBody; Assert.That (plain, Is.Null, "TextBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (0), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (1), "BodyParts"); } [Test] public void TestImageJpegBody () { var summary = new MessageSummary (0) { Body = CreateBasic ("IMAGE", "JPEG", "1", false) }; var plain = summary.TextBody; Assert.That (plain, Is.Null, "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Null, "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (0), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (1), "BodyParts"); } [Test] public void TestMultipartAlternative () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "ALTERNATIVE", "", CreateText ("TEXT", "PLAIN", "1", false), CreateText ("TEXT", "HTML", "2", false) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("2"), "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (0), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (2), "BodyParts"); } [Test] public void TestMultipartAlternativeNoTextParts () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "ALTERNATIVE", "", CreateText ("TEXT", "RICHTEXT", "1", false), CreateBasic ("APPLICATION", "PDF", "2", false) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Null, "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Null, "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (0), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (2), "BodyParts"); } [Test] public void TestMixedTextPlainBody () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "MIXED", "", CreateText ("TEXT", "PLAIN", "1", false), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Null, "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (2), "BodyParts"); } [Test] public void TestMixedTextHtmlBody () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "MIXED", "", CreateText ("TEXT", "HTML", "1", false), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Null, "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("1"), "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (2), "BodyParts"); } [Test] public void TestRelatedTextPlainBody () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "RELATED", "", CreateText ("TEXT", "PLAIN", "1", false), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Null, "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (2), "BodyParts"); } [Test] public void TestRelatedTextHtmlBody () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "RELATED", "", CreateText ("TEXT", "HTML", "1", false), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Null, "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters ["part-specifier"], Is.EqualTo ("1"), "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (2), "BodyParts"); } [Test] public void TestMixedAlternativeRelated () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "MIXED", "", CreateMultipart ("MULTIPART", "ALTERNATIVE", "1", CreateText ("TEXT", "PLAIN", "1.1", false), CreateMultipart ("MULTIPART", "RELATED", "1.2", CreateText ("TEXT", "HTML", "1.2.1", false), CreateBasic ("IMAGE", "JPEG", "1.2.2", false) ) ), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.2.1"), "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (4), "BodyParts"); } [Test] public void TestMixedAlternativeRelatedWithStartParameter () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "MIXED", "", CreateMultipart ("MULTIPART", "ALTERNATIVE", "1", CreateText ("TEXT", "PLAIN", "1.1", false), CreateMultipart ("MULTIPART", "RELATED", "1.2", CreateBasic ("IMAGE", "JPEG", "1.2.1", false), CreateText ("TEXT", "HTML", "1.2.2", false) ) ), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var cid = "html@localhost.com"; var mixed = (BodyPartMultipart) summary.Body; var alternative = (BodyPartMultipart) mixed.BodyParts[0]; var related = (BodyPartMultipart) alternative.BodyParts[1]; var html = (BodyPartText) related.BodyParts[1]; related.ContentType.Parameters["start"] = cid; html.ContentLocation = new Uri ("cid:" + cid); var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.1"), "TextBody"); html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.2.2"), "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (4), "BodyParts"); } [Test] public void TestMixedRelatedAlternativeWithStartParameter () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "MIXED", "", CreateMultipart ("MULTIPART", "RELATED", "1", CreateBasic ("IMAGE", "JPEG", "1.1", false), CreateMultipart ("MULTIPART", "ALTERNATIVE", "1.2", CreateText ("TEXT", "PLAIN", "1.2.1", false), CreateText ("TEXT", "HTML", "1.2.2", false) ) ), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var cid = "alternative@localhost.com"; var mixed = (BodyPartMultipart) summary.Body; var related = (BodyPartMultipart) mixed.BodyParts[0]; var alternative = (BodyPartMultipart) related.BodyParts[1]; related.ContentType.Parameters["start"] = cid; alternative.ContentLocation = new Uri ("cid:" + cid); var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.2.1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.2.2"), "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (4), "BodyParts"); } [Test] public void TestMixedRelatedAlternative () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "MIXED", "", CreateMultipart ("MULTIPART", "RELATED", "1", CreateMultipart ("MULTIPART", "ALTERNATIVE", "1.1", CreateText ("TEXT", "PLAIN", "1.1.1", false), CreateText ("TEXT", "HTML", "1.1.2", false) ), CreateBasic ("IMAGE", "JPEG", "1.2", false) ), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.1.1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.1.2"), "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (4), "BodyParts"); } [Test] public void TestMixedNestedAlternative () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "MIXED", "", CreateMultipart ("MULTIPART", "ALTERNATIVE", "1", CreateMultipart ("MULTIPART", "ALTERNATIVE", "1.1", CreateText ("TEXT", "PLAIN", "1.1.1", false), CreateText ("TEXT", "HTML", "1.1.2", false) ) ), CreateBasic ("IMAGE", "JPEG", "2", true) ) }; var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.1.1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.1.2"), "HtmlBody"); Assert.That (summary.Attachments.Count (), Is.EqualTo (1), "Attachments"); Assert.That (summary.BodyParts.Count (), Is.EqualTo (3), "BodyParts"); } [Test] public void TestComplexBody () { var summary = new MessageSummary (0) { Body = CreateMultipart ("MULTIPART", "MIXED", "", CreateMultipart ("MULTIPART", "ALTERNATIVE", "1", CreateText ("TEXT", "PLAIN", "1.1", false), CreateMultipart ("MULTIPART", "RELATED", "1.2", CreateText ("TEXT", "HTML", "1.2.1", false), CreateBasic ("IMAGE", "JPEG", "1.2.2", false) ) ), CreateBasic ("APPLICATION", "OCTET-STREAM", "2", true), CreateMessage ("MESSAGE", "RFC822", "3", CreateMultipart ("MULTIPART", "MIXED", "3", CreateText ("TEXT", "PLAIN", "3.1", false), CreateBasic ("APPLICATION", "OCTET-STREAM", "3.2", true) ), true ), CreateBasic ("IMAGE", "GIF", "4", true) ) }; int i; var plain = summary.TextBody; Assert.That (plain, Is.Not.Null, "TextBody"); Assert.That (plain.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.1"), "TextBody"); var html = summary.HtmlBody; Assert.That (html, Is.Not.Null, "HtmlBody"); Assert.That (html.ContentType.Parameters["part-specifier"], Is.EqualTo ("1.2.1"), "HtmlBody"); var bodyParts = new string [] { "1.1", "1.2.1", "1.2.2", "2", "3", "4" }; i = 0; foreach (var part in summary.BodyParts) Assert.That (part.ContentType.Parameters["part-specifier"], Is.EqualTo (bodyParts[i++]), "BodyParts"); var attachments = new string[] { "2", "3", "4" }; i = 0; foreach (var attachment in summary.Attachments) Assert.That (attachment.ContentType.Parameters["part-specifier"], Is.EqualTo (attachments[i++]), "Attachments"); } } } ================================================ FILE: UnitTests/MessageThreadingTests.cs ================================================ // // MessageThreadingTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using MimeKit; using MimeKit.Utils; using MailKit; using MailKit.Search; namespace UnitTests { [TestFixture] public class MessageThreadingTests { [Test] public void TestArgumentExceptions () { var orderBy = new OrderBy[] { OrderBy.Arrival }; var messagesMissingInfo = new [] { new MessageSummary (0) }; var emptyOrderBy = Array.Empty (); var summary = new MessageSummary (0); summary.UniqueId = UniqueId.MinValue; summary.Envelope = new Envelope (); summary.References = new MessageIdList (); summary.Envelope.MessageId = "xyz@mimekit.org"; summary.Envelope.Subject = "This is the subject"; summary.Envelope.Date = DateTimeOffset.Now; summary.Size = 0; var messages = new MessageSummary[] { summary }; Assert.Throws (() => MessageThreader.GetThreadableSubject (null, out _)); Assert.Throws (() => MessageThreader.Thread ((IEnumerable) null, ThreadingAlgorithm.References)); Assert.Throws (() => MessageThreader.Thread ((IEnumerable) null, ThreadingAlgorithm.References, orderBy)); Assert.Throws (() => MessageThreader.Thread (messagesMissingInfo, ThreadingAlgorithm.References)); Assert.Throws (() => MessageThreader.Thread (messages, ThreadingAlgorithm.References, null)); Assert.Throws (() => MessageThreader.Thread (messages, ThreadingAlgorithm.References, emptyOrderBy)); } [Test] public void TestThreadableSubject () { string result; int depth; result = MessageThreader.GetThreadableSubject ("Re: simple subject", out depth); Assert.That (result, Is.EqualTo ("simple subject"), "#1a"); Assert.That (depth, Is.EqualTo (1), "#1b"); result = MessageThreader.GetThreadableSubject ("Re: simple subject ", out depth); Assert.That (result, Is.EqualTo ("simple subject"), "#2a"); Assert.That (depth, Is.EqualTo (1), "#2b"); result = MessageThreader.GetThreadableSubject ("Re: Re: simple subject ", out depth); Assert.That (result, Is.EqualTo ("simple subject"), "#3a"); Assert.That (depth, Is.EqualTo (2), "#3b"); result = MessageThreader.GetThreadableSubject ("Re: Re[4]: simple subject ", out depth); Assert.That (result, Is.EqualTo ("simple subject"), "#4a"); Assert.That (depth, Is.EqualTo (5), "#4b"); result = MessageThreader.GetThreadableSubject ("Re: [Mailing-List] Re[4]: simple subject ", out depth); Assert.That (result, Is.EqualTo ("simple subject"), "#5a"); Assert.That (depth, Is.EqualTo (5), "#5b"); } static readonly char[] Space = new[] { ' ' }; static MessageSummary MakeThreadable (ref int index, string subject, string msgid, string date, string refs) { DateUtils.TryParse (date, out var value); var summary = new MessageSummary (++index); summary.UniqueId = new UniqueId ((uint) summary.Index); summary.Envelope = new Envelope (); summary.References = new MessageIdList (); if (refs != null) { foreach (var id in refs.Split (Space, StringSplitOptions.RemoveEmptyEntries)) summary.References.Add (id); } summary.Envelope.MessageId = MimeUtils.EnumerateReferences (msgid).FirstOrDefault (); summary.Envelope.Subject = subject; summary.Envelope.Date = value; summary.Size = 0; return summary; } static void WriteMessageThread (StringBuilder builder, IList messages, MessageThread thread, int depth) { builder.Append (new string (' ', depth * 3)); if (thread.UniqueId.HasValue) { var summary = messages[(int) thread.UniqueId.Value.Id - 1]; builder.Append (summary.Envelope.Subject); } else { builder.Append ("dummy"); } builder.Append ('\n'); foreach (var child in thread.Children) WriteMessageThread (builder, messages, child, depth + 1); } [Test] public void TestThreadBySubject () { const string defaultDate = "01 Jan 1997 12:00:00 -0400"; var messages = new List (); int index = 0; // this test case was borrowed from Jamie Zawinski's TestThreader.java messages.Add (MakeThreadable (ref index, "Subject", "<1>", defaultDate, null)); messages.Add (MakeThreadable (ref index, "Re[2]: Subject", "<2>", defaultDate, "<1>")); messages.Add (MakeThreadable (ref index, "Re: Subject", "<3>", defaultDate, "<1> <2>")); messages.Add (MakeThreadable (ref index, "Re: Re: Subject", "<4>", defaultDate, "<1>")); messages.Add (MakeThreadable (ref index, "Re:RE:rE[3]: Subject", "<5>", defaultDate, "<3> ")); string expected = @"Subject Re[2]: Subject Re: Subject Re: Re: Subject Re:RE:rE[3]: Subject ".Replace ("\r\n", "\n"); var threads = messages.Thread (ThreadingAlgorithm.OrderedSubject); var builder = new StringBuilder (); foreach (var thread in threads) WriteMessageThread (builder, messages, thread, 0); //Console.WriteLine (builder); Assert.That (builder.ToString (), Is.EqualTo (expected), "Threading did not produce the expected results"); } [Test] public void TestThreadByReferences () { const string defaultDate = "01 Jan 1997 12:00:00 -0400"; var messages = new List (); int index = 0; // this test case was borrowed from Jamie Zawinski's TestThreader.java messages.Add (MakeThreadable (ref index, "A", "<1>", defaultDate, null)); messages.Add (MakeThreadable (ref index, "B", "<2>", defaultDate, "<1>")); messages.Add (MakeThreadable (ref index, "C", "<3>", defaultDate, "<1> <2>")); messages.Add (MakeThreadable (ref index, "D", "<4>", defaultDate, "<1>")); messages.Add (MakeThreadable (ref index, "E", "<5>", defaultDate, "<3> ")); messages.Add (MakeThreadable (ref index, "F", "<6>", defaultDate, "<2>")); messages.Add (MakeThreadable (ref index, "G", "<7>", defaultDate, "")); messages.Add (MakeThreadable (ref index, "H", "<8>", defaultDate, "")); messages.Add (MakeThreadable (ref index, "Loop1", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Loop2", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Loop3", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Loop4", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "Loop5", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "Loop6", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "Loop7", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Loop8", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Loop8", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Loop10", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Ambig1", "", defaultDate, null)); messages.Add (MakeThreadable (ref index, "Ambig2", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "Ambig3", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Ambig4", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Ambig5a", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "Ambig5b", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "dup", "", defaultDate, null)); messages.Add (MakeThreadable (ref index, "dup-kid", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "dup-kid", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "dup-kid-2", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "dup-kid-2", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "dup-kid-2", "", defaultDate, "")); messages.Add (MakeThreadable (ref index, "same subject 1", "", defaultDate, null)); messages.Add (MakeThreadable (ref index, "same subject 1", "", defaultDate, null)); messages.Add (MakeThreadable (ref index, "missingmessage", "", defaultDate, null)); messages.Add (MakeThreadable (ref index, "missingmessage", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "liar 1", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "liar 2", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "liar2 1", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "liar2 2", "", defaultDate, " ")); messages.Add (MakeThreadable (ref index, "xx", "<331F7D61.2781@netscape.com>", "Thu, 06 Mar 1997 18:28:50 -0800", null)); messages.Add (MakeThreadable (ref index, "lkjhlkjh", "<3321E51F.41C6@netscape.com>", "Sat, 08 Mar 1997 14:15:59 -0800", null)); messages.Add (MakeThreadable (ref index, "test 2", "<3321E5A6.41C6@netscape.com>", "Sat, 08 Mar 1997 14:18:14 -0800", null)); messages.Add (MakeThreadable (ref index, "enc", "<3321E5C0.167E@netscape.com>", "Sat, 08 Mar 1997 14:18:40 -0800", null)); messages.Add (MakeThreadable (ref index, "lkjhlkjh", "<3321E715.15FB@netscape.com>", "Sat, 08 Mar 1997 14:24:21 -0800", null)); messages.Add (MakeThreadable (ref index, "eng", "<3321E7A4.59E2@netscape.com>", "Sat, 08 Mar 1997 14:26:44 -0800", null)); messages.Add (MakeThreadable (ref index, "lkjhl", "<3321E7BB.1CFB@netscape.com>", "Sat, 08 Mar 1997 14:27:07 -0800", null)); messages.Add (MakeThreadable (ref index, "Re: certs and signed messages", "<332230AA.41C6@netscape.com>", "Sat, 08 Mar 1997 19:38:18 -0800", "<33222A5E.ED4@netscape.com>")); messages.Add (MakeThreadable (ref index, "from dogbert", "<3323546E.BEE44C78@netscape.com>", "Sun, 09 Mar 1997 16:23:10 -0800", null)); messages.Add (MakeThreadable (ref index, "lkjhlkjhl", "<33321E2A.1C849A20@netscape.com>", "Thu, 20 Mar 1997 21:35:38 -0800", null)); messages.Add (MakeThreadable (ref index, "le:/u/jwz/mime/smi", "<33323C9D.ADA4BCBA@netscape.com>", "Thu, 20 Mar 1997 23:45:33 -0800", null)); messages.Add (MakeThreadable (ref index, "ile:/u/jwz", "<33323F62.402C573B@netscape.com>", "Thu, 20 Mar 1997 23:57:22 -0800", null)); messages.Add (MakeThreadable (ref index, "ljkljhlkjhl", "<336FBAD0.864BC1F4@netscape.com>", "Tue, 06 May 1997 16:12:16 -0700", null)); messages.Add (MakeThreadable (ref index, "lkjh", "<336FBB46.A0028A6D@netscape.com>", "Tue, 06 May 1997 16:14:14 -0700", null)); messages.Add (MakeThreadable (ref index, "foo", "<337265C1.5C758C77@netscape.com>", "Thu, 08 May 1997 16:46:09 -0700", null)); messages.Add (MakeThreadable (ref index, "Welcome to Netscape", "<337AAB3D.C8BCE069@netscape.com>", "Wed, 14 May 1997 23:20:45 -0700", null)); messages.Add (MakeThreadable (ref index, "Re: Welcome to Netscape", "<337AAE46.903032E4@netscape.com>", "Wed, 14 May 1997 23:33:45 -0700", "<337AAB3D.C8BCE069@netscape.com>")); messages.Add (MakeThreadable (ref index, "[Fwd: enc/signed test 1]", "<338B6EE2.BB26C74C@netscape.com>", "Tue, 27 May 1997 16:31:46 -0700", null)); string expected = @"A B C E F D dummy G H Loop5 Loop4 Loop6 Ambig1 Ambig2 Ambig3 Ambig4 Ambig5a Ambig5b dup dup-kid dup-kid dup-kid-2 dup-kid-2 dup-kid-2 dummy same subject 1 same subject 1 missingmessage missingmessage dummy liar 1 liar 2 dummy liar2 1 liar2 2 xx dummy lkjhlkjh lkjhlkjh test 2 enc eng lkjhl Re: certs and signed messages from dogbert lkjhlkjhl le:/u/jwz/mime/smi ile:/u/jwz ljkljhlkjhl lkjh foo Welcome to Netscape Re: Welcome to Netscape [Fwd: enc/signed test 1] ".Replace ("\r\n", "\n"); var threads = messages.Thread (ThreadingAlgorithm.References); var builder = new StringBuilder (); foreach (var thread in threads) WriteMessageThread (builder, messages, thread, 0); //Console.WriteLine (builder); Assert.That (builder.ToString (), Is.EqualTo (expected), "Threading did not produce the expected results"); } [Test] public void TestThreadableNodeUnusedProperties () { var node = new MessageThreader.ThreadableNode (new MessageSummary (0)); Assert.That (node.Folder, Is.Null, "Folder"); Assert.That (node.Body, Is.Null, "Body"); Assert.That (node.TextBody, Is.Null, "TextBody"); Assert.That (node.HtmlBody, Is.Null, "HtmlBody"); Assert.That (node.BodyParts, Is.Empty, "BodyParts"); Assert.That (node.Attachments, Is.Empty, "Attachments"); Assert.That (node.PreviewText, Is.Null, "PreviewText"); Assert.That (node.Envelope, Is.Null, "Envelope"); Assert.That (node.Flags.HasValue, Is.False, "Flags"); Assert.That (node.Keywords, Is.Empty, "Keywords"); Assert.That (node.Headers, Is.Null, "Headers"); Assert.That (node.InternalDate.HasValue, Is.False, "InternalDate"); Assert.That (node.EmailId, Is.Null, "EmailId"); Assert.That (node.ThreadId, Is.Null, "ThreadId"); Assert.That (node.GMailMessageId.HasValue, Is.False, "GMailMessageId"); Assert.That (node.GMailThreadId.HasValue, Is.False, "GMailThreadId"); Assert.That (node.GMailLabels, Is.Null, "GMailLabels"); } } } ================================================ FILE: UnitTests/MetadataTests.cs ================================================ // // MetadataTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit; namespace UnitTests { [TestFixture] public class MetadataTests { [Test] public void TestMetadataTag () { Assert.Throws (() => new MetadataTag (null)); Assert.Throws (() => new MetadataTag (string.Empty)); var tag1 = new MetadataTag ("/dev/null"); var tag2 = new MetadataTag ("/dev/null"); var tag3 = new MetadataTag ("/opt/nope"); Assert.That (tag1.Equals (tag2), Is.True, "Equals #1"); Assert.That (tag1.Equals (tag3), Is.False, "Equals #2"); Assert.That (tag2.GetHashCode (), Is.EqualTo (tag1.GetHashCode ()), "GetHashCode #1"); Assert.That (tag3.GetHashCode (), Is.Not.EqualTo (tag1.GetHashCode ()), "GetHashCode #2"); Assert.That (MetadataTag.Create (MetadataTag.PrivateComment.ToString ()), Is.EqualTo (MetadataTag.PrivateComment)); Assert.That (MetadataTag.Create (MetadataTag.PrivateSpecialUse.ToString ()), Is.EqualTo (MetadataTag.PrivateSpecialUse)); Assert.That (MetadataTag.Create (MetadataTag.SharedAdmin.ToString ()), Is.EqualTo (MetadataTag.SharedAdmin)); Assert.That (MetadataTag.Create (MetadataTag.SharedComment.ToString ()), Is.EqualTo (MetadataTag.SharedComment)); Assert.That (MetadataTag.Create (tag1.Id), Is.EqualTo (tag1)); } [Test] public void TestMetadataOptions () { var options = new MetadataOptions (); Assert.That (options.Depth, Is.EqualTo (0)); Assert.That (options.LongEntries, Is.EqualTo (0)); Assert.That (options.MaxSize, Is.Null); Assert.Throws (() => options.Depth = 500); } [Test] public void TestMetadataCollection () { Assert.Throws (() => new MetadataCollection (null)); } } } ================================================ FILE: UnitTests/Net/DummyNetworkStream.cs ================================================ // // DummyNetworkStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // namespace UnitTests.Net { public class DummyNetworkStream : MemoryStream { readonly bool throwOnWrite; public DummyNetworkStream (bool throwOnWrite = false) { this.throwOnWrite = throwOnWrite; } public override bool CanSeek => false; public override bool CanTimeout => true; public override int ReadTimeout { get; set; } public override int WriteTimeout { get; set; } public override void Write (byte[] buffer, int offset, int count) { if (throwOnWrite) throw new IOException (); base.Write (buffer, offset, count); } public override Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { if (throwOnWrite) throw new IOException (); return base.WriteAsync (buffer, offset, count, cancellationToken); } } } ================================================ FILE: UnitTests/Net/Imap/ImapAuthenticationSecretDetectorTests.cs ================================================ // // ImapAuthenticationSecretDetectorTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using MailKit; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapAuthenticationSecretDetectorTests { [Test] public void TestEmptyCommand () { var detector = new ImapAuthenticationSecretDetector (); var buffer = Array.Empty (); detector.IsAuthenticating = true; var secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Is.Empty, "# of secrets"); } [Test] public void TestNonAuthCommand () { string command = string.Format ("A00000000 APPEND INBOX (\\Seen) \"{0}\" {{4096}}\r\n", ImapUtils.FormatInternalDate (DateTimeOffset.Now)); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); detector.IsAuthenticating = true; var secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Is.Empty, "# of secrets"); } [Test] public void TestNotIsAuthenticating () { const string command = "A00000000 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n"; var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); var secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Is.Empty, "# of secrets"); } [Test] public void TestLoginCommand () { const string command = "A00000000 LOGIN username password\r\n"; var userIndex = command.IndexOf ("username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("password", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); detector.IsAuthenticating = true; var secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (2), "# of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (userIndex), "UserName StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (8), "UserName Length"); Assert.That (secrets[1].StartIndex, Is.EqualTo (passwdIndex), "Password StartIndex"); Assert.That (secrets[1].Length, Is.EqualTo (8), "Password Length"); } [Test] public void TestLoginCommandBitByBit () { const string command = "A00000000 LOGIN username password\r\n"; var userIndex = command.IndexOf ("username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("password", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); IList secrets; int index = 0; detector.IsAuthenticating = true; while (index < command.Length) { secrets = detector.DetectSecrets (buffer, index, 1); if ((index >= userIndex && index < userIndex + 8) || (index >= passwdIndex && index < passwdIndex + 8)) { Assert.That (secrets, Has.Count.EqualTo (1), $"# of secrets @ index {index}"); Assert.That (secrets[0].StartIndex, Is.EqualTo (index), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (1), "Length"); } else { Assert.That (secrets, Is.Empty, $"# of secrets @ index {index}"); } index++; } } [Test] public void TestLoginCommandQStrings () { const string command = "A00000000 LOGIN \"username\" \"password\"\r\n"; var userIndex = command.IndexOf ("username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("password", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); detector.IsAuthenticating = true; var secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (2), "# of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (userIndex), "UserName StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (8), "UserName Length"); Assert.That (secrets[1].StartIndex, Is.EqualTo (passwdIndex), "Password StartIndex"); Assert.That (secrets[1].Length, Is.EqualTo (8), "Password Length"); } [Test] public void TestLoginCommandQStringsBitByBit () { const string command = "A00000000 LOGIN \"username\" \"password\"\r\n"; var userIndex = command.IndexOf ("username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("password", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); IList secrets; int index = 0; detector.IsAuthenticating = true; while (index < command.Length) { secrets = detector.DetectSecrets (buffer, index, 1); if ((index >= userIndex && index < userIndex + 8) || (index >= passwdIndex && index < passwdIndex + 8)) { Assert.That (secrets, Has.Count.EqualTo (1), $"# of secrets @ index {index}"); Assert.That (secrets[0].StartIndex, Is.EqualTo (index), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (1), "Length"); } else { Assert.That (secrets, Is.Empty, $"# of secrets @ index {index}"); } index++; } } [Test] public void TestLoginCommandEscapedQStrings () { const string command = "A00000000 LOGIN \"domain\\\\username\" \"pass\\\"word\"\r\n"; var userIndex = command.IndexOf ("domain\\\\username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("pass\\\"word", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); detector.IsAuthenticating = true; var secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (2), "# of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (userIndex), "UserName StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (16), "UserName Length"); Assert.That (secrets[1].StartIndex, Is.EqualTo (passwdIndex), "Password StartIndex"); Assert.That (secrets[1].Length, Is.EqualTo (10), "Password Length"); } [Test] public void TestLoginCommandEscapedQStringsBitByBit () { const string command = "A00000000 LOGIN \"domain\\\\username\" \"pass\\\"word\"\r\n"; var userIndex = command.IndexOf ("domain\\\\username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("pass\\\"word", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); IList secrets; int index = 0; detector.IsAuthenticating = true; while (index < command.Length) { secrets = detector.DetectSecrets (buffer, index, 1); if ((index >= userIndex && index < userIndex + 16) || (index >= passwdIndex && index < passwdIndex + 10)) { Assert.That (secrets, Has.Count.EqualTo (1), $"# of secrets @ index {index}"); Assert.That (secrets[0].StartIndex, Is.EqualTo (index), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (1), "Length"); } else { Assert.That (secrets, Is.Empty, $"# of secrets @ index {index}"); } index++; } } [Test] public void TestLoginCommandLiterals () { var detector = new ImapAuthenticationSecretDetector (); IList secrets; byte[] buffer; detector.IsAuthenticating = true; buffer = Encoding.ASCII.GetBytes ("A00000000 LOGIN {8}\r\n"); secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Is.Empty, "LOGIN # of secrets"); buffer = Encoding.ASCII.GetBytes ("username {8}\r\n"); secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (1), "username # of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (0), "UserName StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (8), "UserName Length"); buffer = Encoding.ASCII.GetBytes ("password\r\n"); secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (1), "password # of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (0), "Password StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (8), "Password Length"); } [Test] public void TestLoginCommandLiteralsBitByBit () { const string command = "A00000000 LOGIN {8}\r\nusername {8}\r\npassword\r\n"; var userIndex = command.IndexOf ("username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("password", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); IList secrets; int index = 0; detector.IsAuthenticating = true; while (index < command.Length) { secrets = detector.DetectSecrets (buffer, index, 1); if ((index >= userIndex && index < userIndex + 8) || (index >= passwdIndex && index < passwdIndex + 8)) { Assert.That (secrets, Has.Count.EqualTo (1), $"# of secrets @ index {index}"); Assert.That (secrets[0].StartIndex, Is.EqualTo (index), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (1), "Length"); } else { Assert.That (secrets, Is.Empty, $"# of secrets @ index {index}"); } index++; } } [Test] public void TestLoginCommandLiteralPlus () { const string command = "A00000000 LOGIN {8+}\r\nusername {8+}\r\npassword\r\n"; var userIndex = command.IndexOf ("username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("password", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); detector.IsAuthenticating = true; var secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (2), "# of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (userIndex), "UserName StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (8), "UserName Length"); Assert.That (secrets[1].StartIndex, Is.EqualTo (passwdIndex), "Password StartIndex"); Assert.That (secrets[1].Length, Is.EqualTo (8), "Password Length"); } [Test] public void TestLoginCommandLiteralPlusBitByBit () { const string command = "A00000000 LOGIN {8+}\r\nusername {8+}\r\npassword\r\n"; var userIndex = command.IndexOf ("username", StringComparison.Ordinal); var passwdIndex = command.IndexOf ("password", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); IList secrets; int index = 0; detector.IsAuthenticating = true; while (index < command.Length) { secrets = detector.DetectSecrets (buffer, index, 1); if ((index >= userIndex && index < userIndex + 8) || (index >= passwdIndex && index < passwdIndex + 8)) { Assert.That (secrets, Has.Count.EqualTo (1), $"# of secrets @ index {index}"); Assert.That (secrets[0].StartIndex, Is.EqualTo (index), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (1), "Length"); } else { Assert.That (secrets, Is.Empty, $"# of secrets @ index {index}"); } index++; } } [Test] public void TestSaslIRAuthCommand () { const string command = "A00000000 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n"; var secretIndex = command.IndexOf ("AHVzZXJuYW1lAHBhc3N3b3Jk", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); detector.IsAuthenticating = true; var secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (1), "# of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (secretIndex), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (24), "Length"); } [Test] public void TestSaslIRAuthCommandBitByBit () { const string command = "A00000000 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n"; var secretIndex = command.IndexOf ("AHVzZXJuYW1lAHBhc3N3b3Jk", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); IList secrets; int index = 0; detector.IsAuthenticating = true; while (index < command.Length) { secrets = detector.DetectSecrets (buffer, index, 1); if (index >= secretIndex && command[index] != '\r' && command[index] != '\n') { Assert.That (secrets, Has.Count.EqualTo (1), $"# of secrets @ index {index}"); Assert.That (secrets[0].StartIndex, Is.EqualTo (index), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (1), "Length"); } else { Assert.That (secrets, Is.Empty, $"# of secrets @ index {index}"); } index++; } } [Test] public void TestMultiLineSaslAuthCommand () { var detector = new ImapAuthenticationSecretDetector (); IList secrets; byte[] buffer; detector.IsAuthenticating = true; buffer = Encoding.ASCII.GetBytes ("A00000000 AUTHENTICATE LOGIN\r\n"); secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Is.Empty, "initial # of secrets"); buffer = Encoding.ASCII.GetBytes ("dXNlcm5hbWU=\r\n"); secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (1), "# of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (0), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (12), "Length"); buffer = Encoding.ASCII.GetBytes ("cGFzc3dvcmQ=\r\n"); secrets = detector.DetectSecrets (buffer, 0, buffer.Length); Assert.That (secrets, Has.Count.EqualTo (1), "# of secrets"); Assert.That (secrets[0].StartIndex, Is.EqualTo (0), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (12), "Length"); } [Test] public void TestMultiLineSaslAuthCommandBitByBit () { const string command = "A00000000 AUTHENTICATE LOGIN\r\ndXNlcm5hbWU=\r\ncGFzc3dvcmQ=\r\n"; var secretIndex = command.IndexOf ("dXNlcm5hbWU=", StringComparison.Ordinal); var detector = new ImapAuthenticationSecretDetector (); var buffer = Encoding.ASCII.GetBytes (command); IList secrets; int index = 0; detector.IsAuthenticating = true; while (index < command.Length) { secrets = detector.DetectSecrets (buffer, index, 1); if (index >= secretIndex && command[index] != '\r' && command[index] != '\n') { Assert.That (secrets, Has.Count.EqualTo (1), $"# of secrets @ index {index}"); Assert.That (secrets[0].StartIndex, Is.EqualTo (index), "StartIndex"); Assert.That (secrets[0].Length, Is.EqualTo (1), "Length"); } else { Assert.That (secrets, Is.Empty, $"# of secrets @ index {index}"); } index++; } } } } ================================================ FILE: UnitTests/Net/Imap/ImapClientTests.cs ================================================ // // ImapClientTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Net; using System.Text; using System.Net.Sockets; using System.Net.Security; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using MimeKit; using MailKit; using MailKit.Search; using MailKit.Security; using MailKit.Net.Imap; using MailKit.Net.Proxy; using UnitTests.Security; using UnitTests.Net.Proxy; using AuthenticationException = MailKit.Security.AuthenticationException; namespace UnitTests.Net.Imap { [TestFixture] public class ImapClientTests { static readonly ImapCapabilities GreetingCapabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.Namespace | ImapCapabilities.Unselect; static readonly ImapCapabilities DovecotInitialCapabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.LiteralPlus | ImapCapabilities.SaslIR | ImapCapabilities.LoginReferrals | ImapCapabilities.Id | ImapCapabilities.Enable | ImapCapabilities.Idle; static readonly ImapCapabilities DovecotAuthenticatedCapabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.LiteralPlus | ImapCapabilities.SaslIR | ImapCapabilities.LoginReferrals | ImapCapabilities.Id | ImapCapabilities.Enable | ImapCapabilities.Idle | ImapCapabilities.Sort | ImapCapabilities.SortDisplay | ImapCapabilities.Thread | ImapCapabilities.MultiAppend | ImapCapabilities.Catenate | ImapCapabilities.Unselect | ImapCapabilities.Children | ImapCapabilities.Namespace | ImapCapabilities.UidPlus | ImapCapabilities.ListExtended | ImapCapabilities.I18NLevel | ImapCapabilities.CondStore | ImapCapabilities.QuickResync | ImapCapabilities.ESearch | ImapCapabilities.ESort | ImapCapabilities.SearchResults | ImapCapabilities.Within | ImapCapabilities.Context | ImapCapabilities.ListStatus | ImapCapabilities.Binary | ImapCapabilities.Move | ImapCapabilities.SpecialUse; static readonly ImapCapabilities GMailInitialCapabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.Quota | ImapCapabilities.Idle | ImapCapabilities.Namespace | ImapCapabilities.Id | ImapCapabilities.Children | ImapCapabilities.Unselect | ImapCapabilities.SaslIR | ImapCapabilities.XList | ImapCapabilities.GMailExt1; static readonly ImapCapabilities GMailAuthenticatedCapabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.Quota | ImapCapabilities.Idle | ImapCapabilities.Namespace | ImapCapabilities.Id | ImapCapabilities.Children | ImapCapabilities.Unselect | ImapCapabilities.UidPlus | ImapCapabilities.CondStore | ImapCapabilities.ESearch | ImapCapabilities.Compress | ImapCapabilities.Enable | ImapCapabilities.ListExtended | ImapCapabilities.ListStatus | ImapCapabilities.Move | ImapCapabilities.UTF8Accept | ImapCapabilities.XList | ImapCapabilities.GMailExt1 | ImapCapabilities.LiteralMinus | ImapCapabilities.AppendLimit; static readonly ImapCapabilities ICloudInitialCapabilities = ImapCapabilities.IMAP4 | ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.SaslIR; static readonly ImapCapabilities ICloudAuthenticatedCapabilities = ImapCapabilities.IMAP4 | ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.CondStore | ImapCapabilities.Enable | ImapCapabilities.QuickResync | ImapCapabilities.Quota | ImapCapabilities.Namespace | ImapCapabilities.UidPlus | ImapCapabilities.Children | ImapCapabilities.Binary | ImapCapabilities.Unselect | ImapCapabilities.Sort | ImapCapabilities.Catenate | ImapCapabilities.Language | ImapCapabilities.ESearch | ImapCapabilities.ESort | ImapCapabilities.Thread | ImapCapabilities.Context | ImapCapabilities.Within | ImapCapabilities.SaslIR | ImapCapabilities.SearchResults | ImapCapabilities.Metadata | ImapCapabilities.Id | ImapCapabilities.Annotate | ImapCapabilities.MultiSearch | ImapCapabilities.Idle | ImapCapabilities.ListStatus; static readonly ImapCapabilities IMAP4rev2CoreCapabilities = ImapCapabilities.IMAP4rev2 | ImapCapabilities.Status | ImapCapabilities.Namespace | ImapCapabilities.Unselect | ImapCapabilities.UidPlus | ImapCapabilities.ESearch | ImapCapabilities.SearchResults | ImapCapabilities.Enable | ImapCapabilities.Idle | ImapCapabilities.SaslIR | ImapCapabilities.ListExtended | ImapCapabilities.ListStatus | ImapCapabilities.Move | ImapCapabilities.LiteralMinus | ImapCapabilities.SpecialUse; static readonly ImapCapabilities AclInitialCapabilities = GMailInitialCapabilities | ImapCapabilities.Acl; static readonly ImapCapabilities AclAuthenticatedCapabilities = GMailAuthenticatedCapabilities | ImapCapabilities.Acl; static readonly ImapCapabilities MetadataInitialCapabilities = GMailInitialCapabilities | ImapCapabilities.Metadata; static readonly ImapCapabilities MetadataAuthenticatedCapabilities = GMailAuthenticatedCapabilities | ImapCapabilities.Metadata; const CipherAlgorithmType GmxDeCipherAlgorithm = CipherAlgorithmType.Aes256; const int GmxDeCipherStrength = 256; #if !MONO const HashAlgorithmType GmxDeHashAlgorithm = HashAlgorithmType.Sha384; #else const HashAlgorithmType GmxDeHashAlgorithm = HashAlgorithmType.None; #endif const ExchangeAlgorithmType EcdhEphemeral = (ExchangeAlgorithmType) 44550; static FolderAttributes GetSpecialFolderAttribute (SpecialFolder special) { switch (special) { case SpecialFolder.All: return FolderAttributes.All; case SpecialFolder.Archive: return FolderAttributes.Archive; case SpecialFolder.Drafts: return FolderAttributes.Drafts; case SpecialFolder.Flagged: return FolderAttributes.Flagged; case SpecialFolder.Important: return FolderAttributes.Important; case SpecialFolder.Junk: return FolderAttributes.Junk; case SpecialFolder.Sent: return FolderAttributes.Sent; case SpecialFolder.Trash: return FolderAttributes.Trash; default: throw new ArgumentOutOfRangeException (nameof (special)); } } static Stream GetResourceStream (string name) { return typeof (ImapClientTests).Assembly.GetManifestResourceStream ("UnitTests.Net.Imap.Resources." + name); } static void GetStreamsCallback (ImapFolder folder, int index, UniqueId uid, Stream stream) { using (var reader = new StreamReader (stream)) { const string expected = "This is some dummy text just to make sure this is working correctly."; var text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo (expected)); } } static async Task GetStreamsAsyncCallback (ImapFolder folder, int index, UniqueId uid, Stream stream, CancellationToken cancellationToken) { using (var reader = new StreamReader (stream)) { const string expected = "This is some dummy text just to make sure this is working correctly."; #if NET8_0_OR_GREATER var text = await reader.ReadToEndAsync (cancellationToken); #else var text = await reader.ReadToEndAsync (); #endif Assert.That (text, Is.EqualTo (expected)); } } [Test] public void TestArgumentExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); Assert.That (client.SyncRoot, Is.InstanceOf (), "SyncRoot"); // Connect Assert.Throws (() => client.Connect ((Uri) null)); Assert.ThrowsAsync (async () => await client.ConnectAsync ((Uri) null)); Assert.Throws (() => client.Connect (new Uri ("path", UriKind.Relative))); Assert.ThrowsAsync (async () => await client.ConnectAsync (new Uri ("path", UriKind.Relative))); Assert.Throws (() => client.Connect (null, 143, false)); Assert.ThrowsAsync (async () => await client.ConnectAsync (null, 143, false)); Assert.Throws (() => client.Connect (string.Empty, 143, false)); Assert.ThrowsAsync (async () => await client.ConnectAsync (string.Empty, 143, false)); Assert.Throws (() => client.Connect ("host", -1, false)); Assert.ThrowsAsync (async () => await client.ConnectAsync ("host", -1, false)); Assert.Throws (() => client.Connect (null, 143, SecureSocketOptions.None)); Assert.ThrowsAsync (async () => await client.ConnectAsync (null, 143, SecureSocketOptions.None)); Assert.Throws (() => client.Connect (string.Empty, 143, SecureSocketOptions.None)); Assert.ThrowsAsync (async () => await client.ConnectAsync (string.Empty, 143, SecureSocketOptions.None)); Assert.Throws (() => client.Connect ("host", -1, SecureSocketOptions.None)); Assert.ThrowsAsync (async () => await client.ConnectAsync ("host", -1, SecureSocketOptions.None)); Assert.Throws (() => client.Connect ((Socket) null, "host", 143, SecureSocketOptions.None)); Assert.ThrowsAsync (async () => await client.ConnectAsync ((Socket) null, "host", 143, SecureSocketOptions.None)); Assert.Throws (() => client.Connect ((Stream) null, "host", 143, SecureSocketOptions.None)); Assert.ThrowsAsync (async () => await client.ConnectAsync ((Stream) null, "host", 143, SecureSocketOptions.None)); using (var socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { Assert.Throws (() => client.Connect (socket, "host", 143, SecureSocketOptions.None)); Assert.ThrowsAsync (async () => await client.ConnectAsync (socket, "host", 143, SecureSocketOptions.None)); } try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Authenticate Assert.Throws (() => client.Authenticate ((SaslMechanism) null)); Assert.ThrowsAsync (async () => await client.AuthenticateAsync ((SaslMechanism) null)); Assert.Throws (() => client.Authenticate ((ICredentials) null)); Assert.ThrowsAsync (async () => await client.AuthenticateAsync ((ICredentials) null)); Assert.Throws (() => client.Authenticate (null, "password")); Assert.ThrowsAsync (async () => await client.AuthenticateAsync (null, "password")); Assert.Throws (() => client.Authenticate ("username", null)); Assert.ThrowsAsync (async () => await client.AuthenticateAsync ("username", null)); Assert.Throws (() => client.Authenticate (null, credentials)); Assert.ThrowsAsync (async () => await client.AuthenticateAsync (null, credentials)); Assert.Throws (() => client.Authenticate (Encoding.UTF8, null)); Assert.ThrowsAsync (async () => await client.AuthenticateAsync (Encoding.UTF8, null)); Assert.Throws (() => client.Authenticate (null, "username", "password")); Assert.ThrowsAsync (async () => await client.AuthenticateAsync (null, "username", "password")); Assert.Throws (() => client.Authenticate (Encoding.UTF8, null, "password")); Assert.ThrowsAsync (async () => await client.AuthenticateAsync (Encoding.UTF8, null, "password")); Assert.Throws (() => client.Authenticate (Encoding.UTF8, "username", null)); Assert.ThrowsAsync (async () => await client.AuthenticateAsync (Encoding.UTF8, "username", null)); // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // Notify Assert.Throws (() => client.Notify (true, null)); Assert.ThrowsAsync (async () => await client.NotifyAsync (true, null)); Assert.Throws (() => client.Notify (true, Array.Empty ())); Assert.ThrowsAsync (async () => await client.NotifyAsync (true, Array.Empty ())); Assert.Throws (() => new ImapMailboxFilter.Subtree (client.Inbox, null)); Assert.Throws (() => new ImapMailboxFilter.Mailboxes (client.Inbox, null)); Assert.Throws (() => client.GetFolder ((string) null)); Assert.Throws (() => client.GetFolder ((FolderNamespace) null)); Assert.ThrowsAsync (async () => await client.GetFolderAsync ((string) null)); Assert.Throws (() => client.GetFolders (null)); Assert.Throws (() => client.GetFolders (null, false)); Assert.ThrowsAsync (async () => await client.GetFoldersAsync (null)); Assert.ThrowsAsync (async () => await client.GetFoldersAsync (null, false)); Assert.That (client.PersonalNamespaces, Has.Count.EqualTo (1), "Personal"); Assert.That (client.SharedNamespaces, Is.Empty, "Shared"); Assert.That (client.OtherNamespaces, Is.Empty, "Other"); var personal = client.GetFolder (client.PersonalNamespaces[0]); client.Disconnect (false); } } static IList CreateIMAP4rev2Commands () { return new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* OK [CAPABILITY STARTTLS AUTH=SCRAM-SHA-256 LOGINDISABLED IMAP4rev2] IMAP4rev2 Service Ready\r\n")), }; } [Test] public void TestIMAP4rev2 () { var commands = CreateIMAP4rev2Commands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (IMAP4rev2CoreCapabilities | ImapCapabilities.StartTLS | ImapCapabilities.LoginDisabled), "Capabilities"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("SCRAM-SHA-256"), "AUTH=SCRAM-SHA-256"); } } [Test] public async Task TestIMAP4rev2Async () { var commands = CreateIMAP4rev2Commands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (IMAP4rev2CoreCapabilities | ImapCapabilities.StartTLS | ImapCapabilities.LoginDisabled), "Capabilities"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("SCRAM-SHA-256"), "AUTH=SCRAM-SHA-256"); } } [Test] public void TestEscapeUserName () { var builder = new StringBuilder (); ImapClient.EscapeUserName (builder, "user:/?@&=+$%,;name"); var escaped = builder.ToString (); Assert.That (escaped, Is.EqualTo ("user%3A%2F%3F%40%26%3D%2B%24%25%2C%3Bname")); } [Test] public void TestUnescapeUserName () { var unescaped = ImapClient.UnescapeUserName ("user%3A%2F%3F%40%26%3D%2B%24%25%2C%3Bname"); Assert.That (unescaped, Is.EqualTo ("user:/?@&=+$%,;name")); unescaped = ImapClient.UnescapeUserName ("user%3a%2f%3f%40%26%3d%2b%24%25%2c%3bname"); Assert.That (unescaped, Is.EqualTo ("user:/?@&=+$%,;name")); } static void AssertDefaultValues (string host, int port, SecureSocketOptions options, Uri expected) { ImapClient.ComputeDefaultValues (host, ref port, ref options, out Uri uri, out bool starttls); if (expected.PathAndQuery == "/?starttls=when-available") { Assert.That (options, Is.EqualTo (SecureSocketOptions.StartTlsWhenAvailable), $"{expected}"); Assert.That (starttls, Is.True, $"{expected}"); } else if (expected.PathAndQuery == "/?starttls=always") { Assert.That (options, Is.EqualTo (SecureSocketOptions.StartTls), $"{expected}"); Assert.That (starttls, Is.True, $"{expected}"); } else if (expected.Scheme == "imaps") { Assert.That (options, Is.EqualTo (SecureSocketOptions.SslOnConnect), $"{expected}"); Assert.That (starttls, Is.False, $"{expected}"); } else { Assert.That (options, Is.EqualTo (SecureSocketOptions.None), $"{expected}"); Assert.That (starttls, Is.False, $"{expected}"); } Assert.That (uri.ToString (), Is.EqualTo (expected.ToString ())); Assert.That (port, Is.EqualTo (expected.Port), $"{expected}"); } [Test] public void TestComputeDefaultValues () { const string host = "imap.skyfall.net"; AssertDefaultValues (host, 0, SecureSocketOptions.None, new Uri ($"imap://{host}:143")); AssertDefaultValues (host, 143, SecureSocketOptions.None, new Uri ($"imap://{host}:143")); AssertDefaultValues (host, 993, SecureSocketOptions.None, new Uri ($"imap://{host}:993")); AssertDefaultValues (host, 0, SecureSocketOptions.SslOnConnect, new Uri ($"imaps://{host}:993")); AssertDefaultValues (host, 143, SecureSocketOptions.SslOnConnect, new Uri ($"imaps://{host}:143")); AssertDefaultValues (host, 993, SecureSocketOptions.SslOnConnect, new Uri ($"imaps://{host}:993")); AssertDefaultValues (host, 0, SecureSocketOptions.StartTls, new Uri ($"imap://{host}:143/?starttls=always")); AssertDefaultValues (host, 143, SecureSocketOptions.StartTls, new Uri ($"imap://{host}:143/?starttls=always")); AssertDefaultValues (host, 993, SecureSocketOptions.StartTls, new Uri ($"imap://{host}:993/?starttls=always")); AssertDefaultValues (host, 0, SecureSocketOptions.StartTlsWhenAvailable, new Uri ($"imap://{host}:143/?starttls=when-available")); AssertDefaultValues (host, 143, SecureSocketOptions.StartTlsWhenAvailable, new Uri ($"imap://{host}:143/?starttls=when-available")); AssertDefaultValues (host, 993, SecureSocketOptions.StartTlsWhenAvailable, new Uri ($"imap://{host}:993/?starttls=when-available")); AssertDefaultValues (host, 0, SecureSocketOptions.Auto, new Uri ($"imap://{host}:143/?starttls=when-available")); AssertDefaultValues (host, 143, SecureSocketOptions.Auto, new Uri ($"imap://{host}:143/?starttls=when-available")); AssertDefaultValues (host, 993, SecureSocketOptions.Auto, new Uri ($"imaps://{host}:993")); } static Socket Connect (string host, int port) { var ipAddresses = Dns.GetHostAddresses (host); Socket socket = null; for (int i = 0; i < ipAddresses.Length; i++) { socket = new Socket (ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { socket.Connect (ipAddresses[i], port); break; } catch { socket.Dispose (); socket = null; } } return socket; } [Test] public void TestSslHandshakeExceptions () { using (var client = new ImapClient ()) { Socket socket; // 1. Test connecting to a non-SSL port fails with an SslHandshakeException. Assert.Throws (() => client.Connect ("www.gmail.com", 80, true)); socket = Connect ("www.gmail.com", 80); Assert.Throws (() => client.Connect (socket, "www.gmail.com", 80, SecureSocketOptions.SslOnConnect)); // 2. Test connecting to a server with a bad SSL certificate fails with an SslHandshakeException. try { client.Connect ("untrusted-root.badssl.com", 443, SecureSocketOptions.SslOnConnect); Assert.Fail ("SSL handshake should have failed with untrusted-root.badssl.com."); } catch (SslHandshakeException ex) { Assert.That (ex.ServerCertificate, Is.Not.Null, "ServerCertificate"); SslHandshakeExceptionTests.AssertBadSslUntrustedRootServerCertificate ((X509Certificate2) ex.ServerCertificate); // Note: This is null on Mono because Mono provides an empty chain. if (ex.RootCertificateAuthority is X509Certificate2 root) SslHandshakeExceptionTests.AssertBadSslUntrustedRootCACertificate (root); } catch (Exception ex) { Assert.Ignore ($"SSL handshake failure inconclusive: {ex}"); } try { socket = Connect ("untrusted-root.badssl.com", 443); client.Connect (socket, "untrusted-root.badssl.com", 443, SecureSocketOptions.SslOnConnect); Assert.Fail ("SSL handshake should have failed with untrusted-root.badssl.com."); } catch (SslHandshakeException ex) { Assert.That (ex.ServerCertificate, Is.Not.Null, "ServerCertificate"); SslHandshakeExceptionTests.AssertBadSslUntrustedRootServerCertificate ((X509Certificate2) ex.ServerCertificate); // Note: This is null on Mono because Mono provides an empty chain. if (ex.RootCertificateAuthority is X509Certificate2 root) SslHandshakeExceptionTests.AssertBadSslUntrustedRootCACertificate (root); } catch (Exception ex) { Assert.Ignore ($"SSL handshake failure inconclusive: {ex}"); } } } [Test] public async Task TestSslHandshakeExceptionsAsync () { using (var client = new ImapClient ()) { Socket socket; // 1. Test connecting to a non-SSL port fails with an SslHandshakeException. Assert.ThrowsAsync (async () => await client.ConnectAsync ("www.gmail.com", 80, true)); socket = Connect ("www.gmail.com", 80); Assert.ThrowsAsync (async () => await client.ConnectAsync (socket, "www.gmail.com", 80, SecureSocketOptions.SslOnConnect)); // 2. Test connecting to a server with a bad SSL certificate fails with an SslHandshakeException. try { await client.ConnectAsync ("untrusted-root.badssl.com", 443, SecureSocketOptions.SslOnConnect); Assert.Fail ("SSL handshake should have failed with untrusted-root.badssl.com."); } catch (SslHandshakeException ex) { Assert.That (ex.ServerCertificate, Is.Not.Null, "ServerCertificate"); SslHandshakeExceptionTests.AssertBadSslUntrustedRootServerCertificate ((X509Certificate2) ex.ServerCertificate); // Note: This is null on Mono because Mono provides an empty chain. if (ex.RootCertificateAuthority is X509Certificate2 root) SslHandshakeExceptionTests.AssertBadSslUntrustedRootCACertificate (root); } catch (Exception ex) { Assert.Ignore ($"SSL handshake failure inconclusive: {ex}"); } try { socket = Connect ("untrusted-root.badssl.com", 443); await client.ConnectAsync (socket, "untrusted-root.badssl.com", 443, SecureSocketOptions.SslOnConnect); Assert.Fail ("SSL handshake should have failed with untrusted-root.badssl.com."); } catch (SslHandshakeException ex) { Assert.That (ex.ServerCertificate, Is.Not.Null, "ServerCertificate"); SslHandshakeExceptionTests.AssertBadSslUntrustedRootServerCertificate ((X509Certificate2) ex.ServerCertificate); // Note: This is null on Mono because Mono provides an empty chain. if (ex.RootCertificateAuthority is X509Certificate2 root) SslHandshakeExceptionTests.AssertBadSslUntrustedRootCACertificate (root); } catch (Exception ex) { Assert.Ignore ($"SSL handshake failure inconclusive: {ex}"); } } } [Test] public void TestStartTlsNotSupported () { var commands = new List { new ImapReplayCommand ("", "common.basic-greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "common.capability.txt"), }; using (var client = new ImapClient () { TagPrefix = 'A' }) Assert.Throws (() => client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.StartTls), "STARTTLS"); using (var client = new ImapClient () { TagPrefix = 'A' }) Assert.ThrowsAsync (() => client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.StartTls), "STARTTLS Async"); } [Test] public void TestProtocolLoggerExceptions () { var commands = new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), }; using (var client = new ImapClient (new ExceptionalProtocolLogger (ExceptionalProtocolLoggerMode.ThrowOnLogConnect)) { TagPrefix = 'A' }) Assert.Throws (() => client.Connect (Stream.Null, "imap.gmail.com", 143, SecureSocketOptions.None), "LogConnect"); using (var client = new ImapClient (new ExceptionalProtocolLogger (ExceptionalProtocolLoggerMode.ThrowOnLogConnect)) { TagPrefix = 'A' }) Assert.ThrowsAsync (() => client.ConnectAsync (Stream.Null, "imap.gmail.com", 143, SecureSocketOptions.None), "LogConnect Async"); using (var client = new ImapClient (new ExceptionalProtocolLogger (ExceptionalProtocolLoggerMode.ThrowOnLogServer)) { TagPrefix = 'A' }) Assert.Throws (() => client.Connect (new ImapReplayStream (commands, false), "imap.gmail.com", 143, SecureSocketOptions.None), "LogServer"); using (var client = new ImapClient (new ExceptionalProtocolLogger (ExceptionalProtocolLoggerMode.ThrowOnLogServer)) { TagPrefix = 'A' }) Assert.ThrowsAsync (() => client.ConnectAsync (new ImapReplayStream (commands, true), "imap.gmail.com", 143, SecureSocketOptions.None), "LogServer Async"); using (var client = new ImapClient (new ExceptionalProtocolLogger (ExceptionalProtocolLoggerMode.ThrowOnLogClient)) { TagPrefix = 'A' }) Assert.Throws (() => client.Connect (new ImapReplayStream (commands, false), "imap.gmail.com", 143, SecureSocketOptions.None), "LogClient"); using (var client = new ImapClient (new ExceptionalProtocolLogger (ExceptionalProtocolLoggerMode.ThrowOnLogClient)) { TagPrefix = 'A' }) Assert.ThrowsAsync (() => client.ConnectAsync (new ImapReplayStream (commands, true), "imap.gmail.com", 143, SecureSocketOptions.None), "LogClient Async"); } static void AssertGMailIsConnected (IMailService client) { Assert.That (client.IsConnected, Is.True, "Expected the client to be connected"); Assert.That (client.IsSecure, Is.True, "Expected a secure connection"); Assert.That (client.IsEncrypted, Is.True, "Expected an encrypted connection"); Assert.That (client.IsSigned, Is.True, "Expected a signed connection"); Assert.That (client.SslProtocol == SslProtocols.Tls12 || client.SslProtocol == SslProtocols.Tls13, Is.True, "Expected a TLS v1.2 or TLS v1.3 connection"); Assert.That (client.SslCipherAlgorithm == CipherAlgorithmType.Aes128 || client.SslCipherAlgorithm == CipherAlgorithmType.Aes256, Is.True, $"Unexpected SslCipherAlgorithm: {client.SslCipherAlgorithm}"); Assert.That (client.SslCipherStrength == 128 || client.SslCipherStrength == 256, Is.True, $"Unexpected SslCipherStrength: {client.SslCipherStrength}"); #if !MONO Assert.That (client.SslCipherSuite == TlsCipherSuite.TLS_AES_128_GCM_SHA256 || client.SslCipherSuite == TlsCipherSuite.TLS_AES_256_GCM_SHA384, Is.True, $"Unexpected SslCipherSuite: {client.SslCipherSuite}"); Assert.That (client.SslHashAlgorithm == HashAlgorithmType.Sha256 || client.SslHashAlgorithm == HashAlgorithmType.Sha384, Is.True, $"Unexpected SslHashAlgorithm: {client.SslHashAlgorithm}"); #else Assert.That (client.SslHashAlgorithm == HashAlgorithmType.None, Is.True, $"Unexpected SslHashAlgorithm: {client.SslHashAlgorithm}"); #endif Assert.That (client.SslHashStrength, Is.EqualTo (0), $"Unexpected SslHashStrength: {client.SslHashStrength}"); Assert.That (client.SslKeyExchangeAlgorithm == ExchangeAlgorithmType.None || client.SslKeyExchangeAlgorithm == EcdhEphemeral, Is.True, $"Unexpected SslKeyExchangeAlgorithm: {client.SslKeyExchangeAlgorithm}"); Assert.That (client.SslKeyExchangeStrength, Is.AnyOf (0, 255, 256, 384), $"Unexpected SslKeyExchangeStrength: {client.SslKeyExchangeStrength}"); Assert.That (client.IsAuthenticated, Is.False, "Expected the client to not be authenticated"); } static void AssertClientIsDisconnected (IMailService client) { Assert.That (client.IsConnected, Is.False, "Expected the client to be disconnected"); Assert.That (client.IsSecure, Is.False, "Expected IsSecure to be false after disconnecting"); Assert.That (client.IsEncrypted, Is.False, "Expected IsEncrypted to be false after disconnecting"); Assert.That (client.IsSigned, Is.False, "Expected IsSigned to be false after disconnecting"); Assert.That (client.SslProtocol, Is.EqualTo (SslProtocols.None), "Expected SslProtocol to be None after disconnecting"); Assert.That (client.SslCipherAlgorithm, Is.Null, "Expected SslCipherAlgorithm to be null after disconnecting"); Assert.That (client.SslCipherStrength, Is.Null, "Expected SslCipherStrength to be null after disconnecting"); Assert.That (client.SslCipherSuite, Is.Null, "Expected SslCipherSuite to be null after disconnecting"); Assert.That (client.SslHashAlgorithm, Is.Null, "Expected SslHashAlgorithm to be null after disconnecting"); Assert.That (client.SslHashStrength, Is.Null, "Expected SslHashStrength to be null after disconnecting"); Assert.That (client.SslKeyExchangeAlgorithm, Is.Null, "Expected SslKeyExchangeAlgorithm to be null after disconnecting"); Assert.That (client.SslKeyExchangeStrength, Is.Null, "Expected SslKeyExchangeStrength to be null after disconnecting"); } [Test] public void TestConnectGMail () { var options = SecureSocketOptions.SslOnConnect; var host = "imap.gmail.com"; int port = 993; using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; client.Connect (host, 0, options); AssertGMailIsConnected (client); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); Assert.Throws (() => client.Connect (host, 0, options)); client.Disconnect (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } [Test] public async Task TestConnectGMailAsync () { var options = SecureSocketOptions.SslOnConnect; var host = "imap.gmail.com"; int port = 993; using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; await client.ConnectAsync (host, 0, options); AssertGMailIsConnected (client); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); Assert.ThrowsAsync (async () => await client.ConnectAsync (host, 0, options)); await client.DisconnectAsync (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } [Test] public void TestConnectGMailViaProxy () { var options = SecureSocketOptions.SslOnConnect; var host = "imap.gmail.com"; int port = 993; using (var proxy = new Socks5ProxyListener ()) { proxy.Start (IPAddress.Loopback, 0); using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; client.ProxyClient = new Socks5Client (proxy.IPAddress.ToString (), proxy.Port); client.ServerCertificateValidationCallback = (s, c, h, e) => true; client.ClientCertificates = null; client.LocalEndPoint = null; client.Timeout = 20000; try { client.Connect (host, 0, options); } catch (TimeoutException) { Assert.Inconclusive ("Timed out."); return; } catch (Exception ex) { Assert.Fail (ex.Message); } AssertGMailIsConnected (client); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); Assert.Throws (() => client.Connect (host, 0, options)); client.Disconnect (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } } [Test] public async Task TestConnectGMailViaProxyAsync () { var options = SecureSocketOptions.SslOnConnect; var host = "imap.gmail.com"; int port = 993; using (var proxy = new Socks5ProxyListener ()) { proxy.Start (IPAddress.Loopback, 0); using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; client.ProxyClient = new Socks5Client (proxy.IPAddress.ToString (), proxy.Port); client.ServerCertificateValidationCallback = (s, c, h, e) => true; client.ClientCertificates = null; client.LocalEndPoint = null; client.Timeout = 20000; try { await client.ConnectAsync (host, 0, options); } catch (TimeoutException) { Assert.Inconclusive ("Timed out."); return; } catch (Exception ex) { Assert.Fail (ex.Message); } AssertGMailIsConnected (client); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); Assert.ThrowsAsync (async () => await client.ConnectAsync (host, 0, options)); await client.DisconnectAsync (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } } [Test] public void TestConnectGMailSocket () { var options = SecureSocketOptions.SslOnConnect; var host = "imap.gmail.com"; int port = 993; using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; var socket = Connect (host, port); Assert.Throws (() => client.Connect (socket, null, port, SecureSocketOptions.Auto)); Assert.Throws (() => client.Connect (socket, "", port, SecureSocketOptions.Auto)); Assert.Throws (() => client.Connect (socket, host, -1, SecureSocketOptions.Auto)); client.Connect (socket, host, port, SecureSocketOptions.Auto); AssertGMailIsConnected (client); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); Assert.Throws (() => client.Connect (socket, host, port, SecureSocketOptions.Auto)); client.Disconnect (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } [Test] public async Task TestConnectGMailSocketAsync () { var options = SecureSocketOptions.SslOnConnect; var host = "imap.gmail.com"; int port = 993; using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; var socket = Connect (host, port); Assert.ThrowsAsync (async () => await client.ConnectAsync (socket, null, port, SecureSocketOptions.Auto)); Assert.ThrowsAsync (async () => await client.ConnectAsync (socket, "", port, SecureSocketOptions.Auto)); Assert.ThrowsAsync (async () => await client.ConnectAsync (socket, host, -1, SecureSocketOptions.Auto)); await client.ConnectAsync (socket, host, port, SecureSocketOptions.Auto); AssertGMailIsConnected (client); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); Assert.ThrowsAsync (async () => await client.ConnectAsync (socket, host, port, SecureSocketOptions.Auto)); await client.DisconnectAsync (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } [Test] public void TestConnectGmxDe () { var options = SecureSocketOptions.StartTls; var host = "imap.gmx.de"; int port = 143; using (var cancel = new CancellationTokenSource (30 * 1000)) { using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; var uri = new Uri ($"imap://{host}/?starttls=always"); client.Connect (uri, cancel.Token); Assert.That (client.IsConnected, Is.True, "Expected the client to be connected"); Assert.That (client.IsSecure, Is.True, "Expected a secure connection"); Assert.That (client.IsEncrypted, Is.True, "Expected an encrypted connection"); Assert.That (client.IsSigned, Is.True, "Expected a signed connection"); Assert.That (client.SslProtocol == SslProtocols.Tls12 || client.SslProtocol == SslProtocols.Tls13, Is.True, "Expected a TLS v1.2 or TLS v1.3 connection"); Assert.That (client.SslCipherAlgorithm, Is.EqualTo (GmxDeCipherAlgorithm)); Assert.That (client.SslCipherStrength, Is.EqualTo (GmxDeCipherStrength)); Assert.That (client.SslHashAlgorithm, Is.EqualTo (GmxDeHashAlgorithm)); Assert.That (client.SslHashStrength, Is.EqualTo (0), $"Unexpected SslHashStrength: {client.SslHashStrength}"); Assert.That (client.SslKeyExchangeAlgorithm == ExchangeAlgorithmType.None || client.SslKeyExchangeAlgorithm == EcdhEphemeral, Is.True, $"Unexpected SslKeyExchangeAlgorithm: {client.SslKeyExchangeAlgorithm}"); Assert.That (client.SslKeyExchangeStrength, Is.AnyOf (0, 255, 256, 384), $"Unexpected SslKeyExchangeStrength: {client.SslKeyExchangeStrength}"); Assert.That (client.IsAuthenticated, Is.False, "Expected the client to not be authenticated"); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); client.Disconnect (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } } [Test] public async Task TestConnectGmxDeAsync () { var options = SecureSocketOptions.StartTls; var host = "imap.gmx.de"; int port = 143; using (var cancel = new CancellationTokenSource (30 * 1000)) { using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; var uri = new Uri ($"imap://{host}/?starttls=always"); await client.ConnectAsync (uri, cancel.Token); Assert.That (client.IsConnected, Is.True, "Expected the client to be connected"); Assert.That (client.IsSecure, Is.True, "Expected a secure connection"); Assert.That (client.IsEncrypted, Is.True, "Expected an encrypted connection"); Assert.That (client.IsSigned, Is.True, "Expected a signed connection"); Assert.That (client.SslProtocol == SslProtocols.Tls12 || client.SslProtocol == SslProtocols.Tls13, Is.True, "Expected a TLS v1.2 or TLS v1.3 connection"); Assert.That (client.SslCipherAlgorithm, Is.EqualTo (GmxDeCipherAlgorithm)); Assert.That (client.SslCipherStrength, Is.EqualTo (GmxDeCipherStrength)); Assert.That (client.SslHashAlgorithm, Is.EqualTo (GmxDeHashAlgorithm)); Assert.That (client.SslHashStrength, Is.EqualTo (0), $"Unexpected SslHashStrength: {client.SslHashStrength}"); Assert.That (client.SslKeyExchangeAlgorithm == ExchangeAlgorithmType.None || client.SslKeyExchangeAlgorithm == EcdhEphemeral, Is.True, $"Unexpected SslKeyExchangeAlgorithm: {client.SslKeyExchangeAlgorithm}"); Assert.That (client.SslKeyExchangeStrength, Is.AnyOf (0, 255, 256, 384), $"Unexpected SslKeyExchangeStrength: {client.SslKeyExchangeStrength}"); Assert.That (client.IsAuthenticated, Is.False, "Expected the client to not be authenticated"); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); await client.DisconnectAsync (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } } [Test] public void TestConnectGmxDeSocket () { var options = SecureSocketOptions.StartTls; var host = "imap.gmx.de"; int port = 143; using (var cancel = new CancellationTokenSource (30 * 1000)) { using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; var socket = Connect (host, port); client.Connect (socket, host, port, options, cancel.Token); Assert.That (client.IsConnected, Is.True, "Expected the client to be connected"); Assert.That (client.IsSecure, Is.True, "Expected a secure connection"); Assert.That (client.IsEncrypted, Is.True, "Expected an encrypted connection"); Assert.That (client.IsSigned, Is.True, "Expected a signed connection"); Assert.That (client.SslProtocol == SslProtocols.Tls12 || client.SslProtocol == SslProtocols.Tls13, Is.True, "Expected a TLS v1.2 or TLS v1.3 connection"); Assert.That (client.SslCipherAlgorithm, Is.EqualTo (GmxDeCipherAlgorithm)); Assert.That (client.SslCipherStrength, Is.EqualTo (GmxDeCipherStrength)); Assert.That (client.SslHashAlgorithm, Is.EqualTo (GmxDeHashAlgorithm)); Assert.That (client.SslHashStrength, Is.EqualTo (0), $"Unexpected SslHashStrength: {client.SslHashStrength}"); Assert.That (client.SslKeyExchangeAlgorithm == ExchangeAlgorithmType.None || client.SslKeyExchangeAlgorithm == EcdhEphemeral, Is.True, $"Unexpected SslKeyExchangeAlgorithm: {client.SslKeyExchangeAlgorithm}"); Assert.That (client.SslKeyExchangeStrength, Is.AnyOf (0, 255, 256, 384), $"Unexpected SslKeyExchangeStrength: {client.SslKeyExchangeStrength}"); Assert.That (client.IsAuthenticated, Is.False, "Expected the client to not be authenticated"); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); client.Disconnect (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } } [Test] public async Task TestConnectGmxDeSocketAsync () { var options = SecureSocketOptions.StartTls; var host = "imap.gmx.de"; int port = 143; using (var cancel = new CancellationTokenSource (30 * 1000)) { using (var client = new ImapClient ()) { int connected = 0, disconnected = 0; client.Connected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "ConnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "ConnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "ConnectedEventArgs.Options"); connected++; }; client.Disconnected += (sender, e) => { Assert.That (e.Host, Is.EqualTo (host), "DisconnectedEventArgs.Host"); Assert.That (e.Port, Is.EqualTo (port), "DisconnectedEventArgs.Port"); Assert.That (e.Options, Is.EqualTo (options), "DisconnectedEventArgs.Options"); Assert.That (e.IsRequested, Is.True, "DisconnectedEventArgs.IsRequested"); disconnected++; }; var socket = Connect (host, port); await client.ConnectAsync (socket, host, port, options, cancel.Token); Assert.That (client.IsConnected, Is.True, "Expected the client to be connected"); Assert.That (client.IsSecure, Is.True, "Expected a secure connection"); Assert.That (client.IsEncrypted, Is.True, "Expected an encrypted connection"); Assert.That (client.IsSigned, Is.True, "Expected a signed connection"); Assert.That (client.SslProtocol == SslProtocols.Tls12 || client.SslProtocol == SslProtocols.Tls13, Is.True, "Expected a TLS v1.2 or TLS v1.3 connection"); Assert.That (client.SslCipherAlgorithm, Is.EqualTo (GmxDeCipherAlgorithm)); Assert.That (client.SslCipherStrength, Is.EqualTo (GmxDeCipherStrength)); Assert.That (client.SslHashAlgorithm, Is.EqualTo (GmxDeHashAlgorithm)); Assert.That (client.SslHashStrength, Is.EqualTo (0), $"Unexpected SslHashStrength: {client.SslHashStrength}"); Assert.That (client.SslKeyExchangeAlgorithm == ExchangeAlgorithmType.None || client.SslKeyExchangeAlgorithm == EcdhEphemeral, Is.True, $"Unexpected SslKeyExchangeAlgorithm: {client.SslKeyExchangeAlgorithm}"); Assert.That (client.SslKeyExchangeStrength, Is.AnyOf (0, 255, 256, 384), $"Unexpected SslKeyExchangeStrength: {client.SslKeyExchangeStrength}"); Assert.That (client.IsAuthenticated, Is.False, "Expected the client to not be authenticated"); Assert.That (connected, Is.EqualTo (1), "ConnectedEvent"); await client.DisconnectAsync (true); AssertClientIsDisconnected (client); Assert.That (disconnected, Is.EqualTo (1), "DisconnectedEvent"); } } } [Test] public void TestUnexpectedGreeting () { var commands = new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* INVALID\r\n")) }; using (var client = new ImapClient () { TagPrefix = 'A' }) Assert.Throws (() => client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None), "Connect"); using (var client = new ImapClient () { TagPrefix = 'A' }) Assert.ThrowsAsync (() => client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None), "ConnectAsync"); } [Test] public void TestGreetingCapabilities () { var commands = new List { new ImapReplayCommand ("", "common.capability-greeting.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GreetingCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (1)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); } } [Test] public async Task TestGreetingCapabilitiesAsync () { var commands = new List { new ImapReplayCommand ("", "common.capability-greeting.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GreetingCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (1)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); } } [Test] public void TestByeGreeting () { var commands = new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* BYE\r\n")) }; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); Assert.Fail ("Did not expect to be connected."); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("The IMAP server unexpectedly refused the connection.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } client.Disconnect (false); } } [Test] public async Task TestByeGreetingAsync () { var commands = new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* BYE\r\n")) }; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); Assert.Fail ("Did not expect to be connected."); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("The IMAP server unexpectedly refused the connection.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } await client.DisconnectAsync (false); } } [Test] public void TestByeGreetingWithAlert () { var commands = new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* BYE [ALERT] Too many connections.\r\n")) }; using (var client = new ImapClient () { TagPrefix = 'A' }) { int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo ("Too many connections.")); alerts++; }; try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); Assert.Fail ("Did not expect to be connected."); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("Too many connections.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } Assert.That (alerts, Is.EqualTo (1), "Expected 1 alert"); client.Disconnect (false); } } [Test] public async Task TestByeGreetingWithAlertAsync () { var commands = new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* BYE [ALERT] Too many connections.\r\n")) }; using (var client = new ImapClient () { TagPrefix = 'A' }) { int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo ("Too many connections.")); alerts++; }; try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); Assert.Fail ("Did not expect to be connected."); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("Too many connections.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } Assert.That (alerts, Is.EqualTo (1), "Expected 1 alert"); await client.DisconnectAsync (false); } } [Test] public void TestByeGreetingWithRespText () { var commands = new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* BYE Too many connections.\r\n")) }; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); Assert.Fail ("Did not expect to be connected."); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("Too many connections.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } client.Disconnect (false); } } [Test] public async Task TestByeGreetingWithRespTextAsync () { var commands = new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* BYE Too many connections.\r\n")) }; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); Assert.Fail ("Did not expect to be connected."); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("Too many connections.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } await client.DisconnectAsync (false); } } static List CreateUnexpectedByeCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+statussize+objectid.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", Encoding.ASCII.GetBytes ("* BYE System going down for a reboot.\r\n")) }; } [Test] public void TestUnexpectedBye () { var commands = CreateUnexpectedByeCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } try { client.Inbox.Open (FolderAccess.ReadWrite); Assert.Fail ("Did not expect to open the Inbox"); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("System going down for a reboot.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Open: {ex}"); } client.Disconnect (false); } } [Test] public async Task TestUnexpectedByeAsync () { var commands = CreateUnexpectedByeCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } try { await client.Inbox.OpenAsync (FolderAccess.ReadWrite); Assert.Fail ("Did not expect to open the Inbox"); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("System going down for a reboot.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Open: {ex}"); } await client.DisconnectAsync (false); } } static List CreateUnexpectedByeAfterCapabilityCommands () { return new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* OK Yandex IMAP4rev1 at sas8-bccc92f57f23.qloud-c.yandex.net:993 ready to talk with, 2019-Oct-18 07:41:00, 0fHtH613ZiE1\r\n")), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", Encoding.ASCII.GetBytes ("* BYE Autologout; idle for too long (1)\r\n* BYE Autologout; idle for too long (2)\r\n* BYE Autologout; idle for too long (3)\r\n")) }; } [Test] public void TestUnexpectedByeAfterCapability () { var commands = CreateUnexpectedByeAfterCapabilityCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); Assert.Fail ("Did not expect to connect"); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("Autologout; idle for too long (1)")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } client.Disconnect (false); } } [Test] public async Task TestUnexpectedByeAfterCapabilityAsync () { var commands = CreateUnexpectedByeAfterCapabilityCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); Assert.Fail ("Did not expect to connect"); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("Autologout; idle for too long (1)")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } await client.DisconnectAsync (false); } } static List CreateUnexpectedByeWithAlertCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+statussize+objectid.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", Encoding.ASCII.GetBytes ("* BYE [ALERT] System going down for a reboot.\r\n")) }; } [Test] public void TestUnexpectedByeWithAlert () { var commands = CreateUnexpectedByeWithAlertCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo ("System going down for a reboot.")); alerts++; }; try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } try { client.Inbox.Open (FolderAccess.ReadWrite); Assert.Fail ("Did not expect to open the Inbox"); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("System going down for a reboot.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Open: {ex}"); } Assert.That (alerts, Is.EqualTo (1), "Expected 1 alert"); client.Disconnect (false); } } [Test] public async Task TestUnexpectedByeWithAlertAsync () { var commands = CreateUnexpectedByeWithAlertCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo ("System going down for a reboot.")); alerts++; }; try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } try { await client.Inbox.OpenAsync (FolderAccess.ReadWrite); Assert.Fail ("Did not expect to open the Inbox"); } catch (ImapProtocolException ex) { Assert.That (ex.Message, Is.EqualTo ("System going down for a reboot.")); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Open: {ex}"); } Assert.That (alerts, Is.EqualTo (1), "Expected 1 alert"); await client.DisconnectAsync (false); } } static List CreateUnexpectedByeInSaslAuthenticateCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", Encoding.ASCII.GetBytes ("* BYE disconnecting\r\nA00000001 NO you are not allowed to act as a proxy server\r\n")) }; } [Test] public void TestUnexpectedByeInSaslAuthenticate () { var commands = CreateUnexpectedByeInSaslAuthenticateCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); Assert.Fail ("Expected failure"); } catch (ImapProtocolException pex) { Assert.That (pex.Message, Is.EqualTo ("you are not allowed to act as a proxy server")); } catch (Exception ex) { Assert.Fail ($"Expected ImapProtocolException, but got: {ex}"); } } } [Test] public async Task TestUnexpectedByeInSaslAuthenticateAsync () { var commands = CreateUnexpectedByeInSaslAuthenticateCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); Assert.Fail ("Expected failure"); } catch (ImapProtocolException pex) { Assert.That (pex.Message, Is.EqualTo ("you are not allowed to act as a proxy server")); } catch (Exception ex) { Assert.Fail ($"Expected ImapProtocolException, but got: {ex}"); } } } static List CreateInvalidTaggedByeDuringLogoutCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+statussize+objectid.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LOGOUT\r\n", Encoding.ASCII.GetBytes ("A00000005 BYE IMAP4rev1 Server logging out\r\n")) }; } [Test] public void TestInvalidTaggedByeDuringLogout () { var commands = CreateInvalidTaggedByeDuringLogoutCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } try { client.Disconnect (true); } catch (Exception ex) { Assert.Fail ($"Exceptions should be swallowed in Disconnect: {ex}"); } } } [Test] public async Task TestInvalidTaggedByeDuringLogoutAsync () { var commands = CreateInvalidTaggedByeDuringLogoutCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect this exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } try { await client.DisconnectAsync (true); } catch (Exception ex) { Assert.Fail ($"Exceptions should be swallowed in Disconnect: {ex}"); } } } static List CreatePreAuthGreetingCommands () { return new List { new ImapReplayCommand ("", "common.preauth-greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "common.capability.txt"), new ImapReplayCommand ("A00000001 LIST \"\" \"\"\r\n", "common.list-namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\"\r\n", "common.list-inbox.txt") }; } [Test] public void TestPreAuthGreeting () { var capabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status; var commands = CreatePreAuthGreetingCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsAuthenticated, Is.True, "Client should be authenticated."); Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (capabilities), "Capabilities"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox), "Expected Inbox attributes to be empty."); client.Disconnect (false); } } [Test] public async Task TestPreAuthGreetingAsync () { var capabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status; var commands = CreatePreAuthGreetingCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsAuthenticated, Is.True, "Client should be authenticated."); Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (capabilities), "Capabilities"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox), "Expected Inbox attributes to be empty."); await client.DisconnectAsync (false); } } static List CreatePreAuthCapabilityGreetingCommands () { return new List { new ImapReplayCommand ("", "common.preauth-capability-greeting.txt"), new ImapReplayCommand ("A00000000 LIST \"\" \"\"\r\n", "common.list-namespace.txt"), new ImapReplayCommand ("A00000001 LIST \"\" \"INBOX\"\r\n", "common.list-inbox.txt") }; } [Test] public void TestPreAuthCapabilityGreeting () { var capabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status; var commands = CreatePreAuthCapabilityGreetingCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsAuthenticated, Is.True, "Client should be authenticated."); Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (capabilities), "Capabilities"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox), "Expected Inbox attributes to be empty."); client.Disconnect (false); } } [Test] public async Task TestPreAuthCapabilityGreetingAsync () { var capabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status; var commands = CreatePreAuthCapabilityGreetingCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsAuthenticated, Is.True, "Client should be authenticated."); Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (capabilities), "Capabilities"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox), "Expected Inbox attributes to be empty."); await client.DisconnectAsync (false); } } static List CreateGMailWebAlertCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 LOGIN username password\r\n", "gmail.authenticate+webalert.txt") }; } [Test] public void TestGMailWebAlert () { const string webUri = "https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbsNd6RU3LIlgDfhmL9Y7ywYhtagFig_xfuSJCUHD9Eg3XqN8DKlDk3G8jmj2w5viIm5PDC3BS4SVy7iFMB6g1244cnQt1E60EdOTSEpnqDzL6FH2L-ReOAyZ3qkSXZQZs2pIfL2"; const string alert = "Please log in via your web browser: https://support.google.com/mail/accounts/answer/78754 (Failure)"; var commands = CreateGMailWebAlertCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { int webalerts = 0; int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo (alert)); alerts++; }; client.WebAlert += (sender, e) => { Assert.That (e.WebUri.AbsoluteUri, Is.EqualTo (webUri)); Assert.That (e.Message, Is.EqualTo ("Web login required.")); webalerts++; }; try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo (alert)); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (alerts, Is.EqualTo (1), "Expected 1 alert"); Assert.That (webalerts, Is.EqualTo (1), "Expected 1 web alert"); client.Disconnect (false); } } [Test] public async Task TestGMailWebAlertAsync () { const string webUri = "https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbsNd6RU3LIlgDfhmL9Y7ywYhtagFig_xfuSJCUHD9Eg3XqN8DKlDk3G8jmj2w5viIm5PDC3BS4SVy7iFMB6g1244cnQt1E60EdOTSEpnqDzL6FH2L-ReOAyZ3qkSXZQZs2pIfL2"; const string alert = "Please log in via your web browser: https://support.google.com/mail/accounts/answer/78754 (Failure)"; var commands = CreateGMailWebAlertCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { int webalerts = 0; int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo (alert)); alerts++; }; client.WebAlert += (sender, e) => { Assert.That (e.WebUri.AbsoluteUri, Is.EqualTo (webUri)); Assert.That (e.Message, Is.EqualTo ("Web login required.")); webalerts++; }; try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo (alert)); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (alerts, Is.EqualTo (1), "Expected 1 alert"); Assert.That (webalerts, Is.EqualTo (1), "Expected 1 web alert"); await client.DisconnectAsync (false); } } static List CreateUnicodeRespTextCommands (out string respText) { respText = "╟ы╩╣╙├╩┌╚и┬ы╡╟┬╝бг╧ъ╟щ╟ы┐┤"; return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 LOGIN username password\r\n", Encoding.UTF8.GetBytes ("A00000001 NO " + respText + "\r\n")) }; } [Test] public void TestUnicodeRespText () { var commands = CreateUnicodeRespTextCommands (out var respText); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo (respText)); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.Disconnect (false); } } [Test] public async Task TestUnicodeRespTextAsync () { var commands = CreateUnicodeRespTextCommands (out var respText); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo (respText)); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.DisconnectAsync (false); } } static List CreateInvalidUntaggedResponseCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"Buggy Folder Listing\" RETURN (SUBSCRIBED CHILDREN)\r\n", Encoding.ASCII.GetBytes ("* {25}\r\nThis should be skipped...\r\n* LIST (\\NoSelect) \"/\" \"Buggy Folder Listing\"\r\nA00000005 OK LIST completed.\r\n")), }; } [Test] public void TestInvalidUntaggedResponse () { var commands = CreateInvalidUntaggedResponseCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var folder = client.GetFolder ("Buggy Folder Listing"); Assert.That (folder.Name, Is.EqualTo ("Buggy Folder Listing"), "Name"); Assert.That (folder.Attributes, Is.EqualTo (FolderAttributes.NoSelect), "Attributes"); client.Disconnect (false); } } [Test] public async Task TestInvalidUntaggedResponseAsync () { var commands = CreateInvalidUntaggedResponseCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var folder = await client.GetFolderAsync ("Buggy Folder Listing"); Assert.That (folder.Name, Is.EqualTo ("Buggy Folder Listing"), "Name"); Assert.That (folder.Attributes, Is.EqualTo (FolderAttributes.NoSelect), "Attributes"); await client.DisconnectAsync (false); } } static List CreateInvalidUntaggedBadResponseCommands (out string alertText) { alertText = "Please enable IMAP access in your account settings first."; return new List { new ImapReplayCommand ("", "common.capability-greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", Encoding.UTF8.GetBytes ("A00000000 OK [ALERT] " + alertText + "\r\n")), new ImapReplayCommand ("A00000001 CAPABILITY\r\n", Encoding.UTF8.GetBytes ("A00000001 NO [ALERT] " + alertText + "\r\n")), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", Encoding.UTF8.GetBytes ("A00000002 NO [ALERT] " + alertText + "\r\n")), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\"\r\n", Encoding.UTF8.GetBytes ("* BAD [ALERT] " + alertText + "\r\nA00000003 NO [ALERT] " + alertText + "\r\n")) }; } [Test] public void TestInvalidUntaggedBadResponse () { var commands = CreateInvalidUntaggedBadResponseCommands (out var alertText); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo (alertText)); alerts++; }; try { client.Authenticate ("username", "password"); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo (alertText)); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (alerts, Is.EqualTo (5), $"Unexpected number of alerts: {alerts}"); Assert.That (client.Inbox, Is.Not.Null, "Inbox"); client.Disconnect (false); } } [Test] public async Task TestInvalidUntaggedBadResponseAsync () { var commands = CreateInvalidUntaggedBadResponseCommands (out var alertText); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo (alertText)); alerts++; }; try { await client.AuthenticateAsync ("username", "password"); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo (alertText)); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (alerts, Is.EqualTo (5), $"Unexpected number of alerts: {alerts}"); Assert.That (client.Inbox, Is.Not.Null, "Inbox"); await client.DisconnectAsync (false); } } // Tests issue https://github.com/jstedfast/MailKit/issues/115#issuecomment-313684616 static IList CreateUntaggedRespCodeCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt"), new ImapReplayCommand ("A00000006 UID MOVE 1 \"[Gmail]/Trash\"\r\n", Encoding.ASCII.GetBytes ("* [COPYUID 123456 1 2]\r\n* 1 EXPUNGE\r\nA00000006 OK Completed.\r\n")) }; } [Test] public void TestUntaggedRespCode () { var commands = CreateUntaggedRespCodeCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var trash = client.GetFolder (SpecialFolder.Trash); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); var moved = inbox.MoveTo (UniqueId.MinValue, trash); Assert.That (moved.Value.Id, Is.EqualTo (2)); client.Disconnect (false); } } [Test] public async Task TestUntaggedRespCodeAsync () { var commands = CreateUntaggedRespCodeCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var trash = client.GetFolder (SpecialFolder.Trash); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var moved = await inbox.MoveToAsync (UniqueId.MinValue, trash); Assert.That (moved.Value.Id, Is.EqualTo (2)); await client.DisconnectAsync (false); } } static IList CreateSuperfluousUntaggedOkNoOrBadCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt"), new ImapReplayCommand ("A00000006 UID MOVE 1 \"[Gmail]/Trash\"\r\n", Encoding.ASCII.GetBytes ("* OK The good,\r\n* BAD the bad,\r\n* NO and the ugly.\r\n* OK [COPYUID 123456 1 2]\r\n* 1 EXPUNGE\r\nA00000006 OK Completed.\r\n")) }; } [Test] public void TesSuperfluousUntaggedOkNoOrBad () { var commands = CreateSuperfluousUntaggedOkNoOrBadCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var trash = client.GetFolder (SpecialFolder.Trash); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); var moved = inbox.MoveTo (UniqueId.MinValue, trash); Assert.That (moved.Value.Id, Is.EqualTo (2)); client.Disconnect (false); } } [Test] public async Task TestSuperfluousUntaggedOkNoOrBadAsync () { var commands = CreateSuperfluousUntaggedOkNoOrBadCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var trash = client.GetFolder (SpecialFolder.Trash); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var moved = await inbox.MoveToAsync (UniqueId.MinValue, trash); Assert.That (moved.Value.Id, Is.EqualTo (2)); await client.DisconnectAsync (false); } } static List CreateLoginCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 LOGIN \"Indiana \\\"Han Solo\\\" Jones\" \"p@ss\\\\word\"\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt") }; } [Test] public void TestLogin () { var commands = CreateLoginCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; // Note: Do not try to use any SASL mechanisms client.AuthenticationMechanisms.Clear (); int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { client.Authenticate (new NetworkCredential ("Indiana \"Han Solo\" Jones", "p@ss\\word")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); client.Disconnect (false); } } [Test] public async Task TestLoginAsync () { var commands = CreateLoginCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; // Note: Do not try to use any SASL mechanisms client.AuthenticationMechanisms.Clear (); int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { await client.AuthenticateAsync (new NetworkCredential ("Indiana \"Han Solo\" Jones", "p@ss\\word")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); await client.DisconnectAsync (false); } } static List CreateLoginSpecialCharacterCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 LOGIN username \"pass%word\"\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt") }; } [Test] public void TestLoginSpecialCharacter () { var commands = CreateLoginSpecialCharacterCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; // Note: Do not try to use any SASL mechanisms client.AuthenticationMechanisms.Clear (); int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { client.Authenticate ("username", "pass%word"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); client.Disconnect (false); } } [Test] public async Task TestLoginSpecialCharacterAsync () { var commands = CreateLoginSpecialCharacterCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; // Note: Do not try to use any SASL mechanisms client.AuthenticationMechanisms.Clear (); int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { await client.AuthenticateAsync ("username", "pass%word"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); await client.DisconnectAsync (false); } } static List CreateLoginDisabledCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability+logindisabled.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", ImapReplayCommandResponse.NO) }; } [Test] public void TestLoginDisabled () { var commands = CreateLoginDisabledCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities | ImapCapabilities.LoginDisabled)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); try { client.Authenticate ("username", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo ("AUTHENTICATE failed")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo ("The LOGIN command is disabled.")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.Disconnect (false); } } [Test] public async Task TestLoginDisabledAsync () { var commands = CreateLoginDisabledCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities | ImapCapabilities.LoginDisabled)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); try { await client.AuthenticateAsync ("username", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo ("AUTHENTICATE failed")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (AuthenticationException ax) { Assert.That (ax.Message, Is.EqualTo ("The LOGIN command is disabled.")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.DisconnectAsync (false); } } static List CreateExchangeUserIsAuthenticatedButNotConnectedCommands () { return new List { new ImapReplayCommand ("", "exchange.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "exchange.capability-preauth.txt"), new ImapReplayCommand ("A00000001 LOGIN \"user@domain.com\\\\mailbox\" password\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000002 CAPABILITY\r\n", "exchange.capability-postauth.txt"), new ImapReplayCommand ("A00000003 NAMESPACE\r\n", Encoding.ASCII.GetBytes ("A00000003 BAD User is authenticated but not connected.\r\n")) }; } [Test] public void TestExchangeUserIsAuthenticatedButNotConnected () { var commands = CreateExchangeUserIsAuthenticatedButNotConnectedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (ImapCapabilities.IMAP4 | ImapCapabilities.IMAP4rev1 | ImapCapabilities.SaslIR | ImapCapabilities.UidPlus | ImapCapabilities.Id | ImapCapabilities.Unselect | ImapCapabilities.Children | ImapCapabilities.Idle | ImapCapabilities.Namespace | ImapCapabilities.LiteralPlus | ImapCapabilities.Status)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (2)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("user@domain.com\\mailbox", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (ImapCommandException cx) { Assert.That (cx.Response, Is.EqualTo (ImapCommandResponse.Bad)); Assert.That (cx.ResponseText, Is.EqualTo ("User is authenticated but not connected.")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.Disconnect (false); } } [Test] public async Task TestExchangeUserIsAuthenticatedButNotConnectedAsync () { var commands = CreateExchangeUserIsAuthenticatedButNotConnectedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (ImapCapabilities.IMAP4 | ImapCapabilities.IMAP4rev1 | ImapCapabilities.SaslIR | ImapCapabilities.UidPlus | ImapCapabilities.Id | ImapCapabilities.Unselect | ImapCapabilities.Children | ImapCapabilities.Idle | ImapCapabilities.Namespace | ImapCapabilities.LiteralPlus | ImapCapabilities.Status)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (2)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("user@domain.com\\mailbox", "password"); Assert.Fail ("Did not expect Authenticate to work."); } catch (ImapCommandException cx) { Assert.That (cx.Response, Is.EqualTo (ImapCommandResponse.Bad)); Assert.That (cx.ResponseText, Is.EqualTo ("User is authenticated but not connected.")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.DisconnectAsync (false); } } static List CreateAdvancedFeaturesCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability+login.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE LOGIN\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("dXNlcm5hbWU=\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("A00000001", "cGFzc3dvcmQ=\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 ENABLE UTF8=ACCEPT\r\n", "gmail.utf8accept.txt"), new ImapReplayCommand ("A00000006 GETQUOTAROOT INBOX\r\n", "common.getquota.txt"), new ImapReplayCommand ("A00000007 SETQUOTA \"\" (MESSAGE 1000000 STORAGE 5242880)\r\n", "common.setquota.txt") }; } [Test] public void TestAdvancedFeatures () { var commands = CreateAdvancedFeaturesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (6)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("LOGIN"), "Expected SASL LOGIN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; // Note: Do not try XOAUTH2 or PLAIN client.AuthenticationMechanisms.Remove ("XOAUTH2"); client.AuthenticationMechanisms.Remove ("PLAIN"); int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { client.Authenticate (new NetworkCredential ("username", "password")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); client.EnableUTF8 (); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); var quota = inbox.GetQuota (); Assert.That (quota, Is.Not.Null, "Expected a non-null GETQUOTAROOT response."); Assert.That (quota.QuotaRoot.FullName, Is.EqualTo (personal.FullName)); Assert.That (quota.QuotaRoot, Is.EqualTo (personal)); Assert.That (quota.CurrentStorageSize.Value, Is.EqualTo (3783)); Assert.That (quota.StorageLimit.Value, Is.EqualTo (15728640)); Assert.That (quota.CurrentMessageCount.HasValue, Is.False); Assert.That (quota.MessageLimit.HasValue, Is.False); quota = personal.SetQuota (1000000, 5242880); Assert.That (quota, Is.Not.Null, "Expected non-null SETQUOTA response."); Assert.That (quota.CurrentMessageCount.Value, Is.EqualTo (1107)); Assert.That (quota.CurrentStorageSize.Value, Is.EqualTo (3783)); Assert.That (quota.MessageLimit.Value, Is.EqualTo (1000000)); Assert.That (quota.StorageLimit.Value, Is.EqualTo (5242880)); client.Disconnect (false); } } [Test] public async Task TestAdvancedFeaturesAsync () { var commands = CreateAdvancedFeaturesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (6)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("LOGIN"), "Expected SASL LOGIN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; // Note: Do not try XOAUTH2 or PLAIN client.AuthenticationMechanisms.Remove ("XOAUTH2"); client.AuthenticationMechanisms.Remove ("PLAIN"); int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { await client.AuthenticateAsync (new NetworkCredential ("username", "password")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); await client.EnableUTF8Async (); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); var quota = await inbox.GetQuotaAsync (); Assert.That (quota, Is.Not.Null, "Expected a non-null GETQUOTAROOT response."); Assert.That (quota.QuotaRoot.FullName, Is.EqualTo (personal.FullName)); Assert.That (quota.QuotaRoot, Is.EqualTo (personal)); Assert.That (quota.CurrentStorageSize.Value, Is.EqualTo (3783)); Assert.That (quota.StorageLimit.Value, Is.EqualTo (15728640)); Assert.That (quota.CurrentMessageCount.HasValue, Is.False); Assert.That (quota.MessageLimit.HasValue, Is.False); quota = await personal.SetQuotaAsync (1000000, 5242880); Assert.That (quota, Is.Not.Null, "Expected non-null SETQUOTA response."); Assert.That (quota.CurrentMessageCount.Value, Is.EqualTo (1107)); Assert.That (quota.CurrentStorageSize.Value, Is.EqualTo (3783)); Assert.That (quota.MessageLimit.Value, Is.EqualTo (1000000)); Assert.That (quota.StorageLimit.Value, Is.EqualTo (5242880)); await client.DisconnectAsync (false); } } static List CreateSendingStringsAsLiteralsCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability+login.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE LOGIN\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("dXNlcm5hbWU=\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("A00000001", "cGFzc3dvcmQ=\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 ENABLE UTF8=ACCEPT\r\n", "gmail.utf8accept.txt"), new ImapReplayCommand ("A00000006 ID (\"name\" \"MailKit\" \"version\" \"1.0\" \"vendor\" \"Xamarin Inc.\" \"address\" {35}\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("A00000006", "1 Memorial Dr.\r\nCambridge, MA 02142)\r\n", "common.id.txt"), new ImapReplayCommand ("A00000007 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestSendingStringsAsLiterals () { var commands = CreateSendingStringsAsLiteralsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 or PLAIN client.AuthenticationMechanisms.Remove ("XOAUTH2"); client.AuthenticationMechanisms.Remove ("PLAIN"); try { client.Authenticate (new NetworkCredential ("username", "password")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.EnableUTF8 (); var implementation = new ImapImplementation { Name = "MailKit", Version = "1.0", Vendor = "Xamarin Inc.", Address = "1 Memorial Dr.\r\nCambridge, MA 02142" }; // Disable LITERAL+ and LITERAL- extensions client.Capabilities &= ~ImapCapabilities.LiteralPlus; client.Capabilities &= ~ImapCapabilities.LiteralMinus; implementation = client.Identify (implementation); client.Disconnect (true); } } [Test] public async Task TestSendingStringsAsLiteralsAsync () { var commands = CreateSendingStringsAsLiteralsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 or PLAIN client.AuthenticationMechanisms.Remove ("XOAUTH2"); client.AuthenticationMechanisms.Remove ("PLAIN"); try { await client.AuthenticateAsync (new NetworkCredential ("username", "password")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.EnableUTF8Async (); var implementation = new ImapImplementation { Name = "MailKit", Version = "1.0", Vendor = "Xamarin Inc.", Address = "1 Memorial Dr.\r\nCambridge, MA 02142" }; // Disable LITERAL+ and LITERAL- extensions client.Capabilities &= ~ImapCapabilities.LiteralPlus; client.Capabilities &= ~ImapCapabilities.LiteralMinus; implementation = await client.IdentifyAsync (implementation); await client.DisconnectAsync (true); } } static List CreateSaslAuthenticationCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability+login.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE LOGIN\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("dXNlcm5hbWU=\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("A00000001", "cGFzc3dvcmQ=\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt") }; } [Test] public void TestSaslAuthentication () { var commands = CreateSaslAuthenticationCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (6)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("LOGIN"), "Expected SASL LOGIN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { var credentials = new NetworkCredential ("username", "password"); var sasl = new SaslMechanismLogin (credentials); client.Authenticate (sasl); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); client.Disconnect (false); } } [Test] public async Task TestSaslAuthenticationAsync () { var commands = CreateSaslAuthenticationCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (6)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("LOGIN"), "Expected SASL LOGIN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { var credentials = new NetworkCredential ("username", "password"); var sasl = new SaslMechanismLogin (credentials); await client.AuthenticateAsync (sasl); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); await client.DisconnectAsync (false); } } static List CreateSaslIRAuthenticationCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt") }; } [Test] public void TestSaslIRAuthentication () { var commands = CreateSaslIRAuthenticationCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { var credentials = new NetworkCredential ("username", "password"); var sasl = new SaslMechanismPlain (credentials); client.Authenticate (sasl); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); client.Disconnect (false); } } [Test] public async Task TestSaslIRAuthenticationAsync () { var commands = CreateSaslIRAuthenticationCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { var credentials = new NetworkCredential ("username", "password"); var sasl = new SaslMechanismPlain (credentials); await client.AuthenticateAsync (sasl); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); await client.DisconnectAsync (false); } } static void AssertRedacted (MemoryStream stream, string commandPrefix, string nextCommandPrefix) { stream.Position = 0; using (var reader = new StreamReader (stream, Encoding.ASCII, false, 1024, true)) { string secrets; string line; while ((line = reader.ReadLine ()) != null) { if (line.StartsWith (commandPrefix, StringComparison.Ordinal)) break; } Assert.That (line, Is.Not.Null, $"Authentication command not found: {commandPrefix}"); if (line.Length > commandPrefix.Length) { secrets = line.Substring (commandPrefix.Length); var tokens = secrets.Split (' '); var expectedTokens = new string[tokens.Length]; for (int i = 0; i < tokens.Length; i++) { if (tokens[i][0] == '"') expectedTokens[i] = "\"********\""; else expectedTokens[i] = "********"; } var expected = string.Join (" ", expectedTokens); Assert.That (secrets, Is.EqualTo (expected), commandPrefix); } while ((line = reader.ReadLine ()) != null) { if (line.StartsWith (nextCommandPrefix, StringComparison.Ordinal)) return; if (!line.StartsWith ("C: ", StringComparison.Ordinal)) continue; secrets = line.Substring (3); Assert.That (secrets, Is.EqualTo ("********"), "SASL challenge"); } Assert.Fail ("Did not find response."); } } static List CreateRedactLoginCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 LOGIN username \"pass%word\"\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt") }; } [Test] public void TestRedactLogin () { var commands = CreateRedactLoginCommands (); using (var stream = new MemoryStream ()) { using (var client = new ImapClient (new ProtocolLogger (stream, true) { RedactSecrets = true }) { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; // Note: Do not try to use any SASL mechanisms client.AuthenticationMechanisms.Clear (); int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { client.Authenticate ("username", "pass%word"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); client.Disconnect (false); } AssertRedacted (stream, "C: A00000001 LOGIN ", "C: A00000002 NAMESPACE"); } } [Test] public async Task TestRedactLoginAsync () { var commands = CreateRedactLoginCommands (); using (var stream = new MemoryStream ()) { using (var client = new ImapClient (new ProtocolLogger (stream, true) { RedactSecrets = true }) { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; // Note: Do not try to use any SASL mechanisms client.AuthenticationMechanisms.Clear (); int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { await client.AuthenticateAsync ("username", "pass%word"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); await client.DisconnectAsync (false); } AssertRedacted (stream, "C: A00000001 LOGIN ", "C: A00000002 NAMESPACE"); } } static List CreateRedactAuthenticationCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt") }; } [Test] public void TestRedactAuthentication () { var commands = CreateRedactAuthenticationCommands (); using (var stream = new MemoryStream ()) { using (var client = new ImapClient (new ProtocolLogger (stream, true) { RedactSecrets = true }) { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); client.Disconnect (false); } AssertRedacted (stream, "C: A00000001 AUTHENTICATE PLAIN ", "C: A00000002 NAMESPACE"); } } [Test] public async Task TestRedactAuthenticationAsync () { var commands = CreateRedactAuthenticationCommands (); using (var stream = new MemoryStream ()) { using (var client = new ImapClient (new ProtocolLogger (stream, true) { RedactSecrets = true }) { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); await client.DisconnectAsync (false); } AssertRedacted (stream, "C: A00000001 AUTHENTICATE PLAIN ", "C: A00000002 NAMESPACE"); } } static List CreateRedactSaslAuthenticationCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability+login.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE LOGIN\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("dXNlcm5hbWU=\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("A00000001", "cGFzc3dvcmQ=\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt") }; } [Test] public void TestRedactSaslAuthentication () { var commands = CreateRedactSaslAuthenticationCommands (); using (var stream = new MemoryStream ()) { using (var client = new ImapClient (new ProtocolLogger (stream, true) { RedactSecrets = true }) { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (6)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("LOGIN"), "Expected SASL LOGIN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { var credentials = new NetworkCredential ("username", "password"); var sasl = new SaslMechanismLogin (credentials); client.Authenticate (sasl); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); client.Disconnect (false); } AssertRedacted (stream, "C: A00000001 AUTHENTICATE LOGIN", "C: A00000002 NAMESPACE"); } } [Test] public async Task TestRedactSaslAuthenticationAsync () { var commands = CreateRedactSaslAuthenticationCommands (); using (var stream = new MemoryStream ()) { using (var client = new ImapClient (new ProtocolLogger (stream, true) { RedactSecrets = true }) { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (6)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("LOGIN"), "Expected SASL LOGIN auth mechanism"); Assert.That (client.Timeout, Is.EqualTo (120000), "Timeout"); client.Timeout *= 2; int authenticated = 0; client.Authenticated += (sender, e) => { authenticated++; }; try { var credentials = new NetworkCredential ("username", "password"); var sasl = new SaslMechanismLogin (credentials); await client.AuthenticateAsync (sasl); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (authenticated, Is.EqualTo (1), "Authenticated event was not emitted the expected number of times"); Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); await client.DisconnectAsync (false); } AssertRedacted (stream, "C: A00000001 AUTHENTICATE LOGIN", "C: A00000002 NAMESPACE"); } } static List CreateEnableUTF8Commands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 ENABLE UTF8=ACCEPT\r\n", "gmail.utf8accept.txt") }; } [Test] public void TestEnableUTF8 () { var commands = CreateEnableUTF8Commands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); try { client.Authenticate (new NetworkCredential ("username", "password")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); client.EnableUTF8 (); // ENABLE UTF8 a second time should no-op. client.EnableUTF8 (); client.Disconnect (false); } } [Test] public async Task TestEnableUTF8Async () { var commands = CreateEnableUTF8Commands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); try { await client.AuthenticateAsync (new NetworkCredential ("username", "password")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.SupportsQuotas, Is.True, "SupportsQuotas"); await client.EnableUTF8Async (); // ENABLE UTF8 a second time should no-op. await client.EnableUTF8Async (); await client.DisconnectAsync (false); } } static List CreateEnableQuickResyncCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 ENABLE QRESYNC CONDSTORE\r\n", "dovecot.enable-qresync.txt"), }; } [Test] public void TestEnableQuickResync () { var commands = CreateEnableQuickResyncCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (DovecotInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("DIGEST-MD5"), "Expected SASL DIGEST-MD5 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("CRAM-MD5"), "Expected SASL CRAM-MD5 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("NTLM"), "Expected SASL NTLM auth mechanism"); // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (DovecotAuthenticatedCapabilities)); Assert.That (client.InternationalizationLevel, Is.EqualTo (1), "Expected I18NLEVEL=1"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.OrderedSubject), "Expected THREAD=ORDEREDSUBJECT"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Expected THREAD=REFERENCES"); client.EnableQuickResync (); Assert.That (client.Inbox.Supports (FolderFeature.QuickResync), Is.True, "Expected the INBOX to support QRESYNC"); // ENABLE QRESYNC a second time should no-op. client.EnableQuickResync (); client.Disconnect (false); } } [Test] public async Task TestEnableQuickResyncAsync () { var commands = CreateEnableQuickResyncCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (DovecotInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("DIGEST-MD5"), "Expected SASL DIGEST-MD5 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("CRAM-MD5"), "Expected SASL CRAM-MD5 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("NTLM"), "Expected SASL NTLM auth mechanism"); // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (DovecotAuthenticatedCapabilities)); Assert.That (client.InternationalizationLevel, Is.EqualTo (1), "Expected I18NLEVEL=1"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.OrderedSubject), "Expected THREAD=ORDEREDSUBJECT"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Expected THREAD=REFERENCES"); await client.EnableQuickResyncAsync (); Assert.That (client.Inbox.Supports (FolderFeature.QuickResync), Is.True, "Expected the INBOX to support QRESYNC"); // ENABLE QRESYNC a second time should no-op. await client.EnableQuickResyncAsync (); await client.DisconnectAsync (false); } } static List CreateEnableQuickResynciCloudCommands () { return new List { new ImapReplayCommand ("", "icloud.greeting.txt"), new ImapReplayCommand ("A00000000 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "icloud.authenticate-plain.txt"), new ImapReplayCommand ("A00000001 CAPABILITY\r\n", "icloud.capability.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "icloud.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\"\r\n", "icloud.list-inbox.txt"), new ImapReplayCommand ("A00000004 ENABLE QRESYNC CONDSTORE\r\n", "icloud.enable-qresync.txt"), }; } [Test] public void TestEnableQuickResynciCloud () { var commands = CreateEnableQuickResynciCloudCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (ICloudInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("ATOKEN"), "Expected SASL ATOKEN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("ATOKEN2"), "Expected SASL ATOKEN2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (ICloudAuthenticatedCapabilities)); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.OrderedSubject), "Expected THREAD=ORDEREDSUBJECT"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Expected THREAD=REFERENCES"); client.EnableQuickResync (); Assert.That (client.Inbox.Supports (FolderFeature.QuickResync), Is.True, "Expected the INBOX to support QRESYNC"); // ENABLE QRESYNC a second time should no-op. client.EnableQuickResync (); client.Disconnect (false); } } [Test] public async Task TestEnableQuickResynciCloudAsync () { var commands = CreateEnableQuickResynciCloudCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (ICloudInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("ATOKEN"), "Expected SASL ATOKEN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("ATOKEN2"), "Expected SASL ATOKEN2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (ICloudAuthenticatedCapabilities)); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.OrderedSubject), "Expected THREAD=ORDEREDSUBJECT"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Expected THREAD=REFERENCES"); await client.EnableQuickResyncAsync (); Assert.That (client.Inbox.Supports (FolderFeature.QuickResync), Is.True, "Expected the INBOX to support QRESYNC"); // ENABLE QRESYNC a second time should no-op. await client.EnableQuickResyncAsync (); await client.DisconnectAsync (false); } } static void AssertFolder (IMailFolder folder, string fullName, string id, FolderAttributes attributes, bool subscribed, ulong highestmodseq, int count, int recent, uint uidnext, uint validity, int unread, ulong size) { if (subscribed) attributes |= FolderAttributes.Subscribed; Assert.That (folder.FullName, Is.EqualTo (fullName), "FullName"); Assert.That (folder.Attributes, Is.EqualTo (attributes), "Attributes"); Assert.That (folder.IsSubscribed, Is.EqualTo (subscribed), "IsSubscribed"); Assert.That (folder.HighestModSeq, Is.EqualTo (highestmodseq), "HighestModSeq"); Assert.That (folder, Has.Count.EqualTo (count), "Count"); Assert.That (folder.Recent, Is.EqualTo (recent), "Recent"); Assert.That (folder.Unread, Is.EqualTo (unread), "Unread"); Assert.That (folder.UidNext.HasValue ? folder.UidNext.Value.Id : (uint) 0, Is.EqualTo (uidnext), "UidNext"); Assert.That (folder.UidValidity, Is.EqualTo (validity), "UidValidity"); Assert.That (folder.Size ?? (ulong) 0, Is.EqualTo (size), "Size"); Assert.That (folder.Id, Is.EqualTo (id), "MailboxId"); } static List CreateGetFoldersCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+statussize+objectid.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST (SUBSCRIBED) \"\" \"*\" RETURN (CHILDREN STATUS (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID))\r\n", "gmail.list-all.txt"), new ImapReplayCommand ("A00000006 LIST \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-all-no-status.txt"), new ImapReplayCommand ("A00000007 STATUS INBOX (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-inbox.txt"), new ImapReplayCommand ("A00000008 STATUS +Folder (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-+folder.txt"), new ImapReplayCommand ("A00000009 STATUS \"[Gmail]/All Mail\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-all-mail.txt"), new ImapReplayCommand ("A00000010 STATUS \"[Gmail]/Drafts\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-drafts.txt"), new ImapReplayCommand ("A00000011 STATUS \"[Gmail]/Important\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-important.txt"), new ImapReplayCommand ("A00000012 STATUS \"[Gmail]/Sent Mail\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-sent-mail.txt"), new ImapReplayCommand ("A00000013 STATUS \"[Gmail]/Spam\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-spam.txt"), new ImapReplayCommand ("A00000014 STATUS \"[Gmail]/Starred\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-starred.txt"), new ImapReplayCommand ("A00000015 STATUS \"[Gmail]/Trash\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-trash.txt"), new ImapReplayCommand ("A00000016 LSUB \"\" \"*\"\r\n", "gmail.lsub-all.txt"), new ImapReplayCommand ("A00000017 STATUS INBOX (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-inbox.txt"), new ImapReplayCommand ("A00000018 STATUS +Folder (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-+folder.txt"), new ImapReplayCommand ("A00000019 STATUS \"[Gmail]/All Mail\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-all-mail.txt"), new ImapReplayCommand ("A00000020 STATUS \"[Gmail]/Drafts\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-drafts.txt"), new ImapReplayCommand ("A00000021 STATUS \"[Gmail]/Important\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-important.txt"), new ImapReplayCommand ("A00000022 STATUS \"[Gmail]/Sent Mail\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-sent-mail.txt"), new ImapReplayCommand ("A00000023 STATUS \"[Gmail]/Spam\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-spam.txt"), new ImapReplayCommand ("A00000024 STATUS \"[Gmail]/Starred\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-starred.txt"), new ImapReplayCommand ("A00000025 STATUS \"[Gmail]/Trash\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ SIZE MAILBOXID)\r\n", "gmail.status-trash.txt"), new ImapReplayCommand ("A00000026 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestGetFolders () { var commands = CreateGetFoldersCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities | ImapCapabilities.StatusSize | ImapCapabilities.ObjectID)); var all = StatusItems.Count | StatusItems.HighestModSeq | StatusItems.Recent | StatusItems.UidNext | StatusItems.UidValidity | StatusItems.Unread | StatusItems.Size | StatusItems.MailboxId; var folders = client.GetFolders (client.PersonalNamespaces[0], all, true); Assert.That (folders, Has.Count.EqualTo (10), "Unexpected folder count."); AssertFolder (folders[0], "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (folders[1], "+Folder", "f001Ed6c-ebee-41a5-a65e-9498d3e0aec0", FolderAttributes.HasNoChildren, true, 41234, 6, 0, 7, 1, 0, 1024); AssertFolder (folders[2], "[Gmail]", null, FolderAttributes.HasChildren | FolderAttributes.NonExistent, true, 0, 0, 0, 0, 0, 0, 0); AssertFolder (folders[3], "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (folders[4], "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (folders[5], "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (folders[6], "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (folders[7], "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (folders[8], "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (folders[9], "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); AssertFolder (client.Inbox, "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); // Now make the same query but disable LIST-STATUS client.Capabilities &= ~ImapCapabilities.ListStatus; folders = client.GetFolders (client.PersonalNamespaces[0], all, false); Assert.That (folders, Has.Count.EqualTo (10), "Unexpected folder count."); AssertFolder (folders[0], "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (folders[1], "+Folder", "f001Ed6c-ebee-41a5-a65e-9498d3e0aec0", FolderAttributes.HasNoChildren, true, 41234, 6, 0, 7, 1, 0, 1024); AssertFolder (folders[2], "[Gmail]", null, FolderAttributes.HasChildren | FolderAttributes.NonExistent, true, 0, 0, 0, 0, 0, 0, 0); AssertFolder (folders[3], "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (folders[4], "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (folders[5], "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (folders[6], "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (folders[7], "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (folders[8], "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (folders[9], "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); AssertFolder (client.Inbox, "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); // Now make the same query but disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; folders = client.GetFolders (client.PersonalNamespaces[0], all, true); Assert.That (folders, Has.Count.EqualTo (10), "Unexpected folder count."); AssertFolder (folders[0], "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (folders[1], "+Folder", "f001Ed6c-ebee-41a5-a65e-9498d3e0aec0", FolderAttributes.HasNoChildren, true, 41234, 6, 0, 7, 1, 0, 1024); AssertFolder (folders[2], "[Gmail]", null, FolderAttributes.HasChildren | FolderAttributes.NonExistent, true, 0, 0, 0, 0, 0, 0, 0); AssertFolder (folders[3], "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (folders[4], "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (folders[5], "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (folders[6], "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (folders[7], "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (folders[8], "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (folders[9], "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); AssertFolder (client.Inbox, "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); client.Disconnect (true); } } [Test] public async Task TestGetFoldersAsync () { var commands = CreateGetFoldersCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities | ImapCapabilities.StatusSize | ImapCapabilities.ObjectID)); var all = StatusItems.Count | StatusItems.HighestModSeq | StatusItems.Recent | StatusItems.UidNext | StatusItems.UidValidity | StatusItems.Unread | StatusItems.Size | StatusItems.MailboxId; var folders = await client.GetFoldersAsync (client.PersonalNamespaces[0], all, true); Assert.That (folders, Has.Count.EqualTo (10), "Unexpected folder count."); AssertFolder (folders[0], "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (folders[1], "+Folder", "f001Ed6c-ebee-41a5-a65e-9498d3e0aec0", FolderAttributes.HasNoChildren, true, 41234, 6, 0, 7, 1, 0, 1024); AssertFolder (folders[2], "[Gmail]", null, FolderAttributes.HasChildren | FolderAttributes.NonExistent, true, 0, 0, 0, 0, 0, 0, 0); AssertFolder (folders[3], "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (folders[4], "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (folders[5], "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (folders[6], "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (folders[7], "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (folders[8], "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (folders[9], "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); AssertFolder (client.Inbox, "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); // Now make the same query but disable LIST-STATUS client.Capabilities &= ~ImapCapabilities.ListStatus; folders = await client.GetFoldersAsync (client.PersonalNamespaces[0], all, false); Assert.That (folders, Has.Count.EqualTo (10), "Unexpected folder count."); AssertFolder (folders[0], "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (folders[1], "+Folder", "f001Ed6c-ebee-41a5-a65e-9498d3e0aec0", FolderAttributes.HasNoChildren, true, 41234, 6, 0, 7, 1, 0, 1024); AssertFolder (folders[2], "[Gmail]", null, FolderAttributes.HasChildren | FolderAttributes.NonExistent, true, 0, 0, 0, 0, 0, 0, 0); AssertFolder (folders[3], "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (folders[4], "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (folders[5], "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (folders[6], "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (folders[7], "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (folders[8], "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (folders[9], "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); AssertFolder (client.Inbox, "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); // Now make the same query but disable LIST-STATUS client.Capabilities &= ~ImapCapabilities.ListExtended; folders = await client.GetFoldersAsync (client.PersonalNamespaces[0], all, true); Assert.That (folders, Has.Count.EqualTo (10), "Unexpected folder count."); AssertFolder (folders[0], "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (folders[1], "+Folder", "f001Ed6c-ebee-41a5-a65e-9498d3e0aec0", FolderAttributes.HasNoChildren, true, 41234, 6, 0, 7, 1, 0, 1024); AssertFolder (folders[2], "[Gmail]", null, FolderAttributes.HasChildren | FolderAttributes.NonExistent, true, 0, 0, 0, 0, 0, 0, 0); AssertFolder (folders[3], "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (folders[4], "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (folders[5], "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (folders[6], "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (folders[7], "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (folders[8], "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (folders[9], "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); AssertFolder (client.Inbox, "INBOX", "d0f3b017-d3ec-40aa-9bb9-66c1aeccbb24", FolderAttributes.HasNoChildren | FolderAttributes.Inbox, true, 41234, 60, 0, 410, 1, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", "f668b57d-9f42-453b-b315-a18cd3eb0f85", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3, 1024); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", "fdacc3c7-4e20-4ca0-a0d7-4f7267187e48", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", "2a0410e1-252a-4ee8-b48d-30111cda734a", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", "79da5ecd-afe4-440e-81ce-64ace69c9fbd", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", "f5df5af8-5e11-49a5-891d-c3e05591265e", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", "93ad849a-2127-4c8e-ac41-594cd0a346a4", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0, 1024); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", "a663f6ce-4f36-434e-9f0c-7f757046a6d4", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0, 1024); await client.DisconnectAsync (true); } } static List CreateGetQuotaNonexistentQuotaRootCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 GETQUOTAROOT INBOX\r\n", "common.getquota-no-root.txt"), new ImapReplayCommand ("A00000006 LIST \"\" storage=0 RETURN (SUBSCRIBED CHILDREN)\r\n", ImapReplayCommandResponse.OK) }; } [Test] public void TestGetQuotaNonexistentQuotaRoot () { var commands = CreateGetQuotaNonexistentQuotaRootCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); var quota = inbox.GetQuota (); Assert.That (quota, Is.Not.Null, "Expected a non-null GETQUOTAROOT response."); Assert.That (quota.QuotaRoot.Exists, Is.False); Assert.That (quota.QuotaRoot.FullName, Is.EqualTo ("storage=0")); Assert.That (quota.CurrentStorageSize.Value, Is.EqualTo (28257)); Assert.That (quota.StorageLimit.Value, Is.EqualTo (256000)); Assert.That (quota.CurrentMessageCount.HasValue, Is.False); Assert.That (quota.MessageLimit.HasValue, Is.False); client.Disconnect (false); } } [Test] public async Task TestGetQuotaNonexistentQuotaRootAsync () { var commands = CreateGetQuotaNonexistentQuotaRootCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); var quota = await inbox.GetQuotaAsync (); Assert.That (quota, Is.Not.Null, "Expected a non-null GETQUOTAROOT response."); Assert.That (quota.QuotaRoot.Exists, Is.False); Assert.That (quota.QuotaRoot.FullName, Is.EqualTo ("storage=0")); Assert.That (quota.CurrentStorageSize.Value, Is.EqualTo (28257)); Assert.That (quota.StorageLimit.Value, Is.EqualTo (256000)); Assert.That (quota.CurrentMessageCount.HasValue, Is.False); Assert.That (quota.MessageLimit.HasValue, Is.False); await client.DisconnectAsync (false); } } static MimeMessage CreateThreadableMessage (string subject, string msgid, string references, DateTimeOffset date) { var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Unit Tests", "unit-tests@mimekit.net")); message.To.Add (new MailboxAddress ("Unit Tests", "unit-tests@mimekit.net")); message.MessageId = msgid; message.Subject = subject; message.Date = date; if (references != null) { foreach (var reference in references.Split (' ')) message.References.Add (reference); } message.Body = new TextPart ("plain") { Text = "This is the message body.\r\n" }; return message; } static List CreateDovecotCommands (out List internalDates, out List messages, out List flags) { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 ENABLE QRESYNC CONDSTORE\r\n", "dovecot.enable-qresync.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\" RETURN (SUBSCRIBED CHILDREN STATUS (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ))\r\n", "dovecot.list-personal.txt"), new ImapReplayCommand ("A00000006 CREATE UnitTests.\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000007 LIST \"\" UnitTests\r\n", "dovecot.list-unittests.txt"), new ImapReplayCommand ("A00000008 CREATE UnitTests.Messages\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000009 LIST \"\" UnitTests.Messages\r\n", "dovecot.list-unittests-messages.txt") }; var command = new StringBuilder ("A00000010 APPEND UnitTests.Messages"); var now = DateTimeOffset.Now; internalDates = new List (); messages = new List (); flags = new List (); messages.Add (CreateThreadableMessage ("A", "", null, now.AddMinutes (-7))); messages.Add (CreateThreadableMessage ("B", "", "", now.AddMinutes (-6))); messages.Add (CreateThreadableMessage ("C", "", " ", now.AddMinutes (-5))); messages.Add (CreateThreadableMessage ("D", "", "", now.AddMinutes (-4))); messages.Add (CreateThreadableMessage ("E", "", " ", now.AddMinutes (-3))); messages.Add (CreateThreadableMessage ("F", "", "", now.AddMinutes (-2))); messages.Add (CreateThreadableMessage ("G", "", null, now.AddMinutes (-1))); messages.Add (CreateThreadableMessage ("H", "", null, now)); for (int i = 0; i < messages.Count; i++) { var message = messages[i]; string latin1; long length; internalDates.Add (messages[i].Date); flags.Add (MessageFlags.Draft); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, TextEncodings.Latin1)) latin1 = reader.ReadToEnd (); } command.AppendFormat (" (\\Draft) \"{0}\" ", ImapUtils.FormatInternalDate (message.Date)); command.Append ('{'); command.AppendFormat ("{0}+", length); command.Append ("}\r\n"); command.Append (latin1); } command.Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), "dovecot.multiappend.txt")); commands.Add (new ImapReplayCommand ("A00000011 SELECT UnitTests.Messages (CONDSTORE)\r\n", "dovecot.select-unittests-messages.txt")); commands.Add (new ImapReplayCommand ("A00000012 UID STORE 1:8 +FLAGS.SILENT (\\Seen)\r\n", "dovecot.store-seen.txt")); commands.Add (new ImapReplayCommand ("A00000013 UID STORE 1:3 +FLAGS.SILENT (\\Answered)\r\n", "dovecot.store-answered.txt")); commands.Add (new ImapReplayCommand ("A00000014 UID STORE 8 +FLAGS.SILENT (\\Deleted)\r\n", "dovecot.store-deleted.txt")); commands.Add (new ImapReplayCommand ("A00000015 UID EXPUNGE 8\r\n", "dovecot.uid-expunge.txt")); commands.Add (new ImapReplayCommand ("A00000016 UID THREAD REFERENCES US-ASCII ALL\r\n", "dovecot.thread-references.txt")); commands.Add (new ImapReplayCommand ("A00000017 UID THREAD ORDEREDSUBJECT US-ASCII UID 1:* ALL\r\n", "dovecot.thread-orderedsubject.txt")); commands.Add (new ImapReplayCommand ("A00000018 UNSELECT\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000019 SELECT UnitTests.Messages (QRESYNC (1436832084 2 1:8))\r\n", "dovecot.select-unittests-messages-qresync.txt")); commands.Add (new ImapReplayCommand ("A00000020 UID SEARCH RETURN (ALL RELEVANCY COUNT MIN MAX) MODSEQ 2\r\n", "dovecot.search-changed-since.txt")); commands.Add (new ImapReplayCommand ("A00000021 UID FETCH 1:7 (UID FLAGS MODSEQ)\r\n", "dovecot.fetch1.txt")); commands.Add (new ImapReplayCommand ("A00000022 UID FETCH 1:* (UID FLAGS MODSEQ) (CHANGEDSINCE 2 VANISHED)\r\n", "dovecot.fetch2.txt")); commands.Add (new ImapReplayCommand ("A00000023 UID SORT RETURN (ALL RELEVANCY COUNT MIN MAX) (REVERSE ARRIVAL) US-ASCII ALL\r\n", "dovecot.sort-reverse-arrival.txt")); commands.Add (new ImapReplayCommand ("A00000024 UID SEARCH RETURN (ALL) UNDELETED SEEN\r\n", "dovecot.optimized-search.txt")); commands.Add (new ImapReplayCommand ("A00000025 CREATE UnitTests.Destination\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000026 LIST \"\" UnitTests.Destination\r\n", "dovecot.list-unittests-destination.txt")); commands.Add (new ImapReplayCommand ("A00000027 UID COPY 1:7 UnitTests.Destination\r\n", "dovecot.copy.txt")); commands.Add (new ImapReplayCommand ("A00000028 UID MOVE 1:7 UnitTests.Destination\r\n", "dovecot.move.txt")); commands.Add (new ImapReplayCommand ("A00000029 STATUS UnitTests.Destination (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)\r\n", "dovecot.status-unittests-destination.txt")); commands.Add (new ImapReplayCommand ("A00000030 SELECT UnitTests.Destination (CONDSTORE)\r\n", "dovecot.select-unittests-destination.txt")); commands.Add (new ImapReplayCommand ("A00000031 UID FETCH 1:* (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES X-MAILER)]) (CHANGEDSINCE 1 VANISHED)\r\n", "dovecot.fetch3.txt")); commands.Add (new ImapReplayCommand ("A00000032 FETCH 1:* (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES X-MAILER)]) (CHANGEDSINCE 1)\r\n", "dovecot.fetch3.txt")); commands.Add (new ImapReplayCommand ("A00000033 FETCH 1:14 (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES X-MAILER)]) (CHANGEDSINCE 1)\r\n", "dovecot.fetch3.txt")); commands.Add (new ImapReplayCommand ("A00000034 FETCH 1:* (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES)]) (CHANGEDSINCE 1)\r\n", "dovecot.fetch4.txt")); commands.Add (new ImapReplayCommand ("A00000035 FETCH 1:14 (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES)]) (CHANGEDSINCE 1)\r\n", "dovecot.fetch4.txt")); commands.Add (new ImapReplayCommand ("A00000036 UID FETCH 1:* (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES X-MAILER)])\r\n", "dovecot.fetch3.txt")); commands.Add (new ImapReplayCommand ("A00000037 FETCH 1:* (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES X-MAILER)])\r\n", "dovecot.fetch3.txt")); commands.Add (new ImapReplayCommand ("A00000038 FETCH 1:14 (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES X-MAILER)])\r\n", "dovecot.fetch3.txt")); commands.Add (new ImapReplayCommand ("A00000039 FETCH 1:* (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES)])\r\n", "dovecot.fetch4.txt")); commands.Add (new ImapReplayCommand ("A00000040 FETCH 1:14 (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES)])\r\n", "dovecot.fetch4.txt")); commands.Add (new ImapReplayCommand ("A00000041 UID FETCH 1 (BODY.PEEK[])\r\n", "dovecot.getbodypart.txt")); commands.Add (new ImapReplayCommand ("A00000042 FETCH 1 (BODY.PEEK[])\r\n", "dovecot.getbodypart.txt")); commands.Add (new ImapReplayCommand ("A00000043 UID FETCH 2 (BODY.PEEK[1.MIME] BODY.PEEK[1])\r\n", "dovecot.getbodypart1.txt")); commands.Add (new ImapReplayCommand ("A00000044 FETCH 2 (BODY.PEEK[1.MIME] BODY.PEEK[1])\r\n", "dovecot.getbodypart1.txt")); commands.Add (new ImapReplayCommand ("A00000045 UID FETCH 1 (BODY.PEEK[HEADER])\r\n", "dovecot.getmessageheaders.txt")); commands.Add (new ImapReplayCommand ("A00000046 FETCH 1 (BODY.PEEK[HEADER])\r\n", "dovecot.getmessageheaders.txt")); commands.Add (new ImapReplayCommand ("A00000047 UID FETCH 1 (BODY.PEEK[HEADER])\r\n", "dovecot.getmessageheaders.txt")); commands.Add (new ImapReplayCommand ("A00000048 FETCH 1 (BODY.PEEK[HEADER])\r\n", "dovecot.getmessageheaders.txt")); commands.Add (new ImapReplayCommand ("A00000049 UID FETCH 2 (BODY.PEEK[1.MIME])\r\n", "dovecot.getbodypartheaders.txt")); commands.Add (new ImapReplayCommand ("A00000050 FETCH 2 (BODY.PEEK[1.MIME])\r\n", "dovecot.getbodypartheaders.txt")); commands.Add (new ImapReplayCommand ("A00000051 UID FETCH 1 (BODY.PEEK[]<128.64>)\r\n", "dovecot.getstream.txt")); commands.Add (new ImapReplayCommand ("A00000052 UID FETCH 1 (BODY.PEEK[]<128.64>)\r\n", "dovecot.getstream2.txt")); commands.Add (new ImapReplayCommand ("A00000053 FETCH 1 (BODY.PEEK[]<128.64>)\r\n", "dovecot.getstream.txt")); commands.Add (new ImapReplayCommand ("A00000054 FETCH 1 (BODY.PEEK[]<128.64>)\r\n", "dovecot.getstream2.txt")); commands.Add (new ImapReplayCommand ("A00000055 UID FETCH 1 (BODY.PEEK[HEADER.FIELDS (MIME-VERSION CONTENT-TYPE)])\r\n", "dovecot.getstream-section.txt")); commands.Add (new ImapReplayCommand ("A00000056 FETCH 1 (BODY.PEEK[HEADER.FIELDS (MIME-VERSION CONTENT-TYPE)])\r\n", "dovecot.getstream-section2.txt")); commands.Add (new ImapReplayCommand ("A00000057 UID STORE 1:14 (UNCHANGEDSINCE 3) +FLAGS.SILENT (\\Deleted $MailKit)\r\n", "dovecot.store-deleted-custom.txt")); commands.Add (new ImapReplayCommand ("A00000058 STORE 1:7 (UNCHANGEDSINCE 5) FLAGS.SILENT (\\Deleted \\Seen $MailKit)\r\n", "dovecot.setflags-unchangedsince.txt")); commands.Add (new ImapReplayCommand ("A00000059 UID SEARCH RETURN (ALL) UID 1:14 OR NEW OR OLD OR ANSWERED OR DELETED OR DRAFT OR FLAGGED OR RECENT OR UNANSWERED OR UNDELETED OR UNDRAFT OR UNFLAGGED OR UNSEEN OR KEYWORD $MailKit UNKEYWORD $MailKit\r\n", "dovecot.search-uids.txt")); commands.Add (new ImapReplayCommand ("A00000060 UID SEARCH RETURN (ALL RELEVANCY COUNT MIN MAX) UID 1:14 LARGER 256 SMALLER 512\r\n", "dovecot.search-uids-options.txt")); commands.Add (new ImapReplayCommand ("A00000061 UID SORT RETURN (ALL) (REVERSE DATE SUBJECT DISPLAYFROM SIZE) US-ASCII OR OR (SENTBEFORE 12-Oct-2016 SENTSINCE 10-Oct-2016) NOT SENTON 11-Oct-2016 OR (BEFORE 12-Oct-2016 SINCE 10-Oct-2016) NOT ON 11-Oct-2016\r\n", "dovecot.sort-by-date.txt")); commands.Add (new ImapReplayCommand ("A00000062 UID SORT RETURN (ALL) (FROM TO CC) US-ASCII UID 1:14 OR BCC xyz OR CC xyz OR FROM xyz OR TO xyz OR SUBJECT xyz OR HEADER Message-Id mimekit.net OR BODY \"This is the message body.\" TEXT message\r\n", "dovecot.sort-by-strings.txt")); commands.Add (new ImapReplayCommand ("A00000063 UID SORT RETURN (ALL RELEVANCY COUNT MIN MAX) (DISPLAYTO) US-ASCII UID 1:14 OLDER 1 YOUNGER 3600\r\n", "dovecot.sort-uids-options.txt")); commands.Add (new ImapReplayCommand ("A00000064 UID SEARCH ALL\r\n", "dovecot.search-raw.txt")); commands.Add (new ImapReplayCommand ("A00000065 UID SORT (REVERSE ARRIVAL) US-ASCII ALL\r\n", "dovecot.sort-raw.txt")); commands.Add (new ImapReplayCommand ("A00000066 UID FETCH 1:* (BODY.PEEK[])\r\n", "dovecot.getstreams1.txt")); commands.Add (new ImapReplayCommand ("A00000067 FETCH 1:3 (UID BODY.PEEK[])\r\n", "dovecot.getstreams1.txt")); commands.Add (new ImapReplayCommand ("A00000068 FETCH 1:* (UID BODY.PEEK[])\r\n", "dovecot.getstreams2.txt")); commands.Add (new ImapReplayCommand ("A00000069 EXPUNGE\r\n", "dovecot.expunge.txt")); commands.Add (new ImapReplayCommand ("A00000070 CLOSE\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000071 NOOP\r\n", "dovecot.noop+alert.txt")); commands.Add (new ImapReplayCommand ("A00000072 LOGOUT\r\n", "gmail.logout.txt")); return commands; } [Test] public void TestDovecot () { var expectedFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.Draft; var expectedPermanentFlags = expectedFlags | MessageFlags.UserDefined; var commands = CreateDovecotCommands (out var internalDates, out var messages, out var flags); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (DovecotInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("DIGEST-MD5"), "Expected SASL DIGEST-MD5 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("CRAM-MD5"), "Expected SASL CRAM-MD5 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("NTLM"), "Expected SASL NTLM auth mechanism"); // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (DovecotAuthenticatedCapabilities)); Assert.That (client.InternationalizationLevel, Is.EqualTo (1), "Expected I18NLEVEL=1"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.OrderedSubject), "Expected THREAD=ORDEREDSUBJECT"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Expected THREAD=REFERENCES"); // TODO: verify CONTEXT=SEARCH var personal = client.GetFolder (client.PersonalNamespaces[0]); Assert.That (client.Inbox.Supports (FolderFeature.AccessRights), Is.False); Assert.That (client.Inbox.Supports (FolderFeature.Annotations), Is.False); Assert.That (client.Inbox.Supports (FolderFeature.Metadata), Is.False); Assert.That (client.Inbox.Supports (FolderFeature.ModSequences), Is.False); // not supported until opened Assert.That (client.Inbox.Supports (FolderFeature.QuickResync), Is.False); // not supported until it is enabled Assert.That (client.Inbox.Supports (FolderFeature.Quotas), Is.False); Assert.That (client.Inbox.Supports (FolderFeature.Sorting), Is.True); Assert.That (client.Inbox.Supports (FolderFeature.Threading), Is.True); Assert.That (client.Inbox.Supports (FolderFeature.UTF8), Is.False); // Make sure these all throw NotSupportedException Assert.Throws (() => client.EnableUTF8 ()); Assert.Throws (() => client.Inbox.GetAccessRights ("smith")); Assert.Throws (() => client.Inbox.GetMyAccessRights ()); var rights = new AccessRights ("lrswida"); Assert.Throws (() => client.Inbox.AddAccessRights ("smith", rights)); Assert.Throws (() => client.Inbox.RemoveAccessRights ("smith", rights)); Assert.Throws (() => client.Inbox.SetAccessRights ("smith", rights)); Assert.Throws (() => client.Inbox.RemoveAccess ("smith")); Assert.Throws (() => client.Inbox.GetQuota ()); Assert.Throws (() => client.Inbox.SetQuota (null, null)); Assert.Throws (() => client.GetMetadata (MetadataTag.PrivateComment)); Assert.Throws (() => client.GetMetadata (new MetadataTag[] { MetadataTag.PrivateComment })); Assert.Throws (() => client.SetMetadata (new MetadataCollection ())); var labels = new string[] { "Label1", "Label2" }; Assert.Throws (() => client.Inbox.AddLabels (UniqueId.MinValue, labels, true)); Assert.Throws (() => client.Inbox.AddLabels (UniqueIdRange.All, labels, true)); Assert.Throws (() => client.Inbox.AddLabels (UniqueIdRange.All, 1, labels, true)); Assert.Throws (() => client.Inbox.AddLabels (0, labels, true)); Assert.Throws (() => client.Inbox.AddLabels (new int[] { 0 }, labels, true)); Assert.Throws (() => client.Inbox.AddLabels (new int[] { 0 }, 1, labels, true)); Assert.Throws (() => client.Inbox.RemoveLabels (UniqueId.MinValue, labels, true)); Assert.Throws (() => client.Inbox.RemoveLabels (UniqueIdRange.All, labels, true)); Assert.Throws (() => client.Inbox.RemoveLabels (UniqueIdRange.All, 1, labels, true)); Assert.Throws (() => client.Inbox.RemoveLabels (0, labels, true)); Assert.Throws (() => client.Inbox.RemoveLabels (new int[] { 0 }, labels, true)); Assert.Throws (() => client.Inbox.RemoveLabels (new int[] { 0 }, 1, labels, true)); Assert.Throws (() => client.Inbox.SetLabels (UniqueId.MinValue, labels, true)); Assert.Throws (() => client.Inbox.SetLabels (UniqueIdRange.All, labels, true)); Assert.Throws (() => client.Inbox.SetLabels (UniqueIdRange.All, 1, labels, true)); Assert.Throws (() => client.Inbox.SetLabels (0, labels, true)); Assert.Throws (() => client.Inbox.SetLabels (new int[] { 0 }, labels, true)); Assert.Throws (() => client.Inbox.SetLabels (new int[] { 0 }, 1, labels, true)); try { client.EnableQuickResync (); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception when enabling QRESYNC: {ex}"); } Assert.That (client.Inbox.Supports (FolderFeature.QuickResync), Is.True); // take advantage of LIST-STATUS to get top-level personal folders... var statusItems = StatusItems.Count | StatusItems.HighestModSeq | StatusItems.Recent | StatusItems.UidNext | StatusItems.UidValidity | StatusItems.Unread; var folders = personal.GetSubfolders (statusItems, false).ToArray (); Assert.That (folders, Has.Length.EqualTo (7), "Expected 7 folders"); var expectedFolderNames = new [] { "Archives", "Drafts", "Junk", "Sent Messages", "Trash", "INBOX", "NIL" }; var expectedUidValidities = new [] { 1436832059, 1436832060, 1436832061, 1436832062, 1436832063, 1436832057, 1436832057 }; var expectedHighestModSeq = new [] { 1, 1, 1, 1, 1, 15, 1 }; var expectedMessages = new [] { 0, 0, 0, 0, 0, 4, 0 }; var expectedUidNext = new [] { 1, 1, 1, 1, 1, 5, 1 }; var expectedRecent = new [] { 0, 0, 0, 0, 0, 0, 0 }; var expectedUnseen = new [] { 0, 0, 0, 0, 0, 0, 0 }; for (int i = 0; i < folders.Length; i++) { Assert.That (folders[i].FullName, Is.EqualTo (expectedFolderNames[i]), "FullName did not match"); Assert.That (folders[i].Name, Is.EqualTo (expectedFolderNames[i]), "Name did not match"); Assert.That (folders[i].UidValidity, Is.EqualTo (expectedUidValidities[i]), "UidValidity did not match"); Assert.That (folders[i].HighestModSeq, Is.EqualTo (expectedHighestModSeq[i]), "HighestModSeq did not match"); Assert.That (folders[i], Has.Count.EqualTo (expectedMessages[i]), "Count did not match"); Assert.That (folders[i].Recent, Is.EqualTo (expectedRecent[i]), "Recent did not match"); Assert.That (folders[i].Unread, Is.EqualTo (expectedUnseen[i]), "Unread did not match"); } var unitTests = personal.Create ("UnitTests", false); Assert.That (unitTests.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren), "Unexpected UnitTests folder attributes"); var folder = unitTests.Create ("Messages", true); Assert.That (folder.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren), "Unexpected UnitTests.Messages folder attributes"); //Assert.That (unitTests.Attributes, Is.EqualTo (FolderAttributes.HasChildren), "Expected UnitTests Attributes to be updated"); // Use MULTIAPPEND to append some test messages var appended = folder.Append (messages, flags, internalDates); Assert.That (appended, Has.Count.EqualTo (8), "Unexpected number of messages appended"); foreach (var message in messages) message.Dispose (); // SELECT the folder so that we can test some stuff var access = folder.Open (FolderAccess.ReadWrite); Assert.That (folder.Supports (FolderFeature.ModSequences), Is.True); Assert.That (folder.PermanentFlags, Is.EqualTo (expectedPermanentFlags), "UnitTests.Messages PERMANENTFLAGS"); Assert.That (folder.AcceptedFlags, Is.EqualTo (expectedFlags), "UnitTests.Messages FLAGS"); Assert.That (folder, Has.Count.EqualTo (8), "UnitTests.Messages EXISTS"); Assert.That (folder.Recent, Is.EqualTo (8), "UnitTests.Messages RECENT"); Assert.That (folder.FirstUnread, Is.EqualTo (0), "UnitTests.Messages UNSEEN"); Assert.That (folder.UidValidity, Is.EqualTo (1436832084U), "UnitTests.Messages UIDVALIDITY"); Assert.That (folder.UidNext.Value.Id, Is.EqualTo (9), "UnitTests.Messages UIDNEXT"); Assert.That (folder.HighestModSeq, Is.EqualTo (2UL), "UnitTests.Messages HIGHESTMODSEQ"); Assert.That (access, Is.EqualTo (FolderAccess.ReadWrite), "Expected UnitTests.Messages to be opened in READ-WRITE mode"); // Keep track of various folder events var flagsChanged = new List (); var modSeqChanged = new List (); var vanished = new List (); bool recentChanged = false; folder.MessageFlagsChanged += (sender, e) => { flagsChanged.Add (e); }; folder.ModSeqChanged += (sender, e) => { modSeqChanged.Add (e); }; folder.MessagesVanished += (sender, e) => { vanished.Add (e); }; folder.RecentChanged += (sender, e) => { recentChanged = true; }; // Keep track of UIDVALIDITY and HIGHESTMODSEQ values for our QRESYNC test later var highestModSeq = folder.HighestModSeq; var uidValidity = folder.UidValidity; // Make some FLAGS changes to our messages so we can test QRESYNC folder.AddFlags (appended, MessageFlags.Seen, true); Assert.That (flagsChanged, Is.Empty, "Unexpected number of FlagsChanged events"); Assert.That (modSeqChanged, Has.Count.EqualTo (8), "Unexpected number of ModSeqChanged events"); for (int i = 0; i < modSeqChanged.Count; i++) { Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected modSeqChanged[{i}].Index"); Assert.That (modSeqChanged[i].UniqueId.Value.Id, Is.EqualTo (i + 1), $"Unexpected modSeqChanged[{i}].UniqueId"); Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (3), $"Unexpected modSeqChanged[{i}].ModSeq"); } Assert.That (recentChanged, Is.False, "Unexpected RecentChanged event"); modSeqChanged.Clear (); flagsChanged.Clear (); var answered = new UniqueIdSet (SortOrder.Ascending) { appended[0], // A appended[1], // B appended[2] // C }; folder.AddFlags (answered, MessageFlags.Answered, true); Assert.That (flagsChanged, Is.Empty, "Unexpected number of FlagsChanged events"); Assert.That (modSeqChanged, Has.Count.EqualTo (3), "Unexpected number of ModSeqChanged events"); for (int i = 0; i < modSeqChanged.Count; i++) { Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected modSeqChanged[{i}].Index"); Assert.That (modSeqChanged[i].UniqueId.Value.Id, Is.EqualTo (i + 1), $"Unexpected modSeqChanged[{i}].UniqueId"); Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (4), $"Unexpected modSeqChanged[{i}].ModSeq"); } Assert.That (recentChanged, Is.False, "Unexpected RecentChanged event"); modSeqChanged.Clear (); flagsChanged.Clear (); // Delete some messages so we can test that QRESYNC emits some MessageVanished events // both now *and* when we use QRESYNC to re-open the folder var deleted = new UniqueIdSet (SortOrder.Ascending) { appended[7] // H }; folder.AddFlags (deleted, MessageFlags.Deleted, true); Assert.That (flagsChanged, Is.Empty, "Unexpected number of FlagsChanged events"); Assert.That (modSeqChanged, Has.Count.EqualTo (1), "Unexpected number of ModSeqChanged events"); Assert.That (modSeqChanged[0].Index, Is.EqualTo (7), $"Unexpected modSeqChanged[{0}].Index"); Assert.That (modSeqChanged[0].UniqueId.Value.Id, Is.EqualTo (8), $"Unexpected modSeqChanged[{0}].UniqueId"); Assert.That (modSeqChanged[0].ModSeq, Is.EqualTo (5), $"Unexpected modSeqChanged[{0}].ModSeq"); Assert.That (recentChanged, Is.False, "Unexpected RecentChanged event"); modSeqChanged.Clear (); flagsChanged.Clear (); folder.Expunge (deleted); Assert.That (vanished, Has.Count.EqualTo (1), "Expected MessagesVanished event"); Assert.That (vanished[0].UniqueIds, Has.Count.EqualTo (1), "Unexpected number of messages vanished"); Assert.That (vanished[0].UniqueIds[0].Id, Is.EqualTo (8), "Unexpected UID for vanished message"); Assert.That (vanished[0].Earlier, Is.False, "Expected EARLIER to be false"); Assert.That (recentChanged, Is.True, "Expected RecentChanged event"); recentChanged = false; vanished.Clear (); Assert.That (folder.Supports (FolderFeature.Threading), Is.True, "Supports threading"); Assert.That (folder.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Supports threading by References"); Assert.That (folder.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.OrderedSubject), "Supports threading by OrderedSubject"); // Verify that THREAD works correctly var threaded = folder.Thread (ThreadingAlgorithm.References, SearchQuery.All); Assert.That (threaded, Has.Count.EqualTo (2), "Unexpected number of root nodes in threaded results"); threaded = folder.Thread (UniqueIdRange.All, ThreadingAlgorithm.OrderedSubject, SearchQuery.All); Assert.That (threaded, Has.Count.EqualTo (7), "Unexpected number of root nodes in threaded results"); // UNSELECT the folder so we can re-open it using QRESYNC folder.Close (); // Use QRESYNC to get the changes since last time we opened the folder Assert.That (folder.Supports (FolderFeature.QuickResync), Is.True, "Supports QRESYNC"); access = folder.Open (FolderAccess.ReadWrite, uidValidity, highestModSeq, appended); Assert.That (access, Is.EqualTo (FolderAccess.ReadWrite), "Expected UnitTests.Messages to be opened in READ-WRITE mode"); Assert.That (flagsChanged, Has.Count.EqualTo (7), "Unexpected number of MessageFlagsChanged events"); Assert.That (modSeqChanged, Has.Count.EqualTo (7), "Unexpected number of ModSeqChanged events"); for (int i = 0; i < flagsChanged.Count; i++) { var messageFlags = MessageFlags.Seen | MessageFlags.Draft; if (i < 3) messageFlags |= MessageFlags.Answered; Assert.That (flagsChanged[i].Index, Is.EqualTo (i), $"Unexpected value for flagsChanged[{i}].Index"); Assert.That (flagsChanged[i].UniqueId.Value.Id, Is.EqualTo ((uint) (i + 1)), $"Unexpected value for flagsChanged[{i}].UniqueId"); Assert.That (flagsChanged[i].Flags, Is.EqualTo (messageFlags), $"Unexpected value for flagsChanged[{i}].Flags"); Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected value for modSeqChanged[{i}].Index"); if (i < 3) Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (4), $"Unexpected value for modSeqChanged[{i}].ModSeq"); else Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (3), $"Unexpected value for modSeqChanged[{i}].ModSeq"); } modSeqChanged.Clear (); flagsChanged.Clear (); Assert.That (vanished, Has.Count.EqualTo (1), "Unexpected number of MessagesVanished events"); Assert.That (vanished[0].Earlier, Is.True, "Expected VANISHED EARLIER"); Assert.That (vanished[0].UniqueIds, Has.Count.EqualTo (1), "Unexpected number of messages vanished"); Assert.That (vanished[0].UniqueIds[0].Id, Is.EqualTo (8), "Unexpected UID for vanished message"); vanished.Clear (); Assert.Throws (() => folder.Search (SearchQuery.GMailMessageId (1))); Assert.Throws (() => folder.Search (SearchQuery.GMailThreadId (1))); Assert.Throws (() => folder.Search (SearchQuery.HasGMailLabel ("Custom Label"))); Assert.Throws (() => folder.Search (SearchQuery.GMailRawSearch ("has:attachment in:unread"))); Assert.Throws (() => folder.Search (SearchQuery.Fuzzy (SearchQuery.SubjectContains ("some fuzzy text")))); Assert.Throws (() => folder.Search (SearchQuery.Filter (new MetadataTag ("/private/filters/values/saved-search")))); Assert.Throws (() => folder.Search (SearchQuery.Filter ("saved-search"))); Assert.Throws (() => folder.Search (SearchQuery.SaveDateSupported)); Assert.Throws (() => folder.Search (SearchQuery.SavedBefore (DateTime.Now))); Assert.Throws (() => folder.Search (SearchQuery.SavedOn (DateTime.Now))); Assert.Throws (() => folder.Search (SearchQuery.SavedSince (DateTime.Now))); // Use SEARCH and FETCH to get the same info var searchOptions = SearchOptions.All | SearchOptions.Count | SearchOptions.Min | SearchOptions.Max | SearchOptions.Relevancy; var changed = folder.Search (searchOptions, SearchQuery.ChangedSince (highestModSeq)); Assert.That (changed.UniqueIds, Has.Count.EqualTo (7), "Unexpected number of UIDs"); Assert.That (changed.Relevancy, Has.Count.EqualTo (changed.Count), "Unexpected number of relevancy scores"); Assert.That (changed.ModSeq.HasValue, Is.True, "Expected the ModSeq property to be set"); Assert.That (changed.ModSeq.Value, Is.EqualTo (4), "Unexpected ModSeq value"); Assert.That (changed.Min.Value.Id, Is.EqualTo (1), "Unexpected Min"); Assert.That (changed.Max.Value.Id, Is.EqualTo (7), "Unexpected Max"); Assert.That (changed.Count, Is.EqualTo (7), "Unexpected Count"); var fetched = folder.Fetch (changed.UniqueIds, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq); Assert.That (fetched, Has.Count.EqualTo (7), "Unexpected number of messages fetched"); for (int i = 0; i < fetched.Count; i++) { Assert.That (fetched[i].Index, Is.EqualTo (i), "Unexpected Index"); Assert.That (fetched[i].UniqueId.Id, Is.EqualTo (i + 1), "Unexpected UniqueId"); } // or... we could just use a single UID FETCH command like so: fetched = folder.Fetch (UniqueIdRange.All, highestModSeq, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq); for (int i = 0; i < fetched.Count; i++) { Assert.That (fetched[i].Index, Is.EqualTo (i), "Unexpected Index"); Assert.That (fetched[i].UniqueId.Id, Is.EqualTo (i + 1), "Unexpected UniqueId"); } Assert.That (fetched, Has.Count.EqualTo (7), "Unexpected number of messages fetched"); Assert.That (vanished, Has.Count.EqualTo (1), "Unexpected number of MessagesVanished events"); Assert.That (vanished[0].Earlier, Is.True, "Expected VANISHED EARLIER"); Assert.That (vanished[0].UniqueIds, Has.Count.EqualTo (1), "Unexpected number of messages vanished"); Assert.That (vanished[0].UniqueIds[0].Id, Is.EqualTo (8), "Unexpected UID for vanished message"); vanished.Clear (); // Use SORT to order by reverse arrival order var orderBy = new OrderBy[] { new OrderBy (OrderByType.Arrival, SortOrder.Descending) }; var sorted = folder.Sort (searchOptions, SearchQuery.All, orderBy); Assert.That (sorted.UniqueIds, Has.Count.EqualTo (7), "Unexpected number of UIDs"); Assert.That (sorted.Relevancy, Has.Count.EqualTo (sorted.Count), "Unexpected number of relevancy scores"); for (int i = 0; i < sorted.UniqueIds.Count; i++) Assert.That (sorted.UniqueIds[i].Id, Is.EqualTo (7 - i), $"Unexpected value for UniqueId[{i}]"); Assert.That (sorted.ModSeq.HasValue, Is.False, "Expected the ModSeq property to be null"); Assert.That (sorted.Min.Value.Id, Is.EqualTo (7), "Unexpected Min"); Assert.That (sorted.Max.Value.Id, Is.EqualTo (1), "Unexpected Max"); Assert.That (sorted.Count, Is.EqualTo (7), "Unexpected Count"); // Verify that optimizing NOT queries works correctly var uids = folder.Search (SearchQuery.Not (SearchQuery.Deleted).And (SearchQuery.Not (SearchQuery.NotSeen))); Assert.That (uids, Has.Count.EqualTo (7), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); // Create a Destination folder to use for copying/moving messages to var destination = (ImapFolder) unitTests.Create ("Destination", true); Assert.That (destination.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren), "Unexpected UnitTests.Destination folder attributes"); // COPY messages to the Destination folder var copied = folder.CopyTo (uids, destination); Assert.That (copied.Source, Has.Count.EqualTo (uids.Count), "Unexpected Source.Count"); Assert.That (copied.Destination, Has.Count.EqualTo (uids.Count), "Unexpected Destination.Count"); // MOVE messages to the Destination folder var moved = folder.MoveTo (uids, destination); Assert.That (copied.Source, Has.Count.EqualTo (uids.Count), "Unexpected Source.Count"); Assert.That (copied.Destination, Has.Count.EqualTo (uids.Count), "Unexpected Destination.Count"); Assert.That (vanished, Has.Count.EqualTo (1), "Expected VANISHED event"); vanished.Clear (); destination.Status (statusItems); Assert.That (destination.UidValidity, Is.EqualTo (moved.Destination[0].Validity), "Unexpected UIDVALIDITY"); destination.MessageFlagsChanged += (sender, e) => { flagsChanged.Add (e); }; destination.ModSeqChanged += (sender, e) => { modSeqChanged.Add (e); }; destination.MessagesVanished += (sender, e) => { vanished.Add (e); }; destination.RecentChanged += (sender, e) => { recentChanged = true; }; destination.Open (FolderAccess.ReadWrite); Assert.That (access, Is.EqualTo (FolderAccess.ReadWrite), "Expected UnitTests.Destination to be opened in READ-WRITE mode"); var fetchHeaders = new HashSet { HeaderId.References, HeaderId.XMailer }; var indexes = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; // Fetch + modseq fetched = destination.Fetch (UniqueIdRange.All, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = destination.Fetch (0, -1, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = destination.Fetch (indexes, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = destination.Fetch (0, -1, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = destination.Fetch (indexes, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); // Fetch fetched = destination.Fetch (UniqueIdRange.All, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = destination.Fetch (0, -1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = destination.Fetch (indexes, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = destination.Fetch (0, -1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = destination.Fetch (indexes, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); uids = new UniqueIdSet (SortOrder.Ascending); for (int i = 0; i < fetched.Count; i++) { Assert.That (fetched[i].Index, Is.EqualTo (i), "Unexpected Index"); Assert.That (fetched[i].UniqueId.Id, Is.EqualTo (i + 1), "Unexpected UniqueId"); uids.Add (fetched[i].UniqueId); } using (var entity = destination.GetBodyPart (fetched[0].UniqueId, fetched[0].TextBody)) Assert.That (entity, Is.InstanceOf ()); using (var entity = destination.GetBodyPart (fetched[0].Index, fetched[0].TextBody)) Assert.That (entity, Is.InstanceOf ()); using (var entity = destination.GetBodyPart (fetched[1].UniqueId, fetched[1].TextBody)) Assert.That (entity, Is.InstanceOf ()); using (var entity = destination.GetBodyPart (fetched[1].Index, fetched[1].TextBody)) Assert.That (entity, Is.InstanceOf ()); var headers = destination.GetHeaders (fetched[0].UniqueId); Assert.That (headers[HeaderId.From], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match From header"); Assert.That (headers[HeaderId.Date], Is.EqualTo ("Sun, 02 Oct 2016 17:56:45 -0400"), "GetHeaders(UniqueId) failed to match Date header"); Assert.That (headers[HeaderId.Subject], Is.EqualTo ("A"), "GetHeaders(UniqueId) failed to match Subject header"); Assert.That (headers[HeaderId.MessageId], Is.EqualTo (""), "GetHeaders(UniqueId) failed to match Message-Id header"); Assert.That (headers[HeaderId.To], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match To header"); Assert.That (headers[HeaderId.MimeVersion], Is.EqualTo ("1.0"), "GetHeaders(UniqueId) failed to match MIME-Version header"); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = destination.GetHeaders (fetched[0].Index); Assert.That (headers[HeaderId.From], Is.EqualTo ("Unit Tests "), "GetHeaders(int) failed to match From header"); Assert.That (headers[HeaderId.Date], Is.EqualTo ("Sun, 02 Oct 2016 17:56:45 -0400"), "GetHeaders(UniqueId) failed to match Date header"); Assert.That (headers[HeaderId.Subject], Is.EqualTo ("A"), "GetHeaders(UniqueId) failed to match Subject header"); Assert.That (headers[HeaderId.MessageId], Is.EqualTo (""), "GetHeaders(UniqueId) failed to match Message-Id header"); Assert.That (headers[HeaderId.To], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match To header"); Assert.That (headers[HeaderId.MimeVersion], Is.EqualTo ("1.0"), "GetHeaders(UniqueId) failed to match MIME-Version header"); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = destination.GetHeaders (fetched[0].UniqueId, fetched[0].TextBody); Assert.That (headers[HeaderId.From], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId, BodyPart) failed to match From header"); Assert.That (headers[HeaderId.Date], Is.EqualTo ("Sun, 02 Oct 2016 17:56:45 -0400"), "GetHeaders(UniqueId) failed to match Date header"); Assert.That (headers[HeaderId.Subject], Is.EqualTo ("A"), "GetHeaders(UniqueId) failed to match Subject header"); Assert.That (headers[HeaderId.MessageId], Is.EqualTo (""), "GetHeaders(UniqueId) failed to match Message-Id header"); Assert.That (headers[HeaderId.To], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match To header"); Assert.That (headers[HeaderId.MimeVersion], Is.EqualTo ("1.0"), "GetHeaders(UniqueId) failed to match MIME-Version header"); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = destination.GetHeaders (fetched[0].Index, fetched[0].TextBody); Assert.That (headers[HeaderId.From], Is.EqualTo ("Unit Tests "), "GetHeaders(int, BodyPart) failed to match From header"); Assert.That (headers[HeaderId.Date], Is.EqualTo ("Sun, 02 Oct 2016 17:56:45 -0400"), "GetHeaders(UniqueId) failed to match Date header"); Assert.That (headers[HeaderId.Subject], Is.EqualTo ("A"), "GetHeaders(UniqueId) failed to match Subject header"); Assert.That (headers[HeaderId.MessageId], Is.EqualTo (""), "GetHeaders(UniqueId) failed to match Message-Id header"); Assert.That (headers[HeaderId.To], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match To header"); Assert.That (headers[HeaderId.MimeVersion], Is.EqualTo ("1.0"), "GetHeaders(UniqueId) failed to match MIME-Version header"); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = destination.GetHeaders (fetched[1].UniqueId, fetched[1].TextBody); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = destination.GetHeaders (fetched[1].Index, fetched[1].TextBody); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); using (var stream = destination.GetStream (fetched[0].UniqueId, 128, 64)) { Assert.That (stream.Length, Is.EqualTo (64), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("nit Tests \r\nMIME-Version: 1.0\r\nContent-T")); } using (var stream = destination.GetStream (fetched[0].UniqueId, "", 128, 64)) { Assert.That (stream.Length, Is.EqualTo (64), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("nit Tests \r\nMIME-Version: 1.0\r\nContent-T")); } using (var stream = destination.GetStream (fetched[0].Index, 128, 64)) { Assert.That (stream.Length, Is.EqualTo (64), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("nit Tests \r\nMIME-Version: 1.0\r\nContent-T")); } using (var stream = destination.GetStream (fetched[0].Index, "", 128, 64)) { Assert.That (stream.Length, Is.EqualTo (64), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("nit Tests \r\nMIME-Version: 1.0\r\nContent-T")); } using (var stream = destination.GetStream (fetched[0].UniqueId, "HEADER.FIELDS (MIME-VERSION CONTENT-TYPE)")) { Assert.That (stream.Length, Is.EqualTo (62), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("MIME-Version: 1.0\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n")); } using (var stream = destination.GetStream (fetched[0].Index, "HEADER.FIELDS (MIME-VERSION CONTENT-TYPE)")) { Assert.That (stream.Length, Is.EqualTo (62), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("MIME-Version: 1.0\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n")); } var custom = new HashSet { "$MailKit" }; var unchanged1 = destination.AddFlags (uids, destination.HighestModSeq, MessageFlags.Deleted, custom, true); Assert.That (modSeqChanged, Has.Count.EqualTo (14), "Unexpected number of ModSeqChanged events"); Assert.That (destination.HighestModSeq, Is.EqualTo (5)); for (int i = 0; i < modSeqChanged.Count; i++) { Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected value for modSeqChanged[{i}].Index"); Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (5), $"Unexpected value for modSeqChanged[{i}].ModSeq"); } Assert.That (unchanged1, Has.Count.EqualTo (2), "[MODIFIED uid-set]"); Assert.That (unchanged1[0].Id, Is.EqualTo (7), "unchanged uids[0]"); Assert.That (unchanged1[1].Id, Is.EqualTo (9), "unchanged uids[1]"); modSeqChanged.Clear (); var unchanged2 = destination.SetFlags (new int[] { 0, 1, 2, 3, 4, 5, 6 }, destination.HighestModSeq, MessageFlags.Seen | MessageFlags.Deleted, custom, true); Assert.That (modSeqChanged, Has.Count.EqualTo (7), "Unexpected number of ModSeqChanged events"); Assert.That (destination.HighestModSeq, Is.EqualTo (6)); for (int i = 0; i < modSeqChanged.Count; i++) { Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected value for modSeqChanged[{i}].Index"); Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (6), $"Unexpected value for modSeqChanged[{i}].ModSeq"); } Assert.That (unchanged2, Has.Count.EqualTo (2), "[MODIFIED seq-set]"); Assert.That (unchanged2[0], Is.EqualTo (6), "unchanged indexes[0]"); Assert.That (unchanged2[1], Is.EqualTo (8), "unchanged indexes[1]"); modSeqChanged.Clear (); var results = destination.Search (uids, SearchQuery.New.Or (SearchQuery.Old.Or (SearchQuery.Answered.Or (SearchQuery.Deleted.Or (SearchQuery.Draft.Or (SearchQuery.Flagged.Or (SearchQuery.Recent.Or (SearchQuery.NotAnswered.Or (SearchQuery.NotDeleted.Or (SearchQuery.NotDraft.Or (SearchQuery.NotFlagged.Or (SearchQuery.NotSeen.Or (SearchQuery.HasKeyword ("$MailKit").Or (SearchQuery.NotKeyword ("$MailKit"))))))))))))))); Assert.That (results, Has.Count.EqualTo (14), "Unexpected number of UIDs"); var matches = destination.Search (searchOptions, uids, SearchQuery.LargerThan (256).And (SearchQuery.SmallerThan (512))); var expectedMatchedUids = new uint[] { 2, 3, 4, 5, 6, 9, 10, 11, 12, 13 }; Assert.That (matches.Count, Is.EqualTo (10), "Unexpected COUNT"); Assert.That (matches.Max.Value.Id, Is.EqualTo (13), "Unexpected MAX"); Assert.That (matches.Min.Value.Id, Is.EqualTo (2), "Unexpected MIN"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (10), "Unexpected number of UIDs"); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (expectedMatchedUids[i])); Assert.That (matches.Relevancy, Has.Count.EqualTo (matches.Count), "Unexpected number of relevancy scores"); orderBy = new OrderBy[] { OrderBy.ReverseDate, OrderBy.Subject, OrderBy.DisplayFrom, OrderBy.Size }; var sentDateQuery = SearchQuery.Or (SearchQuery.And (SearchQuery.SentBefore (new DateTime (2016, 10, 12)), SearchQuery.SentSince (new DateTime (2016, 10, 10))), SearchQuery.Not (SearchQuery.SentOn (new DateTime (2016, 10, 11)))); var deliveredDateQuery = SearchQuery.Or (SearchQuery.And (SearchQuery.DeliveredBefore (new DateTime (2016, 10, 12)), SearchQuery.DeliveredAfter (new DateTime (2016, 10, 10))), SearchQuery.Not (SearchQuery.DeliveredOn (new DateTime (2016, 10, 11)))); results = destination.Sort (sentDateQuery.Or (deliveredDateQuery), orderBy); var expectedSortByDateResults = new uint[] { 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8 }; Assert.That (results, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < results.Count; i++) Assert.That (results[i].Id, Is.EqualTo (expectedSortByDateResults[i])); var stringQuery = SearchQuery.BccContains ("xyz").Or (SearchQuery.CcContains ("xyz").Or (SearchQuery.FromContains ("xyz").Or (SearchQuery.ToContains ("xyz").Or (SearchQuery.SubjectContains ("xyz").Or (SearchQuery.HeaderContains ("Message-Id", "mimekit.net").Or (SearchQuery.BodyContains ("This is the message body.").Or (SearchQuery.MessageContains ("message")))))))); orderBy = new OrderBy[] { OrderBy.From, OrderBy.To, OrderBy.Cc }; results = destination.Sort (uids, stringQuery, orderBy); Assert.That (results, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < results.Count; i++) Assert.That (results[i].Id, Is.EqualTo (i + 1)); orderBy = new OrderBy[] { OrderBy.DisplayTo }; matches = destination.Sort (searchOptions, uids, SearchQuery.OlderThan (1).And (SearchQuery.YoungerThan (3600)), orderBy); Assert.That (matches.Count, Is.EqualTo (14), "Unexpected COUNT"); Assert.That (matches.Max.Value.Id, Is.EqualTo (14), "Unexpected MAX"); Assert.That (matches.Min.Value.Id, Is.EqualTo (1), "Unexpected MIN"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (i + 1)); Assert.That (matches.Relevancy, Has.Count.EqualTo (matches.Count), "Unexpected number of relevancy scores"); client.Capabilities &= ~ImapCapabilities.ESearch; matches = ((ImapFolder) destination).Search ("ALL"); Assert.That (matches.Max.HasValue, Is.True, "MAX should always be set"); Assert.That (matches.Max.Value.Id, Is.EqualTo (14), "Unexpected MAX value"); Assert.That (matches.Min.HasValue, Is.True, "MIN should always be set"); Assert.That (matches.Min.Value.Id, Is.EqualTo (1), "Unexpected MIN value"); Assert.That (matches.Count, Is.EqualTo (14), "COUNT should always be set"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (14)); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (i + 1)); client.Capabilities &= ~ImapCapabilities.ESort; matches = ((ImapFolder) destination).Sort ("(REVERSE ARRIVAL) US-ASCII ALL"); Assert.That (matches.Max.HasValue, Is.True, "MAX should always be set"); Assert.That (matches.Max.Value.Id, Is.EqualTo (14), "Unexpected MAX value"); Assert.That (matches.Min.HasValue, Is.True, "MIN should always be set"); Assert.That (matches.Min.Value.Id, Is.EqualTo (1), "Unexpected MIN value"); Assert.That (matches.Count, Is.EqualTo (14), "COUNT should always be set"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (14)); var expectedSortByReverseArrivalResults = new uint[] { 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8 }; for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (expectedSortByReverseArrivalResults[i])); destination.GetStreams (UniqueIdRange.All, GetStreamsCallback); destination.GetStreams (new int[] { 0, 1, 2 }, GetStreamsCallback); destination.GetStreams (0, -1, GetStreamsCallback); destination.Expunge (); Assert.That (destination.HighestModSeq, Is.EqualTo (7)); Assert.That (vanished, Has.Count.EqualTo (1), "Unexpected number of Vanished events"); Assert.That (vanished[0].UniqueIds, Has.Count.EqualTo (14), "Unexpected number of UIDs in Vanished event"); for (int i = 0; i < vanished[0].UniqueIds.Count; i++) Assert.That (vanished[0].UniqueIds[i].Id, Is.EqualTo (i + 1)); Assert.That (vanished[0].Earlier, Is.False, "Unexpected value for Earlier"); vanished.Clear (); destination.Close (true); int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo ("System shutdown in 10 minutes")); alerts++; }; client.NoOp (); Assert.That (alerts, Is.EqualTo (1), "Alert event failed to fire."); client.Disconnect (true); } } [Test] public async Task TestDovecotAsync () { var expectedFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.Draft; var expectedPermanentFlags = expectedFlags | MessageFlags.UserDefined; var commands = CreateDovecotCommands (out var internalDates, out var messages, out var flags); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (DovecotInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("DIGEST-MD5"), "Expected SASL DIGEST-MD5 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("CRAM-MD5"), "Expected SASL CRAM-MD5 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("NTLM"), "Expected SASL NTLM auth mechanism"); // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (DovecotAuthenticatedCapabilities)); Assert.That (client.InternationalizationLevel, Is.EqualTo (1), "Expected I18NLEVEL=1"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.OrderedSubject), "Expected THREAD=ORDEREDSUBJECT"); Assert.That (client.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Expected THREAD=REFERENCES"); // TODO: verify CONTEXT=SEARCH var personal = client.GetFolder (client.PersonalNamespaces[0]); // Make sure these all throw NotSupportedException Assert.ThrowsAsync (async () => await client.EnableUTF8Async ()); Assert.ThrowsAsync (async () => await client.Inbox.GetAccessRightsAsync ("smith")); Assert.ThrowsAsync (async () => await client.Inbox.GetMyAccessRightsAsync ()); var rights = new AccessRights ("lrswida"); Assert.ThrowsAsync (async () => await client.Inbox.AddAccessRightsAsync ("smith", rights)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveAccessRightsAsync ("smith", rights)); Assert.ThrowsAsync (async () => await client.Inbox.SetAccessRightsAsync ("smith", rights)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveAccessAsync ("smith")); Assert.ThrowsAsync (async () => await client.Inbox.GetQuotaAsync ()); Assert.ThrowsAsync (async () => await client.Inbox.SetQuotaAsync (null, null)); Assert.ThrowsAsync (async () => await client.GetMetadataAsync (MetadataTag.PrivateComment)); Assert.ThrowsAsync (async () => await client.GetMetadataAsync (new MetadataTag[] { MetadataTag.PrivateComment })); Assert.ThrowsAsync (async () => await client.SetMetadataAsync (new MetadataCollection ())); var labels = new string[] { "Label1", "Label2" }; Assert.ThrowsAsync (async () => await client.Inbox.AddLabelsAsync (UniqueId.MinValue, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.AddLabelsAsync (UniqueIdRange.All, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.AddLabelsAsync (UniqueIdRange.All, 1, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.AddLabelsAsync (0, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.AddLabelsAsync (new int[] { 0 }, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.AddLabelsAsync (new int[] { 0 }, 1, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveLabelsAsync (UniqueId.MinValue, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveLabelsAsync (UniqueIdRange.All, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveLabelsAsync (UniqueIdRange.All, 1, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveLabelsAsync (0, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveLabelsAsync (new int[] { 0 }, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveLabelsAsync (new int[] { 0 }, 1, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.SetLabelsAsync (UniqueId.MinValue, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.SetLabelsAsync (UniqueIdRange.All, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.SetLabelsAsync (UniqueIdRange.All, 1, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.SetLabelsAsync (0, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.SetLabelsAsync (new int[] { 0 }, labels, true)); Assert.ThrowsAsync (async () => await client.Inbox.SetLabelsAsync (new int[] { 0 }, 1, labels, true)); try { await client.EnableQuickResyncAsync (); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception when enabling QRESYNC: {ex}"); } // take advantage of LIST-STATUS to get top-level personal folders... var statusItems = StatusItems.Count | StatusItems.HighestModSeq | StatusItems.Recent | StatusItems.UidNext | StatusItems.UidValidity | StatusItems.Unread; var folders = (await personal.GetSubfoldersAsync (statusItems, false)).ToArray (); Assert.That (folders, Has.Length.EqualTo (7), "Expected 7 folders"); var expectedFolderNames = new [] { "Archives", "Drafts", "Junk", "Sent Messages", "Trash", "INBOX", "NIL" }; var expectedUidValidities = new [] { 1436832059, 1436832060, 1436832061, 1436832062, 1436832063, 1436832057, 1436832057 }; var expectedHighestModSeq = new [] { 1, 1, 1, 1, 1, 15, 1 }; var expectedMessages = new [] { 0, 0, 0, 0, 0, 4, 0 }; var expectedUidNext = new [] { 1, 1, 1, 1, 1, 5, 1 }; var expectedRecent = new [] { 0, 0, 0, 0, 0, 0, 0 }; var expectedUnseen = new [] { 0, 0, 0, 0, 0, 0, 0 }; for (int i = 0; i < folders.Length; i++) { Assert.That (folders[i].FullName, Is.EqualTo (expectedFolderNames[i]), "FullName did not match"); Assert.That (folders[i].Name, Is.EqualTo (expectedFolderNames[i]), "Name did not match"); Assert.That (folders[i].UidValidity, Is.EqualTo (expectedUidValidities[i]), "UidValidity did not match"); Assert.That (folders[i].HighestModSeq, Is.EqualTo (expectedHighestModSeq[i]), "HighestModSeq did not match"); Assert.That (folders[i], Has.Count.EqualTo (expectedMessages[i]), "Count did not match"); Assert.That (folders[i].Recent, Is.EqualTo (expectedRecent[i]), "Recent did not match"); Assert.That (folders[i].Unread, Is.EqualTo (expectedUnseen[i]), "Unread did not match"); } var unitTests = await personal.CreateAsync ("UnitTests", false); Assert.That (unitTests.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren), "Unexpected UnitTests folder attributes"); var folder = await unitTests.CreateAsync ("Messages", true); Assert.That (folder.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren), "Unexpected UnitTests.Messages folder attributes"); //Assert.That (unitTests.Attributes, Is.EqualTo (FolderAttributes.HasChildren), "Expected UnitTests Attributes to be updated"); // Use MULTIAPPEND to append some test messages var appended = await folder.AppendAsync (messages, flags, internalDates); Assert.That (appended, Has.Count.EqualTo (8), "Unexpected number of messages appended"); foreach (var message in messages) message.Dispose (); // SELECT the folder so that we can test some stuff var access = await folder.OpenAsync (FolderAccess.ReadWrite); Assert.That (folder.PermanentFlags, Is.EqualTo (expectedPermanentFlags), "UnitTests.Messages PERMANENTFLAGS"); Assert.That (folder.AcceptedFlags, Is.EqualTo (expectedFlags), "UnitTests.Messages FLAGS"); Assert.That (folder, Has.Count.EqualTo (8), "UnitTests.Messages EXISTS"); Assert.That (folder.Recent, Is.EqualTo (8), "UnitTests.Messages RECENT"); Assert.That (folder.FirstUnread, Is.EqualTo (0), "UnitTests.Messages UNSEEN"); Assert.That (folder.UidValidity, Is.EqualTo (1436832084U), "UnitTests.Messages UIDVALIDITY"); Assert.That (folder.UidNext.Value.Id, Is.EqualTo (9), "UnitTests.Messages UIDNEXT"); Assert.That (folder.HighestModSeq, Is.EqualTo (2UL), "UnitTests.Messages HIGHESTMODSEQ"); Assert.That (access, Is.EqualTo (FolderAccess.ReadWrite), "Expected UnitTests.Messages to be opened in READ-WRITE mode"); // Keep track of various folder events var flagsChanged = new List (); var modSeqChanged = new List (); var vanished = new List (); bool recentChanged = false; folder.MessageFlagsChanged += (sender, e) => { flagsChanged.Add (e); }; folder.ModSeqChanged += (sender, e) => { modSeqChanged.Add (e); }; folder.MessagesVanished += (sender, e) => { vanished.Add (e); }; folder.RecentChanged += (sender, e) => { recentChanged = true; }; // Keep track of UIDVALIDITY and HIGHESTMODSEQ values for our QRESYNC test later var highestModSeq = folder.HighestModSeq; var uidValidity = folder.UidValidity; // Make some FLAGS changes to our messages so we can test QRESYNC await folder.AddFlagsAsync (appended, MessageFlags.Seen, true); Assert.That (flagsChanged, Is.Empty, "Unexpected number of FlagsChanged events"); Assert.That (modSeqChanged, Has.Count.EqualTo (8), "Unexpected number of ModSeqChanged events"); for (int i = 0; i < modSeqChanged.Count; i++) { Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected modSeqChanged[{i}].Index"); Assert.That (modSeqChanged[i].UniqueId.Value.Id, Is.EqualTo (i + 1), $"Unexpected modSeqChanged[{i}].UniqueId"); Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (3), $"Unexpected modSeqChanged[{i}].ModSeq"); } Assert.That (recentChanged, Is.False, "Unexpected RecentChanged event"); modSeqChanged.Clear (); flagsChanged.Clear (); var answered = new UniqueIdSet (SortOrder.Ascending) { appended[0], // A appended[1], // B appended[2] // C }; await folder.AddFlagsAsync (answered, MessageFlags.Answered, true); Assert.That (flagsChanged, Is.Empty, "Unexpected number of FlagsChanged events"); Assert.That (modSeqChanged, Has.Count.EqualTo (3), "Unexpected number of ModSeqChanged events"); for (int i = 0; i < modSeqChanged.Count; i++) { Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected modSeqChanged[{i}].Index"); Assert.That (modSeqChanged[i].UniqueId.Value.Id, Is.EqualTo (i + 1), $"Unexpected modSeqChanged[{i}].UniqueId"); Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (4), $"Unexpected modSeqChanged[{i}].ModSeq"); } Assert.That (recentChanged, Is.False, "Unexpected RecentChanged event"); modSeqChanged.Clear (); flagsChanged.Clear (); // Delete some messages so we can test that QRESYNC emits some MessageVanished events // both now *and* when we use QRESYNC to re-open the folder var deleted = new UniqueIdSet (SortOrder.Ascending) { appended[7] // H }; await folder.AddFlagsAsync (deleted, MessageFlags.Deleted, true); Assert.That (flagsChanged, Is.Empty, "Unexpected number of FlagsChanged events"); Assert.That (modSeqChanged, Has.Count.EqualTo (1), "Unexpected number of ModSeqChanged events"); Assert.That (modSeqChanged[0].Index, Is.EqualTo (7), $"Unexpected modSeqChanged[{0}].Index"); Assert.That (modSeqChanged[0].UniqueId.Value.Id, Is.EqualTo (8), $"Unexpected modSeqChanged[{0}].UniqueId"); Assert.That (modSeqChanged[0].ModSeq, Is.EqualTo (5), $"Unexpected modSeqChanged[{0}].ModSeq"); Assert.That (recentChanged, Is.False, "Unexpected RecentChanged event"); modSeqChanged.Clear (); flagsChanged.Clear (); await folder.ExpungeAsync (deleted); Assert.That (vanished, Has.Count.EqualTo (1), "Expected MessagesVanished event"); Assert.That (vanished[0].UniqueIds, Has.Count.EqualTo (1), "Unexpected number of messages vanished"); Assert.That (vanished[0].UniqueIds[0].Id, Is.EqualTo (8), "Unexpected UID for vanished message"); Assert.That (vanished[0].Earlier, Is.False, "Expected EARLIER to be false"); Assert.That (recentChanged, Is.True, "Expected RecentChanged event"); recentChanged = false; vanished.Clear (); // Verify that THREAD works correctly var threaded = await folder.ThreadAsync (ThreadingAlgorithm.References, SearchQuery.All); Assert.That (threaded, Has.Count.EqualTo (2), "Unexpected number of root nodes in threaded results"); threaded = await folder.ThreadAsync (UniqueIdRange.All, ThreadingAlgorithm.OrderedSubject, SearchQuery.All); Assert.That (threaded, Has.Count.EqualTo (7), "Unexpected number of root nodes in threaded results"); // UNSELECT the folder so we can re-open it using QRESYNC await folder.CloseAsync (); // Use QRESYNC to get the changes since last time we opened the folder access = await folder.OpenAsync (FolderAccess.ReadWrite, uidValidity, highestModSeq, appended); Assert.That (access, Is.EqualTo (FolderAccess.ReadWrite), "Expected UnitTests.Messages to be opened in READ-WRITE mode"); Assert.That (flagsChanged, Has.Count.EqualTo (7), "Unexpected number of MessageFlagsChanged events"); Assert.That (modSeqChanged, Has.Count.EqualTo (7), "Unexpected number of ModSeqChanged events"); for (int i = 0; i < flagsChanged.Count; i++) { var messageFlags = MessageFlags.Seen | MessageFlags.Draft; if (i < 3) messageFlags |= MessageFlags.Answered; Assert.That (flagsChanged[i].Index, Is.EqualTo (i), $"Unexpected value for flagsChanged[{i}].Index"); Assert.That (flagsChanged[i].UniqueId.Value.Id, Is.EqualTo ((uint) (i + 1)), $"Unexpected value for flagsChanged[{i}].UniqueId"); Assert.That (flagsChanged[i].Flags, Is.EqualTo (messageFlags), $"Unexpected value for flagsChanged[{i}].Flags"); Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected value for modSeqChanged[{i}].Index"); if (i < 3) Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (4), $"Unexpected value for modSeqChanged[{i}].ModSeq"); else Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (3), $"Unexpected value for modSeqChanged[{i}].ModSeq"); } modSeqChanged.Clear (); flagsChanged.Clear (); Assert.That (vanished, Has.Count.EqualTo (1), "Unexpected number of MessagesVanished events"); Assert.That (vanished[0].Earlier, Is.True, "Expected VANISHED EARLIER"); Assert.That (vanished[0].UniqueIds, Has.Count.EqualTo (1), "Unexpected number of messages vanished"); Assert.That (vanished[0].UniqueIds[0].Id, Is.EqualTo (8), "Unexpected UID for vanished message"); vanished.Clear (); Assert.Throws (() => folder.Search (SearchQuery.GMailMessageId (1))); Assert.Throws (() => folder.Search (SearchQuery.GMailThreadId (1))); Assert.Throws (() => folder.Search (SearchQuery.HasGMailLabel ("Custom Label"))); Assert.Throws (() => folder.Search (SearchQuery.GMailRawSearch ("has:attachment in:unread"))); Assert.Throws (() => folder.Search (SearchQuery.Fuzzy (SearchQuery.SubjectContains ("some fuzzy text")))); Assert.Throws (() => folder.Search (SearchQuery.Filter (new MetadataTag ("/private/filters/values/saved-search")))); Assert.Throws (() => folder.Search (SearchQuery.Filter ("saved-search"))); Assert.Throws (() => folder.Search (SearchQuery.SaveDateSupported)); Assert.Throws (() => folder.Search (SearchQuery.SavedBefore (DateTime.Now))); Assert.Throws (() => folder.Search (SearchQuery.SavedOn (DateTime.Now))); Assert.Throws (() => folder.Search (SearchQuery.SavedSince (DateTime.Now))); // Use SEARCH and FETCH to get the same info var searchOptions = SearchOptions.All | SearchOptions.Count | SearchOptions.Min | SearchOptions.Max | SearchOptions.Relevancy; var changed = await folder.SearchAsync (searchOptions, SearchQuery.ChangedSince (highestModSeq)); Assert.That (changed.UniqueIds, Has.Count.EqualTo (7), "Unexpected number of UIDs"); Assert.That (changed.Relevancy, Has.Count.EqualTo (changed.Count), "Unexpected number of relevancy scores"); Assert.That (changed.ModSeq.HasValue, Is.True, "Expected the ModSeq property to be set"); Assert.That (changed.ModSeq.Value, Is.EqualTo (4), "Unexpected ModSeq value"); Assert.That (changed.Min.Value.Id, Is.EqualTo (1), "Unexpected Min"); Assert.That (changed.Max.Value.Id, Is.EqualTo (7), "Unexpected Max"); Assert.That (changed.Count, Is.EqualTo (7), "Unexpected Count"); var fetched = await folder.FetchAsync (changed.UniqueIds, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq); Assert.That (fetched, Has.Count.EqualTo (7), "Unexpected number of messages fetched"); for (int i = 0; i < fetched.Count; i++) { Assert.That (fetched[i].Index, Is.EqualTo (i), "Unexpected Index"); Assert.That (fetched[i].UniqueId.Id, Is.EqualTo (i + 1), "Unexpected UniqueId"); } // or... we could just use a single UID FETCH command like so: fetched = await folder.FetchAsync (UniqueIdRange.All, highestModSeq, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq); for (int i = 0; i < fetched.Count; i++) { Assert.That (fetched[i].Index, Is.EqualTo (i), "Unexpected Index"); Assert.That (fetched[i].UniqueId.Id, Is.EqualTo (i + 1), "Unexpected UniqueId"); } Assert.That (fetched, Has.Count.EqualTo (7), "Unexpected number of messages fetched"); Assert.That (vanished, Has.Count.EqualTo (1), "Unexpected number of MessagesVanished events"); Assert.That (vanished[0].Earlier, Is.True, "Expected VANISHED EARLIER"); Assert.That (vanished[0].UniqueIds, Has.Count.EqualTo (1), "Unexpected number of messages vanished"); Assert.That (vanished[0].UniqueIds[0].Id, Is.EqualTo (8), "Unexpected UID for vanished message"); vanished.Clear (); // Use SORT to order by reverse arrival order var orderBy = new OrderBy[] { new OrderBy (OrderByType.Arrival, SortOrder.Descending) }; var sorted = await folder.SortAsync (searchOptions, SearchQuery.All, orderBy); Assert.That (sorted.UniqueIds, Has.Count.EqualTo (7), "Unexpected number of UIDs"); for (int i = 0; i < sorted.UniqueIds.Count; i++) Assert.That (sorted.UniqueIds[i].Id, Is.EqualTo (7 - i), $"Unexpected value for UniqueId[{i}]"); Assert.That (sorted.Relevancy, Has.Count.EqualTo (sorted.Count), "Unexpected number of relevancy scores"); Assert.That (sorted.ModSeq.HasValue, Is.False, "Expected the ModSeq property to be null"); Assert.That (sorted.Min.Value.Id, Is.EqualTo (7), "Unexpected Min"); Assert.That (sorted.Max.Value.Id, Is.EqualTo (1), "Unexpected Max"); Assert.That (sorted.Count, Is.EqualTo (7), "Unexpected Count"); // Verify that optimizing NOT queries works correctly var uids = await folder.SearchAsync (SearchQuery.Not (SearchQuery.Deleted).And (SearchQuery.Not (SearchQuery.NotSeen))); Assert.That (uids, Has.Count.EqualTo (7), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); // Create a Destination folder to use for copying/moving messages to var destination = (ImapFolder) await unitTests.CreateAsync ("Destination", true); Assert.That (destination.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren), "Unexpected UnitTests.Destination folder attributes"); // COPY messages to the Destination folder var copied = await folder.CopyToAsync (uids, destination); Assert.That (copied.Source, Has.Count.EqualTo (uids.Count), "Unexpected Source.Count"); Assert.That (copied.Destination, Has.Count.EqualTo (uids.Count), "Unexpected Destination.Count"); // MOVE messages to the Destination folder var moved = await folder.MoveToAsync (uids, destination); Assert.That (copied.Source, Has.Count.EqualTo (uids.Count), "Unexpected Source.Count"); Assert.That (copied.Destination, Has.Count.EqualTo (uids.Count), "Unexpected Destination.Count"); Assert.That (vanished, Has.Count.EqualTo (1), "Expected VANISHED event"); vanished.Clear (); await destination.StatusAsync (statusItems); Assert.That (destination.UidValidity, Is.EqualTo (moved.Destination[0].Validity), "Unexpected UIDVALIDITY"); destination.MessageFlagsChanged += (sender, e) => { flagsChanged.Add (e); }; destination.ModSeqChanged += (sender, e) => { modSeqChanged.Add (e); }; destination.MessagesVanished += (sender, e) => { vanished.Add (e); }; destination.RecentChanged += (sender, e) => { recentChanged = true; }; await destination.OpenAsync (FolderAccess.ReadWrite); Assert.That (access, Is.EqualTo (FolderAccess.ReadWrite), "Expected UnitTests.Destination to be opened in READ-WRITE mode"); var fetchHeaders = new HashSet { HeaderId.References, HeaderId.XMailer }; var indexes = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; // Fetch + modseq fetched = await destination.FetchAsync (UniqueIdRange.All, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = await destination.FetchAsync (0, -1, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = await destination.FetchAsync (indexes, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = await destination.FetchAsync (0, -1, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = await destination.FetchAsync (indexes, 1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); // Fetch fetched = await destination.FetchAsync (UniqueIdRange.All, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = await destination.FetchAsync (0, -1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = await destination.FetchAsync (indexes, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References, fetchHeaders); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = await destination.FetchAsync (0, -1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); fetched = await destination.FetchAsync (indexes, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.ModSeq | MessageSummaryItems.References); Assert.That (fetched, Has.Count.EqualTo (14), "Unexpected number of messages fetched"); uids = new UniqueIdSet (SortOrder.Ascending); for (int i = 0; i < fetched.Count; i++) { Assert.That (fetched[i].Index, Is.EqualTo (i), "Unexpected Index"); Assert.That (fetched[i].UniqueId.Id, Is.EqualTo (i + 1), "Unexpected UniqueId"); uids.Add (fetched[i].UniqueId); } using (var entity = await destination.GetBodyPartAsync (fetched[0].UniqueId, fetched[0].TextBody)) Assert.That (entity, Is.InstanceOf ()); using (var entity = await destination.GetBodyPartAsync (fetched[0].Index, fetched[0].TextBody)) Assert.That (entity, Is.InstanceOf ()); using (var entity = await destination.GetBodyPartAsync (fetched[1].UniqueId, fetched[1].TextBody)) Assert.That (entity, Is.InstanceOf ()); using (var entity = await destination.GetBodyPartAsync (fetched[1].Index, fetched[1].TextBody)) Assert.That (entity, Is.InstanceOf ()); var headers = await destination.GetHeadersAsync (fetched[0].UniqueId); Assert.That (headers[HeaderId.From], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match From header"); Assert.That (headers[HeaderId.Date], Is.EqualTo ("Sun, 02 Oct 2016 17:56:45 -0400"), "GetHeaders(UniqueId) failed to match Date header"); Assert.That (headers[HeaderId.Subject], Is.EqualTo ("A"), "GetHeaders(UniqueId) failed to match Subject header"); Assert.That (headers[HeaderId.MessageId], Is.EqualTo (""), "GetHeaders(UniqueId) failed to match Message-Id header"); Assert.That (headers[HeaderId.To], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match To header"); Assert.That (headers[HeaderId.MimeVersion], Is.EqualTo ("1.0"), "GetHeaders(UniqueId) failed to match MIME-Version header"); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = await destination.GetHeadersAsync (fetched[0].Index); Assert.That (headers[HeaderId.From], Is.EqualTo ("Unit Tests "), "GetHeaders(int) failed to match From header"); Assert.That (headers[HeaderId.Date], Is.EqualTo ("Sun, 02 Oct 2016 17:56:45 -0400"), "GetHeaders(UniqueId) failed to match Date header"); Assert.That (headers[HeaderId.Subject], Is.EqualTo ("A"), "GetHeaders(UniqueId) failed to match Subject header"); Assert.That (headers[HeaderId.MessageId], Is.EqualTo (""), "GetHeaders(UniqueId) failed to match Message-Id header"); Assert.That (headers[HeaderId.To], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match To header"); Assert.That (headers[HeaderId.MimeVersion], Is.EqualTo ("1.0"), "GetHeaders(UniqueId) failed to match MIME-Version header"); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = await destination.GetHeadersAsync (fetched[0].UniqueId, fetched[0].TextBody); Assert.That (headers[HeaderId.From], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId, BodyPart) failed to match From header"); Assert.That (headers[HeaderId.Date], Is.EqualTo ("Sun, 02 Oct 2016 17:56:45 -0400"), "GetHeaders(UniqueId) failed to match Date header"); Assert.That (headers[HeaderId.Subject], Is.EqualTo ("A"), "GetHeaders(UniqueId) failed to match Subject header"); Assert.That (headers[HeaderId.MessageId], Is.EqualTo (""), "GetHeaders(UniqueId) failed to match Message-Id header"); Assert.That (headers[HeaderId.To], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match To header"); Assert.That (headers[HeaderId.MimeVersion], Is.EqualTo ("1.0"), "GetHeaders(UniqueId) failed to match MIME-Version header"); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = await destination.GetHeadersAsync (fetched[0].Index, fetched[0].TextBody); Assert.That (headers[HeaderId.From], Is.EqualTo ("Unit Tests "), "GetHeaders(int, BodyPart) failed to match From header"); Assert.That (headers[HeaderId.Date], Is.EqualTo ("Sun, 02 Oct 2016 17:56:45 -0400"), "GetHeaders(UniqueId) failed to match Date header"); Assert.That (headers[HeaderId.Subject], Is.EqualTo ("A"), "GetHeaders(UniqueId) failed to match Subject header"); Assert.That (headers[HeaderId.MessageId], Is.EqualTo (""), "GetHeaders(UniqueId) failed to match Message-Id header"); Assert.That (headers[HeaderId.To], Is.EqualTo ("Unit Tests "), "GetHeaders(UniqueId) failed to match To header"); Assert.That (headers[HeaderId.MimeVersion], Is.EqualTo ("1.0"), "GetHeaders(UniqueId) failed to match MIME-Version header"); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = await destination.GetHeadersAsync (fetched[1].UniqueId, fetched[1].TextBody); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); headers = await destination.GetHeadersAsync (fetched[1].Index, fetched[1].TextBody); Assert.That (headers[HeaderId.ContentType], Is.EqualTo ("text/plain; charset=utf-8"), "GetHeaders(UniqueId) failed to match Content-Type header"); using (var stream = await destination.GetStreamAsync (fetched[0].UniqueId, 128, 64)) { Assert.That (stream.Length, Is.EqualTo (64), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("nit Tests \r\nMIME-Version: 1.0\r\nContent-T")); } using (var stream = await destination.GetStreamAsync (fetched[0].UniqueId, "", 128, 64)) { Assert.That (stream.Length, Is.EqualTo (64), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("nit Tests \r\nMIME-Version: 1.0\r\nContent-T")); } using (var stream = await destination.GetStreamAsync (fetched[0].Index, 128, 64)) { Assert.That (stream.Length, Is.EqualTo (64), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("nit Tests \r\nMIME-Version: 1.0\r\nContent-T")); } using (var stream = await destination.GetStreamAsync (fetched[0].Index, "", 128, 64)) { Assert.That (stream.Length, Is.EqualTo (64), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("nit Tests \r\nMIME-Version: 1.0\r\nContent-T")); } using (var stream = await destination.GetStreamAsync (fetched[0].UniqueId, "HEADER.FIELDS (MIME-VERSION CONTENT-TYPE)")) { Assert.That (stream.Length, Is.EqualTo (62), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("MIME-Version: 1.0\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n")); } using (var stream = await destination.GetStreamAsync (fetched[0].Index, "HEADER.FIELDS (MIME-VERSION CONTENT-TYPE)")) { Assert.That (stream.Length, Is.EqualTo (62), "Unexpected stream length"); string text; using (var reader = new StreamReader (stream)) text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo ("MIME-Version: 1.0\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n")); } var custom = new HashSet { "$MailKit" }; var unchanged1 = await destination.AddFlagsAsync (uids, destination.HighestModSeq, MessageFlags.Deleted, custom, true); Assert.That (modSeqChanged, Has.Count.EqualTo (14), "Unexpected number of ModSeqChanged events"); Assert.That (destination.HighestModSeq, Is.EqualTo (5)); for (int i = 0; i < modSeqChanged.Count; i++) { Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected value for modSeqChanged[{i}].Index"); Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (5), $"Unexpected value for modSeqChanged[{i}].ModSeq"); } Assert.That (unchanged1, Has.Count.EqualTo (2), "[MODIFIED uid-set]"); Assert.That (unchanged1[0].Id, Is.EqualTo (7), "unchanged uids[0]"); Assert.That (unchanged1[1].Id, Is.EqualTo (9), "unchanged uids[1]"); modSeqChanged.Clear (); var unchanged2 = await destination.SetFlagsAsync (new int[] { 0, 1, 2, 3, 4, 5, 6 }, destination.HighestModSeq, MessageFlags.Seen | MessageFlags.Deleted, custom, true); Assert.That (modSeqChanged, Has.Count.EqualTo (7), "Unexpected number of ModSeqChanged events"); Assert.That (destination.HighestModSeq, Is.EqualTo (6)); for (int i = 0; i < modSeqChanged.Count; i++) { Assert.That (modSeqChanged[i].Index, Is.EqualTo (i), $"Unexpected value for modSeqChanged[{i}].Index"); Assert.That (modSeqChanged[i].ModSeq, Is.EqualTo (6), $"Unexpected value for modSeqChanged[{i}].ModSeq"); } Assert.That (unchanged2, Has.Count.EqualTo (2), "[MODIFIED seq-set]"); Assert.That (unchanged2[0], Is.EqualTo (6), "unchanged indexes[0]"); Assert.That (unchanged2[1], Is.EqualTo (8), "unchanged indexes[1]"); modSeqChanged.Clear (); var results = await destination.SearchAsync (uids, SearchQuery.New.Or (SearchQuery.Old.Or (SearchQuery.Answered.Or (SearchQuery.Deleted.Or (SearchQuery.Draft.Or (SearchQuery.Flagged.Or (SearchQuery.Recent.Or (SearchQuery.NotAnswered.Or (SearchQuery.NotDeleted.Or (SearchQuery.NotDraft.Or (SearchQuery.NotFlagged.Or (SearchQuery.NotSeen.Or (SearchQuery.HasKeyword ("$MailKit").Or (SearchQuery.NotKeyword ("$MailKit"))))))))))))))); Assert.That (results, Has.Count.EqualTo (14), "Unexpected number of UIDs"); var matches = await destination.SearchAsync (searchOptions, uids, SearchQuery.LargerThan (256).And (SearchQuery.SmallerThan (512))); var expectedMatchedUids = new uint[] { 2, 3, 4, 5, 6, 9, 10, 11, 12, 13 }; Assert.That (matches.Count, Is.EqualTo (10), "Unexpected COUNT"); Assert.That (matches.Max.Value.Id, Is.EqualTo (13), "Unexpected MAX"); Assert.That (matches.Min.Value.Id, Is.EqualTo (2), "Unexpected MIN"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (10), "Unexpected number of UIDs"); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (expectedMatchedUids[i])); Assert.That (matches.Relevancy, Has.Count.EqualTo (matches.Count), "Unexpected number of relevancy scores"); orderBy = new OrderBy[] { OrderBy.ReverseDate, OrderBy.Subject, OrderBy.DisplayFrom, OrderBy.Size }; var sentDateQuery = SearchQuery.Or (SearchQuery.And (SearchQuery.SentBefore (new DateTime (2016, 10, 12)), SearchQuery.SentSince (new DateTime (2016, 10, 10))), SearchQuery.Not (SearchQuery.SentOn (new DateTime (2016, 10, 11)))); var deliveredDateQuery = SearchQuery.Or (SearchQuery.And (SearchQuery.DeliveredBefore (new DateTime (2016, 10, 12)), SearchQuery.DeliveredAfter (new DateTime (2016, 10, 10))), SearchQuery.Not (SearchQuery.DeliveredOn (new DateTime (2016, 10, 11)))); results = await destination.SortAsync (sentDateQuery.Or (deliveredDateQuery), orderBy); var expectedSortByDateResults = new uint[] { 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8 }; Assert.That (results, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < results.Count; i++) Assert.That (results[i].Id, Is.EqualTo (expectedSortByDateResults[i])); var stringQuery = SearchQuery.BccContains ("xyz").Or (SearchQuery.CcContains ("xyz").Or (SearchQuery.FromContains ("xyz").Or (SearchQuery.ToContains ("xyz").Or (SearchQuery.SubjectContains ("xyz").Or (SearchQuery.HeaderContains ("Message-Id", "mimekit.net").Or (SearchQuery.BodyContains ("This is the message body.").Or (SearchQuery.MessageContains ("message")))))))); orderBy = new OrderBy[] { OrderBy.From, OrderBy.To, OrderBy.Cc }; results = await destination.SortAsync (uids, stringQuery, orderBy); Assert.That (results, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < results.Count; i++) Assert.That (results[i].Id, Is.EqualTo (i + 1)); orderBy = new OrderBy[] { OrderBy.DisplayTo }; matches = await destination.SortAsync (searchOptions, uids, SearchQuery.OlderThan (1).And (SearchQuery.YoungerThan (3600)), orderBy); Assert.That (matches.Count, Is.EqualTo (14), "Unexpected COUNT"); Assert.That (matches.Max.Value.Id, Is.EqualTo (14), "Unexpected MAX"); Assert.That (matches.Min.Value.Id, Is.EqualTo (1), "Unexpected MIN"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (i + 1)); Assert.That (matches.Relevancy, Has.Count.EqualTo (matches.Count), "Unexpected number of relevancy scores"); client.Capabilities &= ~ImapCapabilities.ESearch; matches = await ((ImapFolder) destination).SearchAsync ("ALL"); Assert.That (matches.Max.HasValue, Is.True, "MAX should always be set"); Assert.That (matches.Max.Value.Id, Is.EqualTo (14), "Unexpected MAX value"); Assert.That (matches.Min.HasValue, Is.True, "MIN should always be set"); Assert.That (matches.Min.Value.Id, Is.EqualTo (1), "Unexpected MIN value"); Assert.That (matches.Count, Is.EqualTo (14), "COUNT should always be set"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (14)); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (i + 1)); client.Capabilities &= ~ImapCapabilities.ESort; matches = await ((ImapFolder) destination).SortAsync ("(REVERSE ARRIVAL) US-ASCII ALL"); Assert.That (matches.Max.HasValue, Is.True, "MAX should always be set"); Assert.That (matches.Max.Value.Id, Is.EqualTo (14), "Unexpected MAX value"); Assert.That (matches.Min.HasValue, Is.True, "MIN should always be set"); Assert.That (matches.Min.Value.Id, Is.EqualTo (1), "Unexpected MIN value"); Assert.That (matches.Count, Is.EqualTo (14), "COUNT should always be set"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (14)); var expectedSortByReverseArrivalResults = new uint[] { 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8 }; for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (expectedSortByReverseArrivalResults[i])); await destination.GetStreamsAsync (UniqueIdRange.All, GetStreamsAsyncCallback); await destination.GetStreamsAsync (new int[] { 0, 1, 2 }, GetStreamsAsyncCallback); await destination.GetStreamsAsync (0, -1, GetStreamsAsyncCallback); await destination.ExpungeAsync (); Assert.That (destination.HighestModSeq, Is.EqualTo (7)); Assert.That (vanished, Has.Count.EqualTo (1), "Unexpected number of Vanished events"); Assert.That (vanished[0].UniqueIds, Has.Count.EqualTo (14), "Unexpected number of UIDs in Vanished event"); for (int i = 0; i < vanished[0].UniqueIds.Count; i++) Assert.That (vanished[0].UniqueIds[i].Id, Is.EqualTo (i + 1)); Assert.That (vanished[0].Earlier, Is.False, "Unexpected value for Earlier"); vanished.Clear (); await destination.CloseAsync (true); int alerts = 0; client.Alert += (sender, e) => { Assert.That (e.Message, Is.EqualTo ("System shutdown in 10 minutes")); alerts++; }; await client.NoOpAsync (); Assert.That (alerts, Is.EqualTo (1), "Alert event failed to fire."); await client.DisconnectAsync (true); } } static List CreateGMailCommands () { var commands = new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 CREATE UnitTests\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000007 LIST \"\" UnitTests\r\n", "gmail.list-unittests.txt"), new ImapReplayCommand ("A00000008 SELECT UnitTests (CONDSTORE)\r\n", "gmail.select-unittests.txt") }; for (int i = 0; i < 50; i++) { MimeMessage message; string latin1; long length; using (var resource = GetResourceStream (string.Format ("common.message.{0}.msg", i))) message = MimeMessage.Load (resource); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; options.EnsureNewLine = true; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, TextEncodings.Latin1)) latin1 = reader.ReadToEnd (); } message.Dispose (); var tag = string.Format ("A{0:D8}", i + 9); var command = string.Format ("{0} APPEND UnitTests (\\Seen) ", tag); if (length > 4096) { command += "{" + length + "}\r\n"; commands.Add (new ImapReplayCommand (command, "gmail.go-ahead.txt")); commands.Add (new ImapReplayCommand (tag, latin1 + "\r\n", string.Format ("gmail.append.{0}.txt", i + 1))); } else { command += "{" + length + "+}\r\n" + latin1 + "\r\n"; commands.Add (new ImapReplayCommand (command, string.Format ("gmail.append.{0}.txt", i + 1))); } } commands.Add (new ImapReplayCommand ("A00000059 UID SEARCH RETURN (ALL) OR X-GM-MSGID 1 OR X-GM-THRID 5 OR X-GM-LABELS \"Custom Label\" X-GM-RAW \"has:attachment in:unread\"\r\n", "gmail.search.txt")); commands.Add (new ImapReplayCommand ("A00000060 UID FETCH 1:3,5,7:9,11:14,26:29,31,34,41:43,50 (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODY X-GM-MSGID X-GM-THRID X-GM-LABELS)\r\n", "gmail.search-summary.txt")); commands.Add (new ImapReplayCommand ("A00000061 UID FETCH 1 (BODY.PEEK[])\r\n", "gmail.fetch.1.txt")); commands.Add (new ImapReplayCommand ("A00000062 UID FETCH 2 (BODY.PEEK[])\r\n", "gmail.fetch.2.txt")); commands.Add (new ImapReplayCommand ("A00000063 UID FETCH 3 (BODY.PEEK[])\r\n", "gmail.fetch.3.txt")); commands.Add (new ImapReplayCommand ("A00000064 UID FETCH 5 (BODY.PEEK[])\r\n", "gmail.fetch.5.txt")); commands.Add (new ImapReplayCommand ("A00000065 UID FETCH 7 (BODY.PEEK[])\r\n", "gmail.fetch.7.txt")); commands.Add (new ImapReplayCommand ("A00000066 UID FETCH 8 (BODY.PEEK[])\r\n", "gmail.fetch.8.txt")); commands.Add (new ImapReplayCommand ("A00000067 UID FETCH 9 (BODY.PEEK[])\r\n", "gmail.fetch.9.txt")); commands.Add (new ImapReplayCommand ("A00000068 UID FETCH 11 (BODY.PEEK[])\r\n", "gmail.fetch.11.txt")); commands.Add (new ImapReplayCommand ("A00000069 UID FETCH 12 (BODY.PEEK[])\r\n", "gmail.fetch.12.txt")); commands.Add (new ImapReplayCommand ("A00000070 UID FETCH 13 (BODY.PEEK[])\r\n", "gmail.fetch.13.txt")); commands.Add (new ImapReplayCommand ("A00000071 UID FETCH 14 (BODY.PEEK[])\r\n", "gmail.fetch.14.txt")); commands.Add (new ImapReplayCommand ("A00000072 UID FETCH 26 (BODY.PEEK[])\r\n", "gmail.fetch.26.txt")); commands.Add (new ImapReplayCommand ("A00000073 UID FETCH 27 (BODY.PEEK[])\r\n", "gmail.fetch.27.txt")); commands.Add (new ImapReplayCommand ("A00000074 UID FETCH 28 (BODY.PEEK[])\r\n", "gmail.fetch.28.txt")); commands.Add (new ImapReplayCommand ("A00000075 UID FETCH 29 (BODY.PEEK[])\r\n", "gmail.fetch.29.txt")); commands.Add (new ImapReplayCommand ("A00000076 UID FETCH 31 (BODY.PEEK[])\r\n", "gmail.fetch.31.txt")); commands.Add (new ImapReplayCommand ("A00000077 UID FETCH 34 (BODY.PEEK[])\r\n", "gmail.fetch.34.txt")); commands.Add (new ImapReplayCommand ("A00000078 UID FETCH 41 (BODY.PEEK[])\r\n", "gmail.fetch.41.txt")); commands.Add (new ImapReplayCommand ("A00000079 UID FETCH 42 (BODY.PEEK[])\r\n", "gmail.fetch.42.txt")); commands.Add (new ImapReplayCommand ("A00000080 UID FETCH 43 (BODY.PEEK[])\r\n", "gmail.fetch.43.txt")); commands.Add (new ImapReplayCommand ("A00000081 UID FETCH 50 (BODY.PEEK[])\r\n", "gmail.fetch.50.txt")); commands.Add (new ImapReplayCommand ("A00000082 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 X-GM-LABELS (\\Important \"Custom Label\" NIL)\r\n", "gmail.set-labels.txt")); commands.Add (new ImapReplayCommand ("A00000083 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 -X-GM-LABELS.SILENT (\\Important \"Custom Label\" NIL)\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000084 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 +X-GM-LABELS (\\Important \"Custom Label\" NIL)\r\n", "gmail.add-labels.txt")); commands.Add (new ImapReplayCommand ("A00000085 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 (UNCHANGEDSINCE 5) X-GM-LABELS (\\Important \"Custom Label\" NIL)\r\n", "gmail.set-labels.txt")); commands.Add (new ImapReplayCommand ("A00000086 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 (UNCHANGEDSINCE 5) -X-GM-LABELS.SILENT (\\Important \"Custom Label\" NIL)\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000087 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 (UNCHANGEDSINCE 5) +X-GM-LABELS (\\Important \"Custom Label\" NIL)\r\n", "gmail.add-labels.txt")); commands.Add (new ImapReplayCommand ("A00000088 STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 X-GM-LABELS (\\Important \"Custom Label\" NIL)\r\n", "gmail.set-labels.txt")); commands.Add (new ImapReplayCommand ("A00000089 STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 -X-GM-LABELS.SILENT (\\Important \"Custom Label\" NIL)\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000090 STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 +X-GM-LABELS (\\Important \"Custom Label\" NIL)\r\n", "gmail.add-labels.txt")); commands.Add (new ImapReplayCommand ("A00000091 STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 (UNCHANGEDSINCE 5) X-GM-LABELS (\\Important \"Custom Label\" NIL)\r\n", "gmail.set-labels.txt")); commands.Add (new ImapReplayCommand ("A00000092 STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 (UNCHANGEDSINCE 5) -X-GM-LABELS.SILENT (\\Important \"Custom Label\" NIL)\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000093 STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 (UNCHANGEDSINCE 5) +X-GM-LABELS (\\Important \"Custom Label\" NIL)\r\n", "gmail.add-labels.txt")); commands.Add (new ImapReplayCommand ("A00000094 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 FLAGS (\\Answered \\Seen)\r\n", "gmail.set-flags.txt")); commands.Add (new ImapReplayCommand ("A00000095 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 -FLAGS.SILENT (\\Answered)\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000096 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 +FLAGS.SILENT (\\Deleted)\r\n", "gmail.add-flags.txt")); commands.Add (new ImapReplayCommand ("A00000097 CHECK\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000098 UNSELECT\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000099 SUBSCRIBE UnitTests\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000100 LSUB \"\" \"%\"\r\n", "gmail.lsub-personal.txt")); commands.Add (new ImapReplayCommand ("A00000101 UNSUBSCRIBE UnitTests\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000102 CREATE UnitTests/Dummy\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000103 LIST \"\" UnitTests/Dummy\r\n", "gmail.list-unittests-dummy.txt")); commands.Add (new ImapReplayCommand ("A00000104 RENAME UnitTests RenamedUnitTests\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000105 DELETE RenamedUnitTests\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000106 LOGOUT\r\n", "gmail.logout.txt")); return commands; } [Test] public void TestGMail () { var commands = CreateGMailCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.AppendLimit.HasValue, Is.True, "Expected AppendLimit to have a value"); Assert.That (client.AppendLimit.Value, Is.EqualTo (35651584), "Expected AppendLimit value to match"); Assert.Throws (() => client.EnableQuickResync ()); Assert.Throws (() => client.Notify (true, new List { new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.FlagChange, new ImapEvent.MessageNew (), ImapEvent.MessageExpunge) })); Assert.Throws (() => client.DisableNotify ()); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); foreach (var special in Enum.GetValues (typeof (SpecialFolder)).OfType ()) { var folder = client.GetFolder (special); if (special != SpecialFolder.Archive) { var expected = GetSpecialFolderAttribute (special) | FolderAttributes.HasNoChildren; Assert.That (folder, Is.Not.Null, $"Expected non-null {special} folder."); Assert.That (folder.Attributes, Is.EqualTo (expected), $"Expected {special} attributes to be \\HasNoChildren."); } else { Assert.That (folder, Is.Null, $"Expected null {special} folder."); } } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var created = personal.Create ("UnitTests", true); Assert.That (created, Is.Not.Null, "Expected a non-null created folder."); Assert.That (created.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren)); Assert.That (created.ParentFolder, Is.Not.Null, "The ParentFolder property should not be null."); const MessageFlags ExpectedPermanentFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Draft | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.UserDefined; const MessageFlags ExpectedAcceptedFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Draft | MessageFlags.Deleted | MessageFlags.Seen; var access = created.Open (FolderAccess.ReadWrite); Assert.That (access, Is.EqualTo (FolderAccess.ReadWrite), "The UnitTests folder was not opened with the expected access mode."); Assert.That (created.PermanentFlags, Is.EqualTo (ExpectedPermanentFlags), "The PermanentFlags do not match the expected value."); Assert.That (created.AcceptedFlags, Is.EqualTo (ExpectedAcceptedFlags), "The AcceptedFlags do not match the expected value."); for (int i = 0; i < 50; i++) { using (var stream = GetResourceStream (string.Format ("common.message.{0}.msg", i))) { using (var message = MimeMessage.Load (stream)) { var uid = created.Append (message, MessageFlags.Seen); Assert.That (uid.HasValue, Is.True, "Expected a UID to be returned from folder.Append()."); Assert.That (uid.Value.Id, Is.EqualTo ((uint) (i + 1)), "The UID returned from the APPEND command does not match the expected UID."); } } } var query = SearchQuery.GMailMessageId (1).Or (SearchQuery.GMailThreadId (5).Or (SearchQuery.HasGMailLabel ("Custom Label").Or (SearchQuery.GMailRawSearch ("has:attachment in:unread")))); var matches = created.Search (query); Assert.That (matches, Has.Count.EqualTo (21)); const MessageSummaryItems items = MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.GMailLabels | MessageSummaryItems.GMailMessageId | MessageSummaryItems.GMailThreadId; var summaries = created.Fetch (matches, items); var indexes = new List (); foreach (var summary in summaries) { Assert.That (summary.GMailMessageId.Value, Is.EqualTo (1592225494819146100 + summary.UniqueId.Id), "GMailMessageId"); Assert.That (summary.GMailThreadId.Value, Is.EqualTo (1592225494819146100 + summary.UniqueId.Id), "GMailThreadId"); Assert.That (summary.GMailLabels, Has.Count.EqualTo (2), "GMailLabels.Count"); Assert.That (summary.GMailLabels[0], Is.EqualTo ("Test Messages")); Assert.That (summary.GMailLabels[1], Is.EqualTo ("\\Important")); Assert.That (summary.UniqueId.IsValid, Is.True, "UniqueId.IsValid"); created.GetMessage (summary.UniqueId); indexes.Add (summary.Index); } var labels = new [] { "\\Important", "Custom Label", null }; created.SetLabels (matches, labels, false); created.RemoveLabels (matches, labels, true); created.AddLabels (matches, labels, false); created.SetLabels (matches, 5, labels, false); created.RemoveLabels (matches, 5, labels, true); created.AddLabels (matches, 5, labels, false); created.SetLabels (indexes, labels, false); created.RemoveLabels (indexes, labels, true); created.AddLabels (indexes, labels, false); created.SetLabels (indexes, 5, labels, false); created.RemoveLabels (indexes, 5, labels, true); created.AddLabels (indexes, 5, labels, false); // Verify that Adding and/or removing an empty set of labels is a no-op labels = Array.Empty (); created.RemoveLabels (matches, labels, true); created.AddLabels (matches, labels, false); created.RemoveLabels (matches, 5, labels, true); created.AddLabels (matches, 5, labels, false); created.RemoveLabels (indexes, labels, true); created.AddLabels (indexes, labels, false); created.RemoveLabels (indexes, 5, labels, true); created.AddLabels (indexes, 5, labels, false); created.SetFlags (matches, MessageFlags.Seen | MessageFlags.Answered, false); created.RemoveFlags (matches, MessageFlags.Answered, true); created.AddFlags (matches, MessageFlags.Deleted, true); // Verify that Adding and/or removing an empty set of flags is a no-op created.RemoveFlags (matches, MessageFlags.None, true); created.AddFlags (matches, MessageFlags.None, true); created.RemoveFlags (matches, 5, MessageFlags.None, true); created.AddFlags (matches, 5, MessageFlags.None, true); created.RemoveFlags (indexes, MessageFlags.None, true); created.AddFlags (indexes, MessageFlags.None, true); created.RemoveFlags (indexes, 5, MessageFlags.None, true); created.AddFlags (indexes, 5, MessageFlags.None, true); created.Check (); created.Close (); Assert.That (created.IsOpen, Is.False, "Expected the UnitTests folder to be closed."); created.Subscribe (); Assert.That (created.IsSubscribed, Is.True, "Expected IsSubscribed to be true after subscribing to the folder."); var subscribed = personal.GetSubfolders (true); Assert.That (subscribed.Contains (created), Is.True, "Expected the list of subscribed folders to contain the UnitTests folder."); created.Unsubscribe (); Assert.That (created.IsSubscribed, Is.False, "Expected IsSubscribed to be false after unsubscribing from the folder."); var dummy = created.Create ("Dummy", true); bool dummyRenamed = false; bool renamed = false; bool deleted = false; dummy.Renamed += (sender, e) => { dummyRenamed = true; }; created.Renamed += (sender, e) => { renamed = true; }; created.Rename (created.ParentFolder, "RenamedUnitTests"); Assert.That (created.Name, Is.EqualTo ("RenamedUnitTests")); Assert.That (created.FullName, Is.EqualTo ("RenamedUnitTests")); Assert.That (renamed, Is.True, "Expected the Rename event to be emitted for the UnitTests folder."); Assert.That (dummy.FullName, Is.EqualTo ("RenamedUnitTests/Dummy")); Assert.That (dummyRenamed, Is.True, "Expected the Rename event to be emitted for the UnitTests/Dummy folder."); created.Deleted += (sender, e) => { deleted = true; }; created.Delete (); Assert.That (deleted, Is.True, "Expected the Deleted event to be emitted for the UnitTests folder."); Assert.That (created.Exists, Is.False, "Expected Exists to be false after deleting the folder."); client.Disconnect (true); } } [Test] public async Task TestGMailAsync () { var commands = CreateGMailCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); Assert.That (client.AppendLimit.HasValue, Is.True, "Expected AppendLimit to have a value"); Assert.That (client.AppendLimit.Value, Is.EqualTo (35651584), "Expected AppendLimit value to match"); Assert.ThrowsAsync (async () => await client.EnableQuickResyncAsync ()); Assert.ThrowsAsync (async () => await client.NotifyAsync (true, new List { new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.FlagChange, new ImapEvent.MessageNew (), ImapEvent.MessageExpunge) })); Assert.ThrowsAsync (async () => await client.DisableNotifyAsync ()); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); foreach (var special in Enum.GetValues (typeof (SpecialFolder)).OfType ()) { var folder = client.GetFolder (special); if (special != SpecialFolder.Archive) { var expected = GetSpecialFolderAttribute (special) | FolderAttributes.HasNoChildren; Assert.That (folder, Is.Not.Null, $"Expected non-null {special} folder."); Assert.That (folder.Attributes, Is.EqualTo (expected), $"Expected {special} attributes to be \\HasNoChildren."); } else { Assert.That (folder, Is.Null, $"Expected null {special} folder."); } } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var created = await personal.CreateAsync ("UnitTests", true); Assert.That (created, Is.Not.Null, "Expected a non-null created folder."); Assert.That (created.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren)); Assert.That (created.ParentFolder, Is.Not.Null, "The ParentFolder property should not be null."); const MessageFlags ExpectedPermanentFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Draft | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.UserDefined; const MessageFlags ExpectedAcceptedFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Draft | MessageFlags.Deleted | MessageFlags.Seen; var access = await created.OpenAsync (FolderAccess.ReadWrite); Assert.That (access, Is.EqualTo (FolderAccess.ReadWrite), "The UnitTests folder was not opened with the expected access mode."); Assert.That (created.PermanentFlags, Is.EqualTo (ExpectedPermanentFlags), "The PermanentFlags do not match the expected value."); Assert.That (created.AcceptedFlags, Is.EqualTo (ExpectedAcceptedFlags), "The AcceptedFlags do not match the expected value."); for (int i = 0; i < 50; i++) { using (var stream = GetResourceStream (string.Format ("common.message.{0}.msg", i))) { using (var message = MimeMessage.Load (stream)) { var uid = await created.AppendAsync (message, MessageFlags.Seen); Assert.That (uid.HasValue, Is.True, "Expected a UID to be returned from folder.Append()."); Assert.That (uid.Value.Id, Is.EqualTo ((uint) (i + 1)), "The UID returned from the APPEND command does not match the expected UID."); } } } var query = SearchQuery.GMailMessageId (1).Or (SearchQuery.GMailThreadId (5).Or (SearchQuery.HasGMailLabel ("Custom Label").Or (SearchQuery.GMailRawSearch ("has:attachment in:unread")))); var matches = await created.SearchAsync (query); Assert.That (matches, Has.Count.EqualTo (21)); const MessageSummaryItems items = MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.GMailLabels | MessageSummaryItems.GMailMessageId | MessageSummaryItems.GMailThreadId; var summaries = await created.FetchAsync (matches, items); var indexes = new List (); foreach (var summary in summaries) { Assert.That (summary.GMailMessageId.Value, Is.EqualTo (1592225494819146100 + summary.UniqueId.Id), "GMailMessageId"); Assert.That (summary.GMailThreadId.Value, Is.EqualTo (1592225494819146100 + summary.UniqueId.Id), "GMailThreadId"); Assert.That (summary.GMailLabels, Has.Count.EqualTo (2), "GMailLabels.Count"); Assert.That (summary.GMailLabels[0], Is.EqualTo ("Test Messages")); Assert.That (summary.GMailLabels[1], Is.EqualTo ("\\Important")); Assert.That (summary.UniqueId.IsValid, Is.True, "UniqueId.IsValid"); await created.GetMessageAsync (summary.UniqueId); indexes.Add (summary.Index); } var labels = new [] { "\\Important", "Custom Label", null }; await created.SetLabelsAsync (matches, labels, false); await created.RemoveLabelsAsync (matches, labels, true); await created.AddLabelsAsync (matches, labels, false); await created.SetLabelsAsync (matches, 5, labels, false); await created.RemoveLabelsAsync (matches, 5, labels, true); await created.AddLabelsAsync (matches, 5, labels, false); await created.SetLabelsAsync (indexes, labels, false); await created.RemoveLabelsAsync (indexes, labels, true); await created.AddLabelsAsync (indexes, labels, false); await created.SetLabelsAsync (indexes, 5, labels, false); await created.RemoveLabelsAsync (indexes, 5, labels, true); await created.AddLabelsAsync (indexes, 5, labels, false); // Verify that Adding and/or removing an empty set of labels is a no-op labels = Array.Empty (); await created.RemoveLabelsAsync (matches, labels, true); await created.AddLabelsAsync (matches, labels, false); await created.RemoveLabelsAsync (matches, 5, labels, true); await created.AddLabelsAsync (matches, 5, labels, false); await created.RemoveLabelsAsync (indexes, labels, true); await created.AddLabelsAsync (indexes, labels, false); await created.RemoveLabelsAsync (indexes, 5, labels, true); await created.AddLabelsAsync (indexes, 5, labels, false); await created.SetFlagsAsync (matches, MessageFlags.Seen | MessageFlags.Answered, false); await created.RemoveFlagsAsync (matches, MessageFlags.Answered, true); await created.AddFlagsAsync (matches, MessageFlags.Deleted, true); // Verify that Adding and/or removing an empty set of flags is a no-op await created.RemoveFlagsAsync (matches, MessageFlags.None, true); await created.AddFlagsAsync (matches, MessageFlags.None, true); await created.RemoveFlagsAsync (matches, 5, MessageFlags.None, true); await created.AddFlagsAsync (matches, 5, MessageFlags.None, true); await created.RemoveFlagsAsync (indexes, MessageFlags.None, true); await created.AddFlagsAsync (indexes, MessageFlags.None, true); await created.RemoveFlagsAsync (indexes, 5, MessageFlags.None, true); await created.AddFlagsAsync (indexes, 5, MessageFlags.None, true); await created.CheckAsync (); await created.CloseAsync (); Assert.That (created.IsOpen, Is.False, "Expected the UnitTests folder to be closed."); await created.SubscribeAsync (); Assert.That (created.IsSubscribed, Is.True, "Expected IsSubscribed to be true after subscribing to the folder."); var subscribed = await personal.GetSubfoldersAsync (true); Assert.That (subscribed.Contains (created), Is.True, "Expected the list of subscribed folders to contain the UnitTests folder."); await created.UnsubscribeAsync (); Assert.That (created.IsSubscribed, Is.False, "Expected IsSubscribed to be false after unsubscribing from the folder."); var dummy = await created.CreateAsync ("Dummy", true); bool dummyRenamed = false; bool renamed = false; bool deleted = false; dummy.Renamed += (sender, e) => { dummyRenamed = true; }; created.Renamed += (sender, e) => { renamed = true; }; await created.RenameAsync (created.ParentFolder, "RenamedUnitTests"); Assert.That (created.Name, Is.EqualTo ("RenamedUnitTests")); Assert.That (created.FullName, Is.EqualTo ("RenamedUnitTests")); Assert.That (renamed, Is.True, "Expected the Rename event to be emitted for the UnitTests folder."); Assert.That (dummy.FullName, Is.EqualTo ("RenamedUnitTests/Dummy")); Assert.That (dummyRenamed, Is.True, "Expected the Rename event to be emitted for the UnitTests/Dummy folder."); created.Deleted += (sender, e) => { deleted = true; }; await created.DeleteAsync (); Assert.That (deleted, Is.True, "Expected the Deleted event to be emitted for the UnitTests folder."); Assert.That (created.Exists, Is.False, "Expected Exists to be false after deleting the folder."); await client.DisconnectAsync (true); } } static List CreateGetFolderCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" Level1/Level2/Level3 RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-level3.txt"), new ImapReplayCommand ("A00000006 LIST \"\" Level1/Level2 RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-level2.txt"), new ImapReplayCommand ("A00000007 LIST \"\" Level1 RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-level1.txt"), new ImapReplayCommand ("A00000008 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestGetFolder () { var commands = CreateGetFolderCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var level3 = client.GetFolder ("Level1/Level2/Level3"); Assert.That (level3.FullName, Is.EqualTo ("Level1/Level2/Level3")); Assert.That (level3.Name, Is.EqualTo ("Level3")); Assert.That (level3.DirectorySeparator, Is.EqualTo ('/')); Assert.That (level3.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren)); var level2 = level3.ParentFolder; Assert.That (level2.FullName, Is.EqualTo ("Level1/Level2")); Assert.That (level2.Name, Is.EqualTo ("Level2")); Assert.That (level2.DirectorySeparator, Is.EqualTo ('/')); Assert.That (level2.Attributes, Is.EqualTo (FolderAttributes.HasChildren)); var level1 = level2.ParentFolder; Assert.That (level1.FullName, Is.EqualTo ("Level1")); Assert.That (level1.Name, Is.EqualTo ("Level1")); Assert.That (level1.DirectorySeparator, Is.EqualTo ('/')); Assert.That (level1.Attributes, Is.EqualTo (FolderAttributes.HasChildren)); var personal = level1.ParentFolder; Assert.That (personal.FullName, Is.EqualTo (string.Empty)); Assert.That (personal.Name, Is.EqualTo (string.Empty)); Assert.That (personal.IsNamespace, Is.True, "IsNamespace"); client.Disconnect (true); } } [Test] public async Task TestGetFolderAsync () { var commands = CreateGetFolderCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var level3 = await client.GetFolderAsync ("Level1/Level2/Level3"); Assert.That (level3.FullName, Is.EqualTo ("Level1/Level2/Level3")); Assert.That (level3.Name, Is.EqualTo ("Level3")); Assert.That (level3.DirectorySeparator, Is.EqualTo ('/')); Assert.That (level3.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren)); var level2 = level3.ParentFolder; Assert.That (level2.FullName, Is.EqualTo ("Level1/Level2")); Assert.That (level2.Name, Is.EqualTo ("Level2")); Assert.That (level2.DirectorySeparator, Is.EqualTo ('/')); Assert.That (level2.Attributes, Is.EqualTo (FolderAttributes.HasChildren)); var level1 = level2.ParentFolder; Assert.That (level1.FullName, Is.EqualTo ("Level1")); Assert.That (level1.Name, Is.EqualTo ("Level1")); Assert.That (level1.DirectorySeparator, Is.EqualTo ('/')); Assert.That (level1.Attributes, Is.EqualTo (FolderAttributes.HasChildren)); var personal = level1.ParentFolder; Assert.That (personal.FullName, Is.EqualTo (string.Empty)); Assert.That (personal.Name, Is.EqualTo (string.Empty)); Assert.That (personal.IsNamespace, Is.True, "IsNamespace"); await client.DisconnectAsync (true); } } static List CreateIdentifyCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 ID NIL\r\n", "common.id.txt"), new ImapReplayCommand ("A00000006 ID (\"name\" \"MailKit\" \"version\" \"1.0\" \"vendor\" \"Xamarin Inc.\" \"address\" {35+}\r\n1 Memorial Dr.\r\nCambridge, MA 02142)\r\n", "common.id.txt"), new ImapReplayCommand ("A00000007 ID (\"name\" \"MailKit\" \"version\" \"1.0\" \"vendor\" \"Xamarin Inc.\" \"address\" NIL)\r\n", "common.id.txt"), }; } [Test] public void TestIdentify () { var commands = CreateIdentifyCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { ImapImplementation implementation; try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); try { client.Authenticate (new NetworkCredential ("username", "password")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); implementation = client.Identify (null); Assert.That (implementation, Is.Not.Null, "Expected a non-null ID response."); Assert.That (implementation.Name, Is.EqualTo ("GImap")); Assert.That (implementation.Vendor, Is.EqualTo ("Google, Inc.")); Assert.That (implementation.SupportUrl, Is.EqualTo ("http://support.google.com/mail")); Assert.That (implementation.Version, Is.EqualTo ("gmail_imap_150623.03_p1")); Assert.That (implementation.Properties["remote-host"], Is.EqualTo ("127.0.0.1")); implementation = new ImapImplementation { Name = "MailKit", Version = "1.0", Vendor = "Xamarin Inc.", Address = "1 Memorial Dr.\r\nCambridge, MA 02142" }; implementation = client.Identify (implementation); Assert.That (implementation, Is.Not.Null, "Expected a non-null ID response."); Assert.That (implementation.Name, Is.EqualTo ("GImap")); Assert.That (implementation.Vendor, Is.EqualTo ("Google, Inc.")); Assert.That (implementation.SupportUrl, Is.EqualTo ("http://support.google.com/mail")); Assert.That (implementation.Version, Is.EqualTo ("gmail_imap_150623.03_p1")); Assert.That (implementation.Properties["remote-host"], Is.EqualTo ("127.0.0.1")); implementation = new ImapImplementation { Name = "MailKit", Version = "1.0", Vendor = "Xamarin Inc.", Address = null }; implementation = client.Identify (implementation); Assert.That (implementation, Is.Not.Null, "Expected a non-null ID response."); Assert.That (implementation.Name, Is.EqualTo ("GImap")); Assert.That (implementation.Vendor, Is.EqualTo ("Google, Inc.")); Assert.That (implementation.SupportUrl, Is.EqualTo ("http://support.google.com/mail")); Assert.That (implementation.Version, Is.EqualTo ("gmail_imap_150623.03_p1")); Assert.That (implementation.Properties["remote-host"], Is.EqualTo ("127.0.0.1")); // disable ID support client.Capabilities &= ~ImapCapabilities.Id; Assert.Throws (() => client.Identify (null)); client.Disconnect (false); } } [Test] public async Task TestIdentifyAsync () { var commands = CreateIdentifyCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { ImapImplementation implementation; try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.IsSecure, Is.False, "IsSecure should be false."); Assert.That (client.Capabilities, Is.EqualTo (GMailInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (5)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("OAUTHBEARER"), "Expected SASL OAUTHBEARER auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); try { await client.AuthenticateAsync (new NetworkCredential ("username", "password")); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (GMailAuthenticatedCapabilities)); implementation = await client.IdentifyAsync (null); Assert.That (implementation, Is.Not.Null, "Expected a non-null ID response."); Assert.That (implementation.Name, Is.EqualTo ("GImap")); Assert.That (implementation.Vendor, Is.EqualTo ("Google, Inc.")); Assert.That (implementation.SupportUrl, Is.EqualTo ("http://support.google.com/mail")); Assert.That (implementation.Version, Is.EqualTo ("gmail_imap_150623.03_p1")); Assert.That (implementation.Properties["remote-host"], Is.EqualTo ("127.0.0.1")); implementation = new ImapImplementation { Name = "MailKit", Version = "1.0", Vendor = "Xamarin Inc.", Address = "1 Memorial Dr.\r\nCambridge, MA 02142" }; implementation = await client.IdentifyAsync (implementation); Assert.That (implementation, Is.Not.Null, "Expected a non-null ID response."); Assert.That (implementation.Name, Is.EqualTo ("GImap")); Assert.That (implementation.Vendor, Is.EqualTo ("Google, Inc.")); Assert.That (implementation.SupportUrl, Is.EqualTo ("http://support.google.com/mail")); Assert.That (implementation.Version, Is.EqualTo ("gmail_imap_150623.03_p1")); Assert.That (implementation.Properties["remote-host"], Is.EqualTo ("127.0.0.1")); implementation = new ImapImplementation { Name = "MailKit", Version = "1.0", Vendor = "Xamarin Inc.", Address = null }; implementation = await client.IdentifyAsync (implementation); Assert.That (implementation, Is.Not.Null, "Expected a non-null ID response."); Assert.That (implementation.Name, Is.EqualTo ("GImap")); Assert.That (implementation.Vendor, Is.EqualTo ("Google, Inc.")); Assert.That (implementation.SupportUrl, Is.EqualTo ("http://support.google.com/mail")); Assert.That (implementation.Version, Is.EqualTo ("gmail_imap_150623.03_p1")); Assert.That (implementation.Properties["remote-host"], Is.EqualTo ("127.0.0.1")); // disable ID support client.Capabilities &= ~ImapCapabilities.Id; Assert.ThrowsAsync (() => client.IdentifyAsync (null)); await client.DisconnectAsync (false); } } static List CreateIdleCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt"), new ImapReplayCommand ("A00000006 IDLE\r\n", "gmail.idle.txt"), new ImapReplayCommand ("A00000006", "DONE\r\n", "gmail.idle-done.txt"), new ImapReplayCommand ("A00000007 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestIdle () { var commands = CreateIdleCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } using (var done = new CancellationTokenSource ()) { Assert.Throws (() => client.Idle (CancellationToken.None)); // Should throw InvalidOperationException until a folder is selected. Assert.Throws (() => client.Idle (done.Token)); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); int count = 0, expunged = 0, flags = 0; bool droppedToZero = false; inbox.MessageExpunged += (o, e) => { expunged++; Assert.That (e.Index, Is.EqualTo (0), "Expunged Index"); }; inbox.MessageFlagsChanged += (o, e) => { flags++; Assert.That (e.Flags, Is.EqualTo (MessageFlags.Answered | MessageFlags.Deleted | MessageFlags.Seen), "Flags"); }; inbox.CountChanged += (o, e) => { count++; if (inbox.Count == 0) droppedToZero = true; else if (droppedToZero && inbox.Count == 1) done.Cancel (); }; client.Idle (done.Token); Assert.That (expunged, Is.EqualTo (21), "Unexpected number of Expunged events"); Assert.That (count, Is.EqualTo (2), "Unexpected number of CountChanged events"); Assert.That (flags, Is.EqualTo (21), "Unexpected number of FlagsChanged events"); Assert.That (inbox, Has.Count.EqualTo (1), "Count"); } client.Disconnect (true); } } [Test] public async Task TestIdleAsync () { var commands = CreateIdleCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } using (var done = new CancellationTokenSource ()) { Assert.ThrowsAsync (() => client.IdleAsync (CancellationToken.None)); // Should throw InvalidOperationException until a folder is selected. Assert.ThrowsAsync (() => client.IdleAsync (done.Token)); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); int count = 0, expunged = 0, flags = 0; bool droppedToZero = false; inbox.MessageExpunged += (o, e) => { expunged++; Assert.That (e.Index, Is.EqualTo (0), "Expunged Index"); }; inbox.MessageFlagsChanged += (o, e) => { flags++; Assert.That (e.Flags, Is.EqualTo (MessageFlags.Answered | MessageFlags.Deleted | MessageFlags.Seen), "Flags"); }; inbox.CountChanged += (o, e) => { count++; if (inbox.Count == 0) droppedToZero = true; else if (droppedToZero && inbox.Count == 1) done.Cancel (); }; await client.IdleAsync (done.Token); Assert.That (expunged, Is.EqualTo (21), "Unexpected number of Expunged events"); Assert.That (count, Is.EqualTo (2), "Unexpected number of CountChanged events"); Assert.That (flags, Is.EqualTo (21), "Unexpected number of FlagsChanged events"); Assert.That (inbox, Has.Count.EqualTo (1), "Count"); } await client.DisconnectAsync (true); } } static List CreateIdleNotSupportedCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt"), new ImapReplayCommand ("A00000006 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestIdleNotSupported () { var commands = CreateIdleNotSupportedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); // disable IDLE client.Capabilities &= ~ImapCapabilities.Idle; using (var done = new CancellationTokenSource ()) Assert.Throws (() => client.Idle (done.Token)); client.Disconnect (true); } } [Test] public async Task TestIdleNotSupportedAsync () { var commands = CreateIdleNotSupportedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); // disable IDLE client.Capabilities &= ~ImapCapabilities.Idle; using (var done = new CancellationTokenSource ()) Assert.ThrowsAsync (() => client.IdleAsync (done.Token)); await client.DisconnectAsync (true); } } // TODO: test MessageNew w/ headers static List CreateNotifyCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting-preauth.txt"), new ImapReplayCommand ("A00000000 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000001 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000002 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"%\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.notify-list-personal.txt"), new ImapReplayCommand ("A00000004 EXAMINE Folder (CONDSTORE)\r\n", "dovecot.examine-folder.txt"), new ImapReplayCommand ("A00000005 NOTIFY SET STATUS (PERSONAL (MailboxName SubscriptionChange)) (SELECTED (MessageNew (UID FLAGS ENVELOPE BODYSTRUCTURE MODSEQ) MessageExpunge FlagChange)) (SUBTREE (INBOX Folder) (MessageNew MessageExpunge MailboxMetadataChange ServerMetadataChange))\r\n", "dovecot.notify.txt"), new ImapReplayCommand ("A00000006 IDLE\r\n", "dovecot.notify-idle.txt"), new ImapReplayCommand ("A00000006", "DONE\r\n", "dovecot.notify-idle-done.txt"), new ImapReplayCommand ("A00000007 NOTIFY NONE\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000008 NOTIFY SET STATUS (SELECTED (MessageNew (UID FLAGS ENVELOPE BODYSTRUCTURE MODSEQ BODY.PEEK[HEADER.FIELDS (REFERENCES)]) MessageExpunge FlagChange)) (MAILBOXES INBOX (MessageNew MessageExpunge MailboxMetadataChange ServerMetadataChange))\r\n", "dovecot.notify.txt"), new ImapReplayCommand ("A00000009 NOTIFY NONE\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000010 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestNotify () { const MessageSummaryItems items = MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq; var commands = CreateNotifyCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); var inbox = client.Inbox; var folder = folders.FirstOrDefault (x => x.Name == "Folder"); var deleteMe = folders.FirstOrDefault (x => x.Name == "DeleteMe"); var renameMe = folders.FirstOrDefault (x => x.Name == "RenameMe"); var subscribeMe = folders.FirstOrDefault (x => x.Name == "SubscribeMe"); var unsubscribeMe = folders.FirstOrDefault (x => x.Name == "UnsubscribeMe"); folder.Open (FolderAccess.ReadOnly); client.Notify (true, new List { new ImapEventGroup (ImapMailboxFilter.Personal, new List { ImapEvent.MailboxName, ImapEvent.SubscriptionChange }), new ImapEventGroup (ImapMailboxFilter.Selected, new List { new ImapEvent.MessageNew (items), ImapEvent.MessageExpunge, ImapEvent.FlagChange }), new ImapEventGroup (new ImapMailboxFilter.Subtree (inbox, folder), new List { new ImapEvent.MessageNew (new FetchRequest ()), ImapEvent.MessageExpunge, ImapEvent.MailboxMetadataChange, ImapEvent.ServerMetadataChange }), }); // Passing true to notify will update Count Assert.That (inbox, Has.Count.EqualTo (1), "Messages in INBOX"); Assert.That (folder, Has.Count.EqualTo (0), "Messages in Folder"); IMessageSummary fetched = null; var folderMessageSummaryFetched = 0; var folderCountChanged = 0; var folderFlagsChanged = 0; var inboxHighestModSeqChanged = 0; var inboxMetadataChanged = 0; var inboxCountChanged = 0; var metadataChanged = 0; var unsubscribed = 0; var subscribed = 0; var created = 0; var deleted = 0; var renamed = 0; client.FolderCreated += (sender, e) => { Assert.That (e.Folder.FullName, Is.EqualTo ("NewFolder"), "e.Folder.FullName"); Assert.That (e.Folder.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren), "e.Folder.Attributes"); created++; }; client.MetadataChanged += (sender, e) => { Assert.That (e.Metadata.Tag.Id, Is.EqualTo ("/private/comment"), "Metadata.Tag"); Assert.That (e.Metadata.Value, Is.EqualTo ("this is a comment"), "Metadata.Value"); metadataChanged++; }; inbox.MetadataChanged += (sender, e) => { Assert.That (e.Metadata.Tag.Id, Is.EqualTo ("/private/comment"), "Metadata.Tag"); Assert.That (e.Metadata.Value, Is.EqualTo ("this is a comment"), "Metadata.Value"); inboxMetadataChanged++; }; deleteMe.Deleted += (sender, e) => { deleted++; }; renameMe.Renamed += (sender, e) => { Assert.That (renameMe.FullName, Is.EqualTo ("RenamedFolder"), "renameMe.FullName"); renamed++; }; subscribeMe.Subscribed += (sender, e) => { subscribed++; }; unsubscribeMe.Unsubscribed += (sender, e) => { unsubscribed++; }; inbox.HighestModSeqChanged += (sender, e) => { inboxHighestModSeqChanged++; }; inbox.CountChanged += (sender, e) => { inboxCountChanged++; }; folder.MessageSummaryFetched += (sender, e) => { folderMessageSummaryFetched++; fetched = e.Message; }; folder.MessageFlagsChanged += (sender, e) => { folderFlagsChanged++; }; folder.CountChanged += (sender, e) => { folderCountChanged++; }; using (var done = new CancellationTokenSource ()) { folder.CountChanged += (o, e) => { done.Cancel (); }; client.Idle (done.Token); } Assert.That (inbox, Has.Count.EqualTo (3), "Inbox.Count"); Assert.That (inbox.Unread, Is.EqualTo (3), "Inbox.Unread"); Assert.That (inbox.UidNext.Value.Id, Is.EqualTo (4), "Inbox.UidNext"); Assert.That (inbox.HighestModSeq, Is.EqualTo (3), "Inbox.HighestModSeq"); Assert.That (inboxHighestModSeqChanged, Is.EqualTo (1), "Inbox.HighestModSeqChanged"); Assert.That (inboxMetadataChanged, Is.EqualTo (1), "Inbox.MetadataChanged"); Assert.That (inboxCountChanged, Is.EqualTo (1), "Inbox.CountChanged"); Assert.That (created, Is.EqualTo (1), "FolderCreated"); Assert.That (deleted, Is.EqualTo (1), "deleteMe.Deleted"); Assert.That (renamed, Is.EqualTo (1), "renameMe.Renamed"); Assert.That (subscribed, Is.EqualTo (1), "subscribeMe.Deleted"); Assert.That (unsubscribed, Is.EqualTo (1), "unsubscribeMe.Renamed"); Assert.That (metadataChanged, Is.EqualTo (1), "metadataChanged"); Assert.That (folder, Has.Count.EqualTo (1), "Folder.Count"); Assert.That (folderCountChanged, Is.EqualTo (1), "Folder.CountChanged"); Assert.That (folderFlagsChanged, Is.EqualTo (1), "Folder.MessageFlagsChanged"); Assert.That (folderMessageSummaryFetched, Is.EqualTo (1), "Folder.MessageSummaryFetched"); Assert.That (fetched.UniqueId.Id, Is.EqualTo (1), "fetched.UniqueId"); Assert.That (fetched.Flags.Value, Is.EqualTo (MessageFlags.Recent), "fetched.Flags"); Assert.That (fetched.Envelope.Subject, Is.EqualTo ("IMAP4rev1 WG mtg summary and minutes"), "fetched.Envelope.Subject"); var body = fetched.Body as BodyPartBasic; Assert.That (fetched.Body, Is.Not.Null, "fetched.Body"); Assert.That (body.Octets, Is.EqualTo (3028), "fetched.Body.Octets"); Assert.That (fetched.ModSeq.Value, Is.EqualTo (1), "fetched.ModSeq"); client.DisableNotify (); client.Notify (true, new List { new ImapEventGroup (ImapMailboxFilter.Selected, new List { new ImapEvent.MessageNew (items | MessageSummaryItems.References), ImapEvent.MessageExpunge, ImapEvent.FlagChange }), new ImapEventGroup (new ImapMailboxFilter.Mailboxes (inbox), new List { new ImapEvent.MessageNew (), ImapEvent.MessageExpunge, ImapEvent.MailboxMetadataChange, ImapEvent.ServerMetadataChange }), }); client.DisableNotify (); client.Disconnect (true); } } [Test] public async Task TestNotifyAsync () { const MessageSummaryItems items = MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq; var commands = CreateNotifyCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); var inbox = client.Inbox; var folder = folders.FirstOrDefault (x => x.Name == "Folder"); var deleteMe = folders.FirstOrDefault (x => x.Name == "DeleteMe"); var renameMe = folders.FirstOrDefault (x => x.Name == "RenameMe"); var subscribeMe = folders.FirstOrDefault (x => x.Name == "SubscribeMe"); var unsubscribeMe = folders.FirstOrDefault (x => x.Name == "UnsubscribeMe"); await folder.OpenAsync (FolderAccess.ReadOnly); await client.NotifyAsync (true, new List { new ImapEventGroup (ImapMailboxFilter.Personal, new List { ImapEvent.MailboxName, ImapEvent.SubscriptionChange }), new ImapEventGroup (ImapMailboxFilter.Selected, new List { new ImapEvent.MessageNew (items), ImapEvent.MessageExpunge, ImapEvent.FlagChange }), new ImapEventGroup (new ImapMailboxFilter.Subtree (inbox, folder), new List { new ImapEvent.MessageNew (new FetchRequest ()), ImapEvent.MessageExpunge, ImapEvent.MailboxMetadataChange, ImapEvent.ServerMetadataChange }), }); // Passing true to notify will update Count Assert.That (inbox, Has.Count.EqualTo (1), "Messages in INBOX"); Assert.That (folder, Has.Count.EqualTo (0), "Messages in Folder"); IMessageSummary fetched = null; var folderMessageSummaryFetched = 0; var folderCountChanged = 0; var folderFlagsChanged = 0; var inboxHighestModSeqChanged = 0; var inboxMetadataChanged = 0; var inboxCountChanged = 0; var metadataChanged = 0; var unsubscribed = 0; var subscribed = 0; var created = 0; var deleted = 0; var renamed = 0; client.FolderCreated += (sender, e) => { Assert.That (e.Folder.FullName, Is.EqualTo ("NewFolder"), "e.Folder.FullName"); Assert.That (e.Folder.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren), "e.Folder.Attributes"); created++; }; client.MetadataChanged += (sender, e) => { Assert.That (e.Metadata.Tag.Id, Is.EqualTo ("/private/comment"), "Metadata.Tag"); Assert.That (e.Metadata.Value, Is.EqualTo ("this is a comment"), "Metadata.Value"); metadataChanged++; }; inbox.MetadataChanged += (sender, e) => { Assert.That (e.Metadata.Tag.Id, Is.EqualTo ("/private/comment"), "Metadata.Tag"); Assert.That (e.Metadata.Value, Is.EqualTo ("this is a comment"), "Metadata.Value"); inboxMetadataChanged++; }; deleteMe.Deleted += (sender, e) => { deleted++; }; renameMe.Renamed += (sender, e) => { Assert.That (renameMe.FullName, Is.EqualTo ("RenamedFolder"), "renameMe.FullName"); renamed++; }; subscribeMe.Subscribed += (sender, e) => { subscribed++; }; unsubscribeMe.Unsubscribed += (sender, e) => { unsubscribed++; }; inbox.HighestModSeqChanged += (sender, e) => { inboxHighestModSeqChanged++; }; inbox.CountChanged += (sender, e) => { inboxCountChanged++; }; folder.MessageSummaryFetched += (sender, e) => { folderMessageSummaryFetched++; fetched = e.Message; }; folder.MessageFlagsChanged += (sender, e) => { folderFlagsChanged++; }; folder.CountChanged += (sender, e) => { folderCountChanged++; }; using (var done = new CancellationTokenSource ()) { folder.CountChanged += (o, e) => { done.Cancel (); }; await client.IdleAsync (done.Token); } Assert.That (inbox, Has.Count.EqualTo (3), "Inbox.Count"); Assert.That (inbox.Unread, Is.EqualTo (3), "Inbox.Unread"); Assert.That (inbox.UidNext.Value.Id, Is.EqualTo (4), "Inbox.UidNext"); Assert.That (inbox.HighestModSeq, Is.EqualTo (3), "Inbox.HighestModSeq"); Assert.That (inboxHighestModSeqChanged, Is.EqualTo (1), "Inbox.HighestModSeqChanged"); Assert.That (inboxMetadataChanged, Is.EqualTo (1), "Inbox.MetadataChanged"); Assert.That (inboxCountChanged, Is.EqualTo (1), "Inbox.CountChanged"); Assert.That (created, Is.EqualTo (1), "FolderCreated"); Assert.That (deleted, Is.EqualTo (1), "deleteMe.Deleted"); Assert.That (renamed, Is.EqualTo (1), "renameMe.Renamed"); Assert.That (subscribed, Is.EqualTo (1), "subscribeMe.Deleted"); Assert.That (unsubscribed, Is.EqualTo (1), "unsubscribeMe.Renamed"); Assert.That (metadataChanged, Is.EqualTo (1), "metadataChanged"); Assert.That (folder, Has.Count.EqualTo (1), "Folder.Count"); Assert.That (folderCountChanged, Is.EqualTo (1), "Folder.CountChanged"); Assert.That (folderFlagsChanged, Is.EqualTo (1), "Folder.MessageFlagsChanged"); Assert.That (folderMessageSummaryFetched, Is.EqualTo (1), "Folder.MessageSummaryFetched"); Assert.That (fetched.UniqueId.Id, Is.EqualTo (1), "fetched.UniqueId"); Assert.That (fetched.Flags.Value, Is.EqualTo (MessageFlags.Recent), "fetched.Flags"); Assert.That (fetched.Envelope.Subject, Is.EqualTo ("IMAP4rev1 WG mtg summary and minutes"), "fetched.Envelope.Subject"); var body = fetched.Body as BodyPartBasic; Assert.That (fetched.Body, Is.Not.Null, "fetched.Body"); Assert.That (body.Octets, Is.EqualTo (3028), "fetched.Body.Octets"); Assert.That (fetched.ModSeq.Value, Is.EqualTo (1), "fetched.ModSeq"); await client.DisableNotifyAsync (); await client.NotifyAsync (true, new List { new ImapEventGroup (ImapMailboxFilter.Selected, new List { new ImapEvent.MessageNew (items | MessageSummaryItems.References), ImapEvent.MessageExpunge, ImapEvent.FlagChange }), new ImapEventGroup (new ImapMailboxFilter.Mailboxes (inbox), new List { new ImapEvent.MessageNew (), ImapEvent.MessageExpunge, ImapEvent.MailboxMetadataChange, ImapEvent.ServerMetadataChange }), }); await client.DisableNotifyAsync (); await client.DisconnectAsync (true); } } static List CreateCompressCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 COMPRESS DEFLATE\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000006 COMPRESS DEFLATE\r\n", Encoding.ASCII.GetBytes ("A00000006 NO [COMPRESSIONACTIVE] DEFLATE active via COMPRESS\r\n"), true), new ImapReplayCommand ("A00000007 COMPRESS DEFLATE\r\n", Encoding.ASCII.GetBytes ("A00000007 NO Compress failed for an unknown reason.\r\n"), true), new ImapReplayCommand ("A00000008 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt", true), new ImapReplayCommand ("A00000009 UID SEARCH RETURN (ALL) ALL\r\n", "gmail.search.txt", true), new ImapReplayCommand ("A00000010 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 +FLAGS.SILENT (\\Deleted)\r\n", ImapReplayCommandResponse.OK, true), new ImapReplayCommand ("A00000011 UID EXPUNGE 1:3\r\n", "gmail.expunge.txt", true), new ImapReplayCommand ("A00000012 LOGOUT\r\n", "gmail.logout.txt", true) }; } [Test] public void TestCompress () { var commands = CreateCompressCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.Compress (); client.Compress (); Assert.Throws (() => client.Compress ()); int changed = 0, expunged = 0; var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); inbox.MessageExpunged += (o, e) => { expunged++; Assert.That (e.Index, Is.EqualTo (0), "Expunged event message index"); }; inbox.CountChanged += (o, e) => { changed++; }; var uids = inbox.Search (SearchQuery.All); inbox.AddFlags (uids, MessageFlags.Deleted, true); uids = new UniqueIdRange (0, 1, 3); inbox.Expunge (uids); Assert.That (expunged, Is.EqualTo (3), "Unexpected number of Expunged events"); Assert.That (changed, Is.EqualTo (1), "Unexpected number of CountChanged events"); Assert.That (inbox, Has.Count.EqualTo (18), "Count"); client.Disconnect (true); } } [Test] public async Task TestCompressAsync () { var commands = CreateCompressCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.CompressAsync (); await client.CompressAsync (); Assert.ThrowsAsync (() => client.CompressAsync ()); int changed = 0, expunged = 0; var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); inbox.MessageExpunged += (o, e) => { expunged++; Assert.That (e.Index, Is.EqualTo (0), "Expunged event message index"); }; inbox.CountChanged += (o, e) => { changed++; }; var uids = await inbox.SearchAsync (SearchQuery.All); await inbox.AddFlagsAsync (uids, MessageFlags.Deleted, true); uids = new UniqueIdRange (0, 1, 3); await inbox.ExpungeAsync (uids); Assert.That (expunged, Is.EqualTo (3), "Unexpected number of Expunged events"); Assert.That (changed, Is.EqualTo (1), "Unexpected number of CountChanged events"); Assert.That (inbox, Has.Count.EqualTo (18), "Count"); await client.DisconnectAsync (true); } } static List CreateAccessControlListsCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "acl.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "acl.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 GETACL INBOX\r\n", "acl.getacl.txt"), new ImapReplayCommand ("A00000006 LISTRIGHTS INBOX smith\r\n", "acl.listrights.txt"), new ImapReplayCommand ("A00000007 MYRIGHTS INBOX\r\n", "acl.myrights.txt"), new ImapReplayCommand ("A00000008 SETACL INBOX smith +lrswida\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000009 SETACL INBOX smith -lrswida\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000010 SETACL INBOX smith lrswida\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000011 DELETEACL INBOX smith\r\n", ImapReplayCommandResponse.OK) }; } [Test] public void TestAccessControlLists () { var commands = CreateAccessControlListsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (AclInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Rights.ToString (), Is.EqualTo ("texk"), "Rights"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (AclAuthenticatedCapabilities)); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); foreach (var special in Enum.GetValues (typeof (SpecialFolder)).OfType ()) { var folder = client.GetFolder (special); if (special != SpecialFolder.Archive) { var expected = GetSpecialFolderAttribute (special) | FolderAttributes.HasNoChildren; Assert.That (folder, Is.Not.Null, $"Expected non-null {special} folder."); Assert.That (folder.Attributes, Is.EqualTo (expected), $"Expected {special} attributes to be \\HasNoChildren."); } else { Assert.That (folder, Is.Null, $"Expected null {special} folder."); } } // GETACL INBOX var acl = client.Inbox.GetAccessControlList (); Assert.That (acl, Has.Count.EqualTo (2), "The number of access controls does not match."); Assert.That (acl[0].Name, Is.EqualTo ("Fred"), "The identifier for the first access control does not match."); Assert.That (acl[0].Rights.ToString (), Is.EqualTo ("rwipslxetad"), "The access rights for the first access control does not match."); Assert.That (acl[1].Name, Is.EqualTo ("Chris"), "The identifier for the second access control does not match."); Assert.That (acl[1].Rights.ToString (), Is.EqualTo ("lrswi"), "The access rights for the second access control does not match."); // LISTRIGHTS INBOX smith Assert.Throws (() => client.Inbox.GetAccessRights (null)); //Assert.Throws (() => client.Inbox.GetAccessRights (string.Empty)); var rights = client.Inbox.GetAccessRights ("smith"); Assert.That (rights.ToString (), Is.EqualTo ("lrswipkxtecda0123456789"), "The access rights do not match for user smith."); // MYRIGHTS INBOX rights = client.Inbox.GetMyAccessRights (); Assert.That (rights.ToString (), Is.EqualTo ("rwiptsldaex"), "My access rights do not match."); // SETACL INBOX smith +lrswida var empty = new AccessRights (string.Empty); rights = new AccessRights ("lrswida"); Assert.Throws (() => client.Inbox.AddAccessRights (null, rights)); //Assert.Throws (() => client.Inbox.AddAccessRights (string.Empty, rights)); Assert.Throws (() => client.Inbox.AddAccessRights ("smith", null)); Assert.Throws (() => client.Inbox.AddAccessRights ("smith", empty)); client.Inbox.AddAccessRights ("smith", rights); // SETACL INBOX smith -lrswida Assert.Throws (() => client.Inbox.RemoveAccessRights (null, rights)); //Assert.Throws (() => client.Inbox.RemoveAccessRights (string.Empty, rights)); Assert.Throws (() => client.Inbox.RemoveAccessRights ("smith", null)); Assert.Throws (() => client.Inbox.RemoveAccessRights ("smith", empty)); client.Inbox.RemoveAccessRights ("smith", rights); // SETACL INBOX smith lrswida Assert.Throws (() => client.Inbox.SetAccessRights (null, rights)); //Assert.Throws (() => client.Inbox.SetAccessRights (string.Empty, rights)); Assert.Throws (() => client.Inbox.SetAccessRights ("smith", null)); client.Inbox.SetAccessRights ("smith", rights); // DELETEACL INBOX smith Assert.Throws (() => client.Inbox.RemoveAccess (null)); //Assert.Throws (() => client.Inbox.RemoveAccess (string.Empty)); client.Inbox.RemoveAccess ("smith"); client.Disconnect (false); } } [Test] public async Task TestAccessControlListsAsync () { var commands = CreateAccessControlListsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (AclInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); Assert.That (client.Rights.ToString (), Is.EqualTo ("texk"), "Rights"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (AclAuthenticatedCapabilities)); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); foreach (var special in Enum.GetValues (typeof (SpecialFolder)).OfType ()) { var folder = client.GetFolder (special); if (special != SpecialFolder.Archive) { var expected = GetSpecialFolderAttribute (special) | FolderAttributes.HasNoChildren; Assert.That (folder, Is.Not.Null, $"Expected non-null {special} folder."); Assert.That (folder.Attributes, Is.EqualTo (expected), $"Expected {special} attributes to be \\HasNoChildren."); } else { Assert.That (folder, Is.Null, $"Expected null {special} folder."); } } // GETACL INBOX var acl = await client.Inbox.GetAccessControlListAsync (); Assert.That (acl, Has.Count.EqualTo (2), "The number of access controls does not match."); Assert.That (acl[0].Name, Is.EqualTo ("Fred"), "The identifier for the first access control does not match."); Assert.That (acl[0].Rights.ToString (), Is.EqualTo ("rwipslxetad"), "The access rights for the first access control does not match."); Assert.That (acl[1].Name, Is.EqualTo ("Chris"), "The identifier for the second access control does not match."); Assert.That (acl[1].Rights.ToString (), Is.EqualTo ("lrswi"), "The access rights for the second access control does not match."); // LISTRIGHTS INBOX smith Assert.ThrowsAsync (async () => await client.Inbox.GetAccessRightsAsync (null)); //Assert.ThrowsAsync (async () => await client.Inbox.GetAccessRightsAsync (string.Empty)); var rights = await client.Inbox.GetAccessRightsAsync ("smith"); Assert.That (rights.ToString (), Is.EqualTo ("lrswipkxtecda0123456789"), "The access rights do not match for user smith."); // MYRIGHTS INBOX rights = await client.Inbox.GetMyAccessRightsAsync (); Assert.That (rights.ToString (), Is.EqualTo ("rwiptsldaex"), "My access rights do not match."); // SETACL INBOX smith +lrswida var empty = new AccessRights (string.Empty); rights = new AccessRights ("lrswida"); Assert.ThrowsAsync (async () => await client.Inbox.AddAccessRightsAsync (null, rights)); //Assert.ThrowsAsync (async () => await client.Inbox.AddAccessRightsAsync (string.Empty, rights)); Assert.ThrowsAsync (async () => await client.Inbox.AddAccessRightsAsync ("smith", null)); Assert.ThrowsAsync (async () => await client.Inbox.AddAccessRightsAsync ("smith", empty)); await client.Inbox.AddAccessRightsAsync ("smith", rights); // SETACL INBOX smith -lrswida Assert.ThrowsAsync (async () => await client.Inbox.RemoveAccessRightsAsync (null, rights)); //Assert.ThrowsAsync (async () => await client.Inbox.RemoveAccessRightsAsync (string.Empty, rights)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveAccessRightsAsync ("smith", null)); Assert.ThrowsAsync (async () => await client.Inbox.RemoveAccessRightsAsync ("smith", empty)); await client.Inbox.RemoveAccessRightsAsync ("smith", rights); // SETACL INBOX smith lrswida Assert.ThrowsAsync (async () => await client.Inbox.SetAccessRightsAsync (null, rights)); //Assert.ThrowsAsync (async () => await client.Inbox.SetAccessRightsAsync (string.Empty, rights)); Assert.ThrowsAsync (async () => await client.Inbox.SetAccessRightsAsync ("smith", null)); await client.Inbox.SetAccessRightsAsync ("smith", rights); // DELETEACL INBOX smith Assert.ThrowsAsync (async () => await client.Inbox.RemoveAccessAsync (null)); //Assert.ThrowsAsync (async () => await client.Inbox.RemoveAccessAsync (string.Empty)); await client.Inbox.RemoveAccessAsync ("smith"); await client.DisconnectAsync (false); } } static List CreateMetadataCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "metadata.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "metadata.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 GETMETADATA \"\" /private/comment\r\n", "metadata.getmetadata.txt"), new ImapReplayCommand ("A00000006 GETMETADATA \"\" (MAXSIZE 1024 DEPTH infinity) (/private)\r\n", "metadata.getmetadata-options.txt"), new ImapReplayCommand ("A00000007 GETMETADATA \"\" /private/comment /shared/comment\r\n", "metadata.getmetadata-multi.txt"), new ImapReplayCommand ("A00000008 SETMETADATA \"\" (/private/comment \"this is a comment\")\r\n", "metadata.setmetadata-noprivate.txt"), new ImapReplayCommand ("A00000009 SETMETADATA \"\" (/private/comment \"this comment is too long!\")\r\n", "metadata.setmetadata-maxsize.txt"), new ImapReplayCommand ("A00000010 SETMETADATA \"\" (/private/comment \"this is a private comment\" /shared/comment \"this is a shared comment\")\r\n", "metadata.setmetadata-toomany.txt"), new ImapReplayCommand ("A00000011 SETMETADATA \"\" (/private/comment NIL)\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000012 GETMETADATA INBOX /private/comment\r\n", "metadata.inbox-getmetadata.txt"), new ImapReplayCommand ("A00000013 GETMETADATA INBOX (MAXSIZE 1024 DEPTH infinity) (/private)\r\n", "metadata.inbox-getmetadata-options.txt"), new ImapReplayCommand ("A00000014 GETMETADATA INBOX /private/comment /shared/comment\r\n", "metadata.inbox-getmetadata-multi.txt"), new ImapReplayCommand ("A00000015 SETMETADATA INBOX (/private/comment \"this is a comment\")\r\n", "metadata.inbox-setmetadata-noprivate.txt"), new ImapReplayCommand ("A00000016 SETMETADATA INBOX (/private/comment \"this comment is too long!\")\r\n", "metadata.inbox-setmetadata-maxsize.txt"), new ImapReplayCommand ("A00000017 SETMETADATA INBOX (/private/comment \"this is a private comment\" /shared/comment \"this is a shared comment\")\r\n", "metadata.inbox-setmetadata-toomany.txt"), new ImapReplayCommand ("A00000018 SETMETADATA INBOX (/private/comment NIL)\r\n", ImapReplayCommandResponse.OK) }; } [Test] public void TestMetadata () { var commands = CreateMetadataCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { MetadataCollection metadata; MetadataOptions options; try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (MetadataInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (MetadataAuthenticatedCapabilities)); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); foreach (var special in Enum.GetValues (typeof (SpecialFolder)).OfType ()) { var folder = client.GetFolder (special); if (special != SpecialFolder.Archive) { var expected = GetSpecialFolderAttribute (special) | FolderAttributes.HasNoChildren; Assert.That (folder, Is.Not.Null, $"Expected non-null {special} folder."); Assert.That (folder.Attributes, Is.EqualTo (expected), $"Expected {special} attributes to be \\HasNoChildren."); } else { Assert.That (folder, Is.Null, $"Expected null {special} folder."); } } // GETMETADATA Assert.That (client.GetMetadata (MetadataTag.PrivateComment), Is.EqualTo ("this is a comment"), "The shared comment does not match."); options = new MetadataOptions { Depth = int.MaxValue, MaxSize = 1024 }; metadata = client.GetMetadata (options, new [] { new MetadataTag ("/private") }); Assert.That (metadata, Has.Count.EqualTo (1), "Expected 1 metadata value."); Assert.That (metadata[0].Tag.Id, Is.EqualTo (MetadataTag.PrivateComment.Id), "Metadata tag did not match."); Assert.That (metadata[0].Value, Is.EqualTo ("this is a private comment"), "Metadata value did not match."); Assert.That (options.LongEntries, Is.EqualTo (2199), "LongEntries does not match."); metadata = client.GetMetadata (new [] { MetadataTag.PrivateComment, MetadataTag.SharedComment }); Assert.That (metadata, Has.Count.EqualTo (2), "Expected 2 metadata values."); Assert.That (metadata[0].Tag.Id, Is.EqualTo (MetadataTag.PrivateComment.Id), "First metadata tag did not match."); Assert.That (metadata[1].Tag.Id, Is.EqualTo (MetadataTag.SharedComment.Id), "Second metadata tag did not match."); Assert.That (metadata[0].Value, Is.EqualTo ("this is a private comment"), "First metadata value did not match."); Assert.That (metadata[1].Value, Is.EqualTo ("this is a shared comment"), "Second metadata value did not match."); // SETMETADATA Assert.Throws (() => client.SetMetadata (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this is a comment") })), "Expected NOPRIVATE RESP-CODE."); Assert.Throws (() => client.SetMetadata (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this comment is too long!") })), "Expected MAXSIZE RESP-CODE."); Assert.Throws (() => client.SetMetadata (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this is a private comment"), new Metadata (MetadataTag.SharedComment, "this is a shared comment"), })), "Expected TOOMANY RESP-CODE."); // This will no-op client.SetMetadata (new MetadataCollection ()); client.SetMetadata (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, null) })); // GETMETADATA folder Assert.That (inbox.GetMetadata (MetadataTag.PrivateComment), Is.EqualTo ("this is a comment"), "The shared comment does not match."); options = new MetadataOptions { Depth = int.MaxValue, MaxSize = 1024 }; metadata = inbox.GetMetadata (options, new [] { new MetadataTag ("/private") }); Assert.That (metadata, Has.Count.EqualTo (1), "Expected 1 metadata value."); Assert.That (metadata[0].Tag.Id, Is.EqualTo (MetadataTag.PrivateComment.Id), "Metadata tag did not match."); Assert.That (metadata[0].Value, Is.EqualTo ("this is a private comment"), "Metadata value did not match."); Assert.That (options.LongEntries, Is.EqualTo (2199), "LongEntries does not match."); metadata = inbox.GetMetadata (new [] { MetadataTag.PrivateComment, MetadataTag.SharedComment }); Assert.That (metadata, Has.Count.EqualTo (2), "Expected 2 metadata values."); Assert.That (metadata[0].Tag.Id, Is.EqualTo (MetadataTag.PrivateComment.Id), "First metadata tag did not match."); Assert.That (metadata[1].Tag.Id, Is.EqualTo (MetadataTag.SharedComment.Id), "Second metadata tag did not match."); Assert.That (metadata[0].Value, Is.EqualTo ("this is a private comment"), "First metadata value did not match."); Assert.That (metadata[1].Value, Is.EqualTo ("this is a shared comment"), "Second metadata value did not match."); // This will shortcut and return an empty collection metadata = client.GetMetadata (Array.Empty ()); Assert.That (metadata, Is.Empty, "Expected 0 metadata values."); // SETMETADATA folder Assert.Throws (() => inbox.SetMetadata (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this is a comment") })), "Expected NOPRIVATE RESP-CODE."); Assert.Throws (() => inbox.SetMetadata (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this comment is too long!") })), "Expected MAXSIZE RESP-CODE."); Assert.Throws (() => inbox.SetMetadata (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this is a private comment"), new Metadata (MetadataTag.SharedComment, "this is a shared comment"), })), "Expected TOOMANY RESP-CODE."); inbox.SetMetadata (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, null) })); client.Disconnect (false); } } [Test] public async Task TestMetadataAsync () { var commands = CreateMetadataCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { MetadataCollection metadata; MetadataOptions options; try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (MetadataInitialCapabilities)); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (4)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH"), "Expected SASL XOAUTH auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN-CLIENTTOKEN"), "Expected SASL PLAIN-CLIENTTOKEN auth mechanism"); // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (MetadataAuthenticatedCapabilities)); var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); foreach (var special in Enum.GetValues (typeof (SpecialFolder)).OfType ()) { var folder = client.GetFolder (special); if (special != SpecialFolder.Archive) { var expected = GetSpecialFolderAttribute (special) | FolderAttributes.HasNoChildren; Assert.That (folder, Is.Not.Null, $"Expected non-null {special} folder."); Assert.That (folder.Attributes, Is.EqualTo (expected), $"Expected {special} attributes to be \\HasNoChildren."); } else { Assert.That (folder, Is.Null, $"Expected null {special} folder."); } } // GETMETADATA Assert.That (await client.GetMetadataAsync (MetadataTag.PrivateComment), Is.EqualTo ("this is a comment"), "The shared comment does not match."); options = new MetadataOptions { Depth = int.MaxValue, MaxSize = 1024 }; metadata = await client.GetMetadataAsync (options, new [] { new MetadataTag ("/private") }); Assert.That (metadata, Has.Count.EqualTo (1), "Expected 1 metadata value."); Assert.That (metadata[0].Tag.Id, Is.EqualTo (MetadataTag.PrivateComment.Id), "Metadata tag did not match."); Assert.That (metadata[0].Value, Is.EqualTo ("this is a private comment"), "Metadata value did not match."); Assert.That (options.LongEntries, Is.EqualTo (2199), "LongEntries does not match."); metadata = await client.GetMetadataAsync (new [] { MetadataTag.PrivateComment, MetadataTag.SharedComment }); Assert.That (metadata, Has.Count.EqualTo (2), "Expected 2 metadata values."); Assert.That (metadata[0].Tag.Id, Is.EqualTo (MetadataTag.PrivateComment.Id), "First metadata tag did not match."); Assert.That (metadata[1].Tag.Id, Is.EqualTo (MetadataTag.SharedComment.Id), "Second metadata tag did not match."); Assert.That (metadata[0].Value, Is.EqualTo ("this is a private comment"), "First metadata value did not match."); Assert.That (metadata[1].Value, Is.EqualTo ("this is a shared comment"), "Second metadata value did not match."); // This will shortcut and return an empty collection metadata = await client.GetMetadataAsync (Array.Empty ()); Assert.That (metadata, Is.Empty, "Expected 0 metadata values."); // SETMETADATA Assert.ThrowsAsync (async () => await client.SetMetadataAsync (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this is a comment") })), "Expected NOPRIVATE RESP-CODE."); Assert.ThrowsAsync (async () => await client.SetMetadataAsync (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this comment is too long!") })), "Expected MAXSIZE RESP-CODE."); Assert.ThrowsAsync (async () => await client.SetMetadataAsync (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this is a private comment"), new Metadata (MetadataTag.SharedComment, "this is a shared comment"), })), "Expected TOOMANY RESP-CODE."); // This will no-op await client.SetMetadataAsync (new MetadataCollection ()); await client.SetMetadataAsync (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, null) })); // GETMETADATA folder Assert.That (await inbox.GetMetadataAsync (MetadataTag.PrivateComment), Is.EqualTo ("this is a comment"), "The shared comment does not match."); options = new MetadataOptions { Depth = int.MaxValue, MaxSize = 1024 }; metadata = await inbox.GetMetadataAsync (options, new [] { new MetadataTag ("/private") }); Assert.That (metadata, Has.Count.EqualTo (1), "Expected 1 metadata value."); Assert.That (metadata[0].Tag.Id, Is.EqualTo (MetadataTag.PrivateComment.Id), "Metadata tag did not match."); Assert.That (metadata[0].Value, Is.EqualTo ("this is a private comment"), "Metadata value did not match."); Assert.That (options.LongEntries, Is.EqualTo (2199), "LongEntries does not match."); metadata = await inbox.GetMetadataAsync (new [] { MetadataTag.PrivateComment, MetadataTag.SharedComment }); Assert.That (metadata, Has.Count.EqualTo (2), "Expected 2 metadata values."); Assert.That (metadata[0].Tag.Id, Is.EqualTo (MetadataTag.PrivateComment.Id), "First metadata tag did not match."); Assert.That (metadata[1].Tag.Id, Is.EqualTo (MetadataTag.SharedComment.Id), "Second metadata tag did not match."); Assert.That (metadata[0].Value, Is.EqualTo ("this is a private comment"), "First metadata value did not match."); Assert.That (metadata[1].Value, Is.EqualTo ("this is a shared comment"), "Second metadata value did not match."); // SETMETADATA folder Assert.ThrowsAsync (async () => await inbox.SetMetadataAsync (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this is a comment") })), "Expected NOPRIVATE RESP-CODE."); Assert.ThrowsAsync (async () => await inbox.SetMetadataAsync (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this comment is too long!") })), "Expected MAXSIZE RESP-CODE."); Assert.ThrowsAsync (async () => await inbox.SetMetadataAsync (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, "this is a private comment"), new Metadata (MetadataTag.SharedComment, "this is a shared comment"), })), "Expected TOOMANY RESP-CODE."); await inbox.SetMetadataAsync (new MetadataCollection (new [] { new Metadata (MetadataTag.PrivateComment, null) })); await client.DisconnectAsync (false); } } static List CreateNamespaceExtensionCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "common.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestNamespaceExtensions () { var commands = CreateNamespaceExtensionCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.PersonalNamespaces, Has.Count.EqualTo (1), "PersonalNamespaces.Count"); Assert.That (client.PersonalNamespaces[0].Path, Is.EqualTo (string.Empty), "PersonalNamespaces[0].Path"); Assert.That (client.PersonalNamespaces[0].DirectorySeparator, Is.EqualTo ('/'), "PersonalNamespaces[0].DirectorySeparator"); Assert.That (client.OtherNamespaces, Has.Count.EqualTo (1), "OtherNamespaces.Count"); Assert.That (client.OtherNamespaces[0].Path, Is.EqualTo ("Other Users"), "OtherNamespaces[0].Path"); Assert.That (client.OtherNamespaces[0].DirectorySeparator, Is.EqualTo ('/'), "OtherNamespaces[0].DirectorySeparator"); Assert.That (client.SharedNamespaces, Has.Count.EqualTo (1), "SharedNamespaces.Count"); Assert.That (client.SharedNamespaces[0].Path, Is.EqualTo ("Public Folders"), "SharedNamespaces[0].Path"); Assert.That (client.SharedNamespaces[0].DirectorySeparator, Is.EqualTo ('/'), "SharedNamespaces[0].DirectorySeparator"); client.Disconnect (true); } } [Test] public async Task TestNamespaceExtensionsAsync () { var commands = CreateNamespaceExtensionCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.PersonalNamespaces, Has.Count.EqualTo (1), "PersonalNamespaces.Count"); Assert.That (client.PersonalNamespaces[0].Path, Is.EqualTo (string.Empty), "PersonalNamespaces[0].Path"); Assert.That (client.PersonalNamespaces[0].DirectorySeparator, Is.EqualTo ('/'), "PersonalNamespaces[0].DirectorySeparator"); Assert.That (client.OtherNamespaces, Has.Count.EqualTo (1), "OtherNamespaces.Count"); Assert.That (client.OtherNamespaces[0].Path, Is.EqualTo ("Other Users"), "OtherNamespaces[0].Path"); Assert.That (client.OtherNamespaces[0].DirectorySeparator, Is.EqualTo ('/'), "OtherNamespaces[0].DirectorySeparator"); Assert.That (client.SharedNamespaces, Has.Count.EqualTo (1), "SharedNamespaces.Count"); Assert.That (client.SharedNamespaces[0].Path, Is.EqualTo ("Public Folders"), "SharedNamespaces[0].Path"); Assert.That (client.SharedNamespaces[0].DirectorySeparator, Is.EqualTo ('/'), "SharedNamespaces[0].DirectorySeparator"); await client.DisconnectAsync (true); } } static List CreateListInboxFallbackAfterEmptyListExtendedCommands () { return new List { new ImapReplayCommand ("", "strato.de.greeting.txt"), new ImapReplayCommand ("A00000000 AUTHENTICATE PLAIN\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("A00000000", "AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "strato.de.authenticate.txt"), new ImapReplayCommand ("A00000001 CAPABILITY\r\n", "strato.de.capability.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "strato.de.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000004 LIST \"\" \"INBOX\"\r\n", "strato.de.list-inbox.txt"), new ImapReplayCommand ("A00000005 XLIST \"\" \"*\"\r\n", "strato.de.xlist.txt"), new ImapReplayCommand ("A00000006 LOGOUT\r\n", ImapReplayCommandResponse.OK) }; } [Test] public void TestListInboxFallbackAfterEmptyListExtended () { const ImapCapabilities InitialCapabilities = ImapCapabilities.IMAP4 | ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.AppendLimit | ImapCapabilities.Enable | ImapCapabilities.Id | ImapCapabilities.Idle | ImapCapabilities.Move | ImapCapabilities.ListExtended | ImapCapabilities.Namespace | ImapCapabilities.Quota | ImapCapabilities.Sort | ImapCapabilities.SpecialUse | ImapCapabilities.UidPlus; const ImapCapabilities AuthenticatedCapabilities = ImapCapabilities.IMAP4 | ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.AppendLimit | ImapCapabilities.CreateSpecialUse | ImapCapabilities.Quota | ImapCapabilities.Children | ImapCapabilities.CondStore | ImapCapabilities.Enable | ImapCapabilities.ESort | ImapCapabilities.ESearch | ImapCapabilities.I18NLevel | ImapCapabilities.Id | ImapCapabilities.Idle | ImapCapabilities.Move | /*ImapCapabilities.ListStatus | ImapCapabilities.ListExtended |*/ ImapCapabilities.LiteralPlus | ImapCapabilities.Namespace | /*ImapCapabilities.Preview |*/ ImapCapabilities.FuzzySearch | ImapCapabilities.Sort | ImapCapabilities.SearchResults | /*ImapCapabilities.SpecialUse |*/ ImapCapabilities.StatusSize | ImapCapabilities.UidPlus | ImapCapabilities.Unselect | ImapCapabilities.Within | ImapCapabilities.XList; var commands = CreateListInboxFallbackAfterEmptyListExtendedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (InitialCapabilities)); Assert.That (client.AppendLimit, Is.EqualTo (104857600), "AppendLimit"); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (2)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("LOGIN"), "Expected SASL LOGIN auth mechanism"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (AuthenticatedCapabilities)); Assert.That (client.PersonalNamespaces, Has.Count.EqualTo (1), "PersonalNamespaces.Count"); Assert.That (client.PersonalNamespaces[0].Path, Is.EqualTo (string.Empty), "PersonalNamespaces[0].Path"); Assert.That (client.PersonalNamespaces[0].DirectorySeparator, Is.EqualTo ('.'), "PersonalNamespaces[0].DirectorySeparator"); Assert.That (client.OtherNamespaces, Has.Count.EqualTo (0), "OtherNamespaces.Count"); Assert.That (client.SharedNamespaces, Has.Count.EqualTo (0), "SharedNamespaces.Count"); Assert.That (client.Inbox, Is.Not.Null, "Inbox"); client.Disconnect (true); } } [Test] public async Task TestListInboxFallbackAfterEmptyListExtendedAsync () { const ImapCapabilities InitialCapabilities = ImapCapabilities.IMAP4 | ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.AppendLimit | ImapCapabilities.Enable | ImapCapabilities.Id | ImapCapabilities.Idle | ImapCapabilities.Move | ImapCapabilities.ListExtended | ImapCapabilities.Namespace | ImapCapabilities.Quota | ImapCapabilities.Sort | ImapCapabilities.SpecialUse | ImapCapabilities.UidPlus; const ImapCapabilities AuthenticatedCapabilities = ImapCapabilities.IMAP4 | ImapCapabilities.IMAP4rev1 | ImapCapabilities.Status | ImapCapabilities.AppendLimit | ImapCapabilities.CreateSpecialUse | ImapCapabilities.Quota | ImapCapabilities.Children | ImapCapabilities.CondStore | ImapCapabilities.Enable | ImapCapabilities.ESort | ImapCapabilities.ESearch | ImapCapabilities.I18NLevel | ImapCapabilities.Id | ImapCapabilities.Idle | ImapCapabilities.Move | /*ImapCapabilities.ListStatus | ImapCapabilities.ListExtended |*/ ImapCapabilities.LiteralPlus | ImapCapabilities.Namespace | /*ImapCapabilities.Preview |*/ ImapCapabilities.FuzzySearch | ImapCapabilities.Sort | ImapCapabilities.SearchResults | /*ImapCapabilities.SpecialUse |*/ ImapCapabilities.StatusSize | ImapCapabilities.UidPlus | ImapCapabilities.Unselect | ImapCapabilities.Within | ImapCapabilities.XList; var commands = CreateListInboxFallbackAfterEmptyListExtendedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); Assert.That (client.Capabilities, Is.EqualTo (InitialCapabilities)); Assert.That (client.AppendLimit, Is.EqualTo (104857600), "AppendLimit"); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (2)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("LOGIN"), "Expected SASL LOGIN auth mechanism"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (AuthenticatedCapabilities)); Assert.That (client.PersonalNamespaces, Has.Count.EqualTo (1), "PersonalNamespaces.Count"); Assert.That (client.PersonalNamespaces[0].Path, Is.EqualTo (string.Empty), "PersonalNamespaces[0].Path"); Assert.That (client.PersonalNamespaces[0].DirectorySeparator, Is.EqualTo ('.'), "PersonalNamespaces[0].DirectorySeparator"); Assert.That (client.OtherNamespaces, Has.Count.EqualTo (0), "OtherNamespaces.Count"); Assert.That (client.SharedNamespaces, Has.Count.EqualTo (0), "SharedNamespaces.Count"); Assert.That (client.Inbox, Is.Not.Null, "Inbox"); await client.DisconnectAsync (true); } } [Test] public void TestLowercaseImapResponses () { var commands = new List { new ImapReplayCommand ("", "lowercase.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000001 CAPABILITY\r\n", "lowercase.capability.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"\"\r\n", "lowercase.list.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\"\r\n", "lowercase.list.txt"), new ImapReplayCommand ("A00000004 LIST (SPECIAL-USE) \"\" \"*\"\r\n", "lowercase.list.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.PersonalNamespaces, Has.Count.EqualTo (1), "PersonalNamespaces.Count"); Assert.That (client.PersonalNamespaces[0].Path, Is.EqualTo (string.Empty), "PersonalNamespaces[0].Path"); Assert.That (client.PersonalNamespaces[0].DirectorySeparator, Is.EqualTo ('/'), "PersonalNamespaces[0].DirectorySeparator"); Assert.That (client.OtherNamespaces, Is.Empty, "OtherNamespaces.Count"); Assert.That (client.SharedNamespaces, Is.Empty, "SharedNamespaces.Count"); Assert.That (client.Inbox, Is.Not.Null, "Inbox"); } } static void TestQuirksModeDetectionBasedOnGreeting (string greeting, string capability, ImapQuirksMode quirksMode) { var commands = new List { new ImapReplayCommand ("", greeting), }; if (capability != null) commands.Add (new ImapReplayCommand ("A00000000 CAPABILITY\r\n", capability)); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); var engine = (ImapEngine) client.SyncRoot; Assert.That (engine.QuirksMode, Is.EqualTo (quirksMode), "QuirksMode"); } } [Test] public void TestQuirksModeDetectionCourier () { TestQuirksModeDetectionBasedOnGreeting ("courier.greeting.txt", null, ImapQuirksMode.Courier); } [Test] public void TestQuirksModeDetectionCyrus () { TestQuirksModeDetectionBasedOnGreeting ("cyrus.greeting.txt", null, ImapQuirksMode.Cyrus); } [Test] public void TestQuirksModeDetectionDomino () { TestQuirksModeDetectionBasedOnGreeting ("domino.greeting.txt", "domino.capability.txt", ImapQuirksMode.Domino); } [Test] public void TestQuirksModeDetectionDovecot () { TestQuirksModeDetectionBasedOnGreeting ("dovecot.greeting.txt", null, ImapQuirksMode.Dovecot); } [Test] public void TestQuirksModeDetectionExchange2003 () { TestQuirksModeDetectionBasedOnGreeting ("exchange.greeting-2003.txt", "exchange.capability-preauth.txt", ImapQuirksMode.Exchange2003); } [Test] public void TestQuirksModeDetectionExchange2007 () { TestQuirksModeDetectionBasedOnGreeting ("exchange.greeting-2007.txt", "exchange.capability-preauth.txt", ImapQuirksMode.Exchange2007); } [Test] public void TestQuirksModeDetectionGMail () { TestQuirksModeDetectionBasedOnGreeting ("gmail.greeting.txt", "gmail.capability.txt", ImapQuirksMode.GMail); } [Test] public void TestQuirksModeDetectionQQMail () { TestQuirksModeDetectionBasedOnGreeting ("qqmail.greeting.txt", null, ImapQuirksMode.QQMail); } [Test] public void TestQuirksModeDetectionSmarterMail () { TestQuirksModeDetectionBasedOnGreeting ("smartermail.greeting.txt", "common.capability.txt", ImapQuirksMode.SmarterMail); } [Test] public void TestQuirksModeDetectionUW () { TestQuirksModeDetectionBasedOnGreeting ("uw.greeting.txt", null, ImapQuirksMode.UW); } [Test] public void TestQuirksModeDetectionYahooMail () { TestQuirksModeDetectionBasedOnGreeting ("yahoo.greeting.txt", "yahoo.capabilities.txt", ImapQuirksMode.Yahoo); } [Test] public void TestQuirksModeDetectionYandex () { TestQuirksModeDetectionBasedOnGreeting ("yandex.greeting.txt", "yandex.capability.txt", ImapQuirksMode.Yandex); } [Test] public void TestQuirksModeDetectionZoho () { TestQuirksModeDetectionBasedOnGreeting ("zoho.greeting.txt", "zoho.capability.txt", ImapQuirksMode.Zoho); } } } ================================================ FILE: UnitTests/Net/Imap/ImapCommandExceptionTests.cs ================================================ // // // ImapCommandExceptionTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #if NET6_0 using System.Runtime.Serialization.Formatters.Binary; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapCommandExceptionTests { [Test] public void TestImapCommandException () { ImapCommandException expected; expected = new ImapCommandException (ImapCommandResponse.Ok, "This is the response text."); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ImapCommandException) formatter.Deserialize (stream); Assert.That (ex.Response, Is.EqualTo (expected.Response), "Unexpected Response."); Assert.That (ex.ResponseText, Is.EqualTo (expected.ResponseText), "Unexpected ResponseText."); } expected = new ImapCommandException (ImapCommandResponse.Ok, "This is the response text.", "This is the error message."); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ImapCommandException) formatter.Deserialize (stream); Assert.That (ex.Response, Is.EqualTo (expected.Response), "Unexpected Response."); Assert.That (ex.ResponseText, Is.EqualTo (expected.ResponseText), "Unexpected ResponseText."); } expected = new ImapCommandException (ImapCommandResponse.Ok, "This is the response text.", "This is the error message.", new IOException ("This is the IO error.")); using (var stream = new MemoryStream ()) { var formatter = new BinaryFormatter (); formatter.Serialize (stream, expected); stream.Position = 0; var ex = (ImapCommandException) formatter.Deserialize (stream); Assert.That (ex.Response, Is.EqualTo (expected.Response), "Unexpected Response."); Assert.That (ex.ResponseText, Is.EqualTo (expected.ResponseText), "Unexpected ResponseText."); } } } } #endif // NET6_0 ================================================ FILE: UnitTests/Net/Imap/ImapCommandTests.cs ================================================ // // ImapCommandTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using MimeKit; using MailKit; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapCommandTests : IDisposable { readonly ImapEngine Engine; readonly ImapFolder Inbox; public ImapCommandTests () { Engine = new ImapEngine (CreateImapFolderDelegate) { Capabilities = ImapCapabilities.IMAP4rev1 }; var args = new ImapFolderConstructorArgs (Engine, "INBOX", FolderAttributes.None, '.'); Inbox = new ImapFolder (args); } public void Dispose () { Engine.Dispose (); GC.SuppressFinalize (this); } static ImapFolder CreateImapFolderDelegate (ImapFolderConstructorArgs args) { return new ImapFolder (args); } static Task UntaggedResponseHandler (ImapEngine engine, ImapCommand ic, int index, bool doAsync) { return Task.CompletedTask; } [Test] public void TestArgumentExceptions () { Assert.Throws (() => new ImapCommand (null, CancellationToken.None, Inbox, "NOOP\r\n")); Assert.Throws (() => new ImapCommand (Engine, CancellationToken.None, Inbox, null)); Assert.Throws (() => new ImapCommand (null, CancellationToken.None, Inbox, FormatOptions.Default, "NOOP\r\n")); Assert.Throws (() => new ImapCommand (Engine, CancellationToken.None, Inbox, null, "NOOP\r\n")); Assert.Throws (() => new ImapCommand (Engine, CancellationToken.None, Inbox, FormatOptions.Default, null)); var ic = new ImapCommand (Engine, CancellationToken.None, Inbox, "NOOP\r\n"); Assert.Throws (() => ic.RegisterUntaggedHandler (null, UntaggedResponseHandler)); Assert.Throws (() => ic.RegisterUntaggedHandler ("EVENT", null)); ic.Status = ImapCommandStatus.Queued; Assert.Throws (() => ic.RegisterUntaggedHandler ("EVENT", UntaggedResponseHandler)); ic.Status = ImapCommandStatus.Active; Assert.Throws (() => ic.RegisterUntaggedHandler ("EVENT", UntaggedResponseHandler)); ic.Status = ImapCommandStatus.Complete; Assert.Throws (() => ic.RegisterUntaggedHandler ("EVENT", UntaggedResponseHandler)); ic.Status = ImapCommandStatus.Error; Assert.Throws (() => ic.RegisterUntaggedHandler ("EVENT", UntaggedResponseHandler)); } [Test] public void TestFormatExceptions () { try { var ic = new ImapCommand (Engine, CancellationToken.None, null, "Lets try %X as a format argument."); Assert.Fail ("Expected FormatException"); } catch (FormatException ex) { Assert.That (ex.Message, Is.EqualTo ("The %X format specifier is not supported.")); } catch (Exception ex) { Assert.Fail ($"Expected FormatException, but got {ex.GetType ().Name}"); } try { var ic = ImapCommand.EstimateCommandLength (Engine, "Lets try %Y as a format argument."); Assert.Fail ("Expected FormatException"); } catch (FormatException ex) { Assert.That (ex.Message, Is.EqualTo ("The %Y format specifier is not supported.")); } catch (Exception ex) { Assert.Fail ($"Expected FormatException, but got {ex.GetType ().Name}"); } } [Test] public void TestEstimateCommandLengthWithLiteralString () { const string koreanProverb = "꿩 먹고 알 먹는다"; var literalLength = Encoding.UTF8.GetByteCount (koreanProverb); var expected = $"SEARCH TEXT {{{literalLength}}}\r\n{koreanProverb}".Length; var length = ImapCommand.EstimateCommandLength (Engine, "SEARCH TEXT %S", koreanProverb); Assert.That (length, Is.EqualTo (expected)); try { Engine.Capabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.LiteralPlus; expected = $"SEARCH TEXT {{{literalLength}+}}\r\n{koreanProverb}".Length; length = ImapCommand.EstimateCommandLength (Engine, "SEARCH TEXT %S", koreanProverb); Assert.That (length, Is.EqualTo (expected), "LITERAL+"); Engine.Capabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.LiteralMinus; expected = $"SEARCH TEXT {{{literalLength}+}}\r\n{koreanProverb}".Length; length = ImapCommand.EstimateCommandLength (Engine, "SEARCH TEXT %S", koreanProverb); Assert.That (length, Is.EqualTo (expected), "LITERAL-"); } finally { Engine.Capabilities = ImapCapabilities.IMAP4rev1; } } } } ================================================ FILE: UnitTests/Net/Imap/ImapEncodingTests.cs ================================================ // // ImapEncodingTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapEncodingTests { [Test] public void TestAmpersand () { const string text = "Jack & Jill"; var encoded = ImapEncoding.Encode (text); Assert.That (encoded, Is.EqualTo ("Jack &- Jill"), $"UTF-7 encoded text does not match the expected value: {encoded}"); var decoded = ImapEncoding.Decode (encoded); Assert.That (decoded, Is.EqualTo (text), $"UTF-7 decoded text does not match the original text: {decoded}"); } [Test] public void TestArabicExample () { const string arabic = "هل تتكلم اللغة الإنجليزية /العربية؟"; var encoded = ImapEncoding.Encode (arabic); Assert.That (encoded, Is.EqualTo ("&BkcGRA- &BioGKgZDBkQGRQ- &BicGRAZEBjoGKQ- &BicGRAYlBkYGLAZEBkoGMgZKBik- /&BicGRAY5BjEGKAZKBikGHw-"), $"UTF-7 encoded text does not match the expected value: {encoded}"); var decoded = ImapEncoding.Decode (encoded); Assert.That (decoded, Is.EqualTo (arabic), $"UTF-7 decoded text does not match the original text: {decoded}"); } [Test] public void TestJapaneseExample () { const string japanese = "狂ったこの世で狂うなら気は確かだ。"; var encoded = ImapEncoding.Encode (japanese); Assert.That (encoded, Is.EqualTo ("&csIwYzBfMFMwbk4WMGdywjBGMGowiWwXMG94ujBLMGAwAg-"), $"UTF-7 encoded text does not match the expected value: {encoded}"); var decoded = ImapEncoding.Decode (encoded); Assert.That (decoded, Is.EqualTo (japanese), $"UTF-7 decoded text does not match the original text: {decoded}"); } [Test] public void TestSurrogatePairs () { // Example taken from: http://stackoverflow.com/questions/14347799/how-do-i-create-a-string-with-a-surrogate-pair-inside-of-it // which is in turn taken from: http://msmvps.com/blogs/jon_skeet/archive/2009/11/02/omg-ponies-aka-humanity-epic-fail.aspx var text = "Les Mise" + char.ConvertFromUtf32 (0x301) + "rables"; var encoded = ImapEncoding.Encode (text); Assert.That (encoded, Is.EqualTo ("Les Mise&AwE-rables"), $"UTF-7 encoded text does not match the expected value: {encoded}"); var decoded = ImapEncoding.Decode (encoded); Assert.That (decoded, Is.EqualTo (text), $"UTF-7 decoded text does not match the original text: {decoded}"); } [Test] public void TestChineseSurrogatePairs () { const string chinese = "‎中國哲學書電子化計劃"; var encoded = ImapEncoding.Encode (chinese); Assert.That (encoded, Is.EqualTo ("&IA5OLVcLVPJbeGb4lvtbUFMWighSgw-"), $"UTF-7 encoded text does not match the expected value: {encoded}"); var decoded = ImapEncoding.Decode (encoded); Assert.That (decoded, Is.EqualTo (chinese), $"UTF-7 decoded text does not match the original text: {decoded}"); } [Test] public void TestRfc3501Example () { const string mixed = "~peter/mail/台北/日本語"; var encoded = ImapEncoding.Encode (mixed); Assert.That (encoded, Is.EqualTo ("~peter/mail/&U,BTFw-/&ZeVnLIqe-"), $"UTF-7 encoded text does not match the expected value: {encoded}"); var decoded = ImapEncoding.Decode (encoded); Assert.That (decoded, Is.EqualTo (mixed), $"UTF-7 decoded text does not match the original text: {decoded}"); } [Test] public void TestDecodeBadRfc3501Example () { const string encoded = "&Jjo!"; var decoded = ImapEncoding.Decode (encoded); Assert.That (decoded, Is.EqualTo (encoded), $"UTF-7 decoded text does not match the original text: {decoded}"); } [Test] public void TestDecodeInvalidUtf7 () { const string encoded = "&台北日本語"; var decoded = ImapEncoding.Decode (encoded); Assert.That (decoded, Is.EqualTo (encoded), $"UTF-7 decoded text does not match the original text: {decoded}"); } [Test] public void TestRfc3501SuperfluousShiftExample () { const string example = "&U,BTFw-&ZeVnLIqe-"; // Note: we may want to modify ImapEncoding.Decode() to fail and return the input text in this case var decoded = ImapEncoding.Decode (example); Assert.That (decoded, Is.EqualTo ("台北日本語"), "UTF-7 decoded text does not match the expected value."); var encoded = ImapEncoding.Encode (decoded); Assert.That (encoded, Is.EqualTo ("&U,BTF2XlZyyKng-"), "UTF-7 encoded text does not match the expected value."); } [Test] public void TestDecodeSurrogatePair () { const string example = "&2DzcHA-"; var decoded = ImapEncoding.Decode (example); Assert.That (decoded, Is.EqualTo ("\ud83c\udc1c"), "UTF-7 decoded text does not match the expected value."); var encoded = ImapEncoding.Encode (decoded); Assert.That (encoded, Is.EqualTo ("&2DzcHA-"), "UTF-7 encoded text does not match the expected value."); } } } ================================================ FILE: UnitTests/Net/Imap/ImapEngineTests.cs ================================================ // // ImapEngineTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using System.Globalization; using MailKit; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapEngineTests { [TestCase ('*', (int) ImapTokenType.Asterisk, (int) ImapTokenType.Atom)] [TestCase ("ATOM", (int) ImapTokenType.Atom, (int) ImapTokenType.Asterisk)] [TestCase ("\\Flagged", (int) ImapTokenType.Flag, (int) ImapTokenType.QString)] [TestCase ("QSTRING", (int) ImapTokenType.QString, (int) ImapTokenType.Atom)] [TestCase (123456, (int) ImapTokenType.Literal, (int) ImapTokenType.Atom)] [TestCase ("NIL", (int) ImapTokenType.Nil, (int) ImapTokenType.QString)] public void TestAssertToken (object value, int actual, int expected) { using (var builder = new ByteArrayBuilder (64)) { ImapToken token; if (value is string str) { foreach (var c in str) builder.Append ((byte) c); token = ImapToken.Create ((ImapTokenType) actual, builder); } else if (value is char c) { token = ImapToken.Create ((ImapTokenType) actual, c); } else if (value is int literal) { token = ImapToken.Create ((ImapTokenType) actual, literal); } else { return; } Assert.Throws (() => ImapEngine.AssertToken (token, (ImapTokenType) expected, "Unexpected token: {0}", token)); } } [Test] public void TestParseNumber () { using (var builder = new ByteArrayBuilder (64)) { ImapToken token; uint value; builder.Append ((byte) '0'); token = ImapToken.Create (ImapTokenType.Atom, builder); value = ImapEngine.ParseNumber (token, false, "Unexpected number: {0}", token); Assert.That (value, Is.EqualTo (0), "number"); Assert.Throws (() => ImapEngine.ParseNumber (token, true, "Unexpected number: {0}", token), "nz-number"); builder.Clear (); var max = uint.MaxValue.ToString (CultureInfo.InvariantCulture); for (int i = 0; i < max.Length; i++) builder.Append ((byte) max[i]); token = ImapToken.Create (ImapTokenType.Atom, builder); value = ImapEngine.ParseNumber (token, false, "Unexpected number: {0}", token); Assert.That (value, Is.EqualTo (uint.MaxValue), "max number"); } } [Test] public void TestParseNumber64 () { using (var builder = new ByteArrayBuilder (64)) { ImapToken token; ulong value; builder.Append ((byte) '0'); token = ImapToken.Create (ImapTokenType.Atom, builder); value = ImapEngine.ParseNumber64 (token, false, "Unexpected number: {0}", token); Assert.That (value, Is.EqualTo (0), "number64"); Assert.Throws (() => ImapEngine.ParseNumber64 (token, true, "Unexpected number: {0}", token), "nz-number64"); builder.Clear (); var max = ulong.MaxValue.ToString (CultureInfo.InvariantCulture); for (int i = 0; i < max.Length; i++) builder.Append ((byte) max[i]); token = ImapToken.Create (ImapTokenType.Atom, builder); value = ImapEngine.ParseNumber64 (token, false, "Unexpected number: {0}", token); Assert.That (value, Is.EqualTo (ulong.MaxValue), "max number64"); } } [Test] public void TestParseUidSet () { using (var builder = new ByteArrayBuilder (64)) { UniqueId? min, max; UniqueIdSet uids; ImapToken token; builder.Append ((byte) '0'); token = ImapToken.Create (ImapTokenType.Atom, builder); Assert.Throws (() => ImapEngine.ParseUidSet (token, 0, out min, out max, "Unexpected uid-set: {0}", token), "0"); builder.Clear (); var bytes = Encoding.ASCII.GetBytes ("1:500"); for (int i = 0; i < bytes.Length; i++) builder.Append (bytes[i]); token = ImapToken.Create (ImapTokenType.Atom, builder); uids = ImapEngine.ParseUidSet (token, 0, out min, out max, "Unexpected uid-set: {0}", token); Assert.That (uids.ToString (), Is.EqualTo ("1:500"), "uid-set"); Assert.That (min.ToString (), Is.EqualTo ("1"), "min"); Assert.That (max.ToString (), Is.EqualTo ("500"), "max"); } } [Test] public void TestGetResponseCodeType () { foreach (ImapResponseCodeType type in Enum.GetValues (typeof (ImapResponseCodeType))) { string atom; switch (type) { case ImapResponseCodeType.ReadOnly: atom = "READ-ONLY"; break; case ImapResponseCodeType.ReadWrite: atom = "READ-WRITE"; break; case ImapResponseCodeType.UnknownCte: atom = "UNKNOWN-CTE"; break; case ImapResponseCodeType.UndefinedFilter: atom = "UNDEFINED-FILTER"; break; default: atom = type.ToString ().ToUpperInvariant (); break; } var result = ImapEngine.GetResponseCodeType (atom); Assert.That (result, Is.EqualTo (type)); } } [Test] public void TestParseResponseCodeBadCharset () { const string text = "BADCHARSET (US-ASCII \"iso-8859-1\" UTF-8)] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = engine.ParseResponseCode (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.BadCharset)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); Assert.That (engine.SupportedCharsets, Has.Count.EqualTo (3)); Assert.That (engine.SupportedCharsets, Does.Contain ("US-ASCII"), "US-ASCII"); Assert.That (engine.SupportedCharsets, Does.Contain ("iso-8859-1"), "iso-8859-1"); Assert.That (engine.SupportedCharsets, Does.Contain ("UTF-8"), "UTF-8"); } } } } [Test] public async Task TestParseResponseCodeBadCharsetAsync () { const string text = "BADCHARSET (US-ASCII \"iso-8859-1\" UTF-8)] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = await engine.ParseResponseCodeAsync (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.BadCharset)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); Assert.That (engine.SupportedCharsets, Has.Count.EqualTo (3)); Assert.That (engine.SupportedCharsets, Does.Contain ("US-ASCII"), "US-ASCII"); Assert.That (engine.SupportedCharsets, Does.Contain ("iso-8859-1"), "iso-8859-1"); Assert.That (engine.SupportedCharsets, Does.Contain ("UTF-8"), "UTF-8"); } } } } [Test] public void TestParseResponseCodeBadUrl () { const string text = "BADURL \"/INBOX;UIDVALIDITY=785799047/;UID=113330;section=1.5.9\"] CATENATE append has failed, one message expunged\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = engine.ParseResponseCode (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.BadUrl)); Assert.That (respCode.Message, Is.EqualTo ("CATENATE append has failed, one message expunged")); var badurl = (BadUrlResponseCode) respCode; Assert.That (badurl.BadUrl, Is.EqualTo ("/INBOX;UIDVALIDITY=785799047/;UID=113330;section=1.5.9")); } } } } [Test] public async Task TestParseResponseCodeBadUrlAsync () { const string text = "BADURL \"/INBOX;UIDVALIDITY=785799047/;UID=113330;section=1.5.9\"] CATENATE append has failed, one message expunged\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = await engine.ParseResponseCodeAsync (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.BadUrl)); Assert.That (respCode.Message, Is.EqualTo ("CATENATE append has failed, one message expunged")); var badurl = (BadUrlResponseCode) respCode; Assert.That (badurl.BadUrl, Is.EqualTo ("/INBOX;UIDVALIDITY=785799047/;UID=113330;section=1.5.9")); } } } } [Test] public void TestParseResponseCodeMaxConvertMessages () { const string text = "MAXCONVERTMESSAGES 1] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = engine.ParseResponseCode (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.MaxConvertMessages)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); var maxconvert = (MaxConvertResponseCode) respCode; Assert.That (maxconvert.MaxConvert, Is.EqualTo (1)); } } } } [Test] public async Task TestParseResponseCodeMaxConvertMessagesAsync () { const string text = "MAXCONVERTMESSAGES 1] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = await engine.ParseResponseCodeAsync (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.MaxConvertMessages)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); var maxconvert = (MaxConvertResponseCode) respCode; Assert.That (maxconvert.MaxConvert, Is.EqualTo (1)); } } } } [Test] public void TestParseResponseCodeMaxConvertParts () { const string text = "MAXCONVERTPARTS 1] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = engine.ParseResponseCode (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.MaxConvertParts)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); var maxconvert = (MaxConvertResponseCode) respCode; Assert.That (maxconvert.MaxConvert, Is.EqualTo (1)); } } } } [Test] public async Task TestParseResponseCodeMaxConvertPartsAsync () { const string text = "MAXCONVERTPARTS 1] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = await engine.ParseResponseCodeAsync (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.MaxConvertParts)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); var maxconvert = (MaxConvertResponseCode) respCode; Assert.That (maxconvert.MaxConvert, Is.EqualTo (1)); } } } } [Test] public void TestParseResponseCodeNoUpdate () { const string text = "NOUPDATE \"B02\"] Too many contexts\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = engine.ParseResponseCode (false, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.NoUpdate)); Assert.That (respCode.Message, Is.EqualTo ("Too many contexts")); var noupdate = (NoUpdateResponseCode) respCode; Assert.That (noupdate.Tag, Is.EqualTo ("B02")); } } } } [Test] public async Task TestParseResponseCodeNoUpdateAsync () { const string text = "NOUPDATE \"B02\"] Too many contexts\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = await engine.ParseResponseCodeAsync (false, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.NoUpdate)); Assert.That (respCode.Message, Is.EqualTo ("Too many contexts")); var noupdate = (NoUpdateResponseCode) respCode; Assert.That (noupdate.Tag, Is.EqualTo ("B02")); } } } } [Test] public void TestParseResponseCodeNewName () { const string text = "NEWNAME OldName NewName] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = engine.ParseResponseCode (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.NewName)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); var newname = (NewNameResponseCode) respCode; Assert.That (newname.OldName, Is.EqualTo ("OldName")); Assert.That (newname.NewName, Is.EqualTo ("NewName")); } } } } [Test] public async Task TestParseResponseCodeNewNameAsync () { const string text = "NEWNAME OldName NewName] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = await engine.ParseResponseCodeAsync (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.NewName)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); var newname = (NewNameResponseCode) respCode; Assert.That (newname.OldName, Is.EqualTo ("OldName")); Assert.That (newname.NewName, Is.EqualTo ("NewName")); } } } } [Test] public void TestParseResponseCodeUndefinedFilter () { const string text = "UNDEFINED-FILTER filter-name] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = engine.ParseResponseCode (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.UndefinedFilter)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); var undefined = (UndefinedFilterResponseCode) respCode; Assert.That (undefined.Name, Is.EqualTo ("filter-name")); } } } } [Test] public async Task TestParseResponseCodeUndefinedFilterAsync () { const string text = "UNDEFINED-FILTER filter-name] This is some free-form text\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { ImapResponseCode respCode; engine.SetStream (tokenizer); try { respCode = await engine.ParseResponseCodeAsync (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing RESP-CODE failed: {ex}"); return; } Assert.That (respCode.Type, Is.EqualTo (ImapResponseCodeType.UndefinedFilter)); Assert.That (respCode.Message, Is.EqualTo ("This is some free-form text")); var undefined = (UndefinedFilterResponseCode) respCode; Assert.That (undefined.Name, Is.EqualTo ("filter-name")); } } } } void TestGreetingDetection (string server, string fileName, ImapQuirksMode expected) { using (var input = GetType ().Assembly.GetManifestResourceStream ("UnitTests.Net.Imap.Resources." + server + "." + fileName)) { using (var tokenizer = new ImapStream (input, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { try { engine.Connect (tokenizer, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing greeting failed: {ex}"); return; } Assert.That (engine.QuirksMode, Is.EqualTo (expected)); } } } } async Task TestGreetingDetectionAsync (string server, string fileName, ImapQuirksMode expected) { using (var input = GetType ().Assembly.GetManifestResourceStream ("UnitTests.Net.Imap.Resources." + server + "." + fileName)) { using (var tokenizer = new ImapStream (input, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { try { await engine.ConnectAsync (tokenizer, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing greeting failed: {ex}"); return; } Assert.That (engine.QuirksMode, Is.EqualTo (expected)); } } } } [Test] public void TestCourierImapDetection () { TestGreetingDetection ("courier", "greeting.txt", ImapQuirksMode.Courier); } [Test] public Task TestCourierImapDetectionAsync () { return TestGreetingDetectionAsync ("courier", "greeting.txt", ImapQuirksMode.Courier); } [Test] public void TestCyrusImapDetection () { TestGreetingDetection ("cyrus", "greeting.txt", ImapQuirksMode.Cyrus); } [Test] public Task TestCyrusImapDetectionAsync () { return TestGreetingDetectionAsync ("cyrus", "greeting.txt", ImapQuirksMode.Cyrus); } [Test] public void TestDominoImapDetection () { TestGreetingDetection ("domino", "greeting.txt", ImapQuirksMode.Domino); } [Test] public Task TestDominoImapDetectionAsync () { return TestGreetingDetectionAsync ("domino", "greeting.txt", ImapQuirksMode.Domino); } [Test] public void TestDovecotImapDetection () { TestGreetingDetection ("dovecot", "greeting.txt", ImapQuirksMode.Dovecot); } [Test] public Task TestDovecotImapDetectionAsync () { return TestGreetingDetectionAsync ("dovecot", "greeting.txt", ImapQuirksMode.Dovecot); } [Test] public void TestExchangeImapDetection () { TestGreetingDetection ("exchange", "greeting.txt", ImapQuirksMode.Exchange); } [Test] public Task TestExchangeImapDetectionAsync () { return TestGreetingDetectionAsync ("exchange", "greeting.txt", ImapQuirksMode.Exchange); } [Test] public void TestExchange2003ImapDetection () { TestGreetingDetection ("exchange", "greeting-2003.txt", ImapQuirksMode.Exchange2003); } [Test] public Task TestExchange2003ImapDetectionAsync () { return TestGreetingDetectionAsync ("exchange", "greeting-2003.txt", ImapQuirksMode.Exchange2003); } [Test] public void TestExchange2007ImapDetection () { TestGreetingDetection ("exchange", "greeting-2007.txt", ImapQuirksMode.Exchange2007); } [Test] public Task TestExchange2007ImapDetectionAsync () { return TestGreetingDetectionAsync ("exchange", "greeting-2007.txt", ImapQuirksMode.Exchange2007); } [Test] public void TestUWImapDetection () { TestGreetingDetection ("uw", "greeting.txt", ImapQuirksMode.UW); } [Test] public Task TestUWImapDetectionAsync () { return TestGreetingDetectionAsync ("uw", "greeting.txt", ImapQuirksMode.UW); } } } ================================================ FILE: UnitTests/Net/Imap/ImapEventGroupTests.cs ================================================ // // ImapEventGroupTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using MailKit; using MailKit.Net.Imap; using MimeKit; namespace UnitTests.Net.Imap { [TestFixture] public class ImapEventGroupTests { [Test] public void TestArgumentExceptions () { Assert.Throws (() => new ImapEventGroup (null, new List ())); Assert.Throws (() => new ImapEventGroup (ImapMailboxFilter.Selected, (IList) null)); Assert.Throws (() => new ImapEventGroup (null)); Assert.Throws (() => new ImapEventGroup (ImapMailboxFilter.Selected, null)); Assert.Throws (() => new ImapMailboxFilter.Mailboxes (null)); Assert.Throws (() => new ImapMailboxFilter.Mailboxes ((IList) null)); Assert.Throws (() => new ImapMailboxFilter.Mailboxes ()); Assert.Throws (() => new ImapMailboxFilter.Mailboxes ((IList) Array.Empty ())); Assert.Throws (() => new ImapMailboxFilter.Subtree (null)); Assert.Throws (() => new ImapMailboxFilter.Subtree ((IList) null)); Assert.Throws (() => new ImapMailboxFilter.Subtree ()); Assert.Throws (() => new ImapMailboxFilter.Subtree ((IList) Array.Empty ())); Assert.Throws (() => new ImapEvent.MessageNew (null)); } static void AssertFormatEventGroup (ImapEventGroup eventGroup, string expected, bool expectedNotify) { using var engine = new ImapEngine (null); bool notifySelectedNewExpunge = false; var command = new StringBuilder (); var args = new List (); if (expected == null) { Assert.Throws (() => eventGroup.Format (engine, command, args, ref notifySelectedNewExpunge)); } else { eventGroup.Format (engine, command, args, ref notifySelectedNewExpunge); Assert.That (command.ToString (), Is.EqualTo (expected)); Assert.That (notifySelectedNewExpunge, Is.EqualTo (expectedNotify), "notifySelectedNewExpunge"); } } [Test] public void TestFormatEventGroup_None () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, Array.Empty ()); AssertFormatEventGroup (eventGroup, "(INBOXES NONE)", false); } [Test] public void TestFormatEventGroup_AnnotationChange_Requires_MessageNew_And_MessageExpunge () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.AnnotationChange); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_AnnotationChange_MessageNew_Requires_MessageExpunge () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.AnnotationChange, new ImapEvent.MessageNew (MessageSummaryItems.None)); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_AnnotationChange_MessageExpunge_Requires_MessageNew () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.AnnotationChange, ImapEvent.MessageExpunge); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_FlagChange_Requires_MessageNew_And_MessageExpunge () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.FlagChange); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_FlagChange_MessageNew_Requires_MessageExpunge () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.FlagChange, new ImapEvent.MessageNew (MessageSummaryItems.None)); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_FlagChange_MessageExpunge_Requires_MessageNew () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.FlagChange, ImapEvent.MessageExpunge); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_FlagChange_MessageNew_MessageExpunge_AnnotationChange () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.FlagChange, new ImapEvent.MessageNew (MessageSummaryItems.None), ImapEvent.MessageExpunge, ImapEvent.AnnotationChange); AssertFormatEventGroup (eventGroup, "(INBOXES (FlagChange MessageNew MessageExpunge AnnotationChange))", false); } [Test] public void TestFormatEventGroup_MessageExpunge_Requires_MessageNew () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, ImapEvent.MessageExpunge); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_MessageNew_Requires_MessageExpunge () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, new ImapEvent.MessageNew (MessageSummaryItems.None)); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_MessageNew_MessageExpunge () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, new ImapEvent.MessageNew (MessageSummaryItems.None), ImapEvent.MessageExpunge); AssertFormatEventGroup (eventGroup, "(INBOXES (MessageNew MessageExpunge))", false); } [Test] public void TestFormatEventGroup_MessageNew_Headers_Requires_Selected () { var headers = new HashSet (new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }); var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, new ImapEvent.MessageNew (MessageSummaryItems.None, headers), ImapEvent.MessageExpunge); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_MessageNew_Items_Requires_Selected () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Inboxes, new ImapEvent.MessageNew (MessageSummaryItems.Full), ImapEvent.MessageExpunge); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_MessageNew_WithSpecificHeaderIds () { var headers = new HashSet (new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }); var eventGroup = new ImapEventGroup (ImapMailboxFilter.Selected, new ImapEvent.MessageNew (MessageSummaryItems.None, headers), ImapEvent.MessageExpunge); AssertFormatEventGroup (eventGroup, "(SELECTED (MessageNew (BODY.PEEK[HEADER.FIELDS (FROM SUBJECT DATE)]) MessageExpunge))", true); } [Test] public void TestFormatEventGroup_MessageNew_WithSpecificHeaderNames () { var headers = new HashSet (new string[] { "From", "Subject", "Date" }); var eventGroup = new ImapEventGroup (ImapMailboxFilter.Selected, new ImapEvent.MessageNew (MessageSummaryItems.None, headers), ImapEvent.MessageExpunge); AssertFormatEventGroup (eventGroup, "(SELECTED (MessageNew (BODY.PEEK[HEADER.FIELDS (FROM SUBJECT DATE)]) MessageExpunge))", true); } [Test] public void TestFormatEventGroup_Selected_Requires_OnlyMessageEvents () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.Selected, ImapEvent.ServerMetadataChange); AssertFormatEventGroup (eventGroup, null, false); } [Test] public void TestFormatEventGroup_SelectedDelayed_Requires_OnlyMessageEvents () { var eventGroup = new ImapEventGroup (ImapMailboxFilter.SelectedDelayed, ImapEvent.ServerMetadataChange); AssertFormatEventGroup (eventGroup, null, false); } } } ================================================ FILE: UnitTests/Net/Imap/ImapFolderAnnotationsTests.cs ================================================ // // ImapFolderAnnotationsTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Net; using System.Text; using System.Globalization; using MimeKit; using MailKit; using MailKit.Search; using MailKit.Security; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapFolderAnnotationsTests { static readonly Encoding Latin1 = Encoding.GetEncoding (28591); static Stream GetResourceStream (string name) { return typeof (ImapFolderAnnotationsTests).Assembly.GetManifestResourceStream ("UnitTests.Net.Imap.Resources." + name); } [Test] public void TestArgumentExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadWrite), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); var annotations = new List (new[] { new Annotation (AnnotationEntry.AltSubject) }); annotations[0].Properties.Add (AnnotationAttribute.SharedValue, "value"); // Store Assert.Throws (() => inbox.Store (-1, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (-1, annotations)); Assert.Throws (() => inbox.Store (0, (IList) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (0, (IList) null)); Assert.Throws (() => inbox.Store (UniqueId.Invalid, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueId.Invalid, annotations)); Assert.Throws (() => inbox.Store (UniqueId.MinValue, (IList) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueId.MinValue, (IList) null)); Assert.Throws (() => inbox.Store ((IList) null, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync ((IList) null, annotations)); Assert.Throws (() => inbox.Store (new int[] { 0 }, (IList) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (new int[] { 0 }, (IList) null)); Assert.Throws (() => inbox.Store ((IList) null, 1, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync ((IList) null, 1, annotations)); Assert.Throws (() => inbox.Store (new int[] { 0 }, 1, (IList) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (new int[] { 0 }, 1, (IList) null)); Assert.Throws (() => inbox.Store ((IList) null, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync ((IList) null, annotations)); Assert.Throws (() => inbox.Store (UniqueIdRange.All, (IList) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueIdRange.All, (IList) null)); Assert.Throws (() => inbox.Store ((IList) null, 1, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync ((IList) null, 1, annotations)); Assert.Throws (() => inbox.Store (UniqueIdRange.All, 1, (IList) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueIdRange.All, 1, (IList) null)); client.Disconnect (false); } } [Test] public void TestNotSupportedExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (ANNOTATE)\r\n", "common.select-inbox-annotate-no-modseq.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.None), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.None), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (0), "MaxAnnotationSize"); var annotations = new List (new[] { new Annotation (AnnotationEntry.AltSubject) }); annotations[0].Properties.Add (AnnotationAttribute.SharedValue, "value"); // verify NotSupportedException for storing annotations Assert.Throws (() => inbox.Store (0, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (0, annotations)); Assert.Throws (() => inbox.Store (UniqueId.MinValue, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueId.MinValue, annotations)); Assert.Throws (() => inbox.Store (new int[] { 0 }, 1, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (new int[] { 0 }, 1, annotations)); Assert.Throws (() => inbox.Store (UniqueIdRange.All, 1, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueIdRange.All, 1, annotations)); // disable CONDSTORE and verify that we get NotSupportedException when we send modseq client.Capabilities &= ~ImapCapabilities.CondStore; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadWrite), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); Assert.Throws (() => inbox.Store (new int[] { 0 }, 1, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (new int[] { 0 }, 1, annotations)); Assert.Throws (() => inbox.Store (UniqueIdRange.All, 1, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueIdRange.All, 1, annotations)); client.Disconnect (false); } } [Test] public void TestChangingAnnotationsOnEmptyListOfMessages () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadWrite), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); var annotations = new List (new[] { new Annotation (AnnotationEntry.AltSubject) }); annotations[0].Properties.Add (AnnotationAttribute.SharedValue, "value"); ulong modseq = 409601020304; var uids = Array.Empty (); var indexes = Array.Empty (); IList unmodifiedUids; IList unmodifiedIndexes; unmodifiedIndexes = inbox.Store (indexes, modseq, annotations); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = inbox.Store (uids, modseq, annotations); Assert.That (unmodifiedUids, Is.Empty); client.Disconnect (false); } } static IList CreateAppendWithAnnotationsCommands (bool withInternalDates, out List messages, out List flags, out List internalDates, out List annotations) { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt") }; internalDates = withInternalDates ? new List () : null; annotations = new List (); messages = new List (); flags = new List (); var command = new StringBuilder (); int id = 4; for (int i = 0; i < 8; i++) { MimeMessage message; string latin1; long length; using (var resource = GetResourceStream (string.Format ("common.message.{0}.msg", i))) message = MimeMessage.Load (resource); messages.Add (message); flags.Add (MessageFlags.Seen); if (withInternalDates) internalDates.Add (message.Date); var annotation = new Annotation (AnnotationEntry.AltSubject); annotation.Properties[AnnotationAttribute.PrivateValue] = string.Format ("Alternate subject {0}", i); annotations.Add (annotation); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; options.EnsureNewLine = true; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } var tag = string.Format ("A{0:D8}", id++); command.Clear (); command.AppendFormat ("{0} APPEND INBOX (\\Seen) ", tag); if (withInternalDates) command.AppendFormat ("\"{0}\" ", ImapUtils.FormatInternalDate (message.Date)); command.AppendFormat ("ANNOTATION (/altsubject (value.priv \"Alternate subject {0}\")) ", i); command.Append ('{').Append (length.ToString (CultureInfo.InvariantCulture)).Append ("+}\r\n").Append (latin1).Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), string.Format ("dovecot.append.{0}.txt", i + 1))); } commands.Add (new ImapReplayCommand (string.Format ("A{0:D8} LOGOUT\r\n", id), "gmail.logout.txt")); return commands; } [TestCase (false, TestName = "TestAppendWithAnnotations")] [TestCase (true, TestName = "TestAppendWithAnnotationsAndInternalDates")] public void TestAppendWithAnnotations (bool withInternalDates) { var expectedFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.Draft; var expectedPermanentFlags = expectedFlags | MessageFlags.UserDefined; var commands = CreateAppendWithAnnotationsCommands (withInternalDates, out var messages, out var flags, out var internalDates, out var annotations); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } for (int i = 0; i < messages.Count; i++) { UniqueId? uid; if (withInternalDates) uid = client.Inbox.Append (messages[i], flags[i], internalDates[i], new [] { annotations[i] }); else uid = client.Inbox.Append (messages[i], flags[i], null, new [] { annotations[i] }); Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); messages[i].Dispose (); } client.Disconnect (true); } } [TestCase (false, TestName = "TestAppendWithAnnotationsAsync")] [TestCase (true, TestName = "TestAppendWithAnnotationsAndInternalDatesAsync")] public async Task TestAppendWithAnnotationsAsync (bool withInternalDates) { var expectedFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.Draft; var expectedPermanentFlags = expectedFlags | MessageFlags.UserDefined; var commands = CreateAppendWithAnnotationsCommands (withInternalDates, out var messages, out var flags, out var internalDates, out var annotations); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } for (int i = 0; i < messages.Count; i++) { UniqueId? uid; if (withInternalDates) uid = await client.Inbox.AppendAsync (messages[i], flags[i], internalDates[i], new[] { annotations[i] }); else uid = await client.Inbox.AppendAsync (messages[i], flags[i], null, new[] { annotations[i] }); Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); messages[i].Dispose (); } await client.DisconnectAsync (true); } } static IList CreateMultiAppendWithAnnotationsCommands (bool withInternalDates, out List requests) { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt") }; var command = new StringBuilder ("A00000004 APPEND INBOX"); var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; options.EnsureNewLine = true; int id = 5; requests = new List (); for (int i = 0; i < 8; i++) { MimeMessage message; string latin1; long length; using (var resource = GetResourceStream (string.Format ("common.message.{0}.msg", i))) message = MimeMessage.Load (resource); var request = new AppendRequest (message, MessageFlags.Seen); requests.Add (request); if (withInternalDates) request.InternalDate = message.Date; var annotation = new Annotation (AnnotationEntry.AltSubject); annotation.Properties[AnnotationAttribute.PrivateValue] = string.Format ("Alternate subject {0}", i); request.Annotations = new Annotation[] { annotation }; using (var stream = new MemoryStream ()) { message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } command.Append (" (\\Seen) "); if (withInternalDates) command.AppendFormat ("\"{0}\" ", ImapUtils.FormatInternalDate (message.Date)); command.AppendFormat ("ANNOTATION (/altsubject (value.priv \"Alternate subject {0}\")) ", i); command.Append ('{'); command.AppendFormat ("{0}+", length); command.Append ("}\r\n"); command.Append (latin1); } command.Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), "dovecot.multiappend.txt")); for (int i = 0; i < requests.Count; i++) { string latin1; long length; command.Clear (); command.AppendFormat ("A{0:D8} APPEND INBOX", id++); using (var stream = new MemoryStream ()) { requests[i].Message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } command.Append (" (\\Seen) "); if (withInternalDates) command.AppendFormat ("\"{0}\" ", ImapUtils.FormatInternalDate (requests[i].InternalDate.Value)); command.AppendFormat ("ANNOTATION (/altsubject (value.priv \"Alternate subject {0}\")) ", i); command.Append ('{'); command.AppendFormat ("{0}+", length); command.Append ("}\r\n"); command.Append (latin1); command.Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), string.Format ("dovecot.append.{0}.txt", i + 1))); } commands.Add (new ImapReplayCommand (string.Format ("A{0:D8} LOGOUT\r\n", id), "gmail.logout.txt")); return commands; } [TestCase (false, TestName = "TestMultiAppendWithAnnotations")] [TestCase (true, TestName = "TestMultiAppendWithAnnotationsAndInternalDates")] public void TestMultiAppendWithAnnotations (bool withInternalDates) { var expectedFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.Draft; var expectedPermanentFlags = expectedFlags | MessageFlags.UserDefined; IList uids; var commands = CreateMultiAppendWithAnnotationsCommands (withInternalDates, out var requests); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // Use MULTIAPPEND to append some test messages uids = client.Inbox.Append (requests); Assert.That (uids, Has.Count.EqualTo (8), "Unexpected number of messages appended"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), "Unexpected UID"); // Disable the MULTIAPPEND extension and do it again client.Capabilities &= ~ImapCapabilities.MultiAppend; uids = client.Inbox.Append (requests); Assert.That (uids, Has.Count.EqualTo (8), "Unexpected number of messages appended"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), "Unexpected UID"); client.Disconnect (true); foreach (var request in requests) request.Message.Dispose (); } } [TestCase (false, TestName = "TestMultiAppendWithAnnotationsAsync")] [TestCase (true, TestName = "TestMultiAppendWithAnnotationsAndInternalDatesAsync")] public async Task TestMultiAppendWithAnnotationsAsync (bool withInternalDates) { var expectedFlags = MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.Draft; var expectedPermanentFlags = expectedFlags | MessageFlags.UserDefined; IList uids; var commands = CreateMultiAppendWithAnnotationsCommands (withInternalDates, out var requests); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // Use MULTIAPPEND to append some test messages uids = await client.Inbox.AppendAsync (requests); Assert.That (uids, Has.Count.EqualTo (8), "Unexpected number of messages appended"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), "Unexpected UID"); // Disable the MULTIAPPEND extension and do it again client.Capabilities &= ~ImapCapabilities.MultiAppend; uids = await client.Inbox.AppendAsync (requests); Assert.That (uids, Has.Count.EqualTo (8), "Unexpected number of messages appended"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), "Unexpected UID"); await client.DisconnectAsync (true); foreach (var request in requests) request.Message.Dispose (); } } static IList CreateReplaceWithAnnotationsCommands (bool byUid, out List requests) { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate+replace.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate.txt") }; var command = new StringBuilder (); int id = 5; requests = new List (); for (int i = 0; i < 8; i++) { MimeMessage message; string latin1; long length; using (var resource = GetResourceStream (string.Format ("common.message.{0}.msg", i))) message = MimeMessage.Load (resource); var annotation = new Annotation (AnnotationEntry.AltSubject); annotation.Properties[AnnotationAttribute.PrivateValue] = string.Format ("Alternate subject {0}", i); requests.Add (new ReplaceRequest (message, MessageFlags.Seen) { Annotations = new Annotation[] { annotation } }); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; options.EnsureNewLine = true; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } var tag = string.Format ("A{0:D8}", id++); command.Clear (); command.AppendFormat ("{0} {1} {2} INBOX (\\Seen) ", tag, byUid ? "UID REPLACE" : "REPLACE", i + 1); command.AppendFormat ("ANNOTATION (/altsubject (value.priv \"Alternate subject {0}\")) ", i); command.Append ('{').Append (length.ToString (CultureInfo.InvariantCulture)).Append ("+}\r\n").Append (latin1).Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), string.Format ("dovecot.append.{0}.txt", i + 1))); } commands.Add (new ImapReplayCommand (string.Format ("A{0:D8} LOGOUT\r\n", id), "gmail.logout.txt")); return commands; } [Test] public void TestReplaceWithAnnotations () { var commands = CreateReplaceWithAnnotationsCommands (false, out var requests); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.Inbox.Open (FolderAccess.ReadWrite); for (int i = 0; i < requests.Count; i++) { var uid = client.Inbox.Replace (i, requests[i]); Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); requests[i].Message.Dispose (); } client.Disconnect (true); } } [Test] public async Task TestReplaceWithAnnotationsAsync () { var commands = CreateReplaceWithAnnotationsCommands (false, out var requests); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.Inbox.OpenAsync (FolderAccess.ReadWrite); for (int i = 0; i < requests.Count; i++) { var uid = await client.Inbox.ReplaceAsync (i, requests[i]); Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); requests[i].Message.Dispose (); } await client.DisconnectAsync (true); } } [Test] public void TestReplaceByUidWithAnnotations () { var commands = CreateReplaceWithAnnotationsCommands (true, out var requests); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.Inbox.Open (FolderAccess.ReadWrite); for (int i = 0; i < requests.Count; i++) { var uid = client.Inbox.Replace (new UniqueId ((uint) i + 1), requests[i]); Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); requests[i].Message.Dispose (); } client.Disconnect (true); } } [Test] public async Task TestReplaceByUidWithAnnotationsAsync () { var commands = CreateReplaceWithAnnotationsCommands (true, out var requests); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.Inbox.OpenAsync (FolderAccess.ReadWrite); for (int i = 0; i < requests.Count; i++) { var uid = await client.Inbox.ReplaceAsync (new UniqueId ((uint) i + 1), requests[i]); Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); requests[i].Message.Dispose (); } await client.DisconnectAsync (true); } } static IList CreateSelectAnnotateNoneCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate-none.txt") }; } [Test] public void TestSelectAnnotateNone () { var commands = CreateSelectAnnotateNoneCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.None), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.None), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (0), "MaxAnnotationSize"); client.Disconnect (false); } } [Test] public async Task TestSelectAnnotateNoneAsync () { var commands = CreateSelectAnnotateNoneCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.None), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.None), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (0), "MaxAnnotationSize"); await client.DisconnectAsync (false); } } static List CreateSearchAnnotationsCommands () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate-readonly.txt"), new ImapReplayCommand ("A00000005 UID SEARCH RETURN (ALL) ANNOTATION /comment value \"a comment\"\r\n", "dovecot.search-uids.txt") }; return commands; } [Test] public void TestSearchAnnotations () { var commands = CreateSearchAnnotationsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadOnly), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Both), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (0), "MaxAnnotationSize"); var query = SearchQuery.AnnotationsContain (AnnotationEntry.Comment, AnnotationAttribute.Value, "a comment"); var uids = inbox.Search (query); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); // disable ANNOTATE-EXPERIMENT-1 and try again client.Capabilities &= ~ImapCapabilities.Annotate; Assert.Throws (() => inbox.Search (query)); client.Disconnect (false); } } [Test] public async Task TestSearchAnnotationsAsync () { var commands = CreateSearchAnnotationsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadOnly), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Both), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (0), "MaxAnnotationSize"); var query = SearchQuery.AnnotationsContain (AnnotationEntry.Comment, AnnotationAttribute.Value, "a comment"); var uids = await inbox.SearchAsync (query); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); // disable ANNOTATE-EXPERIMENT-1 and try again client.Capabilities &= ~ImapCapabilities.Annotate; Assert.ThrowsAsync (() => inbox.SearchAsync (query)); await client.DisconnectAsync (false); } } static List CreateSortAnnotationsCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate-readonly.txt"), new ImapReplayCommand ("A00000005 UID SORT RETURN (ALL) (ANNOTATION /altsubject value.shared) US-ASCII ALL\r\n", "dovecot.sort-by-strings.txt"), new ImapReplayCommand ("A00000006 UID SORT RETURN (ALL) (REVERSE ANNOTATION /altsubject value.shared) US-ASCII ALL\r\n", "dovecot.sort-by-strings.txt") }; } [Test] public void TestSortAnnotations () { var commands = CreateSortAnnotationsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadOnly), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Both), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (0), "MaxAnnotationSize"); var orderBy = new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedValue, SortOrder.Ascending); var uids = inbox.Sort (SearchQuery.All, new OrderBy[] { orderBy }); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); orderBy = new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedValue, SortOrder.Descending); uids = inbox.Sort (SearchQuery.All, new OrderBy[] { orderBy }); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); // disable ANNOTATE-EXPERIMENT-1 and try again client.Capabilities &= ~ImapCapabilities.Annotate; Assert.Throws (() => inbox.Sort (SearchQuery.All, new OrderBy[] { orderBy })); client.Disconnect (false); } } [Test] public async Task TestSortAnnotationsAsync () { var commands = CreateSortAnnotationsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadOnly), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Both), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (0), "MaxAnnotationSize"); var orderBy = new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedValue, SortOrder.Ascending); var uids = await inbox.SortAsync (SearchQuery.All, new OrderBy[] { orderBy }); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); orderBy = new OrderByAnnotation (AnnotationEntry.AltSubject, AnnotationAttribute.SharedValue, SortOrder.Descending); uids = await inbox.SortAsync (SearchQuery.All, new OrderBy[] { orderBy }); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); // disable ANNOTATE-EXPERIMENT-1 and try again client.Capabilities &= ~ImapCapabilities.Annotate; Assert.ThrowsAsync (() => inbox.SortAsync (SearchQuery.All, new OrderBy[] { orderBy })); await client.DisconnectAsync (false); } } static List CreateStoreCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate.txt"), new ImapReplayCommand ("A00000005 STORE 1 ANNOTATION (/altsubject (value.shared \"This is an alternate subject.\"))\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000006 UID STORE 1 ANNOTATION (/altsubject (value.shared \"This is an alternate subject.\"))\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000007 STORE 1 ANNOTATION (/altsubject (value.shared NIL))\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000008 UID STORE 1 ANNOTATION (/altsubject (value.shared NIL))\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000009 STORE 1 (UNCHANGEDSINCE 42) ANNOTATION (/altsubject (value.shared NIL))\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000010 UID STORE 1 (UNCHANGEDSINCE 42) ANNOTATION (/altsubject (value.shared NIL))\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000011 STORE 1 ANNOTATION (/altsubject (value.shared \"This alternate subject will cause an error.\"))\r\n", Encoding.ASCII.GetBytes ("A00000011 NO [ANNOTATE TOOBIG] Annotate failed.\r\n")), new ImapReplayCommand ("A00000012 UID STORE 1 ANNOTATION (/altsubject (value.shared \"This alternate subject will cause an error.\"))\r\n", Encoding.ASCII.GetBytes ("A00000012 NO [ANNOTATE TOOMANY] Annotate failed.\r\n")), }; } [Test] public void TestStore () { var commands = CreateStoreCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadWrite), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); var annotation = new Annotation (AnnotationEntry.AltSubject); annotation.Properties.Add (AnnotationAttribute.SharedValue, "This is an alternate subject."); var annotations = new [] { annotation }; inbox.Store (0, annotations); inbox.Store (new UniqueId (1), annotations); annotation.Properties[AnnotationAttribute.SharedValue] = null; inbox.Store (0, annotations); inbox.Store (new UniqueId (1), annotations); inbox.Store (new[] { 0 }, 42, annotations); inbox.Store (new[] { new UniqueId (1) }, 42, annotations); annotation = new Annotation (AnnotationEntry.AltSubject); annotation.Properties.Add (AnnotationAttribute.SharedValue, "This alternate subject will cause an error."); annotations = new[] { annotation }; Assert.Throws (() => inbox.Store (0, annotations)); Assert.Throws (() => inbox.Store (new UniqueId (1), annotations)); client.Disconnect (false); } } [Test] public async Task TestStoreAsync () { var commands = CreateStoreCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadWrite), "AnnotationAccess"); Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); var annotation = new Annotation (AnnotationEntry.AltSubject); annotation.Properties.Add (AnnotationAttribute.SharedValue, "This is an alternate subject."); var annotations = new[] { annotation }; await inbox.StoreAsync (0, annotations); await inbox.StoreAsync (new UniqueId (1), annotations); annotation.Properties[AnnotationAttribute.SharedValue] = null; await inbox.StoreAsync (0, annotations); await inbox.StoreAsync (new UniqueId (1), annotations); await inbox.StoreAsync (new[] { 0 }, 42, annotations); await inbox.StoreAsync (new[] { new UniqueId (1) }, 42, annotations); annotation = new Annotation (AnnotationEntry.AltSubject); annotation.Properties.Add (AnnotationAttribute.SharedValue, "This alternate subject will cause an error."); annotations = new[] { annotation }; Assert.ThrowsAsync (() => inbox.StoreAsync (0, annotations)); Assert.ThrowsAsync (() => inbox.StoreAsync (new UniqueId (1), annotations)); await client.DisconnectAsync (false); } } } } ================================================ FILE: UnitTests/Net/Imap/ImapFolderFetchTests.cs ================================================ // // ImapFolderFetchTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Net; using System.Text; using System.Security.Cryptography; using MimeKit; using MailKit; using MailKit.Security; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapFolderFetchTests { static FolderAttributes GetSpecialFolderAttribute (SpecialFolder special) { switch (special) { case SpecialFolder.All: return FolderAttributes.All; case SpecialFolder.Archive: return FolderAttributes.Archive; case SpecialFolder.Drafts: return FolderAttributes.Drafts; case SpecialFolder.Flagged: return FolderAttributes.Flagged; case SpecialFolder.Important: return FolderAttributes.Important; case SpecialFolder.Junk: return FolderAttributes.Junk; case SpecialFolder.Sent: return FolderAttributes.Sent; case SpecialFolder.Trash: return FolderAttributes.Trash; default: throw new ArgumentOutOfRangeException (nameof (special)); } } static string HexEncode (byte [] digest) { var hex = new StringBuilder (); for (int i = 0; i < digest.Length; i++) hex.Append (digest[i].ToString ("x2")); return hex.ToString (); } static void GetStreamsCallback (ImapFolder folder, int index, UniqueId uid, Stream stream) { using (var reader = new StreamReader (stream)) { const string expected = "This is some dummy text just to make sure this is working correctly."; var text = reader.ReadToEnd (); Assert.That (text, Is.EqualTo (expected)); } } static async Task GetStreamsAsyncCallback (ImapFolder folder, int index, UniqueId uid, Stream stream, CancellationToken cancellationToken) { using (var reader = new StreamReader (stream)) { const string expected = "This is some dummy text just to make sure this is working correctly."; var text = await reader.ReadToEndAsync (); Assert.That (text, Is.EqualTo (expected)); } } [Test] public void TestArgumentExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); // Fetch var invalidHeaderFields = new string[] { "Invalid Header Name" }; var headerIds = new HeaderId [] { HeaderId.Subject }; var headerFields = new string [] { "SUBJECT" }; var uids = new UniqueId [] { UniqueId.MinValue }; var indexes = new int [] { 0 }; Assert.Throws (() => inbox.Fetch (-1, -1, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (-1, -1, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (5, 1, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (5, 1, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (0, -1, null)); Assert.ThrowsAsync (() => inbox.FetchAsync (0, -1, null)); Assert.Throws (() => inbox.Fetch ((IList) null, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (uids, null)); Assert.ThrowsAsync (() => inbox.FetchAsync (uids, null)); Assert.Throws (() => inbox.Fetch ((IList) null, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (indexes, null)); Assert.ThrowsAsync (() => inbox.FetchAsync (indexes, null)); Assert.Throws (() => inbox.Fetch (-1, -1, MessageSummaryItems.All, headerIds)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (-1, -1, MessageSummaryItems.All, headerIds)); Assert.Throws (() => inbox.Fetch (5, 1, MessageSummaryItems.All, headerIds)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (5, 1, MessageSummaryItems.All, headerIds)); //Assert.Throws (() => inbox.Fetch (0, 5, MessageSummaryItems.None, headers)); //Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, 5, MessageSummaryItems.None, headers)); Assert.Throws (() => inbox.Fetch (0, 5, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, 5, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch ((IList) null, MessageSummaryItems.All, headerIds)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, MessageSummaryItems.All, headerIds)); //Assert.Throws (() => inbox.Fetch (uids, MessageSummaryItems.None, headers)); //Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, MessageSummaryItems.None, headers)); Assert.Throws (() => inbox.Fetch (uids, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch ((IList) null, MessageSummaryItems.All, headerIds)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, MessageSummaryItems.All, headerIds)); //Assert.Throws (() => inbox.Fetch (indexes, MessageSummaryItems.None, headers)); //Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, MessageSummaryItems.None, headers)); Assert.Throws (() => inbox.Fetch (indexes, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch (-1, -1, MessageSummaryItems.All, headerFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (-1, -1, MessageSummaryItems.All, headerFields)); Assert.Throws (() => inbox.Fetch (5, 1, MessageSummaryItems.All, headerFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (5, 1, MessageSummaryItems.All, headerFields)); //Assert.Throws (() => inbox.Fetch (0, 5, MessageSummaryItems.None, fields)); //Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, 5, MessageSummaryItems.None, fields)); Assert.Throws (() => inbox.Fetch (0, 5, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, 5, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch (0, 5, MessageSummaryItems.All, invalidHeaderFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, 5, MessageSummaryItems.All, invalidHeaderFields)); Assert.Throws (() => inbox.Fetch ((IList) null, MessageSummaryItems.All, headerFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, MessageSummaryItems.All, headerFields)); //Assert.Throws (() => inbox.Fetch (uids, MessageSummaryItems.None, fields)); //Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, MessageSummaryItems.None, fields)); Assert.Throws (() => inbox.Fetch (uids, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch (uids, MessageSummaryItems.All, invalidHeaderFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, MessageSummaryItems.All, invalidHeaderFields)); Assert.Throws (() => inbox.Fetch ((IList) null, MessageSummaryItems.All, headerFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, MessageSummaryItems.All, headerFields)); //Assert.Throws (() => inbox.Fetch (indexes, MessageSummaryItems.None, fields)); //Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, MessageSummaryItems.None, fields)); Assert.Throws (() => inbox.Fetch (indexes, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch (indexes, MessageSummaryItems.All, invalidHeaderFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, MessageSummaryItems.All, invalidHeaderFields)); // Fetch + modseq Assert.Throws (() => inbox.Fetch (-1, -1, 31337, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (-1, -1, 31337, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (5, 1, 31337, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (5, 1, 31337, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch ((IList) null, 31337, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, 31337, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch ((IList) null, 31337, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, 31337, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (-1, -1, 31337, MessageSummaryItems.All, headerIds)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (-1, -1, 31337, MessageSummaryItems.All, headerIds)); Assert.Throws (() => inbox.Fetch (5, 1, 31337, MessageSummaryItems.All, headerIds)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (5, 1, MessageSummaryItems.All, headerIds)); Assert.Throws (() => inbox.Fetch (0, 5, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, 5, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch ((IList) null, 31337, MessageSummaryItems.All, headerIds)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, 31337, MessageSummaryItems.All, headerIds)); Assert.Throws (() => inbox.Fetch (uids, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch ((IList) null, 31337, MessageSummaryItems.All, headerIds)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, 31337, MessageSummaryItems.All, headerIds)); Assert.Throws (() => inbox.Fetch (indexes, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch (-1, -1, 31337, MessageSummaryItems.All, headerFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (-1, -1, 31337, MessageSummaryItems.All, headerFields)); Assert.Throws (() => inbox.Fetch (5, 1, 31337, MessageSummaryItems.All, headerFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (5, 1, 31337, MessageSummaryItems.All, headerFields)); Assert.Throws (() => inbox.Fetch (0, 5, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, 5, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch (0, 5, 31337, MessageSummaryItems.All, invalidHeaderFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, 5, 31337, MessageSummaryItems.All, invalidHeaderFields)); Assert.Throws (() => inbox.Fetch ((IList) null, 31337, MessageSummaryItems.All, headerFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, 31337, MessageSummaryItems.All, headerFields)); Assert.Throws (() => inbox.Fetch (uids, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch (uids, 31337, MessageSummaryItems.All, invalidHeaderFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, 31337, MessageSummaryItems.All, invalidHeaderFields)); Assert.Throws (() => inbox.Fetch ((IList) null, 31337, MessageSummaryItems.All, headerFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync ((IList) null, 31337, MessageSummaryItems.All, headerFields)); Assert.Throws (() => inbox.Fetch (indexes, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, 31337, MessageSummaryItems.All, (HashSet) null)); Assert.Throws (() => inbox.Fetch (indexes, 31337, MessageSummaryItems.All, invalidHeaderFields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, 31337, MessageSummaryItems.All, invalidHeaderFields)); // GetHeaders Assert.Throws (() => inbox.GetHeaders (-1)); Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (-1)); Assert.Throws (() => inbox.GetHeaders (UniqueId.Invalid)); Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (UniqueId.Invalid)); var bodyPart = new BodyPartText (new ContentType ("text", "plain"), "1.2"); Assert.Throws (() => inbox.GetHeaders (-1, bodyPart)); Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (-1, bodyPart)); Assert.Throws (() => inbox.GetHeaders (0, (BodyPart) null)); Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (0, (BodyPart) null)); Assert.Throws (() => inbox.GetHeaders (UniqueId.Invalid, bodyPart)); Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (UniqueId.Invalid, bodyPart)); Assert.Throws (() => inbox.GetHeaders (UniqueId.MinValue, (BodyPart) null)); Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (UniqueId.MinValue, (BodyPart) null)); Assert.Throws (() => inbox.GetHeaders (-1, "1.2")); //Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (-1, "1.2")); Assert.Throws (() => inbox.GetHeaders (0, (string) null)); //Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (0, (string) null)); Assert.Throws (() => inbox.GetHeaders (UniqueId.Invalid, "1.2")); //Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (UniqueId.Invalid, "1.2")); Assert.Throws (() => inbox.GetHeaders (UniqueId.MinValue, (string) null)); //Assert.ThrowsAsync (async () => await inbox.GetHeadersAsync (UniqueId.MinValue, (string) null)); // GetMessage Assert.Throws (() => inbox.GetMessage (-1)); Assert.ThrowsAsync (async () => await inbox.GetMessageAsync (-1)); Assert.Throws (() => inbox.GetMessage (UniqueId.Invalid)); Assert.ThrowsAsync (async () => await inbox.GetMessageAsync (UniqueId.Invalid)); // GetBodyPart Assert.Throws (() => inbox.GetBodyPart (-1, bodyPart)); Assert.ThrowsAsync (async () => await inbox.GetBodyPartAsync (-1, bodyPart)); Assert.Throws (() => inbox.GetBodyPart (0, (BodyPart) null)); Assert.ThrowsAsync (async () => await inbox.GetBodyPartAsync (0, (BodyPart) null)); Assert.Throws (() => inbox.GetBodyPart (UniqueId.Invalid, bodyPart)); Assert.ThrowsAsync (async () => await inbox.GetBodyPartAsync (UniqueId.Invalid, bodyPart)); Assert.Throws (() => inbox.GetBodyPart (UniqueId.MinValue, (BodyPart) null)); Assert.ThrowsAsync (async () => await inbox.GetBodyPartAsync (UniqueId.MinValue, (BodyPart) null)); Assert.Throws (() => inbox.GetBodyPart (-1, "1.2")); //Assert.ThrowsAsync (async () => await inbox.GetBodyPartAsync (-1, "1.2")); Assert.Throws (() => inbox.GetBodyPart (0, (string) null)); //Assert.ThrowsAsync (async () => await inbox.GetBodyPartAsync (0, (string) null)); Assert.Throws (() => inbox.GetBodyPart (UniqueId.Invalid, "1.2")); //Assert.ThrowsAsync (async () => await inbox.GetBodyPartAsync (UniqueId.Invalid, "1.2")); Assert.Throws (() => inbox.GetBodyPart (UniqueId.MinValue, (string) null)); //Assert.ThrowsAsync (async () => await inbox.GetBodyPartAsync (UniqueId.MinValue, (string) null)); // GetStream Assert.Throws (() => inbox.GetStream (-1)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (-1)); Assert.Throws (() => inbox.GetStream (UniqueId.Invalid)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.Invalid)); Assert.Throws (() => inbox.GetStream (-1, "1.2")); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (-1, "1.2")); Assert.Throws (() => inbox.GetStream (0, (string) null)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, (string) null)); Assert.Throws (() => inbox.GetStream (UniqueId.Invalid, "1.2")); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.Invalid, "1.2")); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, (string) null)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, (string) null)); Assert.Throws (() => inbox.GetStream (-1, bodyPart)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (-1, bodyPart)); Assert.Throws (() => inbox.GetStream (0, (BodyPart) null)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, (BodyPart) null)); Assert.Throws (() => inbox.GetStream (UniqueId.Invalid, bodyPart)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.Invalid, bodyPart)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, (BodyPart) null)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, (BodyPart) null)); Assert.Throws (() => inbox.GetStream (-1, 0, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (-1, 0, 1024)); Assert.Throws (() => inbox.GetStream (0, -1, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, -1, 1024)); Assert.Throws (() => inbox.GetStream (0, 0, -1)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, 0, -1)); Assert.Throws (() => inbox.GetStream (UniqueId.Invalid, 0, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.Invalid, 0, 1024)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, -1, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, -1, 1024)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, 0, -1)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, 0, -1)); Assert.Throws (() => inbox.GetStream (-1, "1.2", 0, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (-1, "1.2", 0, 1024)); Assert.Throws (() => inbox.GetStream (0, (string) null, 0, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, (string) null, 0, 1024)); Assert.Throws (() => inbox.GetStream (0, "1.2", -1, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, "1.2", -1, 1024)); Assert.Throws (() => inbox.GetStream (0, "1.2", 0, -1)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, "1.2", 0, -1)); Assert.Throws (() => inbox.GetStream (UniqueId.Invalid, "1.2", 0, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.Invalid, "1.2", 0, 1024)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, (string) null, 0, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, (string) null, 0, 1024)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, "1.2", -1, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, "1.2", -1, 1024)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, "1.2", 0, -1)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, "1.2", 0, -1)); Assert.Throws (() => inbox.GetStream (-1, bodyPart, 0, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (-1, bodyPart, 0, 1024)); Assert.Throws (() => inbox.GetStream (0, (BodyPart) null, -1, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, (BodyPart) null, -1, 1024)); Assert.Throws (() => inbox.GetStream (0, bodyPart, -1, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, bodyPart, -1, 1024)); Assert.Throws (() => inbox.GetStream (0, bodyPart, 0, -1)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (0, bodyPart, 0, -1)); Assert.Throws (() => inbox.GetStream (UniqueId.Invalid, bodyPart, 0, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.Invalid, bodyPart, 0, 1024)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, (BodyPart) null, -1, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, (BodyPart) null, -1, 1024)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, bodyPart, -1, 1024)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, bodyPart, -1, 1024)); Assert.Throws (() => inbox.GetStream (UniqueId.MinValue, bodyPart, 0, -1)); Assert.ThrowsAsync (async () => await inbox.GetStreamAsync (UniqueId.MinValue, bodyPart, 0, -1)); // GetStreams Assert.Throws (() => inbox.GetStreams (-1, 0, GetStreamsCallback)); Assert.ThrowsAsync (async () => await inbox.GetStreamsAsync (-1, 0, GetStreamsAsyncCallback)); Assert.Throws (() => inbox.GetStreams (1, 0, GetStreamsCallback)); Assert.ThrowsAsync (async () => await inbox.GetStreamsAsync (1, 0, GetStreamsAsyncCallback)); Assert.Throws (() => inbox.GetStreams (0, -1, null)); Assert.ThrowsAsync (async () => await inbox.GetStreamsAsync (0, -1, null)); Assert.Throws (() => inbox.GetStreams ((IList) null, GetStreamsCallback)); Assert.ThrowsAsync (async () => await inbox.GetStreamsAsync ((IList) null, GetStreamsAsyncCallback)); Assert.Throws (() => inbox.GetStreams (new int [] { 0 }, null)); Assert.ThrowsAsync (async () => await inbox.GetStreamsAsync (new int [] { 0 }, null)); Assert.Throws (() => inbox.GetStreams ((IList) null, GetStreamsCallback)); Assert.ThrowsAsync (async () => await inbox.GetStreamsAsync ((IList) null, GetStreamsAsyncCallback)); Assert.Throws (() => inbox.GetStreams (UniqueIdRange.All, null)); Assert.ThrowsAsync (async () => await inbox.GetStreamsAsync (UniqueIdRange.All, null)); client.Disconnect (false); } } [Test] public void TestNotSupportedExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX\r\n", "common.select-inbox-no-modseq.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); // disable all features client.Capabilities = ImapCapabilities.None; var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); // Fetch var headers = new HashSet (new HeaderId[] { HeaderId.Subject }); var fields = new HashSet (new string[] { "SUBJECT" }); var uids = new UniqueId[] { UniqueId.MinValue }; var indexes = new int[] { 0 }; ulong modseq = 409601020304; Assert.Throws (() => inbox.Fetch (0, -1, modseq, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, -1, modseq, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (0, -1, modseq, MessageSummaryItems.All, headers)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, -1, modseq, MessageSummaryItems.All, headers)); Assert.Throws (() => inbox.Fetch (0, -1, modseq, MessageSummaryItems.All, fields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (0, -1, modseq, MessageSummaryItems.All, fields)); Assert.Throws (() => inbox.Fetch (indexes, modseq, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, modseq, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (indexes, modseq, MessageSummaryItems.All, headers)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, modseq, MessageSummaryItems.All, headers)); Assert.Throws (() => inbox.Fetch (indexes, modseq, MessageSummaryItems.All, fields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (indexes, modseq, MessageSummaryItems.All, fields)); Assert.Throws (() => inbox.Fetch (uids, modseq, MessageSummaryItems.All)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, modseq, MessageSummaryItems.All)); Assert.Throws (() => inbox.Fetch (uids, modseq, MessageSummaryItems.All, headers)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, modseq, MessageSummaryItems.All, headers)); Assert.Throws (() => inbox.Fetch (uids, modseq, MessageSummaryItems.All, fields)); Assert.ThrowsAsync (async () => await inbox.FetchAsync (uids, modseq, MessageSummaryItems.All, fields)); client.Disconnect (false); } } static List CreateEmptyFetchRequestCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), }; } [Test] public void TestEmptyFetchRequest () { var commands = CreateEmptyFetchRequestCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); // First, test a non-empty requests with empty message sets var request = new FetchRequest (MessageSummaryItems.Flags); var messages = inbox.Fetch (Array.Empty (), request); Assert.That (messages, Is.Empty, "UID FETCH (0 uids)"); messages = inbox.Fetch (Array.Empty (), request); Assert.That (messages, Is.Empty, "FETCH (0 indexes)"); // Now make the FetchRequest empty request = new FetchRequest (MessageSummaryItems.None); messages = inbox.Fetch (UniqueIdRange.All, request); Assert.That (messages, Is.Empty, "UID FETCH (None)"); messages = inbox.Fetch (new int[] { 0, 1, 2, 3, 4, 5 }, request); Assert.That (messages, Is.Empty, "FETCH (None)"); messages = inbox.Fetch (0, -1, request); Assert.That (messages, Is.Empty, "FETCH min:max (None)"); client.Disconnect (false); } } [Test] public async Task TestEmptyFetchRequestAsync () { var commands = CreateEmptyFetchRequestCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); // First, test a non-empty requests with empty message sets var request = new FetchRequest (MessageSummaryItems.Flags); var messages = await inbox.FetchAsync (Array.Empty (), request); Assert.That (messages, Is.Empty, "UID FETCH (0 uids)"); messages = await inbox.FetchAsync (Array.Empty (), request); Assert.That (messages, Is.Empty, "FETCH (0 indexes)"); // Now make the FetchRequest empty request = new FetchRequest (MessageSummaryItems.None); messages = await inbox.FetchAsync (UniqueIdRange.All, request); Assert.That (messages, Is.Empty, "UID FETCH (None)"); messages = await inbox.FetchAsync (new int[] { 0, 1, 2, 3, 4, 5 }, request); Assert.That (messages, Is.Empty, "FETCH (None)"); messages = await inbox.FetchAsync (0, -1, request); Assert.That (messages, Is.Empty, "FETCH min:max (None)"); await client.DisconnectAsync (false); } } static List CreateFetchAllHeadersCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 UID FETCH 1:* (UID FLAGS BODY.PEEK[HEADER])\r\n", "gmail.fetch-all-headers.txt"), new ImapReplayCommand ("A00000008 FETCH 1:6 (UID FLAGS BODY.PEEK[HEADER])\r\n", "gmail.fetch-all-headers.txt"), new ImapReplayCommand ("A00000009 FETCH 1:* (UID FLAGS BODY.PEEK[HEADER])\r\n", "gmail.fetch-all-headers.txt") }; } [Test] public void TestFetchAllHeaders () { var commands = CreateFetchAllHeadersCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var request = new FetchRequest (MessageSummaryItems.Flags | MessageSummaryItems.UniqueId) { Headers = HeaderSet.All }; var messages = inbox.Fetch (UniqueIdRange.All, request); Assert.That (messages, Has.Count.EqualTo (6), "UID FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "UID FETCH fields"); messages = inbox.Fetch (new int[] { 0, 1, 2, 3, 4, 5 }, request); Assert.That (messages, Has.Count.EqualTo (6), "FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "FETCH fields"); messages = inbox.Fetch (0, -1, request); Assert.That (messages, Has.Count.EqualTo (6), "FETCH min:max"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "FETCH min:max fields"); client.Disconnect (false); } } [Test] public async Task TestFetchAllHeadersAsync () { var commands = CreateFetchAllHeadersCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var request = new FetchRequest (MessageSummaryItems.Flags | MessageSummaryItems.UniqueId) { Headers = HeaderSet.All }; var messages = await inbox.FetchAsync (UniqueIdRange.All, request); Assert.That (messages, Has.Count.EqualTo (6), "UID FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "UID FETCH fields"); messages = await inbox.FetchAsync (new int[] { 0, 1, 2, 3, 4, 5 }, request); Assert.That (messages, Has.Count.EqualTo (6), "FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "FETCH fields"); messages = await inbox.FetchAsync (0, -1, request); Assert.That (messages, Has.Count.EqualTo (6), "FETCH min:max"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "FETCH min:max fields"); await client.DisconnectAsync (false); } } static List CreateFetchInvalidHeadersCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 UID FETCH 1:* (UID FLAGS BODY.PEEK[HEADER])\r\n", "gmail.fetch-invalid-headers.txt"), new ImapReplayCommand ("A00000008 FETCH 1:6 (UID FLAGS BODY.PEEK[HEADER])\r\n", "gmail.fetch-invalid-headers.txt"), new ImapReplayCommand ("A00000009 FETCH 1:* (UID FLAGS BODY.PEEK[HEADER])\r\n", "gmail.fetch-invalid-headers.txt") }; } [Test] public void TestFetchInvalidHeaders () { var commands = CreateFetchInvalidHeadersCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var request = new FetchRequest (MessageSummaryItems.Flags | MessageSummaryItems.UniqueId) { Headers = HeaderSet.All }; var messages = inbox.Fetch (UniqueIdRange.All, request); Assert.That (messages, Has.Count.EqualTo (6), "UID FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "UID FETCH fields"); messages = inbox.Fetch (new int[] { 0, 1, 2, 3, 4, 5 }, request); Assert.That (messages, Has.Count.EqualTo (6), "FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "FETCH fields"); messages = inbox.Fetch (0, -1, request); Assert.That (messages, Has.Count.EqualTo (6), "FETCH min:max"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "FETCH min:max fields"); client.Disconnect (false); } } [Test] public async Task TestFetchInvalidHeadersAsync () { var commands = CreateFetchInvalidHeadersCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var request = new FetchRequest (MessageSummaryItems.Flags | MessageSummaryItems.UniqueId) { Headers = HeaderSet.All }; var messages = await inbox.FetchAsync (UniqueIdRange.All, request); Assert.That (messages, Has.Count.EqualTo (6), "UID FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "UID FETCH fields"); messages = await inbox.FetchAsync (new int[] { 0, 1, 2, 3, 4, 5 }, request); Assert.That (messages, Has.Count.EqualTo (6), "FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "FETCH fields"); messages = await inbox.FetchAsync (0, -1, request); Assert.That (messages, Has.Count.EqualTo (6), "FETCH min:max"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Fields, Is.EqualTo (request.Items | MessageSummaryItems.Headers | MessageSummaryItems.References), "FETCH min:max fields"); await client.DisconnectAsync (false); } } static readonly string[] PreviewTextValues = { "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver", "Don't miss our celebrity guest Monday evening", "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver", "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver", "Don't miss our celebrity guest Monday evening", "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver" }; static List CreateFetchPreviewTextCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+preview.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 UID FETCH 1:* (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE PREVIEW)\r\n", "gmail.fetch-preview.txt"), new ImapReplayCommand ("A00000008 FETCH 1:6 (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE PREVIEW)\r\n", "gmail.fetch-preview.txt"), new ImapReplayCommand ("A00000009 FETCH 1:* (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE PREVIEW)\r\n", "gmail.fetch-preview.txt") }; } [Test] public void TestFetchPreviewText () { var commands = CreateFetchPreviewTextCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var messages = inbox.Fetch (UniqueIdRange.All, MessageSummaryItems.All | MessageSummaryItems.PreviewText); Assert.That (messages, Has.Count.EqualTo (PreviewTextValues.Length), "UID FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); messages = inbox.Fetch (new int[] { 0, 1, 2, 3, 4, 5 }, MessageSummaryItems.All | MessageSummaryItems.PreviewText); Assert.That (messages, Has.Count.EqualTo (PreviewTextValues.Length), "FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); messages = inbox.Fetch (0, -1, MessageSummaryItems.All | MessageSummaryItems.PreviewText); Assert.That (messages, Has.Count.EqualTo (PreviewTextValues.Length), "FETCH min:max"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); client.Disconnect (false); } } [Test] public async Task TestFetchPreviewTextAsync () { var commands = CreateFetchPreviewTextCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var messages = await inbox.FetchAsync (UniqueIdRange.All, MessageSummaryItems.All | MessageSummaryItems.PreviewText); Assert.That (messages, Has.Count.EqualTo (PreviewTextValues.Length), "UID FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); messages = await inbox.FetchAsync (new int[] { 0, 1, 2, 3, 4, 5 }, MessageSummaryItems.All | MessageSummaryItems.PreviewText); Assert.That (messages, Has.Count.EqualTo (PreviewTextValues.Length), "FETCH"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); messages = await inbox.FetchAsync (0, -1, MessageSummaryItems.All | MessageSummaryItems.PreviewText); Assert.That (messages, Has.Count.EqualTo (PreviewTextValues.Length), "FETCH min:max"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); await client.DisconnectAsync (false); } } #if ENABLE_LAZY_PREVIEW_API static List CreateFetchLazyPreviewTextCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+preview.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 UID FETCH 1:* (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE PREVIEW (LAZY))\r\n", "gmail.fetch-preview.txt"), new ImapReplayCommand ("A00000008 FETCH 1:6 (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE PREVIEW (LAZY))\r\n", "gmail.fetch-preview.txt"), new ImapReplayCommand ("A00000009 FETCH 1:* (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE PREVIEW (LAZY))\r\n", "gmail.fetch-preview.txt") }; } [Test] public void TestFetchLazyPreviewText () { var commands = CreateFetchLazyPreviewTextCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var request = new FetchRequest (MessageSummaryItems.All | MessageSummaryItems.PreviewText) { PreviewOptions = PreviewOptions.Lazy }; var messages = inbox.Fetch (UniqueIdRange.All, request); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); messages = inbox.Fetch (new int[] { 0, 1, 2, 3, 4, 5 }, request); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); messages = inbox.Fetch (0, -1, request); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); client.Disconnect (false); } } [Test] public async Task TestFetchLazyPreviewTextAsync () { var commands = CreateFetchLazyPreviewTextCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var request = new FetchRequest (MessageSummaryItems.All | MessageSummaryItems.PreviewText) { PreviewOptions = PreviewOptions.Lazy }; var messages = await inbox.FetchAsync (UniqueIdRange.All, request); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); messages = await inbox.FetchAsync (new int[] { 0, 1, 2, 3, 4, 5 }, request); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); messages = await inbox.FetchAsync (0, -1, request); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (PreviewTextValues[i])); await client.DisconnectAsync (false); } } #endif static readonly string[] SimulatedPreviewTextValues = { "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver…", "Don’t miss our celebrity guest Monday evening", "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver…", "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver…", "Don’t miss our celebrity guest Monday evening", "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver…", string.Empty }; static List CreateFetchSimulatedPreviewTextCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 UID FETCH 1:* (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE)\r\n", "gmail.fetch-previewtext-bodystructure.txt"), new ImapReplayCommand ("A00000008 UID FETCH 1,4 (BODY.PEEK[TEXT]<0.512>)\r\n", "gmail.fetch-previewtext-peek-text-only.txt"), new ImapReplayCommand ("A00000009 UID FETCH 3,6 (BODY.PEEK[1]<0.512>)\r\n", "gmail.fetch-previewtext-peek-text-alternative.txt"), new ImapReplayCommand ("A00000010 UID FETCH 2,5 (BODY.PEEK[TEXT]<0.16384>)\r\n", "gmail.fetch-previewtext-peek-html-only.txt"), new ImapReplayCommand ("A00000011 FETCH 1:7 (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE)\r\n", "gmail.fetch-previewtext-bodystructure.txt"), new ImapReplayCommand ("A00000012 UID FETCH 1,4 (BODY.PEEK[TEXT]<0.512>)\r\n", "gmail.fetch-previewtext-peek-text-only.txt"), new ImapReplayCommand ("A00000013 UID FETCH 3,6 (BODY.PEEK[1]<0.512>)\r\n", "gmail.fetch-previewtext-peek-text-alternative.txt"), new ImapReplayCommand ("A00000014 UID FETCH 2,5 (BODY.PEEK[TEXT]<0.16384>)\r\n", "gmail.fetch-previewtext-peek-html-only.txt"), new ImapReplayCommand ("A00000015 FETCH 1:* (UID FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODYSTRUCTURE)\r\n", "gmail.fetch-previewtext-bodystructure.txt"), new ImapReplayCommand ("A00000016 UID FETCH 1,4 (BODY.PEEK[TEXT]<0.512>)\r\n", "gmail.fetch-previewtext-peek-text-only.txt"), new ImapReplayCommand ("A00000017 UID FETCH 3,6 (BODY.PEEK[1]<0.512>)\r\n", "gmail.fetch-previewtext-peek-text-alternative.txt"), new ImapReplayCommand ("A00000018 UID FETCH 2,5 (BODY.PEEK[TEXT]<0.16384>)\r\n", "gmail.fetch-previewtext-peek-html-only.txt") }; } [Test] public void TestFetchSimulatedPreviewText () { var commands = CreateFetchSimulatedPreviewTextCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var messages = inbox.Fetch (UniqueIdRange.All, MessageSummaryItems.Full | MessageSummaryItems.PreviewText); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (SimulatedPreviewTextValues[i])); messages = inbox.Fetch (new int[] { 0, 1, 2, 3, 4, 5, 6 }, MessageSummaryItems.Full | MessageSummaryItems.PreviewText); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (SimulatedPreviewTextValues[i])); messages = inbox.Fetch (0, -1, MessageSummaryItems.Full | MessageSummaryItems.PreviewText); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (SimulatedPreviewTextValues[i])); client.Disconnect (false); } } [Test] public async Task TestFetchSimulatedPreviewTextAsync () { var commands = CreateFetchSimulatedPreviewTextCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var messages = await inbox.FetchAsync (UniqueIdRange.All, MessageSummaryItems.Full | MessageSummaryItems.PreviewText); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (SimulatedPreviewTextValues[i])); messages = await inbox.FetchAsync (new int[] { 0, 1, 2, 3, 4, 5, 6 }, MessageSummaryItems.Full | MessageSummaryItems.PreviewText); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (SimulatedPreviewTextValues[i])); messages = await inbox.FetchAsync (0, -1, MessageSummaryItems.Full | MessageSummaryItems.PreviewText); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].PreviewText, Is.EqualTo (SimulatedPreviewTextValues[i])); await client.DisconnectAsync (false); } } static List CreateFetchSimulatedKoreanPreviewTextCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 UID FETCH 1 (UID BODYSTRUCTURE)\r\n", "gmail.fetch-korean-previewtext-bodystructure.txt"), new ImapReplayCommand ("A00000008 UID FETCH 1 (BODY.PEEK[TEXT]<0.512>)\r\n", "gmail.fetch-korean-previewtext-peek-text-only.txt"), }; } [Test] public void TestFetchSimulatedKoreanPreviewText () { const string koreanPreviewText = "서기 250년경 고분 시대가 시작되면서 고분이라고 불리는 거대한 무덤이 건설된 것은 보다 집약적인 농업과 철기 기술의 도입에 힘입어 강력한 전사 엘리트의 출현을 나타냅니다. 일본은 철과 기타 물품의 공급을 확보하기 위해 남한의 연안 지배 집단과 집중적인 접촉을 벌이면서 중국에 사신을 파견하면서 대륙 본토와의 접촉이 증가했습니다(238, 243, 247). 4세기 동안 지속된 한반도의 한국 세력과"; var commands = CreateFetchSimulatedKoreanPreviewTextCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var messages = inbox.Fetch (new[] { new UniqueId (1) }, MessageSummaryItems.PreviewText); Assert.That (messages.Count, Is.EqualTo (1), "Expected 1 message to be fetched."); Assert.That (messages[0].PreviewText, Is.EqualTo (koreanPreviewText)); client.Disconnect (false); } } [Test] public async Task TestFetchSimulatedKoreanPreviewTextAsync () { const string koreanPreviewText = "서기 250년경 고분 시대가 시작되면서 고분이라고 불리는 거대한 무덤이 건설된 것은 보다 집약적인 농업과 철기 기술의 도입에 힘입어 강력한 전사 엘리트의 출현을 나타냅니다. 일본은 철과 기타 물품의 공급을 확보하기 위해 남한의 연안 지배 집단과 집중적인 접촉을 벌이면서 중국에 사신을 파견하면서 대륙 본토와의 접촉이 증가했습니다(238, 243, 247). 4세기 동안 지속된 한반도의 한국 세력과"; var commands = CreateFetchSimulatedKoreanPreviewTextCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var messages = await inbox.FetchAsync (new[] { new UniqueId (1) }, MessageSummaryItems.PreviewText); Assert.That (messages.Count, Is.EqualTo (1), "Expected 1 message to be fetched."); Assert.That (messages[0].PreviewText, Is.EqualTo (koreanPreviewText)); await client.DisconnectAsync (false); } } static List CreateFetchQuotedStringCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 FETCH 1:* (UID BODYSTRUCTURE)\r\n", "gmail.fetch-quoted-string-bodystructure.txt"), new ImapReplayCommand ("A00000008 UID FETCH 1 (BODY.PEEK[1.TEXT]<0.512>)\r\n", "gmail.fetch-quoted-string.txt"), }; } [Test] public void TestFetchQuotedString () { var commands = CreateFetchQuotedStringCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var messages = inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); using (var stream = inbox.GetStream (messages[0].UniqueId, messages[0].TextBody.PartSpecifier + ".TEXT", 0, 512)) { var text = Encoding.UTF8.GetString (((MemoryStream) stream).ToArray ()); Assert.That (text, Is.EqualTo ("This is the message body as a quoted-string."), "The message body does not match."); } client.Disconnect (false); } } [Test] public async Task TestFetchQuotedStringAsync () { var commands = CreateFetchQuotedStringCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var messages = await inbox.FetchAsync (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); using (var stream = await inbox.GetStreamAsync (messages[0].UniqueId, messages[0].TextBody.PartSpecifier + ".TEXT", 0, 512)) { var text = Encoding.UTF8.GetString (((MemoryStream) stream).ToArray ()); Assert.That (text, Is.EqualTo ("This is the message body as a quoted-string."), "The message body does not match."); } await client.DisconnectAsync (false); } } static List CreateFetchNilCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 FETCH 1:* (UID BODYSTRUCTURE)\r\n", "gmail.fetch-nil-bodystructure.txt"), new ImapReplayCommand ("A00000008 UID FETCH 1 (BODY.PEEK[1.TEXT]<0.512>)\r\n", "gmail.fetch-nil.txt"), }; } [Test] public void TestFetchNil () { var commands = CreateFetchNilCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var messages = inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); using (var stream = inbox.GetStream (messages[0].UniqueId, messages[0].TextBody.PartSpecifier + ".TEXT", 0, 512)) { var text = Encoding.UTF8.GetString (((MemoryStream) stream).ToArray ()); Assert.That (text, Is.EqualTo (string.Empty), "The message body does not match."); } client.Disconnect (false); } } [Test] public async Task TestFetchNilAsync () { var commands = CreateFetchNilCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var messages = await inbox.FetchAsync (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); using (var stream = await inbox.GetStreamAsync (messages[0].UniqueId, messages[0].TextBody.PartSpecifier + ".TEXT", 0, 512)) { var text = Encoding.UTF8.GetString (((MemoryStream) stream).ToArray ()); Assert.That (text, Is.EqualTo (string.Empty), "The message body does not match."); } await client.DisconnectAsync (false); } } static List CreateExpungeDuringFetchCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 UID FETCH 1:6 (UID INTERNALDATE ENVELOPE)\r\n", "gmail.expunge-during-fetch.txt") }; } [Test] public void TestExpungeDuringFetch () { var commands = CreateExpungeDuringFetchCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var range = new UniqueIdRange (0, 1, 6); var messages = inbox.Fetch (range, MessageSummaryItems.UniqueId | MessageSummaryItems.InternalDate | MessageSummaryItems.Envelope); Assert.That (messages, Has.Count.EqualTo (4), "Count"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Index, Is.EqualTo (i), $"Index #{i}"); Assert.That (messages[0].UniqueId.Id, Is.EqualTo ((uint) 1), "UniqueId #0"); Assert.That (messages[1].UniqueId.Id, Is.EqualTo ((uint) 3), "UniqueId #1"); Assert.That (messages[2].UniqueId.Id, Is.EqualTo ((uint) 4), "UniqueId #2"); Assert.That (messages[3].UniqueId.Id, Is.EqualTo ((uint) 5), "UniqueId #3"); client.Disconnect (false); } } [Test] public async Task TestExpungeDuringFetchAsync () { var commands = CreateExpungeDuringFetchCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var range = new UniqueIdRange (0, 1, 6); var messages = await inbox.FetchAsync (range, MessageSummaryItems.UniqueId | MessageSummaryItems.InternalDate | MessageSummaryItems.Envelope); Assert.That (messages, Has.Count.EqualTo (4), "Count"); for (int i = 0; i < messages.Count; i++) Assert.That (messages[i].Index, Is.EqualTo (i), $"Index #{i}"); Assert.That (messages[0].UniqueId.Id, Is.EqualTo ((uint) 1), "UniqueId #0"); Assert.That (messages[1].UniqueId.Id, Is.EqualTo ((uint) 3), "UniqueId #1"); Assert.That (messages[2].UniqueId.Id, Is.EqualTo ((uint) 4), "UniqueId #2"); Assert.That (messages[3].UniqueId.Id, Is.EqualTo ((uint) 5), "UniqueId #3"); await client.DisconnectAsync (false); } } static List CreateExtractingPrecisePangolinAttachmentCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "gmail.list-personal.txt"), new ImapReplayCommand ("A00000006 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000007 FETCH 270 (BODY.PEEK[])\r\n", "gmail.precise-pangolin-message.txt") }; } [Test] public void TestExtractingPrecisePangolinAttachment () { var commands = CreateExtractingPrecisePangolinAttachmentCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); foreach (var special in Enum.GetValues (typeof (SpecialFolder)).OfType ()) { var folder = client.GetFolder (special); if (special != SpecialFolder.Archive) { var expected = GetSpecialFolderAttribute (special) | FolderAttributes.HasNoChildren; Assert.That (folder, Is.Not.Null, $"Expected non-null {special} folder."); Assert.That (folder.Attributes, Is.EqualTo (expected), $"Expected {special} attributes to be \\HasNoChildren."); } else { Assert.That (folder, Is.Null, $"Expected null {special} folder."); } } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = personal.GetSubfolders (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); client.Inbox.Open (FolderAccess.ReadOnly); using (var message = client.Inbox.GetMessage (269)) { using (var jpeg = new MemoryStream ()) { var attachment = message.Attachments.OfType ().FirstOrDefault (); attachment.Content.DecodeTo (jpeg); jpeg.Position = 0; using (var md5 = MD5.Create ()) { var md5sum = HexEncode (md5.ComputeHash (jpeg)); Assert.That (md5sum, Is.EqualTo ("167a46aa81e881da2ea8a840727384d3"), "MD5 checksums do not match."); } } } client.Disconnect (false); } } [Test] public async Task TestExtractingPrecisePangolinAttachmentAsync () { var commands = CreateExtractingPrecisePangolinAttachmentCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: Do not try XOAUTH2 client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var inbox = client.Inbox; Assert.That (inbox, Is.Not.Null, "Expected non-null Inbox folder."); Assert.That (inbox.Attributes, Is.EqualTo (FolderAttributes.Inbox | FolderAttributes.HasNoChildren | FolderAttributes.Subscribed), "Expected Inbox attributes to be \\HasNoChildren."); foreach (var special in Enum.GetValues (typeof (SpecialFolder)).OfType ()) { var folder = client.GetFolder (special); if (special != SpecialFolder.Archive) { var expected = GetSpecialFolderAttribute (special) | FolderAttributes.HasNoChildren; Assert.That (folder, Is.Not.Null, $"Expected non-null {special} folder."); Assert.That (folder.Attributes, Is.EqualTo (expected), $"Expected {special} attributes to be \\HasNoChildren."); } else { Assert.That (folder, Is.Null, $"Expected null {special} folder."); } } // disable LIST-EXTENDED client.Capabilities &= ~ImapCapabilities.ListExtended; var personal = client.GetFolder (client.PersonalNamespaces[0]); var folders = await personal.GetSubfoldersAsync (); Assert.That (folders[0], Is.EqualTo (client.Inbox), "Expected the first folder to be the Inbox."); Assert.That (folders[1].FullName, Is.EqualTo ("[Gmail]"), "Expected the second folder to be [Gmail]."); Assert.That (folders[1].Attributes, Is.EqualTo (FolderAttributes.NoSelect | FolderAttributes.HasChildren), "Expected [Gmail] folder to be \\Noselect \\HasChildren."); await client.Inbox.OpenAsync (FolderAccess.ReadOnly); using (var message = await client.Inbox.GetMessageAsync (269)) { using (var jpeg = new MemoryStream ()) { var attachment = message.Attachments.OfType ().FirstOrDefault (); attachment.Content.DecodeTo (jpeg); jpeg.Position = 0; using (var md5 = MD5.Create ()) { var md5sum = HexEncode (md5.ComputeHash (jpeg)); Assert.That (md5sum, Is.EqualTo ("167a46aa81e881da2ea8a840727384d3"), "MD5 checksums do not match."); } } } await client.DisconnectAsync (false); } } static List CreateFetchObjectIdAttributesCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+statussize+objectid.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000006 FETCH 1:* (UID EMAILID THREADID)\r\n", "gmail.fetch-objectid.txt"), new ImapReplayCommand ("A00000007 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestFetchObjectIdAttributes () { var commands = CreateFetchObjectIdAttributesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.ObjectID), Is.True, "OBJECTID"); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var messages = inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.EmailId | MessageSummaryItems.ThreadId); Assert.That (messages, Has.Count.EqualTo (4), "Count"); Assert.That (messages[0].UniqueId.Id, Is.EqualTo (1), "UniqueId"); Assert.That (messages[0].EmailId, Is.EqualTo ("M6d99ac3275bb4e"), "EmailId"); Assert.That (messages[0].ThreadId, Is.EqualTo ("T64b478a75b7ea9"), "ThreadId"); Assert.That (messages[1].UniqueId.Id, Is.EqualTo (2), "UniqueId"); Assert.That (messages[1].EmailId, Is.EqualTo ("M288836c4c7a762"), "EmailId"); Assert.That (messages[1].ThreadId, Is.EqualTo ("T64b478a75b7ea9"), "ThreadId"); Assert.That (messages[2].UniqueId.Id, Is.EqualTo (3), "UniqueId"); Assert.That (messages[2].EmailId, Is.EqualTo ("M5fdc09b49ea703"), "EmailId"); Assert.That (messages[2].ThreadId, Is.EqualTo ("T11863d02dd95b5"), "ThreadId"); Assert.That (messages[3].UniqueId.Id, Is.EqualTo (4), "UniqueId"); Assert.That (messages[3].EmailId, Is.EqualTo ("M4fdc09b49ea629"), "EmailId"); Assert.That (messages[3].ThreadId, Is.EqualTo (null), "ThreadId"); client.Disconnect (true); } } [Test] public async Task TestFetchObjectIdAttributesAsync () { var commands = CreateFetchObjectIdAttributesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.ObjectID), Is.True, "OBJECTID"); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var messages = await inbox.FetchAsync (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.EmailId | MessageSummaryItems.ThreadId); Assert.That (messages, Has.Count.EqualTo (4), "Count"); Assert.That (messages[0].UniqueId.Id, Is.EqualTo (1), "UniqueId"); Assert.That (messages[0].EmailId, Is.EqualTo ("M6d99ac3275bb4e"), "EmailId"); Assert.That (messages[0].ThreadId, Is.EqualTo ("T64b478a75b7ea9"), "ThreadId"); Assert.That (messages[1].UniqueId.Id, Is.EqualTo (2), "UniqueId"); Assert.That (messages[1].EmailId, Is.EqualTo ("M288836c4c7a762"), "EmailId"); Assert.That (messages[1].ThreadId, Is.EqualTo ("T64b478a75b7ea9"), "ThreadId"); Assert.That (messages[2].UniqueId.Id, Is.EqualTo (3), "UniqueId"); Assert.That (messages[2].EmailId, Is.EqualTo ("M5fdc09b49ea703"), "EmailId"); Assert.That (messages[2].ThreadId, Is.EqualTo ("T11863d02dd95b5"), "ThreadId"); Assert.That (messages[3].UniqueId.Id, Is.EqualTo (4), "UniqueId"); Assert.That (messages[3].EmailId, Is.EqualTo ("M4fdc09b49ea629"), "EmailId"); Assert.That (messages[3].ThreadId, Is.EqualTo (null), "ThreadId"); await client.DisconnectAsync (true); } } static List CreateFetchSaveDateCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+savedate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.examine-inbox.txt"), new ImapReplayCommand ("A00000006 FETCH 1:* (UID SAVEDATE)\r\n", "gmail.fetch-savedate.txt"), new ImapReplayCommand ("A00000007 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestFetchSaveDate () { var commands = CreateFetchSaveDateCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.SaveDate), Is.True, "SAVEDATE"); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadOnly); var messages = inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.SaveDate); var dto = new DateTimeOffset (2023, 9, 12, 13, 39, 01, new TimeSpan (-4, 0, 0)); Assert.That (messages, Has.Count.EqualTo (4), "Count"); Assert.That (messages[0].UniqueId.Id, Is.EqualTo (1), "UniqueId"); Assert.That (messages[0].SaveDate, Is.EqualTo (dto), "SaveDate"); Assert.That (messages[1].UniqueId.Id, Is.EqualTo (2), "UniqueId"); Assert.That (messages[1].SaveDate, Is.EqualTo (dto), "SaveDate"); Assert.That (messages[2].UniqueId.Id, Is.EqualTo (3), "UniqueId"); Assert.That (messages[2].SaveDate, Is.EqualTo (dto), "SaveDate"); Assert.That (messages[3].UniqueId.Id, Is.EqualTo (4), "UniqueId"); Assert.That (messages[3].SaveDate, Is.EqualTo (null), "SaveDate"); client.Disconnect (true); } } [Test] public async Task TestFetchSaveDateAsync () { var commands = CreateFetchSaveDateCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.SaveDate), Is.True, "SAVEDATE"); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var messages = await inbox.FetchAsync (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.SaveDate); var dto = new DateTimeOffset (2023, 9, 12, 13, 39, 01, new TimeSpan (-4, 0, 0)); Assert.That (messages, Has.Count.EqualTo (4), "Count"); Assert.That (messages[0].UniqueId.Id, Is.EqualTo (1), "UniqueId"); Assert.That (messages[0].SaveDate, Is.EqualTo (dto), "SaveDate"); Assert.That (messages[1].UniqueId.Id, Is.EqualTo (2), "UniqueId"); Assert.That (messages[1].SaveDate, Is.EqualTo (dto), "SaveDate"); Assert.That (messages[2].UniqueId.Id, Is.EqualTo (3), "UniqueId"); Assert.That (messages[2].SaveDate, Is.EqualTo (dto), "SaveDate"); Assert.That (messages[3].UniqueId.Id, Is.EqualTo (4), "UniqueId"); Assert.That (messages[3].SaveDate, Is.EqualTo (null), "SaveDate"); await client.DisconnectAsync (true); } } static List CreateFetchAnnotationsCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+annotate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate-readonly.txt"), new ImapReplayCommand ("A00000005 FETCH 1:* (UID ANNOTATION (/* (value size)))\r\n", "common.fetch-annotations.txt"), new ImapReplayCommand ("A00000006 NOOP\r\n", "common.fetch-annotations.txt"), }; } [Test] public void TestFetchAnnotations () { var commands = CreateFetchAnnotationsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Annotate), Is.True, "ANNOTATE-EXPERIMENT-1"); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadOnly), "AnnotationAccess"); //Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); //Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); var messages = inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Annotations); Assert.That (messages, Has.Count.EqualTo (3), "Count"); IReadOnlyList annotations; Assert.That (messages[0].UniqueId.Id, Is.EqualTo (1), "UniqueId"); annotations = messages[0].Annotations; Assert.That (annotations, Has.Count.EqualTo (1), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (2), "Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "value.shared"); Assert.That (messages[1].UniqueId.Id, Is.EqualTo (2), "UniqueId"); annotations = messages[1].Annotations; Assert.That (annotations, Has.Count.EqualTo (2), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "annotations[0].Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (2), "annotations[0].Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "annotations[0] value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[0] value.shared"); Assert.That (annotations[1].Entry, Is.EqualTo (AnnotationEntry.AltSubject), "annotations[1].Entry"); Assert.That (annotations[1].Properties, Has.Count.EqualTo (2), "annotations[1].Properties.Count"); Assert.That (annotations[1].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My subject"), "annotations[1] value.priv"); Assert.That (annotations[1].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[1] value.shared"); Assert.That (messages[2].UniqueId.Id, Is.EqualTo (3), "UniqueId"); annotations = messages[2].Annotations; Assert.That (annotations, Has.Count.EqualTo (1), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "annotations[0].Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (4), "annotations[0].Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "annotations[0] value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[0] value.shared"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateSize], Is.EqualTo ("10"), "annotations[0] size.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedSize], Is.EqualTo ("0"), "annotations[0] size.shared"); var annotationsChanged = new List (); inbox.AnnotationsChanged += (sender, e) => { annotationsChanged.Add (e); }; client.NoOp (); Assert.That (annotationsChanged, Has.Count.EqualTo (3), "# AnnotationsChanged events"); client.Disconnect (false); } } [Test] public async Task TestFetchAnnotationsAsync () { var commands = CreateFetchAnnotationsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Annotate), Is.True, "ANNOTATE-EXPERIMENT-1"); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadOnly), "AnnotationAccess"); //Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); //Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); var messages = await inbox.FetchAsync (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Annotations); Assert.That (messages, Has.Count.EqualTo (3), "Count"); IReadOnlyList annotations; Assert.That (messages[0].UniqueId.Id, Is.EqualTo (1), "UniqueId"); annotations = messages[0].Annotations; Assert.That (annotations, Has.Count.EqualTo (1), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (2), "Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "value.shared"); Assert.That (messages[1].UniqueId.Id, Is.EqualTo (2), "UniqueId"); annotations = messages[1].Annotations; Assert.That (annotations, Has.Count.EqualTo (2), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "annotations[0].Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (2), "annotations[0].Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "annotations[0] value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[0] value.shared"); Assert.That (annotations[1].Entry, Is.EqualTo (AnnotationEntry.AltSubject), "annotations[1].Entry"); Assert.That (annotations[1].Properties, Has.Count.EqualTo (2), "annotations[1].Properties.Count"); Assert.That (annotations[1].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My subject"), "annotations[1] value.priv"); Assert.That (annotations[1].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[1] value.shared"); Assert.That (messages[2].UniqueId.Id, Is.EqualTo (3), "UniqueId"); annotations = messages[2].Annotations; Assert.That (annotations, Has.Count.EqualTo (1), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "annotations[0].Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (4), "annotations[0].Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "annotations[0] value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[0] value.shared"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateSize], Is.EqualTo ("10"), "annotations[0] size.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedSize], Is.EqualTo ("0"), "annotations[0] size.shared"); var annotationsChanged = new List (); inbox.AnnotationsChanged += (sender, e) => { annotationsChanged.Add (e); }; await client.NoOpAsync (); Assert.That (annotationsChanged, Has.Count.EqualTo (3), "# AnnotationsChanged events"); client.Disconnect (false); } } static List CreateDominoParenthesisWorkaroundCommands () { return new List { new ImapReplayCommand ("", Encoding.ASCII.GetBytes ("* OK Domino IMAP4 Server Release 10.0.1FP3 ready Wed, 30 Oct 2019 09:28:06 +0100\r\n")), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "domino.capability.txt"), new ImapReplayCommand ("A00000001 LOGIN username password\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000002 CAPABILITY\r\n", "domino.capability.txt"), new ImapReplayCommand ("A00000003 NAMESPACE\r\n", "domino.namespace.txt"), new ImapReplayCommand ("A00000004 LIST \"\" \"INBOX\"\r\n", "domino.list-inbox.txt"), new ImapReplayCommand ("A00000005 SELECT Inbox\r\n", "common.select-inbox.txt"), new ImapReplayCommand ("A00000006 FETCH 1:* (UID ENVELOPE BODYSTRUCTURE)\r\n", "domino.fetch-extra-parens.txt") }; } [Test] public void TestDominoParenthesisWorkaround () { var commands = CreateDominoParenthesisWorkaroundCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.PersonalNamespaces, Has.Count.EqualTo (1), "Personal Count"); Assert.That (client.PersonalNamespaces[0].Path, Is.EqualTo (""), "Personal Path"); Assert.That (client.PersonalNamespaces[0].DirectorySeparator, Is.EqualTo ('\\'), "Personal DirectorySeparator"); Assert.That (client.OtherNamespaces, Has.Count.EqualTo (1), "Other Count"); Assert.That (client.OtherNamespaces[0].Path, Is.EqualTo ("Other"), "Other Path"); Assert.That (client.OtherNamespaces[0].DirectorySeparator, Is.EqualTo ('\\'), "Other DirectorySeparator"); Assert.That (client.SharedNamespaces, Has.Count.EqualTo (1), "Shared Count"); Assert.That (client.SharedNamespaces[0].Path, Is.EqualTo ("Shared"), "Shared Path"); Assert.That (client.SharedNamespaces[0].DirectorySeparator, Is.EqualTo ('\\'), "Shared DirectorySeparator"); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); var messages = inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure); Assert.That (messages, Has.Count.EqualTo (29), "Count"); for (int i = 0; i < 29; i++) { Assert.That (messages[i].Index, Is.EqualTo (i), "MessageSummaryItems are out of order!"); } client.Disconnect (false); } } [Test] public async Task TestDominoParenthesisWorkaroundAsync () { var commands = CreateDominoParenthesisWorkaroundCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.PersonalNamespaces, Has.Count.EqualTo (1), "Personal Count"); Assert.That (client.PersonalNamespaces[0].Path, Is.EqualTo (""), "Personal Path"); Assert.That (client.PersonalNamespaces[0].DirectorySeparator, Is.EqualTo ('\\'), "Personal DirectorySeparator"); Assert.That (client.OtherNamespaces, Has.Count.EqualTo (1), "Other Count"); Assert.That (client.OtherNamespaces[0].Path, Is.EqualTo ("Other"), "Other Path"); Assert.That (client.OtherNamespaces[0].DirectorySeparator, Is.EqualTo ('\\'), "Other DirectorySeparator"); Assert.That (client.SharedNamespaces, Has.Count.EqualTo (1), "Shared Count"); Assert.That (client.SharedNamespaces[0].Path, Is.EqualTo ("Shared"), "Shared Path"); Assert.That (client.SharedNamespaces[0].DirectorySeparator, Is.EqualTo ('\\'), "Shared DirectorySeparator"); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var messages = await inbox.FetchAsync (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure); Assert.That (messages, Has.Count.EqualTo (29), "Count"); for (int i = 0; i < 29; i++) { Assert.That (messages[i].Index, Is.EqualTo (i), "MessageSummaryItems are out of order!"); } client.Disconnect (false); } } static IList CreateFetchStreamUnsolicitedInfoCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+annotate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE ANNOTATE)\r\n", "common.select-inbox-annotate.txt"), new ImapReplayCommand ("A00000006 UID FETCH 1 (BODY.PEEK[HEADER])\r\n", "gmail.headers.1+unsolicited-info.txt"), new ImapReplayCommand ("A00000007 UID FETCH 1 (BODY.PEEK[])\r\n", "gmail.fetch.1+unsolicited-info.txt"), new ImapReplayCommand ("A00000008 UID FETCH 1 (BODY.PEEK[])\r\n", "gmail.fetch.1+unsolicited-info.txt") }; } [Test] public void TestFetchStreamUnsolicitedInfo () { var commands = CreateFetchStreamUnsolicitedInfoCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Annotate), Is.True, "ANNOTATE-EXPERIMENT-1"); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadWrite), "AnnotationAccess"); //Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); //Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); // Keep track of various folder events var annotationsChanged = new List (); var flagsChanged = new List (); var labelsChanged = new List (); var modSeqChanged = new List (); inbox.AnnotationsChanged += (sender, e) => { annotationsChanged.Add (e); }; inbox.MessageFlagsChanged += (sender, e) => { flagsChanged.Add (e); }; inbox.MessageLabelsChanged += (sender, e) => { labelsChanged.Add (e); }; inbox.ModSeqChanged += (sender, e) => { modSeqChanged.Add (e); }; Assert.That (inbox.HighestModSeq, Is.EqualTo (2), "HIGHESTMODSEQ #1"); var headers = inbox.GetHeaders (new UniqueId (1)); var message = inbox.GetMessage (new UniqueId (1)); var stream = inbox.GetStream (new UniqueId (1)); Assert.That (inbox.HighestModSeq, Is.EqualTo (29233), "HIGHESTMODSEQ #2"); Assert.That (annotationsChanged, Has.Count.EqualTo (3), "AnnotationsChanged"); Assert.That (flagsChanged, Has.Count.EqualTo (3), "FlagsChanged"); Assert.That (labelsChanged, Has.Count.EqualTo (3), "LabelsChanged"); Assert.That (modSeqChanged, Has.Count.EqualTo (3), "ModSeqChanged"); client.Disconnect (false); } } [Test] public async Task TestFetchStreamUnsolicitedInfoAsync () { var commands = CreateFetchStreamUnsolicitedInfoCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Annotate), Is.True, "ANNOTATE-EXPERIMENT-1"); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); Assert.That (inbox.AnnotationAccess, Is.EqualTo (AnnotationAccess.ReadWrite), "AnnotationAccess"); //Assert.That (inbox.AnnotationScopes, Is.EqualTo (AnnotationScope.Shared), "AnnotationScopes"); //Assert.That (inbox.MaxAnnotationSize, Is.EqualTo (20480), "MaxAnnotationSize"); // Keep track of various folder events var annotationsChanged = new List (); var flagsChanged = new List (); var labelsChanged = new List (); var modSeqChanged = new List (); inbox.AnnotationsChanged += (sender, e) => { annotationsChanged.Add (e); }; inbox.MessageFlagsChanged += (sender, e) => { flagsChanged.Add (e); }; inbox.MessageLabelsChanged += (sender, e) => { labelsChanged.Add (e); }; inbox.ModSeqChanged += (sender, e) => { modSeqChanged.Add (e); }; Assert.That (inbox.HighestModSeq, Is.EqualTo (2), "HIGHESTMODSEQ #1"); var headers = await inbox.GetHeadersAsync (new UniqueId (1)); var message = await inbox.GetMessageAsync (new UniqueId (1)); var stream = await inbox.GetStreamAsync (new UniqueId (1)); Assert.That (inbox.HighestModSeq, Is.EqualTo (29233), "HIGHESTMODSEQ #2"); Assert.That (annotationsChanged, Has.Count.EqualTo (3), "AnnotationsChanged"); Assert.That (flagsChanged, Has.Count.EqualTo (3), "FlagsChanged"); Assert.That (labelsChanged, Has.Count.EqualTo (3), "LabelsChanged"); Assert.That (modSeqChanged, Has.Count.EqualTo (3), "ModSeqChanged"); client.Disconnect (false); } } static IList CreateFetchNegativeModSeqResponseValuesCommands () { return new List { new ImapReplayCommand ("", "zoho.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "zoho.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "zoho.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "zoho.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "zoho.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "zoho.xlist.txt"), new ImapReplayCommand ("A00000005 EXAMINE Gesendet (CONDSTORE)\r\n", "zoho.examine-gesendet.txt"), new ImapReplayCommand ("A00000006 FETCH 1:74 (UID FLAGS MODSEQ)\r\n", "zoho.fetch-negative-modseq-values.txt") }; } [Test] public void TestFetchNegativeModSeqResponseValues () { var commands = CreateFetchNegativeModSeqResponseValuesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var gesendet = client.GetFolder (SpecialFolder.Sent); gesendet.Open (FolderAccess.ReadOnly); var messages = gesendet.Fetch (0, 73, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq); Assert.That (messages, Has.Count.EqualTo (74), "Count"); for (int i = 0; i < 15; i++) { Assert.That (messages[i].ModSeq, Is.EqualTo ((ulong) 0), $"MODSEQ {i}"); Assert.That (messages[i].Flags, Is.EqualTo (MessageFlags.Seen), $"FLAGS {i}"); } for (int i = 15; i < 39; i++) { Assert.That (messages[i].ModSeq, Is.EqualTo ((ulong) 0), $"MODSEQ {i}"); Assert.That (messages[i].Flags, Is.EqualTo (MessageFlags.Seen | MessageFlags.Recent), $"FLAGS {i}"); if (i == 35) { Assert.That (messages[i].Keywords, Has.Count.EqualTo (1), $"KEYWORDS {i}"); Assert.That (messages[i].Keywords.Contains ("$FORWARDED"), Is.True, $"KEYWORDS {i}"); } } for (int i = 39; i < 70; i++) { if (i == 53) { Assert.That (messages[i].ModSeq, Is.EqualTo (1538484935027010002), $"MODSEQ {i}"); Assert.That (messages[i].Flags, Is.EqualTo (MessageFlags.Seen | MessageFlags.Recent | MessageFlags.Answered), $"FLAGS {i}"); } else { Assert.That (messages[i].ModSeq, Is.Null, $"MODSEQ {i}"); Assert.That (messages[i].Flags, Is.EqualTo (MessageFlags.Seen | MessageFlags.Recent), $"FLAGS {i}"); } } } } [Test] public async Task TestFetchNegativeModSeqResponseValuesAsync () { var commands = CreateFetchNegativeModSeqResponseValuesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var gesendet = client.GetFolder (SpecialFolder.Sent); await gesendet.OpenAsync (FolderAccess.ReadOnly); var messages = await gesendet.FetchAsync (0, 73, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq); Assert.That (messages, Has.Count.EqualTo (74), "Count"); for (int i = 0; i < 15; i++) { Assert.That (messages[i].ModSeq, Is.EqualTo ((ulong) 0), $"MODSEQ {i}"); Assert.That (messages[i].Flags, Is.EqualTo (MessageFlags.Seen), $"FLAGS {i}"); } for (int i = 15; i < 39; i++) { Assert.That (messages[i].ModSeq, Is.EqualTo ((ulong) 0), $"MODSEQ {i}"); Assert.That (messages[i].Flags, Is.EqualTo (MessageFlags.Seen | MessageFlags.Recent), $"FLAGS {i}"); if (i == 35) { Assert.That (messages[i].Keywords, Has.Count.EqualTo (1), $"KEYWORDS {i}"); Assert.That (messages[i].Keywords.Contains ("$FORWARDED"), Is.True, $"KEYWORDS {i}"); } } for (int i = 39; i < 70; i++) { if (i == 53) { Assert.That (messages[i].ModSeq, Is.EqualTo (1538484935027010002), $"MODSEQ {i}"); Assert.That (messages[i].Flags, Is.EqualTo (MessageFlags.Seen | MessageFlags.Recent | MessageFlags.Answered), $"FLAGS {i}"); } else { Assert.That (messages[i].ModSeq, Is.Null, $"MODSEQ {i}"); Assert.That (messages[i].Flags, Is.EqualTo (MessageFlags.Seen | MessageFlags.Recent), $"FLAGS {i}"); } } } } static IList CreateYandexGetBodyPartMissingContentCommands () { return new List { new ImapReplayCommand ("", "yandex.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "yandex.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN\r\n", ImapReplayCommandResponse.Plus), new ImapReplayCommand ("A00000001", "AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "yandex.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "yandex.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\"\r\n", "yandex.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "yandex.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX\r\n", "yandex.select-inbox.txt"), new ImapReplayCommand ("A00000006 UID FETCH 3016 (BODY.PEEK[2.MIME] BODY.PEEK[2])\r\n", "yandex.getbodypart-missing-content.txt") }; } [Test] public void TestYandexGetBodyPartMissingContent () { // IMAP4rev1 CHILDREN UNSELECT LITERAL+ NAMESPACE XLIST UIDPLUS ENABLE ID AUTH=PLAIN AUTH=XOAUTH2 IDLE MOVE const ImapCapabilities YandexGreetingCapabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Children | ImapCapabilities.Unselect | ImapCapabilities.LiteralPlus | ImapCapabilities.Namespace | ImapCapabilities.XList | ImapCapabilities.UidPlus | ImapCapabilities.Enable | ImapCapabilities.Id | ImapCapabilities.Idle | ImapCapabilities.Move | ImapCapabilities.Status; var commands = CreateYandexGetBodyPartMissingContentCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (YandexGreetingCapabilities), "Greeting Capabilities"); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (2)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (YandexGreetingCapabilities), "Greeting Capabilities"); client.Inbox.Open (FolderAccess.ReadWrite); //var messages = client.Inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq); //Assert.That (messages, Has.Count.EqualTo (74), "Count"); var bodyPart = new BodyPartBasic (new ContentType ("application", "pdf"), "2"); var body = client.Inbox.GetBodyPart (new UniqueId (3016), bodyPart); Assert.That (body, Is.Not.Null); Assert.That (body, Is.InstanceOf ()); var part = (MimePart) body; Assert.That (part.ContentType.MimeType, Is.EqualTo ("application/pdf"), "Content-Type"); Assert.That (part.ContentType.Name, Is.EqualTo ("empty.pdf"), "name"); Assert.That (part.ContentDisposition.Disposition, Is.EqualTo (ContentDisposition.Attachment), "Content-Disposition"); Assert.That (part.ContentDisposition.FileName, Is.EqualTo ("empty.pdf"), "filename"); Assert.That (part.ContentTransferEncoding, Is.EqualTo (ContentEncoding.Base64), "Content-Transfer-Encoding"); Assert.That (part.Content, Is.Null); } } [Test] public async Task TestYandexGetBodyPartMissingContentAsync () { // IMAP4rev1 CHILDREN UNSELECT LITERAL+ NAMESPACE XLIST UIDPLUS ENABLE ID AUTH=PLAIN AUTH=XOAUTH2 IDLE MOVE const ImapCapabilities YandexGreetingCapabilities = ImapCapabilities.IMAP4rev1 | ImapCapabilities.Children | ImapCapabilities.Unselect | ImapCapabilities.LiteralPlus | ImapCapabilities.Namespace | ImapCapabilities.XList | ImapCapabilities.UidPlus | ImapCapabilities.Enable | ImapCapabilities.Id | ImapCapabilities.Idle | ImapCapabilities.Move | ImapCapabilities.Status; var commands = CreateYandexGetBodyPartMissingContentCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (YandexGreetingCapabilities), "Greeting Capabilities"); Assert.That (client.AuthenticationMechanisms, Has.Count.EqualTo (2)); Assert.That (client.AuthenticationMechanisms, Does.Contain ("PLAIN"), "Expected SASL PLAIN auth mechanism"); Assert.That (client.AuthenticationMechanisms, Does.Contain ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities, Is.EqualTo (YandexGreetingCapabilities), "Greeting Capabilities"); await client.Inbox.OpenAsync (FolderAccess.ReadWrite); //var messages = client.Inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.ModSeq); //Assert.That (messages, Has.Count.EqualTo (74), "Count"); var bodyPart = new BodyPartBasic (new ContentType ("application", "pdf"), "2"); var body = await client.Inbox.GetBodyPartAsync (new UniqueId (3016), bodyPart); Assert.That (body, Is.Not.Null); Assert.That (body, Is.InstanceOf ()); var part = (MimePart) body; Assert.That (part.ContentType.MimeType, Is.EqualTo ("application/pdf"), "Content-Type"); Assert.That (part.ContentType.Name, Is.EqualTo ("empty.pdf"), "name"); Assert.That (part.ContentDisposition.Disposition, Is.EqualTo (ContentDisposition.Attachment), "Content-Disposition"); Assert.That (part.ContentDisposition.FileName, Is.EqualTo ("empty.pdf"), "filename"); Assert.That (part.ContentTransferEncoding, Is.EqualTo (ContentEncoding.Base64), "Content-Transfer-Encoding"); Assert.That (part.Content, Is.Null); } } [TestCase ("ALL", MessageSummaryItems.All)] [TestCase ("FAST", MessageSummaryItems.Fast)] [TestCase ("FULL", MessageSummaryItems.Full)] public void TestFormatFetchSummaryItemsMacros (string expected, MessageSummaryItems items) { using (var engine = new ImapEngine (null)) { var request = new FetchRequest (items); var command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo (expected)); } } [Test] public void TestFormatFetchSummaryItemsExcludeHeaders () { using (var engine = new ImapEngine (null)) { var request = new FetchRequest () { Headers = new HeaderSet () { Exclude = true } }; string command; command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER]")); request = new FetchRequest () { Headers = new HeaderSet (new[] { "FROM", "SUBJECT", "DATE" }) { Exclude = true } }; command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER.FIELDS.NOT (FROM SUBJECT DATE)]")); } } [Test] public void TestFormatFetchSummaryItemsReferences () { using (var engine = new ImapEngine (null)) { var request = new FetchRequest (MessageSummaryItems.References); string command; command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER.FIELDS (REFERENCES)]")); request = new FetchRequest () { Headers = new HeaderSet (new[] { "REFERENCES" }) }; command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER.FIELDS (REFERENCES)]")); request = new FetchRequest (MessageSummaryItems.References) { Headers = new HeaderSet (new[] { "REFERENCES" }) }; command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER.FIELDS (REFERENCES)]")); } } [Test] public void TestFormatFetchSummaryItemsAllHeaders () { using (var engine = new ImapEngine (null)) { var request = new FetchRequest (MessageSummaryItems.Headers); var command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER]")); } } [Test] public void TestFormatFetchSummaryItemsHeaderFieldsAndReferences () { using (var engine = new ImapEngine (null)) { var request = new FetchRequest (MessageSummaryItems.References) { Headers = new HeaderSet (new[] { HeaderId.InReplyTo }) }; var command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER.FIELDS (IN-REPLY-TO REFERENCES)]")); } } [Test] public void TestFormatFetchSummaryItemsExcludeHeaderFieldsReferencesAndReferences () { using (var engine = new ImapEngine (null)) { var request = new FetchRequest (MessageSummaryItems.References) { Headers = new HeaderSet (new[] { HeaderId.References }) { Exclude = true } }; var command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER]")); } } [Test] public void TestFormatFetchSummaryItemsExcludeHeaderFieldsInReplyToAndReferences () { using (var engine = new ImapEngine (null)) { var request = new FetchRequest (MessageSummaryItems.References) { Headers = new HeaderSet (new[] { HeaderId.InReplyTo }) { Exclude = true } }; var command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER.FIELDS.NOT (IN-REPLY-TO)]")); } } [Test] public void TestFormatFetchSummaryItemsExcludeHeaderFieldsInReplyToReferencesAndReferences () { using (var engine = new ImapEngine (null)) { var request = new FetchRequest (MessageSummaryItems.References) { Headers = new HeaderSet (new[] { HeaderId.InReplyTo, HeaderId.References }) { Exclude = true } }; var command = ImapFolder.FormatSummaryItems (engine, request, out _); Assert.That (command, Is.EqualTo ("BODY.PEEK[HEADER.FIELDS.NOT (IN-REPLY-TO)]")); } } } } ================================================ FILE: UnitTests/Net/Imap/ImapFolderFlagsTests.cs ================================================ // // ImapFolderFlagsTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Net; using MailKit; using MailKit.Security; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapFolderFlagsTests { [Test] public void TestArgumentExceptions () { var keywords = new HashSet (new string[] { "$Forwarded", "$Junk" }); var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); // AddFlags Assert.Throws (() => inbox.AddFlags (-1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync (-1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.AddFlags (UniqueId.Invalid, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync (UniqueId.Invalid, MessageFlags.Seen, true)); Assert.Throws (() => inbox.AddFlags (-1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync (-1, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.AddFlags (UniqueId.Invalid, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync (UniqueId.Invalid, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.AddFlags ((IList) null, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync ((IList) null, MessageFlags.Seen, true)); Assert.Throws (() => inbox.AddFlags ((IList) null, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync ((IList) null, MessageFlags.Seen, true)); Assert.Throws (() => inbox.AddFlags ((IList) null, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync ((IList) null, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.AddFlags ((IList) null, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync ((IList) null, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.AddFlags ((IList) null, 1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync ((IList) null, 1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.AddFlags ((IList) null, 1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync ((IList) null, 1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.AddFlags ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.AddFlags ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync ((IList) null, 1, MessageFlags.Seen, keywords, true)); // RemoveFlags Assert.Throws (() => inbox.RemoveFlags (-1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync (-1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.RemoveFlags (UniqueId.Invalid, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync (UniqueId.Invalid, MessageFlags.Seen, true)); Assert.Throws (() => inbox.RemoveFlags (-1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync (-1, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.RemoveFlags (UniqueId.Invalid, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync (UniqueId.Invalid, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.RemoveFlags ((IList) null, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync ((IList) null, MessageFlags.Seen, true)); Assert.Throws (() => inbox.RemoveFlags ((IList) null, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync ((IList) null, MessageFlags.Seen, true)); Assert.Throws (() => inbox.RemoveFlags ((IList) null, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync ((IList) null, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.RemoveFlags ((IList) null, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync ((IList) null, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.RemoveFlags ((IList) null, 1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync ((IList) null, 1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.RemoveFlags ((IList) null, 1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync ((IList) null, 1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.RemoveFlags ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.RemoveFlags ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync ((IList) null, 1, MessageFlags.Seen, keywords, true)); // SetFlags Assert.Throws (() => inbox.SetFlags (-1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync (-1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.SetFlags (UniqueId.Invalid, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync (UniqueId.Invalid, MessageFlags.Seen, true)); Assert.Throws (() => inbox.SetFlags (-1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync (-1, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.SetFlags (UniqueId.Invalid, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync (UniqueId.Invalid, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.SetFlags ((IList) null, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync ((IList) null, MessageFlags.Seen, true)); Assert.Throws (() => inbox.SetFlags ((IList) null, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync ((IList) null, MessageFlags.Seen, true)); Assert.Throws (() => inbox.SetFlags ((IList) null, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync ((IList) null, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.SetFlags ((IList) null, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync ((IList) null, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.SetFlags ((IList) null, 1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync ((IList) null, 1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.SetFlags ((IList) null, 1, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync ((IList) null, 1, MessageFlags.Seen, true)); Assert.Throws (() => inbox.SetFlags ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.Throws (() => inbox.SetFlags ((IList) null, 1, MessageFlags.Seen, keywords, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync ((IList) null, 1, MessageFlags.Seen, keywords, true)); // Store Flags var addSeen = new StoreFlagsRequest (StoreAction.Add, MessageFlags.Seen) { Silent = true }; Assert.Throws (() => inbox.Store (UniqueId.Invalid, addSeen)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueId.Invalid, addSeen)); Assert.Throws (() => inbox.Store (UniqueId.MinValue, (StoreFlagsRequest) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueId.MinValue, (StoreFlagsRequest) null)); Assert.Throws (() => inbox.Store (-1, addSeen)); Assert.ThrowsAsync (() => inbox.StoreAsync (-1, addSeen)); Assert.Throws (() => inbox.Store (0, (StoreFlagsRequest) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (0, (StoreFlagsRequest) null)); Assert.Throws (() => inbox.Store ((IList) null, addSeen)); Assert.ThrowsAsync (() => inbox.StoreAsync ((IList) null, addSeen)); Assert.Throws (() => inbox.Store (UniqueIdRange.All, (StoreFlagsRequest) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueIdRange.All, (StoreFlagsRequest) null)); Assert.Throws (() => inbox.Store ((IList) null, addSeen)); Assert.ThrowsAsync (() => inbox.StoreAsync ((IList) null, addSeen)); Assert.Throws (() => inbox.Store (new int[] { 0 }, (StoreFlagsRequest) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (new int[] { 0 }, (StoreFlagsRequest) null)); var labels = new string [] { "Label1", "Label2" }; var emptyLabels = Array.Empty (); // AddLabels Assert.Throws (() => inbox.AddLabels (-1, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (-1, labels, true)); Assert.Throws (() => inbox.AddLabels (0, null, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (0, null, true)); Assert.Throws (() => inbox.AddLabels (UniqueId.MinValue, null, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (UniqueId.MinValue, null, true)); Assert.Throws (() => inbox.AddLabels ((IList) null, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync ((IList) null, labels, true)); Assert.Throws (() => inbox.AddLabels ((IList) null, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync ((IList) null, labels, true)); Assert.Throws (() => inbox.AddLabels (new int [] { 0 }, null, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (new int [] { 0 }, null, true)); Assert.Throws (() => inbox.AddLabels (UniqueIdRange.All, null, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (UniqueIdRange.All, null, true)); Assert.Throws (() => inbox.AddLabels ((IList) null, 1, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync ((IList) null, 1, labels, true)); Assert.Throws (() => inbox.AddLabels ((IList) null, 1, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync ((IList) null, 1, labels, true)); Assert.Throws (() => inbox.AddLabels (new int [] { 0 }, 1, null, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (new int [] { 0 }, 1, null, true)); Assert.Throws (() => inbox.AddLabels (UniqueIdRange.All, 1, null, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (UniqueIdRange.All, 1, null, true)); // RemoveLabels Assert.Throws (() => inbox.RemoveLabels (-1, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (-1, labels, true)); Assert.Throws (() => inbox.RemoveLabels (0, null, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (0, null, true)); Assert.Throws (() => inbox.RemoveLabels (UniqueId.MinValue, null, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (UniqueId.MinValue, null, true)); Assert.Throws (() => inbox.RemoveLabels ((IList) null, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync ((IList) null, labels, true)); Assert.Throws (() => inbox.RemoveLabels ((IList) null, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync ((IList) null, labels, true)); Assert.Throws (() => inbox.RemoveLabels (new int [] { 0 }, null, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (new int [] { 0 }, null, true)); Assert.Throws (() => inbox.RemoveLabels (UniqueIdRange.All, null, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (UniqueIdRange.All, null, true)); Assert.Throws (() => inbox.RemoveLabels ((IList) null, 1, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync ((IList) null, 1, labels, true)); Assert.Throws (() => inbox.RemoveLabels ((IList) null, 1, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync ((IList) null, 1, labels, true)); Assert.Throws (() => inbox.RemoveLabels (new int [] { 0 }, 1, null, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (new int [] { 0 }, 1, null, true)); Assert.Throws (() => inbox.RemoveLabels (UniqueIdRange.All, 1, null, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (UniqueIdRange.All, 1, null, true)); // SetLabels Assert.Throws (() => inbox.SetLabels (-1, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (-1, labels, true)); Assert.Throws (() => inbox.SetLabels (0, null, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (0, null, true)); Assert.Throws (() => inbox.SetLabels (UniqueId.MinValue, null, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (UniqueId.MinValue, null, true)); Assert.Throws (() => inbox.SetLabels ((IList) null, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync ((IList) null, labels, true)); Assert.Throws (() => inbox.SetLabels ((IList) null, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync ((IList) null, labels, true)); Assert.Throws (() => inbox.SetLabels (new int [] { 0 }, null, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (new int [] { 0 }, null, true)); Assert.Throws (() => inbox.SetLabels (UniqueIdRange.All, null, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (UniqueIdRange.All, null, true)); Assert.Throws (() => inbox.SetLabels ((IList) null, 1, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync ((IList) null, 1, labels, true)); Assert.Throws (() => inbox.SetLabels ((IList) null, 1, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync ((IList) null, 1, labels, true)); Assert.Throws (() => inbox.SetLabels (new int [] { 0 }, 1, null, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (new int [] { 0 }, 1, null, true)); Assert.Throws (() => inbox.SetLabels (UniqueIdRange.All, 1, null, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (UniqueIdRange.All, 1, null, true)); // Store Labels var addLabel = new StoreLabelsRequest (StoreAction.Add, new string[] { "Label1" }) { Silent = true }; Assert.Throws (() => inbox.Store (UniqueId.Invalid, addLabel)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueId.Invalid, addLabel)); Assert.Throws (() => inbox.Store (UniqueId.MinValue, (StoreLabelsRequest) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueId.MinValue, (StoreLabelsRequest) null)); Assert.Throws (() => inbox.Store (-1, addLabel)); Assert.ThrowsAsync (() => inbox.StoreAsync (-1, addLabel)); Assert.Throws (() => inbox.Store (0, (StoreLabelsRequest) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (0, (StoreLabelsRequest) null)); Assert.Throws (() => inbox.Store ((IList) null, addLabel)); Assert.ThrowsAsync (() => inbox.StoreAsync ((IList) null, addLabel)); Assert.Throws (() => inbox.Store (UniqueIdRange.All, (StoreLabelsRequest) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (UniqueIdRange.All, (StoreLabelsRequest) null)); Assert.Throws (() => inbox.Store ((IList) null, addLabel)); Assert.ThrowsAsync (() => inbox.StoreAsync ((IList) null, addLabel)); Assert.Throws (() => inbox.Store (new int[] { 0 }, (StoreLabelsRequest) null)); Assert.ThrowsAsync (() => inbox.StoreAsync (new int[] { 0 }, (StoreLabelsRequest) null)); client.Disconnect (false); } } [Test] public void TestNotSupportedExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX\r\n", "common.select-inbox-no-modseq.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); // disable all features client.Capabilities = ImapCapabilities.None; var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var indexes = new int[] { 0 }; ulong modseq = 409601020304; // AddFlags Assert.Throws (() => inbox.AddFlags (indexes, modseq, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync (indexes, modseq, MessageFlags.Seen, true)); Assert.Throws (() => inbox.AddFlags (UniqueIdRange.All, modseq, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.AddFlagsAsync (UniqueIdRange.All, modseq, MessageFlags.Seen, true)); // RemoveFlags Assert.Throws (() => inbox.RemoveFlags (indexes, modseq, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync (indexes, modseq, MessageFlags.Seen, true)); Assert.Throws (() => inbox.RemoveFlags (UniqueIdRange.All, modseq, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.RemoveFlagsAsync (UniqueIdRange.All, modseq, MessageFlags.Seen, true)); // SetFlags Assert.Throws (() => inbox.SetFlags (indexes, modseq, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync (indexes, modseq, MessageFlags.Seen, true)); Assert.Throws (() => inbox.SetFlags (UniqueIdRange.All, modseq, MessageFlags.Seen, true)); Assert.ThrowsAsync (() => inbox.SetFlagsAsync (UniqueIdRange.All, modseq, MessageFlags.Seen, true)); var labels = new string[] { "Label1", "Label2" }; // AddLabels Assert.Throws (() => inbox.AddLabels (indexes, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (indexes, labels, true)); Assert.Throws (() => inbox.AddLabels (UniqueIdRange.All, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (UniqueIdRange.All, labels, true)); Assert.Throws (() => inbox.AddLabels (indexes, modseq, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (indexes, modseq, labels, true)); Assert.Throws (() => inbox.AddLabels (UniqueIdRange.All, modseq, labels, true)); Assert.ThrowsAsync (() => inbox.AddLabelsAsync (UniqueIdRange.All, modseq, labels, true)); // RemoveLabels Assert.Throws (() => inbox.RemoveLabels (indexes, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (indexes, labels, true)); Assert.Throws (() => inbox.RemoveLabels (UniqueIdRange.All, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (UniqueIdRange.All, labels, true)); Assert.Throws (() => inbox.RemoveLabels (indexes, modseq, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (indexes, modseq, labels, true)); Assert.Throws (() => inbox.RemoveLabels (UniqueIdRange.All, modseq, labels, true)); Assert.ThrowsAsync (() => inbox.RemoveLabelsAsync (UniqueIdRange.All, modseq, labels, true)); // SetLabels Assert.Throws (() => inbox.SetLabels (indexes, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (indexes, labels, true)); Assert.Throws (() => inbox.SetLabels (UniqueIdRange.All, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (UniqueIdRange.All, labels, true)); Assert.Throws (() => inbox.SetLabels (indexes, modseq, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (indexes, modseq, labels, true)); Assert.Throws (() => inbox.SetLabels (UniqueIdRange.All, modseq, labels, true)); Assert.ThrowsAsync (() => inbox.SetLabelsAsync (UniqueIdRange.All, modseq, labels, true)); client.Disconnect (false); } } static IList CreateChangingFlagsOnEmptyListOfMessagesCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt") }; } [Test] public void TestChangingFlagsOnEmptyListOfMessages () { var commands = CreateChangingFlagsOnEmptyListOfMessagesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); ulong modseq = 409601020304; var uids = Array.Empty (); var indexes = Array.Empty (); IList unmodifiedUids; IList unmodifiedIndexes; // AddFlags unmodifiedIndexes = inbox.AddFlags (indexes, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = inbox.AddFlags (uids, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedUids, Is.Empty); // RemoveFlags unmodifiedIndexes = inbox.RemoveFlags (indexes, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = inbox.RemoveFlags (uids, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedUids, Is.Empty); // SetFlags unmodifiedIndexes = inbox.SetFlags (indexes, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = inbox.SetFlags (uids, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedUids, Is.Empty); var labels = new string[] { "Label1", "Label2" }; // AddLabels unmodifiedIndexes = inbox.AddLabels (indexes, modseq, labels, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = inbox.AddLabels (uids, modseq, labels, true); Assert.That (unmodifiedUids, Is.Empty); // RemoveLabels unmodifiedIndexes = inbox.RemoveLabels (indexes, modseq, labels, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = inbox.RemoveLabels (uids, modseq, labels, true); Assert.That (unmodifiedUids, Is.Empty); // SetLabels unmodifiedIndexes = inbox.SetLabels (indexes, modseq, labels, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = inbox.SetLabels (uids, modseq, labels, true); Assert.That (unmodifiedUids, Is.Empty); client.Disconnect (false); } } [Test] public async Task TestChangingFlagsOnEmptyListOfMessagesAsync () { var commands = CreateChangingFlagsOnEmptyListOfMessagesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); ulong modseq = 409601020304; var uids = Array.Empty (); var indexes = Array.Empty (); IList unmodifiedUids; IList unmodifiedIndexes; // AddFlags unmodifiedIndexes = await inbox.AddFlagsAsync (indexes, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = await inbox.AddFlagsAsync (uids, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedUids, Is.Empty); // RemoveFlags unmodifiedIndexes = await inbox.RemoveFlagsAsync (indexes, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = await inbox.RemoveFlagsAsync (uids, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedUids, Is.Empty); // SetFlags unmodifiedIndexes = await inbox.SetFlagsAsync (indexes, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = await inbox.SetFlagsAsync (uids, modseq, MessageFlags.Seen, true); Assert.That (unmodifiedUids, Is.Empty); var labels = new string[] { "Label1", "Label2" }; // AddLabels unmodifiedIndexes = await inbox.AddLabelsAsync (indexes, modseq, labels, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = await inbox.AddLabelsAsync (uids, modseq, labels, true); Assert.That (unmodifiedUids, Is.Empty); // RemoveLabels unmodifiedIndexes = await inbox.RemoveLabelsAsync (indexes, modseq, labels, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = await inbox.RemoveLabelsAsync (uids, modseq, labels, true); Assert.That (unmodifiedUids, Is.Empty); // SetLabels unmodifiedIndexes = await inbox.SetLabelsAsync (indexes, modseq, labels, true); Assert.That (unmodifiedIndexes, Is.Empty); unmodifiedUids = await inbox.SetLabelsAsync (uids, modseq, labels, true); Assert.That (unmodifiedUids, Is.Empty); await client.DisconnectAsync (false); } } } } ================================================ FILE: UnitTests/Net/Imap/ImapFolderSearchTests.cs ================================================ // // ImapFolderSearchTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Net; using System.Text; using MailKit; using MailKit.Search; using MailKit.Security; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapFolderSearchTests { [Test] public void TestArgumentExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); // Search var searchOptions = SearchOptions.All | SearchOptions.Min | SearchOptions.Max | SearchOptions.Count; var orderBy = new OrderBy [] { OrderBy.Arrival }; var emptyOrderBy = Array.Empty (); Assert.Throws (() => inbox.Search ((SearchQuery) null)); Assert.ThrowsAsync (async () => await inbox.SearchAsync ((SearchQuery) null)); Assert.Throws (() => inbox.Search ((IList) null, SearchQuery.All)); Assert.ThrowsAsync (async () => await inbox.SearchAsync ((IList) null, SearchQuery.All)); Assert.Throws (() => inbox.Search (UniqueIdRange.All, (SearchQuery) null)); Assert.ThrowsAsync (async () => await inbox.SearchAsync (UniqueIdRange.All, (SearchQuery) null)); Assert.Throws (() => inbox.Search (searchOptions, null)); Assert.ThrowsAsync (async () => await inbox.SearchAsync (searchOptions, null)); Assert.Throws (() => inbox.Search (searchOptions, (IList) null, SearchQuery.All)); Assert.ThrowsAsync (async () => await inbox.SearchAsync (searchOptions, (IList) null, SearchQuery.All)); Assert.Throws (() => inbox.Search (searchOptions, UniqueIdRange.All, (SearchQuery) null)); Assert.ThrowsAsync (async () => await inbox.SearchAsync (searchOptions, UniqueIdRange.All, (SearchQuery) null)); Assert.Throws (() => inbox.Search ((string) null)); Assert.ThrowsAsync (async () => await inbox.SearchAsync ((string) null)); Assert.Throws (() => inbox.Search (string.Empty)); Assert.ThrowsAsync (async () => await inbox.SearchAsync (string.Empty)); // Sort Assert.Throws (() => inbox.Sort ((SearchQuery) null, orderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync ((SearchQuery) null, orderBy)); Assert.Throws (() => inbox.Sort (SearchQuery.All, null)); Assert.ThrowsAsync (async () => await inbox.SortAsync (SearchQuery.All, null)); Assert.Throws (() => inbox.Sort (SearchQuery.All, emptyOrderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync (SearchQuery.All, emptyOrderBy)); Assert.Throws (() => inbox.Sort ((IList) null, SearchQuery.All, orderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync ((IList) null, SearchQuery.All, orderBy)); Assert.Throws (() => inbox.Sort (UniqueIdRange.All, (SearchQuery) null, orderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync (UniqueIdRange.All, (SearchQuery) null, orderBy)); Assert.Throws (() => inbox.Sort (UniqueIdRange.All, SearchQuery.All, null)); Assert.ThrowsAsync (async () => await inbox.SortAsync (UniqueIdRange.All, SearchQuery.All, null)); Assert.Throws (() => inbox.Sort (UniqueIdRange.All, SearchQuery.All, emptyOrderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync (UniqueIdRange.All, SearchQuery.All, emptyOrderBy)); Assert.Throws (() => inbox.Sort (searchOptions, (SearchQuery) null, orderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync (searchOptions, (SearchQuery) null, orderBy)); Assert.Throws (() => inbox.Sort (searchOptions, SearchQuery.All, null)); Assert.ThrowsAsync (async () => await inbox.SortAsync (searchOptions, SearchQuery.All, null)); Assert.Throws (() => inbox.Sort (searchOptions, SearchQuery.All, emptyOrderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync (searchOptions, SearchQuery.All, emptyOrderBy)); Assert.Throws (() => inbox.Sort (searchOptions, (IList) null, SearchQuery.All, orderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync (searchOptions, (IList) null, SearchQuery.All, orderBy)); Assert.Throws (() => inbox.Sort (searchOptions, UniqueIdRange.All, (SearchQuery) null, orderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync (searchOptions, UniqueIdRange.All, (SearchQuery) null, orderBy)); Assert.Throws (() => inbox.Sort (searchOptions, UniqueIdRange.All, SearchQuery.All, null)); Assert.ThrowsAsync (async () => await inbox.SortAsync (searchOptions, UniqueIdRange.All, SearchQuery.All, null)); Assert.Throws (() => inbox.Sort (searchOptions, UniqueIdRange.All, SearchQuery.All, emptyOrderBy)); Assert.ThrowsAsync (async () => await inbox.SortAsync (searchOptions, UniqueIdRange.All, SearchQuery.All, emptyOrderBy)); Assert.Throws (() => inbox.Sort ((string) null)); Assert.ThrowsAsync (async () => await inbox.SortAsync ((string) null)); Assert.Throws (() => inbox.Sort (string.Empty)); Assert.ThrowsAsync (async () => await inbox.SortAsync (string.Empty)); // Thread Assert.Throws (() => inbox.Thread ((ThreadingAlgorithm) 500, SearchQuery.All)); Assert.ThrowsAsync (async () => await inbox.ThreadAsync ((ThreadingAlgorithm) 500, SearchQuery.All)); Assert.Throws (() => inbox.Thread (ThreadingAlgorithm.References, null)); Assert.ThrowsAsync (async () => await inbox.ThreadAsync (ThreadingAlgorithm.References, null)); Assert.Throws (() => inbox.Thread ((IList) null, ThreadingAlgorithm.References, SearchQuery.All)); Assert.ThrowsAsync (async () => await inbox.ThreadAsync ((IList) null, ThreadingAlgorithm.References, SearchQuery.All)); Assert.Throws (() => inbox.Thread (UniqueIdRange.All, (ThreadingAlgorithm) 500, SearchQuery.All)); Assert.ThrowsAsync (async () => await inbox.ThreadAsync (UniqueIdRange.All, (ThreadingAlgorithm) 500, SearchQuery.All)); Assert.Throws (() => inbox.Thread (UniqueIdRange.All, ThreadingAlgorithm.References, null)); Assert.ThrowsAsync (async () => await inbox.ThreadAsync (UniqueIdRange.All, ThreadingAlgorithm.References, null)); client.Disconnect (false); } } static IList CreateSearchKeywordsCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+filters.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand ("A00000005 UID SEARCH RETURN (ALL) KEYWORD \\flag\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000006 UID SEARCH RETURN (ALL) UNKEYWORD \\flag\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000007 UID SEARCH RETURN (ALL) KEYWORD \"two words\"\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000008 UID SEARCH RETURN (ALL) UNKEYWORD \"two words\"\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000009 UID SEARCH RETURN (ALL) KEYWORD $IsSpam\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000010 UID SEARCH RETURN (ALL) UNKEYWORD $IsSpam\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000011 UID SEARCH RETURN (ALL) KEYWORD \\flag KEYWORD \"two words\" KEYWORD $IsSpam\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000012 UID SEARCH RETURN (ALL) UNKEYWORD \\flag UNKEYWORD \"two words\" UNKEYWORD $IsSpam\r\n", "dovecot.search-all.txt") }; } [Test] public void TestSearchKeywords () { var commands = CreateSearchKeywordsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Filters), Is.True, "ImapCapabilities.Filters"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var uids = inbox.Search (SearchQuery.HasKeyword ("\\flag")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.NotKeyword ("\\flag")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.HasKeyword ("two words")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.NotKeyword ("two words")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.HasKeyword ("$IsSpam")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.NotKeyword ("$IsSpam")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.HasKeywords ("\\flag", "two words", "$IsSpam")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.NotKeywords ("\\flag", "two words", "$IsSpam")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); client.Disconnect (false); } } [Test] public async Task TestSearchKeywordsAsync () { var commands = CreateSearchKeywordsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Filters), Is.True, "ImapCapabilities.Filters"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var uids = await inbox.SearchAsync (SearchQuery.HasKeyword ("\\flag")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.NotKeyword ("\\flag")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.HasKeyword ("two words")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.NotKeyword ("two words")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.HasKeyword ("$IsSpam")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.NotKeyword ("$IsSpam")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.HasKeywords ("\\flag", "two words", "$IsSpam")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.NotKeywords ("\\flag", "two words", "$IsSpam")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); await client.DisconnectAsync (false); } } static IList CreateSearchFilterCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+filters.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand ("A00000005 UID SEARCH RETURN (ALL) FILTER MyFilter\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000006 UID SEARCH RETURN (ALL) FILTER MyUndefinedFilter\r\n", Encoding.ASCII.GetBytes ("A00000006 NO [UNDEFINED-FILTER MyUndefinedFilter] THe specified filter is undefined.\r\n")), }; } [Test] public void TestSearchFilter () { var commands = CreateSearchFilterCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Filters), Is.True, "ImapCapabilities.Filters"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var uids = inbox.Search (SearchQuery.Filter ("MyFilter")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); Assert.Throws (() => inbox.Search (SearchQuery.Filter ("MyUndefinedFilter"))); // Now disable the FILTERS extension and try again... client.Capabilities &= ~ImapCapabilities.Filters; Assert.Throws (() => inbox.Search (SearchQuery.Filter ("MyFilter"))); client.Disconnect (false); } } [Test] public async Task TestSearchFilterAsync () { var commands = CreateSearchFilterCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Filters), Is.True, "ImapCapabilities.Filters"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var uids = await inbox.SearchAsync (SearchQuery.Filter ("MyFilter")); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); Assert.ThrowsAsync (() => inbox.SearchAsync (SearchQuery.Filter ("MyUndefinedFilter"))); // Now disable the SAVEDATE extension and try again... client.Capabilities &= ~ImapCapabilities.Filters; Assert.ThrowsAsync (() => inbox.SearchAsync (SearchQuery.Filter ("MyFilter"))); await client.DisconnectAsync (false); } } static IList CreateSearchFuzzyCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+fuzzy.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand ("A00000005 UID SEARCH RETURN (ALL) FUZZY BODY fuzzy-match\r\n", "dovecot.search-all.txt"), }; } [Test] public void TestSearchFuzzy () { var commands = CreateSearchFuzzyCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.FuzzySearch), Is.True, "ImapCapabilities.FuzzySearch"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var uids = inbox.Search (SearchQuery.Fuzzy (SearchQuery.BodyContains ("fuzzy-match"))); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); // Now disable the FUZZY extension and try again... client.Capabilities &= ~ImapCapabilities.FuzzySearch; Assert.Throws (() => inbox.Search (SearchQuery.Fuzzy (SearchQuery.BodyContains ("fuzzy-match")))); client.Disconnect (false); } } [Test] public async Task TestSearchFuzzyAsync () { var commands = CreateSearchFuzzyCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.FuzzySearch), Is.True, "ImapCapabilities.FuzzySearch"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var uids = await inbox.SearchAsync (SearchQuery.Fuzzy (SearchQuery.BodyContains ("fuzzy-match"))); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); // Now disable the FUZZY extension and try again... client.Capabilities &= ~ImapCapabilities.FuzzySearch; Assert.ThrowsAsync (() => inbox.SearchAsync (SearchQuery.Fuzzy (SearchQuery.BodyContains ("fuzzy-match")))); await client.DisconnectAsync (false); } } static IList CreateSearchSaveDateCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+savedate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand ("A00000005 UID SEARCH RETURN (ALL) SAVEDATESUPPORTED\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000006 UID SEARCH RETURN (ALL) SAVEDBEFORE 12-Oct-2016\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000007 UID SEARCH RETURN (ALL) SAVEDON 12-Oct-2016\r\n", "dovecot.search-all.txt"), new ImapReplayCommand ("A00000008 UID SEARCH RETURN (ALL) SAVEDSINCE 12-Oct-2016\r\n", "dovecot.search-all.txt"), }; } [Test] public void TestSearchSaveDate () { var commands = CreateSearchSaveDateCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.SaveDate), Is.True, "ImapCapabilities.SaveDate"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var uids = inbox.Search (SearchQuery.SaveDateSupported); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.SavedBefore (new DateTime (2016, 10, 12))); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.SavedOn (new DateTime (2016, 10, 12))); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = inbox.Search (SearchQuery.SavedSince (new DateTime (2016, 10, 12))); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); // Now disable the SAVEDATE extension and try again... client.Capabilities &= ~ImapCapabilities.SaveDate; Assert.Throws (() => inbox.Search (SearchQuery.SaveDateSupported)); Assert.Throws (() => inbox.Search (SearchQuery.SavedBefore (new DateTime (2016, 10, 12)))); Assert.Throws (() => inbox.Search (SearchQuery.SavedOn (new DateTime (2016, 10, 12)))); Assert.Throws (() => inbox.Search (SearchQuery.SavedSince (new DateTime (2016, 10, 12)))); client.Disconnect (false); } } [Test] public async Task TestSearchSaveDateAsync () { var commands = CreateSearchSaveDateCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.SaveDate), Is.True, "ImapCapabilities.SaveDate"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var uids = await inbox.SearchAsync (SearchQuery.SaveDateSupported); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.SavedBefore (new DateTime (2016, 10, 12))); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.SavedOn (new DateTime (2016, 10, 12))); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); uids = await inbox.SearchAsync (SearchQuery.SavedSince (new DateTime (2016, 10, 12))); Assert.That (uids, Has.Count.EqualTo (14), "Unexpected number of UIDs"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), $"Unexpected value for uids[{i}]"); // Now disable the SAVEDATE extension and try again... client.Capabilities &= ~ImapCapabilities.SaveDate; Assert.ThrowsAsync (() => inbox.SearchAsync (SearchQuery.SaveDateSupported)); Assert.ThrowsAsync (() => inbox.SearchAsync (SearchQuery.SavedBefore (new DateTime (2016, 10, 12)))); Assert.ThrowsAsync (() => inbox.SearchAsync (SearchQuery.SavedOn (new DateTime (2016, 10, 12)))); Assert.ThrowsAsync (() => inbox.SearchAsync (SearchQuery.SavedSince (new DateTime (2016, 10, 12)))); await client.DisconnectAsync (false); } } static List CreateRawUnicodeSearchCommands () { return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand (Encoding.UTF8, "A00000005 UID SEARCH SUBJECT {13+}\r\nComunicação\r\n", "dovecot.search-raw.txt") }; } [Test] public void TestRawUnicodeSearch () { var commands = CreateRawUnicodeSearchCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var matches = inbox.Search ("SUBJECT {13+}\r\nComunicação"); Assert.That (matches.Max.HasValue, Is.True, "MAX should always be set"); Assert.That (matches.Max.Value.Id, Is.EqualTo (14), "Unexpected MAX value"); Assert.That (matches.Min.HasValue, Is.True, "MIN should always be set"); Assert.That (matches.Min.Value.Id, Is.EqualTo (1), "Unexpected MIN value"); Assert.That (matches.Count, Is.EqualTo (14), "COUNT should always be set"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (14)); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (i + 1)); client.Disconnect (false); } } [Test] public async Task TestRawUnicodeSearchAsync () { var commands = CreateRawUnicodeSearchCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var matches = await inbox.SearchAsync ("SUBJECT {13+}\r\nComunicação"); Assert.That (matches.Max.HasValue, Is.True, "MAX should always be set"); Assert.That (matches.Max.Value.Id, Is.EqualTo (14), "Unexpected MAX value"); Assert.That (matches.Min.HasValue, Is.True, "MIN should always be set"); Assert.That (matches.Min.Value.Id, Is.EqualTo (1), "Unexpected MIN value"); Assert.That (matches.Count, Is.EqualTo (14), "COUNT should always be set"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (14)); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (i + 1)); await client.DisconnectAsync (false); } } static List CreateSearchStringWithSpacesCommands () { return new List { new ImapReplayCommand ("", "yahoo.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000001 CAPABILITY\r\n", "yahoo.capabilities.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "yahoo.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\"\r\n", "yahoo.list-inbox.txt"), new ImapReplayCommand ("A00000004 EXAMINE Inbox\r\n", "yahoo.examine-inbox.txt"), new ImapReplayCommand (Encoding.UTF8, "A00000005 UID SEARCH SUBJECT \"Yahoo Mail\"\r\n", "yahoo.search.txt") }; } [Test] public void TestSearchStringWithSpaces () { var commands = CreateSearchStringWithSpacesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadOnly); var uids = inbox.Search (SearchQuery.SubjectContains ("Yahoo Mail")); Assert.That (uids, Has.Count.EqualTo (14)); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1)); client.Disconnect (false); } } [Test] public async Task TestSearchStringWithSpacesAsync () { var commands = CreateSearchStringWithSpacesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadOnly); var uids = await inbox.SearchAsync (SearchQuery.SubjectContains ("Yahoo Mail")); Assert.That (uids, Has.Count.EqualTo (14)); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1)); await client.DisconnectAsync (false); } } static List CreateSearchBadCharsetFallbackCommands () { var badCharsetResponse = Encoding.ASCII.GetBytes ("A00000005 NO [BADCHARSET (US-ASCII)] The specified charset is not supported.\r\n"); return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand (Encoding.UTF8, "A00000005 UID SEARCH RETURN (ALL) CHARSET UTF-8 SUBJECT {12+}\r\nпривет\r\n", badCharsetResponse), new ImapReplayCommand ("A00000006 UID SEARCH RETURN (ALL) SUBJECT {6+}\r\n?@825B\r\n", "dovecot.search-raw.txt") }; } [Test] public void TestSearchBadCharsetFallback () { var commands = CreateSearchBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var uids = inbox.Search (SearchQuery.SubjectContains ("привет")); Assert.That (uids, Has.Count.EqualTo (14)); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1)); client.Disconnect (false); } } [Test] public async Task TestSearchBadCharsetFallbackAsync () { var commands = CreateSearchBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var uids = await inbox.SearchAsync (SearchQuery.SubjectContains ("привет")); Assert.That (uids, Has.Count.EqualTo (14)); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1)); await client.DisconnectAsync (false); } } static List CreateSearchWithOptionsBadCharsetFallbackCommands () { var badCharsetResponse = Encoding.ASCII.GetBytes ("A00000005 NO [BADCHARSET (US-ASCII)] The specified charset is not supported.\r\n"); return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand (Encoding.UTF8, "A00000005 UID SEARCH RETURN (ALL RELEVANCY COUNT MIN MAX) CHARSET UTF-8 SUBJECT {12+}\r\nпривет\r\n", badCharsetResponse), new ImapReplayCommand ("A00000006 UID SEARCH RETURN (ALL RELEVANCY COUNT MIN MAX) SUBJECT {6+}\r\n?@825B\r\n", "dovecot.search-uids-options.txt") }; } [Test] public void TestSearchWithOptionsBadCharsetFallback () { var commands = CreateSearchWithOptionsBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var searchOptions = SearchOptions.All | SearchOptions.Count | SearchOptions.Min | SearchOptions.Max | SearchOptions.Relevancy; var matches = inbox.Search (searchOptions, SearchQuery.SubjectContains ("привет")); var expectedMatchedUids = new uint[] { 2, 3, 4, 5, 6, 9, 10, 11, 12, 13 }; Assert.That (matches.Count, Is.EqualTo (10), "Unexpected COUNT"); Assert.That (matches.Max.Value.Id, Is.EqualTo (13), "Unexpected MAX"); Assert.That (matches.Min.Value.Id, Is.EqualTo (2), "Unexpected MIN"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (10), "Unexpected number of UIDs"); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (expectedMatchedUids[i])); Assert.That (matches.Relevancy, Has.Count.EqualTo (matches.Count), "Unexpected number of relevancy scores"); client.Disconnect (false); } } [Test] public async Task TestSearchWithOptionsBadCharsetFallbackAsync () { var commands = CreateSearchWithOptionsBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var searchOptions = SearchOptions.All | SearchOptions.Count | SearchOptions.Min | SearchOptions.Max | SearchOptions.Relevancy; var matches = await inbox.SearchAsync (searchOptions, SearchQuery.SubjectContains ("привет")); var expectedMatchedUids = new uint[] { 2, 3, 4, 5, 6, 9, 10, 11, 12, 13 }; Assert.That (matches.Count, Is.EqualTo (10), "Unexpected COUNT"); Assert.That (matches.Max.Value.Id, Is.EqualTo (13), "Unexpected MAX"); Assert.That (matches.Min.Value.Id, Is.EqualTo (2), "Unexpected MIN"); Assert.That (matches.UniqueIds, Has.Count.EqualTo (10), "Unexpected number of UIDs"); for (int i = 0; i < matches.UniqueIds.Count; i++) Assert.That (matches.UniqueIds[i].Id, Is.EqualTo (expectedMatchedUids[i])); Assert.That (matches.Relevancy, Has.Count.EqualTo (matches.Count), "Unexpected number of relevancy scores"); await client.DisconnectAsync (false); } } static List CreateSortBadCharsetFallbackCommands () { var badCharsetResponse = Encoding.ASCII.GetBytes ("A00000005 NO [BADCHARSET (US-ASCII)] The specified charset is not supported.\r\n"); return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand (Encoding.UTF8, "A00000005 UID SORT RETURN (ALL) (SUBJECT) UTF-8 SUBJECT {12+}\r\nпривет\r\n", badCharsetResponse), new ImapReplayCommand ("A00000006 UID SORT RETURN (ALL) (SUBJECT) US-ASCII SUBJECT {6+}\r\n?@825B\r\n", "dovecot.sort-raw.txt") }; } [Test] public void TestSortBadCharsetFallback () { var commands = CreateSortBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var uids = inbox.Sort (SearchQuery.SubjectContains ("привет"), new OrderBy[] { OrderBy.Subject }); var expected = new uint[] { 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8 }; for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (expected[i]), $"Unexpected value for UniqueId[{i}]"); client.Disconnect (false); } } [Test] public async Task TestSortBadCharsetFallbackAsync () { var commands = CreateSortBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var uids = await inbox.SortAsync (SearchQuery.SubjectContains ("привет"), new OrderBy[] { OrderBy.Subject }); var expected = new uint[] { 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8 }; for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (expected[i]), $"Unexpected value for UniqueId[{i}]"); await client.DisconnectAsync (false); } } static List CreateSortWithOptionsBadCharsetFallbackCommands () { var badCharsetResponse = Encoding.ASCII.GetBytes ("A00000005 NO [BADCHARSET (US-ASCII)] The specified charset is not supported.\r\n"); return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand (Encoding.UTF8, "A00000005 UID SORT RETURN (ALL RELEVANCY COUNT MIN MAX) (ARRIVAL) UTF-8 SUBJECT {12+}\r\nпривет\r\n", badCharsetResponse), new ImapReplayCommand ("A00000006 UID SORT RETURN (ALL RELEVANCY COUNT MIN MAX) (ARRIVAL) US-ASCII SUBJECT {6+}\r\n?@825B\r\n", "dovecot.sort-uids-options.txt") }; } [Test] public void TestSortWithOptionsBadCharsetFallback () { var commands = CreateSortWithOptionsBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); var searchOptions = SearchOptions.All | SearchOptions.Count | SearchOptions.Min | SearchOptions.Max | SearchOptions.Relevancy; var sorted = inbox.Sort (searchOptions, SearchQuery.SubjectContains ("привет"), new OrderBy[] { OrderBy.Arrival }); Assert.That (sorted.UniqueIds, Has.Count.EqualTo (14), "Unexpected number of UIDs"); Assert.That (sorted.Relevancy, Has.Count.EqualTo (sorted.Count), "Unexpected number of relevancy scores"); for (int i = 0; i < sorted.UniqueIds.Count; i++) Assert.That (sorted.UniqueIds[i].Id, Is.EqualTo (i + 1), $"Unexpected value for UniqueId[{i}]"); Assert.That (sorted.ModSeq.HasValue, Is.False, "Expected the ModSeq property to be null"); Assert.That (sorted.Min.Value.Id, Is.EqualTo (1), "Unexpected Min"); Assert.That (sorted.Max.Value.Id, Is.EqualTo (14), "Unexpected Max"); Assert.That (sorted.Count, Is.EqualTo (14), "Unexpected Count"); client.Disconnect (false); } } [Test] public async Task TestSortWithOptionsBadCharsetFallbackAsync () { var commands = CreateSortWithOptionsBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var searchOptions = SearchOptions.All | SearchOptions.Count | SearchOptions.Min | SearchOptions.Max | SearchOptions.Relevancy; var sorted = await inbox.SortAsync (searchOptions, SearchQuery.SubjectContains ("привет"), new OrderBy[] { OrderBy.Arrival }); Assert.That (sorted.UniqueIds, Has.Count.EqualTo (14), "Unexpected number of UIDs"); Assert.That (sorted.Relevancy, Has.Count.EqualTo (sorted.Count), "Unexpected number of relevancy scores"); for (int i = 0; i < sorted.UniqueIds.Count; i++) Assert.That (sorted.UniqueIds[i].Id, Is.EqualTo (i + 1), $"Unexpected value for UniqueId[{i}]"); Assert.That (sorted.ModSeq.HasValue, Is.False, "Expected the ModSeq property to be null"); Assert.That (sorted.Min.Value.Id, Is.EqualTo (1), "Unexpected Min"); Assert.That (sorted.Max.Value.Id, Is.EqualTo (14), "Unexpected Max"); Assert.That (sorted.Count, Is.EqualTo (14), "Unexpected Count"); await client.DisconnectAsync (false); } } static List CreateThreadBadCharsetFallbackCommands () { var badCharsetResponse = Encoding.ASCII.GetBytes ("A00000005 NO [BADCHARSET (US-ASCII)] The specified charset is not supported.\r\n"); return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), //new ImapReplayCommand ("A00000005 UID THREAD REFERENCES US-ASCII \r\n", "dovecot.thread-references.txt"), //(new ImapReplayCommand ("A00000017 UID THREAD ORDEREDSUBJECT US-ASCII UID 1:* ALL\r\n", "dovecot.thread-orderedsubject.txt"), new ImapReplayCommand (Encoding.UTF8, "A00000005 UID THREAD REFERENCES UTF-8 SUBJECT {12+}\r\nпривет\r\n", badCharsetResponse), new ImapReplayCommand ("A00000006 UID THREAD REFERENCES US-ASCII SUBJECT {6+}\r\n?@825B\r\n", "dovecot.thread-references.txt") }; } [Test] public void TestThreadBadCharsetFallback () { var commands = CreateThreadBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.Supports (FolderFeature.Threading), Is.True, "Supports threading"); Assert.That (inbox.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Supports threading by References"); var threaded = inbox.Thread (ThreadingAlgorithm.References, SearchQuery.SubjectContains ("привет")); Assert.That (threaded, Has.Count.EqualTo (2), "Unexpected number of root nodes in threaded results"); client.Disconnect (false); } } [Test] public async Task TestThreadBadCharsetFallbackAsync () { var commands = CreateThreadBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); Assert.That (inbox.Supports (FolderFeature.Threading), Is.True, "Supports threading"); Assert.That (inbox.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Supports threading by References"); var threaded = await inbox.ThreadAsync (ThreadingAlgorithm.References, SearchQuery.SubjectContains ("привет")); Assert.That (threaded, Has.Count.EqualTo (2), "Unexpected number of root nodes in threaded results"); await client.DisconnectAsync (false); } } static List CreateThreadUidsBadCharsetFallbackCommands () { var badCharsetResponse = Encoding.ASCII.GetBytes ("A00000005 NO [BADCHARSET (US-ASCII)] The specified charset is not supported.\r\n"); return new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt"), new ImapReplayCommand (Encoding.UTF8, "A00000005 UID THREAD REFERENCES UTF-8 UID 1:* SUBJECT {12+}\r\nпривет\r\n", badCharsetResponse), new ImapReplayCommand ("A00000006 UID THREAD REFERENCES US-ASCII UID 1:* SUBJECT {6+}\r\n?@825B\r\n", "dovecot.thread-references.txt") }; } [Test] public void TestThreadUidsBadCharsetFallback () { var commands = CreateThreadUidsBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); Assert.That (inbox.Supports (FolderFeature.Threading), Is.True, "Supports threading"); Assert.That (inbox.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Supports threading by References"); var threaded = inbox.Thread (UniqueIdRange.All, ThreadingAlgorithm.References, SearchQuery.SubjectContains ("привет")); Assert.That (threaded, Has.Count.EqualTo (2), "Unexpected number of root nodes in threaded results"); client.Disconnect (false); } } [Test] public async Task TestThreadUidsBadCharsetFallbackAsync () { var commands = CreateThreadUidsBadCharsetFallbackCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); Assert.That (inbox.Supports (FolderFeature.Threading), Is.True, "Supports threading"); Assert.That (inbox.ThreadingAlgorithms, Does.Contain (ThreadingAlgorithm.References), "Supports threading by References"); var threaded = await inbox.ThreadAsync (UniqueIdRange.All, ThreadingAlgorithm.References, SearchQuery.SubjectContains ("привет")); Assert.That (threaded, Has.Count.EqualTo (2), "Unexpected number of root nodes in threaded results"); await client.DisconnectAsync (false); } } } } ================================================ FILE: UnitTests/Net/Imap/ImapFolderTests.cs ================================================ // // ImapFolderTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Net; using System.Text; using System.Globalization; using MimeKit; using MailKit; using MailKit.Search; using MailKit.Security; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapFolderTests { static readonly Encoding Latin1 = Encoding.GetEncoding (28591); static MimeMessage CreateThreadableMessage (string subject, string msgid, string references, DateTimeOffset date) { var message = new MimeMessage (); message.From.Add (new MailboxAddress ("Unit Tests", "unit-tests@mimekit.net")); message.To.Add (new MailboxAddress ("Unit Tests", "unit-tests@mimekit.net")); message.MessageId = msgid; message.Subject = subject; message.Date = date; if (references != null) { foreach (var reference in references.Split (' ')) message.References.Add (reference); } message.Body = new TextPart ("plain") { Text = "This is the message body.\r\n" }; return message; } static Stream GetResourceStream (string name) { return typeof (ImapFolderTests).Assembly.GetManifestResourceStream ("UnitTests.Net.Imap.Resources." + name); } [Test] public void TestArgumentExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var personal = client.GetFolder (client.PersonalNamespaces[0]); var multiappend = new List (); var dates = new List (); var messages = new List (); var flags = new List (); var now = DateTimeOffset.Now; var uid = new UniqueId (1); ReplaceRequest replace = null; messages.Add (CreateThreadableMessage ("A", "", null, now.AddMinutes (-7))); messages.Add (CreateThreadableMessage ("B", "", "", now.AddMinutes (-6))); messages.Add (CreateThreadableMessage ("C", "", " ", now.AddMinutes (-5))); messages.Add (CreateThreadableMessage ("D", "", "", now.AddMinutes (-4))); messages.Add (CreateThreadableMessage ("E", "", " ", now.AddMinutes (-3))); messages.Add (CreateThreadableMessage ("F", "", "", now.AddMinutes (-2))); messages.Add (CreateThreadableMessage ("G", "", null, now.AddMinutes (-1))); messages.Add (CreateThreadableMessage ("H", "", null, now)); for (int i = 0; i < messages.Count; i++) { dates.Add (DateTimeOffset.Now); flags.Add (MessageFlags.Seen); multiappend.Add (new AppendRequest (messages[i], flags[i], dates[i])); replace ??= new ReplaceRequest (messages[i], flags[i], dates[i]); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; inbox.Open (FolderAccess.ReadWrite); // ImapFolder .ctor Assert.Throws (() => new ImapFolder (null)); // Open Assert.Throws (() => inbox.Open ((FolderAccess) 500)); Assert.Throws (() => inbox.Open ((FolderAccess) 500, 0, 0, UniqueIdRange.All)); Assert.Throws (() => inbox.Open (FolderAccess.ReadOnly, 0, 0, null)); Assert.ThrowsAsync (() => inbox.OpenAsync ((FolderAccess) 500)); Assert.ThrowsAsync (() => inbox.OpenAsync ((FolderAccess) 500, 0, 0, UniqueIdRange.All)); Assert.ThrowsAsync (() => inbox.OpenAsync (FolderAccess.ReadOnly, 0, 0, null)); // Create Assert.Throws (() => inbox.Create (null, true)); Assert.Throws (() => inbox.Create (string.Empty, true)); Assert.Throws (() => inbox.Create ("Folder./Name", true)); Assert.Throws (() => inbox.Create (null, SpecialFolder.All)); Assert.Throws (() => inbox.Create (string.Empty, SpecialFolder.All)); Assert.Throws (() => inbox.Create ("Folder./Name", SpecialFolder.All)); Assert.Throws (() => inbox.Create (null, new SpecialFolder[] { SpecialFolder.All })); Assert.Throws (() => inbox.Create (string.Empty, new SpecialFolder[] { SpecialFolder.All })); Assert.Throws (() => inbox.Create ("Folder./Name", new SpecialFolder[] { SpecialFolder.All })); Assert.Throws (() => inbox.Create ("ValidName", null)); Assert.Throws (() => inbox.Create ("ValidName", SpecialFolder.All)); Assert.ThrowsAsync (() => inbox.CreateAsync (null, true)); Assert.ThrowsAsync (() => inbox.CreateAsync (string.Empty, true)); Assert.ThrowsAsync (() => inbox.CreateAsync ("Folder./Name", true)); Assert.ThrowsAsync (() => inbox.CreateAsync (null, SpecialFolder.All)); Assert.ThrowsAsync (() => inbox.CreateAsync (string.Empty, SpecialFolder.All)); Assert.ThrowsAsync (() => inbox.CreateAsync ("Folder./Name", SpecialFolder.All)); Assert.ThrowsAsync (() => inbox.CreateAsync (null, new SpecialFolder[] { SpecialFolder.All })); Assert.ThrowsAsync (() => inbox.CreateAsync (string.Empty, new SpecialFolder[] { SpecialFolder.All })); Assert.ThrowsAsync (() => inbox.CreateAsync ("Folder./Name", new SpecialFolder[] { SpecialFolder.All })); Assert.ThrowsAsync (() => inbox.CreateAsync ("ValidName", null)); Assert.ThrowsAsync (() => inbox.CreateAsync ("ValidName", SpecialFolder.All)); // Rename Assert.Throws (() => inbox.Rename (null, "NewName")); Assert.Throws (() => inbox.Rename (personal, null)); Assert.Throws (() => inbox.Rename (personal, string.Empty)); Assert.ThrowsAsync (() => inbox.RenameAsync (null, "NewName")); Assert.ThrowsAsync (() => inbox.RenameAsync (personal, null)); Assert.ThrowsAsync (() => inbox.RenameAsync (personal, string.Empty)); // GetSubfolder Assert.Throws (() => inbox.GetSubfolder (null)); Assert.Throws (() => inbox.GetSubfolder (string.Empty)); Assert.ThrowsAsync (() => inbox.GetSubfolderAsync (null)); Assert.ThrowsAsync (() => inbox.GetSubfolderAsync (string.Empty)); // GetMetadata Assert.Throws (() => client.GetMetadata (null, new MetadataTag[] { MetadataTag.PrivateComment })); Assert.Throws (() => client.GetMetadata (new MetadataOptions (), null)); Assert.ThrowsAsync (() => client.GetMetadataAsync (null, new MetadataTag[] { MetadataTag.PrivateComment })); Assert.ThrowsAsync (() => client.GetMetadataAsync (new MetadataOptions (), null)); Assert.Throws (() => inbox.GetMetadata (null, new MetadataTag[] { MetadataTag.PrivateComment })); Assert.Throws (() => inbox.GetMetadata (new MetadataOptions (), null)); Assert.ThrowsAsync (() => inbox.GetMetadataAsync (null, new MetadataTag[] { MetadataTag.PrivateComment })); Assert.ThrowsAsync (() => inbox.GetMetadataAsync (new MetadataOptions (), null)); // SetMetadata Assert.Throws (() => client.SetMetadata (null)); Assert.ThrowsAsync (() => client.SetMetadataAsync (null)); Assert.Throws (() => inbox.SetMetadata (null)); Assert.ThrowsAsync (() => inbox.SetMetadataAsync (null)); // Expunge Assert.Throws (() => inbox.Expunge (null)); Assert.ThrowsAsync (() => inbox.ExpungeAsync (null)); // Append Assert.Throws (() => inbox.Append ((MimeMessage) null)); Assert.ThrowsAsync (() => inbox.AppendAsync ((MimeMessage) null)); Assert.Throws (() => inbox.Append (null, messages[0])); Assert.ThrowsAsync (() => inbox.AppendAsync (null, messages[0])); Assert.Throws (() => inbox.Append (FormatOptions.Default, (MimeMessage) null)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, (MimeMessage) null)); Assert.Throws (() => inbox.Append (null, MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.AppendAsync (null, MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Append (null, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.AppendAsync (null, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Append (FormatOptions.Default, null, MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, null, MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Append ((IAppendRequest) null)); Assert.ThrowsAsync (() => inbox.AppendAsync ((IAppendRequest) null)); Assert.Throws (() => inbox.Append (null, new AppendRequest (messages[0]))); Assert.ThrowsAsync (() => inbox.AppendAsync (null, new AppendRequest (messages[0]))); Assert.Throws (() => inbox.Append (FormatOptions.Default, (IAppendRequest) null)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, (IAppendRequest) null)); // MultiAppend Assert.Throws (() => inbox.Append (null, flags)); Assert.ThrowsAsync (() => inbox.AppendAsync (null, flags)); Assert.Throws (() => inbox.Append (new MimeMessage[] { null }, flags)); Assert.ThrowsAsync (() => inbox.AppendAsync (new MimeMessage[] { null }, flags)); Assert.Throws (() => inbox.Append (messages, null)); Assert.ThrowsAsync (() => inbox.AppendAsync (messages, null)); Assert.Throws (() => inbox.Append (messages, new MessageFlags[messages.Count - 1])); Assert.ThrowsAsync (() => inbox.AppendAsync (messages, new MessageFlags[messages.Count - 1])); Assert.Throws (() => inbox.Append (null, messages, flags)); Assert.ThrowsAsync (() => inbox.AppendAsync (null, messages, flags)); Assert.Throws (() => inbox.Append (FormatOptions.Default, null, flags)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, null, flags)); Assert.Throws (() => inbox.Append (FormatOptions.Default, new MimeMessage[] { null }, flags)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, new MimeMessage[] { null }, flags)); Assert.Throws (() => inbox.Append (FormatOptions.Default, messages, null)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, messages, null)); Assert.Throws (() => inbox.Append (FormatOptions.Default, messages, new MessageFlags[messages.Count - 1])); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, messages, new MessageFlags[messages.Count - 1])); Assert.Throws (() => inbox.Append (null, flags, dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (null, flags, dates)); Assert.Throws (() => inbox.Append (new MimeMessage[] { null }, flags, dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (new MimeMessage[] { null }, flags, dates)); Assert.Throws (() => inbox.Append (messages, null, dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (messages, null, dates)); Assert.Throws (() => inbox.Append (messages, flags, null)); Assert.ThrowsAsync (() => inbox.AppendAsync (messages, flags, null)); Assert.Throws (() => inbox.Append (messages, new MessageFlags[messages.Count - 1], dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (messages, new MessageFlags[messages.Count - 1], dates)); Assert.Throws (() => inbox.Append (messages, flags, new DateTimeOffset[messages.Count - 1])); Assert.ThrowsAsync (() => inbox.AppendAsync (messages, flags, new DateTimeOffset[messages.Count - 1])); Assert.Throws (() => inbox.Append (null, messages, flags, dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (null, messages, flags, dates)); Assert.Throws (() => inbox.Append (FormatOptions.Default, null, flags, dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, null, flags, dates)); Assert.Throws (() => inbox.Append (FormatOptions.Default, new MimeMessage[] { null }, flags, dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, new MimeMessage[] { null }, flags, dates)); Assert.Throws (() => inbox.Append (FormatOptions.Default, messages, null, dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, messages, null, dates)); Assert.Throws (() => inbox.Append (FormatOptions.Default, messages, flags, null)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, messages, flags, null)); Assert.Throws (() => inbox.Append (FormatOptions.Default, messages, new MessageFlags[messages.Count - 1], dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, messages, new MessageFlags[messages.Count - 1], dates)); Assert.Throws (() => inbox.Append (FormatOptions.Default, messages, flags, new DateTimeOffset[messages.Count - 1])); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, messages, flags, new DateTimeOffset[messages.Count - 1])); Assert.Throws (() => inbox.Append ((IList) null)); Assert.ThrowsAsync (() => inbox.AppendAsync ((IList) null)); Assert.Throws (() => inbox.Append (null, multiappend)); Assert.ThrowsAsync (() => inbox.AppendAsync (null, multiappend)); Assert.Throws (() => inbox.Append (new IAppendRequest[1])); Assert.ThrowsAsync (() => inbox.AppendAsync (new IAppendRequest[1])); Assert.Throws (() => inbox.Append (FormatOptions.Default, new IAppendRequest[1])); Assert.ThrowsAsync (() => inbox.AppendAsync (FormatOptions.Default, new IAppendRequest[1])); // Replace Assert.Throws (() => inbox.Replace (UniqueId.Invalid, messages[0])); Assert.ThrowsAsync (() => inbox.ReplaceAsync (UniqueId.Invalid, messages[0])); Assert.Throws (() => inbox.Replace (UniqueId.Invalid, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (UniqueId.Invalid, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Replace (uid, null)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (uid, null)); Assert.Throws (() => inbox.Replace (uid, null, MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (uid, null, MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Replace (null, uid, messages[0])); Assert.ThrowsAsync (() => inbox.ReplaceAsync (null, uid, messages[0])); Assert.Throws (() => inbox.Replace (null, uid, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (null, uid, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Replace (-1, messages[0])); Assert.ThrowsAsync (() => inbox.ReplaceAsync (-1, messages[0])); Assert.Throws (() => inbox.Replace (-1, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (-1, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Replace (0, null)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (0, null)); Assert.Throws (() => inbox.Replace (0, null, MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (0, null, MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Replace (null, 0, messages[0])); Assert.ThrowsAsync (() => inbox.ReplaceAsync (null, 0, messages[0])); Assert.Throws (() => inbox.Replace (null, 0, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (null, 0, messages[0], MessageFlags.None, DateTimeOffset.Now)); Assert.Throws (() => inbox.Replace (UniqueId.Invalid, replace)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (UniqueId.Invalid, replace)); Assert.Throws (() => inbox.Replace (UniqueId.MinValue, null)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (UniqueId.MinValue, null)); Assert.Throws (() => inbox.Replace (null, UniqueId.MinValue, replace)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (null, UniqueId.MinValue, replace)); Assert.Throws (() => inbox.Replace (FormatOptions.Default, UniqueId.Invalid, replace)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (FormatOptions.Default, UniqueId.Invalid, replace)); Assert.Throws (() => inbox.Replace (FormatOptions.Default, UniqueId.MinValue, null)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (FormatOptions.Default, UniqueId.MinValue, null)); Assert.Throws (() => inbox.Replace (-1, replace)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (-1, replace)); Assert.Throws (() => inbox.Replace (0, null)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (0, null)); Assert.Throws (() => inbox.Replace (null, 0, replace)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (null, 0, replace)); Assert.Throws (() => inbox.Replace (FormatOptions.Default, -1, replace)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (FormatOptions.Default, -1, replace)); Assert.Throws (() => inbox.Replace (FormatOptions.Default, 0, null)); Assert.ThrowsAsync (() => inbox.ReplaceAsync (FormatOptions.Default, 0, null)); // CopyTo Assert.Throws (() => inbox.CopyTo (UniqueId.Invalid, inbox)); Assert.ThrowsAsync (() => inbox.CopyToAsync (UniqueId.Invalid, inbox)); Assert.Throws (() => inbox.CopyTo (UniqueId.MinValue, null)); Assert.ThrowsAsync (() => inbox.CopyToAsync (UniqueId.MinValue, null)); Assert.Throws (() => inbox.CopyTo ((IList) null, inbox)); Assert.ThrowsAsync (() => inbox.CopyToAsync ((IList) null, inbox)); Assert.Throws (() => inbox.CopyTo (UniqueIdRange.All, null)); Assert.ThrowsAsync (() => inbox.CopyToAsync (UniqueIdRange.All, null)); Assert.Throws (() => inbox.CopyTo (-1, inbox)); Assert.ThrowsAsync (() => inbox.CopyToAsync (-1, inbox)); Assert.Throws (() => inbox.CopyTo (0, null)); Assert.ThrowsAsync (() => inbox.CopyToAsync (0, null)); Assert.Throws (() => inbox.CopyTo ((IList) null, inbox)); Assert.ThrowsAsync (() => inbox.CopyToAsync ((IList) null, inbox)); Assert.Throws (() => inbox.CopyTo (new int[] { 0 }, null)); Assert.ThrowsAsync (() => inbox.CopyToAsync (new int[] { 0 }, null)); // MoveTo Assert.Throws (() => inbox.MoveTo (UniqueId.Invalid, inbox)); Assert.ThrowsAsync (() => inbox.MoveToAsync (UniqueId.Invalid, inbox)); Assert.Throws (() => inbox.MoveTo (UniqueId.MinValue, null)); Assert.ThrowsAsync (() => inbox.MoveToAsync (UniqueId.MinValue, null)); Assert.Throws (() => inbox.MoveTo ((IList) null, inbox)); Assert.ThrowsAsync (() => inbox.MoveToAsync ((IList) null, inbox)); Assert.Throws (() => inbox.MoveTo (UniqueIdRange.All, null)); Assert.ThrowsAsync (() => inbox.MoveToAsync (UniqueIdRange.All, null)); Assert.Throws (() => inbox.MoveTo (-1, inbox)); Assert.ThrowsAsync (() => inbox.MoveToAsync (-1, inbox)); Assert.Throws (() => inbox.MoveTo (0, null)); Assert.ThrowsAsync (() => inbox.MoveToAsync (0, null)); Assert.Throws (() => inbox.MoveTo ((IList) null, inbox)); Assert.ThrowsAsync (() => inbox.MoveToAsync ((IList) null, inbox)); Assert.Throws (() => inbox.MoveTo (new int[] { 0 }, null)); Assert.ThrowsAsync (() => inbox.MoveToAsync (new int[] { 0 }, null)); client.Disconnect (false); foreach (var message in messages) message.Dispose (); } } [Test] public void TestNotSupportedExceptions () { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+gmail-capabilities.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), //new ImapReplayCommand ("A00000004 SELECT INBOX\r\n", "common.select-inbox.txt") }; using (var client = new ImapClient () { TagPrefix = 'A' }) { var credentials = new NetworkCredential ("username", "password"); try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate (credentials); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } // disable all features client.Capabilities = ImapCapabilities.None; var personal = client.GetFolder (client.PersonalNamespaces[0]); var dates = new List (); var messages = new List (); var flags = new List (); var now = DateTimeOffset.Now; messages.Add (CreateThreadableMessage ("A", "", null, now.AddMinutes (-7))); messages.Add (CreateThreadableMessage ("B", "", "", now.AddMinutes (-6))); messages.Add (CreateThreadableMessage ("C", "", " ", now.AddMinutes (-5))); messages.Add (CreateThreadableMessage ("D", "", "", now.AddMinutes (-4))); messages.Add (CreateThreadableMessage ("E", "", " ", now.AddMinutes (-3))); messages.Add (CreateThreadableMessage ("F", "", "", now.AddMinutes (-2))); messages.Add (CreateThreadableMessage ("G", "", null, now.AddMinutes (-1))); messages.Add (CreateThreadableMessage ("H", "", null, now)); for (int i = 0; i < messages.Count; i++) { dates.Add (DateTimeOffset.Now); flags.Add (MessageFlags.Seen); } Assert.That (client.Inbox.SyncRoot, Is.InstanceOf (), "SyncRoot"); var inbox = (ImapFolder) client.Inbox; // Open Assert.Throws (() => inbox.Open (FolderAccess.ReadOnly, 0, 0, UniqueIdRange.All)); Assert.ThrowsAsync (() => inbox.OpenAsync (FolderAccess.ReadOnly, 0, 0, UniqueIdRange.All)); // Create Assert.Throws (() => inbox.Create ("Folder", SpecialFolder.All)); Assert.ThrowsAsync (() => inbox.CreateAsync ("Folder", SpecialFolder.All)); // Rename - TODO // Append var international = FormatOptions.Default.Clone (); international.International = true; Assert.Throws (() => inbox.Append (international, messages[0])); Assert.ThrowsAsync (() => inbox.AppendAsync (international, messages[0])); Assert.Throws (() => inbox.Append (international, messages[0], flags[0])); Assert.ThrowsAsync (() => inbox.AppendAsync (international, messages[0], flags[0])); Assert.Throws (() => inbox.Append (international, messages[0], flags[0], dates[0])); Assert.ThrowsAsync (() => inbox.AppendAsync (international, messages[0], flags[0], dates[0])); // MultiAppend //Assert.Throws (() => inbox.Append (international, messages)); //Assert.ThrowsAsync (() => inbox.AppendAsync (international, messages)); Assert.Throws (() => inbox.Append (international, messages, flags)); Assert.ThrowsAsync (() => inbox.AppendAsync (international, messages, flags)); Assert.Throws (() => inbox.Append (international, messages, flags, dates)); Assert.ThrowsAsync (() => inbox.AppendAsync (international, messages, flags, dates)); // Status Assert.Throws (() => inbox.Status (StatusItems.Count)); Assert.ThrowsAsync (() => inbox.StatusAsync (StatusItems.Count)); // GetAccessControlList Assert.Throws (() => inbox.GetAccessControlList ()); Assert.ThrowsAsync (() => inbox.GetAccessControlListAsync ()); // GetAccessRights Assert.Throws (() => inbox.GetAccessRights ("name")); Assert.ThrowsAsync (() => inbox.GetAccessRightsAsync ("name")); // GetMyAccessRights Assert.Throws (() => inbox.GetMyAccessRights ()); Assert.ThrowsAsync (() => inbox.GetMyAccessRightsAsync ()); // RemoveAccess Assert.Throws (() => inbox.RemoveAccess ("name")); Assert.ThrowsAsync (() => inbox.RemoveAccessAsync ("name")); // GetMetadata Assert.Throws (() => client.GetMetadata (MetadataTag.PrivateComment)); Assert.ThrowsAsync (() => client.GetMetadataAsync (MetadataTag.PrivateComment)); Assert.Throws (() => inbox.GetMetadata (MetadataTag.PrivateComment)); Assert.ThrowsAsync (() => inbox.GetMetadataAsync (MetadataTag.PrivateComment)); Assert.Throws (() => client.GetMetadata (new MetadataOptions (), new MetadataTag[] { MetadataTag.PrivateComment })); Assert.ThrowsAsync (() => client.GetMetadataAsync (new MetadataOptions (), new MetadataTag[] { MetadataTag.PrivateComment })); Assert.Throws (() => inbox.GetMetadata (new MetadataOptions (), new MetadataTag[] { MetadataTag.PrivateComment })); Assert.ThrowsAsync (() => inbox.GetMetadataAsync (new MetadataOptions (), new MetadataTag[] { MetadataTag.PrivateComment })); // SetMetadata Assert.Throws (() => client.SetMetadata (new MetadataCollection ())); Assert.ThrowsAsync (() => client.SetMetadataAsync (new MetadataCollection ())); Assert.Throws (() => inbox.SetMetadata (new MetadataCollection ())); Assert.ThrowsAsync (() => inbox.SetMetadataAsync (new MetadataCollection ())); // GetQuota Assert.Throws (() => inbox.GetQuota ()); Assert.ThrowsAsync (() => inbox.GetQuotaAsync ()); // SetQuota Assert.Throws (() => inbox.SetQuota (5, 10)); Assert.ThrowsAsync (() => inbox.SetQuotaAsync (5, 10)); client.Disconnect (false); foreach (var message in messages) message.Dispose (); } } static IList CreateLiteralFolderNamesCommands () { return new List { new ImapReplayCommand ("", "common.basic-greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "common.capability.txt"), new ImapReplayCommand ("A00000001 LOGIN username password\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000002 CAPABILITY\r\n", "common.capability.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"\"\r\n", "common.list-namespace.txt"), new ImapReplayCommand ("A00000004 LIST \"\" \"INBOX\"\r\n", "common.list-inbox.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "common.list-literal-subfolders.txt"), new ImapReplayCommand ("A00000006 STATUS \"Literal Folder Name\" (MESSAGES)\r\n", "common.status-literal-folder.txt"), }; } [Test] public void TestLiteralFolderNames () { var commands = CreateLiteralFolderNamesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var personal = client.GetFolder (client.PersonalNamespaces[0]); var subfolders = personal.GetSubfolders (false); Assert.That (subfolders, Has.Count.EqualTo (2), "Count"); Assert.That (subfolders[0].Name, Is.EqualTo ("INBOX")); Assert.That (subfolders[1].Name, Is.EqualTo ("Literal Folder Name")); subfolders[1].Status (StatusItems.Count); Assert.That (subfolders[1], Has.Count.EqualTo (60), "Count"); client.Disconnect (false); } } [Test] public async Task TestLiteralFolderNamesAsync () { var commands = CreateLiteralFolderNamesCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var personal = client.GetFolder (client.PersonalNamespaces[0]); var subfolders = await personal.GetSubfoldersAsync (false); Assert.That (subfolders, Has.Count.EqualTo (2), "Count"); Assert.That (subfolders[0].Name, Is.EqualTo ("INBOX")); Assert.That (subfolders[1].Name, Is.EqualTo ("Literal Folder Name")); await subfolders[1].StatusAsync (StatusItems.Count); Assert.That (subfolders[1], Has.Count.EqualTo (60), "Count"); await client.DisconnectAsync (false); } } static IList CreateNilDirectorySeparatorCommands () { return new List { new ImapReplayCommand ("", "common.basic-greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "common.capability.txt"), new ImapReplayCommand ("A00000001 LOGIN username password\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000002 CAPABILITY\r\n", "common.capability.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"\"\r\n", "common.list-namespace.txt"), new ImapReplayCommand ("A00000004 LIST \"\" \"INBOX\"\r\n", "common.list-inbox.txt"), new ImapReplayCommand ("A00000005 LIST \"\" \"%\"\r\n", "common.list-nil-folder-delim.txt"), }; } [Test] public void TestNilDirectorySeparator () { var commands = CreateNilDirectorySeparatorCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var personal = client.GetFolder (client.PersonalNamespaces[0]); var subfolders = personal.GetSubfolders (false); Assert.That (subfolders, Has.Count.EqualTo (3), "Count"); Assert.That (subfolders[0].Name, Is.EqualTo ("INBOX")); Assert.That (subfolders[1].Name, Is.EqualTo ("Folder1")); Assert.That (subfolders[1].DirectorySeparator, Is.EqualTo ('\0')); Assert.That (subfolders[2].Name, Is.EqualTo ("Folder2")); Assert.That (subfolders[2].DirectorySeparator, Is.EqualTo ('\0')); Assert.Throws (() => subfolders[1].GetSubfolder ("Subfolder")); var empty = subfolders[1].GetSubfolders (false); Assert.That (empty, Is.Empty, "GetSubfolders when DirectorySeparator is nil"); client.Disconnect (false); } } [Test] public async Task TestNilDirectorySeparatorAsync () { var commands = CreateNilDirectorySeparatorCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var personal = client.GetFolder (client.PersonalNamespaces[0]); var subfolders = await personal.GetSubfoldersAsync (false); Assert.That (subfolders, Has.Count.EqualTo (3), "Count"); Assert.That (subfolders[0].Name, Is.EqualTo ("INBOX")); Assert.That (subfolders[1].Name, Is.EqualTo ("Folder1")); Assert.That (subfolders[1].DirectorySeparator, Is.EqualTo ('\0')); Assert.That (subfolders[2].Name, Is.EqualTo ("Folder2")); Assert.That (subfolders[2].DirectorySeparator, Is.EqualTo ('\0')); Assert.ThrowsAsync (() => subfolders[1].GetSubfolderAsync ("Subfolder")); var empty = await subfolders[1].GetSubfoldersAsync (false); Assert.That (empty, Is.Empty, "GetSubfolders when DirectorySeparator is nil"); await client.DisconnectAsync (false); } } static IList CreateAppendLimitCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate-no-appendlimit-value.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 STATUS INBOX (APPENDLIMIT)\r\n", "gmail.status-inbox-appendlimit.txt"), new ImapReplayCommand ("A00000006 STATUS INBOX (APPENDLIMIT)\r\n", "gmail.status-inbox-appendlimit-nil.txt"), new ImapReplayCommand ("A00000007 LIST \"\" \"%\" RETURN (SUBSCRIBED CHILDREN STATUS (MESSAGES UNSEEN APPENDLIMIT SIZE))\r\n", "gmail.list-personal-status-appendlimit.txt") }; } [Test] public void TestAppendLimit () { var commands = CreateAppendLimitCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.AppendLimit), Is.True, "ImapCapabilities.AppendLimit"); Assert.That (client.AppendLimit, Is.Null, "AppendLimit"); client.Inbox.Status (StatusItems.AppendLimit); Assert.That (client.Inbox.AppendLimit, Is.EqualTo (35651584), "Inbox.AppendLimit"); client.Inbox.Status (StatusItems.AppendLimit); Assert.That (client.Inbox.AppendLimit, Is.Null, "Inbox.AppendLimit NIL"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var subfolders = personal.GetSubfolders (StatusItems.Count | StatusItems.Unread | StatusItems.Size | StatusItems.AppendLimit, subscribedOnly: false); Assert.That (subfolders, Has.Count.EqualTo (2), "Count"); Assert.That (subfolders[0].Name, Is.EqualTo ("INBOX")); Assert.That (subfolders[0].AppendLimit, Is.EqualTo (1234567890), "Inbox.AppendLimit"); Assert.That (subfolders[0], Has.Count.EqualTo (10), "Inbox.Count"); Assert.That (subfolders[0].Unread, Is.EqualTo (1), "Inbox.Unread"); Assert.That (subfolders[0].Size, Is.EqualTo (123456789), "Inbox.Size"); client.Disconnect (false); } } [Test] public async Task TestAppendLimitAsync () { var commands = CreateAppendLimitCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.AppendLimit), Is.True, "ImapCapabilities.AppendLimit"); Assert.That (client.AppendLimit, Is.Null, "AppendLimit"); await client.Inbox.StatusAsync (StatusItems.AppendLimit); Assert.That (client.Inbox.AppendLimit, Is.EqualTo (35651584), "Inbox.AppendLimit"); await client.Inbox.StatusAsync (StatusItems.AppendLimit); Assert.That (client.Inbox.AppendLimit, Is.Null, "Inbox.AppendLimit NIL"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var subfolders = await personal.GetSubfoldersAsync (StatusItems.Count | StatusItems.Unread | StatusItems.Size | StatusItems.AppendLimit, subscribedOnly: false); Assert.That (subfolders, Has.Count.EqualTo (2), "Count"); Assert.That (subfolders[0].Name, Is.EqualTo ("INBOX")); Assert.That (subfolders[0].AppendLimit, Is.EqualTo (1234567890), "Inbox.AppendLimit"); Assert.That (subfolders[0], Has.Count.EqualTo (10), "Inbox.Count"); Assert.That (subfolders[0].Unread, Is.EqualTo (1), "Inbox.Unread"); Assert.That (subfolders[0].Size, Is.EqualTo (123456789), "Inbox.Size"); await client.DisconnectAsync (false); } } static List CreateAppendCommands (bool withKeywords, bool withInternalDates, out List messages, out List flags, out List> keywords, out List internalDates) { var commands = new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt") }; internalDates = withInternalDates ? new List () : null; keywords = withKeywords ? new List> () : null; messages = new List (); flags = new List (); var command = new StringBuilder (); int id = 5; for (int i = 0; i < 8; i++) { MimeMessage message; string latin1; long length; using (var resource = GetResourceStream (string.Format ("common.message.{0}.msg", i))) message = MimeMessage.Load (resource); messages.Add (message); flags.Add (MessageFlags.Seen); if (withKeywords) keywords.Add (new List { "$NotJunk" }); if (withInternalDates) internalDates.Add (message.Date); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; options.EnsureNewLine = true; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } var tag = string.Format ("A{0:D8}", id++); command.Clear (); if (withKeywords) command.AppendFormat ("{0} APPEND INBOX (\\Seen $NotJunk) ", tag); else command.AppendFormat ("{0} APPEND INBOX (\\Seen) ", tag); if (withInternalDates) command.AppendFormat ("\"{0}\" ", ImapUtils.FormatInternalDate (message.Date)); if (length > 4096) { command.Append ('{').Append (length.ToString (CultureInfo.InvariantCulture)).Append ("}\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), ImapReplayCommandResponse.Plus)); commands.Add (new ImapReplayCommand (tag, latin1 + "\r\n", string.Format ("dovecot.append.{0}.txt", i + 1))); } else { command.Append ('{').Append (length.ToString (CultureInfo.InvariantCulture)).Append ("+}\r\n").Append (latin1).Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), string.Format ("dovecot.append.{0}.txt", i + 1))); } } commands.Add (new ImapReplayCommand (string.Format ("A{0:D8} LOGOUT\r\n", id), "gmail.logout.txt")); return commands; } [TestCase (false, false, TestName = "TestAppend")] [TestCase (true, false, TestName = "TestAppendWithKeywords")] [TestCase (false, true, TestName = "TestAppendWithInternalDates")] [TestCase (true, true, TestName = "TestAppendWithKeywordsAndInternalDates")] public void TestAppend (bool withKeywords, bool withInternalDates) { var commands = CreateAppendCommands (withKeywords, withInternalDates, out var messages, out var flags, out var keywords, out var internalDates); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } for (int i = 0; i < messages.Count; i++) { UniqueId? uid; if (withKeywords) { AppendRequest request; if (withInternalDates) { request = new AppendRequest (messages[i], flags[i], keywords[i], internalDates[i]); } else { request = new AppendRequest (messages[i], flags[i], keywords[i]); } uid = client.Inbox.Append (request); } else if (withInternalDates) { uid = client.Inbox.Append (messages[i], flags[i], internalDates[i]); } else { uid = client.Inbox.Append (messages[i], flags[i]); } Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); messages[i].Dispose (); } client.Disconnect (true); } } [TestCase (false, false, TestName = "TestAppendAsync")] [TestCase (true, false, TestName = "TestAppendWithKeywordsAsync")] [TestCase (false, true, TestName = "TestAppendWithInternalDatesAsync")] [TestCase (true, true, TestName = "TestAppendWithKeywordsAndInternalDatesAsync")] public async Task TestAppendAsync (bool withKeywords, bool withInternalDates) { var commands = CreateAppendCommands (withKeywords, withInternalDates, out var messages, out var flags, out var keywords, out var internalDates); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } for (int i = 0; i < messages.Count; i++) { UniqueId? uid; if (withKeywords) { AppendRequest request; if (withInternalDates) { request = new AppendRequest (messages[i], flags[i], keywords[i], internalDates[i]); } else { request = new AppendRequest (messages[i], flags[i], keywords[i]); } uid = await client.Inbox.AppendAsync (request); } else if (withInternalDates) { uid = await client.Inbox.AppendAsync (messages[i], flags[i], internalDates[i]); } else { uid = await client.Inbox.AppendAsync (messages[i], flags[i]); } Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); messages[i].Dispose (); } await client.DisconnectAsync (true); } } static List CreateMultiAppendCommands (bool withKeywords, bool withInternalDates, out List messages, out List flags, out List> keywords, out List internalDates) { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt") }; var command = new StringBuilder ("A00000004 APPEND INBOX"); var now = DateTimeOffset.Now; internalDates = withInternalDates ? new List () : null; keywords = withKeywords ? new List> () : null; messages = new List (); flags = new List (); messages.Add (CreateThreadableMessage ("A", "", null, now.AddMinutes (-7))); messages.Add (CreateThreadableMessage ("B", "", "", now.AddMinutes (-6))); messages.Add (CreateThreadableMessage ("C", "", " ", now.AddMinutes (-5))); messages.Add (CreateThreadableMessage ("D", "", "", now.AddMinutes (-4))); messages.Add (CreateThreadableMessage ("E", "", " ", now.AddMinutes (-3))); messages.Add (CreateThreadableMessage ("F", "", "", now.AddMinutes (-2))); messages.Add (CreateThreadableMessage ("G", "", null, now.AddMinutes (-1))); messages.Add (CreateThreadableMessage ("H", "", null, now)); for (int i = 0; i < messages.Count; i++) { var message = messages[i]; string latin1; long length; flags.Add (MessageFlags.Seen); if (withKeywords) keywords.Add (new List { "$NotJunk" }); if (withInternalDates) internalDates.Add (messages[i].Date); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } if (withKeywords) command.Append (" (\\Seen $NotJunk) "); else command.Append (" (\\Seen) "); if (withInternalDates) command.AppendFormat ("\"{0}\" ", ImapUtils.FormatInternalDate (message.Date)); command.Append ('{'); command.AppendFormat ("{0}+", length); command.Append ("}\r\n"); command.Append (latin1); } command.Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), "dovecot.multiappend.txt")); for (int i = 0; i < messages.Count; i++) { var message = messages[i]; string latin1; long length; command.Clear (); command.AppendFormat ("A{0:D8} APPEND INBOX", i + 5); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } if (withKeywords) command.Append (" (\\Seen $NotJunk) "); else command.Append (" (\\Seen) "); if (withInternalDates) command.AppendFormat ("\"{0}\" ", ImapUtils.FormatInternalDate (message.Date)); command.Append ('{'); command.AppendFormat ("{0}+", length); command.Append ("}\r\n"); command.Append (latin1); command.Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), string.Format ("dovecot.append.{0}.txt", i + 1))); } commands.Add (new ImapReplayCommand ("A00000013 LOGOUT\r\n", "gmail.logout.txt")); return commands; } [TestCase (false, false, TestName = "TestMultiAppend")] [TestCase (true, false, TestName = "TestMultiAppendWithKeywords")] [TestCase (false, true, TestName = "TestMultiAppendWithInternalDates")] [TestCase (true, true, TestName = "TestMultiAppendWithKeywordsAndInternalDates")] public void TestMultiAppend (bool withKeywords, bool withInternalDates) { var commands = CreateMultiAppendCommands (withKeywords, withInternalDates, out var messages, out var flags, out var keywords, out var internalDates); IList uids; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.MultiAppend), Is.True, "MULTIAPPEND"); // Use MULTIAPPEND to append some test messages if (withKeywords) { var requests = new List (); for (int i = 0; i < messages.Count; i++) { if (withInternalDates) { requests.Add (new AppendRequest (messages[i], flags[i], keywords[i], internalDates[i])); } else { requests.Add (new AppendRequest (messages[i], flags[i], keywords[i])); } } uids = client.Inbox.Append (requests); } else if (withInternalDates) { uids = client.Inbox.Append (messages, flags, internalDates); } else { uids = client.Inbox.Append (messages, flags); } Assert.That (uids, Has.Count.EqualTo (8), "Unexpected number of messages appended"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), "Unexpected UID"); // Disable the MULTIAPPEND extension and do it again client.Capabilities &= ~ImapCapabilities.MultiAppend; if (withKeywords) { var requests = new List (); for (int i = 0; i < messages.Count; i++) { if (withInternalDates) { requests.Add (new AppendRequest (messages[i], flags[i], keywords[i], internalDates[i])); } else { requests.Add (new AppendRequest (messages[i], flags[i], keywords[i])); } } uids = client.Inbox.Append (requests); } else if (withInternalDates) { uids = client.Inbox.Append (messages, flags, internalDates); } else { uids = client.Inbox.Append (messages, flags); } Assert.That (uids, Has.Count.EqualTo (8), "Unexpected number of messages appended"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), "Unexpected UID"); client.Disconnect (true); foreach (var message in messages) message.Dispose (); } } [TestCase (false, false, TestName = "TestMultiAppendAsync")] [TestCase (true, false, TestName = "TestMultiAppendWithKeywordsAsync")] [TestCase (false, true, TestName = "TestMultiAppendWithInternalDatesAsync")] [TestCase (true, true, TestName = "TestMultiAppendWithKeywordsAndInternalDatesAsync")] public async Task TestMultiAppendAsync (bool withKeywords, bool withInternalDates) { var commands = CreateMultiAppendCommands (withKeywords, withInternalDates, out var messages, out var flags, out var keywords, out var internalDates); IList uids; using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.MultiAppend), Is.True, "MULTIAPPEND"); // Use MULTIAPPEND to append some test messages if (withKeywords) { var requests = new List (); for (int i = 0; i < messages.Count; i++) { if (withInternalDates) { requests.Add (new AppendRequest (messages[i], flags[i], keywords[i], internalDates[i])); } else { requests.Add (new AppendRequest (messages[i], flags[i], keywords[i])); } } uids = await client.Inbox.AppendAsync (requests); } else if (withInternalDates) { uids = await client.Inbox.AppendAsync (messages, flags, internalDates); } else { uids = await client.Inbox.AppendAsync (messages, flags); } Assert.That (uids, Has.Count.EqualTo (8), "Unexpected number of messages appended"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), "Unexpected UID"); // Disable the MULTIAPPEND extension and do it again client.Capabilities &= ~ImapCapabilities.MultiAppend; if (withKeywords) { var requests = new List (); for (int i = 0; i < messages.Count; i++) { if (withInternalDates) { requests.Add (new AppendRequest (messages[i], flags[i], keywords[i], internalDates[i])); } else { requests.Add (new AppendRequest (messages[i], flags[i], keywords[i])); } } uids = await client.Inbox.AppendAsync (requests); } else if (withInternalDates) { uids = await client.Inbox.AppendAsync (messages, flags, internalDates); } else { uids = await client.Inbox.AppendAsync (messages, flags); } Assert.That (uids, Has.Count.EqualTo (8), "Unexpected number of messages appended"); for (int i = 0; i < uids.Count; i++) Assert.That (uids[i].Id, Is.EqualTo (i + 1), "Unexpected UID"); await client.DisconnectAsync (true); foreach (var message in messages) message.Dispose (); } } static List CreateReplaceCommands (bool clientSide, bool withKeywords, bool withInternalDates, out List messages, out List flags, out List> keywords, out List internalDates) { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+replace.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt") }; internalDates = withInternalDates ? new List () : null; keywords = withKeywords ? new List> () : null; messages = new List (); flags = new List (); var command = new StringBuilder (); int id = 5; for (int i = 0; i < 8; i++) { MimeMessage message; string latin1; long length; using (var resource = GetResourceStream (string.Format ("common.message.{0}.msg", i))) message = MimeMessage.Load (resource); messages.Add (message); flags.Add (MessageFlags.Seen); if (withKeywords) keywords.Add (new List { "$NotJunk" }); if (withInternalDates) internalDates.Add (message.Date); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; options.EnsureNewLine = true; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } var tag = string.Format ("A{0:D8}", id++); command.Clear (); if (clientSide) command.AppendFormat ("{0} APPEND INBOX (\\Seen", tag); else command.AppendFormat ("{0} REPLACE {1} INBOX (\\Seen", tag, i + 1); if (withKeywords) command.Append (" $NotJunk) "); else command.Append (") "); if (withInternalDates) command.AppendFormat ("\"{0}\" ", ImapUtils.FormatInternalDate (message.Date)); //if (length > 4096) { // command.Append ('{').Append (length.ToString ()).Append ("}\r\n"); // commands.Add (new ImapReplayCommand (command.ToString (), ImapReplayCommandResponse.Plus)); // commands.Add (new ImapReplayCommand (tag, latin1 + "\r\n", string.Format ("dovecot.append.{0}.txt", i + 1))); //} else { command.Append ('{').Append (length.ToString (CultureInfo.InvariantCulture)).Append ("+}\r\n").Append (latin1).Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), string.Format ("dovecot.append.{0}.txt", i + 1))); //} if (clientSide) { tag = string.Format ("A{0:D8}", id++); commands.Add (new ImapReplayCommand ($"{tag} STORE {i + 1} +FLAGS.SILENT (\\Deleted)\r\n", ImapReplayCommandResponse.OK)); } } commands.Add (new ImapReplayCommand (string.Format ("A{0:D8} LOGOUT\r\n", id), "gmail.logout.txt")); return commands; } [TestCase (false, false, false, TestName = "TestReplace")] [TestCase (false, true, false, TestName = "TestReplaceWithKeywords")] [TestCase (false, false, true, TestName = "TestReplaceWithInternalDates")] [TestCase (false, true, true, TestName = "TestReplaceWithKeywordsAndInternalDates")] [TestCase (true, false, false, TestName = "TestClientSideReplace")] [TestCase (true, true, false, TestName = "TestClientSideReplaceWithKeywords")] [TestCase (true, false, true, TestName = "TestClientSideReplaceWithInternalDates")] [TestCase (true, true, true, TestName = "TestClientSideReplaceWithKeywordsAndInternalDates")] public void TestReplace (bool clientSide, bool withKeywords, bool withInternalDates) { var commands = CreateReplaceCommands (clientSide, withKeywords, withInternalDates, out var messages, out var flags, out var keywords, out var internalDates); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } if (clientSide) client.Capabilities &= ~ImapCapabilities.Replace; else Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Replace), Is.True, "REPLACE"); client.Inbox.Open (FolderAccess.ReadWrite); for (int i = 0; i < messages.Count; i++) { UniqueId? uid; if (withKeywords) { ReplaceRequest request; if (withInternalDates) { request = new ReplaceRequest (messages[i], flags[i], keywords[i], internalDates[i]); } else { request = new ReplaceRequest (messages[i], flags[i], keywords[i]); } uid = client.Inbox.Replace (i, request); } else if (withInternalDates) { uid = client.Inbox.Replace (i, messages[i], flags[i], internalDates[i]); } else { uid = client.Inbox.Replace (i, messages[i], flags[i]); } Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); } client.Disconnect (true); foreach (var message in messages) message.Dispose (); } } [TestCase (false, false, false, TestName = "TestReplaceAsync")] [TestCase (false, true, false, TestName = "TestReplaceWithKeywordsAsync")] [TestCase (false, false, true, TestName = "TestReplaceWithInternalDatesAsync")] [TestCase (false, true, true, TestName = "TestReplaceWithKeywordsAndInternalDatesAsync")] [TestCase (true, false, false, TestName = "TestClientSideReplaceAsync")] [TestCase (true, true, false, TestName = "TestClientSideReplaceWithKeywordsAsync")] [TestCase (true, false, true, TestName = "TestClientSideReplaceWithInternalDatesAsync")] [TestCase (true, true, true, TestName = "TestClientSideReplaceWithKeywordsAndInternalDatesAsync")] public async Task TestReplaceAsync (bool clientSide, bool withKeywords, bool withInternalDates) { var commands = CreateReplaceCommands (clientSide, withKeywords, withInternalDates, out var messages, out var flags, out var keywords, out var internalDates); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } if (clientSide) client.Capabilities &= ~ImapCapabilities.Replace; else Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Replace), Is.True, "REPLACE"); await client.Inbox.OpenAsync (FolderAccess.ReadWrite); for (int i = 0; i < messages.Count; i++) { UniqueId? uid; if (withKeywords) { ReplaceRequest request; if (withInternalDates) { request = new ReplaceRequest (messages[i], flags[i], keywords[i], internalDates[i]); } else { request = new ReplaceRequest (messages[i], flags[i], keywords[i]); } uid = await client.Inbox.ReplaceAsync (i, request); } else if (withInternalDates) { uid = await client.Inbox.ReplaceAsync (i, messages[i], flags[i], internalDates[i]); } else { uid = await client.Inbox.ReplaceAsync (i, messages[i], flags[i]); } Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); } await client.DisconnectAsync (true); foreach (var message in messages) message.Dispose (); } } static List CreateReplaceByUidCommands (bool clientSide, bool withKeywords, bool withInternalDates, out List messages, out List flags, out List> keywords, out List internalDates) { var commands = new List { new ImapReplayCommand ("", "dovecot.greeting.txt"), new ImapReplayCommand ("A00000000 LOGIN username password\r\n", "dovecot.authenticate+replace.txt"), new ImapReplayCommand ("A00000001 NAMESPACE\r\n", "dovecot.namespace.txt"), new ImapReplayCommand ("A00000002 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-inbox.txt"), new ImapReplayCommand ("A00000003 LIST (SPECIAL-USE) \"\" \"*\" RETURN (SUBSCRIBED CHILDREN)\r\n", "dovecot.list-special-use.txt"), new ImapReplayCommand ("A00000004 SELECT INBOX (CONDSTORE)\r\n", "common.select-inbox.txt") }; internalDates = withInternalDates ? new List () : null; keywords = withKeywords ? new List> () : null; messages = new List (); flags = new List (); var command = new StringBuilder (); int id = 5; for (int i = 0; i < 8; i++) { MimeMessage message; string latin1; long length; using (var resource = GetResourceStream (string.Format ("common.message.{0}.msg", i))) message = MimeMessage.Load (resource); messages.Add (message); flags.Add (MessageFlags.Seen); if (withKeywords) keywords.Add (new List { "$NotJunk" }); if (withInternalDates) internalDates.Add (message.Date); using (var stream = new MemoryStream ()) { var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Dos; options.EnsureNewLine = true; message.WriteTo (options, stream); length = stream.Length; stream.Position = 0; using (var reader = new StreamReader (stream, Latin1)) latin1 = reader.ReadToEnd (); } var tag = string.Format ("A{0:D8}", id++); command.Clear (); if (clientSide) command.AppendFormat ("{0} APPEND INBOX (\\Seen", tag); else command.AppendFormat ("{0} UID REPLACE {1} INBOX (\\Seen", tag, i + 1); if (withKeywords) command.Append (" $NotJunk) "); else command.Append (") "); if (withInternalDates) command.AppendFormat ("\"{0}\" ", ImapUtils.FormatInternalDate (message.Date)); //if (length > 4096) { // command.Append ('{').Append (length.ToString ()).Append ("}\r\n"); // commands.Add (new ImapReplayCommand (command.ToString (), ImapReplayCommandResponse.Plus)); // commands.Add (new ImapReplayCommand (tag, latin1 + "\r\n", string.Format ("dovecot.append.{0}.txt", i + 1))); //} else { command.Append ('{').Append (length.ToString (CultureInfo.InvariantCulture)).Append ("+}\r\n").Append (latin1).Append ("\r\n"); commands.Add (new ImapReplayCommand (command.ToString (), string.Format ("dovecot.append.{0}.txt", i + 1))); //} if (clientSide) { tag = string.Format ("A{0:D8}", id++); commands.Add (new ImapReplayCommand ($"{tag} UID STORE {i + 1} +FLAGS.SILENT (\\Deleted)\r\n", ImapReplayCommandResponse.OK)); tag = string.Format ("A{0:D8}", id++); commands.Add (new ImapReplayCommand ($"{tag} UID EXPUNGE {i + 1}\r\n", ImapReplayCommandResponse.OK)); } } commands.Add (new ImapReplayCommand (string.Format ("A{0:D8} LOGOUT\r\n", id), "gmail.logout.txt")); return commands; } [TestCase (false, false, false, TestName = "TestReplaceByUid")] [TestCase (false, true, false, TestName = "TestReplaceByUidWithKeywords")] [TestCase (false, false, true, TestName = "TestReplaceByUidWithInternalDates")] [TestCase (false, true, true, TestName = "TestReplaceByUidWithKeywordsAndInternalDates")] [TestCase (true, false, false, TestName = "TestClientSideReplaceByUid")] [TestCase (true, true, false, TestName = "TestClientSideReplaceByUidWithKeywords")] [TestCase (true, false, true, TestName = "TestClientSideReplaceByUidWithInternalDates")] [TestCase (true, true, true, TestName = "TestClientSideReplaceByUidWithKeywordsAndInternalDates")] public void TestReplaceByUid (bool clientSide, bool withKeywords, bool withInternalDates) { var commands = CreateReplaceByUidCommands (clientSide, withKeywords, withInternalDates, out var messages, out var flags, out var keywords, out var internalDates); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } if (clientSide) client.Capabilities &= ~ImapCapabilities.Replace; else Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Replace), Is.True, "REPLACE"); client.Inbox.Open (FolderAccess.ReadWrite); for (int i = 0; i < messages.Count; i++) { UniqueId? uid; if (withKeywords) { ReplaceRequest request; if (withInternalDates) { request = new ReplaceRequest (messages[i], flags[i], keywords[i], internalDates[i]); } else { request = new ReplaceRequest (messages[i], flags[i], keywords[i]); } uid = client.Inbox.Replace (new UniqueId ((uint) i + 1), request); } else if (withInternalDates) { uid = client.Inbox.Replace (new UniqueId ((uint) i + 1), messages[i], flags[i], internalDates[i]); } else { uid = client.Inbox.Replace (new UniqueId ((uint) i + 1), messages[i], flags[i]); } Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); } client.Disconnect (true); foreach (var message in messages) message.Dispose (); } } [TestCase (false, false, false, TestName = "TestReplaceByUidAsync")] [TestCase (false, true, false, TestName = "TestReplaceByUidWithKeywordsAsync")] [TestCase (false, false, true, TestName = "TestReplaceByUidWithInternalDatesAsync")] [TestCase (false, true, true, TestName = "TestReplaceByUidWithKeywordsAndInternalDatesAsync")] [TestCase (true, false, false, TestName = "TestClientSideReplaceByUidAsync")] [TestCase (true, true, false, TestName = "TestClientSideReplaceByUidWithKeywordsAsync")] [TestCase (true, false, true, TestName = "TestClientSideReplaceByUidWithInternalDatesAsync")] [TestCase (true, true, true, TestName = "TestClientSideReplaceByUidWithKeywordsAndInternalDatesAsync")] public async Task TestReplaceByUidAsync (bool clientSide, bool withKeywords, bool withInternalDates) { var commands = CreateReplaceByUidCommands (clientSide, withKeywords, withInternalDates, out var messages, out var flags, out var keywords, out var internalDates); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } // Note: we do not want to use SASL at all... client.AuthenticationMechanisms.Clear (); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } if (clientSide) client.Capabilities &= ~ImapCapabilities.Replace; else Assert.That (client.Capabilities.HasFlag (ImapCapabilities.Replace), Is.True, "REPLACE"); await client.Inbox.OpenAsync (FolderAccess.ReadWrite); for (int i = 0; i < messages.Count; i++) { UniqueId? uid; if (withKeywords) { ReplaceRequest request; if (withInternalDates) { request = new ReplaceRequest (messages[i], flags[i], keywords[i], internalDates[i]); } else { request = new ReplaceRequest (messages[i], flags[i], keywords[i]); } uid = await client.Inbox.ReplaceAsync (new UniqueId ((uint) i + 1), request); } else if (withInternalDates) { uid = await client.Inbox.ReplaceAsync (new UniqueId ((uint) i + 1), messages[i], flags[i], internalDates[i]); } else { uid = await client.Inbox.ReplaceAsync (new UniqueId ((uint) i + 1), messages[i], flags[i]); } Assert.That (uid.HasValue, Is.True, "Expected a UIDAPPEND resp-code"); Assert.That (uid.Value.Id, Is.EqualTo (i + 1), "Unexpected UID"); } await client.DisconnectAsync (true); foreach (var message in messages) message.Dispose (); } } static List CreateCreateRenameDeleteCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 CREATE TopLevel1\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000006 LIST \"\" TopLevel1\r\n", "gmail.list-toplevel1.txt"), new ImapReplayCommand ("A00000007 CREATE TopLevel2\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000008 LIST \"\" TopLevel2\r\n", "gmail.list-toplevel2.txt"), new ImapReplayCommand ("A00000009 CREATE TopLevel1/SubLevel1\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000010 LIST \"\" TopLevel1/SubLevel1\r\n", "gmail.list-sublevel1.txt"), new ImapReplayCommand ("A00000011 CREATE TopLevel2/SubLevel2\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000012 LIST \"\" TopLevel2/SubLevel2\r\n", "gmail.list-sublevel2.txt"), new ImapReplayCommand ("A00000013 SELECT TopLevel1/SubLevel1 (CONDSTORE)\r\n", "gmail.select-sublevel1.txt"), new ImapReplayCommand ("A00000014 RENAME TopLevel1/SubLevel1 TopLevel2/SubLevel1\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000015 DELETE TopLevel1\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000016 SELECT TopLevel2/SubLevel2 (CONDSTORE)\r\n", "gmail.select-sublevel2.txt"), new ImapReplayCommand ("A00000017 RENAME TopLevel2 TopLevel\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000018 SELECT TopLevel (CONDSTORE)\r\n", "gmail.select-toplevel.txt"), new ImapReplayCommand ("A00000019 DELETE TopLevel\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000020 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestCreateRenameDelete () { var commands = CreateCreateRenameDeleteCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } int top1Renamed = 0, top2Renamed = 0, sub1Renamed = 0, sub2Renamed = 0; int top1Deleted = 0, top2Deleted = 0, sub1Deleted = 0, sub2Deleted = 0; int top1Closed = 0, top2Closed = 0, sub1Closed = 0, sub2Closed = 0; var personal = client.GetFolder (client.PersonalNamespaces[0]); var toplevel1 = personal.Create ("TopLevel1", false); var toplevel2 = personal.Create ("TopLevel2", false); var sublevel1 = toplevel1.Create ("SubLevel1", true); var sublevel2 = toplevel2.Create ("SubLevel2", true); toplevel1.Renamed += (o, e) => { top1Renamed++; }; toplevel2.Renamed += (o, e) => { top2Renamed++; }; sublevel1.Renamed += (o, e) => { sub1Renamed++; }; sublevel2.Renamed += (o, e) => { sub2Renamed++; }; toplevel1.Deleted += (o, e) => { top1Deleted++; }; toplevel2.Deleted += (o, e) => { top2Deleted++; }; sublevel1.Deleted += (o, e) => { sub1Deleted++; }; sublevel2.Deleted += (o, e) => { sub2Deleted++; }; toplevel1.Closed += (o, e) => { top1Closed++; }; toplevel2.Closed += (o, e) => { top2Closed++; }; sublevel1.Closed += (o, e) => { sub1Closed++; }; sublevel2.Closed += (o, e) => { sub2Closed++; }; Assert.That (sublevel1.CanOpen, Is.True, "SubLevel1 can be opened"); sublevel1.Open (FolderAccess.ReadWrite); sublevel1.Rename (toplevel2, "SubLevel1"); Assert.That (sub1Renamed, Is.EqualTo (1), "SubLevel1 folder should have received a Renamed event"); Assert.That (sub1Closed, Is.EqualTo (1), "SubLevel1 should have received a Closed event"); Assert.That (sublevel1.IsOpen, Is.False, "SubLevel1 should be closed after being renamed"); toplevel1.Delete (); Assert.That (top1Deleted, Is.EqualTo (1), "TopLevel1 should have received a Deleted event"); Assert.That (toplevel1.Exists, Is.False, "TopLevel1.Exists"); Assert.That (sublevel2.CanOpen, Is.True, "SubLevel2 can be opened"); sublevel2.Open (FolderAccess.ReadWrite); toplevel2.Rename (personal, "TopLevel"); Assert.That (sub1Renamed, Is.EqualTo (2), "SubLevel1 folder should have received a Renamed event"); Assert.That (sub2Renamed, Is.EqualTo (1), "SubLevel2 folder should have received a Renamed event"); Assert.That (sub2Closed, Is.EqualTo (1), "SubLevel2 should have received a Closed event"); Assert.That (sublevel2.IsOpen, Is.False, "SubLevel2 should be closed after being renamed"); Assert.That (top2Renamed, Is.EqualTo (1), "TopLevel2 folder should have received a Renamed event"); toplevel2.Open (FolderAccess.ReadWrite); toplevel2.Delete (); Assert.That (top2Closed, Is.EqualTo (1), "TopLevel2 should have received a Closed event"); Assert.That (toplevel2.IsOpen, Is.False, "TopLevel2 should be closed after being deleted"); Assert.That (top2Deleted, Is.EqualTo (1), "TopLevel2 should have received a Deleted event"); Assert.That (toplevel2.Exists, Is.False, "TopLevel2.Exists"); client.Disconnect (true); } } [Test] public async Task TestCreateRenameDeleteAsync () { var commands = CreateCreateRenameDeleteCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } int top1Renamed = 0, top2Renamed = 0, sub1Renamed = 0, sub2Renamed = 0; int top1Deleted = 0, top2Deleted = 0, sub1Deleted = 0, sub2Deleted = 0; int top1Closed = 0, top2Closed = 0, sub1Closed = 0, sub2Closed = 0; var personal = client.GetFolder (client.PersonalNamespaces[0]); var toplevel1 = await personal.CreateAsync ("TopLevel1", false); var toplevel2 = await personal.CreateAsync ("TopLevel2", false); var sublevel1 = await toplevel1.CreateAsync ("SubLevel1", true); var sublevel2 = await toplevel2.CreateAsync ("SubLevel2", true); toplevel1.Renamed += (o, e) => { top1Renamed++; }; toplevel2.Renamed += (o, e) => { top2Renamed++; }; sublevel1.Renamed += (o, e) => { sub1Renamed++; }; sublevel2.Renamed += (o, e) => { sub2Renamed++; }; toplevel1.Deleted += (o, e) => { top1Deleted++; }; toplevel2.Deleted += (o, e) => { top2Deleted++; }; sublevel1.Deleted += (o, e) => { sub1Deleted++; }; sublevel2.Deleted += (o, e) => { sub2Deleted++; }; toplevel1.Closed += (o, e) => { top1Closed++; }; toplevel2.Closed += (o, e) => { top2Closed++; }; sublevel1.Closed += (o, e) => { sub1Closed++; }; sublevel2.Closed += (o, e) => { sub2Closed++; }; Assert.That (sublevel1.CanOpen, Is.True, "SubLevel1 can be opened"); await sublevel1.OpenAsync (FolderAccess.ReadWrite); await sublevel1.RenameAsync (toplevel2, "SubLevel1"); Assert.That (sub1Renamed, Is.EqualTo (1), "SubLevel1 folder should have received a Renamed event"); Assert.That (sub1Closed, Is.EqualTo (1), "SubLevel1 should have received a Closed event"); Assert.That (sublevel1.IsOpen, Is.False, "SubLevel1 should be closed after being renamed"); await toplevel1.DeleteAsync (); Assert.That (top1Deleted, Is.EqualTo (1), "TopLevel1 should have received a Deleted event"); Assert.That (toplevel1.Exists, Is.False, "TopLevel1.Exists"); Assert.That (sublevel2.CanOpen, Is.True, "SubLevel2 can be opened"); await sublevel2.OpenAsync (FolderAccess.ReadWrite); await toplevel2.RenameAsync (personal, "TopLevel"); Assert.That (sub1Renamed, Is.EqualTo (2), "SubLevel1 folder should have received a Renamed event"); Assert.That (sub2Renamed, Is.EqualTo (1), "SubLevel2 folder should have received a Renamed event"); Assert.That (sub2Closed, Is.EqualTo (1), "SubLevel2 should have received a Closed event"); Assert.That (sublevel2.IsOpen, Is.False, "SubLevel2 should be closed after being renamed"); Assert.That (top2Renamed, Is.EqualTo (1), "TopLevel2 folder should have received a Renamed event"); await toplevel2.OpenAsync (FolderAccess.ReadWrite); await toplevel2.DeleteAsync (); Assert.That (top2Closed, Is.EqualTo (1), "TopLevel2 should have received a Closed event"); Assert.That (toplevel2.IsOpen, Is.False, "TopLevel2 should be closed after being deleted"); Assert.That (top2Deleted, Is.EqualTo (1), "TopLevel2 should have received a Deleted event"); Assert.That (toplevel2.Exists, Is.False, "TopLevel2.Exists"); await client.DisconnectAsync (true); } } static List CreateCreateMailboxIdCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+create-special-use.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 CREATE TopLevel1\r\n", "gmail.create-mailboxid.txt"), new ImapReplayCommand ("A00000006 LIST \"\" TopLevel1\r\n", "gmail.list-toplevel1.txt"), new ImapReplayCommand ("A00000007 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestCreateMailboxId () { var commands = CreateCreateMailboxIdCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.ObjectID), Is.True, "OBJECTID"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var toplevel1 = personal.Create ("TopLevel1", true); Assert.That (toplevel1.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren)); Assert.That (toplevel1.Id, Is.EqualTo ("25dcfa84-fd65-41c3-abc3-633c8f10923f")); client.Disconnect (true); } } [Test] public async Task TestCreateMailboxIdAsync () { var commands = CreateCreateMailboxIdCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.ObjectID), Is.True, "OBJECTID"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var toplevel1 = await personal.CreateAsync ("TopLevel1", true); Assert.That (toplevel1.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren)); Assert.That (toplevel1.Id, Is.EqualTo ("25dcfa84-fd65-41c3-abc3-633c8f10923f")); await client.DisconnectAsync (true); } } static List CreateCreateSpecialUseCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+create-special-use.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 CREATE \"[Gmail]/Archives\" (USE (\\Archive))\r\n", "gmail.create-mailboxid.txt"), new ImapReplayCommand ("A00000006 LIST \"\" \"[Gmail]/Archives\"\r\n", "gmail.list-archives.txt"), new ImapReplayCommand ("A00000007 CREATE \"[Gmail]/Flagged\" (USE (\\Flagged))\r\n", "gmail.create-mailboxid.txt"), new ImapReplayCommand ("A00000008 LIST \"\" \"[Gmail]/Flagged\"\r\n", "gmail.list-flagged.txt"), new ImapReplayCommand ("A00000009 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestCreateSpecialUse () { var commands = CreateCreateSpecialUseCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.CreateSpecialUse), Is.True, "CREATE-SPECIAL-USE"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var gmail = personal.GetSubfolder ("[Gmail]"); var archives = gmail.Create ("Archives", SpecialFolder.Archive); Assert.That (archives.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren | FolderAttributes.Archive)); Assert.That (client.GetFolder (SpecialFolder.Archive), Is.EqualTo (archives)); Assert.That (archives.Id, Is.EqualTo ("25dcfa84-fd65-41c3-abc3-633c8f10923f")); var flagged = gmail.Create ("Flagged", SpecialFolder.Flagged); Assert.That (flagged.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren | FolderAttributes.Flagged)); Assert.That (client.GetFolder (SpecialFolder.Flagged), Is.EqualTo (flagged)); Assert.That (flagged.Id, Is.EqualTo ("25dcfa84-fd65-41c3-abc3-633c8f10923f")); client.Disconnect (true); } } [Test] public async Task TestCreateSpecialUseAsync () { var commands = CreateCreateSpecialUseCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.CreateSpecialUse), Is.True, "CREATE-SPECIAL-USE"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var gmail = await personal.GetSubfolderAsync ("[Gmail]"); var archives = await gmail.CreateAsync ("Archives", SpecialFolder.Archive); Assert.That (archives.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren | FolderAttributes.Archive)); Assert.That (client.GetFolder (SpecialFolder.Archive), Is.EqualTo (archives)); Assert.That (archives.Id, Is.EqualTo ("25dcfa84-fd65-41c3-abc3-633c8f10923f")); var flagged = await gmail.CreateAsync ("Flagged", SpecialFolder.Flagged); Assert.That (flagged.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren | FolderAttributes.Flagged)); Assert.That (client.GetFolder (SpecialFolder.Flagged), Is.EqualTo (flagged)); Assert.That (flagged.Id, Is.EqualTo ("25dcfa84-fd65-41c3-abc3-633c8f10923f")); await client.DisconnectAsync (true); } } static List CreateCreateSpecialUseMultipleCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate+create-special-use.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 CREATE \"[Gmail]/Archives\" (USE (\\All \\Archive \\Drafts \\Flagged \\Important \\Junk \\Sent \\Trash))\r\n", "gmail.create-mailboxid.txt"), new ImapReplayCommand ("A00000006 LIST \"\" \"[Gmail]/Archives\"\r\n", "gmail.list-archives.txt"), new ImapReplayCommand ("A00000007 CREATE \"[Gmail]/MyImportant\" (USE (\\Important))\r\n", Encoding.ASCII.GetBytes ("A00000007 NO [USEATTR] An \\Important mailbox already exists\r\n")), new ImapReplayCommand ("A00000008 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestCreateSpecialUseMultiple () { var commands = CreateCreateSpecialUseMultipleCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.CreateSpecialUse), Is.True, "CREATE-SPECIAL-USE"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var gmail = personal.GetSubfolder ("[Gmail]"); var uses = new List { SpecialFolder.All, SpecialFolder.Archive, SpecialFolder.Drafts, SpecialFolder.Flagged, SpecialFolder.Important, SpecialFolder.Junk, SpecialFolder.Sent, SpecialFolder.Trash, // specifically duplicate some special uses SpecialFolder.All, SpecialFolder.Flagged, // and add one that is invalid (SpecialFolder) 15 }; var archive = gmail.Create ("Archives", uses); Assert.That (archive.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren | FolderAttributes.Archive)); Assert.That (client.GetFolder (SpecialFolder.Archive), Is.EqualTo (archive)); Assert.That (archive.Id, Is.EqualTo ("25dcfa84-fd65-41c3-abc3-633c8f10923f")); try { gmail.Create ("MyImportant", new[] { SpecialFolder.Important }); Assert.Fail ("Creating the MyImportant folder should have thrown an ImapCommandException"); } catch (ImapCommandException ex) { Assert.That (ex.Response, Is.EqualTo (ImapCommandResponse.No)); Assert.That (ex.ResponseText, Is.EqualTo ("An \\Important mailbox already exists")); } catch (Exception ex) { Assert.Fail ($"Unexpected exception: {ex}"); } client.Disconnect (true); } } [Test] public async Task TestCreateSpecialUseMultipleAsync () { var commands = CreateCreateSpecialUseMultipleCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.CreateSpecialUse), Is.True, "CREATE-SPECIAL-USE"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var gmail = await personal.GetSubfolderAsync ("[Gmail]"); var uses = new List { SpecialFolder.All, SpecialFolder.Archive, SpecialFolder.Drafts, SpecialFolder.Flagged, SpecialFolder.Important, SpecialFolder.Junk, SpecialFolder.Sent, SpecialFolder.Trash, // specifically duplicate some special uses SpecialFolder.All, SpecialFolder.Flagged, // and add one that is invalid (SpecialFolder) 15 }; var archive = await gmail.CreateAsync ("Archives", uses); Assert.That (archive.Attributes, Is.EqualTo (FolderAttributes.HasNoChildren | FolderAttributes.Archive)); Assert.That (client.GetFolder (SpecialFolder.Archive), Is.EqualTo (archive)); Assert.That (archive.Id, Is.EqualTo ("25dcfa84-fd65-41c3-abc3-633c8f10923f")); try { await gmail.CreateAsync ("MyImportant", new[] { SpecialFolder.Important }); Assert.Fail ("Creating the MyImportamnt folder should have thrown an ImapCommandException"); } catch (ImapCommandException ex) { Assert.That (ex.Response, Is.EqualTo (ImapCommandResponse.No)); Assert.That (ex.ResponseText, Is.EqualTo ("An \\Important mailbox already exists")); } catch (Exception ex) { Assert.Fail ($"Unexpected exception: {ex}"); } await client.DisconnectAsync (true); } } static List CreateCopyToCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt"), new ImapReplayCommand ("A00000006 UID SEARCH RETURN (ALL) ALL\r\n", "gmail.search.txt"), new ImapReplayCommand ("A00000007 LIST \"\" \"Archived Messages\"\r\n", "gmail.list-archived-messages.txt"), new ImapReplayCommand ("A00000008 UID COPY 1:3,5,7:9,11:14,26:29,31,34,41:43,50 \"Archived Messages\"\r\n", "gmail.uid-copy.txt"), new ImapReplayCommand ("A00000009 SEARCH UID 1:3,5,7:9,11:14,26:29,31,34,41:43,50\r\n", "gmail.get-indexes.txt"), new ImapReplayCommand ("A00000010 COPY 1:21 \"Archived Messages\"\r\n", "gmail.uid-copy.txt"), new ImapReplayCommand ("A00000011 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestCopyTo () { var commands = CreateCopyToCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.UidPlus), Is.True, "Expected UIDPLUS extension"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); var uids = inbox.Search (SearchQuery.All); var archived = personal.GetSubfolder ("Archived Messages"); // Test copying using the UIDPLUS extension var copied = inbox.CopyTo (uids, archived); Assert.That (copied.Destination, Has.Count.EqualTo (copied.Source.Count), "Source and Destination UID counts do not match"); // Disable UIDPLUS and try again (to test GetIndexesAsync() and CopyTo(IList, IMailFolder) client.Capabilities &= ~ImapCapabilities.UidPlus; copied = inbox.CopyTo (uids, archived); Assert.That (copied.Destination, Has.Count.EqualTo (copied.Source.Count), "Source and Destination UID counts do not match"); client.Disconnect (true); } } [Test] public async Task TestCopyToAsync () { var commands = CreateCopyToCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.UidPlus), Is.True, "Expected UIDPLUS extension"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var uids = await inbox.SearchAsync (SearchQuery.All); var archived = await personal.GetSubfolderAsync ("Archived Messages"); // Test copying using the UIDPLUS extension var copied = await inbox.CopyToAsync (uids, archived); Assert.That (copied.Destination, Has.Count.EqualTo (copied.Source.Count), "Source and Destination UID counts do not match"); // Disable UIDPLUS and try again (to test GetIndexesAsync() and CopyTo(IList, IMailFolder) client.Capabilities &= ~ImapCapabilities.UidPlus; copied = await inbox.CopyToAsync (uids, archived); Assert.That (copied.Destination, Has.Count.EqualTo (copied.Source.Count), "Source and Destination UID counts do not match"); await client.DisconnectAsync (true); } } static List CreateExchangeCopyUidRespCodeWithoutOkCommands () { return new List { new ImapReplayCommand ("", "exchange.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "exchange.capability-preauth.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000002 CAPABILITY\r\n", "exchange.capability-postauth.txt"), new ImapReplayCommand ("A00000003 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000004 LIST \"\" \"INBOX\"\r\n", "common.list-inbox.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX\r\n", "common.select-inbox.txt"), new ImapReplayCommand ("A00000006 LIST \"\" Level1\r\n", "gmail.list-level1.txt"), new ImapReplayCommand ("A00000007 UID MOVE 31 Level1\r\n", "exchange.issue115.txt"), new ImapReplayCommand ("A00000008 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestExchangeCopyUidRespCodeWithoutOk () { var commands = CreateExchangeCopyUidRespCodeWithoutOkCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.UidPlus), Is.True, "Expected UIDPLUS extension"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); // Test handling of broken Exchange IMAP response: "[COPYUID 55 31 6]" (it should be "* OK [COPYUID 55 31 6]") var level1 = personal.GetSubfolder ("Level1"); var uids = new[] { new UniqueId (31) }; var copied = inbox.MoveTo (uids, level1); Assert.That (copied.Destination, Has.Count.EqualTo (copied.Source.Count), "Source and Destination UID counts do not match"); Assert.That (uids[0], Is.EqualTo (copied.Source[0]), "Source[0]"); Assert.That (new UniqueId (6), Is.EqualTo (copied.Destination[0]), "Destination[0]"); client.Disconnect (true); } } [Test] public async Task TestExchangeCopyUidRespCodeWithoutOkAsync () { var commands = CreateExchangeCopyUidRespCodeWithoutOkCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.UidPlus), Is.True, "Expected UIDPLUS extension"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); // Test handling of broken Exchange IMAP response: "[COPYUID 55 31 6]" (it should be "* OK [COPYUID 55 31 6]") var level1 = await personal.GetSubfolderAsync ("Level1"); var uids = new[] { new UniqueId (31) }; var copied = await inbox.MoveToAsync (uids, level1); Assert.That (copied.Destination, Has.Count.EqualTo (copied.Source.Count), "Source and Destination UID counts do not match"); Assert.That (uids[0], Is.EqualTo (copied.Source[0]), "Source[0]"); Assert.That (new UniqueId (6), Is.EqualTo (copied.Destination[0]), "Destination[0]"); await client.DisconnectAsync (true); } } static List CreateMoveToCommands () { var commands = new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt"), new ImapReplayCommand ("A00000006 LIST \"\" \"Archived Messages\"\r\n", "gmail.list-archived-messages.txt"), new ImapReplayCommand ("A00000007 MOVE 1:21 \"Archived Messages\"\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000008 COPY 1:21 \"Archived Messages\"\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000009 STORE 1:21 +FLAGS.SILENT (\\Deleted)\r\n", ImapReplayCommandResponse.OK), new ImapReplayCommand ("A00000010 LOGOUT\r\n", "gmail.logout.txt") }; return commands; } [Test] public void TestMoveTo () { var commands = CreateMoveToCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.UidPlus), Is.True, "Expected UIDPLUS extension"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); var indexes = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; var archived = personal.GetSubfolder ("Archived Messages"); inbox.MoveTo (indexes, archived); client.Capabilities &= ~ImapCapabilities.Move; inbox.MoveTo (indexes, archived); client.Disconnect (true); } } [Test] public async Task TestMoveToAsync () { var commands = CreateMoveToCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.UidPlus), Is.True, "Expected UIDPLUS extension"); var personal = client.GetFolder (client.PersonalNamespaces[0]); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var indexes = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; var archived = await personal.GetSubfolderAsync ("Archived Messages"); await inbox.MoveToAsync (indexes, archived); client.Capabilities &= ~ImapCapabilities.Move; await inbox.MoveToAsync (indexes, archived); await client.DisconnectAsync (true); } } static List CreateUidMoveToCommands (bool disableMove) { var commands = new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt"), new ImapReplayCommand ("A00000006 UID SEARCH RETURN (ALL) ALL\r\n", "gmail.search.txt"), new ImapReplayCommand ("A00000007 LIST \"\" \"Archived Messages\"\r\n", "gmail.list-archived-messages.txt"), new ImapReplayCommand ("A00000008 UID MOVE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 \"Archived Messages\"\r\n", "gmail.uid-move.txt") }; if (disableMove) { commands.Add (new ImapReplayCommand ("A00000009 UID COPY 1:3,5,7:9,11:14,26:29,31,34,41:43,50 \"Archived Messages\"\r\n", "gmail.uid-copy.txt")); commands.Add (new ImapReplayCommand ("A00000010 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 +FLAGS.SILENT (\\Deleted)\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000011 UID EXPUNGE 1:3,5,7:9,11:14,26:29,31,34,41:43,50\r\n", "gmail.uid-expunge.txt")); commands.Add (new ImapReplayCommand ("A00000012 LOGOUT\r\n", "gmail.logout.txt")); } else { commands.Add (new ImapReplayCommand ("A00000009 SEARCH UID 1:3,5,7:9,11:14,26:29,31,34,41:43,50\r\n", "gmail.get-indexes.txt")); commands.Add (new ImapReplayCommand ("A00000010 MOVE 1:21 \"Archived Messages\"\r\n", "gmail.uid-move.txt")); commands.Add (new ImapReplayCommand ("A00000011 LOGOUT\r\n", "gmail.logout.txt")); } return commands; } [TestCase (true, TestName = "TestUidMoveToDisableMove")] [TestCase (false, TestName = "TestUidMoveToDisableUidPlus")] public void TestUidMoveTo (bool disableMove) { var commands = CreateUidMoveToCommands (disableMove); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.UidPlus), Is.True, "Expected UIDPLUS extension"); var personal = client.GetFolder (client.PersonalNamespaces [0]); var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); var uids = inbox.Search (SearchQuery.All); var archived = personal.GetSubfolder ("Archived Messages"); int changed = 0, expunged = 0; inbox.MessageExpunged += (o, e) => { expunged++; Assert.That (e.Index, Is.EqualTo (0), "Expunged event message index"); }; inbox.CountChanged += (o, e) => { changed++; }; // Test copying using the MOVE & UIDPLUS extensions var moved = inbox.MoveTo (uids, archived); Assert.That (moved.Destination, Has.Count.EqualTo (moved.Source.Count), "Source and Destination UID counts do not match"); Assert.That (expunged, Is.EqualTo (21), "Expunged event"); Assert.That (changed, Is.EqualTo (1), "CountChanged event"); if (disableMove) client.Capabilities &= ~ImapCapabilities.Move; else client.Capabilities &= ~ImapCapabilities.UidPlus; expunged = changed = 0; moved = inbox.MoveTo (uids, archived); Assert.That (moved.Destination, Has.Count.EqualTo (moved.Source.Count), "Source and Destination UID counts do not match"); Assert.That (expunged, Is.EqualTo (21), "Expunged event"); Assert.That (changed, Is.EqualTo (1), "CountChanged event"); client.Disconnect (true); } } [TestCase (true, TestName = "TestUidMoveToDisableMoveAsync")] [TestCase (false, TestName = "TestUidMoveToDisableUidPlusAsync")] public async Task TestUidMoveToAsync (bool disableMove) { var commands = CreateUidMoveToCommands (disableMove); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } Assert.That (client.Capabilities.HasFlag (ImapCapabilities.UidPlus), Is.True, "Expected UIDPLUS extension"); var personal = client.GetFolder (client.PersonalNamespaces [0]); var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); var uids = await inbox.SearchAsync (SearchQuery.All); var archived = await personal.GetSubfolderAsync ("Archived Messages"); int changed = 0, expunged = 0; inbox.MessageExpunged += (o, e) => { expunged++; Assert.That (e.Index, Is.EqualTo (0), "Expunged event message index"); }; inbox.CountChanged += (o, e) => { changed++; }; // Test moving using the MOVE & UIDPLUS extensions var moved = await inbox.MoveToAsync (uids, archived); Assert.That (moved.Destination, Has.Count.EqualTo (moved.Source.Count), "Source and Destination UID counts do not match"); Assert.That (expunged, Is.EqualTo (21), "Expunged event"); Assert.That (changed, Is.EqualTo (1), "CountChanged event"); if (disableMove) client.Capabilities &= ~ImapCapabilities.Move; else client.Capabilities &= ~ImapCapabilities.UidPlus; expunged = changed = 0; moved = await inbox.MoveToAsync (uids, archived); Assert.That (moved.Destination, Has.Count.EqualTo (moved.Source.Count), "Source and Destination UID counts do not match"); Assert.That (expunged, Is.EqualTo (21), "Expunged event"); Assert.That (changed, Is.EqualTo (1), "CountChanged event"); await client.DisconnectAsync (true); } } static List CreateUidExpungeCommands (bool disableUidPlus) { var commands = new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), new ImapReplayCommand ("A00000005 SELECT INBOX (CONDSTORE)\r\n", "gmail.select-inbox.txt"), new ImapReplayCommand ("A00000006 UID SEARCH RETURN (ALL) ALL\r\n", "gmail.search.txt"), new ImapReplayCommand ("A00000007 UID STORE 1:3,5,7:9,11:14,26:29,31,34,41:43,50 +FLAGS.SILENT (\\Deleted)\r\n", ImapReplayCommandResponse.OK) }; if (!disableUidPlus) { commands.Add (new ImapReplayCommand ("A00000008 UID EXPUNGE 1:3\r\n", "gmail.expunge.txt")); commands.Add (new ImapReplayCommand ("A00000009 LOGOUT\r\n", "gmail.logout.txt")); } else { commands.Add (new ImapReplayCommand ("A00000008 UID SEARCH RETURN (ALL) DELETED NOT UID 1:3\r\n", "gmail.search-deleted-not-1-3.txt")); commands.Add (new ImapReplayCommand ("A00000009 UID STORE 5,7:9,11:14,26:29,31,34,41:43,50 -FLAGS.SILENT (\\Deleted)\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000010 EXPUNGE\r\n", "gmail.expunge.txt")); commands.Add (new ImapReplayCommand ("A00000011 UID STORE 5,7:9,11:14,26:29,31,34,41:43,50 +FLAGS.SILENT (\\Deleted)\r\n", ImapReplayCommandResponse.OK)); commands.Add (new ImapReplayCommand ("A00000012 LOGOUT\r\n", "gmail.logout.txt")); } return commands; } [TestCase (false, TestName = "TestUidExpunge")] [TestCase (true, TestName = "TestUidExpungeDisableUidPlus")] public void TestUidExpunge (bool disableUidPlus) { var commands = CreateUidExpungeCommands (disableUidPlus); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } int changed = 0, expunged = 0; var inbox = client.Inbox; inbox.Open (FolderAccess.ReadWrite); inbox.MessageExpunged += (o, e) => { expunged++; Assert.That (e.Index, Is.EqualTo (0), "Expunged event message index"); }; inbox.CountChanged += (o, e) => { changed++; }; var uids = inbox.Search (SearchQuery.All); inbox.AddFlags (uids, MessageFlags.Deleted, true); if (disableUidPlus) client.Capabilities &= ~ImapCapabilities.UidPlus; uids = new UniqueIdRange (0, 1, 3); inbox.Expunge (uids); Assert.That (expunged, Is.EqualTo (3), "Unexpected number of Expunged events"); Assert.That (changed, Is.EqualTo (1), "Unexpected number of CountChanged events"); Assert.That (inbox, Has.Count.EqualTo (18), "Count"); client.Disconnect (true); } } [TestCase (false, TestName = "TestUidExpungeAsync")] [TestCase (true, TestName = "TestUidExpungeDisableUidPlusAsync")] public async Task TestUidExpungeAsync (bool disableUidPlus) { var commands = CreateUidExpungeCommands (disableUidPlus); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } int changed = 0, expunged = 0; var inbox = client.Inbox; await inbox.OpenAsync (FolderAccess.ReadWrite); inbox.MessageExpunged += (o, e) => { expunged++; Assert.That (e.Index, Is.EqualTo (0), "Expunged event message index"); }; inbox.CountChanged += (o, e) => { changed++; }; var uids = await inbox.SearchAsync (SearchQuery.All); await inbox.AddFlagsAsync (uids, MessageFlags.Deleted, true); if (disableUidPlus) client.Capabilities &= ~ImapCapabilities.UidPlus; uids = new UniqueIdRange (0, 1, 3); await inbox.ExpungeAsync (uids); Assert.That (expunged, Is.EqualTo (3), "Unexpected number of Expunged events"); Assert.That (changed, Is.EqualTo (1), "Unexpected number of CountChanged events"); Assert.That (inbox, Has.Count.EqualTo (18), "Count"); await client.DisconnectAsync (true); } } static List CreateExplicitCountChangedCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), // INBOX has 1 message present in this test new ImapReplayCommand ("A00000005 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.count.examine.txt"), // The next response simulates an EXPUNGE notification followed by an explicit EXISTS notification. new ImapReplayCommand ("A00000006 NOOP\r\n", $"gmail.count-explicit.noop.txt"), new ImapReplayCommand ("A00000007 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestExplicitCountChanged () { var commands = CreateExplicitCountChangedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.Inbox.Open (FolderAccess.ReadOnly); int messageExpungedEmitted = 0; int messageExpungedIndex = -1; int messageExpungedCount = -1; int countChangedEmitted = 0; int countChangedValue = -1; client.Inbox.CountChanged += delegate { countChangedValue = client.Inbox.Count; countChangedEmitted++; }; client.Inbox.MessageExpunged += delegate (object sender, MessageEventArgs e) { messageExpungedCount = client.Inbox.Count; messageExpungedIndex = e.Index; messageExpungedEmitted++; }; client.NoOp (); Assert.That (client.Inbox, Has.Count.EqualTo (1), "Count"); Assert.That (countChangedEmitted, Is.EqualTo (1), "CountChanged was not emitted the expected number of times"); Assert.That (countChangedValue, Is.EqualTo (1), "Count was not correct inside of the CountChanged event handler"); Assert.That (messageExpungedIndex, Is.EqualTo (0), "The index of the expected message did not match"); Assert.That (messageExpungedEmitted, Is.EqualTo (1), "MessageExpunged was not emitted the expected number of times"); Assert.That (messageExpungedCount, Is.EqualTo (0), "Count was not correct inside of the MessageExpunged event handler"); client.Disconnect (true); } } [Test] public async Task TestExplicitCountChangedAsync () { var commands = CreateExplicitCountChangedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.Inbox.OpenAsync (FolderAccess.ReadOnly); int messageExpungedEmitted = 0; int messageExpungedIndex = -1; int messageExpungedCount = -1; int countChangedEmitted = 0; int countChangedValue = -1; client.Inbox.CountChanged += delegate { countChangedValue = client.Inbox.Count; countChangedEmitted++; }; client.Inbox.MessageExpunged += delegate (object sender, MessageEventArgs e) { messageExpungedCount = client.Inbox.Count; messageExpungedIndex = e.Index; messageExpungedEmitted++; }; await client.NoOpAsync (); Assert.That (client.Inbox, Has.Count.EqualTo (1), "Count"); Assert.That (countChangedEmitted, Is.EqualTo (1), "CountChanged was not emitted the expected number of times"); Assert.That (countChangedValue, Is.EqualTo (1), "Count was not correct inside of the CountChanged event handler"); Assert.That (messageExpungedIndex, Is.EqualTo (0), "The index of the expected message did not match"); Assert.That (messageExpungedEmitted, Is.EqualTo (1), "MessageExpunged was not emitted the expected number of times"); Assert.That (messageExpungedCount, Is.EqualTo (0), "Count was not correct inside of the MessageExpunged event handler"); await client.DisconnectAsync (true); } } static List CreateImplicitCountChangedCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), // INBOX has 1 message present in this test new ImapReplayCommand ("A00000005 EXAMINE INBOX (CONDSTORE)\r\n", "gmail.count.examine.txt"), // The next response simulates an EXPUNGE notification without an explicit EXISTS notification. new ImapReplayCommand ("A00000006 NOOP\r\n", $"gmail.count-implicit.noop.txt"), new ImapReplayCommand ("A00000007 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestImplicitCountChanged () { var commands = CreateImplicitCountChangedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } client.Inbox.Open (FolderAccess.ReadOnly); int messageExpungedEmitted = 0; int messageExpungedIndex = -1; int messageExpungedCount = -1; int countChangedEmitted = 0; int countChangedValue = -1; client.Inbox.CountChanged += delegate { countChangedValue = client.Inbox.Count; countChangedEmitted++; }; client.Inbox.MessageExpunged += delegate (object sender, MessageEventArgs e) { messageExpungedCount = client.Inbox.Count; messageExpungedIndex = e.Index; messageExpungedEmitted++; }; client.NoOp (); Assert.That (client.Inbox, Has.Count.EqualTo (0), "Count"); Assert.That (countChangedEmitted, Is.EqualTo (1), "CountChanged was not emitted the expected number of times"); Assert.That (countChangedValue, Is.EqualTo (0), "Count was not correct inside of the CountChanged event handler"); Assert.That (messageExpungedIndex, Is.EqualTo (0), "The index of the expected message did not match"); Assert.That (messageExpungedEmitted, Is.EqualTo (1), "MessageExpunged was not emitted the expected number of times"); Assert.That (messageExpungedCount, Is.EqualTo (0), "Count was not correct inside of the MessageExpunged event handler"); client.Disconnect (true); } } [Test] public async Task TestImplicitCountChangedAsync () { var commands = CreateImplicitCountChangedCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } await client.Inbox.OpenAsync (FolderAccess.ReadOnly); int messageExpungedEmitted = 0; int messageExpungedIndex = -1; int messageExpungedCount = -1; int countChangedEmitted = 0; int countChangedValue = -1; client.Inbox.CountChanged += delegate { countChangedValue = client.Inbox.Count; countChangedEmitted++; }; client.Inbox.MessageExpunged += delegate (object sender, MessageEventArgs e) { messageExpungedCount = client.Inbox.Count; messageExpungedIndex = e.Index; messageExpungedEmitted++; }; await client.NoOpAsync (); Assert.That (client.Inbox, Has.Count.EqualTo (0), "Count"); Assert.That (countChangedEmitted, Is.EqualTo (1), "CountChanged was not emitted the expected number of times"); Assert.That (countChangedValue, Is.EqualTo (0), "Count was not correct inside of the CountChanged event handler"); Assert.That (messageExpungedIndex, Is.EqualTo (0), "The index of the expected message did not match"); Assert.That (messageExpungedEmitted, Is.EqualTo (1), "MessageExpunged was not emitted the expected number of times"); Assert.That (messageExpungedCount, Is.EqualTo (0), "Count was not correct inside of the MessageExpunged event handler"); await client.DisconnectAsync (true); } } static void AssertFolder (IMailFolder folder, string fullName, FolderAttributes attributes, bool subscribed, ulong highestmodseq, int count, int recent, uint uidnext, uint validity, int unread) { if (subscribed) attributes |= FolderAttributes.Subscribed; Assert.That (folder.FullName, Is.EqualTo (fullName), "FullName"); Assert.That (folder.Attributes, Is.EqualTo (attributes), "Attributes"); Assert.That (folder.IsSubscribed, Is.EqualTo (subscribed), "IsSubscribed"); Assert.That (folder.HighestModSeq, Is.EqualTo (highestmodseq), "HighestModSeq"); Assert.That (folder, Has.Count.EqualTo (count), "Count"); Assert.That (folder.Recent, Is.EqualTo (recent), "Recent"); Assert.That (folder.Unread, Is.EqualTo (unread), "Unread"); Assert.That (folder.UidNext.HasValue ? folder.UidNext.Value.Id : (uint)0, Is.EqualTo (uidnext), "UidNext"); Assert.That (folder.UidValidity, Is.EqualTo (validity), "UidValidity"); } static List CreateGetSubfoldersWithStatusItemsCommands () { return new List { new ImapReplayCommand ("", "gmail.greeting.txt"), new ImapReplayCommand ("A00000000 CAPABILITY\r\n", "gmail.capability.txt"), new ImapReplayCommand ("A00000001 AUTHENTICATE PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.authenticate.txt"), new ImapReplayCommand ("A00000002 NAMESPACE\r\n", "gmail.namespace.txt"), new ImapReplayCommand ("A00000003 LIST \"\" \"INBOX\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-inbox.txt"), new ImapReplayCommand ("A00000004 XLIST \"\" \"*\"\r\n", "gmail.xlist.txt"), //new ImapReplayCommand ("A00000005 LIST \"\" \"[Gmail]\"\r\n", "gmail.list-gmail.txt"), new ImapReplayCommand ("A00000005 LIST (SUBSCRIBED) \"\" \"[Gmail]/%\" RETURN (CHILDREN STATUS (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ))\r\n", "gmail.list-gmail-subfolders.txt"), new ImapReplayCommand ("A00000006 LIST \"\" \"[Gmail]/%\" RETURN (SUBSCRIBED CHILDREN)\r\n", "gmail.list-gmail-subfolders-no-status.txt"), new ImapReplayCommand ("A00000007 STATUS \"[Gmail]/All Mail\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)\r\n", "gmail.status-all-mail.txt"), new ImapReplayCommand ("A00000008 STATUS \"[Gmail]/Drafts\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)\r\n", "gmail.status-drafts.txt"), new ImapReplayCommand ("A00000009 STATUS \"[Gmail]/Important\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)\r\n", "gmail.status-important.txt"), new ImapReplayCommand ("A00000010 STATUS \"[Gmail]/Sent Mail\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)\r\n", "gmail.status-all-mail.txt"), new ImapReplayCommand ("A00000011 STATUS \"[Gmail]/Spam\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)\r\n", "gmail.status-drafts.txt"), new ImapReplayCommand ("A00000012 STATUS \"[Gmail]/Starred\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)\r\n", "gmail.status-important.txt"), new ImapReplayCommand ("A00000013 STATUS \"[Gmail]/Trash\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)\r\n", "gmail.status-all-mail.txt"), new ImapReplayCommand ("A00000014 LOGOUT\r\n", "gmail.logout.txt") }; } [Test] public void TestGetSubfoldersWithStatusItems () { var commands = CreateGetSubfoldersWithStatusItemsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } Assert.That (client.IsConnected, Is.True, "Client failed to connect."); try { client.Authenticate ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var personal = client.GetFolder (client.PersonalNamespaces[0]); var gmail = personal.GetSubfolder ("[Gmail]"); var all = StatusItems.Count | StatusItems.HighestModSeq | StatusItems.Recent | StatusItems.UidNext | StatusItems.UidValidity | StatusItems.Unread; var folders = gmail.GetSubfolders (all, true); Assert.That (folders, Has.Count.EqualTo (7), "Unexpected folder count."); AssertFolder (folders[0], "[Gmail]/All Mail", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3); AssertFolder (folders[1], "[Gmail]/Drafts", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0); AssertFolder (folders[2], "[Gmail]/Important", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0); AssertFolder (folders[3], "[Gmail]/Sent Mail", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0); AssertFolder (folders[4], "[Gmail]/Spam", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0); AssertFolder (folders[5], "[Gmail]/Starred", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0); AssertFolder (folders[6], "[Gmail]/Trash", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0); // Now make the same query but disable LIST-STATUS client.Capabilities &= ~ImapCapabilities.ListStatus; folders = gmail.GetSubfolders (all, false); Assert.That (folders, Has.Count.EqualTo (7), "Unexpected folder count."); AssertFolder (folders[0], "[Gmail]/All Mail", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3); AssertFolder (folders[1], "[Gmail]/Drafts", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0); AssertFolder (folders[2], "[Gmail]/Important", FolderAttributes.HasNoChildren | FolderAttributes.Important | FolderAttributes.Marked, true, 41234, 58, 0, 307, 9, 0); AssertFolder (folders[3], "[Gmail]/Sent Mail", FolderAttributes.HasNoChildren | FolderAttributes.Sent | FolderAttributes.Unmarked, true, 41234, 4, 0, 7, 5, 0); AssertFolder (folders[4], "[Gmail]/Spam", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0); AssertFolder (folders[5], "[Gmail]/Starred", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0); AssertFolder (folders[6], "[Gmail]/Trash", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", FolderAttributes.HasNoChildren | FolderAttributes.Important | FolderAttributes.Marked, true, 41234, 58, 0, 307, 9, 0); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", FolderAttributes.HasNoChildren | FolderAttributes.Sent | FolderAttributes.Unmarked, true, 41234, 4, 0, 7, 5, 0); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0); client.Disconnect (true); } } [Test] public async Task TestGetSubfoldersWithStatusItemsAsync () { var commands = CreateGetSubfoldersWithStatusItemsCommands (); using (var client = new ImapClient () { TagPrefix = 'A' }) { try { await client.ConnectAsync (new ImapReplayStream (commands, true), "localhost", 143, SecureSocketOptions.None); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Connect: {ex}"); } try { await client.AuthenticateAsync ("username", "password"); } catch (Exception ex) { Assert.Fail ($"Did not expect an exception in Authenticate: {ex}"); } var personal = client.GetFolder (client.PersonalNamespaces[0]); var gmail = await personal.GetSubfolderAsync ("[Gmail]"); var all = StatusItems.Count | StatusItems.HighestModSeq | StatusItems.Recent | StatusItems.UidNext | StatusItems.UidValidity | StatusItems.Unread; var folders = await gmail.GetSubfoldersAsync (all, true); Assert.That (folders, Has.Count.EqualTo (7), "Unexpected folder count."); AssertFolder (folders[0], "[Gmail]/All Mail", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3); AssertFolder (folders[1], "[Gmail]/Drafts", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0); AssertFolder (folders[2], "[Gmail]/Important", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0); AssertFolder (folders[3], "[Gmail]/Sent Mail", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0); AssertFolder (folders[4], "[Gmail]/Spam", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0); AssertFolder (folders[5], "[Gmail]/Starred", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0); AssertFolder (folders[6], "[Gmail]/Trash", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", FolderAttributes.HasNoChildren | FolderAttributes.Important, true, 41234, 58, 0, 307, 9, 0); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", FolderAttributes.HasNoChildren | FolderAttributes.Sent, true, 41234, 4, 0, 7, 5, 0); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0); // Now make the same query but disable LIST-STATUS client.Capabilities &= ~ImapCapabilities.ListStatus; folders = await gmail.GetSubfoldersAsync (all, false); Assert.That (folders, Has.Count.EqualTo (7), "Unexpected folder count."); AssertFolder (folders[0], "[Gmail]/All Mail", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3); AssertFolder (folders[1], "[Gmail]/Drafts", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0); AssertFolder (folders[2], "[Gmail]/Important", FolderAttributes.HasNoChildren | FolderAttributes.Important | FolderAttributes.Marked, true, 41234, 58, 0, 307, 9, 0); AssertFolder (folders[3], "[Gmail]/Sent Mail", FolderAttributes.HasNoChildren | FolderAttributes.Sent | FolderAttributes.Unmarked, true, 41234, 4, 0, 7, 5, 0); AssertFolder (folders[4], "[Gmail]/Spam", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0); AssertFolder (folders[5], "[Gmail]/Starred", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0); AssertFolder (folders[6], "[Gmail]/Trash", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0); AssertFolder (client.GetFolder (SpecialFolder.All), "[Gmail]/All Mail", FolderAttributes.HasNoChildren | FolderAttributes.All, true, 41234, 67, 0, 1210, 11, 3); AssertFolder (client.GetFolder (SpecialFolder.Drafts), "[Gmail]/Drafts", FolderAttributes.HasNoChildren | FolderAttributes.Drafts, true, 41234, 0, 0, 1, 6, 0); AssertFolder (client.GetFolder (SpecialFolder.Important), "[Gmail]/Important", FolderAttributes.HasNoChildren | FolderAttributes.Important | FolderAttributes.Marked, true, 41234, 58, 0, 307, 9, 0); AssertFolder (client.GetFolder (SpecialFolder.Sent), "[Gmail]/Sent Mail", FolderAttributes.HasNoChildren | FolderAttributes.Sent | FolderAttributes.Unmarked, true, 41234, 4, 0, 7, 5, 0); AssertFolder (client.GetFolder (SpecialFolder.Junk), "[Gmail]/Spam", FolderAttributes.HasNoChildren | FolderAttributes.Junk, true, 41234, 0, 0, 1, 3, 0); AssertFolder (client.GetFolder (SpecialFolder.Flagged), "[Gmail]/Starred", FolderAttributes.HasNoChildren | FolderAttributes.Flagged, true, 41234, 1, 0, 7, 4, 0); AssertFolder (client.GetFolder (SpecialFolder.Trash), "[Gmail]/Trash", FolderAttributes.HasNoChildren | FolderAttributes.Trash, true, 41234, 0, 0, 1143, 2, 0); await client.DisconnectAsync (true); } } } } ================================================ FILE: UnitTests/Net/Imap/ImapImplementationTests.cs ================================================ // // ImapImplementationTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapImplementationTests { [Test] public void TestImapImplementationProperties () { var impl = new ImapImplementation (); impl.Address = "50 Church St."; Assert.That (impl.Address, Is.EqualTo ("50 Church St."), "Address"); impl.Arguments = "-p -q"; Assert.That (impl.Arguments, Is.EqualTo ("-p -q"), "Arguments"); impl.Command = "mono ./imap.exe"; Assert.That (impl.Command, Is.EqualTo ("mono ./imap.exe"), "Command"); impl.Environment = "MONO_GC=sgen"; Assert.That (impl.Environment, Is.EqualTo ("MONO_GC=sgen"), "Environment"); impl.Name = "MailKit"; Assert.That (impl.Name, Is.EqualTo ("MailKit"), "Name"); impl.OS = "Windows"; Assert.That (impl.OS, Is.EqualTo ("Windows"), "OS"); impl.OSVersion = "6.1"; Assert.That (impl.OSVersion, Is.EqualTo ("6.1"), "OSVersion"); impl.ReleaseDate = "${Date}"; Assert.That (impl.ReleaseDate, Is.EqualTo ("${Date}"), "ReleaseDate"); impl.SupportUrl = "https://github.com/jstedfast/MailKit"; Assert.That (impl.SupportUrl, Is.EqualTo ("https://github.com/jstedfast/MailKit"), "SupportUrl"); impl.Vendor = "Microsoft"; Assert.That (impl.Vendor, Is.EqualTo ("Microsoft"), "Vendor"); impl.Version = "2.0.7"; Assert.That (impl.Version, Is.EqualTo ("2.0.7"), "Version"); } } } ================================================ FILE: UnitTests/Net/Imap/ImapReplayStream.cs ================================================ // // ImapReplayStream.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using MimeKit.IO; using MimeKit.IO.Filters; using MailKit; namespace UnitTests.Net.Imap { enum ImapReplayCommandResponse { OK, NO, BAD, Plus } class ImapReplayFilter : MimeFilterBase { readonly byte[] variable; readonly byte[] value; public ImapReplayFilter (string variable, string value) { this.variable = Encoding.ASCII.GetBytes (variable); this.value = Encoding.ASCII.GetBytes (value); } protected override byte[] Filter (byte[] input, int startIndex, int length, out int outputIndex, out int outputLength, bool flush) { int endIndex = startIndex + length; int copyIndex = startIndex; int copyLength = 0; for (int index = startIndex; index < endIndex - variable.Length; index++) { var matched = true; for (int i = 0; i < variable.Length; i++) { if (input[index + i] != variable[i]) { matched = false; break; } } if (!matched) continue; int n = index - copyIndex; EnsureOutputSize (copyLength + n + value.Length, true); Buffer.BlockCopy (input, copyIndex, OutputBuffer, copyLength, n); index += variable.Length; copyIndex = index; copyLength += n; Buffer.BlockCopy (value, 0, OutputBuffer, copyLength, value.Length); copyLength += value.Length; } if (flush) { if (copyLength == 0) { outputIndex = startIndex; outputLength = length; return input; } int n = endIndex - copyIndex; EnsureOutputSize (copyLength + n, true); Buffer.BlockCopy (input, copyIndex, OutputBuffer, copyLength, n); copyLength += n; outputLength = copyLength; outputIndex = 0; return OutputBuffer; } else { int n = Math.Min (variable.Length, length); SaveRemainingInput (input, endIndex - n, n); if (copyLength == 0) { outputLength = length - n; outputIndex = startIndex; return input; } endIndex -= n; if (endIndex > copyIndex) { n = endIndex - copyIndex; EnsureOutputSize (copyLength + n, true); Buffer.BlockCopy (input, copyIndex, OutputBuffer, copyLength, n); copyLength += n; } outputLength = copyLength; outputIndex = 0; return OutputBuffer; } } public override void Reset () { base.Reset (); } } class ImapReplayCommand { static readonly Encoding Latin1 = Encoding.GetEncoding (28591); public Encoding Encoding { get; private set; } public byte[] CommandBuffer { get; private set; } public string Command { get; private set; } public byte[] Response { get; private set; } public bool Compressed { get; private set; } public ImapReplayCommand (string command, byte[] response, bool compressed = false) : this (Latin1, command, response, compressed) { } public ImapReplayCommand (Encoding encoding, string command, byte[] response, bool compressed = false) { CommandBuffer = encoding.GetBytes (command); Compressed = compressed; Response = response; Encoding = encoding; Command = command; if (compressed) { using (var memory = new MemoryStream ()) { using (var compress = new CompressedStream (memory)) { compress.Write (CommandBuffer, 0, CommandBuffer.Length); compress.Flush (); CommandBuffer = memory.ToArray (); } } using (var memory = new MemoryStream ()) { using (Stream compress = new CompressedStream (memory)) { compress.Write (response, 0, response.Length); compress.Flush (); Response = memory.ToArray (); } } } } public ImapReplayCommand (string command, string resource, bool compressed = false) : this (Latin1, command, resource, compressed) { } public ImapReplayCommand (Encoding encoding, string command, string resource, bool compressed = false) { string tag = null; CommandBuffer = encoding.GetBytes (command); Compressed = compressed; Encoding = encoding; Command = command; if (command.StartsWith ("A00000", StringComparison.Ordinal)) tag = command.Substring (0, 9); using (var stream = GetType ().Assembly.GetManifestResourceStream ("UnitTests.Net.Imap.Resources." + resource)) { using (var memory = new MemoryBlockStream ()) { using (Stream compress = new CompressedStream (memory)) { using (var filtered = new FilteredStream (compressed ? compress : memory)) { if (tag != null) filtered.Add (new ImapReplayFilter ("A########", tag)); filtered.Add (new Unix2DosFilter ()); stream.CopyTo (filtered, 4096); filtered.Flush (); } Response = memory.ToArray (); } } } if (compressed) { using (var memory = new MemoryStream ()) { using (var compress = new CompressedStream (memory)) { compress.Write (CommandBuffer, 0, CommandBuffer.Length); compress.Flush (); CommandBuffer = memory.ToArray (); } } } } public ImapReplayCommand (string tag, string command, string resource, bool compressed = false) : this (Latin1, tag, command, resource, compressed) { } public ImapReplayCommand (Encoding encoding, string tag, string command, string resource, bool compressed = false) { CommandBuffer = encoding.GetBytes (command); Compressed = compressed; Encoding = encoding; Command = command; using (var stream = GetType ().Assembly.GetManifestResourceStream ("UnitTests.Net.Imap.Resources." + resource)) { using (var memory = new MemoryBlockStream ()) { using (Stream compress = new CompressedStream (memory)) { using (var filtered = new FilteredStream (compressed ? compress : memory)) { filtered.Add (new ImapReplayFilter ("A########", tag)); filtered.Add (new Unix2DosFilter ()); stream.CopyTo (filtered, 4096); filtered.Flush (); } Response = memory.ToArray (); } } } if (compressed) { using (var memory = new MemoryStream ()) { using (var compress = new CompressedStream (memory)) { compress.Write (CommandBuffer, 0, CommandBuffer.Length); compress.Flush (); CommandBuffer = memory.ToArray (); } } } } public ImapReplayCommand (string command, ImapReplayCommandResponse response, bool compressed = false) : this (Latin1, command, response, compressed) { } public ImapReplayCommand (Encoding encoding, string command, ImapReplayCommandResponse response, bool compressed = false) { CommandBuffer = encoding.GetBytes (command); Compressed = compressed; Encoding = encoding; Command = command; string text; if (response == ImapReplayCommandResponse.Plus) { text = "+\r\n"; } else { var tokens = command.Split (' '); var cmd = (tokens [1] == "UID" ? tokens [2] : tokens [1]).TrimEnd (); var tag = tokens [0]; text = string.Format ("{0} {1} {2} {3}\r\n", tag, response, cmd, response == ImapReplayCommandResponse.OK ? "completed" : "failed"); } if (compressed) { using (var memory = new MemoryStream ()) { using (var compress = new CompressedStream (memory)) { var buffer = encoding.GetBytes (text); compress.Write (buffer, 0, buffer.Length); compress.Flush (); Response = memory.ToArray (); } } using (var memory = new MemoryStream ()) { using (var compress = new CompressedStream (memory)) { compress.Write (CommandBuffer, 0, CommandBuffer.Length); compress.Flush (); CommandBuffer = memory.ToArray (); } } } else { Response = encoding.GetBytes (text); } } } enum ImapReplayState { SendResponse, WaitForCommand, } class ImapReplayStream : Stream { readonly MemoryStream sent = new MemoryStream (); readonly IList commands; readonly bool testUnixFormat; readonly bool asyncIO; ImapReplayState state; int timeout = 100000; Stream stream; bool disposed; bool isAsync; bool done; int index; public ImapReplayStream (IList commands, bool asyncIO, bool testUnixFormat = false) { stream = GetResponseStream (commands[0]); state = ImapReplayState.SendResponse; this.testUnixFormat = testUnixFormat; this.commands = commands; this.asyncIO = asyncIO; } void CheckDisposed () { if (disposed) throw new ObjectDisposedException ("ImapReplayStream"); } #region implemented abstract members of Stream public override bool CanRead { get { return true; } } public override bool CanSeek { get { return true; } } public override bool CanWrite { get { return true; } } public override bool CanTimeout { get { return true; } } public override long Length { get { return stream.Length; } } public override long Position { get { return stream.Position; } set { throw new NotSupportedException (); } } public override int ReadTimeout { get { return timeout; } set { timeout = value; } } public override int WriteTimeout { get { return timeout; } set { timeout = value; } } public override int Read (byte[] buffer, int offset, int count) { CheckDisposed (); if (asyncIO) { Assert.That (isAsync, Is.True, "Trying to Read in an async unit test."); } else { Assert.That (isAsync, Is.False, "Trying to ReadAsync in a non-async unit test."); } if (state != ImapReplayState.SendResponse) { if (index >= commands.Count) return 0; var command = GetSentCommand (); Assert.That (state, Is.EqualTo (ImapReplayState.SendResponse), $"Trying to read before command received. Sent so far: {command}"); } Assert.That (stream, Is.Not.Null, "Trying to read when no data available."); int nread = stream.Read (buffer, offset, count); if (stream.Position == stream.Length) { state = ImapReplayState.WaitForCommand; index++; } return nread; } public override Task ReadAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { isAsync = true; try { return Task.FromResult (Read (buffer, offset, count)); } finally { isAsync = false; } } Stream GetResponseStream (ImapReplayCommand command) { MemoryStream memory; if (testUnixFormat && !command.Compressed) { memory = new MemoryStream (); using (var filtered = new FilteredStream (memory)) { filtered.Add (new Dos2UnixFilter ()); filtered.Write (command.Response, 0, command.Response.Length); filtered.Flush (); } memory.Position = 0; } else { memory = new MemoryStream (command.Response, false); } return memory; } string GetSentCommand () { if (!commands[index].Compressed) return commands[index].Encoding.GetString (sent.GetBuffer (), 0, (int) sent.Length); using (var memory = new MemoryStream (sent.GetBuffer (), 0, (int) sent.Length)) { using (var compressed = new CompressedStream (memory)) { using (var decompressed = new MemoryStream ()) { compressed.CopyTo (decompressed, 4096); return commands[index].Encoding.GetString (decompressed.GetBuffer (), 0, (int) decompressed.Length); } } } } public override void Write (byte[] buffer, int offset, int count) { CheckDisposed (); if (asyncIO) { if (count != 6 || Encoding.ASCII.GetString (buffer, offset, count) != "DONE\r\n") Assert.That (isAsync, Is.True, "Trying to Write in an async unit test."); else done = true; } else { if (count != 6 || Encoding.ASCII.GetString (buffer, offset, count) != "DONE\r\n") Assert.That (isAsync, Is.False, "Trying to WriteAsync in a non-async unit test."); else done = true; } Assert.That (state, Is.EqualTo (ImapReplayState.WaitForCommand), "Trying to write when a command has already been given."); sent.Write (buffer, offset, count); if (sent.Length >= commands[index].CommandBuffer.Length) { var command = GetSentCommand (); Assert.That (command, Is.EqualTo (commands[index].Command), "Commands did not match."); stream?.Dispose (); stream = GetResponseStream (commands[index]); state = ImapReplayState.SendResponse; sent.SetLength (0); } } public override Task WriteAsync (byte[] buffer, int offset, int count, CancellationToken cancellationToken) { isAsync = true; try { Write (buffer, offset, count); return Task.FromResult (true); } finally { isAsync = false; } } public override void Flush () { CheckDisposed (); Assert.That (asyncIO && !done, Is.False, "Trying to Flush in an async unit test."); done = false; } public override Task FlushAsync (CancellationToken cancellationToken) { CheckDisposed (); Assert.That (asyncIO || done, Is.True, "Trying to FlushAsync in a non-async unit test."); done = false; return Task.FromResult (true); } public override long Seek (long offset, SeekOrigin origin) { throw new NotSupportedException (); } public override void SetLength (long value) { throw new NotSupportedException (); } #endregion protected override void Dispose (bool disposing) { stream?.Dispose (); base.Dispose (disposing); disposed = true; } } } ================================================ FILE: UnitTests/Net/Imap/ImapSearchQueryOptimizerTests.cs ================================================ // // ImapSearchQueryOptimizerTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using MailKit; using MailKit.Search; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapSearchQueryOptimizerTests { readonly ImapSearchQueryOptimizer optimizer = new ImapSearchQueryOptimizer (); [Test] public void TestReduceAnd () { var query = optimizer.Reduce (SearchQuery.And (SearchQuery.All, SearchQuery.Answered)); Assert.That (query, Is.EqualTo (SearchQuery.Answered)); query = optimizer.Reduce (SearchQuery.And (SearchQuery.Answered, SearchQuery.All)); Assert.That (query, Is.EqualTo (SearchQuery.Answered)); } [Test] public void TestReduceOr () { var query = optimizer.Reduce (SearchQuery.Or (SearchQuery.All, SearchQuery.Answered)); Assert.That (query, Is.EqualTo (SearchQuery.All)); query = optimizer.Reduce (SearchQuery.Or (SearchQuery.Answered, SearchQuery.All)); Assert.That (query, Is.EqualTo (SearchQuery.All)); } [Test] public void TestReduceNotFlags () { foreach (MessageFlags flag in Enum.GetValues (typeof (MessageFlags))) { if (flag == MessageFlags.None || flag == MessageFlags.UserDefined) continue; var query = SearchQuery.Not (SearchQuery.HasFlags (flag)); var optimized = optimizer.Reduce (query); Assert.That (optimized.Term.ToString (), Is.EqualTo ("Not" + flag.ToString ()), $"NOT ({flag})"); query = SearchQuery.Not (SearchQuery.NotFlags (flag)); optimized = optimizer.Reduce (query); Assert.That (optimized.Term.ToString (), Is.EqualTo (flag.ToString ()), $"NOT ({query.Operand.Term})"); query = SearchQuery.Not (SearchQuery.Not (SearchQuery.HasFlags (flag))); optimized = optimizer.Reduce (query); Assert.That (optimized.Term.ToString (), Is.EqualTo (flag.ToString ()), $"NOT (NOT ({flag}))"); } } [Test] public void TestReduceNotFlag () { var query = SearchQuery.Not (SearchQuery.HasKeyword ("custom")); var optimized = optimizer.Reduce (query); Assert.That (optimized.Term, Is.EqualTo (SearchTerm.NotKeyword), "NOT KEYWORD"); query = SearchQuery.Not (SearchQuery.NotKeyword ("custom")); optimized = optimizer.Reduce (query); Assert.That (optimized.Term, Is.EqualTo (SearchTerm.Keyword), $"NOT NOTKEYWORD"); query = SearchQuery.Not (SearchQuery.Not (SearchQuery.HasKeyword ("custom"))); optimized = optimizer.Reduce (query); Assert.That (optimized.Term, Is.EqualTo (SearchTerm.Keyword), "NOT NOT KEYWORD"); } } } ================================================ FILE: UnitTests/Net/Imap/ImapStreamTests.cs ================================================ // // ImapStreamTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using System.Security.Cryptography; using MailKit; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapStreamTests { [Test] public void TestCanReadWriteSeek () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { Assert.That (stream.CanRead, Is.True); Assert.That (stream.CanWrite, Is.True); Assert.That (stream.CanSeek, Is.False); Assert.That (stream.CanTimeout, Is.True); } } [Test] public void TestGetSetTimeouts () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { stream.ReadTimeout = 5; Assert.That (stream.ReadTimeout, Is.EqualTo (5), "ReadTimeout"); stream.WriteTimeout = 7; Assert.That (stream.WriteTimeout, Is.EqualTo (7), "WriteTimeout"); } } [Test] public void TestRead () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes ("This is some random text...\r\n"); var buffer = new byte[32]; int n; Assert.Throws (() => stream.Read (null, 0, buffer.Length)); Assert.Throws (() => stream.Read (buffer, -1, buffer.Length)); Assert.Throws (() => stream.Read (buffer, 0, -1)); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; stream.LiteralLength = data.Length; stream.Mode = ImapStreamMode.Token; n = stream.Read (buffer, 0, buffer.Length); Assert.That (n, Is.EqualTo (0), "ImapStreamMode.Token"); stream.Mode = ImapStreamMode.Literal; n = stream.Read (buffer, 0, buffer.Length); Assert.That (n, Is.EqualTo (data.Length), "ImapStreamMode.Literal"); Assert.That (Encoding.ASCII.GetString (buffer, 0, n), Is.EqualTo ("This is some random text...\r\n"), "Read"); } } [Test] public async Task TestReadAsync () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes ("This is some random text...\r\n"); var buffer = new byte[32]; int n; Assert.ThrowsAsync (async () => await stream.ReadAsync (null, 0, buffer.Length)); Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, -1, buffer.Length)); Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, 0, -1)); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; stream.LiteralLength = data.Length; stream.Mode = ImapStreamMode.Token; n = await stream.ReadAsync (buffer, 0, buffer.Length); Assert.That (n, Is.EqualTo (0), "ImapStreamMode.Token"); stream.Mode = ImapStreamMode.Literal; n = await stream.ReadAsync (buffer, 0, buffer.Length); Assert.That (n, Is.EqualTo (data.Length), "Read"); Assert.That (Encoding.ASCII.GetString (buffer, 0, n), Is.EqualTo ("This is some random text...\r\n"), "Read"); } } [Test] public void TestReadLine () { var line1 = "This is a really long line..." + new string ('.', 4096) + "\r\n"; var line2 = "And this is another line...\r\n"; using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes (line1 + line2); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; using (var builder = new ByteArrayBuilder (64)) { while (!stream.ReadLine (builder, CancellationToken.None)) ; var text = builder.ToString (); Assert.That (text, Is.EqualTo (line1), "Line1"); } using (var builder = new ByteArrayBuilder (64)) { while (!stream.ReadLine (builder, CancellationToken.None)) ; var text = builder.ToString (); Assert.That (text, Is.EqualTo (line2), "Line2"); } } } [Test] public async Task TestReadLineAsync () { var line1 = "This is a really long line..." + new string ('.', 4096) + "\r\n"; var line2 = "And this is another line...\r\n"; using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes (line1 + line2); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; using (var builder = new ByteArrayBuilder (64)) { while (!await stream.ReadLineAsync (builder, CancellationToken.None)) ; var text = builder.ToString (); Assert.That (text, Is.EqualTo (line1), "Line1"); } using (var builder = new ByteArrayBuilder (64)) { while (!await stream.ReadLineAsync (builder, CancellationToken.None)) ; var text = builder.ToString (); Assert.That (text, Is.EqualTo (line2), "Line2"); } } } [Test] public void TestReadToken () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes ("* atom (\\flag \"qstring\" NIL Nil nil) [] \r\n"); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; Assert.Throws (() => stream.UngetToken (null)); var token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Asterisk)); Assert.That (token.ToString (), Is.EqualTo ("'*'")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Atom)); Assert.That (token.ToString (), Is.EqualTo ("atom")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.OpenParen)); Assert.That (token.ToString (), Is.EqualTo ("'('")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Flag)); Assert.That (token.ToString (), Is.EqualTo ("\\flag")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.QString)); Assert.That (token.ToString (), Is.EqualTo ("\"qstring\"")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Nil)); Assert.That (token.ToString (), Is.EqualTo ("NIL")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Nil)); Assert.That (token.ToString (), Is.EqualTo ("Nil")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Nil)); Assert.That (token.ToString (), Is.EqualTo ("nil")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.CloseParen)); Assert.That (token.ToString (), Is.EqualTo ("')'")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.OpenBracket)); Assert.That (token.ToString (), Is.EqualTo ("'['")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.CloseBracket)); Assert.That (token.ToString (), Is.EqualTo ("']'")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln)); Assert.That (token.ToString (), Is.EqualTo ("'\\n'")); stream.UngetToken (token); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln)); Assert.That (token.ToString (), Is.EqualTo ("'\\n'")); } } [Test] public async Task TestReadTokenAsync () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes ("* atom (\\flag \"qstring\" NIL Nil nil) [] \r\n"); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; Assert.Throws (() => stream.UngetToken (null)); var token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Asterisk)); Assert.That (token.ToString (), Is.EqualTo ("'*'")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Atom)); Assert.That (token.ToString (), Is.EqualTo ("atom")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.OpenParen)); Assert.That (token.ToString (), Is.EqualTo ("'('")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Flag)); Assert.That (token.ToString (), Is.EqualTo ("\\flag")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.QString)); Assert.That (token.ToString (), Is.EqualTo ("\"qstring\"")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Nil)); Assert.That (token.ToString (), Is.EqualTo ("NIL")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Nil)); Assert.That (token.ToString (), Is.EqualTo ("Nil")); token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Nil)); Assert.That (token.ToString (), Is.EqualTo ("nil")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.CloseParen)); Assert.That (token.ToString (), Is.EqualTo ("')'")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.OpenBracket)); Assert.That (token.ToString (), Is.EqualTo ("'['")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.CloseBracket)); Assert.That (token.ToString (), Is.EqualTo ("']'")); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln)); Assert.That (token.ToString (), Is.EqualTo ("'\\n'")); stream.UngetToken (token); token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln)); Assert.That (token.ToString (), Is.EqualTo ("'\\n'")); } } [Test] public void TestReadContinuationToken () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes ("+ Please continue...\r\n"); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; var token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Atom)); Assert.That (token.ToString (), Is.EqualTo ("+")); } } [Test] public async Task TestReadContinuationTokenAsync () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes ("+ Please continue...\r\n"); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; var token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Atom)); Assert.That (token.ToString (), Is.EqualTo ("+")); } } [Test] public void TestReadBrokenLiteralToken () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes ("{4096+" + new string (' ', 4096) + "}" + new string (' ', 4096) + "\r\n"); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; var token = stream.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Literal)); Assert.That (token.ToString (), Is.EqualTo ("{4096}")); } } [Test] public async Task TestReadBrokenLiteralTokenAsync () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var data = Encoding.ASCII.GetBytes ("{4096+" + new string (' ', 4096) + "}" + new string (' ', 4096) + "\r\n"); stream.Stream.Write (data, 0, data.Length); stream.Stream.Position = 0; var token = await stream.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Literal)); Assert.That (token.ToString (), Is.EqualTo ("{4096}")); } } [Test] public void TestSeek () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { Assert.Throws (() => stream.Seek (0, SeekOrigin.Begin)); Assert.Throws (() => stream.Position = 500); Assert.That (stream.Position, Is.EqualTo (0)); Assert.That (stream.Length, Is.EqualTo (0)); } } [Test] public void TestSetLength () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { Assert.Throws (() => stream.SetLength (500)); } } [Test] public void TestWrite () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var buf1k = RandomNumberGenerator.GetBytes (1024); var buf4k = RandomNumberGenerator.GetBytes (4096); var buf9k = RandomNumberGenerator.GetBytes (9216); var memory = (MemoryStream) stream.Stream; var buffer = new byte[8192]; byte[] mem; Assert.Throws (() => stream.Write (null, 0, buffer.Length)); Assert.Throws (() => stream.Write (buffer, -1, buffer.Length)); Assert.Throws (() => stream.Write (buffer, 0, -1)); // Test #1: write less than 4K to make sure that ImapStream buffers it stream.Write (buf1k, 0, buf1k.Length); Assert.That (memory.Length, Is.EqualTo (0), "#1"); // Test #2: make sure that flushing the ImapStream flushes the entire buffer out to the network stream.Flush (); Assert.That (memory.Length, Is.EqualTo (buf1k.Length), "#2"); mem = memory.GetBuffer (); for (int i = 0; i < buf1k.Length; i++) Assert.That (mem[i], Is.EqualTo (buf1k[i]), $"#2 byte[{i}]"); memory.SetLength (0); // Test #3: write exactly 4K to make sure it passes through w/o the need to flush stream.Write (buf4k, 0, buf4k.Length); Assert.That (memory.Length, Is.EqualTo (buf4k.Length), "#3"); mem = memory.GetBuffer (); for (int i = 0; i < buf4k.Length; i++) Assert.That (mem[i], Is.EqualTo (buf4k[i]), $"#3 byte[{i}]"); memory.SetLength (0); // Test #4: write 1k and then write 4k, make sure that only 4k passes thru (last 1k gets buffered) stream.Write (buf1k, 0, buf1k.Length); stream.Write (buf4k, 0, buf4k.Length); Assert.That (memory.Length, Is.EqualTo (4096), "#4"); stream.Flush (); Assert.That (memory.Length, Is.EqualTo (buf1k.Length + buf4k.Length), "#4"); Array.Copy (buf1k, 0, buffer, 0, buf1k.Length); Array.Copy (buf4k, 0, buffer, buf1k.Length, buf4k.Length); mem = memory.GetBuffer (); for (int i = 0; i < buf1k.Length + buf4k.Length; i++) Assert.That (mem[i], Is.EqualTo (buffer[i]), $"#4 byte[{i}]"); memory.SetLength (0); // Test #5: write 9k and make sure only the first 8k goes thru (last 1k gets buffered) stream.Write (buf9k, 0, buf9k.Length); Assert.That (memory.Length, Is.EqualTo (8192), "#5"); stream.Flush (); Assert.That (memory.Length, Is.EqualTo (buf9k.Length), "#5"); mem = memory.GetBuffer (); for (int i = 0; i < buf9k.Length; i++) Assert.That (mem[i], Is.EqualTo (buf9k[i]), $"#5 byte[{i}]"); memory.SetLength (0); } } [Test] public async Task TestWriteAsync () { using (var stream = new ImapStream (new DummyNetworkStream (), new NullProtocolLogger ())) { var buf1k = RandomNumberGenerator.GetBytes (1024); var buf4k = RandomNumberGenerator.GetBytes (4096); var buf9k = RandomNumberGenerator.GetBytes (9216); var memory = (MemoryStream) stream.Stream; var buffer = new byte[8192]; byte[] mem; // Test #1: write less than 4K to make sure that ImapStream buffers it await stream.WriteAsync (buf1k, 0, buf1k.Length); Assert.That (memory.Length, Is.EqualTo (0), "#1"); // Test #2: make sure that flushing the ImapStream flushes the entire buffer out to the network await stream.FlushAsync (); Assert.That (memory.Length, Is.EqualTo (buf1k.Length), "#2"); mem = memory.GetBuffer (); for (int i = 0; i < buf1k.Length; i++) Assert.That (mem[i], Is.EqualTo (buf1k[i]), $"#2 byte[{i}]"); memory.SetLength (0); // Test #3: write exactly 4K to make sure it passes through w/o the need to flush await stream.WriteAsync (buf4k, 0, buf4k.Length); Assert.That (memory.Length, Is.EqualTo (buf4k.Length), "#3"); mem = memory.GetBuffer (); for (int i = 0; i < buf4k.Length; i++) Assert.That (mem[i], Is.EqualTo (buf4k[i]), $"#3 byte[{i}]"); memory.SetLength (0); // Test #4: write 1k and then write 4k, make sure that only 4k passes thru (last 1k gets buffered) await stream.WriteAsync (buf1k, 0, buf1k.Length); await stream.WriteAsync (buf4k, 0, buf4k.Length); Assert.That (memory.Length, Is.EqualTo (4096), "#4"); await stream.FlushAsync (); Assert.That (memory.Length, Is.EqualTo (buf1k.Length + buf4k.Length), "#4"); Array.Copy (buf1k, 0, buffer, 0, buf1k.Length); Array.Copy (buf4k, 0, buffer, buf1k.Length, buf4k.Length); mem = memory.GetBuffer (); for (int i = 0; i < buf1k.Length + buf4k.Length; i++) Assert.That (mem[i], Is.EqualTo (buffer[i]), $"#4 byte[{i}]"); memory.SetLength (0); // Test #5: write 9k and make sure only the first 8k goes thru (last 1k gets buffered) await stream.WriteAsync (buf9k, 0, buf9k.Length); Assert.That (memory.Length, Is.EqualTo (8192), "#5"); await stream.FlushAsync (); Assert.That (memory.Length, Is.EqualTo (buf9k.Length), "#5"); mem = memory.GetBuffer (); for (int i = 0; i < buf9k.Length; i++) Assert.That (mem[i], Is.EqualTo (buf9k[i]), $"#5 byte[{i}]"); memory.SetLength (0); } } } } ================================================ FILE: UnitTests/Net/Imap/ImapUtilsTests.cs ================================================ // // ImapBodyParsingTests.cs // // Author: Jeffrey Stedfast // // Copyright (c) 2013-2026 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Text; using MimeKit.Utils; using MailKit; using MailKit.Net.Imap; namespace UnitTests.Net.Imap { [TestFixture] public class ImapUtilsTests : IDisposable { readonly ImapEngine engine = new ImapEngine (null); public void Dispose () { engine.Dispose (); GC.SuppressFinalize (this); } [Test] public void TestResponseCodeCreation () { foreach (ImapResponseCodeType type in Enum.GetValues (typeof (ImapResponseCodeType))) Assert.DoesNotThrow (() => ImapResponseCode.Create (type)); } [Test] public void TestFormattingSimpleIndexRange () { int[] indexes = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; const string expect = "1:9"; string actual; Assert.Throws (() => ImapUtils.FormatIndexSet (null, new int[1])); Assert.Throws (() => ImapUtils.FormatIndexSet (engine, null)); Assert.Throws (() => ImapUtils.FormatIndexSet (engine, Array.Empty ())); Assert.Throws (() => ImapUtils.FormatIndexSet (engine, null, new int[1])); actual = ImapUtils.FormatIndexSet (engine, indexes); Assert.That (actual, Is.EqualTo (expect), "Formatting a simple range of indexes failed."); } [Test] public void TestFormattingNonSequentialIndexes () { int[] indexes = { 0, 2, 4, 6, 8 }; const string expect = "1,3,5,7,9"; string actual; actual = ImapUtils.FormatIndexSet (engine, indexes); Assert.That (actual, Is.EqualTo (expect), "Formatting a non-sequential list of indexes."); } [Test] public void TestFormattingComplexSetOfIndexes () { int[] indexes = { 0, 1, 2, 4, 5, 8, 9, 10, 11, 14, 18, 19 }; const string expect = "1:3,5:6,9:12,15,19:20"; string actual; actual = ImapUtils.FormatIndexSet (engine, indexes); Assert.That (actual, Is.EqualTo (expect), "Formatting a complex list of indexes."); } [Test] public void TestFormattingReversedIndexes () { int[] indexes = { 19, 18, 14, 11, 10, 9, 8, 5, 4, 2, 1, 0 }; const string expect = "20:19,15,12:9,6:5,3:1"; string actual; actual = ImapUtils.FormatIndexSet (engine, indexes); Assert.That (actual, Is.EqualTo (expect), "Formatting a complex list of indexes."); } [Test] public void TestFormattingSimpleUidRange () { UniqueId[] uids = { new UniqueId (1), new UniqueId (2), new UniqueId (3), new UniqueId (4), new UniqueId (5), new UniqueId (6), new UniqueId (7), new UniqueId (8), new UniqueId (9) }; const string expect = "1:9"; string actual; actual = UniqueIdSet.ToString (uids); Assert.That (actual, Is.EqualTo (expect), "Formatting a simple range of uids failed."); } [Test] public void TestFormattingNonSequentialUids () { UniqueId[] uids = { new UniqueId (1), new UniqueId (3), new UniqueId (5), new UniqueId (7), new UniqueId (9) }; const string expect = "1,3,5,7,9"; string actual; actual = UniqueIdSet.ToString (uids); Assert.That (actual, Is.EqualTo (expect), "Formatting a non-sequential list of uids."); } [Test] public void TestFormattingComplexSetOfUids () { UniqueId[] uids = { new UniqueId (1), new UniqueId (2), new UniqueId (3), new UniqueId (5), new UniqueId (6), new UniqueId (9), new UniqueId (10), new UniqueId (11), new UniqueId (12), new UniqueId (15), new UniqueId (19), new UniqueId (20) }; const string expect = "1:3,5:6,9:12,15,19:20"; string actual; actual = UniqueIdSet.ToString (uids); Assert.That (actual, Is.EqualTo (expect), "Formatting a complex list of uids."); } [Test] public void TestFormattingReversedUids () { UniqueId[] uids = { new UniqueId (20), new UniqueId (19), new UniqueId (15), new UniqueId (12), new UniqueId (11), new UniqueId (10), new UniqueId (9), new UniqueId (6), new UniqueId (5), new UniqueId (3), new UniqueId (2), new UniqueId (1) }; const string expect = "20:19,15,12:9,6:5,3:1"; string actual; actual = UniqueIdSet.ToString (uids); Assert.That (actual, Is.EqualTo (expect), "Formatting a complex list of uids."); } [Test] public void TestParseInvalidInternalDates () { var internalDates = new string [] { "00-Jan-0000 00:00:00 +0000", // Note: This example is taken from an actual response from a Domino IMAP server. Likely represents an uninitialized value. "98765432100-OCT-2018 13:41:57 -0400", "27-JAG-2018 13:41:57 -0400", "27-OCT-1909 13:41:57 -0400", "27-OCT-2018 33:41:57 -0400", "27-OCT-2018 13:411:57 -0400", "27-OCT-2018 13:41:577 -0400", "27-OCT-2018 13:41:577 -98765432100", "27-OCT-2018 13:41:57 -0400 XYZ", }; foreach (var internalDate in internalDates) Assert.That (ImapUtils.ParseInternalDate (internalDate), Is.EqualTo (DateTimeOffset.MinValue), internalDate); } [Test] public void TestCanonicalizeMailboxName () { Assert.That (ImapUtils.CanonicalizeMailboxName ("Name", '.'), Is.EqualTo ("Name"), "Name"); Assert.That (ImapUtils.CanonicalizeMailboxName ("InbOx", '.'), Is.EqualTo ("INBOX"), "InbOx"); Assert.That (ImapUtils.CanonicalizeMailboxName ("InboxSubfolder", '.'), Is.EqualTo ("InboxSubfolder"), "InboxSubfolder"); Assert.That (ImapUtils.CanonicalizeMailboxName ("Inbox.Subfolder", '.'), Is.EqualTo ("INBOX.Subfolder"), "Inbox.Subfolder"); } [Test] public void TestParseLabelsListWithNIL () { const string text = "(atom-label \\flag-label \"quoted-label\" NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { IList labels; engine.SetStream (tokenizer); try { labels = ImapUtils.ParseLabelsList (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing X-GM-LABELS failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); } } } } [Test] public async Task TestParseLabelsListWithNILAsync () { const string text = "(atom-label \\flag-label \"quoted-label\" NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { IList labels; engine.SetStream (tokenizer); try { labels = await ImapUtils.ParseLabelsListAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing X-GM-LABELS failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); } } } } [Test] public void TestParseExampleBodyRfc3501 () { const string text = "(\"TEXT\" \"PLAIN\" (\"CHARSET\" \"US-ASCII\") NIL NIL \"7BIT\" 3028 92)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartText basic; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODY failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); basic = (BodyPartText) body; Assert.That (body.ContentType.IsMimeType ("text", "plain"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["charset"], Is.EqualTo ("US-ASCII"), "charset param did not match"); Assert.That (basic, Is.Not.Null, "The parsed body is not BodyPartText."); Assert.That (basic.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encoding did not match."); Assert.That (basic.Octets, Is.EqualTo (3028), "Octet count did not match."); Assert.That (basic.Lines, Is.EqualTo (92), "Line count did not match."); } } } } [Test] public async Task TestParseExampleBodyRfc3501Async () { const string text = "(\"TEXT\" \"PLAIN\" (\"CHARSET\" \"US-ASCII\") NIL NIL \"7BIT\" 3028 92)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartText basic; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODY failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); basic = (BodyPartText) body; Assert.That (body.ContentType.IsMimeType ("text", "plain"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["charset"], Is.EqualTo ("US-ASCII"), "charset param did not match"); Assert.That (basic, Is.Not.Null, "The parsed body is not BodyPartText."); Assert.That (basic.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encoding did not match."); Assert.That (basic.Octets, Is.EqualTo (3028), "Octet count did not match."); Assert.That (basic.Lines, Is.EqualTo (92), "Line count did not match."); } } } } [Test] public void TestParseExampleEnvelopeRfc3501 () { const string text = "(\"Wed, 17 Jul 1996 02:23:25 -0700 (PDT)\" \"IMAP4rev1 WG mtg summary and minutes\" ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((NIL NIL \"imap\" \"cac.washington.edu\")) ((NIL NIL \"minutes\" \"CNRI.Reston.VA.US\") (\"John Klensin\" NIL \"KLENSIN\" \"MIT.EDU\")) NIL NIL \"\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Wed, 17 Jul 1996 02:23:25 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("IMAP4rev1 WG mtg summary and minutes"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Terry Gray\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Reply-To does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("imap@cac.washington.edu"), "To does not match."); Assert.That (envelope.Cc, Has.Count.EqualTo (2), "Cc counts do not match."); Assert.That (envelope.Cc.ToString (), Is.EqualTo ("minutes@CNRI.Reston.VA.US, \"John Klensin\" "), "Cc does not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("B27397-0100000@cac.washington.edu"), "Message-Id does not match."); } } } } [Test] public async Task TestParseExampleEnvelopeRfc3501Async () { const string text = "(\"Wed, 17 Jul 1996 02:23:25 -0700 (PDT)\" \"IMAP4rev1 WG mtg summary and minutes\" ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((NIL NIL \"imap\" \"cac.washington.edu\")) ((NIL NIL \"minutes\" \"CNRI.Reston.VA.US\") (\"John Klensin\" NIL \"KLENSIN\" \"MIT.EDU\")) NIL NIL \"\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Wed, 17 Jul 1996 02:23:25 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("IMAP4rev1 WG mtg summary and minutes"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Terry Gray\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Reply-To does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("imap@cac.washington.edu"), "To does not match."); Assert.That (envelope.Cc, Has.Count.EqualTo (2), "Cc counts do not match."); Assert.That (envelope.Cc.ToString (), Is.EqualTo ("minutes@CNRI.Reston.VA.US, \"John Klensin\" "), "Cc does not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("B27397-0100000@cac.washington.edu"), "Message-Id does not match."); } } } } [Test] public void TestParseExampleEnvelopeRfc3501WithLiterals () { const string text = "({37}\r\nWed, 17 Jul 1996 02:23:25 -0700 (PDT) {36}\r\nIMAP4rev1 WG mtg summary and minutes (({10}\r\nTerry Gray NIL {4}\r\ngray \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((NIL NIL \"imap\" \"cac.washington.edu\")) ((NIL NIL \"minutes\" \"CNRI.Reston.VA.US\") (\"John Klensin\" NIL \"KLENSIN\" \"MIT.EDU\")) NIL NIL {35}\r\n)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Wed, 17 Jul 1996 02:23:25 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("IMAP4rev1 WG mtg summary and minutes"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Terry Gray\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Reply-To does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("imap@cac.washington.edu"), "To does not match."); Assert.That (envelope.Cc, Has.Count.EqualTo (2), "Cc counts do not match."); Assert.That (envelope.Cc.ToString (), Is.EqualTo ("minutes@CNRI.Reston.VA.US, \"John Klensin\" "), "Cc does not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("B27397-0100000@cac.washington.edu"), "Message-Id does not match."); } } } } [Test] public async Task TestParseExampleEnvelopeRfc3501WithLiteralsAsync () { const string text = "({37}\r\nWed, 17 Jul 1996 02:23:25 -0700 (PDT) {36}\r\nIMAP4rev1 WG mtg summary and minutes (({10}\r\nTerry Gray NIL {4}\r\ngray \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((\"Terry Gray\" NIL \"gray\" \"cac.washington.edu\")) ((NIL NIL \"imap\" \"cac.washington.edu\")) ((NIL NIL \"minutes\" \"CNRI.Reston.VA.US\") (\"John Klensin\" NIL \"KLENSIN\" \"MIT.EDU\")) NIL NIL {35}\r\n)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Wed, 17 Jul 1996 02:23:25 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("IMAP4rev1 WG mtg summary and minutes"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Terry Gray\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Terry Gray\" "), "Reply-To does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("imap@cac.washington.edu"), "To does not match."); Assert.That (envelope.Cc, Has.Count.EqualTo (2), "Cc counts do not match."); Assert.That (envelope.Cc.ToString (), Is.EqualTo ("minutes@CNRI.Reston.VA.US, \"John Klensin\" "), "Cc does not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("B27397-0100000@cac.washington.edu"), "Message-Id does not match."); } } } } // This tests the work-around for issue #1369 [Test] public void TestParseEnvelopeWithMiscalculatedLiteralMailboxName () { const string text = "(\"Thu, 29 Apr 2021 10:57:07 +0000\" \"=?utf-8?B?0J/QsNGA0LrQuNC90LMg0L3QsCDQlNCw0L3QsNC40Lsg0JTQtdGH0LXQsg==?=\" (({38}\r\nРецепция Офис сграда \"Данаил Дечев\" №6 NIL \"facility\" \"xxxxxxxxxxx.com\")) NIL NIL ((\"Team\" NIL \"team\" \"xxxxxxxxxxx.com\")) NIL NIL NIL \"\")\r\n"; // Note: The server appears to have calculated the literal length as the number of unicode *characters* as opposed to *bytes*. The actual literal length *should be* 69, not 38. using (var memory = new MemoryStream (Encoding.UTF8.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Thu, 29 Apr 2021 10:57:07 +0000"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("Паркинг на Данаил Дечев"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Рецепция Офис сграда \\\"Данаил Дечев\\\" №6\" "), "From does not match."); Assert.That (envelope.Sender, Is.Empty, "Sender counts do not match."); Assert.That (envelope.ReplyTo, Is.Empty, "Reply-To counts do not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("\"Team\" "), "To does not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("d0f6ca6608cfb0b680b7b90824c79118@xxxxxxxxxxx.com"), "Message-Id does not match."); } } } } // This tests the work-around for issue #1369 [Test] public async Task TestParseEnvelopeWithMiscalculatedLiteralMailboxNameAsync () { const string text = "(\"Thu, 29 Apr 2021 10:57:07 +0000\" \"=?utf-8?B?0J/QsNGA0LrQuNC90LMg0L3QsCDQlNCw0L3QsNC40Lsg0JTQtdGH0LXQsg==?=\" (({38}\r\nРецепция Офис сграда \"Данаил Дечев\" №6 NIL \"facility\" \"xxxxxxxxxxx.com\")) NIL NIL ((\"Team\" NIL \"team\" \"xxxxxxxxxxx.com\")) NIL NIL NIL \"\")\r\n"; // Note: The server appears to have calculated the literal length as the number of unicode *characters* as opposed to *bytes*. The actual literal length *should be* 69, not 38. using (var memory = new MemoryStream (Encoding.UTF8.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Thu, 29 Apr 2021 10:57:07 +0000"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("Паркинг на Данаил Дечев"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Рецепция Офис сграда \\\"Данаил Дечев\\\" №6\" "), "From does not match."); Assert.That (envelope.Sender, Is.Empty, "Sender counts do not match."); Assert.That (envelope.ReplyTo, Is.Empty, "Reply-To counts do not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("\"Team\" "), "To does not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("d0f6ca6608cfb0b680b7b90824c79118@xxxxxxxxxxx.com"), "Message-Id does not match."); } } } } // This tests the work-around for issue #669 [Test] public void TestParseEnvelopeWithMissingMessageId () { const string text = "(\"Tue, 24 Sep 2019 09:48:05 +0800\" \"subject\" ((\"From Name\" NIL \"from\" \"example.com\")) ((\"Sender Name\" NIL \"sender\" \"example.com\")) ((\"Reply-To Name\" NIL \"reply-to\" \"example.com\")) NIL NIL NIL \"\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Tue, 24 Sep 2019 09:48:05 +0800"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("subject"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"From Name\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Sender Name\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Reply-To Name\" "), "Reply-To does not match."); Assert.That (envelope.To, Is.Empty, "To counts do not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.EqualTo ("in-reply-to@example.com"), "In-Reply-To does not match."); Assert.That (envelope.MessageId, Is.Null, "Message-Id is not null."); } } } } // This tests the work-around for issue #669 [Test] public async Task TestParseEnvelopeWithMissingMessageIdAsync () { const string text = "(\"Tue, 24 Sep 2019 09:48:05 +0800\" \"subject\" ((\"From Name\" NIL \"from\" \"example.com\")) ((\"Sender Name\" NIL \"sender\" \"example.com\")) ((\"Reply-To Name\" NIL \"reply-to\" \"example.com\")) NIL NIL NIL \"\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Tue, 24 Sep 2019 09:48:05 +0800"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("subject"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"From Name\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Sender Name\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Reply-To Name\" "), "Reply-To does not match."); Assert.That (envelope.To, Is.Empty, "To counts do not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.EqualTo ("in-reply-to@example.com"), "In-Reply-To does not match."); Assert.That (envelope.MessageId, Is.Null, "Message-Id is not null."); } } } } // This tests the work-around for issue #932 [Test] public void TestParseEnvelopeWithMissingInReplyTo () { const string text = "(\"Tue, 24 Sep 2019 09:48:05 +0800\" \"=?GBK?B?sbG+qdW9x/jI1bGose0=?=\" ((\"=?GBK?B?yv2+3bfWzvbQodfp?=\" NIL \"unknown-name\" \"unknown-domain\")) ((\"=?GBK?B?yv2+3bfWzvbQodfp?=\" NIL \"unknown-name\" \"unknown-domain\")) ((\"=?GBK?B?yv2+3bfWzvbQodfp?=\" NIL \"unknown-name\" \"unknown-domain\")) NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Tue, 24 Sep 2019 09:48:05 +0800"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("北京战区日报表"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"数据分析小组\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"数据分析小组\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"数据分析小组\" "), "Reply-To does not match."); Assert.That (envelope.To, Is.Empty, "To counts do not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.Null, "Message-Id is not null."); } } } } // This tests the work-around for issue #932 [Test] public async Task TestParseEnvelopeWithMissingInReplyToAsync () { const string text = "(\"Tue, 24 Sep 2019 09:48:05 +0800\" \"=?GBK?B?sbG+qdW9x/jI1bGose0=?=\" ((\"=?GBK?B?yv2+3bfWzvbQodfp?=\" NIL \"unknown-name\" \"unknown-domain\")) ((\"=?GBK?B?yv2+3bfWzvbQodfp?=\" NIL \"unknown-name\" \"unknown-domain\")) ((\"=?GBK?B?yv2+3bfWzvbQodfp?=\" NIL \"unknown-name\" \"unknown-domain\")) NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Tue, 24 Sep 2019 09:48:05 +0800"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("北京战区日报表"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"数据分析小组\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"数据分析小组\" "), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"数据分析小组\" "), "Reply-To does not match."); Assert.That (envelope.To, Is.Empty, "To counts do not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.Null, "Message-Id is not null."); } } } } [Test] public void TestParseMalformedMailboxAddressInEnvelope () { const string text = "(\"Mon, 10 Apr 2017 06:04:00 -0700\" \"Session 2: Building the meditation habit\" ((\"Headspace\" NIL \"members\" \"headspace.com\")) ((NIL NIL \"\")) ((\"Headspace\" NIL \"members\" \"headspace.com\")) ((NIL NIL \"user\" \"gmail.com\")) NIL NIL NIL \"\")"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Mon, 10 Apr 2017 06:04:00 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("Session 2: Building the meditation habit"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Headspace\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("members=headspace.com@members.headspace.com"), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Headspace\" "), "Reply-To does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("user@gmail.com"), "To does not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("bvqyalstpemxt9y3afoqh4an62b2arcd.rcd.1491829440@members.headspace.com"), "Message-Id does not match."); } } } } [Test] public async Task TestParseMalformedMailboxAddressInEnvelopeAsync () { const string text = "(\"Mon, 10 Apr 2017 06:04:00 -0700\" \"Session 2: Building the meditation habit\" ((\"Headspace\" NIL \"members\" \"headspace.com\")) ((NIL NIL \"\")) ((\"Headspace\" NIL \"members\" \"headspace.com\")) ((NIL NIL \"user\" \"gmail.com\")) NIL NIL NIL \"\")"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Mon, 10 Apr 2017 06:04:00 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("Session 2: Building the meditation habit"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Headspace\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("members=headspace.com@members.headspace.com"), "Sender does not match."); Assert.That (envelope.ReplyTo, Has.Count.EqualTo (1), "Reply-To counts do not match."); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Headspace\" "), "Reply-To does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("user@gmail.com"), "To does not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("bvqyalstpemxt9y3afoqh4an62b2arcd.rcd.1491829440@members.headspace.com"), "Message-Id does not match."); } } } } // This tests a work-around for a bug in Gmail in which the sender header is in a correct format // (Sender: Name ) but in the FETCH response is not ((("" NIL "Name" NIL))) [Test] public void TestParseGMailMalformedSenderInEnvelope () { const string text = "(\"Mon, 10 Apr 2017 06:04:00 -0700\" \"This is the subject\" ((\"From_DisplayName\" NIL \"from\" \"domain.com\")) ((\"\" NIL \"=?UTF-8?Q?\"Dummy=C3=ADa_Pa=C3=A1ndez_Algo\"?=\" NIL)) NIL ((\"To_DisplayName\" NIL \"to\" \"domain.com\")) NIL NIL NIL \"\")"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); engine.QuirksMode = ImapQuirksMode.GMail; try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Mon, 10 Apr 2017 06:04:00 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("This is the subject"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"From_DisplayName\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Dummyía Paández Algo\" "), "Sender does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("\"To_DisplayName\" "), "To does not match."); Assert.That (envelope.ReplyTo, Is.Empty, "Reply-To counts do not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("bvqyalstpemxt9y3afoqh4an62b2arcd@message.id"), "Message-Id does not match."); } } } } // This tests a work-around for a bug in Gmail in which the sender header is in a correct format // (Sender: Name ) but in the FETCH response is not ((("" NIL "Name" NIL))) [Test] public async Task TestParseGMailMalformedSenderInEnvelopeAsync () { const string text = "(\"Mon, 10 Apr 2017 06:04:00 -0700\" \"This is the subject\" ((\"From_DisplayName\" NIL \"from\" \"domain.com\")) ((\"\" NIL \"=?UTF-8?Q?\"Dummy=C3=ADa_Pa=C3=A1ndez_Algo\"?=\" NIL)) NIL ((\"To_DisplayName\" NIL \"to\" \"domain.com\")) NIL NIL NIL \"\")"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); engine.QuirksMode = ImapQuirksMode.GMail; try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Date.HasValue, Is.True, "Parsed ENVELOPE date is null."); Assert.That (DateUtils.FormatDate (envelope.Date.Value), Is.EqualTo ("Mon, 10 Apr 2017 06:04:00 -0700"), "Date does not match."); Assert.That (envelope.Subject, Is.EqualTo ("This is the subject"), "Subject does not match."); Assert.That (envelope.From, Has.Count.EqualTo (1), "From counts do not match."); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"From_DisplayName\" "), "From does not match."); Assert.That (envelope.Sender, Has.Count.EqualTo (1), "Sender counts do not match."); Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Dummyía Paández Algo\" "), "Sender does not match."); Assert.That (envelope.To, Has.Count.EqualTo (1), "To counts do not match."); Assert.That (envelope.To.ToString (), Is.EqualTo ("\"To_DisplayName\" "), "To does not match."); Assert.That (envelope.ReplyTo, Is.Empty, "Reply-To counts do not match."); Assert.That (envelope.Cc, Is.Empty, "Cc counts do not match."); Assert.That (envelope.Bcc, Is.Empty, "Bcc counts do not match."); Assert.That (envelope.InReplyTo, Is.Null, "In-Reply-To is not null."); Assert.That (envelope.MessageId, Is.EqualTo ("bvqyalstpemxt9y3afoqh4an62b2arcd@message.id"), "Message-Id does not match."); } } } } // This tests issue #1451 [Test] public void TestParseEnvelopeWithNilMailbox () { const string text = "(NIL \"Retrieval using the IMAP4 protocol failed for the following message: 3\" ((\"Microsoft Exchange Server\" NIL NIL \".MISSING-HOST-NAME.\")) NIL NIL ((\"username@testdomain.com\" NIL \"username\" \"testdomain.com\")) NIL NIL NIL NIL)"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Subject, Is.EqualTo ("Retrieval using the IMAP4 protocol failed for the following message: 3")); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Microsoft Exchange Server\" <>")); Assert.That (envelope.To.ToString (), Is.EqualTo ("\"username@testdomain.com\" ")); } } } } [Test] public async Task TestParseEnvelopeWithNilMailboxAsync () { const string text = "(NIL \"Retrieval using the IMAP4 protocol failed for the following message: 3\" ((\"Microsoft Exchange Server\" NIL NIL \".MISSING-HOST-NAME.\")) NIL NIL ((\"username@testdomain.com\" NIL \"username\" \"testdomain.com\")) NIL NIL NIL NIL)"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Subject, Is.EqualTo ("Retrieval using the IMAP4 protocol failed for the following message: 3")); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Microsoft Exchange Server\" <>")); Assert.That (envelope.To.ToString (), Is.EqualTo ("\"username@testdomain.com\" ")); } } } } [Test] public void TestParseEnvelopeWithRoutedMailboxes () { const string text = "(\"Mon, 13 Jul 2015 21:15:32 -0400\" \"Test message\" ((\"Example From\" \"@route1,@route2\" \"from\" \"example.com\")) ((\"Example Sender\" NIL \"sender\" \"example.com\")) ((\"Example Reply-To\" NIL \"reply-to\" \"example.com\")) ((NIL NIL \"boys\" NIL)(NIL NIL \"aaron\" \"MISSING_DOMAIN\")(NIL NIL \"jeff\" \"MISSING_DOMAIN\")(NIL NIL \"zach\" \"MISSING_DOMAIN\")(NIL NIL NIL NIL)(NIL NIL \"girls\" NIL)(NIL NIL \"alice\" \"MISSING_DOMAIN\")(NIL NIL \"hailey\" \"MISSING_DOMAIN\")(NIL NIL \"jenny\" \"MISSING_DOMAIN\")(NIL NIL NIL NIL)) NIL NIL NIL \"\")"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Example Sender\" ")); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Example From\" <@route1,@route2:from@example.com>")); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Example Reply-To\" ")); Assert.That (envelope.To.ToString (), Is.EqualTo ("boys: aaron, jeff, zach;, girls: alice, hailey, jenny;")); } } } } [Test] public async Task TestParseEnvelopeWithRoutedMailboxesAsync () { const string text = "(\"Mon, 13 Jul 2015 21:15:32 -0400\" \"Test message\" ((\"Example From\" \"@route1,@route2\" \"from\" \"example.com\")) ((\"Example Sender\" NIL \"sender\" \"example.com\")) ((\"Example Reply-To\" NIL \"reply-to\" \"example.com\")) ((NIL NIL \"boys\" NIL)(NIL NIL \"aaron\" \"MISSING_DOMAIN\")(NIL NIL \"jeff\" \"MISSING_DOMAIN\")(NIL NIL \"zach\" \"MISSING_DOMAIN\")(NIL NIL NIL NIL)(NIL NIL \"girls\" NIL)(NIL NIL \"alice\" \"MISSING_DOMAIN\")(NIL NIL \"hailey\" \"MISSING_DOMAIN\")(NIL NIL \"jenny\" \"MISSING_DOMAIN\")(NIL NIL NIL NIL)) NIL NIL NIL \"\")"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Example Sender\" ")); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Example From\" <@route1,@route2:from@example.com>")); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Example Reply-To\" ")); Assert.That (envelope.To.ToString (), Is.EqualTo ("boys: aaron, jeff, zach;, girls: alice, hailey, jenny;")); } } } } // This tests the work-around for issue #991 [Test] public void TestParseEnvelopeWithNilAddress () { const string text = "(\"Thu, 18 Jul 2019 01:29:32 -0300\" \"Xxx xxx xxx xxx..\" (NIL ({123}\r\n_XXXXXXXX_xxxxxx_xxxx_xxx_?= =?iso-8859-1?Q?xxxx_xx_xxxxxxx_xxxxxxxxxx.Xxxxxxxx_xx_xxx=Xxxxxx_xx_xx_Xx?= =?iso-8859-1?Q?s?= NIL \"xxxxxxx\" \"xxxxxxxxxx.xxx\")) (NIL ({123}\r\n_XXXXXXXX_xxxxxx_xxxx_xxx_?= =?iso-8859-1?Q?xxxx_xx_xxxxxxx_xxxxxxxxxx.Xxxxxxxx_xx_xxx=Xxxxxx_xx_xx_Xx?= =?iso-8859-1?Q?s?= NIL \"xxxxxxx\" \"xxxxxxxxxx.xxx\")) ((NIL NIL \"xxxxxxx\" \"xxxxx.xxx.xx\")) ((NIL NIL \"xxxxxxx\" \"xxxxxxx.xxx.xx\")) NIL NIL NIL \"<0A9F01100712011D213C15B6D2B6DA@XXXXXXX-XXXXXXX>\"))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"_XXXXXXXX_xxxxxx_xxxx_xxx_?= xxxx xx xxxxxxx xxxxxxxxxx.Xxxxxxxx xx xxx=Xxxxxx xx xx Xxs\" ")); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"_XXXXXXXX_xxxxxx_xxxx_xxx_?= xxxx xx xxxxxxx xxxxxxxxxx.Xxxxxxxx xx xxx=Xxxxxx xx xx Xxs\" ")); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("xxxxxxx@xxxxx.xxx.xx")); Assert.That (envelope.To.ToString (), Is.EqualTo ("xxxxxxx@xxxxxxx.xxx.xx")); Assert.That (envelope.MessageId, Is.EqualTo ("0A9F01100712011D213C15B6D2B6DA@XXXXXXX-XXXXXXX")); } } } } // This tests the work-around for issue #991 [Test] public async Task TestParseEnvelopeWithNilAddressAsync () { const string text = "(\"Thu, 18 Jul 2019 01:29:32 -0300\" \"Xxx xxx xxx xxx..\" (NIL ({123}\r\n_XXXXXXXX_xxxxxx_xxxx_xxx_?= =?iso-8859-1?Q?xxxx_xx_xxxxxxx_xxxxxxxxxx.Xxxxxxxx_xx_xxx=Xxxxxx_xx_xx_Xx?= =?iso-8859-1?Q?s?= NIL \"xxxxxxx\" \"xxxxxxxxxx.xxx\")) (NIL ({123}\r\n_XXXXXXXX_xxxxxx_xxxx_xxx_?= =?iso-8859-1?Q?xxxx_xx_xxxxxxx_xxxxxxxxxx.Xxxxxxxx_xx_xxx=Xxxxxx_xx_xx_Xx?= =?iso-8859-1?Q?s?= NIL \"xxxxxxx\" \"xxxxxxxxxx.xxx\")) ((NIL NIL \"xxxxxxx\" \"xxxxx.xxx.xx\")) ((NIL NIL \"xxxxxxx\" \"xxxxxxx.xxx.xx\")) NIL NIL NIL \"<0A9F01100712011D213C15B6D2B6DA@XXXXXXX-XXXXXXX>\"))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"_XXXXXXXX_xxxxxx_xxxx_xxx_?= xxxx xx xxxxxxx xxxxxxxxxx.Xxxxxxxx xx xxx=Xxxxxx xx xx Xxs\" ")); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"_XXXXXXXX_xxxxxx_xxxx_xxx_?= xxxx xx xxxxxxx xxxxxxxxxx.Xxxxxxxx xx xxx=Xxxxxx xx xx Xxs\" ")); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("xxxxxxx@xxxxx.xxx.xx")); Assert.That (envelope.To.ToString (), Is.EqualTo ("xxxxxxx@xxxxxxx.xxx.xx")); Assert.That (envelope.MessageId, Is.EqualTo ("0A9F01100712011D213C15B6D2B6DA@XXXXXXX-XXXXXXX")); } } } } [Test] public void TestParseDovcotEnvelopeWithGroupAddresses () { const string text = "(\"Mon, 13 Jul 2015 21:15:32 -0400\" \"Test message\" ((\"Example From\" NIL \"from\" \"example.com\")) ((\"Example Sender\" NIL \"sender\" \"example.com\")) ((\"Example Reply-To\" NIL \"reply-to\" \"example.com\")) ((NIL NIL \"boys\" NIL)(NIL NIL \"aaron\" \"MISSING_DOMAIN\")(NIL NIL \"jeff\" \"MISSING_DOMAIN\")(NIL NIL \"zach\" \"MISSING_DOMAIN\")(NIL NIL NIL NIL)(NIL NIL \"girls\" NIL)(NIL NIL \"alice\" \"MISSING_DOMAIN\")(NIL NIL \"hailey\" \"MISSING_DOMAIN\")(NIL NIL \"jenny\" \"MISSING_DOMAIN\")(NIL NIL NIL NIL)) NIL NIL NIL \"\")"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = ImapUtils.ParseEnvelope (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Example Sender\" ")); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Example From\" ")); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Example Reply-To\" ")); Assert.That (envelope.To.ToString (), Is.EqualTo ("boys: aaron, jeff, zach;, girls: alice, hailey, jenny;")); } } } } [Test] public async Task TestParseDovcotEnvelopeWithGroupAddressesAsync () { const string text = "(\"Mon, 13 Jul 2015 21:15:32 -0400\" \"Test message\" ((\"Example From\" NIL \"from\" \"example.com\")) ((\"Example Sender\" NIL \"sender\" \"example.com\")) ((\"Example Reply-To\" NIL \"reply-to\" \"example.com\")) ((NIL NIL \"boys\" NIL)(NIL NIL \"aaron\" \"MISSING_DOMAIN\")(NIL NIL \"jeff\" \"MISSING_DOMAIN\")(NIL NIL \"zach\" \"MISSING_DOMAIN\")(NIL NIL NIL NIL)(NIL NIL \"girls\" NIL)(NIL NIL \"alice\" \"MISSING_DOMAIN\")(NIL NIL \"hailey\" \"MISSING_DOMAIN\")(NIL NIL \"jenny\" \"MISSING_DOMAIN\")(NIL NIL NIL NIL)) NIL NIL NIL \"\")"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { Envelope envelope; engine.SetStream (tokenizer); try { envelope = await ImapUtils.ParseEnvelopeAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ENVELOPE failed: {ex}"); return; } Assert.That (envelope.Sender.ToString (), Is.EqualTo ("\"Example Sender\" ")); Assert.That (envelope.From.ToString (), Is.EqualTo ("\"Example From\" ")); Assert.That (envelope.ReplyTo.ToString (), Is.EqualTo ("\"Example Reply-To\" ")); Assert.That (envelope.To.ToString (), Is.EqualTo ("boys: aaron, jeff, zach;, girls: alice, hailey, jenny;")); } } } } [Test] public void TestParseExampleMultiLevelDovecotBodyStructure () { const string text = "(((\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 28 2 NIL NIL NIL NIL) (\"text\" \"html\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 1707 65 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") NIL NIL NIL) (\"message\" \"rfc822\" NIL NIL NIL \"7bit\" 641 (\"Sat, 8 Jan 2011 14:16:36 +0100\" \"Subj 2\" ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Recipient\" NIL \"example\" \"gmail.com\")) NIL NIL NIL NIL) (\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 185 18 NIL NIL (\"cs\") NIL) 31 NIL (\"attachment\" NIL) NIL NIL) (\"message\" \"rfc822\" NIL NIL NIL \"7bit\" 50592 (\"Sat, 8 Jan 2011 13:58:39 +0100\" \"Subj 1\" ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Recipient\" NIL \"example\" \"gmail.com\")) NIL NIL NIL NIL) ( (\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 4296 345 NIL NIL NIL NIL) (\"text\" \"html\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 45069 1295 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"----=_NextPart_000_0073_01CBB179.57530990\") NIL (\"cs\") NIL) 1669 NIL (\"attachment\" NIL) NIL NIL) \"mixed\" (\"boundary\" \"----=_NextPart_000_0077_01CBB179.57530990\") NIL (\"cs\") NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("----=_NextPart_000_0077_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child does not match."); // FIXME: assert more stuff? } } } } [Test] public async Task TestParseExampleMultiLevelDovecotBodyStructureAsync () { const string text = "(((\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 28 2 NIL NIL NIL NIL) (\"text\" \"html\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 1707 65 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") NIL NIL NIL) (\"message\" \"rfc822\" NIL NIL NIL \"7bit\" 641 (\"Sat, 8 Jan 2011 14:16:36 +0100\" \"Subj 2\" ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Recipient\" NIL \"example\" \"gmail.com\")) NIL NIL NIL NIL) (\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 185 18 NIL NIL (\"cs\") NIL) 31 NIL (\"attachment\" NIL) NIL NIL) (\"message\" \"rfc822\" NIL NIL NIL \"7bit\" 50592 (\"Sat, 8 Jan 2011 13:58:39 +0100\" \"Subj 1\" ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Some Name, SOMECOMPANY\" NIL \"recipient\" \"example.com\")) ((\"Recipient\" NIL \"example\" \"gmail.com\")) NIL NIL NIL NIL) ( (\"text\" \"plain\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 4296 345 NIL NIL NIL NIL) (\"text\" \"html\" (\"charset\" \"iso-8859-2\") NIL NIL \"quoted-printable\" 45069 1295 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"----=_NextPart_000_0073_01CBB179.57530990\") NIL (\"cs\") NIL) 1669 NIL (\"attachment\" NIL) NIL NIL) \"mixed\" (\"boundary\" \"----=_NextPart_000_0077_01CBB179.57530990\") NIL (\"cs\") NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("----=_NextPart_000_0077_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child does not match."); // FIXME: assert more stuff? } } } } // This tests the work-around for issue #878 [Test] public void TestParseBodyStructureWithBrokenMultipartRelated () { const string text = "((\"multipart\" \"related\" (\"boundary\" \"----=_@@@@BeautyqueenS87@_@147836_6893840099.85426606923635\") NIL NIL \"7BIT\" 400 (\"boundary\" \"----=_@@@@BeautyqueenS87@_@147836_6893840099.85426606923635\") NIL NIL NIL)(\"TEXT\" \"html\" (\"charset\" \"UTF8\") NIL NIL \"7BIT\" 1115 70 NIL NIL NIL NIL)(\"TEXT\" \"html\" (\"charset\" \"UTF8\") NIL NIL \"QUOTED-PRINTABLE\" 16 2 NIL NIL NIL NIL) \"mixed\" (\"boundary\" \"----=--_DRYORTABLE@@@_@@@8957836_03253840099.78526606923635\") NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("----=--_DRYORTABLE@@@_@@@8957836_03253840099.78526606923635"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count did not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child did not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child did not match."); var related = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (related.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (related.ContentType.Parameters["boundary"], Is.EqualTo ("----=_@@@@BeautyqueenS87@_@147836_6893840099.85426606923635"), "multipart/related boundary param did not match"); Assert.That (related.ContentTransferEncoding, Is.EqualTo ("7BIT"), "multipart/related Content-Transfer-Encoding did not match."); Assert.That (related.Octets, Is.EqualTo (400), "multipart/related octets do not match."); } } } } // This tests the work-around for issue #878 [Test] public async Task TestParseBodyStructureWithBrokenMultipartRelatedAsync () { const string text = "((\"multipart\" \"related\" (\"boundary\" \"----=_@@@@BeautyqueenS87@_@147836_6893840099.85426606923635\") NIL NIL \"7BIT\" 400 (\"boundary\" \"----=_@@@@BeautyqueenS87@_@147836_6893840099.85426606923635\") NIL NIL NIL)(\"TEXT\" \"html\" (\"charset\" \"UTF8\") NIL NIL \"7BIT\" 1115 70 NIL NIL NIL NIL)(\"TEXT\" \"html\" (\"charset\" \"UTF8\") NIL NIL \"QUOTED-PRINTABLE\" 16 2 NIL NIL NIL NIL) \"mixed\" (\"boundary\" \"----=--_DRYORTABLE@@@_@@@8957836_03253840099.78526606923635\") NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("----=--_DRYORTABLE@@@_@@@8957836_03253840099.78526606923635"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count did not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child did not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child did not match."); var related = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (related.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (related.ContentType.Parameters["boundary"], Is.EqualTo ("----=_@@@@BeautyqueenS87@_@147836_6893840099.85426606923635"), "multipart/related boundary param did not match"); Assert.That (related.ContentTransferEncoding, Is.EqualTo ("7BIT"), "multipart/related Content-Transfer-Encoding did not match."); Assert.That (related.Octets, Is.EqualTo (400), "multipart/related octets do not match."); } } } } // This tests the work-around for issue #944 [Test] public void TestParseBodyStructureWithEmptyParenListAsMessageRfc822BodyToken () { const string text = "((\"text\" \"plain\" (\"charset\" \"UTF-8\") NIL NIL \"base64\" 232 4 NIL NIL NIL)(\"message\" \"delivery-status\" NIL NIL NIL \"7BIT\" 421 NIL NIL NIL)(\"message\" \"rfc822\" NIL NIL NIL \"7BIT\" 787 (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL) () 0 NIL NIL NIL) \"report\" (\"report-type\" \"delivery-status\" \"boundary\" \"==IFJRGLKFGIR60132UHRUHIHD\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "report"), Is.True, "multipart/report Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("==IFJRGLKFGIR60132UHRUHIHD"), "boundary param did not match."); Assert.That (multipart.ContentType.Parameters["report-type"], Is.EqualTo ("delivery-status"), "report-type param did not match."); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count did not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child did not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child did not match."); var plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("UTF-8"), "text/plain charset param did not match."); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("base64"), "text/plain encoding did not match."); Assert.That (plain.Octets, Is.EqualTo (232), "text/plain octets did not match."); Assert.That (plain.Lines, Is.EqualTo (4), "text/plain lines did not match."); var dstat = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (dstat.ContentType.IsMimeType ("message", "delivery-status"), Is.True, "message/delivery-status Content-Type did not match."); Assert.That (dstat.ContentTransferEncoding, Is.EqualTo ("7BIT"), "message/delivery-status encoding did not match."); Assert.That (dstat.Octets, Is.EqualTo (421), "message/delivery-status octets did not match."); var rfc822 = (BodyPartMessage) multipart.BodyParts[2]; Assert.That (rfc822.ContentType.IsMimeType ("message", "rfc822"), Is.True, "message/rfc822 Content-Type did not match."); Assert.That (rfc822.ContentId, Is.Null, "message/rfc822 Content-Id should be NIL."); Assert.That (rfc822.ContentDescription, Is.Null, "message/rfc822 Content-Description should be NIL."); Assert.That (rfc822.Envelope.Sender, Is.Empty, "message/rfc822 Envelope.Sender should be null."); Assert.That (rfc822.Envelope.From, Is.Empty, "message/rfc822 Envelope.From should be null."); Assert.That (rfc822.Envelope.ReplyTo, Is.Empty, "message/rfc822 Envelope.ReplyTo should be null."); Assert.That (rfc822.Envelope.To, Is.Empty, "message/rfc822 Envelope.To should be null."); Assert.That (rfc822.Envelope.Cc, Is.Empty, "message/rfc822 Envelope.Cc should be null."); Assert.That (rfc822.Envelope.Bcc, Is.Empty, "message/rfc822 Envelope.Bcc should be null."); Assert.That (rfc822.Envelope.Subject, Is.Null, "message/rfc822 Envelope.Subject should be null."); Assert.That (rfc822.Envelope.MessageId, Is.Null, "message/rfc822 Envelope.MessageId should be null."); Assert.That (rfc822.Envelope.InReplyTo, Is.Null, "message/rfc822 Envelope.InReplyTo should be null."); Assert.That (rfc822.Envelope.Date, Is.Null, "message/rfc822 Envelope.Date should be null."); Assert.That (rfc822.ContentTransferEncoding, Is.EqualTo ("7BIT"), "message/rfc822 encoding did not match."); Assert.That (rfc822.Octets, Is.EqualTo (787), "message/rfc822 octets did not match."); Assert.That (rfc822.Body, Is.Null, "message/rfc822 body should be null."); Assert.That (rfc822.Lines, Is.EqualTo (0), "message/rfc822 lines did not match."); } } } } // This tests the work-around for issue #944 [Test] public async Task TestParseBodyStructureWithEmptyParenListAsMessageRfc822BodyTokenAsync () { const string text = "((\"text\" \"plain\" (\"charset\" \"UTF-8\") NIL NIL \"base64\" 232 4 NIL NIL NIL)(\"message\" \"delivery-status\" NIL NIL NIL \"7BIT\" 421 NIL NIL NIL)(\"message\" \"rfc822\" NIL NIL NIL \"7BIT\" 787 (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL) () 0 NIL NIL NIL) \"report\" (\"report-type\" \"delivery-status\" \"boundary\" \"==IFJRGLKFGIR60132UHRUHIHD\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "report"), Is.True, "multipart/report Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("==IFJRGLKFGIR60132UHRUHIHD"), "boundary param did not match."); Assert.That (multipart.ContentType.Parameters["report-type"], Is.EqualTo ("delivery-status"), "report-type param did not match."); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count did not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child did not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child did not match."); var plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("UTF-8"), "text/plain charset param did not match."); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("base64"), "text/plain encoding did not match."); Assert.That (plain.Octets, Is.EqualTo (232), "text/plain octets did not match."); Assert.That (plain.Lines, Is.EqualTo (4), "text/plain lines did not match."); var dstat = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (dstat.ContentType.IsMimeType ("message", "delivery-status"), Is.True, "message/delivery-status Content-Type did not match."); Assert.That (dstat.ContentTransferEncoding, Is.EqualTo ("7BIT"), "message/delivery-status encoding did not match."); Assert.That (dstat.Octets, Is.EqualTo (421), "message/delivery-status octets did not match."); var rfc822 = (BodyPartMessage) multipart.BodyParts[2]; Assert.That (rfc822.ContentType.IsMimeType ("message", "rfc822"), Is.True, "message/rfc822 Content-Type did not match."); Assert.That (rfc822.ContentId, Is.Null, "message/rfc822 Content-Id should be NIL."); Assert.That (rfc822.ContentDescription, Is.Null, "message/rfc822 Content-Description should be NIL."); Assert.That (rfc822.Envelope.Sender, Is.Empty, "message/rfc822 Envelope.Sender should be null."); Assert.That (rfc822.Envelope.From, Is.Empty, "message/rfc822 Envelope.From should be null."); Assert.That (rfc822.Envelope.ReplyTo, Is.Empty, "message/rfc822 Envelope.ReplyTo should be null."); Assert.That (rfc822.Envelope.To, Is.Empty, "message/rfc822 Envelope.To should be null."); Assert.That (rfc822.Envelope.Cc, Is.Empty, "message/rfc822 Envelope.Cc should be null."); Assert.That (rfc822.Envelope.Bcc, Is.Empty, "message/rfc822 Envelope.Bcc should be null."); Assert.That (rfc822.Envelope.Subject, Is.Null, "message/rfc822 Envelope.Subject should be null."); Assert.That (rfc822.Envelope.MessageId, Is.Null, "message/rfc822 Envelope.MessageId should be null."); Assert.That (rfc822.Envelope.InReplyTo, Is.Null, "message/rfc822 Envelope.InReplyTo should be null."); Assert.That (rfc822.Envelope.Date, Is.Null, "message/rfc822 Envelope.Date should be null."); Assert.That (rfc822.ContentTransferEncoding, Is.EqualTo ("7BIT"), "message/rfc822 encoding did not match."); Assert.That (rfc822.Octets, Is.EqualTo (787), "message/rfc822 octets did not match."); Assert.That (rfc822.Body, Is.Null, "message/rfc822 body should be null."); Assert.That (rfc822.Lines, Is.EqualTo (0), "message/rfc822 lines did not match."); } } } } [Test] public void TestParseBodyStructureWithContentMd5DspLanguageAndLocation () { const string text = "((\"text\" \"plain\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 28 2 \"md5sum\" (\"inline\" (\"filename\" \"body.txt\")) \"en\" \"http://www.google.com/body.txt\") (\"text\" \"html\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 1707 65 \"md5sum\" (\"inline\" (\"filename\" \"body.html\")) \"en\" \"http://www.google.com/body.html\") \"alternative\" (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") (\"inline\" (\"filename\" \"alternative.txt\")) \"en\" \"http://www.google.com/alternative.txt\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "multipart/alternative Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("----=_NextPart_001_0078_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.ContentDisposition.Disposition, Is.EqualTo ("inline"), "multipart/alternative disposition did not match"); Assert.That (multipart.ContentDisposition.FileName, Is.EqualTo ("alternative.txt"), "multipart/alternative filename did not match"); Assert.That (multipart.ContentLanguage, Is.Not.Null, "multipart/alternative Content-Language should not be null"); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "multipart/alternative Content-Language count did not match"); Assert.That (multipart.ContentLanguage[0], Is.EqualTo ("en"), "multipart/alternative Content-Language value did not match"); Assert.That (multipart.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/alternative.txt"), "multipart/alternative location did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count did not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child did not match."); var plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/plain charset param did not match"); Assert.That (plain.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/plain disposition did not match"); Assert.That (plain.ContentDisposition.FileName, Is.EqualTo ("body.txt"), "text/plain filename did not match"); Assert.That (plain.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (plain.ContentLanguage, Is.Not.Null, "text/plain Content-Language should not be null"); Assert.That (plain.ContentLanguage, Has.Length.EqualTo (1), "text/plain Content-Language count did not match"); Assert.That (plain.ContentLanguage [0], Is.EqualTo ("en"), "text/plain Content-Language value did not match"); Assert.That (plain.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.txt"), "text/plain location did not match"); Assert.That (plain.Octets, Is.EqualTo (28), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (2), "text/plain lines did not match"); var html = (BodyPartText) multipart.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/html charset param did not match"); Assert.That (html.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/html disposition did not match"); Assert.That (html.ContentDisposition.FileName, Is.EqualTo ("body.html"), "text/html filename did not match"); Assert.That (html.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (html.ContentLanguage, Is.Not.Null, "text/html Content-Language should not be null"); Assert.That (html.ContentLanguage, Has.Length.EqualTo (1), "text/html Content-Language count did not match"); Assert.That (html.ContentLanguage [0], Is.EqualTo ("en"), "text/html Content-Language value did not match"); Assert.That (html.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.html"), "text/html location did not match"); Assert.That (html.Octets, Is.EqualTo (1707), "text/html octets did not match"); Assert.That (html.Lines, Is.EqualTo (65), "text/html lines did not match"); } } } } [Test] public async Task TestParseBodyStructureWithContentMd5DspLanguageAndLocationAsync () { const string text = "((\"text\" \"plain\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 28 2 \"md5sum\" (\"inline\" (\"filename\" \"body.txt\")) \"en\" \"http://www.google.com/body.txt\") (\"text\" \"html\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 1707 65 \"md5sum\" (\"inline\" (\"filename\" \"body.html\")) \"en\" \"http://www.google.com/body.html\") \"alternative\" (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") (\"inline\" (\"filename\" \"alternative.txt\")) \"en\" \"http://www.google.com/alternative.txt\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "multipart/alternative Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("----=_NextPart_001_0078_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.ContentDisposition.Disposition, Is.EqualTo ("inline"), "multipart/alternative disposition did not match"); Assert.That (multipart.ContentDisposition.FileName, Is.EqualTo ("alternative.txt"), "multipart/alternative filename did not match"); Assert.That (multipart.ContentLanguage, Is.Not.Null, "multipart/alternative Content-Language should not be null"); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "multipart/alternative Content-Language count did not match"); Assert.That (multipart.ContentLanguage[0], Is.EqualTo ("en"), "multipart/alternative Content-Language value did not match"); Assert.That (multipart.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/alternative.txt"), "multipart/alternative location did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count did not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child did not match."); var plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/plain charset param did not match"); Assert.That (plain.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/plain disposition did not match"); Assert.That (plain.ContentDisposition.FileName, Is.EqualTo ("body.txt"), "text/plain filename did not match"); Assert.That (plain.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (plain.ContentLanguage, Is.Not.Null, "text/plain Content-Language should not be null"); Assert.That (plain.ContentLanguage, Has.Length.EqualTo (1), "text/plain Content-Language count did not match"); Assert.That (plain.ContentLanguage[0], Is.EqualTo ("en"), "text/plain Content-Language value did not match"); Assert.That (plain.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.txt"), "text/plain location did not match"); Assert.That (plain.Octets, Is.EqualTo (28), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (2), "text/plain lines did not match"); var html = (BodyPartText) multipart.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/html charset param did not match"); Assert.That (html.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/html disposition did not match"); Assert.That (html.ContentDisposition.FileName, Is.EqualTo ("body.html"), "text/html filename did not match"); Assert.That (html.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (html.ContentLanguage, Is.Not.Null, "text/html Content-Language should not be null"); Assert.That (html.ContentLanguage, Has.Length.EqualTo (1), "text/html Content-Language count did not match"); Assert.That (html.ContentLanguage[0], Is.EqualTo ("en"), "text/html Content-Language value did not match"); Assert.That (html.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.html"), "text/html location did not match"); Assert.That (html.Octets, Is.EqualTo (1707), "text/html octets did not match"); Assert.That (html.Lines, Is.EqualTo (65), "text/html lines did not match"); } } } } [Test] public void TestParseBodyStructureWithLiterals_LiteralsEverywhere () { const string text = "(({4}\r\ntext {5}\r\nplain ({7}\r\ncharset {10}\r\niso-8859-1) NIL NIL {16}\r\nquoted-printable 28 2 {6}\r\nmd5sum ({6}\r\ninline ({8}\r\nfilename {8}\r\nbody.txt)) {2}\r\nen {30}\r\nhttp://www.google.com/body.txt) (\"text\" \"html\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 1707 65 \"md5sum\" (\"inline\" (\"filename\" \"body.html\")) \"en\" \"http://www.google.com/body.html\") {11}\r\nalternative (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") (\"inline\" (\"filename\" \"alternative.txt\")) \"en\" \"http://www.google.com/alternative.txt\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart)body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "multipart/alternative Content-Type did not match."); Assert.That (multipart.ContentType.Parameters ["boundary"], Is.EqualTo ("----=_NextPart_001_0078_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.ContentDisposition.Disposition, Is.EqualTo ("inline"), "multipart/alternative disposition did not match"); Assert.That (multipart.ContentDisposition.FileName, Is.EqualTo ("alternative.txt"), "multipart/alternative filename did not match"); Assert.That (multipart.ContentLanguage, Is.Not.Null, "multipart/alternative Content-Language should not be null"); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "multipart/alternative Content-Language count did not match"); Assert.That (multipart.ContentLanguage [0], Is.EqualTo ("en"), "multipart/alternative Content-Language value did not match"); Assert.That (multipart.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/alternative.txt"), "multipart/alternative location did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count did not match."); Assert.That (multipart.BodyParts [0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts [1], Is.InstanceOf (), "The type of the second child did not match."); var plain = (BodyPartText)multipart.BodyParts [0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/plain charset param did not match"); Assert.That (plain.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/plain disposition did not match"); Assert.That (plain.ContentDisposition.FileName, Is.EqualTo ("body.txt"), "text/plain filename did not match"); Assert.That (plain.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (plain.ContentLanguage, Is.Not.Null, "text/plain Content-Language should not be null"); Assert.That (plain.ContentLanguage, Has.Length.EqualTo (1), "text/plain Content-Language count did not match"); Assert.That (plain.ContentLanguage [0], Is.EqualTo ("en"), "text/plain Content-Language value did not match"); Assert.That (plain.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.txt"), "text/plain location did not match"); Assert.That (plain.Octets, Is.EqualTo (28), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (2), "text/plain lines did not match"); var html = (BodyPartText)multipart.BodyParts [1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/html charset param did not match"); Assert.That (html.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/html disposition did not match"); Assert.That (html.ContentDisposition.FileName, Is.EqualTo ("body.html"), "text/html filename did not match"); Assert.That (html.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (html.ContentLanguage, Is.Not.Null, "text/html Content-Language should not be null"); Assert.That (html.ContentLanguage, Has.Length.EqualTo (1), "text/html Content-Language count did not match"); Assert.That (html.ContentLanguage [0], Is.EqualTo ("en"), "text/html Content-Language value did not match"); Assert.That (html.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.html"), "text/html location did not match"); Assert.That (html.Octets, Is.EqualTo (1707), "text/html octets did not match"); Assert.That (html.Lines, Is.EqualTo (65), "text/html lines did not match"); } } } } [Test] public async Task TestParseBodyStructureWithLiterals_LiteralsEverywhereAsync () { const string text = "(({4}\r\ntext {5}\r\nplain ({7}\r\ncharset {10}\r\niso-8859-1) NIL NIL {16}\r\nquoted-printable 28 2 {6}\r\nmd5sum ({6}\r\ninline ({8}\r\nfilename {8}\r\nbody.txt)) {2}\r\nen {30}\r\nhttp://www.google.com/body.txt) (\"text\" \"html\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 1707 65 \"md5sum\" (\"inline\" (\"filename\" \"body.html\")) \"en\" \"http://www.google.com/body.html\") {11}\r\nalternative (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") (\"inline\" (\"filename\" \"alternative.txt\")) \"en\" \"http://www.google.com/alternative.txt\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "multipart/alternative Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("----=_NextPart_001_0078_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.ContentDisposition.Disposition, Is.EqualTo ("inline"), "multipart/alternative disposition did not match"); Assert.That (multipart.ContentDisposition.FileName, Is.EqualTo ("alternative.txt"), "multipart/alternative filename did not match"); Assert.That (multipart.ContentLanguage, Is.Not.Null, "multipart/alternative Content-Language should not be null"); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "multipart/alternative Content-Language count did not match"); Assert.That (multipart.ContentLanguage[0], Is.EqualTo ("en"), "multipart/alternative Content-Language value did not match"); Assert.That (multipart.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/alternative.txt"), "multipart/alternative location did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count did not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child did not match."); var plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/plain charset param did not match"); Assert.That (plain.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/plain disposition did not match"); Assert.That (plain.ContentDisposition.FileName, Is.EqualTo ("body.txt"), "text/plain filename did not match"); Assert.That (plain.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (plain.ContentLanguage, Is.Not.Null, "text/plain Content-Language should not be null"); Assert.That (plain.ContentLanguage, Has.Length.EqualTo (1), "text/plain Content-Language count did not match"); Assert.That (plain.ContentLanguage[0], Is.EqualTo ("en"), "text/plain Content-Language value did not match"); Assert.That (plain.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.txt"), "text/plain location did not match"); Assert.That (plain.Octets, Is.EqualTo (28), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (2), "text/plain lines did not match"); var html = (BodyPartText) multipart.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/html charset param did not match"); Assert.That (html.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/html disposition did not match"); Assert.That (html.ContentDisposition.FileName, Is.EqualTo ("body.html"), "text/html filename did not match"); Assert.That (html.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (html.ContentLanguage, Is.Not.Null, "text/html Content-Language should not be null"); Assert.That (html.ContentLanguage, Has.Length.EqualTo (1), "text/html Content-Language count did not match"); Assert.That (html.ContentLanguage[0], Is.EqualTo ("en"), "text/html Content-Language value did not match"); Assert.That (html.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.html"), "text/html location did not match"); Assert.That (html.Octets, Is.EqualTo (1707), "text/html octets did not match"); Assert.That (html.Lines, Is.EqualTo (65), "text/html lines did not match"); } } } } [Test] public void TestParseBodyStructureWithBodyExtensions () { const string text = "((\"text\" \"plain\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 28 2 \"md5sum\" (\"inline\" (\"filename\" \"body.txt\")) \"en\" \"body.txt\" \"extension1\" 123 (\"extension2\" (\"nested-extension3\" \"nested-extension4\"))) (\"text\" \"html\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 1707 65 \"md5sum\" (\"inline\" (\"filename\" \"body.html\")) \"en\" \"http://www.google.com/body.html\") \"alternative\" (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") (\"inline\" (\"filename\" \"alternative.txt\")) \"en\" \"http://www.google.com/alternative.txt\" {10}\r\nextension1 123 (\"extension2\" (\"nested-extension3\" \"nested-extension4\")))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart)body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "multipart/alternative Content-Type did not match."); Assert.That (multipart.ContentType.Parameters ["boundary"], Is.EqualTo ("----=_NextPart_001_0078_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.ContentDisposition.Disposition, Is.EqualTo ("inline"), "multipart/alternative disposition did not match"); Assert.That (multipart.ContentDisposition.FileName, Is.EqualTo ("alternative.txt"), "multipart/alternative filename did not match"); Assert.That (multipart.ContentLanguage, Is.Not.Null, "multipart/alternative Content-Language should not be null"); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "multipart/alternative Content-Language count did not match"); Assert.That (multipart.ContentLanguage [0], Is.EqualTo ("en"), "multipart/alternative Content-Language value did not match"); Assert.That (multipart.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/alternative.txt"), "multipart/alternative location did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count did not match."); Assert.That (multipart.BodyParts [0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts [1], Is.InstanceOf (), "The type of the second child did not match."); var plain = (BodyPartText)multipart.BodyParts [0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/plain charset param did not match"); Assert.That (plain.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/plain disposition did not match"); Assert.That (plain.ContentDisposition.FileName, Is.EqualTo ("body.txt"), "text/plain filename did not match"); Assert.That (plain.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (plain.ContentLanguage, Is.Not.Null, "text/plain Content-Language should not be null"); Assert.That (plain.ContentLanguage, Has.Length.EqualTo (1), "text/plain Content-Language count did not match"); Assert.That (plain.ContentLanguage [0], Is.EqualTo ("en"), "text/plain Content-Language value did not match"); Assert.That (plain.ContentLocation.ToString (), Is.EqualTo ("body.txt"), "text/plain location did not match"); Assert.That (plain.Octets, Is.EqualTo (28), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (2), "text/plain lines did not match"); var html = (BodyPartText)multipart.BodyParts [1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/html charset param did not match"); Assert.That (html.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/html disposition did not match"); Assert.That (html.ContentDisposition.FileName, Is.EqualTo ("body.html"), "text/html filename did not match"); Assert.That (html.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (html.ContentLanguage, Is.Not.Null, "text/html Content-Language should not be null"); Assert.That (html.ContentLanguage, Has.Length.EqualTo (1), "text/html Content-Language count did not match"); Assert.That (html.ContentLanguage [0], Is.EqualTo ("en"), "text/html Content-Language value did not match"); Assert.That (html.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.html"), "text/html location did not match"); Assert.That (html.Octets, Is.EqualTo (1707), "text/html octets did not match"); Assert.That (html.Lines, Is.EqualTo (65), "text/html lines did not match"); } } } } [Test] public async Task TestParseBodyStructureWithBodyExtensionsAsync () { const string text = "((\"text\" \"plain\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 28 2 \"md5sum\" (\"inline\" (\"filename\" \"body.txt\")) \"en\" \"body.txt\" \"extension1\" 123 (\"extension2\" (\"nested-extension3\" \"nested-extension4\"))) (\"text\" \"html\" (\"charset\" \"iso-8859-1\") NIL NIL \"quoted-printable\" 1707 65 \"md5sum\" (\"inline\" (\"filename\" \"body.html\")) \"en\" \"http://www.google.com/body.html\") \"alternative\" (\"boundary\" \"----=_NextPart_001_0078_01CBB179.57530990\") (\"inline\" (\"filename\" \"alternative.txt\")) \"en\" \"http://www.google.com/alternative.txt\" {10}\r\nextension1 123 (\"extension2\" (\"nested-extension3\" \"nested-extension4\")))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "multipart/alternative Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("----=_NextPart_001_0078_01CBB179.57530990"), "boundary param did not match"); Assert.That (multipart.ContentDisposition.Disposition, Is.EqualTo ("inline"), "multipart/alternative disposition did not match"); Assert.That (multipart.ContentDisposition.FileName, Is.EqualTo ("alternative.txt"), "multipart/alternative filename did not match"); Assert.That (multipart.ContentLanguage, Is.Not.Null, "multipart/alternative Content-Language should not be null"); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "multipart/alternative Content-Language count did not match"); Assert.That (multipart.ContentLanguage[0], Is.EqualTo ("en"), "multipart/alternative Content-Language value did not match"); Assert.That (multipart.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/alternative.txt"), "multipart/alternative location did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count did not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child did not match."); var plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/plain charset param did not match"); Assert.That (plain.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/plain disposition did not match"); Assert.That (plain.ContentDisposition.FileName, Is.EqualTo ("body.txt"), "text/plain filename did not match"); Assert.That (plain.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (plain.ContentLanguage, Is.Not.Null, "text/plain Content-Language should not be null"); Assert.That (plain.ContentLanguage, Has.Length.EqualTo (1), "text/plain Content-Language count did not match"); Assert.That (plain.ContentLanguage[0], Is.EqualTo ("en"), "text/plain Content-Language value did not match"); Assert.That (plain.ContentLocation.ToString (), Is.EqualTo ("body.txt"), "text/plain location did not match"); Assert.That (plain.Octets, Is.EqualTo (28), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (2), "text/plain lines did not match"); var html = (BodyPartText) multipart.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/html charset param did not match"); Assert.That (html.ContentDisposition.Disposition, Is.EqualTo ("inline"), "text/html disposition did not match"); Assert.That (html.ContentDisposition.FileName, Is.EqualTo ("body.html"), "text/html filename did not match"); Assert.That (html.ContentMd5, Is.EqualTo ("md5sum"), "text/html Content-Md5 did not match"); Assert.That (html.ContentLanguage, Is.Not.Null, "text/html Content-Language should not be null"); Assert.That (html.ContentLanguage, Has.Length.EqualTo (1), "text/html Content-Language count did not match"); Assert.That (html.ContentLanguage[0], Is.EqualTo ("en"), "text/html Content-Language value did not match"); Assert.That (html.ContentLocation.ToString (), Is.EqualTo ("http://www.google.com/body.html"), "text/html location did not match"); Assert.That (html.Octets, Is.EqualTo (1707), "text/html octets did not match"); Assert.That (html.Lines, Is.EqualTo (65), "text/html lines did not match"); } } } } // This tests the work-around for issue #205 [Test] public void TestParseGMailBadlyFormedMultipartBodyStructure () { const string text = "((\"ALTERNATIVE\" (\"BOUNDARY\" \"==alternative_xad5934455aeex\") NIL NIL)(\"TEXT\" \"HTML\" (\"CHARSET\" \"iso-8859-1\" \"NAME\" \"seti_letter.html\") NIL NIL \"7BIT\" 6769 171 NIL NIL NIL) \"ALTERNATIVE\" (\"BOUNDARY\" \"==alternative_xad5934455aeex\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart, broken; BodyPartText html; BodyPart body; engine.SetStream (tokenizer); engine.QuirksMode = ImapQuirksMode.GMail; try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "outer multipart/alternative Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("==alternative_xad5934455aeex"), "outer multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); broken = (BodyPartMultipart) multipart.BodyParts[0]; Assert.That (broken.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "inner multipart/alternative Content-Type did not match."); Assert.That (broken.ContentType.Parameters["boundary"], Is.EqualTo ("==alternative_xad5934455aeex"), "inner multipart/alternative boundary param did not match"); Assert.That (broken.BodyParts, Is.Empty, "inner multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); html = (BodyPartText) multipart.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/html charset parameter did not match"); Assert.That (html.ContentType.Name, Is.EqualTo ("seti_letter.html"), "text/html name parameter did not match"); } } } } // This tests the work-around for issue #205 [Test] public async Task TestParseGMailBadlyFormedMultipartBodyStructureAsync () { const string text = "((\"ALTERNATIVE\" (\"BOUNDARY\" \"==alternative_xad5934455aeex\") NIL NIL)(\"TEXT\" \"HTML\" (\"CHARSET\" \"iso-8859-1\" \"NAME\" \"seti_letter.html\") NIL NIL \"7BIT\" 6769 171 NIL NIL NIL) \"ALTERNATIVE\" (\"BOUNDARY\" \"==alternative_xad5934455aeex\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart, broken; BodyPartText html; BodyPart body; engine.SetStream (tokenizer); engine.QuirksMode = ImapQuirksMode.GMail; try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "outer multipart/alternative Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("==alternative_xad5934455aeex"), "outer multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); broken = (BodyPartMultipart) multipart.BodyParts[0]; Assert.That (broken.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "inner multipart/alternative Content-Type did not match."); Assert.That (broken.ContentType.Parameters["boundary"], Is.EqualTo ("==alternative_xad5934455aeex"), "inner multipart/alternative boundary param did not match"); Assert.That (broken.BodyParts, Is.Empty, "inner multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); html = (BodyPartText) multipart.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "text/html charset parameter did not match"); Assert.That (html.ContentType.Name, Is.EqualTo ("seti_letter.html"), "text/html name parameter did not match"); } } } } // This tests the work-around for issue #777 [Test] public void TestParseGMailBadlyFormedMultipartBodyStructure2 () { const string text = "(((\"TEXT\" \"PLAIN\" (\"CHARSET\" \"UTF-8\" \"DELSP\" \"yes\" \"FORMAT\" \"flowed\") NIL NIL \"BASE64\" 10418 133 NIL NIL NIL)(\"TEXT\" \"HTML\" (\"CHARSET\" \"UTF-8\") NIL NIL \"BASE64\" 34544 442 NIL NIL NIL) \"ALTERNATIVE\" (\"BOUNDARY\" \"94eb2c1cd0507723d5054c1ce6cb\") NIL NIL)(\"RELATED\" NIL (\"ATTACHMENT\" NIL) NIL)(\"RELATED\" NIL (\"ATTACHMENT\" NIL) NIL)(\"RELATED\" NIL (\"ATTACHMENT\" NIL) NIL)(\"RELATED\" NIL (\"ATTACHMENT\" NIL) NIL) \"MIXED\" (\"BOUNDARY\" \"94eb2c1cd0507723e6054c1ce6cd\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); engine.QuirksMode = ImapQuirksMode.GMail; try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var mixed = (BodyPartMultipart) body; Assert.That (mixed.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (mixed.ContentType.Parameters["boundary"], Is.EqualTo ("94eb2c1cd0507723e6054c1ce6cd"), "multipart/mixed boundary param did not match"); Assert.That (mixed.BodyParts, Has.Count.EqualTo (5), "multipart/mixed BodyParts count does not match."); Assert.That (mixed.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); var alternative = (BodyPartMultipart) mixed.BodyParts[0]; Assert.That (alternative.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "multipart/alternative Content-Type did not match."); Assert.That (alternative.ContentType.Parameters["boundary"], Is.EqualTo ("94eb2c1cd0507723d5054c1ce6cb"), "multipart/alternative boundary param did not match"); Assert.That (alternative.BodyParts, Has.Count.EqualTo (2), "multipart/alternative BodyParts count does not match."); Assert.That (alternative.BodyParts[0], Is.InstanceOf (), "The type of the second child does not match."); var plain = (BodyPartText) alternative.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("UTF-8"), "text/plain charset parameter did not match"); Assert.That (plain.ContentType.Format, Is.EqualTo ("flowed"), "text/plain format parameter did not match"); Assert.That (plain.ContentType.Parameters["delsp"], Is.EqualTo ("yes"), "text/plain delsp parameter did not match"); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("BASE64"), "text/plain Content-Transfer-Encoding did not match"); Assert.That (plain.Octets, Is.EqualTo (10418), "text/plain Octets do not match"); Assert.That (plain.Lines, Is.EqualTo (133), "text/plain Lines don't match"); Assert.That (alternative.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); var html = (BodyPartText) alternative.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("UTF-8"), "text/html charset parameter did not match"); Assert.That (html.ContentTransferEncoding, Is.EqualTo ("BASE64"), "text/phtml Content-Transfer-Encoding did not match"); Assert.That (html.Octets, Is.EqualTo (34544), "text/html Octets do not match"); Assert.That (html.Lines, Is.EqualTo (442), "text/html Lines don't match"); Assert.That (mixed.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); var broken1 = (BodyPartMultipart) mixed.BodyParts[1]; Assert.That (broken1.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (broken1.BodyParts, Is.Empty, "multipart/related BodyParts count does not match."); Assert.That (mixed.BodyParts[2], Is.InstanceOf (), "The type of the third child does not match."); var broken2 = (BodyPartMultipart) mixed.BodyParts[2]; Assert.That (broken2.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (broken2.BodyParts, Is.Empty, "multipart/related BodyParts count does not match."); Assert.That (mixed.BodyParts[3], Is.InstanceOf (), "The type of the fourth child does not match."); var broken3 = (BodyPartMultipart) mixed.BodyParts[3]; Assert.That (broken3.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (broken3.BodyParts, Is.Empty, "multipart/related BodyParts count does not match."); Assert.That (mixed.BodyParts[4], Is.InstanceOf (), "The type of the fifth child does not match."); var broken4 = (BodyPartMultipart) mixed.BodyParts[4]; Assert.That (broken4.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (broken4.BodyParts, Is.Empty, "multipart/related BodyParts count does not match."); } } } } // This tests the work-around for issue #777 [Test] public async Task TestParseGMailBadlyFormedMultipartBodyStructure2Async () { const string text = "(((\"TEXT\" \"PLAIN\" (\"CHARSET\" \"UTF-8\" \"DELSP\" \"yes\" \"FORMAT\" \"flowed\") NIL NIL \"BASE64\" 10418 133 NIL NIL NIL)(\"TEXT\" \"HTML\" (\"CHARSET\" \"UTF-8\") NIL NIL \"BASE64\" 34544 442 NIL NIL NIL) \"ALTERNATIVE\" (\"BOUNDARY\" \"94eb2c1cd0507723d5054c1ce6cb\") NIL NIL)(\"RELATED\" NIL (\"ATTACHMENT\" NIL) NIL)(\"RELATED\" NIL (\"ATTACHMENT\" NIL) NIL)(\"RELATED\" NIL (\"ATTACHMENT\" NIL) NIL)(\"RELATED\" NIL (\"ATTACHMENT\" NIL) NIL) \"MIXED\" (\"BOUNDARY\" \"94eb2c1cd0507723e6054c1ce6cd\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); engine.QuirksMode = ImapQuirksMode.GMail; try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var mixed = (BodyPartMultipart) body; Assert.That (mixed.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (mixed.ContentType.Parameters["boundary"], Is.EqualTo ("94eb2c1cd0507723e6054c1ce6cd"), "multipart/mixed boundary param did not match"); Assert.That (mixed.BodyParts, Has.Count.EqualTo (5), "multipart/mixed BodyParts count does not match."); Assert.That (mixed.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); var alternative = (BodyPartMultipart) mixed.BodyParts[0]; Assert.That (alternative.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "multipart/alternative Content-Type did not match."); Assert.That (alternative.ContentType.Parameters["boundary"], Is.EqualTo ("94eb2c1cd0507723d5054c1ce6cb"), "multipart/alternative boundary param did not match"); Assert.That (alternative.BodyParts, Has.Count.EqualTo (2), "multipart/alternative BodyParts count does not match."); Assert.That (alternative.BodyParts[0], Is.InstanceOf (), "The type of the second child does not match."); var plain = (BodyPartText) alternative.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("UTF-8"), "text/plain charset parameter did not match"); Assert.That (plain.ContentType.Format, Is.EqualTo ("flowed"), "text/plain format parameter did not match"); Assert.That (plain.ContentType.Parameters["delsp"], Is.EqualTo ("yes"), "text/plain delsp parameter did not match"); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("BASE64"), "text/plain Content-Transfer-Encoding did not match"); Assert.That (plain.Octets, Is.EqualTo (10418), "text/plain Octets do not match"); Assert.That (plain.Lines, Is.EqualTo (133), "text/plain Lines don't match"); Assert.That (alternative.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); var html = (BodyPartText) alternative.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "text/html Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("UTF-8"), "text/html charset parameter did not match"); Assert.That (html.ContentTransferEncoding, Is.EqualTo ("BASE64"), "text/phtml Content-Transfer-Encoding did not match"); Assert.That (html.Octets, Is.EqualTo (34544), "text/html Octets do not match"); Assert.That (html.Lines, Is.EqualTo (442), "text/html Lines don't match"); Assert.That (mixed.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); var broken1 = (BodyPartMultipart) mixed.BodyParts[1]; Assert.That (broken1.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (broken1.BodyParts, Is.Empty, "multipart/related BodyParts count does not match."); Assert.That (mixed.BodyParts[2], Is.InstanceOf (), "The type of the third child does not match."); var broken2 = (BodyPartMultipart) mixed.BodyParts[2]; Assert.That (broken2.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (broken2.BodyParts, Is.Empty, "multipart/related BodyParts count does not match."); Assert.That (mixed.BodyParts[3], Is.InstanceOf (), "The type of the fourth child does not match."); var broken3 = (BodyPartMultipart) mixed.BodyParts[3]; Assert.That (broken3.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (broken3.BodyParts, Is.Empty, "multipart/related BodyParts count does not match."); Assert.That (mixed.BodyParts[4], Is.InstanceOf (), "The type of the fifth child does not match."); var broken4 = (BodyPartMultipart) mixed.BodyParts[4]; Assert.That (broken4.ContentType.IsMimeType ("multipart", "related"), Is.True, "multipart/related Content-Type did not match."); Assert.That (broken4.BodyParts, Is.Empty, "multipart/related BodyParts count does not match."); } } } } // Note: This tests the work-around for issue #371 (except that the example from issue #371 is also missing body-fld-enc and body-fld-octets) [Test] public void TestParseBadlyFormedBodyStructureWithEmptyStringMediaType () { const string text = "((\"TEXT\" \"PLAIN\" (\"CHARSET\" \"windows-1251\") NIL NIL \"base64\" 356 5)( \"X-ZIP\" (\"BOUNDARY\" \"\") NIL NIL \"base64\" 4096) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic xzip; BodyPartText plain; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("windows-1251"), "text/plain charset parameter did not match"); Assert.That (plain.Octets, Is.EqualTo (356), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (5), "text/plain lines did not match"); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); xzip = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (xzip.ContentType.IsMimeType ("application", "x-zip"), Is.True, "x-zip Content-Type did not match."); Assert.That (xzip.ContentType.Parameters["boundary"], Is.EqualTo (""), "x-zip boundary parameter did not match"); Assert.That (xzip.Octets, Is.EqualTo (4096), "x-zip octets did not match"); } } } } // Note: This tests the work-around for issue #371 (except that the example from issue #371 is also missing body-fld-enc and body-fld-octets) [Test] public async Task TestParseBadlyFormedBodyStructureWithEmptyStringMediaTypeAsync () { const string text = "((\"TEXT\" \"PLAIN\" (\"CHARSET\" \"windows-1251\") NIL NIL \"base64\" 356 5)( \"X-ZIP\" (\"BOUNDARY\" \"\") NIL NIL \"base64\" 4096) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic xzip; BodyPartText plain; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("windows-1251"), "text/plain charset parameter did not match"); Assert.That (plain.Octets, Is.EqualTo (356), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (5), "text/plain lines did not match"); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); xzip = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (xzip.ContentType.IsMimeType ("application", "x-zip"), Is.True, "x-zip Content-Type did not match."); Assert.That (xzip.ContentType.Parameters["boundary"], Is.EqualTo (""), "x-zip boundary parameter did not match"); Assert.That (xzip.Octets, Is.EqualTo (4096), "x-zip octets did not match"); } } } } [Test] public void TestParseBadlyFormedBodyStructureWithMissingMediaSubtypeApplication () { const string text = "((\"APPLICATION\" NIL NIL NIL \"base64\" 356) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.IsMimeType ("application", "octet-stream"), Is.True, "application/octet-stream Content-Type did not match."); Assert.That (basic.Octets, Is.EqualTo (356), "application/octet-stream octets did not match"); } } } } [Test] public async Task TestParseBadlyFormedBodyStructureWithMissingMediaSubtypeApplicationAsync () { const string text = "((\"APPLICATION\" NIL NIL NIL \"base64\" 356) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.IsMimeType ("application", "octet-stream"), Is.True, "application/octet-stream Content-Type did not match."); Assert.That (basic.Octets, Is.EqualTo (356), "application/octet-stream octets did not match"); } } } } [Test] public void TestParseBadlyFormedBodyStructureWithMissingMediaSubtypeAudio () { const string text = "((\"AUDIO\" NIL NIL NIL \"base64\" 356) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.IsMimeType ("application", "audio"), Is.True, "application/audio Content-Type did not match."); Assert.That (basic.Octets, Is.EqualTo (356), "application/audio octets did not match"); } } } } [Test] public async Task TestParseBadlyFormedBodyStructureWithMissingMediaSubtypeAudioAsync () { const string text = "((\"AUDIO\" NIL NIL NIL \"base64\" 356) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.IsMimeType ("application", "audio"), Is.True, "application/audio Content-Type did not match."); Assert.That (basic.Octets, Is.EqualTo (356), "application/audio octets did not match"); } } } } [Test] public void TestParseBadlyFormedBodyStructureWithMissingMediaSubtypeMessage () { const string text = "((\"MESSAGE\" NIL NIL NIL \"base64\" 356) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.IsMimeType ("application", "message"), Is.True, "application/message Content-Type did not match."); Assert.That (basic.Octets, Is.EqualTo (356), "application/message octets did not match"); } } } } [Test] public async Task TestParseBadlyFormedBodyStructureWithMissingMediaSubtypeMessageAsync () { const string text = "((\"MESSAGE\" NIL NIL NIL \"base64\" 356) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.IsMimeType ("application", "message"), Is.True, "application/message Content-Type did not match."); Assert.That (basic.Octets, Is.EqualTo (356), "application/message octets did not match"); } } } } [Test] public void TestParseBadlyFormedBodyStructureWithMissingMediaSubtypeText () { const string text = "((\"TEXT\" (\"CHARSET\" \"windows-1251\") NIL NIL \"base64\" 356 5) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartText plain; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("windows-1251"), "text/plain charset parameter did not match"); Assert.That (plain.Octets, Is.EqualTo (356), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (5), "text/plain lines did not match"); } } } } [Test] public async Task TestParseBadlyFormedBodyStructureWithMissingMediaSubtypeTextAsync () { const string text = "((\"TEXT\" (\"CHARSET\" \"windows-1251\") NIL NIL \"base64\" 356 5) \"MIXED\" (\"BOUNDARY\" \"--cd49a2f5ed4ed0cbb6f9f1c7f125541f\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartText plain; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "multipart/mixed Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("--cd49a2f5ed4ed0cbb6f9f1c7f125541f"), "multipart/alternative boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (1), "outer multipart/alternative BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "text/plain Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("windows-1251"), "text/plain charset parameter did not match"); Assert.That (plain.Octets, Is.EqualTo (356), "text/plain octets did not match"); Assert.That (plain.Lines, Is.EqualTo (5), "text/plain lines did not match"); } } } } // Note: This tests the work-around for issue #485 [Test] public void TestParseBadlyQuotedBodyStructure () { const string text = "((\"MOUNDARY=\"_006_5DBB50A5A54730AD4A54730AD4A54730AD4A54730AD42KOS_\"\" \"OCTET-STREAM\" (\"name\" \"test.dat\") NIL NIL \"quoted-printable\" 383137 NIL (\"attachment\" (\"filename\" \"test.dat\")))(\"MOUNDARY=\"_006_5DBB50A5D3ABEC4E85A03EAD527CA5474B3D0AF9E6EXMBXSVR02KOS_\"\" \"OCTET-STREAM\" (\"name\" \"test.dat\") NIL NIL \"quoted-printable\" 383137 NIL (\"attachment\" (\"filename\" \"test.dat\"))) \"MIXED\" (\"boundary\" \"----=_NextPart_000_730AD4A547.730AD4A547F40\"))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters ["boundary"], Is.EqualTo ("----=_NextPart_000_730AD4A547.730AD4A547F40"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.MediaType, Is.EqualTo ("MOUNDARY=\"_006_5DBB50A5A54730AD4A54730AD4A54730AD4A54730AD42KOS_\""), "ContentType.MediaType does not match for first child."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); basic = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (basic.ContentType.MediaType, Is.EqualTo ("MOUNDARY=\"_006_5DBB50A5D3ABEC4E85A03EAD527CA5474B3D0AF9E6EXMBXSVR02KOS_\""), "ContentType.MediaType does not match for second child."); } } } } // Note: This tests the work-around for issue #485 [Test] public async Task TestParseBadlyQuotedBodyStructureAsync () { const string text = "((\"MOUNDARY=\"_006_5DBB50A5A54730AD4A54730AD4A54730AD4A54730AD42KOS_\"\" \"OCTET-STREAM\" (\"name\" \"test.dat\") NIL NIL \"quoted-printable\" 383137 NIL (\"attachment\" (\"filename\" \"test.dat\")))(\"MOUNDARY=\"_006_5DBB50A5D3ABEC4E85A03EAD527CA5474B3D0AF9E6EXMBXSVR02KOS_\"\" \"OCTET-STREAM\" (\"name\" \"test.dat\") NIL NIL \"quoted-printable\" 383137 NIL (\"attachment\" (\"filename\" \"test.dat\"))) \"MIXED\" (\"boundary\" \"----=_NextPart_000_730AD4A547.730AD4A547F40\"))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("----=_NextPart_000_730AD4A547.730AD4A547F40"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.MediaType, Is.EqualTo ("MOUNDARY=\"_006_5DBB50A5A54730AD4A54730AD4A54730AD4A54730AD42KOS_\""), "ContentType.MediaType does not match for first child."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); basic = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (basic.ContentType.MediaType, Is.EqualTo ("MOUNDARY=\"_006_5DBB50A5D3ABEC4E85A03EAD527CA5474B3D0AF9E6EXMBXSVR02KOS_\""), "ContentType.MediaType does not match for second child."); } } } } [Test] public void TestParseMultipartBodyStructureWithNilBodyFldParam () { const string text = "(((\"text\" \"plain\" (\"charset\" \"UTF-8\") NIL NIL \"7bit\" 148 12 NIL NIL NIL NIL)(\"text\" \"html\" (\"charset\" \"UTF-8\") NIL NIL \"quoted-printable\" 337 6 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"6c7f221bed92d80548353834d8e2\") NIL NIL NIL)((\"text\" \"plain\" (\"charset\" \"us-ascii\") NIL NIL \"7bit\" 0 0) \"x-zip\" NIL (\"attachment\" (\"filename\" \"YSOZ 265230.ZIP\")) NIL NIL) \"mixed\" (\"boundary\" \"c52bbfc0dd5365efa39b9f80eac3\") NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart, alternative, xzip; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("c52bbfc0dd5365efa39b9f80eac3"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); alternative = (BodyPartMultipart) multipart.BodyParts[0]; Assert.That (alternative.ContentType.MediaSubtype, Is.EqualTo ("alternative"), "Content-Type did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); xzip = (BodyPartMultipart) multipart.BodyParts[1]; Assert.That (xzip.ContentType.MediaSubtype, Is.EqualTo ("x-zip"), "Content-Type did not match."); Assert.That (xzip.ContentType.Parameters, Is.Empty, "Content-Type should not have params."); } } } } [Test] public async Task TestParseMultipartBodyStructureWithNilBodyFldParamAsync () { const string text = "(((\"text\" \"plain\" (\"charset\" \"UTF-8\") NIL NIL \"7bit\" 148 12 NIL NIL NIL NIL)(\"text\" \"html\" (\"charset\" \"UTF-8\") NIL NIL \"quoted-printable\" 337 6 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"6c7f221bed92d80548353834d8e2\") NIL NIL NIL)((\"text\" \"plain\" (\"charset\" \"us-ascii\") NIL NIL \"7bit\" 0 0) \"x-zip\" NIL (\"attachment\" (\"filename\" \"YSOZ 265230.ZIP\")) NIL NIL) \"mixed\" (\"boundary\" \"c52bbfc0dd5365efa39b9f80eac3\") NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart, alternative, xzip; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("c52bbfc0dd5365efa39b9f80eac3"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); alternative = (BodyPartMultipart) multipart.BodyParts[0]; Assert.That (alternative.ContentType.MediaSubtype, Is.EqualTo ("alternative"), "Content-Type did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); xzip = (BodyPartMultipart) multipart.BodyParts[1]; Assert.That (xzip.ContentType.MediaSubtype, Is.EqualTo ("x-zip"), "Content-Type did not match."); Assert.That (xzip.ContentType.Parameters, Is.Empty, "Content-Type should not have params."); } } } } [Test] public void TestParseMultipartBodyStructureWithoutBodyFldDsp () { // Test case from https://stackoverflow.com/questions/33481604/mailkit-fetch-unexpected-token-in-imap-response-qstring-multipart-message const string text = "((\"text\" \"plain\" (\"charset\" \"UTF-8\") NIL \"Message text\" \"Quoted-printable\" 209 6 NIL (\"inline\" NIL) NIL NIL)(\"text\" \"xml\" (\"name\" \"4441004299066.xml\") NIL \"4441004299066.xml\" \"Base64\" 10642 137 NIL (\"inline\" (\"filename\" \"4441004299066.xml\")) NIL NIL)(\"application\" \"pdf\" (\"name\" \"4441004299066.pdf\") NIL \"4441004299066.pdf\" \"Base64\" 48448 NIL (\"inline\" (\"filename\" \"4441004299066.pdf\")) NIL NIL) \"mixed\" (\"boundary\" \"6624CFB2_17170C36_Synapse_boundary\") \"Multipart message\" NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters ["boundary"], Is.EqualTo ("6624CFB2_17170C36_Synapse_boundary"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.MediaSubtype, Is.EqualTo ("plain"), "Content-Type did not match."); Assert.That (basic.ContentDescription, Is.EqualTo ("Message text"), "Content-Description does not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); basic = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (basic.ContentType.MediaSubtype, Is.EqualTo ("xml"), "Content-Type did not match."); Assert.That (basic.ContentDescription, Is.EqualTo ("4441004299066.xml"), "Content-Description does not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child does not match."); basic = (BodyPartBasic) multipart.BodyParts[2]; Assert.That (basic.ContentType.MediaType, Is.EqualTo ("application"), "Content-Type did not match."); Assert.That (basic.ContentType.MediaSubtype, Is.EqualTo ("pdf"), "Content-Type did not match."); Assert.That (basic.ContentDescription, Is.EqualTo ("4441004299066.pdf"), "Content-Description does not match."); } } } } [Test] public async Task TestParseMultipartBodyStructureWithoutBodyFldDspAsync () { // Test case from https://stackoverflow.com/questions/33481604/mailkit-fetch-unexpected-token-in-imap-response-qstring-multipart-message const string text = "((\"text\" \"plain\" (\"charset\" \"UTF-8\") NIL \"Message text\" \"Quoted-printable\" 209 6 NIL (\"inline\" NIL) NIL NIL)(\"text\" \"xml\" (\"name\" \"4441004299066.xml\") NIL \"4441004299066.xml\" \"Base64\" 10642 137 NIL (\"inline\" (\"filename\" \"4441004299066.xml\")) NIL NIL)(\"application\" \"pdf\" (\"name\" \"4441004299066.pdf\") NIL \"4441004299066.pdf\" \"Base64\" 48448 NIL (\"inline\" (\"filename\" \"4441004299066.pdf\")) NIL NIL) \"mixed\" (\"boundary\" \"6624CFB2_17170C36_Synapse_boundary\") \"Multipart message\" NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("6624CFB2_17170C36_Synapse_boundary"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); basic = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (basic.ContentType.MediaSubtype, Is.EqualTo ("plain"), "Content-Type did not match."); Assert.That (basic.ContentDescription, Is.EqualTo ("Message text"), "Content-Description does not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); basic = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (basic.ContentType.MediaSubtype, Is.EqualTo ("xml"), "Content-Type did not match."); Assert.That (basic.ContentDescription, Is.EqualTo ("4441004299066.xml"), "Content-Description does not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the third child does not match."); basic = (BodyPartBasic) multipart.BodyParts[2]; Assert.That (basic.ContentType.MediaType, Is.EqualTo ("application"), "Content-Type did not match."); Assert.That (basic.ContentType.MediaSubtype, Is.EqualTo ("pdf"), "Content-Type did not match."); Assert.That (basic.ContentDescription, Is.EqualTo ("4441004299066.pdf"), "Content-Description does not match."); } } } } // Note: This tests the work-around for issue #919 [Test] public void TestParseBodyStructureWithNonParenthesizedBodyFldDsp () { const string text = "((\"text\" \"plain\" (\"charset\" \"ISO-8859-1\") NIL NIL \"QUOTED-PRINTABLE\" 850 31 NIL \"inline\" NIL NIL)(\"text\" \"html\" (\"charset\" \"ISO-8859-1\") NIL NIL \"QUOTED-PRINTABLE\" 14692 502 NIL \"inline\" NIL NIL) \"alternative\" (\"boundary\" \"----=_Part_45280395_786508794.1562673197246\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartText plain, html; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("----=_Part_45280395_786508794.1562673197246"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.MimeType, Is.EqualTo ("text/plain"), "Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("ISO-8859-1"), "Content-Type charset parameter did not match."); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("QUOTED-PRINTABLE"), "Content-Transfer-Encoding did not match."); Assert.That (plain.Octets, Is.EqualTo (850), "Octets did not match."); Assert.That (plain.Lines, Is.EqualTo (31), "Lines did not match."); Assert.That (plain.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Content-Disposition did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); html = (BodyPartText) multipart.BodyParts[1]; Assert.That (html.ContentType.MimeType, Is.EqualTo ("text/html"), "Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("ISO-8859-1"), "Content-Type charset parameter did not match."); Assert.That (html.ContentTransferEncoding, Is.EqualTo ("QUOTED-PRINTABLE"), "Content-Transfer-Encoding did not match."); Assert.That (html.Octets, Is.EqualTo (14692), "Octets did not match."); Assert.That (html.Lines, Is.EqualTo (502), "Lines did not match."); Assert.That (html.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Content-Disposition did not match."); } } } } // Note: This tests the work-around for issue #919 [Test] public async Task TestParseBodyStructureWithNonParenthesizedBodyFldDspAsync () { const string text = "((\"text\" \"plain\" (\"charset\" \"ISO-8859-1\") NIL NIL \"QUOTED-PRINTABLE\" 850 31 NIL \"inline\" NIL NIL)(\"text\" \"html\" (\"charset\" \"ISO-8859-1\") NIL NIL \"QUOTED-PRINTABLE\" 14692 502 NIL \"inline\" NIL NIL) \"alternative\" (\"boundary\" \"----=_Part_45280395_786508794.1562673197246\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartText plain, html; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("----=_Part_45280395_786508794.1562673197246"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.MimeType, Is.EqualTo ("text/plain"), "Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("ISO-8859-1"), "Content-Type charset parameter did not match."); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("QUOTED-PRINTABLE"), "Content-Transfer-Encoding did not match."); Assert.That (plain.Octets, Is.EqualTo (850), "Octets did not match."); Assert.That (plain.Lines, Is.EqualTo (31), "Lines did not match."); Assert.That (plain.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Content-Disposition did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); html = (BodyPartText) multipart.BodyParts[1]; Assert.That (html.ContentType.MimeType, Is.EqualTo ("text/html"), "Content-Type did not match."); Assert.That (html.ContentType.Charset, Is.EqualTo ("ISO-8859-1"), "Content-Type charset parameter did not match."); Assert.That (html.ContentTransferEncoding, Is.EqualTo ("QUOTED-PRINTABLE"), "Content-Transfer-Encoding did not match."); Assert.That (html.Octets, Is.EqualTo (14692), "Octets did not match."); Assert.That (html.Lines, Is.EqualTo (502), "Lines did not match."); Assert.That (html.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Content-Disposition did not match."); } } } } // Note: This tests the work-around for an Exchange bug [Test] public void TestParseBodyStructureWithNilNilBodyFldDsp () { const string text = "((\"text\" \"plain\" (\"charset\" \"iso-8859-1\") NIL \"Mail message body\" \"quoted-printable\" 2201 34 NIL NIL NIL NIL)(\"application\" \"msword\" NIL NIL NIL \"base64\" 50446 NIL (NIL NIL) NIL NIL)(\"application\" \"msword\" NIL NIL NIL \"base64\" 45544 NIL (\"attachment\" (\"filename\" \"PREIS ANSPRUCHS FORMULAR.doc\")) NIL NIL) \"mixed\" (\"boundary\" \"===============1176586998==\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic msword; BodyPartText plain; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("===============1176586998=="), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.MimeType, Is.EqualTo ("text/plain"), "Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "Content-Type charset parameter did not match."); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("quoted-printable"), "Content-Transfer-Encoding did not match."); Assert.That (plain.ContentDescription, Is.EqualTo ("Mail message body"), "Content-Description did not match."); Assert.That (plain.Octets, Is.EqualTo (2201), "Octets did not match."); Assert.That (plain.Lines, Is.EqualTo (34), "Lines did not match."); Assert.That (plain.ContentDisposition, Is.Null, "Content-Disposition did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); msword = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (msword.ContentType.MimeType, Is.EqualTo ("application/msword"), "Content-Type did not match."); Assert.That (msword.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encoding did not match."); Assert.That (msword.Octets, Is.EqualTo (50446), "Octets did not match."); Assert.That (msword.ContentDisposition, Is.Null, "Content-Disposition did not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the second child does not match."); msword = (BodyPartBasic) multipart.BodyParts[2]; Assert.That (msword.ContentType.MimeType, Is.EqualTo ("application/msword"), "Content-Type did not match."); Assert.That (msword.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encoding did not match."); Assert.That (msword.Octets, Is.EqualTo (45544), "Octets did not match."); Assert.That (msword.ContentDisposition.Disposition, Is.EqualTo ("attachment"), "Content-Disposition did not match."); Assert.That (msword.ContentDisposition.FileName, Is.EqualTo ("PREIS ANSPRUCHS FORMULAR.doc"), "Filename parameters do not match."); } } } } // Note: This tests the work-around for an Exchange bug [Test] public async Task TestParseBodyStructureWithNilNilBodyFldDspAsync () { const string text = "((\"text\" \"plain\" (\"charset\" \"iso-8859-1\") NIL \"Mail message body\" \"quoted-printable\" 2201 34 NIL NIL NIL NIL)(\"application\" \"msword\" NIL NIL NIL \"base64\" 50446 NIL (NIL NIL) NIL NIL)(\"application\" \"msword\" NIL NIL NIL \"base64\" 45544 NIL (\"attachment\" (\"filename\" \"PREIS ANSPRUCHS FORMULAR.doc\")) NIL NIL) \"mixed\" (\"boundary\" \"===============1176586998==\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPartBasic msword; BodyPartText plain; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (body.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (body.ContentType.Parameters["boundary"], Is.EqualTo ("===============1176586998=="), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "The type of the first child does not match."); plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentType.MimeType, Is.EqualTo ("text/plain"), "Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("iso-8859-1"), "Content-Type charset parameter did not match."); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("quoted-printable"), "Content-Transfer-Encoding did not match."); Assert.That (plain.ContentDescription, Is.EqualTo ("Mail message body"), "Content-Description did not match."); Assert.That (plain.Octets, Is.EqualTo (2201), "Octets did not match."); Assert.That (plain.Lines, Is.EqualTo (34), "Lines did not match."); Assert.That (plain.ContentDisposition, Is.Null, "Content-Disposition did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "The type of the second child does not match."); msword = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (msword.ContentType.MimeType, Is.EqualTo ("application/msword"), "Content-Type did not match."); Assert.That (msword.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encoding did not match."); Assert.That (msword.Octets, Is.EqualTo (50446), "Octets did not match."); Assert.That (msword.ContentDisposition, Is.Null, "Content-Disposition did not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "The type of the second child does not match."); msword = (BodyPartBasic) multipart.BodyParts[2]; Assert.That (msword.ContentType.MimeType, Is.EqualTo ("application/msword"), "Content-Type did not match."); Assert.That (msword.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encoding did not match."); Assert.That (msword.Octets, Is.EqualTo (45544), "Octets did not match."); Assert.That (msword.ContentDisposition.Disposition, Is.EqualTo ("attachment"), "Content-Disposition did not match."); Assert.That (msword.ContentDisposition.FileName, Is.EqualTo ("PREIS ANSPRUCHS FORMULAR.doc"), "Filename parameters do not match."); } } } } [Test] public void TestParseBodyStructureWithSwappedBodyFldDspAndBodyFldLang () { const string text = "(((\"text\" \"plain\" (\"format\" \"flowed\" \"charset\" \"UTF-8\") NIL NIL \"8bit\" 314 8 NIL NIL NIL NIL)(\"text\" \"html\" (\"charset\" \"UTF-8\") NIL NIL \"8bit\" 763 18 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"b3_f0dcbd2fdb06033cba91309b09af1cd8\") NIL NIL NIL NIL)(\"image\" \"jpeg\" (\"name\" \"18e5ca259ceb18af6dd3ea0659f83a4c\") \"<18e5ca259ceb18af6dd3ea0659f83a4c>\" NIL \"base64\" 334384 NIL NIL NIL NIL)(\"image\" \"png\" (\"name\" \"87c487a1ff757e32ee27ff267d28af35\") \"<87c487a1ff757e32ee27ff267d28af35>\" NIL \"base64\" 375634 NIL NIL NIL NIL) \"related\" (\"type\" \"multipart/alternative\" \"charset\" \"UTF-8\" \"boundary\" \"b1_f0dcbd2fdb06033cba91309b09af1cd8\") NIL (\"inline\" NIL) NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "related"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("b1_f0dcbd2fdb06033cba91309b09af1cd8"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "Content-Language lengths do not match."); Assert.That (multipart.ContentLanguage[0], Is.EqualTo ("inline"), "Content-Language does not match."); } } } } [Test] public async Task TestParseBodyStructureWithSwappedBodyFldDspAndBodyFldLangAsync () { const string text = "(((\"text\" \"plain\" (\"format\" \"flowed\" \"charset\" \"UTF-8\") NIL NIL \"8bit\" 314 8 NIL NIL NIL NIL)(\"text\" \"html\" (\"charset\" \"UTF-8\") NIL NIL \"8bit\" 763 18 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"b3_f0dcbd2fdb06033cba91309b09af1cd8\") NIL NIL NIL NIL)(\"image\" \"jpeg\" (\"name\" \"18e5ca259ceb18af6dd3ea0659f83a4c\") \"<18e5ca259ceb18af6dd3ea0659f83a4c>\" NIL \"base64\" 334384 NIL NIL NIL NIL)(\"image\" \"png\" (\"name\" \"87c487a1ff757e32ee27ff267d28af35\") \"<87c487a1ff757e32ee27ff267d28af35>\" NIL \"base64\" 375634 NIL NIL NIL NIL) \"related\" (\"type\" \"multipart/alternative\" \"charset\" \"UTF-8\" \"boundary\" \"b1_f0dcbd2fdb06033cba91309b09af1cd8\") NIL (\"inline\" NIL) NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartMultipart multipart; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "related"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["boundary"], Is.EqualTo ("b1_f0dcbd2fdb06033cba91309b09af1cd8"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "BodyParts count does not match."); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "Content-Language lengths do not match."); Assert.That (multipart.ContentLanguage[0], Is.EqualTo ("inline"), "Content-Language does not match."); } } } } // This tests a work-around for a bug in Exchange that was reported via email. [Test] public void TestParseBodyStructureWithNegativeOctetValue () { const string text = "(\"multipart\" \"digest\" (\"boundary\" \"ommgDs4vJ6fX2nQAghXj4aUy9wsHMMDb\") NIL NIL \"7BIT\" -1 NIL NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); basic = (BodyPartBasic) body; Assert.That (basic.ContentType.IsMimeType ("multipart", "digest"), Is.True, "Content-Type did not match."); Assert.That (basic.ContentType.Parameters["boundary"], Is.EqualTo ("ommgDs4vJ6fX2nQAghXj4aUy9wsHMMDb"), "boundary param did not match"); Assert.That (basic.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encoding did not match."); Assert.That (basic.Octets, Is.EqualTo (0), "Octets did not match."); Assert.That (basic.ContentDisposition, Is.Null, "Content-Disposition did not match."); } } } } // This tests a work-around for a bug in Exchange that was reported via email. [Test] public async Task TestParseBodyStructureWithNegativeOctetValueAsync () { const string text = "(\"multipart\" \"digest\" (\"boundary\" \"ommgDs4vJ6fX2nQAghXj4aUy9wsHMMDb\") NIL NIL \"7BIT\" -1 NIL NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPartBasic basic; BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Unexpected token: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); basic = (BodyPartBasic) body; Assert.That (basic.ContentType.IsMimeType ("multipart", "digest"), Is.True, "Content-Type did not match."); Assert.That (basic.ContentType.Parameters["boundary"], Is.EqualTo ("ommgDs4vJ6fX2nQAghXj4aUy9wsHMMDb"), "boundary param did not match"); Assert.That (basic.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encoding did not match."); Assert.That (basic.Octets, Is.EqualTo (0), "Octets did not match."); Assert.That (basic.ContentDisposition, Is.Null, "Content-Disposition did not match."); } } } } [Test] public void TestParseBodyStructureWithNilMultipartBody () { const string text = "((\"text\" \"plain\" (\"charset\" \"utf-8\") NIL NIL \"7bit\" 727 16 NIL NIL NIL NIL)(\"message\" \"delivery-status\" (\"name\" \"Delivery status\") NIL NIL \"7bit\" 416 NIL NIL NIL NIL)(\"message\" \"rfc822\" (\"name\" \"Message headers\") NIL NIL \"7bit\" 903 (\"Mon, 17 Nov 2014 13:29:21 +0100\" \"Re: Adresy\" ((\"username\" NIL \"e.username\" \"example.com\")) ((\"username\" NIL \"e.username\" \"example.com\")) ((\"username\" NIL \"e.username\" \"example.com\")) ((\"=?utf-8?Q?Justyna?=\" NIL \"salesde\" \"some-company.eu\")) ((NIL NIL \"saleseu\" \"some-company.eu\")(\"Bogdan\" NIL \"bogdan\" \"some-company.eu\")) NIL \"<004901d00260$35405970$9fc10c50$@some-company.eu>\" \"\") (NIL \"alternative\" (\"boundary\" \"Apple-Mail=_352FCEEC-EB15-428F-9D8B-D3B4259DD646\") NIL NIL NIL) 17 NIL NIL NIL NIL) \"report\" (\"report-type\" \"delivery-status\" \"boundary\" \"_e0d7475d888f9882b71de053e5efb221_idea\") NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Syntax error in BODYSTRUCTURE: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "report"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["report-type"], Is.EqualTo ("delivery-status"), "report-type param did not match"); Assert.That (multipart.ContentType.Boundary, Is.EqualTo ("_e0d7475d888f9882b71de053e5efb221_idea"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "multipart children did not match"); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "First multipart subpart types did not match."); var plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("7bit"), "Content-Transfer-Encoding did not match."); Assert.That (plain.Octets, Is.EqualTo (727), "Octets did not match."); Assert.That (plain.Lines, Is.EqualTo (16), "Lines did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "Second multipart subpart types did not match."); var deliveryStatus = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (deliveryStatus.ContentType.Name, Is.EqualTo ("Delivery status"), "name param did not match"); Assert.That (deliveryStatus.ContentTransferEncoding, Is.EqualTo ("7bit"), "Content-Transfer-Encoding did not match."); Assert.That (deliveryStatus.Octets, Is.EqualTo (416), "Octets did not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "Third multipart subpart types did not match."); var rfc822 = (BodyPartMessage) multipart.BodyParts[2]; Assert.That (rfc822.ContentType.Name, Is.EqualTo ("Message headers"), "name param did not match"); Assert.That (rfc822.ContentTransferEncoding, Is.EqualTo ("7bit"), "Content-Transfer-Encoding did not match."); Assert.That (rfc822.Octets, Is.EqualTo (903), "Octets did not match."); Assert.That (rfc822.Lines, Is.EqualTo (17), "Lines did not match."); Assert.That (rfc822.Body, Is.InstanceOf (), "rfc822 body types did not match."); var alternative = (BodyPartMultipart) rfc822.Body; Assert.That (alternative.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "Content-Type did not match."); Assert.That (alternative.ContentType.Boundary, Is.EqualTo ("Apple-Mail=_352FCEEC-EB15-428F-9D8B-D3B4259DD646"), "boundary param did not match"); Assert.That (alternative.BodyParts, Is.Empty, "alternative bodyparts count did not match."); } } } } [Test] public async Task TestParseBodyStructureWithNilMultipartBodyAsync () { const string text = "((\"text\" \"plain\" (\"charset\" \"utf-8\") NIL NIL \"7bit\" 727 16 NIL NIL NIL NIL)(\"message\" \"delivery-status\" (\"name\" \"Delivery status\") NIL NIL \"7bit\" 416 NIL NIL NIL NIL)(\"message\" \"rfc822\" (\"name\" \"Message headers\") NIL NIL \"7bit\" 903 (\"Mon, 17 Nov 2014 13:29:21 +0100\" \"Re: Adresy\" ((\"username\" NIL \"e.username\" \"example.com\")) ((\"username\" NIL \"e.username\" \"example.com\")) ((\"username\" NIL \"e.username\" \"example.com\")) ((\"=?utf-8?Q?Justyna?=\" NIL \"salesde\" \"some-company.eu\")) ((NIL NIL \"saleseu\" \"some-company.eu\")(\"Bogdan\" NIL \"bogdan\" \"some-company.eu\")) NIL \"<004901d00260$35405970$9fc10c50$@some-company.eu>\" \"\") (NIL \"alternative\" (\"boundary\" \"Apple-Mail=_352FCEEC-EB15-428F-9D8B-D3B4259DD646\") NIL NIL NIL) 17 NIL NIL NIL NIL) \"report\" (\"report-type\" \"delivery-status\" \"boundary\" \"_e0d7475d888f9882b71de053e5efb221_idea\") NIL NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Syntax error in BODYSTRUCTURE: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "report"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Parameters["report-type"], Is.EqualTo ("delivery-status"), "report-type param did not match"); Assert.That (multipart.ContentType.Boundary, Is.EqualTo ("_e0d7475d888f9882b71de053e5efb221_idea"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "multipart children did not match"); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "First multipart subpart types did not match."); var plain = (BodyPartText) multipart.BodyParts[0]; Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("7bit"), "Content-Transfer-Encoding did not match."); Assert.That (plain.Octets, Is.EqualTo (727), "Octets did not match."); Assert.That (plain.Lines, Is.EqualTo (16), "Lines did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "Second multipart subpart types did not match."); var deliveryStatus = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (deliveryStatus.ContentType.Name, Is.EqualTo ("Delivery status"), "name param did not match"); Assert.That (deliveryStatus.ContentTransferEncoding, Is.EqualTo ("7bit"), "Content-Transfer-Encoding did not match."); Assert.That (deliveryStatus.Octets, Is.EqualTo (416), "Octets did not match."); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "Third multipart subpart types did not match."); var rfc822 = (BodyPartMessage) multipart.BodyParts[2]; Assert.That (rfc822.ContentType.Name, Is.EqualTo ("Message headers"), "name param did not match"); Assert.That (rfc822.ContentTransferEncoding, Is.EqualTo ("7bit"), "Content-Transfer-Encoding did not match."); Assert.That (rfc822.Octets, Is.EqualTo (903), "Octets did not match."); Assert.That (rfc822.Lines, Is.EqualTo (17), "Lines did not match."); Assert.That (rfc822.Body, Is.InstanceOf (), "rfc822 body types did not match."); var alternative = (BodyPartMultipart) rfc822.Body; Assert.That (alternative.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "Content-Type did not match."); Assert.That (alternative.ContentType.Boundary, Is.EqualTo ("Apple-Mail=_352FCEEC-EB15-428F-9D8B-D3B4259DD646"), "boundary param did not match"); Assert.That (alternative.BodyParts, Is.Empty, "alternative bodyparts count did not match."); } } } } static void AssertParseBadlyFormedBodyStructureWithCompletelyNilBodyParts1 (BodyPart body) { Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "mixed"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Boundary, Is.EqualTo ("008_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (2), "multipart children did not match"); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "First multipart/mixed subpart types did not match."); var related = (BodyPartMultipart) multipart.BodyParts[0]; Assert.That (related.ContentType.IsMimeType ("multipart", "related"), Is.True, "Content-Type did not match."); Assert.That (related.ContentType.Parameters["type"], Is.EqualTo ("multipart/alternative"), "type param did not match"); Assert.That (related.ContentType.Boundary, Is.EqualTo ("007_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP"), "boundary param did not match"); Assert.That (related.BodyParts, Has.Count.EqualTo (4), "multipart children did not match"); Assert.That (related.BodyParts[0], Is.InstanceOf (), "First multipart/related subpart types did not match."); var alternative = (BodyPartMultipart) related.BodyParts[0]; Assert.That (alternative.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "Content-Type did not match."); Assert.That (alternative.ContentType.Boundary, Is.EqualTo ("000_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP"), "boundary param did not match"); Assert.That (alternative.BodyParts, Has.Count.EqualTo (2), "multipart children did not match"); Assert.That (alternative.BodyParts[0], Is.InstanceOf (), "First multipart/alternative subpart types did not match."); var plain = (BodyPartText) alternative.BodyParts[0]; Assert.That (plain.ContentType.IsMimeType ("text", "plain"), Is.True, "Content-Type did not match."); Assert.That (plain.ContentType.Charset, Is.EqualTo ("us-ascii"), "Charset parameter did not match"); Assert.That (plain.ContentTransferEncoding, Is.EqualTo ("quoted-printable"), "Content-Transfer-Encoding did not match."); Assert.That (plain.Octets, Is.EqualTo (44619), "Octets did not match."); Assert.That (plain.Lines, Is.EqualTo (793), "Lines did not match."); Assert.That (alternative.BodyParts[1], Is.InstanceOf (), "Second multipart/alternative subpart types did not match."); var html = (BodyPartText) alternative.BodyParts[1]; Assert.That (html.ContentType.IsMimeType ("text", "html"), Is.True, "Content-Type did not match."); Assert.That (html.ContentTransferEncoding, Is.EqualTo ("quoted-printable"), "Content-Transfer-Encoding did not match."); Assert.That (html.Octets, Is.EqualTo (143984), "Octets did not match."); Assert.That (html.Lines, Is.EqualTo (2321), "Lines did not match."); Assert.That (related.BodyParts[1], Is.InstanceOf (), "Second multipart/related subpart types did not match."); var jpeg = (BodyPartBasic) related.BodyParts[1]; Assert.That (jpeg.ContentType.IsMimeType ("image", "jpeg"), Is.True, "Content-Type did not match."); Assert.That (jpeg.ContentType.Name, Is.EqualTo ("~WRD0000.jpg"), "Name parameter did not match"); Assert.That (jpeg.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Disposition did not match"); Assert.That (jpeg.ContentDisposition.FileName, Is.EqualTo ("~WRD0000.jpg"), "Filename parameter did not match"); Assert.That (jpeg.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encoding did not match."); Assert.That (jpeg.Octets, Is.EqualTo (1130), "Octets did not match."); Assert.That (related.BodyParts[2], Is.InstanceOf (), "Third multipart/related subpart types did not match."); var png = (BodyPartBasic) related.BodyParts[2]; Assert.That (png.ContentType.IsMimeType ("image", "png"), Is.True, "Content-Type did not match."); Assert.That (png.ContentType.Name, Is.EqualTo ("image001.png"), "Name parameter did not match"); Assert.That (png.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Disposition did not match"); Assert.That (png.ContentDisposition.FileName, Is.EqualTo ("image001.png"), "Filename parameter did not match"); Assert.That (png.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encoding did not match."); Assert.That (png.Octets, Is.EqualTo (8174), "Octets did not match."); Assert.That (related.BodyParts[3], Is.InstanceOf (), "Fourth multipart/related subpart types did not match."); png = (BodyPartBasic) related.BodyParts[3]; Assert.That (png.ContentType.IsMimeType ("image", "png"), Is.True, "Content-Type did not match."); Assert.That (png.ContentType.Name, Is.EqualTo ("image002.png"), "Name parameter did not match"); Assert.That (png.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Disposition did not match"); Assert.That (png.ContentDisposition.FileName, Is.EqualTo ("image002.png"), "Filename parameter did not match"); Assert.That (png.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encoding did not match."); Assert.That (png.Octets, Is.EqualTo (3524), "Octets did not match."); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "Second multipart/mixed subpart types did not match."); var rfc822 = (BodyPartMessage) multipart.BodyParts[1]; Assert.That (rfc822.ContentType.Name, Is.EqualTo (null), "name param did not match"); Assert.That (rfc822.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encoding did not match."); Assert.That (rfc822.Octets, Is.EqualTo (0), "Octets did not match."); Assert.That (rfc822.Lines, Is.EqualTo (0), "Lines did not match."); // Okay, lets skip ahead to the juicy bits... multipart = (BodyPartMultipart) rfc822.Body; Assert.That (multipart.ContentType.Boundary, Is.EqualTo ("010_18f52bea798548b88470c3df62d666bcScrubbed"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (4), "multipart children did not match"); rfc822 = (BodyPartMessage) multipart.BodyParts[2]; multipart = (BodyPartMultipart) rfc822.Body; alternative = (BodyPartMultipart) multipart.BodyParts[0]; for (int i = 0; i < alternative.BodyParts.Count; i++) { var nils = (BodyPartBasic) alternative.BodyParts[i]; Assert.That (nils.ContentType.IsMimeType ("application", "octet-stream"), Is.True, "Content-Type did not match."); Assert.That (nils.ContentDescription, Is.Null, "Content-Description should be null"); Assert.That (nils.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (nils.ContentId, Is.Null, "Content-Id should be null"); Assert.That (nils.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (nils.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (nils.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (nils.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encodings did not match"); Assert.That (nils.Octets, Is.EqualTo (0), "Octets did not match"); } } [Test] public void TestParseBadlyFormedBodyStructureWithCompletelyNilBodyParts1 () { const string text = "((((\"text\" \"plain\" (\"charset\" \"us-ascii\") NIL NIL \"quoted-printable\" 44619 793 NIL NIL NIL NIL)(\"text\" \"html\" (\"charset\" \"us-ascii\") NIL NIL \"quoted-printable\" 143984 2321 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"000_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP\") NIL NIL)(\"image\" \"jpeg\" (\"name\" \"~WRD0000.jpg\") \"<~WRD0000.jpg>\" \"~WRD0000.jpg\" \"base64\" 1130 NIL (\"inline\" (\"filename\" \"~WRD0000.jpg\" \"size\" \"823\" \"creation-date\" \"Thu, 14 Jul 2022 17:26:49 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:16 GMT\")) NIL NIL)(\"image\" \"png\" (\"name\" \"image001.png\") \"image001.png@01D89786.45095140\" \"image001.png\" \"base64\" 8174 NIL (\"inline\" (\"filename\" \"image001.png\" \"size\" \"5973\" \"creation-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL)(\"image\" \"png\" (\"name\" \"image002.png\") \"image002.png@01D89786.45095140\" \"image002.png\" \"base64\" 3524 NIL (\"inline\" (\"filename\" \"image002.png\" \"size\" \"2572\" \"creation-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL) \"related\" (\"boundary\" \"007_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP\" \"type\" \"multipart/alternative\") NIL NIL)(\"message\" \"rfc822\" NIL NIL NIL \"7BIT\" 0 (\"Thu, 14 Jul 2022 15:12:33 +0000\" \"Scrubbed\" ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) NIL NIL ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\") (\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) NIL \"Scrubbed@Scrubbed.com\" \"Scrubbed@Scrubbed.com\") ((((\"text\" \"plain\" (\"charset\" \"utf-8\") NIL NIL \"base64\" 53608 688 NIL NIL NIL NIL)(\"text\" \"html\" (\"charset\" \"utf-8\") \"Scrubbed@NAMP221.PROD.OUTLOOK.COM\" NIL \"base64\" 176002 2257 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"000_18f52bea798548b88470c3df62d666bcScrubbed\") NIL NIL)(\"image\" \"png\" (\"name\" \"image001.png\") \"image001.png@01D89770.62F36800\" \"image001.png\" \"base64\" 8174 NIL (\"inline\" (\"filename\" \"image001.png\" \"size\" \"5973\" \"creation-date\" \"Thu, 14 Jul 2022 15:12:32 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:17 GMT\")) NIL NIL)(\"image\" \"jpeg\" (\"name\" \"image002.jpg\") \"image002.jpg@01D89770.62F36800\" \"image002.jpg\" \"base64\" 1130 NIL (\"inline\" (\"filename\" \"image002.jpg\" \"size\" \"823\" \"creation-date\" \"Thu, 14 Jul 2022 15:12:32 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:17 GMT\")) NIL NIL)(\"image\" \"png\" (\"name\" \"image003.png\") \"image003.png@01D89770.62F36800\" \"image003.png\" \"base64\" 3524 NIL (\"inline\" (\"filename\" \"image003.png\" \"size\" \"2572\" \"creation-date\" \"Thu, 14 Jul 2022 15:12:32 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:17 GMT\")) NIL NIL) \"related\" (\"boundary\" \"009_18f52bea798548b88470c3df62d666bcScrubbed\" \"type\" \"multipart/alternative\") NIL NIL)(\"application\" \"pdf\" (\"name\" \"Scrubbed.pdf\") \"Scrubbed@NAMP221.PROD.OUTLOOK.COM\" \"Scrubbed.pdf\" \"base64\" 324012 NIL (\"attachment\" (\"filename\" \"Scrubbed.pdf\" \"size\" \"236776\" \"creation-date\" \"Thu, 14 Jul 2022 14:53:00 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:17 GMT\")) NIL NIL)(\"message\" \"rfc822\" NIL \"Scrubbed@NAMP221.PROD.OUTLOOK.COM\" NIL \"7BIT\" 0 (\"Tue, 11 Jan 2022 16:34:33 +0000\" \"RE: Scrubbed\" ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) NIL NIL ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\") (\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\") (\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) NIL \"Scrubbed@Scrubbed.com\" \"Scrubbed@Scrubbed.CANPRD01.PROD.OUTLOOK.COM\") (((NIL NIL NIL NIL NIL \"7BIT\" 0 NIL NIL NIL NIL)(NIL NIL NIL NIL NIL \"7BIT\" 0 NIL NIL NIL NIL)(NIL NIL NIL NIL NIL \"7BIT\" 0 NIL NIL NIL NIL)(NIL NIL NIL NIL NIL \"7BIT\" 0 NIL NIL NIL NIL) \"related\" (\"boundary\" \"007_YT2PR01MB47524CF92A3AD1F75AFF2D25D9519YT2PR01MB4752CANP\" \"type\" \"multipart/alternative\") NIL NIL)(\"application\" \"pdf\" (\"name\" \"Scrubbed.pdf\") NIL \"Scrubbed.pdf\" \"base64\" 215638 NIL (\"attachment\" (\"filename\" \"Scrubbed.pdf\" \"size\" \"157579\" \"creation-date\" \"Wed, 02 Feb 2022 21:33:39 GMT\" \"modification-date\" \"Wed, 02 Feb 2022 21:33:39 GMT\")) NIL NIL) \"mixed\" (\"boundary\" \"008_YT2PR01MB47524CF92A3AD1F75AFF2D25D9519YT2PR01MB4752CANP\") NIL \"en-US\") 0 NIL (\"attachment\" (\"creation-date\" \"Thu, 14 Jul 2022 15:12:31 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL)(\"application\" \"pdf\" (\"name\" \"Scrubbed.pdf?=\") \"Scrubbed@NAMP221.PROD.OUTLOOK.COM\" \"Scrubbed.pdf?=\" \"base64\" 208376 NIL (\"attachment\" (\"filename\" \"Scrubbed.pdf?=\" \"size\" \"152274\" \"creation-date\" \"Thu, 14 Jul 2022 15:05:00 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL) \"mixed\" (\"boundary\" \"010_18f52bea798548b88470c3df62d666bcScrubbed\") NIL \"en-US\") 0 NIL (\"attachment\" (\"creation-date\" \"Thu, 14 Jul 2022 17:33:16 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL) \"mixed\" (\"boundary\" \"008_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP\") NIL \"en-US\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Syntax error in BODYSTRUCTURE: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); AssertParseBadlyFormedBodyStructureWithCompletelyNilBodyParts1 (body); } } } } [Test] public async Task TestParseBadlyFormedBodyStructureWithCompletelyNilBodyParts1Async () { const string text = "((((\"text\" \"plain\" (\"charset\" \"us-ascii\") NIL NIL \"quoted-printable\" 44619 793 NIL NIL NIL NIL)(\"text\" \"html\" (\"charset\" \"us-ascii\") NIL NIL \"quoted-printable\" 143984 2321 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"000_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP\") NIL NIL)(\"image\" \"jpeg\" (\"name\" \"~WRD0000.jpg\") \"<~WRD0000.jpg>\" \"~WRD0000.jpg\" \"base64\" 1130 NIL (\"inline\" (\"filename\" \"~WRD0000.jpg\" \"size\" \"823\" \"creation-date\" \"Thu, 14 Jul 2022 17:26:49 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:16 GMT\")) NIL NIL)(\"image\" \"png\" (\"name\" \"image001.png\") \"image001.png@01D89786.45095140\" \"image001.png\" \"base64\" 8174 NIL (\"inline\" (\"filename\" \"image001.png\" \"size\" \"5973\" \"creation-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL)(\"image\" \"png\" (\"name\" \"image002.png\") \"image002.png@01D89786.45095140\" \"image002.png\" \"base64\" 3524 NIL (\"inline\" (\"filename\" \"image002.png\" \"size\" \"2572\" \"creation-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL) \"related\" (\"boundary\" \"007_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP\" \"type\" \"multipart/alternative\") NIL NIL)(\"message\" \"rfc822\" NIL NIL NIL \"7BIT\" 0 (\"Thu, 14 Jul 2022 15:12:33 +0000\" \"Scrubbed\" ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) NIL NIL ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\") (\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) NIL \"Scrubbed@Scrubbed.com\" \"Scrubbed@Scrubbed.com\") ((((\"text\" \"plain\" (\"charset\" \"utf-8\") NIL NIL \"base64\" 53608 688 NIL NIL NIL NIL)(\"text\" \"html\" (\"charset\" \"utf-8\") \"Scrubbed@NAMP221.PROD.OUTLOOK.COM\" NIL \"base64\" 176002 2257 NIL NIL NIL NIL) \"alternative\" (\"boundary\" \"000_18f52bea798548b88470c3df62d666bcScrubbed\") NIL NIL)(\"image\" \"png\" (\"name\" \"image001.png\") \"image001.png@01D89770.62F36800\" \"image001.png\" \"base64\" 8174 NIL (\"inline\" (\"filename\" \"image001.png\" \"size\" \"5973\" \"creation-date\" \"Thu, 14 Jul 2022 15:12:32 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:17 GMT\")) NIL NIL)(\"image\" \"jpeg\" (\"name\" \"image002.jpg\") \"image002.jpg@01D89770.62F36800\" \"image002.jpg\" \"base64\" 1130 NIL (\"inline\" (\"filename\" \"image002.jpg\" \"size\" \"823\" \"creation-date\" \"Thu, 14 Jul 2022 15:12:32 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:17 GMT\")) NIL NIL)(\"image\" \"png\" (\"name\" \"image003.png\") \"image003.png@01D89770.62F36800\" \"image003.png\" \"base64\" 3524 NIL (\"inline\" (\"filename\" \"image003.png\" \"size\" \"2572\" \"creation-date\" \"Thu, 14 Jul 2022 15:12:32 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:17 GMT\")) NIL NIL) \"related\" (\"boundary\" \"009_18f52bea798548b88470c3df62d666bcScrubbed\" \"type\" \"multipart/alternative\") NIL NIL)(\"application\" \"pdf\" (\"name\" \"Scrubbed.pdf\") \"Scrubbed@NAMP221.PROD.OUTLOOK.COM\" \"Scrubbed.pdf\" \"base64\" 324012 NIL (\"attachment\" (\"filename\" \"Scrubbed.pdf\" \"size\" \"236776\" \"creation-date\" \"Thu, 14 Jul 2022 14:53:00 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:17 GMT\")) NIL NIL)(\"message\" \"rfc822\" NIL \"Scrubbed@NAMP221.PROD.OUTLOOK.COM\" NIL \"7BIT\" 0 (\"Tue, 11 Jan 2022 16:34:33 +0000\" \"RE: Scrubbed\" ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) NIL NIL ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) ((\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\") (\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\") (\"Scrubbed\" NIL \"Scrubbed\" \"Scrubbed\")) NIL \"Scrubbed@Scrubbed.com\" \"Scrubbed@Scrubbed.CANPRD01.PROD.OUTLOOK.COM\") (((NIL NIL NIL NIL NIL \"7BIT\" 0 NIL NIL NIL NIL)(NIL NIL NIL NIL NIL \"7BIT\" 0 NIL NIL NIL NIL)(NIL NIL NIL NIL NIL \"7BIT\" 0 NIL NIL NIL NIL)(NIL NIL NIL NIL NIL \"7BIT\" 0 NIL NIL NIL NIL) \"related\" (\"boundary\" \"007_YT2PR01MB47524CF92A3AD1F75AFF2D25D9519YT2PR01MB4752CANP\" \"type\" \"multipart/alternative\") NIL NIL)(\"application\" \"pdf\" (\"name\" \"Scrubbed.pdf\") NIL \"Scrubbed.pdf\" \"base64\" 215638 NIL (\"attachment\" (\"filename\" \"Scrubbed.pdf\" \"size\" \"157579\" \"creation-date\" \"Wed, 02 Feb 2022 21:33:39 GMT\" \"modification-date\" \"Wed, 02 Feb 2022 21:33:39 GMT\")) NIL NIL) \"mixed\" (\"boundary\" \"008_YT2PR01MB47524CF92A3AD1F75AFF2D25D9519YT2PR01MB4752CANP\") NIL \"en-US\") 0 NIL (\"attachment\" (\"creation-date\" \"Thu, 14 Jul 2022 15:12:31 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL)(\"application\" \"pdf\" (\"name\" \"Scrubbed.pdf?=\") \"Scrubbed@NAMP221.PROD.OUTLOOK.COM\" \"Scrubbed.pdf?=\" \"base64\" 208376 NIL (\"attachment\" (\"filename\" \"Scrubbed.pdf?=\" \"size\" \"152274\" \"creation-date\" \"Thu, 14 Jul 2022 15:05:00 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL) \"mixed\" (\"boundary\" \"010_18f52bea798548b88470c3df62d666bcScrubbed\") NIL \"en-US\") 0 NIL (\"attachment\" (\"creation-date\" \"Thu, 14 Jul 2022 17:33:16 GMT\" \"modification-date\" \"Thu, 14 Jul 2022 17:33:18 GMT\")) NIL NIL) \"mixed\" (\"boundary\" \"008_BN0P221MB04483769DDD81948BC7C387DC8889BN0P221MB0448NAMP\") NIL \"en-US\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Syntax error in BODYSTRUCTURE: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); AssertParseBadlyFormedBodyStructureWithCompletelyNilBodyParts1 (body); } } } } static void AssertParseBadlyFormedBodyStructureWithCompletelyNilBodyParts2 (BodyPart body) { Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "report"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Boundary, Is.EqualTo ("272F16D4031920.1659452466/hermes.gatewaynet.com"), "boundary param did not match"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "multipart children did not match"); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "First multipart/report subpart types did not match."); var nils = (BodyPartBasic) multipart.BodyParts[0]; Assert.That (nils.ContentType.IsMimeType ("application", "octet-stream"), Is.True, "Content-Type did not match."); Assert.That (nils.ContentDescription, Is.Null, "Content-Description should be null"); Assert.That (nils.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (nils.ContentId, Is.Null, "Content-Id should be null"); Assert.That (nils.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (nils.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (nils.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (nils.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encodings did not match"); Assert.That (nils.Octets, Is.EqualTo (563), "Octets did not match"); } [Test] public void TestParseBadlyFormedBodyStructureWithCompletelyNilBodyParts2 () { const string text = "((NIL NIL NIL NIL NIL \"7BIT\" 563 NIL NIL NIL NIL)(\"message\" \"delivery-status\" NIL NIL NIL \"7BIT\" 658 NIL NIL NIL NIL)(\"message\" \"rfc822\" NIL NIL NIL \"8bit\" 0 (\"Tue, 2 Aug 2022 15:00:47 +0000\" \"[POSSIBLE SPAM 11.4] Invoices now overdue - 115365#\" ((NIL NIL \"MAILBOX\" \"OUR-DOMAIN\")) NIL NIL ((NIL NIL \"accounts\" \"OTHER-DOMAIN\") (NIL NIL \"safety\" \"OTHER-DOMAIN\") (NIL NIL \"USER\" \"OUR-DOMAIN\")) NIL NIL NIL \"<1IOGPFNLIHU4.377MHPZYJQ6E3@OUR-SERVER>\") (((\"text\" \"plain\" (\"charset\" \"utf-8\") NIL NIL \"8bit\" 597 16 NIL NIL NIL NIL)((\"text\" \"html\" (\"charset\" \"utf-8\") NIL NIL \"7BIT\" 1611 26 NIL NIL NIL NIL)(\"image\" \"png\" (\"name\" \"0.dat\") \"<1KWGPFNLIHU4.4RR7HCVM8MQQ1@OUR-SERVER>\" NIL \"base64\" 14172 NIL (\"inline\" (\"filename\" \"0.dat\")) NIL \"0.dat\")(\"image\" \"png\" (\"name\" \"1.dat\") \"<1KWGPFNLIHU4.UWJ8R86RE2KA2@OUR-SERVER>\" NIL \"base64\" 486 NIL (\"inline\" (\"filename\" \"1.dat\")) NIL \"1.dat\")(\"image\" \"png\" (\"name\" \"2.dat\") \"<1KWGPFNLIHU4.EC7HN124OJC32@OUR-SERVER>\" NIL \"base64\" 506 NIL (\"inline\" (\"filename\" \"2.dat\")) NIL \"2.dat\")(\"image\" \"png\" (\"name\" \"3.dat\") \"<1KWGPFNLIHU4.WM1ALJTG745F1@OUR-SERVER>\" NIL \"base64\" 616 NIL (\"inline\" (\"filename\" \"3.dat\")) NIL \"3.dat\")(\"image\" \"png\" (\"name\" \"4.dat\") \"<1KWGPFNLIHU4.1B42S5EVSF4B2@OUR-SERVER>\" NIL \"base64\" 22470 NIL (\"inline\" (\"filename\" \"4.dat\")) NIL \"4.dat\") \"related\" (\"boundary\" \"=-5nEE2FIlRoeXkJyZAHV8UA==\" \"type\" \"text/html\") NIL NIL) \"alternative\" (\"boundary\" \"=-1sRjeMizXVbc5nGIFXbARA==\") NIL NIL)(\"application\" \"pdf\" (\"name\" \"Reminder.pdf\") \"\" NIL \"base64\" 359650 NIL (\"attachment\" (\"filename\" \"Reminder.pdf\" \"size\" \"262820\")) NIL NIL) \"mixed\" (\"boundary\" \"=-EJwVTfPtacyNnTqY4DPQ0A==\") NIL NIL) 0 NIL NIL NIL NIL) \"report\" (\"report-type\" \"delivery-status\" \"boundary\" \"272F16D4031920.1659452466/hermes.gatewaynet.com\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Syntax error in BODYSTRUCTURE: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); AssertParseBadlyFormedBodyStructureWithCompletelyNilBodyParts2 (body); } } } } [Test] public async Task TestParseBadlyFormedBodyStructureWithCompletelyNilBodyParts2Async () { const string text = "((NIL NIL NIL NIL NIL \"7BIT\" 563 NIL NIL NIL NIL)(\"message\" \"delivery-status\" NIL NIL NIL \"7BIT\" 658 NIL NIL NIL NIL)(\"message\" \"rfc822\" NIL NIL NIL \"8bit\" 0 (\"Tue, 2 Aug 2022 15:00:47 +0000\" \"[POSSIBLE SPAM 11.4] Invoices now overdue - 115365#\" ((NIL NIL \"MAILBOX\" \"OUR-DOMAIN\")) NIL NIL ((NIL NIL \"accounts\" \"OTHER-DOMAIN\") (NIL NIL \"safety\" \"OTHER-DOMAIN\") (NIL NIL \"USER\" \"OUR-DOMAIN\")) NIL NIL NIL \"<1IOGPFNLIHU4.377MHPZYJQ6E3@OUR-SERVER>\") (((\"text\" \"plain\" (\"charset\" \"utf-8\") NIL NIL \"8bit\" 597 16 NIL NIL NIL NIL)((\"text\" \"html\" (\"charset\" \"utf-8\") NIL NIL \"7BIT\" 1611 26 NIL NIL NIL NIL)(\"image\" \"png\" (\"name\" \"0.dat\") \"<1KWGPFNLIHU4.4RR7HCVM8MQQ1@OUR-SERVER>\" NIL \"base64\" 14172 NIL (\"inline\" (\"filename\" \"0.dat\")) NIL \"0.dat\")(\"image\" \"png\" (\"name\" \"1.dat\") \"<1KWGPFNLIHU4.UWJ8R86RE2KA2@OUR-SERVER>\" NIL \"base64\" 486 NIL (\"inline\" (\"filename\" \"1.dat\")) NIL \"1.dat\")(\"image\" \"png\" (\"name\" \"2.dat\") \"<1KWGPFNLIHU4.EC7HN124OJC32@OUR-SERVER>\" NIL \"base64\" 506 NIL (\"inline\" (\"filename\" \"2.dat\")) NIL \"2.dat\")(\"image\" \"png\" (\"name\" \"3.dat\") \"<1KWGPFNLIHU4.WM1ALJTG745F1@OUR-SERVER>\" NIL \"base64\" 616 NIL (\"inline\" (\"filename\" \"3.dat\")) NIL \"3.dat\")(\"image\" \"png\" (\"name\" \"4.dat\") \"<1KWGPFNLIHU4.1B42S5EVSF4B2@OUR-SERVER>\" NIL \"base64\" 22470 NIL (\"inline\" (\"filename\" \"4.dat\")) NIL \"4.dat\") \"related\" (\"boundary\" \"=-5nEE2FIlRoeXkJyZAHV8UA==\" \"type\" \"text/html\") NIL NIL) \"alternative\" (\"boundary\" \"=-1sRjeMizXVbc5nGIFXbARA==\") NIL NIL)(\"application\" \"pdf\" (\"name\" \"Reminder.pdf\") \"\" NIL \"base64\" 359650 NIL (\"attachment\" (\"filename\" \"Reminder.pdf\" \"size\" \"262820\")) NIL NIL) \"mixed\" (\"boundary\" \"=-EJwVTfPtacyNnTqY4DPQ0A==\") NIL NIL) 0 NIL NIL NIL NIL) \"report\" (\"report-type\" \"delivery-status\" \"boundary\" \"272F16D4031920.1659452466/hermes.gatewaynet.com\") NIL NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Syntax error in BODYSTRUCTURE: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); AssertParseBadlyFormedBodyStructureWithCompletelyNilBodyParts2 (body); } } } } static void AssertParseBadlyFormedBodyStructureWithEmptyParensInsteadOfContentLocation (BodyPart body) { Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "related"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Boundary, Is.EqualTo ("_004_7D3F5AE184118942976793FC500B8F4A402D17DB3PRD0702MB097eu_"), "boundary param did not match"); Assert.That (multipart.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (multipart.ContentLanguage, Has.Length.EqualTo (1), "Content-Language should not be null"); Assert.That (multipart.ContentLanguage[0], Is.EqualTo ("de-DE"), "Content-Language did not match"); Assert.That (multipart.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (4), "multipart children did not match"); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "First multipart/related subpart types did not match."); var text = (BodyPartText) multipart.BodyParts[0]; Assert.That (text.ContentType.IsMimeType ("text", "html"), Is.True, "Content-Type did not match."); Assert.That (text.ContentType.Charset, Is.EqualTo ("utf-8"), "Charset param did not match"); Assert.That (text.ContentDescription, Is.Null, "Content-Description should be null"); Assert.That (text.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (text.ContentId, Is.Null, "Content-Id should be null"); Assert.That (text.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (text.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (text.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (text.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encodings did not match"); Assert.That (text.Octets, Is.EqualTo (38706), "Octets did not match"); Assert.That (text.Lines, Is.EqualTo (497), "Lines did not match"); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "Second multipart/related subpart types did not match."); var image1 = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (image1.ContentType.IsMimeType ("image", "jpeg"), Is.True, "Content-Type did not match."); Assert.That (image1.ContentType.Name, Is.EqualTo ("image003.jpg"), "Name parameter did not match"); Assert.That (image1.ContentDescription, Is.EqualTo ("image003.jpg"), "Content-Description should be null"); Assert.That (image1.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Content-Disposition did not match"); Assert.That (image1.ContentDisposition.Parameters.ToString (), Is.EqualTo ("; filename=\"image003.jpg\"; size=\"2782\"; creation-date=\"Thu, 22 Mar 2012 13:56:38 GMT\"; modification-date=\"Thu, 22 Mar 2012 13:56:38 GMT\""), "Content-Disposition parameters did not match"); Assert.That (image1.ContentId, Is.EqualTo (""), "Content-Id did not match"); Assert.That (image1.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (image1.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (image1.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (image1.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encodings did not match"); Assert.That (image1.Octets, Is.EqualTo (3446), "Octets did not match"); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "Third multipart/related subpart types did not match."); var image2 = (BodyPartBasic) multipart.BodyParts[2]; Assert.That (image2.ContentType.IsMimeType ("image", "jpeg"), Is.True, "Content-Type did not match."); Assert.That (image2.ContentType.Name, Is.EqualTo ("image004.jpg"), "Name parameter did not match"); Assert.That (image2.ContentDescription, Is.EqualTo ("image004.jpg"), "Content-Description should be null"); Assert.That (image2.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Content-Disposition did not match"); Assert.That (image2.ContentDisposition.Parameters.ToString (), Is.EqualTo ("; filename=\"image004.jpg\"; size=\"2782\"; creation-date=\"Thu, 22 Mar 2012 13:56:39 GMT\"; modification-date=\"Thu, 22 Mar 2012 13:56:39 GMT\""), "Content-Disposition parameters did not match"); Assert.That (image2.ContentId, Is.EqualTo (""), "Content-Id did not match"); Assert.That (image2.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (image2.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (image2.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (image2.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encodings did not match"); Assert.That (image2.Octets, Is.EqualTo (3446), "Octets did not match"); Assert.That (multipart.BodyParts[3], Is.InstanceOf (), "Fourth multipart/related subpart types did not match."); var image3 = (BodyPartBasic) multipart.BodyParts[3]; Assert.That (image3.ContentType.IsMimeType ("image", "jpeg"), Is.True, "Content-Type did not match."); Assert.That (image3.ContentType.Name, Is.EqualTo ("image005.jpg"), "Name parameter did not match"); Assert.That (image3.ContentDescription, Is.EqualTo ("image005.jpg"), "Content-Description should be null"); Assert.That (image3.ContentDisposition.Disposition, Is.EqualTo ("inline"), "Content-Disposition did not match"); Assert.That (image3.ContentDisposition.Parameters.ToString (), Is.EqualTo ("; filename=\"image005.jpg\"; size=\"2625\"; creation-date=\"Thu, 22 Mar 2012 13:56:39 GMT\"; modification-date=\"Thu, 22 Mar 2012 13:56:39 GMT\""), "Content-Disposition parameters did not match"); Assert.That (image3.ContentId, Is.EqualTo (""), "Content-Id did not match"); Assert.That (image3.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (image3.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (image3.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (image3.ContentTransferEncoding, Is.EqualTo ("base64"), "Content-Transfer-Encodings did not match"); Assert.That (image3.Octets, Is.EqualTo (3232), "Octets did not match"); } [Test] public void TestParseBadlyFormedBodyStructureWithEmptyParensInsteadOfContentLocation () { const string text = "((\"text\" \"html\" (\"charset\" \"utf-8\") NIL NIL \"base64\" 38706 497 NIL NIL NIL ()) (\"image\" \"jpeg\" (\"name\" \"image003.jpg\") \"\" \"image003.jpg\" \"base64\" 3446 NIL (\"inline\" (\"filename\" \"image003.jpg\" \"size\" \"2782\" \"creation-date\" \"Thu, 22 Mar 2012 13:56:38 GMT\" \"modification-date\" \"Thu, 22 Mar 2012 13:56:38 GMT\")) NIL ()) (\"image\" \"jpeg\" (\"name\" \"image004.jpg\") \"\" \"image004.jpg\" \"base64\" 3446 NIL (\"inline\" (\"filename\" \"image004.jpg\" \"size\" \"2782\" \"creation-date\" \"Thu, 22 Mar 2012 13:56:39 GMT\" \"modification-date\" \"Thu, 22 Mar 2012 13:56:39 GMT\")) NIL ()) (\"image\" \"jpeg\" (\"name\" \"image005.jpg\") \"\" \"image005.jpg\" \"base64\" 3232 NIL (\"inline\" (\"filename\" \"image005.jpg\" \"size\" \"2625\" \"creation-date\" \"Thu, 22 Mar 2012 13:56:39 GMT\" \"modification-date\" \"Thu, 22 Mar 2012 13:56:39 GMT\")) NIL ()) \"related\" (\"boundary\" \"_004_7D3F5AE184118942976793FC500B8F4A402D17DB3PRD0702MB097eu_\" \"type\" \"text/html\") NIL (\"de-DE\") NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Syntax error in BODYSTRUCTURE: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); AssertParseBadlyFormedBodyStructureWithEmptyParensInsteadOfContentLocation (body); } } } } [Test] public async Task TestParseBadlyFormedBodyStructureWithEmptyParensInsteadOfContentLocationAsync () { const string text = "((\"text\" \"html\" (\"charset\" \"utf-8\") NIL NIL \"base64\" 38706 497 NIL NIL NIL ()) (\"image\" \"jpeg\" (\"name\" \"image003.jpg\") \"\" \"image003.jpg\" \"base64\" 3446 NIL (\"inline\" (\"filename\" \"image003.jpg\" \"size\" \"2782\" \"creation-date\" \"Thu, 22 Mar 2012 13:56:38 GMT\" \"modification-date\" \"Thu, 22 Mar 2012 13:56:38 GMT\")) NIL ()) (\"image\" \"jpeg\" (\"name\" \"image004.jpg\") \"\" \"image004.jpg\" \"base64\" 3446 NIL (\"inline\" (\"filename\" \"image004.jpg\" \"size\" \"2782\" \"creation-date\" \"Thu, 22 Mar 2012 13:56:39 GMT\" \"modification-date\" \"Thu, 22 Mar 2012 13:56:39 GMT\")) NIL ()) (\"image\" \"jpeg\" (\"name\" \"image005.jpg\") \"\" \"image005.jpg\" \"base64\" 3232 NIL (\"inline\" (\"filename\" \"image005.jpg\" \"size\" \"2625\" \"creation-date\" \"Thu, 22 Mar 2012 13:56:39 GMT\" \"modification-date\" \"Thu, 22 Mar 2012 13:56:39 GMT\")) NIL ()) \"related\" (\"boundary\" \"_004_7D3F5AE184118942976793FC500B8F4A402D17DB3PRD0702MB097eu_\" \"type\" \"text/html\") NIL (\"de-DE\") NIL)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Syntax error in BODYSTRUCTURE: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODYSTRUCTURE failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); AssertParseBadlyFormedBodyStructureWithEmptyParensInsteadOfContentLocation (body); } } } } static void AssertParseBadlyFormedGMailMultipartBodyResponseWithNoChildren (BodyPart body) { Assert.That (body, Is.InstanceOf (), "Body types did not match."); var multipart = (BodyPartMultipart) body; Assert.That (multipart.ContentType.IsMimeType ("multipart", "report"), Is.True, "Content-Type did not match."); Assert.That (multipart.ContentType.Boundary, Is.Null, "boundary should be null"); Assert.That (multipart.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (multipart.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (multipart.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (multipart.BodyParts, Has.Count.EqualTo (3), "multipart children did not match"); Assert.That (multipart.BodyParts[0], Is.InstanceOf (), "First multipart/report subpart types did not match."); var text = (BodyPartText) multipart.BodyParts[0]; Assert.That (text.ContentType.IsMimeType ("text", "plain"), Is.True, "Content-Type did not match."); Assert.That (text.ContentType.Charset, Is.EqualTo ("windows-1252"), "Charset param did not match"); Assert.That (text.ContentDescription, Is.Null, "Content-Description should be null"); Assert.That (text.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (text.ContentId, Is.Null, "Content-Id should be null"); Assert.That (text.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (text.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (text.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (text.ContentTransferEncoding, Is.EqualTo ("QUOTED-PRINTABLE"), "Content-Transfer-Encodings did not match"); Assert.That (text.Octets, Is.EqualTo (211), "Octets did not match"); Assert.That (text.Lines, Is.EqualTo (5), "Lines did not match"); Assert.That (multipart.BodyParts[1], Is.InstanceOf (), "Second multipart/report subpart types did not match."); var deliveryStatus = (BodyPartBasic) multipart.BodyParts[1]; Assert.That (deliveryStatus.ContentType.IsMimeType ("message", "delivery-status"), Is.True, "Content-Type did not match."); Assert.That (deliveryStatus.ContentDescription, Is.Null, "Content-Description should be null"); Assert.That (deliveryStatus.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (deliveryStatus.ContentId, Is.Null, "Content-Id should be null"); Assert.That (deliveryStatus.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (deliveryStatus.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (deliveryStatus.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (deliveryStatus.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encodings did not match"); Assert.That (deliveryStatus.Octets, Is.EqualTo (344), "Octets did not match"); Assert.That (multipart.BodyParts[2], Is.InstanceOf (), "Third multipart/report subpart types did not match."); var rfc822 = (BodyPartMessage) multipart.BodyParts[2]; Assert.That (rfc822.ContentType.IsMimeType ("message", "rfc822"), Is.True, "Content-Type did not match."); Assert.That (rfc822.ContentDescription, Is.Null, "Content-Description should be null"); Assert.That (rfc822.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (rfc822.ContentId, Is.Null, "Content-Id should be null"); Assert.That (rfc822.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (rfc822.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (rfc822.ContentMd5, Is.Null, "Content-Md5 should be null"); Assert.That (rfc822.ContentTransferEncoding, Is.EqualTo ("7BIT"), "Content-Transfer-Encodings did not match"); Assert.That (rfc822.Octets, Is.EqualTo (2942), "Octets did not match"); Assert.That (rfc822.Body, Is.InstanceOf (), "Body of message/rfc822 did not match."); var alternative = (BodyPartMultipart) rfc822.Body; Assert.That (alternative.ContentType.IsMimeType ("multipart", "alternative"), Is.True, "Content-Type did not match."); Assert.That (alternative.ContentType.Boundary, Is.Null, "boundary should be null"); Assert.That (alternative.ContentDisposition, Is.Null, "Content-Disposition should be null"); Assert.That (alternative.ContentLanguage, Is.Null, "Content-Language should be null"); Assert.That (alternative.ContentLocation, Is.Null, "Content-Location should be null"); Assert.That (alternative.BodyParts, Has.Count.EqualTo (0), "multipart children did not match"); } // issue 1841 [Test] public void TestParseBadlyFormedGMailMultipartBodyResponseWithNoChildren () { const string text = "((\"TEXT\" \"PLAIN\" (\"CHARSET\" \"windows-1252\") NIL NIL \"QUOTED-PRINTABLE\" 211 5)(\"MESSAGE\" \"DELIVERY-STATUS\" NIL NIL NIL \"7BIT\" 344)(\"MESSAGE\" \"RFC822\" NIL NIL NIL \"7BIT\" 2942 (\"Sat, 3 Jan 2015 19:26:15 +0100\" \"Re: MPG\" ((\"c p\" NIL \"---.---87\" \"gmail.com\")) ((\"c p\" NIL \"---.---87\" \"gmail.com\")) ((\"c p\" NIL \"---.---87\" \"gmail.com\")) ((\"am sa[cft]\" NIL \"sm\" \"cft.ce.fr\")) NIL NIL \"\" \"\") (\"ALTERNATIVE\") 51) \"REPORT\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.QuirksMode = ImapQuirksMode.GMail; engine.SetStream (tokenizer); try { body = ImapUtils.ParseBody (engine, "Syntax error in BODY: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODY failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); AssertParseBadlyFormedGMailMultipartBodyResponseWithNoChildren (body); } } } } // issue 1841 [Test] public async Task TestParseBadlyFormedGMailMultipartBodyResponseWithNoChildrenAsync () { const string text = "((\"TEXT\" \"PLAIN\" (\"CHARSET\" \"windows-1252\") NIL NIL \"QUOTED-PRINTABLE\" 211 5)(\"MESSAGE\" \"DELIVERY-STATUS\" NIL NIL NIL \"7BIT\" 344)(\"MESSAGE\" \"RFC822\" NIL NIL NIL \"7BIT\" 2942 (\"Sat, 3 Jan 2015 19:26:15 +0100\" \"Re: MPG\" ((\"c p\" NIL \"---.---87\" \"gmail.com\")) ((\"c p\" NIL \"---.---87\" \"gmail.com\")) ((\"c p\" NIL \"---.---87\" \"gmail.com\")) ((\"am sa[cft]\" NIL \"sm\" \"cft.ce.fr\")) NIL NIL \"\" \"\") (\"ALTERNATIVE\") 51) \"REPORT\")\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { BodyPart body; engine.QuirksMode = ImapQuirksMode.GMail; engine.SetStream (tokenizer); try { body = await ImapUtils.ParseBodyAsync (engine, "Syntax error in BODY: {0}", string.Empty, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing BODY failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); AssertParseBadlyFormedGMailMultipartBodyResponseWithNoChildren (body); } } } } [Test] public void TestParseExampleThreads () { const string text = "(2)(3 6 (4 23)(44 7 96))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { var threads = new List (); engine.SetStream (tokenizer); try { ImapUtils.ParseThreads (engine, 0, threads, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing THREAD response failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (threads, Has.Count.EqualTo (2), "Expected 2 threads."); Assert.That (threads[0].UniqueId.Value.Id, Is.EqualTo ((uint) 2)); Assert.That (threads[1].UniqueId.Value.Id, Is.EqualTo ((uint) 3)); var branches = threads[1].Children.ToArray (); Assert.That (branches, Has.Length.EqualTo (1), "Expected 1 child."); Assert.That (branches[0].UniqueId.Value.Id, Is.EqualTo ((uint) 6)); branches = branches[0].Children.ToArray (); Assert.That (branches, Has.Length.EqualTo (2), "Expected 2 branches."); Assert.That (branches[0].UniqueId.Value.Id, Is.EqualTo ((uint) 4)); Assert.That (branches[1].UniqueId.Value.Id, Is.EqualTo ((uint) 44)); var children = branches[0].Children.ToArray (); Assert.That (children, Has.Length.EqualTo (1), "Expected 1 child."); Assert.That (children[0].UniqueId.Value.Id, Is.EqualTo ((uint) 23)); Assert.That (children[0].Children, Is.Empty, "Expected no children."); children = branches[1].Children.ToArray (); Assert.That (children, Has.Length.EqualTo (1), "Expected 1 child."); Assert.That (children[0].UniqueId.Value.Id, Is.EqualTo ((uint) 7)); children = children[0].Children.ToArray (); Assert.That (children, Has.Length.EqualTo (1), "Expected 1 child."); Assert.That (children[0].UniqueId.Value.Id, Is.EqualTo ((uint) 96)); Assert.That (children[0].Children, Is.Empty, "Expected no children."); } } } } [Test] public async Task TestParseExampleThreadsAsync () { const string text = "(2)(3 6 (4 23)(44 7 96))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { var threads = new List (); engine.SetStream (tokenizer); try { await ImapUtils.ParseThreadsAsync (engine, 0, threads, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing THREAD response failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (threads, Has.Count.EqualTo (2), "Expected 2 threads."); Assert.That (threads[0].UniqueId.Value.Id, Is.EqualTo ((uint) 2)); Assert.That (threads[1].UniqueId.Value.Id, Is.EqualTo ((uint) 3)); var branches = threads[1].Children.ToArray (); Assert.That (branches, Has.Length.EqualTo (1), "Expected 1 child."); Assert.That (branches[0].UniqueId.Value.Id, Is.EqualTo ((uint) 6)); branches = branches[0].Children.ToArray (); Assert.That (branches, Has.Length.EqualTo (2), "Expected 2 branches."); Assert.That (branches[0].UniqueId.Value.Id, Is.EqualTo ((uint) 4)); Assert.That (branches[1].UniqueId.Value.Id, Is.EqualTo ((uint) 44)); var children = branches[0].Children.ToArray (); Assert.That (children, Has.Length.EqualTo (1), "Expected 1 child."); Assert.That (children[0].UniqueId.Value.Id, Is.EqualTo ((uint) 23)); Assert.That (children[0].Children, Is.Empty, "Expected no children."); children = branches[1].Children.ToArray (); Assert.That (children, Has.Length.EqualTo (1), "Expected 1 child."); Assert.That (children[0].UniqueId.Value.Id, Is.EqualTo ((uint) 7)); children = children[0].Children.ToArray (); Assert.That (children, Has.Length.EqualTo (1), "Expected 1 child."); Assert.That (children[0].UniqueId.Value.Id, Is.EqualTo ((uint) 96)); Assert.That (children[0].Children, Is.Empty, "Expected no children."); } } } } [Test] public void TestParseLongDovecotExampleThread () { const string text = "(3 4 5 6 7)(1)((2)(8)(15))(9)(16)(10)(11)(12 13)(14)(17)(18)(19)(20)(21)(22)(23)(24)(25 (26)(29 39)(31)(32))(27)(28)(38 35)(30 33 34)(37)(36)(40)(41)((42 43)(44)(48)(49)(50)(51 52))(45)((46)(55))(47)(53)(54)(56)(57 (58)(59)(60)(63))((61)(62))(64)(65)(70)((66)(67)(68)(69)(71))(72 73 (74)(75)(76 77))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { var threads = new List (); engine.SetStream (tokenizer); try { ImapUtils.ParseThreads (engine, 0, threads, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing THREAD response failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (threads, Has.Count.EqualTo (40), "Expected 40 threads."); Assert.That (threads[0].UniqueId.Value.Id, Is.EqualTo ((uint) 3)); Assert.That (threads[1].UniqueId.Value.Id, Is.EqualTo ((uint) 1)); //Assert.That (threads[2].UniqueId.Value.Id, Is.EqualTo ((uint) 0)); Assert.That (threads[2].UniqueId.HasValue, Is.False); var branches = threads[2].Children.ToArray (); Assert.That (branches, Has.Length.EqualTo (3), "Expected 3 children."); } } } } [Test] public async Task TestParseLongDovecotExampleThreadAsync () { const string text = "(3 4 5 6 7)(1)((2)(8)(15))(9)(16)(10)(11)(12 13)(14)(17)(18)(19)(20)(21)(22)(23)(24)(25 (26)(29 39)(31)(32))(27)(28)(38 35)(30 33 34)(37)(36)(40)(41)((42 43)(44)(48)(49)(50)(51 52))(45)((46)(55))(47)(53)(54)(56)(57 (58)(59)(60)(63))((61)(62))(64)(65)(70)((66)(67)(68)(69)(71))(72 73 (74)(75)(76 77))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { var threads = new List (); engine.SetStream (tokenizer); try { await ImapUtils.ParseThreadsAsync (engine, 0, threads, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing THREAD response failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (threads, Has.Count.EqualTo (40), "Expected 40 threads."); Assert.That (threads[0].UniqueId.Value.Id, Is.EqualTo ((uint) 3)); Assert.That (threads[1].UniqueId.Value.Id, Is.EqualTo ((uint) 1)); //Assert.That (threads[2].UniqueId.Value.Id, Is.EqualTo ((uint) 0)); Assert.That (threads[2].UniqueId.HasValue, Is.False); var branches = threads[2].Children.ToArray (); Assert.That (branches, Has.Length.EqualTo (3), "Expected 3 children."); } } } } [Test] public void TestParseShortDovecotExampleThread () { const string text = "((352)(381))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { var threads = new List (); engine.SetStream (tokenizer); try { ImapUtils.ParseThreads (engine, 0, threads, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing THREAD response failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (threads, Has.Count.EqualTo (1), "Expected 1 thread."); //Assert.That (threads[0].UniqueId.Value.Id, Is.EqualTo ((uint) 0)); Assert.That (threads[0].UniqueId.HasValue, Is.False); var children = threads[0].Children; Assert.That (children, Has.Count.EqualTo (2), "Expected 2 children."); Assert.That (children[0].UniqueId.Value.Id, Is.EqualTo ((uint) 352)); Assert.That (children[1].UniqueId.Value.Id, Is.EqualTo ((uint) 381)); } } } } [Test] public async Task TestParseShortDovecotExampleThreadAsync () { const string text = "((352)(381))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { var threads = new List (); engine.SetStream (tokenizer); try { await ImapUtils.ParseThreadsAsync (engine, 0, threads, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing THREAD response failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (threads, Has.Count.EqualTo (1), "Expected 1 thread."); //Assert.That (threads[0].UniqueId.Value.Id, Is.EqualTo ((uint) 0)); Assert.That (threads[0].UniqueId.HasValue, Is.False); var children = threads[0].Children; Assert.That (children, Has.Count.EqualTo (2), "Expected 2 children."); Assert.That (children[0].UniqueId.Value.Id, Is.EqualTo ((uint) 352)); Assert.That (children[1].UniqueId.Value.Id, Is.EqualTo ((uint) 381)); } } } } [Test] public void TestFormatAnnotations () { var annotations = new List (); var command = new StringBuilder ("STORE "); var args = new List (); ImapUtils.FormatAnnotations (command, annotations, args, false); Assert.That (command.ToString (), Is.EqualTo ("STORE "), "empty collection"); annotations.Add (new Annotation (AnnotationEntry.AltSubject)); ImapUtils.FormatAnnotations (command, annotations, args, false); Assert.That (command.ToString (), Is.EqualTo ("STORE "), "annotation w/o properties"); Assert.Throws (() => ImapUtils.FormatAnnotations (command, annotations, args, true)); command.Clear (); command.Append ("STORE "); annotations[0].Properties.Add (AnnotationAttribute.SharedValue, "This is an alternate subject."); ImapUtils.FormatAnnotations (command, annotations, args, true); Assert.That (command.ToString (), Is.EqualTo ("STORE ANNOTATION (/altsubject (value.shared %S))")); Assert.That (args, Has.Count.EqualTo (1), "args"); Assert.That (args[0], Is.EqualTo ("This is an alternate subject."), "args[0]"); } [Test] public void TestParseAnnotationsExample1 () { const string text = "(/comment (value.priv \"My comment\" value.shared NIL))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { IList annotations; engine.SetStream (tokenizer); try { annotations = ImapUtils.ParseAnnotations (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ANNOTATION response failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (annotations, Has.Count.EqualTo (1), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (2), "Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "value.shared"); } } } } [Test] public async Task TestParseAnnotationsExample1Async () { const string text = "(/comment (value.priv \"My comment\" value.shared NIL))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { IList annotations; engine.SetStream (tokenizer); try { annotations = await ImapUtils.ParseAnnotationsAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ANNOTATION response failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (annotations, Has.Count.EqualTo (1), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (2), "Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "value.shared"); } } } } [Test] public void TestParseAnnotationsExample2 () { const string text = "(/comment (value.priv \"My comment\" value.shared NIL) /altsubject (value.priv \"My subject\" value.shared NIL))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { IList annotations; engine.SetStream (tokenizer); try { annotations = ImapUtils.ParseAnnotations (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ANNOTATION response failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (annotations, Has.Count.EqualTo (2), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "annotations[0].Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (2), "annotations[0].Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "annotations[0] value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[0] value.shared"); Assert.That (annotations[1].Entry, Is.EqualTo (AnnotationEntry.AltSubject), "annotations[1].Entry"); Assert.That (annotations[1].Properties, Has.Count.EqualTo (2), "annotations[1].Properties.Count"); Assert.That (annotations[1].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My subject"), "annotations[1] value.priv"); Assert.That (annotations[1].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[1] value.shared"); } } } } [Test] public async Task TestParseAnnotationsExample2Async () { const string text = "(/comment (value.priv \"My comment\" value.shared NIL) /altsubject (value.priv \"My subject\" value.shared NIL))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { IList annotations; engine.SetStream (tokenizer); try { annotations = await ImapUtils.ParseAnnotationsAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ANNOTATION response failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (annotations, Has.Count.EqualTo (2), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "annotations[0].Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (2), "annotations[0].Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "annotations[0] value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[0] value.shared"); Assert.That (annotations[1].Entry, Is.EqualTo (AnnotationEntry.AltSubject), "annotations[1].Entry"); Assert.That (annotations[1].Properties, Has.Count.EqualTo (2), "annotations[1].Properties.Count"); Assert.That (annotations[1].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My subject"), "annotations[1] value.priv"); Assert.That (annotations[1].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[1] value.shared"); } } } } [Test] public void TestParseAnnotationsExample3 () { const string text = "(/comment (value.priv \"My comment\" value.shared NIL size.priv \"10\" size.shared \"0\"))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { IList annotations; engine.SetStream (tokenizer); try { annotations = ImapUtils.ParseAnnotations (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ANNOTATION response failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (annotations, Has.Count.EqualTo (1), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "annotations[0].Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (4), "annotations[0].Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "annotations[0] value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[0] value.shared"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateSize], Is.EqualTo ("10"), "annotations[0] size.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedSize], Is.EqualTo ("0"), "annotations[0] size.shared"); } } } } [Test] public async Task TestParseAnnotationsExample3Async () { const string text = "(/comment (value.priv \"My comment\" value.shared NIL size.priv \"10\" size.shared \"0\"))\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { IList annotations; engine.SetStream (tokenizer); try { annotations = await ImapUtils.ParseAnnotationsAsync (engine, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing ANNOTATION response failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (annotations, Has.Count.EqualTo (1), "Count"); Assert.That (annotations[0].Entry, Is.EqualTo (AnnotationEntry.Comment), "annotations[0].Entry"); Assert.That (annotations[0].Properties, Has.Count.EqualTo (4), "annotations[0].Properties.Count"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateValue], Is.EqualTo ("My comment"), "annotations[0] value.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedValue], Is.EqualTo (null), "annotations[0] value.shared"); Assert.That (annotations[0].Properties[AnnotationAttribute.PrivateSize], Is.EqualTo ("10"), "annotations[0] size.priv"); Assert.That (annotations[0].Properties[AnnotationAttribute.SharedSize], Is.EqualTo ("0"), "annotations[0] size.shared"); } } } } [Test] public void TestParseFlagsList () { const string text = "(\\Answered \\Flagged \\Deleted \\Seen \\Draft + TAG TAG2 a b c d e f g h i j k l m n o p q r s t u v w x y z)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { var keywords = new HashSet (); MessageFlags flags; engine.SetStream (tokenizer); try { flags = ImapUtils.ParseFlagsList (engine, "INBOX", keywords, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing FLAGS response failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (flags, Is.EqualTo (MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.Draft), "message flags"); Assert.That (keywords, Has.Count.EqualTo (29), "keywords.Count"); Assert.That (keywords.Contains ("+"), Is.True, "Contains +"); Assert.That (keywords.Contains ("TAG"), Is.True, "Contains TAG"); Assert.That (keywords.Contains ("TAG2"), Is.True, "Contains TAG2"); for (char c = 'a'; c <= 'z'; c++) Assert.That (keywords.Contains (c.ToString ()), Is.True, $"Contains {c}"); } } } } [Test] public async Task TestParseFlagsListAsync () { const string text = "(\\Answered \\Flagged \\Deleted \\Seen \\Draft + TAG TAG2 a b c d e f g h i j k l m n o p q r s t u v w x y z)\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (null)) { var keywords = new HashSet (); MessageFlags flags; engine.SetStream (tokenizer); try { flags = await ImapUtils.ParseFlagsListAsync (engine, "INBOX", keywords, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing FLAGS response failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (flags, Is.EqualTo (MessageFlags.Answered | MessageFlags.Flagged | MessageFlags.Deleted | MessageFlags.Seen | MessageFlags.Draft), "message flags"); Assert.That (keywords, Has.Count.EqualTo (29), "keywords.Count"); Assert.That (keywords.Contains ("+"), Is.True, "Contains +"); Assert.That (keywords.Contains ("TAG"), Is.True, "Contains TAG"); Assert.That (keywords.Contains ("TAG2"), Is.True, "Contains TAG2"); for (char c = 'a'; c <= 'z'; c++) Assert.That (keywords.Contains (c.ToString ()), Is.True, $"Contains {c}"); } } } } ImapFolder CreateImapFolder (ImapFolderConstructorArgs args) { return new ImapFolder (args); } // Tests the work-around for issue #945 [Test] public void TestParseFolderListWithFolderNameContainingUnquotedTabs () { const string text = " (\\HasNoChildren) \"/\" INBOX/Da\tOggetto\tRicevuto\tDimensione\tCategorie\t\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (CreateImapFolder)) { var list = new List (); engine.QuirksMode = ImapQuirksMode.Exchange; engine.SetStream (tokenizer); try { ImapUtils.ParseFolderList (engine, list, false, false, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing LIST response failed: {ex}"); return; } var token = engine.ReadToken (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (list, Has.Count.EqualTo (1), "Count"); Assert.That (list[0].Name, Is.EqualTo ("Da\tOggetto\tRicevuto\tDimensione\tCategorie\t"), "Name"); } } } } [Test] public async Task TestParseFolderListWithFolderNameContainingUnquotedTabsAsync () { const string text = " (\\HasNoChildren) \"/\" INBOX/Da\tOggetto\tRicevuto\tDimensione\tCategorie\t\r\n"; using (var memory = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { using (var tokenizer = new ImapStream (memory, new NullProtocolLogger ())) { using (var engine = new ImapEngine (CreateImapFolder)) { var list = new List (); engine.QuirksMode = ImapQuirksMode.Exchange; engine.SetStream (tokenizer); try { await ImapUtils.ParseFolderListAsync (engine, list, false, false, CancellationToken.None); } catch (Exception ex) { Assert.Fail ($"Parsing LIST response failed: {ex}"); return; } var token = await engine.ReadTokenAsync (CancellationToken.None); Assert.That (token.Type, Is.EqualTo (ImapTokenType.Eoln), $"Expected new-line, but got: {token}"); Assert.That (list, Has.Count.EqualTo (1), "Count"); Assert.That (list[0].Name, Is.EqualTo ("Da\tOggetto\tRicevuto\tDimensione\tCategorie\t"), "Name"); } } } } [Test] [TestCase (2023, 5, 14, 12, 30, 45, -4, -30, "14-May-2023 12:30:45 -0430")] // Sunday [TestCase (2023, 5, 15, 12, 30, 45, -3, -30, "15-May-2023 12:30:45 -0330")] // Monday [TestCase (2023, 5, 16, 12, 30, 45, -2, 0, "16-May-2023 12:30:45 -0200")] // Tuesday [TestCase (2023, 5, 17, 12, 30, 45, -1, 0, "17-May-2023 12:30:45 -0100")] // Wednesday public void TestFormatInternalDateNegativeOffsets (int year, int month, int day, int hour, int minute, int second, int offsetHours, int offsetMinutes, string expected) { var date = new DateTimeOffset (year, month, day, hour, minute, second, new TimeSpan (offsetHours, offsetMinutes, 0)); string formattedInternalDate = ImapUtils.FormatInternalDate (date); Assert.That (formattedInternalDate, Is.EqualTo (expected), $"Expected {expected} but got {formattedInternalDate} for date {date}."); } [Test] [TestCase (2023, 5, 18, 12, 30, 45, 1, 0, "18-May-2023 12:30:45 +0100")] // Thursday [TestCase (2023, 5, 19, 12, 30, 45, 4, 30, "19-May-2023 12:30:45 +0430")] // Friday [TestCase (2023, 5, 20, 12, 30, 45, 9, 30, "20-May-2023 12:30:45 +0930")] // Saturday [TestCase (2023, 5, 21, 12, 30, 45, 12, 0, "21-May-2023 12:30:45 +1200")] // Sunday public void TestFormatInternalDatePositiveOffsets (int year, int month, int day, int hour, int minute, int second, int offsetHours, int offsetMinutes, string expected) { var date = new DateTimeOffset (year, month, day, hour, minute, second, new TimeSpan (offsetHours, offsetMinutes, 0)); string formattedInternalDate = ImapUtils.FormatInternalDate (date); Assert.That (formattedInternalDate, Is.EqualTo (expected), $"Expected {expected} but got {formattedInternalDate} for date {date}."); } [Test] [TestCase (2023, 5, 22, 12, 30, 45, 0, 0, "22-May-2023 12:30:45 +0000")] // Monday public void TestFormatInternalDateZeroOffset (int year, int month, int day, int hour, int minute, int second, int offsetHours, int offsetMinutes, string expected) { var date = new DateTimeOffset (year, month, day, hour, minute, second, new TimeSpan (offsetHours, offsetMinutes, 0)); string formattedInternalDate = ImapUtils.FormatInternalDate (date); Assert.That (formattedInternalDate, Is.EqualTo (expected), $"Expected {expected} but got {formattedInternalDate} for date {date}."); } [Test] [TestCase (2023, 5, 23, 23, 59, 59, 2, 30, "23-May-2023 23:59:59 +0230")] // Tuesday [TestCase (2023, 5, 24, 0, 0, 0, -4, -30, "24-May-2023 00:00:00 -0430")] // Wednesday public void TestFormatInternalDateEdgeCases (int year, int month, int day, int hour, int minute, int second, int offsetHours, int offsetMinutes, string expected) { var date = new DateTimeOffset (year, month, day, hour, minute, second, new TimeSpan (offsetHours, offsetMinutes, 0)); string formattedInternalDate = ImapUtils.FormatInternalDate (date); Assert.That (formattedInternalDate, Is.EqualTo (expected), $"Expected {expected} but got {formattedInternalDate} for date {date}."); } } } ================================================ FILE: UnitTests/Net/Imap/Resources/acl/authenticate.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- APPENDLIMIT=35651584 ACL RIGHTS=texk A######## OK username authenticated (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/acl/capability.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN ACL RIGHTS=texk A######## OK Thats all she wrote! i9if7359725qay.199 ================================================ FILE: UnitTests/Net/Imap/Resources/acl/getacl.txt ================================================ * ACL INBOX Fred rwipslxetad Chris lrswi A######## OK GETACL completed. ================================================ FILE: UnitTests/Net/Imap/Resources/acl/listrights.txt ================================================ * LISTRIGHTS INBOX anyone "" l r s w i p k x t e c d a 0 1 2 3 4 5 6 7 8 9 A######## OK LISTRIGHTS completed. ================================================ FILE: UnitTests/Net/Imap/Resources/acl/myrights.txt ================================================ * MYRIGHTS INBOX rwiptsldaex A######## OK MYRIGHTS completed. ================================================ FILE: UnitTests/Net/Imap/Resources/common/basic-greeting.txt ================================================ * OK IMAP4 server ready. ================================================ FILE: UnitTests/Net/Imap/Resources/common/capability-greeting.txt ================================================ * OK [CAPABILITY IMAP4rev1 UNSELECT NAMESPACE AUTH=PLAIN] ================================================ FILE: UnitTests/Net/Imap/Resources/common/capability.txt ================================================ * CAPABILITY IMAP4rev1 A######## OK CAPABILITY Complete ================================================ FILE: UnitTests/Net/Imap/Resources/common/fetch-annotations.txt ================================================ * 1 FETCH (UID 1 ANNOTATION (/comment (value.priv "My comment" value.shared NIL))) * 2 FETCH (UID 2 ANNOTATION (/comment (value.priv "My comment" value.shared NIL) /altsubject (value.priv "My subject" value.shared NIL))) * 3 FETCH (UID 3 ANNOTATION (/comment (value.priv "My comment" value.shared NIL size.priv "10" size.shared "0"))) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/common/getquota-no-root.txt ================================================ * QUOTAROOT INBOX storage=0 * QUOTA storage=0 (STORAGE 28257 256000) A######## OK Getquotaroot completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/common/getquota.txt ================================================ * QUOTAROOT "INBOX" "" * QUOTA "" (STORAGE 3783 15728640) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/common/id.txt ================================================ * ID ("name" "GImap" "vendor" "Google, Inc." "support-url" "http://support.google.com/mail" "version" "gmail_imap_150623.03_p1" "remote-host" "127.0.0.1") A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/common/list-inbox.txt ================================================ * LIST () "/" INBOX A######## OK LIST Completed ================================================ FILE: UnitTests/Net/Imap/Resources/common/list-literal-subfolders.txt ================================================ * LIST () "/" INBOX * LIST (\HasNoChildren) "/" {19} Literal Folder Name A######## OK LIST Completed ================================================ FILE: UnitTests/Net/Imap/Resources/common/list-namespace.txt ================================================ * LIST (\Noselect) "/" "" A######## OK LIST Completed ================================================ FILE: UnitTests/Net/Imap/Resources/common/list-nil-folder-delim.txt ================================================ * LIST () "/" INBOX * LIST (\HasNoChildren) NIL "Folder1" * LIST (\HasNoChildren) "" "Folder2" A######## OK LIST Completed ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.0.msg ================================================ Return-Path: Received: by greenbush.bellcore.com (4.1/4.7) id for nsb; Thu, 19 Sep 91 12:41:43 EDT Date: Thu, 19 Sep 91 12:41:43 EDT From: nsb (Nathaniel Borenstein) Message-Id: <9109191641.AA12840@greenbush.bellcore.com> To: abel, bianchi, braun, cameron, carmen, jfp, jxr, kraut, lamb, lowery, lynn, mlittman, nancyg, sau, shoshi, slr, stornett@flash, tkl Cc: nsb, trina@flash Subject: Star Trek Party! MIME-Version: 1.0 Content-type: multipart/mixed; boundary=Outermost_Trek --Outermost_Trek MIME-Version: RFC-XXXX Content-type: multipart/parallel; boundary=Where_No_One_Has_Gone_Before --Where_No_One_Has_Gone_Before You are invited to a *** STAR TREK 25TH ANNIVERSARY PARTY *** When: September 28, 1991, 4:30 PM until whenever What: For those interested, we'll have a rerun of last year's season-ending cliffhanger, and then we'll tune in the season opener and the 25th anniversary TV special. Prior to that, if you bring some food we'll have a pot-luck meal, and general merriment before and after. Who: You and your family, including kids of course. Where: 25 Washington Avenue, Morristown. (See Nathaniel if you need directions.) RSVP: 993-8586 What follows is some Star Trek related multimedia mail, the last of which will give you a chance to RSVP on line. Live Long and Prosper! -- Nathaniel & Trina --Where_No_One_Has_Gone_Before MIME-Version: RFC-XXXX Content-type: audio/basic Content-transfer-encoding: base64 LnNuZAAAACAAAFmUAAAAAQAAH0AAAAABAAAAAAAAAAD////////37+/r7e/z9/f7//93b29z //////v37evv7+vr7+/z9/97b2NdVU9OT09RWmFr9+Pd3d3e4+vt/29la21ra2lra3vn3dzn 9+//YVtaV1tp9/PjzsjHxsbGy87P2ef3c2dz/+vr59/Z09HR1dLR2d7n/2lXTUU+OzY1NTQ1 OD5ETmXf2dLP1dfb3O9jYWNhX19pb+/ZzsjIzMzP43dfVU1RX2/bybu6u7q7wcjN0+1ra1VR Y3fv7+fZzsS/v8LEztXW62FPRj03Mi8sLCwsLTVFVffLwL6+v8XFy9b/W1tdV1RVWVtr2srG ytXj/09LRT4/SVtd2MC0r66trrG2uL3I0/dOSE5WWVxn99nGvby7vsfR4VdKRT03MCwoJSYn JyowPURb0cfHz9lrZ2tZRktdd+HazcrGv7iwrrC4usHR5W9VTl1pd8i7tLSztbm/xcrb91dF Pj9DREhXb+vQv7y7uby/wsr3XUQ7My8pJiYnJiYsOEFK38G9vL7Fzc/R72f/1dXe69/v99/M w87v919NSUU+PUVMTme8s66urKyvsrO2vcTNb1JVWVNLTmfr2szKx8HLzs3XY0o9ODQtKCYm KCYoLjpHacnIx8fI1W9dU0A9RU5nZf/Zxru2rKuusrK3xM/cb1pvd2PXu7Ovr7O2vtVlS0M9 ODM2Oj1ATVfr1cq/vbu6ur7DyutSPzoxKiUjJCUkJS48T+29trSxt7zCyNNYS1FYb+/t2c/H vrq6x9HbW0E9PDg6QE1dxbGtqaenqayxtbnC3FFNS1NeZ//c18/SzM7Pz/ddTktAOTUvLCgl JScmKCw3QV3bvru2trzCyMjrT0hTe+fXy767urCsq7G4vcn3WU4/P0NJTs+6tbS1uL3Oa0Y/ PDcxMjg+SlBb3si8urq4uru+yNnvW0c9OTApJycmIyQpLzdFY8i8uLS2urzC71b/697j2sfC vLivr7W9xM1bRT88ODxHSnu8rqyqqquvtsDXd1NGRERKUVphX+HTz9LV2t/3b1tNRDs2MC8p JSUlJSUsND1I2MC3srK1urm7xldHRUtLTF7Vyr61rKutsLa8zmdKPjpDRlHPt6+ur7K7x+FZ Rj86NzU3Pk9cb+/Nvry9wb6/w8jV/1pFOzgzLSssKygoLTQ9SNrHvbi3uLq8xNtMTE9eZWfn x8G6r6yttLa9ymdGODQ1PUBHzrWtrauutLrC2VlNPj1BRE1be+/jzMLJzNPjXVtKQDo2NDEu KygoKignKjA4QGvIv7u4uLq8v83hY2lvc+/Ovrm2r6utr7O7yetURzs5PUdbyrevrq+zusfP 91lEPjs5OT5FTFBd98zIzcvKy93ja1lPQzs6Mi4sLCsqKzRFT9a5s7O3ubm9vcPnY1dMS1NN XdfMw7y9x8rI0V1VT1M+PUdvz76vq6+vr7zCy9VZTkpKTERhc1lr0d3Sy83azs5rXU5EODMu KykmJSQkIygyOkTOuLWzrrG/xbu41s7I1+u9ubmyrKytrbS7uuFCOjY0ODlAc8O+tbbAyM3v X11LRkZERV7f69PPz9vZyszKx8DYy8vrUT83Li8pJioqKCs0Oz13u7W0srXHwsXcUVQ9PEZE QE/XzsC6uL28xcHhRz9HQD5axbavq6mssbC+z+PTRzI8Ojg700ZFd9dN47nDz7+47cjM7ztD Qy4qLS0jJygqMDNP38vPu7m8vbq2vsfG19fXzsO1tLOvrbPfu77VO0xFNS9CQEXCzL+3rcvY 4108Qz0wO0jj/93awr7VwLW83bS6wtTDWzowMzMoIyYpIyorLkJd19W6r7K/vLH/zrz3Pc3M P2O/zky5s9HIr+dMPkIvNkpM0LinpJ+fo6qvvU5LSzYuMjk4SdDP3sO9z8vFTzZHQi49U0Rd zMnN59zrbzA3PDsuLi0xKTAuKz3rxb6urqWgsbe4n6Sqt6rGLTI2Kibrs8XBq8F7MDIfJCEn Ljtfr6ain5+foqK1w0IvHyAoIzBByc+trKepq7HGZTErHx8fHx8fHyAnMkLIr6ifn5+fn5+f o6Cx78HhLzRTPylHMysrOiwmTEU4P7Pew7P33atJSa6nc76sr0i2rMNevbs438hIJVlQLyx3 OCgtNCslMTwuNOPQyLKtqqerrK7GzVvTNS0uRSwmRdM3T63FrqzM377eOT1fKy5XREjJt7Oq sLKtqv++wUfXwUss3UYvxNg8c6zLvrLDv75eS2suNy0iLjMfJjsyPa62yq2ipsyrxUq+zT5O 20e5PTK8yz+8sV/VZ7NFS09NMi9UTTxetFzIu96yvt+7r1ezsMXMa1tO0z05KT0rIkAuMEn3 QLfnabRWSkfJTDo3yk9DLN+qv1/RyUbrU0lFd0W5tr3Bv7xPZ9EwLsbEPFuvvVO+q7Cup7K4 Y080HyUgHyMmP0BXraOroammta3Jv0tLOygpKT5EL+mst8q7q6zv0cu1UUFZP003LjMzXS00 RkYq4z0wz0M4QrNFyrNIvsS3T7HG07DDsrasv7m/XbprOzFILS48KD4wRT3XO0TEUEjJy99M 3bPQY925RbbEa3OvQzrJOsTXTOvJ+9e/68FMr21aRMbDQcdCxMy92a9OwNXzX0bYOlVR33dO rcDjw7V31Uc8d0w/OzxTUz4/VdDz99/Ore3G78xCPjxBNi8/Ly85OTMywT+3b83Gzu3Vx0lD 70nIzFHIt669966wU8RMUelET0DLNWdMa01ttmfBP824Ok9JPeEw6Va/O2e8ULZS07XHU7rK uljVw1vXa/tfQ088STlLSmPnzGO/W7/Wx//TxDxNXm8x/85D30nP5bJMw+PNN9Y9V1bBUc8/ 7bG94cO+zmvHZ0zLRz9CQjhZSztAc0TOXjhO38FTyM1XzXNH5z1JNFMqT0RfTdeyXa/pwcXI Y1fS/87bX9nKzGf/vuHHz/e4T8DzuUpX73vFOs/Nzcr/yOf33kC/d9tcYchP671PxNDUSsL3 uL3VxLXF+8tMS009KjM4LS45OkTjMtBZ3Ei6wtFKb0rBb0zIxcg6u2HP10vM1O8z2M81QzbO R8ZYtMzPU8vPz1HKU8tFYWvM90PdVMZY607HTkbcP8c9zuVFVDrINcw/QzzzZ0q9yeu0uLnJ u8NXb9rV+06+Srbf80/Zx8/USctaREndOE04XGFvwsW367fR3L7ezzzeOfdEyEhfw0vBd8xD xmvOWlNj5+c+Uzk+ODgvQDM+NUE/WVX/yMnAx3fA/7BlvGm+Ub5Rxsq+xdW988XhVmNGVzlL OFpjRMLTtc68w9PMy9vT7VnY8+//593aXc3Wz8/I28vv4UHHUVlMUDxANUU9OktJa9fFy8jK w9zM49nKTM5Zd1lR90/cXdTdz9vX3l5jUT5VTW9P2b++vbq/wdJ3Y1dKPkBGPUM+TFlvWs/F 083Hw9HVzu1nRUg+QTU2ODQ2MzpNTGfcw8nLw8nhx9bO3cnVyMrAxrjFwL3Cu9vC92dcQ005 PD5BS1Prv8TVx87I1Gfe/9NOa3dvT1X3d3NvzM7vz8jI02drXVM8OTk6NDQ2MTw+UljN0MC7 v77SynfMZ1djUWtOY3PX0+3ry9Xn3ddlWm9LW0pIR/vdyb6+usPB2tTNZUxJUERLSllXa1nv x9bP2cfHx8rK1/9NVkM+NzM3NzM4PFxl18fFv8DFy8nMzszfxsXHzcTBwcjEyc/b299fR0M/ PTs/TvfUyb64usHJ1W9hU01VV1JNUE1TVG9l49PcyNHN193r729OQ0Y1NjQyMTA2NUJKY8rE wsfCxtnZ69Tr39nj7+/OztXdysbP5//vW0NDPT9ARf/OvrivsLK1vsPP0P9eU0peWVFUW2v/ a9nZzdXO1P93d29IPz0+NTIxMC4tNjtFSf/TvLu+ubu5vb3Nztfez9LT19jLxczb/8f3UkRJ Qz08QEpV28u/wcS/zdNvVE1fUD9DS0hMW13zzsfCur+3u77Jzd1PSUc/ODk2NTAvNzs/PmXj z9bJzd7N1MzP29fMydPIxsbAvr7B0cjTy2fnSkJBQ1lRzce+t7u9xMbTd3tXTEdHSU1Tb9nb 6c7SzcjEyc/lWWFKOzk4Ly0uLSsuMkNPVM3Dvr28vL+8u73IzcTFzNDGy83X291rX1FGPDo+ Ojo5P0Jb28C/vb3Ix9HOzNFzVE1VT1lYXWNn59jNx727vb68ydlfU0s/NDAyNS8vNkVGT2fP zM3JzN/v1t1nb9/KzNPOzGGryd/Lw06zzMn3XNHb3TfG12dfsfPCVVfvsllvQkfDP8c64+NB Ub9Ew9xc0+U8OL9K2FoyLjstOi89NOsuSz22ScPOrsixY8K/+04/47/e373FzcNQuMrTa2Vd Y0AsP0M4z7a7q666y6v3R1XhPdZLNMjHQN3Id9m349m3wTTFRMI80zE+RTNfWVwsWka6UVlG sk3nv8tR9zYwwq9HONTJa008Zaavus6tu1cxLS8sIjDlvNfJpqemtr61tjYrNiciIB8nPz1Y q6Kon6GjpajBYfcvIx8iIx8nHys7vbemrZ+rs03rMy03Vc2trK+rr9c8QDo0PeW2tc6zpKW+ yMXOTyYkJygjKy9GwaijoJ+fpKqryS8/LB8iIh8gKT0+Pb+wraOgpK9r4UY1LjXJwKu1tNVX KikhHyErN0vIuMasoa6/zME6LyYuM1VDY6ynp6Ofn6WyxunfNR8fKB8fIyYp2zU5ta9GwKOf xdGtrsZb2rGgpK2sqrc/LSwpHx8jMTQySc64rMfBs7c6PU44M2PZyq+ioqGfp62rtd3dPScu Kx8jLiQr2z8uY6jRO7Gfw0ZfwMJPS8WiprW1r18tICQiIR8q08x3tKiuqq3S5VsnHyIoHy89 X66foaSjqL5ZSUQ1MSk3KyknO0w7R8GzoqlvvqilTe+3vltS466hq7SutjkjJyYfHyAtPt9d rau1r6y43U0sNTctNMjVZ6afq6yrvddKLC1FNjM3PS46RitnscU9rqZra6ejXVGzsr/Z072k rNDOyDUfHyIfHyAwyb7DtJ+rw7W7dywoKy4rL1C+r6qfoamptNNvTz8/Qi45TCchLln3PDj3 59/E+2Oon6/rqaHDP9G6p6/KuLdVIyInJiIlSry/ya6tvLnhz1Q1Kjo/LTe5sK6mn6Kps99v Pi0kOD4vK0cyLEQ34cG+Ta2rrFU3UKeuNe+wxjI2R7atxdjB3SkfICsiISjntsLNqKOuX8Sx xy4kN1xENc6qqKqmrbbHOTs3Ki93Oj7HUTk8Zy85zKpESK6t5+t7p6CqS6yoyDhPxcW+Tklh Nh8iKiciLty7tr2vpalLSMPILC9fXE3z27+yq6motVhpYyotLixM5TQ+tOM2O+/7vDQ7vai3 udA1XbSsVEG31zwzOruvs0/d0zghHyMnKitZq6mpt8GrsTQz7eMtM8/JtM5jwKWjrLOww08x Mt1nND20uzUvSW05P08+zae8bbmhs8Y/PrGt3yu/r9UyV7atyTdT9zkfISs0KTTBqrG/taev Rjvrxz0wX8LOb//BuK2ssrXYQTA0LixQ1c7JW+9CNSw7SzswP0Jcy6Owtq6zyz0rWa/nLT26 ezwzS7GtzTFBUCkfJDFHRMKtn6evra/HPzE1NisuRqzXPGOyrq+2wrS4vtfDSDxNX0tGMi84 Tj4wOrq30dqmp846wKqtRCc4vksvWq3JL0U3OTkuObGvTzbVUzYlL2vEvbSfn6Sps7zAVywn Mjw6P0jbwUw7x6/M22dDX0gpKD85Nzw/TmlMOUiyxeO/qqbDWdW5zEzrrVsvNUUzva+v6TpR MjQ6Q9exvP84MCwpKTN3uqyfn5+fn6KtvD0pKSsfHy42L0e+xrymuP9P8zgwQELv09c1Lyk5 NS04tqaosbGvrcw9Pau0TCy+v+tALzTcwikqa8YqKTBNQj1Dt5+qurmzYy8oL9O6wa2fn6Os r7bPLyAqLiIgLC0yTT1DvbHL1VlXXVUyNs/GRlG9urvD47iuwsqvqq+80ruqXzT3wzw5Pv/H P1tfOSkxQDJBt7nVQEA4W09Uu6irzcvfbzAtQ72/uqafpqyzvVEuIB8fHx8gJCo3QLympbmr ornLytvK1jo/+/83b763wK2oqa7L78/RRT0/dz4xLTg5N0BZSFH/T2d3b9RLzcbbd2/bSUnr /1V7wcHEyr22sLm2trC4vcZ3Ri4pLjMrKjdDOz5Nb9B3Qz1ZUUI4TsvK1bmmpaqqpKesr7W1 tM1f71UvNT89NTc3Ny8uNkU7NDg1LzE3Pmm/ta+yuLGuvr+4vMXMVUnZzVFjylZFQzk1OTQr MDk4P93Pv73Bxs7zSlVv693EwMbCwr+9u8zR01tJPkNQ28vCu8Lfd15JPT5Oz8nfzr24ymdr zk8/Pk5PUT5D2dNBP2fX3evPvrrRSklXRTlB/148SnfF0e/jy8pXUt3aZ+O+w1ta52nn72Fv yc/3/8jB2/fGvcrvZ01GPzs4Oj88Slr/WGvOz9nEvsPlW2tINjU/U17Z083Jz93v3efrzsft d2tIOj1EU2HZx7u1vMDAurzC2tO/y0lBTkQzLC82SURNz7u4vr+7t73BvbzEzs3O0dLzW/tb SEpNSUxVZevrTz9KPTI6OTc8R1FOTkxTXV9VXffr187SycXNycnt2cnL0bmzubO3vr/DXD86 Ozs7PkZEODU0OD5PZ8i6u7q6vt/dysjvadnHyv9U08zZa8jEUWM3PD0uLDU+S0ZMVFdES2HL tbKzs7Czs7W9z9/Z1mNGS2vf/2Np2Ug5NDw7NDc8Zelnb9fLzM6+vLm9wr7Ed0lN4/9GQkJB Ozk8RlNNYcbHzMvbWe3W68zEy83MbU1KTz5CTU9AQz9ASVFTY9zT1c/DvLm6v7vAz8vL1Wvp 7//ryNZ3/+lVUVlbb+fd287L2V/e1eNzX0pKRjk0Okhb5c/KytnV3OPzX1ljZ1NGQUNZ59vB s7W8wMr3b3dfT05MXVtfY8a8xNPRzuNIOjg7PTk4RfdzW3fb3dbS07+8v7+8v8PEzN/n81VG PTMxNDU1OD5AREtFSFv/3M7CxMXI0tXJxMfKuLi7xOvnztfXzdRPP2NfN3f318jYyMbrU0xV 5/Nf1cC+yMvf6917e+fba09VTUlEP0FVV0hBPzw+PkNES1Nr7czZ39nIwL68vMnJ7Xfv+1v3 08vT2uv7/11PTldJPTw7Okbr2My/wMjN2VdaWktFWe9hXevjy8G+vru3xM/VaVNXSj9MV05M 91FJSlJX99ZvbWFP89X3V83K0W9zSE1NUf/Bws3LydTjyr3IyMj7UfdPUW/U78i+yuFvT0z/ a1FOXFVcT0A9R1dQW+/z2+drd8rB09TK2U1LPTQ1NjVHW1tSysXS78bIw7q+0v9PR01PU9/J xMnD309Y3/db691VR0U/SFvj0cDCy9vtNELKL9xWPcRD1dNZvNdrubjf0dfp18nPzNPY/1BI PTg6MT7CPGPIxL5HRePFxtvjSt9KP2FZe83Jv9fj7U5PXlHl2XfvY1ZPS1nTyMC+2GV3Xmvd 98Y3vrA9PD88uuPRr3vLzEh33l/n3cXDylFPMzE6LjY9TENVa/fny8G9tLfC1N1zOlc+Y9Pa uMPNx3Pj42Pr3lNXRj53Szaz6zi+P7m6NsRBQbc+XctXVkvczLfFusXd1VxGymHLZ9Xrad4z Oj00TCphxy5S1y/PRFm/39bLZ0jZY9+9U7nP1k+/OEPFN8HNSc33Mki/P89N2rnTx99Kx1Xr Os1fyUk6uz1by0mzc/fE9zx33Efc58Tzx0nlwTjKWzpX0MM199lHW7DptOe/30vPd1ZExtTV ucA7uz/JwN9lutVDSEtDU9/SU7tBzdRAvE//1z7GRllMO88+uU1ruW+zwUvrb0zEQ8ZLS05W PD08R91Gb0ha11XRRcJrb7TXVrpLQ8df17xnylPvvUXKukmxPlS7Ob9KQ7hD3NnIwTjA1Vuy Se++81Tbb0Ln31nhzcfUvEbGPM7Pu1S+tjy4Pjm3O8zIUzbE5yzDTVO9vTu1uz62UD27VU+9 Z3fMzjm+bze+Osq+RDW+7z68OWG8XF9I2zjRNvdc2U1E2Tu+dz64W+W3UVHKvjXF50S/2TDL NzfPVTu7SEfITvPn0E292UvKXbhB29W8zle067/3R1awRb/Jzu9t3DhP1zXAW8rYrtA8x7tL Rq9Xd+9ETdlXQkXAPbzZRNpZv03Ax8tLZzrjey5Ga8Ezw1s30/suz7bdSk7bWN9TPbtMVdFl 2TP/TsvFPLtZQ84z1Ek42s7nSbl7V8V7V8NvxVE/1VxRc2drwW9B2rNKT8y9ytXRw8FUQsTR PURbVjrJPj5GXLFzTrW4zTvMvlLr90S7e0hDtU1GssnVukfY50s843dEONFTzOfMt2td6dHl PzTjPys8Z0BMXdm2ulm5u+/nuMdO3N1PNkhVLlVELzJNWzHZxeO5uv9Z1ckyMlHtuzfWpbNd 16++RjFR0TUrPbzvLNuyVDSworJCr6a6RSlCsc0mMb3NMy3Nrq/DrKKnwWnntDYqQ0g4LTy2 vse5srbeZT03LCcrMy4yPMO5t6ymoaWvsMZWQi8lJS4qLC03S764/7mpvDzrvy1ES7rWRUA/ rkM0zavDSa6828XBPjE9QzD/bS7jt2/zzz1nuk4rQctBvUMxsq8+K/fKNSguurbPOUarrktG rKGpvby0rN83Q984JSUuT8LHT66frdwww709JUzSUCsu662xSu+soMMrQK/BLCvvs7Q+L1u+ ySoqwbIyMMdKSHdKy7CqX8Ct1d3tyMDNxkwxRTAqLO/dOzZdVUgvM1fRw907z7DBMjrPrLZ3 26up1FHMvus4OExLMi1E49vnwbOusWHMsbBLNsm2Nf9ZLza8MSjfrDouxq3KY+k7Qcc+LNOv 38quvju7p61rLTq8qUclOLRnJyzXpK4zK8qtQSc3q7dKLVa4tFkqPbyqazzn685ZOzXDuj0q OU0+LkG9r7U6OLGkySkv6aOvMi65o7s8JWmosDMsuKvZKTTDqtErKVOs0yw1rrMvLduotNgy WKu2LSnAq9U2xbmxxTAytK82N7VrSrz3LsusVjWyyzHerzguxP8oMbG+NkW03TxHWEy3tz06 ualON83eNkbAQ/Opu109PDU8S93fwL2/Uyouv0Ex26WrTURAPM29OTGzrkUtyaq+ODk7ratR K0yyOSY76biw1SdErdEuSv9YrK5ML82nYzNH2XfB1TTzralBM2e090EsUautPzHXres2LVOz sb+7V1e6QicnOGW7q9XjrsApKsvTRW9lyqzLJzi+vT8xN8SnxjQvx9dFNEXNwO/rvttTS0Y2 PK+2PE/APWWyNzO+sTtcvddvvkMxX8//QUq00tjEucVNLylQwrxOMryo/0W/u+fRby1Lrbkt U7zN2zw4uqe0Xc7HSigu3aas3F33z1k2K1+qqMo2O0P7bzUyR7S4v9NDTMi/4+OzxEztZ0Zf WzE6uPM0OfutrcwoLbiq2TnTzsQvKDi02TvfwSopy62qwSgiVapWLDG3oao/Jy1Ctq3NRV62 1WVLPz13rr1HSFlD0cBMN1nX18tGOcymwk/LsbpHMig2wbLWW8Oup9EsLOmvv0UvwK7KLTLN sK3IOEXHxzwpK+2svG82c7SuVjlWZ29lzlEtSbrKP8O5QS5vw0/Jsj9IvqzdLiEoxKm0NCw1 O9y+R1OrqNs2JS/BsbTvWee/w005O0e7rLhISbi8Py0+58vGa1PQyc7XU0BJa//Hs7nd/9XO zWtCPkvbx8JnQsSzx03nvcXvYUo3M0xb69H398e6y0Q/W9O5v1hC0Md3REY/X8nhXFFbX+ta TsW6vcfGb07XzUxE5+9PRT4/Ozc228BnPUA5U8hfR2W/zFVRP0fIvszvtsT7W+lb48LB3s7B RjIvUOtPW9VSO0FvVVzRxe/X0/dG97zLyLjDy72270Y/S1bnymVF/7vC3drJzffdZTQuOV1z 41tAU7e7Z+HDe8u360dOe0k/Ni9Ou8/rXz1G2cXXw7/OwsRdRFF3vMo8NlVvV048Kk7BVztJ RDvdwVNPycztz8PKv722sLi+02FCSffRWEM5QVdGPmfUX088OkvnvP89PcS9zsa72NPByGO8 tr3tX1tV61h33VvfTzw+WktJzspJPVNYVV1vybu9yHfv/1Rdzru7vca/YTxnzsfezM5jd1dv XWPX619j+0NLVDw+TUs/Sz82Nu/rXdLZY07r1OdXTlvbwcPfXFdU68jD1dTW1/vfa09Vz9dR Rv9WQDdNzrWsvlJO08zR1crEvLvETjk7S93N41tnSjw5RWfMxVw9U/PjXf/v5d3n0dF7d+vL wL/FTUvXymvvUE//u8FDOTxFUffvTU5hb2VRW/9d+9nGysr3R0nKxMDMVV1Y51Vj6+lMRkZd 829nSU/Kw2dET1Hc3crQ3e33/0pKXPfvysLJ2V0+PDxP0c7ad1dIRWPT08q/u793P0ZKYcDD Y1vnX0BHTs64uMtj3s27uLu4ucPN70NCSFN370tPTEBBOj1Zys/nTU9XTUZpv77H70lHZ/vO 11/vx7/N90xGPEbjy8heQz5EQU1NSWvVY0c7RVPnwsjJy87nXXfDtri6yGdJa+9Tae3r5cnT TTk8TNnAw15FW95HUdm/ytRdSV/nT0Rr1c9lPzgyP1H3wbm5ub3DzdTdw8fvVz05Oz09Rk5b /29rb1rvyr+3s7i+0Vk/PUzMv9FdTEpLU/PLxcHHyvddSEVWe3dTSkpJRDo/78G/xdNrZVdB TNfnY01FRT04Nj/NvL/O4+tvUlnXxru/yVtFPkJt59HFy9/pa1Nvyrq4vcTra1FNWuvNzMvd a15PX9LJz8vr/2dPRU9r3tvdb0U8PD9Y187Wd1FNSkpV183Cv7zFaU5c993QXUA7NzY2P1/d 4d3ra29ZV823try/w8fj49fLxsvnTkA9PVHfysfJ111NPzxDX29fU0xJSlRjzsK8ycrjUUZV XWve2eNTRkRGTd7JysnMYUpGRlnRx8nVd11KSUVLb8nAwczT5djCvri7vs7Zd0dEZ+PR019R TVFNXtfHzNXn/2NMR0JU993pTEE+Q1Pn92NNT09XTlP/ycPP3F9tR0VJZ9nZ1+NJQUVVXc/F zVtISUlh68nCwLy/xdPd48y8x9hvU0dEQ0h3zMrU3/9jTlD3ycrnTkVAQ0RI5cbBxc5lRkRc y7/AyntNQD5CVtXIy9P7Xlv/49/EvsvaTT48QUdZZWNZc2NVe8a5tLW+ydNdSEdLb9jvYVxf WV9ryr27v8d3SURDTf/zW0tDPD9CTWnPz+Prd0xIS0//09leV0ZAQEvvyMrX3t9v7+fp0cnf X1lGQExrzL68wMbFy9Lb08G8xe9OQ0JGV//XzfNNTEVET2PZytfvX1dPU2fevri802tZSk5N Tuvj/1xIRUZZa93Jz+9ZSUlOX+/PzOdPRkE/Rk1f0tHb4e//59XEuLe8y+lZSkZJc8/P+09T VV37387ExM/hWUlGS1zv4e1bT0xHSU1l499dTUhGVXfXxcDE3Onna/fj2NPX41lTTUtUZ+Xh 33tjX1133tHFvL/EyczIx8nN095zWVZPTlVfc/NjTkhJSkhNUld3d19dXXPp08nAwc/j82FR TExNWWNZU1NQV2Vt99v3V1RZXWd38+vvY1FQT0tTa/fa3+/p1dfLx8PAwMfZ/11aZXf73d/z 5/NrX2Nfa9vZ921jVFlfaefd52ttb19WTk9TV01MU1Bfd+vTx8jNztXz493l39XfY2lfU0lC SE5dZ11n7efn3M+/vb6/ws7/Z1dv721TWU5MTlFSWf979+9tU1FOW//nb/Pj7fP3/+/f5WNf T0FESE1X7+fj2/dfWFVb3dXb1dt3aWNhb+/pd3NhWWFjd8/DxsfGyM7R0c/K0eP7b1RNTVzj yszn4953YV1d99X3a2taT1FWZ9jQ2+t3a05HSkxf93dfWVNUXWPdz+Xv/15bV1Nj2dLd+2tX UEtQZ9HS2c7W397Wy7+7wMjVb1VPT1Xz4/drW05LTVRt0+ldV1JHREZT39HT1917Y19v49nf Y1RTSkZKV+HFyc/T71tRUWfRzdfva1RNSU7/3dxnXF5fVl3fxr29wcXM193f18zO52NVTEtL XuPM2P93XktFSFPr22tbV1BTUWXVys7vWkxJQT9IY+PpZ2dnY1tn3cvK429ZVVNRV93N0mta W1lPTunMwsfN0dXX3s/EvsPO3GNWTEtZ18/Xb2FbUU5P5c/L3W9fUk1JUN3Iyc7nb19YUV7b 3/tZTktLSlfPw7/L2/djVU9b18zT61hJRkNFXNPV7WdYUFFd38W7u8LO2+tjc9nDx9l3WkxJ SU3pzNN3U0dDP0NV69brXlVOTlNf0cPK1ltMRD9AS+3X3W9jU01LXNPJy9n/XlFMTV3azNbj Y1VKR1bVwL7AxszX5evQwb7I1/tlTk1f28zM329VS0ZFV9fMzttzVUtFVd7Mxcvd711JRE5n 9/9WTEU+PEFrz8nM1/NjTk7ry8XFzm9rTD9HWefa2+9eUUlL98e+vsTXbVVNVtXDv8LXd1dL SmHn09V3VUc+PUV30c3R5V1dUE/dxsPGzV9TRD5G99rT1d1vVUtMXNnIy873Z0pGTnfX0dj3 V01ESe/Lv7y+x87X79fMxsPK12dTSUz/0snK2FtLRT5Eb+Pb33ddTUZKX9TFxMbdWkhDSVtj Z29UST49Qlfr1c7R+15NT+fbycXG0OtOQ0hf697X22NORkvjz8rHx9VvU0dY59XNytLfZ1Zb 383NzM53UEJATO/W083db1lKVdHKxsfOWUs9PEln3NnT22NJQkZz09XV13tOQj9O39TT2P9b ST1Ia8vGw8XM3W/v0cK9wcbdXklHUtvMy9HhV0g+O0lc6+//XUxBQUrvycTJy9VtTlNp2dnn Z0xDPTtD+9bLzd1vU0hQ98bCxcnha09LVdrLyM3nXU5DS9/Iw8LJ62tMSFvhysbH1/9bTVLX xcHCyfddTkdX1c7Ky+1fSUVLb87GydNvSTs6PlNz5+tzU0M/RHvOy8vNe1RCQVXj1M/W6VND QErvysG+wtJrU1nVxL++xutPRD5K28zIyedYQTw/TfPVztVdRjw+TOvOycbYZ0xLVdjIx8zb VUc8PUxv0MnO22NLRkrrysTFzW1LQURd0MnJzON3TUZZ08S/wMrZV0ZHVd7NycznWk5JWM/E wcTWa1FGR2nbz87X/09DQ0vny8bK1V9IPjtGZ+/t61ZGQT5E+9TIytHvWktJT9nJycrnWUpH Rm3Iw8HF229bVmvKwL/H3WNMREdazcPCxdRnT0hJ/87LzeNVS0JEWdvJxcrnY09OXd/GydX/ TUE/P0rjzMvaa1FMRk3jx7/E1ftRSUNFc8vL0ndSS0xP98O7vcrfZVVLV9PGyONhU0tITV/M v8znV0tFRU73zczfZ1VNSlfvw7zC2W9bSkNCSf/dXE5JREFCS+fHyeddVU5NU/PNv813Z1hP VV3jwbzJ1d/v//ffw7zA221XS0dKYdfAzOfnd1lSVePHx91fU0dCQE3byc7/d19XVFfjzch7 TElDQkdMa8vP92tnVlRb5cS+ym9bVEpHSFfdzHtRUUxLTl3PwsfZ6/dnX2PlysPVa11cV1t3 28XE3HtnVlFTXuvW5VtTU1hl68y/vcXf721OSUpRaW9RS0hISUxf3c7Q91pbWVxj3c/Jz/9v d2/z1czEv8zZ4+Hv49fMycnXX1dRTk9YZd3cZ11dVVll69bP31xRSkhMWm/TzeN773d773N7 615FQkNESlBd4czV7+vt7+Pf1c3Pa1FOTEtMTlfnbU9NWGfz59nJw83f5+Pe3ePZy8jf8+fr 5d/f08rX/19fV1dPT2n3Z1FXc/fv7dPIzOdlYVVPTUta92FRTlZdW1VZ7+F3XG//d19d99va b2/p3ePr3cvEy9LPz9XvZ2/d41dOVVVPSlRp2913d+//Y15r599fV1thWU9f18rM3dbR32NT VlpvVUlKTEtITGPUz9vp3ed3XXPbz9n/e29jUU9d89fj79/n/23318bDytfR6W9de9PKytXU 1ON3Z3fYz+dvZ1BIQkNNXWdbd+t7e//by8fN42lXSkJDS23vc21vY1tPVu/Y3O9vWU1LTmPd 0+X3/21rW//Xw7/JzdPjXVVr2djhd15RUUpJd9zT3f9rXldQb93S3fNzW1lPU+XKxMbN4WtV SUpdaWtYSkdGQUhezMfN0+13X1hr0MnO2G9WVU9Md8rFydPr3fdd6czBydn/V1FJSVvOxsnW 92VYTVTZzM3bYUxLQkJW6c/U43dhW1NZ2cnL12lNR0I/TOfT0uddVk5FRV/Z0dxjVUxEQkrn z9PnY1lVVmPIuLW6v8vZXU5d3czK2OtnWExLd8nEydn/W0pHTPPPzuVfV05ETN3JwMPS32dI PkJc39rhb1VMQkVvzcjI2m9fSkBP28zIzuttV0NFWdPExcrZ51dR98jBxM97T0U9QGXayMfV 62dGQ03bycbR71dHPkBc0cjJ0etfTkhd1MvJ21FJPTg+TO/Pzt1hTj8+TenNzdJrVEVASuvK xMXQ72tQT9nDubm9w89jTlXdy8jI0/dVSEdrzsfGyutZS0NId+HT0u9XST5DT9/Kw8TU/0lC Rln/3dx3VExCQ2fby8vS81lDPkpd59nV71RGP0Jj18nGyNXpYVfdwr6+wdhtSD9GX9zNyMnf W0M/T9/QysnXZ0tFSfPOx8XD1u1RS2PXzMzN2FlDOTpIb93W0XdORD5K+9PPzd9dSz9I79HJ xsrYY0pLd8a8vL3D2FdGTevZ19Xcb1dGRHfPwcPF2PtKQkln0M7P22dJPj9Y1czM0/9TQjs/ WPvj3/9fTD9KZ9HLzNF7Uz48RG/b3N93VEQ9QGfSysbL191dW8+/urvAy+lMP0Nn08vKz+Nc S0NW1cvLzfdVSD9J48zEwMjT51NSb8vGyc3/Tj89QV7Xzs7ZX04+PUlr6+f3V0s+PERb08nF zetVSkvnw7y7vMjfWktd2c7O1+1fSD5AVc+/wcLPd0pIT93MzM3bX0Q+P1PXzMvPa1A9OTxI Z+/l+1lKRkzrxr+/wdddR0VL683Nz+NWRz5Fd9PFwcfP/09OX8a7vb/J50tBRm/NyMfN62NI QU/TysrM32dMQENP1cfGxdHpW1NZ28bEx9VZSz87R1zf2NfdVEM9PUdr5+9vSz86OT9j2dLM 2HdfVmPLvrm5vMHPa1lnz8vR1XtMRT8+T9XJyc/vWVNMV9jLyc3b/1RKTVvRx8rP71VDPjxK /+Pf71lQSkxf1cK/yuN3VElNX9PJzNlhSkRCSO3Iw8nX92ldZ9PDvcHU61FGQENdz8nN32VT TU1fzsHE1mtRS0ZM783Gy9z3Y1ZRW9fFy99TR0JARFXVy9NrT0dBP0Zf3+VdS0VBP0RN1sXS 6WdeZ2fZv7S0vMTL0+v/28vCz19OTElNU//Iwdp7W1JOUVnjysxvWlNTWGPdybzF43daTEVD TtnO71pfVFRXY87Axf9WT0pNTF/bxt9XTklHRkhdzszna2938/fQvLnG52dTTExMb8jG529r X2Nbb8rC129SSkZHSvfGxNh3Y11jXmvdyeNMRD9BRUdezszvZ1NNTk5P88zVa05LSkpNa93K 0/tpb//r3cW5ub3Fys/V3tnOzN9ZS0lJTVX308vjY11dXF9r49Hhd1VVVV/73czExuFfWUxJ SExf/29XU1Fca2/h0+VjTEtLTlRb8+fvWU5PU1tp7dHKz9vb18/MycbGx9xfUU9TU1nz2+dh XV1hb+/hzs3rZ1dXY2//48nI13fv49vj7+vjX0tGSE1bXGHn2f9fYWf/92/t0dNpTlFUXVpb d9vvXF7/3NXZzMDAxs7V19Xbb+/Z41dRXGtvXV/r3P9bXWd7X1FY/3deUVr/3Xdr2M3VaV1V UUlDSF/va1tdZ/djX/PX52tVYWdfTExdb1tOU1dfW2fjyMLHyMbBw8rOy8bO811dXU5IS237 Y1ldZ15XXf/Mzt3r7d/rd2vRxsza39fa/11d9/tVSktOTkdHT//ta2dv/11VUf/j71hTUk9L TmPj29/Z1NPW19HGwcTK0d7vXVJb8+tvaXdnWlNb693d7/P3d1pMTmX3ZVxdYV1RVuPNzdnh b19NSVL/3djd5ef/Xl1v2tHd6/9bS0VETWl7Z15fV05V7c6+vb29wMfP09PIyNnpZ1FGSVPv 3N3j/1VMSU5n6dXa529dUVVf28jFys7XbVpVXvf3c11ORkJAR1lz2+Pra1RNTVbf1Nnj/1dL R0x3187P09jfd/PRxr++xdl3UkdFTnfd3+d3XVBPX9nMzNHfd1xMS1dv5d93Y11VTVHhy8nL 3WtPQUBK/87N0ePzaVVY69HM1e9hTkA8PU138/tnV0tHTHfJv728v8PL09LIwb/J52VMPz9H c9PW3WtQREJFX+PZ22tTTklDVeXCv8DGz99bU2vY1d9zT0Y/PURX39jfc1dNRUNSe9PV72NV SEhO787Ex9Hjd2lv1cK8u73O91tOTmvjztd3Y1hOV3fOxcPI1ndUUVt729feY1FOTFjr0cTC 02NRQTxDTF3p63daT0tP98/Hx9BrTUQ9RFVv3Nl7W01FTv/SxL+/ytXr3s/Hv77E2l1HQ0ZY /9/bb1RKP0Jb/97b42lOQkBFZ9fJxMXO32tz18vKz95fRj89TP/f0s/f+09ER1f34+fzVUc8 OkJj2M/N1N3/W2/Lvbu7vcnR/2P/1crHzNp3TURKa9PLzM/nX0tGUe3Uzt5fXUhATG3Ry87r X0o8O0NU9+97WVpJSFrRw8DDz29XQ0FRZ+Pnb1lMRUBH38jAw8jT32Nj28fBwsnrU0g/SHPc zM/nZ1JFRlPdzsvN32NOSkzny8fFydPna13jzcrN2l9TRT5KX9XOzttfTUREV+3V1elTRz87 P1n/2NXh92dZa8q+ubm7wtpjVFzbzMnK129QSUdn28/N011PQUFMY9/X3PNZSUFDZ83Gys9z TUA+Rl/f2dxfT0dBTO/Xy8vZbU1AQEr3z83VZ05BP0nvysK+w87pZW/Rwr6/x+lfR0BJXdnM zdpfT0ZHZ87Gx8rlXU1JT9nKwsLK3W1OTW/b0Nn/WUo+PkNpzsjIzntPRURO69nd91FJPzxD UOfc4/9bTklTd8S7urvC12tZXePIxMreW05HSFrpy8fL1WNLRUZb4dHX71dNSUlWzsLAxddX SkNBW9zL0N/3WU1KTefIyM3rTkQ/PEjfz83XZ1RLR03rwr2+wszl/+3Zwry8w91RSkRCVdnO zdlbS0VGTvfGwMnWY0tGRU7XxL/G129cVVFrzcvcX0dCPj9IZ83I1OlXSERET+PO1mNNRUNC R2vWytpdT0pGSWfRwL7L1mdjX13nw73D2WtTU1NfzsK/z+9rVE1OUu/N0fdUTkpLUe/Ev8bd XUlFREvvzcfa/2dUTlhrzsLM51pKQ0FBTt3M1mdaU0tPXdG/usTO1efr3dTEvMffW0xHSEhV 0857T0dCQUZP/8XE3nNXT1Vde8a8xM3Zd2FdVXfPzmFNRkJESlH3ys9nWUxJS01e1c/lV01H R09Z3cjM72NbWmP/1cW7v8/b7213b97Ew8zrbV9j7+PNxsfab2teW1he39HnV1FLTldb78/T 6VNKRkhMWeXOyd9rY15nc+vTzuNnVk1NTk9d5+NbTE1KTlb/z8fI1dvd2c3PzsfK91lTTU5R W//Z1XNOSklLVmf309tjWVtn79nOxL/Iz9//b2tXW+vnV0pLTlFcY2vh61hPSExjX2Xn195b U1Vj9//v19PrZ3Pz1czLxb6+zd/3/+//a+vW2nddZ2/j92/r1fdbV11jXFNV9+tlWVtv7/9h b+9vTUlLU2Nj79nL0vd3d+97ZWfn5/9YVVpbUUlPX1xJSVNbXFt328bGzMvGxM3a39ndZ1hb be/3d+PT1GtjaW9zY2/n1etdY//n83vnzsvZ5f9vYU5JVf/3Y3vv429bWXvf/2VjbWdXUFvp 329pd/tvV1n/29vv7eHR3ePfy8jP2+f/WUxHVe3d7/fj2+9dWW3b3e//e19PSU1z3ePn3en3 d1xj6/9bUlVPTk1Qa9vc6//vY1dQUXvZ3+vrY09NSVF36+/7d2dlWW/ax8LDw8TJ2/P31tHV 3v9va1lSa9vP3elnW09IUF7f5+vvb19QTlvcx8fN2fdjSkVMXeXj3ud3XVVP/9HT2edeTkhH S2nf63NZUExDRlnn09HV2+/7d+fHvcDGz/9RR0ln2M7O1+tvVElN59fU1913VUlFT93Ny83Z 82tXWe/R0O9fT0pCP0ph18/T2ftjTUxX18vP1f9hS0dM787Jy9Pn/1ZV886/v8PK0PdXVvfQ zt1tU05HQU3nzcvV72NVSEz/2s7Z/19URkVO28fExs7nVkc/S2/r4/dtaU9LV9/Ix83j91lD QUpr+2dXTEc/PUFl1c3V6/9vV1nbxLm5vsbTX0xP3svHydlzXUlFT9zMzNZ3W05AQlnjz87Y 5f9aVWfOxsnQY0o/OzxN3s3K0O//UUdX183HzO9jSz9EVenMzNT3YUxLZc7Cv8PR53dWWdrO ydFnU0g+QE//0snP42dTSEzlzMjJ02lPRUBL4c7LzudrTUFFTF3v5+tfV0xNb83Bvr/K3ldJ S1v/7/9tT0pAPUtl2c/N1ftbUVrTwry7vcnhY05l2c7IxtZ3V0hN79fNz9dvU0FASXfc2dnl b11ST9vEwcXK81hBOj5O59XV3W9SREdX3dvb42FNPz1Ea9fV0tl7W0xT18nCwcXM315VY9TK y9P/U0Q/QVXr2dned11RTV/b0c/Z72lVS05r1szO0edlTEdOd97d72FTTUhM38W/w8nW51VN Z9PJy9xvTUA6O0/v19ffX1dLRl/Hv7u+ydPvU1Nz0cfIz9zvVkpZ1cfL03dUSD5BY9zRz+1b V0lGV+HIx87rUkU7PEr709PeY1RJR07jzs3XY0xGP0Fc5c/R32NUSEpay767vMbN5W9j2sfD x9dXSD89RHvVytD3XU1CRVLVx8nN71tKRk3Xv7u9xtxzSkdX387R52dPRkNN/8rBwsrvVUhF U9jJx9D/S0M8PFHv1d1vWE1FRlHNvr7B0XtTTlHjyMTG1G9XUk3vxMDF0WFORD9DV9vKzdxf TUdFV87Gxs9fRT47O1DhzM3XaVlNS1nbxcXP41VJQ0JXz8TH02VKR0VL28S8vcXN3fdt98y/ wtdvS0M+P0/Xys3fV0pHRk3ey8XP719RTVNzw7q6vs13U0pFUt/X71NIQENEU9DDwtNvUUhC Rk7TyNHvU0A9PT5SzsjO91ZPTlr3zbq3wM5nT0pMWM7Cx99jTk9OU9m/vsxvUUxGRk3/x8Pb d1VPTlf/x73B900/PT1AWMa9x+dpYVtb986+vdllTklJS1rPwMV3TURDSFHpyrvC2etnX2dv 18DB6VlLRkdMX87Dy2dQS0xOVdzHweFRTUtRWWnMvL/R+1VOTUhL79z3SkVCRk1X3cfA111O S09SUufJ1WdMREZITWfHwMrrb2dn++PPvbzPd1lPT1NZ2cfRd1VLTE9Vb8i/zm9fXF9rd9nA wNLp/2X39+XJwMlfSEA/QkNR183hW1FPWWN33cbD3GVLSE1NWt3N019OS0xca9bIv8v/Z15n Y//fzNVvU01PV1/pzsnQb1JRV2Fv0szMe05JSEtVX9/MytdfV1ddVV3/3eVZVFlb8+PQy8XR b11bY3f/59/nZ0pER0xZbd3Oy93r79vRzsvGw833Z11bb3P/2dfnWlNbY2t33c/X92Fjb/vr 79jK1+tr99vX4evX611HQ0NDRUlXb2VPTlNf+//vzsjcb2Nnd29p99TW91dfb+n/d9PK029c YXdzV1V361pPU2Xn523dzdNrWmv33f/r287tVVVl7+1z/8/L3Ptvc3dVSlPv811c/9/a/+3W ydT3Z+fdc1lTd/9dSkpPVE1KWefa7+XTy8vZ1srAyd/j63dSSk5v4/9cZ21fSUhd59737eXb e1NV68zR2tPQz/Npa9/3VUpHSEY/Q1vv+2Nrb/dhUVPdzdbb293vX1j/0tDb3+Pta1VR3cnI 0dXZ61JHSGHrd29v82tdW+PJyM3R1dv/WWHpz9nj4/NvXFlf1MnZ5+ttTkVASmn/a+/j72db We/LzNvb3/dcUVPn2ev/Z1NKQkFV3tnf1dvd93fWx7/Hz9f/TkA/TO/b3+N3YVBHTf/n3+f3 ZVFGSFXTyMbGydb/XF3d0+t3XU5APT1M69PY3ftvU0ZLY9XO0NXrX01MWNXJys/db1NMTenC vb2/x85rT1Fv3t9nWE1GP0BS08PDy9j/XUxN+9XN3mddVEdJ98zExtLnWUQ8PEv/3+n3bVtR TV/MwcHJ33dbS0xe2czP22lTRDs+X9na3GtdU1Fb18G9wM73Y0o9QlPb0M3X+3dSUnfQxsTP 61pMSEf3y8jFzc7T82/by8PL42NLPzo6TO3My/NVTEdGW8/H1e9lX1dKTdnNyMXd3+1MTFvZ v7m7w91jXlvf2dXea05HPj5Lb9rMzdDvTTo6Tffb3f9PRENFZ83CvcHL419OVGdr5WtdW01G RErdx8TE229JQ0z3z8vI1mtLQ0BN79nU0WtOQ0NZ2crAwL/I3VFHTWvXy8vR51tMXdvJxMnZ Y05MW2vT0N/O0vdcSEbau8XI1UxOQjhET0tXYUlb7UdabdvDwsbdVzxPY8e/bVnjZUtVPT3N yr21z9drX2/OzdvJz+9bODc9UePOzVvT1udrRC4qLkqyrK++1uNMZ1tJW0vav6u0t71F3VdC PzU1OVJrzsZjX+fKurnM39nj42VGZ2NBY0xOSURANLSlo6VPKh8nSq+fn6Gq50YtJCQrLz69 u7S998+9v797Ni4xKzpvXbWwrq3H32NI1r/D1vdnP0g9KDlCM/tAMTUvOb+vublGOfdOv6+r qbC+SkUuLT9OvLzd1UZPzysuTbypt0ElHyy/p6Gfrba+OicfISnPtbOvvbm3sLe8xTkzKiIl KCtFva6qqK+tuGPN28O8yE9jOzlrSfPbR0A4NTp716+tt79vV9rPx7i/0c8yKyslLjUpO6ys qLkpHyYwtKu+q662sckvPWNXt9nnx8C1qKq0tV09MyMfHyQvO1NFT8zMvbKxr7DId0E0Li43 Su/XzdLr1c7Fua+vr7zbzse5ra6uq7HLOTAlKjM0Ql1va+M6KjFbycTeOkL397ywuba3vLvK UUppy7W62Uk4MzpP78XI5VM4LCYmLT9Ye//hy8fHyMS+vcnbb1Bf18q3tbzH61FVSkNZ59r7 ST49PUNj0cC+ztPVXkxHQWPN09tpRkVPd8q5vO1dT01RPjpV3MG/xc7Myb++vsf/92VOPjo+ U99nPTk8SePOzsTD0eljXV1b3b21t8vnc3fbz8e7vclrQDQyMzZK38jGyMzTSEy5REVZ3ExH PkdI3b+4v9VfUl5NPTXD0kRBPUhNd86tvM9lSnvrY8K5zsffUDld7V9GSMldT0hOR1w6OstX Y1tnVrC5wqy+wb9A20VKzvNDrrr33TlHudDOs0fbTzpBOz9fW9PaO1Tf12XG1XdIXThvQ0JX v66suEJETeXl0Ve2vmk9Ly8tP1PNusqvu82/1b7C2UNMNjRbSjU6LzPKuLOqrKi12zk/NTg+ S0vdwjxAQyMyRS3HxDbQybztNTpIvKWkuMq6srVvOiUutKaswCofJSw5u8a2oafGQC8rc9/V tbCno6WzyT4uLyonJSsqNjhGurW1uMrTy+PDtke+rFPMtEu7vjNfPi7vQS334TTD2tuptl3p Y7irt8g5MC4kZdH/PiwrQjkpMC/Koaauu1w+TzIvvLCmqNEz2N9JbSooTkg6LjrPprE7QsjG vuM5uKq+ubbPsco8u1QsJCI4sqtBNzX3u0Et86ygo+vHrcOtr8a96yUlLShZqK21UiEfISk9 rqmjn7NfUzQ0VVTVpaeur0I6STMqLzs+21kvRdK0smE3PETVu6+sqLRTNSMtPzVjuffpPic9 Wb3IzL24SiwpNLKqqKCpuEEnID08zq65sMpCQTIjNbfGvjQjNVVDyKupn6pNQDg221M1trK4 v0I9vb5bTzU7X0MvP1q+uMrCvr7Me2fExj7G2b+460TBsUozJifZRnvN0cFILWs9QLmyd6u6 SVYuQ+3de9NvRy8jNberr98uMTU7P/exoKS0UT0vLSQzU/+9tL2xu2dKw+97XTM7NTIyPWm4 va+pxazKzLGtv7lIVT05NztVyPM9LjtZvs2zqcTGTyzX0b+trMm4QycqKDmuvLezZV88KCxC 2bO4xLfDPlQuPnfX2b/X/+NXWNXHxrpcW1Q+PzcyP0pTz8LPwbK2t+/O619IKjEtPDdJN9E+ wttJ07zLvb3MwtHH3Xfvwm9d4zxLPkXnzs7n48Jady5j0//DT9rN71xXOvdP1uNj2etK48rG wWfIT1s//9O0ta69w3s9MTA7Y8Xd4c1GRT1Ib8bhzNRfTURFyL64v+NnXUFHZ8nIyndJRTc7 Vdq6t75vQzU5PkzczcjpRTw8PEhYW9Pd520+PjxJ0cy9vuO1zL67u7a5ws5fTzszOj08Vk9V Wj9DUsLMw85vzu9ZU+nfzcrTx8Ld17++vL3K0VtKPEdJ4+PX2W1va2XPxsHG0Fc+PC84Rltv zMvZ0UxKNk4+X07PydnHwbTHw8rt9088QEGws29V/9xZ/+/fzf/f4UlBMTpJTtR7181TST9b zW/AykvhTUdERj/Dy8Lpykb3Q01C2Gu9XD8+P8d7y8/LuMvtu97Vyr65tblVXEA6aUZv5Vvn QmtZxWXv0dpGv2vD58u0Z8M93Dj7P7r3usrf00dCRkLPY2nCTUw/Umfv41Hd/81PPldPZ/Pb S8s7Vjlv78i6wrzr50DnTNTfv9hf60fORlTFUbg/7zxRQP/UT7tpWUdEVzu6293G1sVJ2z7A wsfTslXWSVPXOsFOtFW5RWVMyEpGvUPISL49ylPO1+NYuFPN6d61xMZnwzfOTU/hvU7fa0Zc NVLrvt1H93dNWDXbTLBPUss+vkFXR8FJvl9bW0HMSV9Jx0TZQ2tXQ7ZPtD57N1NOMck4u8tJ WEhnSfdIs1fFT2/fU9w/ulnFv1F3PzrOd1e40XfRLkXfOtfA/8iuTVW6Pce+RLXEV8PrPbrH 97zIPcY2K807Z8Nb7/+8P//fQq/3VcRIU0g3xP/LzVlZ/1VI2M/Gw7pWRdFHTHvdU3dTZ2NZ PjdRacjr0ffN1kBtRP/VPk09PEVBy8HFusnR401PUs/K18xHSkJKW02+v76/TE7ZUstZzcrJ ZUhHOEVVZ8e640Vvt7XM2uPJtLXF4ffpz+dcVTo9ODo1Nj/P6dvOb+vF1sy7vca8XfNhSENr b2XjWVD3UF/Ku7i/yFNLMzQ5NlBDSkJGRUfr1Lu1uLy91sra38Bt49trRDgtPELvuMdfSTlB OVtJU19Fd0JGPz5Kvrqusq+ytru9r8G63TkzJSYiKiw4S0vZybuzq6ukp7CxyW9QQUhJ005A ODs/Ql/Kt7CvvN3Ma1U5RsO+a0UtLC41V+vVREQxP0lTR9HNwrq+u83Hu7GqoaSpqa+9y/9L OykjIR8fHyAiMTxU08m7wrOusauuusnKY1PfTV3vY/9tZ9PJy7+2sbzL6VVJSjtFSThIQko5 NzIzQOHLY1tAPkjOvLOtrbm4s6+pqaWqrLe72Vk/NDEuMCgoHx8gICcrNFFQzb+zrKekoZ+i qq66ytlr+0tTPzIuMjE3RG3NztDR2/vnztXNxl/VQT85OTU9Rk0+Ozo4SExvyry5ubq3vre5 t7GyucPT22tlV0E+NC8rKywpLi42PEdHV9fOvL23sq+ytbu2srS0sri8zOf3b2PcX2f7UUJH QD5JOT4/Pjw1OzlNTO/ey83LxMG8v7vAuMXdZ0pIS0tLWm9jV1lUX1dvZ97e/1VnWV/Ta8XJ 61lMS01YTE9fd29349/Z3eXb1NNdae/ZzdPHxr3Jz9Hn72NUSFhPRENHSFtZTuvl/2tlY2Nf S05ZWVhMWenb0dXMytvf+9Xj6effy8fV18/Kz8/XzMzfe/fn49Xz5dHdV1lcUVJISU1vTklO T2FnWl/33G9hY19eW01Za/dfZ+n382Xd0t3rXf//929z38/V4/vtb1hPSFl3Tk1MT09JR2Pz 3f/3d/NpTWndys3RzcjT1OfVzcrd891391tW5+HtZ+Vv61RMXWNjWFtYb29WY9/b2+Pf2WtL SVB36eXX3ON3d2vSzMzP2dvnX1Jd29vn9/dnXldf4dvc6d/l329v68/V43tdWUhGS1rr42tr a1dIR1Fp6+//42NJR01319TX0s7be13t0tXb6+vzX1Ra2c7K09LX7V9VXefZe2dVUUk/QlP/ 9+93b2dPTlnTxr/Cv8HV71nt3dPa3/d7WVhd59DT3+HvWk1JTv/7b2ttXV1SV+nZz93/ZVRB P0lV/+vf2d1zb+vMwMLGzNfnXVRj2dHj81lOSURLY29tb1lXWU5Z79PN1etVS0NBPdtzR7Zd SsxUxd9KubHv91gw105H1ufQxs9lb+P/z8TU19tXSEDj5dG8d72+XMPrTP9hW8/fO1ZCPthL X9VNXGdOSv/3c8a/Z7rAz7nAvthV50lIPUI5P1FG1mdVPUpP77vR3co741Jdurm9wrHnM08q MMI3vLs7tzAu60tPOq6/tLAzRD02z3exoq28OiwlK0A0v7dLtt5EvVPEws9pZ9c6zEQ1yELj t9+wVFa4SLq4TrnN/y7KtLqsVy0sJTytpqCgyTsqIjXF47i57bS/QkIvNNm1rLjVMSw5Pr6z ycvzV0lWV2+9s7KzUylbt7mvSywlHylZr6mpvywqHy1D17yqqrOtPDEvJ1e6sq3OPVM8XcZU uuFzx2lNQm9fsK+9Wiv/ubW0MykiJtyto6jDMigiOXu9rdXM3ry93s4+RcjDzcTtPNJBSesy YUhnuLPUzr93qqtJPr3Jq8YuKh8o0a6kqksrJyBE48S061NPxMzfZzNPxsK9VDdBPUp3S09K R1XazsfFuLy6wkKuvrWuQTwjJtOspqtfJSQjO7+/t1w1QNPKyvcuREpzwONfY07pyczlVVtM 48rBvbqs0zi5wqmv3dcpO821oK/TMicvP8u7bTw+aePNazpEPmPB381ZQlNAT1djy9dOSjbW uLZQu620p287KSrNq6OmzjMkI0f3vb9K6b3EvDwqKDjKsb5OLSg1T7e0xt9IO0RpzrFz/7HC qPc1SyzKtq6fuO8yKDZfu7rDS1NnzL3L30dHVU9HOC8yP9vCyrxIODgv07q+w6mzpbw0Lizr rKWfs0IoIytItKqxtldN5z/XzrSrtXcvJh8qNme6wLlMMyooUU7RrKSoskMpLT20rKu0NzUt LFrItL3NOV5N78Jrv77JyE00MC0wU0/CtPdWKyg+NkPbv6+ouzwmKE6tn5+r0zEsL1S3q6jT zUtLyWe2t6620Fc1Mi85RHe9vsE8KjEtPF/Gy6nJv0ErQzDCp62q3UEuK0S+sry467uxwLpv z8PNSz8uKi4rP2POustMOy8yOT/Hta7KPCgqLNy4prK50TNbWtumta2247C/v7rJzNlKRjor LykpOkHfykVILyxfPEzTOLew37RPO1g+r62ssU1NP++tv7y/17a/wsfJuMfZXT03MC4pNDJF 3mfeRzI2NGPI2bzTvbS0uFNMQE24sauyzG85b8K4ucxeVcK2r8xIOTNBOzM7LTEvN+Pd91M0 ODk6RUzr1+PIzq2qrb89PzjBqqqor8jlZ0lJQzrMz8HDZVFAPEpLQWc0R89IzGsvM2s381Y7 777VzK5luLDTqefHs8nHu7G1uMdGXHtX3chDOF00azo090FQa026O09MYc08TznERUfLSLJT sLZetEnzssSrZ6++vbZVuGO8VN86OdssSTYwQDIrSzlVPm0v4Uk6zDjaaz/Qv7G+vtq2Q7pG 3dDK4fu2V7J7xFW9QL9nZ1Q9wD3GNOc1a0JrRFVfQ8VX0EB720xvvtDHvM7O7enr0mfK07/I a8Xe48bV1XNtPd84zj/ZRVb3T2tvS+dPXE3pPctHX0xB/+PV40q3SbZKzEPIyT/LN8tU92Nd yG1La+FPwVW23Ne4XcNZwTrHP9BdRlRETUPvWm0740e/b0HjXMxbzMBKuN/FSMJvxMZKy/PV UsFDe9HtOXfZa99KsljEzO2/493r0NnATbdD0jbzPt3jPuVEtlq6P70/uTxT60zaQL1PxErn OOXlMtM0zlB3R0pZPnc32kvlTNFFxvdVxVddV10z3k3v69NjWsJP88lQxDjBO81X6/vnv1LR 5c02xDPPXnfJ77blvj67Qs89yfv3Wul3Yds6z+vYe+NXVdNYytzMP89MwMtBvsvKxMg3xzVb TXdLXVxpY0nEMME/xsZV6dm8T7dIv03AXUjRP85CwVK8y1LXVGn/XMftS8s9zd86Ous8vknb Ot4z7XM6wzPBTNtOO7pGs07SyEvOX+FOve/vSk/ZQWdjYbZvwkfnzVzMXc7Mukm+U0jbbT7r 1N3lQbVNvNPFb7mwQLvIWLlE0bs4yjRt3DbJO0fANs3LL9dGPb9TXE7jc3e8RrrOQq86ybU6 s01OtTy6SjxNX0tvbW/P20tLvzO+b0W/Qla+L0q/S17ASl3FVP+63cK9Sc7zOdQzPN49c2NF RldCXMdRWu9BY8ZFzVpZwdbVx03n2sXVvm+/xGvUSUvlzd3YysjfxUNC7We+usbjyj1XSEpS Rk9F607/0eu21b/Azc7rS+NlZdlFT0VMyHfF1eG728tMTUBXZ+v3QUU4Pz9TR19Nzr7Lv0M8 OmHEsa+94TQ2MkVOT1VFSOv7w7+5v77T1PNKPjU+Tnfze2dv7829sK+urrrIa0pvQ0VOQUM9 OD42VWtdys/N0ddXzsC/uL7L31NLb0rMa1/PU+NcTlVV23PRXktRQUZdzrvDwO9QSU3lwb29 xVM9MTdAU9fZzslcb1VZx8zH09XvTE9ITFrf385rX0E/P0nn1c/OX0tPPlpp3dzO1VdJRElL 42/f/1tJVUta1dvPxc/KzWfrd9O8v7+/3ttMTv/c2ettSFVDSu3nu72zvb7JY9N31evcW0RC Mz88a2H/505GPD40Tl931tnv70v737y4trbAxu1XXF3nzOfEZU9BP05h1VvRTV1HPz9AZ1zP a/NEPj4/U9nMzcne72/71b7DwMHZ/0pFQVnv88x371NFV0fp08rL2VpRQU//z8rIzuNcTk9Y 3czL3edbRkBLV+vGyMjR72dbb83Hxb3L2W9NR2ff38/vV0hBPkr/zsLGw9PfWVXj1cvO03tN Qz1FV//K3+9RRT47Q2fv39NZa0nfd8i/w8DnaUJERFPj18/e911KSVxzwcHJd0pHUvPT0V9L TEn/y7/Fzv9YS05dU1dN2cS3sri/50w+RFXl6+dJOz4+RlbMx8TGyNLP7e/fy8HIzfdpRUVH T3dv61BMQz86SG/ZzMrM3M9z59XHz97Wa1pRTV3PzcrVTUk8OVfjw7u/1+9vT1ffxcDD305D Qj9AU9labT85OTs7W8i/vc9jRUI/Ud++sbW4wM9aT09czNX/d1xET1ddxLy8zsnOT11OTM7P Y18/OTg/RtjHzNDj2tVj08S/urTMz9FrTc7F68BLM089MUJH4bvKT2dXSkhtU9fR21/HVVVn 5dfOVkc+ST9S6+PK00hV3Ur/1e3DytpO+2k/U0xjwMvpytte71nhu8C93VxDQU09aczj3mdX VW9N29PS11RKT0c+Rk7vbef//1vP7XfAxsbKTc7tUdH/zL7Oz9Fve2NTb8rz81tHQTxKU8m9 7+N3RU5BWdXNwcnJyu/jTE7NycjOWXdAO0dT18FvVFVDRjxSWO/VTUfzPHdbP7zP0MJFXc9E 3vff2j9VTl9v69u86+ndREJNQ/fAxczvRl9RW3fz389n3/vRVctjxbjAwMZRVUxO2MnBv+dh Y0lrTvNd7/NVZ01fTEpS51tr7+PczOPL29DOTkM+REhIbd3M2FdpUFfX98fAxMnj729T32vJ 2uPZVltWU+fRv87ca1JTVV3V2d9RPj89Q0JPTsvz5V9zQmdMY97Vy+9RWU7f3ci5zs1YVETZ ///A1+XdPVhARdFvv8/dXEBDRUfr3rzO2fdYTlRfVcfJysv/ymtvzcS6wdHvS05Qd93RzGtM TEhIS1dnY1dJT1dHV0hn5+Nf2W1n2fvZw9TOSk5dS1tr0s3Fd1PjTOlpRtJGY15D1f9rym/N 2FNX62fY3WnOVeFVR+NPb2Vf729JR0tS62/nxefH0+nOb1nnSN3vVtvr2tFPb2vR29v3zFVN VT7Rb1DP98nNXl1d///nZ8Npd+dNzNPNy83B3dRK2mNP3D3a52/PX7/KxdHYyEdVSU7LXNnn R2s8O11N81lMSkI/Q0hd0+XN52/GXNe907vve/9HUURzysTH52tDY0JMW2/K9//dRVlRb8rK ydx7b1xbb+XT0M5n0/ff3t3Ra8xpT3dMRVd7xtfJ69ldYXdK0NPpXndl2f/zzNfeUUNHd1fv d3fXUltRSGtTe8DOudnzd2HjU8vjxtlrW1tr8+PYz29UP0lPd+vPzs/KSttLV/890mf31UNj Xz9HREvcWdhZQWU8aV1j++v/c2d7bdHCvL7M9+ll/13329vJWFFvS2dX0+vS6Wd7UWtU5+PM ztDbydPr0NXR2tnU3Hfbb//a995lX0g9TUbP1tTXX1dMTEj/3e/PZ9lNZ0VjzdHMzuFOS0Nb c83O51NEPz1MVdDHx8rd72lPUv/rz8/O1llMRExf43v/b0tPUVvHv8fG+2djXWfZ18Hn71lN W1NVY9Tj2GNIQkJCVtfpzmNeTWP/58u+xr7b3/9LZ03Tyr6//19HR1d33czM129ITFZNz9Zv a2tX5U370N/B0f/TW1djd8jF299TWlNJQT9P89vf+0xJP1jhz2dPQlPd19/f2czJymNVSU9c /+NfW1VZSkxFSczMw83nZUZdd3fGy+POT1tZRmnv2dbO5fdHW2frwrzFwsvVTlNX7+Xpymtn Q0tP3MXf2Fd7XklHPUZv2e97UUlGS9nLw73O2l1OTmft0czN0Vv3TGdj38nO1ftfUE5TXsrP 119BQE5OWd/SxcXPUUk/XdDHusfXXU8+Pk1SxsrLSkVAO2X3a1/Vd/dTPkRU4cPN33da/15c /8/M22VTW09ATP/Evcbba2NbW/vQ0cvNZ2NGVG3rwtXV011RX1fby7y+0dhz90pTY9z30d/3 Szw+RtnPzednW0tHRe3Zy97XT0dDRm/Rv8bPe91LQU5P19vV309KQUNA38nIwtP3UUdO283Q b+ffV05HRHu/wr/Za1tDY+PAucLJWVtOTk1e59PH5d9IP0Bd2MZp329XTDo8X83Hy+ddY1xT 1MnAw9vZY09DTnfBvcbbb1BFSErXy77Gc0I7SkxYY9XG0dtYU1l717y7vM1rVlpXa/fRy19v QklCSPvWw9xDQ0lEXWVj3P/ZTEg/Qk3pzdXIxuNVSz9N58zBe0tPPlFPb9HFyMTrVVtr3b/E w99VWU9KQ2/Xw8jO41db7+fUyL3D209GP0XfztPZ5WtbVkZP48nP505NSD5Md9nZ62VfXVlM Zcy8vdVeTElh49fBw8bZVEpJS1tvXl/37WtRQUNLY9Tj71lNTV//zMfMvb+/20ld7ce+d09P V1lFRFTXx9ZVQ0dPUVtt/+f/41tGT2nXw8Pb7+1OTkNEW8/L2HdTSkhf987Mxcn3X1/fycDA zNvL129ORV/YwsPaZ1FPVd7b5+Xr0NdRPT5N99nW2d3lT0xW/83F1c9fSUBCXHfb1uP380tJ XVHW19zaW09FT3PZzMzR7+NaTk5DT9vnZ1JMRUNOX9fGzNX/911j/8q8ubrQ2efv7//rzthn SUZITlFNY9t7XVNJSUVQ39XO71Xv62ldd9zBx93/UldfaW//5+Xt/2FfX2nZx8v/+1FdaV/7 79XI/09PRuXP0c7P69pvVVFKW2fbzNtbWUth/3Pr69n3a2ddd+9v2vdTUU9PVVdt69/la1tb UWdjb/Pje2P/Z2/3593S2ePl73tz/2/n53tbUk9TX+ff3uvv6+Pv0dnPysXL13Nne+3n6dvf 7XdpXF1dZ2tvWVlYV2FXY2n/6ef/d2/v39/d3eP3X2NaW2l3/+//b+9v9+dvZ+/p5ettb//n /3Nrb3d3729nbf/Zzt3r+93naVtYd+ttW11dZ2tv8+/j82drYV9jZ//j/29nd3N37/Pb3/93 c3NrY2d77+dz93d7///73+H393trc/f/+/f/7f9tY2N77+/j6/fz9/v3997Z3e///29hZWv7 9/f7d/97d3d3/3d3a2tjX11n++/t9/9zb3dvd/Pv93tvb21v/+/r93f/////d3f37/f3d3t3 b3t3+/f/9/f3///38/f7/+/z/3t3//v/e3Nvd3d3d/////f7//97d///9///////////+/f3 /////////////////y8= --Where_No_One_Has_Gone_Before-- --Outermost_Trek MIME-Version: RFC-XXXX Content-type: multipart/mixed; boundary=Where_No_Man_Has_Gone_Before --Where_No_Man_Has_Gone_Before MIME-Version: RFC-XXXX Content-type: image/gif Content-transfer-encoding: base64 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 l7Vry4B9aM+yKjifMosAADs= --Where_No_Man_Has_Gone_Before MIME-Version: RFC-XXXX Content-type: image/gif Content-transfer-encoding: base64 R0lGODdhQAHIAKcAACQkJNsAAAAAALZJJP+SbbZtJLYAANuSSZJJANttSf+2bZIkAJIAAEkk AElJSbZtSZJJJG1JSduSbW0kAElJJLaSbZJtSZJtbdu2krYkAP+2kv/bbdtJJG1tSf9tSf/b tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAQAHIAEAI/gABCBxIsKDBgwgTKlzIsKHD hxAjSpxIsaLFixgzCgCw0WDHgh8zchRJsqTJkxYdoCSokmHLgS8hqpzZMCbCkANxrtzJs6dP mD8HIoAwFABRCBIpQIxQ0CZCm0wNOlWoM2jCBQiwah2AoMCABAXAik1wgGwCAmStqqU4NeLQ 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 0CK3jI33rIAAADs= --Where_No_Man_Has_Gone_Before Content-type: X-BE2; 12 COMMENT: This is NOT a MIME-compliant content-type, but your software should be robust. \begindata{text, 269602880} \textdsversion{12} \template{messages} Where no man has gone before... Click on the "death star" icon to start the animation: \begindata{fad,270222644} $N icon12 $C 30 $T 30 $L andy12 $P 0,0,20000,256 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,102 136,162 $V 136,162 137,176 $V 136,162 131,162 $V 131,162 130,177 $V 130,177 137,176 $V 131,162 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,102 $V 198,102 199,118 $V 199,118 138,171 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $A 29,24 -1,76 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,102 136,162 $V 136,162 137,176 $V 136,162 131,162 $V 131,162 130,177 $V 130,177 137,176 $V 131,162 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,102 $V 198,102 199,118 $V 199,118 138,171 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,102 136,162 $V 136,162 137,176 $V 136,162 131,162 $V 131,162 130,177 $V 130,177 137,176 $V 131,162 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,102 $V 198,102 199,118 $V 199,118 138,171 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $S 216,264 "Fire!" $V 260,260 417,242 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,102 136,162 $V 136,162 137,176 $V 136,162 131,162 $V 131,162 130,177 $V 130,177 137,176 $V 131,162 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,102 $V 198,102 199,118 $V 199,118 138,171 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,102 136,162 $V 136,162 137,176 $V 136,162 131,162 $V 131,162 130,177 $V 130,177 137,176 $V 131,162 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,102 $V 198,102 199,118 $V 199,118 138,171 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $V 321,186 250,158 $V 319,193 265,172 $V 316,199 290,187 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,102 136,162 $V 136,162 137,176 $V 136,162 131,162 $V 131,162 130,177 $V 130,177 137,176 $V 131,162 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,102 $V 198,102 199,118 $V 199,118 138,171 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $V 321,186 187,122 $V 319,193 215,141 $V 316,199 232,155 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,102 136,162 $V 136,162 137,176 $V 136,162 131,162 $V 131,162 130,177 $V 130,177 137,176 $V 131,162 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,102 $V 198,102 199,118 $V 199,118 138,171 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $V 241,145 179,117 $V 265,163 179,117 $V 316,199 180,127 $V 169,120 163,101 $V 184,111 188,89 $V 163,101 172,115 $V 188,89 190,110 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,108 136,162 $V 136,162 137,176 $V 136,162 131,162 $V 131,162 130,177 $V 130,177 137,176 $V 131,162 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,108 $V 198,108 199,118 $V 199,118 138,171 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $V 191,115 185,109 $V 178,104 185,109 $V 246,158 180,127 $V 169,120 163,82 $V 185,109 204,80 $V 163,82 172,115 $V 204,80 190,110 $V 175,133 173,162 $V 173,162 181,132 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 198,108 141,158 $V 141,158 149,161 $V 141,158 130,154 $V 130,154 137,171 $V 137,171 149,161 $V 130,154 157,133 $V 162,129 162,129 $V 162,129 195,96 $V 195,96 198,108 $V 198,108 199,118 $V 199,118 149,161 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $V 191,115 185,109 $V 178,104 185,109 $V 183,125 183,125 $V 169,120 164,61 $V 185,109 219,66 $V 164,61 172,115 $V 219,66 190,110 $V 177,134 201,167 $V 173,142 201,167 $V 188,128 256,143 $V 256,143 195,120 $V 175,147 147,192 $V 147,192 173,142 $V 168,127 113,103 $V 113,103 171,136 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 146,98 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 167,130 171,109 $V 171,109 177,130 $V 171,109 142,135 $V 142,135 183,120 $V 183,120 177,130 $V 142,135 157,133 $V 162,129 162,129 $V 162,129 175,116 $V 175,116 167,130 $V 167,130 199,118 $V 199,118 177,130 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $V 191,115 185,109 $V 178,104 185,109 $V 183,125 183,125 $V 169,120 132,80 $V 185,109 195,52 $V 132,80 175,116 $V 195,52 190,110 $V 177,134 192,201 $V 173,142 192,201 $V 188,128 241,106 $V 241,106 195,120 $V 175,147 234,175 $V 234,175 173,142 $V 167,130 113,143 $V 113,143 171,136 $V 167,130 160,153 $V 177,130 210,140 $V 190,110 208,94 $V 172,105 172,64 $V 154,122 120,115 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 142,135 $V 142,135 146,115 $V 146,115 131,123 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 146,66 $V 146,66 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 167,130 171,109 $V 171,109 177,130 $V 171,109 142,135 $V 142,135 183,120 $V 183,120 177,130 $V 142,135 157,133 $V 162,129 162,129 $V 162,129 175,116 $V 175,116 167,130 $V 167,130 199,118 $V 199,118 177,130 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 146,66 $V 191,115 185,109 $V 178,104 185,109 $V 183,125 183,125 $V 169,120 130,154 $V 185,109 139,55 $V 130,154 175,116 $V 139,55 190,110 $V 177,134 219,150 $V 173,142 219,150 $V 188,128 193,72 $V 193,72 195,120 $V 175,147 226,80 $V 226,80 173,142 $V 167,130 144,191 $V 144,191 171,136 $V 175,147 173,202 $V 155,138 130,167 $V 157,128 121,89 $V 171,109 165,69 $V 191,115 205,70 $V 184,116 247,130 $V 177,130 191,172 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 146,131 $V 146,131 146,115 $V 146,115 131,123 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 142,65 $V 142,65 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 167,130 156,170 $V 156,170 177,130 $V 156,170 146,131 $V 146,131 183,120 $V 183,120 177,130 $V 146,131 157,133 $V 162,129 162,129 $V 162,129 175,116 $V 175,116 167,130 $V 167,130 199,118 $V 199,118 177,130 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 142,65 $V 191,115 185,109 $V 178,104 185,109 $V 183,125 183,125 $V 169,120 130,154 $V 185,109 179,200 $V 130,154 175,116 $V 179,200 190,110 $V 177,134 221,72 $V 173,142 221,72 $V 188,128 123,82 $V 123,82 195,120 $V 175,147 120,89 $V 120,89 173,142 $V 167,130 276,111 $V 276,111 171,136 $V 172,131 164,203 $V 153,136 74,143 $V 152,114 128,56 $V 179,113 182,44 $V 199,118 301,141 $V 194,137 215,183 $V 151,150 97,225 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 146,131 $V 146,131 146,115 $V 146,115 131,123 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 142,65 $V 142,65 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 167,130 163,134 $V 163,134 177,130 $V 163,134 146,131 $V 146,131 183,120 $V 183,120 177,130 $V 146,131 157,133 $V 162,129 162,129 $V 162,129 175,116 $V 175,116 167,130 $V 167,130 199,118 $V 199,118 177,130 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 142,65 $V 191,115 185,109 $V 178,104 185,109 $V 183,125 183,125 $V 169,120 130,154 $V 185,109 177,125 $V 130,154 175,116 $V 177,125 190,110 $V 177,134 162,129 $V 173,142 162,129 $V 188,128 173,142 $V 173,142 195,120 $V 175,147 163,145 $V 163,145 173,142 $V 167,130 163,134 $V 163,134 171,136 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 146,131 $V 146,131 146,115 $V 146,115 131,123 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 142,65 $V 142,65 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 167,130 163,134 $V 163,134 177,130 $V 163,134 146,131 $V 146,131 183,120 $V 183,120 177,130 $V 146,131 157,133 $V 162,129 162,129 $V 162,129 175,116 $V 175,116 167,130 $V 167,130 199,118 $V 199,118 177,130 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 142,65 $V 191,115 185,109 $V 178,104 185,109 $V 183,125 183,125 $V 169,120 130,154 $V 185,109 177,125 $V 130,154 175,116 $V 177,125 190,110 $V 177,134 162,129 $V 173,142 162,129 $V 188,128 173,142 $V 173,142 195,120 $V 175,147 163,145 $V 163,145 173,142 $V 167,130 163,134 $V 163,134 171,136 $V 204,106 216,100 $V 215,110 221,109 $V 231,98 236,95 $V 241,102 241,102 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 146,131 $V 146,131 146,115 $V 146,115 131,123 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 142,65 $V 142,65 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 167,130 163,134 $V 163,134 177,130 $V 163,134 146,131 $V 146,131 183,120 $V 183,120 177,130 $V 146,131 157,133 $V 162,129 162,129 $V 162,129 175,116 $V 175,116 167,130 $V 167,130 199,118 $V 199,118 177,130 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 142,65 $V 191,115 185,109 $V 178,104 185,109 $V 183,125 183,125 $V 169,120 130,154 $V 185,109 177,125 $V 130,154 175,116 $V 177,125 190,110 $V 177,134 162,129 $V 173,142 162,129 $V 188,128 173,142 $V 173,142 195,120 $V 175,147 163,145 $V 163,145 173,142 $V 167,130 163,134 $V 163,134 171,136 $V 214,99 214,99 $V 215,110 221,109 $V 242,84 236,95 $V 246,91 246,91 $V 221,147 221,147 $V 207,133 207,133 $V 168,166 168,166 $V 150,161 150,161 $V 175,92 175,92 $V 192,90 192,90 $F $V 428,132 377,142 $V 377,142 327,179 $V 327,179 306,219 $V 306,219 304,271 $V 304,271 318,309 $V 318,309 350,344 $V 428,132 479,134 $V 479,134 520,154 $V 520,154 549,192 $V 549,192 562,230 $V 562,230 564,265 $V 564,265 553,296 $V 553,296 531,322 $V 531,322 511,340 $V 301,290 318,321 $V 318,321 338,343 $V 301,290 299,253 $V 299,253 306,219 $V 527,162 563,144 $V 544,181 570,152 $V 520,154 590,101 $V 549,192 592,157 $V 578,109 569,68 $V 590,101 581,61 $V 506,90 503,105 $V 503,105 510,108 $V 510,108 521,89 $V 521,89 507,86 $V 507,86 594,23 $V 521,89 593,35 $V 510,108 591,50 $V 418,224 410,232 $V 410,232 409,248 $V 409,248 420,258 $V 420,258 432,257 $V 432,257 446,246 $V 446,246 457,219 $V 457,219 447,211 $V 447,211 418,224 $V 425,233 421,238 $V 421,238 427,243 $V 427,243 434,239 $V 434,239 425,233 $V 507,147 548,197 $V 344,235 358,232 $V 358,232 346,243 $V 346,243 359,237 $V 365,248 357,243 $V 357,243 349,247 $V 349,247 354,257 $V 371,259 367,253 $V 367,253 354,257 $V 354,257 364,267 $V 381,274 374,281 $V 387,277 391,281 $V 391,281 381,289 $V 397,284 402,288 $V 402,288 392,297 $V 392,297 389,292 $V 389,292 397,284 $V 407,291 399,300 $V 76,56 51,65 $V 51,65 34,80 $V 34,80 21,108 $V 21,108 21,129 $V 21,129 31,153 $V 31,153 54,167 $V 54,167 88,169 $V 88,169 123,153 $V 123,153 139,129 $V 139,129 146,105 $V 146,105 139,76 $V 139,76 118,58 $V 118,58 93,53 $V 93,53 76,56 $V 34,157 47,167 $V 47,167 82,175 $V 82,175 115,163 $V 115,163 130,154 $V 130,154 146,131 $V 146,131 146,115 $V 146,115 131,123 $V 71,102 63,110 $V 63,110 65,120 $V 65,120 73,124 $V 73,124 83,123 $V 83,123 97,103 $V 97,103 87,93 $V 87,93 71,102 $V 73,109 71,113 $V 71,113 71,113 $V 75,115 73,109 $V 73,109 75,115 $V 73,109 79,112 $V 71,113 75,115 $V 75,115 79,112 $V 39,105 39,105 $V 40,111 40,111 $V 40,111 53,115 $V 47,118 47,118 $V 44,123 44,123 $V 44,123 44,123 $V 44,123 48,127 $V 52,130 52,130 $V 52,130 50,135 $V 55,134 55,134 $V 59,136 59,136 $V 59,141 59,141 $V 66,142 66,142 $V 70,141 70,141 $V 70,141 74,143 $V 74,143 74,143 $V 93,40 112,42 $V 112,42 142,65 $V 142,65 151,89 $V 93,40 80,53 $V 151,89 146,105 $V 147,109 157,90 $V 157,90 155,65 $V 155,65 122,39 $V 122,39 93,40 $V 93,40 86,54 $V 146,105 163,134 $V 146,119 157,133 $V 167,130 163,134 $V 163,134 177,130 $V 163,134 146,131 $V 146,131 183,120 $V 183,120 177,130 $V 146,131 157,133 $V 162,129 162,129 $V 162,129 175,116 $V 175,116 167,130 $V 167,130 199,118 $V 199,118 177,130 $V 112,42 105,48 $V 105,48 136,67 $V 136,67 142,65 $V 191,115 185,109 $V 178,104 185,109 $V 183,125 183,125 $V 169,120 130,154 $V 185,109 177,125 $V 130,154 175,116 $V 177,125 190,110 $V 177,134 162,129 $V 173,142 162,129 $V 188,128 173,142 $V 173,142 195,120 $V 175,147 163,145 $V 163,145 173,142 $V 167,130 163,134 $V 163,134 171,136 $V 220,75 220,75 $V 215,110 221,109 $V 242,84 236,95 $V 278,93 278,93 $V 248,151 248,151 $V 211,172 211,172 $V 176,196 176,196 $V 137,186 137,186 $V 178,70 178,70 $V 198,64 198,64 $V 169,100 169,100 $V 192,97 192,97 $V 204,137 204,137 $V 151,150 151,150 $$ \enddata{fad,270222644} \view{fadview,270222644,2,0,349} ... by Curt Galloway \enddata{text,269602880} --Where_No_Man_Has_Gone_Before MIME-Version: RFC-XXXX Content-type: application/atomicmail ; ; ; ; ; This message contains a ATOMICMAIL program. If you are reading ; this now, that probably means that your mail reader does not know ; how to handle ATOMICMAIL programs. ; ; If you were reading this with a mailer that had been extended to understand ; the ATOMICMAIL language, this mail message would automatically interact ; with you and take certain actions based on your responses. However, ; the language is designed in such a way that ATOMICMAIL programs can ; NEVER do you serious harm. ; ; If your computer has a ATOMICMAIL interpreter but it has not been linked ; into your mail system, you can run this program by piping the mail ; through the ATOMICMAIL interpreter. (In Berkeley mail, for example, you simply type ; "pipe atomicmail".) Otherwise, you can simply write the mail ; out to a file and then type "atomicmail that-file-name". ; ; If your computer doesn't have any ATOMICMAIL software at all, you ; should probably reply to the sender of this message to tell ; him or her that you were unable to run this program. ; (&checkversion 1 12) (defun init-ctrs () (progn (setq newline " ") (setq summarizer "mmsurveyor@thumper.bellcore.com") (setq global-survey-qid-ctr 0) (setq global-nesting-level nil) (setq this-level-ctr 0) (setq total-questions 0)) ) (defun nextctr () (progn (setq this-level-ctr (plus this-level-ctr 1)) (setq global-survey-qid-ctr (plus global-survey-qid-ctr 1)))) (defun pushnesting (txt) (progn (setq global-nesting-level (cons (list this-level-ctr txt) global-nesting-level)) (setq this-level-ctr 0))) (defun popnesting () (progn (setq this-level-ctr (caar global-nesting-level)) (setq global-nesting-level (cdr global-nesting-level)))) (defunq onelevel (i) (strcat (int-to-str (car i)) (cadr i) ".")) (defun apply (f l) (magiceval (cons f l))) (defun getstring-oneline (prompt def) (newlines-to-spaces (strip-newline (getstring prompt def)))) (defun getstring-notrailers (prompt def) (strip-newline (getstring prompt def))) (defun newlines-to-spaces (s) (let* ((l (strdecompose newline s))) (cond ((null l) s) (t (strcat (car l) " " (newlines-to-spaces (car (cdr (cdr l))))))))) (defun strip-newline (s) (do*((len (strlen s) (- len 1))) ((or (lessp len 1) (not (equal newline (substring s (- len 1) 1)))) (substring s 0 len)))) (defun cadr (lis) (car (cdr lis))) (defun cadar (lis) (car (cdr (car lis)))) (defun caddr (lis) (car (cdr (cdr lis)))) (defun cdddr (lis) (cdr (cdr (cdr lis)))) (defun cadddr (lis) (car (cdr (cdr (cdr lis))))) (defun cddddr (lis) (cdr (cdr (cdr (cdr lis))))) (defun caar (lis) (car (car lis))) (defun cddr (lis) (cdr (cdr lis))) (defun caddar (lis) (car (cdr (cdr (car lis))))) (defun > (a b) (and (not (lessp a b)) (not (equal a b)))) (defun mapcar (func args) (cond ((null args) NIL) (T (append (list (magiceval (list func (car args)))) (mapcar func (cdr args)))))) (defun thislabel () (strcat (cond ((null global-nesting-level) "") (t (apply (quote strcat) (mapcar (quote onelevel) (revlist global-nesting-level))))) (int-to-str this-level-ctr))) (defun revlist (l) ; like common lisp REVERSE (cond ((null l) nil) (t (append (revlist (cdr l)) (list (car l)))))) (defun informative (p) (strcat "#" (int-to-str global-survey-qid-ctr) " (of at most " (int-to-str total-questions) "): " p)) (defun survey-multiple-choice (prompt choices) (progn (nextctr) (strcat (thislabel) " (" prompt "): " (car (car (select (cons (list "" (informative prompt) NIL NIL) (cons (list "" "" NIL NIL) choices))))) newline))) ; USAGE: ;(SURVEY-BRANCH "What is your favorite color?" ; (quote ( ; ("red" "red" (branch-question-set "red" ; (quote ((SURVEY-SHORT-ANSWER "Why do you like red?"))))) ; ("green" "green" (branch-question-set "green" ; (quote ((SURVEY-BOOLEAN-ANSWER "Are you green with envy?")))))))) (defun survey-branch (prompt choices) (progn (nextctr) (strcat (thislabel) " (" prompt "): " (let* ((ans (select (cons (list "" (informative prompt) NIL NIL) (cons (list "" "" NIL NIL) choices))))) (strcat (caar ans) newline (cadar ans)))))) (defun branch-question-set (branch set) (progn (pushnesting (strcat "/" branch)) (let* ((ans (ask-question-set set))) (progn (popnesting) ans)))) ; USAGE: (survey-short-answer "How are you? ") (defun survey-short-answer (prompt) (progn (nextctr) (strcat (thislabel) " (" prompt "): " (getstring (informative prompt) "") newline))) ; USAGE: (survey-integer-answer "How old are you? ") (defun survey-integer-answer (prompt) (progn (nextctr) (strcat (thislabel) " (" prompt "): " (int-to-str (getinteger (informative prompt))) newline))) ; USAGE: (survey-boolean-answer "Do you think I am sexy? ") (defun survey-boolean-answer (prompt) (progn (nextctr) (strcat (thislabel) " (" prompt "): " (cond ((getboolean (informative prompt)) "Yes") (T "No")) newline))) (defunq surv-pkg2 (q) (progn (nextctr) (list (strcat (thislabel) " (" (car q) "): ") (informative (car q)) "" (car (cdr q))))) (defun formatfillinlist (lis) (cond ((null lis) "") (T (strcat (car (car lis)) (cond ((equal (cadar lis) t) "Yes") ((equal (cadar lis) nil) "No") (t (sexp-to-str (car (cdr (car lis)))))) newline (formatfillinlist (cdr lis)))))) (defun survey-complex-form (preface qlist) (progn (setq this-level-ctr (+ 1 this-level-ctr)) (pushnesting "") (let* ((ans (formatfillinlist (fillindata (cons (list "" preface "" "i" NIL NIL) (mapcar (quote surv-pkg2) qlist)))))) (progn (popnesting) ans)))) (defun ask-question-set (qlist) (cond ((null qlist) "") (T (strcat (magiceval (car qlist)) (ask-question-set (cdr qlist)))))) (defun qcount (l) (cond ((null l) 0) ((equal (quote survey-branch) (caar l)) (plus (branchcount (caddar l) 0) (qcount (cdr l)))) ((equal (quote survey-complex-form) (car (car l))) (plus (dcount (magiceval (car (cdr (cdr (car l)))))) (qcount (cdr l)))) (T (plus 1 (qcount (cdr l)))))) (defun branchcount (l prevmax) (cond ((null l) prevmax) (t (let* ((this (plus 1 (qcount (magiceval (caddr (caddar (magiceval l)))))))) (cond ((> this prevmax) this) (t prevmax)))))) (defun dcount (l) (cond ((null l) 0) (T (plus 1 (dcount (cdr l)))))) (defun handle-survey (to summarize subject id qlist) (progn (init-ctrs) (setq total-questions (qcount qlist)) (sendmessage (cond (summarize (strcat "\"" to "\" <" summarizer ">")) (t to)) nil subject (strcat (cond (summarize (strcat id newline to newline)) (t "")) (ask-question-set qlist)) NIL 0 T))) (defun maybe-displaytext (tx) (cond ((equal tx NIL) NIL) ((equal tx "") NIL) (T (displaytext tx)))) ; THIS IS THE END OF BOILERPLATE CODE FOR THE RECIPIENTS ; user-generated part begins here (maybe-displaytext "") (handle-survey "nsb@greenbush.bellcore.com" T "RSVP NOW!" "nsb.greenbush.bellcore.com.1991.8.17.15.18.4" (quote((SURVEY-BRANCH "So, can you come to the party?" (QUOTE (("Yes, I can come" "Yes, I can come" (BRANCH-QUESTION-SET "Yes, I can come" (QUOTE ((SURVEY-INTEGER-ANSWER "That's great! How many of you do you think will be coming (including yourself)?") (SURVEY-SHORT-ANSWER "What kind of *vegetarian* food would you like to bring, if you have any idea?") ) ) ) ) ("No, I can't come." "No, I can't come." (BRANCH-QUESTION-SET "No, I can't come." (QUOTE ((SURVEY-MULTIPLE-CHOICE "Aw, that's too bad. Why not?" (QUOTE ("I'm busy that day." "I hate Star Trek." "I hate you." "None of the above.") ) ) ) ) ) ) ("I really don't know." "I really don't know." (BRANCH-QUESTION-SET "I really don't know." (QUOTE ((SURVEY-BOOLEAN-ANSWER "Well, please don't forget to RSVP when you decide, OK?") ) ) ) ) ) ) ) ) )) --Where_No_Man_Has_Gone_Before-- --Outermost_Trek MIME-Version: RFC-XXXX Content-type: audio/basic Content-transfer-encoding: base64 LnNuZAAAACAAAIguAAAAAQAAH0AAAAABAAAAAAAAAAD///////93//////////////////// //////f/9/////////f39/f37+/37///9/fr6+vr5+/r5+Pn4+fv6+/r6+ff2dnT1dXZ29vd 5+fj6+//9//v///3//dv/2dnXV1dXV1fXVtVVVNVTk5MTU5PTU5XWV1bXV9r//f3/+////f/ 6+///3dfa/93b/d3d/f/5+fr49nZ3d3X3+Pn/29n///3//////f/d2dZUVFPVVVZX1lXWVtX X11bW1trX2fv49/b19HO0dHNzMzLx8bGwcbDzc3R193X49nf59vn52/r48/T3c/d119jZ9t3 79/nz99ZT1/jY29X/+tdRm//Z0lLT01PSkNGW0o9SkRrS05FV0A9Q0tVWUlK3/9fV87Zx8/N 2bzd68zBwMv3y8Ldzvf3xsrPyd3HyV3VzF3NTtf3zN/jSt93Tmtf71XrZ11VS+s/b3dLTmfn 91tG3U1N511na+NLym9v19PKwsvZ29P//2PZxs5f78RLQG//TdlTuc9O6//nd13KY1v/2VtC vUHNO8VKv0dbw0b/SM9T11NIzlvZWb/n1VvK1WNXuv9FvzlPvzrB2UHHXUvEQ/fZRtlPytXO RWf3P0pZUdvTd8Q9RslGSrg378Q+vb7b91/A1V3/1VvFUUTAW0W+3z+4TU7AzUPPU+93/9s/ T8K7PEZHRd+4vm/AWUc80znrumvMSWf3vknGvufZtkO5/0fLwj27zz/Asz/C20DV/0FLxS+5 RkLC20jPwz2//0e8x0LCd0jNzzvT6+vLQUPd1zjjuFc/uD85wU8868A3Y74927s/91ldSFfd Se9fb3fd1z/f39dI08pHd85AWb3jQcHTT8fOPcnCT0XDz0xj2dFfZ9/F199ryuNfZ0TP/0x3 PFnr/0lH2/fR0c/I3//jwFfX1ePf0//Z0cbLa8fbvGdjyGtX3+fdd2Pva9ffTufjTu/nY1nn 1Vdr3UvT31Pd/0ld12d391dn61tKb+NPTu9MROtPVUVrQ0lVS0g/b0JI71VbSvdR2U9Z4+/L 22PRyG//3dXfyszM68/Rxu/r293rZ+PLa9tfSOvK12f/Wd3j787bW+9r7//f5/9R60/TydfT zNfd3crJ2evr387H22Pv2W9X79Vnb2NTZ1dnV91K9+v/513X92drY2d3//9r42P////jb09d UVdXWVtNTFVMQU5NS0ZRSE5KTUxZV1X373dv39vR1+vf09fP49vf29vvzuNZb2fv2ev3b2ff 5/fR21dn293R63fn59fj619VZ29r487X293Lw9f3Y/dRWXfZ72PKxMPBv8bJxcTLb2d3X1Hr W1tZ39/d9+ffVWtrU01fY1VP2d/Z1d/v901VSU9XTUk1ODQ8NTxKPDE1QUdCU9/TV2PJ4+tX V04/StvRz8e3srCvra20uLm731dFPzQ5Oz05PUzjzMXDubq3ubrEyc7rTEdPTzxGS0pD4+9j P/fTyDVP97hLVf+30W/PrLPO17e4XffP9z9Cb/88SF3I/0zR1dk/T189MTY3LCcrLjIvOE9n Y8m0rrOura2urq2zsbO2wcK/z993W008Oz04LzU5MjE7QD85VfdfUVPT311r0crj68vG0Xdn 519RQkY8Pjw7ODxJPD9F/99398Syvd22q6y1sqywr6+vsbe1wbvCvdPNy7vJ0ci/v9vLzMXr 21tTS0M8OTcxLC0xLSkqMi4rLTUyMDA5PTY3Pk0/Rkj/X3ffy8TBxL23vLy5t7u+v7y8vr2/ v73AxL++vLy9vr2/vsO9wcfGxcfIy8jd53dVSkI+PDg3NDg1NjQ4ODw/Q0lPTl9n43fd2dXV 08vV09/j/2tbT0dBRD06OT09PT9ARk1VZ+PZ68vGvr+7uri3tbKwra6tra2ur7O2tr7Fx9Pn 509PTkVAPDw5NzUzOTc3NTg4OTw6PTw8O0I9Pz49Q0Q/P0NLQU5RRP9Xd1XHX87JzcS+vsC/ uLu9trG0srGvr662rLuytLXLvsPZzyrGrT8zw18zY808X3dVLz9IKD13PjhJPTQ9RzI9SjU4 PkQ3Rk4/RFFXY1P/93fd58TRv8zExMXBwe+9xb7Iw8nCvMzCucO5vMq7xNu/z+P3a2dFY0tj Pd82QjpNOlVJQldDTznJP9tBwEjB53fO1TzfvFnVxV9Ny+NVvtFPu8pN379J/0PLTUX3PFN3 QTzNNE85XUs/Z0k859M+X8lbS8zTScfOv8m1zc68vsC6yr24v/+wU1O00V27XbzVstHO2cw4 we/n17bP1/drWU5HPjs5LCxBMS01Pzw9Qk1Tzl9jw9VX/9dvQ1k+QFNKQd3M6+O6vMPHv8Vv 2+vP913NWdfP38zVwre9uK6zr62vsre6vHfOPEdHIyY0LyMlRSovPm80QmtOP9HI69HFzffJ Z0r/RD45Tj5DSudb0dW8vsqusNdIb+M3L0vfQefBsK+wra2tra2tra2tra2yvNPMyF85RM8t OjM0Ki4qLyg9NSwmO1NfLTnN3TxB09P3TUxIW0Y4MkJANjU/59lryrLvvq2rb0+9zC84X29j 17OvrKysrKysrKysrK23tbiyxGfCw9dDT0o1NDcuLio+KicvNzMtNFc3Ql9LPTxP4zk2UedH TVNdP0hnWTxB69dNTdPIw8XEub++w2NPV8fO68q0sravra2tra2tra2tra+vtb7Ly9VfPz81 MjA1Ni4sLi8yMDQ4Nj5DO0JKV2dKTllNWV1OSUdOUVNbb+tnXVFPT0dMTkxZXV3/38jBwry5 srW1s7G0sbGyt7m5vMK/x8jJ09HT3dXV1ePd09Xj3+P/W1lRT0dFPzs2NzUyMDAzMjA0Nzg4 Oj4+P05VY/fT083Iwb/AwL2+vsHBw8PBwsDCx8PHy9HT0+f319nT08vLy8bCwL6+u7+/v7/I zc3T629bV1NKRz9KPkBDPkFHRklVT0xGRT8+PEA9OzhHMj03PTo0RjxGPltbd83nweu+wru8 ura5u8W7tLzFzLvj09PG/13n/+Ndd19jRUpdX1FO69PbycW3vr+4srq5urW/xsjC1W9nW0dD PkM5PT07OT09PERGRU1XSExZa01FY01JQkg8Nzk3OTQ8OkM96/d30726vLKtsrWsrrOzsb2+ wcvbW/dDTUdJPU5BPj5VRU3/5+/ZxrvNvcW8x8rBx9nV3/dPTl9RSl1jb2P3b2dRTkg+Pzs3 NDI0Mjw6Qj9bU3fj2cnIu8DFvbq6yL++xcXIx9fd2edv53fK11/v481n1cPO1dvTzvf351lX TWNVU1lbX1dX//9bb2POV2tv70lGR1E/UVNMQE9XZ1VfX2dj1+vT2c/PydO/77/Cv9l3X99f 90pITkE6TVU9Rv/rUW+/uL65scS2trrBzsW4d/9vTmdIS0YvLy83LS8vNTtMTkNCyL3Hyb21 sryztbSwtrXB08G6xb531edjb0w7RkJJOT9JSFtf50TNd07PUWc67706NddPTzxrTj8vb+dL Kziw5zA70cHbxbG+w62070jdwDgsQf9DRO++ycC0yf/d/0UxNUs8OFPjwL6zrVWts2M6189E Lt/ITreusa6trcbGutE9U0hIRUNdb8rjZ1fZZ0k5TVM4P904NcnfMD3FW0xOSE08QzI9UzYt W0gvOUbOPz/Kz0jrxc5OyLa857u1wdPAt8e8s7S2sK+5vrm3yuPM0U/Xs87Rua/A39XXPjg6 MTM4NS87QjYvODYuKyoqKy4qKDhIOztvv93Au7eyvrnC18K6w7vItK23ta2trrvFrK5X77a4 xWvBsb/Cys3C0UE+Nzk3Ki05Oz85StXfWU1ISzouKy0vLCoxPD9FXV3Prb43yrVPRWvfxufJ us6svbyssd+z0dtfPUM9St1bTbPEz6+7ubXKuszDz9nGz9XOyMXGb9fZ/9s7R2M/MDU1MD0z NUM+TElFY1NHRkZJRkdX/9fM68bGv8XLv8vIx8nHxMzOwcHJxsHGz8vO99/M33fT/2/fZ1Nb VVFKR0tDPUU4ODs4MzU7OTlCRUddXWvV2dHKx8K/wry8x768ysfCz9HV2+/v929VU1tIS1dN SFfvZ3fr/+/d71Vn/29VW93j3c7MysfJyM3O0Wt3b1lOTE5VU11Z/+f/d9nX593b19HTyc7J vcHKv8bO29V3VV1MUVtXV3dd79fvz87O0cbGy8PHzMrH39H3b2NHSEpAPDs8PDk5OTg4OTU3 Ojg7PD4+QUNGS0pVW2//49vNz9XO3f/V4//R3dXJxs2/wMjHs+PftrzHxMrFur3Rxr+9xMG8 y8O5wcXGxcXGxcfdwLpT57lLLbRPLDxdNS42PTAtMjY5LjE7OTQ6SEFASN/3Z9PJzcnIxsbI xb/Hysi9w8y/v762tbm4ur7Bu8rKyNHbb+/dT09rP0VFOT9MMzpCPj5GQkZNY0BHZ0RHXURA WUtIT01BU1U9SGNFWU53V07b1ePGvr26ub+3u7y1vbi4vbvBwb/EwL/O68rTz8/jzdHMzt/r 1f/n509ITk89OTo5OTg9Ozw/QkNHQU5VRj5MRkdXa1/nzdnPvtFj28jI7//FzP/Tu85MzLvE X8LDXcq+x1vBvM9DQEdL39HX08rA011DLy8wLCgqLTVVy7u6sa2xtcs+NDUvLTE3RuO0try2 s7W1vcfMyclv58nJxLi4sMK+r7vbyt1n1+Nfd0dbTDlVSU1jZ8vN1cb/TONdPzg6VUXfzz0x SUpPXVtTR1dbOy4uKi42OURTxK6tr7G8x8zvTklPa8zAxc3vwbe8vcDIwr7A3V1PY93vS0/H v723ubnTX81HKSs0Ly9XRUHdt89LRFVOVU9RR1NNRExLU+fHwl2+v1X/zk5KTm9r2b61vLy5 1WtbX+v3v73Dv87ZyL3Dxec4LC0817yvsMPRPzIxNDxBW/9ry7S0srfHY1NKOjpEPVnvY19I PzpERUtANjzZSlFvPDZjR0fL37/HX8HjXbG9vLPVssHTuMjfucnEtruvusjZPiwuLDhJY9HP U01XvLu7wFEpJCw0za+4vsLDuLXPNCMlMMSsq6u7d0E8QEpd99XJys9dUUk/TlVOU1s4PUpF R0xVUUxXd8Kzy81Xz05nrK+6u0tLsbu2rMBPPTIuPWdX2Vk5RV1vQTcyLS1N60RLPjA6P0rn yetZy7q4ra20w626xLm/vrmura2trb1fRT9N2c/P1f9XSUE5MzU4PlVvT1E/Ni8vNjtGRj80 M0FGSltrQUtLTFdI5+fLwV/v28C1trCzwb6ztb28ur3BubW4srW9z2dfd9Pj28LBv7rH2WNH 1cbbvcNMLCYpKDK4s7vCNiQiIis4Z9FrXUg1OTs4Pz9RUT1JOzxASGdv72NEQ9s8Wb68/7ay 4721vMStrbG3rbi8r7W9sK+yu8DjWcC/xb6/72/Nw9Hv199OSj0/PUJOVf9nM0z/Q0/VTDs4 QDYsL0lNY9X3Vzs8SDY1OT1Pb+9JNkhjb9drQzc5Sv/369X/X+PDvte+ts7Ps7rEvdXXta+t s7/I38m0t+NvT0/ny8bO38jLwbrL1+NNV29jV1tFPVH3Tj83Ly44RE7Xt7rTWzYvN1XCvbm0 xcvXW05GQFFPSl1ZST86PD9LVUlBQVXj2+NnQUBO68DZY11f18rN4+fn3+fF02/Gvr7R/8zP w7y80cXCyb/HwcPAvc1n/3fnx9XT09fBa0ZBQv++uNFJW8hjPz02Lj1RWz8/a8VfOj0yKC4+ MyY2yNNCR2/jY2/ra2/Nwr/f28O2tMTHvrCxrrfPtbW+u7O4yMy8vtnEvMTIxMdvR05VRklN Sjo6PkEzMTs+Ny8vOzYrKiwuLTM2Ny86Sk89PUvRye//ysW/ubq+u7Ovr66xta6tra6wr62v tby9uLO3vb3By9Pb605fb2ddY1lKS1lfSUdKRU1IST1AOz4/OjYyNDo4Ojk7QEU6QEQ/S0g+ Q0RJSkxVV09O511NW1dbb1vO2c3Ky7/Dwbq/wcDKwr2/vb62vcC2v7vFwry/vb3Rv8Xnv933 2f/va/9vT2dZSltITl1CXT9ETD1DQD5OPUJNPkJBNk84QE09QVlLR3dIXXdny2v/y9VvxdXn wcrHxcbMvsbIt8nDu8XHw8zryt3d79/ZV8tbWWNTU29NX1dOb1v3Z13bX+Pn3e/O18fL2cXj b8jM/9PPXczVWd/vV2vnUVFXT0FTVUBPWUdNSEVCRD08PDk+PTo9Pzg6Pjs6Pz5ATk5ATFFN UWdba9vb3dHJx8K/vru3ubWzsbGurq2tra2vr66vr7Cvs7e4u72+w8jM1d3jd1tPS0ZBQT8/ Pj46NzU0NDIwMDAvLzEuLzEyNTQ4OTk7Pj1AP01TV2Nn99/f19HOy8TFxMfFxsDAwcC9v76+ v7+/xMC7vLy+vr3DvsbFx8/TzdPd3dn3b2NvXWNTTlFIR0REQ0Q/QUNJS0pdWVtnb+/n///f d+/r39nn2+vv92dnXVFXWU9XV29dW2dnb+dr99nV29fZ2ePv/29vY//vb//Z793b0dHP1c/T zdPZ21Xd1SqtrDwjrqwvLa2sNDK4uEkx77rRMWe8VzDTuj4xybtGPN3PY0vn0d93z8jV583H 62fV3VFMS8NdPMjdRtFNz+vrSdm060qxzWutUVWtwziurS6+rHdHsVM/tl9Eb7o+vLsxvb5I ML3rQD9v7z5H0T8uP7czNEXXPjw5XVEtR10tR+9VPTXv9znZdzeuWzbOu293xe/ZvMHPvky/ rbxF562t6zStr0i+rsbOta3vzbews+tJurTJyELOtF0409dE71tALU68NShCuzUqMuM9Lz0+ LTZdQyksRWcyKS/X5ysv004ySt06Q8q2Vz7DrsFD3bmv3cy3t823ssNfwK22Z8W0r9v3vLdr 0bvFW8i8vFd3urnZUb2832PN2Vdbzuc8Qs3jPDVG31kuQu9HOktXNTx3WT49T9NZNFVvTmdv VffO0+9vzsTL3dHCx8nNwL3GxbrFzr6/083HwMpva8lvV2NNTGNXPj5LV05CTmfvSz5Db0s4 OktCOjg8Ozg+STc8X99ZR1fCx0nPssvZvLvA472vv/+/ucbrb9nDV+vFzcm8u7i6trK4yMHB z0s/Tk43O0I3RXdvW2/Kw8jd28/ja1s9OD09PTUuQD80OV9LTkv3yf9nytffy8bGxsu/vs7N wr/Dxu/f0dlrWdfJ71Nj9/9MR1VFNzxLRTE4TVc8P2/PUWPI0WPvxsf3Y7i51/e/usTVxL/H xbm7v7+/vMnOwcXj1d3r70xVZ01XUU1ZU0FPSzo8T0k2NUtvQzRATEk+TW9MRVtdTElPV9vP 62v3u77ZybzFzsPDvri5t7S+xbi568e93UVPvtk6SsDrT0TMu01CyE4vNk8/MThjVTo9X9tA PURPNzRESTo/WWdHP0rXTkFFystMa8fXT83H11/Zsr7XurG5xLe1vt+8tr/BtLrVwbeyv9u6 tttZxtlTQd13OD1jTTE3SkgtL0k4MThHPj0/21VI3brX/8fAxN3Xw0k4Tu9KSv+4u99OU2NK My9LTUVd/1n/287d3b28zc7j/9tVP+fFw2fNu79vx7rAwsvFxMzjwc3vyL/C09vNzNPbXWfv Q0dCPD8/Q0ZRU+9VRGvv51VV9+9FS1dHSVX302NX9z01PEU8PkJZ51lDY1tKTd/b487d6+/N x77HvLi5vr++v7y9z8nEvMfByb7FzczL111KU2NDV9lKTOfvSE9NTv/nY01Z23dV3+fvxMhn Z0RG3WNHX1fja0RGV0k6S09XQz7JWz5T/0VJRj9ZSV3RX0pbb3dTSs9348HOY8O/vMVTy7bT v8PXvrvJ6/fZv8zn09W0tsbNus/GxmdVY+vvQkdvdzs2OTw3Nzs8Nz4/NjZTP0FnSmvnV9Pb 0+tn28ZKW8fna+fPzk//wNfj/9m9vsrKub/Gu7q8vL23uOPIvsfj48bBzN/L1efMTErI1UhT 710/PU1OQVlrTzs4PkQvPFFAPUJBQ0A0QFdB//9rRllv1VFNX9XM1c3Nwc7GxtXZysnv67y5 yFfO393O009vy/9v5+vn3dNNSdPHTU/300o+Y29NZ8znVc7L61PR22fd49vJt8zj78G9yc25 vdHIvs1rY89v486/10rn60xJ3e9JTk1MOzlAOjw2PFFbOD1AQk02Nj5CVWddV1lbZ2NP92/G zePGvbzK1cvK2efHyMXLw8rbyr/Nd+/nyHd323fT2993/3fb1UxZb9tPT1vT3Vdrb1dT9+dr X2vTTVPT90ZJR0VTR1NMX9fvV1VZSUpvd1//z8PXTOvN79vN0cLA6+//Y29na2vLxMfV09v/ d/fPzMnV0ePr319KV93P91vb7/dnTGNjd+/f58rG119T705dV0lN30o9SllMRk5ORT1n60Vd 9106S19bSVvV09PT23fPx8rC3c3Ly9fJb+u/29vHxs7My/9Nb9dfa2fd18rZ/2tv3XfXX2/Z TmfnV1ffV/dvS1lVT05ARW9NZ29NzNlOSlFd301HW1lb/8//WdnVa1tr92d3/99j/8jfb99d /83P38/Z093/0ef319Pfy8Z368/nWUdNd2f/6+dda/f/909Pd9/ja+Pn19POb+ffa+tXX3ff a//X61Fjd2tXSktbWU53d1VZ987b49X3/83Za3fVwb7vZ+fd591ja+Pn629dP11dT0n3d0pO Z2tKb813W+trb9Pf/+Pd12/j31frzNX/z9HbY13r4/dTWfdvTm9ZSFld2/dbXXdbUWdd/1XL xltX1+9v79fH0d/O/9ffb9X/SnfdXev/28//6+fn2+/rz29f1c13/+9r39Hv2eP/42fnWVNZ Y2NZW1vr1d3/b99nWf9d99HLysXK1efV31Xj12tX2d3/Z2dXSE5ZTE1FR1FXTU9HTElTY0hG Ue9bWU5dd193/9nf19Hnb/fv99HZ79PV2dXXb+/j58nL08rV18PH08rG173JzsnO28vCxcvZ ztfvT2df7+tMSEJHW1NLSUxZVU9JRUtVTU5RX2P/VUdf31tf71tbb29VWVFMd1FKS11bSEtZ X1djU1Pn/1tr52f309n30e/v0dfryc/VzsnH093P2dnMy87OysHHwb7Cvb6/ysTGzMvd59/d 3dn/X91fa1tVU1dvZ3ddT1dRT0JAP0tPRj9ETVdOTUpISltTSEVET1dbU19XSl9ZSkhFTUlb WVn36+fTze/XxM7b18rIwr/GwcK/vrvEz8nNy2//W1VjV19ja1tTW1Nfa+//b/f3//9vb19V Y9vf3//v59nj49Xf28/P4+vX3d/fa/f359nj/1tjX1tbUVf349nr19fV19X///9db2tXVU9H P0E+RUVKS0lMUU5dTEj3d3fr3etrW2/nXVdd29nja+/n5+vn38932dPXzs7N287f1dvPyNHM 09Xr92dj4+fv4/d39193XVtdX2/f/19v5+drZ/9v599j9+f/z8zOx8rDycvOx8nLyMnHytPr 5+tnVV9jWVNZW09KQT9FRzw+Pj5ERUpOTVlLUV9JQ0pNSUlLTVVbTlln//93Y19ZY+ddZ+/b y9XV08rH19/b59XKyMLEzsXKy8jNzNfn193R5+vRy8fEw8TDwcbDxNHj393Vzszb/29ZV2Nd UVlNVU9TVU1NSUtKSkVIRkRHR1dbXVVOR0tfSUhNPkJRU01NU19rd/fv/1dv3dfOyMjLy8vf 293j59XR09vf2d3Z083OyM3PxM3My87Jzs7Nz9nf9+/j0etja2NjZ11ZUVdJT0pVU0pOSERD P0NHSUZCSUpNSUZLS1drZ+vn783MzdPPzszN0dPJ0+fO3W/r09fV3+fPyM7b2/fV1dVv19PP zutZV2d3Z2tra2drV1tfW1lTUWNv39ndTln3W1lXSVFjY93Z7//FyM7n9+/V52N3a+vRzMvf 29XV1eN32dXP2dP349/j43dTXV9bQ05GQ0tMV09RT11bR0JMTkxbT05MW/fb2/dv5+fO29/d zM3PzM/R1+dj39Hj1+dbV3dfWVVn69/r52ddT13X0+Nn59vZztXrX9vR291v3+9v09Hfa1/v 42dV2ePfY/9ZW+PR0+tb3dfn499jV+vvb3dnd+N3b9fZ71VET09da1lOUUtXT0xNSFtbX1lb Y2f/X//NwcjMz2/fybzI0dXPz8rjVV1r485PR0tVXVtJRU9jZ+t3W+/n411jb+vZ1+NrZ9vO 011MTmfr2c/Tzcvb32/j3+fV0cnFzdlv41dX91tKWWv/409JU1t33+tNT0RGUVtX/+tKSERH SVtRWV9La89fU8/H1dvX39/rxLm958C6v7W90f/RwsLfW9nNydH352/DzF1nSlXTa0JNSERH Pjw2O/9XSDtO29NTPEFHV93/V0Nb91NbS0JRXcfCy8Xn38rv577N09fPzc7LZ93Rx8HKvb7L 39nn18bK/+dvd9/N3VdRWUhDUTs4d0xNu1syMjBVzlVJWd/GwNk/MjxOwbxMS0/T07rHb7C/ 69lVPtGuvciwwk6+9z5ESOPIXzRRvv9vSzw+47+/zltFx81bw9lJT79RMT9fRmtTU9VZMdfb PES5az/F51m7vM7byOvGvVXjv2fXzTj32UfdTUU/Rt9DOV09Y+NMvj882///Oj3HVdfZS01b wbnjd8RbvbzB00mssuuvT0+us7/bQsy7vF3bz0xNtmMxyL430esy68frWWc9PlVTMVfKK10/ MEhrNjLvNTjLSzV3wDdXzWdjwlvGMa1bvuM/vt/IzetXvs3HwkC32V3V1z9X177LyddMd99j ylNrPMnd7/9rZ1XIxUlrY7tbv+c8tcvPY9nJT8a8PUi5U8q9XW//zuPHPkxTvEo4uTk40U9N P0Q7W7cyM2ddSf9vMzm6z0tOQC21sDxjyUjHusw8Ubi3ur03Nq3DUUhO3bC6ySVA9+vF5z7J vkz/zT5fW7xVRMNIPcxrOsDE3UxZRk9VV0pb10hKZ2vXQ1PIyLi8PFu3x3exzFe7xL7GycFT y7Tdzbo3QKzNML3MMj9KZ76vvzNn5yMnQC48trzfvr5NTOf/yr5EO85fz77BXVu0zVFLJz6v 3y7T22vKti8luq1ET7Ur1a33Kz63rTw+RStLvNs3R99fd71FObGuW7/rMretvD08vbdd6+/P r8ROYzpOYz5RvrisrLO5999fNEzvRMEyR7g7X73bLy1A2yN3rc05P7W2NyoyNrOuv8vZtbLN Ozg+b9dvPjr/tb/rZ8XKyb7GRU7Nxzorx8ZRQVlCOkjJ4ztX389rSC5RtLfDvb69xOfOx8zF LjzDubtjTz4qLT9VPV2urbmvu1Pjz++8dz7f0b671W/Mw7rZNzc0NDs3Ki1HZ99jPEVdTEdd Rl29s73PTV24trrHx7y0sdfVV1PL2UosOuPJzkQrO7RXOTZLuqyuua+4tbfDyLzZ98XNyMvI 41tBOjkzNC4zMCstMjg3OT5DSkI6ODhHwL7C51drzdPIvsW0wri7wLq8zv9fSbq/07ndUXdj WbO3y7W6ta+str7BXdfXX+fd2//VO09fSVc9LS82Li0uKzA2LiosLzc+S1XrzevAy8e7ybe3 u766trOxw8PN49nVWV9rUe9ORknf3VfPV0/Pyc+2ub6zwbm/v8e7vtfZUVNHTU8zRTo1Pj47 N0A1MSswOjQxLjE4QVVn3by2rqysrKysrKysrKyur6++xc/jTF08MTEpKiktLygsMi89P1c/ 19HIvbyxs7mvvb/Husu/zedfUV9ITUVOQkk+Qz85Pj41RUVGREM/TWPdwb+2rq6tra2tra2t rbKyu73DyF9PQTg5LCwrLCwtKiowLTQ7PkZbW9nFu7itra2trbK0sbjBzP9JPT43Oj0/PDY+ OUBDRUA6PTQ5NTE+PDw+QUlvwrmtq6ysraysrKysrKyytriysrS/70w/ODYuLSwnJCQmLDE2 QEDdXfe/uq+trrevsLOvuLC7w8/dTz5CNTIuKiYnKCkrKiovMTM9U2PLxcG6uK6tra2tubm0 uLOwtLa4vbq3uLW2ur7Fvbe5wru+w8xbY1P3V000MCwrKikoIyMjIyQrMD1NTmfZxLWurK2s ubm5uLOzv8PO1ePN29PvVzkxLi8xMjIuMjU9Rv/bxry2raysrK2tra2trrG2ur7R51tFPjkv KCkpKCYnKycqLTY+TN3r07uvuLKtrq2tsLCurbG0ucHDd01KQDYyLiwzLi81NzU6P0JPU0pR V11d493PxsfGybyxtrq/w8PHzMzO39fEa7+0v1nn1cnNwL3AxcO9td9vd9fPXU9C3W9DNDA0 KyMjKDI3OFHFwrm7sa++y8a/tr7CvLKusK+ytsfbTDstIyIiIiIiIycvOm/Py9vDtq2trq+t ra+xubu/tri5zOvN50Y7KigvLCwxODpE58Wxuresq7K8u864xN22s7y3vc+1vPdJPC8sKCQu PjA6TkVCQ0rrTTMvLjsvOUtnzri1sbbAvLHC513fwN3/ydfBvrq3xru2v7u6tcHfX1dVWUJL RTZAY/80MkdINS4jKCowLCpCZ7vBrbaurbS3t77rw8O7vrmzra+ttb66ylc9LiojKSclKy0q Nkb/vK+sq6usrK6wwN/J70VRQe/r/1NrTGc3OSszNikkJC42PTlRwK6svq+svqyuvsy/u7TI 0bTfu8JJTFFLYzguOCwzOCg6SDJAP0bb693FyK24u768s7PE0d3Xz/fFuLjVtLnHrbi/urS6 28/Ryf/rTEvCzDk3LzM7KSMvYyszSSw/40Qv98pbUTf3WdPKTcKzu7OyvbW9x7/nzUdKPuc4 MWPrX1m9ucF3wj9M3SlBOydFxVPjZ7z/xq3VvaznS61DzUGxRi6tuzS5X8RZ374o3UEryy8z xlPARdnFStG0M7XLO8JfQLjvX7o/z7stu0g1vzs33zRBWyu9NbhHT641rkwvrkd3tC6xwePf sz9vrCesKzmsM7yxNqw2Ub++PMvKNawurj/FSLY0tOc51U02v0I81TXJQ+suvi7B0zPbYy++ Tz+tONW9QNe6Mm+xL61nN60sb602tK4+tWdBrS+/xi3MySyuNmc/QD3jN7Uqryxf4zW9TTuv LcrBP607xa4yrev/rz66zkfj2z/EyU3Ru8rT68zKRMPOSc///z/rW0xKOcs6W+s7V9NOZ8Y2 a9E9b0VPV13JyUy/U/fTxsi5PK09u8PJua1dsNXKvOfCPve/Mbc7/1n3Sdk21180xTczvyxn 1yq/My/ZMdVKM8MyN78tV1szxDJbuS2/VT3dw8ay77TLxa7Hxq13rcC9sLdbrT+t2V2yY7yy /7xfw9vjPMRZRVHF00PEd1HNS85bTevMOLg4Sc8w9zA6UzlENk88QEkzUz9nNMlH389K20bH d120R8K7NbfTP67nVbQvTrQvsUDXV7FAtV/PvNVHsDbLy0nFPMRVY9tHxTg/vy3KPD/rxDa2 MN9ZZ0S4QblGu9fKXVvTSdvj1T65RuPGb0u6OrxPd3fnX/dV5022W9W9QbRPxWOvQLrAwL7O y8i8PL1LtEPXV7k7xDjCO3fO4zq+PlnRREPXO88vQ0jrNmc9Y009RUkvuTRHdzpLPMY5TVnN VT21U9XXyGu34768xneyXcLIv0a6P7nV18JXukTvtj/MS89BuFtLv1PZW9tR091CyldDvj3B O9XPS9vKOsc7xz1jzTjTUePdVc8/skG7Mt3vb9k/uzq0U9/FQ9tB2c80uzu3OrtLzO/XVdlL PMVE107HSl9r3WM9W2dJyzGwLr7ZRtF360++SuPf40PjX0rD3z26QcNIvz+9Qe+7O8LvVbk0 tfddyNndb0C9VbtVxW/TX09TVUhJ70VXY009a1lH/0rTTfe/yPfD47tnxb+/z7fA2bLTXbVX u0m/ScDOY9XOV1fNPms+azTPPTpfOT9FMFs9zzdJQu8+90VfWfc32TjRWW9vV9dv/2u/TblN yEK+90K6PLhNxM5DuetVvefbTLjvw+O7zve6v0fDVchOtD+/013CM68wska9T8+/QM5HSc1R 711GzULKNboqzjvjTi+5Mt1vX0FK40ZX68pfXbtE28fKTsfdZ1XLVePN0zvX91M6wkxOPbg5 RMI/zWO9SrnDxNXvvlG02f+tWbhPvd/fs0i80bpGw79Iv0vXQE9nMMs8QDZbPUlGMV9ESjnr TUVKWzz/70dv28NMzNtFvl/Z49fFXchvWefRa1XFVdlXulXTvc/Rzs3jwc7RyMzIwcTNv8jd yMm/19Pf6+dnS2/nTGtPQFlFRz9DPjg6PjxCQEJJSmNM30Z3a2dM7+ffR9/X21m81dPLz83I vVnTxM9O3cpTxV9nUbxvU9PvSXdVX0bfR+vZZ8M/vVPNTb8+698+/1e/POvJ28PEuc23612+ SGM2TD1L9zPFycK/w6zjrLGu17RBz0dVIy0vLykzMDk/Sjc9Zz48Ok1OZ87NraysrKysrK2t usNROSYnIiIiIiMpLjVGu6+srK2tra2tr8PXXz0xMS8/SUbfv763vK/Gv8ZGL1NELytBOE9V 38mxr7q6rb3Bzrj/t8bHtbOzu7CzvMDXT0Y0JiIkIyMjIyMjJis5WcK9rKusrKyssrK0wsnn 38bbwevEuN9nusrXwkdTzM45Pci+Qbq7tbi1zsW541lO10ZL5+vDvLq9t7W+y9tRNCwnIyIi IiIiIiMkKzRLa7Szra2tra2tra+zvv9n31tRTVv/d//n12PXxc/Da8zLv9X31b/G18zByb7K xMK/w7/Gv8TGzt/O0Wd33VVrSk0/PTsxLSwqKCkpLCosLzEyPVXXyLazr6ysrayusrjBz85T Qz44OTc2NzdHRFNd3f/PvcTn08C9vcG0r7Cysbi0ubnI519ZOjo1OzxHTVn/b13vRU9FPS8u Ly4rMDA5QFdb/768tbezrbKvs7Kzt7m8v83Pzd3//1lIR0M/NDIyNCwvMTYzNz1GWU9j1b66 vbGzrrK1tbq9vdfnY2tOSUlBRklBREFOPEg/TEJMTEljd9XPvbm3t6+1trW5u7zBxsLD1b/J vsvH5/fnT0lJOjcvKykoJyUnKCsrLzc7OUz3/09v0cnPu7q2trW2tLy1ub3Cw87N/+tv6+vd 59HjysLOyb61ysvAv+/3zMzZx8nHwcnFys7Bwcy9x7/J09Nra04+Pzo1NC8uLSkoKSYjJywp KTA6OjZT2dV3u7extqysrK6tsbnFvshvZ+/rX+vIzMzEwcTOwc3IzHfdvtXv1c/KZ9e/07+5 u8DEzNNXV11fS1dn51lTXV88PjwwLSwuKSgpKyskLio0NUZV983Nx825tba8sqystK2vrLO4 xcPO90xIUUJFV0hn39HTzsXCzdnEU9W/3+drzOtP08DAt7Kys7y9u9l36+vfT2fC0V9r3Ugz OTwuKjAsJigtKiMsNjA9StPvW8+7xc3Auq+/r66vsrnAxW9RQzo2OTg9PUNZ5+fKyMHF09vj TT7V31E+U+tPZ8m7t66sraysrLm3r661sK2tsK6vvc3TVzcvNSwlIickIyMqKC47REJLY8xT 0e/AxcPBtbi1wr/dXz88NDQuNDA2OEZVU9HNxtXRzv9R281JQf/XXee3uryysbm6sba2sq2u rq2tra2vsLzLZ04/NDEvKSYmKCIrLjgqPEFLPVnO3dO/urO9s7u9ys1jRj0/PDg9P0FDTExj TvdTTU1DRztPPktMUd3jy8W6s720uru4urK0rrGtra2tra2vtL3L3Vs+OzsvLyouKjcsPjlE PktbRkbv3dvjtLm8ubG7xtv/QDswMi8tLjQ1NkBFTD9LPjw5OzkzO0s/R9fIxL+usrGurbKx sK+xrK2srKysrKyzt7jMSm9INi80KyosLywwP0M+S9dVR2/v/9fGvLq0tLW7vtPbTUU7PDM1 NDU0PTpGPkxISz0+PT41QUdFRc3XyL2vt7Wvr7aysra4sLWztK61r7m3zM9OSDUwLiwrKist LjA3QUBXTtXI0d/Fv8m/t6+zrayttLa82U9JPjMxNTQ3NUU/TUxXR05EPTs7MzpERUlf08zN ubnAvLS5xrO3u7qvr7GzsbG4wr7NWzU1NTUmJzA1KzI7Ty493/9BRr3rd8qusruura28uLTM T013RDNEU0g/V91TR0dXOTI5MzAyPjZB3eNNb7rZzbq3vMO2vMW8uLq2rbK1ubG6x9FZSjIz LDE0LDQ5PDJNRVNOwsDvu7u4xrKsxrfIrMPGtrvDyV9bMzQtMCktLTgwOU/nX8zrzkxXQ0M/ PTpJREjKtnf3v7nv17Szvr21usK7uMC1rbTIuL7Rd01JMi4tKjEqKj0yOT0u32NB48S+wL+t u8awr7fKvLPHY73B3V9r7zw2QDgzMTc/PEDr38/DwdVj3e88QUlAPDw0VbxrW86vvdG/rF+u vbivwa25ra25vMDrxkItyy8pVzw0KS9HNyZEPC8yukPGz7evSrmw289Zvchb27lnudPrdzVJ NSs0NzJBT/fP57i93dtXRzg3OTw1S19T666sw7Wsrry4tb63srG1rKyysLG2y1dPSDsuLC4w Ky8+LSg2NzUuOltBRsHT67muu8HBs8LOws7Nyr6+yL6+y29VSjs8PDk8REZn3dvX4+drUUU+ OTo6Oz1BQUlj19PbwcS/tra4tK+ur7Czub6/yf9nW0A+PjgwMS8uKy8rLTE2Nj5DT+PT08e9 vb6/vL68tbW0r6+wr661ubi8ydHP3+/bb1tbWU9KTUxDRkhKSEpNS0pNRkFMSkVJTkpJW2/3 48rHxMDGycbIztfXd1tXSz06OjIuLy8sLi4vLzY7P07v18S7srGwra2tra2tra6ur7O4ur/L 1e9LQkE7NDI0NTQ4OjtBTFdXX/9fX19KVVFCQ0lGRGPd2cm8uLu1sri4tbm+v73Izc7VW1VR PTo8OzM1MzIuMTU0QUh30cS7s7Cvrq2vsK6vtrW1vsfGz+dnX0w/OjYtKyooKSkpLC41O0BT Z9fOy77Fvbm9x8fK39fRz9PGv8XFwcvKxcPTycjJzsvK693bZ01ZV0VAQjsvNDMuMT47SVnv 1cy8urWzsa6ura2vtbW3u73Cw9vvXUM5NC8uLC8tLjQ8PUJVY93PzcjRvsLR0+9jTF9bTevR y9HJy9nLzcvZzcrTycvR5+NvT0pIPz86NjAvLi0sLS41PUhP78e8uLSvr62tra2tra2tr7O3 vsHLY089NjMsLCwsLS4zOD1ESuv/09PFytPN79lH72/32dXFu7+8vrvCv8a8wMHCvcvV09tP U3c/PEA6MisuKyorLTE4UVXvzbi8tq+trKysrKysrq+0t7zI4/dbPjUzLysuLi0tODc6Ql1X WePJz9vT71lrb0gwxb1B2f//tcHbu8+6tcGxvLmvvcnTz8vZZ1E3Pz0uJyQkJi8xKzJHY2/B zbWtrKysrKurq6ysurO6xGdTPTg9NzEwNTU4Oz00N0BAN2dZRT1KTVPvxtHKtrb/99Vn9+/3 27Gur62urLC4v9VHyT8vPDxILygpJC9CRiw0U0H/TDhfra2urbmtra2tt7TBx8VnNTpLX1tV PUJrz0hCPjdDQDzn/0dLY2fd583BvrrfPT1BY+/398ivsK+1trm8tu/v3/dbPkFGPCsvKzXV PztVN0BOMUqytcG0t7y1r6y8y7z/b2tdQkdf109FY0pnTzM4Nzg6TlVdQ0FE/7/Bxbm6zutv b+fXtrjIuK+tsrq9vt9fZ0pJW0Y5Ni87My9nOiw9Y1M7PsO7wsm9v761rq26ur9rP0pZT1VV 42/bzspdS0E1ODg6OkZRTEpMZ2fPvrvAy2tb68nDu7Ozs7Ctra6yurzKXV1bVUAxLiooLi8t MS8wMjM7R0tv0cvCvLi0uLe4wsXI0efTd11NSUdDRUFDU1/3TmPr3ePX029vWd/f0dPT92Nr XdnPzs7L1dPGwbq4tLW1t7a3ubrB1WNKPUJANzUrLSwrKisyNzs3O03/zMC1s7a3tLS0tbq8 xtNjV1NOSEY8Ojo6RE1PUVlnWUhGTVtjX1dOV1Pfzce/vbu3t7azr62ws7i7vb7IzutfQDky LS4uKS4tKTAwNEhFY9nGvLyzra2tra2ur7G5usrbV0U8NC8vLi8tLS8vMzg6R0tT/2dv2+PV ysfOxcfNwr++urq5t7a1sK+urrC0try9v9XZX0Y9ODAtLCoqKissMDI5Rknr1cC7tLK0r6+x sbK8vsLZY19HOzoyLy4tLi4xMTc5P0pba9fIw8PHys3Nys7JyNnTysvNv8PBuru6t7a1srS2 ub2/xMnVa2NLPTg0MTAtLi0uLzI3PUROW9nKvrm1sbK1srS4urrI28NIQD4+NTczMTEwMjM7 PkVPXe/ZzMS/ur3CvcHMx8bXzcnT1dPV29PGxcXFx8PEv8TBwMPHzdfrX01JPjg3MTAuLi0u Li8vMzk9Q0xd287Evbm7ubi6urq6vb7D1ed3V0hKR0dJR0ZMV13n1czCv7u5t7e5u7y9w8fX 2/djSktJSz/3JNW4TEkqTLO8/+fPysnRzN/f61lLPD5NPDw/PDs1Ozo4Mjk+RUhd3c/Hv7y4 tLCsrLG+yce7u7nD11NJQD9IRUE/PTY3SVnZ3dnbycm/wsPPW1dXUUxBOz1AR2fHv7/Bwb++ vr7GyWtn52ddT0VDSllbR0Q8Oz5AP0JFVWtNW+vEvby7urq4usPJyMrVSz06Sd3Kz+d3a/9j W1VJQDs8RlN35+//08vAv8jTXUs9S1tPPjk5R9W7s7G0uLe4ur7OX1lOVV9bU1djZ1lbWU9H RD4+PT1BPT1IW1lVXdPHuri1usn/18jH1Ug8Ru/Dwszr/9/n52dORTo0Nz9TX2Nba82+vL/O 519FQFNnSzsvTN+6s66vrq2srrjCzdv/VUxPRkVZX0w/QkpTTUk9NThATUs6PVN3y9fTxrq3 ub3Fz9/r0eNLPUld99nIy9vf2e9ZR0Q+ODQ1OkRRX2/Rx8HDxdHfYz9HX1s9OD13wrm0srCt ra28yMrM3VVHQ0ZKT05APD1LS09IPDdMWUE2O03RzGNZY8+1srrLyMDD5/fJx+9V793NycfH 09vb31lERj88Oj9DSk1b59fn2dlr/1tITW9HP0hfz7y2sLC0sq+3vr6/wc/Z419XW11AODg7 PDw8OjM0PTw3OkRGR09n59HAt7vAwsHAu8XZ2d3VzMfFwMLMzs/nWVdJQT8+PDs9P1FZXWvb 729nX1lKPUffY0dHXdvOxrq3vbmvr7e4uLzAx8/Z729j71NJSFVMQT1BPTo5PDo8PT9RWVVO 58/T0czN3fdf0cxfU+Pn4+PT193359/3T09RSz8/REZHVWvr79HJxcjNysbN0cvV08TKzdfL x8rIv76+wL++v8LHzdHd2ddvV0lLR0I/NzY0MzQ1NDY6P0VLUVtfd+/d19PTz8rExsXFw8O/ xMnHy87Tztff619PTEdKTUxKS05VVVVPVVVZU11rX2/33dnP68rRyMnOz9PX083Jz83T19nO 0dvj929nX2NXUU9LT0xMTUtPUVNPT09NUUlKTUtTT2dd/9nOycvGwb68vL2/wMTByMzR23dn TkVJRT8/QEA+PkFAQEdLV2v/1czFxb/Cv7/Ew8PFx8TIztXX19vd9+//7293X11nZ2tnW1VV T0hFRUlDPz8/P0E+PkA/P0ZKV2dv4+vR0c7PzcjBwcC+vr29v77AvsbNztvjd11dT09HTEhM SEZJTU1LTlFVVWfd19HPzcTCv76+wcTEy8zOzOvf42fjX2NTV1VVT09NTUpMRkxGSE1JT1FV UVFPVVdOTkpMTUxLTlFbXW9rd3fn59vT0c/RycXBwcHBv77BxcHBx8jOyNHV29vd/29ZVUpK R0VDREhHS05TXW/n09HOysbIxcjJy8/Tz9XT/2f/V2NXTldXS1dPT05NT01IR0dGRkdLQ0ZD Q0dJS09bXWN379fPzcbIxcbCv8PCw7+/wcDEwsHIyszP0fdvZ3dfS01KSkVKSERCRkZGSk5T TlNNT1ldb/fbzszIzMjIxMjFw8fIy83Z2eNjUU9TTU5MSUpHSElCSkpHV2d3d+/n6+fj5+/j /+//d//j39fb0cvNz8rJx8LCxMfGxcnGys/Ozd3f4+NjWV1RR0dGRj9EPjw+Pzw5PDs8P0RG TFddU193///n39nRz87OxsfGysfM19nduTQ9rL0lPqw6P63OQcJrRcTnOee6PWe16z+6ukhr uchK3cpn99VZV9vZV3fD91nKyu/Iz3fX1Wfn13dv0+dX1cxF38dnQWtVPkZXPj9dRzxFRzxM STk8Q0o9P1tHTs/r78TBwLvCwLi+xsbC32e/yk3CxUe9vUfd1d/b38rTb9m/RVtbxU41Qm9N NUs4a2M72URGvtdRyNXPvlvfxNf3zuvLzcvN/87I29lb3evbVUpX701GS0dTU0RAQ05PRUxb a+/X0dXOxr3X473BTcNO28TvRs7GTsHbyL+7utnCv9nVWWdBP04wNTQ+LTo7PNs230fjW1Xv QWdNz01ZzE7E68G+wrzFvb2/zdPA58nJ113n1UVTRjs7Pjo3PDtFSkpX3cO+xLm5uLS5xbq7 //9Za+PZzNW+sr68tse7w7/Fd29PU0M6QUZVMURNPDE2TjswRDs9QVM+Ud1TXc7Za8HF09vH z87O92/j/9NDX09d/0FnPVk/PEY7TjrvXc69z7rByLa51f/PW1/fTU5d67rNRbDFtsC82bjA N7gyrkU0rS65vz+8ONFCSzs9XzjbPk7vV9VPz8n/uMvCvcLJ48/Rd9NKb1HbT0r/V3dXS1dL WzpFRUhHXz5n929jX8VvZ7hLY///OtNON79Eb75NvTe1rS+sPUu3Sbw7sV1v2edNW8I1Vc07 Y01JUzLMMkfRP+9PyVPIS2/VTcBjSb4971u/5zm2SLs8tTeu2d3F3bjV48V3zcLAyNXJa7RO u1O808nPXbZGu0O7QUe4RDW4L8tHZ18yzUk3Y/85ty+5Ns2/NMvPLbY0zzpMTDvbvjfr5zvj Z09VWedTTcU8yjWtMrvFP7hLd7/du75dtUTFPNm9S1XDO7itLa0rTbUvrDG7ObzEO79BPLYu rjbJazu2PlW7Lq850bsurjS00UC8Tj+5OLZIV8I1w0XnTz3AN8LPMK4vRb5Lu9dRyUPPZ9td RfdJzkhJ43c/uji0OFm0LrAvtzS878tdU8RvUbsvrje3vj+0OK5IxcJCskS3/z2yU83B3U/f vf9byj23P8rLQspOd0pjP2s5zU5GzT/NP91K30xGzDjr1TTP529G21PnU2NHR+dCvNtHxj6u McFfW8nVzMz3utlT18pXyMpPxT5vwjmxR0+9P+vDS7/XXbtO/7hfz64urDg2rFnjsTuvb0+u U3fTRdV3NP9TP7pBVd0860tZ69s4vj0yvi22TU7XTkrLQkK9Ql/EOlu9ObxNR68vXbhM2blI ulu+1+/Zxv/M2dVZvVPP485dOsF3ObpTV0PPUz7vW0n/Re9Ld+tb/8E/zsJj3993zF9r33dK 51l3/z3ZyTPd10RvTtFbTt9NV1tf59d3d9nKd9XVy83Zv8vTwMDnwc++w2vEzNPj0+vn72vX a2/nY+fnT89Ma/db/1Nf/0VfX1dbSN9XT1FjVU1vSmtOX1lrW1tZWU1ZTFtOUVtPSlNPV01b VVtXWXdb71Nr6/f373fdY3fR/9HX18fZzNPR1c7b09fjz9fbytPGz83Pzt/L39fZ59X/zt3V y9fK08vR08rXz9HV2+Pd6+fva2ddXVtMWUlMSkhJQEtEP0pDSUpFU1VLY0v3Uf9OZ1lRb09b /1vr/9fv1+fd3+/d5+vZ79vj29nV29nd7+fd99l35+dv5/fr92v/Y+9f/2tn41vn929r713/ d293W+93d+v34/fZd9v/69nv59X/0fff3dnj39nr3edr33fj9+dvY2tra2//9+fb5+vf3+Pj 293b09nd59/jb/9rb2dX91NfV01PSUhPSk5JUUlOUURXRVNRV11VY29rd+/r6+Pv6//392f/ 393Z2dHZzt/N19HX0dfZ2c/b18/Pzs/O19PZ49tr72db51n3W+9jd2dbXVdfVV9Xa1N3WW9v d2v/7+tvb/dj62v/b/f/39/d2dHRys/O09PO68/Xa9XM21Fv0dfvZ9/3VVln3VlG511VU01f U1FRY1NNUV1vQ0xOTUtR/09ZWV9ra/fv52dv783b9/fb19Xn1dnv0dPNb93Dy2tRzu9n4/9v Sl3d31nv229ra19bTe9vZ9VTSVnf1WPZ79/fzdnI2cnJzdu4tlNN2b7CWevn31u7ykFJyLd3 SV9Bvb9IOUZXzdfPQzLNs0JHbztbvko4PU3V7+c4OufBVz5L51t3zDlOZ19PzOc0Y8vO6+tf xMfCb87BwL1rx8Ovul/Zv7iwvUpTvsvE01M3PN/Pazs6O0XGVTMuOG9dOC45R01NRTw6WdFd WVnr2dHMw9vf38avw//fua2w2Wu7sL13zsnHx79XWdvKz87rd1nZysn/Y+/bz/9ZVUlI79/3 R0tO59XvU0pXb1NBODtCPzw6PUVOUXdNVWPVW1dMPkVGRjpBQUld11Xfu7y+wte+tLLI69fH zGNFQ1nX09v/zsvT09dZ2XdbY0c7TM/n59vTua+z2cO9tq+2vrm0v8bC1/9JRkpZSz5H07/D 62tXUzkrJCMjIyMkKTM/W8+/vLmsrMw0MUfIzEo097Kutse7tq+z0Wdb62PnUzhIXdfJWU/V vbvDTnfVXetbRUn3vrm+xL+/w+9HT+fbY1lLQjo0MTAvKzI3O0v/ybCssba6v81ZOjAyMjI2 WVtbsKutvLyyrKy+Ttu/vVVfa8u5sLTGxr7CyFUzLzg5MjAwPVNJTj083+9N6zkvQD1KZ05O w7u1rLq/sbr3zcdJQUhJd8TIzL3AxNtnRjAwLzg7QvfZvry3tsTG609VOikmKjNLy7Wxr7G5 y2M8Oj9G2c7JuK+0vr3Zz7XTNjw9Sus8WcFfr706PVPj4/85LCxEura5vMKxr8w6LDEsOjIt Qe+1rKyvsLW4yz0qKSsuMzY6W7K3rL3Ar8HrSj490brPvbG0vMG60c3G09nO0U1rX1NvSi4v vGMzRDY231MyMkRXPjdFPsy9XdlTza25yc0+Y7q6W0pL08vJy9m0trO5Y0xOOzIvMUV3xbiu tLezr8FvV0EzOjYtQHdn79VvR/d3PTxNUUVRVS9My1PXzNHI519XTUdLTEhFVTs2TF9Dyb6+ 3a6svK2tvMbEubatrbiurbbBuNEpOU42Qkk3RcbAxcdfR0U+KiIiIiIkKCtE71dXP0xRY1E/ P2ddu7G0r6ysrKyyt7Kssba1tL/Dwc9vuLGxv2++/8pONElBV8vVK0BNPDQyMiwx7009/zwy Ny0nLSgoMS43PefTtLy7vs/Oyms+PtW8urSusq2svrq6t62trq2tra2tsrCtvL++v9W972Nb OkE4PjY2LC8mKTAqOS1ELjs+MC8uLC00MkhKTF/Nyb3Xysn3V9e+X83nwNu4u1m9zr69vv/R ur+yt7e9u7rOvtHP979fs8W+xd3IQudPQlXvQEc7OT8v/yrRP78/VetEyEvHXbjDtd+zd7W8 00TRa0//X8swxTlZPl87YzFfPj28V1FVZ2/fyUpJd7pOzcpbyLvRuFevV7p3tj2uvb9vz8JM zF+9M8VE2z3/O28v1S09M+swRDxNNkJOW01Pd0/jWVG6S8+3L6wvuFe3b1esRqw3rUCvrj+s M7rfxFdVu1GuNbU3uEW6OcYub0NZNT1KN9sw2Tw8SUw6Ty/OML9NPdFM39lFvTjH0cjMzLrB wbbEuL3XrUyt67atv7nCvrzbt1e2UbpPwMzZU933SEhKvDfvN0JAQixGI04qPCdCJElMJFkj Uyw+MjE2RT88XUhHxj+vU7m3v7usa6zMrLutrK2srK6suazLrLmuv66turO1tOO5ys/FU81M aztKPzdAKUsiOSkrLykqLCorLihHI04oPzI+QDPPOl0+znfnw3fCzLr3rf+zuq69tK23rcet rrmsw6y+razHrMuzw8y6b71L51V3Tl8+TTfrMGMyNMslXTAvPj42Qjc1QTFGPzrVOOM/V1tZ 02tOv8vTtlW2U69BsUZRt1G2d8lfu8jJV8Bv17xEvdHTxlm4S8nGSrpKtc1nuUK3XcFjRrhj d87ZyffZzUnGT83jb1lRxmNv2VFnU2tRWU9JYzxrSENJPUo3STc/Qj5MOlE8RERGTU5bW2Nf d+NV2V3Z/9Xv2dXNy83JxcfGwcq+xL+/xbvJvsnJycjN38rZyt/Ib8/r0+fb3+/jd2/nV+9n a9332dfv0+f/11PbX1tdR908bz1HTEFRQltAUUhbS1FKSkxHT0RJQkZHPko9ST5ORkpMS1lL 61nb49/P0crbxc/AyMHHv73Dur+4vbe3ubK3sbK2sruzu7m7vbvDwMTIytvb43drT1lGSD47 PDk1NTIxLy4tLC0rLSwtLS4vMzE1Nzk8PUJHTFFVV19v39PJyL+/urq2tLOysrGvsK+vr6+v r7Gyr7Wytba2uri7u7+9xcfL0dfvd2dXU0tHQz89PTg3MzQyMDAuLi4tLi4sLi0vLzM0NDk8 Q0ZOWV3vb+Pf1cnMw7+8uLixs7CysLGzs7W2uLi6ube3urW4ure9xMbX2eP3U1VMSkpHTkRO RkJFP0E+Pz04NzY8QUNCPDg8NT47Pz8+QkBJTedRTuvDW+9MTP/Ru7S3vsPDvL66s7a3tra3 tri8vMXIysfX51VTV0lPW11dVVNMSEU/QkZFSkNAP0hGdzFAQFFvTTUrR0m+u0s7191Z02c3 SOutray5wE/fz7m+uMK90761s7m3srm9wctPQE5TU2drRkhITFc9MDMxLjE2LiwuLzM5ODg+ OkI+PkQ8QlNvZ+PXy8S5tbO4tbOvra2tra+vsq6zsLa0tre5vL7FzOP/X1dOQE1NVUt3OkVL RFU+Rjg4OD01OTUzOD9ER0I/OzxFQ01NRmNrX9Hn2d3Oyr+9w8TMwsa/vru/xM/Ryc3Tb2tX d8zMzF9CPT1K9/9XSj4/P01nZ2dPa013b8zZ59/j0c7KxtHr09HGxL7CztvV09nXzNv/X1dR R0pKWVVfW0s/QEM+QERNUU9OU2tnz8vM0d/P48rCxMnPy9vDz76/ycXPz+PPZ99bVWNO03fr b+vjX+PJ42Nv63dTd8pHPkZZT0vV70I+RD44P29BPkU8Oz1KTkZDVz89Y0FrX29b/9nXvMm1 x8nFxbS8ure4vLXHurW7t8OuZ8W+79fLuP//290yRUI7S1VjSTdCQj5ZSkBROVs/V91R39NT 72t3yte7xu/TTE5v/2PT0dHv68hX49vbd1nKTFFfdz1MzndPX8hCTUfjd0jIwzhdy8vLwr9n OjI5Ljzd58K62ctryr/AvbxfTEIvNjZFY3fLyGfH4//O3cLDzLvDxba9urvBzmvX51dj61Fr XV9fRudLRllEPj48ODUySER30e//a01jXc3Fx7TBur/J18fjxcW/v8LGzu/PZ2NfPjYxLy41 OknfzMPJwsvR31NKODI1MTtOY8m7tbq5ubm6v73Oz+9f2dPHvLvCwutjRz9HOjxLPD9BPUpZ /+Pr998/TEk//0/fY1dXU2/O/8y+077Gv8a+ybrGxs5Z21VVw8jJusvK1Vf/X0lrU1tHVV1T /8XIwL3Pyk9MPzY6PTU8Pzg6PEY9SO9TU28+PTo2RkBNye/n505XX+Pnzb/Hy7/Py7y+t7K6 tbq+u7i5trC4urO70bvNx768wsnBy9PFymfOW1dGOTQpLSoqMC8tOS0pLyUqLS04LjM0LTw5 RcPIuLS+tsPVwNPbucy8z7q+wa6ut6yvvLW9triyrbG4tMnHyNHDyczEd9vnU05IRUo+Tkk3 SjtDSUNJPz5DNjJCMTxKOEU+PEk9WWdTXVVIRD0+UUPXzM2/yN3dZ9/R28S9zsLE1+vNwMe7 s7m3uLm+vsnKz1lrR0T/a9PHu8vXa0Q2MjQuNjg6PkBIX1Vny9P/zttLS+NOT9/ZW2tv53dT udHvusVn03fPy76tsbCsv8lnQD02Q933wLLBvsrTd0RIRC41NCsvMTc9OllGPEc5MUc7SdHJ uLi0r7i1ubO6vL7KZ1dPNlNbT7/P0cXf491rWff/3ePLydG9487Ka9vV/3fX/2vvTk1OT0Hr TlPXTUxvQjlZP0RGUTlFTjZGRFFr787BzO/HU0Rr79/HucC1sLS2tLO8v8PO29nR19vH2d9d TUY+PkpDRvdHRO9FS048RTc4MzU4O0NFWWdfVev3SXdna+d3zd3NvMfGub7FuLzAw8O9w729 xM3b2V9r38jFs6+3srnDzt1PRE1BS01LXVNMT0hJR0JKTT5fSExIPkg+QUdLV0//W0xLQDo1 NS4vMTA0PkX/X1/vVV/3783Xx72+ubK5sLWys7SwtbKztbi/vr+9wc7TxlvLwN3H1dFvV189 RmtNR01FPlNFSdNK0989Pjk4MEtIW8PFv8fXVUQ2Ly8sLjlFTtXJ1+9KPjo2PExC0bzLtbjF vL6+vbu4wMHM3dl3373IwbvRXWffTtvOx7/KvVvn519vXf9RSEZMRk5r6+vZ3V9LSz46TjhK 90fKX1P3T1lZ40v331vPycjIyePr10tj3U7ZwdfdyF9fzt/b2+tbTU48TzxNd0/r9/dV60RH RD9NQt/jy8fByrzXv85vylnNzM3BzL7F68lnUdtMz9lbxd/Gvby7wsrvPFFKOHdja8/X29vv Z1NEODMvLDA3O2vLy7vB2VM8Ny80NEFdV8vVd+f3Rmt3Quv3Z//J1b2zurCvtbSxuL2wubyv uri2wMfZz01fV0BTPEI9R0pIVU1DPDoyND42Rk5DZ0FVSkRRS/dVZ1tL/0xr29O+vrm7w8nv WVHj69vJwtnM52NNS0xIUVdO21vO09XKwsfRwdvj2dNvyef/zNXK/9nZd09jSEVXSetOa3dK PUBGPlP3d8vMXedJR9V3xcDJvmPVyGfJw8XJusDNxcHJ0dPrT0tZUU9VW2dORF02NUEvMzk7 PT5KPj49OkdBTc1n38Hr38rj983J2dW+zLy6uLC7sLe9vMHK0cd30/ff4+vVV9Vba2NHa0FJ Tmf/zc/IyddrWW9jb9Vdb+NRSE8+PD5KOD8+O01ASV9fV91rY8bX0b/Z58LJ47/b17xnzcpT 3/dZZ+Nd2+9X411j/9fZy8L349NLTldKXV1TTVtZPWdKQsj/3evbW9vb38/O38nNd8zrzs/R 0+/PX1HdVW9fU1VXRExrTV3/T1lbTEhKTD9RPkldT1FV/0vd6+/PyMDEw9PLz9PEvry2t7e/ xs/ZZ2Pn5+Pfz93b3+t3V+t33dfX2WPjTmNFRz9CSzo8Qzk+PTpKSDxIRG9f0cfJusjLw19n 791vxcfJxdfT129jUWdVa+NR0U9V3UxV39NZ/1tPZ1/r3+PR4+fr/87J4727xMXI0dvOV+/X SmdrVUhjSj1jTU9Vd0Z3d13X28vGztfO1Wfd213R02fMd99fd/9XY0JbSEFPRlFMZ19NUUFI P0pCRVNJd89db+fPzt/CysHMwr/Gx9PIU/9FXVtP0UfrV11nWVnbz9vIwse9xMPGycrJxc7J 02vn993vyWfT42/nW1lZ30/nTkx3VVFbT0RPX0J3UU3jb3fR/+vP41/vW29ZV1VKVVs/UT9E Pj5AQj9FY0Y+SENNRXdf0+PAvt3E28/r28LOucW4uLm4vr7Gyetv31f3Y1NnTutfd11bW1N3 39nZz8bNv8bIvr2+ubzJxsF3zW9b60lrZ0Y9RDwxPTMvPDg5OUU9O0hIY0ZM1+Nn181va+dn 6/ffx8zdwMzjvsjEvsfGvd3TydfJwsx3x2dVy0bn52/Pze/nxO/HyNfIzNPbxmNXX0lXSUZO O0Y+OjM5OjA+Njo2P0s9TUpTa2/r3dPPyc/fyNnKwMfAv7zFvr7CwMTAwsXDw8PrzMLbytPV Y9n/WWNrze9T/11VY1t36/9TZ3dPWUZFXT9EP09CP1FITklXTlvnX/fdz8njw+fr191fb/9T 719n719Ga0lMVU9db29da1Hn/2Pjz1dj1/fnzd/Gz8/ExMe9vrm9t7rIu7++wMfGzdnZ593n W1dJPEM+Pj05PDwvMi41NzY6M0FKOj9PSVdP51v/b9nC08jFvr6/ur2+wc67vdO+xMa5wL3I xMbEycfK0cjI283L18TE1cvGY9XXZ8tba11TRkhMQ0VAPjo5NjNDNDQ5Mi4xLi1DNTE+OTU9 PD1dQ13VW9vRxufEvse6vLaytrWvtbuyu766ssK4v727vrrDwc7PzcTH09PL20tvW1lZb1NZ UUhTQUdKRUdMTj9VS0pKSENCUUlnUf9LRktTSk9rY9tbVU9IW1lvb9/Za9fn2+PR39Hf1dnn z9/T0crVzc3Ozdfd7+tdY+9v919XUV9OX2dbY+NXTndNY1dXU09PU1tvW2v3TmddV2v/1Wvb 7+/O09++y8m9xsu+0cjE2cPT79Xb/19Xa1fOb2ffX+PT1efvV9NRT/dI3WffU0nVQ2tP91lv d07vUWNOQddL699Db1tHz0rN2UvLZ9XRS87L3bpjycdfvW/v00vMUdFj4/f/V2fdP2NnQONH U9U9bzw/Tzo9U0I6RTxEQ0ZTTUrKS8vT3cHb0cnJxsS908C9ybS4wLTEurTGsbfGsr6/u8DN tcHNusvNw0zDbz3dQ0FnQTJOLzU+LTk0KT8sKz0mPTYzQy87PTlMVU7KZ9PPyd/AxdW5yr+5 xLm8urfHssTNutO9vne14/e478O7/77dSbdJ0chN41tE70RXSD5nPVVbPllJSFtO7+M80TU7 3zDn4zbnO0xfQNFPTctJV8VEyF1nzFPGvlvB09e9yrSy16zfvbLXtbnPu99bvlPHzk3LRznE M9H/NtEw/1843TxDX0BXTkBRPUBdP1VXQe9FRP9GV+tCY0dRWT9jY03PY2/D68XI47rHwba/ urfBtrrFr+O3w8+/0du5Z8fTWb9f3c8+6007Zz4+XzdIPjNHNjlGPEE+QUdAS09OVWtX12Pb yufHyf++yr6839HK68fA38/302vIxsDv3VdRz9nja193T2PP/2tNTVVn4+NTTEtLVU9LTkVn XUzjSV9ZWevf5+f/779d09fv1+fNyeO+42POW9PGy85n3c/rz/9P219Ty1vXZ9VnX19dY11j U+Pd3efnV1/fV9vfzXdfZ11f20ZO2U3db05ZTV1X/29Na0xRV1lb/3d3Z/fX29PX2/fZ99XL 19HEzsLVz9PX383J1czb3dtXd01j90ZMQkBPREA/P0ZRRUxFTFVBW0tb71Nvb07f29vRX9nb zcD32c93zevR08zG0ci/zcnT58/Lx8DFxdvV2dXV09fX49fn51ljXVHdZ9vbU/dVZ3djWVNM UUZMQzpCPj1HQEpJREhCT01ESE9N711VX0dVXXfd293P79vbysbAv7u+vr28v8LIzcHBv8jM 2d/j13ff2///Y+NjZ2dbXW9LT19OV1tNT1VVVU5NSkJORktTSkZMTEhKRUdJR0lRTlNbW2v/ 49/VyMfFw8PAv72+vb+8vr7CxcHFwMHJxs3RzePj//f3a2tRUU5DR0ZCSkNCPT09O0BCRVVI TVNRd1//193V0czJysvP08/Z1cnn2+Pv1etnX2tvY29ZW2vn//d3a2djW01NTElOWUtMRkxK TE5LS1Vv6+PXz8jEzMnEyb2/wMHEx77EycPGy8rJ29fb/9f//3ddb2v/X1lZW1VZUVdXd1tb TFVVTU1bSk1NU1VPX05fd1dOSk5NVV1ba2d34+/r6+PVz8jHx8vHzcnT19vj3evf5/9dV1FT UVtTTldVTU9LS09PW1dfX1dfZ2/n5+vr3ePb3efX29PT08/b39nn39PbzM3NzMzRyM/XzM7P 29fd09fZ3+Pva1tVTk1MT0pGSUE7Pz1KS09RVV9nV2N379/f49nZ3dPOy87M0dPV19nP2//r Y11fb//v6+dva/f35+9v4+ff4+fvb2tnXVlTZ1tdb2N3a1tjY19rW1tdZ2tdb+/v32tra2v/ /2dfXW9b92tjVVdVT1lXY2//3efn59PNy8vLzcnJxcjIxcjOzc7N2+v37+dZVWNfZ2NdWV1b U0xOVVVZUe//d+vZzdPOz8zM08vNzs/b0dvf62drd+9rV1NbV01JS0xVTUZLTEpMSUdKQD49 Q0lDR0VIU05OUVtb/+vf19vT19fR0c3Nz8jIysfJx8rV39XXz8/KyMjCx8nJ1c/Nys7Xy8rJ y87Ry9fR0dvdd2tnY11dV11bVUpEQUdEPzw+QkA9QENGSU1VTldrd9nVys3NyMXDxMXFyM3N z9vP2d/j9+/vb/9fZ2djV1VZU09XWVFTTk1NTUxOTU5NS0pKTE9ZX//d3ePdztfT29fR0c3X 0+d3693r79/d2+d3/+f379/r9+vv5/f34+N3W2NfV1t369/r6+vj2dnf29nT09nj29PR0dvd 29PR2dvXzM3O2dPX2d3V2+vvd1tXWVlNR0lJTEZBQ0lOTk9OV1tVVVVjZ2t3d9XZ09XZ0d/n 9+v/b1lRS0xLR0pLS0tKSE1VU1NOV2NjY2/r69/Z0cnNz9fRztfd6+v3b//v59nX19PRzdHV 09vX2dHO087O0c/LzMfJx8rKzc/b3dnT19fVz87b29vj629fW1VTW1FfU09RTExLSERAQT5D QD9DRUBDP0pMTU9NXWtjY1tnX2drb/9vd+Pfz83Kzs3IxsPBwsTGycPJyMvV1d/f62dvXVdZ VVNOT09PU1tdX2fv7+vf929nY/9nZ2dna19na2936+vd49/r7///7+/f39PT0dXX1c/P2dfj 5///73f3b/d36+fZ0dXP0c/V2dHZ39tra11RUUtLS0lJTUlETEpOT0xPT1VnX2/r6+9r/+vn Z2dnX2NXW3d3//9v//9nY19jZ05XXV1fU1trWVdXU1dbV1FVVWdTd9/b2+/X0cvOycnKyMvR zcvFxMG/vL++vL29vry6vr7Ex8vP0dvf5+trX1ldWVNPT0pBRURHSkxLRklLS01MTUxNTU5X V1dfVVlRV1NRV0xKR0tESEdOUU9TU1tXX11nd3dr7+vb2+fd6+PvZ3ff593V2efvd29nZ3dv 993Z29fX1dfTy8nDxsXHxsTHycXFxMbHyMfGys7P2dvn72/v/+P35/9vWVVVU1dVV1tZX19b WVNRUUpMS0pOTU5MTElHRkdIS09RT1dZWVlXWV9fX1tfb3fj3dXX0dPV09HLzM3Nzs7Nz8vN 09fb19Pf3efv/2NjX1tZVVdTVVVXVVdPT01OU1ddY2dra2v/9/9r93d36+/f9//na+vj2dHI y8fJxsTExMbGx8rLz9HV29XX29XV29vjb2dvY2tnXWNfX11fV1FNTExLTUxISkpHSUhJSUVJ SUpITEpHTU9XY2Njb2vv5//v6/f/7+Pb0dPXztnV1d/j5+vn//9v6+PZ2dPKycfGxcXJxMfJ yMzKzs7T0dfb39vf69vvd+93Z1NbT09RUVFNSkpLS0tRUU5PTEpMSUpPXWNn9//v///3393d 39vd69/d3efn929v5/f34//db2NnZ+93d93V3dvd4+vj99/32ePZz9HOz9nZ429v///n7+// //9dWVFVU09VT1VPTFdTU05RW19XT09RXVlrd3f/b//f693n6+fd7+f/9+vvb+Pf3dnf0dXT 1c3T0c3OxtHLzNPb5+vv79/33+fV4+/373dvb2fn7+/rZ+fj/29v52/3Y3dfV1lNX1FRTFNP T0xJS01LTkpRTElHSEtIR0RISUxMV1lv9+/n18/TzcjFys3RysjMysjCyszLz83Mzs3KyMjK zMzNy8zJy83TztnZ1+Pn793f/2tnZ1dTT1VPSUpJTU9PVU5LS0hFSENERUNHSklLTExDP0RF S008SEZMS0dGSUtPTUpMSUhCSVFVT1V3b//3/2/v1dHHyr++v73EzcnKwMXLzMrNz8fJxMbH xMDDvcfFy9nrX2dnb11TXVtOT2Nf7/dva1/n42NfZ1lZZ09NTkFKS05dXWdfVf9PWVtbUU1G TkhDTUxITldf/2Nb7/fj49XnzM7MzdPRzdPXy/fO69nXy8/Vy87P1c/L28/Xztf/0e/f1dPN 999rb1tbXV1XX0tTTk5MP1E7Pzo+Qz9LSEhPU09vb1vb39PMzsPEv8O/v768u7vAvsO9x8zV 3WNvWetnWVtVTUxbVVdXVWdX42/XZ1lPSU1LR0ZLR01DSkZEPkdKTldr49/J59fTzdXZz8jX 53fZV19j71Ndd1lvb/d3Y2fd9+PXz8nHyb3BvL+/v7/Av768wb/DyM/b32NFTkE8Pjo6ODM0 NzY1NTU4PTo6QUpHRl9db3fj59nKzMLGwMDDvsbBxM3Kxb/Izc2/wMrJvr/AybzMwci9wr3A 3cPTyNnv/19fTldNVVtMSU9JRUg9R1c/SDtFPzo8OTo3Nzo3PTo9Pj88Q0pMU1drd+fd39PZ 59fNx8O+v769t7rBu77AvMPGw7/BxMPMzNXf7+/va/dnWU9NV2djX2dbXU5VQ01PU11XUVVR TD9VVUxbVXfr1czRysTO09XK0czFyc/Z2f93z3fT63dra1tfV+9n9+/j4+vvZ/f/3//r4+dn Z1dbUVFPVUhDRkNBODtAP0hHRFNVX1tvb2vv283Fxr++vru9vb24v73Av8rM29Xf7/9nU0tK RkxGS1NKV0pGTUlMSUdCP0dKR11r49Pd0dV31d/ZzMnPxMS7v7zAub+7wsTPxM/n91tbW1Fb Z19d/3dvZ1NNS0tNU1NZT1NKSkxRTU9NSlNPTldTT1FdV1VOUVVbX2NbXf/359vbz9PrXedb 53d319XO08XJ0dtba2dr/+fPzM3NzMjJzcvTzdvM2dfbzt3N38vF0dHfz8vPz9HVd9dr6+tn a11bR0hHTlFdWVlNR01LU1dRX1tfR0tKQUI/PTo7Ojg7PD4+SUJBSUBLSFVZ3+vXzsvIyMq8 vr69vr67tra2srCxr6+xrrKztbm7wMbO12tdX1tVVUhOR0xBSUE/Pj5APEM9QDs/ODY5OTk1 Ojk+PEA/RT8+QE9jV+Nnx8PEwMO+wMPKxMvL18/Zz9fbz+PZ5+9n6+fv987Ry8XTzMjJwsDL 1dXDwcfJzszHwOdXa2f/d05JSlvnX0pDPk1TUVdNU0VbVUk9PkRXU19Oa//jVVldS1VMX1XL vrvvUz5dv7rHwrrVzefZ19HK6+fn1cbbPTAuzr2ttNtIQDw0ODhNb8G9vFdnX/9dTl3dwut3 z8RFTGNvPd/328O9/0bdXUc/WU7/T2dZTzw1NVnZSz41LzRF3dlrW9/Ty7+9vtusrKw9LzT/ rKysrK+vtO9GOz7Er6640+vba0c+OEHjwWsvQzovLzEqKUDnQuPMXzxNzGfru7/BucDVa8HP x8bP1VlnWbu4zz85L1ljxVFK213OuCQpr6yyNSMoKKyrrMqwrOffNigpPbeszLzDsLTTST0+ u7mu32P321U6MiswQfdnb1fIztdTPUNfuruyt7S9uNPZ18HJ1dXvVUlfRTY7N0I6Q0BbXdH3 Wzk2Oj08Sc3fx2eyrSNPra2vUyo2Ma2ttNOtrchTKykqScvNN9u4rc0+ODnXur3VX9u3vkwx LDlKY2NHd7uwtt9nY8C4tbu5sq64yklZ59PRV1Nn30s9MDY6QDw6RF3FTkFCTT5LV1tfuLBG K66srDolLTe/rLrBra2wUSoqNUHfX0TZra3AOzhT429MTNG4s8o7LzhDPTc7Ss2yrbbXz8rG 1cjGta2tts5j2e9nSElr529EOjQyMjQuMTxLRD9jQzkySG/nUdHnwLvnsOs8raysQSvNv66t rqysrLM0LUxVOTNXya2srMHjw7lRNzlT193vTz9DPS8mJis0PkxjyL282V1LV2PTwLW0t8nj a1U+NTg+TU9MSkNGQTw5SOvf39fOwsjvb93ZzdPBure9uLW1uVXbvrPOW9+trKxAd8a9Slf/ s665TDQ4RSgjIy1FS13jwLm84zs5R1E5Nz/ZzNn3W93nXUFD2cfKxbu5tL3My7+5wM3Py9f3 WUs/Pzw6ODk1NDY+Pzo/T29j38zNzL/IzNPOytPRx7m8w7aztcnMwsrTvclnzK65SzdTUTo0 Ok7JyVE1PUs2JictNDQ4Qte9u7u7s7bB09nKzONn3cO/ys7Ju7u9vLzFw9Hj393b3d/3X1FM SDw2MTAwLy4wNjc5QUdJT2/j0cfBw8G9vsLLy8G7vby2t7q6usrLxcvTxsv/29PnU0Zv51k+ RkpEPjwzNDg5MzdBREFFUVNRb+fr39HLyL+8urq6u7q/wsPIzs7O3f9vd19fWVNOTltbV13/ b2NZW1lTU01LTVdfW1tf///36+/n087N29PV1c/T3dHPysrO1+Pr72dTU1VbT05FQUJCP0FB RkxVVVVZY19dWVNMUVFLT1NXb+fd29HIyMXBwb+9vL69vb3CwL28v8LFwL7DztnR3/9ZT09O Sj89Pj4/PD1AREdJR0VJTUtPXevf2efd49tnV1dfa19dWWNdT0xLU19nb+fb0c/P19PN0c7M y8rDysfJzM7Pzc3R09PR1d/n6+v3a2NfY1lVT09PU05NTk5VWV1fY2/v72/37+vj9+//5+f3 92NvXWNXVVVdZ11jVVVXUU9LTktPT01NTE1GSktMU2fd0crGxL+8uru8vLq6vLq/vb7Ayc/O 09vj7/9v7/9nXV9Xa05NTEdTV09OSlFRSE1IUUxZUU5NWV9TU1FXT1dVVU5bVU9OT1FRT09X W1lna/fn39XL08nKzc/Oz83NyMrHwMHCwMPEycrJy9XT0dPd3+/na19TSEhPSkhPW1VTWVtV TVFZXWNjd2/d3d3r2dXb6+fj/+/rd19bZ2NdW2NrZ/9jY1FZU0tPTE1TS1lVV1tTVWNjd2Pr 9+fr99/j59/fzs3NzdPVztPj29XO19vMw8vKz8/LztXX387L1dfd2ePb3/d3a+dra2drWVVT T0pNSkVGSklFREtLTUZBSEdEQ0ZDSk9TTFNnY/9n49nj2dHTztHM1dXTzNPVzdXX1c3X1dHM ysrGx8XHwL3Fxb6+xcbJzMfJ0d3Z2f9Za2tZWXdjTmtTOmNMODlTRDk+Pj46PUI+PkJFRz1T 90VCVdldP1/LRES77zpZvU1O28XIX9W418a528y8ysrZvbzfQsex1zi8v29HwVnTzNfTxme5 y0XBtlPvxf+972fMSP/FTUNNX1c3OUdbOFVGQFtOTks4b/83Rk9LU1fr2VfZwNX30dnL91/r VVfvS1Pj39HT0ca5vb7Dvb3Ezd/TzN/j2d/Z2e/v187d/2djUUpBQUFNVUpLWXdrX19XZ+v3 d1NV919JWe/vUU/31VFb99VO78vRTd/r/03v3V0+2fdDSV/nZ9X/2z1Z3ddDOlu1zndR9+/M vcH/07C1xOfXzt1vX0BC2b2+y763tLy+zV1LUUU5MztDTl9nX+fMw8fb72v3Y1dMTW/371tv Z29rVT89RkRFRUlDQ01MQ0RTSz5NZ1lNd93jycTAwr/DyL21xMG/xdu6xO9nys7RxL5nT09n b1l33T1300lMSU5vT0hfa0ZT687V/3dOS2fZz9/Jwb7IxN1ZV1lTR0FXY11ra1NNTldnSlFV UU9Zb/drZ9tXTld3d+ffydnKwL7JxcjM6//f32/d093X18rO293r59fX329ZTldTRltZT0NJ V+fVzNlLR9HByNtbPTtO00lIUVdf78zNV0hdVztK12NBPzk4O9vCz+/Hxs7MyN0/RGdTSN/L x720r7G6uMDNd91nTk7n2dvIvcnOy87nX2tbSk9fZ//f1d////dTUU1ITk9XVU9VXVd3b1lV WV9OS2P372N3W0lOX1lvb2ddY+fv/+dnTFFRU1fvU05rzMLAy1tLV1n/02dn/0RL08zZWet3 Su+5usXj905fv7rMa9vHyL67ushf/9tv68j3RU7XT07XXT06RPdCTvdKP2fr/2tV72dVxsLn 59nL0c2+v+PZztvj49vvTFnda2fva19bW1lfZ1tr6//jW29fa2NLS13r911b99lnUV9MVdfn V0ZId3fT38dbLEu1tetTOCkvPbutuLPFUz1O0f8uKjEtQ8asrLK6uMvEvbpRNzQ6P3e8tsLf 187O08bLXURMY83AtbW7xMbI2etjX0M9QU5dd+//Q0JHSEVLS01JT//3Z2PvXVVfb2v338// Y2v3V1tdW09MX2NTW+vb6+PMzetZZ1tEXdnZ793Z1edf39dd08bX6/9ZUefNwb53SFFOTtPM y9VrW/fvxsLdU0xbXd3HyN9PW13v5+t3W0pXWWtZa2/v59/n62/31dv36+tbWWvv2/dj0ddj X83jd03f1d131XdKTnfR6+PV/1NEV/ffy8XZY/9bW1tj6/9TV3dbT1XIzGNHPj08P2PKy9fb /1NJTD88PD5Gd9fFvsLFwMXGycvnb1dbW//v7/9n7+vb29PV28rb1+Pf2dHOzcrP1dvX09/f 73drW1dTWVdfU1NOUWPn3dvP31Vfxcv//9XrP013/1n/2/9M//dvSe/Hb01EZ2tX58PCyN9r SEtEPjo6PDs6P9/Czd/j19nV53d3WVlbU1Ff19nb3ePRy8jCzc3Oxsa/vry9vb2+zNvX619P SkY9PT5APkZHX1lr79nOzs7X3eN3629va3dZ3W/Z79/j9//n3c/dz9XT28/b0dfVd11OXU1M SU5CQEZVS0dPX0tTZ91379njWWdr72vv5+9ZU2P/a+/n5+vX0crMzs3X72v/W09RTkxGS1tr X3fb5+/V09fV2c/Z29nTz9fX529nW19TUVlfV0/r29PVxcfOyNHN08zDTMzN72/LZ2NFy2ND wkhbTUdMOWdZTlH3XWvN5+vT2dfr411fWVtba/f/d9vvX9/j4+fd1+f34+//6//n71tZX01T TVFRTFtbV1tRW1lf6/fr1dnV0czV29vX/3f3Z+f/529r92v///d3/+fv5+/r7+fd5+/v32P3 a+f/7+P35+Pf3+Pd52/v393Zzs7Xz9fNytHP0dVr5/dTU0Tf0z9OXz88PmtVTmPXU0t3129f a2NHR0hdT0NTzFFd2dPGPm/GX+vbyt9L69NbT+vrW/fNytHTzcfKzr/Dzc3T29n379drV1dd UUxRU0tESk1PVXfr7+fZ19XP08nN1c/Z4//v52t329/j99vv//ff7+vf1+fn7293X2f/W09n WWNfXWddWWNfVVtTU11TW1dXX1ln/2vn4+vZ1dnO1czPys/M19Pv7/9fV11fZ2dr/2//Y3dn Y29jV11dY1dnW2NfZ19bV1dVT09MVVFNW1tjZ293a+/n7+/b2d3f39HX19fX19vf0+/n3dXV 2c3PzsfNyMnHxcTIyMfIyc/R09XZ3dvn5+/r92dnWVtdV1VXUUtKS0VFRURES0pJTEtLS01J T0tOTlVRV1NXT09OWVVXXWN3b/fr2dfZ2dnT59Xf2+fX9+Pf49/T5+Pd39vV19vT3dXV18/O 0c7R1dXO183/3dHZ3+vf73fr3+v/73f3Y3drY2NnX2ddWWNbd1tra2djXVlbWVtZW11jb/f/ 72//d+vr/+9vd2v3X/9n52fv6+vv53dvd29v7/ffY/9v/2dv71/37/fv73fr/13d/3f34//v //drX1t3WVlvX1dbXV1bXWtnZ2dja/9fb3dn9+t3a3f/b+vv59vd39vb3+vja2Pd/2d3//9r 2+P/387r1dnP0dPZ2dXf793X59nP987Ta83Oz9fr6+9n62NfXV9VV1tOTlNVTE5OSllRWU1n Z2tr3+9399/v5/fn59Pb3+Pv2+Prd+fv3/9j91lfW1NXX1FfV1lfWVtZU/9dW+db2e/329fZ 3dPT19Pf0dvR19/T3///d9v///9Z93dra2tdU19RV01ZT1VXV2dra1tnd/9369/n2efn1dnV 19nj793jd9Vnb+fj6//fa2//7+d33Xd34/d3Z+9r3d/V0dXr39Xf3dtv69/jX2vn5133d2f/ b/drd2dnX2NPW1lZV1NnU09RU0xPVU1VXU1XXU5VXU9rWVnv5+Nd3d/n/9Xf593v79l33ePb 3dPTz9PT1dHZ1c/P78/b4/fn711nW11r/1tv62//Wevva93rd+/P29/b39vb39XZ19XT59vn a3dvW05bV1lRS0pKRklFTk1NTFn/d/drXdNrXefV79nR28rL18hnx9XvxUc/vfdBv8A8wtc9 U8xdRtXRwi+7PWu7OMa1QUq5zji2OErXYzmwPzy2ON9b50xT389VSsRL42/fSknr71lGVb5K 33fr69nn1VvZydfn28fPytnT293Ozevn2+Pd/1FTUf9vTVNv/+/dV+PZ0ddVVWfKZ2tv78pb QFVrd1VCP87May9bvsLTd0hRzs3/RE3IwNtfb//T109N29lVRNPG5zs4Pm/ZwcjIv7a9WT4+ Pzc8Oz1MvrO0vrmvtMlVRD45Ojs+W7/Da01TSzo1O0z/0c7Iure2v9fVuMvOxc9d50vLU9HR a0DNSVdOvtlL57XBLi+urccpJkE+wsnO262tyTYsNSwkJSguR6+tt7utrcTnTD03SNnvTr+2 vetbV05Z289v78W7wsXCv7m3vstfR0xGPkBfd/drb1NBR009SE7vY1PVwXc/Nz333z5frqzL Rcm760pXut/Iuss9tKywMy9Hb++709m+t8kvJy06Kio9Q125rLxN2bbMR0tdX9O+utXRu7nv U9vVb8jCwd/Mvr/Z59HfX0pBOC4zNzo6Pj9FSD8+Nzk6Pzpd38nbz7y821XLra62zF27rq2+ W9m2wL6/viv3razDLSlbTsvTzWe0rro0LC01LjEwMTu6rblJT7/E1VtZRG+8uNVT37/FV09f 787AzdXdxclvRUZNS2fv91tdV0g6NzU3Njg7REpNU2NnY03rxsnGwcK9w7+/vlnZtK2vss1j ObyvrVE4vK13NEe6xc/J2Tk5RVNATOs8KzdLPjVbxl9DT189NU/XSkvOtLu+t7TAvb6818/E v+PXzsT/U05LRFNv/0tNY2dRVUtBO0zrazs6P1FVb0k+SGtZPj/PyNl3y8VrWcC5ubG3wFdb yLe5ub7ZO0fMr733T10+NzzZydvRbysszq9nLCYuPe+2t+9jv8Y3LjVIP07O02vCra/Jzr/d 3cu9zc69u91RUVE/SltbPUprd11rW1lVb1tXT3fO01c+TU5nT+PrzMrH0/9f/9fR31/TybjB Pzhrr7PBRT7rt7LROUHJvj41O++2rsk0JyxTz99ES+/D11szOE1rZ1lPd8XJU0NASufOzm9b 2bq4w8fGxsnK51VR48HIWVFMUVNJRklP6+9b9+vfy8zPzdvX2cvN6+v/Z3fnW9nrzONdSlFZ xMZbO0zP20NLZ105O85rPUDDTVtR2etX2bo117PBLzBbrsvBwsVVybe7Qk53d0VVV0ZA09dn PVHba13/UUI+VeNXRk9fVVlv42/v18rT0869wMPJzdXOwsHZ09HXZ2vv419bY0pHU1lDS0xf b1/v70Zj38nM68zAz8Nra8PHsrlny9fH01XIvlFvS9/jzclJLTnVzGc2Liw5a9dPMjtNPTlD zkZRXVE2PFvM/9u+vb28usjb073H083L08jCvsvZ1dFfTU5PW1dTW1NAXVlvT0prX2fPWVdf zbrBd9vPz81RRFnbvLXdU1XV5+NPWV/V72M4S9/nVV1X2T9Fw81TWXfDvk5jxcd3vlVMSsy5 zOvn2V/jW+/dw+vdRUtvb0rb183jWUpFOz1nUWtVRktVT3d3WV1TV8vNa/9n3+dfTk1K/2v/ 12tnyt1Tb1nvvsjO1+/Z690/48fB1XdEUWNXv80+z9tvxFHj2e+7wz5ITOu4wf9dW8+497vR /3dd/8F3vb1XzcxXd8e/yD9ARj9K93dnTmdPOjg+ODs4OUBGXc7ZY2d3ysTBys/Pz9HPzcnJ ycbI59/Mb9Nba+9jW+/Z33f/XU5ZREhTS0VGP05KRFFEO1NnWV3fzN3DvMtJWb++29Oyw0NZ ycK2vudLTve1XUHOucTnQUNTXcO6w8fE31FDOz4+Ql9X99vd599339njyctRVWNnXUVGU0hN X0tETnfbV05VW+PVz9vvz8HRWWf/73dM/+tPWeNbQU1nd3dfUevra8e93U7vxL/rRNe5w9fK //e9xeNnV13Hzl/LPjbTt2tFOjpn42PJ20zV401GPUxXU09KXW/Nv87Pyb/Gy9tn0cLI02f3 193v6+93a9fT///3d9HT493b39nvVU9nb1tNRkBGWUpDPUdPTENHRkpHX2dVTOPZUVm7ylXV sdtv97fnz765d//Tz2/P/2//xdlORszF6z/bZz4+T0k/P01LRkNKS1Nfa11399Pd2dfT2c7N 0dPdy8rGxcrMysvMzs7O0cbJ3d/r09/f3/f3b+tjX2djZ29rX1NdZ2tvXW9379nvX13r61tZ U11RVUxHSUtOSExFSElLTEBKSl9bW2tvY/f/4+9d53fj3evf39fR09vTzM3R09/d1cvd1c3X 1cvZ49vT4+fn49Xj3efR3e/d2ffvd2Pn//fvb29v/11jU1VVV1NdUWv//1n/a+tn/2tf5+PZ 5/ff5/9v9/9dXXddY29rY/93X2vv/2tna/djY1tn63f/d9v/b+9n72//X/fr4//v73fj//f/ /2vn/+Nf42/d/+P35+ff//93Y+93/2df7//dWV1n6/9rXVvrd+t3593j73fvY2v/X1dv/1VV X+9jZ/9vb//rb29v2+vf2c/r3c73593j79XVXefA7+PDyt/E41vAdz/b02dT019I22NFztdn a11r92dPX/dN611T/1fnY2NM10/vTUDBOk9fRlPTPl3nOsrFP1Hda+P3791Jz8FdXd/Kz9X/ /9PD/1v32ePr9+/TzdHV69nM2ffVy9P/09fb1///3+/j/19j1+9MTdnnVdvjW0ffX01R3dFN V29JTstRS+vIdzpV0T9Pd91TVcm+S0q9xks+WbzJVUndz9NfSMC9w3fr0c9ROj5J7z09RM/T XVvby9vI1VFr2fdHVWPvSVvRXU1d2c1v49XN68vI5+fFv9/VxcXT0c/M513Tb19b929RTmNK QFNGTVlRU05F62tNUWN3XWvbSVPOU09T2c1jS2PXy0fKu79fSsy/d//V0azRSGe8wWNDz8HP y1nZzdNdR2e/S1Pf70tfV09Cb11BSO9dQERvRj5TTk5KTF9LT13v29/v1ev3VVf3b2/j529Z z2P3z8pX78TVWdu+3+vf0cDM/92+zv9Pz9HnU8nL61vXx+fdQkvfW0FI3czZ3/fvY11da09n RXfP30df/9lR4+9vX+//SVljW0//a1Pfxe/vzNHG0dHfzdfb2c/37+N342tv/+NXVetjV1FT W01GUUljX1lT7/dvTevX21tdzc7j683N09fP1+Pf905bT1lIU//3Tl/Vz01v0e/3VVvIzEhb 93dTXedrWbzTTNvB30j3w8Rnv8fZ1clrb9vG/0nGykpDa0hBT04+X/9NRlfvb2tV62ddSEl3 Y0tj3dfV1dHbyt/r09PPxN/XyL/L2cu+71PO0eNbz8znd9dd3ddfW+fdV1FfVUZjVUtO/08/ Ve9HT11VW9XvV2fMxetHUd/VQj9b3UxIR1XTd1Vb49f/Rf/P41Vj2d/jXffP0ev35+t3d1tj z+v/28rK49nTa8C/7/e/ws7Gxt3Jxl1jxM9V38xVb+9PTOtPR0ljU09XWU5nY0lf711T93dV XV1OXVljWWPb/2fn2dXn68zN3dvb/+ffZ2vn52tf72tRW3dbW11Vd2tOW/dTWXd3W+Pv7+vP 9+Pj53fj419n4+N3Z+/j9/fr6//nb1vv6+Nv79/TZ//j7//n6+v3z+P/59nrb9fr79/f4+/d 4+vf2+vv5+tnZ3dvZ2tnX19nZ133XVlTVVldZ2NnW113/2tv72f37+d349nn3d/V09vb3/fr a2Nra1lZa19nX19TU19PT1VLTVVbUVFVWVtZX1dvd3dr3d3V08jPzdnP2dfR19fT09fb2czX 3czX2c3d39nf7/fj5+/d2+t333dvY1NXU11PV19bVVNrV2tbWVlvX3dd6//v63fv9/9f71/f a+//3eP/92fd399v79nv9+vra2//a19TY09ZV1ddT1FOVVdZX1/vXf9fb/dv2f/d09nf09fX 3dfZ1+PR09PR09ff3dPj1evb19v36+/v4+fZ3e/va/9jZ1VbWVVPW1lXWV1bZ2NfX1VbS1lN U0lJWVVNXXdfb3f3991r2e/P1dfX2dPj29PV09vT3dPbz9/Kz8/dzs7f1+fj3+PrZ3fj7/93 Z1tjUV9LVVVPUU1KS01LTUhNVUxTUVlTW2dZd2tvZ2Nf7+dv39vjz83O0cjNztXI2czTx9PK ytPL1dHbzc/T19fn7/93X2djX19XV1VbT1FXVU1NTldRTFFOU1VZY1NXb2NrW2Nbb2vr/3fn Z///7/fj59/b4+fr6+fr5//P29XN1cvjz9vZ2+/P2d3d29XR39n/7+vn72P3b29db19RZ2NP Y19dX1VdZ1lZVWtfd1lbY3fvd+93X/f3Y/9v//9vWd3dd//jb2trXVtfV11fY1n/WU1vWV1b d2fv493j1dvR1czdzs7PzM7HzMnb3ePv39X/z9nf29/33efjd2fnZ2tfd19fV3drd1dna2dP VV1dV1lZZ2NrX/9dTedV/2dX51lnX2f3Z+P30/fn9+9f591rb2PvVV33a/9r7+/ra3ffb+f/ d+P/79nr3czVd83Ry+vT2+Pd39fv5+vn2ff/429n999f/193Z+/rb/dvb+939/9RWV13TEtr U05NU1NXTENTWU1MSUxdd1NZ9/fr/93V19PN08zP2c3j18/X48jN3czZ0dnR1Xfr7//n5+v3 62vr53ff4+vj3+dv91lrZ/9nW2trZ0pdTldRd11ZTlNnUWtbZ11nW+//W1dZU/9P93fv33fr 42tf2evPb+fv5+dn42ff39vnzdfj/3e6Vb1r39XZ1dPnzWPHa+dj2ePfSe9Na1v/THdZY2P/ 411rY2dPVevvZ+v/b0vV30TTY3f3/2fbV+Pnd2/rV9FdY1t3Tk93X05b61dnd//nb9/O1dPJ ysLJycfL383F1dfP1+Pb59X/0//j51vZZ2tjX11ZX1dMU0NJRkdbTVdKd2NjVVFOSVdTY01r Z0/jY+Pv0+vfyevf79XfVclv41X/W0/vVe/va+fj02vvzkrNy1vf58tR1cJvzcrv38zNzMzK 0b/b6//Xb/fE3cX/08pJwP/b51lbTe87Ttc5/0NExi652y+0Lsn3N8tLVzi9PTXEP2/nQ11b W81Ld8VB18w2x0TA2U9r0dXT9/fbxE7f72PFWc1Jz8vT79nD3cDDZ8S668P/XbvGTcPdv13/ x9Pnx+tXy2vRTzr31ztM7z5vWUdTQ0zbPDjOU0HrTlNNz1VdTffvWW9N7+P/R2fd2U/OTV3Z W0dL31FH68tZ0d/P2cr30f/M/2PGy8rC48i7ycBfu71jy9tjumvXzP/Ld1fZW1XdS0/nUU9X X01bQ9FTPf9Fb1tCb0lX2T1X0VHbV0jnU81KP75RY8rrZ8LZ7/dZwWtOv/drxv9bu0y5wky6 TffXPtnf/+PMUW/Z//dCWVnfW1NDUc9v4+dVv9dVZ1Vv2UZN6+/VU2Nf/+t3S1dv72dGXcx3 a//j2//3Z3fjzlNO61Pb70xr41ffb0/ba2vfd+PK1c3CztnX19nX0cbRz8fVxcPbydfZ083j 3c/jW1vf49/P1ePf1+d372dbS01LSj9MSEVHSkRKTERESEpDXUFLTUlHRk9ZVU1nRU9bVWNb 3/fv2ev349v/0+dr49PTys/RzsvXzdvJx9nH2cjLzc/Rx8vKycvIzMXOyMPIxcjPzdHb2evX 02/jZ3f3VWNrWWtdSE5LS0tCR0dESUpISEhHSUBIRkhJRElMSkpNSFFRTE5KVVFRU2Nv2e/v zdvO1cnLxcfAxMPCw8jEyNXG2c7ZztvVzdXT0dHPz9PZ19Hj09fb3dnf3+//d29TTldOSkVF Q0dHR0hCSkhMS0lVTUtOSU1OWUxfU2v3V//Z29HZysnIycHIvb2+v77FwMXJz9PX6/dbb1tX WVtVV2dnUWtfWfddXWf/6+dn7+fv5+9n32tnWVNZVU9NT09OT0dZTWtZU1tTXVVRWVNTV1FV XV9jWVl3b///b2d3a+vb2cnXzsvOzMzKzcvFzsXDysTHw8rKxMzK0dHT39Xd59vr3+P32+Pn 32fdb9/r69vv79/v493v7+9db1tjVU5XS0tKSkVJRUQ/QD89QTw/PDs9OzxAPD5BQ0RLS1FR W2dd79nVyMPCv7y+vby7vLq9ury4vb25vb7AxL/DyM7MytXZ2+vj/1tvV11ZWWNdb29TW09f SltNTFtjVVNTSlFKRExISkhNSE5JS0xLS05MV1NfV2tfX1VbZ2v3/+fV39Prys/d09Xf39HV 3d3KycjT183f0+fj29fT3ePR4+Pj29/P59vv3+/r59vr1d9r9+//d99Zd1dRVU5dTndnd2Pr Z+tjY1lTU01rUU5ORktPRUpNS1lPU1lMb1lbVV1vU2tv72fn2evZ0dPNzcnPzcnKxca/xMC+ vr6/xca/wczIzM7P3dPf/29v92dna1VMU05DSFFRQUtBQT8+PEJAP0E/QURGSUlNU1VdZ1ld 99939+PPd9Pd3/fP38/b1dvXzsvPzNfP48vj1czZxcfIy9PAxcbKxs3Rz8jH2dXT49tf/+db d3dnY13rTWtRWVlDW09MTUhJQUJIS0ZJSU1ISEtKT1tPXUxfTVdXXV33Y2v33f/X2+v/39t3 zd/X3eff1d3Z3dPv6+fv3dvZ18jHy8LIx8jHw8jFxsfNzuPf23fZ3fdr/+9fWVdVU0pRS0hP R0pBS0tEVUtTT1lITE5RT2NTX29nb+v32efTz9HIysvRxsjLzcvJys7Mz9XT1dfd3dnj28/d 3e/f9+tbXVVTW0hPREtIRlFHT0xPSklJQ05GSVFPTl1RW1tfV+tvU3dv1eNr99/r19nZ0dXb ys7VzMnKysrMzcvR09nX0+Pd1c/T0dvj593Rb+PZ6+fj5//rW2/vZ/9jZ2tjb2Nj73d3a2tr d2dbb3dnWWdV73dbd1FrUVlMWU9fVV1dW1n/Z/9fa19VWWtbb19V19dd4//XzG/j60fE29nJ VdXDVczZVdvF/93bW9tOY9dPb2dJV1FOX0RX/29rXW/v5/f3593Z0//XzufRztPnY89n5+tr 3e9v3+Nvd1vfb2/dY2Pf3e9rW3dvWetrVWdvY13rZ2tr2Xfb4+/V791j7/fv3f/rd/fnd9nr a+td//9Vb1dn429fZ3fra3dnd/djW1XrW/93X293Wffjd2PnVXdnd1f/a11j92ffXXf3791v 5//n32P3a+Nj01fO/93P99fb2+fT2d3n7//d5+fr5+Pf3czZ2dPT19HN3dnX6+v/a//3Y3db V2ddXWtXd2drb1lRWU5bYz9IW1VXd0j/W1VvVVvbTmtOY1F3WU5XW19vV11fV19bV/9rb9vX 69Pd29fV39HZzs7NzcrM1dfG29PM29PZ38jT68fN38hZ68lN01HRT2vnWdVX91NZZ1N3b1tv T2NMX1H/UVVbX2tVZ2NPVVdjWV1OWVVjT1VZWV9Zd2Nf7/dv49lrzslnv9fFv9nr38nvyt3f zmfOXd1d//fX4113V3dZ91f/71ljV1dXZ3drY19nV09XW19ZY1tVWW9bWWNnY29j42vj1+vj zMrOzGfna8JVvlfZ3+93601vd//Td29jd1FdX+/352Pr//fv7+/Z2f/j6+/v/2v/b3dVWe9f a2NjX3dvX+N3d9vZY9XXWcdZxshT3WN31ddEyU9O7/9ZX0RZXWt3V1tPVU9bTmtdY3dba3dr 79nf29/d5+P/a2dr62fr53ff6+vr3d33z9nR19Pb2c7bz83P593v2d932/9vY03n12dN70jv //9O70ffRtlX/01bZ05ZX2NJX0pOX2NVXVdTZ2Nv72P35+fr1dvZ2dPR08vR19PM49XT59// 4+vnb+vn/+fv52/ZW+Pvb/d3a11na+9nb+dnZ+//a29rX2NZa1tZY2Nfb2f/a2/vX2v/91// //f/4+Pr6+/v4+fj7+vdd/9vb29rd2/3d3dX3dnvX19P49n/0WNr32dv/1nv3etvb/fr29vX 49/d1+/v3efj92tvZ3dvb3d39/fv5+/r7//j6/9db2NRZ09nXV9ZV11rWVljb193Z2tfb2Nv a2tnX2N3Z+vj79/r3d/Z1c/R087bzdvZ2+Pr28/d3d3v7/f/92Nra1tXXWtXWV1ZZ3dfZ29r Y2dbW///929rb2/rd1trb29X/1ddXVnvX29j71/ra+fn/2933+9v29HT30+/zdfZ3d/Lzr/f 0c5ra9nV1+Pj3Q== --Outermost_Trek-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.1.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Fri, 29 Nov 91 07:13:33 EST Received: from joyce.cs.su.oz.au by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Fri, 29 Nov 91 07:11:57 EST Message-Id: <9111291211.AA11898@thumper.bellcore.com> Date: Fri, 29 Nov 91 07:13:33 EST From: Bob Kummerfeld To: nsb@thumper.bellcore.com Subject: just testing... MIME-Version: 1.0 Content-type: audio/basic Content-Transfer-Encoding: base64 //38/v3/fn/+f/3+//1//v3//f39/3///31+fnx8fXt+fn19e3x9fX39/P77/Pv8/f5+fHx8 eHt6eXp6e3t8fv36/Pr59/f59/v8/n3/fv99//3//n9/fn9+fX59/v39+/78/Pv9/v59/X3+ /X/9fnx8fXx8/n79/f79/f37/P37/v79fn58fXp5e3l4d3l5e318fn/9+/z6/Pv8/v7+f35+ fHx9fH1+fX59en17fH98f399/359fn3//v78/P38/v7+//z8/fv7/v3//v7//n9+f359fX1+ //79+fz8/P78/f79/f79/n/+fX1+fv5+fn5//n7/fX19fn59fn1+fn7/fv/+/3//fH1/fH// fX58f/9+/n5+f/3///99/35+fn19fX18fn///vz+/vx+/P///n7+f/1/fv3+//37+vn7+/z/ /f9+/31/fn5+fH1+fXx+fn/8/vv9/fv8+fv6f/7+/n58fXx+ff//fv3//3///35+fX19fHt6 fH5//31+fP7/f/3/f3///n59/v5+/f58/37//n9+fn7//37/fX59ff18fXx7/31+f/9+/v9/ /f/+/fv8/Pj49vf6+v7+/v3/fX96fH17fn1/f/79//7///7/f/7///7+/X7+/f76/fv+/fr8 /f79//77/f38/v3/fXx7e3l6e3p8fH58/f3//X9+//78/fz7f/5+fH16fX16e3l5enp7/v78 +f36/fz9/f5+fnt7e3x7fX5+/3/9f3//e359fv98fn18fHx+//3+/P7+/P78/P39/P7+/n79 fv/8/v3+/f79/Pz8/v5+//97fXh7end5ent9/37//37+//v8f/1+/f/+//78/fz/f319fHx9 fH17e3x5fXp8/P/8+//9/P77/v//fv39/v/+/f37+/r7+vz9+/7+/35/eXl7d3l5enl8e37/ /vz+/P3+/v79//19ff5+/n/9/n9+fX56fn3//P5/fnx9fHp7fXt7fnx9//3+/Pz++/38/vz8 +/n7+f37/P78fH96e3x7fH19fn7++/v7+vv6/P38f35/fX5+fX/+fX5/fn5+/n5+fn19fv59 /3x8f31+fX1+fn7/f3//fX5+ff99fH18fv3+/fr6+Pj7+P39/P79fnx8e3l5enp8fv/8+/n7 +vz7+/v8/P1/f319/n///v3++/z7/P/+/v/+f359enp6enp7fHx9/n59/X///v7+/fv+//7+ /v79/v5+fHx7e3p+fHp9e3x9e//9/vz9/fz8/f1///1+/f7+/v/8/f37/f37/Pz9//5/f397 fHx6ent5ent6fXt9fn7+/n9//v/8+/v9/fz8/39+fHp+fX3/fH19fX19fnx+f/3//f3++/3+ /35+fXt7fHl7e3z+fvz9/v7//X///f39/Pz8/fr7+/v7/P7//n18fnx//31//v7+/Pv6+/v8 fv9+fX96fX57fHx6e358/37//f79/f9+/319/319fv///vz//v7+fn5/fX5+fn18fXx8ent5 e3x7/39//v79/fv6+/n5+vj5+/v4/Pv9/fv//318e317e3t6fHv+f379/fr8+/n7+/37+vz7 /358/317fX9+fn9+f37//n7+f37/fn9/fn18fnx9fHx+fn59fP//fH//ff9+/f/+/P39/P3/ fXx8e3t8e3t7e/7//f7+/fz9+vz9/f3///7+/v/7/f39/////v9+f359f37+/v9//v7+/Pz+ /f7+///9/vv8f/////7+/v5+/v3+/n5+fXt8e3t7eHl7ent6e359+vz7+/v5/Pz9/35+fX17 e3x6e318ff///fv8/f7+f37/fnt9fHt9enp8fX///3///f37/fv9/Pr8+vr5/fv7//x//n99 fnt9fXx8fX17/35+/v/+/fz+/P39+/z7/fr9/f/+/v7+/v7//n59fnt7fHp9fn7+fX59e318 en5/fH58fH1+fn7/f/39/f7+/X/9/399fH59fn58fH59fv3//vz8/P39/P79/n9+/37/fv7/ fP///P38/f77/P3+/v39/P7+/3z//399fH58fX16fXx9f39+/37++3/9/n//fH59fHt7fHt9 e37+//z8+vr7+vv5/Pv8/f3/fnx8e3t8f39//X5////9f/z9/fr8/f1/f/59fX18fXx+f31/ /n7+/f/+fn7+fX58fX1+/n1+fH1+fH99/399f3x8/f///f9//f79/fz9/Pz8+fz7/Pv5/f5/ fH19fXx7e3x+fn17fH19fn7/fn/+fv39/f39/P//fn59ff98fX19fH5/e397fP1+/v5+fvz+ /P37+f37/Pz7/v///37+/33+fX19fX9+/f39/fv7+/v9/f3/fX19e3p7e3t8fHx+fv9//v7/ /P38/fz7/vz/fn17fHp8fHt8e3x9fHt+/v78/Pz8+/v4+/z8fv39/v7+//39/v37/fz/fv5+ f3t9fHt9fX58fX59fX1/fX7+fv7+/n//fn1/f35+f/9/fn5///3/f/98f33/fnt8fXx9//9+ //38/fv8/fz++/z//f3//v5+//7//v//fX7+fv39/f38+/z7/358fnx6fXt9e31+fP7/fv/9 /n7/f/7//v7//f/+/318e316enl8fX36/Pj5/Pv6+/36/fz//358fnp7fH5+f39//n/7/Pz7 /Pn4+vv7/X9/f358e3x8fHt6e3x8fX1+fv9+/v7+/v//f/99/X59fn1/fX5+fnx8fn19/v37 /fv9/f3//X7/fn9+fv5+fn/+//36/vz//P39/37/fP7/f/7++/z6/fz8f///fn19fH19f35+ fnv///39f///f31/fHt7e3x/fn9+f/5+/v7//n7///39/v7+f31+e3t+e3x8fXz//v37/vz+ //1+fXx9fXt8e319ff5//f3+/Pz8/P38+//7/f79/v39/n/9/v//ff59fv7//f/+/f39//7/ /v38fv9///z9fv99/358fv///fr//v9+fnx9fXt8ent6fHt8fv/9/v79/v/+fn9/fX5+fn/9 //1//v58/358fXx6fHt9fn3///39/f3+/v7+/39//37+/v38/v3+/f38+/r9/Pv++/97fHt4 enp9fH5+fv98/////v3+//9+/v59f359/399/n9+/n5/fH18fH19/n/+/v/+//77+/n8+/v+ /n5/fHx7en58fP3//fj7+vn8+vz9/P5+f/5+fn5+f3/+fn/+f/z8/fv+/vr+/v5+//9+/X58 fv99fv99/33/fn3+//7/f/59fn1+fH5+e/19ev98fv99f399/3///H//f/38//99fXx8fHx9 fv1/f/79+fz6+fr7+/39/////n58/319fHx7e3z+/v77//v7+/r6+fv4+vr8/35+fn19fHx7 fP99fn1+/f39+/z7+vj4+vx+f3x8e3p6eXp4e3x+f/39/fz9/vz8/v5+/318fnx8e3x9fX58 fH19fHx8/379/vz8/Pr6+vz8/P/8/P3//n19fn7/fv79/Pr9/P38/n9/fn57e3x6fHp7fXx9 fX9/f/38+/v9/P1+f399fX19fHx+fH19fH5+fv9///99ff9+/39+/31+/f7+/f7+/359fn17 fXx+/fz7+vn5+vn6+Pv9/P1+fH58fHx7fHt8e3t7///9+/36/Pj6/Pz7+vv6/H7/f37+//// /35+fX1/fv39/v38/v7+f37+fn7/fn19/35//n59ff9+/n5+/n//fv98fH59fn19fn59fn// fH1/fv5+fn7/fn7/f3/+/f5/fn17fXt9fH1+f/3//P38+vv6/P3+fv3//v3+//9+fn99/35+ /n/+/v7++vv8+P38/f3/enp5e3p8fXx/fv79fv3+/v79f35+fX5+/v//f/9+ff99//9+f31/ /X3/fHx+fn17fnx9fX//f/99f/5+/v38+fn7+Pr8/P39/vz9//z/fv59fn5+fv99fv//fv7+ //3+/f39/f3//v3+/Pr//f79/n//fHx5e3l5eXp7en9+fv7+/f39/fz+/397fn97/n59f39/ f358f39+/f7//359/3x8fX19fX99fv5+//7/f/9+/v99fX1+/nx9fXt/fn7+/v79/fz9//5/ /fz+/Pv8/Px//v7+/f/+/f//fv/+f379/f/9/n7+//3+fv9+f359fH58fH59/X7+/f7///1+ /v///n9/fv99f39//X1+fX18en97fHx6e3t+fv99fv///P3+/f7//n99fHt8fH39/fn6+vn7 +/z+//38//99fHx8fXt9fH1+fv59/vz9+/v5+vv7+/39/37/fn7/ff///f38+/r5+vz+//5+ fXx7enh5eXd6fHl9fn1/fv38/Pv7+/n4+vj6//59fnt5e3d6eXh5e3p+/v38/vz9/f7//39+ fXx9fX59fn59/39+/v9//359/317fn1//Pz9/v79/f36//38/v3/fH5+fP/+/v78/f79/v3+ +/z8+f18fn16enl7e318fn9//39+fX58fX99//5+/P/7/Pz6/v97fnp6fHp9eH1+fP/+/P76 +/38/fz6+//9/37+f35+fn7+///8f/38/fv9+/7//n5+fX58fv59fn7//3//fX9//n99fHx+ fv9//f5//n58ff7//398fHt7e3x+//79+/r5+fr7/n99eHl3dnZ3e3p8/v3+/Pv6+fr8/P7/ /f59fnx+f35+fv9//fz8/Pv8/fz/fn58fX19/37///z9+/n5+Pv7/P5+e3x6e3t6fHx+fX9/ fX//fn7+/31+f39+/vz9/fz8/v99fX18ent6d3t9fH59fn/+/Pz8/v39/f19/3x9fXt9fX5/ /v////7+/35/fv9+fn98e3x9fX97f/97///////9+/r7+/z9+/38//78/Pz9/f/9/f5/fv5/ fHx8e3x8ff5//P7++/38/P3+/v78+//+/v76/fz6/f3+/n5+fv5+fX17enp4eXd6enp7fH// /P3//vz7+vv8/P/9/31/fv9+/357fnx6e3x+fH99fX7//f79/v//f31/f3x+fX1/fX99f37+ ////fn7//n9+fn7/f398fXz9/f79/v7+/v9/fn////7+f/1+//1+/f5//f38/vz9//z//n79 /n/8/v3+/f39/n7/fH19e359fX1+fn/+/vz/f39+fH19fH1+f39//X3/f35+/317fXx+fHt+ //79+vr9/Pr6+vf7/fz/f319fXt9enl7fnx+/v/7+/n5+vf6+fv7+//+fn97e////X7+/Pz8 +/7//n//fX19en17ent7fH1+fX////3//v5//f1//n9+fv5//n99fn///358fnx+/n58e3x8 fX5/f35//3/+f/79/Pv9/P38+/v8/Pz9/Pz+/n9/fv7///9+fn1+fn3/fv7+fv7+/v3//vz/ /vz8//v7+/v//v7+/n1+fHt7enl4eXt8fn5///z9/f3+/H1+f35+/399fn18/X7//n7/f37/ f31/fn//fn19fHx+fn58fH18fn99f//9/Pz7/fz8/v5+fH1+ff9+fP95e3t4eHl3e35+/vz9 /Pr4+fj3+Pr8/P7+/n7//v5//n59fn1+fn58fP7+/fz9/vz9/fv+/vz+/n/8/n/+fn5/f37/ //36/vv7/fj7/fz+fv/+e314eXt7e3p7eXx9fv99f37//v38/f1+/f39/v3+//7+/n59f37+ fXx9fXx7fHl6e3r+fH5+fX99f////f3+/v///v7+//7+/v1/fnt6enl7fH59en39/v7+//36 /fz8/fr9/P7//n/+//7///7+/P78/v79/vz/f319/v///v5//v1+/v/9///9fv/9/X79+//8 /P39/f7//v19/358fXx5enp7e3p7e3p+f//9/Pz9/Pz7//1+/31+fnz+f37//n58/31+fn18 e3x9fX19fH58//7//v7+fv/+/v99//5+/f9+/n9/fnx7fHx8fn19ff/9/v79/P78/Pz7/Pv9 /P39/n//fH1+fv9+fv9+/v38+/z6+/v7+/3/f31+e3t6ent7eXt9fP///f7//vz7/Pr9/P79 /X1/fHx7e3t5fHx7fX18fn5+fv3//f3//v5/fX1//n7//n79+3t+fXT99Xt5/P9+fHt9enx+ /n3+f/z9/fv7+fv9+/37/f/9f/5/+/7//X79f35/fnt+fnv+//79+/z++v7//v/+//x+/v9+ /Xx+fn1/fX99f//+/f79/v3/fXt5ent6fnx6fH18//7+/35+//7//P9+/f///P3+/f1/f/5/ fn58ent6e3l4enl6fH7++/z7+vz8+vr8+f38+/78/P7+/n//f///fv///f1+/f5+/n9+fnp7 e3p6fH18f39+fX5+f/z//fr7/P77/f39//58fXt5e3d5eHp6e////f78/v/9/3/+fv///39/ fHx8e319fX19/v///v39/P7//nt9fHx+/3///35+fX1/f/3++f3/+fr2+/v//Pp/+317/X5+ f31+/X7//X1+fn/+/vv9/Pn7+/v8/f59f/5//3x/fnx+fnp/fnr/fXt/fnx9fX1/fn5+f/// //5//v///n3+fX/8/Pz9/3//f318fHp6fHt8e3t+e339/vz9/v76+vz7/vz9+vv+/f19fvz/ //9+/39/+/39/P79f/9/fH5/fH9/f/38+vz6/v3+e399fn58fn7/fv9+fn59f////n79f/// fn18f3x8e3t//n7/f319fv7+/v59/v///37+/v39/H17/nx+fnl9enx7enx9/339/v/9/vv8 /Pz9+/z+/f1//H79+/78/fz+/P3/fXp9enl8eHx9ff9+/P9+/P7/+/v++/5+fXt8fHx9/35+ fX39ff9+fH7/f318e31+fX3//v38/P3+/fr9+fr++X79+/39/v///n/7/H78fv9/e/99fv5+ //7//f7++vz9/Pz//35+fHt7ff99//z9+/n+/Pz+/f5+fHp6e3l5enl7eHx+fv3++//+/P39 /P7//v7//3z/e319e357fH59fn7+fX58fv98/33///z8fP1+/39+f3t8e3x8f/1//f79+fz7 +fz7/Pz8//99fX59fH1+fnz9e3z+ff38+/v9+vv8/fv7/vz9fnx+fH3/e/9+fHx/fn7/fvx/ fv5+f/58/n98fv1+fnx9fH1+e359fv39/f78//3+//18fX17f3t9fXzz5e167379bXF3a3Nu cm1xdfJ3fel76f3x8Xz2eH79/3r+fn75+PP89PP+fnx7dHF5dnB/eXv8/fj49PX38/j6+vn7 fvl//fz++Xz3/nj/e3t5fHX+e/77ff5++H78/v19fPh/+X79+vn6/fn57/du9XR8fHr2cfB0 fXl9/Xb2b/1zeX1x+nL7ePr/e/Ny7HPx/njubOxs73r7/Hr2c/d3fP5+ePJu727ueX74b+1s 72z1eH36dfNs8HD3e3r2c/p4+n79e/v6evZ8/v96/Hx5fXx8/n52/fd98//59Hnye3z8ef15 /X9+9nj0e3rvcvJ8ff9u+nT7/X/7+/z8+Xn5+/35//1+en38/f//+379/vv7+/t7/v/69Xh6 /nz9+3x2ePx8dn77+Hf7/v/q42V26XX8aPtvb3hv+Wx+eX77dvh2/f58/3Xy+X38/vZ4/H/5 +3f2+f98+/7++/z+e/7/eXX+/Hd2fn18eH5+e379/H//fv3+/3/9/X1++/x6//3+fnl+fX56 dXz/f3l/fn36ev/5fPn5e//+fXn+fHv9ff51//t7+338/v38f/98fn5+fHR+fXt+e/58+fn/ fn76fH15fn14+H/6/X/+/vj+/P7/fnp8fP1+fvx69f5+/n7x+nz7/X72+Xx/+Hx6fXz8/X3+ 9314/f3+eP9+ff97+f/1+Pv0+/f+/fr//Xd+ff/8dP/+//l++vv6/v73fn59/Xt2enz+ent3 /vl4efz7/vz/+nz8+X37/nx9f3p++3n9fnZ7ent1fvp7+fj1/XP4+n19/H50/3x5eHn9+392 /P7/fnr9f3/68f58/fz8ev59ff99fXx4d319env+/fz//vv7/fr8/39+f3v+fn/2/nv/9/v7 /f76+3///n/9ff5+/v5+/3x+/376+/73//bzfP/+e3v+efv9evn++Pn/f33/fv/8fHz9/Ht/ +Hr9/Pv+en7//np9fP76en75en58/f96fnx+/397+/n+//v+//76f3X5/Xx6ePt8e3h6fnt7 e3n8/v/8/v79+f77+v/+/313//9zf3p0eHt9fPv+9v18+Pz5/vt+/3z/93d7/Xb/eXv9dPj6 ent++/98fH97fnt8/Pv+//z+/Hb//nz9ff37+Xzw+Xr1+/t4/358/n/5+/78f/3+e/t9f/7+ e/71/nl9/vz/ev38f316/H7++Pn9+fj5+X39ff59fP53fnz/9np6+/z6/P17+vb8/nn+fv79 /vx9fH75/Hl/fn17/P5+/338/P57dn39/Hd4+v5+/nz+/Xp9eXj+eHx2ffp8fvr7fff7+fl8 fP75fvt4efp1f/13/Xp+e3/9d359+3p2/3r+/3t+/vJ6/Px++Xh9//1+fX19e3X+fXz8fPr7 efz7fv34+374fX76/3t5+/f+ffr4+Xx++fR2efV4fXl+/fv9/nf69nT/9vh3/v5/+fv4/vf2 +372+X36/375eXf8cnf7eHH8e3Z8/H/+fnj8fnx7/n57/fv3/fz7fvZ5fvJ6+/p2/P19fv54 eXt2fXh0eX9/e355/v999nb8+3z+fPh5/vh6+Hz59np+ePb9dv74eXz+eHd+e3h7ev3++v/9 /H/+/Hx5fXt/e3x3ffZ6d/b7fvt7fvj9ffj69/v5//v1fPv//nt9fnp7/n//fvf9evH3ePzy /331fHr7eH38fnr9/Xl8fvz7//b7ee9+/Hx+83n+/v9+d/r6e358/Pv5en7x+f/6/Hz/fXv+ 93t8dnr8eXn++Px59vp89Xjv/vrzfu9/+vt99Hx9+/33b338dH18fnn8fnf4/nb6+3r4+XV5 /v79fvz8/fn2/Pr6/vL7d+79c+57fn53+3d0dnd7f3Z0/H3/e3T5/nf++X1z/fH5fPX8ePN+ +/5/fnb4enj9eP17/fl+fX7xeXf5fnd9eHN/d355c/l+f/j7fX38e3/99vd6fvz8e/z9b/j+ c398fH19/Xz9+nr9e/t8evr+ef35//d8ev50eX94dX54efv+fvz39Pn8/fr8ffx+fHd7e3t5 fXV7/XN++Xp58/z4eX34/37+f3T6dnr7+/98+Xt6evl5evp7fX79eXj7fHr38/b88vn+9n76 +3b//np4/H18fXz5evl+//t6+Xh7fv79/Hp97vx99fb4fv/z/nf++fl+eX5+fHr4eXr3fXx+ /3p99/98+P74fff7/vn68Xz8/f9+/PV9f/78/nJ2/Xn6fnp7fPh+/n77+fr5eX79fH35e/n3 //v1/f75+n159Xt5e/17ffF2d/d7dPp5b/17ffl2//d0/f539Xj//v71fH799fx6/P7/e3H/ /Hp+e/36dP35d/l8fP17fv57+/h7d/v8eXl8+Hr/fHbye3n4en3+/fz+e3n8enn5fXt9fv1+ +3z69vv8evf//vN4/vh/+/7+e3z7/Hh6fHd/evt9fPv+/f/1fvX3ePn7e//4fXn9/HZ7/Hv+ //j7+vb++vf8/PX/fvn6/35+//78f318dnd9eXh9dv5/fHz/+31+/X5++P3+9fj5/Hr++Xp7 fnZ+fXh7fHh8+3v+///7e3v493r+/f97fH1+/nt//fd+/vr///x+/f16enr/fXx9/P/8/H7+ /f77+f38+vp++f7+9vv9fv9+e3l5eXh4/n9//fv9+P1++/n6/Pf+/vn6fX3+enj+dXR4fH15 +3p8/Pt+/P1+/Xx9//z8/P99/v7///59fX18eXt3f/p9/vz/fv7/f319fn//fHp7f/56fvp+ e/38fH9/fPv6/fz8/H57f316fXl5fHl7fX5/+vh++vh//Pn8+/v//Pt/fX3+fPz+fft+fv5+ e357ff1/f/z9/fn69/f6+vv7/nt8fX58eHp6d3h+/378/vv9//5//P7//Xt7f3p7+3x7/X7/ /H7/+/98/P7//n5+e3x4eHx8fHp6//x+/v//+35++Pz+///+/X58/P5+fXv/f3x7fn5+ff7+ fH18fn99fHv+/X58/Pp//Pz7+fz8/fv7//78/X1/fn78fXz9/3x9/v78+vv69vv++fz8/f5/ /v57f316fnt6f/t/ffz7+/z+/v5//vr9/v7+/P39fv1/f/95fHx7enx9fP79//36/f9/fv9+ fn5+f398eXt9e3x7fH98fnx6fX3//P7++/z3+Pv7/fp+fnx+fHh7fHp5e3l4fHp7/vr+f/v8 +v38+P3+/3/9fv7+/3/+f/77//78+/3//Pv8/ft9e3x7fXx//35/f318f3//fn1+fH7+/H59 f3x9fn7/fv3/fn96fX18/n9//P59/v9+fn79fn59e3x7e35/ff7//Pj8+//+/Pv9/Pn+/f58 e3t9fHx+fv36+Pv3+fv4+vr8/f9+fnp9fX18ff5+fX5+ff7+/fr8+/38+//+/Pz8+vr9/f79 /v//e3p7eHp7fH9+/399/357//57/fx5/H16fXx3e/9+en5/ff3+/v76+/77/v36/v9/fH17 enl7enp5e3x//v/9/Pz6+/r6/Pv6/Px+fn59fXt7enp9fv7+/Pr6+Pn5+Pn7+v3//f9+e3t8 eHt8e319fnx8f/99fv38/fv9fn5+/v///f5+//5/f359e3t6e3p8fXp9fP/8/vv8+vv7/P3+ f/5+//7//f/+f/79/f37+vv5+vn8//59e317e3t6enp6e3l3fHt9fn5///38+/r++/z7+v3+ /397enl6enl6ent7fHz9+vv8+vn6+fn7/X59fHx7fX19/n9/fv36+/r6+/r6/P3/fn1+fHx+ fX/9/v79/vr6+fn7+3/9/X99enx7fHx+/35/fX7+fX/+/v7//31+fX18fn19/33/fnt+f3/+ /X7/f31/fn/+/f///n7/f358e3p6fX19/v7+fv3///7+/f77/Pv9/P3++/r9/Pz8//7///9+ /3/+fn99fX58/3/9/Pz7/fz7+/v8/3/+fn5+fXx7fHx+f///fv5/f35+/35+fn5+fn59fX5+ /v/+/v/8/f78/P7+fX19e3x9fHp7fH5/fH5//n59f31//v3+/v7+/P37/Hz+/n7/fX18fHt7 en7///7+/fz7+vv+/f3///98/3x9fXz//n/+/X/7+/36+vj6/P3//v78//39/v7//37//33/ ff//fv///f78/Pz9fn5+fn19fnv/fXz+fP5///v8+v39/v5//397fHt7fHh7eXl8e3t+fn/+ //78+/r9/f3+//9+fv99fn9+f399fn96fn1/fHx8e3t+fnt+/v79/vv6//n9/fz//v38/fz9 /v37+fr6/v7/fH1+enx8e3p6e3t9fH1+fX/+/v79//v//n59/////P5+/P59f318fn1/fX1+ /n5/f//+//78/v9+//3///3+f/3//f5//f78+/v7+fr6/P79fX99fHx7fX5+f37+//z7/Pn8 +/z9/X7+fn19fHp6fn3//n7+f/79f/9+/35//v/9/v3+f397fXx8fXx8fXt8fXt7eXp+//39 /P35+fr5+/z+/P1/fn1/ff/++/j6+/j79/r7+f37f37+fXz/fXl3dnR2c3J0c3VxcnZ3eXl9 fH3//Pv8+Pn39/n29/b28vDu6unm5OPi5ebq7/h8cm9raWJZV1dWWlxhZm39bPXzfOz47O/r 4Onh5Ovp7Ozw7/H18fL2+f15dm9oa29rZGJ7/Pvtfv7+9ntyc2x69f/7+fPz7/h6fHz9+vv6 //17ef5yb29yc3r+dXb/eG9taGNmaGZobm90/Pr69+/08u3t7enp6uno6evq7vLw6+308ff+ 9fhten52+vt+b3dwY2j74mo8NEZNUcpx5sjGvd/cU0frZ2r78dHMxM1ud1xYYFJOWn3b1tvn cf13YltbX3zi5OTn6u3/b19ibnbv7e3t7O36fX9y+/T57vj18urrbmNlbW37bk5KTUtMUGFm 6M3W0NXi7nl6XWR6c/Po3Nvd2vLu8fjv8+n16+jx9vX5/fp+dXp++u/q6unq+PHq7/Hy6nZY PjMuNElY3c7Nwr3A0WpPSlZ67tvOx8TDzvVcUlBPUVZl5NrY3/hrX19bWl5v79/b3+Lq+XVv ePTm4eXg4+3t8Xd2dGNaXFhQTFLXbU5BO0VO+WX+4trLzNTx/Pz13+Dp2trh4vZqZWz78OTl 6+fw/XRvbXXz/fn0fvfy9Pv59P/x6/xubmRhbXFhXmxhZXNqXUw7MTdW+NzK3MvFyt1oT0vp 2c/LyMnM1WFVVFRl8+Tl4Od9e19bXWVweu94+/Z9/XZ0bXz0/vP+cHT8/1tt+G30b2tu8/h7 72xZST1BRk1iae7s29fj5f7/++ve2c/V197+ZGFx/ujo5+Do6fxzcW9+fO7x9uvw8/h8c3h+ b3BsXWHuYmRsX/RvbGN77WzweXzq/00+SkpMZlxt9N7q7OFx+ujs79nW3NHZ+Gt7aGrg7urj 6/ru7G/5+nPz5e756/Z6+W9nbHhuZmdeWXNvY/prdvlsXVtfafni3uXpfFpMSUtHUVtq6t/f d+ltbeJ669rU29jeZW9za3Tr6u3Z4vj8fXTx5X3w4ujs6v5t739mb21pb2FfX15veHn3fm1v Y15bXG3v29/p9v1qXExLVE9bZWxpbvN58PB07t/o3tvsdXp5/93s9e/v9/HlfPT18+Tf5uvt 9Pp9/nh2e3h3a11obl5/eW/ya2ReYFxfdGVt8+vr5uh3/3Nba1tQVFVpbGhWbnNs3HXt8Pfn +O1l7fJ16Ord3drw/fV54+Hq6OHb3+n5e/tmZW599HpyY2ZrXXJrb3doalxnZmFubGZx8e/i 6v34+vtqZV5p4Wlp+11uZWFuYHz+fvtea2RodV73+ePX4d3o7Ojn3uPd2eXd6+z8efJud2x6 c2t2bGpqZ29wZGdpZF9lYGxucGxw+PLp9uxz/vn2+2v4+Pb7Zl14ce/gcGZlaV1lW1d0bHp2 7+Pm3Prr6ufd59jg19zl3/nw9Od9aXV0bm/7YF5gZvpycWtwcmZrX1tk/+3qfWtYc3/x4Wb0 +ujp8n1dZGxx7e196/d1cnprbO9n+XBX+lx0fm7mZOX2+Nl84ebl3/ffaejleNnv5Gh38lvj Z/d9X/BsflttbWHla2NtaGZvbmtyZ3Fs5+xw8HZ9b+Pr7uNd9PJ36GPs/WflaW13YfZmdGto 23R4e2p/8v3q4N/x5Od65v7x5Nvc43trefv37uv9bWJedntnaFt1WWfzbf1afHZ7/G/y+/D7 aefm9Xxk+ejX4V51cVzs5P/68Xltf/xye19deGrp5eRtXmtd7+ro3/r49Oruefpz9+7i4urt a/z6auf3c/lz42368mBvWut6YX5nXV1v9O718m7+bXdlbOl54+Xm5P58aOf1eOpdZGzv6PP5 X2dWXnx433/reXPqad/n9uBl9W/o2OnR//Z7aNt35PF8dl5pYe71fm9fbvtvXGVnaeR85HLu d2LfV/1kV+r56nR5Y2ve8Xbjde3leP12/GRpbVr7Ym1nfOhp5Xjs3N7Y8d7j29fX2+zjbt/t /vxfal19a1zxVWV5XO5Wa1lm5lfxWWLjed/2ZWJw6vXk0fX2fW3pZ/D+XXRi+P/+XVrrXnf1 cvHy+2rk4fPd5erc4+Pd4d3r5G/+3e3i8HhhY1phaGzieXphXFhYde/2ZHJdc99222tveW/e 9N9jbnNi5HxyXV5fX2tZbn953O7k6fPg7unx3tvY1tzd6+Tp5+nu737w8299cV9ZYWF39FdY ZV11/1tjbHbb3+tvaWhv2u94W09n697bck1OTVd859t66uju2OXa5OXY387X2dfs5vTn7e/a 7vttWFdda3PpelxuXlP6X3D1Zn1v4d/s+1VPYWNkfmZfXGFdWFtcZGfs3dnQ3Ofk5drTz9LT 1d7Z297f7Pd29ep5e21jZmBkZ2NdWl95d2pjbXvu7mBkb1xcTU1QU2dhdXZqZ2B0aurd4NbW 0dHP1dvY29PX0tXY1uzm/3/t//lnZWdrZ19kXGZpbWVf//PiellTS0pNTlNcWl9tcu/4dmls 997Rz9HV09XV0NbV19fS09Hc4vNt9vP1dW10ZmJgXlxkam5ubuXtdV5NTUdHSUtXVmn97+H7 al5ZZOjUysrMz9HR08/W2tra09DP2uV7YXP69m9raV9pZGRpYmVz6tngVUg+O0VIVWNkdG7q 7Ot2XFxe48/Fw8rO2tvZ1tTX09XS0tjf7Pxvfvv5em5vZmp0aV9gY/bW7k8/Ozo/T1VoeWf4 39fmcltPX9vLw8PM2N3d2dPS2NbV09HW5HVoZnXo6vN0ZGVpenFsd/Xb/kc8ODc/Tlzj3+/y 4eTs91xdZ97LxMLM1+Lw4trR0c7Q2Njj+PP+dvjx/HlwZ2z+bHJv+dj/TT41NjxLX9/c/vH9 59/wX1df9czCwcjX7Pnl2tPP09LV2d3m9HJufezw9HlncWtyenfm5eVOOTc0OEte79zffOjU 5utkT1nvzcW/xtjffu/c0tHRz9nY2ez2/3Bs7fptfGdpffv9fefi90o3NTU7Ul7h3+js69Xp 62FPX/HKw8HK4u5259rU0dbT19jb7f1xevzu7ndvaGlz+vfv4d96QTQ1Mj5ZXtnm4/Xg1n/v UUxj4MbAv87t+G3f1NPU1tXY09vs+Wxu/e/xfmxlaGn573vp5PVBNDUvPldh0uThe9vTfeFT TV7sy8K/z+DxaejZ1dXS19vT3/HzfX727XNya2X3efv1/+rg1UkxNC42X13W1d5+3M1351xK V/nOxr3L7ONl/t3Z2tXR3dTZ/u3t+ezmeGVpX27m7et9eefY6zcuMC1H/u/N595uzNVq8UtW etfKxsXg5Pdw6ebd2s7V29xxb+re3d/6WmBwbPX/en/y4d/U2z4rLy450V7T1eDc1chTZVNJ 3dLMzsnc9NVvcvf0387L3t94W/jd3d7jaF1saH3wd/fs3+bc2upUKisxL9bl38/lzPbBYUte R+jRwsvOz1vifF9lcdzYxtTu+Vhk897u6+ht7f53eHB+befe3+Hq3txsLCY0Le3LaM/ox+bB 6D9ZSPjOw8rOw/XsZUxOXdrZyM7x6WhgZHpiYej67+fze3b9ZHL1fd3Z2N58be7RLiE9LVy7 TtV5vPPFzTZaTufTw8rsvNjf+FFLSPNj3NL64+7obfdmUmtmaHPz7OnW3vb4YWP45t/o6O3m 2fbc/ywjNTZSxFj3zbvOz+o6TnLn6M/P0LvH6V5WTl3ba3DpaFlyY1JoaF1s9F1h6X/95+ty 6uP05ux0bvN2feXd3uff/mtvZ0EvLThEVO9b5srDz/ZbS15/83PezMfBzvFoamdiamF33tnh b09MW1BQWl5r5eR49PZubW9lduPk4N/i7fF2YHbs6Ovnf1vn9Ft8XT88PDNBT0Zs6M7Py9Ve +HFdbH3o1cnJ1NPe+ntjXV/98+3n9HhuY0xETFNYYGBg59l9ZmVte/1rat3T2N3o7ubkcV52 4+D3cezweX5qYVtoPz5KNTtJTFN40uHMy+fw5Pxf+evu1MzT19Pe/v5oXGd4cHzv9Hh1Y1ZO SkpPW11z6Obh8XxlaW9rfvzi29ja5ufq8XptcPP8dfh7b3XvfF9ydVttSj5OQDY7VEhU39/R ycjr39dvanj17tLO2tLP2OfvalxqaV9m/v50cWdeXlRITE9NY2585tvec+t0ZG519e/Y2dvX 3up/9Wtk//p1a/j/a2Zy9WZ08GNfUklLSkY4O1VTTXPYz8XK2NvN319rde/f2t/WzNLk8v5q ZV1WXW90aW95dmxeV01NUkxTanLr39rl5+xudHh88d7c3NfZ3en2fW9qZ2tsbGlsb2xweVxj 7+tjXVhKWEk/OkZdRV311cjJzNrJ0npmavv86Pnfz8/b49/se2FYWF9gXGNz/3lya2lZTE9P VV1f7eDV2+Df6u5tbnTs5Ofe3Nrk8XtvcGlpZWz6b2p+eGtrcflucnR/VU1dTj85SEtBYmTX yMPKzMDP43tsX2lqXe7V1drT1tzieVpaXFRTWWFpe3ttZlhWZVRXaHft7t/s3OHy8vTo7+Tt 5+Dl7vrwevn8b255em5nb29s+mT98nl5clxPYU5AOz9KQVJW6srGxsi/xs3c/2psXVNdfeji 2dfRz9jq+m5cVU5OT1FMSWP2XvTg3tjZ7/7c+2Rqdn7k5fzb1d/o5O7y725jbW9iYmVjZ/x0 au/vevnvZ2dmVE0+NU9KOVVU7czFzca5wcrM1OrfaE1TYVhZbW3p09fk1tbqdltNT1BHSVBZ X/7t4dLP2NnV3+TsfG56dGR6+vjs5uvq5/l2b2FdXVpZWlxeYWdmbXlva3BvZVNPXlZUXFln 9eDm3NLRz8/R1NLU3OTr/H1zZ2BiZF9eXVxeX2FhZ214+fv18O7y+Pr/9vT6f3/6/v5+eHt8 eXNydHV0cW9vdXNub25ucXV1eH389/f4+fr9fm1maWNgX11eY2hpb3zz6OHd29nZ2tzg6Ozz e21taWZnZWRnbG1udXR5fnx4ev35/Pz6+/b+ev9+enp6eXd5fXV3enl7eHh4e3x7f358/Pz/ /fv6/XpsbW9qamZmaW10df3y7Ofk6Ofk5unr7O/v8v18eXl0c3NvdXhzdnV2eXt5eX79fHr+ +33///78//r5f/t8/f98fnr9df56cvp6/v56f3d7e3Nta2xsa2lsb3T9//bu7enn6evo5+rq 7fH19vp5fXt1dnl0dH14enp8fv18/vj9+/34+fn2+/j5+f99+3x+fHv/en16fX59fv/8fHl3 d3Rva2tsbG1tb3R+9/Xz7u3p6Oro5ubn6u319fV8enl2eH1zcXl7dXh+df/8fH77+Pr2+3nu /vv1dff9fvpz9ft99Hb4+357eHl3cm9taGtpaGprbnh6+e/r6ujm6OXl5ujr6fP59nt1dXpv cnhrcGtlVFnwbN/a39HZ+XLa63Xfauveb3fm5vjo7H3m4X1pZWBYUE5KTE9OT1lkeuXf3NHO zs/P0tPU3en6dW5gX1tcYWVpanz16+nn4+Df4ebk5eHm7e347/7/d3p9dXlrdHNsb2VRT1BJ TUlKTVVeZOrd0crIyMbFx8nN1drjeVxZVU9TT1JaZmz+5+Pb2Nrc2trf4ejq5uv9dvt6fHdn a29pZWZhYWNeT0RNUEZXUFNt2+7czM7LxcvPyczX1d528nZXWFxXWGBaXvbz+eHf49ja5OLd 5eno+vryeWR4Z25zY21mamhjZ2NnbWptc2dfW1heXF1caW3x6+Tc1dHPz8/P0dnc5/h8aGRf aGlwff3t5OLn3uDj4/P4eWxrYF9jX2thYGtrb2tvaHN1d3J+e/L18/ptamtsaHNrc/fv9evj 393Z393b3OLi6fLm7vn66vPw7Pr75vH7727+eWptY3NnaGdpZGJqZ3Nn/Ht9/H3u9e/u7Pfp fehr6239em9tbm1xaHtq+3r47e7i4N7b3tvc3uHl3+/neuZr7XFtbVz+Y2VpZWdwb2BtfWxs fG799PF88Pd25nbpeufw++r6e+xw8Hv///X3efD0euf88vfv8/Bx53vyf334fv39+Xr+73fu dPJ26P137m7sbulf31zlaXVycn9k31vfYt5h33Dr+/F9d+Vj3V7cX91p7X7ka+bz9/7kXd9m 6Xht4mHba+ly3VnZW/Fw9P9m5Hxv53XpXtFV3X5p4V7hXd1f7nz+dP/lXuJl3FjaX+XuX9Vb 2Wvq+W/faupv6nb76Wjo+WHfb2jpb/J0+mzcXNVd4e54eXTubnv7+nTzfmfiYv/qc/3qeuJu 3XXz8/j0aeVn62r3c/V983TkYe73bO902lTRWd5g6m9u2FPXau/8cfls7m/rc/V55nTl/uh5 32/gbuxu/Wx4b298fW728Gns837863b0e398b+pg3mfned9s4nvs8O5z7nPfXeBm/u5h4GLg cf/q/vFp4GLvd2PoZfht9G9t5Xj05/J86ulx5nHpbu1s52PbXNpd6XJ1313cW+htfOx2dfT7 +P/rbt9p4WXpb/V8e+1y8H187vZ353vpb+Vs4278/2LnWuNnbvdo7HXrfe7icefvfOh/9W3q auz+ae9n9Gr2bPf1fe/+8HPlbv369Hbp7m/hbPrqZupq8Xhf3lrjZuls8Hz78u1+7+9u63Dz eHptb3pta/hqavb8b+77ffXq+f7zfHb8d2t9eHlz8f3+6vL37Ovt6+f26OXr7ujr7uvufvvu an5vaGxobGNuXHdgbGJ8cmnt+/vy4vPa4HhWWF1OVk9MVGBqZOjm183M0czMztTZ/3t2ZVta X2By+G/h4Nve3OPl3vV4dHNwe25rY/5hdWd2ZP9gaWlcfGZ7efXq29hjRFZVRVFDQU50VW/j 2su9xMa/wMbDzebj42BaVktLV05MW19m5up+29Xd29nm3dfr7+rt9elxbXl2dG1zZ2dvX1po WmljbX312OPbSkVZSkZJP0RTd1nt1s3CvMG+vL3Bwc/e3/lYU01KTU5KS09aX/91997Z3dve 39nY493l3uDj+fr1e3JtX2l2XGFjX2BuZF/2aOLy2OjVUUFcS0FNQD9RbFP71tbEu8C/ur3A v8zl2+5XVU5HTFNLSlNTWfFqcOTb5Nje7dnY6tvn4+LX8Xzr+H52amhtZGRpXmJqaF5tbHZu 6nrr1Od2RFZWSE9HRE12XnDd18u+wMO+v8TDy+Xk5mFaV01PWlNPV1dXZm1ddvH16ODt5Nve 4tvi3d7g8fflbfp6X/dgcF5lb19yX21jeHFudfr06eDe5V5Jak9PUktKXHte6NzXycHJyMTH ysjW5N/uZ2hZU1ZaUVJWVVxmZ1/t/Ofk5uLg0/Hb4+Xn4H1++HN2bmlob25uZXdf9Whta/tr 9n/6a9/qetft5l9VWVtSWE1VVH9n79/czsvLzsnNy8/X4eLueX5dXFpdWVhcW2L/anz46ebj 4u/d6Ofn+fHtceli6Wn8aXT/avNw8Wxt61/7aXR0dX7oatx56dpuzk3cSN1L+VJYcF7eYNZ2 0NXR0tXP19TY9dpj2lTpV2N1VO5M2UvNTtdn+t/zft9v4WzQTstOzE7YYGriXu5g61vobn38 eWznbPhq7HBy52fx/+794fdh9l51YHJkYvhu6XfacNbd6NXq03PMYNVp521xcG9b7GBf3lfr 9nRnz0nESc19WchIzvROxkDBQsxeV8xHzVbp5VbOUuTsYunjVtBW01bZfGfbZuNj5Fpu/Fxv dWRo8Hl16eNs0GHIT8NsXbw5tje3OL9NVsxBwD29Qste5u9eyUbFW1rEPLk4vE1VvDSwMrY/ 3sc3sja+Tm7NP75G3uZoaNZW2mTw51bTVvD8X+5h5Gpp0kvHSstqXcFAvUzbzD+4Ps7PPLk7 y+FCvD/W0UHATnnOS81a695RzFTt31bWXPPiUc5Wc9RO1l5+7V/hZOx4f/586WXu6mDm8Vzd bGTeYfPzbuNn7uBp4ely5erz7ezr/+zobvznbXHlc2/sd2/+dXZoef5f/vBi+O5ze+rwfe/r /fjpe/Xw/PV98Xx79HZ58Xt89Hb4fnjwcf3+dfVz/H7/fXvxdPj4+fP77vny7/fy9PP58/r8 f378ev17fnx9fnz9ff1+/P3+/f76ff5/ff5+ff19//5//X79/v/8//76/P77//38ffx7+nv+ /Xr5e/p8+//++H35/v76fvz9/fh+/X1+fXz/fn79/v79/fx9/P57/3z+fP99/n17/Xv9fHv/ dv5+e/z//3/8/v7//n5+///+/n5+f3t9fHt+e355fH57/nx+/X31fvj7/vf8+fr5/Ph9/f57 f3p+fP59f/18+X36/H72//n9/358f33+/n/++//4/fn6ffV6+v99+Xz7/n/+fv99f31+/Hn8 fn77fPr//Pt+/v/+/f/+/f37//x///97/Hp+fXp7dn16fH18/33+fn/+//7/fn18fn9//H// f//9//3+/P9++3x+fX19fH56fH19fn3+f37//3x+e3p8///+/3/++/r2+vj2+vj6+P/7fv// fn56/3p9e319ff1///x9/v79/vz7fvz+/P38/X78/f78+vx+/P39+/1/fnx9fHl7dHp2d3l3 fXp/f//9//z5+vr49/r3+v/6fX18fHp1e3R2eXh3fHt9/31//fv8/fz++/7+/f7+fXx+f319 fH18e314e3t8/fv9/fn7/Pv8+fr7/P/7f/3+/v59fvz7/fv9/n/8fnt+eHp6eXp7fXp8fXp9 fP9+//3//P35+vz+f/3+f/99fH19fn7/fH7/fn9+fn5+fnt6fHt8fv97fX9///78/P3/f31+ /vz6/Pz//Pv7+v37/v38+/t9/nz//3t/e3t8fH7//f/+/Pz+/Pv7+v35/f79//1//nx/fnx+ fHx7e3t6fHx8fX1/ff/8f//+/Pz+/P7/f359fXx8/n9+/n7+/v78f37/enx/fH59fP99fn1+ /3x+f/9//f38/n7+fvv9/Pn9+/76/f/9f/19fv9+f/76/fr+/v1//n7//37+/////n58f37/ /f/++vz8+/79/v3/f397fXx+e3p9en19f358/n38/H78/37/fX98e318/v7+/v///////v99 fX18fn18/3z//3z8/v79/v3///7+//z9/vv7+vv9/X5+/37/ff3/fX19f//8//3//vn8/Pz9 /vz9/P97fn19fX9+e/9//v5//X///31+fHx9fX18fX7+/fz9f/7+fv99e3p6fHt+fX5+/vz/ /f3+/P79/P//fnx6eX59ff9+ff9/fXt9ff//f/v//v3++/39/Pz9/P/9/v78/v5/f318fnt8 ff7+/vz++/v7+fr5+v55dHx1aV9x6GT24vji5uXm6ujv+fb9eG99/HFvdHVlVWjuX+fu/mzu 32hW/3Jm5Pflf+nk+vnt6vz/8PF1+e77bv36cW10/GtrcWtjaHZxb3P8fnz77/D06Obr7ebr 8O7r7/ny9Pn89f14cXh4c357ZlBCPT08RVflz8vDycfIxcjM0+5cTk9PW3Hf3uPn7PL25un8 Z2JaWF5u9u/i4uHi3d3e4ur1b3J2++zf2tjY2eFRNjEuKzI95c67tbu8wb3Jy9HvS0A/P0Zk y8O+vsDP3edyWEtIPjw+SlzcxsHFzNX8YltiXl9ufujdz8/Q1t3ueP317Ori8G1JMy8tLDdJ yb60srrB0NJy+v1kTUlLTFzWwr69v8t8WU9LSk1OSktPXH7SysnP3XNXVltt+t7b3dzb2Nvb 4PF0a2939Ofj6ersWzsyMCwwPunCuK+2vc3XYlhralhSWlZd3sbBv7/J/FNLRURLUFBWXnX0 1c3O1ehnUlReft/Sz9jc4uz6+PVxb3d+/vTs7PDq3e1KNzMtLDdNybuur7rF3F1LWGhmYm9j W/nPyMPAx+dVSkFASVZdYnJ3befW1Nfc+ltVXnHn0s7V3+l6a2/8dW16eW568/z+9+zj3P9B NzIsLz13wbWus73NckxJV2Bl/etubd3Py8bEz3JTSEBCTFddb+v78dzX29/lalpebfbbzs7Y 3/BqYm17dv70eHP48O7o3tnXYzw0LiowPeO+sayyust3SUdRVV548Wpx2s/Kw8HM6l1JP0BI TVNj+v/r1tHV195sV1pfbeHQztTX3/tv//p48+76/PXr7t/S0G48NC0nLDZcxrKrr7S+1VNN UU5QWl5TWe7Vyr+8wM3gWEU/Q0ZHTFdYZ93PysrL22taVVRd7NvZ1dTb4t7d5+rve2x19eja z9ZKNzEqKS89bsq1sra6vcbW0tf3V1BHP0JQbd3Iv8PIzNX0a2taSkJAPj9LZt7Px8jMz9DU 3uP8YVdZXmbv3Njc4eTt9u7r7OvgbkY8ODIyOENPY9PPzMrAv7+9vsbU335bV15dVVNVUVFe funf2NrndmtoX2RnZ2Fjbnfw5uDp9X/9+/zz+Xlvcm5sb25rZ2hrbHB4//nz+WZWUFJVW2Jr ZmRoZmt46+Xg3t/f39zc3uHo8fx9fvv19vx+dW9tbGloaGZjY2VmZ2hpaWpuef/z6+nq7O/x 9fX09/n7+/5/fHd0c3RzbWliYF9eXl5gXl9hZGtue/75+PLt7ero5ubl4+Pj4+bp7fH3/X14 cWxpZ2RkZGNjYmRnam94/vv8+fv69/bz8vP19vf7/P5+e3p5eHFua2dkY2JiYGJiYWRobG52 e/79+e/s6Obk5ujp6+vr6+zu8vr+fHVybWtpZ2hpaWttbnF1e3p5fXx9/vr3+vv/f3x5e3l7 fv7+f3x6eXVzbmxsa2tpaWpqbG1xdHl9//fz8e7t7e7u7/Lx7u/v8vL0+vr8fnhxcm9vc3R3 d3h2dXZ3en1+e1xU0+VZ5mz97unuefL6+/nwfm9pXmpxaG1tamx3fG9vbmppZW/t6OXi3tva 2t7r+Pf7/n1xd3v++P59/u7t9PV3ev36+nJucHV0cnJqaWppZ2VlZFtWUFFZVFhXW2Rt6ujd 3NXPzs3Pz9DR19vf6/Z2bmplZWRmaGttc3328evn5ejq7O/5eHNtZ2RgX15dX19haGpxcXR4 //j89/319/Hw8/Pz7e7v8vDx7/H18u/0+v/9fn7+fv78+vn39/Tw8/T2+fx9end2eXl4eHh2 eHh5dnl4dnh1dXV4enh7fH19e3x8fH5///38//7//fn6+vv9/f78/Pr6+/7+///8/Pz9//99 fnx+fn1+/39+f3x9ff77+vf6+/3//v79/317eXd3eXp6e3p8e3x/fn98fn7//v3+fv/+///9 fn/++392+fh1evx8dnv+d3d+/np+/H59/vv+ff5/fXz8/P38+/t++vr8+v38f319ff9+f/7+ /3/8/Pz+/fz9/P39fn19fH58f////35/f/7//v5+fnt7fHp6eXp5eXt7f/9+/v79/P7+/P39 f/9/e318fXx//n19fP78/fv79/j5+vz8/f5+fnx8fn59eXl7fP7+/Pz9/P39/fz9/fz8/f5+ /3x8fX17fHx7fH59fn///v77/P38/P5+fHp6fXt9e3x9fP///Pv6/Pv+/v59fnx+fv//fXx8 fnx9/P7+/n7/e3t9/n9+f//+/vz7/Pn7/Pv8+/3+/P38+v3/fX1/fX1+fH99fX59/379/P79 /f37+vz8/vx//vz++vv7/n1+fX9+fn5+fnp8e3x8eXx9fHx8fXp//n7//nl3fGtJX7lRSMjX X1HP7kHnx05X03dOydBZ08nYVezdclt+aUX130RNV87lTsXQa9bMf3jVb299UV38cU9V5t9u fcjtacRzb+liW2NsUllfclNzz1vfz9jr19Dm8dp6Wm7wW2NmZE1Kb95p6tDQ3tvNb//YVVpk Z1RZ6l9k3ujl197e3NbufeFvampiXe5nZ3tq3+zl3d/tYeNnUGxgVWR2de3kc+HQ7Wnq12dV 6O9if19e1vpTat3rT2zWbPx6bN7Za2PS12123vtr7mnu125o7en9eXT53PJz4dPf3trb3dja 5OL9+WlRW1ZLTE9OTlNRXWti+ez95+336uDg/ujX2eTU1uzi7/Lt6u5l7913XWLs9V5mbPt0 dfxr8OXd7/Pk6eH0ffbp2etfbe9rV1lfW2xhYV1fYk9XYvhx+93W0OTl6tjWe2pn3upqZGzq /t/o7M7Jxs7P09HS73hfa2f0a1NkX2haVE1TWktJP0A+PD44Oj9Hae7NzMa9v77FxMTAwcjH zMnP1/Vn7+zd3dzf5dzqfG99f3ZuW1dWVE5LTlFYWV1jYWli8e/87+jY3utfRjs+QkZPUmrm 0s3Nztvf3vD6fu/k2dDRzdHW2NfV29ne3dzf3+rx/v3y/3N5cnFvaWNfW1VXU1ZdX25xffl6 /n3s6XZOPDs6QExT7PvX08zHy8fP09vp6fji9OLd2tLV0dfX2eHf8fdvaGhhamdvbGlsanFt bmZmZl1bWl5fYWpx/PLs6enrZ0tDQUFHSV9vft3dz8/KysvJ0tbd5el87/3u6ufc393i5On2 73hzbGNlZGViZGdmbW50eXn6fn3/+/v+9fr69vvze1tLTkxJSU9OTVdYau/f29PMz83KzczR 1t3k8nbr8/jv7+/25ern5vn5d25mZ2deY19fYmRtdPTx7Onv8+rs9HJWSkxJRkhOS0xUWGrt 3dfNy83JyczM0Njg53px93R2/n14+uvt4+Xw8XtsZ2pnYmRfX19hanrw7+Tk6eXo5u11T0pN RUVHTElNVFR07t/UzcrMx8nLy9LV3+t0dP9oeXV6//fq7OHo7ex8b2tuaGRkX2JhZW/87+/p 6+zq6+p8VUpNR0VGTElMU1Rr7t/VzsnLx8jLy9HX3ep0bntobnZye/3v7eLn7Oz8dm9ycG5t Y2RnY2v/8O/r6ezq6/FnTUtLRURHTUdPVFh57dzWzMrMxcnKy9PW4uprcn1icG5yc/fp79/r 8Ov/eHD9bmhtYGZobXzz6u/m5urRyF9HRj48PD9JREtWXd3NwsC/v8rKztfjal1OTlFa8eLU z8vLzM3d92BZWl5scPD29ufh3eLf4+ro/vxsWlZMOjAxMDpDUtPgycm+vb+90dT7d3Bu8V7/ /uHZ2NTj2+Tc2+x+X15WYXX95uLZ2M/S1+D0+3L5bnl1amdhY1lLMS4yL0NFauLexMi3wcDK 39/512zpbmzk2s7e1fT14uDgfHtca21ubWz9ftnW0tPa4uzg+fX0fmtlZ1BRWFBEMDM0NU1H 5XPOyMK6ycPb2Ovb2njjc+Pm0dnp4X7t7uJvbW1u/f5+Zfzt4dfT1tzb6vHxdmZxf3JlYFVN UE9KNTM3NklNbm/UyMe8xsfY0+Ha1+zu+uR63d/y8ubh6drsdnPueP7yam3s3uTY2ufp5vd8 d2NhbXRfYV5OUVhVRzY4NztHSWZXztDBv8HFz8nXzdvde3t4aO12/HTd4dnZ4u7+7nT+amxr 7ujj3eLl7ul6bl9fW1tgXGFaW1dZX2dRPkI/QEpNVE/o4M7JxsvPyc7N0Nb6bXFtcvv4duPZ 1trX4fHr7fpqdWpmdu/49fJfc3RgZ2NaXVxZXlxZV1xcbm7/fFhNTUpNU1ZeX/js29TTz8/R 0tDc2+L46u7m7/Hm4ODd4vLu8Hl2e21nYXNgZXdaWHFgV2RcX2NgYV9jd2Re+Vt36Hvy6ej0 7vz0fu3y/PLy/3Z2b3R1+nnx7nr19+v/8vV/9Pz/72r45W71fftv7HdgZ3VnbW5pbGZ2Y2z0 9P356vV/93p4bWxnbetlZnx37W93++7w9e55enh1anT3Y+n1avH5/29o4XNp53Fp83Nl8Hpr YXruaG1++n737ml44upv5vVl7fpn+3ptfv5vZPp7c3p2d3d1d3rscnvmeG5t/Xtzb292/n9q d/Fp/el/9/3vZfHzX+12fPX082Z87m3eeH7tbeJscfRnbm50a3Lvb/75dWxt8v32/m/1cml2 9vz582v0+3z9/fB6+X5laG/97/z9//Rr+n5s5nl76G1/f2FscPB4/u5tdvDsaul9+/jvfGz2 Y3Ltcmntc/dzc27473f1cfNy73lz6v9vc3hy+25qdfJ463lue3r1fHp0bWvu8nlv+Xn44GN+ 8Hzo/X54c+Vsa+Vfc951dfZ5cvNxcel4/XZ7++h8av9353l19+19/nXuffX0ePB4+2ry8G1z 7/t1fW559Ph6d/By+Xv1aXPoemlv/mVmbHVsc+947Nt9Z+z57/b+e3Xvbn3qce5pZ+tu6/Jx 6PR7821383vp8u50/fP38fr4ft7peP59b2Bu/F/t8mJcYN5l5vFd3dr/dnZf9Ol/b23t5P/o 6XT17uVt6Pdlf3xiben4d27abXruYe/371/tel7v8Pn/6HnievZ9cOx2/m9t/uzx9Ox6595o Xu1ldfZvZXPlaW7p+3rr+XLp7GVidvL98Ozu9OP07/RyePB6ePp59WzpenXv8nHpfmT2ZGhk fF9n/Wzz/f1x+ufc7PH96Oj74HL16eZ4+vZsb+7xY/J2aHbtbWP5ZmntfFxu8m5u73Zn6vhx dOz4c+nrfurh8e/o9X7s73tz/3lzeXVkcHxua29vamprZ2Z6eWx2+3r89Pxz9vJ+8vL3++rs 8O/t8+3j6Ofl6uvn5+vr7Ovr6e/08u7u8v39fnp7dG1ga3ny5vA/MD06PEpHSU7ExMC8vsXC vMve+l1LVVdKSlpt68rLz9LM2eDmXlFXamF/7O3iz83T1uV4/OtmWl1tbHjo5uzV1zQoOy8x SD0+R7e9uq+3v7q0zO1tSz5ZXklP8+7Uv8nd39peXF1GP0xYV/Df6djHy9HT4W5w7V1daG5+ 3dXn3tXd4OBzZXv3feLqOyYvOi5MSENMvLG7r7bFxbnLWVRHPU7oWlnh1M+9v9p4fllPVkU9 Qlhg5dTe3srG0Nb4XFh+alxpavvay9DY2N7p3u1kXVpfbOrl3N5FKy46MEFNQkvKtbqys8HG vcdvWEs+R25oZOLW1cG9yd5tVEpNSj4+SFb30c/XzsvN1OReUFheYW99fuPQzc/Q2Ozp7Wpa XVtZdO33997c0s9cMSsxMjZQSUrjurOxrrnIyMfuVko8Okpu8tbMzce8vsneW0M+Qj48P0hV 28fHyMrN19r3V01QVmLn3+DZz8/Oz9z+bGBZV1hVWHzr4N3a1t/W1eFJMigtMzNcUmrXubGv rbbJ3OJaT0dAO0dv0sXAw8nDxMvmV0E8PT4+QklR8c7DxcfP3vB0YlBPT1zy1c7Ozs/R1Nry ZVlXVllgZ2nz4OPc2+T24+zm3040KS0zNWfv7de9tbOus8jyZU5LTkw/RVzcyb2+x83P2PVm TD48Pj9FU15s58/JysvXfF1fXFxjanrn0s3MzdXk+HluYl9bV1tofPHo7Ojw7vD8/fXq41s8 LS0zM1Hk19LFu7ixsbzYYkpGSlZQTlZ+18S8vsbW9VtVUUpDPz5BSmHm29TT09XT3P1eVVNZ beHZ1NHS0tTY5XNfWlpfaW1tbXF669/g7fpsan3y3NlyPy0tLy9N5c7Lwr+8tLK5xO5FPkFK U29vberOx769xd1eS0VHSklGRUVKYd3Oys3Z6u5+fndoWlpo7NXMy9Db6ntze3BoYF9eZXv3 7O3z+/j98uzy8ufnbEcxLS8sP2jPv7q9v7q4vb3JVUI9PEFk4tbNytPMxMfL0WZHQD4+RU9T VV9nfNTMzM/ZallYWmT25ebf2tjRztLd9mJWWV5pevR2bG5t9+fi5On+b3bu6nRKMS8tKz5W zbq1u728wMS9yO9XQzk8SlvWwcLJydHf1NPwZ1BAPD4/SFz96trX29XR2N7pX1VUWGXh1M/O 0Nvi6vp6c2JcW1lcbPrs39/o7vhzb/zv7P1bPzAyLC5DUMy5trq4vMjFw9fbckg+QUBM5s3H v8PQ2ONlbWpUTEg+PUFHVOTPzMfL1t3ubGZlWltkaO/a0c7N0+HzaV1iZGRra2RocHf56uzv 7O736v5dQjU0LC47Q9i8t7W0u8PDy9vW8VNMRT5FU2/QwsLDxtb3bVhQT0pDQT9AS13ly8XF x8/ndmJaW2Fha/zu3tTQz9DZ63NgW1lbXV9hY2dtfO3l493f6HVSOzcyLDY6S8+9ubO1u7/B 0tPbaVdPQ0FHS1vZzcXAxM7U91tTS0NCQD9FTVvfzMjExc7Y6mZeXltdaGr8493W0NPW2+5t Y1pYWVpaXWNmdvPq3djfa0Y8NS4zNT91yr62trm7vsjIzt72XkpGQ0FJWnfSyMbHydXra1FK R0FBREdOaeXSyMfJy9Tj82xfX11cY2x849vX0tTa3/VqX1pUVVhYXGZs9uLd4G1JQDYxNjZA X9jEurq7ur7DwsnP135UTEVARktX69bOycrQ1u5fVUxGRUZGTltv3c/NysrP09vs/W1hX19d YnP549rZ19jf7fxlXltXWFtbX2349HdPRj41OTg9UPjQv729vL3DwMXKzNZ2Xk5FRkdKWXLp 1tDV1t54Z1lPTk5MUVlee+Xc1M/R0dPd3+h/eG9mZ29tfe3u4+Dm6O16bWdeXVxdZmdWSEM5 NDk2P1Jvzr+/vbu+vr3Cw8XR5W9OR0ZCRk9XbODf3Nfg7e5oX15WU1hVWmhv897c2NLU1tPa 3uH4cG9lY21tdPL49O/6ffxva3NpbVdEQTgxNzQ7TFvcxsLAu728ubu9vcfW5lZKSkRFTE1S ZGhw5+jp3+j+9W1fZ15daGhp+fHu3Nva0tTX1dvm5/dvcGliZWNfZWRfaWloeWdORkE2ODk4 SE762MfGwby+ubq7vMDL3PdTT0xIS0xMT1dZZPx87OPz7+x5e/hvcX5vdPP27N7h3tre3tzh 5eX3eXVnZWdiX2NfWmVfXVRFRT07RD5KZVji29nLxsC+u73AwMvR0+x5b1ZPT0tLUFFUXl1b bm1t5ert4Oz56+346un76uj55N/r4d/9+PFkbm5cX1pYXFpeYmVxZlxWTE1JS1hPYnhf6tvd zMfKxsXMy8zT1Nnre2hbWFlYWFdWV1lcX2Zsb3T78e/n4ern5u/q6/bu+3n7/n5ueHlzeH9u avpnbXRraGl3am9/c2xlYV9eYGhmaG5ucfLn5d7b3dza29vc4Obp8vh6bW5pZmZoaWxubG9w c3d7/vrz+PP1/PP6+vz+93t9/HdtfXtvfHd8/nV8/HN3/nV5+//+fPz+cW9vbWxtbG5zbXT9 /frw7fTq6e/p5/P57fh49Pj7cnnydHT67nBr7npiWnr2XNvZ7dbc5uR76v5d8WtXb/lpYvDt XHvlaF/862Je329W//tdXf53W2rxc2/z6+z+6try79vo6eni4vPl9uTvXNd4Wd1pe13s5ljm efxvb+pfc15571Xw8mJt+O9pbeR0bnntd2bz6m1s5mJy52Luc/rhY911auNw6PR55G5q399m 6utf5fxu7HF59Hz/a3ToZOjuXt1nbN9p7n93dWbuaWx6+Xz9aehuYdpp/Hr9fXhrc+Vi7/Fw enHxc+tz7d5k7O929nV5/+9z/fVj93P0923+fnd7dW9r+fN163vrc/3oann49Ph26W397Wfy 6316b+tpfXlpd3L+euRh7eFo7G/sbWbdY+zxZeVcfOpd6Ots6Wl7+Gbqbmnpd3Xs+O11duH9 +G9+325q8nR8bnbjbGzl9nh5+/F59vV57HR46/R/aHnyb2nw+HF79vBxdu30cfD87vn+62bo fl/ha3L2au/5dH576HN+5HXuZffeY3j6bu/1aOzscPHy7Xl6ber1ZOrtd/j3+2t6+/r2d/R4 duT3ZPBvc3dv7Xl0fGry+Pzvd+lueulv+vP86/Nr/PR47W3x3nDz/P35Z/bxe31s8n5qb/78 aG3uc/z2bH7q8Xl+8Hxv9P94a3Ls9v569XRz/nLw7nt46vT9eHn+fnt9ePJ3avZ0eO1v9/b2 73l8b2jtefzqZu70/W5z+3nv9mXw7WTu/n98be5y8Xhu/25vfn708/729ft/+Xv98nt+/PV4 cnjp43Hz/HF6ZvF+bPhnfHxy8fx49W5/939/e+Zk7u5t9/j5bWx2/Hdp+vT46/Xqd21t9vhz 63b+d370anV5fHv+83D0b3v4a/Vucfj38Ht67vv58n37fH54+/x4eP9/bPNt9e9p3/Lu5l5n 4Pxr7XzydXt7du9nfex3/mZv/mv/a27sZf3tb+p5fuzveXnmcm52bf3+6n1u+elz/vBxcXXo ceR/f+to6Xl553Dv9u/t/ehfX3xu8Wv8fHrx/+b8fv117Wtv8272dPjr6e729fv8eO9ofnlu 9f3ze3187P/9fX9vdW1/d2nsbnvt/fl/+fL37vn57/3+em//dPH2YWnqfGTw62jq9XXo/331 +nTzbvL19/V27/bxefXub23w7/l8fvVu83X+6nlnd/BxcnN07mP472Jy9Hp5cfV68ud5e3zu /2z6blZb0n5x63Haa+n5a3lj9d/4fXZr8HDr7vb27/Zt73F4fG9p+e9r8Gpq+mPr7HH9aOp9 +Pdv/Gv9e+Hqc+py+XRj7n5vdnHkZnXqeel2+fR3/Xb/b3hrf+/+9vR/c/PvcXh+bHP2+fF4 e/Zv+uxocH7+8Pjs/nT9cuh+fOdlbmh4dH/0en51929x+nR3dPTz8O/teGlwfPL2bPVx/ed2 /nJncPHveuzs7n317m19ffv4/vD783T8/25wbX518Hp5cnV+fOxufHlz/PX1/+7r6frzb2J4 bnPpdvt7a/d0bu9ua95odOBs6+T93O1i6d5xdWpzbXPudH56/uzk9P58cmlrdHPi8Xn3/eH/ YvpuZ25u9vn/8vn06e/3+uxvYu5veHpv63v48/zp7Xbz937273t9c2x6bnRpZ/t1/+b9ffF4 +f3++G958ezu7Ot/7/74+XJ7bm9uc/fu8u71/+vt831wb293/vz0/Hj4+vPwcnN3/W/+9W90 evL+eW91+H/19/Xu8vf8fvv+ev3u+Pru7fh8/377dXBtaGpsdHV0c25teHt4+fry9f/0+/z9 df708ert6+bn5ejr6/Pw7evm7uvv/3d98vz+Z15jY2ZobW9hTkM9Oz9JV+nbzsrJwsC/wMvY 9V9eXWJkV1dcbOfd1NXf6nRweGdjXl5u++HW1tbc4OHp6fJ9em91+/Ln6PT1/WE9Li4yOE1m xb7Lw8a+vMrN+k9MR2Pa2s/X1tDbzc7feUxLTExfa/7tbO/g4trsfWtaaHTt4O7o6efb2tjc 7Pxud+ro4/BrZ2RfPzAxMzpMeMK/yMPLxcbU1GdQTkt229DK0c7X6dzn8mROUE9WcfPd5P7v e/nxffhpZm974+He3OTi5eTf6/9zcvnr6OjzfG9dPzAwMjhN88K+xsLMyMnZ211PTk36183I z87X4tvq9FtMTUxWbevb6e74dH91eXBfZGl+5OHd4ufm6eDh5Oh//nz+7e3u+nJvb25UOS8x Mj1kzru+wsfZzdjh6lVWTVjb0cbIzdL27/1tbFFQTk9p+dra6fFjZGhp/Wtqa2ru6eDg7+5/ 8+jo4Orq7n3r7efof3ZhYGdsaEIzMjI5UNy/vcLH3dTX4ttrX1RX5tbIyM7U+Hhvcn1cV1JQ X3Lf3OfyYV5fZ/x7/HFt+vLj4+rvc3v669/h4en4+Pft6unvbmVdXmxlSjgzMzVH9ci8wcbX 3tvs2+xsYlr63c3JztDlenJve2JbVk9YZfji5+9oXl5fdH3/d2x1eezl5un6e3vy5uLf5e/+ fvrz7+79b2piZm92XkA1MjE6T+G/vcDI2dfp4N94fl5m79rMzs3V6/dud2lfWlJVWWj25+x9 a15gZ3H7/n1yd/nv5ujs+3h7++nk4ePu/nd6fvT3f29mamz56XxJNzMvNkZqwry+w9XY7ubf 9OxhZG7o0tLL0Nrne/xqaVpVVVJfaPHu+f5hZmFrfnz1cXt9++nt6PT9fXrs6d/f5uz59v71 9n1yZWVjavl/Ujw2MDM/Tsy9vb7N1fHy5O/e/nBt+93Zzc7R2u/6aWVbV1VQWFtqffr0c25l Zm1v/n39fX319uzt8fL79O/q4+Xn7/X9fXp9eW5rZm55+/VNPDUvMz1Oy768vsvU+PP27976 eWt07d3Pzs3V4fVpYFhXVVJXWWJvfu/2e21paGp1dvv7//v98vXu7fDs7ujn6Onw8nx4eXJ3 dW1pbXT4Wz86MjI7QOLEvrvFzOb+d2/e7uv7c/ru29LMz9bfdmVZVVVUVldbYGt+7+/xfW9o aGpv//31+/n08+ns5ujq6O3r7/P6dm9sb291c3V9emxKPDcyOD1OzsW8vsfN4+pw5ujv62py b/7f087Q0+H5Z1lXVFRUVlhdaXnu7Oz3dWtnZ213/vf68/Xv6ujj5ufq7vD3+f17b21qaWts dX59WEM7Njc7Qv/PxL7FyNPd7Ong6+ZvamdhfuPV0c/U3exoX1hVU1JTVFxgd/bs6u/4dW9u cnN1ff769ezr5ePl5Onq7vP7dnFramZpampwd3FRQzw4Oj1Je9fHxsnK0Nbb2drd6XRrXl5p 8t/a1dfa5vlsXlpWVFFVV1tqcvXu7Ozz9379eXFzb3F5fO/s6OPl5Ont8/x4cGtlZ2RmbGt7 blRGPz0+QEpl7NPQz83Q0NHP0Nbd8n5kX2ht++3m4uLl6/JwaV9cWFhYWl1eaG95+/Pr6+jr 8fV5eHJxeXb8+fbz8PP18v57d2tpZ2doaWxuYU9HRUVITVxu8OPl2tjV09LQ1Nnf5u99+nl9 c250c3p7fXZ3dGprZ2doZWhlZmRmam13/vr6/Pv18/Lu7uzu8fT2+vf2+vt6cnVvb3RzdHZw XVBPT05RVFhZW1xl/+ve2dXU19bX1tfa3OPxd21qa2lnamhmZGRsa3Z1c3dra2xsb3J0eHhx d3789+7n6ebo7ejv7e348XhzcGttb3RxdmtXT09QUFZYW1tbX3Lt49vZ1tbZ2NbV2dre6fd3 b3J0bm9tZmVjaGxvfHNybGlqa3J2/Xh1dm59+fHr6ujq6ejp6Ojq7/V6cm9scXJ1b3RwZVVP VFFSVldaWl1i/evf2dnV19fV09TY2+Lsf3R+d3puamljZmZvb3Rzbm5oa2x0f3j/dnh4f/Pv 6+zp6Onm6ebn6+z1/Xh3bW9ybnBrcHFnVlNWU1RXWFpdX2fw6d/b2tXW1tTS1trc5ez4//3+ eG1raWZobHJycG5sampub3Z4dHZzdnv58u7t7eno5+bk4+jp7O/0+nt6eXBvbW1vcnRkVVNV U1RYWVleX2zu597a19XT1NLR1trc5Ozz+Pn8c2lraGdrbnJvbmtubG11cnR2b3J5ev307+3s 6ufj5OPi5+jr7vT7fHZzb25ubm1weXdfVFRWVFRaWVpfYXbp6N3Z19TS09DS2Nrd5O3v9fp7 bGxrampucGtrbGpubG9zcXRve3r9+Pju7+zq5uXh4uTi6Ors8/r/f3Zybm5ubnB0+n1fVFZX U1ZaWVpeYXjr593Y1tTR0dHQ2Nvb4+vv83x2bGdsaWxtcGxscm55dnJ4cnFzfnh/+nzx7+zp 5uTj4uTj5+vr7/X7/np1dG5zcHB0/3RcUlZVUlVZWFlfZP/p5N3X1NPP0NDS2Nnc4+vv93tv amlra2lsb2hscW93cnR0dHV3///8+vfv6+jm4uTj4eXk5uzu8f56fnNubG5vcHZ7/X5fVFdX U1VaWllfZnvr5N7Y1NTPz9DS2Nrb3ujr8Xt0bWlramppa2drc3R2dnVweHp8+Pz79/fv6ujm 4+Tk4uTn6Onr8PX8fHVwb29xcnp5fn5nVlZaU1RZWlhfam/s5d/Z1NLQz9HS1drb3uTv8X1s bGhpbGpobWxreHt7d3p3ev58/ft8/vry7+vq6ebm4+Pk5+jq8PP1fnZ0cHF2cXN2fntmWFZY VFJZWlldanTv49/Z1NLQz8/T1dnb3ubu+X1taWtraGdoaWptdHp5d3t8fvz8+vj8+/Tv7uzr 6uno5+bn6eno7vPy+Hhyc3RzcG95f39rWFZZVFJYW1hdaXH159/a1NHQzs/T1tjb3+Pu+Hxu Z2ptaGlqbGpyfH39eXp8fnx++/7///v18+/t6enl4uXj5+nn7fP3/Hpyb29tbnJvdn5uXVdZ WFNWXFtbaHD76uHc19HR0M/S1tfZ3eDo8v51aWhtaWdoamZqdnh5e3t6f/z89/j7+/X08e7u 7uzn5ubm6Orp7fDx9ntycXBvbnBycXh3ZlhXWlVUWFlWWWZ459vV0s7MzMzO1N3xfndpaGFc XGf95+Pm4ebm6u1zX19dYmlwdfvr5Nva29/g4ufn8npvb3v4+fv7+u3t7vV1aWhqfmhJPjw/ RlNcceTXycLByMzU3Nvg82lmY/ze2trc29/j7HVfWlVaX19hZ3zz4+Lo7e/u7Or5fn767Ofk 5uXk6Oj3/f57/nr8cGpqZW1scHf75+5TPj0+QVRTZevXyMO/y87V3Nzf92Z0burc2uDf3unu dWRZXltja2ZobvL76/N/fvXv7Ov79u3o5uTs7uvl5e/7dPzv+3huamhka25tbXR75dtePzo7 Pk5XV/TXyL++ydPW4d7f/2Vw7uHU1t7f3t7ubFtTWFxfbGNkdu3n6vpzdfru8/V/9Oji5Ofv 8efl5/N7eff//HpvbmhobnVoamly5d5OOTs8QWJVYt/Oxb/B1tfc6N7gbGno4tfQ2ube3eTs XE9VV19mY15q7unmfmhr//33f3H56d/h4ens5eTm6fV9/vT4/P1rbHJrZGZhaXF87eHeTDk7 Oz9YUF3dzMS/wdbY3Ovn62Ns5d7V0dvj3N7k9V5NVFhZaF9fbOru6flnbHh6fv109ubf4uPs 7ubm5+nufP37+3t2amp1bmtoampsdXXl3E42PDw/eE5l3crFv8Li2d7x6eVebt7b1M/d6dzh 7PZgTVNcWWplW2/q6+/1ZWr7eH79eP7j4Onl7Ozm6O3u7fTv7n5uanNvd3dkbGdpam/+9OdS ODo/PWdXW9vNxMPB3t7e9O/nZm3d2tbR2+ve5e78aFVTWFpcY1xh/fDxf3Roef99eHl+7N7k 5OXo5urv8fTv8/fz/31za29samNlaGlsbfzl+EM4Pz1KZ07v28jGv8zg2enp5/pg7d7a09bn 4+Dp8nVcV1ZXXVxdXGt97PJ7dG5++vxye/zo4eTp7uvs6u749vLv7vd8dnN9eGxnYmNwb2tq eOh6STk9PkZlUf3dysXByt7c5+vs+GT44NrV1eLk4ejxdV5ZWVRcW1pcZHXz8nt9e/x/+2x3 +u7n6ezt5erq7/v67Ozv9f9xcHBubmhjZmhja2Zu+PxXPz1DQ1lbW+HWyMfH2d3h6ezwa2/n 39rZ3ubf5+z8Z1tYVVhbW11jcvHv+Xt1fH3/dnP68erp6+zr6Ozu8fbv8vP5e3hzbWtraGRn Y2RpZW/67GVEPUVCVlxW7trLyMbX3Nzj6etra/Ln39vi6eDl5vNvX1xWWFtXXF5t+e34+ft9 /nxzbXz77Ofr6+ro6Ofr7u/x/n94am5sbnNsaWlkaWtsbnNxWkU+RkRTW1rp2czKydfa3OPn 6m5y8+ji3uTm4OXp83RlXllZWllaXWh49Pn4/fn9/nZueH/x7u/v6+Xk5urr7u3vfXhtbG5s b2tpaGhpaGpmb29hTUFGR0xcVXbk0c3K0djY3N/k+XP27eji4+jg4+Pr/WthWllZWFlaYm79 +fP19PL7e3R4/fbv8O/r5uTm6e7v8P16cW9za2traGpqZ2tqbnh5elFDRkZJWU9e8dnPys/Y 09jb3fVtfv/47vD05ePg4e15amBeXVlYWF1ndHf/+vPs7vR9e3/5933/+u7p5+nq6ert9nht bGtsbWhoZ2ZoaGhvbXN0XUtKS0lVUlZv5trPz9bQ0dfW3vHy+Hl//2/37ezo7Xdvb2poY1td YWRsc2597u3p7fb17vf8/Xl+8PDy7vDv6vH2/3Zyb25mamJhZ2RnaWltfXdbUFNOVFZSWmv5 4tjc2NPT09Pa3+Dp9Ptuam5yc3lwbHd2dXZtbG9ybW9sbXf//fn29e/u8vf8/n7+end8eHl9 dnR1cW5xb29ubGxvcW9xdnn+/X9sZmZgYl9fZWx1+/Pz6+Xj3tzd3d3f5eju9v17dXFubG5t bXFzdXp8e3x7fP1/fv//fv9+en19fn/6+Pn19vX4/P1+e3l6dXN0cHBvc3BwcnN2eH1+//55 eXd3d3JzdXd5fn3/+Pbv7uzq6Obo6Ozu7vH0+f57eXd1dnd8enx8f/57/v//fn59eXp5enx8 fH/9/v7+/n18fXx/fH7+f/z//v39/P75+/v8+vr8+vn4+Pfz+vn7/355fHh4dXd5fH58/fz3 9PTv8fHx8/T2+P36/P78f////f5+fnp5d3l4eHd2fXt+fn9+e/39+/38+/z6+/n5+/39+33/ fn19ff///359fXx+e3l4eHh5e3l9e338/Pj9+vj29fT19vn8+vz//n/+/vz7/v3//319fHh6 d3p5eHl4eXl8e3t+fP79/Pr7+Pn4+PX4+fj7/f7+fXx8fH58e3x+/v77/f//fX1+f/79/fv6 /vr5/P79/v39fH19ff9+/Pz7+vv9/fx/f355e3p7eHh6fH5+fXx6eHh6eHt7fH59/X39/n77 /Pj5+fv5+vv7/X9//f5+/nx9fX17fH58e319fHt9fXl9/3x7e316ev7+/Pz7+/z3+/z6+fb4 9vn7/P38/P3/fv99/n/+/nv9/37/fnv+fnv/eXp9ffv9f/78/P3+fvr+/ff3+vn4//v/fvp9 fX96fnt7e3l6eXd6fnb+/n//f33+/Xr+fvv8fPt+evp+dPV7+vd383/+9374fXp9fF9c73Bu 3/7m6W346Pxl/vdrenFr9/xnW3rnYOre69rs+9vfdG3ne2hva257amJ98GZu73t3+nN97m9s 7vdt//R4/3569fV/efj0cvXxefn1/vv0f3X2/W348nL77nf17nr97H5673ty+/t4/Pl+//7+ +vp/+vh9e/p8dP98evx8dXx8dnh7cXl7cHR8fXl++Pz++fn6+/r59f5/+Ph7f/x8fn//+vb9 //f8f/b3+Pf2+Pj49vLw9fby9/r7+/93eHd6e2/8+XB68HtfYPReTm5fT1xdXWNhdPHu9NzV 3tfQ1dfZ2d/m7ff4bWhzZWBoa2lpdn989O3p7ezl6+3t7/J/fP9ybnVub3t+8mpR9eg/YehC UWJRVlZva3v46M7f2sjP1M3L0drR2ePpfn1qWVtbVE9WWFFVX2Fiburs7dzZ29vX1t3d3eTt +PV3aW1qaWZnbGxud/v3ZVntdEZp/kdUY1RTWW5ka/no1+XZy9PUzMzU2M/a6ejydmNeX1pU VlpYVl9oZW7y6Ovk2tve3Nnd5eHl8n7/emtqa2tqa3Z89/lbWdpSQ99WQVtbTk5ebF56/drU 5c3I0c/IydXQzt7p6v5rWlhZU05SWFFTX2ZldeXf49vS1dnW1Nzl4ed8cnFtZGJnaGdlevZ6 7fVUX+BFR+xHRFxVTlVtbP7h5MzN1cbEzczIzt3Z33VpXVZTTk5RUlJcam365N3c2tbW2tzd 5vL+eXJqanV+cP3n9/jm6fL06Pl+6WhIVe45PnE9PlNPWF3r287M0b6/y8HAytHT2nprXFlZ Sk5XTVBbY2d459/g3dzc5OXg7u31fHx4d3b09PLn4unn3+j39v15ZGJoXmVkUkRuVDhOW0RK XHV4fdfWyszNw8TJy8zN3enucm9dWFhbWU9adGdm8ODfZevMU+bXV9/tXn7uamrw9X7y8e7u +vX3fH52bHNxZ2hta2t1a1leZ1RNXGVWYXpreunv9trY3tXQ19fU2d3Z4Orn73BtbWJlZ2Bm Z2VpaG91fPn48u7u8vLz+Pv6+/9+/359/Pr6/P5/fHp1eHdzcXR4cmxkX11WV1tbW19kZG54 /urf3NnU1NTT1dfX2uDm7H5yb2lkaGZjZ2lpbXl4/u/z8u7u9fby/nx9enN4fnd9/n38+/v/ +vn/+////fx7bmdjYFdVXVxZX2Jfb/xz8t3c3NXU1tLT29nX4+3rdGhza1xnd2RmfHNw8fh6 6eb47ux7+v5ucXp4bXf/b3fzdXXs+XDv63T67vr06vdeWG5oSUxnU05nXVje3GrcytHQys/P zNbp4+hpXl9WVl5cWWn0/fHm5OTk5Ovp4vP+enn3ZXX9fX7/+/pdYNBjWslt89Nc1+Bf2e9g TD9tTTVITUVfWF3XzMfMzr29ysjL0tPuXldXX0xIWllbbHDm2dbY39nU5/nwfXxtamdq8vd3 697e3d3e3t7oe3N+eWthbP3z9Vs8QOU+OEVBYU9b5WXBv9LGxby/0src59pcUExZb0pNXmHz de/n4M7Z7+rk3vppb3jo5u/05dbZ4uPi3N/vbWdsYF1VVF5fYGhs9/dIPFlOP0I/WU5412vM xb3Ay73DwsfR22bmdFJOT1lMVl1XZf3c7+vY29vo5PR56/P4dObf7Obv5uvw7X5zc35lXmhf X19fZmBudXl1S0NUUktISVZV7d7k2s3AxcXGx8jMytz7ef1sWFxWVlFbYFViavH97uDt5uXc 6uzm6+z36Hx+/vLxa3/1b3D5a2Rrb2JjaGloZHN5dO/l62NRXGZaWlRYV2nr7+7k0s/Ozs7R 0s7U3e7v+W1vYllWXl9cXWFoa/Xs7vTq5efn6+jv8Ozxe3Xzfnrz/Xp5/HtyZXFuaHJrb213 +v7v5PFeUFtfWFhUV1Vs7fHw5dPTzs7P1NTP1t/s7HducmhcV2JgXl5kZWf89/x87OTp6Obp 7uPi7fju9Xn093pz/3pvb3NubG9sbm58dHd98+pzW05WXVhYVFhZdefq593Rz83Nz9XU0djj 7flvbW5oXFdeYV9hY2Vq9+zz9urm5+bm7fXl5fLw7/L17ux3bHNzcm9sa2dwdml0eHv77ubq WUpSVlJPTk9Oa+bm5dnNzMjIy9HPzdbl93liZ2xhWVhcXV5jZWFt+e/19uzn4uHl6ufh3+Tn 6evx7+98bv9+a3FuZ2xzcWt5fPzt4d9SPUhLQ0RCSERu19vZyr7AvL3CzMjI23VeWE1TWE9N WWZgb+74d+Le6/jr+HXv7n585N/i3trh5t7i9H35b3N/dGRp+3V4dvf57+T+QzVCPzw9PUNE 08zMyLu4ubW7w8/I1WZQS0ZFUE9NU+zi4Nra5OjZ9GFcYFdbbmhs6NPU0c3O1dPU43lzalxi ZF1hdPl38eHe3t7eYDgzPzc4ODw+UcXKw7yztrSzvcvOzmBNRkI/SVRPWObO0MvP2+TgflFP T05OXWJm387Ny8fJzs/R6m9lW1VYXFlu8Org2t3e19bkbT0tOTczNjg/R8XBv7uysbOxvc3b 1lpIQj8+SV1ZadnJy8jO3vD3ZExLSUtOYWv81srIx8bKztTbbV5ZVlJYYF584tve2Nvd2dv0 SS8wOjE3Nj1A173Cu7axtbC6zd/cZElHPz9IZV9618vKx8zq+W1cS0tISlFjduzRysbFxc3P 2edqWldSWltfZe7b29rZ3uLf6XBjPCw4NjQ6PEJPvr+/urS3tbbI3+LuTk5HQUhpcXHa0NDM zvL+ZV1NT01NV2f85M/NyMjJz9Lb8mlaWVNZXWVm8t7c6uPn7/PrcmNONTU7Nzs+Q0rVw8W+ u7q7uMLT2N9jW1VJTWBrauTr5tvV5Xv4Y2BgXFVfbn/l2djSzM/W2d7/d2ZcWl5lY2lvfPjn 6mdv83x3+25RPj5DPEFBREdY1dDIv7++ur3Hys7d7/hUT11cVltgYPbd6e/d6PDyblxlamt9 6+re1Nzd2t/y72tgX2FfWFxiYvz4ZP7v7nD+bHvo7W1cT1JVTlJMWVt3cvzy3NjW0djW1NHe 3/NqbndqX2/+6+Df6OPc3+To7O7o7Pr4+3jxeXB6d29sa2VjYmhiZGxoan/4dPp9cnl7c2p5 7/Pzd3BhY1tUV1ZXYGJibPHn6t3c3uDc5O/d6+jl4+zf2+Td2tzb2d/h4Ob4fm1jaGlkY2tk Y2xnXWtgYmZgZmL1Z/5yZe1u+n3593rtfvX/eG7yeWLvYmX9b11o81/m+Wl45upz13zq1e7p 3OvY+tfkaMdNymTy2FLNSM5WcPtX61LbS9pR+OxM1EvldVPbT9VW3/1e0VnSWMtQzu1dzFHN T9FeaNRS2lrSTtJsYdtg6V3RTtJj8vF653TpZdhTzVLs00jIUuN9bv1o41vaUs1O2n5a1E7V XfPlV93rT8dI0vBOxEbLaV/QUtd0bt1e3VzaVttle+BX01jcYO3wW9VS2Fvob23aUM5W5vB1 7XXtbuVh2Vbbb2TbVtZd5n368nTu+n597GnueW75/2rmZu13d+tl3mHmfm7lY+tzc+xl6G7+ 7W/ncfLzc+98fPpx+HH2fH7ydupz7/z8+X36ePRx/X94+v/+9v/yevT9fvl0+XP+eXj+dX96 e359fv39/H7+enj+eXl8eXr/fP9//v3/+X77/vz6/X59f3t/fHx8fn98/n38/379fP98/357 f/5+fvx+/f79+/9/f3x8fHp6enp5fHt8fn/9/fv8/Pf5+/v++///f39+ff5+/f3+/vz8/fz6 /f37/v7+/v/+///9f35+fn19/nl+fX99fH59/v39+/v//P9+//7/fH16eHp7eX1/fP7/f35+ /X//fn18fH98fn99/37+/v1/ff79/31/fP7+/v39/f77fv57fv18/f/+/n35fPx///x9+Xnz f/36efR29X/5/33va+xufnxsblFd20vhzlfDaNvOY9dv2VrmbV3lW35i5lzvdPRv6XH46G3u ePFr82TvaXNubeJR01PWXurrbeZy5GfdaOZr3W5s4GR/9Pxo4nZ46HT7d+Ng7uxg53ln8nN+ /W7vZN5d5HDtbOpx/txY2FveWt1h9336/HzkZdlb23N65u9q5mrfXNtsYdda+O5k+mvkWufy Wthh6nvv7mDcc3Z/629t5WTu7Wtt4Gty6X/4bvrvYe/vavzqYXrfXfbt9GLeeHHn7G3o6fxs 22d15WX4b+tf7/Fpcepo/Oxo/e1xcOZybOl9cPDpc+zoaPHtavvnZfzyae/vZuntZ+75ZvPv ZXbmYXvnb27ebHLcbX/deW3bb2jm/F/r9mP57m537XJ56W5t6v5w8nt58mtw9W9u9Hdvf31u /nxw9vtx9PN1+e/8/PHv8uzz7+bt8unp9O7p8e/t9vD4evr6dnf9b3h8dXl+6uDvY091fzxM cEFFTlpQVvPw0NnTwMXJxb/H0MvU4vxlX1VNSU1MRk1WVVlr7ejc19PP09PS1d7n4fhub29o YW9vdfx+3+Pr3NjZcVpiVUk/QkY+PkRLTlB+2tDMxb2+vr6+wMrN1elnV1JNSUdJTExNT1lr ZW3d2t/b0dTd293f6fj07/lu/ev1/e/j6vDo5env7u7w+vvq+kxBXFwzPlo+PkVmWmzW5b+/ ycC7u8zFwtPfbmZYUklFUU1JTl9sXvPh4dvh7uTcbGH5cF1baWlr/n7j2drc1M7Y29re7Pty YmhiV11qZWL67X1sXWFSTU1GS0lJTE9hYvXb08rKxcTExMrLz9jkc2lcVlFPUlJVWF5pYGD5 +HD28+3s7vb76PV57+vq6+Xi5N7l6eHm8P7ze21xZ2RramJr+vrv9V1ZTk5UP0ZKSU9NYWzg z9fIw8HCxcLJy9Lp8mtcUE9PTlFQVV1peH3v6ef3fPJ7bGdnamttanrr6Obe2NfX2Nzc3Ob/ eXNmYGFfXV9hY2lwc3z69PF2YmFZTk1NSktOT1Zl++jXzszIxsfHyMzR1+F+aWBZVlZVVVle X2BnZXd9cnn07vXv7/Do5u7r4+Dg3+Lh3+X0/vl3cGZkZWJjYmBma21vb3b+9Xh19/BqYFVX WVJPT1laXXH+5tXPz8zJy8vN09vc6HdpX1xbW1VWXF9daGt09ezw7+fo5+nu7urt8fLx8u/u 8Pvy+3t2c2hpa15hZGBgbl9me259+/379vf97fP47uz18+7v+X9sc25tZ2VpaXRsbm/38fL1 7url7vf59Pf4e3Pv7+/v6Ojj4ubo5ubu8396eXNsbWppaWhnaGxqamhpaW5saWt6dP9+ef31 9Xb3+/j9//7vfO90fvx773R7ePR6fvr9/el9+Hj3/nd+bf9w/2p7cf/8fHr96PPu/fLq7fnx 9e7u9f/w8nHqZ/X9dXZ0d2l4Z21obWH+a3ht6mnlbe1u72Lq7fzt/+J7/PBx73ho+297cv7+ ae/6f3h662/bb/V5+vhzaPNv9f5d7fvyfO5v7/jqcfnqbvz3ZvBh513oavP6dvdp5GLibfH7 4mriZuNf4mN983V062D0bO9l8W75/Oxm629w/v55ffZ9cv987/r87GrrZNxf5Gzubuhd313i auVq83LvcPj/dPJt51zgYep16GzyeP53d/p3aOle42Drb/N+evH9cvr5/P/+72zrafJw9Gzt eP917m3nbOZ38Hn3entu9XFz8XV4+Hdz927xbXrvX+Bj63J+72vkZeZu83Xvfnrtf/7+fHZ+ /W/uaN9c2l3tfmjrZOln+/78X9hU2Wf68X906WLcXuryYeBk7Gzw/2ndYu/8enR67GTkYuRi 7O9a2VnfZehn6GfkZu7vY+d4c+ht8/ht417fbG/sa3XzafBv+n106Grtf3XyfXX3c+1o8/hp 317lZ+pn9vVr8nt9dP3uZeJw+/zqXtta2VvdaWjYUNRY5Wnsaelj6270b+tk3l3ke2XaVNRe 7upr8+di3V7kbfNv82HcVNpbf+RY11TZaHjuau5+/m/mbut5e+p29f508Hv1autl9H9q6mbo bnb2au1q7Gfz9GnydfnzdOtr6H107W3vfvVr62jobO9w8335dfd99316+P73a+Vf6Wn7Y/hl fnZu+m3qaO9s73zy9P/o7fTx7/R68m5z8HRj72lu62Dybu9r//hw8HL5behu6W7pd+5++P3h aez1/vnze2zlZepr7F/tc2fvc3f7d/pv62R1/f1p63hy6Wt+++twfvd8dPpqf+tt9m5+e2nr XeRw/mX26mfn+P705Xty7Pxn63L/9Ptw/fH/aeRr8X3oaO3pXeFp8V3bXnf2a3557mH08HF7 6Hb56Hh16Hh29/hs8e5wbOxqbf1rbu98Z+t993vvfe/1dXrtdHf5fHj4dmr2b3ly/v18+Xnx 93fufPR++Xv8+XV5/fZ4d/Z0+vtu/HL+bv1vefn/c3zzc/r/e/b6fPj563fq83jt73P3/vv/ fXF493Rsef5ufGp2e3hveX3//mt7+Htyen169XJv+Hxtb3x3/H1z+O75+vDr5+jp6d7i5OTl 4ujv7unv+vv8fXdtZXtoYGtvZW1zaHPp7epmPk/xOz9HR01iT1fIx9TEvb+8wc3Hxu9dYlZN TkdKaWpc6NDQzc7Uzczk/+t2YFtVWGpiV3bp79/h7dnT5kgyXE0rPDc7Rk4+Z7vHybe3ta+6 w7m87XxbSUlEODxNSEdf/NvIz9TDw9XY2OntalNZcGJZae/e29rb0czZ5uPf5Ww+Lk1DKTk0 OUxPP/W3wsC2t7Ouu8W6v+12UkVKQzg8SUdKX2jZx8/SxcXO0N3n3f1ZXGtlYmZq39rf39TU 2tvt++j+YkIxREotODg4TFJDXb7Ew7m7t6+5w7u9z9dtTFNNPT1EQUZPTV3Z3d/Ny8zIzdfP 1vD+c2RnZFhgfHB67+nx3exq4GR4aG9cQEFRRTtGPkdaUE3yztTIxce9usHCv8XJzOZz/1tO TElJS0xKUV1n9uHb08/U2Nzk2mp37VHcU3NsWN5V72Z0bXt2afZt/HLy/PR6Xll0Xk1lT1xv YmV54O3d297Vz9TW0dfY2Ofu7e9wb2xibGtfYmlkaGplaXhwc/529/T59vXv8u/x9PDz9/r8 //3/f3p7+33//nh7cWx8aGl2Zm9tb25xenT8/v/18O7u6unq6err7Ovv9PH6+ff/+vz++P7/ /H3+fH18dnZ3dnF1c3F5eXd4e379+/X89Pb58vr5/316c3pvam5sanFwbXd3cHv+fPnz9PHu 7uvs7e7t7O7v8e/x8PP6+Pn/enx6eHp5enV6fnd7fXV8/Ht8fX5+fv5++fj7+Pr5+v38+313 eHdvdHRvb3Zvb3t4df39evr4/PL19PH07vH07u/z7/Lz8/b6/P19fXx8e3h8fHh+fHh9fnd7 /3p9f3p+/H37/nz5/3z7e//9ev7/eX79e319fH17eXd2enx6e3t4ff59+/j99vX49fP08PL0 8fDz8fH2+Pf8/Pz//H1+/Xp8/H1/+3z+/Xz9/35+fH58en1+eX/8fH/8/vv7//z7/n7+fXt8 dXR5dXN2dXd8/np3e3V4/X787+/v7/Lv8vjx8PLv7/by8/b0+vr7/vz8fnp5dnZ4/fx+//9/ dnh+ef98fv90eX15/vr7+Pb3+n57cm5uaGtqaWttcm98/vvt6+nl5ebm6u/s7fLx+P79/3p+ /n/+/v39+f77+P7///98/3p3fHZ7eXx7eHt6/n5++v39/vz99vv4+HFvY19hW15iXmBlZ2l5 +/Pl4N/c29zb3N7e5O3v+nRzb2ttbW1ucXZ5+fj38fLw8PT5+f99fHh6eHt9/fn48PLw7vPz 8fr+9X58+3NnXFhWUVNYVlZdYF9t+vDg2tjU0dLR09XX2d/o8XZvamNjYmNiY2Vnb3V5/vr5 9Pb48vb59n1+/f5++fn27e/v6u3t7u/w9n//f3lkWVxWS09OUltRV25taezp39PU2c/P09PW 2tfe9Pv2bGZrX2tvY2V+bmt2bXP4bW71/3b9eH/ydXrw7vTr6u3l7fXl7vjx9P/yc2/1eWdS TWJLP1NVUmtb/9j299DT1s/T08/c59rh/ft5a3FgX29tY3N4eX7+f/D6d/n+aFt+aFnfZfHf ctvc+tre7uHrdeP6avfvaXf6eXru73NSSVlGNk9JPVpPXtv+28DMyb7Ex8jP19h7ZX5ZVGJW XGted+xs7ul58/ZrdmpeZmZhbHf+7url3t7g2t3k3+n693JrcGRjfWRl8Gj07nzd5lxQW1A4 RGA5TGRM7fjlxM/JvsHGxcbU1eB2+FxWZVNVYl5mdnb97H346XNx/WNlZGFqaXb78+vj3t/b 293c4ejsenN4Y2psYm5jeG1p63Ht4V5YWVY+P/Q6R+RGdenuytjHwcbFx8TY0tZ362RfY1Re Xlxmb2pzfm/6enh/b25naGhncHb4++zm6N/e3d7e3+bn6/P9fW9taGlyYHp7Y+1+/ulpXldd RT7qPkHXRmTmfs7hx8fJxMfE1s3Q+d51a2FcXlpgXWppYnZpbHV1eXR2bG5sa3d4+/fx7Ork 497f393j4uTr7vv6eWdxeWFp+GVn629ze1xWXkc/5j5F1URt7/zS7cbNy8fKxdvL1PTZfHpk ZWBbal90aGn2X2x3ZG1tbWRpamVycPr98ubr5N/d3t3b4d7i6Of09Pl6b3Rwa3Jubnl5dWxp T1paPHhQPNlOWO910/3Kzc7HzcXYzs7s2vH1aWhsW25jb3hs+Gh0d1xvbFxmaWNgb3Jv/PDo 7N/c39zb2t/e3ero6vD5f/Z4eH90dXV9cGZtXU1cTkReTEtjVmdu593czs/LzczL1NHX3ubx /mltZWZsanh0f/z9fnN7al9kZltea19lcXp+8+Pl4Nvc29zb3d/g5ejs7vT4+vj1f/31//97 Y3NWS2VIQ2RJSmdaYXvd29nMzcvMzcvW19rn9npxZGVkZmpr/vrz7Ovr7e75dWtpX1ZdW1Vb YWNi9e7v3dvY2dbV3Nzf5e77/m5uamtub//+8uvr6Ofp6ur1/HtmaVtTWU9OU09VWl9v+OLd 1dHQzs/R1dnf6PB3bmpnaGduc33z7enn5Oft7/lvbGphYmNhZGlydv3v7Obk4OHl5enu835/ dW92bXFzdX57+Pn78ff6/vl2cH1ub291dG78en/5/vP4/Pf2ff75e/r3+/Tw7e3p5+jm6enp 7u/w8/h/fv9+d/9+e/F8/u18/nt6cV9bSHhfNc55N8RoXs3xyN3Lz9jI/N7YcV/+b1Z3YWz9 c+fs2+rm2frx/m1mX15YXFldYmH/d/Pn597m3+Pr6fj1dm9vam9udnr58fHm7Ovvd/JyZG9k amhrfnD08ezh59/i5uTu7/x9eG1vbGttcHN5+X798vr6+v79/nVxe29udnd6ef77+f779X/3 /n38fPx6f/j99vny7/by8/H1/vl/en1zdXx0dXv+ff/x9/nw+Pv4/v/8+vX09PPu7Xt4+GJj ZllaWltaX2hn/ezv3t7d3N/g7OzycHlvanl3ef/t6/z08ud8auh8cHx5+f16+e/t+fbo9fx+ f/5vbXR2cGt1fnt8+ezy8e7r6O/w6uxwY3JdVU5GXVBCc2tl3eXTy9LV0c/ceul+ZWddY/lz cOXc3+Pc3e50a11cV1FcXl9p9uvh4N3c3OLt6fhxa2lrbG1yfu7s7+jo6+94eXVpZ2lsb3V1 ++nu8+TqfG5zXVhWUVBSVlVmb/Tj2tfT1NbV3OnzfmtkYWRkafv27N/f3tzf5+Tyc3ZsZmpq anZ7/fHu9fHx+vl9d3N2bXJ6cnv49fXu+vnr+213dl9mXWJrRjvSWDXOXmzH9uy+xG7Myuvc 403n3k9Z4O747l3o019a4e9sal1m32VZ7OT07Pzx1O1j7Olyb2dp6O9k997t8Pn+4ulnbP17 bFxfcHJhYnN+bmr4/Us+3k856k15zGfjwMXZyM3Zyt5S6+pUW15Q+vFP+d3q39/83dhcZPhl aWpce95tetvk39559N97ZXNra3JcXPh6af5yfed2bPxycnhiXGlbQUhrQ0x0TM7WbcnLy8vK 2NPK/PjpZnhzXF12a2X+cPnc8/zq/nt7ZWZwaWVtamp8dHL4/v31+fHr7e/p7fHw+vz6e3v/ d3d0c3R2dnZ9dnd8eHJrXlhbWVZeZl5n/n70393a1dbV1dna29/n7XdtaWJgaGdncnR3+fX1 7ezv7vR+fnlzdW9rbnFwevv48ezt7ezv7/D1+P56dXRwcHRydHd0ePx5aWRdXFxbXmRkZHR9 ++Xf3tjW2NbY29rc4+fzc25rZGdsaG51dHv49/Ls8PPx+n3/e3V6dm90en348/Ht7ezs7/Du 7/f7f3Nycm9vb3FxdHf/+HdpYl5eXF1iZ2Vs/n7w4d/c19fX1dnb2t7k6PN2cWpkaGppbG9u cXl++PX59vf+f/7+/Pr8fX78+fbw7Ovt7O3w8/P2/Hp0dG9ubm9vb3RzdH76fG5nX1xZWl5o ZmR6/3vi3+LX19jV19vc3OHi6f98c2ppaWdpc2ppcm99/fz//PR/+PN99/X79/v99e/08uzw 7u739PL5//19dXdubnRvb3p9/fl8XlhkYFlcWV76ZGZvb+nZ1dvRzNHO1eTj4/tvZltbXl1b ZnP84ufs4N7o6fFyfX1pa3Jv/PH87ubo5ePu6uj/eW9sbHBqZnt+e3t49u/3/nnt5OR0TEtT TEhLSVzj5d/VzsvEytHNztXZ82Bsc2RfZGX98W5z/vzz+WpodXBramdy8u/z7OPe3N/q6Obs 8v12e/V8b3R0fPZ0bf70emxtYGtta2NsfO/a3VxJXFBKUEVL/ert2dPRxMTOzMvS0dhoX3Zi X2VeZO3ub3n6fev2YWt3a2xsZHPo7Ozi5N3Z4Ozo6vTzc2l5/npyeX9/bnZyYn9taW91Z3B1 YHB4cfLo4t5dUHZLWlRMWP7k9dDa0snL1M7R2tfdbnF3YmpuX2P4cGh+d27m93Xw7nnz9W/v 5uzi3+Xh3e717v5++HJrem1qaWpiZ2tgaWlje2pq+nn3/vdx/vL67f3r6d7leG7qfHd7a3vq 6X7v6/Dm5Pjr4+jo7P717fhubm5wfnpye+7v6+3z7+ju8fDu8+rtfPz9fHRwamt6dW14cG98 bWNpbnx1emx+/vj5d+z+7vr0d+/sd+ly4fXn+vn76PTw5mvgdeVj4GPqdP1t9Hp+9m3vZeRd 5VzfV9hU21vbYNph12fYbeDu+uVz6W188m36eOlq7e13+Pd3fG/rZu9wcnL2avJt83X/727j at9r4f3732rhb/f/dHR/ae53a+dl3m3q6nTdaeNu/H5q5WHoe2bjYOhr+u9j2lfVYfDkWtVX 1GZ621jSWt14b9te2HR73V7aW91hZ95U2lvlanriVNJX4Xv86GTbXuV8/P1993niduV25nv/ 5mDke3PpY91h6+1Qxz/AQ8xlTr47vkjXcVvKQ8ZS69tSzE7RbWTPTs1V9NxOz1Xu+F/SUMtP 1OhWyUXDSdrdS8pO3vpVyEvgzUPFVn3US8hM3OtU0mBv3/xs4elteNJOzU3OV1/KRMhK1Vr1 6lfOS8hN7s9HwkrW2kW9Ps/cRLw9v0voxzy5P8zfR75C2dNJ2tZK5sg7vVtEtTXE2kDBV2bt 1krN3z+9UU3FWlzh2U/d30rFT1rCSVy7Os/BNLdbQr1SWs5wWNvrT9ziS81sSr5A7r4ytlg+ tT7uxkDL5knCSuLdTs9Z7mrWV/PQSMlbdttQyUrnyz/K5EPGekbF70LCc0fFbE/S3UrW3U3Y dmPeXenlU9FrU8xgUs/nTdPpWd9v7GbwfPrlW9JW889GzfRS2u5ic9lf+vH9+H5j3nxd4HNu d+Vrb91c5+VV1XVi42jn+lrW/VnZf29u4upY2Gpt42npbXjhZGrda2337HZh3HVf4vJobd/+ Wd3nWujkZfnsfXD75mtw6Hht6P9r7fFqfuhvdfLyb3Lmdm/y+Hp49fJs//F4e371fXj7/X7x /H31/vj89nx98Hd3fv31bnfrbnn9+/5x73t2+/Z5ee56/H156nlx8PN5cOnvaO/ubX709m18 6HRs8O5seOp1ffl6fPT6cnfnfWno/nj8+/Vzcej8Z+35be93ceVnbt52Zufma3Lt42dn23he 799fZ9x0X+fpZWHZ7Fno5HRs7+JvX9/1Yehz/n37dO93ZdtZ4eNR0W1c121n7t5Y5O9g5exe b9Ffbul06Wlo3eNN1/ll317ZVuXieFTizEbb4WN96Gxey1JXxVZPwUvl2VDPV+dvcWnu3UnJ Yk7FT+Zu5utZzlHVVd/qT8tFyt09wN5A2cFBX8flQea5O1u5SU3N92RYzmNPwkPpvzfBzjnE 2T/BVljIRMBKQbw/Zb1I7rxaadrbbVfW+1F3zltOzWzvaunUSszsUttqbO1YbfxY32xc32r+ 7Vfa9F3r4WFy0V584n3aXOHaUNTvWN5j3fZc1m/8e+lvX9pg8u9u7vv1d3D9eGXsfmTqbHbr Y/fvcXz/+Wls821g/O5ide1levVvdXvu/fvg9O/f6/Lj5ezf5uXm7d/u6u196O/v8nf69XFk cXxrbHdpYnVoX3B//PntVDtCWkI/SUxg5szO1727wsPGzNXoeU9JU05MV2jl2M3Jz8zL1+h8 bmBbXl1h9Ono39rY4OHj83VjZF1VW2JfakEtQmQyRENL3926386wvr3Dysnvy/5FXVtWTVBv XN/N4dzPzeJt+ltaZ1xba9jY38/Q1M/Z8nDudlpiamZofG9t6d/gWjAvWjc0PjpjdbzF4rG1 t73HxnDO+kNLTV5LUXln1MrN2NHK4m1hVFNbYVZr1M/Sz83T09f1YWh9WVVkZ3v79Xf03d76 Oyw9RS87OkvvxLnXubK1uszGdOnlSUZJc1tZ/vfQzsnc5tDma1FSUVh1XG/Zy8zQzNbY2e9e WHBmXmFl9OLe5+/u7OjuTS4sRzYzPUB+0rO/yLKzt8nK7lflWUZFbu1r7OvY1MrXaeLrcFZR U1X8+nDkzcrP09jk5u9jVV9+b25v8ODe3vf26X90eF03KTlAMT0+Zd26tdC4tLfHz9tP/29Q RmHX5tnq59bS2l9heW5dU1NZ7+V/6NPKzdTZ6uTlbVhZ931v8fXo3NjvZvbsZmNzSS0rRzc0 QUjpzLHBxbW2vdDNW1fxXkpO397Wzt5z1c9nV1tkWWJYT2Pi3PPb087O1eF76PZmXGD56OTv 5Nzc5Gp0ZmplW2NUNSk8PTZAQOzbtrrHu7e61NNjV2/1XE/dzszO0nlk22pLTFteX31eYN7Q 6Xrb19va32zz3e1kaufk3eTx8+TgaGBfW2ptemRDLTNJNz0/X+W+uM3CvbvQ33hXeuF/VejN zM3P41vo4UxMVGZf/3lb4tHcbujb3t3fdm/c5Gpm9ejg3uv38uF3VmxvXmJy/0gwL0U7O0NM 38O4yse8vcre/lNz4nJW9s/NzNPzc9nvTk9YX2h5YF7c1et+5N7a2ux269zvZWh86N3reerc 6HJeYmxeYWtySC4zTDk8QVPowLrWw7q9z9j+WeniW1Pf0tHO0+991HhLV19hY3teZdjcfHvc 3tvd6/Xf3XNra/zf43v75enrbl5hcmdff1k/LjpJNT5EX9q/wNS8ur/S1vR33m5QXtnc29be 6djYWVdwYVtdXln25m183dnb197f2tx/bv1vffv/fOfg8np0eHxnWFpvaD8uO002PkFV3MLG 3Lu5vs3O39/UX05g43bz5O3g0t5jeOdtYmBbX25nXXbl4tzY29XT3/Ht9mtubmp57X1z8vh6 fWteb3plVjs3VD42Q0Ra59DqzLm/xsPGzMjVYm/nYVhjXV7wf2bz3+Tt4u/063dia3JlcPt6 7N7q7N7j9+75bHz+ZGt1ZmtpaG5waWz+fntLRGxMP0xGTl9qW/bL0dHKysnDydTOzt/w9WFc ZVdPW11bZnp/5trj4dvj9O36bX58aGx8cXL/ff3q7v3p7u9+cPRzc2lqbm99bF5LTm5HR1RK XmFfYODQ49TOzcrIztDL0uDi7XJuYVdYXVdYYGVy7Ozv4eHx8uz8/vh3cHv+anf3dPb59evo 7O7n7vT6d3JzbWVpdv1kSUx4SEFQSVZkXGTfzd/UyszIys7Qzc/w7ulmbV5TXmRYWGhwcPP8 79/oefPqev57dPh9Zvf47ud93vXj6H3yau9aaOlj6fH85+Hs5dtSPVxbNENGQF5SVejBzdG9 wcDBytHJ2FlhZFRPU05ab1lq6ODk4t3i3fRqeHJoX2r78fTu4Nze5t/d5u7+dnhoXmVqZWhx fXR96+rx4/1CPGZDMEdCRmNV+cq7y8S5vr/FzdLQb0xbWExLVGRy73Lr0tt08+hwZFdWYF9X XfDh5t3U0NPc397ne2NqdWReY255dG7u5Ox99+pzbW9+6+9VPD78PTBRSl1e787EuNHCur/K 287o7ltJXWBTTn7b5OTs3tfrV2D/XlFQX2ZpaHPa0t3d0tLe+vX8b2RcaXluafzl7fn58uj+ YnF+dFxac3B1buTX70g8ZlszREf/cE/Hzry/zMO+wunn3+paTFVcZV5i49Pb/O/d7VxUWWFY UFdv6fP23c7T3t3c3HlkZG1qXmb+6e/069/qeWpue1teXGxqYG918frv5t/e4/lqPTzfOztN UsxZx8bEuMXLzsLeW2FcYk9VWXbf6OLez95ddmtWVE1YWGRxa97V1t/W0+Hpd3tpZ2dhfu/s 7ujh6/twbWphXlheY2JuZ+fp4d9o4erwd3Hgc/1ZOT/WPUFU78jzv9fEus/p9M1xXVdcfHru X+HQ2u9z52tcVU9UXWBabd/d4d7d3N/n/njydW1sfu3u6+/o6O19cHhnXV9oXmN4dWnw4nL6 6PFjbvlueezsf+frSDhkYz1YU8/XxsbyvcXVaPPoYHRYXXTY5Xna2djxaWBXW1VOVWZ9f+/e 3Nre7Pn072lqdfnv+e3q293t7+/vdWZeX2ViYGx+cnh9/vt3dXd8a/p89ebt73TtVTpDfEFS W+POyr7vycbS+GD+WvJzY2vY0uPb4d7h7l1OV1lOUVpj+t/g7d7b6nlycm/7/Hfp3d7n5OTt 6vNzd352bm1sbntua3F2a2xubW91fm76+ez+fXBqXD5DXEpZXejRysHZzszT5HFxYuntf/7f 2Nza8PLs9WZaWlFYYFhccOnr6Onz6el4anv68u7p597b4ejp6u/4+Xj/8XZrbm5vd3JlZH9u Ym1uZ3R8cn/6bFxpVURLXE9mfuDUy8naz9Te6PhtbOfu7+be3Nvc8PTueGViXlVXX1xbanf3 6+v38On6e317+Oro6+He4eTi7PDo83x6fn12c2hkcnRfZ3Rwcm1oaHJrZWZqcX71bW1vWFlh XGdz6uHZ1t3b29/l5/Dr5ejs6+fs7e79cGhfYmJiZm7/9/f2/vTx/nd4/Pbz9u/t6ens7e7u 7/D7/Hp6dmtva29ycv1taHNsamhnamlqemp793bxfvbv8vLv8/74/Pd6/nl5/Xp5dHx6fXp+ +vj39/b38PLy8vHx8/P19fj4+Pv/f/79/P79/X5+fHt6eXl2d3Btbm5wb251eHN2dHV5c3N0 fvf6+Pr07/l5d37++ff9+vDyfnl2/ff+/v748/p8en79/nt4//z7enZ8fX14eX/8+3t6fH78 fHx9/Pj8fv/+/n16fHz8/Xp8fn98eXt8fv39/vz4/P5//fz+/33//f97ffv9/v5+/Pv+/f3+ /P1//3/7/vz9//9//n3//v7+f/98//59fn99e319fX9+fn59/318fnx8e3p7enz/fX77+vv7 +fj3+fz6+vv+/f3//nx8e318eXx7fn1+/3/8/Pn5+Pn7+P38/v7+ff59/359fn1+fHz///3+ /v79+vv8/Pv7+fv8/3//eXx7e3x7/339/X3//vz9/H58fnt6eXt6fH1/+//9//z7fP37fHz4 eXr+e/94fn55/Hz9fn36fH77fn3/+Xx8/f58fft2fXt8ff37d/x9fv3++Hz6//z+//X//Pv9 +nn5/3j8e/1+fft9fnt+/v1/+/76+vz7ffd9fvh+//v7fHr+/nl5/H18fX/5e330/f33+vx8 +3/6+Xp+/H19+ft4//t5/f5+/vv+e/v2e35++vt8/nt8enx+eH7/fHp/+/7+fvd9ev56fH17 enx8/3v8/nr4/v58fv51/Hd4+3379vr6+vr99v53+/54fHz8d3n9dvv5fvr1/fr+9/v893z/ /Xt6fv16dvp9/ft7+v39+ft5+/p9efr9dvx3e/57f/55evx3/Ph8/n7+fnp+ffh5fn7/9XT6 fHz//fd2+np+fnn+/v1///7++n11+nb/e3T5cnt/fPz/fHz6/3f8eX/4+vF5/PT6//52evr/ enR/+n15cXv8e/p4fPlzfX15e376/vv6/vf4+/f29v97/vT8cft8cf58fPz8+P788X56fXr8 enh6e/L5fv379XF5/X/8dv35/X9++fj7ffr08Pr+fn5+fHV4fPz9c/97fP/7ef34d377/Xz+ eP97en/9dW/2f//8fPl2fPn1e3b6dn50+u927vz8fXXvdnJ89/xydvl6/fZy+Xl9+2zx+XXz dfp6/Pd29nN4+v/5cW/+f/R5ffd28nx+d3T4/n548Pt1fHl9fHT/+vh/fvh+/HT68Hz/b37+ ff5t8/5z/Xb3//z5eHj99HH2+Hvzc/x/b/1u+vN89nP59v5weP52fXh6fv3y9Xp++31zdP14 fvx4/nf8+fvw+vt8/vJ6e3B7/P7+eHV0e/r+bnx6f/38/Pr1/vLveXz9ffdtenZ4/Xf5dPnu +3p++3V/93R2enVxffv+7ft3+vn283f89nn7/vB0dfZ9/X1+fHz9/Xl99v//+n3ze23/+v99 +vR9df35fPH/efT2fX37//rx8X3+dn98cv7ye3v8dn74f37+evry9X35/X56fPJvfHf4827v eH73bvxw+PHu+n7q/Pj983d7/XP3eHpvdfX/fHr4+Hx09e16fO71fX197nx58nn0fX/3fO9w df1+fnd7cf389fT+9n5x++92a/rvf3py/f79fPrx8+38+/X4fvx++/hyevh0b353/XZufnr9 e3z2//z9fXd2/X3yfHvre3l2e/h+/HD++W559e79d/d2//13fXb5+XZ9/Pz9//FzdfZ1+XJq +P5t9e/7/n7qb2/zevl4fvf99Hh6+n92ePx5fm3++Hv5/u99e/P+eXh/fHp+enD59HX+bvn4 cfpu+3l6fXjwevF/+Odt9/11/Hxybv3/bv33+Pf/7PN2ev76em7y+HN1eXlz/mx5e3H5e/d9 /Pj+/Hvvf/r89fdy7fr5dm/p/nP+ffX8dHz08XZ37/x2/n59f3129v76e2347nt67vvzfnl+ f3py+Pr4fPbx/Pp4/Xnye3L/+u11/3j8/nr4dv19+Xx6+vl6e/v8fvv5fPN6+/X2/nz5+vN3 +v978XV87v76+XZ7cnp4cnx8/G3//nf9/PL9fnv3d332df3zev798vF2en30bnV9d/Z4eHb1 /3P3+/t4d/Z4fnBwef/u9Pp78vdwdvPy9G799Wt4enn99Hx76f5td331a2j8/Px7/nzu63b+ 8PBvePL8bXL5f/tx/P/5fGn49354b/b7fHdz7/N5fPv++3N59nT+fv73c/t3+e7+9XH+7m96 ++9vZfbwbW/8fvh6dfZ7cOx7fftv8Xb5fHjxfP58e3z+8/J2+Ox1/vVv9X1w83f7/vl3fvpr 6HP9/W7rZ3v8dvb69/n0ffvrcfbub/HufnDyeXT6eO//bnv0/m59fm159H13/O3wfvXf823x +nJue3n+dXHse3Tz/W706Hj79Pn8cnZ57e9x9/5r8nZ783Pt/Xr593B/+H9+cu/v7HD56+57 eXlu9XBqdHl57Htv7/p1ffz683r9ffX78/d8/Pf4d//ybPTpa/h+/vh9d3nxdPJ5c+77fvTy fm/6+Ht7evTvdXf3fn99fXl5fvdufO5t8XD06W3u9Hx48Pd5/PJ3/etqcfb8f3d67vR8dv3+ dv7u+Wz/72317mz+4XV962r17HJvePz/+/N1dPN3fnh7evn7aurrdPHr9u/x/ffwePZrb/pr bWh+/Hdw7/l7/Hx4/Pv/d3z/fO577/d49u7/dfN1ce5uZfr//Wr7/X3ucfl5+fdu9vt69G/+ 7Xx19f979XH7+XBt/Xx573Z49fR8b3rzeHl4+Xb97mv/73h982968mzu6Wtz7/Z5eHj3+Hb5 f3j8b/1+/Xl+d2zmb3Dxfuz2cffyem56dHnmZW7veX19//T8e+v7dnr2bv7ub/7v9n9vc/37 eGrz/3V9/m1z63F67PZp6/9w8HDz8n109fz1e3H1+PJ3e3b19f5v+e10en3rfnZ3evX8/3d7 8H55/fj+dvfv+HXyevn/avj7fX3+ee5+ePZ69Hl4cH7ua3Xq/vzvf/z48Hj45m156HRtfHhu 7nRr6/z473p19e52eH51+vpxbPTq+3b88vZ9+fd57XN38n50f/f072918fhzdX79/Gp8eP3z fnn+53J27f709Hb69W558fp/+Pn8/vv++3ly//zzdP7ueXp++X5+73Rw9vlz+3py8n/+e/X6 /fd98Pd7+/R6eHt4fvlyeH579nV+e/n7cv7/+PV9ePz1/318dfB6dX7++nR2dfJ8fn1y8f5v efv1ffr5eO3senD8+Hn9b3l/enZsfHn0+3b89vh5+/l9/Pp1fvRudPP/fPr7e356d/l2dH35 /Hv5+//0fnn9fvt1ffh5dnj383Z5dv/vc2/98//+dnf09X97+O/7bnx2c3x2/P56fnj++Pn/ +PP79HZze/Z5cvX28/p8e/v6/Hv4+n19eX17fP/x/fTwfvz+fnt5/n52enl7fXb/fvz8+fJ8 +vX58vT5+u/0e3h++3p7enj+fXn9///5/Ht8//58//l6+/n6/fv3efv6e31+fX/4/n18f/3+ //38+PJ9/fX19/v/evv9fHp8f3z8/XZ5+vp6eX399/58/fP0e3759vr+enn+eHR2dXz8/fv3 8/r7fXl//3t1enr/e3v/e3p7/f76/f36fH9+9/t79vf6/fx8fP58enN3dHV8e318ff/8+/79 /fz5fnv+fnp6e318fn98//1+/v3+//36fnx7fPz+fX/7+/3/ffz8fn3/+v98d3l9fHx5/v7+ fXl9f/77fnp+/P/+/Pv++/j89/Z8fvn4//r7fv59enj9/X1//f5+/3t9//5+ff7++fz9+Pv5 +/z6f/99e3l9/f35+/v8/X18fX38/f3++/j9/v3+/3x7ent+e3p8fH3//31/fv1/ff/8+/r6 /fx+fX95fX7/f35/enx6en5+/f/+/33/fn5+fn59fn1+fH5/f/7+/f79/f9/fn5+/319ent7 en96e/99fn/+fv79/Pr6+fj3+vr5/v5+fXx9fXv/fn3+fv1/fv7//f38/Pv9+/j6+v79/35/ fH19fnz/fnz//f78+vv+/Pz9/v9+fn3+/379/v78/vv+fXx8fH17ent7ent+/n1+/n39/vv/ f/5+/3/+///9ff1/fn59fHx9fn5+fXz//X5+fXz/fnt9//9/f/79/v39/Pv8/Pz+/fv9/f9/ /37+/n7+f/5+/v1+//79/v79/P7+/P7//Xx8en19fX5//378//79/////f///nt7fHt9fHt8 f35+f35+/fv++v3+/P9/fHx+fHp8fXt9fHx9f/3/+vz9/f36/f3+f//+/f3+/f/+/f7+fnt+ fHz/ff7+/Pr6+vz5+vv8/v59fX9+f35+fX59f/96enh7fH7+fX1+fn5/f33+/vr7/Pt+/35/ ////fH99fn59end9///+/n79+Xz7fHb7d37+eXx9fX58+vz99f37f379fvv9fX17ff359vz9 /f77/v3//3//fnt+/v19f/9+fnz/ff35+vj3+Pr4+/j5/n14e3t9fXl4eHz/ff58fXt5fH3/ /v3//fv9+/3+/Pn3+f19eXl6eHl8e/99ent5e37+//7+fH1+//z7/P7+/Pj29vl/fX3+/P36 fn18/f38/Hz/fv7+//r9/X9/fn7+//78+v99///9+/7+/vz+f316fH3+/v1+eXx6ff//fX59 fv9//nt+e3p+e/9+/fz+/nh8e339+vv9+35+f379/fn89vj+fXt7eP18dXlzcn7//v38e3l/ //v5+37++/38/Hp6fX18fXp3e/5+/ft+fHt++vj6+P56fHp8//59ef7+/fz//376+Pb6/3p4 enz7f357eHt+/X9/f3l8fn58fHt3/fv39PT5/Pj7+Pr5/f78/fj+fXl7/fv4+vp++/r5+f77 +/f29vv7/n36+vr8f3Z6c29tZ2lobG9vbWpram1ub3Nwdnn79O7t7uvq6Orp6+zq6+rp6+zr 7e3u8vP18vHw+3dxbnJ6e3Nvb3B4d2tmZWRpbmZXUEtCQFVg6MXWytXa4ezfXuj+59TQ1uvx Xl56bf3u9vvr5//3bWFpc3Z78XJxfnz68fXz5+Xg3ul1e3j+6+jq+vRqaXNnbF9KQj06Tlrc yNLL3tbr6vNbdHLd0MrO23xdX2T9fu/t7eHj5n1sZWV2+vX5f3F4+/jx+/z+8+nm4uz+dX32 4+Ln7XBta3VtX0c4NTpKbcjKzM7k2eXlX19ifs/Jx83ZcVxdY2X8/vXh4Ob3dF9iaGl6+v/+ 9f/89H9++X759fb37evu6vH27uvm5+f3aGxqd/NiQjU0OUnqys3K19zW3fBbXVnmzMfHzeNe ZWZleGpx6t7e4fBiY2ZqeX5zbn59+/N/dXZ4ffT8fvv4+fL2+fft5OTl7vlvbGty+GtGNTM4 RvDMzMzQ3dXa+V1bXOnLx8jN32RhZ19ram7n3Nzk9GVja256dnRz+/d//XBxff35+nx1e37/ +Pr16+bg4O59b2Z8/vj7eW0/MzQ5SeHNzMjP1tHdZ1paXdnKycjO6mZsY15pZHve2d3jfWNr a2xta2h09/rzf3Nz/vn59Hl2fv707/j17+3s8vl0am929fr27edsOzA0OlTUzcvLz9PO4VpU VWjRx8nL1PdsdWJcY2X12tjj7m5jc3JmYWRjeez0/Xtye/D7enZvdPPt+Pl5+ent8X5veHVt fn1xc/nv6Gg7MjQ7V9rO0MrPz8/pWlVccM/Lzc7U6Xd5XVpfaOra2+jufG58bV9fZG727X13 d3T/+nNudnr28PV+c3n67OXx7e1vfXZteGx19u/o7lU7MzdAW9nU0s3PztXuWlxp5s/Mzc/S 4f9qWlpib+rf4Orq9nx2ZF5fanL39P/6/v97dW14+/z6fHr9+O7s+fP4++j6enhpcXTv9ezo 8l49MzY+UN7Y183Mzc/mW1pq79LN0M/P2OR5W1ZfcPvj7fDu8Pp1ZFleZG56/f787ff7fW92 /Pp/+f599fH0/vx6++n2921ibnN4fHvv3+RYODI5QGfi6dbOy8zOdldfaOLS0tjP0NjbdlpZ Y3H38XP57Ojtdl5aX2dvdHJ48+zy+XFsd/77/f9+9e3z7vZ69uf39/lofWpkZm179trZdj4z Nj1Qbn7fzcnGy+NeXGb33Nzb0c3P1eVmXl9qc3Fydevo5vpnXl1kamxsdPfs7fd7dX7693tz evbt8/x3e/X18e72e2toam1sd/713n9GNjc9SW9l59LNyMvVZ2pqfN3e3djP0tHY+21jX2xv ZWlz/e3tbmBfXmVuamt/8+zp83R9/Pr2en327Orq8P9+7+ry8f5tbnFta2pneuTgeT82Oz1P W13n3MvKx9Xu7Xbn5uXw49vb0tni9HlvbG9fY2Vr+v90ZGhqbnptaWpudvD5en/+9vbw+/Tz +u7w9Pz58fP7bmtqZmRoZmdwcu3keks9P0FLUVRyfdrOysvU1N3Y2OHqfn986uHl7H769O75 eG5oa2poYF9jant7eXZ6+fPx+311dHt++vj3+/X3/f52dXV4c2xsaWtrbW5wev3w/F1MSUxO T1FbX2vp3tna19XSz9XY3+nv8vJ/d2tqdf/49/T59u/8eGxpaGhnY2NjZ250eHl5/vz69fT4 +v38+/r7+Pn6/3RwdG9wdG9wdHF2e2taVFpZVVVaWVtna3H37eXa1dfW19vb3N/m8Xt0dW5s bm1tdH95e/16ffx3cW5samxtbGxtcHb+/PXv7+zs7e/v9Pb0/HpycHBubm1wdXZ6bFtXXVpU V1xaXWhpcPbq4NrX2djY29rb3+js+Hl4cW1ucXZ5fnd3/vz8/Xpyb29tbW1ra291ef338+/r 7O3u8O/y9fb+eHZ1bmxvcXF1eXRlWlpcWFdcYF1lbGt87eTe2tja2Nnb3N7k7O38d3l0dnj8 /X/6//76+/19enNubm1ubmxtcXN3/vTy8e7v7u3v7/P3+v55dXRwcHBwcHRvYlpZWlZXW19g ZXF3/+rf3NvX19jX2t3f4+ry+3hzdXp5ffz8/Pz6+fr6f3hyb25ucW9vcHZ+/PPv7u7r6+3t 7u/x9f14cW9vbW9vb3J0bF5ZWFdZW11eYmpufO7l3trY19bY2dre4eft+Xx3c3Z5ev79/fz6 +Pn3+f56dXRwb25tb3J2fP/59fTw7+7t7e7u9Pv+d3BvbW1vcHFvZl5bWlpbXl5ia21z+u7n 3tza2NjZ2tzf4uju9v94dXd5ev359vj+/Pz7+397dXFubW5tb3R4/vn49vT09PHw8/P2/H56 c3JycHFwb3NvZ2FeXV1fYWVrbnF88+zl4N7b2tvc3d7g4+ru+H11dHV1eXr/+vj4+vf6/P17 eHVvbW5ubm5wdXl9/vz6+Pj5+P3/fHh6eHl6eHp3fHx9/n3/d29ua2ptcHF5fPXffF/o5tnY 6+3s39/sfnjy6vNyb//x9Hp3+vD9cG94fHRtb3p7dHF6enl8fPx/ff7/fnz4+/Xs9PHt7fHw 7fDv7vn++357fn57e3x5enl4d3d3dHd3dXh2d3x+/vnz8e/u7Ozt7e3t7e3v9PT4+fv8/33+ f//+/319fXp6eXd2d3l2ent7/Xx/+n/5+Pv2+Pz6+n1jWtDgUslkZc5Q2uda12t04mT59m/6 dXv+e+32dun9eO53de1jTXfPX+heZs5OzvD8x03N9WTPS9v0XOpY3mHr/FrQX2DRUdTfW9dw 6Otd42pv8F9w7VzpZmjVUdpmaddN2mL763nf+N1p2vZ24ede11/iaOrsVctN0WHy7Gnsb/7x YOVzXdJQ11nbW+J8at5i3lzXXtlf63T4/HDiV81P2Gpy5lfZT9hV4WLg53vVaNpt6nnsb+Bp fOBd3G765l7SVebsVNBN3mlk3VLZaWbSV9zvc91t3Wzo9uxk3F3m9mneZtdf2mPfdvvrZtpX 2Ffje1zjVWheWVZXWVReZl3u7OPa0dPSy9bP09jf3Ov66Wh/+W5x5XN23v5p4/Ve7nlcae5g a/Jpa+H7c95WP1NTPk1GRFnoY3nKzsW+xMq/xM/O3mt7c1BTWVNbaFxe6+555vL86Otpb/1s /flz79/m5Nzf3tzj7Ojt/vV6b374dHB6b3bv7et7P0NUPEpCP0Z3eWLNz8m+vsrDw87P1G1j e1pVXFZUc29m9Ofu5t7++Od9b/R2c+fw+uXk6d7h7+vsdXT+bXl8cG5rb19hZmFxfW9uV0pU UEtWVFdq5+vl1NXSy8/U0tXc3d/6ffdzbnBqd/nt+u/s8O/z/Hzzf3789u/u7/j17O/49Xd4 emVpa2lkdGVge3FlcPpg+fFo6/Xt7dntbeJra2pjVl9cXF1idm7l7ejf3+Dp5evt4u/46+/m 6OLn39/j4ejl7O999236aGbxX/Jk9Vx1aGJke15tZX5p7mr9//r8be5a3Gdv7nzt+ur+5u3o 5m/qbupu31vob2PrWv9r/Gt97nns7G3id+z97fRu2l3bat1w3+p222Pndudv523rbuxwb/Ny ZvNd/1/4ZHN7XeNZ7H78dOhj2V3SXOfnXOJycfn3dvxz6F/ZZvfm8vV2313aXthZ5+le3m3n aNxj+up7dP77Xd5g7H349G7jbXjmcP7zdnJ89WDm+Gjk7mfk9m7u6GN++Wdt/GD0cfNy/ele 2l/m+/fzattZ1VnnbXrnV85U1V7YYOf/cu9i41ncV+Zm/W/vd3bq+2/la+pz9Pdo4Wjz9m// 517cYelj7HRu+XJ3bu9e5Pdr53Z78WTeWd9m9nz+f/DucfD2ePv1aO3vX9xb3WHgaup68n1o 6l3fVuFd/35u8mHdXuF9dexo3V7faupt3mPz5mHaWttd3lzhafb+fmXeWd1e6m9p4FvkYd5c 313dW9dY1FbYXeZv93Zp3FPWWt1j7e9b0k/QVt59Z9dY2l3STMxP3n1c1EvNUeN3bu9f2E7S Wfb8cvFu6Wn28G/362zja+npWNBfbtVQ1F729GPnWtRP1lx82krDQcpcYtBLzVPh/mfeZex5 /vJ1+PZred9Y3/Zc1Vjl71vTWXnVTddrXNFN1mhu9Pps7fhj2FTSXO7pYN1h6f1l32H09GTk av//fnf8ePh2+Px0727ze3vta+x1fvR1/nx8enl+eH7+dvZ3fvl5f/x0+Hp5+nL7e3z4e/37 e/v+e/p++/78/P79fv19fnt6fnt+ev56e316+n37/vv7//z+f3z9eXt8eHp7fHv+fv/+/f7/ /X78fvt+/X9+/nv9e355fXt7f339fH98/v59//z8//v9/Pr+f/x+/X58//79fn5+///+/P38 /f38/vz7/f19fn19fn5/ff96/X98f/99fH58fnx9/n3/fX59fH3/f/78fn9+fn58/3//fH18 ff37+/38+/v8+/z+/f58fn57fH1/e31+//39+/z69vn4/P38/f1//Xt7fX3/e399fX19/3z9 fP3+fv7/fn/+fX58e316e3t6fX5//fv9+/j6+vv6+fr6/fz8/v7/fH9+fHx7fHl8fX5+/f3+ +/36/f79/vz//f5/fv3+//z+//3/fv5+/v18f3x7e3x8e319fXz9fnz+fv5/fn17fHt8e3/+ /P3+/X78/v7+e316fnt8f31+fn/9/f78/3/+//7/fX19fHx+/n/9/v77//3+f/5/f/7+ff39 /f3//n79f//7//7+/f7+f/9/ff5+/f7++fz6+/v7+/t+/v98fn59fH18en18fX99ff7+fv7+ f/7+fX57f31+fX58fX7//f/8/H5/f/79/vv7/Pn8/vt+/v59/37//35+/n7+/n/9ff7//v38 +vz6/Pr8+/5+fnt6eHt7eHt4eX1+/vz9+vv9+/78/nt8eXl5dXd5ff16//Lz6H3v62niX+dt bfJo5l/XeUfZ1TS4TU25PL9Y4277d/vSW9BWxVdZwkHKUv1tauNR7vFi/XRo52LiUtpoZ+BY 3WfmZX3tdPZu3FjPVdpk5fZf11PSUudvS+xe71zCWMzZXs1p/HFu91bqaWvu/GPUYtxf1l96 9l3pVd5J5kXqY1jKWcrt3Nvh3VjRU+df+l3r51nZd+Z352Tkf2R2dnRa6VXxb2l1fX32feRt 4Hxs2k/OVt1s8v/x+33uZtNNzVLTXeZ28vNv9H3oZu1g4WXnX+bu8vPx7G7XVddc52J6+VTT UNlV2lvs6V3UV9BZ5O5e01LXbnPaVtRa4eNV1GH+62TzY95acd5X3V7ZVdNrY9hb2l3XUtVp atxe7X3uX9lvdd72aePkXdzxXenpYWjiX2ngW2baaWDibmfedGHf6mjt6mnw52Z14HB16etz 6+9s5vhr/ORre/BxdvB3aOr6bn7l+fbr++zu/nl+/3x0/nL6e23+em9y9m1xdm1fZV1WX1xa Y2pr/u3n5dfb29bX2dvb397j5+Xl5uji4+Pq8u31cmhjZ2VcXGZfYmpiZvjx6dPdUT9mTThE P0hPX07ew8vNv7/Bv8rTytJbV19ST1NPX93v7tHP19vh9e59XF93a2v38+Tb5Orb3ejp+2x+ ZFticnPt10w2X08zQzxFT/NH7r7JzL+/w7vK38vLXVxlVFNgUFbb43vc09zd62Z09FxYbnF5 7e/h1tnj3N3n7Hpua2xeXmRgaHPh3WY4TGg1QT1GTe5PYsDDycK+w73G3tXOaVdWUldfUVvd 3N/Z19fX62hx/GBeZmz26fzl2N3j5eby63lecmJaW2NZaOd03sxWOeRKOEtAQ1jeR+3Czc6+ y8i9zfPR1VtlW09b8FVq1Nbh0trh1+xda3xbX2Vi+eD47dvf9O54Z3hsWFhbW1xmaWrt4fLq 2NJqSGBUQ0pDSVRjVnPR0MzJzsvFz97i5XhxZF555evt2tjW193q6O9oX2RjY2plbfL0/fh5 fvJfWmxqXFVia3BuY/Pk735+7efs7ntd/WdPXVRUXGFccuHu49nd4drd79vl5ODk7+bf5t/f 3d3f6+nqePxvZGxkaV1ybF/vXGtuYmdcd1xoZ2x3bnD++eZq+u5s52ryder86P7m52fjcu/x ZXH3aWV0ZXP5b2v96/rp5/Ts3/zx433r4XPy42/z6H9q4G5v+XptdOxfcOlhYt9dYN1XX+Rf anLlXHHXV/ffX/ffZnjgcGPjc2vh5V3Z7Wrh93v28m93935a3l13+3R0/npu/3B4effs/+jv eel/+Pzobuj6b+Bg2mLu/nF/b+pm5mD4cWHzcnl3futp73dx8mt+b3xrZd1W2mb17PZ5fOf+ +vB7b+Vn9e1282zra+t4aux2/vDwZ+n7c/r5727kauD67PHzffVt7lzjX+93e339b3blX+R1 7nLu+nXrbfJy413eY+17cfZm52d9dmjub2nlafZ/7/p33GLc7vvu6WjfbOpu5/pm3WDwauVf 7Xtu6WLiW95g+Hxxcu9t8nzvcOxu6WfoaehwefHyeeRq6G/tbutp9flt3l/cXd17buJn7G7+ eXL4aPN4ZNxe3l7XXd53617XW+/vY9xZ3F/q5F3mdvd5ad5b217jXOV5cer4btld4Wv96WDj Yd94e//7efh6+3Pmdv/+9//z9mvt+m/1a+9o9Xhj4lzdZ+z98etv7vzqZOR2a95e42Xja3zj XNtf4WLfY+Vk5GR5207MTthrcNtUz1rla+Fl5nl392vfX/jqXtZZ3/pr32jne3/392fhX+Vt b+9q6F7aWNxqe+lj21naZ/nnYeJveedo6f517XH1/n78d/Z2+H17/fJr63xu52bpeH3wbfJ9 dPV9dvF5//V59P/79H76+X/8/v57+355+318/H34e/z5fvr9fvb9ffl5+/99/n1/fnn4fv/+ fPZz83z+93/4/P/4/nz1dvx9/f94/Ht9/338/f39+338f/z8//79//38/vt8e317e3p5fXh7 fHt8e/z9f/v5/P78/v5+fnt8fnt9fHr/fHz7fP98fv97/vx7fn99/f/9/f5+fv19fnt+enr/ /3x+f//8f/z9/fx//v9+en9+eX17fHl7/318ff7/+/7+9vv99vv6+vv9fn/9ff39/v1+fX5/ fn7//Xz8fn/5f/v5f/t9+vp9/Hx8fn7/enx/enx///19/v79/f38/37//Xx8fn17fHt7fHt9 fX59fvx/fv9+fv/9/n/9fPz8fv5//X7+fnx7fnp9f3p//3z+fn3+f//+/H18/35++/59/f57 /vx///v8+/z8/P38+/z6+n9+/nv//33+fHv///78/v39+/v9+vr9/P99fn16e359fX19/3r9 /nx+//7+/35/fX//fv39eH3/enr+fHn/fH79fv37fP78/vr+/n7//nh8fHh6ff56fP5/+/z9 /Pz8+/7+/X5/fHp5c3F0dW9u4eLq3mzSXWzdUe5L3PJ/1enl3+9f2V/1Y3l+XeBQ3W9i62Xg XthY3ff361/cYvD7ZONvauhi2Vzu7vNy8W3eWdld32778WzhXtpged5k4WPgcuz1adte427+ 42LfYuN07Xru42/sXFlIY1BMz1rU19/S1Ovc5vd973Zz7vx7duJj6flr32v1en13ZfpoYfpg af9sb/h7cvB39nzse3Hpau1r6XJ28Gzea99s4+5++Oj3+vT48/vvaeT/b+1x+X3ycffwbepy 727ubm3zaP9sbGl6aWT8bm15/W/0fHTwf3h28nJ1+XP98Xj86fj44+jv4eTq3uru4e749vlv eHNvcm5ybXxrcnl0bfd1bPBu/fHy6NzdYkny8jlNY0FLTVV1f2nRxNPMvsTIxsrN1Pptb1VK TlFKTVVcaWr22dzj1NDd39vm7/9uem5icfhueujt7+nu6ex28+xs/+RfPkrfNDfuPUBcWN/Z 4Mm8y8y6w8/Jz9/zX1xpUk9lX19g+Of96ufd9Gvtflxeb2Vgdu7t6uLc3eLe3eft8fdwbm1r c216/vPm/tvbU0R6Wy5JYDRLXF3r387Dws+/vNPMyeByal9YWVFod1v73fTz2ubt7npvaFtb ZVxedX39697f4d3d4ezo8XZzbXBvbPb7durt9Orq9OLjek5F6T4w7UM4cmlw687Jx8nJvcvX ydhoZ3NZWF1kcF/94H7w2+b17/loX2BfXV9nc3H+5+vl4OHi6u7tfm5+dGt2dfR8eefue/Xj cW7v7PteSVh9MkTWM1DbWm/YyNjKy8bF3crPb3juZVZ4amBxbfL7feLm/fjuaV1uYVtoamhu /u3v6N7i6Obk8fX493Br/Gtsdnl7cO76bO7zZe/h/mNPbVc3Vmg3XuJSZdLP6crJzMvQy9z1 5PJfaPVgYnxwb/jt8u7393pnaGpgX2tmZ3N+9fTl4+rm5er18fZ5dW96d2p89nb6+Pj5d3X0 /2rj6lZT7Uc67Us753dN+87n48fOz8zN0eDe5Hls+3Bfdm9ke/d98e/7/3ZtbGxlaGtlaHJ5 fPLr7u3p6+/r7ff3+3l0b3l6cPzycXnxcmfu+WTt7GdTcls8XWE9ZedQX9HhdcrN2c7M1t/X 5vvy+HBnem1hdn1ufPJ0dPxza3dxY2txZ2n+/Hns6fLt5+vu6e348fx6fXd+dXR8cnF4fHF7 +W7/6XFgb2FHT3BGUOlZV9/eadTN4NLL19/U3/7k63B3+2lo/29t7/t19vdwdfxsanFpZW1x bXn5+/fv7+/s6ers7ff7+n17e3x6e3h5eHl3eP92evp9bGhaTV1aS2Z3WGLf+W3U2OLTz97d 1efq3el+8Pdocn5udvx2dfx3cf58cHV5bW14dnZ+/f348vDs7Ozt7O72+vr5/f3+fXZ0e3d1 ev96ePj1/mhaV1tWU15lW2D4eXbf297X0trc2N3k3+L08PNvbndzb3t+dXt8d3x9dHV8cG10 c3F4fH399/Xw7Ozs6+7v8PX3+fv8/ntzdHVzdnd3e/z39W5aWFxXVF1nXV5+/nnj297Z09nc 2N3m3+P19vltbHVzdX59e/9+fPv/dnl6b21yc3R4eXz8+Pbv7Ozq6u3v8PL2+v3+fXt5e3hz ff94f/f49fRpV1tdVVdjYVto/Hfz3dzc1Nba19ng4d/t9PR0bHBycHv+fP34//n0/H//em9x cXF0d3t8/f307u3q6uzt7/X3+f9/fHp2dXt5fH7//376+fLveV5ZXFdUWl9dXnB2eufe3djV 2NnY3N/e4+70f21rb250e3x9+/59+f18e3hxb3FucnV4fv358+/t6+rs7u71+/r9e37/eXl9 e3Z8/n3//v779fB3XVteWldgamBl/f79497e2dfc3Nrh5ePr9Pp0bXJyc/33+/Tu9/bv+3t9 dW5tbW1wcnN6ffv37+7s6u3w8fj+/n58enh2ent6fH5/fX7//fv6+HhfW1xaWF1lYGN1/vbm 3d3Z19rb297j4un2/nlub3J0//v9+PT59/T5fnx4b25ubnFydnx9/fXx7+zr7e7v9vv6/X58 fHRzdHBzeHZzdXd4/vj1+mpeX19cX2hmZG99f+vh4tza3Nzc3uLh6PP6e3BudHn++f338/v4 9fn7/nlxb29ucnR0en799/Du7u3u8PT3+vr9/354c3N0c3Z2d3d6e3r8+ffzc2NfX11dZGlm anh9+ejh3tvc3Nze4OPm7/l8c3BzeHv5+Prz9PTy8vZ/eXJubm5vcXN1e//68e/t6+vu8PT6 /X17d3Z1cXNxc3h5d3d9/3v99vn+cGRfX19fZGtpbnv87+bf3tvb3d3e4ebq8v55cGxvdnv9 9vPy8O/v8Pb8fnVycm5vc3V4fvv38e3t7e7w8vj8/nx3dXVycHh4c3z//f74+P73+XtuZl9e X19hZmpud/Xt5d/e3dzd3t/j6e72fndyb3J5/vr07+/u7u7y+H98eXNxcG5wc3d8f/f08fDv 7/b5//98eHh1c3F2eHl/f3p8/31++/n/b2hkX15gZWhsdX747eji3t3d3d7g4+ft9X95c29x dXv99vP28/Hv7/L2/H13dXNwc3V5fv779PDv7+/x9Pj7/X17eHNwcHR1d3h5fH79/Pz5+n5v aWNgYGJnaWx0e/fs5+Df3t7f4OPm7fL6e3hzcnN6/fXv7u3t7e/x8/x+eHNvcXJyeHh8/Pz3 9fj39/5+e3p8enl1dHZzd31//v77+Pr6+H9xZ2JfX2FlaWxyffbu5+Lf3t7f4OLn6vD6/3Rz dHV7/Pb17+7u7u/y9/t+eHRxb3BxdHl7/fby7+7w9fr+f3x6eHdzcXBvcnd4fP79+/n5+Pl8 bmdkYmFlaGxudXz77uji3t/e3+Lk5uvy9352dXR2ev369/Hw7+/x8/b8fHp3cnFzc3V6ff36 9/Hx8vH3+vv8fXl5dXRwb3N2eHz9/f77+/t/bmdiX19gZWlrb3j37+rj397e3t/j5unv+H53 cXF0eH759PLv7/Hy8/j9fXZzb25ub3ByeH758/Dv7e7y9Pb7f35/e3Z0c3R3d3h6eXz//fr5 /HFnYl9eX2JnbG93+/Dq5N/d3t7f4OTo7vT8eHJvcXZ7/vn18fT08fX6+353cXBvb3Fzdnv+ +vTw7e3t7/j6/nt5enZzc3Bxdnl7fv78+/n5/HptZV9eXl9iaGxwffft5+Le3d3e3+Pn6vD4 fHdzcHJ4//r08O/w8PDy9/97dW9ubW9vcXd7/Pjx7u/u7vL1+///fXh3c29xcXZ5fH79/Pz6 +PxyaGBeXl5gZmpuefvv6OLf3tzd3+Hl6u7z+nhzb3J1ffj08/Hw9fb6/H13c29tbW5zd3z+ +PTv7e3s7vP3/np1dHh5enp6eXl8fvz/+vf9+n50aGNfWllcYWNqe/Xv6uLd3tzb3N/l6e34 fvx2cnRxe/718e3s9Pf0fHd5d3JvcnByef/8+PX28/P29Pf/fn13d3r9f/nx+/n6/Xr+/Hv/ +/t/dWJdXFhUVWFjZv7r5uTf29na29zc5Ozu831weXFreG9+9PPx7ev2fvt9cnZ0dXF4e3r9 +fX18fX18/f5+f5ydXluamH79m737/r773b663t36PFtYVtaUk9PW2Vld+Xe39vY19nc3+Hn +Xz6/HZw/Hx0+nby7/b39f5ubWttbG9x/v5/9e7v8O7u8fTz+Pbz+Pv7fXr8+/949vlzamt1 aWNy+PH58WxQVVNJSFFaX/vt2dHR1s/P2d3g6vX+aXjx/G/26Xvvfv7v/G1udmZkZGtvfXr6 7fH39O/19/78+f5/9vTv9f36fn17e3z+dHJraHNrZXX+eOnsZ01NUktFS1xs7uzazMvU1dHV 3+75+PNvaPnn9vju+uvzZ3T9dGNoam1taHT38X317/L5/X378v579erw8+7s8/19d3x1cnB4 c2xtaW5qa/338997S0pQS0NGVGjg4t3Nx83X19fb5XFr6/Judebh6ep9fehsX2lwamZmZX18 b3r08vX7evrw/Xb68u/w8PHp6PD6fvd9bm9ubnpvaGlv+HN0fe3k3/9JRE1LQUJPaNfa387E ydfb3tvgb1755PX96+Da3vpo+fZcXF5oa2xibOvwen328u14a3ru9Hv87unn7Pfu5/ZwcHR3 d25wfft6am9z9nFjb+vh3mxAQ1RIP0dR9s3W4czCzNfk79/ca1zv4efn6+bX2npoaWVkWlVd cHlpb/7q6X5tfO7ufG375+j4/O7l5/v+8uzydWtvfXVzbXF/f29nc33xfX7p3uBMO0VQQEVK W9LG09vFxs3Ye2be3mBf7+Pc2e3s2NxsXlpdYV1XXfjw+Xv37OXzbHTz83hycvPl6/rv5+fs +Ht993RscnVvfvpsa3pxam9vaX3r6uZmPz1WRUJOT+nMx+HMx87R32Nv2fFo/+rl09v46dv2 Yl9TXWFfWmjx9e3//fLqdW14fvj5/v/o5uru7uvo6/12/X10cWZq9vdsaXLvemFldHv+f+r7 RDxKSEVOT23NxdPPys/P2Wlf5Ol6+Pjv1tPq7uLvamFVVF1kXWJ6/evxfHn3/3FzcXr48/vw 6OXo6uz17/R9dHh3d3lwc3r2eGdocm5rbGN77+DnUDxAUENKTFjaxcnZy83N0etadd7u9/T6 3s7Z7+nmdWdcUFZiYl5vdPjo73N5/W90c2537u7v6Oro5Oj47+v3+31vam97bnV6bP57Y2tz amd1+eXcXjw9T0RJT07ixsTWzM/Rzt9bYuPp5+r+6c/R4vPwdGhgUlFcaWdydXzs5/ZxenV+ /Hx09Obp6Ozr5+Xs/n36/31/dHP8+nJwa21rcW9vbW/u99/nTDlBTkBSTFjYwcnUydTPz+dW dOXr4OJ74c3W5u39a3JbTVJcXmdvbH/h5vh8b279/mx27enl4u7q4ufv9fP88/Vwb3t0dfZw cnpzdndmYnp3eejmWT87S0VLU0/izMHQy9DU0NtqXuzu4d/r79XR3ej3cW5qUk9aXWVwb3Pr 4vP9c2t393Ju++7p4+ru5uTp7vP58/B8b3dxcXl4/npqbP5wZWtveujmaUo5QkxEV0571cDI 0MzZ0tjtWG7u6d7g8uHQ2OLwdmhuW1FWWmNte3X25ur2d25q/3t1efLp5OHt7Orr8fX4+O7z d3Z/ent0dmprbGt6bmpzfv3o7FU+PE1ET1dV3crB0MvX2tTfZ170+dzb6OzX1N3k/2poZVRV V1tneXd58O3u/nRqc/58ffnt6N/k6ujn7PP5/vX3dnn+dXZ4dnNqam5tbGpwdvjs6nVLO0FM RVlQadbFyM/N3dfX6V9u8+za2+rj09je6XNjZ11UVllda31vf/Hu9v1vaHd+//3v7ebg6Ojp 6+/v8/n8+nd0fm54+XVvenJtbGdkc3hz8/ZuVUA+S0ZVWmLfzcXPy9nc2998a/T93tvi6N3a 4eH5Z15dWVhbW2V48vT18vn3em1sb3n68+7q6Ofn6Ovv8e7z+n1xeHx1ff16/nhuaWxqaWxn bX3j81o/PU5FWVRY5s7E0Mvd29TcfGb8e9za5u/c2d3d+mBdZFtZWlhjfPV9fvr67fZsann6 9e3y7+Hg5ezx9vX0/nz+fvr4dnF9eXNsaG5va2Vnbnjz9HBWQEFOR1hWYeDOyNLM2trX3/9v 7/zf3OXo3Nvg3/deXWRaXF5bY331dPt3c/j8cG97fu/p7/To5+fm7ffy7ff3f292+XlvdHBx dWtlamlkanNn/OTvaks/TEtOW1P938rNztHe1Nnfffr+89zm7Ovg4eDtXVthX2JjXmN+7/f4 e3Xz7np1fHv37PD97+rr6e74+PD2fXpyef7/c3J5cG5taGRtbWxrcffn61dCRUxJXVNc79XL z8rc2NTb4PXzbOjj7ezq5ejefWJmX2FkZF5mcnT8/H558PH79n97+vL68e/47erp7e7yfnt5 dXBxcHNybGxpZmdubmlrcn/v72hMRExKUltWeOzQz8zP2tLZ2eLre23u/PDv7+7s7Ht6bmtp a2xkZ2ZscHv5+O7z7+/z+n76fvn5+vX07u3s8f56dXd1b2trc3FraWRoa29tbHj+6PZZTE5O UV1XaXvk1tHO2dbY2tnf6Xl+d3f1/Pr/+3r69Xh3b3ZvbmpnaGp4ffx+fvb27vHz9/r3+vX6 +/v7+fz7e3Z2dHZzbmxqa2hqbW5vcHj68fpqWFJVVlxaYWty6N/Z2tjY2dXY3OLt9nn9fHl0 bG1ve33+/X/4+355dW9udXl8enh5f/z69/r+f/v6+Pn+/v/8fnx9eX1//v97end3enp2dXJ0 e3x5bmFdYWJfYWlmanr79O3n5eDb3Nvc3+Pl5uzw+XJubm9ucXhydXl7/v5/ff5/ff96dnV5 fX76/vv59e/u7u/v8Pb29fv+fnh4eXJ0dnR1d359//x7a19hYl5eYGNfbHR78ezm4dva29rd 3+Dj5urwem9sbG9vcHN4fP74/Pv6/Pz+/3dzc3Byd3l7fH/68e3s7e3u7u3y9fn+fXl4dnZy dXp2dHZ7fX5+b2FgYl5eX2NhanR69ezo4d3b29jb3t7g4+fs/XVzb29wc29weHv9/P759/79 /nl4dXR2en9//fjz7uvq6u3u7u/z9Pj8/3p4dXJvb3F2cnJ4e334+XFnaGhkZGhoZ3B0//Lu 6OLe3dzc3+Dj5efs93l1cm53eXd9/v34+Pn39vf6/Xx3dnZyd3d2fv358e/s7O/v7/X49/n9 fXl4d3V1dXd4enx6fP34+n1sZmljYWVnZWx1//Pt6+Xf3d3c3uHk5+rs93t2b2x0d3p8/vr4 9PTy8vX3+f57eXVzdnV5enz8+fPw7u3u7/P1+vv/eXx4d3d1d3V2e398ffz69vP6cGtraGdq amhrcXT/8e/s5+Lf3uDg4ufq6+/8fHV1dnh8/f5++fb08fH09Pn9/3t6d3V3d3r+/Pj08e/w 8vX4/v9/e3hycXV2dXZ6fH5++/769/by9fx0b25taWtqam10en/58O3o5OHg4uXn6+71+315 eHp+/fz49/Tv7ezr7/P3/nl4dHFxb29ydXh+/v34+Pn3+n/+e3d5dnR1dXZ4enl6fH7++vj0 8/f08/p9e3NvcG5sb29veHz68/Du6+nr6+z0+Pf+fv1+ffv29O/u6+vr6uvu8PT7/3p1dHBw cXR2eXl5eXh7fn56fHp3dnp9ent8fv57ef1+e3/8+Pr59vTy8PT4+/t8d3Z0cW9zdXh5ffz4 9PL09vf29vb29fLy8vDu7+3t6+zt7e/y9fn7/nx6enV4d3Z3eHZ2d3Z3eHZ4dHFydnZ3dnh5 e3p8/f38+vj08vPx7Ozu7e7z9vn9/nt5c21sa2prbW9vc3r/+Pbw7u3r7O3t7u/v7u/v9PXy 9PTz9PT19/n+/n56eHRwcm9ub29wbnFycXR1fnz//f7+/v//+/r6+Pr3+PXz8/Lx8fT4/Pv+ fHx6eHh4d3V2dHBwcnFydnV4fH1///r49fHv7O3u7O3u7e/u8vT1+Pn6+v3+f3x2dHNwb3Bu b29vb3F0dXd7eXr+/Pz7+/v6+vv8/fr5+fb4+Pn3+fr4+vv8/v98fHp5eXh2d3RzdXZ1dXh6 eHl9f/76+vr3+Pf39vT29vX6+fr7+/7+/f////9/fn59enl7fHx5d3d2d3d1dnh4eHl4fHp+ fv74+vf1+fn6/P39f3x9fX18fXt8f3/+/3l9f3l7/n59fn7+/v/8/f37+vn7/Pr8+vv8+fv9 +fr7/Pz9+/v9/P98fHl6e3x8fHt4dnl5eXt8fH59ff5////+/39//318f3t+/f79/f5//35+ /v7+fXx8fHx9/vz7+/z8/f/9/n9+ff////39/P39/H9//v3++/v7+/3///9+fP3/fX5+fX7/ //5/fn1+fnp6fHt7e3l4eXl8e31/ff79+vj49/f6+fn/f/5+f3x8/v5/+/z//vz9/v/9/f79 /fz8fn79fn1+ff99fX19fn1+/31//v/9/Pv6///9fXx7fnl7fXx+fHt9fH5+/n5+fn5//v5+ /v1+fH19fHz//f7++fv9+fv6+vz8/vz+/nx7fX1+fH1/f/9+/v3/fn/+/P38+/77+v36+/z9 /n59fnx+fHx6e3t6fn59fv7///5//n7//n5+fv78/Pz/f358fn//f31//n1//37+fXx9fnx7 fn19fv//fH7/f31+fn///vz9/fv6+Pf4+vn6/v/+/31+/31+e3t+f35+/P38/v38fn7/fv7+ /fz///78+fr8/X///31/fX78fnx//358e3x8fHx9fXt9//99fn99f358///9+/z9/Pz9/v79 fnx7fHx8fHp6eXl9fP3+f/z8+/z8+/v8/vv9f/39/35+fv78f/39/vz8f/79/Pv//359fv// fnx7eXl6eHp6fH98//79/P36+vr5+fj4+317fn15e3x5d3V5eXp7ff9/ff78//7+/v1//v7+ /v/9/P39/f9+//59e3x7en58fXx+fnv+/33/enx+fH/+f37+/f79/fr4+/r5+fv7+v7+fn1+ fX19/n3+/Px/ff7//v79/P/9+/z9/vv8/v5//X97fX1+f/x/f/9+//59fX59f///fn9/fH59 fH59fX1/fXx/ff3+/v7+/f3+/v7+fn9/f3t5fXt7fH7/fP/9/v7//Pz9/v3+//78///+/f5/ //z9/fz7/fv5+/38/n18e3t9enp9e3x8fX//fH5/fP99/v1//v/9/v37+////359fXt8fXp9 //78/Pv/fX57ff9+/vv///v8/fz8+/r7+/3/f3z++/z8/f79/f78/n1+e3t9e3x7enx8fH1+ /nx//f38+vn7+/v7/X98fH58enh5eHl6eXz//v3+/v3//Pv8/Px/f35+/318fX57fn56e3v+ fn3+f/3+f/58ff79/Pz7/fv+//3/fn/+/3x8fv9+f//+f33+/Pv7+ff4+/v6/P1/fn17fn1/ fn7/fv3+/Pn8+v7+f319fXx9f31+/35+f399/f3//n/9/f/+fn5/f/99ff99fn3/fX59fH17 e359fP7//X59+v39+/v8f398enp7e3x/fH5/fv1++/f8/vv9fH18fHt6eX39f35+e31//vv9 /f/+/fz+/f3+/Pz8/v39f/z8/v9+fH5/fH/+//z8+/z++/r9fv5+/3x6fXt6eXx+ff7++vz9 /P79fn5+f3t4fXx7eX79//7//f7+/X19fX5/fn19fX16e3/+/fv7/P7+/v19fv58fn57fv5/ //37/H59fXx9fnx/fX19fH19fP9+/vr+/vv+/vv7+/19/n59/n7+/Pz7/f38fn/8/Pr6/f5+ fv99e37+/f/9/P7+/n99ff///v39/f79/v79+/39/39+f35/fH3+/v79f3x8fHx8fHv//33+ /35/fX59fn59fnt+/v3//vr9/vv9/37+fn//fX9+fH1+fnp5eXx9fXx//n79/Pn6/fn6+/n5 +vv9/f5/fv//fv9+fXt6fXx9fv/9/Pv8+vv7+/r5f/5+fXx5e359fX///n19//7+/v///n9+ fHt8fHt/f/7/fH99fH5+//99//z//v78+/7+/f7+/v79/v38/f38/f7+/v/+fv39/f3//f99 fn19fXx9fHt8fXz//H/6+Pz8/f3+f37/fHx+e358e318fn5+fXx9/3///3/////8/P7+/H5+ fXt/e3t8e////vz9f/79+/v7+/38+/39/v/+/X59fXt5ent9fv/+/fv8+/j7+Pf6+vz8fn17 fHp6fHl8f/99fv58e31+fn3+fv77+/n6+/v/f399e317enx6fXt7fP/9fv3+/f3+/f/8+fv5 +/v9/v1/fv5+//3+//5+//3+/f39/n19/359/35+fX3+/f/+/35+e31+fP////9+f/7+/v99 fXx8/n59fn18fn18fn1//f38/fz9//z7/f3+/v3+fv9+fv9/fXx//P39+/v6+vr+fn5+fHp8 enx9fHx8fX3///79/v/+f3/+/v5//39+/39///5+fnx+fHx9enp6en1//fz+/Pv7+vr5+fr8 /Pz8/v3/fX18f35+fXx8fn5//v7+/f39+/r8+/v8+/5+fX9+f/99fn5+fn5+fn5+fn1+fv/+ fn18fX99f39//v/+//3+fv59fX5+/318e3x7ent8fn/+/f77/P78/v3+fX5+fX5+fnp5e3x+ /vz9/Pv+/v///f78/P/+/fz+/f3//f5//n///f//fn3+//37/f79+ff1635X6ORS1VHQ/UzL R87XUmnXVdVd8eZd42B3wlNIzUTF6Fxj/N5rYOh59u5c52Ld31hl4/r67WL0f+hzeuNY5eNd 7XrxeW389n90dHl+83F9c/z9ePh6//x3+fp1/H78+n/+//v4dvz4fHx/eXl6en54+Xx9/Hz+ eXr9evz/ev59f357/n58/X38/Hv8/nn6fH1/efx9f/x8ff99f3x+fnt8fX19f3v+f35//f3/ +v37+f38/n5+fXt7eXl6enp4d3p8fX1++v38/Pz29vj38/X6+fj8//38e3t2eHd1c3F3d3l7 d3p8f/39/v36+fj69/j49vr5+fn7fvz/fHp5eXV0dnR3eXV3eXV3eHp+fX99fv39+vj49vXw 8O/u8O/w9Pb7f316d3NycW9tbm1vb3F0d3p4ff7/+vj59fj19fXx8fHv7+/u7+/y9/j8/nx3 d3NwcG5tbW5tb3NzdXZ0d3h6fH7+/vr5+fTw7u3t7Ovr6+rs7O/1+P99enZzb25tbWtra2ts bHBwcnV4en1//fv8+/n08/Du7u7s7Ovq6urr6+7v9v1+enhzb25sa2ppaGhpaWprbG1ucXJ6 /v328vHv7ezq6urp6err6uvs6+3t7fH1+396dHJyb3V0bmtoamZiY2FiYmNnam50efzy7uzr 5+bl4+Tl5OXm5ujp6+7v8/X8fHZvcG9sa21rbf5savtuaGZjXGRhX252bP75+fDs7uTg6eTf 6u7q7e7o7O7o7u7r8PT1/3t4b2pta2Zoa2ptb292cmZkZmJjZ2lqbW5z+/Pv6OTk4+Hj4+Po 6Ojs7vDv8vLv8fL2/f1+eHZybW1raWhoamttb29zb25va2tqaGlqbG91f/nw7Orm4uPi4eTl 5ujr7O7z9PX69vb09PX5/f5+enh5dnBzcHFtYlxdWFVaXFteZ2lv9e7l3dzc29vf39/l5urw /XpybnV2evr/enl5ev35/X58cm1vcXF5enZ5d3p9/fv38vb6+v39+/v6/nt3b21raWloZ2Zn aGtwdv/28O3r6ejn5ufm6Orr6+zu7+/v8fTy9fn7fXx5dnJwcm9uc3F4//v6cVlSWlVQXWZb Xm5oed7d2dHT2trZ4d/d6PD7aWBnam367PX29Hv97u7t7vxuaWdianNxeHt2dfz07+bj5ufr 8/Xy9/L4fnFfVVBTVVNcX15faXb539vZ1djc39/k6ur2/W9kaGxwfevn6ubq7uvr7u/weG1q ZGVpbXJzdnR8/fTs7ezr7fX6+3/6d2deWFFTVldaYGNgcnzv3trX1tXZ3Nvh4uPt/G9qYmVp b/z49/v8+/ju7u/y/HJsa2ltcXN6fX5/+/Lv5+Pl5uv0fHNuaWpra2pjWlBKSk1RYXff3t3a 39ra19jd3/t2cXD68+32+3x49u3l5e3+bmllam9yeXJ1evzx7Onu9vt/+fjx8vn/cnN1eH58 fHpwb3J2fXxmUUZCQkdUdNjPz8/V1tfV19zkdmlla/zq3uPp/G96cPv3/XZpa2ly/fbv+vx6 fvnx7fb5enf88ujl5+7+dG1xd/36e3Vqa25teHV4dWBPR0JDSlbv1M3N0Nbc3t/i5fB6dXvw 5N3b3up8aWlpbX11e3VxdX38//10cHJyf/ny+P57efrx6ebn6/L6f/36+fj/d3FvcHd5dG9u cHh5Xk5GQkRLYN/Nys7S3+bs5+Tk6f33++vf3Nne539uY2JpaHlvdHhve3R6b25taXN69/Xx 8vr2+/Lu6+ru8/r49O3q7fF9dW9wc3N2b29vcf32+19NQz5ARlnfz8fMz9rk5uvi6+/8efLq 3tva3efwd3BqYGFeX2ps/fP3/nJuaW90evp7f//89fDu+fh+fvXu6enq7/X4fn56dHJvbnV2 eXxxcnB3fXtlU0ZBQUVZddDJzczZ3e3r8/zuee3n4drb2+HofnJuX2FdXWdtevTx/Xhuam51 fPf3+vX09O7u9Pt9ePz48uzt7/t9dHN2dnx7enNtc3R/9/Tq4+JpRz06O0dY1sPFxs/a7Ov0 d+9sd+rh2NbY4Oj8e/F+fWxeWVlfafz3e3hoaXB4f/14bXN49OXk6PB+d3/y6uTn7e/z9PD2 e25nYmNtevPx//9vb3p593JcTT9AQkl468zLz8/c2u7pem73ft/a1dnd5v3vfPp9ZF1VWV9u 6+vs+WtsbHV2eXJuf/Ln4ebvfHJy+u3r6u739vb1931vaGdsd/n3/nRrb3l+59/cbT87OzpT etLCzMzY0d/n61hgYf3Zzc7b3fz/6e3veGZaYmhhbWtdZGZr9vd/bnFqdO3x6uru8ezr9ez3 //X06+nm7PP6b2pmZmVufX7+dm5ob3j/8/RuWk4/P0dJfODUzdLP3NTpc3difOnY1dbY5efo 7/p4amFlW1dlYm7xfvN7/W5x/2x///Tp5uLs6vh5+n/7/fTx8O31e25ranB+cWtsaXf5f3xt dnTu2t5yPzY+PlbZ6s/azMzKy2VkVV3t29Tk2t/e093yYGFeZ+92aFpcXmn8YmZlb/fu7213 ffLn6vF8+O/r6fZ3efPq5uXvfHRva2tnY2htdvV9d/3//X55a3FjUUw/Q1BT7+/d1tPK2Nnv aP995uzi3d3V2d3r+31vfG5mXVdZYnRocW938PDybnR5+uzy8fLm4+jt/f757/X8+Pv5+vtt bHdscW1oamtvb250d3Xv5/RjRjlIUUt8XN7PxcTf0fDw4W9rXefc29Pj393b6mtqXWZrX1pZ ZWpteGdu+vL/a3Z0+Ov58u3i5uzr/O7s7vT67e3r8nRwcm5lZmhpbHRtZ21xfW9zbnrucF5R SUZYVVRt/tHTzNTf1OLkd25//N/r6+Tf3OTpeHFrWVpfX2Ru/Hvz6v/7fXl4df929u3x7ezr 8+/y/vr8+3/38nz/fHd0bmhpcnNpZW1wc3Bwb+/g/GpMQVZWSFFZ3NbP0eDKz9jsduv96W9n 7ePd7ebm5+RiWmJiYFxjaXjqfX3x6/F2fHd+/HR3fe3w8+3w6evv+/7v/npxb/x6bm51dm1u a2ZvcGppbnl6+/Dwd1lMVVtMVFt84t/X3s/Q2dzm3OTr+W/z+fH9+/x79mtubHX/cf9yen90 dnjz+Pr1+PL3+Pr58PX49vb3+vl+eXpyb21vbGx1b29qbHBscGxzcXd7dfHw6vJbVWRaVFVa e/zj6eLV2Nbb3Nvf4fp8fnNuaG1udv579u7p7O/1fX1zbnJ0fHt8//719Pb09fX5+/17e3l2 dXJub3R0cnl+dm9tbmpqa2twdXx8fPz57u3t7O3v/3lvZ2hnaG1vfPbw7ezn5ubk6Oz0/Xx5 env8+PHt7ezs6+zt7vb9fXRxcXFydHN1d3h6fn/++vv7/nx7eHd3dXRzcnNzc3R2e3p8/P78 9/X5+/b18vDx7/Hw8vL0+Pn//3l0dG5vbm1wbnF1dn1//Pn08O/w8PDy7+/w8fb19Pf49fb3 9Pb4+Pn6/X58eHRxb25tbm9vcHBwcHN2e317fX58//v5+fn4+fz7+/r7/P1/f/9+ff/+fXt9 ff/6+v59fX99e3p4d3Z3eHl6fH/+//z8+/z7+fj29vb29/X39vb5+fn4+f38fn19enp4enh2 eHd4eXp4eHp6enp7fHl7enp7ff9//fr6+fj29vj49fj6+fn6+vv8+/1+fX17d3l7ff9+fv99 f/z+/n99/3p8f3/+/fv7/Pz6+Pf49/T39vj8/Pz/fn58fXx8fHp5d3l3d3p5e3t8e/7/ff5/ fn55dnp6fv/9/v/9//35+fb09/b19/z7+v9+fn16eHl4eHh5e3x9fn79/fr6+Pb6+Pf4+Pr5 +/7/fn5/fX5/fn59f358fX3/fv9+f35+fnp6ent9fP97enx7fX3+/v7/+/j7+vr6+/z7+/5+ fH3/fn1+fn7/f3/8+fr7+Pz8+f38/Xx8e3t8fH19fn7//fz+/f5+/v5/fXx8ent8fH7//v3+ /359fX1/fX19e35+f39+/fz9/fz9/Pz9/P///n59/H///X78/f79//79/f7//P3//fx+ff99 /357fHh7fHt8fH7//Pz8/Pz9/f3+/n5+fHt+fXp7e3x+fXt8fX5+//z7+/r8/fn8/f58fXt6 eXd4eXp5fn19/339+/39/f19//58fv//f359fn19/X1+fnz/f31+/3t+fv/8/v3+/fz//X7+ /X7/f35+fX5+/v/9+fv7+vv6+vz8/v7+fX18fHp8fX7+//3+/P39+fx//v9+/v1+/fx//n/+ /n/9/n5+fX18fn1+/319ff/9/f7+fX5+fXx7fnx+f3/+f//8/f39/v39/35+fX18e3x8e3l6 ent+ff///v9+/X9+/f7+/fv9/v9+fn59fH1+e3x9fH1+fn59fn7//v36+/z8/Pv8+/18/X19 fXx9fH1+/v/+/fz5+fj4+fr+/P39/n9+fn58f3x9/35+e31+ff39//z7+vz9/Pz7+/39/v39 fH5//vz9/X7/fH19fH18e3p9e3x7fH17fH19fH1/ff7+/vz7+/v8+/r+//58fH5+fnt7enp7 e3x7fXt+///9/vv5/fz8/fv8+/n6/v3+fv59fn99fXx+fX/9f/79/f/8/P7+//z///7//v7+ /fz+/v39/fx//35+f3x9fX7//35/fX3+fX17e3x9fn9/fX19f31+f//8f//7//7+//7/fX19 f/7+/v59fX19/v79/v7+f359fH/+fv/+//7/fvz8/Pn7+/r6+fv9/P79/n5/fHp8fXt9fXz/ /v/6+vz6/Pv7/f3+//99f39+f37//v39/Pv7/Pv7/P39/n5+fX18enp6enl6enl6en1+fn7+ /v38/Pv8+/z8+//+/Pz+/f7//39+fnx7enl6enp7eXp5eXh3eXp5en79//n6+/r8/Pv9+/r9 +fv79vb5+Pn49fX09vj6/f97d3Zzb29vb29ubmxtbm9zeHx+/f36+fj18/L09fT19PPx8fDu 7u3u7e3w8fb8fnlzbWxqaWlqaWdlY2JgYWVobHN8+/Tv7Orp5+fo6u3w9/19fHl4eXZ3e3z7 +fXx8/T4/nx3c3BxcXFwcHBxcXJ2ef/9/f3//nt8enh3eXh1c3JxcXd5//j08vLv7+/u7/H0 8/f5/P5///5//n58e3l4eXh7eXd6eXh6e3p8//z6/Pp8eHNsaGJfXl5eYWdtffLo4t7b2tnZ 2tzf5evy/X53dnl7/fn4+PX3+Pf9+357eHNuYlhRTElISk5WaunZ0s7Mzc7Ozs/S1t3ubF5W UVFUWWBx+O3r6u3y7+/r7ezu/nVraWVobnnz7OTl5+nt9Pv39vf3/H12dG5wcnd//Pl+f3Ry cnRwaWleWVZTVVVcZ3rq39nY19ja3d/j6e37fG9sbWx0/u/m393c3eLo8n5ybWtrbG10ePnu 59/b19jkb1BCPjg4Oz5NXd3MycLDwsLAwcHFy9N1WElCQUFITlpw7ebf3dza2dXY2uL2alxc WV1ld+3q4ePj5eXj5+Pn6/V/eW12e/bt6ODsZU1EPjc5PEBSds3JxL/EwsXBwsbFzt5fTkY/ P0BHTFr85tfRzc7Oztbd7HpkXV9faHrv5+Xe3d3b29vh6vxnXltcX2hdSEE8Nzg7RlnlyMXC wsTEyMHCxMfQ5lVLRUJHTFpfbvp1+e7c1tLP2ORvX1pZa/nh3dze7uvr597c2uX7aFpYV19p d/T49HlZRkA9OTtAS1r90s/MxsK+vru8w8rbblJNTkxPU1NOTldbddzPzdDW6mlkaHr35N/s 9vvy6t/W2N3ofmhfZmtsbGVeWlpfbP3m+Uw/PTg4P0xn89fP1cvBvLm5usLU8F5XU1lbT0tI RUlV/9jRzdTm7vHq5OPhfGVlafDd1NPd6fp4+Ovl8WlcVFFXX291dXNqcPRrST8+OTtDTmBm 49PQxLy4ub2+ydfd5P9ZT0pERUlOVl909ObZ09LW3el9c/v39fj78/Ll3Nvb3ubs9/p9al9Z VllbX2ZjX2V87X1LPD49PElPVVJX18rBurq8wsK+xcvVbFFJTFRNSURETlvn09vf39rS09bf bGd87OXs/HNw69nY3+728O/t92BUVV1iYFxYWF58c0Y4P01ESE5MUWXQwcbMwr29vb/Fz+Lb 22tPTE1MR0ZQVk9d59/o4tnQz9bY193p7e3+ZWBsc21hXmNqZ2BfY2prZmhpa3B1dnl+/PZ0 W09V7uZcV3be3vZt+dza633v3t7l6unp6ez0+X17//v+d3n8/nVzdHr+e3F29/55fHl4eXp3 cHZ2dv1zbXh/cnn29O7n4+PnaU9c7kw/WGlNWXRWbdDtX9XL3dvO09TN09/c1eNrcvpfWFxU U1xYU197d//k2trd3dze3fLx4ml/bGZ1Xnpda+lZ/O9p62723P/t3eb3U1bmUj5VX0VKU1Zb a3D80svVzcDEy8fGy9DX4e15Wk9RT0ZITkxMUlxn/u3d0s/Rz8vP1NTb5PN3a2NfXV1gYF9u bGx+/vt89//6fXnx72BLXPVFQHZPRFJXXWx3+9DM1sy/xsvExcvO19vedVtcVExMSUxMTE9Y XWX749va08/O0dLR2OPp6nloZ2VfXGJmaGp1/Hp47vds735+fHn2dVFOb1Q+TmRDTVdYbHR4 0cvSy8DCyMTDyMzV2d1vXl5XTEhOTUZLUlRWX33l5t3SztLSz8/Y3d7j921xcmZhaWxsbnXz 9/74+vF1eftzaXp8b1FKW1w+QHdERlhdfPbqzsTLyL69xsTByM7Z5OpiUVRRS0hKS05MTWRm Yu3a2tnUz9HW2NfY6u/m8mtsfXlsce/w9O/s5O799vl0YW9zYV9td2xcRkz3QzptUEJPZ+3r 383CwsfCusHKxcjU7nJvWExMTk5LTFdZVl7u9n3g3Nzg39ze6vLt6fx96+ft7ufg4+rn4un8 e3prZmFfYmZgaf1teO7q++XwSUz1RzxIX0dFYuHv3srFwMHCwL/I1NbYbFNVVE1KT1VZYm7/ 4eF55tr5Y3z6Ylxnb2lz+Ojd29rW0tXe3t/wbW9xY15gaWRkb3Z/9/3p7XX37n9u+N9ySD9V bDk6X/lLTM/Hy8y/v77Ays/N1GJQXF9LSFJmYWL33Nnf4O7v+GBVV15bVFz+6+rg1tDQ1dfY 3Od6bGtmYV9meXp49+zr7vL2+n1vY2hxaWJs7ePrcVhCTftCPUflZlLqzcXKwcbHxMPSeevj YktQWVdVX3J+49nj+ejrcFlcX1xbYGlv6d3c3tbR1t7f4fJ6bWxkZ3Nzc/zq7vbw7X1veXxn X2pua2789uvl+lVATWJJREZoZvXb087JvsLKzsjO4P9rWlRaWVJRavPt9evq6ur1bl9iaGdf Y2z+7uHf4N3Z2N/h6e/9eXtubnX9+v/99/5++P53b3NuZ2lqaGv46/FnTUVRUk5LTlld4dXQ 1cvFxMjKzdne5PFdV1ZYV1xlZWt07O3v8/T8d3tzbGdud3357Orn4N3d39/j5+zx93l2dnJx cHBwdHd6dnd4enp0e37493FXRUdNS01MVVJj3s/NzcjGxcTEytTd4flmXFZPT1ZdXltka3nv 5eXw8Ovp7u76eHjx6e3u6ebn393g6evq7PT6dGlmaW9ubm5qbHr//f7z92JNR0xKS0tOTlN1 3tTRysfFxMHEy8/T2+9uXlNPUlRST1VcYXDx6u3m3tzf4OTr8e7s+nx+9fPr5ebq5eDj6u7w /nh4cWpoamtpbXf9flpIR05MSUdKTFV+4d7azMXCwcHFycnL1e9tZFtVVE9LTFRaWl5rf+7e 2+Dj29nd5ufu+fHu/HP+7eru6+rs5t/o9/jyeWttbGZoemxMP0pUR0BDTE9cff7y0MLDyca/ wMXJztzh4XFSTlNPSktOUFhqfHTs1tTc2tXZ3t7j+nrz/Gtt9/V88+bn59/h5+jq9XVwdXdo TD5HWUA6P1ZQRlPv2dHJysa+u8PLw8DQfvTxXExLSUxOTExa7/9x5M/T3dzZ3Ojzefz1f2p7 5ur86tve5OLd5PX2e2VhZGBNPUZcOzhHX0lE5c7Y2cXDxMLFycnJ42zv91BMWF1RUGV6+vTj 3dXb6+Tf82Fte2tibf/58+/m39vf4dzf7nr+d15eZFxEPmxCNUpZS0Hm2PvZy8jKxMvJxs3p 4dxmVV1mVFheZXX779/W4eLe33xw+29panB1+n384t7r49je8+znb2JlYltNQUtWOEBYSkpX 3HHY09DIycvMw87a2d13YW5aW19YYnt7/93Z5N3c6OzxfXV0aGdya2Z69H3z4+fp5Ovt8W9u a1hLTFU+QFdDTVdafv7Z387I08jHzc7T1+bs+V9nZFhgaWV97e3l4N/o5eP4+vptamxlYWtr Z3R9fvj08/n5fnx/Z1pYWk1KWlZOW2hfaPfu5djX1tDR1Nfc3ODv+/J9bWx0fX1++u/u7vDt 6u73+/p9b2xtbmtqam50bm52enVycGFYWldPUVlZWlxea/z7797Z1tTV1dXY3N3i6+/3/X57 e/z29vbz8PHy8vL0+v58cW1raWdqa2tvbWxvb293fG9gXFxZVllaXF5fYWl1++zg3NnX19jZ 3N7f5Ojt9fr5+/r29PDw7u3t7e3s7/l8dm5paGZlZ2dmZWZoaGpucW5lXV1aWFpcXmFkZW19 9+zg3NrZ2Nna3N7g5Ojt8/j8/v349PDw7+7u7/Dv8vx4cG1oZWRiYmJjZWVmaGhsbnJ5dm9o ZGNhY2Voamtuc3v78enj397e3d/g4OHk5unr7/j5+PXx7ezv7/T3+n9+dW1ramRiY2FhYGNj Y2ZmaGtvdHZ7f/779vT19/r9fn57e3/8fn77/vv29fLu6+nq6ejp6+zs7e/u7/T5/Xx4c3Nw bm1pZmZkY2NjY2VoaWtucHN2ev/59/Tx7+7t6unq6uvv9fr5/P7+fn54d3d1dHF1cnB0dG5t bW1wcHd6fHd6fn59/vf18/P29Pf6+vj39/X19/v9/n16env+fv7/fX19fHl8fH97eHRubGlo a25xev779vTy8fDu7uzs7O3z9/92dnNydnx9fXp7end5enV0d3h2d3l3dXt8fv/69/j29PX2 9fT19/X4+v37+/38+vr8/P58fHt5d3Z1c3RxdHZ2eHh7enx+ff37+fb3+Pn59/n7/X5+e3p7 e3p7fn18///+f/79/n7/f37+f39+/35/f3t9/3t8fHx8f/5//vz9/H/+/X3/fX7+fn/+fn79 //77+/n6+/z9+/3+/f39/f39fX9+fn5+fHx/fXx+fX1//nx9fXp7fHhaXNB4b95r5fzx7X34 bnX/c3v89vH2/v/4+v78+Pp9/np2fXx3//x8/nx8/379+v7/eX5+dHd6eH13c/5/fP1/+v17 9f738v/29/z9eHp++evp6O73+01I1eHf2WPu/OPW2t3saWlpbfv8fW1lY29+8/LxfXF1b3Bx a2B0fW52c3R4d37z6uz9d3H08O3t+fttbvj27vZvc2Zo/PLr/GxsbXns6Ofq+H7/9/jo7fn4 b3v07uvs7/Xy+P58e3VxenFvamhsbnFycW9zcXV29fH38fX9e/Lw8/787vbv7Xx0dv/5enl+ fP5/cXz09+3s/n/29/D48/b6+Pnq83d3cm55fXd4b3Vwa3T8f/NvX/9ycPb88/h++fvv73x7 a2Nv9O3v9Hz/+PPx+e7u/Hhxcmtte3R3c3d/efvt8fZ9cnF3dn39/fZ+dXv16+bm6vP+enJ0 dm1sa2ltcv3y9/Xz9PT3/Xl6dW9xcG1yc3r8fPXw7u709//6+/97d3F1fPnw9vl++/fy7/f5 fHZzcnZydXNwbnJ5dHNzeHx++PPv8e3u8u7y9P9/fXd7/vX3+P5waGNjYWBgXl5eYmp77uPd 3NnX1dXW2d7i6evv9vl+fXh6fv/7f3x0b25qZWNlY2JlbHf++PHz7+fd0c3oRD08OT9IaFhU 9t/Gv7a3vsTMz9/Z5ltIQEVGUW7j5u7b1M/Oz95dTEpLTFJZW1pu3dDKyMnS29vd5f1vW1NW Yf7v5Oj1++ve4et7ZVxcbPrv49/0Ykc6PT4/SU1fWO3Lwbu7ur/Iy87XdFxMRkVMWl907d3X zsjL0utvW1JQTkxHR0lOWHXd2tPRzM3O0N3sbG9ydfp993zq39zc5OX3enVpY1tcXGN559zX 1d91Tzs3Pjw/REtaWsq+urm7usPFyNB5S0pERklSW1Z72crHx8jT4Pt5XUxJRUVIUWFo+Ono 5tfQ1+Hq7Xz/9/ttbO7h3NnX2uLf3ub+bWdfYGltamh/597Y2vBcTklCPz9BQkZRdN3OxcC/ v7/Dy9bna1hST05OU2B359rSz8/Q1N/8ZVtSTUxMS0tUav7l2tPQz8zR2+fx+WllY15haP70 +e3p5OLj4+/79PX3//Tq7X1lWkI5TU8+S0hZ+f6+x8/Cxr3H18xvXmpbWUdJW1hm/Obb4s/K 0tzr4/ddX1dOTVFfWllq/eTe2dXd3trb5nJnYFtbW1tZWmL+6/Hi3NrX2dre6+vufmxkZWZj ZWhpa3P69vn9+fL7+/90dW9zeG5uc3h+//38/fbx9Pj4/f7++/93e359enZ4fv/+/P37+vv8 /X/9/39+enZ3enl7env9//78/vz8+vv//P1+f317fP9+e3/+f/7+f398eXh4enZ1dG92eHd5 eHr/+vf29PHw7u3t7fHz9PX29/f7/v1/fP78/vz/fXRsZ2JgX15fYWZqbnV4fP738u3o6OXl 5+jp6evt7vL2+Xt4dHF0cG9vb25vb3Bwc3Z3eXp9/35+fn18fHt6e3l6e3v//f78+fj4+vf3 +fj5/H9+fn1+/n18fnx8fHl5eHh6eXh8fn7+/v3///38/v3+fv59fX98/v/8/Pz6/v39/P7+ /319enp6eXd8fHp+fn7+/v/+/P39/v78/v79/vz6+vr9/f39/P7++vz++/9+fXt+fXx8fH16 e317enp5fn1//37///v8+/n+/P1//n59fX57fX7/fXz+/n58ff5+/v/+/v/9/f9+/319fv79 /vz+/vz8+/z6/Pv6/vv+//59fHt8fHp6fv///Pv4+fr6/v77+v38/v/9f//+ff9+fn7//v/9 /Pz5+/x9fXx9/n9+f31/f3x9fXx7e358fv5//n5+f37/f/3+//3//v99//5+f39+/35+fHt9 fH79/319fX1+/n/+fnx9///+/fv7+fn9+/7+/Xx9fn3/fHx9fH1//v3//fz+/f39/f37/f/+ +/n6+Pr8/f3+fn97eXp4enl7fXx8fP//f/3+//z8/f3/fXx6fHt8f35+f////v/9/f39/398 fX97eXt9ff//f/9//v38/v7+fX59fX98fHz/f379/f38+/r8/Pv8/X//fnt9fH3/fv36/fz7 /v38/P79/n3+/H/+/f/+/v/9/v38/v3+fn5/fH5+fXp7enx8ent+fX5+/v9+/v/8/v/9f//+ ff///v39f/9+e3x8eXt9fH59fH3///79/v7/f3x+fn1/fnt9///9+/v7+vv8/Pv8/v7+/v9/ fn1+fn1+fH1//X5+/v78+vv7+/v4+fr4+/3///x/f359fXt7fHp6fHh4fHt8e319/vr6+vz7 //5/fH17fH19fX1+/vv8/X9+/nn/+//8/f38+fr7+fv6+vz8/H1//3t6e3p8fHx6fX5+f33/ ff/+/318fnx/fnx+fXx/fn/9//78/v78/Pz8/Pr7/P39/P5+/v9+/v57c/j8ffL89Ph6dXJ3 fPr3/X9+e//49PPz9vz+/fn5+Pp/fHx6fH56eXd2ent6enp6e3t9fnt9fv77/Pz/fn3//39+ fX15fnt8/339+/z6+/n6+vj5+fn7/H57fX58enp6e3p7fH7//vz7+/v9+/r7/P7+/fv7+/z/ /nx+/3x6eXl4e3t8f35///5//fv8/f1+fX18fXx6fHp9fX3+//n+/fv9/f7+//7+fHx7enx8 fn3//3//fv///3//fX3+f//+//3+//1//fz9+/39/P38/v7+/v7//H///n//fX1///37/v39 /vz+/vjn4XL26Wj6a2v3Z/htcvFy73n+925/bnB2a3h1//t99vjw8/by+Pb6/358fHt6en15 fn57fHl8enh9en5+/fj8+Pr59vj4+/v7fXp3dnp4ent+f33+/n/9/n/9/3z+fnt6d3p7fX99 f/v9/fv8/P7+/P9/+/n8/Pr7+vr9/H1//nx7d3h6e3p6fX59ff/+/n5//v/+/f1+f3//f37/ fv7/fn56fn///X7//v7/ff99eH96eXt8fn39/v37//v7/Pv9+/v7/P78//37ff3/e3x+fv/7 fHv8f//+/39+/fv8/Px9/v99fnx8f/9+fP7++/t4/v9+/Hx+//3+fn54+v55f3R7/nv/fH57 /fv+/H74+/3+fH58enx4//7/fX5/d/x8/X3/9nz6ev78ef15fn1++3p9fnt+e/7+e3t8/P3+ +fn4f/72ffr7//96/X1+/Hz//X/9/H7/fHt7//t9+v7/+376ff/5//r7e/x/f/x8/Hl5/f/8 /vvz+fz7+/j/fn39ff94dPp6fv1++Hp7/3l9dnv9d31+fvv9fXl7/nx8ef38evn9+v369vj9 //l+f///e3r+e3n+eHZ4d3p2e/9+fH35//7+/fx+9v1//fz6fH96fX53fnz8/nz7/vl5ef95 eXr/e/n9evz8+Px4fn97d3Z6e/7++vr8+fx/fn59eHt6ent/+np+fX78fv3//vn4//5+e3x8 +Hx4//T9fvj7/H77+/n6f/56//94fv7+fPv2fXz8+Pz9+f3+fXv/fXv7fH7/evt9e3/8+vj1 +/r5//78f372fnn39339+n17eXp7ev18e3z9+f/9fvt5cv5+e357fH99/378+3x9/P7693t/ /Xz9/nt8+/x8eXR7eXt1d/14/vx/+fz79fz//359/Hh5fHl7ef3+f/v////9/X1/e3V4/376 /3/ye315e/d9/nv//HZ+/P/7+vP5/vr8fHz7+H9+/P75/f9/fn1+e3n7/f17/v18/3/6fn77 +/j6fn768vp/9/r8eXx6dH57e317eX73/Hx+9/v/e336fnd7eXx3ef5/fXP++/z7ff33+f3+ /P78/Xz6/3R3ef1+ff77/np3fft7eH3+fXp+9nn6/3j0e/99efj/fn99/H1+eXl8//Z6dn5/ +n5++vz49fn6/H7/+/t6/vz+/v7+//r8f/17ffx3evz/eHh9+3979/r89fT2+vj5/333fnn/ +f11ef7/f3r9fnn4enz/fXh0f/57evj3/vr4+/79/Hx0/n11fXh5+v/+fvv4ev59eHx6eHX9 dnv3evzz+Xv6fnz+/vh7fX7+/X9+dv78f313eH9+dnP9/H/6+/v7/f3+/Pv6/X199n15+H/+ /3j4/H/9f/j7fnv4/Xd2/vn/fv34//v6ffV7b/9/+P95fvX5eHn8f3v8ef/+/nx5fXh6fH77 ePv8ePl++vz483l79fp8/3r7eH79df5+fH78dnN3//x7dnz5f3/+fPn2/3r5/Hz///7+eHd6 +ndv/H/9+35/9fx8+fv7dX/2eHN6ff/7/P54fX59/P5zdvh1en14enz4/H78ffn4/vz+/nj/ /Hb7en1+d3p7+ft8dn79+X54fPv3/Pj8/n1//XR7fnl8/n9+9Xz+evv4eX51enlze/p+evz7 +fl39/n883z4/fr4ef35//j1env9fnZ3/n34+n7/c/v7fvn/9/37+/t/e/J2dnt0/fz+df72 fPz9efjydn3/ev13eHt+fvr2fPz7en18f3F9/3X9/n189fd4f/j9+XR5fXj2//14ePh4/vx5 fHR++XJ4+/z7e/v+//x4e/j5/P/3fHD1/XX9/Xj9/HF4/n51+374+nz4+vx5+v38/np/fP1+ d375eHj/d3h+d3d8/Hp/+f75/Xx8+XR5/vrzdf59+vF+ffh6fvB4b3t+eHt3fHx/fHb+/vz/ /vj7/fd8+vx69fh+fPt8//Z7env88X79+P/3/PX6cXp3fH7/b2/49Xd9+frw/v779/tzfff6 evzu+Px/9vz983x9eXl8eHd/fnP8+3l8fv9+eft7dPT1fnR4/3h8+XT69Xf9+ff3+HNz+Htz /v7+fP/7fv37fn35/3h8e3F3/X769v988vj4+377/P9zd3lzbnt7dXV6/3p8d373+Xz99vb4 +vZ/ff///H18f3p/+nh3/3x3en3//Pv++Pl2+fl3+vp7+ndw/Xp5dP96c/n9fHv/fXr9/X32 +nv09/j49/j6+Pj4+v/+enP7ev/8d3j8+3V6eX3//Pv++Pj+eP34e3v4+nz5/n338/r69v35 fnl7+nx8/Hp4c3h7fXd7/Xv8enj7e3z6/3z293z+/n34/H36ff37dXr7/f18e3v7eXZ7evj/ fX59/vz+en99/nt2f3t8+f/4/PP5ffV//nz8/nz6e/r+fH17+nt4f377f336/nz6+/33+/33 +Pn8/P37f3z7eH98ev19fnv6/v/5/X78+v59/fz/en73ff5//PZ+fvv7/X57fH//env6fHr/ f339+H7/9/57/3l9f/5+dvz7ff/8+f7+/35+enp9/3x7ef7/ff96e355fX59/v//fvz6fvz8 /n3+fHr/fH7+/n/7/n18enz9//t9/vz++v37/H39fnx+fPx+fXx6//9//Pv7+Pr99/v//P1/ ff59fvx9ffz8fv/8ff38/fx/fv37/Xz/+37//n7/f3t8fHt//vn+/v3/+vv/ff7/eHl+enl7 enl8e3h9/358/P19/fv8/f3//n/+/vx9/Px//H7/fX1+e316e3x8eXl9e31+fn/9+/3++P38 +337/Pv9fv7+/fz+/P1+fHt7fv9/f//9+//++Pv+/P1+fnx/fH59fv3/fn7/f37//35+/399 fv59f//+/35/fH7+fnt8e///fHx+fn18fn7//f39f/9/e/97ff//fn1+//3+/v78/H5/fXx/ e3l/fnx7e35+ff9+fv1+//z59vr59/n7/v7+/n1+fXx9fP9+/X58f3/+/v38+vz8/X/+f35/ /f39/v7/f////vz8/v37/P78/v58fP98fX18fH5/fv7+fn1+fn1+fnp+fX1+fn9//n9+/v3+ //9+fv7+/399fX18fP/+/356fv5+fnx//P39/vz8/P///P39fX3/ff9+//z9/Pv7/Pv+/fv7 /H1+//58e3x6ent+//9+fH7+/fv+f3/+f33/fX17eXp5eXp8fH77/Pz6+vf3+vn6/Pz+fn99 fX58fH9/fX5///37+/v+/fz+/P38/3p+fX1+fX5/fnx+fn5/fX5+/v9////9/Pv+/399fnt8 fXt6ent9fX7+//79//3/fn7/f3x//n/+/v7/f/3+/v5/fn16fH19e39///5/f319/37/f/36 +/r8/fv7/fv7/Pz+fn7+/f/8/P78f/9+fH59e33+/f7//fz7+vn7//9/fHt7eHh5enx9fn5+ /f37+/37/f38/f59fXx+fHt9e357fH58/X58/X5+fX9+ff7+f/99fv5+fX9///1/fv9+fX9+ fnx8fXx9fH7/fv/8//7+/vz8/Pz8/P38/P78/P39/Pz9/318e319fXx7fn1//v/9/319/399 f37//35//v9+fn/9//3+fn18fHt7fHt9/37+/v39/Pz+/n/9/f37//5/fv7+fn1/fX5+f/z+ /Pr6+fn5+f3/f39+/n19f3t+e319fv39+/39/Pv7+v//fn18fX58fnt7fXt6fXx9/v/+/f/7 +/z7/fz9//9+fnx8fHp5enp7e3p6fn///vv5+vr8+/9+/v//fXt6eHl6e3z///z8/Pr8/P/+ /3/+//3//v5//vz8/Pr6/f79/X5+/v77f318e318e3t9/n19ff/+/Pz//n3+/v//ff9+fX1/ fv99e319/f9/fXp+fn5+fn79+/r7/P38/f77+vz7+379///9/fj+/n99fXx7e37+/n/8+vn7 +/x//f77/X9+eXx+fX5+fXx+fn7//v5//f5//f59fX59e3x7e3t9fX19fX7+////f39//v7+ /f3+/f3+/399//z/fHt7e358e3p6/X/9/n79/H99/n////39/f78/v35+vn8/fz8/f39/n18 fH56enp6enp6fX5+/n7///38ff1+ff39/v7+fX79/n99/31/fnp8fX1+fP9+f/79/37+f/78 fH1+fXt8fH1//f5+/f7+/Pz6+fn3+fv8/fv+fn59fX18fnx9fXt9e//8/vv7/vv9/v7//v39 +vj6+vz9/v1//v1+/v36/37+fH5/fn5+fHt8fX58e3t7f33+fHz/fn79f3z9/f7+fn5+fXt7 e3d4eX5+//3+/Pn3+fb3+fj4+fr7/Pz8/H9+/v9//35+fH1+e3x6e3l5eHh4d3l4enh1eXp5 e31+eX3///v8+fn29vj39PLz8PDz8PT09fT09vb3+fr6/v3+fvv8+vx+eHl8enhyb2lkYV1c W1xdXmZwfu/p5uXm5urq6efl4+Lk5efp7fL09/j2+vr6/f7/ff/78/P0+3p3d35uZFVSUk5X UEpIaP7wzd/Z19XU+/poXe/o6d7k2Nra3HhrZWJpaWVla/31+3Jua2xvbWxqdXzy8fTz/PT6 /Xt2fvz08vLy9PP6/XhvbXBwb25xcXR4cnRvb25ucW9yeXx8ef3x9O7v9PHx7/f5+vj18vL4 9vf5+v94dnl0dXl3dnh4dnl4eXh3d3Z4fv33+f37+/d7dWpgXlxeXWNqdvTt5+np7vHz+fXx 6+jm5ebp6u3x9fj19ff2+/v/eHdveHp6enZ2fPT+ev17fXp+fvTyX1VFND5dR9XU28fIvdnb bktWX3V04NbRy8nY9l9WUlhdW3H03tzb721sYGNfZWRv7unq6vd3fHNybXdzffX27vXt9PTv +/96e3V2+/L06Ons7X94bGVRSUlDSVhf+N/W1NLT5v5tZmZ67ubc19bZ3Op+dnNxd/389u7v +npwbnR1d3r++fTv8PLy7u35eW5naHBtbW9wYFRNPjpNUV/W2s/OxMza3WBdZPf86Nzc19LZ 9WtfWV1tZ2/26unk7mpmZWprc3J28ejq7e5+/vb4/PPr7Ofn6e3r+HT1/W1oZV1dZF9PQz5D T2Ht4NzSzczT33hkaXzs6eDe2Nnk629obGx2ePj67ufs9nVva3F1dnV2fvrx+f7///Ps6+vs 7e7v8vPx8P13al5eX1lIPDxDT2Xh3djNy8vV4mdfan/t5d7b1NLY721gXGdma2x59/To9Xdt bW1ze3R4+vPv7/V9evn19O/u7e3v+/j09/z7emppZWdiVUA7P0hXfd/i08vLztn9XWNv+Ong 39jR0t78alxha2pub/jz6O15bWlqbnVvbXX68Ozv/P739fTz+vft7O3v8PL49vt3bGRrZmJY Qjs9RlBu4eDUy8nN1exfYG7+7OPg29TS3PVsXV5taGtv/vDn53ptamtudG9rcv717/D8/fby 8/L19+/o6O3u9vbx/HFqZl9hZmdQPjtASlnt6+LTzMvP2mxdZHH46OPh2dPV3vloXWJsaG9u fe7m63xyamttbmlmbXj58fV8//X18O7v8O7u7uvv/fv3/HNuaWZpa1pBOT1ETXrr49fLyM3Q 8l9eaXfu5+fe1dLX3nBeXmBpZWxqeujl7XduaG5xb2ttd/vs6fZ9fXz59PL08e/u8Pf8fP3+ enVqamtsbFdHPz5HTlv979nPy83U429nbXv57ejf2tfd7nllZ25vb296++vs+XVtbXF3c2xv evvz8Pb89/Hu7/P4/PH1fHN2fXV4c2plaXB0XEA6QEVR/ezk2MvKzNH0YWFs/ejm5t7W1dns b19ebGlvam7/6+j7em1scXlzbG10/e7t9fv27+zq7u/u7ez59/999vd3bWphX2NiTj48P0la 7ube08zLztl5YWFv8ubk4tvX1dvwa19faGlsam/56+z6dWxrb3RvbW1z/e/u9/3+9/Lv8fn+ 9+7t7/T59vR+bmpnaGtlTT07P0hZ7ujc0czKztlxYF9s8+nk4tzW1dvzal1faWttanP76ur9 cWprc3h0bW539Ovt+Pz48u3u8/j18Pf6+v378/h3aWVjZmxOPTo+RlXt5dzTzMrM1X5gXWr3 5uLi3NjU1uVsXlpiZmhnZnb15+//bGhtdndubG/87uzx+Pv58e7u/Hz+8e/2+3z9+352bWlq bFpBODs/SWjx39jNyMrO42lbYXLv5+Tf29XU3P1lW15naWtndPbq6vlvZ2ttbmtmaHL58PX+ /vjv7e3v9fnz6+3v8vj29n1nY2NnbltCODs/Smrx5NnOycnN4m1dYv7u5ubi29bU3v1jW19o aGhlbvns6/hwaW13eHFqa3X16+/9fn/17+7z/P368O/z/H/29H9uZ2doalQ9OD1AT/3w3NbL ycrR72RaY33t5+Pf2tPU3v1kW2BpZ2hkbvbr7n1tZmhvbmlnanXy7vP7fvv07+7x+P748vHw /Xh/fW9ramVrcVpAOTxAS2n64tnOycnP521cYnju6urj3dbV3fZoXmBmZWZian3v7/twaGtv cWxobHXz7O72+/j27+309vf39/n/dXt7//R5bWRpZ11KPDpBRlz37tfXyszM231mXm/56+vn 39rW2+hyYGdpbG1pbHrv7vh0aWlscG1raW589vP5+Pfy7uvu8/T7+/n0+Pn5eW1qa2trblxC Oz1ATV906NzQy8rO4H5kZnjv7u/n4NrY3e9uaGxtbWtmanrv7vV7b291c2xoaW19+Pj5/fvz 7Ovs8/j8+/97dnd6c3FrZmRkaWFPQT5DRlZnft7czs3L1ODxb3j+7/by7uvm5ej8fnd2e3Zv bXB4fv95cG90d3VybGxvdn///v327+7u8fx6fnx7f3p0b25saGlrb2NLQENETFdg9OrY0cvM 0tjm7/Xw9nhzb3vt5uTo7e/3+X9xa2ppaWxsbG1wenz+/nh1dnl8fH19/Pbx7/X2/P/9e3py cG5qa2xramlraF5VT09PVVphc//m3tjY2Nnb3N/i6vF/b2xtcXZ4fv337+vq7fH7enNwbmtr bG5weHl4e3t9//9/enl5dXZ4e3l4eXp6eXp6fn59fXRoYF9fXVthZWRqc3h+7+rj3t3c3d7h 5ufq8fh9cm9ucHd+/Pj29vj5+f5/fnVycW1ubm9vdHz+9/Hw7uzr6+vu9Pn9f3l2d3BvcnFv Y1xdW1hZX2FianR3/ezm4Nzb29vd4eXn7PH4e3Jxb3B5/fn29fj49/n8fXh0cG5ubW5wdXz7 9vHv7u3t7u/1/X17dnN0cHJ0cm9iXV5cWVtiYWRtcnb36+Xf3Nzb3N7g5Ojs7/p9dnBwdv/6 9/Lz9fTz9/z+eXJvbWxtbnB2e/348u7t7O3u7/T3+f95dXBvbnFzbmVdXVxZW19gY2xydfnt 6d/c3Nvc3+Lm6Oru9Px7eHn++vj09fj6+fz+/Xt4dG5tbWxtc3d7/fz59PHv7+/z9vj7/Hp5 dXFycnFybV9eX1tbX2Jiam9xfPbw6N/e3t3g4uXp6e3y+X14dnt++fby7/Lx8/n5/H53cW5r a21tb3R2fP369/T09PL3+vr+fHl7dnZ2cm9pY15eXl5jaWtudHn78+zl4+Li5ejq6+3t8/n+ fHp9+/n18fXy9fb5+fb7/XlycW9vb3Bxdnl6//759vX18/f3+37/e3h3dXV1dHZ4d29pZmVg YWVmaGxvcnv58ern5OLj5enr7+/z/P57eHz7+vTu7uzr7e3v8fb8e3RwbmxtbW5vb3B0eX79 /Pz7+/37/nt9fHl5fHp6fXx1bmxnZGRlaGpsbnJ4fvbu6ubk5+jp7e7v8/P1+Pv49fPu7+/t 7O/u7/X2+316dnBxcW9xcnBvcnN3ent8fnt7eXh3d3p3eHp4en79/vz/endxcG1ub29ub29y dv/58+/s7evt7uzt7+/x9PT08/Hv7e7t7e/v7/L2+f96dnJ0cnFwb25vcHB1d3V2d3d4eHh6 eXl9fHx+eXZ2e3V59/v38/Ty9fX09vf2+vx/fn14fH9/+/j38/Ly7u/y8vP0+Pb4+fj6+/j4 +Pf4+fr6/n16dnZ1dHRzcXBxcnJ1dHV3eXl5en5+/v38/Pz6/vv3+/r5+/z7/v/+e3t7e3x6 e3x7fX9+/v/8/Pv4+fj49fb48/X39vn5+/j3+Pv5+fr5/f1/fX55enl2dXV2cnNzcnJzdnh7 d3h3eHx7fv78/fn6+vj5+Pj6/vz8fX58en18e3x9fn/+/n/+/X58ent7ff7+fn79/Pv39/b1 +Pj5+vz9/X59e3p5d3h5eHp5eXh5eXl7fX59fX19fX9/fv5+fv9/+/z5+/n6+vr8+f37fXp9 fv/+/Pv+/fv7/vz6+fx+e3Z7en39/vz/fH19/f38+/v9fn96enl8fHt9e3t7f359/H39/3t+ fH/+f/9//v9+ff9+f/59f3t//P/+ff5+fv7/fv38/v5/fn9/fX59fnt3eXx8fn/8/Pz6+vr7 /Pv8/fv7fv/+ff99fHt+/n/9/v7+//z8+vv5+33/fXt9fX3//v3+/fv++vr7+/z7+/3//n98 e3p7e3p6eXp9fX/+//7+/Pv9//z//f9+/3p9e3l9e/99fn59fX1/fv7/fn18fH9/ff39/fv+ /fv6+vv5+f36+3x8e3t9/v1+fn7/fn78+/37+/7//vz8+/n9fv98fn18/v/+/31+e3t9/v3+ //9+eXl5eXx+fX7/fH3/fv77+/r3+fv+fX56enp8end5d3h9/Pn5+fn7/P37/Pz7/v39/n1/ /n18fHt+fn/+/33//v///vz7+/76+vn6/Pn+/n18fXl6enx6fX19f3x+fn1//319///+fn1/ f/z7+vf59/v+/f59ev7/fv59/v/++/v8////+/99/v3/ff3/fn/+/fz9fv79/fn9fn57fHt6 fHx+fv5+fH39/v7+//7+/fz8+/z9//59fH56eXx7enh7e3p5fX5/ff/+//r6+fr8+fz7/Ht9 enh4d3p8fHx8f35+//n6+vj6/P37/f7+/n///n5+fX5+fn3/fX79/v37+vr7/Pv7/vz8/359 f/5//n5/fn19ent8eXt9fX/+f/7+/v7/ff//ff//fn//ff9///7//n3//v/+fn19fP/9//5+ fv99fn5/fn5+fH19f//+/vz6+vj5+fr6/f38/v5+//7+/v78/P7+/P1/f35+/3x9fn//ff// fn//f/7///38/f77+vz6/fz+fv3/fX18fHx+fH17fv5//f39///+fXx9fn1/fn5/fP///v3/ fn1+fHx9fH19/v7//P3/fH58fX16fHt7fX////79/Pr5+fn6+fj6+Pn9+37//n5+fHx6eXl6 e3v+f/38/fz7+/r7/Pz//fz+/n///f36+/z+//5+fXx8fX16e318e359fn7/fn5+//x+f398 fX5+fn5/f/39/P1+/v19/39+f319fX1+fHx8fH1+/319//7+/vz8+/z+/f3+/v7+/f3//vz8 +/r7+/3//f7//39/fv3+fX99fHp9fXx+fnt9f31+/f7//n/+/n//fn5/f37//v/+f/9/fv5+ /P5+/n19/n9+fH99fHx6fnt6/3/+///9/fz9/v7/f/v8/v9/f/79//5///3+/Pv9/f39//79 /P3+/n/9/f//fHx8fHx8fH19fH1+fn58fn5//P37/f7+fX//fHx9e318ff9+fn1////8/H5+ fXx9f/78/P3+//z+/fx9fX5+fv9+/37+/f/8/Pz5/Pj6/fv/el9e5Gjq4PDh/ur4//d5/nR3 eHR9fHd3dnh3e3t4/n99//57/v5+/n5+/f3+/vz7fP3+e/7/e31+fn79fH1+e3t+f37/fX79 /X/6+/77/v37/f7+/X3//n19fn/+/f/++fv8+fn+bHLueO3y8On0+Pn8e/11dHh3c3B7b3lx fXh7/nb8e3z+/nb9fnj5eP99+fz69ff28PLv7fnv+Pr8/3b//HB+cndxent2e/V9/vT4+Pn+ +3z6/fT8+/j8eHt6eH5u7Wbvbn5zfX1w+Pl27v1473159vxv6mzyenrya+9zeu9u+fNs6mzy dv70bO15cetr9Xf7eXf2aft+c/76/Xfy/2/oa/nybOtr62jscnnubvF193959nl57mXmbft7 +nLzfHPwbe1t7G/6fPxv735r4F3eY+/3beVk5mv6e/dn6Wv/9mrpae77beZq73v9dfJ2b+1q +/tr72/6fnTxeXzoZeJu+Pl/en5+9Wnoa3noXt5c4GX17V7cXeRo62z39Xx57XB+62flY99d 3mPvfm/qXtdP0Vfkb3zxYtlX1ljXWuP0Wc5LzE7WXO7xYN5a2VPQT9FY4Xlt4VzYVtlc313f ZXzqYOJo7GXlbO//+HL0+HT572XeYudu+XzyaeZh6Wx07mPnZOlm5mLgYd9j31/fZ+9z7m59 7l3dV9ZS0lTXUc5N0V3ja+ds73vy8WfbWdxb31veXuhk5V3cVtVV2l/lbe96/elf1VDOTc1P 1VfbW+Vmfn1v7mnrbu9s6GXeXt1b3GDteHl972Piau99ceRe3Wb69GfkYN5kfepd2Vni/WHY Uc5LzE3XZW7cU89U4fZi3VzZXeN2evX9b/n5au9tfn5t7GbjZOZp7G/19HH49Htx513eXdtZ 329u5VzcW+Fo+/Vw8Pl37HT88v/uaeJi6216eP9r+298fXDrZOZ0/u1r7Grqavz9a2pQ5V37 2XDO8t/e+t5l42D9cm96c/h48Pz39/xt/m5vaHNjc2V6aHpr92/tcO1173v+8W/vbOdk5XN+ 7XTncOX3f95s6Pj+8P/vee3/fvf5ePh0cv13cm9+cHl+dHb2e3rzfn72/3j6+nn1/Hz483j5 7X3z8f787/r+8ff18vD86/f08fZ5/HhscWdkZGRiYWZhZ2dmamtwcHJ++/r17uzl5OPe3Nva 2drZ2Nrd3N3f6/p+fHFpaGtvbnP9b09FPDtIOT5DRX3fzdC/vb6+x87T22hbVlBdZmr42M/L yMrLys/e7XlnZF9davju4uFNNj1FMzs5NUt37nzDv721vcjIyOpoVUJMV1JV99nNwcXKxcfP 1+BpavZqYvro39LSajU4WC84OC9EW91Qxb2+s7rEysTlWlVARFNVUnrUzcDBy8rI0uTsa2Xz /HLl39bPztdCL046LUIuPlbV2+i1ybi7y9rd3EtYRkRUdnfzysrCv8jR0dN9bWheau/v79zW 08/P3Ec0QjwvPDM8VerO67rDvbrKzezaVlBKQ05a8XvRysjBx8vU0N5rbl1eY3l89drZ1NPT /0I8Qjo3OzhFT/ra3sPIvr/GyNvXbl1PSU9UZm3m18/IycrNz9Xo/V9dXFxkZnn67eXj4P9V SUtHQkJES05c/n3o3dHPzsvQ19nf7nR6dm5++f597Onn3t3f4uHm7+7t9vXz+3378/TvclhP TkxGR0xMTFRdWF/24t/Uz9bV0tbf3t7u8ez4d//s7ujf3ubl4ujs5+318/n/fvf7b1dMTUtE Q0tMSFNdV13x3uDRzNHTz9Ld3t31e/pyZWz+d+/g4+Th3uXm4+3v9fp2b3Z5+nxdTUxOR0RL T0lOXllaeN3g2MzP1NLQ3OXe9W53bmVm/f/34uDj5d/k6OXs9H7+d21yd/30/F5NTU5IREpP Sk1eWll23N3Yzc/V09Pb6OP2bXRtZ2j+8PDj4Obp5ebu6+/9end8cXP++e/s+1pMTU9HRUxP Sk9eXF392tvYztHX1dXd6uP0cHd0bWr49PTl4+fs5+fx7/D8eHp4cG92eP719m5WTE5OSEZO UUxRYV5e+9vc2c/R1dTU2uPi8XZ1cGpmc3t88Ozt8ezo7u/2/Xx1e3hxdX369+/tfFxOT1FK R01RTE9fX1513drZz8/T1dPY4uXzbmtnZ2RqdXvw7evs7err7fH+dnN3d3J2en737erp7G1U TU9PR0VNTUxZYF9p38/U0s7Q09fd9G9zal5cXmn86efg2tja4+bq9XdoZGRmZmdz9+vm3tvZ 2n1MSE9AOD1KT0VO6NvV1MvExcXR1tPmX1BbXU9NV2t4++DTztDY3N3raF5fXlVUXmlv/N/X 1NLU1NXY4HlPQ0Y+NzdDSUNR+M/bzcTDwMnJz9X0VllVUk1PXmZq9dnP0dHP0999bGFbVFJW Wlxi+t/a19DN0tbV2uT7UkFFQTg0QUw/TvbP3dHBxsDJyczU5lZdWk9MVFxdY3/b19LSzs/f 8nhtWFJXV1dYZHvv39nQ0NLU1djm6vFeREBJPjM7U0JHX9DV5cPIw8jLzNfVXVpfWU1Pa1xl c+DZ2dDVz9ntf2xkUVVaWFhdeXns39jQ1dPU197p5/VxUEFESTsyQ1RASW3H6NnCx8HNx83R 11liX1tJT3JaX2/c297R1tDb7fxsZlJVW1paW3r77ePZ0dbW1dXe6enrdVdDP0hBMzlWSEVP zMvpxcW/x8vJ185vVFhbVEVZbF9q+tPZ19LX0uP8ZmJgT1JZYl1f6+ji3tfT2NbZ3OTw831t XkY8Rks2NFBTTEncv93KycHBz8nj1t5VUE9pTkljdut05c/W0d3e3PRrVVtdUVNYbGxr7+Lb 293Y2dvh7Oj0fHJtXkM7SE82Nk9bV0fawdHHzcPDzMn87NtfT0hbX0xWZt/d7NfVz9Pu7/x4 XE1VW1pZWnzs6uXh1dXa3t/b5P13f/5tX0k6P1k8M0FZ6UxYw8jEyszBy8jUXH38YUxFWmpa XWjZ0tza3NbV9mddYWVST1hjdWVq6d7b4ebc297ofvXp8nNs+/NYPjtOTzg5RnDxT+bJx8LJ y8nOytZeXGBjV0dNa3Nvd+jT1NfY5+roc15UVl9ZVl5o++vp397c2N7m5+ru/XZ6e3B1X0M6 Q1RAOT5W2m9o0cfDxcrLz9XQ3V1SVmJdTE5m8+bp6NvY2NnvaWprZVlQVmNqbG7439zc3d/f 3+TueGx493traG1ZQTtHT0E9QVrd8/PRycbGyMnN2t3b+ldPU11cU1Zq6+Dh4d3a3ePya2Bg Yl9ZWWN89O7p5N3c3N/p7vH8dHJvbWxra1hEPUNOSUBATe/b5N7PycbHy83U3+PncllPT1xm XFpo7Nzc3+Hh6fD8bF9aW19lYmJu9ubh5eTf4ujp8HZucH73cWBqb1NDPkVNSkVFUu3Z3NjN ycjJy83T6Xp9dF5QTVRiZ2Rt9OLb29ze7np0bmddV1hgaWx49uvh3d7e4unu8f90eG9sa21v Xks/P0lOS0ZGWODT1tXOysjJy87Y7Xl7dGRTTVNlc3Fxfeje3d7l+2xoaWphWlpid/Xu7Ong 3dze5Oz5dXZ2cGxlZXJ7clRBPUJOT0pGTHnTz8/OzMnIycvQ5G5laWhaTU1Xafrv8und2trb 53lkX2RnX1lbZn/q5uTj393c3uj1e3J0eXNvcnV1blhEPT9JTElGSmvWzs3LyMfHyszO3XJe XWFcUE1UYn/r6+Td3d3d5H1mXl5lYl1daPjk3+Pf3d3e4en2dmxrdn55dHJ4ZEs9PENMTEZF VN3OzcvJxsXIysrR7WRdYmdYTU9ZbOvo6d/e397f7m1fXGRrZmBjcund3t7d3t7e4+z5bmlv /vl+d3VqTT06QEpMR0NO6tDMycfFxMjJx8zfZ1lcY1lNTFJdfunk3d3h3dzj+WRbYWxoZGZt 8OPg3dvc3d7f4ux3a295fntsbGhMOzg+SE1IQ0/r0cvGxMLDycnFy9tpV1tiWE5OUVhn+d/Z 3ubf3N7sal9lZ2ZoanP68+fc29zd39/h7H5xa2ttam5zc15EOTtCSUxHSV7t2crDwMHJy8XG zd5pXV1VUFNSUFRc+dvb3d3c2t3q9XdmYGFoeXp49urf3d/i6PN8c21nX1tdXmFobm9XREBG TFJPT11pfN3Px8TJy8rKy9Dc5ndcV1hbW1hbaPvp4N7e5O729Pl3a2hscHV6fXp1dHp+dXFr Z2lmZmdmamhqbG1xcHJ5/fv69vT4enV3/vn28e7u8O/t6uns7/Dv8PDw8Pb+fn19e3Z3dG9w cHFydHZ6fXx8/vv8/X17e3h2d3d1dnh5eXl8fH1+fv7//vt///9+/v98fn59f31/fnt9/vz4 +fv8+fr7/P/+/358e3p3enl6///8+vn39Pb39/z8/f77/P7+fn9/fH18e3h5fXx//n3++/n4 9/n6+vv7+/5+eXh3e318fv37+fX3+Pn7+/1/fnt5eHd1e3x8fXp+f////v7+/P/8/X/7/Pz9 //5+fnx8e3p5e3x9/3/8/fz8fH59fX57e3p+fv/9f/z9/fz9/X16enp6enl4eXh6fvz7/v34 +fr6/X58e3x9fH19fXx9f39+ff///398//z8+/n4+fj8/Pz9//59e3x8fXt8fX77/fz5+vr5 +Pr6/f78fnx8fH19fH9+ff5///z7+fv4+Pv4+vn7/X59enp8eHp5eX17e3t+/3x9ff9+fn1+ /f77+fr7+/n6+/78fX3/eXx5eHh5e3t+en19f/7//P/++/78/v79/P7++/38/P5/f35+/n7/ //////z8/P1//v5//n98fH1+//7+/fz6+ff4+vj9/P59fXt7e3t8eXl5e3x9/35//f/8+/z7 +/z9/317e3h8fXt9e3x9fH1/ff/7/fz+/fz+/f///P/8/Pr7+/n8+v/9f3t+e3p6fHp7fXz+ fn9+//3+/359fX19/n7//X7+f33+f3xdVuJuZ2dIZl7iztTJ0dXT4HpqZmNhb3748Pzn5eTe 4env+3l+a2FiWlthYGdrbnJnZ3lsY2NvbGBwe3RvffT/9fHy7+ju6d/n6O3l5Ofn3Od55eT5 dHzv++zpb3n4Y1/7bFx0cXH7fP57d+nsYfN5Xvx4fXtu5+r95d3ldfjxb3fp62rw5n159vFr aP9sW2rreXTp6W/33vdn//JgeP1p9nh86/Ht++vqc+3uaGbuYV1uXOzy5dXh2un+/l9hZGBn +3Fo4f3t13ve23nk7+3raelkXO5ccuhp6O7u/m3qXGJzXW57amr9fn7s/vT89eZ06ut97XP+ 83Hs8XrjfP7fa3X2YP52b/F08vL86fT97vp9/+3xcvhsfv109n78efx4/fF67X3xeXl+afpp aXJeZV9dXlxoY23/eujh3d3a2d3a3OHf3+bp4+jn4ujs5uj1+nJwZ2hmYWhlaGdpaGtsbnL+ 5eDiWklGOTxDQFh459XOx8nCwMjGzd/ra1pWWlhee+7d0s7P0NXn+29eWlxbXm/+7eDe4eHn 9Pb5e319dHnz7/RPPz81NT89U+PbzcrFycS/y8nN63xpWVZdXl567OTUzs/Q1elxaVtXXl9n 9uTc1tPT2uLoaHlubefs4d7bVTs8MS48PVLRxcbFv87Mx9bh32BQXF1e5tXd1tPh39ni9+5r W2RubOvd5N7a3t7b5n78bmVy9u/d2tvY20o0NiwsPEjdvra/v8Tc69V0XGpSTmXe3MjFz9vi XlpubGnv7Xjk3Orm5HRu+vby3d/u7PRw/eTh3Njc3/c7LzIpMUh5wra2xcbXY2TjWFphVVza zMvEyeRpXk9Zee7v3eLw4+J8e3pmafHl4tnc7fnxfPfh4eHe3eBQMjItKj5Xyrq0vs7XZVV2 /FdrY2Dqy8nIyNhfW1RSa+jq5Nzo8OX1Zm1nZHXj4d/c5/L89/fo3uHi3+F9PS8yKzJS3L23 t8/ZfFdZ5mpbb2X/1MfLy9VqU1hWZ+Hc4uDi/u/ub2hrZnDq3t/c5Pj4+fTw5+718efgTzM1 Ly1MdMS7uc3s+FRc8/hYeWj50MbLztpbT1VdcdbW29/mdHR6YF9pan/j4OPn8HH+9u3r6fd9 7u/e3kUxNi0zYN++u73n7W1Wa+5iUndk28jEztZtTVBccN7P3N/oeWl4Zl1paXTr5Ozt9Hr4 6ezr7f5v+/fz3uFONDYxMV//xb7C3ejnWe92XFJ3adfGydHfY01bYfLZ0d/f7GpxcGhhcWt8 6Ov07vr96eju7v5tbnn58ODfTzQ3MjJjd8a+xNzl41jsa1lSeG7TxMvT5F9OX2Xu2dXh4exq dm9nZHVr/Or2/fb/++br8fF1a3R69+7k4W87NDgvRnjbvsPN7tZecf9ZU2P75cbK0N96UFxp d9zY3ObhbXNvZmVvcG/s/H/3/frm5e/t/mlud3vz6OXmVTY2NTJbdMu/xtbm21vvZFhVee7T xc3X719PZGrt2tvj5+xqeWplZG9ufux++/j37ebq8v9sZGpvefTr5uZKMzkyN3xwxMHH4N3l W+paVlXw7svG0N1vWVBwbeHb3ebl7mt9ZGRicWz+73J+fvns3+z5fmpobm/06evk3m05NDcv S/bYv8fR+9hhcm5VUmbh18LK1vdiUl369d3e4e3meG5pX15kdnLs+nB4+uzi3vB9bmZtefv2 9O/r2/s5MTcuR+bVvsbOfdV/dnNZTl3c1MHH1mlbUlf/8+jk4Ovi7XFgXV1j7/Lye2lp/efk 3+xzbnR1efxzevzr3tbZQi40MDjV2sLGzefg0XlrV0xO3c7Dw9JuVVlYdO/3+OHe3N9/X1hd X3vzfHRpbHzs6e7v+v73+Hx2bWr96+nj3Nt0Niw3MUjM18LNzd7Sz2BVT0llz8nCzN9eX2Nb ZmBgedzW2uVtWl1kZW9oZm/+7+/xeXJ9fPf2dmtw//v07vfx6uzf2m01Kjc2SMLcyNHMzdfK UUlOS+vMx8nT2HLvflJRT2Hv09Dj9GpkaGdcWV5r+ezt/nNwb3ZxbnB49u7o7P5waXLs6+bn 9+zfdzcpNT5Bw9vUzcm/5M5OQVdW3dfMztLH2+5gTU1Pb37o2ubm6vpeWFhVX2x1bnjx/ev7 aWJlbXD3+fHk4ejr7P5+dW94dW13+O/1UjswNk1HavT8yMe+3X1rT3dp/HHfy83L1vZlX19Q VVhh6uTm/vf/Z2NYWV1sdG3//ezu83lmcW5udfzv7OLq7+70/XZvb3B1eWx49u/oXUU1LlBN Q+dbw8e9y1fPZvtaVmhvyc/U19jX7nZTUl1lZ11mbu7oZ19da2lfZ2D+6u5+b/F1dndvdnf1 //v88O306Oru+3ltYWhsbHV+cPfqdflhSUQ/O0RLTF/oy83KzdzY7XVeY/zw393W1dPX5/V3 al9ZUk9eb2Jqden2+Xdjcm5kXmv3/PL47uvv/XL+fHRz+ezp5+7z83prZGVmY3J6a2/weW7v bVNPSzk/XEROaNPNzsPXzs7kZFzwaWz469zW1OHl3/BqXlxZWlxXWV9hbWdufXh9Z3Z2endv /P3t7+jm6er48/r7fXP99O/v9np3eWpmbWpicPpodnz/aXDxWE1USj9HUU1X9trYzcnS0NPh d3R+aG/26uXc2t/f4fBvZ15VT1BZWlxq+ujo6uzv93BnZ25ucvju6ufq7Ovvfnj+/Hl3d3Jx eHR3bnD//WxfdXpobXPsd3NdV1g/QFVISVjo1tfJzsvJ0+P95m9iY2/08eLn29nf6Pf7YFlV UVBSX1pn7uzo7ODz8/hrbGx3cfvt7Ofl4+7s7fx7c3p0c3NubXl4bnF0/2hqdHFwbHZt8/1e WmdUQklVTU1e7t7VztHNy9Lk6OD7a2x7/vTt7eTe4fl0cV9XWFZXXWVpcevp7+nq8/f6eHN+ /Xl98u7v6+ft8PT4eW1sZ2Zqbmhp/Xd0dHp6b3VkcXVpZXrlYF1ZRk9aSU1Z3/LrztHLzs/d 39Xvdm3zcWl7cPXy9m5v+3RoYGhmaGloc/zz/Pru7fH5+n7//Hl99+/u7+3t7vL/d3FuaGls ZmZtbGpuam12fWphen1ybG/27ed6cGlVXF1RV1j8c/Tf49XY1d7g2eTn/PN7dnhia2p0c2/6 ++zx8vp/93p6dXz7/fD17uzv9Pz3/n9+eXZ6fmxsb21pZWtsaWpmaHRoZm5udnX/d//3/vP2 6/Du6e3p7n5hXmVdXFxhaG/19+3k3d7k3+Hi5u9+cXhvampudv/w9O/u6+3+8/v8/X14cf/8 fHl2fvT/anFpY2xiY2lucXL8bXj093h0cW56e3Nwbvjt9vv98e7y8PP87e748P36+Ht6dHBz c3Rxbnd3eXR0env8+v388vD38vH08fb57/N+fvz7+P18/vh8cHd0enlzcn1/bnFwcv16bHdu f3pvcXP+cnt//Pj293zxevzxe/bzb3r3+/J0e/r//nv99Xp6/HH8fPz0/vH5eXt9c3t5dHV1 /Hl9/257fHb/c/7z+vb/+fP2/vv4ffx+d//5eHV8em5973f/+Xt6+n51/Pt/9Hx6e/53c3t8 e/j2fXj//H/8/Xb8/3v3/nP+8/5+/n9zf3p5enZ8+ez38e/6fvx5fvdxf/N1fX16//9+fX39 eP30d/Pye35//Hl+e/r9evl5/X1+fP31fff39373/3j7+PV4/fj3fPx7dP19enb7fX/6//R6 c+98evl59/t//vv1/Pz3/f37ffv9eX59+Xl99n7+fv59e/14d/99/H99+vh/f/T1fPz0/fn5 /3j1+XZ+ef75e3Z5fXh4e3P3eXX1dXr6+P58e333enl8efz493l+9X72+3z++v94fX55//z+ fHn9e3P2e3b6fH7+fP72f2/9eXB8efl/d/f/+vp8+fr4+Pv19P57f/j9e3p8+H77/Xr3e3b+ ffv+fvV++/D6+fz4/nf3eHB9ePd8dnz98nd7/H71+nv+9fb8e/Z///R2e/d7e3509/R6/f37 +/3y/Xj/fvh7f3h8+H59d/h3ffp2fXZ8+f96+fty/Pl8eXr5+fv7e/h5f/Z2e3j9/nR3b/n5 bH74eHz39Hf283P7+Xt8ev97ffx+evR+dfZ7ePp8/fr8/XV9d3x9c318enp4/np79vr79P72 93/v//74/v799vh/d/39eXp2c3l7fXb+9Pr5/n78+vn7/P99+fV/cfTydHr6/X5y8fd6+3Z/ 9Hl++P35efv8ffz8+nV88nNz+39+eXx/fn93f3n89/31+/X+9/d5eHx6c/92cXx7/W12/272 /nV++fP7//v5e/h/+/j3+Pvvenr29H11e/pvcXFreHt8bn57dft2ff38/n/z/fru8vn4/fb0 e/37fPz7ff7/cnhzdXVwe3L+e/98eX5u//h4fv35+H737vr8/fr+/H188nx+9vd8ePN6eX50 dXV3cHR4cnt2ePt4+/t5/fLv+e/w/fvwfnp+f/h5/Pp9ff14aXP8cnp7d3dvfnZvfvZ/e+7/ /Pb7+Pj2eff4e/T7/Hx3+f72f3f5f3t5eHNueG9we2xz/Xx2/vPz9/n27u/5ffj4+fz28nx7 fHx7eHR0d3Jzd3Rzfnh5/Hz5/fby+u7v/vj6fvh3+PZu9Pp7+X18c//7+/h6ev70+HL5ePr6 b3t+/Ppy+/lz+fj+9Pv88vP1e+76bfv9dnV+dP11e/9wf3t8cXj4ev///nz38nX08Hx79PV8 /vz8d/98cnp9fG53/nd7fnZ28/h8+vx7fPL5dfr0eX7/ePP4/Xd09vd3dn77ef5+cXp9d/13 fHd+9PX2/fB7//59e3v5dn71+P/5eX59+ff693jz+3J4fnJ4+Xx88Ph5+fb79fX+/fn3/Hl3 /P5y8/Nvf/h4f3p5+3X5fHDye//8f33+8f/29/b2evv3/vT+efL/e/h+fH1+enZ8fHf+/nt7 /f57+XR9+3v59PV/7/B79fb1/v36fvt5fn54+nl4/3V193x6//13fPp5//n8fvH1+fr29n32 /Xt+e358/H16fvx3d/z7fHj5dX1+cfp++W95/X39fXv//nz2/Hz99fd89nf98XR/ef18d312 fX10ff33/nz5dnj5fHr8fnP9/Xb8fPv4f3z69ft9c///fvj9/nb78HlzeP99fXlx/HhyeHt4 ev5+fPv2fPL2+vft8H35//n6eP/+fHT4+X/2cPXtb3Z79HJ8/Hj5d318/Pn88v7+9fX5fv33 e31+d3h6/H94//n2/Pb6/vH+fv37e3V3fnd7f3r+/vx8/Pn/+fv0+Pvufv3z/f54+P99+n7/ /nv/cX77cfp8b332enT7+Hp3f3J8dXV+fP57/v3++vh/+3/8+Hv5/np4dXd0cnXz9vXz8fj5 6vj9/397cnt8//97/Pn8/XlvbnN3b212eXd/eXz5/vf+e/3+/f738/Xz+P/+e3p9fX17dnz/ e3h3fXx+/vz8//78//309vf08/f3+PP0+394eHt5e317/P18/nxze3l0d3dzb3Bxb3Fzen77 9fXy8u/y8vDz9PHz8+7v8O7u7O7u7u/w8/r8/n3+/X39fHVzcnNxbWptb3Nzdnd+8+/n6GtR SEtPTVZXW3Tazs/MzM/Pz9bseW5jZmxqY3Dv6+Lj6vf9fG5mX11eZnF6++/p5OHi7PT2/3p2 cm969fLt6+rp6Ojs7+/8eHp+eXl9e/x/+nZiVkk/Rk1LXmH138zGzcrP2d7i819jaGr24+Po 29nf6PJmWl5dWVxiZ3bl4ejj5u71+XNmbHBv/u/u6uDh6Ovs8fXzfnZ7eXZ9+fz//Hp0eHxo VUw/QU5MW2b738/Gzc7T4Ofs8mdkevzk3Nvh3t7t9nFcWV1eX2hwb/Pl5err83z+em1rdnn+ 7O3t6ebr7vF+/e/w+Pr4/vv0fW95/3x2dW5uaFdPQj9OTVt39t7Tx83Q0+bu7/Btavf54Nna 3+Hi/f9tW1deYmJ3eHD16e7893ZqfHxvc/r/9ubq8O3t+fXu+frv9nz59HZ1e3lzdW1kbXRv cHNdVUxBTFFSb3Ti3M3M1NLe7O3u/XDu7uXb3ODl5Pxvbl1WXmRicX50/ervfPt7bHp/cnf6 +vTp6u7u7vX17/f9+Pf89vF9cnV2dX56amdubW5+Z1ZVSUJSUFh0+N/Zy9HY1ufz7fBxdOvu 39rf5eXm+3dqXlldZ2Vue3L87+95enlteX52ePn09Ofq9PLx9Prx+v/z9/r39n59/3j8fG9t bGxrbWxfVU9DSldPbnDr3tDN29bg8eju+3Lt7OTb4OTm4O3y+WZfZF9bYmhjePl9/Pb+cfx7 bXx9//bu9fTr8vHu8fHu6e7w9H14enlucndweHNpbHJvb3BeVFRISVZQYXXo3dTN2tjc6+31 /W7y6evg4OTl3+j7/WxgY2JZXWtmdvb8++7ueH16b3V7eHf38/Xr6e7v7PT57/Hx7vt7/n53 e3JqdnFrbmpqbnNiVlZMSVdTWGr339rO2dvX4Obv9HD66PLr5uXm3+P38/xvYl9eVl5oY259 +fvr7nV/enJwdnF08PT48e3u7Oz39vLz8vD6d396dHNwc3N6cmlsam1ta19WWk5NWlJdavfk 3dHb19ne5PDvdff2+/Lu5eni5u3wc21pXlxeaGVqfHvv7O37+vJ7e3h2df38fPbv6+/u9Pv0 +n98f3p99Xt1+PJ5ev9wa2hvZWdpW1pUT1hXWmFt6ejZ29rX2tzo5u7x9Xj9/ezy7+35+Pd0 ZmRnaGJpanT8+/v46/D0+fv+fX1vfvv8/vjx8e33+fx3eHJwbnR5dHZzbmxubmZqeXhuZWJW VGBSV11ufvfd49jW2d7f2+zs9f55e3xt/Ph8evZ+bXxzamt0bW19eXr37fjz6/L48/Z4fft6 d/r3//j1+fn2f3l6dHFrbm5obGxtbnR1c/38/XVsXVtnV1lcZmtu6+7e29zd3djg5ent8357 b3Jvb3Fv+Xt8/vb5fvf//P7//3z3+vz48fb18fXy9fb8/398d3BxbW9ra2xubWtwb25xcG90 fXF3+vX2/PNxaXVtYWNsbmZ2ff3t6eno397k5OPn7vd7d25saWtzdHt+8O/u7O7s8PH19/p9 fHh7dXFyd3p7/Xh4eHB0cnFyb25sb3htb3l+en/4+/P39Pr37/Pz9vH19/j7e359cnFzc25w c292e3z99fDw7Ovs6+vr7u/x9/f59vb8/31+fHx5d359eH90c35ub25rcW9vd3t9fnx+9Px6 8PV9+vX+fP79/3t9+33/+39+/P56/Pb8+/r7+PT2/f75/Xp3fX91d3x7fHp5/Pb0+Pfu7/f0 9fp++/78/Hp4ef58e/n0fX7+/X15eXd+dW93en1xf3539X16+v5+/fT3efz6fv77/3X/fHT4 fm399Xh8+v3+//r5fv97enx9eHB9e3R8fH17f3/9/Pr5evv8eP31+Hn79Hb7+Pp/9Ppw9/V+ d/f2+/1+9PT0+/zy/f/zfvx/dvx9dn59fHl3eXJ6eW96cXV4b3d1cXp5evr69/j89vf1/X7u +vrt8vf0+Pb5/P37+Xd7fX75ff9//nX+9W/+dHV/b3Jzc3dzeHT2eGnw/Hl693v78Hbs9vnz 9Oz89H/8+P55fvxseHxtfnJ1ffp1cfN6fH529f79dX78bvp8+/R3/X3ub/vtdPf0/njven/0 cvr8b/Z8ee9ufP1ycHx+cfV29/f++f/6+nd7+Hd2eX53//d09/J6fvP8dPj0e3v8enR5f213 d3Bycntwefh5ePX8d+/rcPPoffny7XR17nP47n707O/+7ux69u59+/fyevT7dvZ0+3N0+nr2 +vb9+uz3evT3bnVvXFteU1ZdVl1pZWn9/Hnq5ene2Nze1dnh2t3g4N/p8ef1d/tza2loZWNn YmRnY2ZoaGNrbWh4d3r++vD56O7v6vXt+fH6fO34/PvyeXz0b/z+evz+/3d7dnR1enpv/n9y ff//f3x7ef5+efv6e3n8e3V8e3z9fH37/Hz78/z78vf5/PPu8u/17+z38+/y+vj6fH39fP78 eHL+f27993Z97/7++W1tYm1cU2tTWVxZYl1wbO/k7Nna2NfU1N3b3u37/mxfZ11cYl5jaHN6 8ejq3t7f3N3f4eHt7e58fXJub25ubXl3cv35/e/zcGtiV2ZNTGRIUlRWXVrycd7c3MzSzs3N z9bQ3d/o/39kX1pbVFRVUVpUXGNnfHvl6eHc39vi3eHl5Ozp+PHy+fT67vj27vL1+PL9en5z bmpfY15OWl5JVlxOWVtoY3rr5tfd0s7Sz8/O19bX3+b49mpfZFxXWlhZW11iZmx59+/q4+Di 4N/j5efr7/j8fnhycnNvcnR0enR6fHN2dnZpa2xaX2pVXGdZXmNvZ3nu7+Ln29nb2NjX3Nvb 4+Xs7/5rbG9hXmpgXmNsamn7fv307uPw5+Pt6uvv8/p9fndzdnNvcndv/W958mn1+2nzbHt7 a/9xbXlubnhubXxwcnh9fXj19fTt7unr5+Tn5+jn7+/v9/t1+3dsdnRvb3l1eHz9+3v39n73 /P/9/3h9/W74dXT5Z+xvc+xu/f/0df3tbvjwcPP6efj4eX31b3Z+cHB1cnJ1eX579/jz7uzp 6uro6uju7O339/l9fXlv/GpzfWX6cWz9cnb5dvx7+/h8+Pr8d+xu+PJv8/79fPZ//P19+XXz c3r8bXtxdXR2cXZ4c31+/vvz9e/u8Ovu5+7p6ffo9vX2fn54enhzcntucX5seHd0/3T4/3fv b/J/dfFv9HRu62T28mfseP5//fpz7mz9em18aH1pbnFub3N4dn/79/Ts6+zp5ujo5ufs6+z3 8vl+/XZ9dHl6cHl2dnV/eHd+/vx7+Hz59nLrbvv1evv9+//x9f32d3heZW5TXmNbXV99aHzs 6d/f19bX1djW3OHk9HtqZl9bW1pcW19nann26+Xf3t7c39/m6+z7+3t5f3r+9vfu7ujv6eTy 7e/3eFtZVkROTD5OS0tSYOx5z87KxMfCxcfM0db0b19XUE5PTk9TWV5t+Xzc3ePa29zq5Ox7 fW15cXTz7OXk3Nrc3d7e5O3u8XV6dmhmTERGQUg3QFtAVGzWz86/wL2/xsHJ2PlxXk1LS01P U1/63trSzdDV3exxWlhPS1FRUl58693Uz8/O0tfa5/dzaGRnbHT/6tzd2dPY2eBdR0Q7PD0w QktGYtzGwLy7u7m+ztLhW0pGRUVIS1bu1tLKw8PHzdXoZlFIR0VDRE1WXvPe0MvNzs3Q3/lx Y1xZWV5tfvLh2dna3N/k7nJma2tobfft5d7f2t1lU1JEOkZDOE5UV93MysO7v8bDyeX2Zk9O UExOYXn12c7Oy8vU3eVrVE9NSktOUVx76t3U0dTZ3fluXVVYUldeafjk2tTPz9LW2ub9bWNc XFxcYm987ebh4d3e4eXn5OLeXEtRPz5ROz5cVW7fzc3CvcfKxc3h8mZSV1hMT2BrduDb2c7O 2d7e9mReVE5TVFFWZHTx4N3a1tXc4+j7bmNcWFtdWlpeanv09ujd29ze4eDh7Px+fX17c3N+ 9/r8//r0+X11dHZya2hra2xsam91dHp+/fDs+V1e+1xcX1ldcXpnf+Tj39ze39vY4OTj6+7u f21uc2tpaWZjZ2tkanNwdvfw9Ozr7ezr8PHt8Pr39//+/3x2enp2e3t9ff/5d250b2lmZF9e Yl9eYWltdPz17uXf397d3d3c3uPl6e/4/3VubmxpaGlpa2xsbG9wdHN5eXj9+fn49Pf19Pn5 +/r5fnx6enp7eHZ9e//7+fT08/Py9Pj0+Pr8//5/fX//e33/fn5+fn16d3d0dXNzdHR1d3p6 e378+/38+vn5+Pj4/Pr7/v3+e3x9e35+fn/+/v34+vn29vPz9fT09vj5+/r+fX55enp5eHh4 d3p7eXt+f/36/vt9dXl3cGhtbmhua2hrb3BvfPz77OTj4eDf4+Tm6+zt8Pn9fnZ3cm1rbW5t b3Bvdn17e/7+//39fHv9/H1+fn59f/59/fn7+Pb59/Lz9PTz9fX4/Pv5/nt8fXx4eHh2d3h1 c3Z0dHl7en9+f/z7/Pr8+/r8+/7+/v9+f/78/Pv4+fb4+vr+/P58e3l4eXl7//7+/fv7+Pj7 +/58fX57e3t7e3x+fX//f39+/3x9e3p+e359ff1+/vz9/f//fn18enp6eHd9e3p9fX7++P1f WOVnbdr+3Nvv6+LnffJ+bff6a3DydXX0d3Pw/HT99HZ7fW53/XZzeXp4+fd1/vD59/Dz7/T7 cf5/amtnZGhraWt3/vzz7ezo5Ojp6erv8fp9+v16en5++vf99vH08/fz9Pf6//18fnl1enh9 dH5/efR2/H97/Xf2e336eH3+fX7wfW97Zl1iY1tgZGRv9fbw39/f29vd3N3k6OjzfntlX2hh X2lqbf3z+Ozk6Ofm6ujn7vPx+P72eXd5/nJ2d3Fvb3NoanNxaHl7cnl4/m/7e/7y8fH4/Hxq Z2tgZGRmbHz7+Ofh4d3c3d3c4+3yeW9sZmdtdHn48uvm5uXp5uft8fx5c3ZvcGxpbXVqeXZp eG9ta3BsaHVwbX15b/z4//bu+e3p6uvq5+3q9XFvfG5tbGtufH16+fDs6Onv7u3q7u/v7Ovv 8e7u6+7y7frw9nd3eHV1bHNubW5vaW5ubm14Z297bf92fW399Xrv9O7y6/Pr6vXu+u/08PX9 93198Xd9+W77enhy/nN1/3J3+v/+/PP7/Ot37fT49+998PL4ffnyc/F59nbwdnr2cP12fm7+ bntzdHd3e3D0ae17/e/57Hrp/fntdO39/nx7/HD2eH979XL1e/72+vr+93nweext8Hl79HP5 cO9v8Hb9/P119Xz873ToZux8c+53eedo7vBf2FjbbHriY+Bsf+tt/vpm9Gxt6GPlav7rbet7 /e948/Bj3V/s82bhX+VxbetteO1t8uhl3Gns72zfY+h2dff1aONuadxa5mh/cPZu7GTcYvD4 /nnr+mzeY+Jp5F3eYeNf3F/j+HbgbN9h3Wt4cudV2Vr3bmjeT81V5OVh22beaez5/2/ma3Ti Wd5m8vlq3Vzh/2jke/v473T693z/+vZqdvhg8fxr6nT0ePfyb+/0bud37Hbrdu57fXP0d/55 /3fy/e1w7X/5/vt8dvBw9XD4cfh/fvp59HP5cfZ7evRw7HHvcX/1ee54fXn7d/55c3r79//t +PHu7/J07nR3/Hd5/fV7+/f+dff+cf70efj1d330cXL8dnnyfXbu8fr29H388f57/Xt8+f9v /vp8+/d7/O7+e3p6c/v+fPv5+fn5dnd6e258dW5++3t6/XF9+Xp2/n54/v53dH92c3x/e/z6 ffr0+fjv8fPw7+zs6uvt7fD4/Xh8fn37/n58eG95enlxcXRzcXlwb3BzcXv99Pjs4eHY22hN U01LUk5PYN7e1M7Qz83Q4Oj8bGtuYGN2+uzh4Ojm63RhYFtaX2Nme+jj3dzd39/m9n56cnV9 ff3u6+vq7Pp5fGtnamhoa3z89Onp7m1lSkJUSE9cXnncyNLLzM/W1ONnbWZjZn5v/N7d3tzf 7+3+aF5fXFxhX2FnePXt7O3t7O33enr/+u3p5uPi4uPq8Pb3+n52cnZ2cm9zdXx+d3d2+3p8 bllaVkxMV1Rbe+/l2M7W1NTc5ujyanR/e/no5uje3+bs8nlral9cW1tfYHJ+8ejj3+nm7vv+ fHx+8e/r6Ofq6+3z+n5+cnRub3V4cW9++fl3/v/78XZfX1BCT1ZMYGjn4szN2s7R1+vna152 bmpq6+zj2+Hq6eN/a2hgXmJlXmBpbGpsenb+7PHv7efu7Ont6ufl6eXn7vT7fXn7/X73+fx4 dXdsb3dua3h1evD+XVhiUUVLWU9ffuzfzsnVz8/U4ur2YW5vamV96uzh4ubq5+9taGZgXllY Wltlcnrz5t7f4eTq7O/8d/nt7Ovo5ufp7fD2/v5yb21pbGlsbnf/ePt4f/13XVhjT0VMX09Z auPe1MvWzszO4e7fdm1laGNu8Xf56N3l6+Xx/mxcV1VYWVddd+7n4t3a2t7o7fLy/3R89vP1 8Ovm6e3v7vpqaWpqZl5kbnVxbnrv63toZHVmT0ZcZ05RYNv33tnVzc7Q49XV5Wts7mtiYW9z ffx79fL6aWd2a19fbXRtfPTq5uLk4t/i6vDq73tveXp1b2/+9ntte/h6amh6cmhreXlxdnt6 dXl6c3JdVnFkVVl172J/4djh29XW2Nrb4d/m9nf//GpiaW1nZmhzeHp8+Ozt7e/o5+vv7Ory 9PLy+/36/X9+eXZ0fHFscW5ubW9vanZzbnJ3/HF2+Pj9/fL08fP07u71d3/ufW5z7/5revDy evfq7PXs6Ort7u/0+vv9d3h8fHl6fv96//j6+/n5/v3+fXl5fXl2enp6eH39e/z8/f7//H58 /f1/fn/8eXz9fnp+/H3++/v5/fz69vz69vn7f/n8fvp+fv9+/f/8f//+/ft+e3p7en14fX1+ ///5//n8/fz++P/+/319en19fX9+f3t9fX/9fP58fXx5e3Z8e3z+//v7+vj4+/389//++vx9 /f/+fnl9fnx9/fz//Pn9/fj6fvv9/H59fnz8eXz+fHt9/f/+fff5f/r29v5/9vp7/33+fXn+ /vx8fH99dnx6+3h7/nx/ef36fHz5//96/n1+f3z8e/f+//j//H3+/v7+e3x+fXf9fXx//3v+ +HT5/X34evn2ePx69n57+Hv4/372//379/x99n1++3/9e31+dPl9fnr59nL8+Pp19vt0+f12 Xu3iY33k8Xjz5/h05/Z3//t4b/h3b/X5eHvv9XH2+nt1e/5zdnj9fHz+9Pr7+u929fP9fvnz c3p99G9893/9/f79+n5+/Ht7/nr/ef19+fx++vP9fPZ6f3R+/nZ8/n50eH/7dHv7/XZ++nN6 /Hxzfvt8//z39n/48//6+vl3e/9yfnp0fvt9dvT5cX30+3H+73h4/f12c/l9dHb5/XL4fnX0 +XT57314+PVtfH92dn78d312+v17fvv1+vt9+f52c/z9cnT8+Xr++/P0+H3/9f16d3v/fXFv f/t2d/j78/f0/Pb5eHV5/Hj5cnh2/Xhudnb8eH15+vt5cn1/a3Ftamhsam79+vj36unq7Ojl 5ejo5+nn7e3s7vD7+Pp9fXRyem5nbWxqcG17cWx6+XZ08mxufnNzc93l3OZdTFxlR0hXfmb9 39nNy9Dc0dDmbXp/aWRlan7s8fPl4/VuY2VkW1lec/v87ePd3N/p6unxdnT4/P347uvq6u3u 9Xdtb2VfZm5qeH/77Ofzd/7r+FlaWURGZEpPZt7d28jUzc3Q7u/ibWZkdWzx6u/m3d7v8Ph1 Y19YU1pcXWX+6uPe4uXo6ft0ff/08uvp5t/l7fHp73VsbGloal5jbX/9/fF98vT+bfj4YF1i V0FMfUxdbNzb0Mzk0NDWb/3xcH90fXve3ubr4ub5fWdmX19aVldgbm56697f4er57+7/bn7r 5+fn5+Xn8Xv6935tbWxrb2ppb/h0d+/0a37vbXf8XV12YU1Ba21Q9G7X2Mvh99Db7mXvdenh 9/Xf2e3u8vr9/Gdhc3NnXmZgW2ZtYXjs8Pnq6/zr7v325erw6enu8/d2/fD8cn55b3Jsa29z bHR7dv5vdvT+b2hlYmRdTUVxblLy+NbVzunu0ON9bPL+5uZ37dzf/PH1/fZ4ZWv5eG5tbGZt ZFNa8Gdo/e/m5ets7Ob7dfnq6uX19OTj9fvv8/V7aGRva2Ft9Xt4eXT9/WZg+nxtX2B2Z15L VPFcam3n2Nfd/tnb7nV68u3ofPbf4O/38PL0dmhufW9sb3N6amRgYVlld1719u3s6ez34fn7 7enu7On56+3+fPn4enp4bnJ1a21zcnRudXxxfWlv/nd0aWVobl5PWPVaaXvw2tzf7tXe8fL1 7vPyb+7h8fju6/L0dnP3e2tueHZyZ2BsaF5oa299/Pvu5+/z7O3z7+/x6ejv7Ovt9Pr+eH11 bnN1bmxwcWxs+2t/+mv0e3Jsc3pra2VvbV5XbG5fd3To4ebr3tzr7e3r7fH+9+nv+e/r7vn9 eH18a2ttZ2FlaGdvbnj39Pj47vTz+Pvz7/f67vH28vP08fb69/p/fn52eHdtc29sbG5ubndv cnt1d3Z5df76c/t/d2dfb2Vga2718O/t4eHs6Ons7/X+9fN//PTx9PX4+fp6bm5xZmxsand1 en32+/zy9/X1+vn3/f/7/Pr5+ff19v36+X16eHV0c21xb290bnd9+3x4/P92dHN5eXF4/Pty eXViaG5haHNx/vPx7uLo7eXq7u/1/fn6ef/4/f78+v/9fnJ+e29ydXV4enV6+n189vf7+Pn8 +ft8/vx9/3/+9/f2+Pn9ff19d3h4c3N1cXl3dHx6/Xh7fXT7eHv7//x1fHVna2llbG54/Pjz 7+js6+nq6ezt8fX3fv99end2fXd4dnf/c3Z2en51fXn9+nv6+fb6/Pf9+fv//X/9fXl5eX18 fv79/Hx7/nx6eXp9e3p3eXx4enh4enZ+en1/fPr+//z8+3x/e3Z8dnV8fvz++fXz8vTx8PPy 9fT09vX09PX19vj3+/r7/v96fXx2eHZ3eHh6e3p7fHx8e3x7fXx6/v9///76+/n5+fn6+f39 /Hx+f319e3x6en7/fvv8/v5+/3t8fXv+f3///Pn49/L09PH08/f4+Pr5/P39/37//n7+/31/ /3///n9+fX18e3x8fHt6enx9fv/9/X/8+/35+vr6/P5//35+fX59eH5+fH//f37+/X7+fX/9 fvv+/fr6+f77/Pv7/Pn//vr7/f36/P38f/7+fn5//fv7+Pj5+vx+end3d3Z0dXV2dnN2dXV3 eXt5e3x8fHt9fn7//v38/v79/f7/f/79/Pz9/f7+/v79fn5/e3p7enp7ent9e31+/3/+/v39 //78/f78+/39/fv7//v8fv3+/31+fXx+fXx+fHp9e3d3eHZ2eHd3eXh4e318/Pf4+ff2+fby 9/X0+fj7//5+fXl7eXZ6e35//37/+/79/P38/f3+//78/f38//7//v1//fz9/vz9//38/n9/ /39/fXx7eXp5eXl2d3p5e319f/99f3/+fv/8///8/v37//7+//19/35+/3z/fv//fnx9/379 fnx+enx8fH16e358fX///Pv+/vz9fv///399/v1+ff9+fH57fHx7e379/vz8/Pv9+/38+/v6 /f3+/n5+f3x+fnt9fXz+/3///v7++/v79/j5+vv5f39+en17e3x8fn7+///+fv9+f37/fXx+ fX59/n1/fXt8e3x7fH1+/v78/Pv7+vn6/Pv6/f39//9+fv////1//v9+fn1+//3+f/3+//78 /f/9/n7+/n7//v7+/v7+/35+/359fn5/fXx9fHx9fHz/fHt9fn57ff99fX/8+/38/fv8+/n6 /Pn7/Pr9fn58en58e3t8ent8fH17fH5//n//fn5+//98/X9//n7+fv3//vv7+v36/X5+fH14 eXh5eXl5enp+f/38+vv7+/z8/Pz9/v77+/37/vv7/n99f319enp4d3x7fHt9/f7+fn//fv/8 /v7/fP/9f/7///99f/9+f31+fXx8e339////f/9//fx//37///79/fv7+ff6/Pz9/f1//v3/ /31/fnx+eHt+e33//f/6+/r6/Pj7/f3/fv98fn58fn19f31+f/9+//3/f33/fH1/e/9+ff1+ /398fn58ff99fH5+fX5+ff7+f/78/fz8/f3//357fHl8fXx9fHx7fX/+/Pz8/vz8/fz//P3+ //79/P39+/7//f/+/v7//f5+/n59fX59f31//n7+/f39+/r7/P9//39+ff/+fv/+/n//fHx7 e316ent7f35+fv79/vz8+/z++39+fHt9e3p7fX59f33//f79/f7/fn98fH17f3x9fXx/f//9 +/78/P37/P3+/P5+/n3//378/f39/f19f319fn79/3//fv9+//7+/Pz7+vr9///9fnx8enx9 e379/v79///9fn5+fHp8fH1/fn5//35+/35+/39//n59fXx8e3x8fH5+f/z+//38/f7//fv+ /X59/3x+e3t8eXx7e3x7fn//ff37+/z8/P35+/z5+vn6/Pr8/v1/e3x7e3t7eXp7eXt8fP9/ /////P79/f////9//f1///79f35/fH19e3t8fv97ff5+/f59fn18f35+/379/n78//78/fv9 /f79/Pz9/v5+///+/n9+f35+//9+/378+/77+/z9/v39/v5/f/99e3x+fXt9fXx8fn9+f/5/ //v8+/v+/v3//n19e3h3eXp5enp9fX7+/f39/f39+/z+///+fv9+fH1+fXx+fXz/fv7/fX18 f35//P1//v59/35/fn9/fn57enl9e3x///v+/Pv++/z9/Pz9+/z+/v3+f39///3+/v79/n7+ +/z8+/z+f399fX57fn19/f/9//77/fr6/P19fn99f3x9ff5//vz+//9+fv99fX58fn57fH7/ fX//f/7+/f5+fX5+fH1+fX58fX1+/n5///7+/f7+fX3/fnt9/f7+//9+fX5///39/P37/P36 /P3+/Pv9/P79f//9fnt9fHt+/n7//vz7+/v7/X98fH17fH57f359/n7+/v78/Pz+/fz8/f99 e3t4e3t3eX16fP5///5+fv7+//z+//79/n57/318fnx8f35+/3//f/9/fX5+/n9+fn5+f/9+ f31+fHx9f//+//z+/v3+/f36/Pv6/Pv8/Pz+/v7/fXx9e3x/f//+/vz9/vz8/P1+/P7+/v7+ /vt//v5+f////f5//v9//f1/f/7+/P1+/Xx7fX59fn99fH17fP5+fv5+/399/X79/f79fn18 fXx8fn7+/35+/v97fX59/X58/f3//358e3t9fnx+/31+///+fn//f35+/X5+/31+//5+fv59 fv9/fn5+fX1+//7//vz7/vv7/Pn9/Px//398fHt9fnx+f/3///39+vv8+/37/fz6/vv8fn9+ fX59fH17e3t7fnt8/37+fv38//1+f397fnt6fHx9fP/+/v5+//39/Pz6+/z6fv98enp4enh5 eHh7fHz+/f78/Pz8+/z7+v38+v3+/fz+fv59f/1//v9//n/+/3////9+//7//v78/vz9/f5+ /31+fv9/fn99fn59/31//X39/379fX9/fH19ent8e319fn5+/f79/P/8/v///n59fX19fHx9 e3l6fH7//fv7+vv8+/n9+vv+/X5/fn1+fHz/fv7/ff3//v79/P79/Pv7/P37/f/9fXt8e3x8 fH18fX18fH58e/5///z8/f38/vz9f///fnx/fn5+fX58f318fn59//1+ff9//359fX19fH19 fnx+/P79+fv6+fr5+vz7/P39f/9+fn19fHx8en1+fv7+/f/++/r7+vz++/v8/vz9//1/f398 /n7/fnx+fnx7/n59fn3+f319fHx8fnx6fXt8/v///P/7+vv5+vr6+f38+v3+f359fXx+/359 //9+/f/9/v3+/v99f//+//3+//7//P/9/P78+/z9+39+/n5+e35/fHx8fnl8fX19e//+/v37 /v/+//5+/n9+/3p9f319fH18fH1+fn79ff38fv3//3/+/358fX16/318fX///v38+/z6/P39 /v7+/v7+fn5/f/7++/59/X7+/n/9/v/+f3//f/1//fx//n7+/vr9/fz/f39+/39+fn9//3x+ fn5///3+/v7//n98fH17en5+e39+fH5+///9/P78/f/+f359fHt6ent8fHx7fX58fn///fz7 +fn7+Pr9/P79fnx8enh5eXZ2d3h7fv/++/z7/P/8/v79/358fHp7fn//f/7+/Pz//n1+fn39 f/5+f318/3x9fP5+e318fv/+/v78/f3//f39+fv7/P7//fz9/f7+/3/9/n7/fn9/f/7//n5/ /P3//P9+/v/+fv7+/f39/v37f/78fv//////fH5+e3x8fn19eXt7eH98ffz//Pz7/H/6/fz9 f/99fX1+fnx9enx6fHp4fnh8fn19fv3/+/r8/Pv8/v3+f37/fn79/n7+fn7/fX58fHt9fHx7 fH19ff//fv79fv/+/v78/n79//7+/f77+Pn2+vz9//3+//7//n5/fnx9/39//X/+/n7/+/99 /n///37+fX/+/Pz+/f77/fr6/Pr8/Pz7/379fXt8fHp8eHp8eXt5fH19/v/7fvz8/vv7+/v8 /X97eXh7eHp7fHx+f//+/fz//f3+/f/+f37+f318e3p7e3x+fP9/fn99f3/8//79/f19/3t8 fHx9fXz/+33+//78/vr9/v59fv39fv79fv79/P3+/379/P/9///+//7/fv/9f/3+/v1+/v/+ f3/9/v39/v78/P/8/3//fn17fnt+fXt8fHx8fX7//f7/f35+/v7/+//+/37/fHx8fH19f/79 /3/+/v99fn59fv9/fH5+e3t/fn/9e319fP5//n3//vz7/fr9+/r8+v78/v76/f9/fH9/fX1+ fX///v58fn////79/Pv6/Pz6/fz8/vv+f317fnp8fnx9fv3/f39///7+fv9+fHx8fX19e318 ev9+ff78/Pv7+/v9/P1//vz+/f99//5+//3+/f39f/z9//98fX58fH1///7///38/P7/fnt9 fnt+fnz/fn3+fn18/n99f318fHp6fH5//v39/v38/fj3+fn5+fv5+/v/fXx6e3p6fHp6fX3/ //v6/fr5+vn6/f3+/f39/v5///99fX59fHx9enp8eXx/f3/+/vz7/vz+fXz/f35+fHp6fX17 fX3+/P37+/z9+/v6+fj5+/r/fv97fHx6eXt6e31+/f78+/v5/Pr8/f37+vv8/v/+fn5+fn16 fH1+fn1+fn5/fv79/f79fn59fX59fHt+e3x/fH////9/f398fP9+fX3+f/79fv7+/v3+/f7+ fn5/fHt6e3p8fHx+fn9+/vz8/Pv8/Pz8/P3+//5//v59fv5//f5+/X7+/f//fn5/fv99/vz6 +fj6+/l//v5+f318e3x7enp6fHp9fXx/fH19/v7+/Pz6+fn8/vv+/n99fHt7enl5eXt+fn7+ ////f/38+vn4+/v8//1+f/7//v///v/9///+/37+/P78/f/+//3+//7+f398//99/f/9/P78 f39+fn79+/3+f/5///9+fX3+ff7+fv7+/317fHp5fH1+/319/37/fH1/fX7/f35//35+fXz/ fn///n/9/f78/X//fnN9fX19ev5//v1//f39/v9//v79+//+/v/9fn7/fv7///3+/fv8/Pl/ /vr8+/7+/f19fnx6e3t8fX99fX9+/f38+f3/f359fH19fn5+/n17fHx9e3p7fH3+/f3+/vz+ +/v9+/v7/fz//v19//59fn7/fP7/fvz9/f38//3+fv9//f7//v79/n19fv5//f3+/fz+/v5+ fnx7fHt8fX58f3z+/H7+fn7+f/98fn5///9/fv98fn58/35+/f7+/v7/f////37/fn59fXx9 e319fP99fH99fn7+/v79/fz7+vv6+vz7+/v9/358fXp8e3x9e/z///77+fj4+Pf6+/z9+/9+ /v99fnx7e3x7fHx+fn39f/37/fr7+/v6+fv+f/59f358fXt8fX56fHx+fv/+/vz///5/fnx9 fXx+fn99/v///39+fX59//5+fn1+fX3+/f7+/f3+/fz//v7///7//v/+/v/9f31//3//f/5/ /f38/Pz8+/z9/v79//7+fn/9f/38fv7+/v1//317e3l5eHp4ent8fn78/vv5+/r+/f///f39 //98e357fXx5enp7fHp7fnx/f//8/P39/P7+fn9/fX18fH58fn19fn3++/z++vz8+/9+ff5+ fv3//fr9/P3/f39//P1//X59fn9+fv78+/38fn1/ff5/fXx//P/7/37+ff98/31+/n7+fXx8 fH59fn18fX5+fn5//v7//f39/fz9//99fXt7e3x8fHx7fP3+/v79/Pz8+fz++33//nz+/v7/ /f//+3/+/f79//38f359fn9//v7++vz9+37+/vz8/P98fnv//3/9/vv8/X98fnx8fH1+ent8 fHp6eXd7e33//fz8+v79/P37/f5+/39+/3//fX5+/398fX18fHx9en//f/7+/339/f7/fH57 fn19fHz+f/38/f78/f76/fz9/Pv8+35+/359fnt7fnt//339//36+vb6+/r9+/x/fX19en58 e3x6fX98fv98/n///X3/fv3/f359/3x+fHx8e399fv7++//9/P3+/Px//n1+f/7+f/19/v3/ +/z9/fv8+/7//v//fX5+ff3+/P3+/fz5/f7+ff3///98fX59fH97fXt5e3t/fHz///79//78 //7+/vz+/f5+fn5/fHp6fHx8/3t9fXt/ff/+//z8+/n7+vv9+/v8/H78/v79fn18fn1+fX5/ ff3///z+/f38/f79fv9+f/7//P///33/fn5+/f39/Pv5/fr9/v19fHx6eHd2d3h5eXt8fn7+ /v37/Pv6/Pz+/3//fn58fn5+f33/fv9/e359fn7+fnz+f//9f359e31+e359ff5+/3x+fnx+ fv79//z9/P7+/n9/fn16e3l5e3t8fH5//v79/n/8/n/8/v7+/n59fXt9fn9//f7+/X7/fHx/ fnx8/37+/3//fv/+/v79//3+/vz+//3+//38/Pv7/Pr+/P3//f/+/v99fv9/f319ent9fP/8 /Pr6+Pn5+f39/H18fH58fH9+fP////7//n5/fn19fXx8f37/f33/fX59fnt8fX39//79/fz7 +/v7/vz8+/n++/x+/n18fn1//n9+fnx//3/+/vz8/Pz+/f3+/Px+/35+fnx+fXt9fH59/v3/ /P/+fnx+fP5+fH59fn7/fv99f3t8/3z+/n7+/v38/X/9fnx+fHx7fn18fXx9fv39/fz8/P78 /f37fv5+f/1+/P39/f////9+/P9//37+fX1/f33/fXz/fH1/fH7+fv7+fn7+fP/+fv3++/v7 /f7+e3x8e3t6eHl6eHx6fv3//P78+vv6+/n7/P39+//+fn79ff78/v38/f5/f358fXt7fn17 fHp7e3t8fHt9fv7+//39/fz+/f3+/P38/ft/fX99fHx8eXp4eXp5ent+/fv7+vn9/f3//v7+ /vz//v/+/f79/f7+/v39/v38/35+fv19f318/Xx9e3t6ev97//7//n39fX/+//v9/Pz+/f1+ /fx/f3x8e3h3eHl6fHt8fX39fv3//vz8+v36/P77fH58e3x4e3l7fH1+///+/X79fn5+fP5+ /v59f3t8fv9+//9//P/9/X7+//z6/Pv8/v7/f/3//n9+/359f//9/f39/f39+fz7/35/fX58 e3x7fX5+ff7///1//v7+//9/fn5+f31/fH19fHt6eXt7fHz9/Pz5+vf4+fn7+vr7/v3+f398 fHp8fn19fn7+/v79/v3+/vt///9+/3/+//78/v38/v/++/38/H7+f//+f37+/n9+fn98fXt8 fHl9enx9fHx9/37+f//+/Pr8/P7/+///fnx5e3l3fHl6e3v+/vv6+vr5+vj5/fr7/Px9fX17 ff99fv56f359/vz5/Pr4+/v8/f77/f3/fX18fX18fXx+fX5+ev9///5//X7+/31/fXx9fX57 fHx+/f3++/39+/v7/f3+/H5//X37/f3+//z/+/39fn1+fX58fHt9f31/fHp7fH5+/n5///3/ f/9/f37/fX5+f/7+/fx//v7//X7+f37+fn18e3l7ent7e//+/v3//fz9/fv7+fv8+f7+//// /v78/P3/ff9+fn9+//7+fv5+//5+/f78+v3+/n7+/37/fXx9f3z+f/5/ff19fX5+/399f39+ fn58f3x+ff38//57fXx7fHt7fHx//fv8/vz7/Pz9/Pz+/P7+/f79//5+ff5+fv99/3///v3/ /P5+/n7/fn79//z8/P7+/P7//3/+fn99fXx7e3x8en16ff7//f3+/v1//n59fX19fP/8/Pv9 /v59fHx7e317fP99/v9//3/+fv3///5+fv78/vr8+/r9/f3+/vz7/f3+/v99fn19fn19fn5/ /vz8/fz7+/r9/358/n7//33/fn7/fX1+fP7+fv98fH19fn3/fn/+/n98fn1+fnx/fX9///99 fX3//f39/X/+/fz9/n5+fn1/fv5+/vz8+vv6+fr5+vv9/316eXp8ent5ent5eXp8fP/8/Pr6 +vr6/Pv8/P9+/3x7e3x7enx8e35+fH1/fv9/f319/n/+/f37/Pr5+/v8+/3+fnx8f35+/n9+ //79/v38/Pv8/f7+/f3/fXx8/359/n1+fXz/fnx+fX1+fXt9fH59fH19fv/+/v37+vn5+fn7 +vr9/P5+f39+fX58e359fv9/f37/f/9+/vv9+/v9/Pv7/Px9e3x9fH5+fv5//fv9/Pz9/v19 fnx8fHt9fn19fn19fXl8fXt9fnz/f/79/vt//f3//f39/v9+fv9+fnx8fXp8fHp7fH1+f/3+ /vx//vz++/z7+//9fX7///v9/Pz9/P39/f79/nt7fnt7fHx9fX3//v///v7+/n5+fX7/fn// fnx9/n1+/3x/f3t+fn9+ff78+/v9/Pv9//x//35+fn58fn5+/P3+/P1+/f77/Pv7+/v8/f7+ e3x8enp7e31+fn99/359/f99/n/+///+fn79fn39fnx/fP98f396fHl6enx9//37+vz7/f/9 /v9+fn19fHt+e319fv9+/n59f/79/35+/n99/nz/fn79f/3++/v7+/v6+/j+/fx/fv78//3+ fv59f/5//v/9//5/f37/f3x+f//9/f39/fz+/v7/fX7/f3x9/37+ff79fvv/+/x+/31/e3x+ fH17fXx8enp8fX99fv///vz6/f37/v3+/v59fXx9e317fXx5fH1+/v37+fr6+Pn7/P79f/99 e3x7e3p6fX3//f37+fr7+fn4+Pr6/P5+fHt5eX18f/7+/v/+f/79/Pv8+vz7+/78/v3+fn17 fXt+fn1/fv9+fnp5fXl9e3x8e37//Pv6/P38f/7+/fz6/P38fn57e3x6fXx8fHp6enx8fnx7 fn78/v39/vz++vn5+fr5/P3+/fz8/vz8/316e3p4enl6en1+fP5//vv+/n////3+f/57f3t8 fHl9fH3+f/37+vv7+vn7+vv9/v9+fHx+fn19f3z//v78/fz8/v7//n5+/37+/vz9/f3//n/+ /n/+f/5//v7//n/8/P3+ff9+/v7//v5//v1+fXx9f37/fXt8en58fv7+/fr+fv97fn58fn58 fn59/319///+/n9+f359f317e3z9//v+/fv++/38/P39/fv+/P7+/n1/fX5+/37+f37+fH5+ //3++/z8+fn5+vz+/v99fXx6eHh6eXx6e318/v7//n/+/fz9/f78/v39fv1+fX18fHl5fXt8 e3x9fH79/f39/Pz8/P38/Pz6+/z8/318fXt6e3p9e/99ff/8/f7+fv9+fn9//35+/v//fn9+ fv9//v9+fv59e318fv9+f37/fn9+fn5+///+f33/fn7//n5+fXx9fn9+fH3//37+///8fvz/ ///8+fr4/fr6/Pz9/359fn5+fX5+fv5+f379/v78/Pz+/P7+/n7/fv7//n///v/7/f39/31/ /359fn3+f359fH59fXt+fXx/f31+f//+/f3/f/z+/P79/X/+/318eXt7e318eXt7fP7//v39 /fz7+/z7+vv8+//9/n3+fnx9ff//f3/+/v78//79/v38/P79/3/+/33/f//9//z9fn99/39+ /v37+/z+/v9+fnl7enl8fnx8fX/8fv7+fn5+f359fHx9fP9/fv7+/v79/35//v7+/v7/f3/+ fnz+f359fHp5eHt7fP5+/v/9/P77+/n6+/r9/f/+/v39/v1/f318fnz//v7+/fz8+3/9/P38 fn58fHt8f/5+fn9+//7//n5//318fX19/359fn1+/v7+/v/+/319fHx6en18/31+/P78/Pv7 +Pn8+v/+//7+ff5+fv99fn59/v/+/f/9/v78/P78/f38/P39/fz9fX18fH9/fv7+/35+fn19 fn56fHx6e3l9e/39/fz9/Pv8/vz9/fv+/v56fXp6end5d3t9fX9+//78/Pz+/v7/f33+/3z9 ev98dv1+/Xr/+Xh7/Pj9enz8/nz4+3l3fH57/v59f3//fXz7f31+fH19+Pl9fvn9ffz6+vv9 /f7+/v7//H58//19//3+/3v+f/38+/z///79/v79/f78+3/+/v///P7//P3+ff//fH19ff9+ fX57fX5+/318fX/+/fz8+/z4/P5/fHx9eXl+e3x8e3t4fHp+/v37+/v5+Pn5+vz8f3/+fX7+ /v/+/n/9/f/+//v+/Pz9/3//fX5+/359/v9//v3//Pz9/v/9/X59fX59/v5+f319/31+/3z/ f318fH58f358/31+/f///35+/n5//35/fn18fv9+/v5+e3p7fX19/f7+/f38/v38/v79+/7+ /f3+/X/+fnx/fH///vz5+fj7+/v7/H5+f3x7fHp6e3t9fXx+fH1/ff79//3/f/1+//98ff5/ /v9+fn5+fX1+/v39f3//fX59fnx8fX5/fn59f33//3/8//79/vz8+fv6/P//e39+//5//f/9 /v/+/vz9/Pv+/vz9/P3+f/58fX58enl9ff5//vz9+Pr5+Pv5+v1//3t8fnh+enx9ev99fv9/ /v3+/v98/n///n1+//79/n59fHx+fX19ff99fv59e3x9//5/+/7+/P38/P36+fz7/v//f/5+ fX5+//3//v/+///9fv/7/fz8/P1+fn17/31+/X7/fv/9f/z8/P7//v78/v5//358fXx7e319 fX99fX9//3//f31/fXx9fHx9fX/+/Pz9+/79/fz8/vr+/vz//P58fXx7fX5+/n79/P38/fz9 /Pv7/X7+/f5///5/f3x9fXl4eHp5en5+//76/P35/f36/3//f31/fXp9e3p7e3t9f/7+f/59 /35//X3//359fH//f359fHx9fv9/fv79/P/8/f77//v7+/j7/Pz+/f19/n5+fn19e3t7e359 ///7+/z5+vf6/Pv8/P5+fH19fHx8fH17fX57fn5+f35+//7//v9+/n5+fXt8enx9fv3+/f39 +/78/fv7+vn7+/39fn3/en3/f/5+/v/+/3/+/vz7+/v7/n59fX5+fHx9fnx9fn79//5//v7/ /X5//35+fX5+fnt9fXz+f3x8e3x8fn5/fn19/v38/P37/fz7+////n78/f79/v3//n59fX/+ fv/+/Pz+/f1//v/+//7+/f5++359fn38/v5+fn5+fnx9fX59fX1+f31/fH18e399f/9+///9 /f7+/fv5+/z9fHx8eXl3enl5fH59f/v8+vv8+vz7/P78/f3+fX59fnx//n78/fz9+vv8/H5+ fX19fnt9fHp7e3x8fn59///9//78/v3+/n/+/n5/fHx9fH59fn7///9+f358fnt6fH5+/vz+ /P5+/n7+f3/8f/78/f37+vv6/f39/v5/fv9+f/9+//59/v//+3/8/v/8//3+/f99fXt+fX19 f////P78/f3+fn17fXt7fHx+fX98fP7//P79/v9/fX59fXt+f37/fv9/fv//f359///+/n5+ fnt7fnx7fH5+/fz9+vv8/v3+/vv9+vv9+/z8///+fX18fXt8ff99ff7//P78/f77//v7/fv9 /f7+f39/fX19fn9+/fz6+fn5+/v/fnt8fHt9e3p7eXp9fX7+/vv9/f1//v/+//39/v5/fX59 fHp6fH18fnx8fn7/fn7+f//+fXx+/3/9//5/fX59f3/++/z7+vr6+vv8+vv7//7/fH18fXx+ fH1+ev7//f3+/P78/vz8//v7+/v9/f3+//7//35//3x+f37//vz//P5+/37+fv5+fn58fXx8 fn5+fHx8/3///f/6/f37/f3+fnt8e3p6eHt4e3x7fHx+///+/n//+/37/P38+/v//n59fHl7 ent7e3p7e3z+/v38/Pr6+fz7/X78/35+fn97/31+///9fv37/fz8/Pv7/f59fX18fXx8e3x8 en5+f/39/P78/P/9/f7+f31+fXt9e3p5enp6e3p8fv/9/fz9+vz8+v37+/z8/n7+f33/fn5+ fXx9/n/8/Pr6/Pj8/P9/f319fX59fXt5enx7e3x9fv79/f38+/z8f379fX59fn18enp+eXx7 fHx6fn78/fz7+fj7+v3+/H79/f5/f3///37+fv79/f39+n7//n3+fHx7e3x7fn1/fX1/fn9+ /v7//3x/fnx9fn///f77/v1+fH56fHx7fXt7fX7//Pz9+/38/f38/vz+/vz9/f39ff59fH5/ /P79/v///f5//f7+/v//fv99fv3//f3+fX5+ff7///z8/P5/fX19ff9+fv5/f/9+fX19e356 fHr/eXv6c/r/d/d9+/5++Hx8/fv9fXn/fn78+/55/n56+ft///1+fH77eHd8d3p5/X96en76 e/36/fz9ff/+/vt9/352fX14eXt+e/78f/v6+fj5+fr7fP7+fXx8fn3+fn18fH1+/f77/Pr4 +vj5+vv8/X9+fH16eXt4en58/vz+/Pv7/Pj8+/r7+/z9/399/v9+fn1/fv7+/vz++/z7fn5+ e31+/39/f37/fn58fH59fn5+fH1+ff7+/fz9/v79f3/+/3x7fXt7enx8eft/ffx/fnz9/f/9 /n7/f31+fX1+fnx9fHp8fn5+ff5/e/9+/fv6+Pv6+vj8/fv+fn5+f/19/n5+f37/fX/8/v78 /Pv8+vx/f399e3t7fH9//n///vz9/vv8+fj4+fz7f35+fH58fX18e318fHx9/31+f31+fX3+ /f79/f9/f398fH19fX18e37/f//8+vr5+Pn5+/z7/n99fXx5e3p8fn1+fv///v78/Pz6+/v6 /Pz9/v//fv3/f/3/f39//v7//fz+/f7//X5+fn5+fX59fX3+f3x9fXp6fX1+fX7/fv39fvz9 /f3//n98fX15e316fXx///39/v59f37//v7///5+//98fX19/f5+/3x8fHx9fn7+/Pz8+/v7 +Pz5+v37//39/Pz9f35+fH18fv/+/fz9/fv7+/1+fnl7e3t7fH5+fn7/fn////3/f/9+/n7+ /vx9+Hx59Hh//Xv8ePt9c355fv93fXx+f/76eXz8dv32/X1+/nt5+Px4/Xx8/f37+357/H56 /f98fX15fX3/fXh8dnp+f/59/f39+vn7/Pv8/Pz6+/38+/r//ft+fv98enl7eHt6en59fn19 fX7+/f5//H7+/n78f35//37/fn5/fX1+/X9+ff59f/9+fn3/fnx//n//fX59e35/f31//P78 /vz7/v7+fn/9/v7///3+/vz9/fz/fn9+/3/+/v3+/v1+//9+///9/Pv6/Pz8fn59fX17enp7 enp4e35+fv7//fz+/f78+vz8+/17fX58fnt+fHt9e3t5fP98fX/+fv38//19fn19fv//ff// f35/fn1//v7+/v5///39/P79+f78/P5/e/99fH1+f/79/fz8/fz9/f3///7+/n/+/3/+/f3+ /P78/31+fH99fX1+fH1+fn///n79fn19e3x9fn99fXx8fn///v39/vz9/n7+/n7+fn1+fXt7 eXp7fX59fv///fz6+vv7+fv9/P9/fn7+ff/9fv7+/v3+/Pz9/fz6+/v8+39+f3x7enl6e3x6 fHx/fX//fv/+/v/9//38/v3/f319fnx7fHt7/37//nx/fH3//fv8+/z7+v38/v79/v7//X59 fnx+e3p7fX57fn79+/v5+vr7/vv+//1+ff//f/9+fv3+/vr++vn4+/78/f1+fnx4eXh3d3l6 ent7fH5+f37++/38/P78/H///n7+/37+fn59fXx9fXx9fX5+fv//f/39/v7/fv//fX18fHp9 fnt8fH7//f39+/z9/Pv9/P/9/X39/X3//n7//39//3///P3+/v/+/f7+f3/9fn99f3///37+ f/1/fn9+fnx9fH5//v3+f///fX5+fXx9fHp8e3t9fn3+fv/+fn9+f35/fX5+fn5+/3x9/v// /vz9+/z7/P77/P38/f78/P79/X99fn59fnx+ff7/fv5+fn5+fn/+/f37/Pv5/P37/v79f/9+ fn1+fX//fv9+fX58enx9fX1/fnx9fX5+f37//n39/n7/fnx9fX1+fn//fn/+f//9//39//5+ fXx8e3p7fHt8f/79/f37/f77/f37+v79/H/9//////5+/v7+//3/f359/319/3z+/P/8/f77 /P39/n7/fn58fH17ff////7+/P7+/X7//379/3x7fXp6e3l7enp/fv5//v37/P38/f3+fX5+ fn79//79//9//358fHx7e3t9e3t7fH3//v37/f38/v7//v/9/f78/f5//37+/379/f3+/P39 /n/+ff9+fv7+/v78/fz///7///5+f/99fX5+fXx8fn18fHt7e3t8fHt+fn3+//79+/z9/P3+ /fz+fX58e3t7fHt9fn7+//7+/Pz8/v7+fXx7enp7e358e3///f78/Pz5+vn5+vn6+/r8/f/+ fn7/fn19fn5+fH1+fv/9f/z+/vz9+vn4/Pz9fn17eXt6e3t7fH59//1+/P38+vz6+v39/n58 eXp3dnp5e358fn9///9///5+f/9+/3///33+fX1+fH17e3t8f//+/X/9/Pv6+vj7+fz//f99 /n99/n/+/35+fv59/3/+/f78/fz7/Pz//n9+f3//f3//fn///v38+/39/vz+f/7//P/+/n9+ fXx8fHt5e3p7enx7enx7ff/+/fr5+vv7+/38fH5+e317fHp7e3t9fH////7//n5//v///n5+ fnx7fX98fH58fv7++/v5+Pr7+v79/f79/359fnx9fn5/fv1//v7//f79/fz8+v38/P7+fn9+ //7+/v3+/f5+f/9+//7+//3+/v7//X7+f31/fX5+fH//fn1+fn5+ff9+/n5/fv/+//7/f319 fX1+fH1/fX19fH1+f31+/n/+/v/9/v39//z6+/n9f399fX7+/P38/P79/f/+/3t9fnx8fv// /fz8+v79/v78f//8/Pv8/v39fv98e3h4enl7ent+fX1//f7+/3//f/z8/f3+/v5+fXx9/31/ /3t7enp6fH59///9/P7////9/n7+f37+fn16e3p8fX1+///+/P39/v/7/vz6/Pv7+vr9+/9+ /319fH5+f37/fn7//v7/f/3+f/z8/f39/fv8/Px+/319/31+f39+f/9+fXx9eXt6eXx8fH7+ /X9+fn5+/v3//Pz+/35+fX59f3x9/nt+e3t7ff98/35//v/+/f39/f3+f/99fXt4fXt8/3z+ //3+f/v+/vz9/P78/Pz8/Pt///59fX19/n1//v37/Pv7+/v4+fr5/vz9fnx6fHt3eXl3enl6 fH3/fv7++vv7+vv5/Pz9fn19fX19f35+fnx9fX5+/v//f399fX17e3p6fHx6fX7+/Pv6+Pj6 +fz9/Pz9/vz8/f3//v9+fP99f/3//3//fn5+fn99fX9+fv7//fv8+vv7+/37/f79/P3//359 e3t9e35+fX5+fn5+fn19fX5+fXx/f33/f319fX5+//7//fz9/v7+f/9/f31+fH19e357fn19 /f3+/P3+/v39/P7///////7+/f9////+/v1+/vz9/P38/v7+fv5+fHx7fXx+fv/++/n7+/v5 +vz8/////f5+f35+fX19fHp7enh4e3p9/////v3+f//8/P5/fnt8e316fH99fv9//v39/vv+ /fz9/n7/fH17fXx6e3t7e35//v/+/v36/Pv7+vr8/P39/v7/f3///v7+/n79f//+fv9/f/79 /f39//7+/f59fn1+fn3/fn9/ff9+/vz9/f7/fXx8fHt8fXt8fX5/fX7//v////3+fX19fX58 fv7//f37/Pz6+/39/f7+/35/fn9+//9+fX5+f///+/z9/P39/X59f3t+f3/+fn5///5/fv9+ f35+f///fP99e359fX7+f/7+fX5//X5//n19fn19fH1/fXv/fX38/fr9/fz9/f78/f7+///9 /v9/ff99fH58fv/9+vv7+vn6+/r8/n5/fnp8enx6eXx7e31+ff9+//79/f37+/t+//9+f/9/ fXt+e3t9e3t8enl8ff//f/9//fz7/Pr+/f3//P3+/P38/P37/P3+fn7//P/8/f/8fH5+ent4 e3h5fHp6eXt8fH7//v3//P3++/z9/v79f/7+fX9+fn7//35+fn5+/318fn18f37//X79f359 fHx8fHt9e3l9fH78/Pj5+vn7+vz7/f3+fn18fHx9fX1//v/9/fz7/Pv7+vn7+vz8e357eX16 e3x8en19e358fn5+/v7+/f7+/3///35+fXp7fHx8fX5+/v3+/vz6+vj4+fr6/P1+fH59e3x7 e358fv99f378/f34+vj6+/j6+/v8/P5//399fn59fX19/359/n7//n/8+/38/fz9/v//fn5+ fnx7fH1+f//+/P79/Pz8/P3+/nx9fHt6eHp4eHl4eX19ff1+/v38+Pv6/P/+/v59fn18fHt7 eXt6en17//7//fz7+/r6+Pr6/f/+//5/fn57en17fH1+/v78+/38+vv6+vv9/n1+fX1/fn/+ /v79/vz8/Pv8+n7+/3z/fX59fXx9fv//fX9+fn//f3t8fn//fv7/fn7/fnt8e3x8fX1+/n19 /37//P36+fv5+vr7/fz9/n7+f35/fH18ent9fn/+/P37/Pr7+vr6+v/+/f99fXt9fHt7ent7 fH1+fv3+ff5+//7+/f39/f1/fH18fn58fX18e3x//vr8/Pv9+/z8/v9+/319fHx7e317/v79 +fz5+/j4+fn7/P38/P7+/v/+fn1+fX19fX9+/f/9//39fvz+/vz+/P59fX19fHp9fH3///9/ /3/9/f78/v1/f/9+/35+fnt7ent8fHx9fHt7e3///v39/fv7/fv//fz//v7///39/f39/f5+ f3/+/v9//v7//f7+/f5/fn5+fv//fX5/fH19fn1/fn59fn99f31//35+f39+ff99fX5//f/9 fv37/Pv+/P98fH17enx6fHt7fXt9/37+/v/9/v/8/v77/Pz6/f79/f3+/v//f/9///9+//3/ //v+/f3++/39/3x9e31+fXx9fX5/ff7//v7//v7+f/7+fX9+ent7e3x8ff/9/vz9/fz8/fz8 /f39/f7//f7+/n5/fX1+fX79/v7+//7//fz7+vv8/P/+f31+fH18fXx8fXx+fH//fX9+f/3+ /fz8/v9+fXt8fXt7fH18fX58fn//f//9//39/Pz9/fv7/fz8/Pz8/f1+fHx9e3x9fHx8fn3/ f//9/399fXt9e3x/ff5///9+/n7//////v9+/f9+fn19fn7/ff/+/vr8/P39/P79/fz9/v9+ fXx9fH18fH3//fz7+/38/P38/v/+//7+/fv+/P39/P//fX19e318fX58fH5//f9+/n9//v7/ +/78/3t9fXx9fX18fX5+fn59ffz//v1//v///f7+/f99f//+/v38/f38+/v8+vr5/P9//n5+ //////3+f359fX19fX19f/5+/f39+/z7+/v9/v3+/X59fX58fnx7fX18f/5+/37//v79f35+ fn58fXt7e3l6enp+fv/+/v38/Pn8/fl5f/p8/H19/nb+enV+dv7/fP7//Pz7/n7+/n1+/n95 eXp2en9+//1+/Pv79vr8/P78/fz+/v1/fn/+/f5+/31+/v/+/379/v78/Pr8/P19/X55fX17 e3p7fXx/fX1+e33/fv9+fv97/v7+/v/6f/79/v9+fXx8e358//7//n9+fn7/fnx/fHt/fv7+ /v3+//79//3+/f1//P1/fv7+/f38/P///v/+/P39/v7////+///8/f1/ff///v/+/39+fn57 fH9/fn59fX1+f359/3/+/33+fv5/fv1//X//f35+fH19fH5/fn59fn1+f//9/f39fn19enx7 fHt8fH7+/fz7/Pz9/P38+//+f/5+fv9+/vz7/f7//n7//n77+/z8/n5/fX5+fXt6enx7fQ== ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.10.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Thu, 26 Dec 91 15:15:38 EST Received: from joyce.cs.su.oz.au by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Thu, 26 Dec 91 15:15:16 EST Message-Id: <9112262015.AA13190@thumper.bellcore.com> Date: 26 Dec 1991 20:45 (Thursday) From: bob@cs.su.oz.au (Bob Kummerfeld) To: nsb@thumper.bellcore.com Subject: couldn't resist this MIME-Version: 1.0 Content-Type: image/pbm Content-Transfer-Encoding: base64 UDQKNjU2IDUxMgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAHAAAH//////// /////////gAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAP///////////n//wP/AE//BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AGAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAH///////gAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAYAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////gAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAA/gAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABgAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8YAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAA/AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAB+AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAYAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAH8AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABgP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYPwAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGPgAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAP//gAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAfAAAAAAAAAP//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAA/wAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAP+AA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAB/g AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA/wABhx8MBgAAAAAAAAAAAAAIAAAAAD/AAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA AAAA/+H24AALkAH/+wHnmAwAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAOPh98AAG/AA/fsA5wAAAAAAAAAAAAAB AAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AIAAAADj4PeAAB3gAEDxAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AAAAA4+BzAAAI4AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAQAAAA+p///////AAAAA v///gAAAAMHAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAA AAAAAAAAAAAAAAAAAAP////////////////////oAIAAAADAAAIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAD/////////bAABP// ///wAACAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAA AAAAAAAAAAAAAAAAAAAAAf/g/gAAAAAAAAAAAAAAAAOAgAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAP/AHAAAAAAH/4H //gQB////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwOMwAAAAAAAAAAAAAc AAAAAAAAAAAAAAAAAAAAAAAD//////////////////////+AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABAAAAAB4cPjMAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAA/////////// //8AH///wAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAD+HD4zAAAAAAAAAAAA ABwAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAOwAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAMAB/gAfAB8DxwcwAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAcZEP4AcA8QHMAAAAAAAAA AAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAA AAAABAAA//8AP//gOHxLOAGAPMBzAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAEAAAAwIAP//AD/v8DgMyxgBgHzAcwAAAAAA AAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAA AARgQCGMGAD//wAYT/A4DOsYAYB8gHMAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAgAADAAAPwAAAAAAAAACMx8BjjDjA4OAAAE44OAzrGAGA7ID/gAAA AAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAADwB+/8+AAAAA AOAAzM/AY4w44ODgAABMGD+M6zgBkM6B/4AAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAACAAD8Af/4P4MByAAPgAMzPACOMeeDg4AAASBgfzOswA/HOgf+A AAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA4QH/gD/HL 9hAH4ADMzAAjjHnw4OAAAFgYA+zrcAPxjoDzAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAIAAGGFxwAh5z/Yw7wAAzMgAI8xt8MDgAABQGAB96+ADgYaA 4QAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAABhhccAI Oc8HMfwAAMzIADPc7fjg4AAAUBgAf+vAA4Oeg+EAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAYcXDACHHIByP8AADuyAA33M344OAAAFAYAD/rgAOD /sfhAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAGDNx wAjx2AcnDAAA7pgAN/3NvODgAABQGAA8awADh/7+4QAAAAAAAAAAAAAEAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAABgyMcAZ4dgHpgwAAG+YABb9/5zg4AAAUDgYPGkA A5+CfOGAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAY FjHvH4GYB64P4AB/n4AWf/+O4OAAAFAwGDxpAAP+AgBhgAAAAAAAAAAAAAQAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAGB4z/48BmAWsD+AAc7+AHn//j+DgAABYcBg8 aQAD/gMAYYAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA ABsOM/8OAZgFrA/AAHO/AB4/h4fg4AAAXPAcfCkAAc4DAAAAAAAAAAAAAAAABgAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAfDjfAHgGYxagMAABxmAAcPweD4OAAAE/g D/wJAAAOAQAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AIAAPw49wB8Bn8z4CAAAMZgAHB+Hg+DgAADPgAfMCQAADAEAAAAAAAAAAAAAAAAGAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAADgOPcAbg5/M+AgAwDGYQBwfB4Hg4AAA wAAADAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAYHznAGcOYDHgIAMAwn8AcGAcA4OAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBM5wfjzkAh4GDDAMJ/ADBgDAGBA AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAABgROf/4e5H4eBjwwBCfAAgYAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMTn/2D+f+Dj/8MAAGAAAAAMA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAGPG5+Agfn/g//4HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wuAAICQAIL94BgAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAf8LgAAAAACCYAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPyAAAAAAAAgAAAEAAAAA AAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAA AAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAPGAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwAAAAAA AAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGAAAAAAAAAABgMAAGAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAYDAGD/ H+AAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNnvIPBhgWBiDfmBwA YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAQABjfY6A8Y4FgYgDgAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAYTyHwHieAYCAAAA DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAAGGwg8A4/AGAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhgYHAEPgBAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAYYCAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+ AAAQAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEAAIAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8MQEAAAAB8AAAMAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH AYPnkDAAAN+/8AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAD/wGA55AwAADf//gAAwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAD/+AH8AAAAA8 A/8BgGeQMAAB2e78AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAfAAAAAA//gD/gAIH+fwHwAYBnmHAAcdh+DgADAAAAAAAAAAAAAAAA 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 gPgAgPDvADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAIALHHw+D8OAM4DwAYDwbgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACR/sP/3/ gBOA4AGAYGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAgAkfznP5/gABAGAAAAAIAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAIG4/w AfgAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBgH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAgY A4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH /w//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/ //////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAHAAAP/9gH//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////// /+EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAf///////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAB//////AAB4AAAMA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAA AAAAAAAAAAAAAf8AABn/////wAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAfgAD///AAf/////4AAAAAAAAAAA AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAA AAAAAB//////////w4AH//8fwAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAD//////////gAOABwAAAAAAAAAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAA AAAAAf///+H/kAABwAABgAcAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgB4D8AAAAAB///4AAAAAAAAAAAYAHAAAAAAAAAAAA AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfw// ////////5AAAAAAAAAAAAAHABwAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////+AAAAAAAAAAAAAABwAMAAAAAAAAA AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf +AAAAAAAAAAAAAAAAAAAAAAAAMADAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAwAAAAAA AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAwAMAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOADAAAA AAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAwAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAMA AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGADAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw AwAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAMAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADADAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AwAAAAAAAAAAAAAAAAABAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAGAMAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgDAAAAAAAAAAAAAAAAAAEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAcAwAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOAAAAAAAAAAAAAAAAAAwAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAwDAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAYAAAAAAAAAAAAAAAAADAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAABgGAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBgAAAAAAAAAAAAAAAAAMA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAGAYAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwGAAAAAAAAAAAAAAAAA AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAMBgAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAYAAAAAAAAAAAAAA AAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAwGAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBgAAAAAAAAAAA AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAADgYAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGAAAAAAAAA AAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAGBgAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgMAAAAAA AAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwAAA AAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDA AAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgwAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA YMAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAwwAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMOAAAAAAAAAAAAAAAAADAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAADBgAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwYAAAAAAAAAAAAAAAAAMAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAOGAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhgAAAAAAAAAAAAAAAAAwAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAYYAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGAAAAAAAAAAAAAAAAADAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAABxgAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMcAAAAAAAAAAAAAAAAAMA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAADDAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwwAAAAAAAAAAAAAAAA AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAOMAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjAAAAAAAAAAAAAA AAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAYwAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAAAAAAAAA AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAABzgAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM4AAAAAAAA AAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxgAAAAA AAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOYAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAA AAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZgAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGc AAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3AAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ANwAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAzAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAAGAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABsAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAAAAAAAAAAAAAAAYAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAH4AAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAABwAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAPgAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAADAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAMA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAA AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAA AAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAA AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAA AAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAA AAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA AAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB gAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8MAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7/gAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAA8wA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAABwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAOAMAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOABgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAABgPYAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+P+ADgAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAPH/gAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHH//gCAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABv//4AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7//wAEAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAd///gBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANf//4AYAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAGv//+AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMAAA AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL///gAgAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHkAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAH///4AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH37 AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABf//+ACAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHH8wAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD /+cQAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL///4A EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/3+IAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF///+ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAP5/GAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf// /gAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6/zAAAAAAAABAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn//74AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA+/9wAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7 //++ABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//4AAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4n//MAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAf//8P//+gAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AMZ//jAP/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+H/////gAAQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE//4QD/wAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP///B//z//+AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAADP/8EAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////wSLMx3/8ABAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn//BAAGAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAB//////8FpsxKAfwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAJf/wAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ANgf//HaLM6zH/4EAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2/4AAAMAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAD8AAAH///5JIEox//zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAALv+AAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAD///2WTMUzHh/4AAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACv/CAAAMAAAAAAAAAAAAAAAAA AAAAAAAAAAAAA4AAAA///5YkzFMxzd/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP/wgAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAP//+WmzEoAOmP/gAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4IAAAYAAAAAAAAAAAAAA AAAAAAAAAAAAAAADAAAAD///FpszLMbyM3/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABf+CAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAB///xlkwAjEundP /gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX/ggAAAwAAAAAAAAAAA AAAAAAAAAAAAAAAAAAcAAAAf///ZZMzTMUgCRj/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAF/wcAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAP////iSMUzFJ iLGP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABf8PAAAAwAAAAAAAA AAAAAAAAAAAAAAAAAAAABwAAAD////abMyiEYYixyd/+AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAf/DQAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB////emzMo zvIyQACL/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/hoAAABAAAAAA AAAAAAAAAAAAAAAAAAAAAAAB4AAAf///mWSJCMS+d0YmJjf8AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAB/4aAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfAAA/4//5ll zNcxWQJGJiYzv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+GgAEADAAA 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 AP//4Af//+p/P8wABwAAAAAAAQR///////xgiBEEeDgAAAAAAA4AA8AAAZsskmJAIlsZI5MR mNiaZY42M5EZuAAAAAAAAAAAAAAAAAAAAAAAAB//gAAD///+/z/GAAYAAAAAAAEEf//////8 YIgBAP44AAAAAAAOAAGAAAHbLJJmUZkkRCETEZjcmNoxiAERGLgAAAAAAAAAAAAAAAAAAAAA AAA/8AAAAf/////7RwAOAAAAAAABBH/////8PGCIAfH//8AAAAAADgADgAAD//NFQlGJJObc aGwgCJjaMYjMREI4AAAAAAAAAAAAAAAAAAAAAAAA74AAAAD/////+8MADgAAAAAAAQT///// /BxgiDnzwf/wAAAAAA4AA4AAA//zTdmmYghEDGxsZiNjJIGIzETGbAAAAAAAAAAAAAAAAAAA AAAAH94AAP/wf/tu///BgA4AAAAAAAEE//////gcYI/4hwA88AAAAAAOAAOAAAP/v8/ZpmLb GSMTRCYjZyWONhMQUC4AAAAAAAAAAAAAAAAAAAAAAP8YAD///D/zL///4YAcAAAAAAABBP// ///4DECP2AYABhgAAAAADgAHAAABv76+7kEqGxkjExGY2JhFjHYzkzmeAAAAAAAAAAAAAAAA AAAAAAPgMAf///4f+2///2HAPAAAAAAAAQT/////+AxBjAAOAAYIAAAAAA4ABwAAAf///25R nSTEIRMRmNyY2jGIwRE5nwAAAAAAAAAAAAAAAAAAAAADAGB/////H//////gwDgAAAAAAAEE //////gEb4AADAACCAAAAAAOAAYAAAD////+UZkk5txo7CYomNoxicxMxkcAAAAAAAAAAAAA AAAAAAAADgBA/////x//////8MAwAAAAAAABCf/////4Bn8AAAwAAAgAAAAADgACAAAAf/// /+5inkScaOxuI2cloQjMRMZngAAAAAAAAAAAAAAAAAAAAAwGwf////+P//+ff/DAMAAAAAAA AQn/////+AZwAAAOAAAIAAAAAAYAAAAAAH///7/uYpsZIxNMJiNnJY52ExAAR4AAAAAAAAAA AAAAAAAAAAA+/4f/////j////zs4YCAAAAAAAAAJ//////gGAAAADgAACAAAAAAGAAAAAAB/ /7ZmcYIbGSMTE5HYmECMdjOTOZnAAAAAAAAAAAAAAAAAAAAAf/+P/////8/////7+HBAAAAA AAACCf/////4AgAAAD8AAAwAAAAABgAAAAAAf/6yZlGZJMSJExOR3JjaMYiJEDmZwAAAAAAA AAAAAAAAAAAAAH//j//////P//+///wwQAAAAAAAAgn/////+AYAAHH7gAAMAAAAAAYAAAAA AG/zQRpRmSTGnOjsZiqY2jGJzEzGZOAAAAAAAAAAAAAAAAAAAAB//5//////7993n//+MEAA AAAAAAIb//////gGAAPz78AADAAAAAAGAAAAAABP80mZrGKaRJxo7G4nZyWFCMhMxmbgAAAA AAAAAAAAAAAAAAAAf/+f/////+//////PjjAAAAAAAACG//////4Bg8fsw/wAAwAAAAABgAA AAAAX+zRGaxmmxsjEhFmI0cljnYzEhDm8AAAAAAAAAAAAAAAAAAAAH//n//////v//////8Z gAAAAAAAAhv/////+A5/HhMP+AAMAAAAAAYAAAAAAN/stGZRChsZIxcTkdiY5Yx2MzM5mTAA AAAAAAAAAAAAAAAAAAB//5//////7///////GYAAAAAAAAIb//////8M/xgTCP4ADAAAAAAG AAAAAADO7rRmU5lkzIgTE5nYmNoziIoAOZkwAAAAAAAAAAAAAAAAAAAAf/+f/////+/+d5// /5wAAAAAAAACG////////OMYMwh/AAwAAAAABgAAAAAA7/dJEFEZZObc6OxuIpjSM4nIzMZk 2AAAAAAAAAAAAAAAAAAAAH//n//////v9ncf33+OAAAAAAAAAhv///////nDGDMIA4AMAAAA AAYAAAAAAP/3S5muZp/3+GjsbidnJY0oyMzGZvgAAAAAAAAAAAAAAAAAAAB//5//////7/// /9//xwAAAAAAAAI7//////gxwxgzCADADAAAAAAGAAAAAAD/v9kZrGabP3MTDS4jRyWOdjMy cMT8AAAAAAAAAAAAAAAAAAAAf/+f/////+///////8cAAAAAAAAGO//////4EcMYMQgAQAwA AAAABgAAAAAB//28ZlGIGzv/t7eR2JjhjHYzMzmZHAAAAAAAAAAAAAAAAAAAAH//n//////v //+////nAAAAAAAABjP/////+BGDGDEIAGAMAAAAAD4AAAAAAf3+/O5TmWTdv/P30di40nOJ yEIxmR4AAAAAAAAAAAAAAAAAAAB//5//////7/53n/8d/gAAAAAAAAIz//////gRgxAxCAAg DAAAAAD+AAAAAAHM/+/e0RlExJ/4/+YimtJzicjMxGTeAAAAAAAAAAAAAAAAAAAAf/+f//// /+/2/7/fPf4AAAAAAAAGM//////4EYMQM/gAAAwAAAAD/wAAAAABxv9//axmmhWf/OzuJ0cl jCSIzMZm7wAAAAAAAAAAAAAAAAAAAH//n//////v///////8AAAAAAAABjP/////+DGCGHP4 AAAMAAAAB/cAAAAAA7M9//msZps7b//xNCdHLYx2MzIxxM8AAAAAAAAAAAAAAAAAAAB//5// ////7////////AAAAAAAAAYz//////whhh/x3AAADAAAAB4zAAAAAB+zLLzmURkaGyf385HY mNGMZiMzOZkTAAAAAAAAAAAAAAAAAAAAf/+f/////+//97///7wAAAAAAAAGc//////8IYYf 4AwAAA4AAAH8hwAAAAA/xJC8ZlOZZMSf//sR2LjSc4nIQjGRE4AAAAAAAAAAAAAAAAAAAH// n//////v//////+8AAAAAAAABmP//////CGOHAAOAAAGAAAH+Y8AAAAAf83TSxnxGUTEn//8 biPY0nGJyMzERM2AAAAAAAAAAAAAAAAAAAB//5//////7////////gAAAAAAAAZn//////+h /gAABwAABgAAH9CPgAAAAFvHk0uZrGaaFZv/zm4nRiWMIYhMxGbswAAAAAAAAAAAAAAAAAAA f/+f/////+///5v///4AAAAAAAAGZ///////4fwAAAfAAAdAAf7GM4AAAAB7syyRUaxmmztj f/cUJkYtjGY3IjGUzcAAAAAAAAAAAAAAAAAAAH//n//////v/ve////+AAAAAAAABmf///// /eGAAAAH8AAH4AP4xjOAAAAAe7MstOZTGRIzY3/zkdi40wxmJzI5mzPAAAAAAAAAAAAAAAAA AAB//5//////7///////7gAAAAAAAAZn//////ggAAAAHngAA/v/4xCBwAAAAH/3uLRmU5lE xJj/8xGYuNJziYpCMZkz4AAAAAAAAAAAAAAAAAAAf/+f/////+///////+4AAAAAAAAMZ/// ///4IAAAAf48AAP//+c5jeAAAAB//9NLGbEZRMSY+OxuJtjSc4nIzMREzfgAAAAAAAAAAAAA AAAAAH//n//////v//+b///+AAAAAAAADGf/////+CAAAYPmBgAD//v+kI/gAAAA//+TSxms ZpoVmPjMbidGKYxkiMzETM38AAAAAAAAAAAAAAAAAAB//5//////7//3n////wAAAAAAAAxn //////xgAD/DBgcAA/7r/+//+AAHd9//LLFRrGa7O2f/ExQnRi2MZiciM9TN/gAAAAAAAAAA AAAAAAAAf/+f/////+////////8AAAAAAAAM5//////8QBB/wwcAAAP/0f///////////+y0 5lMZEjNn9zMRmLjRDGYnIjOzM++AAAAAAAAAAAAAAAAAAH//n//////v////////gAAAAAAA DMf//////EP4eMMHAAAD7/T//8x///////3+NEZTGUTEmPoTEZi50mOZgEIzkTPnwAAAAAAA AAAAAAAAAAB//5//////7v//3////4AAAAAAAAzH///////H+GBCBwAAAeP//zmMf/m2m//9 90sZoVFExJjozGwmUJJjmZjMzETN7+AAAAAAAAAAAAAAAAAAf/+f/////+7//Z////+AAAAA AAAMx////z//x4hgQgeAAABgf/6AjH+5pmS///JLOazmshCZ6Mxu50YtiGSIzMxMzvzgAAAA AAAAAAAAAAAAAH//n//////v////////gAAAAAAADMf///4AA8YIYEIH4AAAIAP8xjEfxQZl v7votVEsZrozZ/YTdePGLZxmJyIxsM/88AAAAAAAAAAAAAAAAAB//5//////7////////4AA AAAAAAzH///8AABGCGDGB/AAACAA3sYzn85JiB+67LTGUxkSM0f3M/H4uNMIZCciM7M347AA AAAAAAAAAAAAAAAAf/+f/////+////////+AAAAAAAAIx///+AAATAhAxge4AAAgAA4xgA/e QZom/JI0RlMZRMSbyh/x+LnSY5mAzDGTN+OwAAAAAAAAAAAAAAAAAH//n//////v//////// gAAAAAAACMf///AAAEwIQMYGnAAAIAAHMYxn+YEKBt2TSxGoUUTEm+jP/jZQkmMZmM3MTM/r WAAAAAAAAAAAAAAAAAB//5//////7////////4AAAAAAAAjH///gAABMAEDGNocAACAAB4QM Y/mmZZH8kksZrOayMZvI7+5nRi2MZADMxEzPnNwAAAAAAAAAAAAAAAAAf/+f/////+////// //+AAAAAAAAIx///4AAAzBBAx/CDgAAgAAPOcRj8JmWZ+mi0VSxGujNH9n//NkYtnGZnIjOw j5xOAAAAAAAAAAAAAAAAAH//n//////v93v//9//gAAAAAAACMf//8AD/4gQQMfwgYAAIAAD xGMY/lGYEfpstMZTGVIzR/9/85i40QhkJyIzszdjPwAAAAAAAAAAAAAAAAB//5//////7/// ///f/8AAAAAAAAiH///AB/+IEEPHAMAAACAAA/GICP5RmkZfvvzOUzlFzL////uYudJjGZLu t/M3Yz+AAAAAAAAAAAAAAAAAf/+f/////+////f////AAAAAAAAIh///wA//iBB/gADgAAAg AAHxjGd/pUAGX5dLMaxBRcy////8JlayYxmYzcxMz59PwAAAAAAAAAAAAAAAAH//n//////v ////////wAAAAAAACIf//+AP/4gQfgAA4AAAIAAB5AxjP65lmb/SSzGs5rIzn////mdOKZxl oszMTM+czcAAAAAAAAAAAAAAAAB//5//////7////////8AAAAAAAACH///gH/+YMGAAAHAA ACAAAe5jGM/kZZm7aDTULMayM0//9/82Rimc5GciM7K/nMjgAAAAAAAAAAAAAAAAf/+f//// /+/3//8////AAAAAAAAQh///+B//n/AAAPg4AAAgAADkYxjO0ZoRO+i0zlMZUjNP//fzmbHT aWQmIjOzM2MzYAAAAAAAAAAAAAAAAH//n//////v///3////wAAAAAAAEIf//////4/wAA/4 HAAAAAAA8YhAxtGaRk3yLMRTGUXMn//78Zi50mMZmMynM3NjNyAAAAAAAAAAAAAAAAB//5// /////////////8AAAAAAABCH//////8IAAAPiAYAAAAAAHGMZzPkWAZNlksxrFVFzL//2Oxu dLJjGZjdzEzom0NgAAAAAAAAAAAAAAAAf/+f///////////////AAAAAAAAQh///////AAAC DAgGAAAgAAB8CEIz7GWRMhJLMazGsjPf/8jsbn4pGGQmzMxM7JzI4AAAAAAAAAAAAAAAAH// n///////////f///wAAAAAAAEIf//////wAAHwwAHgAAIAAAPGMYxORlkbJpdMQ4RrIzf/ez HZ92KRzkZiIzsqqYSPAAAAAAAAAAAAAAAAB//5///////////////8AAAAAAABCH//////8A wf+IAB4AACAAADwjGMxxmgUyaHTOUzlCs3/3Nx+fsZBpRCYiM7M3YzcwAAAAAAAAAAAAAAAA f/+f///////////////AAAAAAAAQh///////H+H7CBAeAAAgAAA9jEIEUZpGTZIMxFM5Tcy/ +4sfm7HW4xOQ3I0yM2M3OAAAAAAAAAAAAAAAAH//n//////v////////wAAAAAAAEMf///// /h/hgwgQHwAAIAAAHYzmMaxABE2WSzGs1EGIv/vZ7+ZGEGMRkN3MTMiaQzgAAAAAAAAAAAAA AAB//5//////7//2d3f//8AAAAAAABDH//////4QYYMIEBcAACAAAB4IRjGsZZEgEgsxrMay M3//2e/mTikYZCbIjEzImNjYAAAAAAAAAAAAAAAAf/+f/////+339md3///AAAAAAAAwx/// ///+MGEDCBAXgAAgAAAeYxjMTEWxsmlkxFjGsjN/v//z1kYpGORmIjMyKpjI3AAAAAAAAAAA AAAAAH//n//////P///////fQAAAAAAAMMf//////iBjAwgQF4AAIAAADmMYzF+aRSJoZMxT OUCjf///c9mxkGBEJiIzszdnJzwAAAAAAAAAAAAAAAB//5//////z//////330AAAAAAADDH //////4gwwMAMBeAACAAAA+MQgRZGkRNlgxEUzFNyP/f/3mQsZbjE5DYjXIjZyc8AAAAAAAA AAAAAAAAf/+f/////8//9v/////AAAAAAAAwx//////8IMMDGfA2wAAgAAAPjMYzrEJEDZaL MajEQYj/+//8ZkYQYxOQ3cxMyJrKPAAAAAAAAAAAAAAAAH//n//////vt3Rndv//wAAAAAAA MMf//////CDDAx/ANsAAIAAADwBGMSxlsTACCzEsxrIz/+//zGZOaRjEZqiMTMiY2N4AAAAA AAAAAAAAAAB//5//////77/253f//+AAAAAAADDH//////wgwwMMADdAABAAAA9jGIxE5bMy aWTECMSyN////9sWRikY5GYiMzKimMjeAAAAAAAAAAAAAAAAf/+f/////+//////9+/gAAAA AAAw5//////8IMMeAAA2QAAQAAAHYxnMU/pVIGlkzFMxQKP/9v/zkbGWY0VmIjMzJ0cnLgAA AAAAAAAAAAAAAH//n//////v//////f/4AAAAAAAEOf//////CHD/gAQNqAAEAAAB4hGAFH6 TE2WCgRTMU2Pvf//+xGxluMTkNmMcidHJy4AAAAAAAAAAAAAAAB//5//////7//25/f//+AA AAAAABBn//////w/g+AA8CSwABAAAAeIxjMsYEQNloszKMRBj73////OThlDE5HdzEiImOYu AAAAAAAAAAAAAAAAf/+f/////++/dud3///gAAAAAAAQY//////8P4AAB/AmeAAQAAADwEYx LGWzMGIKMSzGsjfe////zk5pGORmqIxIiJjY3gAAAAAAAAAAAAAAAH//n//////v//////// 4AAAAAAAEGP//////AAABh8QJl4AEAAAA+MYhABFsTJpZMQIRLI3zvf/+9BECRjEZiIjMiqY yN4AAAAAAAAAAAAAAAB//5//////7////////+AAAAAAABBz//////gAAH4YEGZPgBAAAAPj GYxRGkQASCTMUzFAh9/3//vRsZTDESYiIzInRyYnAAAAAAAAAAAAAAAAf/+f/////+//9ud2 ///wAAAAAAAQcf/////4AAf+MBBkp8AQAAAD2MYAURJMDZYKIBIxSY//++/r0DGU4xOR2YxK I0cmIwAAAAAAAAAAAAAAAH//n//////v////////8AAAAAAAEDn/////+B8PwjAQZKbgGAAA A/jGMyxARAmWmzMoxEGf//n/7U5MCEMREdmMSJiYwiMAAAAAAAAAAAAAAAB//5//////7/// //////AAAAAAABgf////+Bh/DAAwEGZEYBgAAAPgBiEsRbMgQAoxKMayf0e5/8xOTGkYxGYg DEiYmNjdAAAAAAAAAAAAAAAAf//P/////+/////////wAAAAAAAID/4B8AAY5wwEMDBuSbAY AAAD4xmMQAWzImlkzBIEsn9HtvfzECQJGMRmIiMyItLA3YAAAAAAAAAAAAAAAH//z//////v //Zjd///8AAAAAAADAAAAAAAGMYIBDHwTkmwGAAAAfMZjFMSRABIZMwTMUj757b385GxlP8R BCIjMmdHJiOAAAAAAAAAAAAAAAB//8//////7/d2Y3f//fAAAAAAAA4AAAAAADiGCAQ/8Mik eBgAAAH4xiBREkwNloohEjFJ+fnZ+s+RMZT/M5HZjEgiRiYjwAAAAAAAAAAAAAAAf//P//// /+//////+/3wAAAAAAAHAAAAAAAxhggcPgDIpG8YAAAB+MYzLEQECZaaMyjEg/ix2/jPzkwJ fhERmYxImJjAoeAAAAAAAAAAAAAAAH//z//////v//////v/+AAAAAAAAwAAAAAAcYwYfDAB ykhP2AAAAPrGISxFsyBICiEoxLf/9u++z85MaTjEZCIICJi42NzgAAAAAAAAAAAAAAB//8// ////7//+d//7//gAAAAAAAHAAAAAAGMMH+AAD8pJl/gAAAD72YxRBbMiaWTMUhS3//bv/xPx JB0YxG4iIzZmUsDY8AAAAAAAAAAAAAAAf//P/////+/+9mO36//4AAAAAAAB+AAAAAPjHB8A Af/KSRf4AAAA+92M0xJMCQBkjFMxT+727++T8TGexxMUoiM2Z0cmIvAAAAAAAAAAAAAAAH// z//////v//5z//v/+AAAAAAAAPwAAAA/4/gYAD/w+KRA+AAAAPjf4UMSTI2WmjECMU/s+e/7 6HEh3sczEdmMSCJGJiJwAAAAAAAAAAAAAAB//8//////7/////////gAAAAAAAA/+B///8Pw AAP/AHikafgAAAD8//MsRAQJFpozKMyv7Pn5+exOT/sSExHZnMmYuNCaMAAAAAAAAAAAAAAA f//P/////+/////////8AAAAAAAAB/////nHgAB/4AH6T0D4AAAAfv/7LMWzIHkO8yjMvnde f/L8TE37GMxuIgoomLjZ3LgAAAAAAAAAAAAAAH//z//////v/953/////AAAAAAAAAB//DgB wAAD/gAf/l/WeAAAAH9//NEFsyB5ZPySML53Xj53PzEh+RjIbiJjNmZW8NicAAAAAAAAAAAA AAB//8//////7///////vvwAAAAAAAAAPAAAEYAP/8AP/+j/1ngAAAB+f/zTEk8JP3z8ljF/ //6/Pj8xMfTGMxSgIzZnRiYiPgAAAAAAAAAAAAAAf//P/////+/////////8AAAAAAAAAD/+ D//B//4D///J9v/4AAAAfv//qxJP77+6Mwowe/+/35/MXXG0xjMRmZzIokYmIn8AAAAAAAAA AAAAAH//z//////v/////////gAAAAAAAIA//v////8f///3wPb/uAAAAH7//6z9N39/njMo zPv//8/fzF5+aBDDEZmcyZi40do/AAAAAAAAAAAAAAB//8//////7/////////4AAAAAAAHg f///h/8B//5/2/Z/f7gAAAB+P//s/bP2f+6hCMz/f+/n/+5ff8sYyOwiIiqQuNHZvwAAAAAA AAAAAAAAf//P/////+/////////+AAAAAAAB8/4PgAPAH//8H/v+f394AAAAPz//0z8/s3/k zJI8/39v5v//P7/QEMhsImM2ZkYmmf+AAAAAAAAAAAAAAH//x//////v/////////gAAAAAc f3/u/gAB4H/gHh9/+P9/cAAAAD8f/9M+TZs/9IwXP8+f9/T/97ezlMYzEZACNmZGJi//wAAA AAAAAAAAAAB//8f/////7//93/////4AAAAD////z/gAAP/wAB//f+n//7AAAAA/3//5H0yf n/ozD7/vn/H5nent+TTeMxGZnMkGViY//8AAAAAAAAAAAAAAP//n/////+/vnZ3d///+AAAA ////8//AAAB/gAAD//99//2YAAAAP8/7/M//7d/6c2vP///5+5347vx4PJIRmZzJmLjR///A AAAAAAAAAAAAAD//5//////vzZ3f/////gAAA////+P+AAAADAAAAB/9dtu/+AAAAH+z+/zP t+z79v9777f/fj/u+fz8ezjI7iJCLgCw0f/8AAAAAAAAAAAAAAA//+f/////78////////4A AP////fv8AAAAAQAAAAH/Tbbvv//wf//sb3/9//27f/////9/9437z8/Pz4QyGwmYzZmRj// /AAAAAAAAAAAAAAAP//n/////+//////////AAH////x/wAAAAAGAAAAAP///d7//////9G9 9/P//27///9//f3/t+e/vz++xjMRmQImZkY/9/wAAAAAAAAAAAAAAD//5//////v//2d3f// /wAD//j/d/gAAAAAAgAAAAD2/+3f///////Oc//z//8+m3////398//zz98//sYzEZmcyZD3 //d+AAAAAAAAAAAAAAA//+f/////7//9nf//+/8AP/8A+H/gAAAAAAIAAAAAf//t3//7v/// xmN8z///958////8/vf/8e/P3+sQwFGZGMmYv//7fgAAAAAAAAAAAAAAP//n/////+////// ////AH/wAPf/AAAAAAACAAAAAH//f///+7+//zGrfMUz/9tnv//9/nd+///rzU/7Ocju/kIi ML//+74AAAAAAAAAAAAAAD//5//////v/////////wBgA///+AAAAAAAAwAAAAAf///////3 v/8xjNMyS+1RZd7/+//nfn9///+///n9//5DNmb/7/++AAAAAAAAAAAAAAA//+f/////7//5 nf////8AYX///hgAAAAAAAMAAAAAD//////9z///lYjTMkyZFt////////////////////// GiZv/y///wAAAAAAAAAAAAAAP//n/////+/9mZ3f//3/A///wDAQAAAAAAADAAAAAA////// /////97//7LMm7//////////////////////w5yJv//3//8AAAAAAAAAAAAAAD//5/////// 7Zmd///9/4P/8AAAEAAAAAAAA4AAAAP////////////////////////////////u4AP/4AAA AAMYif//8f//AAAAAAAAAAAAAAA//+f//////+2f///////DAAAAABAAAAAAH/////////// //////////////////14AABAAAAAAAAAAAAAAAACQif/9/n/zwAAAAAAAAAAAAAAP//n//// ////////////xAAAAAAQIEAD/////////8A0CAAAAAAAD0AAAD4Z+AAAAAAAAAAAAAAAAAAA AAAAAkI//8/+f82AAAAAAAAAAAAAAD//4////////////////+QAAAAAGf/////7w4AMAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaf//H/mZhgAAAAAAAAAAAAAAf/+P/ //////////////7kAAAAB/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAADH/2f8d+Sc4AAAAAAAAAAAAAAH//j///////////9///+dgAAAP//+AAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx/9n/HfmQOAAAAAAAAAAAAAAB// 4//////////93//////////+ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAN//u91/5mJwAAAAAAAAAAAAAAf/+P////////f////////////4AAwAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3bvxm4mCMAAAAAAAAAAAAAA H//j/////////////////gAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAA/7/98YuJmLAAAAAAAAAAAAAAB//4/////////////////4AAAAAADAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//3GxkZJjwAAAAAAAAAAA AAAf//P////////dz///////AAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAD//8xsZGZCsAAAAAAAAAAAAAAD//z///////9nc/////+/4AAAAAAMAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/M3/kS1kQjgAAAAAAAA AAAAAA//8////////////f////+AAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAHzv/5OLmZo8AAAAAAAAAAAAAAP//P/////9///////////gAAAAAAw AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuZn8Rq5mYnAAAAAA AAAAAAAAD//z//////f//////////8AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAd3Z8bGRkWI4AAAAAAAAAAAAAA//8f/////3///////////4AAAA ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHe7fExkZkIOAAA AAAAAAAAAAAP//H/////9////////////AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABzmbuTiwxGPgAAAAAAAAAAAAAB//x//////f////////+/+wA AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf927k5uZmD4 AAAAAAAAAAAAAAf/8f/////3////////9v/uAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAH/vxU1vmbmOAAAAAAAAAAAAAAH//H/////9/////////// 78AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/78RMZOR ZjgAAAAAAAAAAAAAB//x//////f//////////+fwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///TGTmRi4AAAAAAAAAAAAAAf/8f/////3//////// ///k8AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///5O b3cZuAAAAAAAAAAAAAAH//H/////9///////////5DgAAAAwAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+Tm5m67gAAAAAAAAAAAAAB//5//////f///// //////QIAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+5 nzW/duZ4AAAAAAAAAAAAAAf/+P/////3///////////0DAAAADAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uZ+zk5l+fAAAAAAAAAAAAAAH//j///////// ////////9AwAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfFyAAAD ///f95eRGbwAAAAAAAAAAAAAA//4//////v///////////QEAAAAMAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAP/////////////////+7s5sT1mcAAAAAAAAAAAAAAP/+P/////7 ///////////yBgAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////////// ///7nf5MbE7mnAAAAAAAAAAAAAAD//j/////+///////////8gIAAAAwAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAHwAAAD///wAAAAAAAAAAAH//PvZnzM5OX5nwAAAAAAAAAAAAAA//4//// //v///////////IDAAAAMAAAAAAAAAAAAAAAAB4AAAAAAA///////9//////+AAAAAAAAAAA AAfwD93dcTOTkRp8AAAAAAAAAAAAAAP/+H/////7///////////6AwAAADAAAAAAAAAAAAAA AB///8AAA/////////wf///++AAAAAAAAAA//A///9/e7uxvf5EZnAAAAAAAAAAAAAAD//h/ ////+//2////////+gMAAAAwAAAAAAAAAAAABAf//f//////+A9A8AAAAAAAAAAAAAAAf/// ////////3ubszmxu4ZwAAAAAAAAAAAAAA//4f/////v/1P////////oBAAAAOAABgAAD/gIf ////+AAD////AAAAAAAAAAAQAAf9+4f//////////wAAf//f3W1sTuY8AAAAAAAAAAAAAAP/ +H/////7/9f//////v/7Af/7eX///////////////wAAAAAAAAAAA4/////////////////4 AAAAAAAAAD///xMzk5dmfAAAAAAAAAAAAAAD//h/////+///////////+wD////////////P //8wAAAAAA7f///////f/////////39//wB4AAAAAAAAAAA/x/cTM5ORG3gAAAAAAAAAAAAA A//4f/////v///////////sA/////wAAAAAAAAAAAAAH////////////3+AAAAADgAAAAAAA OAAAAAAAAAAAPsd37MxtXRm4AAAAAAAAAAAAAAP//H/////7//Rm7+/////7AMAAAAwAAAAA AAAAf///////////gAgAAAAAAAAAA4AAAAAAADgAAAAAAAAAAD/39+7MbG73vAAAAAAAAAAA AAAB//x/////+//3////////+wBAAAAEAAAAAAAPn/////+74ADYAAAAAAAAAAAAAAGAAAAA AAA4AAAAAAAAAAA7e7kTL9/u5ngAAAAAAAAAAAAAAf/8f/////n///////////sAdhwAB/// ///////+8AAAAAAA2AAAAAAAAAAAAAABgAAAAAAAOAAAAAAAAAAAP/u5MzOTsXZ4AAAAAAAA AAAAAAH//H/////9///////////zAH///+f////////4ABAAAAAAANgAAAAAAAAAAAAAAYAA AAAAADgAAAAAAAAAAH//5f+nk7EZuAAAAAAAAAAAAAAB//w//////f/////v//7//wB///// //0h4AAAAAAQAAAAAADYAAAAAAAAAAAAAAGAAAAAAAA4AAAAAAAAAAB//+bs3GzPebgAAAAA AAAAAAAAAf/8P/////3////////////gfv///8AAAAAAAAAAEAAAAAAA2AAAAAAAAAAAAAAB gAAAAAAAOAAAAAAAAAAAP//U/Nxs7uf4AAAAAAAAAAAAAAH//D/////8D///////////+DbA AA/AAAAAAAAAABAAAAAAAPgAAAAAAAAAAAAAAYAAAAAAABgAAAAAAAAAAH//uzMzn//ueAAA AAAAAAAAAAAB//w//////4D///////////w8yH8NwAAAAAAAAAAQAAAAAAD4AAAAAAAAAAAA AAGAAAAAAAAYAAAAAAAAAAB///szM7OxH3gAAAAAAAAAAAAAAf/8P////////n/////////M GN///cAAAAAAAAAAEAAAAAAA+AAAAAAAAAAAAAABgAAAAAAAGAAAAAAAAAAAb//+7/9/9Rm4 AAAAAAAAAAAAAAH//j//////////////////5Bj////gAAAAAAAAABAAAAAAAOgAAAAAAAAA AAAAAYAAAAAAABwAAAAAAAAAAH///u7cbM7buAAAAAAAAAAAAAAB//4///////////////// //YY/+D/4AAAAAAAAAAQAAAAAABoAAAAAAAAAAAAAAGAAAAAAAAcAAAAAAAAAABz//3///7O 73gAAAAAAAAAAAAAAf/+P//////////////////2WPgABuAAAAAAAAAAEAAAAAAAaAAAAAAA AAAAAAABgAAAAAAAHAAAAAAAAAAAf///M3e39+94AAAAAAAAAAAAAAH//j////////////// ////+nj4AAbgAAAAAAAAABAAAAAAAGgAAAAAAAAAAAAAAYAAAAAAABwAAAAAAAAAAH////v/ 9/E/+AAAAAAAAAAAAAAA//4f//////////////////o4+AAG4AAAAAAAAAAQAAAAAABoAAAA AAAAAAAAAAGAAAAAAAAcAAAAAAAAAAB//+7s///dObgAAAAAAAAAAAAAAP//H/////////// ///////6PPgABuAAAAAAAAAAEAAAAAAAaAAAAAAAAAAAAAABgAAAAAAAHAAAAAAAAAAAf//+ 7N7szs/4AAAAAAAAAAAAAAD//x///////////////////zz4AAZgAAAAAAAAABAAAAAAAGgA AAAAAAAAAAAAAYAAAAAAABwAAAAAAAAAAH//+z///+7u+AAAAA== ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.11.msg ================================================ X-Andrew-Authenticated-As: 4099;greenbush.galaxy;Nathaniel Borenstein Received: from Messages.8.0.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 via MS.5.6.greenbush.galaxy.sun4_41; Wed, 8 Jan 1992 11:21:00 -0500 (EST) Message-ID: Date: Wed, 8 Jan 1992 11:21:00 -0500 (EST) From: Nathaniel Borenstein X-Andrew-Message-Size: 371+1 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="Interpart_Boundary_MdOmHZe0M2Yt8GzexjMdOmHZe0M2YtIGzf1R" To: Dave Sincoskie Subject: Re: PS -- Re: mailer error CC: Nathaniel Borenstein In-Reply-To: <9201062142.AA08914@raven.bellcore.com> References: <9201062142.AA08914@raven.bellcore.com> This message has been composed in the 'multipart' format for extended mail bodies. If you are reading this prefix, your mail reader probably has not yet been modified to understand the new format, and some of what follows may look strange. You may wish to look into upgrading your mail reader. However, the first part of this message (immediately after the funny-looking boundary line) is the text-only version of the message. If you read that part and skip the rest, you will probably understand the gist of the message. --Interpart_Boundary_MdOmHZe0M2Yt8GzexjMdOmHZe0M2YtIGzf1R BOY, was that stupid. As you can probably tell from the picture, I forgot to put the bold, underlined, and centered environments in place. This should work better: Boldly I shall say That your bug has gone away But I wish to underline that if the bug remains, it's mine. Now, did that look better? To me it looked like this: [An Andrew ToolKit view (a raster image) was included here, but could not be displayed.] How did it look to you? -- Nathaniel --Interpart_Boundary_MdOmHZe0M2Yt8GzexjMdOmHZe0M2YtIGzf1R Content-Type: multipart/mixed; boundary="Alternative_Boundary_MdOmHZe0M2YtMGzeozMdOmHZe0M2YtMGzetc" --Alternative_Boundary_MdOmHZe0M2YtMGzeozMdOmHZe0M2YtMGzetc Content-type: text/richtext Content-Transfer-Encoding: quoted-printable BOY, was that stupid. As you can probably tell from the picture, I forgot to put the bold, underlined, and centered environments in place. This should work better:
Boldly I shall sayThat your bug has gone awayBut I wish to underlinethat if the bug remains, it's mine.
Now, did that look better? To me it looked like this: --Alternative_Boundary_MdOmHZe0M2YtMGzeozMdOmHZe0M2YtMGzetc Content-type: image/xwd Content-Transfer-Encoding: base64 AAAAawAAAAcAAAACAAAAAQAAAe4AAAFbAAAAAAAAAAEAAAAIAAAAAQAAAAgAAAABAAAAPgAA AAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAIAAAHuAAABWwAAAAAAAAAAAAAAAHJhc3RlcgAA AAAAAAAAAAAAAAAAAAAB////////AAD///////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D8AAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVUAAAPx/8AAAAAAAAAAAAAAAAAAAAAAAAAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqgD/4/EAQAAAAAAAAAAAAAIBwAAAAAAAAAVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVAIkj8WFAAAAAAAAAAAAAAgIgAAAACAAACqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAiSPxMkAAAAAAAAAAAAACAgAAAAAAAAA FVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQCJI/EaQDRxxxxxxwBxyx4 CBzTxxxixwAqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAPkj8RBAKoo ogooovoosogIIqoooiMogBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU AgSPxLEAq+YYei+YAY+iiAgiqiiYIiiAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqgCBI/EmQCqAQSKKAQASCKICCKqKIQiKIAVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVAP8j8UNAKoooonoogIooogIoqvIoiIngCqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAgCPxAEAiccceCccAccieAccigccciCAFVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQCAI/H/wAAAAACIAAAAAAAAAACAAAA CIAqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAP/j8AAAAAAAAHAAAAA AAAAAAIAAAAHABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAPwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ///////////////////////////////////////d3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////d3dAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAf3d3cAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAB/3 d3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAA72/w94AA AB0AAAAAH////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA wABmTbBmAAAAMwAAAAAf4P4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAADAAGZBsGwAAABhAAAAAB/g/gwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAABAAAAACAAAAAAAAAABAAAAAgAAAHAAAACAAAAAAAAAgAAAAAA/gAAwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/gAAwAAAAAQAoAAQAAAgAACAAAQAABAAAAAAQAgABAAAAfggAEAAIIAAAQ EAEQAAAAAAAAAAAAAAAAAAAAD+AADAAAAABACAABAAACAAAIAABAAAAAAAAABAAAAEAAAASA AAQAAggAABAQARAAAAAAAAAAAAAAAAAAAAAP4AAMAAAlY0yqsY0ByxoMZZzKY0GWRVOWdjLO YKwWXGMABLJgZY5KaEk5UhYzuZSAAAAAAAAAAAAAAAAAAA/gAAwAACWU0srKUwAsphKWSSyU wllFZFlJSySQshlClIAEypCWUUqYSUWUGUkSWAAAAAAAAAAAAAAAAAAAD+AADAAAJRReiovR AOiiEPRJ6PRD0SlEUUl6JGCiEU6HgASKYGRRSogqRRgReRPQAAAAAAAAAAAAAAAAAAAP4AAM AAAlFFCKihEBKKIQhEkIhEIRKURRSUIkEKIRUoQABIoQFFFKiCpFFBFBEhAAAAAAAAAAAAAA AAAAAA/gAAwAACUU0oqKUwEophKUSSiUwlERRFFJSiSQohlSlIAEipCUUUqYFEUSGUkSUAAA AAAAAAAAAAAAAAAAD+AADAAAHRNMiomNINiaDGRMyGNBkRFDkUkyJmCiFk1jEASKYGROOmgU ORIWMZmQgAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAEAAAAAAAAAAAAAAAAAA AAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/g AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgGGwAQBACgAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAYbABAEAKAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADM5ntsEGWco M5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Pm222wQlkKhIUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAzbabbBBkTqDHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADNtptsEBRSoClQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAM AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM222zwQlFKhKTAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+OZ7GBBkTaDGoAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAA AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/g AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAQAAAAgAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAJABAAAACAAAgAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAlnOEnJULJNCzjA05Ywck uSAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAACZCQSilgyl MMhSE0WUgKSFIAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAA AJE5BSKUCKUQicwRRReDlR1AAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAA AAAAAAAAAAAAkUkFIpQIpRCKQhFFFASVJUAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAA AAAAAAAAAAAAAAAAAAAAAACRSQMilAylMIpSE0UUhIokwAAAAAAAAAAAAAAAAAAAAAAAAAAA D+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAJE1ghx0CxzQiawNORMDShqAAAAAAAAAAAAAAAAA AAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAABAAAAEAAAAAAIAAAAAA AAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAA4AAADgAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAA AAAAAAAAAAAAAAAAAAAAAAAAAAADwCBAAgQBAAAAIAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgIEAABAEAAAAgBAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAilwQkplg5wSsaZVWMAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADySBCSpZBIhLK aWVlIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp IEFSZEEiEoovRUXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAikgQVIUQSISiihFRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAA AAAAAAAAAAAAAAAAAAACKSBAopRBIhKKaUVFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAM AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHMECiZEGcDommRUTAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA H//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAA AAAAAAAAAAAAAAAAAAJABBGEgAIAAAAAAIAAEhAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/g AAwAAAAAAAAAAAAAAAAAAAAAAAAAAkAEAgSAAgAAAAAAAAACEAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAHWc4XDrGCyTQpnZysYBcmDsrGAAAAAAAA AAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAJkJBIEykMpTDJSQrKQEgkJ KykAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAkTkEgSLwilE I9JOomASBgkqLwAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAC RSQSBIoCKUQiElKiEBIBCSooAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAA AAAAAAAAAAJFJBIEikMpTCJSUqKQEgkJKikAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAA AAAAAAAAAAAAAAAAAAAAA0TWEgaJgsc0IZJNomITBgkqJiAAAAAAAAAAAAAAAAAAAAAAAAAA D+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAEAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAM AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAGIAAACggkAEEABAQ ARAAYB8AAABIIACAAhUABIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAYgAAA ICCQAQQAEBABEACQBAAAAAggAIACEQAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/g AAwAABSckgGpodZzhOOSFjO5lBAEcHYwXCcckxoVJg6yYgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD+AADAAAFKKSAmpgmQkFFFQZSRJYIASISUhIKKKkphVJBMqQAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAP4AAMAAASolQCKiCROQUUWBF5E9BABIhJeEgooseiFY8EimAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAABKiVAIqIJFJBRRUEUESEEAEiElASCiipCIV SASKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAEaIoAmpgkUkFFFIZSRJQAASI SUhIKKKUphUpBIqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAARnChBqaDRNYTj khYxmZBABHBJMEwnHJMaFSYGimIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAA AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D+AADAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAM AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/g AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAM AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/g AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAM AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/g AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AADAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP4AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/gAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAD+AADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/3/3QAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD93/3AAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP93d0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/d3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAP3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/d3dAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///8AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/d 3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAP93d0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD93d3AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///8AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/3d3QAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D/////////////////////////////////////////////////////////////////////// ////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////// //////////////////////////////////////////////////////////// --Alternative_Boundary_MdOmHZe0M2YtMGzeozMdOmHZe0M2YtMGzetc Content-type: text/plain Content-Transfer-Encoding: quoted-printable How did it look to you? -- Nathaniel --Alternative_Boundary_MdOmHZe0M2YtMGzeozMdOmHZe0M2YtMGzetc-- --Interpart_Boundary_MdOmHZe0M2Yt8GzexjMdOmHZe0M2YtIGzf1R-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.12.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Thu, 6 Feb 92 23:18:13 EST Received: from uqcspe.cs.uq.oz.au by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Thu, 6 Feb 92 23:18:07 EST Received: from solution.cs.uq.oz.au by uqcspe.cs.uq.oz.au id ; Fri, 7 Feb 92 14:33:40 +1100 Date: Fri, 7 Feb 92 14:33:38 +1100 From: rhys@cs.uq.oz.au Message-Id: <9202070333.AA25077@client> To: nsb@thumper.bellcore.com Subject: Test MIME message Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="New_MetaSend_Alt_220042694" > THIS IS A MULTIPART MESSAGE IN 'MIME' FORMAT. It may contain enhanced > text, graphics, or sounds. If you are reading this warning, your mail > reader does not understand MIME format, and some of what follows may look > strange. However, the plain-text version of the message appears first, > and can be viewed with any mail reader. --New_MetaSend_Alt_220042694 Hi there! Here's my first test message to you using my own version of metasend. First some piccys!! Here's the icon for my newsreader: [A part of type image/x-xbitmap was included here, but could not be displayed] ... and how about this little devil to announce the arrival of mail: [A part of type image/x-xbitmap was included here, but could not be displayed] And ... any MIME message wouldn't be complete without a little bit of *richtext* to _liven_ things up. :-) Well, let me know how this goes on your end. -- Rhys. + +=====================+==================================+ + || Rhys Weatherley | The University of Queensland, || + || rhys@cs.uq.oz.au | Australia. G'day!! || + || "I'm a FAQ nut - what's your problem?" || + +=====================+==================================+ *_ --New_MetaSend_Alt_220042694 Content-type: multipart/mixed; boundary="New_MetaSend_Main_1292627053" --New_MetaSend_Main_1292627053 Content-type: text/plain Hi there! Here's my first test message to you using my own version of metasend. First some piccys!! Here's the icon for my newsreader: --New_MetaSend_Main_1292627053 Content-type: image/x-xbitmap Content-Transfer-Encoding: base64 I2RlZmluZSBEZXZpbDMyX3dpZHRoIDMyCiNkZWZpbmUgRGV2aWwzMl9oZWlnaHQgMzIKc3Rh dGljIGNoYXIgRGV2aWwzMl9iaXRzW10gPSB7CiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MTAsIDB4MDAsCiAgIDB4 MDAsIDB4MDQsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MjgsIDB4MDAsIDB4MDAsIDB4 MGEsIDB4MjgsIDB4MDAsCiAgIDB4MDAsIDB4OWEsIDB4MmMsIDB4MDAsIDB4MDAsIDB4ZmEs IDB4MmYsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4MWYsIDB4MDAsCiAgIDB4MDAsIDB4ZGMsIDB4 MWQsIDB4MDAsIDB4MDAsIDB4OTgsIDB4MGMsIDB4MDAsIDB4NzAsIDB4ZjAsIDB4MDcsIDB4 MDcsCiAgIDB4OTAsIDB4YjMsIDB4ZTYsIDB4MDQsIDB4MjAsIDB4ZmMsIDB4MWYsIDB4MDIs IDB4YTAsIDB4ZTMsIDB4ZTMsIDB4MDIsCiAgIDB4NDAsIDB4MGYsIDB4MWMsIDB4MDEsIDB4 NDAsIDB4NmYsIDB4NDMsIDB4MDEsIDB4YzAsIDB4MGUsIDB4YjgsIDB4MDEsCiAgIDB4ZTAs IDB4NjEsIDB4YmEsIDB4MDMsIDB4Y2MsIDB4MDMsIDB4ZjgsIDB4MTksIDB4YmUsIDB4NmMs IDB4Y2IsIDB4M2UsCiAgIDB4ZmUsIDB4MDIsIDB4YTAsIDB4M2YsIDB4ZmUsIDB4M2MsIDB4 OTYsIDB4M2YsIDB4ZmMsIDB4NDIsIDB4YTEsIDB4MWYsCiAgIDB4ZjAsIDB4MzEsIDB4Y2Ms IDB4MDcsIDB4ODAsIDB4NDcsIDB4ZjMsIDB4MDAsIDB4MDAsIDB4MWUsIDB4M2MsIDB4MDAs CiAgIDB4MDAsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MzgsIDB4MDAsIDB4 MDAsIDB4MDQsIDB4MTAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDAsIDB4MDB9Owo= --New_MetaSend_Main_1292627053 Content-type: text/plain ... and how about this little devil to announce the arrival of mail: --New_MetaSend_Main_1292627053 Content-type: image/x-xbitmap Content-Transfer-Encoding: base64 I2RlZmluZSBEZW1vbkJpZmZfd2lkdGggMzIKI2RlZmluZSBEZW1vbkJpZmZfaGVpZ2h0IDMy CnN0YXRpYyBjaGFyIERlbW9uQmlmZl9iaXRzW10gPSB7CiAgIDB4ZmYsIDB4ZmYsIDB4ZmYs IDB4ZmYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDUsIDB4YmUsIDB4MmIsIDB4YTAs CiAgIDB4MGQsIDB4YWEsIDB4MmEsIDB4YjAsIDB4MGQsIDB4YWEsIDB4MmIsIDB4YjAsIDB4 MTUsIDB4YWEsIDB4ZWEsIDB4YTgsCiAgIDB4MTUsIDB4MDAsIDB4MDAsIDB4YTgsIDB4ZjUs IDB4ZmYsIDB4ZmYsIDB4YWYsIDB4ZmQsIDB4ZmYsIDB4ZmYsIDB4YmYsCiAgIDB4MDEsIDB4 ZjgsIDB4MWYsIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4ZjgsIDB4 MWYsIDB4MDAsCiAgIDB4MDAsIDB4ZjgsIDB4MWYsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4MWYs IDB4MDAsIDB4MDAsIDB4ZjgsIDB4MWYsIDB4MDAsCiAgIDB4MDAsIDB4ZmMsIDB4M2YsIDB4 MDAsIDB4MDAsIDB4ZmUsIDB4N2YsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsCiAg IDB4YzAsIDB4ZmYsIDB4ZmYsIDB4MDEsIDB4ZTAsIDB4ZmYsIDB4ZmYsIDB4MDMsIDB4Zjgs IDB4ZjAsIDB4OGYsIDB4MDcsCiAgIDB4M2MsIDB4ZTAsIDB4MDcsIDB4MGYsIDB4ZmYsIDB4 ZTIsIDB4NDcsIDB4MGUsIDB4YWIsIDB4ZmUsIDB4N2YsIDB4MWMsCiAgIDB4YWIsIDB4ZmMs IDB4M2YsIDB4MWMsIDB4ODksIDB4ZDgsIDB4MWIsIDB4M2MsIDB4ODEsIDB4OTgsIDB4MTks IDB4M2UsCiAgIDB4ODUsIDB4ZjgsIDB4MWYsIDB4MmEsIDB4YjUsIDB4ZDgsIDB4MWIsIDB4 MmEsIDB4YjUsIDB4NTAsIDB4MGEsIDB4MDgsCiAgIDB4ODEsIDB4MTAsIDB4MDgsIDB4MDAs IDB4ZmYsIDB4ZTAsIDB4MDcsIDB4MDB9Owo= --New_MetaSend_Main_1292627053 Content-type: text/richtext And ... any MIME message wouldn't be complete without a little bit of richtext to liven things up. :-) Well, let me know how this goes on your end. -- Rhys. +=====================+==================================+ || Rhys Weatherley | The University of Queensland, || || rhys@cs.uq.oz.au | Australia. G'day!! || || "I'm a FAQ nut - what's your problem?" || +=====================+==================================+ --New_MetaSend_Main_1292627053-- --New_MetaSend_Alt_220042694-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.13.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Tue, 16 Jun 92 04:34:26 EDT Received: from etlpost.etl.go.jp by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Tue, 16 Jun 92 04:34:20 EDT Received: from etlpom.etl.go.jp by etlpost.etl.go.jp (5.67+1.6W/2.7W) id AA19108; Tue, 16 Jun 92 17:34:14 JST Received: by etlpom.etl.go.jp (4.1/6.4J.6-ETLpom.MASTER) id AA24551; Tue, 16 Jun 92 17:34:14 JST Received: by etlibs.etl.go.jp (4.1/6.4J.6-ETL.SLAVE) id AA12690; Tue, 16 Jun 92 17:34:08 JST Date: Tue, 16 Jun 92 17:34:08 JST Return-Path: To: nsb@thumper.bellcore.com Subject: Re: transparent.el From: ysato@etl.go.jp (Yutaka Sato =?ISO-2022-JP?B?GyRAOjRGI0stGyhK?=) Content-Type: text/plain; charset=ISO-2022-JP Organization: Electrotechnical Laboratory, Tsukuba Science City Message-Id: References: MIME-Version: 1.0 Hi. I forward my coleague's question about MIME. He asks where he could get "transparent.el" which is required to use Metamail in emacs. I tried to find it using ARCHIE, but no record was found. Could you tell me where can I get the file? Thanks in advance. -- Yutaka Sato Information Base Section ELECTROTECHNICAL LABORATORY 1-1-4 Umezono, Tsukuba, Ibaraki, 305 Japan On 06/16/92(16:26) you akaho@etl.go.jp (Shotaro Akaho) wrote in (etl.post.misc:148/etlss2): |(と)@数理です. | |emacs 系のメイルシステムで MIME フォーマット対応にするには |transparent.el というのが必要みたいです (RMAIL, MH-e, VM いずれも). | |mime/mailers.txt より抜粋 ||3. Make sure you have the GNU "transparent.el" package installed. This ||is not part of the standard distribution, but is widely available, and ||should be part of most FTP archives, etc. | |少しばかり探してみましたが, 手に入りませんでした. |どなたか持っていらっしゃる方がおいでになりましたら頂きたいのですが… |どこか共用のディレクトリに置いて下さっても結構です. |あるいはどこどこにあるよという情報でも構いません. |よろしくお願いします. |-- |赤穗@情報数理 akaho@etl.go.jp / 5549 / D-622 ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.14.msg ================================================ Date: Fri, 29 Nov 91 07:13:35 EST From: Nathaniel Borenstein To: caseau@france.bellcore.com (Yves J Caseau) Subject: Please check this out Content-type: text/plain; charset=iso-8859-1 Content-transfer-encoding: quoted-printable Message-Id: <635263359948238690.21002.3@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 Please let me know if I've typed this correctly. And thanks again for your help! -- Nathaniel Le courrier =E9lectronique =E0 la fran=E7aise n=E9cessite quelques caract=E8res sp=E9ciaux pour faciliter la t=E2che du lectein et =E9viter les ambigu=EFt=E9s ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.15.msg ================================================ X-Andrew-Authenticated-As: 4099;greenbush.galaxy;Nathaniel Borenstein Received: from Messages.8.5.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 via MS.5.6.greenbush.galaxy.sun4_41; Tue, 16 Jun 1992 09:46:49 -0400 (EDT) Message-ID: <4eDT39K0M2YtMC_2lL@thumper.bellcore.com> Date: Tue, 16 Jun 1992 09:46:49 -0400 (EDT) From: Nathaniel Borenstein MIME-Version: 1.0 Content-type: text/plain; charset=US-ASCII To: ysato@etl.go.jp (Yutaka Sato =?ISO-2022-JP?B?GyRAOjRGI0stGyhK?=) Subject: Re: MIME & int'l mail In-Reply-To: References: I'm in my office now, so I can see the picture you sent me without extreme slowness. Very nice. As for your questions: The white space in your name was an accident on my part -- sorry about that. The characters you didn't recognize -- in my From: field & my signature -- are my name in Hebrew. It's pronounced "Naftali Ben Shalom". When you say that it isn't easy to do multilingual mail in MIME, I presume what you mean is that it's a pain to have multiple parts, each of them plain text in a different character set? If that's what you mean, I agree. This will only be solved when the ISO 10646 and Unicode folks finish their work and give us a "one-world" character set. I look forward to that day! -- Nathaniel ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.16.msg ================================================ X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil] [nil "Mon" "26" "June" "1995" "16:53:52" "-0800" "Aleksandar Totic" "atotic@netscape.com" nil "6272" "AppleDouble example" "^Date:" nil nil "6" nil nil (mark number " 26-Jun-95 16:53 Aleks Toti6272 AppleDouble example¥n") nil] nil) Received: from neon.netscape.com (steroid.mcom.com [198.93.92.10]) by abattoir.netscape.com (8.6.10/8.6.9) with ESMTP id QAA26158 for ; Mon, 26 Jun 1995 16:50:29 -0700 Received: from [198.93.92.66] (nonlinear.mcom.com [198.93.92.66]) by neon.netscape.com (950215.SGI.8.6.10/8.6.9) with SMTP id QAA25749; Mon, 26 Jun 1995 16:46:00 -0700 X-Sender: atotic@198.93.92.10 Message-Id: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="========================_26885646==_" Date: Mon, 26 Jun 1995 16:53:52 -0800 From: atotic@netscape.com (Aleksandar Totic) To: atotic@mcom.com, jwz@mcom.com Subject: AppleDouble example --========================_26885646==_ Content-Type: text/plain; charset="us-ascii" Here comes a Mac file encoded as AppleDouble, with both forks. Aleks --========================_26885646==_ Content-Type: multipart/appledouble; boundary="========================_26885646==_D" --========================_26885646==_D Content-Transfer-Encoding: base64 Content-Type: application/applefile; name="%Aete_Editor_b1" Content-Disposition: attachment; filename="%Aete_Editor_b1" AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAPgAAAA4AAAAJAAAATAAAACAA AAACAAAAbAAAveNBZXRlIEVkaXRvciBiMVNUQUtXSUxEAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABAAAAu+oAALrqAAAB+XJkIGJ1dHRvbiAiaGFzIGdsdWUgc3Vicm91dGlu ZSIgDkFldGUgRWRpdG9yIGIxdAIAAABTVEFLV0lMRAEAAAAAAFNUQUtXSUxEAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAApdfAjQAEG8AAAL3jIGNhcmQgInByZWZlcmVuY2UiIGlu dG8gdmVyYm9zZQ1wdXQgY2FyZCBmaWVsZCAidGltZU91dCIgb2YgY2FyZCAicHJlZmVy ZW5jZSIgaW50byBkZWZhdWx0VGltZW91dA1wdXQgY2FyZCBmaWVsZCAic2VuZFRhcmdl dCIgb2YgYwAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAABGAAAERgAADkYAABZG AAAnhgAAQAYAAIAGAABADgAAJ/wAABf4AAAOAAAABgAAAAIAAAAAAWxgDgAAWEZDTgz9 AAAAAAAAQfr/7iHICc5gAADsIl8gH6EiLohO0U5WAAAvDChuABApbgAMAFApbgAIAFQ5 fAAOAEwvLABIIF9OkChfTl4gX978AAxO0E5W/wAvDCBuAAhD7v8AcD8i2FHI//wobgAM Qe7/AClIAFA5fAAHAEwvLABIIF9OkC1sAHAAEChfTl4gX1BPTtBOVv8ALwwgbgAIQ+7/ AHA/IthRyP/8KG4ADEHu/wApSABQOXwACgBMLywASCBfTpAtbABwABAoX05eIF9QT07Q TlYAAC8MKG4AECluAAwAUCluAAgAVDl8AAgATC8sAEggX06QKF9OXiBf3vwADE7QTlb+ 6EjnATAmbgAISlNvIC8LIGsAAi8QSG7+6E66/7JZTy8LSG7+6E66/2YuH2ACQodZTy8H Trr+3iRfQisARi8LLwpIbv7oTrr+1llPLwtIbv7oTrr++idfAEJM3wyATl4un051AAAM 7k5WAAAvLgAITroCjE5eLp9OdYpFTlRSWVBPSU5UAAAATlb/ACBuAAgvKAAILy4ADEhu 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 ZmMvDk66/kBCbv++YAAAwCBuAAxD7v/YItgi2Epu/75mFi18bWV0Yf/YQe7/4EPu/8gg 2SDZYAxB7v/gQ+7/0CDZINlCZ0hu/9hIbv+6MDwEB6gWPV//sC1u/7r/onABLUD/tmBa QmdIbv/YLy7/ti88KioqKkhu/7JIbv/oMDwKC6gWLw5Ouv0+QmdIbv/gLy7/skhu/+gw PAYQqBY9X/+wQmdIbv/oMDwCBKgWVI8/Lv+wLw5Ouv0OUq7/tmkKIC7/trCu/6JvnFJu /75wAbBu/75sAP86QmdCp0KnHzwAAUhu/8AwPAcGqBYvDk66/NZCZ0hu/8AvPGF0dHJI bv/IMDwGEKgWLw5Ouvy6QmdIbv/IMDwCBKgWVI9Krv/UZypCZ0hu/8AvPHBhcm1Ibv/Q MDwGEKgWLw5OuvyKQmdIbv/QMDwCBKgWVI9CZ0hu/8AvPCRhZSRIbv+mMDwGA6gWVI9C Z0hu/8AwPAIEqBZUj2AAAQIgbgAMIDxsaXN0sJBXwCI8cmVjb7KQV8GAAWcAANgdfAAB /68gbgAMIDxyZWNvsJBmRC18cmVjb//4QmcvLgAMLzx0eXBlLzwqKioqSG7//Ehu//hw BC8ASG7/9DA8DhGoFlSPIDxyZWNvsK7/+FfARAAdQP+vEC7/r2dgcAAtQP/EQmdCp0Kn HzwAAUhu/8AwPAcGqBZKX2YyQmdIbv/ALzwtLS0tLy4ADDA8BhCoFkpfZhhCZ0hu/8Av PCRhZSRIbv+mMDwGA6gWVI9CZ0hu/8AwPAIEqBZUj2AkQmcvLgAMLy7/+Ehu/6YwPAYD qBZUj2AMIG4ADEPu/6Yi2CLYIG4ADCAoAASwrv+qZywgbgAIcAGwEGYOQmcvLgAMMDwC BKgWVI8gbgAIELwAASBuAAxD7v+mINkg2UJuABBP7v+CTN8c+E5eIF9QT07QTlb9+Ejn ARgmbgAMLwsgbgAILxBIbv78TroC/Ehu/vxIegB4SG79+D88AAJOugNKQe7+/EPu/fhw PyDZUcj//EKnLwtIegBITroBPChfIAxnMEKnLwxCp0hu/v1CQBAu/vxIwC8AcP8vAEKn qeAuHy8LSHoAGi8MTroBTC8MIF+gI0zfGIBOXiBfUE9O0AtDcmVhdGVkRGVzYwEsTlb+ 5EjnAxgmbgAIKG4AEC4uABRCEyAMZwAAwkKnLwcvFE66AUhwBrCfbDogVHC+sBBmGiAU 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 /wAvPAAAAQBOuhLcQkAQLv8ASMDQlFKAKIAQLgAMZzY9fAEg/v4dfAAN/v9Ibv7+SG7/ AE66E3g+H28KQe7/ABG8ACBwAEpHZuJIbv8ALy4ACE66/ahM3xCATl4gX978AApO0E5W AAAvLgAOHy4ADC8uAAhOuv96IG4ADhAoAAMCQAABZwJSkE5eIF/e/AAKTtBOVgAASG4A FEJnLy4ACE66/8IgbgAQIm4AFCCRIG4ADCJuABAgkU5eIF/e/AAQTtBOVgAAIG4ADCJu ABAgkSBuAAgibgAMIJFOXiBf3vwADE7QTlb+/i8HEC4ADGc+Qe7/AEP6AEwg2TCRIG4A Di8QSG7/AXAELwBOuhHaSHoAMEhu/wBOuhKWPh9vBB1H/wBIbv8ALy4ACE66/NAgbgAO WJAuH05eIF/e/AAKTtABIAQ/Pz8/AE5WAABIbgAUQmcvLgAITrr+mEhuABRCZy8uAAhO uv7+IG4AECJuABQgkViuABQgbgAMIm4AFCCRTl4gX978ABBO0E5W//BKrgAUZywtbgAQ //AtbgAM//QtbgAI//hwAC1A//xCZ0hu//AvLgAUcBAvAE66EThUj05eIF/e/AAQTtBO Vv/oSOcBGCZuABQgC2dkKFNCpy8LTroQ8C4M3p8gB5CMbyYgFLCuABBmGCAsAASwrgAM ZggpbgAIAAxgNnAQ2cBg2nAQ2cBg1C1uABD/6C1uAAz/7HAALUD/8C1uAAj/9EJnSG7/ 6C8LcBAvAE66ELpUj0zfGIBOXiBf3vwAEE7QTlb/7kjnAwAgbgAoIFA8EC8uAChCZy8u AAhOuv0McAAtQP/wPUb/7n4BYFggbgAoLxBIbv/0SG7/+EHuAAwgGGcCLwAgUE6QLy4A JC8u//QvLv/4IG4AKC8QQe4AHCAYZwIvACBQTpAvLgAoSG7/8EKnQe4AFCAYZwIvACBQ TpBSR2kGvm7/7m+iTN8AwE5eIF/e/AAkTtBOVv/mSOcPGCZuAAhCp0KnTroP0i4fUmv6 0DAr+tDlQEHr+rghhwAALy4AIC8HSHr+dkKnQe4AHC8gLyBB7gAULyAvIC8uAAhOuv8e Ly4AHC8HSHr+kkKnQe4AHC8gLyBB7gAULyAvIC8uAAhOuv76QqcvB066D3hwEC8ATroP viAfPUD/+kHu//otSP/wSG7/8B88AAEvLgAITrr79HwAPW7/+v/megFgVCBHKAbYkHAQ 3IBwAC1A//QoREqsAAhnDi1sAAj/8C1sAAz/9GAGLWwADP/wSG7/8Ehu//QfPAABSqwA DFbARAAfAEHuABQgGGcCLwAgUE6QUkVpBrpu/+Zvpi8HIF+gIzAr+tDlQEHr+rhyACGB AABTa/rQTN8Y8E5eIF/e/AAcTtBOVv/2SOcDACBuABggUDwQLy4AGB8uABYvLgAITrr7 RnAALUD/+D1G//Z+AWAiLy4AGEhu//gfLgAWHy4AFEHuAAwgGGcCLwAgUE6QUkdpBr5u //Zv2EzfAMBOXiBf3vwAFE7QTlb//kjnAwAcLgAOIG4AEEqQZkovLgAUHwYvLgAITrr7 0C8uABQfBi8uAAhOuvxCLy4AFB8GLy4ACE66/DQvLgAUHwYvLgAITrr7pi8uABQfBi8u AAhOuvriYAAAuCBuABQgUEoQVsdEBy8uABQfBy8uAAhOuvt6Ly4AEBAHCgAAAR8ALy4A CE66+2YvLgAUHzwAAS8uAAhOuvvWLy4AFB88AAEvLgAITrr7xi8uABBCZy8uAAhOuvu4 Ly4AEEJnLy4ACE66+6ogbgAUIFBKEFbHRAcvLgAUHwcvLgAITrr7EC8uABAQBwoAAAEf AC8uAAhOuvr8Ly4AFB88AAEvLgAITrr6Ni8uABBCZy8uAAhOuvooTN8AwE5eIF/e/AAQ TtBOVv/+SOcDABwuAA4gbgAQSpBmAADCEC4ADGcQEAZnDEh6Al4vLgAITrr5Ui8uABQf Bi8uAAhOuvoiLy4AFB8GLy4ACE66+ogvLgAUHwYvLgAITrr6+i8uABQfBi8uAAhOuvrs Ly4AFB8GLy4ACE66+t4vLgAUHwYvLgAITrr6UC8uABQfBi8uAAhOuvmMLy4AFB8GLy4A CE66+rQvLgAUHwYvLgAITrr6Ji8uABQfBi8uAAhOuvliLy4AFB8GHy4ADEh6/hovLgAI Ly4ACE66/apgAAGaSHoBpC8uAAhOuvicIG4AFCBQShBWx0QHLy4AFB8HLy4ACE66+WAv LgAQEAcKAAABHwAvLgAITrr5TCBuABQgUEoQVsdEBy8uABQfBy8uAAhOuvmmLy4AEBAH CgAAAR8ALy4ACE66+ZIvLgAUHzwAAS8uAAhOuvoCLy4AEEJnLy4ACE66+fQvLgAUHzwA AS8uAAhOuvnkLy4AEEJnLy4ACE66+dYvLgAUHzwAAS8uAAhOuvnGLy4AEEJnLy4ACE66 +bggbgAUIFBKEFbHRAcvLgAUHwcvLgAITrr5Hi8uABAQBwoAAAEfAC8uAAhOuvkKLy4A FB88AAEvLgAITrr4RC8uABBCZy8uAAhOuvg2Ly4AFB88AAEvLgAITrr5XC8uABBCZy8u AAhOuvlOIG4AFCBQShBWx0QHLy4AFB8HLy4ACE66+LQvLgAQEAcKAAABHwAvLgAITrr4 oC8uABQfPAABLy4ACE6699ovLgAQQmcvLgAITrr3zC8uABQvLgAQSHr8hi8uAAhIevic Ly4ACC8uAAhOuvriTN8AwE5eIF/e/AAQTtACIyYAAiMqAE5WAAAgbgAQSpBmEi8uABQf LgAMLy4ACE66+LBgHi8uABQfPAABLy4ACE66+J4vLgAQQmcvLgAITrr4kE5eIF/e/AAQ TtBOVv/6SOcHABouAA4gbgAQSpBmRi8uABQfBS8uAAhOuvhkIG4AFCBQPBAvLgAUHwUv LgAITrr23j1G//p+AWASLy4AFB8FLy4ACE66+DhSR2lEvm7/+m/oYDwvLgAUHzwAAS8u AAhOuvgcLy4AEEJnLy4ACE66+A4vLgAULy4AEEh6/zgvLgAISHr32EKnLy4ACE66+fBM 3wDgTl4gX978ABBO0E5W//5I5wcAGi4ADBwuAA4gbgAQSpBmchAFZxAQBmcMSHoBPi8u AAhOuvXkLy4AFB8GLy4ACE669ygvLgAUHwYvLgAITrr3mi8uABQfBi8uAAhOuvcMLy4A FB8GHwVIevsQLy4ACC8uAAhOuvqgLy4AFB8GHwVIev7kLy4ACC8uAAhOuvqIYAAAxkh6 ANAvLgAITrr1eiBuABQgUEoQVsdEBy8uABQfBy8uAAhOuvayLy4AEBAHCgAAAR8ALy4A CE669p4vLgAUHzwAAS8uAAhOuvcOLy4AEEJnLy4ACE669wAgbgAUIFBKEFbHRAcvLgAU HwcvLgAITrr2Zi8uABAQBwoAAAEfAC8uAAhOuvZSLy4AFC8uABBIevpWLy4ACEh69mwv LgAILy4ACE66+LIvLgAULy4AEEh6/iIvLgAISHr2fEKnLy4ACE66+JRM3wDgTl4gX978 ABBO0AIjJgACIyoATlb//kjnAwAcLgAOIG4AEEqQZkQQLgAMZxAQBmcMSHoA0C8uAAhO uvSCLy4AFB8GLy4ACE669cYvLgAUHwYvLgAITrr2OC8uABQfBi8uAAhOuvWqYAAAiEh6 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 AABOXiBfUE9O0IRGQUlMAAAATlYAAEjnAQg+LgAMKG4ACHABsEdmUC8sAAggbAAIIGgA Ai8QSGz/AE66BPRIbP8ASHoA+E66BZIQH2cOSHoAYi8uAAhOuv9mYBxIbP8ASHoA2E66 BXQQH2cMSHoAjC8uAAhOuv9IcAOwR17AcgSyR13BgAFnDEh6ACgvLgAITrr/LEzfEIBO XiBfXE9O0I9DSEVDS1BBUkFNQ09VTlQAjEZGb3JtOiBTZWFyY2goY29udGFpbmVyLCB0 aGVTdHJpbmcsIHNlYXJjaFdob2xlLCBFdmVyeSBPY2N1cnJlbmNlIEZsYWcpAD9TZWFy Y2ggWEZDTiAxLjEgqTE5OTAgQXBwbGUgQ29tcHV0ZXIsIEluYy4gQWxsIFJpZ2h0cyBS ZXNlcnZlZC4BIQE/TlYAACBuABAgLgAM0ZBOXiBf3vwADE7QkElOQ1JFTUVOVFBPSU5U RVIAAABOVv/+SOcBGCZuAAwobgAIQgcgUxAQSIBnJgRAAA1nDgRAABNnFgRAAAxnCmAa Uqz79H4BYBJSrPvwYAx+AWAIfgEZfAAB++5SkyBTShBXwMAHZwYZfAAB++4QB2e0TN8Y gE5eIF9QT07Qi1NDQU5UT1NQQUNFAABOVgAALwwobgAIIG4ADCBQEBBIgGcaBEAADWcI BEAAH2cIYBRSrPv0YA5SrPvwYAgZfAAB++5gEC8uAAxwAS8ALy4ACE66/xYoX05eIF9Q T07QiFNDQU5ORVhUAAAATlb9AC8MKG4ACC8sAAgvLgAMSG7+AE66AgQvLAAILy4AEEhu /wBOugH0ECz772cySGz9AEhu/wBIegBySG7+AEhs/ABIbv0APzwABU66AupB7P0AQ+79 AHA/INlRyP/8YDZKLP0AZjBIbP0ASG7/AEh6ADpIbv4ASGz8AEhu/QA/PAAFTroCskHs /QBD7v0AcD8g2VHI//woX05eIF/e/AAMTtCFTE9HSVQAAgEsTlb77EjnHzggbgAIPVD7 +j8u+/ovDk66/QxCpy8uAAggbgAIIGgABi8QTroBBCAfPUD7+C8uAAggbgAIIGgACi8Q SG7/AE66AfpCZy8uAAhIbv8ATroBoB1f++1wBLBu+/pmCB18AAH772AEQi7770Iu++5w AS1A+/RwAS1A+/BCLv0AHXwAAf8AHXwAAfwAHXwADfwBIG4ACCBoAAItUPv8QmcgbgAI IGgABi8QLy77/D8u+/g/Lvv4TroBwkpfZhYvLvv0Ly778C8OTrr+hBAu++9mAmAkEC77 7WcMSG77/C8OTrr9lmAKSG77/C8OTrr+AnABsC777mamIG4ACC8IQqcvLgAISG79AE66 AJwgHyBfIUAAQk/u+8xM3xz4Tl4un051hlNFQVJDSAAAAE5WAAAvDChuAAwpbgAIAFA5 fAADAEwvLABIIF9OkC1sAHAAEChfTl4gX1BPTtCMU1RSSU5HTEVOR1RIAAAATlYAAC8M KG4AECluAAwAUCluAAgAVDl8AA0ATC8sAEggX06QKF9OXiBf3vwADE7QiUxPTkdUT1NU UgAATlb/AC8MIG4ACEPu/wBwPyLYUcj//ChuAAxB7v8AKUgAUDl8AAcATC8sAEggX06Q LWwAcAAQKF9OXiBfUE9O0IlQQVNUT1pFUk8AAE5W/wAvDCBuAAhD7v8AcD8i2FHI//wo bgAMQe7/AClIAFA5fAALAEwvLABIIF9OkB1sAHMAEChfTl4gX1BPTtCJU1RSVE9CT09M AABOVgAALwwobgAQKW4ADABQKW4ACABUOXwACABMLywASCBfTpAoX05eIF/e/AAMTtCJ WkVST1RPUEFTAAA0PAAMIF8/Ai8Ire1I5+DgQ+8AHDAZIFk0ANRC1ELSwkJBUkhgICRh QkIUGtJCDEEA/28OBEEA/5RBMjwA/2ACENpRyv/8Ucj/3iBhEIEwISBJ0EDQQNDAVEgg oSKITN8HBy5fTnVI58DAcgFgBkjnwMBCQSBvABgibwAUQkAQELMIVsj//GYECkEAAR9B ABovbwAQABZM3wMDXE9OdQAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAZcAAAL6 gAAHBsAABgHAAAsA4AAPD6B539ngijsf4Iv7GGCaFxjgaf3PwAAOAKAADYOQAAd9SAAD /6QAAPjSAAAAaQAAADUAAAAbAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZuAA lgAAAAAABw5SZXF1aXJlZCBTdWl0ZSxFdmVudHMgdGhhdCBldmVyeSBhcHBsaWNhdGlv biBzaG91bGQgc3VwcG9ydHJlcWQAAQABAAMET3BlbiRPcGVuIHRoZSBzcGVjaWZpZWQg bGlzdCBvZiBkb2N1bWVudHNhZXZ0b2RvY251bGwAAIAAYWxpcxlMaXN0IG9mIGRvY3Vt ZW50cyB0byBvcGVuUAAAAAVQcmludCVQcmludCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2Yg ZG9jdW1lbnRzYWV2dHBkb2NudWxsAACAAGFsaXMaTGlzdCBvZiBkb2N1bWVudHMgdG8g cHJpbnQAQAAAAARRdWl0EFF1aXQgYXBwbGljYXRpb25hZXZ0cXVpdG51bGwAAIAAbnVs bBxObyBkaXJlY3QgcGFyYW1ldGVyIHJlcXVpcmVkAJAAAAAAAAAAAAAKQ29yZSBTdWl0 ZSZTdWl0ZSB0aGF0IGFwcGxpZXMgdG8gYWxsIGFwcGxpY2F0aW9uc2NvcmUAAQABABAF Q2xvbmUPQ2xvbmUgYW4gb2JqZWN0Y29yZWNsb25vYmogAAAAAG9iaiATVGhlIG9iamVj dCB0byBjbG9uZRAAAAECVG8AaW5zaGluc2wfVGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhl IG9iamVjdIAABUNsb3NlD0Nsb3NlIGFuIG9iamVjdGNvcmVjbG9zbnVsbAAAgABvYmog E1RoZSBvYmplY3QgdG8gY2xvc2UQAAACBFNhdmUAc2F2b3Nhdm8/U3BlY2lmaWVzIHdo ZXRoZXIgb3Igbm90IGNoYW5nZXMgc2hvdWxkIGJlIHNhdmVkIGJlZm9yZSBjbG9zaW5n oAAJU2F2aW5nIElua2ZpbGFsaXMkVGhlIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUg b2JqZWN0AIAABUNvdW50RFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEg cGFydGljdWxhciBjbGFzcyB3aXRoaW4gYW4gb2JqZWN0AGNvcmVjbnRlbG9uZwAAAABv YmogK1RoZSBvYmplY3Qgd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIGNvdW50ZWQAAAAB BUNsYXNza29jbHR5cGUnVGhlIGNsYXNzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBjb3Vu dGVkAAAGQ3JlYXRlFENyZWF0ZSBhIG5ldyBlbGVtZW50Y29yZWNyZWxvYmogAAAAAG51 bGwAAJAAAAQDTmV3a29jbHR5cGUcVGhlIGNsYXNzIG9mIHRoZSBuZXcgZWxlbWVudAAA AAJBdABpbnNoaW5zbCtUaGUgbG9jYXRpb24gYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBl bGVtZW50AAAJV2l0aCBEYXRhZGF0YSoqKiogVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhl IGVsZW1lbnQAgAAPV2l0aCBQcm9wZXJ0aWVzcHJkdHJlY28yVGhlIGluaXRpYWwgZGF0 YSBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVsZW1lbnQAgAAGRGVsZXRlIERlbGV0 ZSBhbiBlbGVtZW50IGZyb20gYW4gb2JqZWN0Y29yZWRlbG9udWxsAACAAG9iaiAVVGhl IGVsZW1lbnQgdG8gZGVsZXRlEAAAAAZFeGlzdHMYVGVsbCBpZiBhbiBvYmplY3QgZXhp c3RzY29yZWRvZXhib29sAAAAAG9iaiAWVGhlIG9iamVjdCBpbiBxdWVzdGlvbgAAAAAA CkNsYXNzIEluZm8lR2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdCBjbGFzcwBj b3JlcW9iamNsaW4AAAAAdHlwZTVUaGUgb2JqZWN0IGNsYXNzIGFib3V0IHdoaWNoIGlu Zm9ybWF0aW9uIGlzIHJlcXVlc3RlZIAAAAECSW4Ad3JjZGludGxDVGhlIGh1bWFuIGxh bmd1YWdlIGFuZCBzY3JpcHQgc3lzdGVtIGluIHdoaWNoIHRvIHJldHVybiBpbmZvcm1h dGlvboAACEdldCBEYXRhGkdldCB0aGUgZGF0YSBmb3IgYW4gb2JqZWN0Y29yZWdldGQq KioqAAAAAG9iaiAnVGhlIG9iamVjdCB3aG9zZSBkYXRhIGlzIHRvIGJlIHJldHVybmVk AAAAAQJBcwBydHlwdHlwZTZUaGUgZGVzaXJlZCB0eXBlcyBmb3IgdGhlIGRhdGEsIGlu IG9yZGVyIG9mIHByZWZlcmVuY2UAwAAJRGF0YSBTaXplJVJldHVybiB0aGUgc2l6ZSBp biBieXRlcyBvZiBhbiBvYmplY3Rjb3JlZHNpemxvbmcAAAAAb2JqICxUaGUgb2JqZWN0 IHdob3NlIGRhdGEgc2l6ZSBpcyB0byBiZSByZXR1cm5lZAAAAAABAkFzAHJ0eXB0eXBl LlRoZSBkYXRhIHR5cGUgZm9yIHdoaWNoIHRoZSBzaXplIGlzIGNhbGN1bGF0ZWQAgAAK RXZlbnQgSW5mbzFHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFwcGxlIGV2ZW50cyBp biBhIHN1aXRlAGNvcmVndGVpZXZpbgAAQAB0eXBlQ1RoZSBldmVudCBjbGFzcyBvZiB0 aGUgQXBwbGUgZXZlbnRzIGZvciB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24AAAAB AkluAHdyY2RpbnRsQ1RoZSBodW1hbiBsYW5ndWFnZSBhbmQgc2NyaXB0IHN5c3RlbSBp biB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb26AAARNb3ZlDk1vdmUgYW4gb2JqZWN0 Y29yZW1vdmVvYmogAAAAAG9iaiASVGhlIG9iamVjdCB0byBtb3ZlABAAAAECVG8AaW5z aGluc2wfVGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIG9iamVjdAAABE9wZW4OT3BlbiBh biBvYmplY3RhZXZ0b2RvY251bGwAAIAAb2JqIBJUaGUgb2JqZWN0IHRvIG9wZW4AEAAA AAVQcmludA9QcmludCBhbiBvYmplY3RhZXZ0cGRvY251bGwAAIAAb2JqIBNUaGUgb2Jq ZWN0IHRvIHByaW50AAAAAARRdWl0MFBlcmZvcm0gdGFza3MgYmVmb3JlIHRlcm1pbmF0 aW9uLCB0aGVuIHRlcm1pbmF0ZWFldnRxdWl0bnVsbAAAgABudWxsAACQAAABBFNhdmUA c2F2b3Nhdm85U3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNhdmUgY3VycmVudGx5 IG9wZW4gZG9jdW1lbnRzoAAEU2F2ZQ5TYXZlIGFuIG9iamVjdGNvcmVzYXZlbnVsbAAA gABvYmogElRoZSBvYmplY3QgdG8gc2F2ZQAQAAACAkluAGtmaWxhbGlzJFRoZSBmaWxl IGluIHdoaWNoIHRvIHNhdmUgdGhlIG9iamVjdACAAAJBcwBmbHRwdHlwZTdUaGUgZmls ZSB0eXBlIG9mIHRoZSBkb2N1bWVudCBpbiB3aGljaCB0byBzYXZlIHRoZSBkYXRhgAAI U2V0IERhdGEUU2V0IGFuIG9iamVjdCdzIGRhdGFjb3Jlc2V0ZG51bGwAAIAAb2JqIBRU aGUgb2JqZWN0IHRvIGNoYW5nZQAQAAABAlRvAGRhdGEqKioqDVRoZSBuZXcgdmFsdWUA AAAIC0FwcGxpY2F0aW9uY2FwcBdBIE1hY2ludG9zaCBhcHBsaWNhdGlvbgAJCUJlc3Qg VHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0 eXBlCVRoZSBjbGFzcwAACUNsaXBib2FyZHBjbGkqKioqDVRoZSBjbGlwYm9hcmRQAAxE ZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAAS SW5zZXJ0aW9uIGxvY2F0aW9uAHBpbnNpbnNsTVRoZSBsb2NhdGlvbiB3aGVyZSB0aGUg Y29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB3b3VsZCBiZSBpbnNlcnRlZCBieSBhIHBh c3RlAAAJRnJvbnRtb3N0cGlzZmJvb2wiSXMgdGhpcyB0aGUgZnJvbnRtb3N0IGFwcGxp Y2F0aW9uPwAAAAROYW1lAHBuYW1pdHh0CFRoZSBuYW1lAAAADlVzZXIgU2VsZWN0aW9u AHB1c2xjc2VsLVRoZSBjdXJyZW50IHVzZXIgc2VsZWN0aW9uIG9yIGluc2VydGlvbiBw b2ludAAAB1ZlcnNpb252ZXJzbG9uZyVUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGFw cGxpY2F0aW9uAAAAAmRvY3UAAmluZHhuYW1lY3dpbgACaW5keG5hbWUJQ2hhcmFjdGVy Y2hhIAtBIGNoYXJhY3RlcgAJCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2Ny aXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9yY29scmNS R0IJVGhlIGNvbG9yEAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRl c2NyaXB0b3IgdHlwZQAABEZvbnQAZm9udGN0eHQUVGhlIG5hbWUgb2YgdGhlIGZvbnQA EAAEU2l6ZQBwdHN6Zml4ZBJUaGUgc2l6ZSBpbiBwb2ludHMAEAAMV3JpdGluZyBDb2Rl AHBzY3RpbnRsHlRoZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZQAAAAVTdHlsZXR4 c3R0c3R5DlRoZSB0ZXh0IHN0eWxlABAADlVuaWZvcm0gU3R5bGVzAHVzdGx0c3R5DlRo ZSB0ZXh0IHN0eWxlAAAAAAJjaGEgAAFpbmR4Y3R4dAABaW5keA9UZXh0IFN0eWxlIElu Zm90c3R5HU9uIGFuZCBPZmYgc3R5bGVzIG9mIHRleHQgcnVuAAIJT24gU3R5bGVzb25z dHN0eWwjVGhlIHN0eWxlcyB0aGF0IGFyZSBvbiBmb3IgdGhlIHRleHRgAApPZmYgU3R5 bGVzAG9mc3RzdHlsKFRoZSBzdHlsZXMgdGhhdCBhcmUgb2ZmIGZvciBhbGwgdGhlIHRl eHQAYAAAAAhEb2N1bWVudABkb2N1CkEgZG9jdW1lbnQAAAUJQmVzdCBUeXBlcGJzdHR5 cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhlIGNs YXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3Ig dHlwZQAACE1vZGlmaWVkAGltb2Rib29sM0hhcyB0aGUgZG9jdW1lbnQgYmVlbiBtb2Rp ZmllZCBzaW5jZSB0aGUgbGFzdCBzYXZlPwAABE5hbWUAcG5hbWl0eHQIVGhlIG5hbWUA AAAAAWZpbGUAAmluZHhuYW1lBEZpbGUAZmlsZQZBIGZpbGUAAAUJQmVzdCBUeXBlcGJz dHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhl IGNsYXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0 b3IgdHlwZQAAClN0YXRpb25lcnkAcHNwZGJvb2weSXMgdGhlIGZpbGUgYSBzdGF0aW9u ZXJ5IGZpbGU/ABAABE5hbWUAcG5hbWl0eHQIVGhlIG5hbWUAAAAAAAlTZWxlY3Rpb25j c2VsIVRoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlcgADCUJlc3QgVHlwZXBi c3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRo ZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAAABb2JqIAABaW5keARUZXh0AGN0eHQEVGV4dAAACQlCZXN0IFR5cGVw YnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAFQ2xhc3NwY2xzdHlwZQlU aGUgY2xhc3MAAAVDb2xvcmNvbHJjUkdCIFRoZSBjb2xvciBvZiB0aGUgZmlyc3QgY2hh cmFjdGVyABAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAARGb250AGZvbnRjdHh0K1RoZSBuYW1lIG9mIHRoZSBmb250IG9mIHRo ZSBmaXJzdCBjaGFyYWN0ZXIQAARTaXplAHB0c3pmaXhkKVRoZSBzaXplIGluIHBvaW50 cyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAAMV3JpdGluZyBDb2RlAHBzY3RpbnRsHlRo ZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZQAAAAVTdHlsZXR4c3R0c3R5JVRoZSB0 ZXh0IHN0eWxlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIQAA5Vbmlmb3JtIFN0eWxlcwB1 c3RsdHN0eTRUaGUgdGV4dCBzdHlsZXMgdGhhdCBhcmUgdW5pZm9ybSB0aHJvdWdob3V0 IHRoZSB0ZXh0AAAAAAJjaGEgAAFpbmR4Y3R4dAABaW5keAZXaW5kb3cAY3dpbghBIHdp bmRvdwAADwlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUA AAAGQm91bmRzAHBibmRxZHJ0JVRoZSBib3VuZGFyeSByZWN0YW5nbGUgZm9yIHRoZSB3 aW5kb3cQAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0 dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5cGUAAA1IYXMgQ2xvc2UgQm94aGNs YmJvb2whRG9lcyB0aGUgd2luZG93IGhhdmUgYSBjbG9zZSBib3g/AAANSGFzIFRpdGxl IEJhcnB0aXRib29sIURvZXMgdGhlIHdpbmRvdyBoYXZlIGEgdGl0bGUgYmFyPwAABUlu ZGV4cGlkeGxvbmcYVGhlIG51bWJlciBvZiB0aGUgd2luZG93ABAACEZsb2F0aW5nAGlz Zmxib29sFkRvZXMgdGhlIHdpbmRvdyBmbG9hdD8AAAAFTW9kYWxwbW9kYm9vbBRJcyB0 aGUgd2luZG93IG1vZGFsPwAAAAlSZXNpemFibGVwcnN6Ym9vbBhJcyB0aGUgd2luZG93 IHJlc2l6YWJsZT8AAAAIWm9vbWFibGUAaXN6bWJvb2wXSXMgdGhlIHdpbmRvdyB6b29t YWJsZT8AAAZab29tZWQAcHp1bWJvb2wVSXMgdGhlIHdpbmRvdyB6b29tZWQ/EAAETmFt ZQBwbmFtaXR4dBdUaGUgdGl0bGUgb2YgdGhlIHdpbmRvdxAACVNlbGVjdGlvbnNlbGVj c2VsIVRoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlchAAB1Zpc2libGVwdmlz Ym9vbBZJcyB0aGUgd2luZG93IHZpc2libGU/ABAAAAFkb2N1AAJpbmR4bmFtZQAIC2Jl Z2lucyB3aXRoYmd3dAtCZWdpbnMgd2l0aAhjb250YWlucwBjb250CENvbnRhaW5zAAll bmRzIHdpdGhlbmRzCUVuZHMgd2l0aAE9PSAgIAVFcXVhbAE+PiAgIAxHcmVhdGVyIHRo YW4AAj49AD49ICAYR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvAAE8PCAgIAlMZXNzIHRo YW4CPD0APD0gIBVMZXNzIHRoYW4gb3IgZXF1YWwgdG8ABHNhdm8AAwNZZXN5ZXMgEFNh dmUgb2JqZWN0cyBub3cAAk5vAG5vICATRG8gbm90IHNhdmUgb2JqZWN0cwNBc2thc2sg HEFzayB0aGUgdXNlciB3aGV0aGVyIHRvIHNhdmUAcG9zaQAFBkJlZm9yZQBiZWZvF0Jl Zm9yZSBzcGVjaWZpZWQgb2JqZWN0BUFmdGVyYWZ0ZRZBZnRlciBzcGVjaWZpZWQgb2Jq ZWN0AAlCZWdpbm5pbmdiZ25nK0F0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwZWNpZmll ZCBjb250YWluZXIDRW5kZW5kICVBdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgY29u dGFpbmVyB1JlcGxhY2VycGxjHlJlcGxhY2luZyB0aGUgc3BlY2lmaWVkIG9iamVjdABr ZnJtAAMFaW5kZXhpbmR4ImtleWZvcm0gZGVzaWduYXRpbmcgaW5kZXhlZCBhY2Nlc3MA BW5hbWVkbmFtZSBrZXlmb3JtIGRlc2lnbmF0aW5nIG5hbWVkIGFjY2VzcwACSUQAaWQg ICRrZXlmb3JtIGRlc2lnbmF0aW5nIGlkZW50aWZlciBhY2Nlc3MAc3R5bAAPBVBsYWlu cGxhbgVQbGFpbgRCb2xkAGJvbGQEQm9sZAAGSXRhbGljAGl0YWwGSXRhbGljAAdPdXRs aW5lb3V0bAdPdXRsaW5lBlNoYWRvdwBzaGFkBlNoYWRvdwAJVW5kZXJsaW5ldW5kbAlV bmRlcmxpbmULU3VwZXJzY3JpcHRzcHNjC1N1cGVyc2NyaXB0CVN1YnNjcmlwdHNic2MJ U3Vic2NyaXB0DVN0cmlrZXRocm91Z2hzdHJrDVN0cmlrZXRocm91Z2gKU21hbGwgQ2Fw cwBzbWNwClNtYWxsIENhcHMACUFsbCBDYXBzIGFsY3AJQWxsIENhcHMgCUxvd2VyY2Fz ZWxvd2MJTG93ZXJjYXNlCUNvbmRlbnNlZGNvbmQJQ29uZGVuc2VkCEV4cGFuZGVkAHBl eHAIRXhwYW5kZWQABkhpZGRlbgBoaWRuBkhpZGRlbgAKVGV4dCBTdWl0ZSpBIHNldCBv ZiBiYXNpYyBjbGFzc2VzIGZvciB0ZXh0IHByb2Nlc3NpbmdURVhUAAEAAQAAAAYJQ2hh cmFjdGVyY2hhIAtBIGNoYXJhY3RlcgAJCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0 IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9y Y29scmNSR0IJVGhlIGNvbG9yEAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZh dWx0IGRlc2NyaXB0b3IgdHlwZQAABEZvbnQAZm9udGN0eHQUVGhlIG5hbWUgb2YgdGhl IGZvbnQAEAAEU2l6ZQBwdHN6Zml4ZBJUaGUgc2l6ZSBpbiBwb2ludHMAEAAMV3JpdGlu ZyBDb2RlAHBzY3RpbnRsHlRoZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZQAAAAVT dHlsZXR4c3R0c3R5DlRoZSB0ZXh0IHN0eWxlABAADlVuaWZvcm0gU3R5bGVzAHVzdGx0 c3R5DlRoZSB0ZXh0IHN0eWxlAAAAAAVjaGEgAAFpbmR4Y2xpbgABaW5keGNwYXIAAWlu ZHhjdHh0AAFpbmR4Y3dvcgABaW5keARMaW5lAGNsaW4OQSBsaW5lIG9mIHRleHQAAAoJ QmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABUNsYXNz cGNsc3R5cGUJVGhlIGNsYXNzAAAFQ29sb3Jjb2xyY1JHQiBUaGUgY29sb3Igb2YgdGhl IGZpcnN0IGNoYXJhY3RlcgAQAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1 bHQgZGVzY3JpcHRvciB0eXBlAAAERm9udABmb250Y3R4dCtUaGUgbmFtZSBvZiB0aGUg Zm9udCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAANSnVzdGlmaWNhdGlvbnBqc3RqdXN0 GUp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQwAARTaXplAHB0c3pmaXhkKVRoZSBzaXpl IGluIHBvaW50cyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAAMV3JpdGluZyBDb2RlAHBz Y3RpbnRsNVRoZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZSBvZiB0aGUgZmlyc3Qg Y2hhcmFjdGVyAAAFU3R5bGV0eHN0dHN0eSVUaGUgdGV4dCBzdHlsZSBvZiB0aGUgZmly c3QgY2hhcmFjdGVyEAAOVW5pZm9ybSBTdHlsZXMAdXN0bHRzdHk0VGhlIHRleHQgc3R5 bGVzIHRoYXQgYXJlIHVuaWZvcm0gdGhyb3VnaG91dCB0aGUgbGluZQAAAAAFY2hhIAAB aW5keGNsaW4AAWluZHhjcGFyAAFpbmR4Y3R4dAABaW5keGN3b3IAAWluZHgJUGFyYWdy YXBoY3BhcgtBIHBhcmFncmFwaAAKCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRl c2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9yY29s cmNSR0IgVGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIAEAAMRGVmYXVsdCBU eXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAABEZvbnQAZm9u dGN0eHQrVGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlchAA DUp1c3RpZmljYXRpb25wanN0anVzdBlKdXN0aWZpY2F0aW9uIG9mIHRoZSB0ZXh0MAAE U2l6ZQBwdHN6Zml4ZClUaGUgc2l6ZSBpbiBwb2ludHMgb2YgdGhlIGZpcnN0IGNoYXJh Y3RlchAADFdyaXRpbmcgQ29kZQBwc2N0aW50bB5UaGUgc2NyaXB0IHN5c3RlbSBhbmQg bGFuZ3VhZ2UAAAAFU3R5bGV0eHN0dHN0eSVUaGUgdGV4dCBzdHlsZSBvZiB0aGUgZmly c3QgY2hhcmFjdGVyEAAOVW5pZm9ybSBTdHlsZXMAdXN0bHRzdHk5VGhlIHRleHQgc3R5 bGVzIHRoYXQgYXJlIHVuaWZvcm0gdGhyb3VnaG91dCB0aGUgcGFyYWdyYXBoAAAABWNo YSAAAWluZHhjbGluAAFpbmR4Y3BhcgABaW5keGN0eHQAAWluZHhjd29yAAFpbmR4BFRl eHQAY3R4dARUZXh0AAAJCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0 b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9yY29scmNSR0Ig VGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIAEAAMRGVmYXVsdCBUeXBlAGRl ZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAABEZvbnQAZm9udGN0eHQr VGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlchAABFNpemUA cHRzemZpeGQpVGhlIHNpemUgaW4gcG9pbnRzIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIQ AAxXcml0aW5nIENvZGUAcHNjdGludGweVGhlIHNjcmlwdCBzeXN0ZW0gYW5kIGxhbmd1 YWdlAAAABVN0eWxldHhzdHRzdHk8VGhlIHRleHQgc3R5bGUgb2YgdGhlIGZpcnN0IGNo YXJhY3RlciBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyABAADlVuaWZvcm0gU3R5bGVzAHVz dGx0c3R5NFRoZSB0ZXh0IHN0eWxlcyB0aGF0IGFyZSB1bmlmb3JtIHRocm91Z2hvdXQg dGhlIHRleHQAEAAABWNoYSAAAWluZHhjbGluAAFpbmR4Y3BhcgABaW5keGN0eHQAAWlu ZHhjd29yAAFpbmR4CVRleHQgRmxvd2NmbG8aQSBjb250aWd1b3VzIGJsb2NrIG9mIHRl eHQAAAsJQmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAA BUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAFQ29sb3Jjb2xyY1JHQiBUaGUgY29sb3Ig b2YgdGhlIGZpcnN0IGNoYXJhY3RlcgAQAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhl IGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAAERm9udABmb250Y3R4dCtUaGUgbmFtZSBv ZiB0aGUgZm9udCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAANSnVzdGlmaWNhdGlvbnBq c3RqdXN0GUp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQwAARTaXplAHB0c3pmaXhkKVRo ZSBzaXplIGluIHBvaW50cyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAAETmFtZQBwbmFt aXR4dAhUaGUgbmFtZQAQAAxXcml0aW5nIENvZGUAcHNjdGludGweVGhlIHNjcmlwdCBz eXN0ZW0gYW5kIGxhbmd1YWdlAAAABVN0eWxldHhzdHRzdHklVGhlIHRleHQgc3R5bGUg b2YgdGhlIGZpcnN0IGNoYXJhY3RlchAADlVuaWZvcm0gU3R5bGVzAHVzdGx0c3R5NFRo ZSB0ZXh0IHN0eWxlcyB0aGF0IGFyZSB1bmlmb3JtIHRocm91Z2hvdXQgdGhlIHRleHQA AAAABWNoYSAAAWluZHhjbGluAAFpbmR4Y3BhcgABaW5keGN0eHQAAWluZHhjd29yAAFp bmR4BFdvcmQAY3dvcgZBIHdvcmQAAAkJQmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3Qg ZGVzY3JpcHRvciB0eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAFQ29sb3Jj b2xyY1JHQiBUaGUgY29sb3Igb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgAQAAxEZWZhdWx0 IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAAERm9udABm b250Y3R4dCtUaGUgbmFtZSBvZiB0aGUgZm9udCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVy EAAEU2l6ZQBwdHN6Zml4ZClUaGUgc2l6ZSBpbiBwb2ludHMgb2YgdGhlIGZpcnN0IGNo YXJhY3RlchAADFdyaXRpbmcgQ29kZQBwc2N0aW50bB5UaGUgc2NyaXB0IHN5c3RlbSBh bmQgbGFuZ3VhZ2UAAAAFU3R5bGV0eHN0dHN0eSVUaGUgdGV4dCBzdHlsZSBvZiB0aGUg Zmlyc3QgY2hhcmFjdGVyEAAOVW5pZm9ybSBTdHlsZXMAdXN0bHRzdHk0VGhlIHRleHQg c3R5bGVzIHRoYXQgYXJlIHVuaWZvcm0gdGhyb3VnaG91dCB0aGUgd29yZAAQAAAFY2hh IAABaW5keGNsaW4AAWluZHhjcGFyAAFpbmR4Y3R4dAABaW5keGN3b3IAAWluZHgAAgI9 PQBjc2VxFENhc2Utc2Vuc2l0aXZlIG1hdGNoAAMvPS93d2VxNENoYXJhY3RlcnMgbWF0 Y2ggYW5kIG9wZXJhbmRzIGVuZCBvbiB3b3JkIGJvdW5kYXJpZXMAAAFqdXN0AAQETGVm dABsZWZ0FkFsaWduIHdpdGggbGVmdCBtYXJnaW4ABVJpZ2h0cmdodBdBbGlnbiB3aXRo IHJpZ2h0IG1hcmdpbgZDZW50ZXIAY2VudBFBbGlnbiB3aXRoIGNlbnRlcgRGdWxsAGZ1 bGwmQWxpZ24gd2l0aCBib3RoIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMAGFF1aWNrRHJh dyBHcmFwaGljcyBTdWl0ZSNBIHNldCBvZiBiYXNpYyBjbGFzc2VzIGZvciBncmFwaGlj cwBxZHJ3AAEAAQAAAA0DQXJjY2FyYwZBbiBhcmMAAA0JQXJjIGFuZ2xlcGFyY2ZpeGQb QW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzEAAJQmVzdCBUeXBlcGJzdHR5cGUYVGhl IGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABkJvdW5kcwBwYm5kcWRydDNUaGUgc21hbGxl c3QgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGVudGlyZSBhcmMQAAVDbGFzc3Bj bHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVs dCBkZXNjcmlwdG9yIHR5cGUAAA9EZWZpbml0aW9uIFJlY3RwZHJ0cWRydEVUaGUgcmVj dGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGNpcmNsZSBvciBvdmFsIHVzZWQgdG8gZGVm aW5lIHRoZSBhcmMQAApGaWxsIENvbG9yAGZsY2xjUkdCDlRoZSBmaWxsIGNvbG9yABAA DEZpbGwgUGF0dGVybgBmbHB0Y3BpeBBUaGUgZmlsbCBwYXR0ZXJuABAACVBlbiBDb2xv cnBwY2xjUkdCDVRoZSBwZW4gY29sb3IQAAtQZW4gUGF0dGVybnBwcGFjcGl4D1RoZSBw ZW4gcGF0dGVybhAACVBlbiBXaWR0aHBwd2RzaG9yDVRoZSBwZW4gd2lkdGgQAAtTdGFy dCBhbmdsZXBhbmdmaXhkN1RoZSBhbmdsZSB0aGF0IGRlZmluZXMgdGhlIHN0YXJ0IG9m IHRoZSBhcmMsIGluIGRlZ3JlZXMQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRy YW5zZmVyIG1vZGUwAAAADERyYXdpbmcgQXJlYQBjZHJ3MUNvbnRhaW5lciBmb3IgZ3Jh cGhpY3MgYW5kIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24AFxBCYWNrZ3JvdW5kIENvbG9y AHBiY2xjUkdCKlRoZSBjb2xvciB1c2VkIHRvIGZpbGwgaW4gdW5vY2N1cGllZCBhcmVh cwAQABJCYWNrZ3JvdW5kIFBhdHRlcm4AcGJwdGNwaXgsVGhlIHBhdHRlcm4gdXNlZCB0 byBmaWxsIGluIHVub2NjdXBpZWQgYXJlYXMAEAAJQmVzdCBUeXBlcGJzdHR5cGUYVGhl IGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABkJvdW5kcwBwYm5kcWRydCxUaGUgcmVjdGFu Z2xlIHRoYXQgY29udGFpbnMgdGhlIGRyYXdpbmcgYXJlYQAQAAVDbGFzc3BjbHN0eXBl CVRoZSBjbGFzcwAAC0NvbG9yIFRhYmxlY2x0YmNscnQPVGhlIGNvbG9yIHRhYmxlEAAM RGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAA CkZpbGwgQ29sb3IAZmxjbGNSR0IvVGhlIGRlZmF1bHQgZmlsbCBjb2xvciB1c2VkIGZv ciBncmFwaGljIG9iamVjdHMQAAxGaWxsIFBhdHRlcm4AZmxwdGNwaXgxVGhlIGRlZmF1 bHQgZmlsbCBwYXR0ZXJuIHVzZWQgZm9yIGdyYXBoaWMgb2JqZWN0cxAACE9yZGVyaW5n AGdvYnNvYmogN1RoZSBvcmRlcmVkIGxpc3Qgb2YgZ3JhcGhpYyBvYmplY3RzIGluIHRo ZSBkcmF3aW5nIGFyZWFQAAROYW1lAHBuYW1pdHh0CFRoZSBuYW1lABAAEERlZmF1bHQg TG9jYXRpb24AcG5lbFFEcHQvVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgZWFjaCBuZXcg Z3JhcGhpYyBvYmplY3QQAAlQZW4gQ29sb3JwcGNsY1JHQg1UaGUgcGVuIGNvbG9yEAAL UGVuIFBhdHRlcm5wcHBhY3BpeA9UaGUgcGVuIHBhdHRlcm4QAAlQZW4gV2lkdGhwcHdk c2hvcg1UaGUgcGVuIHdpZHRoEAALUGl4ZWwgRGVwdGhwZHB0c2hvcg5CaXRzIHBlciBw aXhlbAAQAAxXcml0aW5nIENvZGUAcHNjdGludGxCVGhlIHNjcmlwdCBzeXN0ZW0gYW5k IGxhbmd1YWdlIG9mIHRleHQgb2JqZWN0cyBpbiB0aGUgZHJhd2luZyBhcmVhAAAAClRl eHQgQ29sb3IAcHR4Y2NSR0IiVGhlIGRlZmF1bHQgY29sb3IgZm9yIHRleHQgb2JqZWN0 cwAQAARGb250AHB0eGZpdHh0LVRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGZvbnQgZm9y IHRleHQgb2JqZWN0cxAABFNpemUAcHRwc2ZpeGQnVGhlIGRlZmF1bHQgcG9pbnQgc2l6 ZSBmb3IgdGV4dCBvYmplY3RzEAAFU3R5bGV0eHN0dHN0eSdUaGUgZGVmYXVsdCB0ZXh0 IHN0eWxlIGZvciB0ZXh0IG9iamVjdHMQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4tVGhl IGRlZmF1bHQgdHJhbnNmZXIgbW9kZSBmb3IgZ3JhcGhpYyBvYmplY3RzMAAQVXBkYXRl IE9uIENoYW5nZQBwdXBkYm9vbBlSZWRyYXcgYWZ0ZXIgZWFjaCBjaGFuZ2U/EAAACmNh cmMAAmluZHhuYW1lZ2xpbgACaW5keG5hbWVjZ3R4AAJpbmR4bmFtZWNwaWMAAmluZHhu YW1lY292bAACaW5keG5hbWVjcGl4AAJpbmR4bmFtZWNwZ24AAmluZHhuYW1lY3JlYwAC aW5keG5hbWVjcnJjAAJpbmR4bmFtZWNnb2IAAmluZHhuYW1lDEdyYXBoaWMgTGluZQBn bGluDkEgZ3JhcGhpYyBsaW5lAAAMCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRl c2NyaXB0b3IgdHlwZQAAAAZCb3VuZHMAcGJuZHFkcnQ+VGhlIHNtYWxsZXN0IHJlY3Rh bmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBlbnRpcmUgZ3JhcGhpYyBvYmplY3QAEAAFQ2xh c3NwY2xzdHlwZQlUaGUgY2xhc3MAAApEYXNoIFN0eWxlAHBkc3R0ZGFzDlRoZSBkYXNo IHN0eWxlAFAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAAlFbmQgUG9pbnRwZW5kUURwdBxUaGUgZW5kaW5nIHBvaW50IG9mIHRo ZSBsaW5lABAAC0Fycm93IFN0eWxlYXJyb2Fycm8PVGhlIGFycm93IHN0eWxlMAAJUGVu IENvbG9ycHBjbGNSR0INVGhlIHBlbiBjb2xvchAAC1BlbiBQYXR0ZXJucHBwYWNwaXgP VGhlIHBlbiBwYXR0ZXJuEAAJUGVuIFdpZHRocHB3ZHNob3INVGhlIHBlbiB3aWR0aBAA C1N0YXJ0IFBvaW50cHN0cFFEcHQeVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5l ABAADVRyYW5zZmVyIE1vZGVwcHRtdHJhbhFUaGUgdHJhbnNmZXIgbW9kZTAAAAAOR3Jh cGhpYyBPYmplY3QAY2dvYhBBIGdyYXBoaWMgb2JqZWN0AAAFCUJlc3QgVHlwZXBic3R0 eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAZCb3VuZHMAcGJuZHFkcnQ+VGhl IHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBlbnRpcmUgZ3JhcGhp YyBvYmplY3QAEAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xhc3MAAAxEZWZhdWx0IFR5cGUA ZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAANVHJhbnNmZXIgTW9k ZXBwdG10cmFuEVRoZSB0cmFuc2ZlciBtb2RlMAAAAA1HcmFwaGljIFNoYXBlY2dzaA9B IGdyYXBoaWMgc2hhcGUACwlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlw dG9yIHR5cGUAAAAGQm91bmRzAHBibmRxZHJ0NVRoZSBzbWFsbGVzdCByZWN0YW5nbGUg dGhhdCBjb250YWlucyB0aGUgZW50aXJlIHNoYXBlEAAFQ2xhc3NwY2xzdHlwZQlUaGUg Y2xhc3MAAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRv ciB0eXBlAAAPRGVmaW5pdGlvbiBSZWN0cGRydHFkcnQmVGhlIHJlY3RhbmdsZSB1c2Vk IHRvIGRlZmluZSB0aGUgc2hhcGUAEAAKRmlsbCBDb2xvcgBmbGNsY1JHQg5UaGUgZmls bCBjb2xvcgAQAAxGaWxsIFBhdHRlcm4AZmxwdGNwaXgQVGhlIGZpbGwgcGF0dGVybgAQ AAlQZW4gQ29sb3JwcGNsY1JHQg1UaGUgcGVuIGNvbG9yEAALUGVuIFBhdHRlcm5wcHBh Y3BpeA9UaGUgcGVuIHBhdHRlcm4QAAlQZW4gV2lkdGhwcHdkc2hvcg1UaGUgcGVuIHdp ZHRoEAANVHJhbnNmZXIgTW9kZXBwdG10cmFuEVRoZSB0cmFuc2ZlciBtb2RlMAAAAAxH cmFwaGljIFRleHQAY2d0eCxBIHNlcmllcyBvZiBjaGFyYWN0ZXJzIHdpdGhpbiBhIGRy YXdpbmcgYXJlYQAACwlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9y IHR5cGUAAAAGQm91bmRzAHBibmRxZHJ0NFRoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhh dCBjb250YWlucyB0aGUgZW50aXJlIHRleHQAEAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xh c3MAAAVDb2xvcmNvbHJjUkdCIFRoZSBjb2xvciBvZiB0aGUgZmlyc3QgY2hhcmFjdGVy ABAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5 cGUAAARGb250AGZvbnRjdHh0K1RoZSBuYW1lIG9mIHRoZSBmb250IG9mIHRoZSBmaXJz dCBjaGFyYWN0ZXIQAARTaXplAHB0c3pmaXhkKVRoZSBzaXplIGluIHBvaW50cyBvZiB0 aGUgZmlyc3QgY2hhcmFjdGVyEAAMV3JpdGluZyBDb2RlAHBzY3RpbnRsHlRoZSBzY3Jp cHQgc3lzdGVtIGFuZCBsYW5ndWFnZQAAAAVTdHlsZXR4c3R0c3R5JVRoZSB0ZXh0IHN0 eWxlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4R VGhlIHRyYW5zZmVyIG1vZGUwAA5Vbmlmb3JtIFN0eWxlcwB1c3RsdHN0eTRUaGUgdGV4 dCBzdHlsZXMgdGhhdCBhcmUgdW5pZm9ybSB0aHJvdWdob3V0IHRoZSB0ZXh0ABAAAAJj aGEgAAFpbmR4Y3R4dAABaW5keA9Hcm91cGVkIEdyYXBoaWNjcGljEUdyb3VwIG9mIGdy YXBoaWNzAAcJQmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBl AAAABkJvdW5kcwBwYm5kcWRydD5UaGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQgY29u dGFpbnMgdGhlIGVudGlyZSBncmFwaGljIG9iamVjdAAQAAVDbGFzc3BjbHN0eXBlCVRo ZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAAhPcmRlcmluZwBnb2Jzb2JqIDdUaGUgb3JkZXJlZCBsaXN0IG9mIGdy YXBoaWMgb2JqZWN0cyBpbiB0aGUgZHJhd2luZyBhcmVhUAAETmFtZQBwbmFtaXR4dAhU aGUgbmFtZQAQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRyYW5zZmVyIG1vZGUw AAAKY2FyYwACaW5keG5hbWVnbGluAAJpbmR4bmFtZWNndHgAAmluZHhuYW1lY3BpYwAC aW5keG5hbWVjb3ZsAAJpbmR4bmFtZWNwaXgAAmluZHhuYW1lY3BnbgACaW5keG5hbWVj cmVjAAJpbmR4bmFtZWNycmMAAmluZHhuYW1lY2dvYgACaW5keG5hbWUET3ZhbABjb3Zs B0FuIG92YWwACwlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5 cGUAAAAGQm91bmRzAHBibmRxZHJ0NFRoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCBj b250YWlucyB0aGUgZW50aXJlIG92YWwAEAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xhc3MA AAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBl AAAPRGVmaW5pdGlvbiBSZWN0cGRydHFkcnQlVGhlIHJlY3RhbmdsZSB1c2VkIHRvIGRl ZmluZSB0aGUgb3ZhbBAACkZpbGwgQ29sb3IAZmxjbGNSR0IOVGhlIGZpbGwgY29sb3IA EAAMRmlsbCBQYXR0ZXJuAGZscHRjcGl4EFRoZSBmaWxsIHBhdHRlcm4AEAAJUGVuIENv bG9ycHBjbGNSR0INVGhlIHBlbiBjb2xvchAAC1BlbiBQYXR0ZXJucHBwYWNwaXgPVGhl IHBlbiBwYXR0ZXJuEAAJUGVuIFdpZHRocHB3ZHNob3INVGhlIHBlbiB3aWR0aBAADVRy YW5zZmVyIE1vZGVwcHRtdHJhbhFUaGUgdHJhbnNmZXIgbW9kZTAAAAAFUGl4ZWxjcHhs B0EgcGl4ZWwABAlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5 cGUAAAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xhc3MAAAVDb2xvcmNvbHJjUkdCCVRoZSBj b2xvchAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9y IHR5cGUAAAAACVBpeGVsIE1hcGNwaXgLQSBwaXhlbCBtYXAABQlCZXN0IFR5cGVwYnN0 dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAGQm91bmRzAHBibmRxZHJ0MlRo ZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgcGl4ZWwgbWFwABAA BUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1Ro ZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAADVRyYW5zZmVyIE1vZGVwcHRtdHJhbhFU aGUgdHJhbnNmZXIgbW9kZTAAAAFjcHhsAAFpbmR4B1BvbHlnb25jcGduCUEgcG9seWdv bgALCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAZC b3VuZHMAcGJuZHFkcnQ3VGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5z IHRoZSBlbnRpcmUgcG9seWdvbhAABUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAPRGVm aW5pdGlvbiBSZWN0cGRydHFkcnQoVGhlIHJlY3RhbmdsZSB1c2VkIHRvIGRlZmluZSB0 aGUgcG9seWdvbgAQAApGaWxsIENvbG9yAGZsY2xjUkdCDlRoZSBmaWxsIGNvbG9yABAA DEZpbGwgUGF0dGVybgBmbHB0Y3BpeBBUaGUgZmlsbCBwYXR0ZXJuABAACVBlbiBDb2xv cnBwY2xjUkdCDVRoZSBwZW4gY29sb3IQAAtQZW4gUGF0dGVybnBwcGFjcGl4D1RoZSBw ZW4gcGF0dGVybhAACVBlbiBXaWR0aHBwd2RzaG9yDVRoZSBwZW4gd2lkdGgQAApQb2lu dCBMaXN0AHB0bHRRRHB0KlRoZSBsaXN0IG9mIHBvaW50cyB0aGF0IGRlZmluZSB0aGUg cG9seWdvbgBQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRyYW5zZmVyIG1vZGUw AAAACVJlY3RhbmdsZWNyZWMLQSByZWN0YW5nbGUACwlCZXN0IFR5cGVwYnN0dHlwZRhU aGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAGQm91bmRzAHBibmRxZHJ0DVRoZSByZWN0 YW5nbGUQAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0 dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5cGUAAA9EZWZpbml0aW9uIFJlY3Rw ZHJ0cWRydD9UaGUgdXBwZXItbGVmdCBhbmQgbG93ZXItcmlnaHQgcG9pbnRzIHRoYXQg ZGVmaW5lIHRoZSByZWN0YW5nbGUQAApGaWxsIENvbG9yAGZsY2xjUkdCDlRoZSBmaWxs IGNvbG9yABAADEZpbGwgUGF0dGVybgBmbHB0Y3BpeBBUaGUgZmlsbCBwYXR0ZXJuABAA CVBlbiBDb2xvcnBwY2xjUkdCDVRoZSBwZW4gY29sb3IQAAtQZW4gUGF0dGVybnBwcGFj cGl4D1RoZSBwZW4gcGF0dGVybhAACVBlbiBXaWR0aHBwd2RzaG9yDVRoZSBwZW4gd2lk dGgQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRyYW5zZmVyIG1vZGUwAAAAEVJv dW5kZWQgUmVjdGFuZ2xlY3JyYxNBIHJvdW5kZWQgcmVjdGFuZ2xlAA0JQmVzdCBUeXBl cGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABkJvdW5kcwBwYm5kcWRy dA1UaGUgcmVjdGFuZ2xlEAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xhc3MAABNDb3JuZXIg Q3VydmUgSGVpZ2h0cGNoZHNob3JGVGhlIGhlaWdodCBvZiB0aGUgb3ZhbCB1c2VkIHRv IGRlZmluZSB0aGUgc2hhcGUgb2YgdGhlIHJvdW5kZWQgY29ybmVycwAQABJDb3JuZXIg Q3VydmUgV2lkdGgAcGN3ZHNob3JFVGhlIHdpZHRoIG9mIHRoZSBvdmFsIHVzZWQgdG8g ZGVmaW5lIHRoZSBzaGFwZSBvZiB0aGUgcm91bmRlZCBjb3JuZXJzEAAMRGVmYXVsdCBU eXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAAD0RlZmluaXRp b24gUmVjdHBkcnRxZHJ0P1RoZSB1cHBlci1sZWZ0IGFuZCBsb3dlci1yaWdodCBwb2lu dHMgdGhhdCBkZWZpbmUgdGhlIHJlY3RhbmdsZRAACkZpbGwgQ29sb3IAZmxjbGNSR0IO VGhlIGZpbGwgY29sb3IAEAAMRmlsbCBQYXR0ZXJuAGZscHRjcGl4EFRoZSBmaWxsIHBh dHRlcm4AEAAJUGVuIENvbG9ycHBjbGNSR0INVGhlIHBlbiBjb2xvchAAC1BlbiBQYXR0 ZXJucHBwYWNwaXgPVGhlIHBlbiBwYXR0ZXJuEAAJUGVuIFdpZHRocHB3ZHNob3INVGhl IHBlbiB3aWR0aBAADVRyYW5zZmVyIE1vZGVwcHRtdHJhbhFUaGUgdHJhbnNmZXIgbW9k ZTAAAAAAAAACdHJhbgAPBENvcHkAY3B5IAAAB05vdENvcHluY3B5AAACT3IAb3IgIAAA BU5vdE9ybnRvcgAAA0JpY2JpYyAAAAZOb3RCaWMAbmJpYwAAA1hvcnhvciAAAAZOb3RY b3IAbnhvcgAAB0FkZE92ZXJhZGRvAAAGQWRkUGluAGFkZHAAAAdTdWJPdmVyc3VibwAA BlN1YlBpbgBzdWJwAAAFQWRNYXhhZG14AAAFQWRNaW5hZG1uAAAFQmxlbmRibG5kAABh cnJvAAQITm8gQXJyb3cAYXJubxBObyBhcnJvdyBvbiBsaW5lAA5BcnJvdyBhdCBTdGFy dABhcnN0FkFycm93IGF0IHN0YXJ0IG9mIGxpbmUADEFycm93IGF0IEVuZABhcmVuFEFy cm93IGF0IGVuZCBvZiBsaW5lABJBcnJvdyBhdCBCb3RoIEVuZHMAYXJiby9BcnJvdyBh dCBib3RoIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgbGluZSVRdWlja0RyYXcg R3JhcGhpY3MgU3VwcGxlbWVudGFsIFN1aXRlKkRlZmluZXMgdHJhbnNmb3JtYXRpb25z IG9mIGdyYXBoaWMgb2JqZWN0cwBxZHNwAAEAAQAAAAIMRHJhd2luZyBBcmVhAGNkcncx Q29udGFpbmVyIGZvciBncmFwaGljcyBhbmQgc3VwcG9ydGluZyBpbmZvcm1hdGlvbgAa EEJhY2tncm91bmQgQ29sb3IAcGJjbGNSR0IqVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCBp biB1bm9jY3VwaWVkIGFyZWFzABAAEkJhY2tncm91bmQgUGF0dGVybgBwYnB0Y3BpeCxU aGUgcGF0dGVybiB1c2VkIHRvIGZpbGwgaW4gdW5vY2N1cGllZCBhcmVhcwAQAAlCZXN0 IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAGQm91bmRzAHBi bmRxZHJ0LFRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgZHJhd2luZyBhcmVh ABAABUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAALQ29sb3IgVGFibGVjbHRiY2xydA9U aGUgY29sb3IgdGFibGUQAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQg ZGVzY3JpcHRvciB0eXBlAAAKRmlsbCBDb2xvcgBmbGNsY1JHQi9UaGUgZGVmYXVsdCBm aWxsIGNvbG9yIHVzZWQgZm9yIGdyYXBoaWMgb2JqZWN0cxAADEZpbGwgUGF0dGVybgBm bHB0Y3BpeDFUaGUgZGVmYXVsdCBmaWxsIHBhdHRlcm4gdXNlZCBmb3IgZ3JhcGhpYyBv YmplY3RzEAAIT3JkZXJpbmcAZ29ic29iaiA3VGhlIG9yZGVyZWQgbGlzdCBvZiBncmFw aGljIG9iamVjdHMgaW4gdGhlIGRyYXdpbmcgYXJlYVAABE5hbWUAcG5hbWl0eHQIVGhl IG5hbWUAEAAQRGVmYXVsdCBMb2NhdGlvbgBwbmVsUURwdC9UaGUgZGVmYXVsdCBsb2Nh dGlvbiBvZiBlYWNoIG5ldyBncmFwaGljIG9iamVjdBAACVBlbiBDb2xvcnBwY2xjUkdC DVRoZSBwZW4gY29sb3IQAAtQZW4gUGF0dGVybnBwcGFjcGl4D1RoZSBwZW4gcGF0dGVy bhAACVBlbiBXaWR0aHBwd2RzaG9yDVRoZSBwZW4gd2lkdGgQAAtQaXhlbCBEZXB0aHBk cHRzaG9yDkJpdHMgcGVyIHBpeGVsABAACFJvdGF0aW9uAHByb3R0cm90NFRoZSBkZWZh dWx0IHJvdGF0aW9uIGZvciBvYmplY3RzIGluIHRoZSBkcmF3aW5nIGFyZWEAEAAFU2Nh bGVwc2NsZml4ZDNUaGUgZGVmYXVsdCBzY2FsaW5nIGZvciBvYmplY3RzIGluIHRoZSBk cmF3aW5nIGFyZWEQAAxXcml0aW5nIENvZGUAcHNjdGludGxCVGhlIHNjcmlwdCBzeXN0 ZW0gYW5kIGxhbmd1YWdlIG9mIHRleHQgb2JqZWN0cyBpbiB0aGUgZHJhd2luZyBhcmVh AAAAClRleHQgQ29sb3IAcHR4Y2NSR0IiVGhlIGRlZmF1bHQgY29sb3IgZm9yIHRleHQg b2JqZWN0cwAQAARGb250AHB0eGZpdHh0LVRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGZv bnQgZm9yIHRleHQgb2JqZWN0cxAABFNpemUAcHRwc2ZpeGQnVGhlIGRlZmF1bHQgcG9p bnQgc2l6ZSBmb3IgdGV4dCBvYmplY3RzEAAFU3R5bGV0eHN0dHN0eSdUaGUgZGVmYXVs dCB0ZXh0IHN0eWxlIGZvciB0ZXh0IG9iamVjdHMQAA1UcmFuc2ZlciBNb2RlcHB0bXRy YW4tVGhlIGRlZmF1bHQgdHJhbnNmZXIgbW9kZSBmb3IgZ3JhcGhpYyBvYmplY3RzMAAL VHJhbnNsYXRpb25wdHJzUURwdDlUaGUgZGVmYXVsdCByZXBvc2l0aW9uaW5nIGZvciBv YmplY3RzIGluIHRoZSBkcmF3aW5nIGFyZWEQABBVcGRhdGUgT24gQ2hhbmdlAHB1cGRi b29sGVJlZHJhdyBhZnRlciBlYWNoIGNoYW5nZT8QAAAKY2FyYwACaW5keG5hbWVnbGlu AAJpbmR4bmFtZWNndHgAAmluZHhuYW1lY3BpYwACaW5keG5hbWVjb3ZsAAJpbmR4bmFt ZWNwaXgAAmluZHhuYW1lY3BnbgACaW5keG5hbWVjcmVjAAJpbmR4bmFtZWNycmMAAmlu ZHhuYW1lY2dvYgACaW5keG5hbWUPR3JvdXBlZCBHcmFwaGljY3BpYxFHcm91cCBvZiBn cmFwaGljcwAKCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlw ZQAAAAZCb3VuZHMAcGJuZHFkcnQ+VGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNv bnRhaW5zIHRoZSBlbnRpcmUgZ3JhcGhpYyBvYmplY3QAEAAFQ2xhc3NwY2xzdHlwZQlU aGUgY2xhc3MAAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3Jp cHRvciB0eXBlAAAIT3JkZXJpbmcAZ29ic29iaiA3VGhlIG9yZGVyZWQgbGlzdCBvZiBn cmFwaGljIG9iamVjdHMgaW4gdGhlIGRyYXdpbmcgYXJlYVAABE5hbWUAcG5hbWl0eHQI VGhlIG5hbWUAEAAIUm90YXRpb24AcHJvdHRyb3QMVGhlIHJvdGF0aW9uABAABVNjYWxl cHNjbGZpeGQLVGhlIHNjYWxpbmcQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRy YW5zZmVyIG1vZGUwAAtUcmFuc2xhdGlvbnB0cnNRRHB0D1RoZSB0cmFuc2xhdGlvbhAA AApjYXJjAAJpbmR4bmFtZWdsaW4AAmluZHhuYW1lY2d0eAACaW5keG5hbWVjcGljAAJp bmR4bmFtZWNvdmwAAmluZHhuYW1lY3BpeAACaW5keG5hbWVjcGduAAJpbmR4bmFtZWNy ZWMAAmluZHhuYW1lY3JyYwACaW5keG5hbWVjZ29iAAJpbmR4bmFtZQAAAAALVGFibGUg U3VpdGUfQ2xhc3NlcyBmb3IgbWFuaXB1bGF0aW5nIHRhYmxlc3RibHMAAQABAAAABARD ZWxsAGNjZWwGQSBjZWxsAAAFCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2Ny aXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQgVHlw ZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5cGUAAAdGb3JtdWxhcGZv cmN0eHQXVGhlIGZvcm11bGEgb2YgdGhlIGNlbGwQAApQcm90ZWN0aW9uAHBwcm9wcnRu PUluZGljYXRlcyB3aGV0aGVyIHZhbHVlIG9yIGZvcm11bGEgaW4gdGhlIGNlbGwgY2Fu IGJlIGNoYW5nZWQwAAAABkNvbHVtbgBjY29sCEEgY29sdW1uAAAFCUJlc3QgVHlwZXBi c3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRo ZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAAROYW1lAHBuYW1pdHh0CFRoZSBuYW1lABAAClByb3RlY3Rpb24AcHBy b3BydG5ISW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZvcm11bGFzIG9mIHRoZSBjZWxscyBp biB0aGUgY29sdW1uIGNhbiBiZSBjaGFuZ2VkADAAAAFjY2VsAAJpbmR4bmFtZQNSb3dj cm93BUEgcm93AAUJQmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0 eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0 eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAABE5hbWUAcG5hbWl0eHQIVGhl IG5hbWUAEAAKUHJvdGVjdGlvbgBwcHJvcHJ0bkVJbmRpY2F0ZXMgd2hldGhlciB0aGUg Zm9ybXVsYXMgb2YgdGhlIGNlbGxzIGluIHRoZSByb3cgY2FuIGJlIGNoYW5nZWQwAAAB Y2NlbAACaW5keG5hbWUFVGFibGVjdGJsB0EgdGFibGUABQlCZXN0IFR5cGVwYnN0dHlw ZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xh c3MAAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0 eXBlAAAETmFtZQBwbmFtaXR4dAhUaGUgbmFtZQAQAApQcm90ZWN0aW9uAHBwcm9wcnRu R0luZGljYXRlcyB3aGV0aGVyIHRoZSBmb3JtdWxhcyBvZiB0aGUgY2VsbHMgaW4gdGhl IHRhYmxlIGNhbiBiZSBjaGFuZ2VkMAAAA2NjZWwAAmluZHhuYW1lY2NvbAACaW5keG5h bWVjcm93AAJpbmR4bmFtZQAAAAFwcnRuAAMJUmVhZCBPbmx5bm1vZB9DYW4ndCBjaGFu Z2UgdmFsdWVzIG9yIGZvcm11bGFzEkZvcm11bGFzIFByb3RlY3RlZABmcHJvI0NhbiBj aGFuZ2VzIHZhbHVlcyBidXQgbm90IGZvcm11bGFzClJlYWQvV3JpdGUAbW9kZh5DYW4g Y2hhbmdlIHZhbHVlcyBhbmQgZm9ybXVsYXMAHU1pc2NlbGxhbmVvdXMgU3RhbmRhcmRz IFN1aXRlKU1pc2NlbGxhbmVvdXMgc3RhbmRhcmQgZXZlbnRzIGFuZCBjbGFzc2VzbWlz YwABAAEADhFCZWdpbiBUcmFuc2FjdGlvbhNCZWdpbiBhIHRyYW5zYWN0aW9ubWlzY2Jl Z2lsb25nAAAAAG51bGwAAJAAAAAEQ29weR9Db3B5IGFuIG9iamVjdCB0byB0aGUgY2xp cGJvYXJkAG1pc2Njb3B5bnVsbAAAgABudWxsAACQAAAAEENyZWF0ZSBQdWJsaXNoZXIS Q3JlYXRlIGEgcHVibGlzaGVybWlzY2NwdWJudWxsAACAAG9iaiART2JqZWN0IHRvIHB1 Ymxpc2iQAAABB0VkaXRpb25lbG9jYWxpcyNBbGlhcyB0byB0aGUgZWRpdGlvbiBjb250 YWluZXIgZmlsZYAAA0N1dB5DdXQgYW4gb2JqZWN0IHRvIHRoZSBjbGlwYm9hcmQAbWlz Y2N1dCBudWxsAACAAG51bGwAAJAAAAAJRG8gU2NyaXB0EEV4ZWN1dGUgYSBzY3JpcHQA bWlzY2Rvc2MqKioqAACAAFRFWFQVVGhlIHNjcmlwdCB0byBleGVjdXRlEAAAAAxFZGl0 IEdyYXBoaWMfRWRpdCB0aGUgc3BlY2lmaWVkIGRyYXdpbmcgYXJlYQBtaXNjZWRpdHRk YXIAAAAAdGRhch1UaGUgZHJhd2luZyBhcmVhIHRvIGJlIGVkaXRlZBAAAAAPRW5kIFRy YW5zYWN0aW9uEUVuZCBhIHRyYW5zYWN0aW9ubWlzY2VuZHRudWxsAACAAG51bGwAAJAA AAANSW1hZ2UgR3JhcGhpYyxDb252ZXJ0IGEgZ3JhcGhpYyBmcm9tIG9uZSBmb3JtYXQg dG8gYW5vdGhlcgBtaXNjaW1ncioqKioAAAAAKioqKihUaGUgZ3JhcGhpYyB0byBiZSBj b252ZXJ0ZWQgb3IgZm9ybWF0dGVkABAAAAoMQW50aWFsaWFzaW5nAGFudGFib29sEFVz ZSBhbnRpYWxpYXNpbmcAgAAJRGl0aGVyaW5nZ2RpdGJvb2wNVXNlIGRpdGhlcmluZ4AA BlJvdGF0ZQBrZHJ0dHJvdBlUaGUgcm90YXRpb24gb2YgdGhlIGltYWdlgAAFU2NhbGVr c2NhZml4ZCZUaGUgZmFjdG9yIGJ5IHdoaWNoIHRvIHNjYWxlIHRoZSBpbWFnZQCAAAtU cmFuc2xhdGlvbmt0cmFRRHB0KU9mZnNldCBieSB3aGljaCB0aGUgaW1hZ2Ugc2hvdWxk IGJlIG1vdmVkgAAPRmxpcCBIb3Jpem9udGFsa2Zob2Jvb2wYRmxpcCBpbWFnZSBob3Jp em9udGFsbHk/AIAADUZsaXAgVmVydGljYWxrZnZ0Ym9vbBZGbGlwIGltYWdlIHZlcnRp Y2FsbHk/AIAAB1F1YWxpdHlncXVhcXVhbBtJbWFnZSBxdWFsaXR5IG9mIHRoZSByZXN1 bHSgAAZGb3JtYXQAa3JlbnR5cGUvVGhlIGZvcm1hdCBpbnRvIHdoaWNoIHRoZSBkYXRh IHNob3VsZCBiZSBpbWFnZWQAABJTdHJ1Y3R1cmVkIEdyYXBoaWMAdG9vZ2Jvb2w0UmV0 dXJuIGEgc3RydWN0dXJlZCBncmFwaGljLCBpbnN0ZWFkIG9mIGEgcGl4ZWwgbWFwPwCA AAdVbmlmb3JtS0lzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHRo ZSBzYW1lIGZvciBhbGwgb2JqZWN0cyBpbiB0aGUgc2V0P21pc2Npc3VuYm9vbAAAAABv YmogL1RoZSBzZXQgb2Ygb2JqZWN0cyB0byBiZSBjaGVja2VkIGZvciB1bmlmb3JtaXR5 AAAAAQJJbgBrcHJwdHlwZS5UaGUgcHJvcGVydHkgSUQgZm9yIHRoZSBwcm9wZXJ0eSB0 byBiZSBjaGVja2VkAAAABFNob3cZQnJpbmcgYW4gb2JqZWN0IGludG8gdmlldwBtaXNj bXZpc251bGwAAIAAb2JqIB1UaGUgb2JqZWN0IHRvIGJlIG1hZGUgdmlzaWJsZRAAAAIC SW4Ad25kd29iaiApVGhlIHdpbmRvdyBpbiB3aGljaCB0byBkaXNwbGF5IHRoZSBvYmpl Y3SAAAJBdABzaG93UURwdChUaGUgcG9pbnQgYXQgd2hpY2ggdG8gZGlzcGxheSB0aGUg b2JqZWN0AIAABVBhc3RlIlBhc3RlIGFuIG9iamVjdCBmcm9tIHRoZSBjbGlwYm9hcmQA bWlzY3Bhc3RudWxsAACAAG51bGwAAJAAAAAEUmVkbzVSZXZlcnNlIHRoZSBhY3Rpb24g b2YgdGhlIGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgdW5kbwBtaXNjcmVkb251bGwAAIAA bnVsbAAAkAAAAAZSZXZlcnQqUmVzdG9yZSB0aGUgb2JqZWN0IHRvIGl0cyBsYXN0IHNh dmVkIHN0YXRlbWlzY3J2cnRudWxsAACAAG9iaiAUVGhlIG9iamVjdCB0byByZXZlcnQA EAAAAARVbmRvOVVuZG8gdGhlIGFjdGlvbiBvZiB0aGUgcHJldmlvdXMgZXZlbnQgb3Ig dXNlciBpbnRlcmFjdGlvbgBtaXNjdW5kb251bGwAAIAAbnVsbAAAkAAAAAAEC0FwcGxp Y2F0aW9uY2FwcBdBIE1hY2ludG9zaCBhcHBsaWNhdGlvbgAKCUJlc3QgVHlwZXBic3R0 eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBj bGFzcwAACUNsaXBib2FyZHBjbGkqKioqDVRoZSBjbGlwYm9hcmRQAAxEZWZhdWx0IFR5 cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAASSW5zZXJ0aW9u IExvY2F0aW9uAHBpbnNpbnNsTVRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgY29udGVudHMg b2YgdGhlIGNsaXBib2FyZCB3b3VsZCBiZSBpbnNlcnRlZCBieSBhIHBhc3RlAAAJRnJv bnRtb3N0cGlzZmJvb2wiSXMgdGhpcyB0aGUgZnJvbnRtb3N0IGFwcGxpY2F0aW9uPwAA AAROYW1lAHBuYW1pdHh0CFRoZSBuYW1lAAAAD0l0ZW0gRGVsaW1pdGVyc3R4ZGxpdHh0 KlRoZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIGRlbGltaXQgdGV4dCBpdGVtcwBAAA5Vc2Vy IFNlbGVjdGlvbgBwdXNsY3NlbC1UaGUgY3VycmVudCB1c2VyIHNlbGVjdGlvbiBvciBp bnNlcnRpb24gcG9pbnQAAAdWZXJzaW9udmVyc2xvbmclVGhlIHZlcnNpb24gbnVtYmVy IG9mIHRoZSBhcHBsaWNhdGlvbgAAAAJkb2N1AAJpbmR4bmFtZWN3aW4AAmluZHhuYW1l BEl0ZW0AY2l0bQtBIHRleHQgaXRlbQAJCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0 IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9y Y29scmNSR0IgVGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIAEAAMRGVmYXVs dCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAABEZvbnQA Zm9udGN0eHQrVGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3Rl chAABFNpemUAcHRzemZpeGQpVGhlIHNpemUgaW4gcG9pbnRzIG9mIHRoZSBmaXJzdCBj aGFyYWN0ZXIQAAxXcml0aW5nIENvZGUAcHNjdGludGweVGhlIHNjcmlwdCBzeXN0ZW0g YW5kIGxhbmd1YWdlAAAABVN0eWxldHhzdHRzdHklVGhlIHRleHQgc3R5bGUgb2YgdGhl IGZpcnN0IGNoYXJhY3RlchAADlVuaWZvcm0gU3R5bGVzAHVzdGx0c3R5NFRoZSB0ZXh0 IHN0eWxlcyB0aGF0IGFyZSB1bmlmb3JtIHRocm91Z2hvdXQgdGhlIGl0ZW0AEAAAAmNo YSAAAWluZHhjdHh0AAFpbmR4BE1lbnUAY21udQZBIG1lbnUAAAUJQmVzdCBUeXBlcGJz dHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhl IGNsYXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0 b3IgdHlwZQAAB01lbnUgSURtbmlkc2hvchhUaGUgbWVudSBJRCBmb3IgdGhlIG1lbnUA AAAETmFtZQBwbmFtaXR4dAhUaGUgbmFtZQAAAAABY21lbgACaW5keG5hbWUJTWVudSBJ dGVtY21lbgtBIG1lbnUgaXRlbQAGCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRl c2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQg VHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5cGUAAAdFbmFibGVk ZW5ibGJvb2wcSXMgdGhlIG1lbnUgaXRlbSBpcyBlbmFibGVkPwAAAAtJdGVtIE51bWJl cml0bW5zaG9yFFRoZSBtZW51IGl0ZW0gbnVtYmVyAAAABE5hbWUAcG5hbWl0eHQIVGhl IG5hbWUAAAAAAAAAAAFxdWFsAAMFRHJhZnRmYXN0KEltYWdlIHRoZSBncmFwaGljIGFz IHF1aWNrbHkgYXMgcG9zc2libGUAB1JlZ3VsYXJyZWdsGkltYWdlIHRoZSBncmFwaGlj IG5vcm1hbGx5AARIaWdoAGhpcXUxSW1hZ2UgdGhlIGdyYXBoaWMgYXQgdGhlIGhpZ2hl c3QgcXVhbGl0eSBwb3NzaWJsZQAAAQAAALvqAAC66gAAAfkBJMq4EIgAAAAcARYAA2Fl dXQAAAAiSUNPTgAGAC5YRkNOAAQAglhDTUQABAC+AAAAwwAAVAYBJLlYGkAAACAAAAAA AAAAA/UAFSAAGYwAAAAAA/YAICAAGhAAAAAAI5AAKyAAMDIAAAAAYHYAPSAAMLYAAAAA IVoARSAAMToAAAAAPtP//yAAU4IAAAAADP0AUSAAAIQBJMsYDP4AsSAASFoBJMwgDQ0A 2SAAMb4BJMp4DaoAWyAAAfQBJMwcAhIAvCAATRIBJMp0DP8AZiAADuYAAAAADQMAjiAA JoIAAAAADQQAniAAGpQAAAAAD6AAciAAEpgAAAAAD6EAfiAAEGAAAAAAFExvd2VyZWQg cmV0dXJuIGFycm93Ck5leHQgQXJyb3cKUHJldiBBcnJvdxFTdGFjayBJbmZvIFJ0IFRy aQdIQyBIZWxwC0Nsb3NlciBMb29rCU5ld0hhbmRsZQpIUG9wVXBNZW51C0Rpc3Bvc2VE ZXNjC1Nob3dCYWxsb29uD0hNUmVtb3ZlQmFsbG9vbg9Nb3ZlRGVzY1RvU2NyYXASU2F2 ZURlc2NBc1Jlc291cmNlCkV4dGVuZERlc2MGU2VhcmNoFVN0YW5kYXJkIEV2ZW50IFN1 aXRlcwlNZXJnZUFldGU= --========================_26885646==_D Content-Type: application/octet-stream; name="Aete_Editor_b1" ; x-mac-type="5354414B" ; x-mac-creator="57494C44" Content-Disposition: attachment; filename="Aete_Editor_b1" Content-Transfer-Encoding: base64 AAA2AFNUQUv/////AAAAAAAAAAoABBvAAAA2AAAAAAAAAAAAAAAABgAADjwAAAAeAAA7 gwAAOH8AAAAAAAAAAAAAQNkAAAAAAAUAABAAAAAAAAAAAAAAAAAAAAAAAAAAAhCAAAIQ gAACEIAAAiCAANrR7fYAAAAAAQgBQAJeA0AAAAAAA2YEgAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN7wAADAYBVgIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA AAAIAAAAiAAiAIgAIgCIiCIiiIgiIoiqIqqIqiKqzKozqsyqM6ruqruq7qq7qu67u+7u u7vu/7v/7v+7/+7/u////7v//4AQAiABCEAE//////////+IIogiiCKIIhEiRIgRIkSI xIAMaEMCMCaxMAMb2MAMjaoAqgCqAKoAiCJVIogiVSKIVSJViFUiVXfdd9133XfdgAAA AAAAAACqVapVqlWqVQOESDAMAgEBgkQ5RIIBAQGIFCJBiEEiFICAQT4ICBTjIgSMdCIX mBC+gIgI6wiIgCXIMolkJEySopxBvirJFOtAoAAABAoAAIBAIAACBAgAqgCAAIgAgAD/ gICAgICAgAgcIsGAAQIE/4CAgP8ICAj4dCJHjxcicb8Av7+wsLCw/3++XaJBgAD69fr1 oFCgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAb24gc3VzcGVuZFN0YWNrDXJlc2V0IG1lbnVCYXINZW5kIHN1c3BlbmRTdGFj aw0Nb24gcmVzdW1lU3RhY2sNaWYgdGhlIHVzZXJMZXZlbCBpcyAxIHRoZW4gc2V0IHRo ZSB1c2VyTGV2ZWwgdG8gMg1BZXRlRWR0aW9yTWVudQ1DaGVja1ByZWZlcmVuY2UNZW5k IHJlc3VtZVN0YWNrDQ1vbiBBZXRlRWR0aW9yTWVudQ1pZiB0aGVyZSBpcyBhIG1lbnUg IlN0eWxlIiB0aGVuIGRlbGV0ZSBtZW51ICJTdHlsZSINaWYgdGhlcmUgaXMgYSBtZW51 ICJGb250IiB0aGVuIGRlbGV0ZSBtZW51ICJGb250Ig1pZiB0aGVyZSBpcyBhIG1lbnUg Ik9iamVjdHMiIHRoZW4gZGVsZXRlIG1lbnUgIk9iamVjdHMiDWlmIHRoZXJlIGlzIGEg bWVudSAiVG9vbHMiIHRoZW4gZGVsZXRlIG1lbnUgIlRvb2xzIg1jcmVhdGUgbWVudSAi QWV0ZUVkaXRvciINcHV0ICJJbnN0cnVjdGlvbnMsUHJlZmVyZW5jZXMsLSxSZXNvdXJj ZSBUb29scyyuIFN1aXRlcyxFdmVudHMsQ2xhc3NlcyxFbnVtZXJhdGlvbnMsQ29tcGFy aXNvbnMsLSxOZXcgRWRpdG9yySxFbXB0eSBTdGFja8ksLSxMb2NhbGl6ZSBhZXRlySIg aW50byBtZW51ICJBZXRlRWRpdG9yIsINd2l0aCBtZW51TXNnICJJbnN0cnVjdGlvbnMs UHJlZmVyZW5jZXNDYXJkLCAscmVzb3VyY2VUb29scyxBRVN1aXRlc0JnLGV2ZW50c0Jn LGNsYXNzQmcsZW51bUJnLGNvbXBhcmlzb25CZywgLG1ha2VOZXdTdGFjayBmYWxzZSxl bXB0eVN0YWNrLCxsb2NhbGl6ZUl0Ig1lbmQgQWV0ZUVkdGlvck1lbnUNDW9uIFJlZ0xp c3QNcHV0IGNhcmQgZmllbGQgIm5hbWVsaXN0IiBvZiBjYXJkICJwcmVmZXJlbmNlIiBp bnRvIHRoZUxpc3QNcHV0IFNob3dMaXN0KHRoZUxpc3QsICJQaWNrIEEgTmFtZSIsIGZh bHNlLCB0cnVlLCAiT0ssQ2FuY2VsIiwgMCkgaW50byBjaG9pY2UNaWYgbGluZSAxIG9m IGNob2ljZSA9ICJPSyIgdGhlbg1wdXQgbGluZSAobGluZSAyIG9mIGNob2ljZSkgb2Yg dGhlTGlzdCBpbnRvIHgNcHV0IG9mZnNldCgiPSIgJiBxdW90ZSwgeCkgaW50byBuDWlm IHN0YXJ0SGVyZSA+IDAgdGhlbg1kZWxldGUgY2hhciAxIHRvIChuKzEpIG9mIHgNaWYg bGFzdCBjaGFyIG9mIHggPSBxdW90ZSB0aGVuIGRlbGV0ZSBsYXN0IGNoYXIgb2YgeA10 eXBlIHgNZW5kIGlmDWVuZCBpZg1lbmQgUmVnTGlzdA0Nb24gSW5zdHJ1Y3Rpb25zDWds b2JhbCBnV2hlcmVGcm9tDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJvbQ1nbyBj ZCAiSW5zdHJ1Y3Rpb25zIg1lbmQgSW5zdHJ1Y3Rpb25zDQ1vbiBQcmVmZXJlbmNlc0Nh cmQNZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2QgaW50byBnV2hlcmVGcm9t DWdvIGNkICJwcmVmZXJlbmNlIg1lbmQgUHJlZmVyZW5jZXNDYXJkDQ1vbiByZXNvdXJj ZVRvb2xzDWdsb2JhbCBnV2hlcmVGcm9tDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJl RnJvbQ1nbyBjZCAibWFpbk1lbnUiDWVuZCByZXNvdXJjZVRvb2xzDQ1vbiBBRVN1aXRl c0JnDWdsb2JhbCBnV2hlcmVGcm9tDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJv bQ1pZiB0aGVyZSBpcyBhIGNkIDIgb2YgYmcgInN1aXRlSW5mbyIgdGhlbg1nbyBjZCAy IG9mIGJnICJzdWl0ZUluZm8iDWVsc2UNZ28gYmcgInN1aXRlSW5mbyINZW5kIGlmDWVu ZCBBRVN1aXRlc0JnDQ1vbiBldmVudHNCZw1nbG9iYWwgZ1doZXJlRnJvbQ1wdXNoIGNk DXBvcCBjZCBpbnRvIGdXaGVyZUZyb20NaWYgdGhlcmUgaXMgYSBjZCAyIG9mIGJnICJl dmVudHMiIHRoZW4NZ28gY2QgMiBvZiBiZyAiZXZlbnRzIg1lbHNlDWdvIGJnICJldmVu dHMiDWVuZCBpZg1lbmQgZXZlbnRzQmcNDW9uIGNsYXNzQmcNZ2xvYmFsIGdXaGVyZUZy b20NcHVzaCBjZA1wb3AgY2QgaW50byBnV2hlcmVGcm9tDWlmIHRoZXJlIGlzIGEgY2Qg MiBvZiBiZyAiY2xhc3MiIHRoZW4NZ28gY2QgMiBvZiBiZyAiY2xhc3MiDWVsc2UNZ28g YmcgImNsYXNzIg1lbmQgaWYNZW5kIGNsYXNzQmcNDW9uIGVudW1CZw1nbG9iYWwgZ1do ZXJlRnJvbQ1wdXNoIGNkDXBvcCBjZCBpbnRvIGdXaGVyZUZyb20NaWYgdGhlcmUgaXMg YSBjZCAyIG9mIGJnICJlbnVtZXJhdGlvbiIgdGhlbg1nbyBjZCAyIG9mIGJnICJlbnVt ZXJhdGlvbiINZWxzZQ1nbyBiZyAiZW51bWVyYXRpb24iDWVuZCBpZg1lbmQgZW51bUJn DQ1vbiBjb21wYXJpc29uQmcNZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2Qg aW50byBnV2hlcmVGcm9tDWlmIHRoZXJlIGlzIGEgY2QgMiBvZiBiZyAiY29tcGFyaXNv biIgdGhlbg1nbyBjZCAyIG9mIGJnICJjb21wYXJpc29uIg1lbHNlDWdvIGJnICJjb21w YXJpc29uIg1lbmQgaWYNZW5kIGNvbXBhcmlzb25CZw0Nb24gbWFrZU5ld1N0YWNrIG5l d1dpbmRvdw1nZXQgdGhlIHNoaWZ0S2V5IGlzIGRvd24NcHV0IGl0IGludG8gc2hpZnRE b3duDWFzayBmaWxlICJTYXZlIGEgbmV3IGVkaXRvciBzdGFjayBhczoiDWlmIHRoZSBy ZXN1bHQgaXMgIkNhbmNlbCIgdGhlbiBleGl0IG1ha2VOZXdTdGFjaw1pZiBpdCBpcyBl bXB0eSB0aGVuDWFuc3dlciAiWW91IGhhdmUgdG8gc3VwcGx5IGEgbmFtZS4iDWFzayBm aWxlICJDcmVhdGUgYSBuZXcgc3RhY2sgYXMiDWVuZCBpZg1pZiB0aGUgZnJlZXNpemUg b2YgdGhpcyBzdGFjayA+IDMyNzY4IHRoZW4gZG9NZW51ICJDb21wYWN0IFN0YWNrIg1z YXZlIHRoaXMgc3RhY2sgYXMgaXQNaWYgdGhlIHJlc3VsdCA8PiAiIiB0aGVuDWFuc3dl ciAiSXQgZmFpbHMsIiAmJiB0aGUgcmVzdWx0DWV4aXQgdG8gSHlwZXJDYXJkDWVuZCBp Zg1pZiBzaGlmdERvd24gdGhlbg1nbyBzdGFjayBpdCBpbiBhIG5ldyB3aW5kb3cNcHV0 IHRoZSBsb2Mgb2YgY2Qgd2luZG93IGludG8gd2luZExvYw1zZXQgdGhlIGxvYyBvZiBj ZCB3aW5kb3cgdG8gaXRlbSAxIG9mIHdpbmRMb2MgKzIwLCBpdGVtIDIgb2Ygd2luZExv YyArMjANZWxzZQ1pZiBuZXdXaW5kb3cgPD4gdHJ1ZSB0aGVuDWdvIHN0YWNrIGl0DWVs c2UNZ28gc3RhY2sgaXQgaW4gYSBuZXcgd2luZG93DXB1dCB0aGUgbG9jIG9mIGNkIHdp bmRvdyBpbnRvIHdpbmRMb2MNc2V0IHRoZSBsb2Mgb2YgY2Qgd2luZG93IHRvIGl0ZW0g MSBvZiB3aW5kTG9jICsyMCwgaXRlbSAyIG9mIHdpbmRMb2MgKzIwDWVuZCBpZg1lbmQg aWYNZW1wdHlTdGFjayB5ZXMNZW5kIG1ha2VOZXdTdGFjaw0Nb24gbG9jYWxpemVJdA1h c2sgZmlsZSAiQ3JlYXRlIHRyYW5zbGF0aW9uIHN0YWNrIHdoZXJlPyIgd2l0aCAoKHNo b3J0IG5hbWUgb2YgdGhpcyBzdGFjaykgJiYgIkxvY2FsaXplZCIpDWlmIHRoZSByZXN1 bHQgaXMgIkNhbmNlbCIgdGhlbiBleGl0IGxvY2FsaXplSXQNaWYgaXQgaXMgZW1wdHkg dGhlbg1hbnN3ZXIgIllvdSBoYXZlIHRvIHN1cHBseSBhIG5hbWUuIg1hc2sgZmlsZSAi Q3JlYXRlIHRyYW5zbGF0aW9uIHN0YWNrIHdoZXJlPyINZW5kIGlmDWlmIHRoZSBmcmVl c2l6ZSBvZiB0aGlzIHN0YWNrID4gMzI3NjggdGhlbiBkb01lbnUgIkNvbXBhY3QgU3Rh Y2siDXNhdmUgdGhpcyBzdGFjayBhcyBpdA1pZiB0aGUgcmVzdWx0IDw+ICIiIHRoZW4N YW5zd2VyICJJdCBmYWlscywiICYmIHRoZSByZXN1bHQNZXhpdCB0byBIeXBlckNhcmQN ZW5kIGlmDWdvIHN0YWNrIGl0IGluIGEgbmV3IHdpbmRvdw1wdXQgdGhlIGxvYyBvZiBj ZCB3aW5kb3cgaW50byB3aW5kTG9jDXNldCB0aGUgbG9jIG9mIGNkIHdpbmRvdyB0byBp dGVtIDEgb2Ygd2luZExvYyArMjAsIGl0ZW0gMiBvZiB3aW5kTG9jICsyMA1Mb2NhbGl6 YXRpb24gZmFsc2UNZW5kIGxvY2FsaXplSXQNDW9uIG9wZW5zdGFjaw1nbG9iYWwgaW5F ZGl0LCBnRGVsZXRlU3VpdGUNcHV0IGZhbHNlIGludG8gZ0RlbGV0ZVN1aXRlDXB1dCB0 cnVlIGludG8gaW5FZGl0DWlmIHRoZSBzY3JlZW5SZWN0IGlzICIwLDAsNTEyLDM0MiIg dGhlbiBzZXQgdGhlIGxvYyBvZiBjZCB3aW5kb3cgdG8gIjAsMCINaWYgdGhlIHVzZXJM ZXZlbCBpcyAxIHRoZW4gc2V0IHRoZSB1c2VyTGV2ZWwgdG8gMg1BZXRlRWR0aW9yTWVu dQ1DaGVja1ByZWZlcmVuY2UNZW5kIG9wZW5zdGFjaw0Nb24gY2xvc2VDYXJkDWhtUmVt b3ZlQmFsbG9vbg1wYXNzIGNsb3NlQ2FyZA1lbmQgY2xvc2VDYXJkDQ1vbiBjbG9zZVN0 YWNrDXJlc2V0IG1lbnVCYXINaWYgdGhlIGZyZWVzaXplIG9mIHRoaXMgc3RhY2sgPiAz Mjc2OCB0aGVuIGRvTWVudSAiQ29tcGFjdCBTdGFjayINZW5kIGNsb3NlU3RhY2sNDWZ1 bmN0aW9uIFByZWZlckNsaWVudExhbmdCdXR0b25JRA1yZXR1cm4gIjUsNiw3LDEzLDU3 Ig1lbmQgUHJlZmVyQ2xpZW50TGFuZ0J1dHRvbklEDQ1mdW5jdGlvbiBQcmVmZXJTZXJ2 ZXJMYW5nQnV0dG9uSUQNcmV0dXJuICIyLDMsMTAiDWVuZCBQcmVmZXJTZXJ2ZXJMYW5n QnV0dG9uSUQNDW9uIENoZWNrUHJlZmVyZW5jZQ1nbG9iYWwgZGVmYXVsdFRpbWVvdXQs ZGVmYXVsdFRhcmdldCxkZWZhdWx0U2VuZE1vZGUsZGVmYXVsdElkbGVQcm9jLGRlZmF1 bHRBRUZpbHRlcixkZWZhdWx0VGFyZ2V0RGVzYw1nbG9iYWwgc2VydmVyTGFuZyxjbGll bnRMYW5nLGNsaWVudEhhc0dsdWUsdmVyYm9zZQ1wdXQgUHJlZmVyQ2xpZW50TGFuZ0J1 dHRvbklEKCkgaW50byB0aGVMaXN0DXB1dCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlTGlz dCBpbnRvIG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbg1pZiBoaWxpdGUgb2YgY2FyZCBi dXR0b24gaWQgKGl0ZW0gaSBvZiB0aGVMaXN0KSBvZiBjYXJkICJwcmVmZXJlbmNlIiB0 aGVuDXB1dCBzaG9ydCBuYW1lIG9mIGNhcmQgYnV0dG9uIGlkIChpdGVtIGkgb2YgdGhl TGlzdCkgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byBjbGllbnRMYW5nDWV4aXQgcmVw ZWF0DWVuZCBpZg1lbmQgcmVwZWF0DXB1dCBQcmVmZXJTZXJ2ZXJMYW5nQnV0dG9uSUQo KSBpbnRvIHRoZUxpc3QNcHV0IG51bWJlciBvZiBpdGVtcyBpbiB0aGVMaXN0IGludG8g bg1yZXBlYXQgd2l0aCBpID0gMSB0byBuDWlmIGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiBp ZCAoaXRlbSBpIG9mIHRoZUxpc3QpIG9mIGNhcmQgInByZWZlcmVuY2UiIHRoZW4NcHV0 IHNob3J0IG5hbWUgb2YgY2FyZCBidXR0b24gaWQgKGl0ZW0gaSBvZiB0aGVMaXN0KSBv ZiBjYXJkICJwcmVmZXJlbmNlIiBpbnRvIHNlcnZlckxhbmcNZXhpdCByZXBlYXQNZW5k IGlmDWVuZCByZXBlYXQNcHV0IGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiAiaGFzIGdsdWUg c3Vicm91dGluZSIgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byBjbGllbnRIYXNHbHVl DXB1dCBoaWxpdGUgb2YgY2FyZCBidXR0b24gInZlcmJvc2UiIG9mIGNhcmQgInByZWZl cmVuY2UiIGludG8gdmVyYm9zZQ1wdXQgY2FyZCBmaWVsZCAidGltZU91dCIgb2YgY2Fy ZCAicHJlZmVyZW5jZSIgaW50byBkZWZhdWx0VGltZW91dA1wdXQgY2FyZCBmaWVsZCAi c2VuZFRhcmdldCIgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byBkZWZhdWx0VGFyZ2V0 DXB1dCBjYXJkIGZpZWxkICJ0YXJnZXREZXNjIiBvZiBjYXJkICJwcmVmZXJlbmNlIiBp bnRvIGRlZmF1bHRUYXJnZXREZXNjDXB1dCBjYXJkIGZpZWxkICJzZW5kTW9kZSIgb2Yg Y2FyZCAicHJlZmVyZW5jZSIgaW50byBkZWZhdWx0U2VuZE1vZGUNcHV0IGNhcmQgZmll bGQgImlkbGVQcm9jIiBvZiBjYXJkICJwcmVmZXJlbmNlIiBpbnRvIGRlZmF1bHRJZGxl UHJvYw1wdXQgY2FyZCBmaWVsZCAiYWVGaWx0ZXIiIG9mIGNhcmQgInByZWZlcmVuY2Ui IGludG8gZGVmYXVsdEFFRmlsdGVyDWVuZCBDaGVja1ByZWZlcmVuY2UNDWZ1bmN0aW9u IFN0cmlwU1AgeCwgbG93ZXJDYXNlDXB1dCBDaGFyVG9OdW0oY2hhciAxIG9mIHgpIGlu dG8gbg1pZiBsb3dlckNhc2UgPSB0cnVlIHRoZW4NaWYgKG4gPj0gNjUpIGFuZCAobiA8 PSA5MCkgdGhlbg1wdXQgTnVtVG9DaGFyKG4rMzIpIGludG8gY2hhciAxIG9mIHgNZW5k IGlmDWVsc2UNaWYgKG4gPj0gOTcpIGFuZCAobiA8PSAxMjIpIHRoZW4NcHV0IE51bVRv Q2hhcihuLTMyKSBpbnRvIGNoYXIgMSBvZiB4DWVuZCBpZg1lbmQgaWYNcmVwZWF0IHVu dGlsIGkgPSAwDXB1dCBvZmZzZXQoc3BhY2UsIHgpIGludG8gaQ1pZiBpID4gMCB0aGVu DXB1dCBDaGFyVG9OdW0oY2hhciAoaSsxKSBvZiB4KSBpbnRvIG4NaWYgKG4gPj0gOTcp IGFuZCAobiA8PSAxMjIpIHRoZW4NcHV0IE51bVRvQ2hhcihuLTMyKSBpbnRvIGNoYXIg KGkrMSkgb2YgeA1lbmQgaWYNZGVsZXRlIGNoYXIgaSBvZiB4DWVuZCBpZg1lbmQgcmVw ZWF0DXJldHVybiB4DWVuZCBTdHJpcFNQDQ1mdW5jdGlvbiBIVEtleVdvcmQgaW5mbw1w dXQgKChpdGVtIDQgb2YgaW5mbykgZGl2IDgxOTIpIG1vZCA0IGludG8gdGVtcA1pZiB0 ZW1wID4gMSB0aGVuDXB1dCAibGlzdCIgaW50byB0aGlzVHlwZQ1lbHNlIGlmIHRlbXAg PSAxIHRoZW4NcHV0ICJlbnVtIiBpbnRvIHRoaXNUeXBlDWVsc2UNcHV0IFJlc1R5cGUo aXRlbSAzIG9mIGluZm8pIGludG8gdGhpc1R5cGUNZW5kIGlmDS0tIGlmIGl0IGlzIGEg c3BlY2lhbCB0eXBlLCB3ZSBuZWVkIHRvIGFwcGVuZCB0eXBlIGFmdGVyIGtleXdvcmQN aWYgKHRoaXNUeXBlID0gIlRFWFQiKSBPUiAodGhpc1R5cGUgPSAib2JqICIpIE9SICh0 aGlzVHlwZSA9ICJsaXN0Iikgb3IgKHRoaXNUeXBlID0gIm51bGwiKSB0aGVuDXJldHVy biBpdGVtIDIgb2YgaW5mbw1lbHNlDXJldHVybiBSZXNUeXBlKGl0ZW0gMiBvZiBpbmZv KSAmIFRoaXNUeXBlDWVuZCBpZg1lbmQgSFRLZXlXb3JkDQ1vbiBpZGxlDWdsb2JhbCBp bkVkaXQNcHV0IHRydWUgaW50byBpbkVkaXQNZW5kIGlkbGUNDWZ1bmN0aW9uIFJlc1R5 cGUgeA1yZXR1cm4gY2hhciAxIHRvIDQgb2YgKHggJiAiICAgICIpDWVuZCBSZXNUeXBl DQ1mdW5jdGlvbiBqdW1wIHgNZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2Qg aW50byBnV2hlcmVGcm9tDWdvIGNhcmQgeA1yZXR1cm4gKHRoZSByZXN1bHQgPSAiIikN ZW5kIGp1bXANDW9uIE5hbWVJdCB4DXB1dCB3b3JkIDEgb2YgeCBpbnRvIHkNZGVsZXRl IHdvcmQgMSBvZiB4DWlmIChpdGVtIDIgb2YgeCA8PiAiIikgb3IgKGxhc3QgY2hhciBv ZiB4ID0gIiwiKSB0aGVuDS0tIDIgaXRlbXMgbWVhbnMgaWQgKyBuYW1lLCBqdXN0IGtl ZXAgdGhlIGlkDWRlbGV0ZSBpdGVtIDIgb2YgeA1lbmQgaWYNaWYgdGhlcmUgaXMgYSBj YXJkIHggdGhlbg1pZiAodGhlIGlkIG9mIHRoaXMgY2FyZCkgPD4gKHRoZSBpZCBvZiBj YXJkIHgpIHRoZW4NYW5zd2VyICJUaGUgSUQgb2YgdGhpcyIgJiYgeSAmJiAiYWxyZWFk eSBleGlzdHMiDWVuZCBpZg1lbmQgaWYNc2V0IG5hbWUgb2YgdGhpcyBjYXJkIHRvIHgN ZW5kIE5hbWVJdA0Nb24gQ2hhbmdlTmFtZSBvbGROYW1lLCBuZXdOYW1lLCBsaXN0TmFt ZQ0tLSBjaGFuZ2Ugb2xkTmFtZSBpbiBmaWVsZCBsaXN0TmFtZSB0byBuZXdOYW1lDXB1 dCB3b3JkIDEgb2Ygb2xkTmFtZSBpbnRvIHN1aXRlbmFtZQ1kZWxldGUgd29yZCAxIHRv IDIgb2Ygb2xkTmFtZQ1pZiAoaXRlbSAyIG9mIG9sZE5hbWUgPSAiIikgYW5kIChsYXN0 IGNoYXIgb2Ygb2xkTmFtZSA8PiAiLCIpIHRoZW4NLS0gb25seSAxIGl0ZW0sIGl0IGlz IHRoZSBJRA1wdXQgMSBpbnRvIGNoZWNrSW5kZXgNcHV0IGl0ZW0gMSBvZiBvbGROYW1l IGludG8gY2hlY2tJdGVtDWVsc2UNLS0gbmFtZSBmb2xsb3dlZCBieSBJRCwgdXNlIHRo ZSBJRA1wdXQgMiBpbnRvIGNoZWNrSW5kZXgNcHV0IGl0ZW0gMSBvZiBvbGROYW1lIGlu dG8gY2hlY2tJdGVtDXB1dCBpdGVtIDIgb2Ygb2xkTmFtZSAmICIsIiAmIGNoZWNrSXRl bSBpbnRvIG9sZE5hbWUNZW5kIGlmDXB1dCAic3VpdGUiICYmIFJlc1R5cGUoc3VpdGVO YW1lKSBpbnRvIHN1aXRlQ2FyZA1pZiB0aGVyZSBpcyBhIGNhcmQgc3VpdGVDYXJkIHRo ZW4NcHV0IGZpZWxkIGxpc3ROYW1lIG9mIGNhcmQgc3VpdGVDYXJkIGludG8geA1wdXQg dGhlIG51bWJlciBvZiBsaW5lcyBpbiB4IGludG8gbg1wdXQgMSBpbnRvIGkNcHV0IGZh bHNlIGludG8gZm91bmQNcmVwZWF0IHVudGlsIChpID4gbikgb3IgZm91bmQNaWYgKGl0 ZW0gY2hlY2tJbmRleCBvZiBsaW5lIGkgb2YgeCkgPSBjaGVja0l0ZW0gdGhlbg1kZWxl dGUgbGluZSBpIG9mIHgNcHV0IHRydWUgaW50byBmb3VuZA1lbmQgaWYNYWRkIDEgdG8g aQ1lbmQgcmVwZWF0DXB1dCB4IGludG8gZmllbGQgbGlzdE5hbWUgb2YgY2FyZCBzdWl0 ZUNhcmQNZW5kIGlmDWlmIG5ld05hbWUgPD4gIiIgdGhlbg1wdXQgd29yZCAxIG9mIG5l d05hbWUgaW50byBzdWl0ZW5hbWUNZGVsZXRlIHdvcmQgMSB0byAyIG9mIG5ld05hbWUN aWYgKGl0ZW0gMiBvZiBuZXdOYW1lIDw+ICIiKSBvciAobGFzdCBjaGFyIG9mIG5ld05h bWUgPSAiLCIpIHRoZW4NLS0gbmV3TmFtZSBpcyBuYW1lICsgSUQsIGZsaXAgaXQgYXJv dW5kDXB1dCBpdGVtIDIgb2YgbmV3TmFtZSAmICIsIiAmIGl0ZW0gMSBvZiBuZXdOYW1l IGludG8gbmV3TmFtZQ1lbmQgaWYNcHV0ICJzdWl0ZSIgJiYgc3VpdGVOYW1lIGludG8g c3VpdGVDYXJkDWlmIHRoZXJlIGlzIGEgY2FyZCBzdWl0ZUNhcmQgdGhlbg1wdXQgbmV3 TmFtZSAmIHJldHVybiBhZnRlciBmaWVsZCBsaXN0TmFtZSBvZiBjYXJkIHN1aXRlQ2Fy ZA1lbmQgaWYNZW5kIGlmDWVuZCBDaGFuZ2VOYW1lDQ1vbiBSZURvU2NyaXB0DWdsb2Jh bCBpbkVkaXQNcHV0IGluRWRpdCBpbnRvIGN1ckVkaXQNcHV0IGZhbHNlIGludG8gaW5F ZGl0DXB1c2ggY2FyZA1wdXQgbnVtYmVyIG9mIGNhcmRzIGluIGJrZ25kICJldmVudHMi IGludG8gbg1yZXBlYXQgd2l0aCBpID0gMiB0byBuDWdvIGNhcmQgaSBvZiBia2duZCAi ZXZlbnRzIg1pZiB0aGUgcmVzdWx0ID0gIiIgdGhlbg1NYWtlU2NyaXB0VGVtcGxhdGUN ZW5kIGlmDWVuZCByZXBlYXQNcG9wIGNhcmQNcHV0IGN1ckVkaXQgaW50byBpbkVkaXQN ZW5kIFJlRG9TY3JpcHQNDWZ1bmN0aW9uIEVudW1PcHRpb24gc3VpdGVDb2RlLGVudW1l cmF0aW9uLGVudW1lcmF0b3IsaW5kZXgNcHV0ICIiIGludG8gdGhlTGlzdA1wdXQgImVu dW1lcmF0aW9uIiAmJiBlbnVtZXJhdGlvbiBpbnRvIHgNaWYgdGhlcmUgaXMgYSBjYXJk IHggdGhlbg1wdXQgZmllbGQgImVudW1JbmZvIiBvZiBjYXJkIHggaW50byB4DXB1dCBu dW1iZXIgb2YgbGluZXMgaW4geCBpbnRvIG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbg1p ZiAoZW51bWVyYXRvciA9ICIiKSB0aGVuDXB1dCBpdGVtIGluZGV4IG9mIGxpbmUgaSBv ZiB4ICYgInwiIGFmdGVyIHRoZUxpc3QNZWxzZSBpZiAoZW51bWVyYXRvciA9IGl0ZW0g MSBvZiBsaW5lIGkgb2YgeCkgdGhlbg1wdXQgaXRlbSBpbmRleCBvZiBsaW5lIGkgb2Yg eCAmICJ8IiBpbnRvIHRoZUxpc3QNZW5kIGlmDWVuZCByZXBlYXQNZW5kIGlmDWlmIHRo ZUxpc3QgPSAiIiB0aGVuDXB1dCAic29tZUVudW0iIGludG8gdGhlTGlzdA1lbHNlDWRl bGV0ZSBsYXN0IGNoYXIgb2YgdGhlTGlzdA1lbmQgaWYNcmV0dXJuIHRoZUxpc3QNZW5k IEVudW1PcHRpb24NDWZ1bmN0aW9uIE5hbWVPZkRhdGFUeXBlIGRhdGFUeXBlDWlmIGRh dGFUeXBlID0gInNob3IiIHRoZW4NZ2V0ICJJbnRlZ2VyLFB0cixIYW5kbGUsdHlwZVNo b3J0SW50ZWdlcixzaG9ydCwyIg1lbHNlIGlmIGRhdGFUeXBlID0gImxvbmciIHRoZW4N Z2V0ICJMb25naW50LFB0cixIYW5kbGUsdHlwZUxvbmdJbnRlZ2VyLGxvbmcsNCINZWxz ZSBpZiAoZGF0YVR5cGUgPSAiYm9vbCIpIG9yIChkYXRhVHlwZSA9ICJ0cnVlIikgdGhl bg1nZXQgIkJvb2xlYW4sUHRyLEhhbmRsZSx0eXBlQm9vbGVhbixCb29sZWFuLDEiDWVs c2UgaWYgZGF0YVR5cGUgPSAiVEVYVCIgdGhlbg1nZXQgIlN0cjI1NSxDaGFyc1B0cixD aGFyc0hhbmRsZSx0eXBlQ2hhcixjaGFyLC0xIg1lbHNlIGlmIChkYXRhVHlwZSA9ICJl bnVtIikgdGhlbg1nZXQgIlJlc1R5cGUsUmVzVHlwZVB0cixIYW5kbGUsdHlwZUVudW1l cmF0ZWQsUmVzVHlwZSw0Ig1lbHNlIGlmIChkYXRhVHlwZSA9ICJ0eXBlIikgdGhlbg1n ZXQgIlJlc1R5cGUsUmVzVHlwZVB0cixIYW5kbGUsdHlwZVR5cGUsUmVzVHlwZSw0Ig1l bHNlIGlmIChkYXRhVHlwZSA9ICJwcm9wIikgdGhlbg1nZXQgIlJlc1R5cGUsUmVzVHlw ZVB0cixIYW5kbGUsdHlwZVByb3BlcnR5LFJlc1R5cGUsNCINZWxzZSBpZiAoZGF0YVR5 cGUgPSAia2V5dyIpIHRoZW4NZ2V0ICJSZXNUeXBlLFJlc1R5cGVQdHIsSGFuZGxlLHR5 cGVLZXl3b3JkLFJlc1R5cGUsNCINZWxzZSBpZiBkYXRhVHlwZSA9ICJsaXN0IiB0aGVu DWdldCAiQUVEZXNjTGlzdCxBRURlc2NMaXN0UHRyLCx0eXBlQUVMaXN0LEFFRGVzY0xp c3QsLTEiDWVsc2UgaWYgZGF0YVR5cGUgPSAiZXh0ZSIgdGhlbg1nZXQgImV4dGVuZGVk LFB0cixIYW5kbGUsdHlwZUV4dGVuZGVkLGV4dGVuZGVkLDEwIg1lbHNlIGlmIGRhdGFU eXBlID0gInNpbmciIHRoZW4NZ2V0ICJSZWFsLFB0cixIYW5kbGUsdHlwZVNob3J0Rmxv YXQsZmxvYXQsNCINZWxzZSBpZiBkYXRhVHlwZSA9ICJkb3ViIiB0aGVuDWdldCAiRG91 YmxlLFB0cixIYW5kbGUsdHlwZUxvbmdGbG9hdCxkb3VibGUsOCINZWxzZSBpZiBkYXRh VHlwZSA9ICJjb21wIiB0aGVuDWdldCAiQ29tcCxQdHIsSGFuZGxlLHR5cGVDb21wLGNv bXAsOCINZWxzZSBpZiBkYXRhVHlwZSA9ICJhbGlzIiB0aGVuDWdldCAiQWxpYXNSZWNv cmQsQWxpYXNQdHIsQWxpYXNIYW5kbGUsdHlwZUFsaWFzLEFsaWFzUmVjb3JkLC0xIg1l bHNlIGlmIGRhdGFUeXBlID0gImZzcyAiIHRoZW4NZ2V0ICJGU1NwZWMsRlNTcGVjUHRy LEZTU3BlY0hhbmRsZSx0eXBlRlNTLEZTU3BlYyw3MCINZWxzZQ1nZXQgIkFFRGVzYyxQ dHIsSGFuZGxlLHR5cGVVbmtub3duLHZvaWQsLTEiDWVuZCBpZg1yZXR1cm4gaXQNZW5k IE5hbWVPZkRhdGFUeXBlDQ0Nb24gZW1wdHlTdGFjayBub0RpYWxvZw1pZiBub0RpYWxv ZyA8PiJ5ZXMiIHRoZW4NYW5zd2VyICJEZWxldGUgYWxsICdhZXRlJyBkYXRhIGZyb20g dGhpcyBzdGFjaz8iIHdpdGggIk9LIiBvciAiQ2FuY2VsIg1pZiBpdCBpcyBub3QgIk9L IiB0aGVuIGV4aXQgZW1wdHlTdGFjaw1lbmQgaWYNc2V0IGN1cnNvciB0byB3YXRjaA1n bG9iYWwgaW5FZGl0DXB1dCBmYWxzZSBpbnRvIGluRWRpdA1zZXQgbG9ja3NjcmVlbiB0 byB0cnVlDXB1c2ggY2FyZA1EZWxldGVBbGwgInN1aXRlSW5mbyINRGVsZXRlQWxsICJl dmVudHMiDURlbGV0ZUFsbCAiY2xhc3MiDURlbGV0ZUFsbCAiY29tcGFyaXNvbiINRGVs ZXRlQWxsICJlbnVtZXJhdGlvbiINZ28gY2QgIm1haW5NZW51Ig1wdXQgIiIgaW50byBj YXJkIGZpZWxkICJTdWl0ZUxpc3QiDXB1dCAiIiBpbnRvIGNhcmQgZmllbGQgIlNjcmF0 Y2giDXB1dCAiIiBpbnRvIGNhcmQgZmllbGQgInNlbmRUYXJnZXQiIG9mIGNhcmQgInBy ZWZlcmVuY2UiDXB1dCAiYWV0ZSIgaW50byBjYXJkIGZpZWxkICJyZXNvdXJjZVR5cGUi IG9mIGNhcmQgInByZWZlcmVuY2UiDXB1dCAwIGludG8gY2FyZCBmaWVsZCAicmVzb3Vy Y2VJRCIgb2YgY2FyZCAicHJlZmVyZW5jZSINcHV0ICIiIGludG8gY2FyZCBmaWVsZCAi cmVzb3VyY2VOYW1lIiBvZiBjYXJkICJwcmVmZXJlbmNlIg1wdXQgMSBpbnRvIGNhcmQg ZmllbGQgIm1ham9yVmVyc2lvbiIgb2YgY2FyZCAicHJlZmVyZW5jZSINcHV0ICIwMCIg aW50byBjYXJkIGZpZWxkICJtaW5vclZlcnNpb24iIG9mIGNhcmQgInByZWZlcmVuY2Ui DXB1dCAwIGludG8gY2FyZCBmaWVsZCAibGFuZ3VhZ2VDb2RlIiBvZiBjYXJkICJwcmVm ZXJlbmNlIg1wdXQgMCBpbnRvIGNhcmQgZmllbGQgInNjcmlwdENvZGUiIG9mIGNhcmQg InByZWZlcmVuY2UiDXB1dCB0cnVlIGludG8gaW5FZGl0DWlmIHRoZSBmcmVlc2l6ZSBv ZiB0aGlzIHN0YWNrID4gMzI3NjggdGhlbiBkb01lbnUgIkNvbXBhY3QgU3RhY2siDWVu ZCBlbXB0eVN0YWNrDQ0Nb24gRGVsZXRlQWxsIGJrZ25kTmFtZQ1wdXQgbnVtYmVyIG9m IGNhcmRzIGluIGJrZ25kIGJrZ25kTmFtZSBpbnRvIGkNcmVwZWF0IHdoaWxlIGkgPiAx DWdvIGNhcmQgaSBvZiBia2duZCBia2duZE5hbWUNZG9NZW51ICJEZWxldGUgQ2FyZCIN c3VidHJhY3QgMSBmcm9tIGkNZW5kIHJlcGVhdA1lbmQgRGVsZXRlQWxsDQ0AdGVBbGwN DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhwEJLR0QAAA48 AAAAAAAAAAAAAAAAAAAABAAAE8AAAByvAAAAAQAAAAAAAAAAAAAAb24gTG9jYWxpemF0 aW9uIG91dE9ubHkNZ2xvYmFsIHRyYW5zbGF0aW9uVGFibGUNcHV0ICIiIGludG8gdHJh bnNsYXRpb25UYWJsZQ1pZiBub3Qgb3V0T25seSB0aGVuDWFuc3dlciBmaWxlICJEbyB5 b3Ugd2lzaCB0byB1c2UgYSB0cmFuc2xhdGlvbiB0YWJsZSBmaWxlPyIgb2YgdHlwZSB0 ZXh0DWlmIChpdCA8PiAiIikgYW5kIChpdCA8PiAiQ2FuY2VsIikgdGhlbg1wdXQgaXQg aW50byB0aGVGaWxlTmFtZQ1vcGVuIGZpbGUgdGhlRmlsZU5hbWUNcmVwZWF0IGZvcmV2 ZXINcmVhZCBmcm9tIGZpbGUgdGhlRmlsZU5hbWUgZm9yIDE2Mzg0DWlmIGl0IGlzIGVt cHR5IHRoZW4gZXhpdCByZXBlYXQNcHV0IGl0IGFmdGVyIHRyYW5zbGF0aW9uVGFibGUN ZW5kIHJlcGVhdA1jbG9zZSBmaWxlIHRoZUZpbGVOYW1lDWVuZCBpZg1pZiB0cmFuc2xh dGlvblRhYmxlIDw+ICIiIHRoZW4NYW5zd2VyICJEbyB5b3Ugd2FudCB0byBjb25maXJt IGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCBzdHJpbmc/IiB3aXRoICJDYW5jZWwiIG9y ICJObyIgb3IgIlllcyINaWYgaXQgPSAiQ2FuY2VsIiB0aGVuDXB1dCAiIiBpbnRvIHRy YW5zbGF0aW9uVGFibGUNZXhpdCB0byBIeXBlckNhcmQNZWxzZQ1wdXQgaXQgaW50byBv dXRPbmx5DWVuZCBpZg1lbmQgaWYNZW5kIGlmDXJlcGVhdCB3aXRoIGkgPSAyIHRvIG51 bWJlciBvZiBjYXJkcyBpbiBia2duZCAiZXZlbnRzIg1pZiBub3QgaGlsaXRlIG9mIGJr Z25kIGJ1dHRvbiAiZnJvbSBBRVVUIiBvZiBjYXJkIGkgb2YgYmtnbmQgImV2ZW50cyIg dGhlbg1UcmFuc2xhdGVGaWVsZCBvdXRPbmx5LCJldmVudHMiLGksImV2ZW50TmFtZSIN VHJhbnNsYXRlRmllbGQgb3V0T25seSwiZXZlbnRzIixpLCJldmVudENvbW1lbnQiDVRy YW5zbGF0ZUdyb3VwIG91dE9ubHksNSwiZXZlbnRzIixpLCJwYXJhbUluZm8iDWVuZCBp Zg1lbmQgcmVwZWF0DXJlcGVhdCB3aXRoIGkgPSAyIHRvIG51bWJlciBvZiBjYXJkcyBp biBia2duZCAiY2xhc3MiDWlmIG5vdCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJmcm9t IEFFVVQiIG9mIGNhcmQgaSBvZiBia2duZCAiY2xhc3MiIHRoZW4NVHJhbnNsYXRlRmll bGQgb3V0T25seSwiY2xhc3MiLGksImNsYXNzTmFtZSINVHJhbnNsYXRlRmllbGQgb3V0 T25seSwiY2xhc3MiLGksImNsYXNzQ29tbWVudCINVHJhbnNsYXRlR3JvdXAgb3V0T25s eSw1LCJjbGFzcyIsaSwicHJvcEluZm8iDWVuZCBpZg1lbmQgcmVwZWF0DXJlcGVhdCB3 aXRoIGkgPSAyIHRvIG51bWJlciBvZiBjYXJkcyBpbiBia2duZCAiY29tcGFyaXNvbiIN aWYgbm90IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgb2YgY2FyZCBp IG9mIGJrZ25kICJjb21wYXJpc29uIiB0aGVuDVRyYW5zbGF0ZUZpZWxkIG91dE9ubHks ImNvbXBhcmlzb24iLGksImNvbXBhcmVOYW1lIg1UcmFuc2xhdGVGaWVsZCBvdXRPbmx5 LCJjb21wYXJpc29uIixpLCJjb21wYXJlQ29tbWVudCINZW5kIGlmDWVuZCByZXBlYXQN cmVwZWF0IHdpdGggaSA9IDIgdG8gbnVtYmVyIG9mIGNhcmRzIGluIGJrZ25kICJlbnVt ZXJhdGlvbiINaWYgbm90IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIg b2YgY2FyZCBpIG9mIGJrZ25kICJlbnVtZXJhdGlvbiIgdGhlbg1UcmFuc2xhdGVHcm91 cCBvdXRPbmx5LDMsImVudW1lcmF0aW9uIixpLCJlbnVtSW5mbyINZW5kIGlmDWVuZCBy ZXBlYXQNZ28gY2QgIm1haW5NZW51Ig1QdXRTY3JhdGNoIHRyYW5zbGF0aW9uVGFibGUs ICJUcmFuc2xhdGlvbiB0YWJsZSINaWYgb3V0T25seSA8PiAidHJ1ZSIgdGhlbg1Db25z dHJ1Y3RMaW5rDWVuZCBpZg1wdXQgIiIgaW50byB0cmFuc2xhdGlvblRhYmxlDWVuZCBM b2NhbGl6YXRpb24NDW9uIFRyYW5zbGF0ZUZpZWxkIG91dE9ubHksIGJrZ25kTmFtZSwg Y2FyZE5vLCBmaWVsZE5hbWUNcHV0ICJmaWVsZCIgJiYgcXVvdGUgJiBmaWVsZE5hbWUg JiBxdW90ZSAmJiAib2YgY2FyZCIgJiYgY2FyZE5vIMINJiYgIm9mIGJrZ25kIiAmJiBx dW90ZSAmIGJrZ25kTmFtZSAmIHF1b3RlIGludG8gY2h1bmtOYW1lDXB1dCB2YWx1ZSBv ZiBjaHVua05hbWUgaW50byBjaHVua1ZhbHVlDWlmIGNodW5rVmFsdWUgaXMgbm90IGVt cHR5IHRoZW4NaWYgb3V0T25seSA9ICJ0cnVlIiB0aGVuDXNldCBjdXJzb3IgdG8gYnVz eQ1VcGRhdGVUYWJsZSBjaHVua1ZhbHVlLCBjaHVua1ZhbHVlICYgIidzIHRyYW5zbGF0 aW9uIg1lbHNlDXB1dCBUcmFuc2xhdGVUaGlzKGNodW5rVmFsdWUpIGludG8gaXQNaWYg b3V0T25seSA9ICJubyIgdGhlbiAtLSB3ZSBkbyBub3QgbmVlZCB0byBjb25maXJtDWlm IGl0IDw+ICJAIyQlIiB0aGVuIC0tIHdlIGhhdmUgYSB0cmFuc2xhdGlvbg1pZiBpdCA8 PiAiY2h1bmtWYWx1ZSIgdGhlbiAtLSB0aGUgdmFsdWUgaXMgY2hhbmdlZA1kbyAicHV0 IGl0IGludG8iICYmIGNodW5rTmFtZSAtLSB3cml0ZSBpdCBiYWNrDWVuZCBpZg1leGl0 IFRyYW5zbGF0ZUZpZWxkIC0tIGRvbmUNZW5kIGlmDWVuZCBpZg1wdXQgaXQgaW50byBv bGRUcmFucw1pZiBpdCA9ICJAIyQlIiB0aGVuIC0tIHdlIGRvIG5vdCBoYXZlIGEgdHJh bnNsYXRpb24NcHV0IGNodW5rVmFsdWUgaW50byBpdA1lbmQgaWYNYXNrICJUcmFuc2xh dGUiICYmIHF1b3RlICYgY2h1bmtWYWx1ZSAmIHF1b3RlICYmICJ0bzoiIHdpdGggaXQN aWYgdGhlIHJlc3VsdCA9ICJDYW5jZWwiIHRoZW4NQ29uc3RydWN0TGluaw1leGl0IHRv IEh5cGVyQ2FyZA1lbHNlDWRvICJwdXQgaXQgaW50byIgJiYgY2h1bmtOYW1lDWlmIChv bGRUcmFucyA8PiBpdCkgYW5kIChjaHVua1ZhbHVlIDw+IGl0KSB0aGVuIC0tIHRoaXMg aXMgYSBuZXcgdHJhbnNsYXRpb24sIHVwZGF0ZSB0YWJsZQ1VcGRhdGVUYWJsZSBjaHVu a1ZhbHVlLCBpdA1lbmQgaWYNZW5kIGlmDWVuZCBpZg1lbmQgaWYNZW5kIFRyYW5zbGF0 ZUZpZWxkDQ1vbiBUcmFuc2xhdGVHcm91cCBvdXRPbmx5LCBjb21tZW50SXRlbSxia2du ZE5hbWUsIGNhcmRObywgZmllbGROYW1lDXB1dCAiZmllbGQiICYmIHF1b3RlICYgZmll bGROYW1lICYgcXVvdGUgJiYgIm9mIGNhcmQiICYmIGNhcmRObyDCDSYmICJvZiBia2du ZCIgJiYgcXVvdGUgJiBia2duZE5hbWUgJiBxdW90ZSBpbnRvIGNodW5rTmFtZQ1wdXQg dmFsdWUgb2YgY2h1bmtOYW1lIGludG8gcGFyYW1JbmZvDXJlcGVhdCB3aXRoIGkgPSAx IHRvIG51bWJlciBvZiBsaW5lcyBpbiBwYXJhbUluZm8NcHV0IGxpbmUgaSBvZiBwYXJh bUluZm8gaW50byB0aGlzUGFyYW0NcHV0IGl0ZW0gMSBvZiB0aGlzUGFyYW0gaW50byBp dHNOYW1lDXB1dCBpdGVtIDEgdG8gKGNvbW1lbnRJdGVtLTEpIG9mIHRoaXNQYXJhbSBp bnRvIG5ld1BhcmFtDWRlbGV0ZSBpdGVtIDEgdG8gKGNvbW1lbnRJdGVtLTEpIG9mIHRo aXNQYXJhbQ1pZiBpdHNOYW1lIDw+ICIiIHRoZW4NcHV0IFRyYW5zbGF0ZVN0cmluZyhv dXRPbmx5LGl0c05hbWUpIGludG8gaXRlbSAxIG9mIG5ld1BhcmFtDWVuZCBpZg1pZiB0 aGlzUGFyYW0gPD4gIiIgdGhlbg1wdXQgIiwiICYgVHJhbnNsYXRlU3RyaW5nKG91dE9u bHksdGhpc1BhcmFtKSBhZnRlciBuZXdQYXJhbQ1lbHNlDXB1dCAiLCIgYWZ0ZXIgbmV3 UGFyYW0NZW5kIGlmDXB1dCBuZXdQYXJhbSBpbnRvIGxpbmUgaSBvZiBwYXJhbUluZm8N ZW5kIHJlcGVhdA1pZiBvdXRPbmx5IDw+ICJ0cnVlIiB0aGVuDWRvICJwdXQgcGFyYW1J bmZvIGludG8iICYmIGNodW5rTmFtZQ1lbmQgaWYNZW5kIFRyYW5zbGF0ZUdyb3VwDQ1m dW5jdGlvbiBUcmFuc2xhdGVTdHJpbmcgb3V0T25seSwgc3RyaW5nDWlmIG91dE9ubHkg PSAidHJ1ZSIgdGhlbg1zZXQgY3Vyc29yIHRvIGJ1c3kNVXBkYXRlVGFibGUgc3RyaW5n LCBzdHJpbmcgJiAiJ3MgdHJhbnNsYXRpb24iDXJldHVybiBzdHJpbmcNZWxzZQ1wdXQg VHJhbnNsYXRlVGhpcyhzdHJpbmcpIGludG8gaXQNaWYgb3V0T25seSA9ICJubyIgdGhl biAtLSB3ZSBkbyBub3QgbmVlZCB0byBjb25maXJtDWlmIGl0IDw+ICJAIyQlIiB0aGVu IC0tIHdlIGhhdmUgYSB0cmFuc2xhdGlvbg1yZXR1cm4gaXQgLS0gZG9uZQ1lbmQgaWYN ZW5kIGlmDXB1dCBpdCBpbnRvIG9sZFRyYW5zDWlmIGl0ID0gIkAjJCUiIHRoZW4gLS0g d2UgZG8gbm90IGhhdmUgYSB0cmFuc2xhdGlvbg1wdXQgc3RyaW5nIGludG8gaXQNZW5k IGlmDWFzayAiVHJhbnNsYXRlIiAmJiBxdW90ZSAmIHN0cmluZyAmIHF1b3RlICYmICJ0 bzoiIHdpdGggaXQNaWYgdGhlIHJlc3VsdCA9ICJDYW5jZWwiIHRoZW4NQ29uc3RydWN0 TGluaw1leGl0IHRvIEh5cGVyQ2FyZA1lbHNlDWlmIChvbGRUcmFucyA8PiBpdCkgYW5k IChzdHJpbmcgPD4gaXQpIHRoZW4gLS0gdGhpcyBpcyBhIG5ldyB0cmFuc2xhdGlvbiwg dXBkYXRlIHRhYmxlDVVwZGF0ZVRhYmxlIHN0cmluZywgaXQNZW5kIGlmDXJldHVybiBp dA1lbmQgaWYNZW5kIGlmDWVuZCBUcmFuc2xhdGVTdHJpbmcNDWZ1bmN0aW9uIFRyYW5z bGF0ZVRoaXMgc3RyaW5nDWdsb2JhbCB0cmFuc2xhdGlvblRhYmxlDWlmIHRyYW5zbGF0 aW9uVGFibGUgPD4gIiIgdGhlbg1wdXQgU2VhcmNoKHRyYW5zbGF0aW9uVGFibGUsIHN0 cmluZyAmIHJldHVybiwgdHJ1ZSwgdHJ1ZSkgaW50byBsaW5lTGlzdA1wdXQgbnVtYmVy IG9mIGxpbmVzIGluIGxpbmVMaXN0IGludG8gbg1yZXBlYXQgd2l0aCBpID0gMSB0byBu DXB1dCBpdGVtIDEgb2YgbGluZSBpIG9mIGxpbmVMaXN0IGludG8gag1pZiAoaiBtb2Qg MikgPSAxIHRoZW4NaWYgbGluZSBqIG9mIHRyYW5zbGF0aW9uVGFibGUgPSBzdHJpbmcg dGhlbg1yZXR1cm4gbGluZSBqKzEgb2YgdHJhbnNsYXRpb25UYWJsZQ1lbmQgaWYNZW5k IGlmDWVuZCByZXBlYXQNZW5kIGlmDXJldHVybiAiQCMkJSINZW5kIFRyYW5zbGF0ZVRo aXMNDW9uIFVwZGF0ZVRhYmxlIHNvdXJjZSx0cmFuc2xhdGlvbg1nbG9iYWwgdHJhbnNs YXRpb25UYWJsZQ1wdXQgU2VhcmNoKHRyYW5zbGF0aW9uVGFibGUsIHNvdXJjZSAmIHJl dHVybiwgdHJ1ZSwgdHJ1ZSkgaW50byBsaW5lTGlzdA1wdXQgbnVtYmVyIG9mIGxpbmVz IGluIGxpbmVMaXN0IGludG8gbg1yZXBlYXQgd2l0aCBpID0gMSB0byBuDXB1dCBpdGVt IDEgb2YgbGluZSBpIG9mIGxpbmVMaXN0IGludG8gag1pZiAoaiBtb2QgMikgPSAxIHRo ZW4NaWYgbGluZSBqIG9mIHRyYW5zbGF0aW9uVGFibGUgPSBzb3VyY2UgdGhlbg0tLSB0 cmFuc2xhdGlvbiBjaGFuZ2VkLCB3ZSB1cGRhdGUgaXQNcHV0IHRyYW5zbGF0aW9uIGlu dG8gbGluZSBqKzEgb2YgdHJhbnNsYXRpb25UYWJsZQ1leGl0IFVwZGF0ZVRhYmxlDWVu ZCBpZg1lbmQgaWYNZW5kIHJlcGVhdA0tLSBuZXcgdHJhbnNsYXRpb24sIHdlIGFkZCB0 byB0aGUgZW5kIG9mIHRoZSB0YWJsZQ1wdXQgc291cmNlICYgcmV0dXJuICYgdHJhbnNs YXRpb24gJiByZXR1cm4gYWZ0ZXIgdHJhbnNsYXRpb25UYWJsZQ1lbmQgVXBkYXRlVGFi bGUNDW9uIENvbnN0cnVjdExpbmsNZ2xvYmFsIGluRWRpdA1wdXQgZmFsc2UgaW50byBp bkVkaXQNcHV0IGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiBpZCA4IG9mIGNhcmQgInByZWZl cmVuY2UiIGludG8gc29ydE5hbWUNcHV0IGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiBpZCAy NiBvZiBjYXJkICJwcmVmZXJlbmNlIiBpbnRvIGNsZWFuRmxhZw1pZiBzb3J0TmFtZSB0 aGVuDXNldCBjdXJzb3IgdG8gYnVzeQ1zb3J0IGJrZ25kICJldmVudHMiIGJ5IFJlc1R5 cGUoZmllbGQgIlN1aXRlQ29kZSIpICYgZmllbGQgImV2ZW50TmFtZSINc2V0IGN1cnNv ciB0byBidXN5DXNvcnQgYmtnbmQgImNsYXNzIiBieSBSZXNUeXBlKGZpZWxkICJTdWl0 ZUNvZGUiKSAmIGZpZWxkICJjbGFzc05hbWUiDXNldCBjdXJzb3IgdG8gYnVzeQ1zb3J0 IGJrZ25kICJjb21wYXJpc29uIiBieSBSZXNUeXBlKGZpZWxkICJTdWl0ZUNvZGUiKSAm IGZpZWxkICJjb21wYXJlTmFtZSINc2V0IGN1cnNvciB0byBidXN5DXNvcnQgYmtnbmQg ImVudW1lcmF0aW9uIiBieSBSZXNUeXBlKGZpZWxkICJTdWl0ZUNvZGUiKSAmIGZpZWxk ICJlbnVtZXJhdGlvbiINZWxzZQ1zb3J0IGJrZ25kICJldmVudHMiIGJ5IGZpZWxkICJT dWl0ZUNvZGUiDXNvcnQgYmtnbmQgImNsYXNzIiBieSBmaWVsZCAiU3VpdGVDb2RlIg1z b3J0IGJrZ25kICJjb21wYXJpc29uIiBieSBmaWVsZCAiU3VpdGVDb2RlIg1zb3J0IGJr Z25kICJlbnVtZXJhdGlvbiIgYnkgZmllbGQgIlN1aXRlQ29kZSINZW5kIGlmDXB1dCBu dW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50byBuDXJlcGVhdCB3 aXRoIGkgPSAyIHRvIG4NZ28gY2FyZCBuIG9mIGJrZ25kICJzdWl0ZUluZm8iDS0tIGNs ZWFyIGV2ZXJ5dGhpbmcNcHV0ICIiIGludG8gZmllbGQgImV2ZW50TGlzdCINcHV0ICIi IGludG8gZmllbGQgImNsYXNzTGlzdCINcHV0ICIiIGludG8gZmllbGQgImNvbXBhcmVM aXN0Ig1wdXQgIiIgaW50byBmaWVsZCAiZW51bUxpc3QiDWVuZCByZXBlYXQNQ2xlYW5U eXBlIGZhbHNlLCAiY2xhc3MiLCJjbGFzc0xpc3QiLCJjbGFzc05hbWUiLCJjbGFzc0lE Ig1DbGVhblR5cGUgZmFsc2UsICJjb21wYXJpc29uIiwiY29tcGFyZUxpc3QiLCJjb21w YXJlTmFtZSIsImNvbXBhcmVJRCINQ2xlYW5UeXBlIGZhbHNlLCAiZW51bWVyYXRpb24i LCJlbnVtTGlzdCIsImVudW1lcmF0aW9uIg1DbGVhblR5cGUgY2xlYW5GbGFnLCAiZXZl bnRzIiwiZXZlbnRMaXN0IiwiZXZlbnROYW1lIiwiZXZlbnRDbGFzcyIsImV2ZW50SUQi DXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50byBpDXB1 dCAiIiBpbnRvIHN1aXRlTGlzdA1yZXBlYXQgd2hpbGUgaSA+IDENZ28gY2FyZCBpIG9m IGJrZ25kICJzdWl0ZUluZm8iDWlmIGZpZWxkICJzdWl0ZUNvZGUiID0gIiIgdGhlbg1k b21lbnUgImRlbGV0ZSBDYXJkIg1lbHNlDXNldCBsb2NrVGV4dCBvZiBmaWVsZCAic3Vp dGVDb2RlIiB0byB0cnVlDXNldCBzdHlsZSBvZiBmaWVsZCAic3VpdGVDb2RlIiB0byBv cGFxdWUNcHV0IGZpZWxkICJzdWl0ZUNvZGUiICYgcmV0dXJuIGJlZm9yZSBzdWl0ZUxp c3QNZW5kIGlmDXN1YnRyYWN0IDEgZnJvbSBpDWVuZCByZXBlYXQNZ28gY2FyZCAibWFp bk1lbnUiDXB1dCBzdWl0ZUxpc3QgaW50byBjYXJkIGZpZWxkICJzdWl0ZUxpc3QiDXB1 dCB0cnVlIGludG8gaW5FZGl0DWVuZCBDb25zdHJ1Y3RMaW5rDQ1vbiBDbGVhblR5cGUg Y2xlYW5GbGFnLCBia2duZE5hbWUsbGlzdE5hbWUsZmllbGROYW1lLElEMSxJRDINcHV0 IG51bWJlciBvZiBjYXJkcyBpbiBia2duZCBia2duZE5hbWUgaW50byBuDXB1dCAiIiBp bnRvIHRoZUxpc3QNcmVwZWF0IHdpdGggaSA9IDIgdG8gbg1zZXQgY3Vyc29yIHRvIGJ1 c3kNZ28gY2FyZCBpIG9mIGJrZ25kIGJrZ25kTmFtZQ1pZiBia2duZE5hbWUgPSAiZXZl bnRzIiB0aGVuDWlmIGNsZWFuRmxhZyB0aGVuDUd1ZXNzUGFyYW1UeXBlDWVuZCBpZg1N YWtlU2NyaXB0VGVtcGxhdGUNZW5kIGlmDXB1dCBmaWVsZCAic3VpdGVDb2RlIiBpbnRv IHN1aXRlQ29kZQ1wdXQgZmllbGQgZmllbGROYW1lIGludG8gY3VyTmFtZQ1pZiBJRDEg PD4gIiIgdGhlbg1wdXQgIiwiICYgUmVzVHlwZShmaWVsZCBJRDEpIGFmdGVyIGN1ck5h bWUNaWYgSUQyIDw+ICIiIHRoZW4NcHV0IFJlc1R5cGUoZmllbGQgSUQyKSBhZnRlciBj dXJOYW1lDWVuZCBpZg1lbmQgaWYNaWYgKHN1aXRlQ29kZSA8PiBzdWl0ZVJ1bikgYW5k IChzdWl0UnVuIDw+ICIiKSB0aGVuDS0tIHdlIGFyZSBkb25lIHdpdGggYSBzdWl0ZQ1Q dXROYW1lTGlzdCBzdWl0ZVJ1bixsaXN0TmFtZSx0aGVMaXN0DXB1dCAiIiBpbnRvIHRo ZUxpc3QNZW5kIGlmDXB1dCBzdWl0ZUNvZGUgaW50byBzdWl0ZVJ1bg1wdXQgY3VyTmFt ZSAmIHJldHVybiBhZnRlciB0aGVMaXN0DWVuZCByZXBlYXQNaWYgbiA+IDEgdGhlbg1Q dXROYW1lTGlzdCBzdWl0ZVJ1bixsaXN0TmFtZSx0aGVMaXN0DWVuZCBpZg1lbmQgQ2xl YW5UeXBlDQ1vbiBQdXROYW1lTGlzdCBzdWl0ZUNvZGUsbGlzdE5hbWUsdGhlTGlzdA1n byBjYXJkICJzdWl0ZSIgJiYgc3VpdGVDb2RlDWlmIHRoZSByZXN1bHQgPD4gIiIgdGhl bg0tLSB3ZSBkb24ndCBoYXZlIG9uZSB5ZXQsIHdlIG5lZWQgdG8gY3JlYXRlIGl0DWdv IGxhc3QgY2FyZCBvZiBia2duZCAic3VpdGVJbmZvIg1kb01lbnUgIm5ldyBjYXJkIg1l bmQgaWYNcHV0IHRoZUxpc3QgaW50byBmaWVsZCBsaXN0TmFtZQ1lbmQgUHV0TmFtZUxp c3QNDW9uIFB1dFNjcmF0Y2ggeCwgaXRzTmFtZQ1pZiBsZW5ndGgoeCkgPj0gMzAwMDAg dGhlbg0tLSB0b28gbXVjaCB0byBiZSBwdXQgaW50byBhIEh5cGVyQ2FyZCBmaWVsZCwg dHJ5IGZpbGUgaW5zdGVhZA1hc2sgZmlsZSAiU2F2ZSB0aGUgZGF0YSB0byBmaWxlIg1p ZiBpdCA8PiAiIiB0aGVuDXB1dCBpdCBpbnRvIHJlZg1vcGVuIGZpbGUgcmVmDXdyaXRl IHggdG8gZmlsZSByZWYNY2xvc2UgZmlsZSByZWYNZWxzZQ1Nb3ZlRGVzY1RvU2NyYXAg eCAtLSBwdXQgaXQgaW50byBzY3JhcCBhcyBhIGxhc3QgcmVzb3J0DWVuZCBpZg1lbHNl DXB1dCB4IGludG8gY2FyZCBmaWVsZCAic2NyYXRjaCINcHV0IGl0c05hbWUgaW50byBj YXJkIGZpZWxkICJwYWROYW1lIg1lbmQgaWYNZW5kIFB1dFNjcmF0Y2gNDQAAAAAAAAAA AAAAAAAAAAAAAAAYAEJLR0QAABPAAAAAAAAAEt9AAAAAAAAAAwAAFdgAAA48ABYAGwAA EHYACAAAAG4AyAACAgQAKQDZADsBhQACAAAAAAAAAAQADAAAABBzdWl0ZU5hbWUAAG9u IE1vdXNlV2l0aGluDWlmICBtZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciB0 aGUgbmFtZSBvZiB0aGlzIHN1aXRlIGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJUaGlz IGlzIHRoZSBuYW1lIG9mIHRoaXMgc3VpdGUuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGlu DQ0AAADSAAMCBAA8ANkAbgH8AAIAAAAAAAAABAAJAAAADHN1aXRlQ29tbWVudAAAb24g TW91c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIGEg Y29tbWVudCBmb3IgdGhpcyBzdWl0ZSBoZXJlLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhp cyBpcyB0aGUgY29tbWVudCBmb3IgdGhpcyBzdWl0ZS4iDWVuZCBpZg1lbmQgTW91c2VX aXRoaW4NDQ0AAAEUAAQCIQCDAAQA3AD9QAcAAAAAAAAABAAJAAAADGV2ZW50TGlzdAAA b24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgdGhlIGxpc3Qgb2YgZXZlbnRz IGZvciB0aGlzIHN1aXRlIGdvZXMgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91 c2V1cA1wdXQgdmFsdWUgb2YgdGhlIGNsaWNrTGluZSBpbnRvIHgNaWYgeCA8PiAiIiB0 aGVuDUhNUmVtb3ZlQmFsbG9vbg1wdXQganVtcCgiZXZlbnQiICYmIGl0ZW0gMiBvZiB4 KSBpbnRvIHZvaWQNZW5kIGlmDWVuZCBtb3VzZXVwAAAiAAUCDAAZAIQAKADZAAAAAAAA //8AFQAMAQAAEAAAAAAAIgAGAgwAKwCZAD0A2QAAAAAAAP//ABUADAEAABAAAAAAACIA BwIMADsAjQBNANoAAAAAAAD//wAVAAwBAAAQAAAAAAAiAAgCDQB0AAQAgwA7AAAAAAAA AAAAFQAMAQAAEAAAAAAAIgAJAgwAdAEDAIMBSwAAAAAAAAAAABUADAEAABAAAAAAARYA CgIhAIMBAwDcAfxABwAAAAAAAAAEAAkAAAAMY2xhc3NMaXN0AABvbiBNb3VzZVdpdGhp bg1TaG93QmFsbG9vbiAiVGhpcyB0aGUgbGlzdCBvZiBjbGFzc2VzIGZvciB0aGlzIHN1 aXRlIGdvZXMgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2V1cA1wdXQgdmFs dWUgb2YgdGhlIGNsaWNrTGluZSBpbnRvIHgNaWYgeCA8PiAiIiB0aGVuDUhNUmVtb3Zl QmFsbG9vbg1wdXQganVtcCgiY2xhc3MiICYmIGl0ZW0gMiBvZiB4KSBpbnRvIHZvaWQN ZW5kIGlmDWVuZCBtb3VzZXVwAAAAIgALAgwA6QAEAPoAaAAAAAAAAAAAABUADAEAABAA AAAAACIADAIMAOkBAwD6AXQAAAAAAAAAAAAVAAwBAAAQAAAAAAEqAA0CIQD5AAQBUQD9 QAcAAAAAAAAABAAJAAAADGNvbXBhcmVMaXN0AABvbiBNb3VzZVdpdGhpbg1TaG93QmFs bG9vbiAiVGhpcyB0aGUgbGlzdCBvZiBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgdGhp cyBzdWl0ZSBnb2VzIGhlcmUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNldXANcHV0 IHZhbHVlIG9mIHRoZSBjbGlja0xpbmUgaW50byB4DWlmIHggPD4gIiIgdGhlbg1ITVJl bW92ZUJhbGxvb24NcHV0IGp1bXAoImNvbXBhcmlzb24iICYmIGl0ZW0gMiBvZiB4KSBp bnRvIHZvaWQNZW5kIGlmDWVuZCBtb3VzZXVwAAABFgAOAiEA+gECAVEB/EAHAAAAAAAA AAQACQAAAAxlbnVtTGlzdAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMg dGhlIGxpc3Qgb2YgZW51bWVyYXRpb25zIGZvciB0aGlzIHN1aXRlIGdvZXMgaGVyZS4i DWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2V1cA1wdXQgdmFsdWUgb2YgdGhlIGNsaWNr TGluZSBpbnRvIHgNaWYgeCA8PiAiIiB0aGVuDUhNUmVtb3ZlQmFsbG9vbg1wdXQganVt cCgiZW51bWVyYXRpb24iICYmIHgpIGludG8gdm9pZA1lbmQgaWYNZW5kIG1vdXNldXAA AAEOAA8BAABxAMgAgQD9oAQAAAAAAAEAAAAMAAAAEE5ld8kAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGFkZCBhIG5ldyBldmVudCB0byB0aGlz IHN1aXRlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBnV2hlcmVG cm9tDWxvY2sgc2NyZWVuDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJvbQ1NYWtl SXRlbSAiZXZlbnRzIg11bmxvY2sgc2NyZWVuIHdpdGggdmlzdWFsIGRpc3NvbHZlIGZh c3QNZW5kIG1vdXNlVXAAAAEMABABAABxAccAgQH8gAQAAAAAAAEAAAAMAAAAEE5ld8kA AG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGFkZCBhIG5l dyBjbGFzcyB0byB0aGlzIHN1aXRlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVw DWdsb2JhbCBnV2hlcmVGcm9tDWxvY2sgc2NyZWVuDXB1c2ggY2QNcG9wIGNkIGludG8g Z1doZXJlRnJvbQ1NYWtlSXRlbSAiY2xhc3MiDXVubG9jayBzY3JlZW4gd2l0aCB2aXN1 YWwgZGlzc29sdmUgZmFzdA1lbmQgbW91c2VVcAABIAARAQAA5wDIAPcA/aAEAAAAAAAB AAAADAAAABBOZXfJAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVy ZSB0byBhZGQgYSBuZXcgY29tcGFyaXNvbiBvcGVyYXRvciB0byB0aGlzIHN1aXRlLiIN ZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBnV2hlcmVGcm9tDWxvY2sg c2NyZWVuDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJvbQ1NYWtlSXRlbSAiY29t cGFyaXNvbiINdW5sb2NrIHNjcmVlbiB3aXRoIHZpc3VhbCBkaXNzb2x2ZSBmYXN0DWVu ZCBtb3VzZVVwAAABGAASAQAA6AHIAPgB/aAEAAAAAAABAAAADAAAABBOZXfJAABvbiBN b3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBhZGQgYSBuZXcgZW51 bWVyYXRpb24gdG8gdGhpcyBzdWl0ZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VV cA1nbG9iYWwgZ1doZXJlRnJvbQ1sb2NrIHNjcmVlbg1wdXNoIGNkDXBvcCBjZCBpbnRv IGdXaGVyZUZyb20NTWFrZUl0ZW0gIkVudW1lcmF0aW9uIg11bmxvY2sgc2NyZWVuIHdp dGggdmlzdWFsIGRpc3NvbHZlIGZhc3QNZW5kIG1vdXNlVXAAACIAEwINABkAAAAzAHAA AAAAAAAAAAAVABgIAAAgAAAAAAFYABQBAABEABYAYwA2IAAAAAOGAAEAAAAMAAAAEAAA b24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhl IG5leHQgc3VpdGUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2V0IHRoZXJl IGlzIGEgY2FyZCAyIG9mIHRoaXMgYmtnbmQNaWYgbm90IGl0IHRoZW4gZXhpdCBtb3Vz ZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBjYXJkIDIgb2YgdGhpcyBia2duZCBpbnRv IHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkIDw+IHggdGhlbg12aXN1YWwg d2lwZSBsZWZ0DWdvIHByZXYgY2FyZCBvZiB0aGlzIGJrZ25kDWVuZCBpZg1lbmQgbW91 c2VVcAAAASAAFQEAAEQAPwBjAF4gAAAAZzkAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhp bg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyB0byB0aGUgcHJldmlvdXMgc3Vp dGUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANcHV0IHRoZSBzaG9ydCBuYW1l IG9mIGxhc3QgY2FyZCBvZiB0aGlzIGJrZ25kIGludG8geA1pZiB0aGUgc2hvcnQgbmFt ZSBvZiB0aGlzIGNhcmQgPD4geCB0aGVuDXZpc3VhbCB3aXBlIHJpZ2h0DWdvIG5leHQg Y2FyZCBvZiB0aGlzIGJrZ25kDWVuZCBpZg1lbmQgbW91c2VVcAAAALgAFwEAAA8BuQA2 AgCgAAAAPtMAAQAAAAwAAAAQUmVzb3VyY2UgVG9vbHMAAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhlIHJlc291cmNlIHRv b2xzIGNhcmQuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ28gY2FyZCAibWFp bk1lbnUiDWVuZCBtb3VzZVVwAAHgABgCBQAWANkAKAEKAAEAAAAAAAAABAAOAQAAElN1 aXRlQ29kZQAAb24gTW91c2VXaXRoaW4NaWYgdGhlIGxvY2t0ZXh0IG9mIG1lIHRoZW4N U2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIGlkIG9mIHRoaXMgc3VpdGUuIg1lbHNlDVNo b3dCYWxsb29uICJFbnRlciBpcyB0aGUgaWQgb2YgdGhpcyBzdWl0ZSBoZXJlLiINZW5k IGlmDWVuZCBNb3VzZVdpdGhpbg0Nb24gZXhpdEZpZWxkDWdldCBtZQ1pZiBpdCBpcyBl bXB0eSB0aGVuDXB1dCBlbXB0eSBpbnRvIHRoZUNvZGUNcmVwZWF0IHdoaWxlIHRoZSBu dW1iZXIgb2YgY2hhcnMgaW4gdGhlQ29kZSA8IDQNYXNrICJQbGVhc2Ugc3VwcGx5IGEg NCBjaGFyYWN0ZXIgc3VpdGUgY29kZToiIHdpdGggdGhlQ29kZQ1wdXQgaXQgaW50byB0 aGVDb2RlDWVuZCByZXBlYXQNcHV0IHRoZUNvZGUgaW50byBmaWVsZCAic3VpdGVDb2Rl Ig1lbmQgaWYNcGFzcyBleGl0RmllbGQNZW5kIGV4aXRGaWVsZA0NAAAFAAwAU3VpdGUg Q29kZToABgAGAE5hbWU6AAcACQBDb21tZW50OgAACAAHAEV2ZW50cwAACQAIAENsYXNz ZXMACwAMAENvbXBhcmlzb25zAAwADQBFbnVtZXJhdGlvbnMAABMACACuU3VpdGVzc3Vp dGVJbmZvAG9uIE1ha2VJdGVtIGl0ZW1UeXBlDXB1dCBmaWVsZCAic3VpdGVDb2RlIiBp bnRvIGN1clN1aXRlQ29kZQ1nbyBsYXN0IGNhcmQgb2YgYmtnbmQgaXRlbVR5cGUNZG9N ZW51ICJOZXcgQ2FyZCINcHV0IGN1clN1aXRlQ29kZSBpbnRvIGZpZWxkICJzdWl0ZUNv ZGUiDWlmIGl0ZW1UeXBlID0gImV2ZW50cyIgdGhlbg1wdXQgY3VyU3VpdGVDb2RlIGlu dG8gZmllbGQgImV2ZW50Q2xhc3MiDWVuZCBpZg1lbmQgTWFrZUl0ZW0NDW9uIE5ld0Nh cmQNc2V0IGxvY2tUZXh0IG9mIGZpZWxkICJzdWl0ZUNvZGUiIHRvIGZhbHNlDXNldCBz dHlsZSBvZiBmaWVsZCAic3VpdGVDb2RlIiB0byByZWN0YW5nbGUNUGFzcyBOZXdDYXJk DWVuZCBOZXdDYXJkDQ1vbiBDbG9zZUNhcmQNZ2xvYmFsIGluRWRpdA1pZiBpbkVkaXQg dGhlbg1wdXQgc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQgaW50byB4DWlmIHN0eWxlIG9m IGZpZWxkICJzdWl0ZUNvZGUiIGlzIHJlY3RhbmdsZSB0aGVuDS0tIGEgbmV3IHN1aXRl LCBhIGJldHRlciBjcml0ZXJpYSBtYXkgYmUgY2FyZCBuYW1lIGlzIGVtcHR5LCBidXQg d2UgaGF2ZSBwcm9ibGVtIHdpdGggdGhhdA1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50 byBuZXdOYW1lDXNldCBsb2NrVGV4dCBvZiBmaWVsZCAic3VpdGVDb2RlIiB0byB0cnVl DXNldCBzdHlsZSBvZiBmaWVsZCAic3VpdGVDb2RlIiB0byBvcGFxdWUNc2V0IHRoZSBu YW1lIG9mIHRoaXMgY2FyZCB0byAoInN1aXRlIiAmJiBuZXdOYW1lKQ1wdXQgbmV3TmFt ZSAmIHJldHVybiBhZnRlciBjYXJkIGZpZWxkICJzdWl0ZUxpc3QiIG9mIGNhcmQgIm1h aW5NZW51Ig1lbmQgaWYNZW5kIGlmDVBhc3MgQ2xvc2VDYXJkDWVuZCBDbG9zZUNhcmQN DW9uIGRvTWVudSBpdGVtLG1lbnUNaWYgKChpdGVtID0gImRlbGV0ZSBjYXJkIikgb3Ig KGl0ZW0gPSAiY3V0IGNhcmQiKSkgYW5kIChpZCBvZiB0aGlzIGJrZ25kID0gNTA1Nikg dGhlbg1nbG9iYWwgaW5FZGl0DWlmIGluRWRpdCB0aGVuDXB1dCBmYWxzZSBpbnRvIGlu RWRpdA1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBzdWl0ZUNvZGUNcHV0IGNhcmQg ZmllbGQgInN1aXRlTGlzdCIgb2YgY2FyZCAibWFpbk1lbnUiIGludG8geA1wdXQgbnVt YmVyIG9mIGxpbmVzIGluIHggaW50byBuDXJlcGVhdCB3aXRoIGkgPSAxIHRvIG4NaWYg bGluZSBpIG9mIHggPSBzdWl0ZUNvZGUgdGhlbg1kZWxldGUgbGluZSBpIG9mIHgNcHV0 IHggaW50byBjYXJkIGZpZWxkICJzdWl0ZUxpc3QiIG9mIGNhcmQgIm1haW5NZW51Ig1l eGl0IHJlcGVhdA1lbmQgaWYNZW5kIHJlcGVhdA1wdXNoIGNhcmQNRGVsZXRlU3VpdGUg ImV2ZW50cyIsc3VpdGVDb2RlDURlbGV0ZVN1aXRlICJjbGFzcyIsc3VpdGVDb2RlDURl bGV0ZVN1aXRlICJjb21wYXJpc29uIixzdWl0ZUNvZGUNRGVsZXRlU3VpdGUgImVudW1l cmF0aW9uIixzdWl0ZUNvZGUNcG9wIGNhcmQNcHV0IHRydWUgaW50byBpbkVkaXQNZW5k IGlmDWVuZCBpZg1wYXNzIGRvTWVudQ1lbmQgZG9NZW51DQ1vbiBEZWxldGVTdWl0ZSBi a2duZE5hbWUsc3VpdGVDb2RlDXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgYmtn bmROYW1lIGludG8gaQ1yZXBlYXQgd2hpbGUgaSA+IDENZ28gY2FyZCBpIG9mIGJrZ25k IGJrZ25kTmFtZQ1pZiBmaWVsZCAic3VpdGVDb2RlIiA9IHN1aXRlQ29kZSB0aGVuDWRv TWVudSAiRGVsZXRlIENhcmQiDWVuZCBpZg1zdWJ0cmFjdCAxIGZyb20gaQ1lbmQgcmVw ZWF0DWVuZCBEZWxldGVTdWl0ZQ0NAAAAAAAAAAAAAAAAAAAA4EJNQVAAABLfAAAAAAAA AAAAAQAAAAAAAAFWAgAAAAAAAVYCAAAYAAABUwH+AAAAAAAAAAAAAAAAAAAAnADC//// /////////////////OOFih8C4x8D47mGiQDCVVVVVVVVVVVVVVVVVVVVVeMAwiqqqqqq qqqqqqqqqqqqqqrjv4G/gbKB4R8E4R8I4R8C4R8Ev4a/hrWGjhGA4S0CAeEeBI0RgOEt AQHhHgK+gYnhHwThHwjhHwLhHwS/hr+GtYaOEYDhLQIB4R4EjRGA4S0BAeEeAgdwAHcA AFoAAFXAQktHRAAAFdgAAAAAAAAWpkAAAAAAAAAQAAAYZAAAE8AAMwA+AAAyvgAIAAAA ZAB+AAECBAAcAI4AMAC/AAIAAAAAAAEABAAOAQAAElN1aXRlQ29kZQAAb24gTW91c2VX aXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgZXZlbnQgYmVsb25ncyB0byB0aGlzIHN1aXRl IGNvZGUuIg1lbmQgTW91c2VXaXRoaW4AAADGAAICBABAAFkAUwEJAAIAAAAAAAAABAAM AAAAEEV2ZW50TmFtZQAAb24gTW91c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hv d0JhbGxvb24gIkVudGVyIHRoZSBuYW1lIG9mIHRoaXMgZXZlbnQgaGVyZS4iDWVsc2UN U2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIG5hbWUgb2YgdGhpcyBldmVudC4iDWVuZCBp Zg1lbmQgTW91c2VXaXRoaW4NAAB+AAMCBAAcAP0AMAEuAAIAAAAAAAAABAAOAQAAEkV2 ZW50Q2xhc3MAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBl dmVudCBjbGFzcyBvZiB0aGUgZXZlbnQuIg1lbmQgTW91c2VXaXRoaW4AAADAAAQCBABA AUoAUwF4AAIAAAAAAAAABAAMAAAAEEV2ZW50SUQAAG9uIE1vdXNlV2l0aGluDWlmICBt ZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciB0aGUgSUQgb2YgdGhpcyBldmVu dCBoZXJlLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhpcyBpcyB0aGUgSUQgb2YgdGhpcyBl dmVudC4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4NAADUAAUCBABVAFkAhQH7AAcAAAAA AAAABAAJAAAADEV2ZW50Q29tbWVudAAAb24gTW91c2VXaXRoaW4NaWYgIG1lIGlzICIi IHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIGEgY29tbWVudCBhYm91dCB0aGlzIGV2ZW50 IGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIGlzIGEgY29tbWVudCBhYm91dCB0 aGlzIGV2ZW50LiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0NDQAAAMoABgIFALMAQgDG ARkAAgAAAAAAAAADAAwAAAAQRXZQYXJhbU5hbWUAAG9uIE1vdXNlV2l0aGluDWlmICBt ZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciBhIHRoZSBuYW1lIGZvciB0aGlz IGV2ZW50IGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBuYW1lIG9m IHRoaXMgZXZlbnQuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluAADKAAcCBQCzAXsAxgGh AAIAAAAAAAEABAAMAAAAEAAAb24gTW91c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4N U2hvd0JhbGxvb24gIkVudGVyIGEga2V5d29yZCBpZCBmb3IgdGhlIHBhcmFtZXRlci4i DWVsc2UNU2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIGtleXdvcmQgaWQgZm9yIHRoZSBw YXJhbWV0ZXIuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluDQABKAAIAgQAswHTAMYB/QAC AAAAAAABAAQADAAAABAAAG9uIE1vdXNlV2l0aGluDWlmICBtZSBpcyAiIiB0aGVuDVNo b3dCYWxsb29uICJFbnRlciBhIGRhdGEgdHlwZSBmb3IgdGhlIHBhcmFtZXRlci4iDWVs c2UNaWYgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiRW51bSIgdGhlbg1TaG93QmFsbG9v biAiVGhlIHBhcmFtZXRlciBpcyBhbiBlbnVtZXJhdG9yLiINZWxzZQ1TaG93QmFsbG9v biAiVGhlIGlzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlci4iDWVuZCBpZg1l bmQgaWYNZW5kIE1vdXNlV2l0aGluDQ0AAADOAAkCBAD4AGQBUwH5AAcAAAAAAAAABAAJ AAAADAAAb24gTW91c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24g IkVudGVyIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGFyYW1ldGVyLiINZWxzZQ1TaG93 QmFsbG9vbiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGFyYW1ldGVy LiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbgAAACoACgKEAS8ARwFWAfsABwAAAAAAAAAD AAwAAAAQcGFyYW1JbmZvAAAAANYACwEAAB8AYwAxAI+gAAAAAAAAAQAAAAwAAAAQU3Vp dGU6AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSBpZiB5b3Ug d2FudCB0byBnbyB0aGUgc3VpdGUiICYmIGZpZWxkICJzdWl0ZUNvZGUiDWVuZCBNb3Vz ZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQganVtcCgic3VpdGUiICYmIGZpZWxkIHN1aXRl Q29kZSkgaW50byB2b2lkDWVuZCBtb3VzZVVwAAAiAA8CDQBCAB4AUwBaAAAAAAAA//8A FQAMAQAAEAAAAAAAIgARAgwAQgERAFIBSwAAAAAAAP//ABUADAEAABAAAAAAACIAEgIN AFQABQBkAFoAAAAAAAD//wAVAAwBAAAQAAAAAAAiABMCDACbAAIArABXAAAAAAAA//8A FQAMAQAAEAAAAAAAIgAUAg0AtQAEAMYAQwAAAAAAAP//ABUADAEAABAAAAAAACIAFQIN ALUBLQDGAXwAAAAAAAD//wAVAAwBAAAQAAAAAAAiABcCDQD3AAsBCQBlAAAAAAAA//8A FQAMAQAAEAAAAAABNAAYAQAAtAGtAMUB06AAAAAAAAABABUADAEAABBUeXBlAABvbiBN b3VzZVdpdGhpbg1pZiBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJFbnVtIiB0aGVuDVNo b3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIHRvIHRoZSBlbnVtZXJhdGlvbiIgJiYg KGZpZWxkIGlkIDgpICYgIi4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNl VXANaWYgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZW51bSIgdGhlbg1ITVJlbW92ZUJh bGxvb24NZ28gY2FyZCAiZW51bWVyYXRpb24iICYmIChmaWVsZCBpZCA4KQ1lbmQgaWYN ZW5kIG1vdXNlVXAAAADWABkBAADdAAYA8ABRgAUAAAAAAAEAAAAMAAAAEE9wdGlvbmFs AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhp cyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgb3IgcmVxdWlyZWQuIg1lbmQgTW91c2VXaXRo aW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUg b2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAA3gAaAQAAygAGANwANYAFAAAAAAABAAAADAAA ABBMaXN0AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiSWYgdGhpcyBpcyBvbiwg dGhlbiB0aGUgcGFyYW1ldGVyIGlzIGEgbGlzdCBvZiIgwg0mJiBmaWVsZCBpZCA4ICYg Ii4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdl dCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAA9gAbAQAAygBk ANwAnoAFAAAAAAABAAAADAAAABBFbnVtAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9v biAiSWYgdGhpcyBpcyBvbiwgdGhlbiB0aGUgcGFyYW1ldGVyIGlzIGFuIGVudW1lcmF0 ZWQgd2l0aCBlbnVtZXJhdGlvbiBpZCIgwg0mJiBmaWVsZCBpZCA4ICYgIi4iDWVuZCBN b3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3Qg KGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAABQAAcAQAA3QBkAPAA0oAFAAAA AAABAAAADAAAABBSZXNlcnZlZAAAb24gTW91c2VXaXRoaW4NaWYgdGhlIHNob3J0IG5h bWUgb2YgbWUgaXMgIlJlc2VydmVkIiB0aGVuDVNob3dCYWxsb29uICJUaGlzIGlzIHJl c2VydmVkIGZvciBmdXR1cmUgdXNlLiINZWxzZQ1TaG93QmFsbG9vbiAiSW5kaWNhdGVz IHdoZXRoZXIgdGhpcyBldmVudCBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgdGFyZ2V0 LiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9m IHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAC2AB0B AADeAS8A7wFAAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxv b24gIlRoaXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRo aW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUg b2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAALYAHgEAAN4BQADvAVEABQAAAAAAAQAAAAwA AAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBm b3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGls aXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVw AAAAtgAfAQAA3gFRAO8BYgAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJUaGlzIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1v dXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAo aGlsaXRlIG9mIHRhcmdldCkNZW5kIG1vdXNlVXAAAAC2ACABAADeAWIA7wFzAAUAAAAA AAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgcmVz ZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXAN c2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUgb2YgdGFyZ2V0KQ1lbmQg bW91c2VVcAAAALYAIQEAAN4BcwDvAYQABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdp dGhpbg1TaG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4i DWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0 byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAAtgAiAQAA3gGEAO8B lQAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlz IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBt b3VzZVVwDXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdl dCkNZW5kIG1vdXNlVXAAAAC2ACMBAADeAZUA7wGmAAUAAAAAAAEAAAAMAAAAEAAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVy ZSB1c2UuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0 YXJnZXQgdG8gbm90IChoaWxpdGUgb2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAALYAJAEA AN4BpgDvAbcABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9v biAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhp bg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBv ZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAAtgAlAQAA3gG3AO8ByAAFAAAAAAABAAAADAAA ABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHJlc2VydmVkIGZv ciBmdXR1cmUgdXNlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxp dGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdldCkNZW5kIG1vdXNlVXAA AAD6ACYBAADeAcgA7wHZAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hv d0JhbGxvb24gIlRoaXMgaXMgcmVzZXJ2ZWQsIGJ1dCBoZXJlIHdlIGFyZSB1c2luZyBp dCB0byBkZW5vdGUgdGhlIGRhdGEgdHlwZSBpbiBQYXNjYWwvQy4iDWVuZCBNb3VzZVdp dGhpbg0Nb24gbW91c2VEb3duDS0tc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90ICho aWxpdGUgb2YgdGFyZ2V0KQ1DaG9vc2VQYXJhbVR5cGUNZW5kIG1vdXNlRG93bgAA+gAn AQAA3gHZAO8B6gAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxs b29uICJUaGlzIGlzIHJlc2VydmVkLCBidXQgaGVyZSB3ZSBhcmUgdXNpbmcgaXQgdG8g ZGVub3RlIHRoZSBkYXRhIHR5cGUgaW4gUGFzY2FsL0MuIg1lbmQgTW91c2VXaXRoaW4N DW9uIG1vdXNlRG93bg0tLXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRl IG9mIHRhcmdldCkNQ2hvb3NlUGFyYW1UeXBlDWVuZCBtb3VzZURvd24AAPoAKAEAAN4B 6gDvAfsABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAi VGhpcyBpcyByZXNlcnZlZCwgYnV0IGhlcmUgd2UgYXJlIHVzaW5nIGl0IHRvIGRlbm90 ZSB0aGUgZGF0YSB0eXBlIGluIFBhc2NhbC9DLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBt b3VzZURvd24NLS1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0 YXJnZXQpDUNob29zZVBhcmFtVHlwZQ1lbmQgbW91c2VEb3duAAIOACkBAACYAM4ArAEE oAIAAAAAAAEAAAAMAAAAEE5leHQgPgAAb24gTW91c2VXaXRoaW4NcHV0IGZpZWxkICJj dXJQYXJhbSIgaW50byBjdXJyZW50UGFyYW0NaWYgY3VycmVudFBhcmFtID0gMSB0aGVu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdldCB0aGUgZGlyZWN0IHBhcmFtZXRl ci4iDWVsc2UgaWYgbGluZSAoY3VycmVudFBhcmFtKzEpIG9mIGJrZ25kIGZpZWxkIGlk IDEwIDw+ICIiIHRoZW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ2V0IHRoZSBu ZXh0IHBhcmFtZXRlci4iDWVsc2UNU2hvd0JhbGxvb24gIlRoZXJlIGlzIG5vIG5leHQg cGFyYW1ldGVyLiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQg ZmllbGQgY3VyUGFyYW0gaW50byBjdXJyZW50UGFyYW0NaWYgbGluZSAoY3VycmVudFBh cmFtKzEpIG9mIGJrZ25kIGZpZWxkIGlkIDEwIDw+ICIiIHRoZW4NU2F2ZVBhcmFtDVNo b3dQYXJhbSBjdXJyZW50UGFyYW0rMQ1lbHNlDWJlZXANZW5kIGlmDWVuZCBtb3VzZVVw AAACPAAqAQAAmACVAKwAy6ACAAAAAAABAAAADAAAABA8IFByZXYAAG9uIE1vdXNlV2l0 aGluDXB1dCBmaWVsZCAiY3VyUGFyYW0iIGludG8gY3VycmVudFBhcmFtDWlmIGN1cnJl bnRQYXJhbSA9IDEgdGhlbg1TaG93QmFsbG9vbiAiVGhlcmUgaXMgbm8gcHJldmlvdXMg cGFyYW1ldGVyLiINZWxzZSBpZiBjdXJyZW50UGFyYW0gPSAyIHRoZW4NU2hvd0JhbGxv b24gIkNsaWNrIGhlcmUgdG8gZ2V0IHRoZSByZXN1bHQgcGFyYW1ldGVyLiINZWxzZSBp ZiBjdXJyZW50UGFyYW0gPSAzIHRoZW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8g Z2V0IHRoZSBkaXJlY3QgcGFyYW1ldGVyLiINZWxzZQ1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBnZXQgdGhlIHByZXZpb3VzIHBhcmFtZXRlci4iDWVuZCBpZg1lbmQgTW91 c2VXaXRoaW4NDW9uIG1vdXNlVXANcHV0IGZpZWxkICJjdXJQYXJhbSIgaW50byBjdXJy ZW50UGFyYW0NaWYgY3VycmVudFBhcmFtID4gMSB0aGVuDVNhdmVQYXJhbQ1TaG93UGFy YW0gY3VycmVudFBhcmFtLTENSE1SZW1vdmVCYWxsb29uDWVsc2UNYmVlcA1lbmQgaWYN ZW5kIG1vdXNlVXAAAAEyACsBAACYAFcArACNoAQAAAAAAAEAAAAMAAAAEE5ldwAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gYWRkIGEgbmV3IHBh cmFtZXRlci4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQgZmllbGQgImN1 clBhcmFtIiBpbnRvIGN1cnJlbnRQYXJhbQ1TYXZlUGFyYW0NcHV0IDEgKyBudW1iZXIg b2YgbGluZXMgb2YgYmtnbmQgZmllbGQgaWQgMTAgaW50byBuDXB1dCAiLD8/Pz8sPz8/ PywwLCIgaW50byBsaW5lIG4gb2YgYmtnbmQgZmllbGQgaWQgMTANU2hvd1BhcmFtIG4N ZW5kIG1vdXNlVXAAAALAACwBAACYAVoArAGQoAQAAAAAAAEAAAAMAAAAEERlbGV0ZQAA b24gTW91c2VXaXRoaW4NcHV0IGZpZWxkICJjdXJQYXJhbSIgaW50byBjdXJyZW50UGFy YW0NaWYgY3VycmVudFBhcmFtIDw9IDIgdGhlbg1TaG93QmFsbG9vbiAiVG8gZGVsZXRl IHRoZSBkaXJlY3QvcmVzdWx0IHBhcmFtZXRlciwgY2hhbmdlIGRhdGEgdHlwZSB0byBu dWxsIHJhdGhlciB0aGFuIGNsaWNraW5nIGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJD bGljayBoZXJlIHRvIGRlbGV0ZSB0aGlzIHBhcmFtZXRlci4iDWVuZCBpZg1lbmQgTW91 c2VXaXRoaW4NDW9uIG1vdXNlVXANYW5zd2VyICJEZWxldGUgdGhpcyBwYXJhbWV0ZXI/ IiB3aXRoICJPSyIgb3IgIkNhbmNlbCINaWYgaXQgaXMgIkNhbmNlbCIgdGhlbiBleGl0 IG1vdXNlVXANcHV0IGZpZWxkICJjdXJQYXJhbSIgaW50byBjdXJyZW50UGFyYW0NaWYg Y3VycmVudFBhcmFtID4gMiB0aGVuDWRlbGV0ZSBsaW5lIGN1cnJlbnRQYXJhbSBvZiBi a2duZCBmaWVsZCBpZCAxMA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGJrZ25kIGZpZWxk IGlkIDEwIGludG8gbg1pZiBjdXJyZW50UGFyYW0gPiBuIHRoZW4Nc3VidHJhY3QgMSBm cm9tIGN1cnJlbnRQYXJhbQ1lbmQgaWYNU2hvd1BhcmFtIGN1cnJlbnRQYXJhbQ1lbHNl DXB1dCAibnVsbCIgaW50byBia2duZCBmaWVsZCBpZCA4DWVuZCBpZg1lbmQgbW91c2VV cAAAAVIALQEAAJgBHACsAVKgBAAAAAAAAQAAAAwAAAAQSW5zZXJ0AABvbiBNb3VzZVdp dGhpbg1TaG93QmFsbG9vbiAiQWRkIGEgbmV3IHBhcmFtZXRlciBhZnRlciB0aGlzIG9u ZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQgZmllbGQgImN1clBhcmFt IiBpbnRvIGN1cnJlbnRQYXJhbQ1pZiBjdXJyZW50UGFyYW0gPSAxIHRoZW4NcHV0IDIg aW50byBjdXJyZW50UGFyYW0NZW5kIGlmDXB1dCByZXR1cm4gJiAiLD8/Pz8sPz8/Pyww LCIgYWZ0ZXIgbGluZSBjdXJyZW50UGFyYW0gb2YgYmtnbmQgZmllbGQgaWQgMTANU2hv d1BhcmFtIGN1cnJlbnRQYXJhbSsxDWVuZCBtb3VzZVVwAAAB6gAuAQAAcQACAIUAWKAE AAAAAAABAAAADAAAABBIaWRlIHNjcmlwdAAAb24gTW91c2VXaXRoaW4NaWYgdGhlIHNo b3J0IG5hbWUgb2YgbWUgaXMgIlNob3cgU2NyaXB0IiB0aGVuDVNob3dCYWxsb29uICJT aG93IHRoZSBzY3JpcHQgZm9yIHRoaXMgZXZlbnQuIg1lbHNlDVNob3dCYWxsb29uICJI aWRlIHRoZSBzY3JpcHQgZm9yIHRoaXMgZXZlbnQuIg1lbmQgaWYNZW5kIE1vdXNlV2l0 aGluDQ1vbiBtb3VzZVVwDWlmIHRoZSBzaG9ydCBuYW1lIG9mIG1lIGlzICJTaG93IFNj cmlwdCIgdGhlbg1TYXZlUGFyYW0NSE1SZW1vdmVCYWxsb29uDXNob3cgZmllbGQgInNj cmlwdFRlbXBsYXRlIg1zZXQgdGhlIG5hbWUgb2YgbWUgdG8gIkhpZGUgU2NyaXB0Ig1l bHNlDUhNUmVtb3ZlQmFsbG9vbg1TaG93UGFyYW0gMQ1oaWRlIGZpZWxkICJzY3JpcHRU ZW1wbGF0ZSINc2V0IHRoZSBuYW1lIG9mIG1lIHRvICJTaG93IFNjcmlwdCINZW5kIGlm DWVuZCBtb3VzZVVwDQAAAo4AMAIFAIcAAQFTAfsABwAAAAAAAAADAAwAAAAQc2NyaXB0 VGVtcGxhdGUAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBp bnRlcmZhY2UgdG8gdGhlIGV2ZW50IGluIHlvdXIgcHJlZmVyZWQiIMINJiYgImxhbmd1 YWdlLiBUbyBlZGl0IGEgcGFyYW1ldGVyIGNsaWNrIG9uIHRoZSBwYXJhbWV0ZXIuIg1l bmQgTW91c2VXaXRoaW4NDW9uIG1vdXNldXANSE1SZW1vdmVCYWxsb29uDWdsb2JhbCBj bGllbnRMYW5nDWlmIG1lID0gIiIgdGhlbg1wdXQgMiBpbnRvIGluZGV4DWVsc2UNcHV0 IHdvcmQgMiBvZiB0aGUgY2xpY2tMaW5lIGludG8gaW5kZXgNcHV0IGZpZWxkICJwYXJh bUluZm8iIGludG8geA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHggaW50byBuDWlmIChp bmRleCA+IDEpIGFuZCAoaXRlbSAzIG9mIGxpbmUgMiBvZiB4ID0gIm51bGwiKSB0aGVu IGFkZCAxIHRvIGluZGV4DWlmIGluZGV4ID4gbiB0aGVuIHB1dCBuIGludG8gaW5kZXgN ZW5kIGlmDWlmIHRoZXJlIGlzIGEgYmcgYnRuICJIaWRlIFNjcmlwdCIgdGhlbiBzZXQg dGhlIG5hbWUgb2YgYmcgYnRuICJIaWRlIFNjcmlwdCIgdG8gIlNob3cgU2NyaXB0Ig1o aWRlIGZpZWxkICJzY3JpcHRUZW1wbGF0ZSINU2hvd1BhcmFtIGluZGV4DWVuZCBtb3Vz ZXVwDQ0AACoAMQKVAUQAAQFVABgAAgAAAAAAAAADAAwAAAAQY3VyUGFyYW0AAAAAACIA MgINABkAAAA0AF4AAAAAAAAAAAAVABgIAAAgAAAAAAFqADQBAAA6AbQAUgHSIAAAAAP2 AAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUg dG8gZ28gdG8gdGhlIHByZXZpb3VzIGV2ZW50IGluIHRoaXMgc3VpdGUuIg1lbmQgTW91 c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2V0IHRoZXJlIGlzIGEgY2FyZCAyIG9mIHRoaXMg YmtnbmQNaWYgbm90IGl0IHRoZW4gZXhpdCBtb3VzZVVwDXB1dCB0aGUgc2hvcnQgbmFt ZSBvZiBjYXJkIDIgb2YgdGhpcyBia2duZCBpbnRvIHgNaWYgdGhlIHNob3J0IG5hbWUg b2YgdGhpcyBjYXJkIDw+IHggdGhlbg12aXN1YWwgd2lwZSByaWdodA1nbyBwcmV2IGNh cmQgb2YgdGhpcyBia2duZA1lbmQgaWYNZW5kIG1vdXNlVXAAASgANQEAADoB1QBSAfMg AAAAA/UAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBnbyB0byB0aGUgbmV4dCBldmVudCBpbiB0aGlzIHN1aXRlLiINZW5kIE1v dXNlV2l0aGluDQ1vbiBtb3VzZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBsYXN0IGNh cmQgb2YgdGhpcyBia2duZCBpbnRvIHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBj YXJkIDw+IHggdGhlbg12aXN1YWwgd2lwZSBsZWZ0DWdvIG5leHQgY2FyZCBvZiB0aGlz IGJrZ25kDWVuZCBpZg1lbmQgbW91c2VVcAACtgA3AQAAHQE+ADMBopAFAAAAAAABAAAA DAAAABBmcm9tIEFFVVQAAG9uIE1vdXNlV2l0aGluDWlmIGhpbGl0ZSBvZiBtZSB0aGVu DVNob3dCYWxsb29uICJUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBldmVudCBjb21l cyBmcm9tIHRoZSBhZXV0IHJlc291cmNlLiIgwg0mJiAiSWYgeW91IG1vZGlmeSB0aGUg ZXZlbnQsIHlvdSBzaG91bGQgY2xpY2sgaGVyZSBzbyB0aGF0IHRoZSBldmVudCIgwg0m JiAiZ29lcyB0byB0aGUgYWV0ZSByZXNvdXJjZS4iDWVsc2UNU2hvd0JhbGxvb24gIlRo aXMgc2hvd3MgdGhlIGV2ZW50IGNvbWVzIGZyb20gdGhlIGFldGUgcmVzb3VyY2UuIiDC DSYmICJUaGVyZSBpcyBubyByZWFzb24gdG8gbWFyayBpdCBhcyBjb21pbmcgZnJvbSB0 aGUgYWV1dCByZXNvdXJjZS4iIMINJiYgIklmIHlvdSBpbnNpc3Qgb24gY2hhbmdpbmcg aXQsIGNsaWNrIGhlcmUgd2l0aCBvcHRpb24ga2V5IGRvd24uIiDCDSYmICJJdCB3aWxs IG5vdCBiZSB3cml0dGVuIHRvIHRoZSBhZXRlIHJlc291cmNlLiINZW5kIGlmDWVuZCBN b3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQgaGlsaXRlIG9mIHRhcmdldCBpbnRvIGN1 clN0YXRlDWlmIGN1clN0YXRlIG9yICh0aGUgb3B0aW9uS2V5IGlzIGRvd24pIHRoZW4N c2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IGN1clN0YXRlDWVuZCBpZg1lbmQgbW91 c2VVcA0AACgAOQEAAB8A0gAxAP6AAAAAAAAAAQAAAAwAAAAQQ2xhc3M6AAAAAAD4ADsB AAARAcEAOAHooAAAABpAAAEAAAAMAAAAEEdvIEJhY2sAAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhlIGNhcmQgeW91IGxh c3QgdmlzaXRlZCLCDSYmInRoaXMgc2Vzc2lvbi4iDWVuZCBNb3VzZVdpdGhpbg0Nb24g bW91c2VVcA1nbG9iYWwgZ1doZXJlZnJvbQ1ITVJlbW92ZUJhbGxvb24NdmlzdWFsIGRp c3NvbHZlIGZhc3QNZ28gZ1doZXJlRnJvbQ1lbmQgbW91c2VVcA0ABcwAPQGAAHEAEQCF AEugBAAAAAAAAQAAAAwAAAAQU2VuZCBpdAAAb24gTW91c2VXaXRoaW4NU2hvd1BzdHJC YWxsb29uICJUaGlzIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBpbiB0aGUgZmluYWwg dmVyc2lvbi4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQgUmVzVHlwZShm aWVsZCAiZXZlbnRDbGFzcyIpICYgUmVzVHlwZShmaWVsZCAiZXZlbnRJRCIpIGludG8g ZXZlbnRJRA1wdXQgKGZpZWxkICJldmVudE5hbWUiKSAmICIsIiAmIGV2ZW50SUQgaW50 byBldmVudE5hbWUNcHV0IGZpZWxkICJwYXJhbUluZm8iIGludG8gcGFyYW1JbmZvDWRl bGV0ZSBsaW5lIDEgb2YgcGFyYW1JbmZvDXB1dCAiLS0tLSIgaW50byBpdGVtIDIgb2Yg cGFyYW1JbmZvDXB1dCBldmVudElEIGludG8gaXRlbSAxIG9mIHBhcmFtSW5mbw1zZXQg bG9ja3NjcmVlbiB0byB0cnVlIC0tIHNvIHdlIGNhbiBzZWUgdGhlIGZpZWxkIGxhdGVy DWdvIGNhcmQgIlNlbmRBRSINaWYgdGhlIHJlc3VsdCA9ICIiIHRoZW4NcHV0IHdvcmQg MSBvZiBzaG9ydCBuYW1lIG9mIGNhcmQgYnV0dG9uIGlkIDQxICYgc3BhY2UgYmVmb3Jl IGV2ZW50TmFtZQ1zZXQgbmFtZSBvZiBjYXJkIGJ1dHRvbiBpZCA0MSB0byBldmVudE5h bWUNcHV0IHBhcmFtSW5mbyBpbnRvIGNhcmQgZmllbGQgInBhcmFtSW5mbyINcHV0IDEg aW50byBjdXJGaWVsZA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHBhcmFtSW5mbyBpbnRv IHBhcmFtQ291bnQNcmVwZWF0IHdpdGggcGFyYW1JbmRleCA9IDEgdG8gcGFyYW1Db3Vu dA1pZiAocGFyYW1JbmRleCA9IDEpIHRoZW4NaWYgKGl0ZW0gMyBvZiBsaW5lIDEgb2Yg cGFyYW1JbmZvIDw+ICJudWxsIikgdGhlbg1pZiAoaXRlbSA0IG9mIGxpbmUgMSBvZiBw YXJhbUluZm8pID4gMzI2MzcgdGhlbg1wdXQgIltkaXJlY3QgcGFyYW1ldGVyXSIgaW50 byBjYXJkIGZpZWxkIGlkIDENZWxzZQ1wdXQgImRpcmVjdCBwYXJhbWV0ZXIiIGludG8g Y2FyZCBmaWVsZCBpZCAxDWVuZCBpZg1hZGQgMSB0byBjdXJGaWVsZA1lbmQgaWYNZWxz ZQ1wdXQgbGluZSBwYXJhbUluZGV4IG9mIHBhcmFtSW5mbyBpbnRvIHgNaWYgKGl0ZW0g NCBvZiB4KSA+IDMyNjM3IHRoZW4NcHV0ICJbIiAmIChpdGVtIDEgb2YgeCkgJiAiXSIg aW50byBjYXJkIGZpZWxkIGlkIGN1ckZpZWxkDWVsc2UNcHV0IGl0ZW0gMSBvZiB4IGlu dG8gY2FyZCBmaWVsZCBpZCBjdXJGaWVsZA1lbmQgaWYNYWRkIDEgdG8gY3VyRmllbGQN ZW5kIGlmDWVuZCByZXBlYXQNcmVwZWF0IHdpdGggaSA9IDEgdG8gY3VyRmllbGQNc2hv dyBjYXJkIGZpZWxkIGlkIGkNcHV0ICIiIGludG8gY2FyZCBmaWVsZCBpZCAoaSsyMCkN c2hvdyBjYXJkIGZpZWxkIGlkIChpKzIwKQ1lbmQgcmVwZWF0DXJlcGVhdCB3aXRoIGkg PSBjdXJGaWVsZCB0byAyMA1oaWRlIGNhcmQgZmllbGQgaWQgaQ1oaWRlIGNhcmQgZmll bGQgaWQgKGkrMjApDWVuZCByZXBlYXQNZW5kIGlmDWVuZCBtb3VzZVVwAAAA+AA+AYAA cQABAIUAV6AEAAAAAAABAAAADAAAABBTaG93IFNjcmlwdAAAb24gTW91c2VXaXRoaW4N U2hvd0JhbGxvb24gIkhpZGUgdGhlIHNjcmlwdCBmb3IgdGhpcyBldmVudC4iDWVuZCBN b3VzZVdpdGhpbg0Nb24gbW91c2VVcA0tLSBTYXZlUGFyYW0NSE1SZW1vdmVCYWxsb29u DVNob3dQYXJhbSAxDWhpZGUgZmllbGQgInNjcmlwdFRlbXBsYXRlIg1zaG93IGJnIGJ0 biAiU2hvdyBTY3JpcHQiDWhpZGUgbWUNZW5kIG1vdXNlVXANAAAPAAYARXZlbnQAEQAD AElEAAASAAwARGVzY3JpcHRpb24AFwAMAERlc2NyaXB0aW9uABMACwBQYXJhbWV0ZXJz AAAUAAUATmFtZQAAFQAIAEtleXdvcmQAMgAHAEV2ZW50cwBldmVudHMAb24gb3BlbmNh cmQNZ2xvYmFsIGluRWRpdA1pZiBpbkVkaXQgdGhlbg1nbG9iYWwgY3VycmVudFN1aXRl LGN1cnJlbnROYW1lDVB1dCBmaWVsZCAic3VpdGVDb2RlIiBpbnRvIGN1cnJlbnRTdWl0 ZQ1wdXQgZmllbGQgImV2ZW50TmFtZSIgaW50byBjdXJyZW50TmFtZQ1pZiBmaWVsZCAi ZXZlbnROYW1lIiA9ICIiIHRoZW4gLS0gZXZlbnQgbm90IHlldCBkZWZpbmVkDWhpZGUg ZmllbGQgInNjcmlwdFRlbXBsYXRlIg1zZXQgdGhlIG5hbWUgb2YgYmcgYnV0dG9uIGlk IDQ2IHRvICJTaG93IHNjcmlwdCINU2hvd1BhcmFtIDENZWxzZQ1zaG93IGZpZWxkICJz Y3JpcHRUZW1wbGF0ZSINc2V0IHRoZSBuYW1lIG9mIGJnIGJ1dHRvbiBpZCA0NiB0byAi SGlkZSBzY3JpcHQiDWVuZCBpZg1lbmQgaWYNUGFzcyBvcGVuY2FyZA1lbmQgb3BlbmNh cmQNDW9uIGNsb3NlY2FyZA1nbG9iYWwgaW5FZGl0DWlmIGZsZCBFdlBhcmFtTmFtZSBp cyBlbXB0eSB0aGVuDXB1dCAibWlzc2luZ05hbWUiJiIoIiZyYW5kb20oNTAwKSYiKSIg aW50byBmbGQgRXZQYXJhbU5hbWUNZW5kIGlmDWlmIGluRWRpdCB0aGVuDWlmIGZpZWxk ICJzdWl0ZUNvZGUiIDw+ICIqKioqIiB0aGVuDWdsb2JhbCBjdXJyZW50U3VpdGUsY3Vy cmVudE5hbWUNaWYgY3VycmVudFN1aXRlIDw+IGZpZWxkICJzdWl0ZUNvZGUiIHRoZW4N cHV0ICJzdWl0ZSIgJiYgZmllbGQgInN1aXRlQ29kZSIgaW50byBzdWl0ZU5hbWUNaWYg bm90ICh0aGVyZSBpcyBhIGNhcmQgc3VpdGVOYW1lKSB0aGVuDXB1dCBjdXJyZW50U3Vp dGUgaW50byBmaWVsZCAic3VpdGVDb2RlIg1hbnN3ZXIgc3VpdGVOYW1lICYgImRvZXMg bm90IGV4aXN0IGFuZCB3aWxsIG5vdCBiZSB1c2VkIg1lbmQgaWYNZW5kIGlmDWlmIG5v dCB0aGUgdmlzaWJsZSBvZiBmaWVsZCAic2NyaXB0VGVtcGxhdGUiIHRoZW4NU2F2ZVBh cmFtDXNob3cgZmllbGQgInNjcmlwdFRlbXBsYXRlIg1pZiB0aGVyZSBpcyBhIGJnIGJ0 biAic2hvdyBzY3JpcHQiIHRoZW4Nc2V0IHRoZSBuYW1lIG9mIGJnIGJ0biAic2hvdyBz Y3JpcHQiIHRvICJIaWRlIHNjcmlwdCINZW5kIGlmDWVuZCBpZg1wdXQgY3VycmVudFN1 aXRlICYmIChzaG9ydCBuYW1lIG9mIHRoaXMgY2FyZCkgJiAiLCIgJiBjdXJyZW50TmFt ZSBpbnRvIG9sZE5hbWUNcHV0IGZpZWxkICJzdWl0ZUNvZGUiICYmICJldmVudCIgJiYg UmVzVHlwZShmaWVsZCAiZXZlbnRDbGFzcyIpIMINJiBSZXNUeXBlKGZpZWxkICJldmVu dElEIikgJiAiLCIgJiBmaWVsZCAiZXZlbnROYW1lIiBpbnRvIG5ld05hbWUNaWYgbmV3 TmFtZSA8PiBvbGROYW1lIHRoZW4NTmFtZUl0IG5ld05hbWUNQ2hhbmdlTmFtZSBvbGRO YW1lLCBuZXdOYW1lLCAiZXZlbnRMaXN0Ig1lbmQgaWYNUHV0IGZpZWxkICJzdWl0ZUNv ZGUiIGludG8gY3VycmVudFN1aXRlDWVuZCBpZg1QYXNzIGNsb3NlY2FyZA1lbmQgaWYN ZW5kIGNsb3NlY2FyZA0Nb24gbmV3Y2FyZA1nbG9iYWwgY3VycmVudFN1aXRlDXB1dCBj dXJyZW50U3VpdGUgaW50byBmaWVsZCBzdWl0ZUNvZGUNaWYgY3VycmVudFN1aXRlID0g ImNvcmUiIHRoZW4NcHV0ICJhZXZ0IiBpbnRvIGZpZWxkIGV2ZW50Q2xhc3MNZWxzZQ1w dXQgY3VycmVudFN1aXRlIGludG8gZmllbGQgZXZlbnRDbGFzcw1lbmQgaWYNcHV0ICIs LG51bGwsMCwiIGludG8gbGluZSAxIG9mIGZpZWxkIGlkIDEwDXB1dCAiLCxudWxsLDAs IiBpbnRvIGxpbmUgMiBvZiBmaWVsZCBpZCAxMA1QYXNzIG5ld2NhcmQNZW5kIG5ld2Nh cmQNDW9uIGRlbGV0ZWNhcmQNQ2hhbmdlTmFtZSBmaWVsZCAic3VpdGVDb2RlIiAmJiBz aG9ydCBuYW1lIG9mIHRoaXMgY2FyZCAmICIsIiAgJiBmaWVsZCAiZXZlbnROYW1lIiwg wg0iIiwgImV2ZW50TGlzdCINcGFzcyBkZWxldGVjYXJkDWVuZCBkZWxldGVjYXJkDQ1v biBTaG93UGFyYW0gbg1wdXQgbiBpbnRvIGZpZWxkIGN1clBhcmFtDXB1dCBsaW5lIG4g b2YgZmllbGQgaWQgMTAgaW50byB4DXB1dCBpdGVtIDMgb2YgeCBpbnRvIGZpZWxkIGlk IDgNUmFkaW9BcnJheSBpdGVtIDQgb2YgeA1pZiBuIDwgMyB0aGVuDWlmIG4gPSAyIHRo ZW4NcHV0ICJkaXJlY3Qgb2JqZWN0IiBpbnRvIGZpZWxkIGlkIDYNcHV0ICItLS0tIiBp bnRvIGZpZWxkIGlkIDcNc2V0IG5hbWUgb2YgYmcgYnV0dG9uIGlkIDI4IHRvICJDaGFu Z2UgU3RhdGUiDWVsc2UNcHV0ICJyZXBseSIgaW50byBmaWVsZCBpZCA2DXB1dCAicnBs eSIgaW50byBmaWVsZCBpZCA3DXNldCBuYW1lIG9mIGJnIGJ1dHRvbiBpZCAyOCB0byAi UmVzZXJ2ZWQiDWVuZCBpZg1zZXQgbG9ja3RleHQgb2YgZmllbGQgaWQgNiB0byB0cnVl DXNldCBsb2NrdGV4dCBvZiBmaWVsZCBpZCA3IHRvIHRydWUNZWxzZQ1zZXQgbmFtZSBv ZiBiZyBidXR0b24gaWQgMjggdG8gIlJlc2VydmVkIg1wdXQgaXRlbSAxIG9mIHggaW50 byBmaWVsZCBpZCA2DXB1dCBpdGVtIDIgb2YgeCBpbnRvIGZpZWxkIGlkIDcNc2V0IGxv Y2t0ZXh0IG9mIGZpZWxkIGlkIDYgdG8gZmFsc2UNc2V0IGxvY2t0ZXh0IG9mIGZpZWxk IGlkIDcgdG8gZmFsc2UNZW5kIGlmDWRlbGV0ZSBpdGVtIDEgdG8gNCBvZiB4DXB1dCB4 IGludG8gYmtnbmQgZmllbGQgaWQgOQ1lbmQgU2hvd1BhcmFtDQ1vbiBTYXZlUGFyYW0N cHV0IGZpZWxkICJjdXJQYXJhbSIgaW50byBjdXJyZW50UGFyYW0NcHV0IGxpbmUgY3Vy cmVudFBhcmFtIG9mIGJrZ25kIGZpZWxkIGlkIDEwIGludG8gb2xkVmFsdWUNaWYgY3Vy cmVudFBhcmFtIDwgMyB0aGVuDXB1dCAiIiBpbnRvIGl0ZW0gMSBvZiB4DXB1dCAiIiBp bnRvIGl0ZW0gMiBvZiB4DWVsc2UNcHV0IGZpZWxkIGlkIDYgaW50byBpdGVtIDEgb2Yg eA1wdXQgZmllbGQgaWQgNyBpbnRvIGl0ZW0gMiBvZiB4DWVuZCBpZg1wdXQgZmllbGQg aWQgOCBpbnRvIGl0ZW0gMyBvZiB4DXB1dCAwIGludG8gbg1yZXBlYXQgd2l0aCBpID0g MjUgdG8gNDANbXVsdGlwbHkgbiBieSAyDWlmIGhpbGl0ZSBvZiBia2duZCBidXR0b24g aWQgaSB0aGVuDWFkZCAxIHRvIG4NZW5kIGlmDWVuZCByZXBlYXQNcHV0IG4gaW50byBp dGVtIDQgb2YgeA1wdXQgYmtnbmQgZmllbGQgaWQgOSBpbnRvIHkNLS0gd2UgbXVzdCBy ZW1vdmUgYWxsIGNhcnJpYWdlIHJldHVybiBmcm9tIHRoZSBjb21tYSBmaWVsZA1yZXBl YXQgdW50aWwgaSA9IDANcHV0IG9mZnNldChyZXR1cm4sIHkpIGludG8gaQ1pZiBpID4g MCB0aGVuIHB1dCBzcGFjZSBpbnRvIGNoYXIgaSBvZiB5DWVuZCByZXBlYXQNcHV0IHgg JiAiLCIgJiB5IGludG8gbmV3VmFsdWUNaWYgKG9sZFZhbHVlIDw+IG5ld1ZhbHVlKSBv ciAoZmllbGQgInNjcmlwdFRlbXBsYXRlIiA9ICIiKSB0aGVuDXB1dCBuZXdWYWx1ZSBp bnRvIGxpbmUgY3VycmVudFBhcmFtIG9mIGJrZ25kIGZpZWxkIGlkIDEwDU1ha2VTY3Jp cHRUZW1wbGF0ZQ1lbmQgaWYNZW5kIFNhdmVQYXJhbQ0Nb24gTWFrZVNjcmlwdFRlbXBs YXRlDXB1dCBDbGllbnRUZW1wbGF0ZSgibXVsdGlMaW5lIikgaW50byBmaWVsZCAic2Ny aXB0VGVtcGxhdGUiDWVuZCBNYWtlU2NyaXB0VGVtcGxhdGUNDW9uIFJhZGlvQXJyYXkg bg1yZXBlYXQgd2l0aCBpID0gMSB0byAxNg1pZiAobiBtb2QgMikgPSAxIHRoZW4Nc2V0 IGhpbGl0ZSBvZiBia2duZCBidXR0b24gaWQgKDQxLWkpIHRvIHRydWUNZWxzZQ1zZXQg aGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiBpZCAoNDEtaSkgdG8gZmFsc2UNZW5kIGlmDXB1 dCBuIGRpdiAyIGludG8gbg1lbmQgcmVwZWF0DWVuZCBSYWRpb0FycmF5DQ1vbiBHdWVz c1BhcmFtVHlwZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBvciB3aGljaCBw YXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgZmllbGQgInBhcmFtSW5mbyIgaW50 byBwYXJhbUluZm8NcHV0IG51bWJlciBvZiBsaW5lcyBpbiBwYXJhbUluZm8gaW50byBu DXJlcGVhdCB3aXRoIGluZGV4ID0gMSB0byBuDXB1dCBsaW5lIGluZGV4IG9mIHBhcmFt SW5mbyBpbnRvIHkNcHV0IGl0ZW0gMyBvZiB5IGludG8gZGF0YVR5cGUNaWYgKGRhdGFU eXBlIDw+ICJudWxsIikgdGhlbg1wdXQgaXRlbSA0IG9mIHkgaW50byB0ZW1wDXB1dCBp dGVtIDMgb2YgeSBpbnRvIGRhdGFUeXBlDWlmIHRlbXAgPiAzMjc2NyB0aGVuDXN1YnRy YWN0IDMyNzY4IGZyb20gdGVtcA1lbmQgaWYNaWYgdGVtcCA+IDE2MzgzIHRoZW4NcHV0 ICJsaXN0IiBpbnRvIGRhdGFUeXBlDWVsc2UgaWYgdGVtcCA+IDgxOTEgdGhlbg1wdXQg ImVudW0iIGludG8gZGF0YVR5cGUNZW5kIGlmDXB1dCAwIGludG8gcGFyYW1UeXBlDWlm IGRhdGFUeXBlID0gIlRFWFQiIHRoZW4NcHV0IDYgaW50byBwYXJhbVR5cGUNZWxzZSBp ZiAoZGF0YVR5cGUgPSAiZW51bSIpIG9yIChkYXRhVHlwZSA9ICJib29sIikgb3IgKGRh dGFUeXBlID0gInRydWUiKSBvciAoZGF0YVR5cGUgPSAibG9uZyIpIHRoZW4NcHV0IDQg aW50byBwYXJhbVR5cGUNZW5kIGlmDXB1dCBpdGVtIDQgb2YgeSBpbnRvIHRlbXANcHV0 IHRlbXAgLSAodGVtcCBtb2QgOCkgKyBwYXJhbVR5cGUgaW50byBpdGVtIDQgb2YgeQ1w dXQgeSBpbnRvIGxpbmUgaW5kZXggb2YgcGFyYW1JbmZvDWVuZCBpZg1lbmQgcmVwZWF0 DXB1dCBwYXJhbUluZm8gaW50byBmaWVsZCAicGFyYW1JbmZvIg1lbmQgR3Vlc3NQYXJh bVR5cGUNDWZ1bmN0aW9uIEdsdWVJbmZvIHBhcmFtSW5mbw1wdXQgIi0tLS0iIGludG8g ZGFzaA1wdXQgInRoZVJlc3VsdCIgaW50byBpdGVtIDEgb2YgcGFyYW1JbmZvDXB1dCBk YXNoIGludG8gaXRlbSAyIG9mIHBhcmFtSW5mbw1wdXQgImRpcmVjdFBhcmFtIiBpbnRv IGl0ZW0gMSBvZiBsaW5lIDIgb2YgcGFyYW1JbmZvDXB1dCAiLS0tLSIgaW50byBpdGVt IDIgb2YgbGluZSAyIG9mIHBhcmFtSW5mbw1wdXQgbnVtYmVyIG9mIGxpbmVzIG9mIHBh cmFtSW5mbyBpbnRvIG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbg1zZXQgY3Vyc29yIHRv IGJ1c3kNcHV0IGxpbmUgaSBvZiBwYXJhbUluZm8gaW50byB4DXB1dCBpdGVtIDQgb2Yg eCBpbnRvIHRlbXANcHV0IHRlbXAgbW9kIDggaW50byBwYXJhbVR5cGUNcHV0IGl0ZW0g MyBvZiB4IGludG8gZGF0YVR5cGUNaWYgdGVtcCA+IDMyNzY3IHRoZW4NcHV0ICIsbyIg YWZ0ZXIgaXRlbSA0IG9mIHgNcHV0IHRydWUgaW50byBpc09wdGlvbmFsDXN1YnRyYWN0 IDMyNzY4IGZyb20gdGVtcA1lbHNlDXB1dCAiLHIiIGFmdGVyIGl0ZW0gNCBvZiB4DXB1 dCBmYWxzZSBpbnRvIGlzT3B0aW9uYWwNZW5kIGlmDWlmIHRlbXAgPiAxNjM4MyB0aGVu DXB1dCAibGlzdCIgaW50byBkYXRhVHlwZQ1lbHNlIGlmIHRlbXAgPiA4MTkxIHRoZW4N cHV0ICJlbnVtIiBpbnRvIGRhdGFUeXBlDWVuZCBpZg1pZiAoZGF0YVR5cGUgPSAib2Jq Iikgb3IgKGRhdGFUeXBlID0gImxpc3QiKSBvciAoZGF0YVR5cGUgPSAiKioqKiIpIHRo ZW4NaWYgcGFyYW1UeXBlIDw+IDIgdGhlbg1wdXQgMCBpbnRvIHBhcmFtVHlwZQ1lbmQg aWYNZW5kIGlmDWlmIChwYXJhbVR5cGUgPSA2KSB0aGVuDWlmIGRhdGFUeXBlIDw+ICJU RVhUIiB0aGVuDXB1dCAwIGludG8gcGFyYW1UeXBlDWVuZCBpZg1lbHNlIGlmIChwYXJh bVR5cGUgPSA1KSBvciAocGFyYW1UeXBlID0gNykgdGhlbg1pZiBpID0gMSB0aGVuIHB1 dCAwIGludG8gcGFyYW1UeXBlDWVuZCBpZg1pZiBpdGVtIDIgb2YgeCA9IGRhc2ggdGhl bg1wdXQgImtleURpcmVjdE9iamVjdCIgaW50byBpdGVtIDIgb2YgeA1lbHNlDS0tIHB1 dCAia2V5QUUiICYgU3RyaXBTUChpdGVtIDEgb2YgeCkgaW50byBpdGVtIDIgb2YgeA1w dXQgIiciICYgUmVzVHlwZShpdGVtIDIgb2YgeCkgJiAiJyIgaW50byBpdGVtIDIgb2Yg eA1lbmQgaWYNcHV0IFN0cmlwU1AoaXRlbSAxIG9mIHgsIHRydWUpIGludG8gaXRlbSAx IG9mIHgNcHV0ICJwdHJUbyIgJiBTdHJpcFNQKGl0ZW0gMSBvZiB4KSBpbnRvIGl0ZW0g NiBvZiB4DWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1wdXQgInNpemVPZiIgJiBTdHJpcFNQ KGl0ZW0gMSBvZiB4KSBpbnRvIGl0ZW0gNyBvZiB4DWVuZCBpZg1wdXQgZGF0YVR5cGUg aW50byBpdGVtIDMgb2YgeA1wdXQgcGFyYW1UeXBlIGludG8gaXRlbSA0IG9mIHgNcHV0 IHggaW50byBsaW5lIGkgb2YgcnN0DWVuZCByZXBlYXQNcmV0dXJuIHJzdA1lbmQgR2x1 ZUluZm8NDW9uIENob29zZVBhcmFtVHlwZQ1wdXQgIiIgaW50byBub3RGb3JOdWxsDWlm IGZpZWxkICJjdXJQYXJhbSIgPSAxIHRoZW4NcHV0ICIoIiBpbnRvIG5vdEZvclJlc3Vs dA1lbHNlDXB1dCAiIiBpbnRvIG5vdEZvclJlc3VsdA1lbmQgaWYNaWYgZmllbGQgaWQg OCA8PiAiVEVYVCIgdGhlbg1wdXQgIigiIGludG8gdGV4dE9ubHkNaWYgZmllbGQgaWQg OCA9ICJudWxsIiB0aGVuDXB1dCAiKCIgaW50byBub3RGb3JOdWxsDXB1dCAiKCIgaW50 byBub3RGb3JSZXN1bHQNZW5kIGlmDWVsc2UNcHV0ICIiIGludG8gdGV4dE9ubHkNZW5k IGlmDXB1dCBub3RGb3JOdWxsICYgIkRlc2NyaXB0b3IiICYgcmV0dXJuIGludG8gbWVu dQ1wdXQgbm90Rm9yTnVsbCAmICJIYW5kbGUiICYgcmV0dXJuIGFmdGVyIG1lbnUNcHV0 ICIoUmVzZXJ2ZWQiICYgcmV0dXJuIGFmdGVyIG1lbnUNcHV0ICIoUmVzZXJ2ZWQiICYg cmV0dXJuIGFmdGVyIG1lbnUNcHV0IG5vdEZvck51bGwgJiAiSW1tZWRpYXRlIiAmIHJl dHVybiBhZnRlciBtZW51DXB1dCBub3RGb3JSZXN1bHQgJiAiUG9pbnRlciBhbmQgU2l6 ZSIgJiByZXR1cm4gYWZ0ZXIgbWVudQ1wdXQgdGV4dE9ubHkgJiAiUGFzY2FsIFN0cmlu ZyIgJiByZXR1cm4gYWZ0ZXIgbWVudQ1wdXQgbm90Rm9yUmVzdWx0ICYgdGV4dE9ubHkg JiAiQyBTdHJpbmciIGFmdGVyIG1lbnUNDXB1dCAwIGludG8gbg1yZXBlYXQgd2l0aCBp ID0gMzggdG8gNDANbXVsdGlwbHkgbiBieSAyDWlmIGhpbGl0ZSBvZiBia2duZCBidXR0 b24gaWQgaSB0aGVuDWFkZCAxIHRvIG4NZW5kIGlmDWVuZCByZXBlYXQNDXNldCBjdXJz b3IgdG8gYXJyb3cNcHV0IGl0ZW0gMSBvZiBIUG9wdXBNZW51KG1lbnUsbisxLFRoZSBN b3VzZVYtMTAsVGhlIE1vdXNlSC0zKSBpbnRvIHRoZUl0ZW0NaWYgdGhlSXRlbSA8PiAi IiB0aGVuDWlmIHRoZUl0ZW0gPSAiRGVzY3JpcHRvciIgdGhlbg1wdXQgMCBpbnRvIG4N ZWxzZSBpZiB0aGVJdGVtID0gIkhhbmRsZSIgdGhlbg1wdXQgMSBpbnRvIG4NZWxzZSBp ZiB0aGVJdGVtID0gIkltbWVkaWF0ZSIgdGhlbg1wdXQgNCBpbnRvIG4NZWxzZSBpZiB0 aGVJdGVtID0gIlBvaW50ZXIgYW5kIFNpemUiIHRoZW4NcHV0IDUgaW50byBuDWVsc2Ug aWYgdGhlSXRlbSA9ICJQYXNjYWwgU3RyaW5nIiB0aGVuDXB1dCA2IGludG8gbg1lbHNl IGlmIHRoZUl0ZW0gPSAiQyBTdHJpbmciIHRoZW4NcHV0IDcgaW50byBuDWVuZCBpZg1w dXQgNCBpbnRvIG5iaXQNcmVwZWF0IHdpdGggaSA9IDM4IHRvIDQwDWlmIG4gPj0gbkJp dCB0aGVuDXN1YnRyYWN0IG5iaXQgZnJvbSBuDXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0 dG9uIGlkIGkgdG8gdHJ1ZQ1lbHNlDXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uIGlk IGkgdG8gZmFsc2UNZW5kIGlmDXB1dCBuYml0IGRpdiAyIGludG8gbmJpdA1lbmQgcmVw ZWF0DWVuZCBpZg1lbmQgQ2hvb3NlUGFyYW1UeXBlDQ0tLSBsYW5ndWFnZSBkZXBlbmRl bnQgcGFydA0NZnVuY3Rpb24gQ2xpZW50VGVtcGxhdGUgbXVsdGlMaW5lDS0tIGVpdGhl ciByZXR1cm4gdGhlIHRlbXBsYXRlIG9yIHdoaWNoIHBhcmFtZXRlciBpcyBiZWluZyBj bGlja2VkDXB1dCBzcGFjZSAmIE51bVRvQ2hhcigxOTQpICYgcmV0dXJuICYgc3BhY2Ug aW50byBjb250Q2hhcg1wdXQgZmllbGQgImV2ZW50TmFtZSIgaW50byB0ZW1wbGF0ZQ1w dXQgZmllbGQgInBhcmFtSW5mbyIgaW50byB4DXB1dCBudW1iZXIgb2YgbGluZXMgaW4g eCBpbnRvIG4NcHV0IDAgaW50byBwYXJhbUluZGV4DXJlcGVhdCB3aXRoIGluZGV4ID0g MiB0byBuDXNldCBjdXJzb3IgdG8gYnVzeQ1wdXQgbGluZSBpbmRleCBvZiB4IGludG8g eQ1wdXQgaXRlbSA0IG9mIHkgaW50byB0ZW1wDXB1dCAodGVtcCA+IDMyNzY3KSBpbnRv IGlzT3B0aW9uYWwNcHV0IHRlbXAgZGl2IDgxOTIgaW50byB0ZW1wDXB1dCAodGVtcCBt b2QgMiA9IDEpIGludG8gaXNFbnVtDXB1dCAiIiBpbnRvIGVudW1lcmF0ZWQNcHV0IChp dGVtIDMgb2YgeSA8PiAibnVsbCIpIGludG8gdXNlSXQNaWYgdXNlSXQgdGhlbg1hZGQg MSB0byBwYXJhbUluZGV4DS0tIGZvciBwcm90byBzdGF0ZW1lbnQNaWYgaXRlbSAzIG9m IHkgPSAidHJ1ZSIgdGhlbg1wdXQgInRydWUiIGludG8gdGhpc1BhcmFtDWVsc2UgaWYg aW5kZXggPSAxIHRoZW4NcHV0ICJkaXJlY3RQYXJhbSIgaW50byB0aGlzUGFyYW0NZWxz ZQ1wdXQgInBhcmFtIiBpbnRvIHRoaXNQYXJhbQ1lbmQgaWYNaWYgdXNlSXQgdGhlbg1p ZiBtdWx0aUxpbmUgPSAibXVsdGlMaW5lIiB0aGVuDXB1dCBjb250Q2hhciBhZnRlciB0 ZW1wbGF0ZQ1lbHNlDXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNaWYgaXNP cHRpb25hbCB0aGVuDXB1dCAiWyIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGluZGV4 IDw+IDEgdGhlbg1wdXQgaXRlbSAxIG9mIHkgJiBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1l bmQgaWYNaWYgaXNFbnVtIHRoZW4NcHV0IEVudW1PcHRpb24oZmllbGQgInN1aXRlQ29k ZSIsaXRlbSAzIG9mIHksZW51bWVyYXRlZCwxKSBhZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1 dCB0aGlzUGFyYW0gYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGlzT3B0aW9uYWwgdGhl bg1wdXQgIl0iIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1lbmQgaWYNZW5kIGlmIC0tIHVz ZUl0DWVuZCByZXBlYXQNcmV0dXJuIHRlbXBsYXRlDWVuZCBDbGllbnRUZW1wbGF0ZQ0A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoEJNQVAAABamAAAAAAAAAAAAAQAAAAAA AAFWAgAAAAAAAVYCAAAYAAAA6gH0AAAAAAAAAAAAAAAAAAABTED/////wf/////////A 4wSFQP/////B/////////+DjBED/////wf/////////Q4wS5hkBVVVVVwVVVVVVVVVVQ 4wRAKqqqqsGqqqqqqqqqoOMEv4G/gbqBjhJA4ysQAL+Bv4GjgYnjBME5kCAAAQgDCATj BMFEgCAAAQgBCATjBMFAsyQZxw4xOATjBMFAlKgFKQlJSATjBMFAlDAdKQlJSATjFETB lKglKQlJScAD4xQ4wZMkHScJMThAA+McQAOjheNqf/////AA42pAAEAAEACiheNqwABA AGAA4SwPgBUG4QzhLAzAFQbhDOEcDMHHhw8bZjw+YOEL4RwMwczMmZxmZmZg4QvhDMEP jM4ZmGZmZuEM4QzBDM/HH5hmfmbhDOEMwQzMA5gYZmBm4QzhHAzBzEmYmGRiZmDhC+Ec DMHHhw8YeDw+YOELAAAAAAAAAAAAAAAAAAAAAAD///8AADCgQktHRAAAGGQAAAAAAAAZ UEAAAAAAAAADAAAehQAAFdgALgA+AAAj8AAJAAAAjgB+AAECBAAcAKUAMADWAAIAAAAA AAAABAAMAQAAEFN1aXRlQ29kZQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRo aXMgaXMgdGhlIHN1aXRlIGNvZGUgb2YgdGhlIGNsYXNzLiINZW5kIE1vdXNlV2l0aGlu DQ0AAADGAAICBABAAFkAUwEJAAIAAAAAAAAABAAMAAAAEGNsYXNzTmFtZQAAb24gTW91 c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBu YW1lIG9mIHRoaXMgY2xhc3MgaGVyZS4iDWVsc2UNU2hvd0JhbGxvb24gIlRoaXMgaXMg dGhlIG5hbWUgb2YgdGhpcyBjbGFzcy4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4NAADA AAMCBABAAUoAUwF4AAIAAAAAAAAABAAMAAAAEGNsYXNzSUQAAG9uIE1vdXNlV2l0aGlu DWlmICBtZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciB0aGUgSUQgb2YgdGhp cyBjbGFzcyBoZXJlLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhpcyBpcyB0aGUgSUQgb2Yg dGhpcyBjbGFzcy4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4AAADUAAUCBABVAFkAhQH7 AAcAAAAAAAAABAAJAAAADENsYXNzQ29tbWVudAAAb24gTW91c2VXaXRoaW4NaWYgIG1l IGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIGEgY29tbWVudCBhYm91dCB0aGlz IGNsYXNzIGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIGlzIGEgY29tbWVudCBh Ym91dCB0aGlzIGNsYXNzLiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0NDQAAAMYABgIE AK4AZgDBARkAAgAAAAAAAAAEAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1pZiAgbWUgaXMg IiIgdGhlbg1TaG93QmFsbG9vbiAiRW50ZXIgYSB0aGUgbmFtZSBmb3IgdGhpcyBwcm9w ZXJ0eSBoZXJlLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhpcyBpcyB0aGUgbmFtZSBvZiB0 aGlzIHByb3BlcnR5LiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbgAAALoABwIEAK4BbwDB AZ8AAgAAAAAAAAAEAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1pZiAgbWUgaXMgIiIgdGhl bg1TaG93QmFsbG9vbiAiRW50ZXIgYW4gSUQgZm9yIHRoaXMgcHJvcGVydHkuIg1lbHNl DVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBJRCBmb3IgdGhpcyBwcm9wZXJ0eS4iDWVu ZCBpZg1lbmQgTW91c2VXaXRoaW4AAOoACAIEAK4BzQDBAfsAAgAAAAAAAAAEAAwBAAAQ AABvbiBNb3VzZVdpdGhpbg1pZiBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJFbnVtIiB0 aGVuDVNob3dCYWxsb29uICJUaGUgY2xhc3Mgb2YgdGhlIHByb3BlcnR5IGlzIGFuIGVu dW1lcmF0b3IuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBjbGFzcyBvZiB0 aGUgcHJvcGVydHkiICYmIGZpZWxkIGlkIDYNZW5kIGlmDWVuZCBNb3VzZVdpdGhpbgAA ANoACQIEAPAAWQEgAfsABwAAAAAAAAAEAAkAAAAMAABvbiBNb3VzZVdpdGhpbg1pZiAg bWUgaXMgIiIgdGhlbg1TaG93QmFsbG9vbiAiRW50ZXIgYSBjb21tZW50IGFib3V0IHRo aXMgcHJvcGVydHkgaGVyZS4iDWVsc2UNU2hvd0JhbGxvb24gIlRoaXMgaXMgYSBjb21t ZW50IGFib3V0IHRoaXMgcHJvcGVydHkuIiAmJiBmaWVsZCBpZCA2DWVuZCBpZg1lbmQg TW91c2VXaXRoaW4NDQABRAAKAoUBLwBWAVYCAAAHAAAAAAAAAAQACQAAAAxwcm9wSW5m bwAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIGxpc3Qgb2Yg dGhlIHByb3BlcnR5IG9mIHRoaXMgY2xhc3MsIiDCDSYmICJDbGljayBvbiB0aGUgb25l IHlvdSB3aXNoIHRvIGVkaXQuIg1lbmQgTW91c2VXaXRoaW4NDW9uIE1vdXNlVXANcHV0 IHdvcmQgMiBvZiB0aGUgY2xpY2tMaW5lIGludG8gaQ1wdXQgdGhlIG51bWJlciBvZiBs aW5lcyBpbiB0YXJnZXQgaW50byBuDWlmIChpID4gMCkgYW5kIChpIDw9IG4pIHRoZW4N U2hvd1BhcmFtIGkNZW5kIGlmDWVuZCBNb3VzZVVwAAAAZAALAQAAHQB8AC8ApKAAAAAA AAABABUADAEAABBTdWl0ZQAAb24gbW91c2VVcA1nbyB0byBjYXJkICgic3VpdGUiICYm IGZpZWxkIHN1aXRlQ29kZSkNZW5kIG1vdXNlVXAAACoADwINAEIABQBRAFoAAAAAAAD/ /wAVAAwBAAAQY2xhc3NOYW1lAAAAACIAEAIdAEIBHABUAUsAAAAAAAD//wAVAAwBAAAQ AAAAAAAiABICDQBUAAkAZABaAAAAAAAAAAAAFQAMAQAAEAAAAAAAIgATAg0AjgABAKAA ZwAAAAAAAAAAABUAEAEAABUAAAAAACIAFAINALAAAADBAGcAAAAAAAD//wAVAAwBAAAQ AAAAAAAiABUCDQCwASAAwQFwAAAAAAAA//8AFQAMAQAAEAAAAAAAIgAXAg0A7wAJAP8A WgAAAAAAAP//ABUADAEAABAAAAAAARYAGAEAAK8BpQDAAcugAAAAAAAAAQAVAAwBAAAQ Q2xhc3MAAG9uIE1vdXNlV2l0aGluDWlmIGhpbGl0ZSBvZiBia2duZCBidXR0b24gIkVu dW0iIHRoZW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhlIGVudW1l cmF0aW9uIiAmJiAoZmllbGQgaWQgOCkgJiAiLiINZW5kIGlmDWVuZCBNb3VzZVdpdGhp bg0Nb24gbW91c2VVcA1ITVJlbW92ZUJhbGxvbg1nbyBjYXJkIChmaWVsZCAic3VpdGVD b2RlIikgJiYgImNsYXNzIiAmJiBmaWVsZCBpZCA4DWVuZCBtb3VzZVVwAAAAtgAZAQAA zwACAOEAH4AFAAAAAAABAAAADAAAABAwAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9v biAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhp bg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBv ZiB0YXJnZXQpDWVuZCBtb3VzZVVwAADyABoBAADPACAA4QBPgAUAAAAAAAEAAAAMAAAA EExpc3QAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJJZiB0aGlzIGJveCBpcyBj aGVja2VkLCB0aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBsaXN0IG9mIiDCDSYmcXVvdGUm IGZpZWxkIGlkIDggJnF1b3RlJiAiLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVw DXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdldCkNZW5k IG1vdXNlVXAAARQAGwEAAM8ATgDhAIiABQAAAAAAAQAAAAwAAAAQRW51bQAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIklmIHRoaXMgYm94IGlzIGNoZWNrZWQsIHRoZW4g dGhpcyBwYXJhbWV0ZXIgaXMgYW4gZW51bWVyYXRlZCBvbmUgd2l0aCB0aGUgZW51bWVy YXRpb24gaWQiIMINJiZxdW90ZSYgZmllbGQgaWQgOCAmIHF1b3RlJiIuIg1lbmQgTW91 c2VXaXRoaW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90ICho aWxpdGUgb2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAANYAHAEAAM8AhwDhAOHABQAAAAAA AQAAAAwAAAAQUmVhZFdyaXRlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiSW5k aWNhdGVzIHdoZXRoZXIgeW91IGNhbiB3cml0ZSB0byB0aGlzIHByb3BlcnR5IG9yIG5v dC4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdl dCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAC2AB0BAADQATEA 4QFCAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRo aXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRoaW4NDW9u IG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUgb2YgdGFy Z2V0KQ1lbmQgbW91c2VVcAAAALYAHgEAANABQgDhAVMABQAAAAAAAQAAAAwAAAAQAABv biBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0 dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9m IHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAAtgAf AQAA0AFTAOEBZAAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxs b29uICJUaGlzIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1vdXNlV2l0 aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRl IG9mIHRhcmdldCkNZW5kIG1vdXNlVXAAAAC2ACABAADQAWQA4QF1AAUAAAAAAAEAAAAM AAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgcmVzZXJ2ZWQg Zm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANc2V0IGhp bGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUgb2YgdGFyZ2V0KQ1lbmQgbW91c2VV cAAAALYAIQEAANABdQDhAYYABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iDWVuZCBN b3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3Qg KGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAAtgAiAQAA0AGGAOEBlwAFAAAA AAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHJl c2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVw DXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdldCkNZW5k IG1vdXNlVXAAAAC2ACMBAADQAZcA4QGoAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VX aXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Uu Ig1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQg dG8gbm90IChoaWxpdGUgb2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAALYAJAEAANABqADh AbkABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhp cyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24g bW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJn ZXQpDWVuZCBtb3VzZVVwAAAAtgAlAQAA0AG5AOEBygAFAAAAAAABAAAADAAAABAAAG9u IE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHJlc2VydmVkIGZvciBmdXR1 cmUgdXNlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxpdGUgb2Yg dGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdldCkNZW5kIG1vdXNlVXAAAAC2ACYB AADQAcoA4QHbAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxv b24gIlRoaXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRo aW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUg b2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAALYAJwEAANAB2wDhAewABQAAAAAAAQAAAAwA AAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBm b3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGls aXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVw AAAAtgAoAQAA0AHsAOEB/QAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJUaGlzIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1v dXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAo aGlsaXRlIG9mIHRhcmdldCkNZW5kIG1vdXNlVXAAAAEoACkBAACNANsAoQERoAIAAAAA AAEAAAAMAAAAEE5leHQgPgAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNr IGhlcmUgdG8gdmlldyB0aGUgbmV4dCBwcm9wZXJ0eSBpbiB0aGUgcHJvcGVydHkgbGlz dC4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1nbG9iYWwgY3VycmVudFBhcmFt DWlmIGxpbmUgKGN1cnJlbnRQYXJhbSsxKSBvZiBia2duZCBmaWVsZCBpZCAxMCA8PiAi IiB0aGVuDVNhdmVQYXJhbQ1TaG93UGFyYW0gY3VycmVudFBhcmFtKzENZWxzZQ1iZWVw DWVuZCBpZg1lbmQgbW91c2VVcAAAAQoAKgEAAI0AowChANmgAgAAAAAAAQAAAAwAAAAQ PCBQcmV2AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byB2 aWV3IGEgcHJldmlvdXMgcHJvcGVydHkgaW4gdGhlIHByb3BlcnR5IGxpc3QuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGN1cnJlbnRQYXJhbQ1pZiBjdXJy ZW50UGFyYW0gPiAxIHRoZW4NU2F2ZVBhcmFtDVNob3dQYXJhbSBjdXJyZW50UGFyYW0t MQ1lbHNlDWJlZXANZW5kIGlmDWVuZCBtb3VzZVVwAAABNAArAQAAjQBmAKEAnKAEAAAA AAABAAAADAAAABBOZXcAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBo ZXJlIHRvIGFkZCBhIG5ldyBwcm9wZXJ0eSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LiIN ZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0NU2F2 ZVBhcmFtDXB1dCAxICsgbnVtYmVyIG9mIGxpbmVzIG9mIGJrZ25kIGZpZWxkIGlkIDEw IGludG8gbg1wdXQgIiw/Pz8/LD8/Pz8sMCwiIGludG8gbGluZSBuIG9mIGJrZ25kIGZp ZWxkIGlkIDEwDVNob3dQYXJhbSBuDWVuZCBtb3VzZVVwAAGAACwBAACNAXIAoQGooAQA AAAAAAEAAAAMAAAAEERlbGV0ZQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNs aWNrIGhlcmUgdG8gZGVsZXRlIHRoaXMgcHJvcGVydHkuIg1lbmQgTW91c2VXaXRoaW4N DW9uIG1vdXNlVXANZ2xvYmFsIGN1cnJlbnRQYXJhbQ1pZiBjdXJyZW50UGFyYW0gPSAw IHRoZW4NYmVlcA1lbHNlDWRlbGV0ZSBsaW5lIGN1cnJlbnRQYXJhbSBvZiBia2duZCBm aWVsZCBpZCAxMA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGJrZ25kIGZpZWxkIGlkIDEw IGludG8gbg1pZiBjdXJyZW50UGFyYW0gPiBuIHRoZW4Nc3VidHJhY3QgMSBmcm9tIGN1 cnJlbnRQYXJhbQ1lbmQgaWYNU2hvd1BhcmFtIGN1cnJlbnRQYXJhbQ1lbmQgaWYNZW5k IG1vdXNlVXAAAAEUAC0BAACNATYAoQFsoAQAAAAAAAEAAAAMAAAAEEluc2VydAAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gYWRkIGEgbmV3IHBy b3BlcnR5IGFmdGVyIHRoaXMgb25lLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVw DWdsb2JhbCBjdXJyZW50UGFyYW0NcHV0IHJldHVybiAmICIsPz8/Pyw/Pz8/LDAsIiBh ZnRlciBsaW5lIGN1cnJlbnRQYXJhbSBvZiBia2duZCBmaWVsZCBpZCAxMA1TaG93UGFy YW0gY3VycmVudFBhcmFtKzENZW5kIG1vdXNlVXAAAAAiADACDQEhABcBMgBaAAAAAAAA AAAAFQAMAQAAEAAAAAABZAAxAgQBIgBZAVIB+wAHAAAAAAAAAAQACQAAAAxlbGVtZW50 cwAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIGxpc3Qgb2Yg ZWxlbWVudHMgaW4gdGhlIGNsYXNzLiIgwg0mJiAiRWFjaCBsaW5lIGlzIGFuIGVsZW1l bnQsIHRoZSBmaXJzdCBpdGVtIGluIGVhY2ggbGluZSBpcyB0aGUgZWxlbWVudCBjbGFz cywiIMINJiYgInRoZSBmb2xsb3dpbmcgaXRlbXMgYXJlIHRoZSBrZXkgZm9ybXMuIEN1 cnJlbnRseSB0aGVyZSBpcyBubyIgwg0mJiAic3BlY2lhbCB1c2VyIGludGVyZmFjZSBi ZXNpZGVzIHRleHQgZW50cnkgZm9yIGVkaXRpbmcgdGhlc2UgZWxlbWVudHMuIg1lbmQg TW91c2VXaXRoaW4NAAFqADMBAAA6AbQAUgHSIAAAAAP2AAEAAAAMAAAAEAAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhlIHByZXZp b3VzIGNsYXNzIGluIHRoaXMgc3VpdGUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNl VXANZ2V0IHRoZXJlIGlzIGEgY2FyZCAyIG9mIHRoaXMgYmtnbmQNaWYgbm90IGl0IHRo ZW4gZXhpdCBtb3VzZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBjYXJkIDIgb2YgdGhp cyBia2duZCBpbnRvIHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkIDw+IHgg dGhlbg12aXN1YWwgd2lwZSByaWdodA1nbyBwcmV2IGNhcmQgb2YgdGhpcyBia2duZA1l bmQgaWYNZW5kIG1vdXNlVXAAASgANAEAADoB1QBSAfMgAAAAA/UAAQAAAAwAAAAQAABv biBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyB0byB0aGUg bmV4dCBjbGFzcyBpbiB0aGlzIHN1aXRlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3Vz ZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBsYXN0IGNhcmQgb2YgdGhpcyBia2duZCBp bnRvIHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkIDw+IHggdGhlbg12aXN1 YWwgd2lwZSBsZWZ0DWdvIG5leHQgY2FyZCBvZiB0aGlzIGJrZ25kDWVuZCBpZg1lbmQg bW91c2VVcAAC2gA2AQAAHQE+ADMBopAFAAAAAAABAAAADAAAABBmcm9tIEFFVVQAAG9u IE1vdXNlV2l0aGluDWlmIGhpbGl0ZSBvZiBtZSB0aGVuDVNob3dCYWxsb29uICJUaGlz IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgY2xhc3MgY29tZXMgZnJvbSB0aGUgYWV1dCBy ZXNvdXJjZS4iIMINJiYgIklmIHlvdSBtb2RpZnkgdGhlIGNsYXNzLCB5b3Ugc2hvdWxk IGNsaWNrIGhlcmUgc28gdGhhdCB0aGUgY2xhc3MiIMINJiYgImdvZXMgdG8gdGhlIGFl dGUgcmVzb3VyY2UuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIHNob3dzIHRoZSBjbGFz cyBjb21lcyBmcm9tIHRoZSBhZXRlIHJlc291cmNlLiIgwg0mJiAiVGhlcmUgaXMgbm8g cmVhc29uIHRvIG1hcmsgaXQgYXMgY29taW5nIGZyb20gdGhlIGFldXQgcmVzb3VyY2Uu IiDCDSYmICJJZiB5b3UgaW5zaXN0IG9uIGNoYW5naW5nIGl0LCBjbGljayBoZXJlIHdp dGggb3B0aW9uIGtleSBkb3duLiIgwg0mJiAiSXQgd2lsbCBub3QgYmUgd3JpdHRlbiB0 byB0aGUgYWV0ZSByZXNvdXJjZS4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4NDW9uIG1v dXNlVXANcHV0IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgaW50byBj dXJTdGF0ZQ1pZiBjdXJTdGF0ZSBvciAodGhlIG9wdGlvbktleSBpcyBkb3duKSB0aGVu DXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJmcm9tIEFFVVQiIHRvIG5vdCBjdXJT dGF0ZQ1lbmQgaWYNZW5kIG1vdXNlVXAAACIAOgINABkAAAA5AHYAAAAAAAAAAAAVABgI AAAgAAAAAAD4ADsBAAARAcEAOAHooAAAABpAAAEAAAAMAAAAEEdvIEJhY2sAAG9uIE1v dXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhl IGNhcmQgeW91IGxhc3QgdmlzaXRlZCLCDSYmInRoaXMgc2Vzc2lvbi4iDWVuZCBNb3Vz ZVdpdGhpbg0Nb24gbW91c2VVcA1nbG9iYWwgZ1doZXJlZnJvbQ1ITVJlbW92ZUJhbGxv b24NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28gZ1doZXJlRnJvbQ1lbmQgbW91c2VVcA0A AA8ACwBDbGFzcyBOYW1lAAAQAAMASUQAABIADABEZXNjcmlwdGlvbgAXAAwARGVzY3Jp cHRpb24AEwALAFByb3BlcnRpZXMAABQADgBQcm9wZXJ0eSBOYW1lABUADABQcm9wZXJ0 eSBJRAAwAAkARWxlbWVudHMAADoAEYAKAAAABAAHAAZDbGFzc2VzAGNsYXNzAG9uIG9w ZW5jYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRoZW4NZ2xvYmFsIGN1cnJlbnRT dWl0ZSxjdXJyZW50TmFtZQ1QdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBjdXJyZW50 U3VpdGUNcHV0IGZpZWxkICJjbGFzc05hbWUiIGludG8gY3VycmVudE5hbWUNU2hvd1Bh cmFtIDENZW5kIGlmDVBhc3Mgb3BlbmNhcmQNZW5kIG9wZW5jYXJkDQ1vbiBjbG9zZWNh cmQNZ2xvYmFsIGluRWRpdA1pZiBpbkVkaXQgdGhlbg1nbG9iYWwgY3VycmVudFN1aXRl LGN1cnJlbnROYW1lDWlmIGZpZWxkICJzdWl0ZUNvZGUiIDw+ICIqKioqIiB0aGVuDWlm IGN1cnJlbnRTdWl0ZSA8PiBmaWVsZCAic3VpdGVDb2RlIiB0aGVuDXB1dCAic3VpdGUi ICYmIGZpZWxkICJzdWl0ZUNvZGUiIGludG8gc3VpdGVOYW1lDWlmIG5vdCAodGhlcmUg aXMgYSBjYXJkIHN1aXRlTmFtZSkgdGhlbg1wdXQgY3VycmVudFN1aXRlIGludG8gZmll bGQgInN1aXRlQ29kZSINYW5zd2VyIHN1aXRlTmFtZSAmICJkb2VzIG5vdCBleGlzdCBh bmQgd2lsbCBub3QgYmUgdXNlZCINZW5kIGlmDWVuZCBpZg1TYXZlUGFyYW0NcHV0IGN1 cnJlbnRTdWl0ZSAmJiAoc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQpICYgIiwiICYgY3Vy cmVudE5hbWUgaW50byBvbGROYW1lDXB1dCAoZmllbGQgInN1aXRlQ29kZSIpICYmICJj bGFzcyIgJiYgUmVzVHlwZShmaWVsZCAiY2xhc3NJRCIpIMINJiAiLCIgJiBmaWVsZCAi Y2xhc3NOYW1lIiBpbnRvIG5ld05hbWUNaWYgbmV3TmFtZSA8PiBvbGROYW1lIHRoZW4N TmFtZUl0IG5ld05hbWUNQ2hhbmdlTmFtZSBvbGROYW1lLCBuZXdOYW1lLCAiY2xhc3NM aXN0Ig1lbmQgaWYNUHV0IGZpZWxkICJzdWl0ZUNvZGUiIGludG8gY3VycmVudFN1aXRl DWVuZCBpZg1lbmQgaWYNUGFzcyBjbG9zZWNhcmQNZW5kIGNsb3NlY2FyZA0Nb24gY2xv c2VjYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRoZW4NZ2xvYmFsIGN1cnJlbnRT dWl0ZSxjdXJyZW50TmFtZQ1pZiBub3QgdGhlIHZpc2libGUgb2YgZmllbGQgInNjcmlw dFRlbXBsYXRlIiB0aGVuDVNhdmVQYXJhbQ1zaG93IGZpZWxkICJzY3JpcHRUZW1wbGF0 ZSINZW5kIGlmDXB1dCBmaWVsZCAic3VpdGVDb2RlIiAmJiAoc2hvcnQgbmFtZSBvZiB0 aGlzIGNhcmQpICYgIiwiICYgY3VycmVudE5hbWUgaW50byBvbGROYW1lDXB1dCBmaWVs ZCAic3VpdGVDb2RlIiAmJiAiZXZlbnQiICYmIFJlc1R5cGUoZmllbGQgImV2ZW50Q2xh c3MiKSDCDSYgUmVzVHlwZShmaWVsZCAiZXZlbnRJRCIpICYgIiwiICYgZmllbGQgImV2 ZW50TmFtZSIgaW50byBuZXdOYW1lDWlmIG5ld05hbWUgPD4gb2xkTmFtZSB0aGVuDU5h bWVJdCBuZXdOYW1lDUNoYW5nZU5hbWUgb2xkTmFtZSwgbmV3TmFtZSwgImV2ZW50TGlz dCINZW5kIGlmDVB1dCBmaWVsZCAic3VpdGVDb2RlIiBpbnRvIGN1cnJlbnRTdWl0ZQ1Q YXNzIGNsb3NlY2FyZA1lbmQgaWYNZW5kIGNsb3NlY2FyZA0Nb24gbmV3Y2FyZA1nbG9i YWwgY3VycmVudFN1aXRlDXB1dCBjdXJyZW50U3VpdGUgaW50byBmaWVsZCBzdWl0ZUNv ZGUNUGFzcyBuZXdjYXJkDWVuZCBuZXdjYXJkDQ1vbiBkZWxldGVjYXJkDUNoYW5nZU5h bWUgZmllbGQgInN1aXRlQ29kZSIgJiYgc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQgJiAi LCIgICYgZmllbGQgImNsYXNzTmFtZSIsIMINIiIsICJjbGFzc0xpc3QiDXBhc3MgZGVs ZXRlY2FyZA1lbmQgZGVsZXRlY2FyZA0Nb24gU2hvd1BhcmFtIG4NZ2xvYmFsIGN1cnJl bnRQYXJhbQ1wdXQgbiBpbnRvIGN1cnJlbnRQYXJhbQ1pZiBuIDw+IDAgdGhlbg1wdXQg bGluZSBuIG9mIGZpZWxkIGlkIDEwIGludG8geA1lbHNlDXB1dCAiIiBpbnRvIHgNZW5k IGlmDWlmIHggPSAiIiB0aGVuDVJhZGlvQXJyYXkgMA1wdXQgdHJ1ZSBpbnRvIGxvY2tp bmcNcHV0IDAgaW50byBjdXJyZW50UGFyYW0NZWxzZQ1SYWRpb0FycmF5IGl0ZW0gNCBv ZiB4DXB1dCBmYWxzZSBpbnRvIGxvY2tpbmcNZW5kIGlmDXB1dCBpdGVtIDMgb2YgeCBp bnRvIGZpZWxkIGlkIDgNcHV0IGl0ZW0gMSBvZiB4IGludG8gZmllbGQgaWQgNg1wdXQg aXRlbSAyIG9mIHggaW50byBmaWVsZCBpZCA3DWRlbGV0ZSBpdGVtIDEgdG8gNCBvZiB4 DXB1dCB4IGludG8gYmtnbmQgZmllbGQgaWQgOQ1yZXBlYXQgd2l0aCBpID0gNiB0byA5 DXNldCBsb2NrdGV4dCBvZiBmaWVsZCBpZCBpIHRvIGxvY2tpbmcNZW5kIHJlcGVhdA1l bmQgU2hvd1BhcmFtDQ1vbiBTYXZlUGFyYW0NZ2xvYmFsIGN1cnJlbnRQYXJhbQ1pZiBj dXJyZW50UGFyYW0gPD4gMCB0aGVuDWlmIGZpZWxkIGlkIDYgPD4gIiIgdGhlbg1wdXQg ZmllbGQgaWQgNiBpbnRvIGl0ZW0gMSBvZiB4DXB1dCBmaWVsZCBpZCA3IGludG8gaXRl bSAyIG9mIHgNcHV0IGZpZWxkIGlkIDggaW50byBpdGVtIDMgb2YgeA1wdXQgMCBpbnRv IG4NcmVwZWF0IHdpdGggaSA9IDI1IHRvIDQwDW11bHRpcGx5IG4gYnkgMg1pZiBoaWxp dGUgb2YgYmtnbmQgYnV0dG9uIGlkIGkgdGhlbg1hZGQgMSB0byBuDWVuZCBpZg1lbmQg cmVwZWF0DXB1dCBuIGludG8gaXRlbSA0IG9mIHgNcHV0IGJrZ25kIGZpZWxkIGlkIDkg aW50byB5DS0tIHdlIG11c3QgcmVtb3ZlIGFsbCBjYXJyaWFnZSByZXR1cm4gZnJvbSB0 aGUgY29tbWVudCBmaWVsZA1yZXBlYXQgdW50aWwgaSA9IDANcHV0IG9mZnNldChyZXR1 cm4sIHkpIGludG8gaQ1pZiBpID4gMCB0aGVuIHB1dCBzcGFjZSBpbnRvIGNoYXIgaSBv ZiB5DWVuZCByZXBlYXQNcHV0IHggJiAiLCIgJiB5IGludG8gbGluZSBjdXJyZW50UGFy YW0gb2YgYmtnbmQgZmllbGQgaWQgMTANZW5kIGlmDWVuZCBpZg1lbmQgU2F2ZVBhcmFt DQ1vbiBSYWRpb0FycmF5IG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gMTYNaWYgKG4gbW9k IDIpID0gMSB0aGVuDXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uIGlkICg0MS1pKSB0 byB0cnVlDWVsc2UNc2V0IGhpbGl0ZSBvZiBia2duZCBidXR0b24gaWQgKDQxLWkpIHRv IGZhbHNlDWVuZCBpZg1wdXQgbiBkaXYgMiBpbnRvIG4NZW5kIHJlcGVhdA1lbmQgUmFk aW9BcnJheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEJNQVAAABlQAAAA AAAAAAAAAQAAAAAAAAFWAgAAAAAAAVYCAAAYAAAA3AEvAAAAAAAAAAAAAAAAAAAAsFD/ /////8H//////////+ELhYodgOEKHcDhCrmGiWBVVVVVVVXBVVVVVVVVVUDhCmAqqqqq qqrBqqqqqqqqqoDhCr+Bv4G/gb+Bv4GB4R74FmAC4R7MFmAC4Q7BzHhw8bZjw+YC4Q7B zMzJmcZmZmYC4Q7B+MzhmYZmZmAC4Q7BzPxx+YZn5mAC4Q7BzMA5gYZmBmAC4Q7BzMSZ iYZGJmYC4Q7BzHhw8YeDw+YCAP////8AAAD//wD//wD//////wAAG2BCS0dEAAAehQAA AAAAABrtAAAAAAAAAAMAAByvAAAYZAAXADoAABMiAAcAAAB0AIQAAQIEAB8A3gAxAQgA AgAAAAAAAAAEAAwBAAAQU3VpdGVDb2RlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9v biAiVGhpcyBpcyB0aGUgc3VpdGUgY29kZSBvZiB0aGlzIGVudW1lcmF0aW9uLiINZW5k IE1vdXNlV2l0aGluDQ0AANAAAwIEAB8BIwAyAVoAAgAAAAAAAAAEAAwAAAAQZW51bWVy YXRpb24AAG9uIE1vdXNlV2l0aGluDWlmICBtZSBpcyAiIiB0aGVuDVNob3dCYWxsb29u ICJFbnRlciB0aGUgSUQgb2YgdGhpcyBlbnVtZXJhdGlvbiBoZXJlLiINZWxzZQ1TaG93 QmFsbG9vbiAiVGhpcyBpcyB0aGUgSUQgb2YgdGhpcyBlbnVtZXJhdGlvbi4iDWVuZCBp Zg1lbmQgTW91c2VXaXRoaW4NAADgAAYCBABiASkAdAH8AAIAAAAAAAAABAAMAAAAEGVu dW1OYW1lAABvbiBNb3VzZVdpdGhpbg1pZiAgbWUgaXMgIiIgdGhlbg1TaG93QmFsbG9v biAiRW50ZXIgdGhlIG5hbWUgdGhlIGVudW1lcmF0b3IgYmVpbmcgZWRpdGVkLiINZWxz ZQ1TaG93QmFsbG9vbiAiVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZW51bWVyYXRvciBi ZWluZyBlZGl0ZWQuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluDQAAANwABwIEAGIAbQB0 AKEAAgAAAAAAAAAEAAwAAAAQZW51bUlEAABvbiBNb3VzZVdpdGhpbg1pZiAgbWUgaXMg IiIgdGhlbg1TaG93QmFsbG9vbiAiRW50ZXIgdGhlIElEIG9mIHRoZSBlbnVtZXJhdG9y IGJlaW5nIGVkaXRlZC4iDWVsc2UNU2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIElEIG9m IHRoZSBlbnVtZXJhdG9yIGJlaW5nIGVkaXRlZC4iDWVuZCBpZg1lbmQgTW91c2VXaXRo aW4NAADsAAkCBAB5AG0A5QH8AAcAAAAAAAAABAAJAAAADAAAb24gTW91c2VXaXRoaW4N aWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBkZXNjcmlwdGlv biBmb3IgdGhlIGVudW1lcmF0b3IgIGJlaW5nIGVkaXRlZC4iDWVsc2UNU2hvd0JhbGxv b24gIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZW51bWVyYXRvciAgYmVp bmcgZWRpdGVkLiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0AAV4ACgIFAOwAbQFUAfwA BwAAAAAAAAAEAAkAAAAMZW51bUluZm8AAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29u ICJUaGlzIGlzIGxpc3Qgb2YgYWxsIHRoZSBlbnVtZXJhdG9ycyBpbiB0aGlzIGVudW1l cmF0aW9uLCIgwg0mJiAiY2xpY2sgb24gdGhlIGVudW1lcmF0b3IgeW91IHdpc2ggdG8g ZWRpdC4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gTW91c2VVcA1wdXQgd29yZCAyIG9mIHRo ZSBjbGlja0xpbmUgaW50byBpDXB1dCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRhcmdl dCBpbnRvIG4NaWYgKGkgPiAwKSBhbmQgKGkgPD0gbikgdGhlbg1TYXZlUGFyYW0NU2hv d1BhcmFtIGkNZW5kIGlmDWVuZCBNb3VzZVVwAAAAZAALAQAAHwCzADEA3qAAAAAAAAAB AAAADAAAABBTdWl0ZQAAb24gbW91c2VVcA1nbyB0byBjYXJkICgic3VpdGUiICYmIGZp ZWxkIHN1aXRlQ29kZSkNZW5kIG1vdXNlVXAAACIAEAIdACEBCgAzASQAAAAAAAD//wAV AAwBAAAQAAAAAAAiABMCDQBCAAAAWABoAAAAAAAAAAAAFQASAAAAGAAAAAAAIgAUAg0A ZACpAHUBKgAAAAAAAP//ABUADAEAABAAAAAAACIAFQINAGQAAQB2AG4AAAAAAAD//wAV AAwBAAAQAAAAAAAiABcCDAB4ABIAigBuAAAAAAAA//8AFQAMAQAAEAAAAAABLAApAQAA QgDdAFYBE6ACAAAAAAABAAAADAAAABBOZXh0ID4AAG9uIE1vdXNlV2l0aGluDVNob3dC YWxsb29uICJDbGljayBoZXJlIHRvIGdvIHRvIHRoZSBwcmV2aW91cyBlbnVtZXJhdG9y IGluIHRoZSBlbnVtZXJhdGlvbiBsaXN0LiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3Vz ZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0NaWYgbGluZSAoY3VycmVudFBhcmFtKzEpIG9m IGZpZWxkIGlkIDEwIDw+ICIiIHRoZW4NU2F2ZVBhcmFtDVNob3dQYXJhbSBjdXJyZW50 UGFyYW0rMQ1lbHNlDWJlZXANZW5kIGlmDWVuZCBtb3VzZVVwAAABDgAqAQAAQgClAFYA 26ACAAAAAAABAAAADAAAABA8IFByZXYAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29u ICJDbGljayBoZXJlIHRvIGdvIHRvIHRoZSBuZXh0IGVudW1lcmF0b3IgaW4gdGhlIGVu dW1lcmF0aW9uIGxpc3QuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFs IGN1cnJlbnRQYXJhbQ1pZiBjdXJyZW50UGFyYW0gPiAxIHRoZW4NU2F2ZVBhcmFtDVNo b3dQYXJhbSBjdXJyZW50UGFyYW0tMQ1lbHNlDWJlZXANZW5kIGlmDWVuZCBtb3VzZVVw AAABMAArAQAAQgBpAFYAn6AEAAAAAAABAAAADAAAABBOZXcAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGFkZCBhIG5ldyBlbnVtZXJhdG9yIHRv IHRoZSBlbmQgdGhlIGVudW1lcmF0aW9uLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3Vz ZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0NU2F2ZVBhcmFtDXB1dCAxICsgbnVtYmVyIG9m IGxpbmVzIG9mIGJrZ25kIGZpZWxkIGlkIDEwIGludG8gbg1wdXQgIiwsIiBpbnRvIGxp bmUgbiBvZiBia2duZCBmaWVsZCBpZCAxMA1TaG93UGFyYW0gbg1lbmQgbW91c2VVcAAA AYIALAEAAEIBXQBWAZOgBAAAAAAAAQAAAAwAAAAQRGVsZXRlAABvbiBNb3VzZVdpdGhp bg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBkZWxldGUgdGhpcyBlbnVtZXJhdG9y LiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0N aWYgY3VycmVudFBhcmFtIDw+IDAgdGhlbg1kZWxldGUgbGluZSBjdXJyZW50UGFyYW0g b2YgYmtnbmQgZmllbGQgaWQgMTANcHV0IG51bWJlciBvZiBsaW5lcyBpbiBia2duZCBm aWVsZCBpZCAxMCBpbnRvIG4NaWYgY3VycmVudFBhcmFtID4gbiB0aGVuDXN1YnRyYWN0 IDEgZnJvbSBjdXJyZW50UGFyYW0NZW5kIGlmDVNob3dQYXJhbSBjdXJyZW50UGFyYW0N ZWxzZQ1iZWVwDWVuZCBpZg1lbmQgbW91c2VVcAABCAAtAQAAQgEhAFYBV6AEAAAAAAAB AAAADAAAABBJbnNlcnQAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBo ZXJlIHRvIGluc2VydCBhIG5ldyBlbnVtZXJhdG9yIGFmdGVyIHRoaXMgb25lLiINZW5k IE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0NcHV0IHJl dHVybiAmICIsLCIgYWZ0ZXIgbGluZSBjdXJyZW50UGFyYW0gb2YgZmllbGQgaWQgMTAN U2hvd1BhcmFtIGN1cnJlbnRQYXJhbSsxDWVuZCBtb3VzZVVwAAAAIgAyAg0AGQAAADYA swAAAAAAAAAAABUAGAgAACAAAAAAAXAAMwEAADoBtABSAdIgAAAAA/YAAQAAAAwAAAAQ AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyB0byB0 aGUgcHJldmlvdXMgZW51bWVyYXRpb24gaW4gdGhpcyBzdWl0ZS4iDWVuZCBNb3VzZVdp dGhpbg0Nb24gbW91c2VVcA1nZXQgdGhlcmUgaXMgYSBjYXJkIDIgb2YgdGhpcyBia2du ZA1pZiBub3QgaXQgdGhlbiBleGl0IG1vdXNlVXANcHV0IHRoZSBzaG9ydCBuYW1lIG9m IGNhcmQgMiBvZiB0aGlzIGJrZ25kIGludG8geA1pZiB0aGUgc2hvcnQgbmFtZSBvZiB0 aGlzIGNhcmQgPD4geCB0aGVuDXZpc3VhbCB3aXBlIHJpZ2h0DWdvIHByZXYgY2FyZCBv ZiB0aGlzIGJrZ25kDWVuZCBpZg1lbmQgbW91c2VVcAABLgA0AQAAOgHVAFIB8yAAAAAD 9QABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJl IHRvIGdvIHRvIHRoZSBuZXh0IGVudW1lcmF0aW9uIGluIHRoaXMgc3VpdGUuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANcHV0IHRoZSBzaG9ydCBuYW1lIG9mIGxhc3Qg Y2FyZCBvZiB0aGlzIGJrZ25kIGludG8geA1pZiB0aGUgc2hvcnQgbmFtZSBvZiB0aGlz IGNhcmQgPD4geCB0aGVuDXZpc3VhbCB3aXBlIGxlZnQNZ28gbmV4dCBjYXJkIG9mIHRo aXMgYmtnbmQNZW5kIGlmDWVuZCBtb3VzZVVwAALsADYBAAAeAWEAMwG4kAUAAAAAAAEA AAAMAAAAEGZyb20gQUVVVAAAb24gTW91c2VXaXRoaW4NaWYgaGlsaXRlIG9mIG1lIHRo ZW4NU2hvd0JhbGxvb24gIlRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudW1lcmF0 aW9uIGNvbWVzIGZyb20gdGhlIGFldXQgcmVzb3VyY2UuIiDCDSYmICJJZiB5b3UgbW9k aWZ5IHRoZSBlbnVtZXJhdGlvbiwgeW91IHNob3VsZCBjbGljayBoZXJlIHNvIHRoYXQg dGhlIGNsYXNzIiDCDSYmICJnb2VzIHRvIHRoZSBhZXRlIHJlc291cmNlLiINZWxzZQ1T aG93QmFsbG9vbiAiVGhpcyBzaG93cyB0aGUgZW51bWVyYXRpb24gY29tZXMgZnJvbSB0 aGUgYWV0ZSByZXNvdXJjZS4iIMINJiYgIlRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYXJr IGl0IGFzIGNvbWluZyBmcm9tIHRoZSBhZXV0IHJlc291cmNlLiIgwg0mJiAiSWYgeW91 IGluc2lzdCBvbiBjaGFuZ2luZyBpdCwgY2xpY2sgaGVyZSB3aXRoIG9wdGlvbiBrZXkg ZG93bi4iIMINJiYgIkl0IHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIGFldGUgcmVz b3VyY2UuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXB1dCBoaWxp dGUgb2YgYmtnbmQgYnV0dG9uICJmcm9tIEFFVVQiIGludG8gY3VyU3RhdGUNaWYgY3Vy U3RhdGUgb3IgKHRoZSBvcHRpb25LZXkgaXMgZG93bikgdGhlbg1zZXQgaGlsaXRlIG9m IGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0byBub3QgY3VyU3RhdGUNZW5kIGlmDWVu ZCBtb3VzZVVwAAAA+AA3AQAAEQHBADgB6KAAAAAaQAABAAAADAAAABBHbyBCYWNrAABv biBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyBiYWNrIHRv IHRoZSBjYXJkIHlvdSBsYXN0IHZpc2l0ZWQiwg0mJiJ0aGlzIHNlc3Npb24uIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGdXaGVyZWZyb20NSE1SZW1vdmVC YWxsb29uDXZpc3VhbCBkaXNzb2x2ZSBmYXN0DWdvIGdXaGVyZUZyb20NZW5kIG1vdXNl VXANAAAiADoCDADrAAAA/QBuAAAAAAAA//8AFQAMAQAAEAAAAAAAEAADAElEAAAXAAwA RGVzY3JpcHRpb24AEwALAFBhcmFtZXRlcnMAABQAEABFbnVtZXJhdG9yIG5hbWUAFQAO AEVudW1lcmF0b3IgSUQAMgANAEVudW1lcmF0aW9ucwAAOgAQAEVudW1lcmF0b3IgTGlz dGVudW1lcmF0aW9uAG9uIG9wZW5jYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRo ZW4NaWYgZmllbGQgInN1aXRlQ29kZSIgPD4gIioqKioiIHRoZW4NZ2xvYmFsIGN1cnJl bnRTdWl0ZQ1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBjdXJyZW50U3VpdGUNU2hv d1BhcmFtIDENZW5kIGlmDWVuZCBpZg1QYXNzIG9wZW5jYXJkDWVuZCBvcGVuY2FyZA0N b24gY2xvc2VjYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRoZW4NZ2xvYmFsIGN1 cnJlbnRTdWl0ZQ1pZiBmaWVsZCAic3VpdGVDb2RlIiA8PiAiKioqKiIgdGhlbg1pZiBj dXJyZW50U3VpdGUgPD4gZmllbGQgInN1aXRlQ29kZSIgdGhlbg1wdXQgInN1aXRlIiAm JiBmaWVsZCAic3VpdGVDb2RlIiBpbnRvIHN1aXRlTmFtZQ1pZiBub3QgKHRoZXJlIGlz IGEgY2FyZCBzdWl0ZU5hbWUpIHRoZW4NcHV0IGN1cnJlbnRTdWl0ZSBpbnRvIGZpZWxk ICJzdWl0ZUNvZGUiDWFuc3dlciBzdWl0ZU5hbWUgJiAiZG9lcyBub3QgZXhpc3QgYW5k IHdpbGwgbm90IGJlIHVzZWQiDWVuZCBpZg1lbmQgaWYNU2F2ZVBhcmFtDXB1dCBjdXJy ZW50U3VpdGUgJiYgc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQgaW50byBvbGROYW1lDXB1 dCAoZmllbGQgInN1aXRlQ29kZSIpICYmICJlbnVtZXJhdGlvbiIgJiYgUmVzVHlwZShm aWVsZCAiZW51bWVyYXRpb24iKSBpbnRvIG5ld05hbWUNaWYgbmV3TmFtZSA8PiBvbGRO YW1lIHRoZW4NTmFtZUl0IG5ld05hbWUNQ2hhbmdlTmFtZSBvbGROYW1lLCBuZXdOYW1l LCAiZW51bUxpc3QiDWVuZCBpZg1QdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBjdXJy ZW50U3VpdGUNZW5kIGlmDWVuZCBpZg1QYXNzIGNsb3NlY2FyZA1lbmQgY2xvc2VjYXJk DQ1vbiBuZXdjYXJkDWdsb2JhbCBjdXJyZW50U3VpdGUNcHV0IGN1cnJlbnRTdWl0ZSBp bnRvIGZpZWxkIHN1aXRlQ29kZQ1wdXQgIiwsIiBpbnRvIGxpbmUgMSBvZiBmaWVsZCBp ZCAxMA1QYXNzIG5ld2NhcmQNZW5kIG5ld2NhcmQNDW9uIGRlbGV0ZWNhcmQNQ2hhbmdl TmFtZSBmaWVsZCAic3VpdGVDb2RlIiAmJiBzaG9ydCBuYW1lIG9mIHRoaXMgY2FyZCwg wg0iIiwgImVudW1MaXN0Ig1wYXNzIGRlbGV0ZWNhcmQNZW5kIGRlbGV0ZWNhcmQNDW9u IFNob3dQYXJhbSBuDWdsb2JhbCBjdXJyZW50UGFyYW0NcHV0IG4gaW50byBjdXJyZW50 UGFyYW0NcHV0IGxpbmUgbiBvZiBmaWVsZCBpZCAxMCBpbnRvIHgNaWYgeCA9ICIiIHRo ZW4NcHV0IDAgaW50byBjdXJyZW50UGFyYW0NcHV0IHRydWUgaW50byBsb2NraW5nDWVs c2UNcHV0IGl0ZW0gMSBvZiB4IGludG8gZmllbGQgaWQgNg1wdXQgaXRlbSAyIG9mIHgg aW50byBmaWVsZCBpZCA3DWRlbGV0ZSBpdGVtIDEgdG8gMiBvZiB4DXB1dCB4IGludG8g ZmllbGQgaWQgOQ1wdXQgZmFsc2UgaW50byBsb2NraW5nDWVuZCBpZg1zZXQgbG9ja3Rl eHQgb2YgZmllbGQgaWQgNiB0byBsb2NraW5nDXNldCBsb2NrdGV4dCBvZiBmaWVsZCBp ZCA3IHRvIGxvY2tpbmcNc2V0IGxvY2t0ZXh0IG9mIGZpZWxkIGlkIDkgdG8gbG9ja2lu Zw1lbmQgU2hvd1BhcmFtDQ1vbiBTYXZlUGFyYW0NZ2xvYmFsIGN1cnJlbnRQYXJhbQ1p ZiBjdXJyZW50UGFyYW0gPD4gMCB0aGVuDXB1dCBmaWVsZCBpZCA2IGludG8gaXRlbSAx IG9mIHgNcHV0IGZpZWxkIGlkIDcgaW50byBpdGVtIDIgb2YgeA1wdXQgZmllbGQgaWQg OSBpbnRvIHkNLS0gd2UgbXVzdCByZW1vdmUgYWxsIGNhcnJpYWdlIHJldHVybiBmcm9t IHRoZSBjb21tYSBmaWVsZA1yZXBlYXQgdW50aWwgaSA9IDANcHV0IG9mZnNldChyZXR1 cm4sIHkpIGludG8gaQ1pZiBpID4gMCB0aGVuIHB1dCBzcGFjZSBpbnRvIGNoYXIgaSBv ZiB5DWVuZCByZXBlYXQNcHV0IHggJiAiLCIgJiB5IGludG8gbGluZSBjdXJyZW50UGFy YW0gb2YgZmllbGQgaWQgMTANZW5kIGlmDWVuZCBTYXZlUGFyYW0NAAAAAAAAAAAAAAAA AAAAAAAAAAAAAIBCTUFQAAAa7QAAAAAAAAAAAAEAAAAAAAABVgIAAAAAAAFWAgAAGAAA ADcAsQAAAAAAAAAAAAAAAAAAACSMEIDhFAEChYrhJoAA4TUBgAC5ho4QgOElgACNEEDh JUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgEJLR0QAAByvAAAAAAAA HxZAAAAAAAAAAQAADjwAAB6FAA0ADgAACqIABAAAADIAZAABAQAAIACjADIA1KAAAAAA AAABAAAADAAAABBTdWl0ZQAAb24gbW91c2VVcA1nbyB0byBjYXJkICgic3VpdGUiICYm IGZpZWxkIHN1aXRlQ29kZSkNZW5kIG1vdXNlVXAAAIgAAgIEACAAzgAyARYAAgAAAAAA AAAEAAwBAAAQU3VpdGVDb2RlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhp cyBpcyB0aGUgc3VpdGUgY29kZSBvZiB0aGlzIGNvbXBhcmUgb3BlcmF0b3IuIg1lbmQg TW91c2VXaXRoaW4NAAAiAAMCDABKACoAWwBZAAAAAAAA//8AFQAMAQAAEAAAAAAA4AAE AgQASABYAFsBCAACAAAAAAAAAAQADAAAABBjb21wYXJlTmFtZQAAb24gTW91c2VXaXRo aW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBuYW1lIG9m IHRoaXMgY29tcGFyaXNvbiBvcGVyYXRvci4iDWVsc2UNU2hvd0JhbGxvb24gIlRoaXMg aXMgdGhlIG5hbWUgb2YgdGhpcyBjb21wYXJpc29uIG9wZXJhdG9yLiINZW5kIGlmDWVu ZCBNb3VzZVdpdGhpbg0AAAAiAAUCHABKARMAXAFPAAAAAAAA//8AFQAMAQAAEAAAAAAA 2gAGAgQASAFOAFoBgAACAAAAAAAAAAQADAAAABBjb21wYXJlSUQAAG9uIE1vdXNlV2l0 aGluDWlmICBtZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciB0aGUgSUQgb2Yg dGhpcyBjb21wYXJpc29uIG9wZXJhdG9yLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhpcyBp cyB0aGUgSUQgb2YgdGhpcyBjb21wYXJpc29uIG9wZXJhdG9yLiINZW5kIGlmDWVuZCBN b3VzZVdpdGhpbg0AAAAiAAcCDABsAAAAfABZAAAAAAAA//8AFQAMAQAAEAAAAAAA5gAI AgQAbQBYAN0B+wAHAAAAAAAAAAQACQAAAAxjb21wYXJlQ29tbWVudAAAb24gTW91c2VX aXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIGEgY29tbWVu dCBmb3IgdGhpcyBjb21wYXJpc29uIG9wZXJhdG9yLiINZWxzZQ1TaG93QmFsbG9vbiAi VGhpcyBpcyBjb21tZW50IGFib3V0IHRoaXMgY29tcGFyaXNvbiBvcGVyYXRvci4iDWVu ZCBpZg1lbmQgTW91c2VXaXRoaW4NAAAiAAkCDQAZAAAAOQCqAAAAAAAAAAAAFQAYCAAA IAAAAAABeAAKAQAAOgG0AFIB0iAAAAAD9gABAAAADAAAABAAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIHRvIHRoZSBwcmV2aW91cyBjb21w YXJpc29uIG9wZXJhdG9yIGluIHRoaXMgc3VpdGUuIg1lbmQgTW91c2VXaXRoaW4NDW9u IG1vdXNlVXANZ2V0IHRoZXJlIGlzIGEgY2FyZCAyIG9mIHRoaXMgYmtnbmQNaWYgbm90 IGl0IHRoZW4gZXhpdCBtb3VzZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBjYXJkIDIg b2YgdGhpcyBia2duZCBpbnRvIHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJk IDw+IHggdGhlbg12aXN1YWwgd2lwZSByaWdodA1nbyBwcmV2IGNhcmQgb2YgdGhpcyBi a2duZA1lbmQgaWYNZW5kIG1vdXNlVXAAATYACwEAADoB1QBSAfMgAAAAA/UAAQAAAAwA AAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyB0 byB0aGUgbmV4dCBjb21wYXJpc29uIG9wZXJhdG9yIGluIHRoaXMgc3VpdGUuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANcHV0IHRoZSBzaG9ydCBuYW1lIG9mIGxhc3Qg Y2FyZCBvZiB0aGlzIGJrZ25kIGludG8geA1pZiB0aGUgc2hvcnQgbmFtZSBvZiB0aGlz IGNhcmQgPD4geCB0aGVuDXZpc3VhbCB3aXBlIGxlZnQNZ28gbmV4dCBjYXJkIG9mIHRo aXMgYmtnbmQNZW5kIGlmDWVuZCBtb3VzZVVwAALoAA0BAAAfATsAMwGVkAUAAAAAAAEA AAAMAAAAEGZyb20gQUVVVAAAb24gTW91c2VXaXRoaW4NaWYgaGlsaXRlIG9mIG1lIHRo ZW4NU2hvd0JhbGxvb24gIlRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbXBhcmlz b24gY29tZXMgZnJvbSB0aGUgYWV1dCByZXNvdXJjZS4iIMINJiYgIklmIHlvdSBtb2Rp ZnkgdGhlIGNvbXBhcmlzb24sIHlvdSBzaG91bGQgY2xpY2sgaGVyZSBzbyB0aGF0IHRo ZSBjbGFzcyIgwg0mJiAiZ29lcyB0byB0aGUgYWV0ZSByZXNvdXJjZS4iDWVsc2UNU2hv d0JhbGxvb24gIlRoaXMgc2hvd3MgdGhlIGNvbXBhcmlzb24gY29tZXMgZnJvbSB0aGUg YWV0ZSByZXNvdXJjZS4iIMINJiYgIlRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYXJrIGl0 IGFzIGNvbWluZyBmcm9tIHRoZSBhZXV0IHJlc291cmNlLiIgwg0mJiAiSWYgeW91IGlu c2lzdCBvbiBjaGFuZ2luZyBpdCwgY2xpY2sgaGVyZSB3aXRoIG9wdGlvbiBrZXkgZG93 bi4iIMINJiYgIkl0IHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIGFldGUgcmVzb3Vy Y2UuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXB1dCBoaWxpdGUg b2YgYmtnbmQgYnV0dG9uICJmcm9tIEFFVVQiIGludG8gY3VyU3RhdGUNaWYgY3VyU3Rh dGUgb3IgKHRoZSBvcHRpb25LZXkgaXMgZG93bikgdGhlbg1zZXQgaGlsaXRlIG9mIGJr Z25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0byBub3QgY3VyU3RhdGUNZW5kIGlmDWVuZCBt b3VzZVVwAAD4AA4BAAARAcEAOAHooAAAABpAAAEAAAAMAAAAEEdvIEJhY2sAAG9uIE1v dXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhl IGNhcmQgeW91IGxhc3QgdmlzaXRlZCLCDSYmInRoaXMgc2Vzc2lvbi4iDWVuZCBNb3Vz ZVdpdGhpbg0Nb24gbW91c2VVcA1nbG9iYWwgZ1doZXJlZnJvbQ1ITVJlbW92ZUJhbGxv b24NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28gZ1doZXJlRnJvbQ1lbmQgbW91c2VVcA0A AAMABQBOYW1lAAAFAAMASUQAAAcADABEZXNjcmlwdGlvbgAJAAwAQ29tcGFyaXNvbnNj b21wYXJpc29uAG9uIE9wZW5DYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRoZW4N Z2xvYmFsIGN1cnJlbnRTdWl0ZSxjdXJyZW50TmFtZQ1wdXQgZmllbGQgInN1aXRlQ29k ZSIgaW50byBjdXJyZW50U3VpdGUNcHV0IGZpZWxkICJjb21wYXJlTmFtZSIgaW50byBj dXJyZW50TmFtZQ1lbmQgaWYNZW5kIE9wZW5DYXJkDQ1vbiBjbG9zZWNhcmQNZ2xvYmFs IGluRWRpdA1pZiBpbkVkaXQgdGhlbg1pZiBmaWVsZCAic3VpdGVDb2RlIiA8PiAiKioq KiIgdGhlbg1nbG9iYWwgY3VycmVudFN1aXRlLGN1cnJlbnROYW1lDWlmIGN1cnJlbnRT dWl0ZSA8PiBmaWVsZCAic3VpdGVDb2RlIiB0aGVuDXB1dCAic3VpdGUiICYmIGZpZWxk ICJzdWl0ZUNvZGUiIGludG8gc3VpdGVOYW1lDWlmIG5vdCAodGhlcmUgaXMgYSBjYXJk IHN1aXRlTmFtZSkgdGhlbg1wdXQgY3VycmVudFN1aXRlIGludG8gZmllbGQgInN1aXRl Q29kZSINYW5zd2VyIHN1aXRlTmFtZSAmICJkb2VzIG5vdCBleGlzdCBhbmQgd2lsbCBu b3QgYmUgdXNlZCINZW5kIGlmDWVuZCBpZg1wdXQgY3VycmVudFN1aXRlICYmIChzaG9y dCBuYW1lIG9mIHRoaXMgY2FyZCkgJiAiLCIgJiBjdXJyZW50TmFtZSBpbnRvIG9sZE5h bWUNcHV0IGZpZWxkICJzdWl0ZUNvZGUiICYmICJjb21wYXJpc29uIiAmJiBSZXNUeXBl KGZpZWxkICJjb21wYXJlSUQiKSDCDSYgIiwiICYgZmllbGQgImNvbXBhcmVOYW1lIiBp bnRvIG5ld05hbWUNaWYgbmV3TmFtZSA8PiBvbGROYW1lIHRoZW4NTmFtZUl0IG5ld05h bWUNQ2hhbmdlTmFtZSBvbGROYW1lLCBuZXdOYW1lLCAiY29tcGFyZUxpc3QiDWVuZCBp Zg1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBjdXJyZW50U3VpdGUNZW5kIGlmDWVu ZCBpZg1QYXNzIGNsb3NlY2FyZA1lbmQgY2xvc2VjYXJkDQ1vbiBuZXdjYXJkDWdsb2Jh bCBjdXJyZW50U3VpdGUNcHV0IGN1cnJlbnRTdWl0ZSBpbnRvIGZpZWxkICJzdWl0ZUNv ZGUiDVBhc3MgbmV3Y2FyZA1lbmQgbmV3Y2FyZA0Nb24gZGVsZXRlY2FyZA1DaGFuZ2VO YW1lIGZpZWxkICJzdWl0ZUNvZGUiICYmIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkLCDC DSIiLCAiY29tcGFyZUxpc3QiDXBhc3MgZGVsZXRlY2FyZA1lbmQgZGVsZXRlY2FyZA0A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQk1BUAAAHxYAAAAAAAAAAAABAAAAAAAA AVYCAAAAAAABVgIAABgAAAA3AKgAAAAAAAAAAAAAAAAAAAAkjBCA4RMCA6KFiuEUAQPh FAMDuIaOEIDhEwIDjRBA4RSAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A8BDQVJEAAA7gwAAAAAAAA8tAAAAAAAAAAAAAAAAAAA68AAADjwABQAKAAAC1AACAAAA mgECAAQBAAEoAXwBVgG4oAAAAGB2AAEAFQAMAQAAEEluc3RydWN0aW9ucwAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ2V0IGluc3RydWN0aW9u cyBmb3IgdXNpbmcgdGhpcyBzdGFjay4iDWVuZCBNb3VzZVdpdGhpbg0NDW9uIG1vdXNl VXANZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2QgaW50byBnV2hlcmVGcm9t DXZpc3VhbCBkaXNzb2x2ZSBmYXN0DWdvIGNkICJpbnN0cnVjdGlvbnMiDWVuZCBtb3Vz ZVVwAAAiAAUCAABqAHwAkAHNAAAAAAAAAAAAFQAMAQAAEAAAAAAAmAAHAQAA+AC9AQQA zwAAAAAAAAABAAAADAAAABAAAG9uIG1vdXNlRW50ZXINYmVlcCAyDWVuZCBtb3VzZUVu dGVyDQ1vbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiUGxhY2UgdGhlIGN1cnNvciBo ZXJlIHRvIGJlZXAgdHdpY2UuIg1lbmQgTW91c2VXaXRoaW4NAAAiAAgCBAE7AAMBVgCN AAAAAAAAAAAAAwAMAAAAEAAAAAAA9gAKAQABMgHNAUwB8iAAAAA+0wABABUADgEAABJQ cm9jZWVkyQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8g Z28gdG8gdGhlIFJlc291cmNlIFRvb2xzIGNhcmQuIg1lbmQgTW91c2VXaXRoaW4NDQ0N b24gbW91c2VVcA1nbG9iYWwgZ1doZXJlRnJvbQ1wdXNoIGNkDXBvcCBjZCBpbnRvIGdX aGVyZUZyb20NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28gY2FyZCAiTWFpbk1lbnUiDWVu ZCBtb3VzZVVwAAD/+wBdAFVzZSBzdGFjayB0aGlzIHRvIGNyZWF0ZSwgbWFpbnRhaW4s IGFuZCBleHRlbmQNQXBwbGUgRXZlbnSqIFRlcm1pbm9sb2d5IEV4dGVuc2lvbiByZXNv dXJjZXMuAP/4ADSABgAAAAepMTk5MiBBcHBsZSBDb21wdXRlciwgSW5jLg1BbGwgUmln aHRzIFJlc2VydmVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2BCTUFQAAAP LQAAAAAAAAAAAAEAAAAAAAABVgIAAAAAAAFWAgAAIAAaAVMB/gAAAAAAAAAAAAAAAAAA CwgbwOMEKg/A4wQqP8DjBCr/wOMEOQP/wOMEOQf/wOMEOQ//gOMEOR//gOMEOT//gOME OX//gOMEKX//4wUp///jBSn//uMFOAH//uMFOAH//OMFOAP/+OMFOAP/8OMFhTgD/+Dj BTgH/4DjBSgH/+MGKAf+4wZ1A/8AB/gD/+MEBcEf//AHgD//8OMDBcF///8AA////OMD FAHB////8B/////jAyQD/8H/////////gOMCJA//wf/////////A4wIkH//B//////// //DjAiQ//8H/////////+OMCJH//wf/////////84wKFJP//wf/////////+4wIzAf// wf/////////44wIzAf//wf/////////w4wIzA///wf/////////g4wKKHSASPnh///AA A+Hw4hMEGUASQBR8GnzhD+EQAeIPEwgZgBKAFIAagOEPHAEYBAPBh//wAAQh8AThDx8B 4xMQGAITEFL+BwcA/iQHwMED5wcA/wB8cOEKHwJyAwGAAAMBgCM4MFMDAMABgOEKHAQi BCDBAAwAQAAMAEAzQAgEQgwAIILhC+ERgMEQACgBEAAhCGKAAEAoARATEOEKXwhAACD4 wg4OIPgAD/+BA8AADg4AeBDhDBMgGAglAQQiAQQkDCBTIYYAAeDhCk8QgABCE0IkAhAU QhIC4QvhHggkAQThCx8hAsKD/AIQg/wCH/+EIACAQhCEEgjhC+EQCOIPP0H4QOIOH4By B//gAAf/4OIH4S0gECMCEuEMHgElBCAiBCBDAQCEIBMQ4QsvD/giB8AiB8AUQCQEIOEM TAgAAhByBBhAAAQYQCMhgCMGGOEN4TKD4ADBOIPgAD//gB5DOIHgQOEMPgQgAMEgAAGA CAABgGKEAEAgAAgShOEM4UAEAGACMmACCEICAMIBQkADACDhCxMgSAQACEBiGBwEABgc IwGDQgQAMAzhDYkjH//B//////////zjAyMf/8H//////////uMDhSMf/8H///////// /+MDMw///8H/////////gOMCMw///8H/////////wOMChTMP///B/////////+DjAjMH ///B//////////jjAjMH///B//////////zjAjMH///B//////////7jAooTBCkBwOMB hRMCGkDjAaKFiST//8H//////////+MChSR//8H//////////uMChSQ//8H///////// /OMChSQf/8H/////////+OMCJA//wf/////////w4wKFJAf/wf/////////g4wKFJAP/ wf/////////A4wIkAf/B/////////4DjAgXB///////////jA4UFwX/////////+4wMF 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 UkQAABAuAAAAAAAAEW8AAAAAAAAAAAAAAAAAADrwAAAOPAAGAAgAAAMQAAMAAHGkAC4A AgIFADEABgExAfsABwAAAAAAAAADAAwAAAAQSW5zdHJ1Y3Rpb25zAAAAAADAAAMBAAE5 AAYBUwCVoAQAAAAAAAEAFQAMAQAAEFByaW50IEluc3RydWN0aW9ucwAAb24gTW91c2VX aXRoaW4NU2hvd0JhbGxvb24gIlByaW50IGluc3R1Y3Rpb25zIGZvciB1c2luZyB0aGlz IHN0YWNrLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXByaW50IGNhcmQgZmll bGQgIkluc3RydWN0aW9ucyINZW5kIG1vdXNlVXAAAADoAAQBAAAGAb8ALgH2oAAAABpA AAEAAAAMAAAAEEdvIEJhY2sAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGlj ayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhlIGxhc3QgY2FyZCB5b3UgdmlzaXRlZCLCDSYi IGluIHRoaXMgc3RhY2suIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFs IGdXaGVyZUZyb20NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28gZ1doZXJlRnJvbQ1lbmQg bW91c2VVcAAA9gAFAQABMgHNAUwB8iAAAAA+0wABABUADgEAABJQcm9jZWVkyQAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhlIFJl c291cmNlIFRvb2xzIGNhcmQuIg1lbmQgTW91c2VXaXRoaW4NDQ0Nb24gbW91c2VVcA1n bG9iYWwgZ1doZXJlRnJvbQ1wdXNoIGNkDXBvcCBjZCBpbnRvIGdXaGVyZUZyb20Ndmlz dWFsIGRpc3NvbHZlIGZhc3QNZ28gY2FyZCAiTWFpbk1lbnUiDWVuZCBtb3VzZVVwAAAA IgAGAgQAFgAGADEBBQAAAAAAAAAAABUAGAAAACAAAAAAACIACAIFABcABQAzAQMAAAAA AAAAAAAVABQIAAAaAAAAAP/+cXOB8gAAAAsAKgAMACsADQAwAAwANAANAL8ADADDAA0B owAKAckADQapAAsGvwAJBsAADRK/AAwSygANEwAADBMKAA0TdAAME38ADRPHAAwT0gAN FTUADBVCAA0WDAALFiYADRa9AAwWyQANFvIADBb9AA0XJQAMFzMADRdeAAwXZgANF5sA DBehAA0X9QAMF/wADRhPAAwYWwANGJsADBimAA0Y/wAMGQoADRmQAAwZnAANGfEADBoA AA0abwALGowADRuSAAwbnQANG88ADBvZAA0cHgAMHCkADRxbAAwcZAANHu8ADB7wAA0e 8gAMHv0ADSA5AAwgRAANIcQACSJXAA0l6AAMJfIADSb5AAwnBAANJ8sACSh9AA0oggAM KI0ADSppAAkrGgANKx4ACysxAA0sewAMLIgADS1aAAwtaQANLvwADC8LAA0v2AAML+wA DTHbAAsx7AANMq4ACzLGAA00lgALNKsADTf6AAw3/gANONEADDjVAA05BAAMOQcADTnI AAk6AwANOmEADDpnAA07CAAMOw4ADTwaAAw8JQANPHUADDyAAA09lwALPasADUFKAAtB ZQANQ0IAC0NkAA1EIAALRCwADUywABBMyAANTMoAC0zTAA1S3AALUu4ADVUXAAtVIwAN asQADGrFAA0NQWJvdXQgQWV0ZSBSZXNvdXJjZXMgYW5kIFVzaW5nIHRoaXMgU3RhY2sN VGhlICdhZXV0JyAoQXBwbGUgRXZlbnQgVXNlciBUZXJtaW5vbG9neSkgcmVzb3VyY2Ug ZGVzY3JpYmVzIGNvbW1vbiBBcHBsZSBldmVudHMgYXMgZGVmaW5lZCBpbiB0aGUgbGF0 ZXN0IHZlcnNpb24gb2YgdGhlIEFwcGxlIEV2ZW50IFJlZ2lzdHJ5LiBUaGUgJ2FldGUn IChBcHBsZSBFdmVudCBUZXJtaW5vbG9neSBFeHRlbnNpb24pIHJlc291cmNlIGRlc2Ny aWJlcyBob3cgYW4gYXBwbGljYXRpb24gc3VwcG9ydHMgQXBwbGUgZXZlbnRzLiBPZnRl biBpdCBpcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgY29udGVudCBvZiB0aGUgJ2FldXQn LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAnYWV1dCcgYW5kICdhZXRlJyByZXNvdXJj ZXMsIHNlZSB0aGUgbGF0ZXN0IEFwcGxlIEV2ZW50IFVzZXIgVGVybWlub2xvZ3kgUmVz b3VyY2VzIGRldmVsb3BlciBub3RlLiBUaGlzIHN0YWNrIGFsbG93cyB5b3UgdG8gY29u dmVydCBhbiAnYWV0ZScgcmVzb3VyY2UgdG8gYW5kIGZyb20gYSBjb3B5IG9mIHRoaXMg c3RhY2suIEFmdGVyIGRvaW5nIHNvLCB5b3UgY2FuIHZpZXcgdGhlIGNvbnRlbnQgb2Yg dGhpcyByZXNvdXJjZSBhcyB3ZWxsIGFzIGVkaXQgaXQuIFlvdSBjYW4gYWxzbyBnZW5l cmF0ZSB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHN0YWNrLCBzdWNoIGFzIHNh bXBsZSBjb2RlIGZvciB1c2luZyBBcHBsZSBldmVudHMgZnJvbSBsYW5ndWFnZXMgc3Vj aCBhcyBIeXBlclRhbGssIFBhc2NhbCwgb3IgQy4NDUFuICdhZXRlJyByZXNvdXJjZSBn cm91cHMgaW5mb3JtYXRpb24gaW50byBmdW5jdGlvbmFsIGFyZWFzLCBlYWNoIG9mIHdo aWNoIGlzIGNhbGxlZCBhIHN1aXRlLiBBIHBhcnRpY3VsYXIgcmVzb3VyY2UgbWlnaHQg ZGVmaW5lIGEgdGV4dCBzdWl0ZSwgZ3JhcGhpYyBzdWl0ZSwgZGF0YWJhc2Ugc3VpdGUs IGV0Yy4gV2l0aGluIGVhY2ggc3VpdGUsIHRoZXJlIGFyZSBmb3VyIGtpbmRzIG9mIGRh dGE6IGV2ZW50IGRlc2NyaXB0aW9ucywgdXNlciBhY2Nlc3NpYmxlIG9iamVjdCBjbGFz cyBkZXNjcmlwdGlvbnMsIGNvbXBhcmlzb24gb3BlcmF0b3IgZGVzY3JpcHRpb25zLCBh bmQgZW51bWVyYXRvciBkZXNjcmlwdGlvbnMuIFRoaXMgc3RhY2sgcmVmbGVjdHMgdGhl IG9yZ2FuaXphdGlvbiBvZiB0aGUgJ2FldGUnIHJlc291cmNlIGFuZCB1c2VzIGNhcmRz IG9mIGRpZmZlcmVudCBiYWNrZ3JvdW5kcyB0byBjb250YWluIHRoZSBkaWZmZXJlbnQg a2luZHMgb2YgaW5mb3JtYXRpb27RdGhlcmUgYXJlIHN1aXRlIGNhcmRzIHRoYXQgYWN0 IGFzIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgZGF0YSBpbiB0aGUgc3VpdGUs IGFzIHdlbGwgYXMgZXZlbnQgY2FyZHMsIGNsYXNzIGNhcmRzLCBjb21wYXJpc29uIGNh cmRzIGFuZCBlbnVtZXJhdG9yIGNhcmRzLg0NQmFsbG9vbiBoZWxwIGlzIGF2YWlsYWJs ZSB0aHJvdWdob3V0IHRoZSBzdGFjay4gVXNlIGl0IHRvIHN1cHBsZW1lbnQgdGhlc2Ug aW5zdHJ1Y3Rpb25zIGFuZCBmaW5kIG91dCBtb3JlIGFib3V0IHRoZSBmdW5jdGlvbnMg YW5kIGJlaGF2aW9yIG9mIGVhY2ggc3RhY2sgZWxlbWVudC4NDUEgbWVtb3J5IHBhcnRp dGlvbiBvZiAxNTAwayBvciBncmVhdGVyIGZvciBIeXBlckNhcmQgaXMgcmVjb21tZW5k ZWQgZm9yIHVzZSB3aXRoIHRoaXMgc3RhY2suDQ0NQW4gT3ZlcnZpZXcgVGhpcyBTdGFj aw1Zb3UgY2FuIG5hdmlnYXRlIGZyb20gY2FyZCB0byBjYXJkIGluIHRoaXMgc3RhY2sg YnkgY2hvb3NpbmcgaXRlbXMgaW4gdGhlINJBZXRlRWRpdG9y0yBtZW51LCBjbGlja2lu ZyBvbiBidXR0b25zLCBvciBjbGlja2luZyBvbiB0ZXh0Lg0NVG8gYmVnaW4gdXNpbmcg dGhpcyBzdGFjaywgY2xpY2sgb24gdGhlINJSZXNvdXJjZSBUb29sc9MgYnV0dG9uIG9u IHRoaXMgY2FyZCBvciBjaG9vc2Ug0lJlc291cmNlIFRvb2xz0yBmcm9tIHRoZSBBZXRl RWRpdG9yIG1lbnUuIFlvdSBjYW4gZ28gdG8gYW55IG90aGVyIHNlY3Rpb24gb2YgdGhp cyBzdGFjayBmcm9tIGFueSBvdGhlciBjYXJkIGJ5IGNob29zaW5nIGEgc2VjdGlvbtVz IG5hbWUgZnJvbSB0aGlzIG1lbnUuIA0NVGhlIFJlc291cmNlIFRvb2xzIGNhcmQgYWN0 cyBhcyBhIGNvbnRyb2wgY2VudGVyIGZvciBvcGVyYXRpbmcgb24gJ2FldGUnIHJlc291 cmNlcywgYXMgd2VsbCBhcyBjcmVhdGluZyBuZXcgQXBwbGUgRXZlbnQgc3VpdGVzIGFu ZCBhY2Nlc3NpbmcgZXhpc3Rpbmcgb25lcy4gV2l0aGluIHRoaXMgY2FyZCwgeW911Wxs IG5vdGljZSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgYnV0dG9ucyBmb3IgZXhlY3V0aW5n IGNvbW1hbmRzLCBhIHNjcmF0Y2ggYXJlYSBmb3IgaG9sZGluZyBnZW5lcmF0ZWQgaW5m b3JtYXRpb24sIGFuZCBhIGxpc3Qgb2YgdGhlIHN1aXRlcyBkZXNjcmliZWQgaW4gdGhl IHN0YWNrLg0NQ2xpY2tpbmcgb24gYSBzdWl0ZSBpZCBpbiB0aGUgbWFpbiBtZW51IHRh a2VzIHlvdSB0byB0aGUgY2FyZCBmb3IgdGhhdCBzdWl0ZS4gRWFjaCBzdWl0ZSBjYXJk IGNvbnRhaW5zIGxpc3RzIG9mIGV2ZW50cywgY2xhc3NlcywgY29tcGFyaXNvbnMgYW5k IGVudW1lcmF0b3JzLiBZb3UgY2FuIGNsaWNrIG9uIGFuIGl0ZW0gaW4gZWFjaCBvZiB0 aGVzZSBsaXN0cyB0byBhY2Nlc3MgYSBjYXJkIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24g YWJvdXQgdGhhdCBpdGVtLiBUaGlzIHN0YWNrIGFsc28gY29udGFpbnMgYW4gZXhhbXBs ZSAnYWV0ZScgcmVzb3VyY2Ugd2hpY2ggeW91IGNhbiB1c2UgdG8gYmVjb21lIGZhbWls aWFyIHdpdGggdGhlIHN0YWNr1XMgbGF5b3V0LiANDU9mIGNvdXJzZSwgeW911XJlIHBy b2JhYmx5IG1vcmUgaW50ZXJlc3RlZCBpbiB3b3JraW5nIHdpdGggYW4gJ2FldGUnIHJl c291cmNlIG9mIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvciBjcmVhdGluZyBhIHdo b2xlIG5ldyAnYWV0ZScgcmVzb3VyY2UuIEJlZm9yZSBhdHRlbXB0aW5nIHRvIGRvIGVp dGhlciBvZiB0aGVzZSwgdGhlIGZpcnN0IHRoaW5nIHlvdSBzaG91bGQgZG8gaXMgbWFr ZSBhIGNvcHkgb2YgdGhpcyBzdGFjayB0byB3b3JrIHdpdGguIFRvIGRvIHRoaXMsIGNo b29zZSDSTmV3IEVkaXRvcsnTIGZyb20gdGhlIEFldGVFZGl0b3IgbWVudS4gSWYgeW91 ciBhcHBsaWNhdGlvbiBhbHJlYWR5IGhhcyBhbiAnYWV0ZScgcmVzb3VyY2UsIHlvdSBj YW4gcmVhZCBpdCBpbnRvIHRoaXMgc3RhY2sgYnkgY2xpY2tpbmcgb24gdGhlICJJbXBv cnQgYWV0ZSIgYnV0dG9uLiBBZnRlciBjaG9vc2luZyBhbiBhcHBsaWNhdGlvbiBmcm9t IHN0YW5kYXJkIGZpbGUsIHRoZSAnYWV0ZScgcmVzb3VyY2Ugd2lsbCBiZSByZWFkIGlu IGFuZCBjb252ZXJ0ZWQgaW50byBkYXRhIHByZXNlbnRlZCBpbiB0aGUgc3RhY2suIA0N Tm9ybWFsbHksIHRoZSBzdGFjayB3aWxsIGRpc3BsYXkgdGhlIHNhbWUgY29udGVudCBh cyB0aGUgJ2FldGUnIHJlc291cmNlLiBJbiBvdGhlciB3b3JkcywgeW911WxsIHNlZSB0 aGUgY29udGVudCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpZiB5b3XVZCBvcGVuZWQgYW4g J2FldGUnIHJlc291cmNlIHVzaW5nIFJlc0VkaXQuIEhvd2V2ZXIsIHRoaXMgbWVhbnMg dGhhdCB5b3Ugd2lsbCBub3QgYmUgc2VlaW5nIGFsbCB0aGUgZXZlbnRzIGFuZCBjbGFz c2VzIHRoYXQgeW91IGhhZCBpbmhlcml0ZWQgZnJvbSB0aGUgJ2FldXQnIHJlc291cmNl LiBPcHRpb25hbGx5LCB5b3UgbWF5IGFsc28gbWVyZ2UgdGhlICdhZXRlJyByZXNvdXJj ZSB3aXRoIHRoZSAnYWV1dCcgcmVzb3VyY2Ugd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQg aW4gdGhpcyBzdGFjay4NDUFmdGVyIHlvddV2ZSByZWFkIGluIGFuICdhZXRlJyByZXNv dXJjZSAob3IgYWx0ZXJuYXRpdmVseSwgYmVndW4gd2l0aCBhbiBlbXB0eSBzdGFjayks IHlvdSBjYW4gc3RhcnQgZWRpdGluZyB0aGUgY29udGVudHMgb2YgdGhlIHN0YWNrLiBU aGVyZSBhcmUgYnV0dG9ucyB3aGljaCB5b3UgY2FuIHVzZSB0byBjcmVhdGUgY2FyZHMg Zm9yIGEgbmV3IHN1aXRlLCBldmVudCwgY2xhc3MsIGNvbXBhcmlzb24sIG9yIGVudW1l cmF0b3IuIFlvdSBtYXkgYWxzbywgaWYgeW91IHdpc2gsIHVzZSB0aGUgIk5ldyBDYXJk IiBvciDSRGVsZXRlIENhcmTTIG1lbnUgaXRlbXMgZnJvbSBIeXBlckNhcmTVcyBFZGl0 IG1lbnUuIFlvdSBjYW4gbW9kaWZ5IHRoZSAnYWV0ZScgaW5mb3JtYXRpb24gb24gdGhl c2UgY2FyZHMgYnkgY2hhbmdpbmcgdGhlIGRhdGEgaW4gdGhlcmUgZmllbGRzLiBFYWNo IGNhcmQgY29udGFpbnMgbGlzdHMgYW5kIGJ1dHRvbnMgZm9yIGFkZGluZywgZGVsZXRp bmcgb3IgYWNjZXNzaW5nIGl0ZW1zIGZvciBlZGl0aW5nLg0NQWZ0ZXIgeW91IGZpbmlz aCBlZGl0aW5nIHRoZSBzdGFjaywgeW91IG1heSBvYnRhaW4gaW5mb3JtYXRpb24gZnJv bSBpdC4gVGhpcyBpbmZvcm1hdGlvbiwgaWYgaXQgaXMgaW4gVEVYVCBmb3JtLCB3aWxs IGdvIHRvIHRoZSBzY3JhdGNocGFkIGZpZWxkIG9uIHRoZSBSZXNvdXJjZSBUb29scyBj YXJkIHdoZXJlIHlvdSBjYW4gdmlldyBpdCBpbiBpdHMgZW50aXJldHkuIFRoaXMgY2Fy ZCBhbHNvIGhhcyBidXR0b25zIHdoaWNoIGxldCB5b3UgcHJpbnQgdGhlIGluZm9ybWF0 aW9uIGluIHRoZSBzY3JhdGNocGFkLCBzYXZlIGl0IHRvIGEgZmlsZSwgb3Igd3JpdGUg aXQgdG8gdGhlIGNsaXBib2FyZC4gQWRkaXRpb25hbGx5LCB0aGVyZSBhcmUgYnV0dG9u cyBmb3IgZ2VuZXJhdGluZyBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgaW5m b3JtYXRpb246DQ2lIE91dHB1dCBhZXRlIC0gd3JpdGVzIHlvdXIgJ2FldGUnIHJlc291 cmNlIHRvIHlvdXIgYXBwbGljYXRpb24uDaUgRGVyZXogYWV0ZSAtIGdlbmVyYXRlcyB0 aGUgcmVzb3VyY2UgaW4gZGVyZXogZm9ybWF0LCB3aGljaCB5b3UgY2FuIHRoZW4gY29w eSB0byBNUFcgYW5kIHRvIHJleiB3aXRoIHlvdXIgcHJvZ3JhbS4NpSBTZXJ2ZXIgY29k ZSAtIHNhbXBsZSBjb2RlIG9uIGhvdyB5b3UgY2FuIHByb2Nlc3MgdGhlc2UgQXBwbGUg RXZlbnRzIGFzIGEgc2VydmVyLg2lIENsaWVudCBjb2RlIC0gc2FtcGxlIGNvZGUgb24g aG93IHlvdSBjYW4gc2VuZCB0aGVzZSBBcHBsZSBFdmVudHMgYXMgYSBjbGllbnQuDQ1G aW5hbGx5LCB0aGVyZSBhcmUgYSBsb3Qgb2YgaW50ZXJuYWwgbGlua3MgdGhhdCBuZWVk IHRvIGJlIG1haW50YWluZWQgYmV0d2VlbiB0aGUgY2FyZHMgb2YgdGhpcyBzdGFjaywg YSBzdWl0ZSBwb2ludHMgdG8gaXRzIGV2ZW50IGFuZCB0aGUgZXZlbnQgcG9pbnRzIHRv IGl0cyBjb2RlLCBldGMuIFRoZXNlIGxpbmtzIGFyZSBtYWludGFpbmVkIGF1dG9tYXRp Y2FsbHkuIElmIGZvciBzb21lIHJlYXNvbiB0aGVzZSBsaW5rcyBhcmUgYnJva2VuLCB0 aGVyZSBpcyBhbiBpbnRlcm5hbCBwcm9jZWR1cmUsIENvbnN0cnVjdExpbmssIHRoYXQg bGV0cyB5b3UgcmVjb25zdHJ1Y3QgdGhlIGxpbmtzIGFnYWluLiBUbyB1c2UgdGhpcyBy b3V0aW5lIHR5cGUg0kNvbnN0cnVjdExpbmvTIGluIEh5cGVyQ2FyZNVzIG1lc3NhZ2Ug Ym94IGFuZCBoaXQgdGhlIGVudGVyIGtleSB0byBleGVjdXRlIGl0LiBIb3BlZnVsbHks IHlvddVsbCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIGZlYXR1cmUuDQ0NVXNpbmcgdGhl IEFldGVFZGl0b3IgTWVudQ1Zb3UgY2FuIHVzZSB0aGlzIG1lbnUgdG8gbmF2aWdhdGUg ZnJvbSBvbmUgc2VjdGlvbiBvZiB0aGUgc3RhY2sgdG8gYW5vdGhlciBvciBwZXJmb3Jt IG90aGVyIHVzZWZ1bCB0YXNrcy4gQmVsb3cgaXMgYSBkZXNjcmlwdGlvbiBvZiBlYWNo IG1lbnUgaXRlbToNDaUgSW5zdHJ1Y3Rpb25zIC0gdGFrZXMgeW91IHRvIHRoZSBJbnN0 cnVjdGlvbnMgY2FyZC4NpSBQcmVmZXJlbmNlcyAtIHRha2VzIHlvdSB0byB0aGUgUHJl ZmVyZW5jZXMgY2FyZC4NpSBSZXNvdXJjZSBUb29scyAtIHRha2VzIHlvdSB0byB0aGUg UmVzb3VyY2UgVG9vbHMgY2FyZC4NpSCuIFN1aXRlcyAtIHRha2VzIHlvdSB0byB0aGUg Zmlyc3QgQXBwbGUgRXZlbnQgU3VpdGVzIGNhcmQuDaUgRXZlbnRzIC0gdGFrZXMgeW91 IHRvIHRoZSBmaXJzdCBldmVudCBjYXJkIG9mIHRoZSBmaXJzdCBzdWl0ZSBsaXN0ZWQg aW4gUmVzb3VyY2UgVG9vbHMuDaUgQ2xhc3Nlcy0gdGFrZXMgeW91IHRvIHRoZSBmaXJz dCBjbGFzcyBjYXJkIG9mIHRoZSBmaXJzdCBzdWl0ZSBsaXN0ZWQgaW4gUmVzb3VyY2Ug VG9vbHMuDaUgRW51bWVyYXRpb25zLSB0YWtlcyB5b3UgdG8gdGhlIGZpcnN0IGVudW1l cmF0aW9uIGNhcmQgb2YgdGhlIGZpcnN0IHN1aXRlLg2lIENvbXBhcmlzb25zIC0gdGFr ZXMgeW91IHRvIHRoZSBmaXJzdCBjb21wYXJpc29uIGNhcmQgb2YgdGhlIGZpcnN0IHN1 aXRlIGxpc3RlZCBpbiBSZXNvdXJjZSBUb29scy4NpSBOZXcgRWRpdG9yySAtIGNyZWF0 ZXMgYW4gZW1wdHkgY29weSBvZiB0aGUgc3RhY2sgYW5kIHRoZW4gdGFrZXMgeW91IHRv IGl0LiBIb2xkaW5nIGRvd24gdGhlIHNoaWZ0IGtleSB0YWtlcyB5b3UgdG8gdGhpcyBz dGFjayBpbiBhIG5ldyB3aW5kb3cuDaUgRW1wdHkgU3RhY2vJIC0gY2xlYXJzIHRoZSBz dGFjayBvZiBhbnkgc3RvcmVkINRhZXRl1SBpbmZvcm1hdGlvbi4gVGhpcyBhY3Rpb24g aXMgbm90IHVuZG9hYmxlLg2lIExvY2FsaXplIGFldGXJIC0gY3JlYXRlcyBhIG5ldyBz dGFjayBpbiB3aGljaCB5b3UgY2FuIHRyYW5zbGF0ZSBuYW1lcyBpbiB0aGUgYWN0aXZl IEFldGVFZGl0b3Igc3RhY2sgaW50byBhbm90aGVyIGxhbmd1YWdlLg0NDVVzaW5nIHRo ZSBSZXNvdXJjZSBUb29scyBDYXJkDVRoZXJlIGFyZSB0d28gZmllbGRzIG9uIHRoaXMg Y2FyZC4gVGhlIGxhcmdlciBvZiB0aGUgdHdvIGlzIGEgc2NyYXRjaHBhZCBhcmVhIHdo aWNoIGNhbiBiZSB1c2VkIGZvciB0aGUgb3V0cHV0IG9mIGNsaWVudCBvciBzZXJ2ZXIg c2FtcGxlIGNvZGUsIG9yIHRoZSBvdXRwdXQgb2YgYSBkZXJlemVkICdhZXRlJyByZXNv dXJjZS4gVGhlcmUgYXJlIGZvdXIgYnV0dG9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBm aWVsZCBhcyBkZXNjcmliZWQgYmVsb3c6DQ2lIENsZWFyIEZpZWxkIC0gY2xlYXJzIHRo ZSBjb250ZW50cyBvZiB0aGUgc2NyYXRjaHBhZCBmaWVsZC4NpSBDb3B5IEZpZWxkIC0g Y29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgc2NyYXRjaHBhZCBmaWVsZCBpbnRvIHRo ZSBjbGlwYm9hcmQuDaUgUHJpbnQgRmllbGQgLSBwcmludHMgdGhlIGNvbnRlbnRzIG9m IHRoZSBzY3JhdGNocGFkIGZpZWxkLg2lIFNhdmUgQXPJIC0gc2F2ZXMgdGhlIGNvbnRl bnQgb2YgdGhlIHNjcmF0Y2hwYWQgZmllbGQgdG8gYSBURVhUIGZpbGUuDQ1UaGUgb3Ro ZXIgZmllbGQgaXMgYSBsaXN0IG9mIHRoZSBzdWl0ZXMgaW4gdGhpcyBzdGFjay4gWW91 IGNhbiBhY2Nlc3Mgc3VpdGUgaW5mb3JtYXRpb24gYnkgY2xpY2tpbmcgb24gb25lIG9m IHRoZSBzdWl0ZSBjb2RlcyBpbiB0aGUgbGlzdC4gU2VsZWN0IHRoZSAiTmV3IHN1aXRl IiBidXR0b24gbG9jYXRlZCBiZWxvdyB0aGlzIGZpZWxkIHRvIGNyZWF0ZSBhIG5ldyBz dWl0ZS4NDUNsaWNraW5nIG9uIHRoZSAiUHJlZmVyZW5jZXPJIiBidXR0b24gd2lsbCB0 YWtlIHlvdSB0byB0aGUgUHJlZmVyZW5jZXMgY2FyZNFzZWUgdGhlIHNlY3Rpb24gb24g dGhlIFByZWZlcmVuY2VzIGNhcmQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2V0 dGluZyBQcmVmZXJlbmNlcy4NDU9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGlzIGNh cmQgeW911WxsIG5vdGljZSB0aGF0IHRoZXJlIGFyZSBhIG51bWJlciBvZiBidXR0b25z IHRoYXQgYWxsb3cgeW91IHRvIGltcG9ydCDUYWV0ZdUgZGF0YSBvciBnZW5lcmF0ZSBp bmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHN0YWNrLiBUaGV5 IGFyZSBkZXNjcmliZWQgYmVsb3c6DQ2lIE91dHB1dCBhZXRlIC0gd3JpdGVzIHRoZSAn YWV0ZScgb3V0IHRvIHlvdXIgYXBwbGljYXRpb24uIEFmdGVyIHRoZSByZXNvdXJjZSBk YXRhIGlzIGNyZWF0ZWQsIHlvdSB3aWxsIGJlIGFza2VkIHdoaWNoIGZpbGUgdG8gc2F2 ZSBpdCB0by4gSWYgeW91IGNhbmNlbCBvdXQgb2YgdGhpcyBzdGFuZGFyZCBmaWxlIGRp YWxvZywgdGhlIGNvbnRlbnRzIG9mIHRoZSDUYWV0ZdUgd2lsbCBiZSBwdXQgb24gdGhl IGNsaXBib2FyZC4gVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3aXNoIHRvIHBhc3Rl IHRoaXMgcmVzb3VyY2UgaW50byBhIGZpbGUgdXNpbmcgUmVzRWRpdC4gDQ2lIEltcG9y dCBhZXRlIC0gbGV0cyB5b3UgcmVhZCBpbiBhbiAnYWV0ZScgcmVzb3VyY2UgZnJvbSBh IGZpbGUuIElmIHlvdSBnZXQgYSBuZXcgYXBwbGljYXRpb24sIGZvciBpbnN0YW5jZSwg YW5kIHdpc2ggdG8gZmluZCBvdXQgd2hpY2ggQXBwbGUgZXZlbnRzIGl0IHN1cHBvcnRz IHRvIHVzZSB0aGlzIGZlYXR1cmUsIHRoaXMgaXMgd2hhdCB5b3XVZCBkby4gQ3JlYXRl IGEgbmV3IHN0YWNrIGJ5IGNob29zaW5nIHRoZSDSTmV3IEVkaXRvcsnTIG1lbnUgaXRl bSBmcm9tIHRoZSBBZXRlRWRpdG9yIG1lbnUuIE5leHQsIGNsaWNrIHRoZSBJbXBvcnQg YWV0ZSBidXR0b24gdG8gcmVhZCB0aGUgJ2FldGUnIHJlc291cmNlIGZyb20gdGhlIGZp bGUgeW911XZlIGNob3NlbiBpbnRvIHRoZSBzdGFjay4gQWx0ZXJuYXRpdmVseSwgaG9s ZCBkb3duIHRoZSBvcHRpb24ga2V5IHdoaWxlIGNsaWNraW5nIG9uIHRoZSBJbXBvcnQg YWV0ZSBidXR0b24gdG8gbWVyZ2UgdGhlINRhZXRl1SBkYXRhIHdpdGggdGhlIHN0YWNr 1XMgYnVpbHQtaW4gJ2FldXQnIHJlc291cmNlLiAgKEluIHRoZSBmdXR1cmUsIHdoZW4g dGhlICdhZXV0JyByZXNvdXJjZSBnZXRzIHJldmlzZWQsIHlvddVsbCB3YW50IHRvIGNv cHkgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgcmVzb3VyY2UgaW50byB0aGUgc3RhY2sg dG8ga2VlcCBpdCB1cCB0byBkYXRlKS4gQnkgdXNpbmcgdGhpcyBvcHRpb24sIHRoZSBl dmVudHMgYW5kIGNsYXNzZXMgZnJvbSBidWlsdC1pbiAnYWV1dCcgcmVzb3VyY2UgYW5k IG5vdCBmcm9tIHRoZSAnYWV0ZScgZGF0YSB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoIGFu ZCB3aWxsIG5vdCBnZXQgd3JpdHRlbiB3aGVuIHRoZSAnYWV0ZScgcmVzb3VyY2UgaXMg d3JpdHRlbiBvdXQuIFBsZWFzZSBub3RlIGhvd2V2ZXIsIHRoYXQgbm8gYXR0ZW1wdCBp cyBtYWRlIHRvIHdyaXRlIGl0IG91dCBpbiBpdNVzIG1vc3QgY29tcGFjdCBmb3JtLiBJ ZiB5b3UgYXJlIGNvbmNlcm5lZCB3aXRoIGtlZXBpbmcgdGhlICdhZXRlJyBpbiBpdHMg bW9zdCBjb21wYWN0IGZvcm0sIHlvdSBzaG91bGQgbm90IHVzZSB0aGUgb3B0aW9uIGF0 IHRoaXMgdGltZS4gDQ1Zb3UgbWF5IHdvbmRlciB3aGF0IG1pZ2h0IGhhcHBlbiBpZiB5 b3UgZGlkbtV0IGVtcHR5IHRoZSBzdGFjayBiZWZvcmUgeW91IGltcG9ydGVkIGFuICdh ZXRlJyByZXNvdXJjZS4gVGhlIG9yaWdpbmFsIGNvbnRlbnQgd291bGQgcmVtYWluLCBh bmQgdGhlIGV4dGVybmFsICdhZXRlJyB3b3VsZCBlaXRoZXIgYmUgYWRkZWQgdG8gdGhl IHN0YWNrIG9yIGl0IHdvdWxkIHJlcGxhY2UgYW4gZXhpc3RpbmcgZXZlbnQgaW4gdGhl IHN0YWNrLiBUaGlzIHdvdWxkIGJlIGRvbmUgb24gYSB3aG9sZSBldmVudCBiYXNpcywg YW5kIHRoZXJlIHdvdWxkIGJlIG5vIGF0dGVtcHQgdG8gbWVyZ2UgdGhlIGRhdGEgaW50 byB0aGUgc2FtZSBldmVudC4gDQ2lIERlcmV6IGFldGUgLSBwcm9kdWNlcyBkYXRhIGlu IGRlcmV6IGZvcm1hdCwgd2hpY2ggdGhlbiBjYW4gYmUgY29waWVkIHRvIE1QVyBhbmQg cmV6ZWQgd2l0aCB5b3VyIHByb2dyYW0uIFRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5k IGlzIHRleHR1YWwgYW5kIGFwcGVhcnMgaW4gdGhlIHNjcmF0Y2hwYWQgYXJlYS4gSW4g dGhlIGNhc2UgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBpcyA+IDMySywgaXQgd2ls bCBiZSB3cml0dGVuIHRvIGEgVEVYVCBmaWxlIGluc3RlYWQuDQ2lIFNlcnZlciBjb2Rl IC0gZ2VuZXJhdGVzIHNhbXBsZSBjb2RlIHdoaWNoIHNob3dzIGhvdyB5b3UgY2FuIHBy b2Nlc3MgQXBwbGUgZXZlbnRzIGFzIGEgc2VydmVyLiBUaGUgc2FtcGxlIGNvZGUgZGlz cGxheWVkIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBQYXNjYWwgYW5kIEMuIFdpdGggYXNz ZW1ibGVyLCBvbmx5IG5hbWUgY29uc3RhbnRzIHdpbGwgYmUgZGlzcGxheWVkLiBJZiB5 b3UgYXJyaXZlIGF0IHRoaXMgY2FyZCBmcm9tIGFuIGV2ZW50IGNhcmQsIHlvdSBjYW4g aG9sZCBkb3duIHRoZSBvcHRpb24ga2V5IHdoaWxlIGNsaWNraW5nIHRoaXMgYnV0dG9u IHRvIGdlbmVyYXRlIHNhbXBsZSBjb2RlIGZyb20gYSBzaW5nbGUgZXZlbnQgaW5zdGVh ZCBvZiBmcm9tIGFsbCBldmVudHMuDQ2lIENsaWVudCBjb2RlIC0gZ2VuZXJhdGVzIHNh bXBsZSBjb2RlIHdoaWNoIHNob3dzIHlvdSBob3cgeW91IGNhbiBzZW5kIEFwcGxlIGV2 ZW50cyBhcyBhIGNsaWVudC4gWW91IGNhbiBjaG9vc2Ugd2hpY2ggbGFuZ3VhZ2UgaW4g d2hpY2ggdG8gdmlldyB0aGUgY29kZSBmcm9tIHRoZSBQcmVmZXJlbmNlcyBjYXJkLiBZ b3UgY2FuIHRoaW5rIG9mIHRoaXMgYXMgYSBkeW5hbWljIGN1c3RvbSBzYW1wbGUgY29k ZSBnZW5lcmF0b3Igd2hpY2ggY3JlYXRlcyBjdXN0b20gY29kZSB0YWlsb3JlZCB0byB5 b3VyIHBhcnRpY3VsYXIgYXBwbGljYXRpb24uIFlvdSBtaWdodCBldmVuIGJlIGFibGUg dG8gY29weSB0aGUgY29kZSBhbmQgdHJ5IGl0IGluIGEgcHJvZ3JhbSBhcyBpcywgYnV0 IHBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoaXMgc2FtcGxlIGNvZGUgaGFzIG5vdCBiZWVu IHRlc3RlZCBpbiB0aGlzIHZlcnNpb24gYW5kIG1heSBub3Qgd29yayBjb21wbGV0ZWx5 LiBJZiB5b3UgYXJyaXZlIGF0IHRoaXMgY2FyZCBmcm9tIGFuIGV2ZW50IGNhcmQsIHlv dSBjYW4gaG9sZCBkb3duIHRoZSBvcHRpb24ga2V5IHdoaWxlIGNsaWNraW5nIHRoaXMg YnV0dG9uIHRvIGdlbmVyYXRlIHNhbXBsZSBjb2RlIGZyb20gYSBzaW5nbGUgZXZlbnQg aW5zdGVhZCBvZiBmcm9tIGFsbCBldmVudHMuDQ0NU2V0dGluZyBQcmVmZXJlbmNlcw1Z b3UgY2FuIGFjY2VzcyB0aGUgUHJlZmVyZW5jZXMgY2FyZCBieSBjbGlja2luZyBvbiB0 aGUg0lByZWZlcmVuY2XJ0yBidXR0b24gb24gdGhlIFJlc291cmNlIFRvb2xzIGNhcmQg b3IgYnkgY2hvb3Npbmcg0lByZWZlcmVuY2Vz0yBmcm9tIHRoZSBBZXRlRWRpdG9yIG1l bnUuIEZyb20gdGhpcyBjYXJkIHlvdSBjYW4gc3BlY2lmeSBoZWFkZXIgaW5mb3JtYXRp b24gYW5kIGNob29zZSBpdGVtcyBmcm9tIGFuIGFzc29ydG1lbnQgb2Ygb3B0aW9ucy4g QmVsb3cgYXJlIHNvbWUgb2YgdGhlIGl0ZW1zIG9uIHRoZSBQcmVmZXJlbmNlcyBjYXJk IGFuZCB3aGF0IHRoZXkgZG86DQ2lIFJlc291cmNlIFR5cGUgLSBkZXRlcm1pbmVzIHRo ZSByZXNvdXJjZSB0eXBlIG9mIHRoZSByZXNvdXJjZS4gSXQgc2hvdWxkIG5vcm1hbGx5 IGJlICdhZXRlJy4gT24gdGhlIHJhcmUgb2NjYXNpb24gd2hlcmUgeW91IG1pZ2h0IHdh bnQgdG8gd3JpdGUgaXQgb3V0IGFzIGFuICdhZXV0JywgeW91IGNhbiBjaGFuZ2UgdGhp cyBpdGVtIHRvICdhZXV0JyBiZWZvcmUgeW91IG91dHB1dCBpdC4NpSBDbGllbnQgTGFu Z3VhZ2UgLSBsZXRzIHlvdSBjaG9vc2Ugd2hpY2ggY2xpZW50IGxhbmd1YWdlIHlvdSB3 aXNoIHRvIHVzZS4gVGhlIGNob2ljZXMgaW4gdGhpcyB2ZXJzaW9uIGlzIG9mIHRoZSBz dGFjayBhcmU6ICdhZXRlJyBuYW1lLCBIeXBlclRhbGssIE1QVyBTaGVsbCwgUGFzY2Fs LCBhbmQgQy4gSWYgeW91IGRvbtV0IG5lZWQgdG8gZ2VuZXJhdGUgYW55IHNhbXBsZSBj b2RlIHlvdSBzaG91bGQgc2V0IHRoaXMgaXRlbSB0byAnYWV0ZScgbmFtZSwgb3RoZXJ3 aXNlIGl0IHdpbGwgYmUgc2xvd2VyIHRvIGVkaXQgZXZlbnQgcGFyYW1ldGVycy4gRm9y IGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGNsaWVudCBsYW5ndWFnZXMsIHJl ZmVyIHRvIHRoZSBhcHBlbmRpeCBhdCB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQuDaUg U2VydmVyIExhbmd1YWdlIC0gbGV0cyB5b3UgY2hvb3NlIHRoZSBzZXJ2ZXIgbGFuZ3Vh Z2UgeW911WxsIGJlIHVzaW5nLiBUaGUgY2hvaWNlcyBpbiB0aGlzIHZlcnNpb24gaXMg b2YgdGhlIHN0YWNrIGFyZTogUGFzY2FsLCBDLCBhbmQgQXNzZW1ibGVyLiBJZiBBc3Nl bWJsZXIgaGFzIGJlZW4gY2hvc2VuLCB0aGVuIG9ubHkgdGhlIGNvbnN0YW50cyB3aWxs IGJlIGdlbmVyYXRlZC4NpSBTb3J0IEV2ZW50cyBieSBOYW1lIC0gd2hlbiBhbiAnYWV0 ZScgcmVzb3VyY2UgaXMgcmVhZCBpbiwgdGhlIG9yZGVyaW5nIG9mIHRoZSBldmVudHMs IGNsYXNzZXMsIGV0Yy4gd2lsbCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFy ZSBpbiB0aGUgcmVzb3VyY2UuIFRoZXJlZm9yZSB3aGVuIHlvdSB3cml0ZSBpdCBvdXQs IGl0IHdpbGwgYWxzbyByZXRhaW4gaXRzIG9yZGVyaW5nLiBJZiB5b3UgZG9u1XQgcmVh bGx5IGNhcmUgYWJvdXQgcHJlc2VydmluZyB0aGlzIG9yZGVyLCB0aGVuIGNoZWNraW5n IHRoaXMgaXRlbSB3aWxsIHNvcnQgdGhlc2UgZWxlbWVudHMgYWxwaGFiZXRpY2FsbHku DQ1UaGUgb3RoZXIgb3B0aW9ucyBvbiB0aGUgUHJlZmVyZW5jZXMgY2FyZCBhcmUgZm9y IHVzZSB3aXRoIFBhc2NhbCBjbGllbnQgc2FtcGxlIG9ubHkuIFBsZWFzZSByZWZlciB0 byB0aGUgc2VjdGlvbiBvZiB0aGlzIGRvY3VtZW50IHdoaWNoIGNvdmVycyB0aGF0IGZv ciBtb3JlIGluZm9ybWF0aW9uLg0NVHJhbnNsYXRpb24gVGFibGUNVGhpcyBidXR0b24g Y3JlYXRlcyBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBsb2NhbGl6YWJsZSBuYW1lcyBpbiB0 aGUgQWV0ZUVkaXRvciBzdGFjayBhbmQgcGxhY2VzIHRoZW0gd2l0aCB0cmFuc2xhdGlv biBwbGFjZWhvbGRlcnMgaW50byB0aGUg0kNvZGUgU2NyYXRjaHBhZNMgZmllbGQgb2Yg dGhlINJSZXNvdXJjZSBUb29sc9MgY2FyZC4NDUVkaXRpbmcgYW4griBTdWl0ZXMgQ2Fy ZA1FYWNoIK4gU3VpdGUgY2FyZCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQg aXRzIHN1aXRlIGFuZCBhY3RzIGFzIGEgdGFibGUgb2YgY29udGVudHMgZm9yIGFsbCBv ZiB0aGUgZXZlbnRzLCBjbGFzc2VzLCBjb21wYXJpc29uIG9wZXJhdG9ycywgYW5kIGVu dW1lcmF0b3JzIGluIGl0LiBZb3UgY2FuIGNsaWNrIG9uZSBvZiB0aGVzZSBpdGVtcyB0 byBnbyB0byBhIGNhcmQgd2hlcmUgeW91IGNhbiBlZGl0IGl0cyBjb250ZW50cy4gQ2xp Y2sgb24gdGhlINJOZXfTIGJ1dHRvbiBuZXh0IHRvIGVhY2ggc2VjdGlvbiB0byBhZGQg YW4gaXRlbSBhbmQgZ28gdG8gYSBuZXcgY2FyZCBmb3IgaXQuIElmIHlvdSBjaG9vc2Ug dG8gZGVsZXRlIG9yIHJlbmFtZSBhbiBpdGVtLCBtYWtlIHN1cmUgdGhhdCB5b3UgZG8g dGhpcyBmcm9tIHRoZSBpdGVt1XMgY2FyZCByYXRoZXIgdGhhbiBhbiCuIFN1aXRlIGNh cmQuDQ0NRWRpdGluZyBhbiBFdmVudCBDYXJkDUVhY2ggRXZlbnQgY2FyZCBjb250YWlu cyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGV2ZW50LiBDbGlja2luZyB0aGUg0lNob3cg U2NyaXB00yBvciDSSGlkZSBTY3JpcHTTIGJ1dHRvbnMgd2lsbCBkaXNwbGF5IG9yIGhp ZGUgYSBmaWVsZCB3aGljaCBzdW1tYXJpemVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24g YWJvdXQgdGhlIGV2ZW50IHBhcmFtZXRlcnMuIFRoaXMgZmllbGQgYWxzbyBhY3RzIGFz IGEgZGlyZWN0b3J5IGZvciBldmVudHMuIE9ubHkgb25lIHBhcmFtZXRlciBpbiB0aGlz IGZpZWxkIGNhbiBiZSBlZGl0ZWQgYXQgYSB0aW1lLiBDbGlja2luZyBvbiBhIHBhcmFt ZXRlciB3aWxsIGFsbG93IHlvdSB0byBlZGl0IGl0LiBBZnRlciBkb2luZyB0aGlzLCB0 aGUgcGFyYW1ldGVyIHN1bW1hcnkgZmllbGQgd2lsbCBiZSBoaWRkZW4gYW5kIHRoZSBw YXJhbWV0ZXIgeW91IGNsaWNrZWQgb24gd2lsbCBiZSBkaXNwbGF5ZWQgc28gdGhhdCB5 b3UgY2FuIGVkaXQgaXRzIGNvbnRlbnRzLiBUaGUgcGFyYW1ldGVy1XMgYXR0cmlidXRl cyBjYW4gYmUgY2hhbmdlZCBieSBjbGlja2luZyBvbiB0aGUgYXR0cmlidXRlIGJpdCBj aGVjayBib3hlcy4gV2UgdXNlIHRocmVlIG9mIHRoZXNlIGJpdHMgZm9yIHVzZSB3aXRo IHRoZSBQYXNjYWwgcGFyYW1ldGVyIGRhdGEgdHlwZS4gQ2xpY2tpbmcgdGhlIGxvd2Vy IDMgYml0cyBvZiB0aGUgY2hlY2sgYm94IHdpbGwgaW52b2tlIGEgcG9wIHVwIG1lbnUu IEFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGJ1dHRvbnMsIGxpc3Rl ZCBiZWxvdywgZm9yIG5hdmlnYXRpbmcgZnJvbSBvbmUgcGFyYW1ldGVyIHRvIGFub3Ro ZXIuDQ2lIFByZXYgLSBkaXNwbGF5cyB0aGUgcHJldmlvdXMgZXZlbnQgcGFyYW1ldGVy LiBOb3RlIHRoYXQgZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgb3JkZXJpbmcsIHRoZSBy ZXBseSBkaXJlY3QgcGFyYW1ldGVyIGlzIHRyZWF0ZWQgYXMgdGhlIGZpcnN0IHBhcmFt ZXRlciwgYW5kIHRoZSBkaXJlY3QgcGFyYW1ldGVyIGlzIHRyZWF0ZWQgYXMgdGhlIHNl Y29uZCBwYXJhbWV0ZXIuDaUgTmV4dCAtIGRpc3BsYXlzIHRoZSBuZXh0IHBhcmFtZXRl ciBvZiB0aGUgZXZlbnQuDaUgTmV3IC0gYWRkcyBhIG5ldyBwYXJhbWV0ZXIgYXQgdGhl IGVuZCBvZiB0aGUgZXZlbnQuIE5vdGUgdGhhdCB0aGUgZGlyZWN0IGFuZCB0aGUgcmVw bHkgcGFyYW1ldGVyIGlzIGFsd2F5cyBpbiB0aGUgJ2FldGUnIHJlc291cmNlLiBBYnNl bmNlIG9mIHRoZSBkaXJlY3QgcGFyYW1ldGVyIGlzIGluZGljYXRlZCBieSB0aGUgdHlw ZSAnbnVsbCcuIFRvIGNyZWF0ZSB0aGUgZGlyZWN0IHBhcmFtZXRlciwgZG8gbm90IGNs aWNrIHRoZSBOZXcgYnV0dG9uLiBJbnN0ZWFkLCBkaXNwbGF5IHRoZSBkaXJlY3QgcGFy YW1ldGVyIGFuZCB0aGVuIGNoYW5nZSBpdHMgZGF0YSB0eXBlIHRvIGFueXRoaW5nIGJ1 dCBudWxsLg2lIERlbGV0ZSAtIGRlbGV0ZXMgdGhlIGRpc3BsYXllZCBwYXJhbWV0ZXIu IFRvIGRlbGV0ZSB0aGUgZGlyZWN0IG9yIHJlcGx5IHBhcmFtZXRlciwgZG8gbm90IHVz ZSB0aGlzIGJ1dHRvbi4gSW5zdGVhZCwgY2hhbmdlIHRoZSBkYXRhIHR5cGUgb2YgdGhl IHBhcmFtZXRlciB0byAnbnVsbCcuDaUgSW5zZXJ0IC0gaW5zZXJ0cyBhIG5ldyBwYXJh bWV0ZXIgYWZ0ZXIgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgb25lICh1bmxlc3MgdGhp cyBwYXJhbWV0ZXIgaXMgdGhlIHJlcGx5IHBhcmFtZXRlciwgdGhlbiB0aGUgbmV3IHBh cmFtZXRlciBpcyBjcmVhdGVkIGFmdGVyIHRoZSBkaXJlY3QgcGFyYW1ldGVyKS4gVXNl IHRoaXMgYnV0dG9uIGluc3RlYWQgb2YgIk5ldyIgaWYgeW91IHdhbnQgYSBwYXJhbWV0 ZXIgdG8gaW5zZXJ0ZWQgaW4gYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLg2lIEhpZGUgU2Ny aXB0IC0gaGlkZXMgdGhlIHBhcmFtZXRlciBzdW1tYXJ5IGZpZWxkIHJldmVhbGluZyB0 aGUgcGFyYW1ldGVyIGVkaXRpbmcgYnV0dG9ucy4NpSBTaG93IFNjcmlwdCAtIGRpc3Bs YXlzIHRoZSBwYXJhbWV0ZXIgc3VtbWFyeSBmaWVsZCBoaWRpbmcgdGhlIHBhcmFtZXRl ciBlZGl0aW5nIGJ1dHRvbnMuDQ1BY2NvcmRpbmcgdG8gdGhlICdhZXRlJyBkZWZpbml0 aW9uLCBpZiB0aGUgZW51bSBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgZGF0YSB0eXBlIGlz IGludGVycHJldGVkIGFzIGEgZW51bWVyYXRpb24gSUQuIEluIHRoaXMgY2FzZSwgeW91 IGNhbiBjbGljayBvbiB0aGUgdHlwZSBidXR0b24gdG8gZ28gdG8gdGhhdCBlbnVtZXJh dGlvbiBJRCBjYXJkLg0NDUVkaXRpbmcgYSBDbGFzcyBDYXJkDUEgQ2xhc3MgY2FyZCBj b250YWlucyBhIHByb3BlcnR5IGxpc3QgYW5kIGdyb3VwIG9mIGF0dHJpYnV0ZXMgYXNz b2NpYXRlZCB3aXRoIGVhY2ggcHJvcGVydHkuIFRoZSBlZGl0aW5nIG9mIHRoZSBwcm9w ZXJ0aWVzIG9uIGEgQ2xhc3MgY2FyZCBpcyB2ZXJ5IHNpbWlsYXIgdG8gZWRpdGluZyB0 aGUgcGFyYW1ldGVycyBvZiBhbiBFdmVudCBjYXJkLiBDbGljayBvbiAiUHJldiIgb3Ig Ik5leHQiIGJ1dHRvbnMgdG8gdmlldyB0aGUgcHJldmlvdXMgb3IgbmV4dCBwcm9wZXJ0 eSBpbiBhIGxpc3QuIENsaWNrIG9uIHRoZSAiTmV3IiBidXR0b24gdG8gY3JlYXRlIGEg bmV3IHByb3BlcnR5IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuIENsaWNrIG9uIHRoZSAi SW5zZXJ0IiBidXR0b24gdG8gYWRkIGEgcHJvcGVydHkganVzdCBhZnRlciB0aGUgY3Vy cmVudGx5IGRpc3BsYXllZCBvbmUuIENsaWNrIG9uICJEZWxldGUiIHRvIGRlbGV0ZSBh IHByb3BlcnR5Lg0NVGhlIGVsZW1lbnQgbGlzdCBpcyBqdXN0IGEgZmllbGQgb24gdGhl IGNhcmQgYXQgdGhpcyB0aW1lLiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gdXNlciBpbnRl cmZhY2UgdG8gZWRpdCB0aGUgZWxlbWVudCBsaXN0LCBzbyB5b3XVbGwgaGF2ZSB0byBl ZGl0IHRoZSBsaXN0IGRpcmVjdGx5LiBUaGUgZWxlbWVudCBsaXN0IGlzIHN0cnVjdHVy ZWQgaW4gYSB3YXkgdGhhdCB0aGUgaW5mb3JtYXRpb24gb2YgZWFjaCBlbGVtZW50IG9j Y3VwaWVzIG9uZSBsaW5lLiBFYWNoIGxpbmUgaGFzIGEgbnVtYmVyIG9mIGl0ZW1zIHNl cGFyYXRlZCBieSBjb21tYSBhbmQgZWFjaCBpdGVtIHNob3VsZCBiZSBmb3VyIGNoYXJh Y3RlcnMgbG9uZy4gVGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGNsYXNzIElEIG9mIHRoZSBl bGVtZW50LiBUaGUgb3RoZXIgaXRlbXMgYXJlIHRoZSBrZXkgZm9ybXMuDQ0NRWRpdGlu ZyBhbiBFbnVtZXJhdGlvbiBjYXJkDUVhY2ggRW51bWVyYXRpb24gY2FyZCBoYXMgYSBs aXN0IG9mIGVudW1lcmF0b3JzLiBUaGUgRW51bWVyYXRpb24gTGlzdCBmaWVsZCBhdCB0 aGUgYm90dG9tIG9mIHRoZSBjYXJkIHNlcnZlcyBhcyBhbiBpbmRleC4gQ2xpY2sgb25l IG9mIHRoZSBlbnVtZXJhdG9ycyB0byBlZGl0IGl0LiBZb3UgY2FuIGFsc28gY2xpY2sg b24gIlByZXYiIG9yICJOZXh0IiBidXR0b25zIHRvIHZpZXcgdGhlIHByZXZpb3VzIG9y IG5leHQgZW51bWVyYXRlciBpbiB0aGUgbGlzdC4gQ2xpY2sgb24gdGhlICJOZXciIGJ1 dHRvbiB0byBjcmVhdGUgYSBuZXcgZW51bWVyYXRlciBhdCB0aGUgZW5kIG9mIHRoZSBs aXN0LiBDbGljayBvbiB0aGUgIkluc2VydCIgYnV0dG9uIHRvIGFkZCBhbiBlbnVtZXJh dGVyIGp1c3QgYWZ0ZXIgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgb25lLiBDbGljayBv biAiRGVsZXRlIiB0byBkZWxldGUgYW4gZW51bWVyYXRpb24uDQ0NRWRpdGluZyBhIENv bXBhcmlzb24gT3BlcmF0b3IgQ2FyZA1FYWNoIENvbXBhcmlzb24gT3BlcmF0aW9uIGNh cmQgY29udGFpbnMgYSBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgc3VpdGUgY29kZSwgYSBj b21wYXJpc29uIG9wZXJhdG9yIG5hbWUsIGFuIElELCBhbmQgYSBjb21tZW50LiBDb21w bGV0ZSB0aGVzZSBmaWVsZHMgdG8gYWRkIG9yIGVkaXQgY29tcGFyaXNvbiBvcGVyYXRv cnMuDQ0NTG9jYWxpemF0aW9uDUFsdGhvdWdoIGl01XMgcG9zc2libGUgdG8gbG9jYWxp emUgeW91ciDUYWV0ZdUgcmVzb3VyY2UgYnkgbWFraW5nIGEgY29weSBvZiB5b3VyIHN0 YWNrLCBhbmQgdGhlbiBsb2NhdGluZyBhbmQgdHJhbnNsYXRpbmcgZXZlcnkgbmFtZSBp biBpdCwgdGhpcyBpcyBhIHZlcnkgdGVkaW91cyBwcm9jZXNzLCBlc3BlY2lhbGx5IGlm IHlvdSBoYXZlIHRvIGRvIGl0IG1hbnkgdGltZXMuIEZvcnR1bmF0ZWx5LCB0aGlzIHN0 YWNrIHByb3ZpZGVzIGEgbWV0aG9kIHdoaWNoIHNpbXBsaWZpZXMgdGhpcyBvcGVyYXRp b24uIA0NV2hlbiB5b3Ugc2VsZWN0IHRoZSDSTG9jYWxpemUgYWV0ZcnTIGNvbW1hbmQg ZnJvbSB0aGUgQWV0ZUVkaXRvciBtZW51LCB5b3XVbGwgZmlyc3QgYmUgYXNrZWQgd2hl cmUgeW911WQgbGlrZSB0byBzdG9yZSB0aGUgdHJhbnNsYXRlZCBjb3B5IG9mIHRoZSBl ZGl0b3Igc3RhY2sgd2hpY2ggd2FzIGZyb250bW9zdCB3aGVuIHRoZSBjb21tYW5kIHdh cyBleGVjdXRlZC4gWW91IHdpbGwgdGhlbiBiZSBhc2tlZCBpZiB5b3Ugd2lzaCB0byB1 c2UgYSB0cmFuc2xhdGlvbiB0YWJsZSBmaWxlLiBBIHRyYW5zbGF0aW9uIHRhYmxlIGZp bGUgaXMgYSB0ZXh0IGZpbGUgd2hlcmUgdGhlIG9kZCBudW1iZXIgbGluZXMgYXJlIG5h bWVzIGZyb20gdGhlIGFldGUgc3RhY2sgaW4gdGhlIHNvdXJjZSBsYW5ndWFnZSwgYW5k IHRoZSBsaW5lIGZvbGxvd2luZyB0aGF0IGlzIHRoZSB0cmFuc2xhdGlvbiBpbiB0aGUg dGFyZ2V0IGxhbmd1YWdlLiBJZiB5b3UgZG8gaGF2ZSBvbmUsIHRoZW4geW91IHdpbGwg YmUgYXNrZWQgaWYgeW91IG5lZWQgdG8gY29uZmlybSB0aGUgdHJhbnNsYXRpb24uIA0N V2hlbiB0aGUgbG9jYWxpemF0aW9uIHRha2VzIHBsYWNlLCBhbGwgdGhlIGxvY2FsaXph YmxlIG5hbWVzIGluIHRoZSBzdGFjayB3aWxsIGJlIHByZXNlbnRlZCB0byB5b3Ugdmlh IGRpYWxvZ3MgYW5kIHlvdSB3aWxsIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvIGNoYW5n ZSBlYWNoIG9uZS4gQnkgZGVmYXVsdCwgdGhlIGN1cnJlbnQgbmFtZSBhcHBlYXJzIGlu IHRoZSB0ZXh0IGVudHJ5IGJveCBvZiBlYWNoIGRpYWxvZy4gSWYgeW911XZlIGNob3Nl biBhIHRyYW5sYXRpb24gdGFibGUgdG8gd29yayB3aXRoLCB0aGUgdHJhbnNsYXRpb25z IHN0b3JlZCBpbiB0aGlzIGZpbGUgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRleHQg ZW50cnkgYm94IG9mIHRoZSBkaWFsb2cuIElmIHlvdSBkZWNpZGUgdGhhdCB5b3UgZG9u 1XQgbmVlZCBhbnkgZnVydGhlciBjb25maXJtYXRpb24gb2YgdHJhbnNsYXRpb25zIGRp c3BsYXllZCBmcm9tIHRoZSB0cmFuc2xhdGlvbiB0YWJsZSwgY2xpY2tpbmcgdGhlINJD YW5jZWzTIGJ1dHRvbiB3aWxsIGFib3J0IHRoZSBjb25maXJtYXRpb24gcHJvY2VzcyBh bmQgdGhlIHJlbWFpbmluZyB0cmFuc2xhdGlvbnMgZnJvbSB0aGUgdHJhbnNsYXRpb24g ZmlsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHN0YWNrLiANDUFmdGVyIHRoZSBsb2Nh bGl6YXRpb24gdHJhbmxhdGlvbnMgYXJlIGNvbXBsZXRlZCwgdGhlIHN0YWNrIHdpbGwg YmUgcmVjb25zdHJ1Y3RlZCB0byBtYWtlIHN1cmUgYWxsIGNoYW5nZXMgaGF2ZSBiZWVu IG1hZGUuIFRoZSBzdW0gb2YgdGhlIHRyYW5zbGF0aW9uIHRhYmxlIGFuZCB5b3VyIG93 biB0cmFuc2xhdGlvbiB3aWxsIGJlIHB1dCBpbiB0aGUg0kNvZGUgU2NyYXRjaHBhZNMg ZmllbGQgb2YgdGhlINJSZXNvdXJjZSBUb29sc9MgY2FyZCBzbyB0aGF0IHlvdSBjYW4g dXNlIGl0IGFzIGEgdHJhbnNsYXRpb24gdGFibGUgaW4gdGhlIGZ1dHVyZS4gVG8gY3Jl YXRlIGEgdHJhbnNsYXRpb24gdGFibGUsIHNlbGVjdCB0aGUg0lRyYW5zbGF0aW9uIFRh Ymxl0yBidXR0b24gb24gdGhlINJSZXNvdXJjZSBUb29sc9MgY2FyZC4gIFRoaXMgd2ls bCBkdW1wIGFsbCB0aGUgbmFtZXMgaW4gdGhlIHN0YWNrIHRvIHRoZSBzY3JhdGNocGFk LiBZb3UgY291bGQgdXNlIHRoaXMgdG8gc2VuZCB0aGlzIGxpc3RpbmcgdG8gc29tZW9u ZSBlbHNlIHRvIGRvIHRoZSB0cmFuc2xhdGlvbnMuIEFmdGVyIGl01XMgdHJhbnNsYXRp b25zIGhhdmUgYmVlbiBjb21wbGV0ZWQsIHRoaXMgZmlsZSBjYW4gYmVjb21lIGEgdHJh bnNsYXRpb24gdGFibGUgZm9yIHRoZSBsb2NhbGl6YXRpb24gb2YgeW91ciByZXNvdXJj ZS4NDQ1BcHBlbmRpeDogTGFuZ3VhZ2UgTm90ZXMNDUh5cGVyVGFsaw1TaW5jZSB0aGVy ZSBpcyBubyBnZW5lcmFsIHB1cnBvc2UgU2VuZCBBcHBsZSBFdmVudCBjb21tYW5kIGlu IEh5cGVyVGFsaywgQXBwbGUgRXZlbnRzIGFyZSBzZW50IHRocm91Z2ggYW4gWENNRC4g Q2xpZW50IGNvZGUgaW4gSHlwZXJUYWxrIGRlcGVuZHMgb24gdGhlIGZvcm1hdCBvZiB0 aGUgWENNRC4gSGVyZSB3ZSBhcmUgdXNlIGFuIFhDTUQgY2FsbGVkICJBRVNlbmQiIGZy b20gdGhlIHN0YWNrICJYQ01EcyBGb3IgQXBwbGUgRXZlbnRzIi4gSW4gdGhpcyBYQ01E LCBlYWNoIEFwcGxlIGV2ZW50IHBhcmFtZXRlciBpcyByZXByZXNlbnRlZCBieSBhIGtl eXdvcmQgKDQgbGV0dGVyIGNvZGUpIGFuZCBkYXRhIHBhaXIsIHRoZXJlZm9yZSwgdHdv IEh5cGVyVGFsayBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBlYWNoIEFwcGxlIGV2ZW50 IHBhcmFtZXRlci4gVGhlIHNhbXBsZSBjb2RlIGlzIGVzc2VudGlhbGx5IGEgbGlzdCBv ZiBrZXl3b3JkIGFuZCBkYXRhIHBhaXJzIGZvciBhbGwgdGhlIGtleXdvcmRzIGFsbG93 ZWQuIFRoZSBvcHRpb25hbCBvbmVzIGFyZSBlbmNsb3NlZCBieSBzcXVhcmUgYnJhY2tl dHMgc28geW91IGNhbiByZW1vdmUgdGhlIG9uZXMgeW91IGRvIG5vdCB3YW50LiANDUFs bCB0aGUgbGVnYWwgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdG9ycyBhcmUgYWxzbyBsaXN0 ZWQuIFRoaXMgaXMgdGhlIGZvcm1hdCBpbiB0aGUgc2NyaXB0IHRlbXBsYXRlIGZpZWxk IG9mIGVhY2ggZXZlbnQgd2hlbiBIeXBlclRhbGsgaXMgdGhlIGNsaWVudCBsYW5ndWFn ZSBhbmQgbm8gZ2x1ZSByb3V0aW5lIGlzIHVzZWQuIE9idmlvdXNseSwgdGhpcyBpcyBu b3QgdGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMuIEEgYmV0dGVyIHdheSB3b3VsZCBi ZSB0byBwcm92aWRlIHNvbWUgZ2x1ZSBjb2RlIHNvIHRoYXQgc2VuZGluZyBhbiBBcHBs ZSBldmVudCBsb29rcyBsaWtlIGp1c3QgYW5vdGhlciBIeXBlclRhbGsgZnVuY3Rpb24u IA0NV2l0aCB0aGlzIHN0YWNrIHlvdSBjYW4gZ2VuZXJhdGUgc2FtcGxlIGNsaWVudCBj b2RlLiBJbiB0aGlzIHNhbXBsZSBjb2RlLCB3ZSB0YWtlIGFsbCByZXF1aXJlZCBwYXJh bWV0ZXJzIGFuZCBtYWtlIHRoZW0gaW50byByZXF1aXJlZCBwYXJhbWV0ZXJzIG9mIEh5 cGVyVGFsayBmdW5jdGlvbnMuIFRoZXNlIHBhcmFtZXRlcnMgYXJlIGxpc3RlZCBieSBw b3NpdGlvbiBhbmQgbm90IGJ5IGtleXdvcmQgc28gdGhhdCB5b3UgZG9u1XQgaGF2ZSB0 byByZW1lbWJlciB0aGUga2V5d29yZHMuIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFy ZSBzdGlsbCBieSBrZXl3b3JkIGJ1dCB5b3UgY2FuIHVzZSB0aGUgZnVsbCBuYW1lIGRl ZmluZWQgaW4gdGhlICdhZXRlJyByZXNvdXJjZSBpbnN0ZWFkIG9mIHRoZSBmb3VyIGxl dHRlciBjb2Rlcy4gWW91IGNhbiBhbHNvIHVzZSBmdWxsIG5hbWVzIGluIGVudW1lcmF0 b3JzLiBXaGVuIGdsdWUgcm91dGluZXMgYXJlIHVzZWQsIHRoZSBzY3JpcHQgdGVtcGxh dGUgZmllbGQgd2lsbCBzaG93IGFuIGludGVyZmFjZSB0byB0aGUgZ2x1ZSByb3V0aW5l Lg0NDU1QVyBTaGVsbCBMYW5ndWFnZQ1MaWtlIEh5cGVyVGFsaywgdGhlcmUgYXJlIG5v IGJ1aWx0LWluIGNvbW1hbmRzIG9yIG9mZmljaWFsIE1QVyBjb21tYW5kcyB0byBzZW5k IEFwcGxlIGV2ZW50cy4gT3VyIHNhbXBsZSBjb2RlIGlzIGJhc2VkIG9uIGFuIE1QVyBj b21tYW5kIGNhbGxlZCAiU2VuZEFFIi4gIEFnYWluLCB0aGUgcGFyYW1ldGVycyBhcmUg aW4gYSBrZXl3b3JkIGRhdGEgcGFpciBmb3JtYXQuIFdoZW4gdGhlcmUgaXMgbm8gZ2x1 ZSByb3V0aW5lLCB0aGUgdGVtcGxhdGUgZmllbGQgaXMgaW4gdGhlIGZvcm1hdCBvZiBh IFNlbmRBRSBNUFcgY29tbWFuZC4gT3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgZW5jbG9z ZWQgYnkgYnJhY2tldHMgc28gdGhhdCB0aGV5IGNhbiBiZSByZW1vdmVkLg0NQ3VycmVu dGx5IHRoZSBnbHVlIHJvdXRpbmUgZm9yIGFuIE1QVyBTaGVsbCBjb21tYW5kIGlzIGp1 c3QgYW4gYWxpYXMgc28gaXTVcyBub3QgbmVjZXNzYXJ5IHRvIHJlcGVhdCBpbmZvcm1h dGlvbiBzdWNoIGFzIGV2ZW50IGNsYXNzZXMgYW5kIElE1XMgb3IgdGhlIHRhcmdldCBh cHBsaWNhdGlvbi4NDQ1QYXNjYWwgYW5kIEMNVGhlcmUgaXMgYSB0b29sYm94IGNhbGwg QUVTZW5kIGZvciBzZW5kaW5nIEFwcGxlIGV2ZW50cywgYnV0IHRoaXMgY2FsbCBjYW5u b3QgYmUgdXNlZCBpbiBQYXNjYWwgd2l0aG91dCBnbHVlIHJvdXRpbmVzLiBJZiB5b3Ug dXNlIFBhc2NhbCBvciBDLCB5b3Ugd2lsbCBuZWVkIHNvbWUgZ2x1ZSByb3V0aW5lcy4g R2x1ZSByb3V0aW5lcyB0YWtlIGNhcmUgb2Ygc3R1ZmZpbmcgcGFyYW1ldGVycyBpbnRv IEFwcGxlIGV2ZW50cywgc2VuZGluZyB0aGVtIG9mZiwgYW5kIGV4dHJhY3RpbmcgcmVz dWx0cyBmcm9tIHRoZSByZXBseS4gUGFzY2FsIGRvZXMgbm90IHN1cHBvcnQgYSB2YXJp YWJsZSBudW1iZXIgb2YgcGFyYW1ldGVycywgc28geW91IGNhbm5vdCB1c2Uga2V5d29y ZCBkYXRhIHBhaXJzIGFzIHlvdSB3b3VsZCB3aXRoIEh5cGVyVGFsayBvciBNUFcuIElu c3RlYWQsIGFsbCBwYXJhbWV0ZXJzIGFyZSBwb3NpdGlvbmFsLiBXaGVuIGEgcGFyYW1l dGVyIGlzIG9wdGlvbmFsLCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgd2lsbCBiZSB1c2Vk IHNvIHRoYXQgTklMIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoZSBhYnNlbmNlIG9m IGEgcGFyYW1ldGVyLiBBbm90aGVyIHByb2JsZW0gd2UgZW5jb3VudGVyIGlzIHRoYXQg dW5saWtlIEh5cGVyVGFsayBhbmQgTVBXLCB5b3Ugbm93IGNhbiBoYXZlIG11bHRpcGxl IHdheXMgb2YgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGtpbmQgb2YgZGF0YS4gRm9yIGV4 YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSBhIHBhcmFtZXRlciB3aG9zZSBkYXRhIHR5cGUg aXMgVEVYVC4gSW4gUGFzY2FsLCB0aGUgdGV4dCBtYXkgYmUgaW4gdGhlIGZvcm0gb2Yg YSBkZXNjcmlwdG9yLCBhIGhhbmRsZSwgYSBwb2ludGVyIHRvIGEgYnVmZmVyIHBsdXMg dGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgYSBQYXNjYWwgc3RyaW5nIG9yIGV2ZW4gYSB6 ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiBUbyBpbmRpY2F0ZSB3aGljaCBmb3JtYXQgaXMg dXNlZCBpbiB0aGUgZ2x1ZSByb3V0aW5lLCB5b3UgY2FuIHVzZSB0aGUgdGhyZWUgbG93 IGJpdHMgb2YgdGhlIHBhcmFtZXRlciBhdHRyaWJ1dGUgaW4gdGhlICdhZXRlJyByZXNv dXJjZS4gSGVyZSBpcyB0aGUgZm9ybWF0IHdlIGFsbG93Lg0NMS4gRGVzY3JpcHRvci4N Mi4gSGFuZGxlLg0zLiBGaXhlZCBzaXplIGRhdGEgc3VjaCBhcyBpbnRlZ2VyIG9yIGZs b2F0aW5nIHBvaW50Lg00LiBQb2ludGVyIHRvIGEgYnVmZmVyIGFuZCB0aGUgc2l6ZSBv ZiB0aGUgYnVmZmVyLg01LiBQYXNjYWwgU3RyaW5nLg02LiBDIFN0cmluZy4NDU9mIGNv dXJzZSwgbm90IGFsbCBvZiB0aGVtIGFyZSBhcHByb3ByaWF0ZSBmb3IgYW55IGdpdmVu IGRhdGEgdHlwZS4gRm9yIGV4YW1wbGUsIEMgc3RyaW5ncyB3b3VsZCBub3Qgd29yayBm b3IgaW50ZWdlciB0eXBlcy4gVGhhdNVzIHdoeSB3aGVuIHlvdSBwaWNrIGEgZm9ybWF0 IHVzaW5nIHRoZSBwb3AgdXAgbWVudSwgc29tZSB3aWxsIGJlIGRpc2FibGVkLiBDdXJy ZW50bHksIHdlIGRvIG5vdCBzdXBwb3J0IHRoZSBvcHRpb24gIzQgZm9ybWF0IHdoZW4g aXQgaXMgdXNlZCBpbiB0aGUgcmVwbHkgcGFyYW1ldGVyLg0NSW4gYSBmZXcgc3BlY2lh bCBjYXNlcywgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSBhIHBvaW50ZXIgdG8gYSBwYXJh bWV0ZXIgaW4gYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBXaGVuIHRoZSBkYXRhIHR5cGUg aXMgJ3RydWUnLCB5b3UgY2FuIHVzZSBhIGJvb2xlYW4gcGFyYW1ldGVyLiAgVGhlIGJv b2xlYW4gcmVzdWx0IG9mIGZhbHNlIHdpbGwgaW5kaWNhdGUgdGhlIGFic2VuY2Ugb2Yg dGhlIHBhcmFtZXRlci4gV2hlbiB0aGUgZGF0YSB0eXBlIGlzIGFuICdlbnVtJywgaWYg eW91IGNhbiBhc3N1bWUgdGhhdCBhIHZhbGlkIHBhcmFtZXRlciBpcyBmb3VyIHByaW50 YWJsZSBjaGFyYWN0ZXJzLCB0aGVuIHlvdSBjYW4gdXNlIHZhbHVlIDAgdG8gaW5kaWNh dGUgYWJzZW5jZSBvZiBhIHBhcmFtZXRlci4gV2hlbiB0aGUgcGFyYW1ldGVyIGlzIGEg aGFuZGxlLCB1c2UgTklMIHRvIGluZGljYXRlIHRoZSBhYnNlbmNlIG9mIGEgcGFyYW1l dGVyLg0NV2hlbiBjb2RlIGlzIGdlbmVyYXRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGtu b3cgdGhhdCAnZnNzICcgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zdGFudCB0eXBl RlNTLCB0aGUgUGFzY2FsIHR5cGUgRlNTcGVjIGFuZCB0aGUgQyB0eXBlIEZTU3BlYy4g SW5mb3JtYXRpb24gZm9yIHRoZSBjb21tb24gZGF0YSB0eXBlcyB1c2VkIGluIEFwcGxl IEV2ZW50cyBpcyBjb250YWluZWQgaW4gdGhlIHN0YWNrLiBIb3dldmVyIGl0IGlzIGEg bGFyZ2UgdGFzayB0byBkZWZpbmUgYWxsIHRoZSBkYXRhIHR5cGVzIHVzZWQgaW4gdGhl IE1hY2ludG9zaCwgYW5kIGl0IGlzIGltcG9zc2libGUgdG8ga25vdyB0aGUgbmFtZXMg b2YgeW91ciBwcml2YXRlIGRhdGEgdHlwZXMuIElmIHlvdSB3YW50IHRoZXNlIGV4dHJh IGRhdGEgdHlwZXMsIHlvdSBjYW4gYWRkIHlvdXIgb3duIGJ5IG1vZGlmeWluZyB0aGUg TmFtZU9mRGF0YVR5cGUgZnVuY3Rpb24gaW4gdGhlIHNjcmlwdCBvZiB0aGlzIHN0YWNr LiBJbiB0aGlzIGZ1bmN0aW9uLCBlYWNoIGZvdXIgY2hhcmFjdGVyIElEIGlzIGFzc29j aWF0ZWQgd2l0aCBhIGxpc3Qgb2YgbmFtZXMuICBGb3IgZXhhbXBsZSwgJ2ZzcyAnIGlz IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIGxpc3Q6IA0gICAgICAgICAgICAg ICAgIkZTU3BlYyxGU1NwZWNQdHIsRlNTcGVjSGFuZGxlLHR5cGVGU1MsRlNTcGVjLDcw Ig1UaGUgZmlyc3QgbmFtZSBpcyB0aGUgUGFzY2FsIHR5cGUgbmFtZSwNc2Vjb25kIG5h bWUgaXMgdGhlIFBhc2NhbCBwb2ludGVyIG5hbWUsDXRoaXJkIG5hbWUgaXMgdGhlIFBh c2NhbCBIYW5kbGUgbmFtZSwNZm91cnRoIG5hbWUgaXMgdGhlIGNvbnN0YW50IHR5cGUg bmFtZSwNZmlmdGggbmFtZSBpcyB0aGUgQyB0eXBlIG5hbWUsDXNpeHRoIG5hbWUgaXMg dGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0eXBlLCB3aGVyZSAtMSBkZW5vdGVzIHZhcmlh YmxlIGxlbmd0aC4NDVRvIGludHJvZHVjZSBuZXcgZGF0YSB0eXBlLCBqdXN0IGFkZCBp dCB0byB0aGUgZnVuY3Rpb24uIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIGxlbmd0aCBm aWVsZCBpcyB0byBkZWNpZGUgd2hldGhlciBhIHBhcmFtZXRlciBzaG91bGQgYmUgcGFz c2VkIG9uIHRoZSBzdGFjayBvciBwYXNzZWQgYnkgcmVmZXJlbmNlIGFzIGluIEMsIHNv IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgYWNjdXJhdGUuIEl0IHdpbGwgYmUgYXR0ZW1w dGVkIHRvIHBhc3Mgb24gdGhlIHN0YWNrIGlmIGl0IGlzIGxlc3MgdGhhbiA1IGJ5dGVz IGxvbmcuIElmIHlvdSBoYXZlIGEgZGF0YSB0eXBlIHRoYXQgaXMgbW9yZSB0aGFuIDQg Ynl0ZXMgbG9uZyBidXQgeW91IHN0aWxsIHdhbnQgdG8gcGFzcyBpdCBvbiB0aGUgc3Rh Y2sgaW4gQywgeW91IG1heSBmYWtlIGEgbGVuZ3RoIGVxdWFsIHRvIDQgdG8gZm9vbCB0 aGUgY29kZSBnZW5lcmF0b3IuDQ1XaGVuIHRoZSAnYWV0ZScgcmVzb3VyY2UgaXMgbm90 IGRlc2lnbmVkIGFzIGEgUGFzY2FsIHJvdXRpbmUsIGFsbCB0aGUgcmVzZXJ2ZWQgYml0 cyBhcmUgY2xlYXIgYW5kIHRoYXQgbWVhbnMgdGhhdCB0aGUgZm9ybWF0IGlzIGEgZGVz Y3JpcHRvci4gU2luY2UgdGhpcyBpcyB0aGUgbW9zdCBnZW5lcmFsIGZvcm0sIGl0IGNh biBhbHdheXMgYmUgdXNlZC4gSXQgc2hvdWxkIGJlIHBvaW50ZWQgb3V0IHRoZSAnYWV0 ZScgcmVzb3VyY2UgeW91IHJlYWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBpcyBkZWZpbmVk IGZvciB0aGUgc2VydmVyIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBhcmUgdGhlIGNsaWVu dCwgeW91IGNhbiBjaGFuZ2UgdGhlIFBhc2NhbCBkYXRhIGZvcm1hdCBmb3IgeW91IG93 biB1c2UgYXMgYSBjbGllbnQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIHNlcnZlctVzLiBT byB5b3UgY2FuIHBpY2sgd2hhdCBzdWl0cyB5b3UgYXMgYSBjbGllbnQuIFlvdSBtYXkg YWxzbyBsZXQgdGhlIHN5c3RlbSBwaWNrIGEgZm9ybWF0IHdoZW4gYW4gJ2FldGUnIGlz IHJlYWQgZnJvbSBhbm90aGVyIGZpbGUuIEFzIGEgbWF0dGVyIG9mIGZhY3QsIGlmIGFz IGEgY2xpZW50LCB5b3UgYWx3YXlzIHVzZXMgYSBwYXJ0aWN1bGFyIG9wdGlvbmFsIHBh cmFtZXRlciwgeW91IG1heSBldmVuIGNoYW5nZSBpdCBmcm9tIG9wdGlvbmFsIHRvIHJl cXVpcmVkIGZvciB0aGUgcHVycG9zZSBvZiBnZW5lcmF0aW5nIGNsaWVudCBjb2RlLiBO byBoYXJtIGlzIGRvbmUgYXMgbG9uZyBhcyB5b3UgZG8gbm90IHRyeSB0byB3cml0ZSBi YWNrIHRoZSAnYWV0ZScgcmVzb3VyY2UgdG8gdGhlIHNlcnZlciBhcHBsaWNhdGlvbi4N DUdsdWUgcm91dGluZXMgdGFrZSBjYXJlIG9mIG1vc3Qgb2YgdGhlIGludGVyZmFjZSB0 byB0aGUgQXBwbGUgRXZlbnQgTWFuYWdlciBmb3IgeW91LiAgSWYgeW91IGNhbiB1c2Ug dGhlbSBmcm9tIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgd2hlcmUgY29tcGlsaW5n IGlzIGZhc3QsIGFuZCB5b3UgY2FuIHNpbmdsZSBzdGVwIHRocm91Z2ggZWFjaCBzdGF0 ZW1lbnQgYW5kIGV4YW1pbmUgdmFyaWFibGVzIGFzIG5lZWRlZCwgdGhlbiB5b3UgY2Fu IHVzZSBpdCBhcyBhIHNjcmlwdGluZyBsYW5ndWFnZS4NDVRoZXJlIGFyZSBhIG51bWJl ciBvZiBwYXJhbWV0ZXJzIHRvIEFFU2VuZC4gV2hlbiB0aGUgY2xpZW50IGNvZGUgaXMg Z2VuZXJhdGVkLCB0aGVyZSBpcyBhIGRlZmF1bHQgZm9yIGVhY2ggcGFyYW1ldGVyLiBG b3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgaWRsZSBwcm9jZWR1cmUgaXMgTklMLiBIb3dl dmVyLCB5b3UgbWF5IHB1dCBpbiB5b3VyIG93biBkZWZhdWx0IGluIHRoZSBQcmVmZXJl bmNlcyBjYXJkLiBJbiB0aGUgZGVmYXVsdCB0YXJnZXQgZmllbGQgb2YgdGhlIFByZWZl cmVuY2UgY2FyZCwgaWYgdGhlcmUgaXMgYSBwcm9jZXNzIG5hbWUgcHJlc2VudCwgdGhp cyBpcyBjb25zaWRlcmVkIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuIElmIHRo ZXJlIGlzIG5vIG5hbWUsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgYXBwbGljYXRpb24g d2lsbCBiZSBzZWxlY3RlZCBieSB0aGUgUFBDIEJyb3dzZXIuIElmIHRoZSBuYW1lIGlz ICJzZWxmIiwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBldmVudCB3aWxsIGJlIHNlbnQg dG8gdGhlIGFwcGxpY2F0aW9uIGl0c2VsZi4NDU9uIHRoZSBzZXJ2ZXIgc2lkZSwgaXQg d291bGQgYmUgbmljZSB0byBoYXZlIGdsdWUgY29kZSB0aGF0IHdvdWxkIHRha2UgYW4g QXBwbGUgZXZlbnQgYW5kIHRyYW5zZm9ybSBpdCBpbnRvIGEgbm9ybWFsIHByb2NlZHVy ZSBjYWxsLiBUaGF01XMgd2h5IHdlIGFsc28gZ2VuZXJhdGUgc2FtcGxlIHNlcnZlciBn bHVlIGNvZGUuIEZvciBldmVyeSBldmVudCwgdHdvIHByb2NlZHVyZXMgd2lsbCBiZSBn ZW5lcmF0ZWQuIE9uZSBpcyB0aGUgc2hlbGwgcHJvY2VkdXJlIHRoYXQgYWN0dWFsbHkg ZXhlY3V0ZXMgdGhlIG9wZXJhdGlvbi4gKFlvdSBoYXZlIHRvIGZpbGwgaW4gdGhlIGFj dHVhbCBjb2RlIHlvdXJzZWxmKS4gVGhlIG90aGVyIHByb2NlZHVyZSBpcyBhbiBldmVu dCBoYW5kbGVyIHRoYXQgdHJhbnNsYXRlcyB0aGUgZXZlbnQgaW50byBhIHByb2NlZHVy ZSBjYWxsLiBGb3IgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLCB5b3UgbXVzdCBmaWxsIGlu IHRoZSBkZWZhdWx0IHZhbHVlIChiZWNhdXNlIHRoYXQgaW5mb3JtYXRpb24gaXMgbm90 IGF2YWlsYWJsZSBpbiB0aGUgJ2FldGUnIHJlc291cmNlKS4gIEFkZGl0aW9uYWxseSwg eW91IG11c3QgcHJvdmlkZSB5b3VyIG93biBlcnJvciBoYW5kbGluZywgYnV0IHlvdSBk byBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBleHRyYWN0aW5nIHBhcmFtZXRlcnMgZnJv bSB0aGUgQXBwbGUgRXZlbnQuDQ1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgaW50 ZXJmYWNlIHRvIHlvdXIgcHJvY2VkdXJlIGluIHRoZSBzZXJ2ZXIgc2FtcGxlIGNvZGUg aXMgdGhlIHNhbWUgYXMgdGhlIGludGVyZmFjZSB0byB0aGUgc2VuZCBBcHBsZSBFdmVu dCBjbGllbnQgc2FtcGxlIGNvZGUuIFRoaXMgbWVhbnMgdGhhdCBpZiBpbiB5b3VyIGNs aWVudCBjb2RlIHlvdSBzZW5kIHRoZSBldmVudCB0byB5b3Vyc2VsZiwgeW91IGNhbiBj YWxsIGVpdGhlciBwcm9jZWR1cmUgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzLiBUaGUg b25seSBkaWZmZXJlbmNlIGlzIHRoYXQgb25lIGdvZXMgdGhyb3VnaCB0aGUgQXBwbGUg RXZlbnQgYW5kIHRoZSBvdGhlciBvbmUgZG9lcyBub3QuIFdlIHRhbGsgYSBsb3QgYWJv dXQgZmFjdG9yaW5nIGluIEFwcGxlIEV2ZW50cy4gQnkgdGhpcyB3ZSBtZWFuIHRoYXQg dXNlciBpbnRlcmZhY2UgYWN0aW9ucyBzaG91bGQgYmUgdHJhbnNsYXRlZCBpbnRvIEFw cGxlIEV2ZW50cyBhbmQgc2VudCB0aHJvdWdoIHRoZSBBcHBsZSBFdmVudCBNYW5hZ2Vy LiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciByZWNvcmRpbmcgQXBwbGUgRXZlbnRz IGluIHRoZSBmdXR1cmUuIFRoZSBzYW1wbGUgY29kZSBnZW5lcmF0ZWQgaXMgYWxyZWFk eSBzZXQgdXAgZm9yIHRoZSBwdXJwb3NlIG9mIGZhY3RvcmluZyBhbmQgcmVjb3JkaW5n Lg0NDUNvcHlyaWdodCAxOTkyIEFwcGxlIENvbXB1dGVyLCBJbmMuDUFwcGxlIGFuZCBB cHBsZaggRXZlbnQgYXJlIHRyYWRlbWFya3Mgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4s IHJlZ2lzdGVyZWQgaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4A//oAEgBB Ym91dCB0aGlzIHN0YWNryf/4ABEAQWJvdXQgdGhpcyBTdGFjawBpbnN0cnVjdGlvbnMA AAAAAAAAAAAAAAABAEJNQVAAABFvAAAAAAAAAAAAAQAAAAAAAAFWAgAANQAGATMB/QAV AAABUwH+AAAAAAAAAAAAAAAkAAAAnI3jHxS/hb+Fv4W/hb+Fv4W/hb+Fo4UgAiDjLBAQ IAIg4w4AAIwQgOIQAuEOhYriEQLhDuIRA+EOtYaOEIDiEALhDo0QQOIRgOENpYGJ4x8Q 4x8Iv4a/hr+Gv4a/hr+Gv4a/hqKGjhEQ4x0QjREg4x0EuYGJ4xceRAHwAYDjFxE1QACA 4xcRwTHMlZjAQxic4xcewUoSliUgRKSg4xcUwXmSlCHgRKSY4xcSwUBSlCUARKSE4xcR wTOMdBjAQxi4AAAA1yBDQVJEAAA5+gAAAAAAAArKAAAAAAAAAAAAAAAAAAA68AAADjwA EwArAADRUAADAAAAQAB2AAMBgAAEARgAGQFygAMAAAAAAAEAAAAMAAAAEFJlYnVpbGQA AG9uIG1vdXNlVXANc2V0IGN1cnNvciB0byB3YXRjaA1wdXNoIGNhcmQNQ29uc3RydWN0 TGluaw1wb3AgY2FyZA1lbmQgbW91c2VVcA0NAAABAgATAQAAFgG8AEoB+KAAAABgdgAB AAAADAAAABBJbnN0cnVjdGlvbnMAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJD bGljayBoZXJlIHRvIGdldCBpbnN0cnVjdGlvbnMgZm9yIHVzaW5nIHRoaXMgc3RhY2su Ig1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGdXaGVyZUZyb20NcHVz aCBjZA1wb3AgY2QgaW50byBnV2hlcmVGcm9tDXZpc3VhbCBkaXNzb2x2ZSBmYXN0DWdv IGNkICJJbnN0cnVjdGlvbnMiDWVuZCBtb3VzZVVwDQAAoAAUAgQATADNAT4B/AAHAAAA AAAAAAQACQAAAAxzY3JhdGNoAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhp cyBpcyBhIGdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIGFyZWEgdG8gaG9sZCBnZW5lcmF0 ZWQgdGV4dCBpbmZvcm1hdGlvbi4iDWVuZCBNb3VzZVdpdGhpbg0AAcwAFQIVAEwAeQES AMoABwAAAAAAAAAEAAoAAAANc3VpdGVMaXN0AABvbiBNb3VzZVdpdGhpbg1TaG93QmFs bG9vbiAiVGhpcyBpcyB0aGUgbGlzdCBvZiBzdWl0ZSBjb2RlcyBpbiB0aGlzIHN0YWNr LiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZXVwDWdsb2JhbCBnRGVsZXRlU3VpdGUs Z1doZXJlRnJvbQ1wdXQgdmFsdWUgb2YgdGhlIGNsaWNrTGluZSBpbnRvIHgNDWlmIHgg PSAiIiB0aGVuIGV4aXQgbW91c2VVcA1pZiBnRGVsZXRlU3VpdGUgdGhlbg1kZWxldGVT dWl0ZSB4DXB1dCBmYWxzZSBpbnRvIGdEZWxldGVTdWl0ZQ1leGl0IG1vdXNlVXANZWxz ZQ1wdXNoIGNkDXBvcCBjZCBpbnRvIGdXaGVyZUZyb20NdmlzdWFsIGRpc3NvbHZlIGZh c3QNZ28gY2FyZCAic3VpdGUiICYmIHgNZW5kIGlmDWVuZCBtb3VzZXVwDQ1vbiBkZWxl dGVTdWl0ZSB0aGVTdWl0ZQ1iZWVwIDINZW5kIGRlbGV0ZVN1aXRlAADMABcBAAFBAWYB VAGzoAIAAAAAAAEAFQAKAQAADVByaW50IEZpZWxkAABvbiBNb3VzZVdpdGhpbg1TaG93 QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBwcmludCB0aGUgY29udGVudHMgb2YgdGhlIGNv ZGUgc2NyYXRjaHBhZCBmaWVsZC4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1w cmludCAoY2FyZCBmaWVsZCAic2NyYXRjaCIpDWVuZCBtb3VzZVVwAAFoABgBAAFBAbUB VAH8oAIAAAAAAAEAFQAKAQAADVNhdmUgQXPJAABvbiBNb3VzZVdpdGhpbg1TaG93QmFs bG9vbiAiQ2xpY2sgaGVyZSB0byBzYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgY29kZSBz Y3JhdGNocGFkIGZpZWxkIHRvIGEgVEVYVCBmaWxlLiINZW5kIE1vdXNlV2l0aGluDQ1v biBtb3VzZVVwDWFzayBmaWxlICJTYXZlIHRoZSBzY3JhdGNocGFkIGFzOiINaWYgaXQg PD4gIiIgb3IgdGhlIHJlc3VsdCBpcyBub3QgIkNhbmNlbCIgdGhlbg1wdXQgaXQgaW50 byByZWYNb3BlbiBmaWxlIHJlZg13cml0ZSBjYXJkIGZpZWxkICJzY3JhdGNoIiB0byBm aWxlIHJlZg1jbG9zZSBmaWxlIHJlZg1lbmQgaWYNZW5kIG1vdXNlVXAAAAFkABkBAAFB AM0BVAEYoAIAAAAAAAEAFQAKAQAADUNsZWFyIEZpZWxkAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBjbGVhciB0aGUgY29kZSBzY3JhdGNocGFk IGZpZWxkLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWFuc3dlciAiQ2xlYXIg dGhlIGNvbnRlbnRzIG9mIHRoZSBjb2RlIHNjcmF0Y2ggcGFkIGZpZWxkLiIgd2l0aCAi T0siIG9yICJDYW5jZWwiDWlmIGl0IGlzICJDYW5jZWwiIHRoZW4gZXhpdCBtb3VzZVVw DXB1dCBlbXB0eSBpbnRvIGNhcmQgZmllbGQgInNjcmF0Y2giDXB1dCAiU2NyYXRjaHBh ZCIgaW50byBjYXJkIGZpZWxkICJwYWROYW1lIg1lbmQgbW91c2VVcAAAAUYAGgEAARgA eQEsAMqgBAAAAAAAAQAAAAwAAAAQTmV3IFN1aXRlAABvbiBNb3VzZVdpdGhpbg1TaG93 QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBhZGQgYSBuZXcgc3VpdGUuIg1lbmQgTW91c2VX aXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGdXaGVyZUZyb20NbG9jayBzY3JlZW4NZ28g bGFzdCBjYXJkIG9mIGJrZ25kICJzdWl0ZUluZm8iDURvTWVudSAiTmV3IENhcmQiDXB1 c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJvbQ11bmxvY2sgc2NyZWVuIHdpdGggdmlz dWFsIHdpcGUgbGVmdA1jbGljayBhdCB0aGUgbG9jIG9mIGZsZCAic3VpdGVDb2RlIg1l bmQgbW91c2VVcAABJAAbAQABGAAKASwAbqAEAAAAAAABAAAADAAAABBQcmVmZXJlbmNl c8kAAG9uIG1vdXNlVXANZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2QgaW50 byBnV2hlcmVGcm9tDXZpc3VhbCBkaXNzb2x2ZSBmYXN0DWdvIGNhcmQgInByZWZlcmVu Y2UiDWVuZCBtb3VzZVVwDQ1vbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBnbyB0byBhIGNhcmQgd2hlcmUgeW91IGNhbiB2aWV3IGFuZCLCDSYiIHNl dCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBzdGFjay4iDWVuZCBNb3VzZVdpdGhpbgAAB1oA HAEAAOUAEAD5AGegBAAAAAAAAQAAAAwAAAAQQ2xpZW50IENvZGUAAG9uIE1vdXNlV2l0 aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdlbmVyYXRlIHNhbXBsZSBjb2Rl IHRoYXQgYSBjbGllbnQgY291bGQgdXNlIHRvIHNlbmQgQXBwbGUgRXZlbnQuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGluRWRpdCwgY2xpZW50TGFuZw1z ZXQgbG9ja1NjcmVlbiB0byB0cnVlDXNldCBsb2NrUmVjZW50IHRvIHRydWUNQ2hlY2tQ cmVmZXJlbmNlDXB1dCAiZmFsc2UiIGludG8gaW5FZGl0DXB1c2ggY2FyZA1wdXQgQ2xp ZW50U2FtcGxlKCJpbml0IikgaW50byBzYW1wbGVDb2RlDWlmIHRoZSBvcHRpb25LZXkg aXMgZG93biB0aGVuDWRvbWVudSAiQmFjayINcHV0IENsaWVudFNhbXBsZSh3b3JkIDEg b2Ygc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQpIGFmdGVyIHNhbXBsZUNvZGUNZWxzZQ0t LXB1dCAiIiBpbnRvIGV2ZW50SW52ZW50b3J5DWdvIHRvIGZpcnN0IGNhcmQgb2YgYmtn bmQgZXZlbnRzDXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIg aW50byBzdWl0ZUNvdW50DXJlcGVhdCB3aXRoIHN1aXRlSW5kZXggPSAyIHRvIHN1aXRl Q291bnQNc2V0IGN1cnNvciB0byBidXN5DWdvIGNhcmQgc3VpdGVJbmRleCBvZiBia2du ZCAic3VpdGVJbmZvIg1wdXQgZmllbGQgIkV2ZW50TGlzdCIgaW50byBteUV2ZW50TGlz dA1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBteVN1aXRlQ29kZQ1wdXQgZmllbGQg IkNsYXNzTGlzdCIgaW50byBteUNsYXNzTGlzdA1wdXQgQ2xpZW50U2FtcGxlKCJzdWl0 ZSIpIGFmdGVyIHNhbXBsZUNvZGUgLS0gdGhpcyBpcyBhbiAiaW5pdGlhbGl6YXRpb24i DS0tIG5vdyBkbyBpdCBmb3IgZWFjaCBldmVudCBpbiB0aGUgbGlzdA1wdXQgbnVtYmVy IG9mIGxpbmVzIGluIG15RXZlbnRMaXN0IGludG8gZXZlbnRDb3VudA1yZXBlYXQgd2l0 aCBldmVudEluZGV4ID0gMSB0byBldmVudGNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1p ZiBqdW1wKCJldmVudCIgJiYgaXRlbSAyIG9mIGxpbmUgZXZlbnRJbmRleCBvZiBteUV2 ZW50TGlzdCkgdGhlbg1wdXQgQ2xpZW50U2FtcGxlKCJldmVudCIpIGFmdGVyIHNhbXBs ZUNvZGUNLS1wdXQgZmllbGQgInNjcmlwdFRlbXBsYXRlIiAmIHJldHVybiAmIHJldHVy biBhZnRlciBldmVudEludmVudG9yeQ1lbmQgaWYNZW5kIHJlcGVhdA0tLSBub3cgZG8g aXQgZm9yIGVhY2ggY2xhc3MgaW4gdGhlIGxpc3QNcHV0IG51bWJlciBvZiBsaW5lcyBp biBteUNsYXNzTGlzdCBpbnRvIGNsYXNzQ291bnQNcmVwZWF0IHdpdGggY2xhc3NJbmRl eCA9IDEgdG8gY2xhc3NDb3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiY2xh c3MiICYmIGl0ZW0gMiBvZiBsaW5lIGNsYXNzSW5kZXggb2YgbXlDbGFzc0xpc3QpIHRo ZW4NcHV0IENsaWVudFNhbXBsZSgiY2xhc3MiKSBhZnRlciBzYW1wbGVDb2RlDWVuZCBp Zg1lbmQgcmVwZWF0DXB1dCBDbGllbnRTYW1wbGUoInN1aXRlRW5kIikgYWZ0ZXIgc2Ft cGxlQ29kZSAtLSB0aGlzIGlzIGEgInRlcm1pbmF0aW9uIg1lbmQgcmVwZWF0DS0tIHB1 dCBldmVudEludmVudG9yeSBhZnRlciBzYW1wbGVDb2RlDWVuZCBpZg1wb3AgY2FyZA1Q dXRTY3JhdGNoIHNhbXBsZUNvZGUsICJDbGllbnQgU2FtcGxlIENvZGUiDXB1dCB0cnVl IGludG8gaW5FZGl0DWVuZCBtb3VzZVVwDQ0tLSBsYW5ndWFnZSBkZXBlbmRlbnQgcGFy dA0NZnVuY3Rpb24gQ2xpZW50U2FtcGxlIGNhcmRUeXBlDWlmIGNhcmRUeXBlID0gImV2 ZW50IiB0aGVuDXJldHVybiBDbGllbnRUZW1wbGF0ZSgpICYgcmV0dXJuICYgcmV0dXJu DWVsc2UNcmV0dXJuICIiDWVuZCBpZg1lbmQgQ2xpZW50U2FtcGxlDQ0AAFE6AB0BAADL ABAA3wBnoAQAAAAAAAEAAAAMAAAAEFNlcnZlciBDb2RlAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnZW5lcmF0ZSBzYW1wbGUgY29kZSB0aGF0 IGEgY2xpZW50IGNvdWxkIHVzZSB0byBzZW5kIEFwcGxlIEV2ZW50LiINZW5kIE1vdXNl V2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBpbkVkaXQsc2VydmVyTGFuZw1zZXQgbG9j a1NjcmVlbiB0byB0cnVlDXNldCBsb2NrUmVjZW50IHRvIHRydWUNcHVzaCBjYXJkDXB1 dCAiZmFsc2UiIGludG8gaW5FZGl0DXB1dCAiIiBpbnRvIGNvbnN0cw1pZiB0aGUgb3B0 aW9uS2V5IGlzIGRvd24gdGhlbg1kb21lbnUgIkJhY2siDXB1dCBTZXJ2ZXJTYW1wbGUo d29yZCAxIG9mIHRoZSBzaG9ydCBuYW1lIG9mIHRoaXMgY2FyZCkgYWZ0ZXIgY29uc3Rz DWVsc2UNaWYgc2VydmVyTGFuZyA9ICJQYXNjYWwiIHRoZW4NcHV0ICJDT05TVCIgJiBy ZXR1cm4gYWZ0ZXIgY29uc3RzDWVuZCBpZg1wdXQgIiIgaW50byBldmVudElESW5mbw1w dXQgIiIgaW50byBldmVudEtleUluZm8NcHV0ICIiIGludG8gY2xhc3NDb25zdA1wdXQg IiIgaW50byBwcm9wQ29uc3QNcHV0ICIiIGludG8gZW51bUNvbnN0DXB1dCAiIiBpbnRv IHNhbXBsZUNvZGUNcHV0ICIiIGludG8gaW5zdGFsbENvZGUNcHV0IFNlcnZlclNhbXBs ZSgiaW5pdCIpIGFmdGVyIHNhbXBsZUNvZGUgLS0gdGhpcyBpcyBhbiAiaW5pdGlhbGl6 YXRpb24iDWdvIHRvIGZpcnN0IGNhcmQgb2YgYmtnbmQgZXZlbnRzDXB1dCBudW1iZXIg b2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50byBzdWl0ZUNvdW50DXJlcGVh dCB3aXRoIHN1aXRlSW5kZXggPSAyIHRvIHN1aXRlQ291bnQNc2V0IGN1cnNvciB0byBi dXN5DWdvIGNhcmQgc3VpdGVJbmRleCBvZiBia2duZCAic3VpdGVJbmZvIg1wdXQgZmll bGQgIkV2ZW50TGlzdCIgaW50byBteUV2ZW50TGlzdA1wdXQgZmllbGQgInN1aXRlQ29k ZSIgaW50byBteVN1aXRlQ29kZQ1wdXQgZmllbGQgIkNsYXNzTGlzdCIgaW50byBteUNs YXNzTGlzdA1wdXQgZmllbGQgIkVudW1MaXN0IiBpbnRvIG15RW51bUxpc3QNLS0gbm93 IGRvIGl0IGZvciBlYWNoIGV2ZW50IGluIHRoZSBsaXN0DXB1dCBudW1iZXIgb2YgbGlu ZXMgaW4gbXlFdmVudExpc3QgaW50byBldmVudENvdW50DXJlcGVhdCB3aXRoIGV2ZW50 SW5kZXggPSAxIHRvIGV2ZW50Y291bnQNc2V0IGN1cnNvciB0byBidXN5DWlmIGp1bXAo ImV2ZW50IiAmJiBpdGVtIDIgb2YgbGluZSBldmVudEluZGV4IG9mIG15RXZlbnRMaXN0 KSB0aGVuDXB1dCBTZXJ2ZXJTYW1wbGUoImV2ZW50IikgYWZ0ZXIgc2FtcGxlQ29kZQ1w dXQgU2VydmVyU2FtcGxlKCJpbnN0YWxsIikgYWZ0ZXIgaW5zdGFsbENvZGUgLS0gdGhp cyBpcyB0byBpbnN0YWxsIGhhbmRsZXINcHV0ICJrQUUiICYgU3RyaXBTUChmaWVsZCAi RXZlbnROYW1lIikgJiAiLCIgJiAiJyIgJiDCDVJlc1R5cGUoZmllbGQgIkV2ZW50SUQi KSAmICInIiAmIHJldHVybiBhZnRlciBldmVudElESW5mbw1yZXBlYXQgd2l0aCBpID0g MyB0byBudW1iZXIgb2YgbGluZXMgaW4gZmllbGQgInBhcmFtSW5mbyINcHV0IGxpbmUg aSBvZiBmaWVsZCAicGFyYW1JbmZvIiBpbnRvIHgNcHV0IHF1b3RlICYgImtleUFFIiAm IFN0cmlwU1AoaXRlbSAxIG9mIHgpICYgcXVvdGUgaW50byB0aGlzTmFtZQ1wdXQgcXVv dGUgJiAiJyIgJiBSZXNUeXBlKGl0ZW0gMiBvZiB4KSAmICInIiAmIHF1b3RlIGludG8g dGhpc0tleQ1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHByb3BMaXN0IGludG8gbg1wdXQg MSBpbnRvIGoNcmVwZWF0IHVudGlsICh0aGlzTmFtZSA9IGl0ZW0gMSBvZiBsaW5lIGog b2YgcHJvcExpc3QpIG9yIChqID4gbikNYWRkIDEgdG8gag1lbmQgcmVwZWF0DWlmIGog PiBuIHRoZW4NcHV0IHRoaXNOYW1lICYgIiwiICYgdGhpc0tleSAmIHJldHVybiBhZnRl ciBldmVudEtleUluZm8NZWxzZQ1pZiB0aGlzS2V5IDw+IGl0ZW0gMiBvZiBsaW5lIGog b2YgcHJvcExpc3QgdGhlbg1wdXQgdGhpc05hbWUgJiAiLCIgJiB0aGlzS2V5ICYgIix0 cnVlIiAmIHJldHVybiBhZnRlciBldmVudEtleUluZm8NZW5kIGlmDWVuZCBpZg1lbmQg cmVwZWF0DWVuZCBpZiAtLSBQYXNjYWwgQyBldGMsIGdldCB0aGUgZXZlbnQgYW5kIGtl eXdvcmQNZW5kIHJlcGVhdA0tLSBub3cgZG8gaXQgZm9yIGVhY2ggY2xhc3MgaW4gdGhl IGxpc3QNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBteUNsYXNzTGlzdCBpbnRvIGNsYXNz Q291bnQNcmVwZWF0IHdpdGggY2xhc3NJbmRleCA9IDEgdG8gY2xhc3NDb3VudA1zZXQg Y3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiY2xhc3MiICYmIGl0ZW0gMiBvZiBsaW5lIGNs YXNzSW5kZXggb2YgbXlDbGFzc0xpc3QpIHRoZW4NcHV0IFNlcnZlclNhbXBsZSgiY2xh c3MiKSBhZnRlciBzYW1wbGVDb2RlDXB1dCAiYyIgJiBTdHJpcFNQKGZpZWxkICJjbGFz c05hbWUiKSAmICIsIiAmICInIiAmIMINUmVzVHlwZShmaWVsZCAiY2xhc3NJRCIpICYg IiciICYgcmV0dXJuIGFmdGVyIGNsYXNzQ29uc3QNcmVwZWF0IHdpdGggaSA9IDEgdG8g bnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkICJwcm9wSW5mbyINcHV0IGxpbmUgaSBvZiBm aWVsZCAicHJvcEluZm8iIGludG8geA1wdXQgInAiICYgU3RyaXBTUChpdGVtIDEgb2Yg eCkgaW50byB0aGlzTmFtZQ1wdXQgIiciICYgUmVzVHlwZShpdGVtIDIgb2YgeCkgJiAi JyIgaW50byB0aGlzS2V5DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gcHJvcExpc3QgaW50 byBuDXB1dCAxIGludG8gag1yZXBlYXQgdW50aWwgKHRoaXNOYW1lID0gaXRlbSAxIG9m IGxpbmUgaiBvZiBwcm9wTGlzdCkgb3IgKGogPiBuKQ1hZGQgMSB0byBqDWVuZCByZXBl YXQNaWYgaiA+IG4gdGhlbg1wdXQgdGhpc05hbWUgJiAiLCIgJiB0aGlzS2V5ICYgcmV0 dXJuIGFmdGVyIHByb3BDb25zdA1lbHNlDWlmIHRoaXNLZXkgPD4gaXRlbSAyIG9mIGxp bmUgaiBvZiBwcm9wTGlzdCB0aGVuDXB1dCB0aGlzTmFtZSAmICIsIiAmIHRoaXNLZXkg JiAiLHRydWUiICYgcmV0dXJuIGFmdGVyIHByb3BDb25zdA1lbmQgaWYNZW5kIGlmDWVu ZCByZXBlYXQNZW5kIGlmDWVuZCByZXBlYXQNLS0gbm93IGRvIGl0IGZvciBlYWNoIGNs YXNzIGluIHRoZSBsaXN0DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gbXlFbnVtTGlzdCBp bnRvIGVudW1Db3VudA1yZXBlYXQgd2l0aCBlbnVtSW5kZXggPSAxIHRvIGVudW1Db3Vu dA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiZW51bWVyYXRpb24iICYmIGxpbmUg ZW51bUluZGV4IG9mIG15RW51bUxpc3QpIHRoZW4NcHV0IFNlcnZlclNhbXBsZSgiZW51 bSIpIGFmdGVyIHNhbXBsZUNvZGUNcmVwZWF0IHdpdGggaSA9IDEgdG8gbnVtYmVyIG9m IGxpbmVzIGluIGZpZWxkICJlbnVtSW5mbyINcHV0IGxpbmUgaSBvZiBmaWVsZCAiZW51 bUluZm8iIGludG8geA1wdXQgImtBRUVudW0iICYgU3RyaXBTUChpdGVtIDEgb2YgeCkg aW50byB0aGlzTmFtZQ1wdXQgIiciICYgUmVzVHlwZShpdGVtIDIgb2YgeCkgJiAiJyIg aW50byB0aGlzS2V5DXB1dCB0aGlzTmFtZSAmICIsIiAmIHRoaXNLZXkgJiByZXR1cm4g YWZ0ZXIgZW51bUNvbnN0DWVuZCByZXBlYXQNZW5kIGlmDWVuZCByZXBlYXQNZW5kIHJl cGVhdA1wdXQgU2VydmVyU2FtcGxlKCJkb25lIikgYWZ0ZXIgc2FtcGxlQ29kZSAtLSB0 aGlzIGlzIGEgInRlcm1pbmF0aW9uIg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGV2ZW50 SURJbmZvIGludG8gbg1yZXBlYXQgd2l0aCBpID0gMSB0byBuDXB1dCBTZXJ2ZXJDb25z dChsaW5lIGkgb2YgZXZlbnRJREluZm8pICYgcmV0dXJuIGFmdGVyIGNvbnN0cw1lbmQg cmVwZWF0DWlmIG4gPiAwIHRoZW4NcHV0IHJldHVybiBhZnRlciBjb25zdHMNZW5kIGlm DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gZXZlbnRLZXlJbmZvIGludG8gbg1yZXBlYXQg d2l0aCBpID0gMSB0byBuDXB1dCBTZXJ2ZXJDb25zdChsaW5lIGkgb2YgZXZlbnRLZXlJ bmZvKSAmIHJldHVybiBhZnRlciBjb25zdHMNZW5kIHJlcGVhdA1pZiBuID4gMCB0aGVu DXB1dCByZXR1cm4gYWZ0ZXIgY29uc3RzDWVuZCBpZg1wdXQgbnVtYmVyIG9mIGxpbmVz IGluIGNsYXNzQ29uc3QgaW50byBuDXJlcGVhdCB3aXRoIGkgPSAxIHRvIG4NcHV0IFNl cnZlckNvbnN0KGxpbmUgaSBvZiBjbGFzc0NvbnN0KSAmIHJldHVybiBhZnRlciBjb25z dHMNZW5kIHJlcGVhdA1pZiBuID4gMCB0aGVuDXB1dCByZXR1cm4gYWZ0ZXIgY29uc3Rz DWVuZCBpZg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHByb3BDb25zdCBpbnRvIG4NcmVw ZWF0IHdpdGggaSA9IDEgdG8gbg1wdXQgU2VydmVyQ29uc3QobGluZSBpIG9mIHByb3BD b25zdCkgJiByZXR1cm4gYWZ0ZXIgY29uc3RzDWVuZCByZXBlYXQNaWYgbiA+IDAgdGhl bg1wdXQgcmV0dXJuIGFmdGVyIGNvbnN0cw1lbmQgaWYNcHV0IG51bWJlciBvZiBsaW5l cyBpbiBlbnVtQ29uc3QgaW50byBuDXJlcGVhdCB3aXRoIGkgPSAxIHRvIG4NcHV0IFNl cnZlckNvbnN0KGxpbmUgaSBvZiBlbnVtQ29uc3QpICYgcmV0dXJuIGFmdGVyIGNvbnN0 cw1lbmQgcmVwZWF0DWlmIG4gPiAwIHRoZW4NcHV0IHJldHVybiBhZnRlciBjb25zdHMN ZW5kIGlmDXB1dCBzYW1wbGVDb2RlIGFmdGVyIGNvbnN0cw1pZiBpbnN0YWxsQ29kZSA8 PiAiIiB0aGVuDXB1dCBTZXJ2ZXJJbnN0YWxsKGluc3RhbGxDb2RlKSBhZnRlciBjb25z dHMNZW5kIGlmDWVuZCBpZg1wb3AgY2FyZA1QdXRTY3JhdGNoIGNvbnN0cywgIlNlcnZl ciBTYW1wbGUgQ29kZSINcHV0ICJ0cnVlIiBpbnRvIGluRWRpdA1lbmQgbW91c2VVcA0N LS0gbGFuZ3VhZ2UgZGVwZW5kZW50IHBhcnQNDWZ1bmN0aW9uIFNlcnZlclNhbXBsZSBj YXJkVHlwZQ1pZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1wdXQgIkFFIiAmIFN0cmlw U1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNZ2xvYmFsIHZlcmJvc2UN aWYgdmVyYm9zZSB0aGVuDXB1dCBmaWVsZCAiZXZlbnRDb21tZW50IiBpbnRvIHRlbXAN aWYgdGVtcCA8PiAiIiB0aGVuDXB1dCAieyAiICYgdGVtcCAmICIgfSIgJiByZXR1cm4g JiByZXR1cm4gaW50byBwcm9jSGVhZGVyDWVuZCBpZg1lbmQgaWYNcHV0IFBhc2NhbENs aWVudFRlbXBsYXRlKCkgJiByZXR1cm4gaW50byB0ZW1wDXB1dCAiRG8iIGFmdGVyIGNo YXIgOSBvZiB0ZW1wDXB1dCB0ZW1wIGFmdGVyIHByb2NIZWFkZXINcHV0IFRhYiAmICJC RUdJTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1wdXQgVGFiICYgInsgcHV0IHlv dXIgY29kZSBoZXJlIH0iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXINcHV0IFRhYiAm ICJEbyIgJiBwcm9jTmFtZSAmICIgOj0gTm9FcnI7IiAmIHJldHVybiBhZnRlciBwcm9j SGVhZGVyDXB1dCBUYWIgJiAiRU5EOyIgJiByZXR1cm4gJiByZXR1cm4gYWZ0ZXIgcHJv Y0hlYWRlcg1wdXQgIkZ1bmN0aW9uIEhhbmRsZSIgJiBwcm9jTmFtZSDCDSYgIih0aGVB cHBsZUV2ZW50LCB0aGVSZXBseTpBcHBsZUV2ZW50OyB0aGVSZWZDb246TE9OR0lOVCk6 T1NFcnI7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCBHbHVlSW5mbyhmaWVs ZCAicGFyYW1JbmZvIikgaW50byBwYXJhbUluZm8NcHV0IG51bWJlciBvZiBsaW5lcyBv ZiBwYXJhbUluZm8gaW50byBjb3VudA1wdXQgKGl0ZW0gMyBvZiBwYXJhbUluZm8gPD4g Im51bGwiKSBpbnRvIGlzRnVuYw1wdXQgVGFiICYgVGFiIGludG8gdHdvVGFiDXB1dCBU YWIgJiB0d29UYWIgaW50byB0aHJlZVRhYg1wdXQgIiIgaW50byB2YXJEZWNsYXJlDXB1 dCBmYWxzZSBpbnRvIG5lZWRFcnINcHV0ICIiIGludG8gY2xlYW5VcENvZGUNcHV0ICIi IGludG8gcHV0UmVzdWx0Q29kZQ1wdXQgVGFiICYgIkZhaWxFcnIoRG8iICYgcHJvY05h bWUgJiAiKCIgaW50byBjYWxsWW91ckNvZGUNcHV0IFRhYiAmICJCRUdJTiIgJiByZXR1 cm4gaW50byBpbml0Q29kZQ1wdXQgMCBpbnRvIHRvdGFsUGFyYW0NLS0gaWYgYSBmdW5j dGlvbiBnZXQgdGhlIHJlc3VsdCBiYWNrDWlmIGlzRnVuYyB0aGVuDWFkZCAxIHRvIHRv dGFsUGFyYW0NcHV0IGxpbmUgMSBvZiBwYXJhbUluZm8gaW50byB4DXB1dCBpdGVtIDQg b2YgeCBpbnRvIHBhcmFtVHlwZQ1wdXQgTmFtZU9mRGF0YVR5cGUoaXRlbSAzIG9mIHgp IGludG8gbmFtZUxpc3QNcHV0IFRhYiAmICJJRiB0aGVSZXBseS5kYXRhSGFuZGxlIDw+ IE5JTCBUSEVOIiAmIHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWlmIHBhcmFtVHlw ZSA8PSAzIHRoZW4gLS0gcmVzdWx0IGlzIEFFRGVzYyBvciBIYW5kbGUNcHV0ICJ0aGVS ZXN1bHQ6IEFFRGVzYzsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IFRhYiAm ICJ0aGVSZXN1bHQuZGF0YUhhbmRsZSA6PSBOSUw7IiAmIHJldHVybiBhZnRlciBpbml0 Q29kZQ1pZiAocGFyYW1UeXBlID0gMCkgb3IgKHBhcmFtVHlwZSA9IDIpIHRoZW4NcHV0 ICJ0aGVSZXN1bHQsIiBhZnRlciBjYWxsWW91ckNvZGUNZWxzZQ1wdXQgVGFiICYgInRo ZVJlc3VsdC5kZXNjcmlwdG9yVHlwZSA6PSAiICYgaXRlbSA0IG9mIG5hbWVMaXN0IMIN JiAiOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUNaWYgaXRlbSAzIG9mIG5hbWVMaXN0 ID0gIkhhbmRsZSIgdGhlbg1wdXQgInRoZVJlc3VsdC5kYXRhSGFuZGxlLCIgYWZ0ZXIg Y2FsbFlvdXJDb2RlDWVsc2UNcHV0IGl0ZW0gMyBvZiBuYW1lTGlzdCAmICIodGhlUmVz dWx0LmRhdGFIYW5kbGUpLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBpZg1lbmQgaWYN cHV0IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKHRoZVJlc3VsdCkp OyIgJiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNcHV0IHR3b1RhYiAmICJGYWlsRXJy KEFFUHV0S2V5RGVzYyh0aGVSZXBseSwga2V5RGlyZWN0T2JqZWN0LCB0aGVSZXN1bHQp KTsiICYgcmV0dXJuIGFmdGVyIHB1dFJlc3VsdENvZGUNZWxzZSBpZiAocGFyYW1UeXBl ID0gNCkgb3IgKHBhcmFtVHlwZSA9IDYpIHRoZW4gLS0gcmVzdWx0IGlzIG9uIHN0YWNr DXB1dCAidGhlUmVzdWx0OiAiICYgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0 dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0ICJ0aGVSZXN1bHQsIiBhZnRlciBjYWxsWW91 ckNvZGUNcHV0IHR3b1RhYiAmICJGYWlsRXJyKEFFUHV0S2V5UHRyKHRoZVJlcGx5LCBr ZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIEB0aGVS ZXN1bHQiIGFmdGVyIHB1dFJlc3VsdENvZGUNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1 dCAiLCBTaXplT2YoIiAmIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICIpKSk7IiAmIHJldHVy biBhZnRlciBwdXRSZXN1bHRDb2RlDWVsc2UNcHV0ICJbMV0sIExlbmd0aCh0aGVSZXN1 bHQpKSk7IiAmIHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWVuZCBpZg1lbmQgaWYN ZW5kIGlmIC0tIGlzRnVuYw1yZXBlYXQgd2l0aCBwYXJhbUluZGV4ID0gMiB0byBjb3Vu dA1wdXQgbGluZSBwYXJhbUluZGV4IG9mIHBhcmFtSW5mbyBpbnRvIHgNaWYgaXRlbSAz IG9mIHggPD4gIm51bGwiIHRoZW4NYWRkIDEgdG8gdG90YWxQYXJhbQ1wdXQgaXRlbSA0 IG9mIHggaW50byBwYXJhbVR5cGUNcHV0IChpdGVtIDUgb2YgeCA9ICJvIikgaW50byBp c09wdGlvbmFsDXB1dCBOYW1lT2ZEYXRhVHlwZShpdGVtIDMgb2YgeCkgaW50byBuYW1l TGlzdA1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IHR3b1RhYiBpbnRvIGluZGVudA1lbHNl DXB1dCBUYWIgaW50byBpbmRlbnQNZW5kIGlmDWlmIHBhcmFtVHlwZSA9IDAgdGhlbiAt LSBBRURlc2MNcHV0IGl0ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNcHV0IHRoaXNOYW1l ICYmICI6IEFFRGVzYzsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IFRhYiAm IHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlIDo9IE5JTDsiICYgcmV0dXJuIGFmdGVyIGlu aXRDb2RlDWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgaXRlbSA2IG9mIHggaW50byBwdHJU aGlzTmFtZQ1wdXQgcHRyVGhpc05hbWUgJiYgIjogQUVEZXNjUHRyOyIgJiByZXR1cm4g YWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgcHRyVGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlv dXJDb2RlDXB1dCB0cnVlIGludG8gbmVlZEVycg1wdXQgVGFiICYgImVyciA6PSBBRUdl dEtleURlc2ModGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9mIHggwg0mICIsdHlwZVdp bGRDYXJkLCIgJiB0aGlzTmFtZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IFBhc2NhbE9wdGlvbkhhbmRsaW5nKHRoaXNOYW1lLCBwdHJUaGlzTmFtZSkgYWZ0 ZXIgcHJvY0JvZHkNZWxzZQ1wdXQgdGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlvdXJD b2RlDXB1dCBUYWIgJiAiRmFpbEVycihBRUdldEtleURlc2ModGhlQXBwbGVFdmVudCwi ICYgaXRlbSAyIG9mIHggwg0mICIsdHlwZVdpbGRDYXJkLCIgJiB0aGlzTmFtZSAmICIp KTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgdHdvVGFiICYgIkln bm9yZU9TRXJyKEFFRGlzcG9zZURlc2MoIiAmIHRoaXNOYW1lICYgIikpOyIgJiByZXR1 cm4gYWZ0ZXIgY2xlYW5VcENvZGUNZWxzZSBpZiBwYXJhbVR5cGUgPSAxIHRoZW4gLS0g aGFuZGxlDXB1dCAiZGVzY0ZvciIgJiBTdHJpcFNQKGl0ZW0gMSBvZiB4KSBpbnRvIHRo aXNOYW1lDXB1dCB0aGlzTmFtZSAmJiAiOiBBRURlc2M7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCBUYWIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSA6PSBOSUw7 IiAmIHJldHVybiBhZnRlciBpbml0Q29kZQ1pZiBpdGVtIDMgb2YgbmFtZUxpc3QgPSAi SGFuZGxlIiB0aGVuDXB1dCB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSwiIGFmdGVyIGNh bGxZb3VyQ29kZQ1lbHNlDXB1dCBpdGVtIDMgb2YgbmFtZUxpc3QgJiAiKCIgJiB0aGlz TmFtZSAmICIuZGF0YUhhbmRsZSksIiBhZnRlciBjYWxsWW91ckNvZGUNZW5kIGlmDWlm IGlzT3B0aW9uYWwgdGhlbg1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFRhYiAmICJl cnIgOj0gQUVHZXRLZXlEZXNjKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBvZiB4IMIN JiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCIgJiB0aGlzTmFtZSAmICIpOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJJRiBlcnIgPSBlcnJBRURl c2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiDCDSYgdHdvVGFiICYgInsgb3IgeW91IG1h eSBwdXQgaW4geW91ciBkZWZhdWx0IGhlcmUgfSIgJiByZXR1cm4gwg0mIFRhYiAmICJF TFNFIEZhaWxFcnIoZXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0 IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5RGVzYyh0aGVBcHBsZUV2ZW50LCIgJiBpdGVt IDIgb2YgeCDCDSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYgIiwiICYgdGhpc05h bWUgJiAiKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IHR3b1Rh YiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKCIgJiB0aGlzTmFtZSAmICIpKTsi ICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWVsc2UgaWYgKHBhcmFtVHlwZSA9IDQp IG9yIChwYXJhbVR5cGUgPSA2KSB0aGVuDWlmIGl0ZW0gMyBvZiB4ID0gInRydWUiIHRo ZW4NcHV0IGl0ZW0gMSBvZiB4ICYmICI6IEJvb2xlYW47IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCBpdGVtIDEgb2YgeCAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUN cHV0IHRydWUgaW50byBuZWVkRXJyDXB1dCBQYXNjYWxUeXBlVHJ1ZUNvZGUoeCkgYWZ0 ZXIgcHJvY0JvZHkNZWxzZSBpZiBpc09wdGlvbmFsIHRoZW4NaWYgaXRlbSAzIG9mIHgg PSAiZW51bSIgdGhlbg1wdXQgaXRlbSAxIG9mIHggJiYgIjogUmVzVHlwZTsiICYgcmV0 dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IGl0ZW0gMSBvZiB4ICYgIiwiIGFmdGVyIGNh bGxZb3VyQ29kZQ1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFBhc2NhbFR5cGVUcnVl Q29kZSh4KSBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCBpdGVtIDYgb2YgeCBpbnRvIHB0 clRoaXNOYW1lDXB1dCBpdGVtIDEgb2YgeCBpbnRvIHRoaXNOYW1lDXB1dCB0aGlzTmFt ZSAmJiAiOiAiICYgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFmdGVy IHZhckRlY2xhcmUNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1dCBwdHJUaGlzTmFtZSAm JiAiOiAiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFmdGVyIHZh ckRlY2xhcmUNZWxzZQ1wdXQgcHRyVGhpc05hbWUgJiYgIjogU3RyaW5nUHRyOyIgJiBy ZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1lbmQgaWYNcHV0IHB0clRoaXNOYW1lICYgIiwi IGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFRhYiAm ICJlcnIgOj0gQUVHZXRLZXlQdHIodGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9mIHgg wg0mICIsIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsdHlwZUNvZGUsQCIgJiB0aGlz TmFtZSBhZnRlciBwcm9jQm9keQ1pZiBwYXJhbVR5cGUgPSA0IHRoZW4NcHV0ICIsU2l6 ZU9mKCIgJiB0aGlzTmFtZSAmICIpLGFjdHVhbFNpemUpOyIgJiByZXR1cm4gYWZ0ZXIg cHJvY0JvZHkNZWxzZSAtLSBzdHIyNTUNcHV0ICJbMV0sU2l6ZU9mKCIgJiB0aGlzTmFt ZSAmICIpLTEsYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg VGFiICYgdGhpc05hbWUgJiAiWzBdIDo9IGNocihhY3R1YWxTaXplKTsiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgUGFzY2FsT3B0aW9uSGFuZGxpbmcodGhp c05hbWUsIHB0clRoaXNOYW1lKSBhZnRlciBwcm9jQm9keQ1lbmQgaWYNZWxzZSAtLSBy ZXF1aXJlZA1wdXQgaXRlbSAxIG9mIHggaW50byB0aGlzTmFtZQ1wdXQgdGhpc05hbWUg JiYgIjogIiAmIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICI7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCB0aGlzTmFtZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNcHV0 IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5UHRyKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0g MiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLHR5cGVDb2RlLEAi ICYgdGhpc05hbWUgYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1 dCAiLFNpemVPZigiICYgdGhpc05hbWUgJiAiKSxhY3R1YWxTaXplKSk7IiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCAiWzFdLFNpemVPZigiICYgdGhpc05hbWUg JiAiKS0xLGFjdHVhbFNpemUpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBU YWIgJiB0aGlzTmFtZSAmICJbMF0gOj0gY2hyKGFjdHVhbFNpemUpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVuZCBpZg1lbHNlIGlmIChwYXJhbVR5cGUgPSA1 KSBvciAocGFyYW1UeXBlID0gNykgdGhlbg1wdXQgImRlc2NGb3IiICYgU3RyaXBTUChp dGVtIDEgb2YgeCkgaW50byB0aGlzTmFtZQ1wdXQgdGhpc05hbWUgJiYgIjogQUVEZXNj OyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgVGFiICYgdGhpc05hbWUgJiAi LmRhdGFIYW5kbGUgOj0gTklMOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUNcHV0IHR3 b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKCIgJiB0aGlzTmFtZSAmICIp KTsiICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWlmIGlzT3B0aW9uYWwgdGhlbg1w dXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IGl0ZW0gNiBvZiB4IGludG8gcHRyVGhpc05h bWUNcHV0IHB0clRoaXNOYW1lICYgIiA6IiAmIGl0ZW0gMiBvZiBuYW1lTGlzdCAmICI7 IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1w dXQgaXRlbSA3IG9mIHggaW50byBzaXplVGhpc05hbWUNcHV0IHNpemVUaGlzTmFtZSAm ICIgOiBMT05HSU5UOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1lbmQgaWYNcHV0 IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlEZXNjKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0g MiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCIgJiB0aGlzTmFt ZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJJRiBlcnIg PSBlcnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdv VGFiICYgcHRyVGhpc05hbWUgJiAiIDo9IE5JTDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1wdXQgdHdvVGFiICYgc2l6ZVRoaXNOYW1l ICYgIiA6PSAwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCB0d29U YWIgJiAieyBvciB5b3UgbWF5IHB1dCBpbiB5b3VyIGRlZmF1bHQgaGVyZSB9IiAmIHJl dHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkVORCIgJiByZXR1cm4gYWZ0 ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJFTFNFIiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg dHdvVGFiICYgIkZhaWxFcnIoZXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlm IHBhcmFtVHlwZSA9IDcgdGhlbiAtLSBwdXQgaW4gemVybyB0ZXJtaW5hdG9yDXB1dCB0 d29UYWIgJiAiRmFpbEVycihQdHJBbmRIYW5kKEBlcnIsICIgJiB0aGlzTmFtZSDCDSYg Ii5kYXRhSGFuZGxlLCAxKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYN cHV0IHR3b1RhYiAmICJXSVRIIiAmJiB0aGlzTmFtZSAmJiAiRE8iICYgcmV0dXJuIGFm dGVyIHByb2NCb2R5DXB1dCB0aHJlZVRhYiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIg cHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNSB0aGVuDXB1dCB0aHJlZVRhYiAmIHNpemVU aGlzTmFtZSAmICIgOj0gR2V0SGFuZGxlU2l6ZShkYXRhSGFuZGxlKTsiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DWVuZCBpZg1pZiBpdGVtIDIgb2YgbmFtZUxpc3QgPSAiUHRy IiB0aGVuDXB1dCB0aHJlZVRhYiAmIHB0clRoaXNOYW1lICYgIiA6PSBkYXRhSGFuZGxl XjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IHRocmVlVGFiICYgcHRy VGhpc05hbWUgJiAiIDo9ICIgJiBpdGVtIDIgb2YgbmFtZUxpc3Qgwg0mICIoZGF0YUhh bmRsZV4pOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCB0aHJlZVRh YiAmICJITG9jayhkYXRhSGFuZGxlKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCB0aHJlZVRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdv VGFiICYgIkVORDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBwdHJUaGlzTmFt ZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNaWYgcGFyYW1UeXBlID0gNSB0aGVuDXB1 dCBzaXplVGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBpZg1lbHNl DXB1dCBUYWIgJiAiRmFpbEVycihBRUdldEtleURlc2ModGhlQXBwbGVFdmVudCwiICYg aXRlbSAyIG9mIHggwg0mICIsIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIiAmIHRo aXNOYW1lICYgIikpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBl ID0gNyB0aGVuIC0tIHB1dCBpbiB6ZXJvIHRlcm1pbmF0b3INcHV0IHRydWUgaW50byBu ZWVkRXJyDXB1dCBUYWIgJiAiRmFpbEVycihQdHJBbmRIYW5kKEBlcnIsICIgJiB0aGlz TmFtZSDCDSYgIi5kYXRhSGFuZGxlLCAxKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1lbmQgaWYNcHV0IFRhYiAmICJITG9jaygiICYgdGhpc05hbWUgJiAiLmRhdGFIYW5k bGUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgaXRlbSAyIG9mIG5hbWVMaXN0 ID0gIlB0ciIgdGhlbg1wdXQgdGhpc05hbWUgJiAiLmRhdGFIYW5kbGVeLCIgYWZ0ZXIg Y2FsbFlvdXJDb2RlDWVsc2UNcHV0IGl0ZW0gMiBvZiBuYW1lTGlzdCAmICIoIiAmIHRo aXNOYW1lICYgIi5kYXRhSGFuZGxlXiksIiBhZnRlciBjYWxsWW91ckNvZGUNZW5kIGlm DWlmIHBhcmFtVHlwZSA9IDUgdGhlbiAtLSB3ZSBuZWVkIHRoZSBzaXplIHRvbw1wdXQg IkdldEhhbmRsZVNpemUoIiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlKSwiIGFmdGVy IGNhbGxZb3VyQ29kZQ1lbmQgaWYNZW5kIGlmDWVuZCBpZg1lbmQgaWYgLS0gbm90IG51 bGwNZW5kIHJlcGVhdA1pZiB2ZXJib3NlIHRoZW4NcHV0IFRhYiAmICJ7IFdlIGNoZWNr IHRvIHNlZSBpZiB3ZSBtaXNzZWQgYW55IHBhcmFtZXRlciBmcm9tIHRoZSBjbGllbnQg fSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAiSUYgQUVT aXplT2ZBdHRyaWJ1dGUodGhlQXBwbGVFdmVudCwga2V5TWlzc2VkS2V5d29yZEF0dHIs ICIgwg0mICJ0eXBlQ29kZSwgYWN0dWFsU2l6ZSkgPD4gZXJyQUVEZXNjTm90Rm91bmQg VEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmICJGYWlsRXJy KGVyckFFUGFyYW1NaXNzZWQpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgdG90 YWxQYXJhbSA+IDAgdGhlbg1wdXQgIikiIGludG8gbGFzdCBjaGFyIG9mIGNhbGxZb3Vy Q29kZQ1lbHNlDWRlbGV0ZSBsYXN0IGNoYXIgb2YgY2FsbFlvdXJDb2RlDWVuZCBpZg1w dXQgY2FsbFlvdXJDb2RlICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg cHV0UmVzdWx0Q29kZSBhZnRlciBwcm9jQm9keQ1pZiBjbGVhblVwQ29kZSA8PiAiIiB0 aGVuDXB1dCB0YWIgJiAiQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVu ZCBpZg1wdXQgdGFiICYgIkhhbmRsZSIgJiBwcm9jTmFtZSAmICIgOj0gTm9FcnI7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdGFiICYgIkVORDsiICYgcmV0dXJuIGFm dGVyIHByb2NCb2R5DWlmIG5lZWRFcnIgdGhlbiBwdXQgImVyciA6IE9TRXJyOyIgJiBy ZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgInR5cGVDb2RlIDogRGVzY1R5cGU7IiAm IHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAiYWN0dWFsU2l6ZSA6IExPTkdJTlQ7 IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWlmIHZhckRlY2xhcmUgPD4gIiIgdGhl bg1wdXQgdGFiICYgIlZBUiIgJiByZXR1cm4gaW50byB4DXJlcGVhdCB3aXRoIGkgPSAx IHRvIG51bWJlciBvZiBsaW5lcyBpbiB2YXJEZWNsYXJlDXB1dCB0d29UYWIgJiBsaW5l IGkgb2YgdmFyRGVjbGFyZSAmIHJldHVybiBhZnRlciB4DWVuZCByZXBlYXQNcHV0IHgg YWZ0ZXIgcHJvY0hlYWRlcg1lbmQgaWYNcHV0IEZhaWxFcnJTb3VyY2UocHJvY05hbWUs IGNsZWFuVXBDb2RlKSBhZnRlciBwcm9jSGVhZGVyDXJldHVybiBwcm9jSGVhZGVyICYg aW5pdENvZGUgJiByZXR1cm4gJiBwcm9jQm9keSAmIHJldHVybg1lbHNlIGlmIGNhcmRU eXBlID0gImluaXQiIHRoZW4NcmV0dXJuICJQUk9DRURVUkUgSWdub3JlT1NFcnIoZXJy Ok9TRXJyKTsgSU5MSU5FICQ1NDhGOyB7IGFkZHEgIzIsc3AgfSAiICYgcmV0dXJuICYg cmV0dXJuDWVsc2UgaWYgY2FyZFR5cGUgPSAiaW5zdGFsbCIgdGhlbg1wdXQgIkFFIiAm IFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNcmV0dXJuIFRh YiAmICJJZ25vcmVPU0VycihBRUluc3RhbGxFdmVudEhhbmRsZXIoJyIgJiBSZXNUeXBl KGZpZWxkICJldmVudENsYXNzIikgwg0mICInLCAnIiAmIFJlc1R5cGUoZmllbGQgImV2 ZW50SUQiKSAmICInLCBASGFuZGxlIiAmIHByb2NOYW1lIMINJiAiLCAwLCBGQUxTRSkp OyIgJiByZXR1cm4NZWxzZQ1yZXR1cm4gIiINZW5kIGlmDWVuZCBTZXJ2ZXJTYW1wbGUN DWZ1bmN0aW9uIEZhaWxFcnJTb3VyY2UgcHJvY05hbWUsIGNsZWFudXBDb2RlDS0tIHdl IHB1dCB0aGlzIHNlcGFyYXRlIHNvIHRoZSBQYXNjYWxTZXJ2ZXJTYW1wbGUgd291bGQg bm90IGJlIHRvbyBsb25nDXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0IFRhYiAm IHR3b1RhYiBpbnRvIHRocmVlVGFiDXB1dCAiIiBpbnRvIHByb2NIZWFkZXINLS0gdGhl IGNsZWFudXAgcm91dGluZQ1pZiBjbGVhblVwQ29kZSA8PiAiIiB0aGVuDXB1dCBUYWIg JiAiUFJPQ0VEVVJFIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1 dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXINcHV0IGNs ZWFuVXBDb2RlIGFmdGVyIHByb2NIZWFkZXINcHV0IHR3b1RhYiAmICJFTkQ7IiAmIHJl dHVybiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDWVuZCBpZg1wdXQgVGFiICYgIlBS T0NFRFVSRSBGYWlsRXJyKGVycjpPU0Vycik7IiAmIHJldHVybiBhZnRlciBwcm9jSGVh ZGVyDXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXIN cHV0IHR3b1RhYiAmICJJRiBlcnIgPD4gTk9FcnIgVEhFTiIgJiByZXR1cm4gYWZ0ZXIg cHJvY0hlYWRlcg1wdXQgdGhyZWVUYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHBy b2NIZWFkZXINcHV0IHRocmVlVGFiICYgIkhhbmRsZSIgJiBwcm9jTmFtZSAmICIgOj0g ZXJyOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1pZiBjbGVhblVwQ29kZSA8PiAi IiB0aGVuDXB1dCB0aHJlZVRhYiAmICJDbGVhblVwOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0hlYWRlcg1lbmQgaWYNcHV0IHRocmVlVGFiICYgIkV4aXQoSGFuZGxlIiAmIHByb2NO YW1lICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCB0aHJlZVRhYiAm ICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCB0d29UYWIgJiAiRU5E OyIgJiByZXR1cm4gJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1yZXR1cm4gcHJvY0hl YWRlcg1lbmQgRmFpbEVyclNvdXJjZQ0NZnVuY3Rpb24gUGFzY2FsVHlwZVRydWVDb2Rl IHgNcHV0IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlQdHIodGhlQXBwbGVFdmVudCwiICYg aXRlbSAyIG9mIHggJiAiLCAiIGludG8gcHJvY0JvZHkNaWYgaXRlbSAzIG9mIHggPSAi dHJ1ZSIgdGhlbg1wdXQgInR5cGVCb29sZWFuLCB0eXBlQ29kZSwgQCIgJiBpdGVtIDEg b2YgeCAmICIsU2l6ZU9mKEJvb2xlYW4pLCBhY3R1YWxTaXplKTsiICYgcmV0dXJuIGFm dGVyIHByb2NCb2R5DWVsc2UNcHV0ICJ0eXBlRW51bWVyYXRlZCwgdHlwZUNvZGUsIEAi ICYgaXRlbSAxIG9mIHggJiAiLFNpemVPZihSZXNUeXBlKSwgYWN0dWFsU2l6ZSk7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJJRiBlcnIgPSBl cnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg VGFiICYgVGFiICYgaXRlbSAxIG9mIHggJiAiIDo9ICIgYWZ0ZXIgcHJvY0JvZHkNaWYg aXRlbSAzIG9mIHggPSAidHJ1ZSIgdGhlbg1wdXQgIkZBTFNFIiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbHNlDXB1dCAiUmVzVHlwZSgwKSIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAiRUxTRSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IFRhYiAmIFRhYiAmICJGYWlsRXJyKGVycik7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1yZXR1cm4gcHJvY0JvZHkNZW5kIFBhc2NhbFR5cGVUcnVlQ29kZQ0NZnVu Y3Rpb24gUGFzY2FsT3B0aW9uSGFuZGxpbmcgdGhpc05hbWUsIHB0clRoaXNOYW1lDXB1 dCBUYWIgJiAiaWYgZXJyID0gZXJyQUVEZXNjTm90Rm91bmQgVEhFTiIgJiByZXR1cm4g aW50byBwcm9jQm9keQ1wdXQgVGFiICYgVGFiIGludG8gdHdvVGFiDXB1dCB0d29UYWIg JiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiBwdHJU aGlzTmFtZSAmICIgOj0gTklMOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3 b1RhYiAmICJ7IG9yIHlvdSBtYXkgcHV0IGluIHlvdXIgZGVmYXVsdCBoZXJlIH0iICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRU5EIiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgIkVMU0UiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCB0d29UYWIgJiAiRmFpbEVycihlcnIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IHR3b1RhYiAmIHB0clRoaXNOYW1lICYgIiA6PSBAIiAmIHRoaXNOYW1lICYgIjsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRU5EOyIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNcmV0dXJuIHByb2NCb2R5DWVuZCBQYXNjYWxPcHRpb25I YW5kbGluZw0NZnVuY3Rpb24gU2VydmVyQ29uc3QgY29uc3RJbmZvLGNvbW1lbnRPdXQN cHV0IGl0ZW0gMSBvZiBjb25zdEluZm8gJiAiID0gIiAmIGl0ZW0gMiBvZiBjb25zdElu Zm8gJiAiOyIgaW50byB4DWlmIGNvbW1lbnRPdXQgPSAidHJ1ZSIgdGhlbg1wdXQgInsg IiAmIHggJiAiIH0iIGludG8geA1lbmQgaWYNcmV0dXJuIFRhYiAmIHgNZW5kIFNlcnZl ckNvbnN0DQ1mdW5jdGlvbiBTZXJ2ZXJJbnN0YWxsIGluc3RhbGxDb2RlDXJldHVybiBy ZXR1cm4gJiAiUHJvY2VkdXJlIEluc3RhbGxIYW5kbGVyczsiICYgcmV0dXJuIMINJiBU YWIgJiAiQkVHSU4iICYgcmV0dXJuICYgaW5zdGFsbENvZGUgJiBUYWIgJiAiRU5EOyIg JiByZXR1cm4NZW5kIFNlcnZlckluc3RhbGwNDWZ1bmN0aW9uIFBhc2NhbENsaWVudFRl bXBsYXRlIG11bHRpTGluZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBvciB3 aGljaCBwYXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgR2x1ZUluZm8oZmllbGQg InBhcmFtSW5mbyIpIGludG8gcGFyYW1JbmZvDXB1dCAiRnVuY3Rpb24gQUUiICYgU3Ry aXBTUChmaWVsZCAiZXZlbnROYW1lIikgJiAiKCIgaW50byB0ZW1wbGF0ZQ1wdXQgbnVt YmVyIG9mIGxpbmVzIGluIHBhcmFtSW5mbyBpbnRvIG4NcHV0IDAgaW50byBwYXJhbUlu ZGV4DXJlcGVhdCB3aXRoIGluZGV4ID0gMSB0byBuDXNldCBjdXJzb3IgdG8gYnVzeQ1w dXQgbGluZSBpbmRleCBvZiBwYXJhbUluZm8gaW50byB5DXB1dCBpdGVtIDQgb2YgeSBp bnRvIHBhcmFtVHlwZQ1wdXQgKGl0ZW0gNSBvZiB5ID0gIm8iKSBpbnRvIGlzT3B0aW9u YWwNcHV0IChpdGVtIDMgb2YgeSA8PiAibnVsbCIpIGludG8gdXNlSXQNaWYgdXNlSXQg dGhlbg1hZGQgMSB0byBwYXJhbUluZGV4DWlmIHVzZUl0IHRoZW4NaWYgaW5kZXggPSAx IHRoZW4NcHV0ICJWQVIgIiBhZnRlciB0ZW1wbGF0ZQ1wdXQgZmFsc2UgaW50byBpc09w dGlvbmFsDWVsc2UNaWYgbXVsdGlMaW5lID0gIm11bHRpTGluZSIgdGhlbg1wdXQgcmV0 dXJuICYgc3BhY2UgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1wdXQgc3BhY2UgYWZ0ZXIgdGVt cGxhdGUNZW5kIGlmDWVuZCBpZg1wdXQgTmFtZU9mRGF0YVR5cGUoaXRlbSAzIG9mIHkp IGludG8gbmFtZUxpc3QNaWYgcGFyYW1UeXBlID0gMSB0aGVuIC0tIGhhbmRsZQ1wdXQg aXRlbSAxIG9mIHkgJiAiOiIgJiBpdGVtIDMgb2YgbmFtZUxpc3QgJiAiOyAiIGFmdGVy IHRlbXBsYXRlDWVsc2UgaWYgcGFyYW1UeXBlID0gNSB0aGVuIC0tIHB0ciArIHNpemUN cHV0IGl0ZW0gNiBvZiB5ICYgIjoiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsgIiDC DSYgaXRlbSA3IG9mIHkgJiAiOiBMT05HSU5UOyAiIGFmdGVyIHRlbXBsYXRlDWVsc2Ug aWYgcGFyYW1UeXBlID0gNyB0aGVuIC0tIGNTdHJpbmcNcHV0IGl0ZW0gNiBvZiB5ICYg IjoiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsgIiBhZnRlciB0ZW1wbGF0ZQ1lbHNl IGlmIGlzT3B0aW9uYWwgdGhlbiAtLSB1c2UgcG9pbnRlciB0byBkYXRhDWlmIHBhcmFt VHlwZSA9IDQgdGhlbiAtLSBmaXhlZCBsZW5ndGgNcHV0IGl0ZW0gMyBvZiB5IGludG8g ZGF0YVR5cGUNaWYgZGF0YVR5cGUgPSAiZW51bSIgdGhlbiAtLSBzcGVjaWFsIGZvciBl bnVtDXB1dCBpdGVtIDEgb2YgeSAmICI6UmVzVHlwZTsgIiBhZnRlciB0ZW1wbGF0ZQ1l bHNlIGlmIGRhdGFUeXBlID0gInRydWUiIHRoZW4gLS0gYWxzbyBzcGVjaWFsIGZvciB0 cnVlDXB1dCBpdGVtIDEgb2YgeSAmICI6Qm9vbGVhbjsgIiBhZnRlciB0ZW1wbGF0ZQ1l bHNlDXB1dCBpdGVtIDYgb2YgeSAmICI6IiAmIGl0ZW0gMiBvZiBuYW1lTGlzdCAmICI7 ICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVsc2UNcHV0IGl0ZW0gNiBvZiB5ICYgIjoi IGFmdGVyIHRlbXBsYXRlDWlmIChwYXJhbVR5cGUgPSAwKSB0aGVuDXB1dCAiQUVEZXNj UHRyOyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgLS0gNiwgUFN0cmluZw1wdXQgIlN0cmlu Z1B0cjsgIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlmDWVsc2UgLS0gcmVxdWly ZWQNcHV0IGl0ZW0gMSBvZiB5ICYgIjoiIGFmdGVyIHRlbXBsYXRlDWlmIChwYXJhbVR5 cGUgPSAwKSB0aGVuIC0tIEFFRGVzYw1wdXQgIkFFRGVzYzsgIiBhZnRlciB0ZW1wbGF0 ZQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDQgdGhlbiAtLSBmaXhlZCBsZW5ndGgNcHV0IGl0 ZW0gMSBvZiBuYW1lTGlzdCAmICI7ICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSAtLSBzdHIy NTUNcHV0ICJTdHIyNTU7ICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBpZg1lbmQg aWYgLS0gdXNlSXQNZW5kIGlmIC0tIHVzZUl0DWVuZCByZXBlYXQNRGVsZXRlIGxhc3Qg Y2hhciBvZiB0ZW1wbGF0ZSAtLSBzcGFjZSBvciAoDWlmIHBhcmFtSW5kZXggPiAwIHRo ZW4NcHV0ICIpIiBpbnRvIGxhc3QgY2hhciBvZiB0ZW1wbGF0ZSAtLSByZXBsYWNlIDsN ZW5kIGlmDXB1dCAiOk9TRXJyOyIgYWZ0ZXIgdGVtcGxhdGUNcmV0dXJuIHRlbXBsYXRl DWVuZCBQYXNjYWxDbGllbnRUZW1wbGF0ZQ0NAAApGgAeAQAApgAQALsAZ6AEAAAAAAAB AAAADAAAABBEZXJleiBhZXRlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xp Y2sgaGVyZSB0byBnZW5lcmF0ZSBhIGRlcmV6ZWQgYWV0ZSByZXNvdXJjZSBmb3IgdXNl IGluIE1QVy4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1pZiBvcHRpb25LZXkg aXMgZG93biB0aGVuDWFzayBmaWxlICJPdXRwdXQgZGVyZXplZCBhZXRlIHRvIg1pZiBp dCA8PiAiIiB0aGVuDXB1dCBpdCBpbnRvIHJlZg1vcGVuIGZpbGUgcmVmDXdyaXRlIGRl cmV6KCkgdG8gZmlsZSByZWYNY2xvc2UgZmlsZSByZWYNZW5kIGlmDWVsc2UNUHV0U2Ny YXRjaCBkZXJleigpDWVuZCBpZg1lbmQgbW91c2VVcA0NZnVuY3Rpb24gZGVyZXoNZ2xv YmFsIGluRWRpdA1zZXQgbG9ja1NjcmVlbiB0byB0cnVlDXNldCBsb2NrUmVjZW50IHRv IHRydWUNc2V0IGN1cnNvciB0byB3YXRjaA1wdXNoIGNhcmQNcHV0IGNhcmQgZmllbGQg InJlc291cmNlVHlwZSIgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byByZXNvdXJjZVR5 cGUNcHV0IGZhbHNlIGludG8gaW5FZGl0DWdvIHRvIGZpcnN0IGNhcmQgb2YgYmtnbmQg ZXZlbnRzDXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50 byBzdWl0ZUNvdW50DXB1dCB0YWIgJiB0YWIgaW50byB0YWIyDXB1dCB0YWIgJiB0YWIy IGludG8gdGFiMw1wdXQgdGFiICYgdGFiMyBpbnRvIHRhYjQNcHV0IHRhYiAmIHRhYjQg aW50byB0YWI1DXB1dCB0YWIzICYgcXVvdGUgaW50byB0YWIzcXVvdGUNcHV0IHRhYjMg JiAiJyIgaW50byB0YWIzc3ENcHV0IHRhYjQgJiBxdW90ZSBpbnRvIHRhYjRxdW90ZQ1w dXQgdGFiNCAmICInIiBpbnRvIHRhYjRzcQ1wdXQgcXVvdGUgJiAiLCIgJiByZXR1cm4g aW50byBxY3INcHV0ICInLCIgJiByZXR1cm4gaW50byBzcWNyDXB1dCBjYXJkIGZpZWxk ICJyZXNvdXJjZUlEIiBvZiBjYXJkICJwcmVmZXJlbmNlIiBpbnRvIHRlbXANcHV0ICJS ZXNvdXJjZSAnIiAmIHJlc291cmNlVHlwZSAmICInICgiICYgdGVtcCDCDSYgIiwgIiAm IHF1b3RlICYgKGNhcmQgZmllbGQgInJlc291cmNlTmFtZSIgb2YgY2FyZCAicHJlZmVy ZW5jZSIpICYgcXVvdGUgJiAiKSB7IiAmIHJldHVybiBpbnRvIGR6DXB1dCBjYXJkIGZp ZWxkICJtYWpvclZlcnNpb24iIG9mIGNhcmQgInByZWZlcmVuY2UiIGludG8gdGVtcA1w dXQgdGFiICYgKCh0ZW1wIGRpdiAxMCkgKiAxNiArICh0ZW1wIG1vZCAxMCkpICYgIiwi ICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBjYXJkIGZpZWxkICJtaW5vclZlcnNpb24iIG9m IGNhcmQgInByZWZlcmVuY2UiIGludG8gdGVtcA1pZiBsZW5ndGgodGVtcCkgPSAxIHRo ZW4gbXVsdGlwbHkgdGVtcCBieSAxMA1wdXQgdGFiICYgKCh0ZW1wIGRpdiAxMCkgKiAx NiArICh0ZW1wIG1vZCAxMCkpICYgIiwiICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBjYXJk IGZpZWxkICJsYW5ndWFnZUNvZGUiIG9mIGNhcmQgInByZWZlcmVuY2UiIGludG8geA1p ZiB4ID0gMCB0aGVuIHB1dCAiZW5nbGlzaCIgaW50byB4DXB1dCB0YWIgJiB4ICYgIiwi ICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBjYXJkIGZpZWxkICJzY3JpcHRDb2RlIiBvZiBj YXJkICJwcmVmZXJlbmNlIiBpbnRvIHgNaWYgeCA9IDAgdGhlbiBwdXQgInJvbWFuIiBp bnRvIHgNcHV0IHRhYiAmIHggJiAiLCIgJiByZXR1cm4gYWZ0ZXIgZHoNcHV0IHRhYiAm ICJ7IiAmIHJldHVybiBhZnRlciBkeg1yZXBlYXQgd2l0aCBzdWl0ZUluZGV4ID0gMiB0 byBzdWl0ZUNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1nbyBjYXJkIHN1aXRlSW5kZXgg b2YgYmtnbmQgInN1aXRlSW5mbyINcHV0IGZpZWxkICJzdWl0ZUNvZGUiIGludG8gbXlT dWl0ZUNvZGUNcHV0IHRhYjIgJiBxdW90ZSAmIGZpZWxkICJTdWl0ZU5hbWUiICYgcWNy IGFmdGVyIGR6DXB1dCB0YWIyICYgcXVvdGUgJiBSZW1vdmVDUihmaWVsZCAic3VpdGVD b21tZW50IikgJiBxY3IgYWZ0ZXIgZHoNcHV0IHRhYjIgJiAiJyIgJiBSZXNUeXBlKG15 U3VpdGVDb2RlKSAmIHNxY3IgYWZ0ZXIgZHoNcHV0IHRhYjIgJiAiMSwiICYgcmV0dXJu IGFmdGVyIGR6DXB1dCB0YWIyICYgIjEsIiAmIHJldHVybiBhZnRlciBkeg1wdXQgdGFi MiAmICJ7IiAmIHJldHVybiBhZnRlciBkeg1wdXQgZmllbGQgRXZlbnRMaXN0IGludG8g bXlFdmVudExpc3QNcHV0IGZpZWxkIENsYXNzTGlzdCBpbnRvIG15Q2xhc3NMaXN0DXB1 dCBmaWVsZCBDb21wYXJlTGlzdCBpbnRvIG15Q29tcGFyZUxpc3QNcHV0IGZpZWxkIEVu dW1MaXN0IGludG8gbXlFbnVtTGlzdA0tLSBub3cgZG8gaXQgZm9yIGVhY2ggZXZlbnQg aW4gdGhlIGxpc3QNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBteUV2ZW50TGlzdCBpbnRv IGV2ZW50Q291bnQNcmVwZWF0IHdpdGggZXZlbnRJbmRleCA9IDEgdG8gZXZlbnRjb3Vu dA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiZXZlbnQiICYmIGl0ZW0gMiBvZiBs aW5lIGV2ZW50SW5kZXggb2YgbXlFdmVudExpc3QpIHRoZW4NaWYgbm90IGhpbGl0ZSBv ZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgdGhlbg1wdXQgdGFiM3F1b3RlICYgZmll bGQgZXZlbnROYW1lICYgcWNyIGFmdGVyIGR6DXB1dCB0YWIzcXVvdGUgJiBSZW1vdmVD UihmaWVsZCBldmVudENvbW1lbnQpICYgcWNyIGFmdGVyIGR6DXB1dCB0YWIzc3EgJiBS ZXNUeXBlKGZpZWxkIGV2ZW50Q2xhc3MpICYgc3FjciBhZnRlciBkeg1wdXQgdGFiM3Nx ICYgUmVzVHlwZShmaWVsZCBldmVudElEKSAmIHNxY3IgYWZ0ZXIgZHoNcHV0IGxpbmUg MSBvZiBmaWVsZCBwYXJhbUluZm8gaW50byB4IC0tIHJlcGx5DXB1dCBSZXNUeXBlKGl0 ZW0gMyBvZiB4KSBpbnRvIHRlbXANaWYgdGVtcCA9ICJudWxsIiB0aGVuDXB1dCB0YWIz ICYgIm5vUmVwbHksIiAmIHJldHVybiBhZnRlciBkeg1lbHNlDXB1dCB0YWIzc3EgJiB0 ZW1wICYgc3FjciBhZnRlciBkeg1lbmQgaWYNcHV0IGl0ZW0gNCBvZiB4IGludG8gdGVt cA1kZWxldGUgaXRlbSAxIHRvIDQgb2YgeA1wdXQgdGFiM3F1b3RlICYgUmVtb3ZlQ1Io eCkgJiBxY3IgYWZ0ZXIgZHogLS0gcmVwbHkgY29tbWVudA1wdXQgQml0RmllbGQodGVt cCwgInJwbHkiKSBhZnRlciBkeiAtLSByZXBseSBhdHRyaWJ1dGUNcHV0IGxpbmUgMiBv ZiBmaWVsZCBwYXJhbUluZm8gaW50byB4IC0tIGRpcmVjdCBvYmplY3QNcHV0IFJlc1R5 cGUoaXRlbSAzIG9mIHgpIGludG8gdGVtcA1pZiB0ZW1wID0gIm51bGwiIHRoZW4NcHV0 IHRhYjMgJiAibm9QYXJhbXMsIiAmIHJldHVybiBhZnRlciBkeg1lbHNlDXB1dCB0YWIz c3EgJiB0ZW1wICYgc3FjciBhZnRlciBkeg1lbmQgaWYNcHV0IGl0ZW0gNCBvZiB4IGlu dG8gdGVtcA1kZWxldGUgaXRlbSAxIHRvIDQgb2YgeA1wdXQgdGFiM3F1b3RlICYgUmVt b3ZlQ1IoeCkgJiBxY3IgYWZ0ZXIgZHogLS0gZGlyZWN0IG9iamVjdCBjb21tZW50DXB1 dCBCaXRGaWVsZCh0ZW1wLCAiLS0tLSIpIGFmdGVyIGR6IC0tIGRpcmVjdCBhdHRyaWJ1 dGUNcHV0IHRhYjMgJiAieyIgJiByZXR1cm4gYWZ0ZXIgZHoNcmVwZWF0IHdpdGggaSA9 IDMgdG8gbnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkIHBhcmFtSW5mbw1zZXQgY3Vyc29y IHRvIGJ1c3kNcHV0IGxpbmUgaSBvZiBmaWVsZCBwYXJhbUluZm8gaW50byB4DXB1dCB0 YWI0cXVvdGUgJiBpdGVtIDEgb2YgeCAmIHFjciBhZnRlciBkeiAtLSBwYXJhbSBuYW1l DXB1dCB0YWI0c3EgJiBSZXNUeXBlKGl0ZW0gMiBvZiB4KSAmIHNxY3IgYWZ0ZXIgZHog LS0gcGFyYW0ga2V5DXB1dCB0YWI0c3EgJiBSZXNUeXBlKGl0ZW0gMyBvZiB4KSAmIHNx Y3IgYWZ0ZXIgZHogLS0gZGF0YSB0eXBlDXB1dCBpdGVtIDQgb2YgeCBpbnRvIHRlbXAN ZGVsZXRlIGl0ZW0gMSB0byA0IG9mIHgNcHV0IHRhYjRxdW90ZSAmIFJlbW92ZUNSKHgp ICYgcWNyIGFmdGVyIGR6IC0tIGNvbW1lbnQNcHV0IEJpdEZpZWxkKHRlbXAsICI/Pz8/ IikgaW50byB0ZW1wIC0tIGF0dHJpYnV0ZQ0tLSBsYXN0IG9uZSBkbyBub3QgaGF2ZSBh IGNvbW1hIGF0IHRoZSBlbmQNaWYgaSA9IG51bWJlciBvZiBsaW5lcyBpbiBmaWVsZCBw YXJhbUluZm8gdGhlbg1kZWxldGUgbGFzdCBjaGFyIG9mIHRlbXANcHV0IHJldHVybiBp bnRvIGxhc3QgY2hhciBvZiB0ZW1wDWVuZCBpZg1wdXQgdGVtcCBhZnRlciBkeg1lbmQg cmVwZWF0DWlmIGV2ZW50SW5kZXggPD4gZXZlbnRDb3VudCB0aGVuDXB1dCB0YWIzICYg In0sIiAmIHJldHVybiBhZnRlciBkeg1lbHNlIC0tIG5lZWQgY29tbWVudCBpZiBub3Qg dGhlIGxhc3Qgb25lIGluIHN1aXRlDXB1dCB0YWIzICYgIn0iICYgcmV0dXJuIGFmdGVy IGR6DWVuZCBpZg1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGV2 ZW50IGluIHN1aXRlDXB1dCB0YWIyICYgIn0sIiAmIHJldHVybiBhZnRlciBkeg0tLSBu b3cgZG8gaXQgZm9yIGVhY2hjbGFzcyBpbiB0aGUgbGlzdA1wdXQgdGFiMiAmICJ7IiAm IHJldHVybiBhZnRlciBkeg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIG15Q2xhc3NMaXN0 IGludG8gY2xhc3NDb3VudA1yZXBlYXQgd2l0aCBjbGFzc0luZGV4ID0gMSB0byBjbGFz c0NvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBqdW1wKCJjbGFzcyIgJiYgaXRlbSAy IG9mIGxpbmUgY2xhc3NJbmRleCBvZiBteUNsYXNzTGlzdCkgdGhlbg1pZiBub3QgaGls aXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0aGVuDXB1dCB0YWIzcXVvdGUg JiBmaWVsZCAiY2xhc3NOYW1lIiAmIHFjciBhZnRlciBkeg1wdXQgdGFiM3NxICYgUmVz VHlwZShmaWVsZCAiY2xhc3NJRCIpICYgc3FjciBhZnRlciBkeg1wdXQgdGFiM3F1b3Rl ICYgUmVtb3ZlQ1IoZmllbGQgImNsYXNzQ29tbWVudCIpICYgcWNyIGFmdGVyIGR6DXB1 dCB0YWIzICYgInsiICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBudW1iZXIgb2YgbGluZXMg aW4gZmllbGQgInByb3BJbmZvIiBpbnRvIHByb3BDb3VudA1yZXBlYXQgd2l0aCBwcm9w SW5kZXggPSAxIHRvIHByb3BDb3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kNcHV0IGxpbmUg cHJvcEluZGV4IG9mIGZpZWxkICJwcm9wSW5mbyIgaW50byB4DXB1dCB0YWI0cXVvdGUg JiBpdGVtIDEgb2YgeCAmIHFjciBhZnRlciBkeiAtLSBwcm9wIG5hbWUNcHV0IHRhYjRz cSAmIFJlc1R5cGUoaXRlbSAyIG9mIHgpICYgc3FjciBhZnRlciBkeiAtLSBwcm9wIElE DXB1dCB0YWI0c3EgJiBSZXNUeXBlKGl0ZW0gMyBvZiB4KSAmIHNxY3IgYWZ0ZXIgZHog LS0gcHJvcCBjbGFzcw1wdXQgaXRlbSA0IG9mIHggaW50byB0ZW1wDWRlbGV0ZSBpdGVt IDEgdG8gNCBvZiB4DXB1dCB0YWI0cXVvdGUgJiBSZW1vdmVDUih4KSAmIHFjciBhZnRl ciBkeiAtLSBjb21tZW50DXB1dCBCaXRGaWVsZCh0ZW1wLCAicHJvcCIpIGludG8gdGVt cCAtLSBhdHRyaWJ1dGUNLS0gbGFzdCBvbmUgZG8gbm90IGhhdmUgYSBjb21tYSBhdCB0 aGUgZW5kDWlmIHByb3BJbmRleCA9IHByb3BDb3VudCB0aGVuDWRlbGV0ZSBsYXN0IGNo YXIgb2YgdGVtcA1wdXQgcmV0dXJuIGludG8gbGFzdCBjaGFyIG9mIHRlbXANZW5kIGlm DXB1dCB0ZW1wIGFmdGVyIGR6DWVuZCByZXBlYXQNcHV0IHRhYjMgJiAifSwiICYgcmV0 dXJuIGFmdGVyIGR6DXB1dCB0YWIzICYgInsiICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBu dW1iZXIgb2YgbGluZXMgaW4gZmllbGQgImVsZW1lbnRzIiBpbnRvIGVsZW1Db3VudA1y ZXBlYXQgd2l0aCBlbGVtSW5kZXggPSAxIHRvIGVsZW1Db3VudA1zZXQgY3Vyc29yIHRv IGJ1c3kNcHV0IGxpbmUgZWxlbUluZGV4IG9mIGZpZWxkICJlbGVtZW50cyIgaW50byB4 DXB1dCB0YWI0c3EgJiBSZXNUeXBlKGl0ZW0gMSBvZiB4KSAmIHNxY3IgYWZ0ZXIgZHoN cHV0IHRhYjQgJiAieyIgJiByZXR1cm4gYWZ0ZXIgZHoNcHV0IG51bWJlciBvZiBpdGVt cyBvZiB4IGludG8ga2V5Rm9ybUNvdW50DXJlcGVhdCB3aXRoIGtleUZvcm1JbmRleCA9 IDIgdG8ga2V5Rm9ybUNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1wdXQgUmVzVHlwZShp dGVtIGtleUZvcm1JbmRleCBvZiB4KSBpbnRvIHRlbXANaWYgdGVtcCA9ICJpbmR4IiB0 aGVuDXB1dCAiZm9ybUFic29sdXRlUG9zaXRpb24iIGludG8gdGVtcA1lbHNlIGlmIHRl bXAgPSAibmFtZSIgdGhlbg1wdXQgImZvcm1OYW1lIiBpbnRvIHRlbXANZWxzZQ1wdXQg IiciICYgdGVtcCAmICInIiBpbnRvIHRlbXANZW5kIGlmDWlmIGtleUZvcm1JbmRleCA8 PiBrZXlGb3JtQ291bnQgdGhlbg1wdXQgIiwiIGFmdGVyIHRlbXANZW5kIGlmDXB1dCB0 YWI1ICYgdGVtcCAmIHJldHVybiBhZnRlciBkeg1lbmQgcmVwZWF0DS0tIGxhc3Qgb25l IGRvIG5vdCBoYXZlIGEgY29tbWEgYXQgdGhlIGVuZA1pZiBlbGVtSW5kZXggPD4gZWxl bUNvdW50IHRoZW4NcHV0IHRhYjQgJiAifSwiICYgcmV0dXJuIGFmdGVyIGR6DWVsc2UN cHV0IHRhYjQgJiAifSIgJiByZXR1cm4gYWZ0ZXIgZHoNZW5kIGlmDWVuZCByZXBlYXQN LS0gbGFzdCBvbmUgZG8gbm90IGhhdmUgYSBjb21tYSBhdCB0aGUgZW5kDWlmIGNsYXNz SW5kZXggPD4gY2xhc3NDb3VudCB0aGVuDXB1dCB0YWIzICYgIn0sIiAmIHJldHVybiBh ZnRlciBkeg1lbHNlDXB1dCB0YWIzICYgIn0iICYgcmV0dXJuIGFmdGVyIGR6DWVuZCBp Zg1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQNcHV0IHRhYjIgJiAifSwiICYgcmV0dXJu IGFmdGVyIGR6DS0tIG5vdyBkbyBjb21wYXJpc29uDXB1dCB0YWIyICYgInsiICYgcmV0 dXJuIGFmdGVyIGR6DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gbXlDb21wYXJlTGlzdCBp bnRvIGNvbXBhcmVDb3VudA1yZXBlYXQgd2l0aCBjb21wYXJlSW5kZXggPSAxIHRvIGNv bXBhcmVDb3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiY29tcGFyaXNvbiIg JiYgaXRlbSAyIG9mIGxpbmUgY29tcGFyZUluZGV4IG9mIG15Q29tcGFyZUxpc3QpIHRo ZW4NaWYgbm90IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgdGhlbg1w dXQgdGFiM3F1b3RlICYgZmllbGQgImNvbXBhcmVOYW1lIiAmIHFjciBhZnRlciBkeg1w dXQgdGFiM3NxICYgUmVzVHlwZShmaWVsZCAiY29tcGFyZUlEIikgJiBzcWNyIGFmdGVy IGR6DWlmIGNvbXBhcmVJbmRleCA8PiBjb21wYXJlQ291bnQgdGhlbg1wdXQgdGFiM3F1 b3RlICYgUmVtb3ZlQ1IoZmllbGQgImNvbXBhcmVDb21tZW50IikgJiBxY3IgYWZ0ZXIg ZHoNZWxzZQ1wdXQgdGFiM3F1b3RlICYgUmVtb3ZlQ1IoZmllbGQgImNvbXBhcmVDb21t ZW50IikgJiBxdW90ZSAmIHJldHVybiBhZnRlciBkeg1lbmQgaWYNZW5kIGlmDWVuZCBp Zg1lbmQgcmVwZWF0DXB1dCB0YWIyICYgIn0sIiAmIHJldHVybiBhZnRlciBkeg0tLSBk byBlbnVtZXJhdGlvbnMNcHV0IHRhYjIgJiAieyIgJiByZXR1cm4gYWZ0ZXIgZHoNcHV0 IG51bWJlciBvZiBsaW5lcyBpbiBteUVudW1MaXN0IGludG8gZW51bUNvdW50DXJlcGVh dCB3aXRoIGVudW1JbmRleCA9IDEgdG8gZW51bUNvdW50DXNldCBjdXJzb3IgdG8gYnVz eQ1pZiBqdW1wKCJlbnVtZXJhdGlvbiIgJiYgbGluZSBlbnVtSW5kZXggb2YgbXlFbnVt TGlzdCkgdGhlbg1pZiBub3QgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVU IiB0aGVuDXB1dCB0YWIzc3EgJiBmaWVsZCAiZW51bWVyYXRpb24iICYgc3FjciBhZnRl ciBkeg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkICJlbnVtSW5mbyIgaW50byBl bnVtZXJhdG9yQ291bnQNcHV0IHRhYjMgJiAieyIgJiByZXR1cm4gYWZ0ZXIgZHoNcmVw ZWF0IHdpdGggZW51bWVyYXRvckluZGV4ID0gMSB0byBlbnVtZXJhdG9yQ291bnQNc2V0 IGN1cnNvciB0byBidXN5DXB1dCBsaW5lIGVudW1lcmF0b3JJbmRleCBvZiBmaWVsZCAi ZW51bUluZm8iIGludG8geA1wdXQgdGFiNHF1b3RlICYgaXRlbSAxIG9mIHggJiBxY3Ig YWZ0ZXIgZHoNcHV0IHRhYjRzcSAmIFJlc1R5cGUoaXRlbSAyIG9mIHgpICYgc3FjciBh ZnRlciBkeg1kZWxldGUgaXRlbSAxIHRvIDIgb2YgeA1pZiBlbnVtZXJhdG9ySW5kZXgg PD5lbnVtZXJhdG9yQ291bnQgdGhlbg1wdXQgdGFiNHF1b3RlICYgeCAmIHFjciBhZnRl ciBkeg1lbHNlDXB1dCB0YWI0cXVvdGUgJiB4ICYgcXVvdGUgJiByZXR1cm4gYWZ0ZXIg ZHoNZW5kIGlmDWVuZCByZXBlYXQNaWYgZW51bUluZGV4IDw+IGVudW1Db3VudCB0aGVu DXB1dCB0YWIzICYgIn0sIiAmIHJldHVybiBhZnRlciBkeg1lbHNlDXB1dCB0YWIzICYg In0iICYgcmV0dXJuIGFmdGVyIGR6DWVuZCBpZg1lbmQgaWYNZW5kIGlmDWVuZCByZXBl YXQNaWYgc3VpdGVJbmRleCA8PiBzdWl0ZUNvdW50IHRoZW4NcHV0IHRhYjIgJiAifSwi ICYgcmV0dXJuIGFmdGVyIGR6DWVsc2UNcHV0IHRhYjIgJiAifSIgJiByZXR1cm4gYWZ0 ZXIgZHoNZW5kIGlmDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IHN1aXRlDXB1dCB0YWIg JiAifSIgJiByZXR1cm4gYWZ0ZXIgZHoNcHV0ICJ9OyIgJiByZXR1cm4gYWZ0ZXIgZHoN cG9wIGNhcmQNcHV0IHRydWUgaW50byBpbkVkaXQNcmV0dXJuIGR6DWVuZCBkZXJleg0N ZnVuY3Rpb24gQml0RmllbGQgeCwgdHlwZQ1wdXQgIiIgaW50byByDXB1dCB0YWIgJiB0 YWIgJiB0YWIgaW50byB0YWJzDXB1dCAiLS0tLSIgaW50byBkYXNoDWlmICh0eXBlIDw+ IGRhc2gpIGFuZCAodHlwZSA8PiAicnBseSIpIHRoZW4NcHV0IHRhYiBiZWZvcmUgdGFi cw1lbmQgaWYNcmVwZWF0IHdpdGggaSA9IDEgdG8gMTYNc2V0IGN1cnNvciB0byBidXN5 DWlmIHggbW9kIDIgPSAxIHRoZW4NcHV0ICJ0cnVlIiBpbnRvIGZsYWcNZWxzZQ1wdXQg InJlc2VydmVkIiBpbnRvIGZsYWcNZW5kIGlmDWlmIChpID0gMTYpIGFuZCAodHlwZSA8 PiAicHJvcCIpIHRoZW4NaWYgZmxhZyA9IHRydWUgdGhlbg1wdXQgIm9wdGlvbmFsIiBp bnRvIGZsYWcNZWxzZQ1wdXQgInJlcXVpcmVkIiBpbnRvIGZsYWcNZW5kIGlmDWlmIHR5 cGUgPSBkYXNoIHRoZW4NcHV0ICJkaXJlY3RQYXJhbSIgYmVmb3JlIGZsYWcNZWxzZSBp ZiB0eXBlID0gInJwbHkiIHRoZW4NcHV0IHJlcGx5IGJlZm9yZSBmbGFnDWVuZCBpZg1l bHNlIGlmIGkgPSAxNSB0aGVuDWlmIGZsYWcgPSB0cnVlIHRoZW4NcHV0ICJsaXN0T2ZJ dGVtcyIgaW50byBmbGFnDWVsc2UNcHV0ICJzaW5nbGVJdGVtIiBpbnRvIGZsYWcNZW5k IGlmDWVsc2UgaWYgaSA9IDE0IHRoZW4NaWYgZmxhZyA9IHRydWUgdGhlbg1wdXQgImVu dW1lcmF0ZWQiIGludG8gZmxhZw1lbHNlDXB1dCAibm90RW51bWVyYXRlZCIgaW50byBm bGFnDWVuZCBpZg1lbHNlIGlmIChpID0gMTMpIHRoZW4NaWYgdHlwZSA9IGRhc2ggdGhl bg1pZiBmbGFnID0gdHJ1ZSB0aGVuDXB1dCAiY2hhbmdlc1N0YXRlIiBpbnRvIGZsYWcN ZWxzZQ1wdXQgImRvZXNudENoYW5nZVN0YXRlIiBpbnRvIGZsYWcNZW5kIGlmDWVsc2Ug aWYgdHlwZSA9ICJwcm9wIiB0aGVuDWlmIGZsYWcgPSB0cnVlIHRoZW4NcHV0ICJyZWFk V3JpdGUiIGludG8gZmxhZw1lbHNlDXB1dCAicmVhZE9ubHkiIGludG8gZmxhZw1lbmQg aWYNZW5kIGlmDWVuZCBpZg1wdXQgdGFicyAmIGZsYWcgJiAiLCIgJiByZXR1cm4gYmVm b3JlIHINcHV0IHggZGl2IDIgaW50byB4DWVuZCByZXBlYXQNcmV0dXJuIHINZW5kIEJp dEZpZWxkDQ1mdW5jdGlvbiBSZW1vdmVDciB4DWlmICJcIiBpcyBpbiB4IHRoZW4NcHV0 ICIiIGludG8geQ1yZXBlYXQgdW50aWwgeCA9ICIiDXB1dCBPZmZzZXQoIlwiLCB4KSBp bnRvIG4NaWYgbiA+IDAgdGhlbg1wdXQgY2hhciAxIHRvIG4tMSBvZiB4ICYgIlxcIiBh ZnRlciB5DWRlbGV0ZSBjaGFyIDEgdG8gbiBvZiB4DWVsc2UNcHV0IHggYWZ0ZXIgeQ1w dXQgIiIgaW50byB4DWVuZCBpZg1lbmQgcmVwZWF0DXB1dCB5IGludG8geA1lbmQgaWYN cHV0IDEgaW50byBuDXJlcGVhdCB1bnRpbCBuID0gMA1wdXQgT2Zmc2V0KHJldHVybiwg eCkgaW50byBuDWlmIG4gPiAwIHRoZW4gcHV0ICJcciIgaW50byBjaGFyIG4gb2YgeA1l bmQgcmVwZWF0DXB1dCAxIGludG8gbg1yZXBlYXQgdW50aWwgbiA9IDANcHV0IE9mZnNl dChUYWIsIHgpIGludG8gbg1pZiBuID4gMCB0aGVuIHB1dCAiXHQiIGludG8gY2hhciBu IG9mIHgNZW5kIHJlcGVhdA1pZiBxdW90ZSBpcyBpbiB4IHRoZW4NcHV0ICIiIGludG8g eQ1yZXBlYXQgdW50aWwgeCA9ICIiDXB1dCBPZmZzZXQocXVvdGUsIHgpIGludG8gbg1p ZiBuID4gMCB0aGVuDXB1dCBjaGFyIDEgdG8gbi0xIG9mIHggJiAiXCIgJiBxdW90ZSBh ZnRlciB5DWRlbGV0ZSBjaGFyIDEgdG8gbiBvZiB4DWVsc2UNcHV0IHggYWZ0ZXIgeQ1w dXQgIiIgaW50byB4DWVuZCBpZg1lbmQgcmVwZWF0DXB1dCB5IGludG8geA1lbmQgaWYN aWYgIiciIGlzIGluIHggdGhlbg1wdXQgIiIgaW50byB5DXJlcGVhdCB1bnRpbCB4ID0g IiINcHV0IE9mZnNldCgiJyIsIHgpIGludG8gbg1pZiBuID4gMCB0aGVuDXB1dCBjaGFy IDEgdG8gbi0xIG9mIHggJiAiXCciIGFmdGVyIHkNZGVsZXRlIGNoYXIgMSB0byBuIG9m IHgNZWxzZQ1wdXQgeCBhZnRlciB5DXB1dCAiIiBpbnRvIHgNZW5kIGlmDWVuZCByZXBl YXQNcHV0IHkgaW50byB4DWVuZCBpZg1yZXR1cm4geA1lbmQgUmVtb3ZlQ3IAHNIAIAEA AIYAEACcAGegBAAAAAAAAQAAAAwAAAAQSW1wb3J0IGFldGUAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIHJlYWQgYW4gYWV0ZSByZXNvdXJjZSBm cm9tIGFuIGZpbGUuIiDCDSYmICJIb2xkIGRvd24gb3B0aW9uIGtleSB0byBtZXJnZSB3 aXRoIHRoZSBidWlsdC1pbiBhZXV0IHJlc291cmNlLiIgwg0mJiAiSWYgc3RhY2sgaXMg bm90IGVtcHR5LCB0aGUgZGF0YSB3aWxsIGJlIG1lcmdlZC4iDWVuZCBNb3VzZVdpdGhp bg0Nb24gbW91c2VVcA1nbG9iYWwgaW5FZGl0DWlmIHRoZSBvcHRpb25LZXkgaXMgZG93 biB0aGVuDXB1dCBNZXJnZUFldGUoKSBpbnRvIGFldGUNZWxzZQ1wdXQgTWVyZ2VBZXRl KGZhbHNlKSBpbnRvIGFldGUNZW5kIGlmDWlmIGFldGUgPSAiIiB0aGVuDWFuc3dlciAi VW5hYmxlIHRvIHJlYWQgdGhlIGFldGUiIHdpdGggIkNhbmNlbCINZXhpdCBtb3VzZVVw DWVuZCBpZg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGFldGUgaW50byBuDXB1dCBsaW5l IDUgb2YgYWV0ZSBpbnRvIHZlcnNpb24NaWYgKHZlcnNpb24gPCAxNDQpIG9yICh2ZXJz aW9uID49IDUxMikgdGhlbg1leGl0IG1vdXNlVXANZW5kIGlmDXB1c2ggY2FyZA1wdXQg bGluZSAxIG9mIGFldGUgaW50byBjYXJkIGZpZWxkICJzZW5kVGFyZ2V0IiBvZiBjYXJk ICJwcmVmZXJlbmNlIg1wdXQgbGluZSAyIG9mIGFldGUgaW50byBjYXJkIGZpZWxkICJy ZXNvdXJjZVR5cGUiIG9mIGNhcmQgInByZWZlcmVuY2UiDXB1dCBsaW5lIDMgb2YgYWV0 ZSBpbnRvIGNhcmQgZmllbGQgInJlc291cmNlSUQiIG9mIGNhcmQgInByZWZlcmVuY2Ui DXB1dCBsaW5lIDQgb2YgYWV0ZSBpbnRvIGNhcmQgZmllbGQgInJlc291cmNlTmFtZSIg b2YgY2FyZCAicHJlZmVyZW5jZSINcHV0IHZlcnNpb24gZGl2IDI1NiBpbnRvIHgNcHV0 ICh4IGRpdiAxNikgKiAxMCArICh4IG1vZCAxNikgaW50byBjYXJkIGZpZWxkICJtYWpv clZlcnNpb24iIG9mIGNhcmQgInByZWZlcmVuY2UiDXB1dCB2ZXJzaW9uIG1vZCAyNTYg aW50byB4DXB1dCAoeCBkaXYgMTYpICogMTAgKyAoeCBtb2QgMTYpIGludG8gY2FyZCBm aWVsZCAibWlub3JWZXJzaW9uIiBvZiBjYXJkICJwcmVmZXJlbmNlIg1wdXQgbGluZSA2 IG9mIGFldGUgaW50byBjYXJkIGZpZWxkICJsYW5ndWFnZUNvZGUiIG9mIGNhcmQgInBy ZWZlcmVuY2UiDXB1dCBsaW5lIDcgb2YgYWV0ZSBpbnRvIGNhcmQgZmllbGQgInNjcmlw dENvZGUiIG9mIGNhcmQgInByZWZlcmVuY2UiDXB1dCBmYWxzZSBpbnRvIGluRWRpdA1w dXQgbGluZSA4IG9mIGFldGUgaW50byBzdWl0ZUNvdW50DWRlbGV0ZSBsaW5lIDEgdG8g OCBvZiBhZXRlDXJlcGVhdCBzdWl0ZUNvdW50IHRpbWVzDWdvIHRvIHRoaXMgY2QNc2V0 IGxvY2tTY3JlZW4gdG8gdHJ1ZQ1zZXQgbG9ja1JlY2VudCB0byB0cnVlDXNldCBjdXJz b3IgdG8gYnVzeQ1wdXQgbGluZSAzIG9mIGFldGUgaW50byBzdWl0ZUNvZGUNaWYgbm90 IGp1bXAoInN1aXRlIiAmJiBzdWl0ZUNvZGUpIHRoZW4NZ28gbGFzdCBjYXJkIGluIEJr Z25kICJzdWl0ZUluZm8iDWRvTWVudSAiTmV3IENhcmQiDXNldCBuYW1lIG9mIHRoaXMg Y2FyZCB0byAic3VpdGUiICYmIHN1aXRlQ29kZQ1lbmQgaWYNcHV0IGxpbmUgMSBvZiBh ZXRlIGludG8gZmllbGQgInN1aXRlTmFtZSINcHV0IGxpbmUgMiBvZiBhZXRlIGludG8g ZmllbGQgInN1aXRlQ29tbWVudCINcHV0IHN1aXRlQ29kZSBpbnRvIGZpZWxkICJzdWl0 ZUNvZGUiDXB1dCBsaW5lIDYgb2YgYWV0ZSBpbnRvIGV2ZW50Q291bnQNZGVsZXRlIGxp bmUgMSB0byA2IG9mIGFldGUNcHVzaCBjYXJkDXJlcGVhdCBldmVudENvdW50IHRpbWVz DXNldCBjdXJzb3IgdG8gYnVzeQ1wdXQgbGluZSAxIG9mIGFldGUgaW50byBldmVudE5h bWUNaWYgY2hhciAxIHRvIDIgb2YgZXZlbnROYW1lID0gIiMqIiB0aGVuIC0tIGZyb20g QUVVVA1kZWxldGUgY2hhciAxIHRvIDIgb2YgZXZlbnROYW1lDXB1dCB0cnVlIGludG8g ZnJvbUFldXQNZWxzZQ1pZiBjaGFyIDEgdG8gMiBvZiBldmVudE5hbWUgPSAiIyYiIHRo ZW4gLS0gZnJvbSBib3RoLCB0cmVhdCBhcyBuZXcNZGVsZXRlIGNoYXIgMSB0byAyIG9m IGV2ZW50TmFtZQ1lbmQgaWYNcHV0IGZhbHNlIGludG8gZnJvbUFldXQNZW5kIGlmDXB1 dCBsaW5lIDIgb2YgYWV0ZSBpbnRvIGV2ZW50Q29tbWVudA1wdXQgbGluZSAzIG9mIGFl dGUgaW50byBldmVudENsYXNzDXB1dCBsaW5lIDQgb2YgYWV0ZSBpbnRvIGV2ZW50SUQN aWYgbm90IGp1bXAoImV2ZW50IiAmJiBSZXNUeXBlKGV2ZW50Q2xhc3MpICYgUmVzVHlw ZShldmVudElEKSkgdGhlbg1nbyBsYXN0IGNhcmQgaW4gQmtnbmQgImV2ZW50cyINZG9N ZW51ICJOZXcgQ2FyZCINcHV0IHN1aXRlQ29kZSBpbnRvIGZpZWxkICJzdWl0ZUNvZGUi DU5hbWVJdCBzdWl0ZUNvZGUgJiYgImV2ZW50IiAmJiBSZXNUeXBlKGV2ZW50Q2xhc3Mp ICYgUmVzVHlwZShldmVudElEKQ1lbmQgaWYNc2V0IGhpbGl0ZSBvZiBia2duZCBidXR0 b24gImZyb20gQUVVVCIgdG8gZnJvbUFldXQNcHV0IGV2ZW50TmFtZSBpbnRvIGZpZWxk ICJldmVudE5hbWUiDXB1dCBldmVudENvbW1lbnQgaW50byBmaWVsZCAiZXZlbnRDb21t ZW50Ig1wdXQgZXZlbnRDbGFzcyBpbnRvIGZpZWxkICJldmVudENsYXNzIg1wdXQgZXZl bnRJRCBpbnRvIGZpZWxkICJldmVudElEIg1wdXQgIiwsIiBpbnRvIHggLS0gcHV0IGlu IHRoZSByZXBseQ1wdXQgbGluZSA1IG9mIGFldGUgaW50byBpdGVtIDMgb2YgeA1wdXQg bGluZSA3IG9mIGFldGUgaW50byBpdGVtIDQgb2YgeA1wdXQgbGluZSA2IG9mIGFldGUg aW50byBpdGVtIDUgb2YgeA1wdXQgeCBpbnRvIGxpbmUgMSBvZiBmaWVsZCBpZCAxMA1w dXQgIiwsIiBpbnRvIHggLS0gcHV0IGluIHRoZSBkaXJlY3QgcGFyYW1ldGVycw1wdXQg bGluZSA4IG9mIGFldGUgaW50byBpdGVtIDMgb2YgeA1wdXQgbGluZSAxMCBvZiBhZXRl IGludG8gaXRlbSA0IG9mIHgNcHV0IGxpbmUgOSBvZiBhZXRlIGludG8gaXRlbSA1IG9m IHgNcHV0IHggaW50byBsaW5lIDIgb2YgZmllbGQgaWQgMTANcHV0IGxpbmUgMTEgb2Yg YWV0ZSBpbnRvIHBhcmFtQ291bnQNcHV0IDExIGludG8gbGFzdFByb2MNcmVwZWF0IHdp dGggcGFyYW1JbmRleCA9IDEgdG8gcGFyYW1Db3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kN cHV0ICIiIGludG8geA1wdXQgbGluZSAobGFzdFByb2MrMSkgb2YgYWV0ZSBpbnRvIGl0 ZW0gMSBvZiB4DXB1dCBsaW5lIChsYXN0UHJvYysyKSBvZiBhZXRlIGludG8gaXRlbSAy IG9mIHgNcHV0IGxpbmUgKGxhc3RQcm9jKzMpIG9mIGFldGUgaW50byBpdGVtIDMgb2Yg eA1wdXQgbGluZSAobGFzdFByb2MrNSkgb2YgYWV0ZSBpbnRvIGl0ZW0gNCBvZiB4DXB1 dCBsaW5lIChsYXN0UHJvYys0KSBvZiBhZXRlIGludG8gaXRlbSA1IG9mIHgNYWRkIDUg dG8gbGFzdFByb2MNcHV0IHggaW50byBsaW5lIChwYXJhbUluZGV4KzIpIG9mIGZpZWxk IGlkIDEwDWVuZCByZXBlYXQNZGVsZXRlIGxpbmUgMSB0byBsYXN0UHJvYyBvZiBhZXRl DWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGV2ZW50DXB1dCBsaW5lIDEgb2YgYWV0ZSBp bnRvIGNsYXNzQ291bnQNZGVsZXRlIGxpbmUgMSBvZiBhZXRlDXJlcGVhdCB3aXRoIGNs YXNzSW5kZXggPSAxIHRvIGNsYXNzQ291bnQNc2V0IGN1cnNvciB0byBidXN5DXB1dCBs aW5lIDEgb2YgYWV0ZSBpbnRvIGNsYXNzTmFtZQ1pZiBjaGFyIDEgdG8gMiBvZiBjbGFz c05hbWUgPSAiIyoiIHRoZW4gLS0gZnJvbSBBRVVUDWRlbGV0ZSBjaGFyIDEgdG8gMiBv ZiBjbGFzc05hbWUNcHV0IHRydWUgaW50byBmcm9tQWV1dA1lbHNlDWlmIGNoYXIgMSB0 byAyIG9mIGNsYXNzTmFtZSA9ICIjJiIgdGhlbiAtLSBmcm9tIGJvdGgsIHRyZWF0IGFz IG5ldw1kZWxldGUgY2hhciAxIHRvIDIgb2YgY2xhc3NOYW1lDWVuZCBpZg1wdXQgZmFs c2UgaW50byBmcm9tQWV1dA1lbmQgaWYNcHV0IGxpbmUgMiBvZiBhZXRlIGludG8gY2xh c3NJRA1pZiBub3QganVtcCgiY2xhc3MiICYmIGNsYXNzSUQpIHRoZW4NZ28gbGFzdCBj YXJkIGluIEJrZ25kICJjbGFzcyINZG9NZW51ICJOZXcgQ2FyZCINcHV0IHN1aXRlQ29k ZSBpbnRvIGZpZWxkICJzdWl0ZUNvZGUiDU5hbWVJdCBzdWl0ZUNvZGUgJiYgImNsYXNz IiAmJiBSZXNUeXBlKGNsYXNzSUQpDWVuZCBpZg1wdXQgY2xhc3NOYW1lIGludG8gZmll bGQgImNsYXNzTmFtZSINc2V0IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVV VCIgdG8gZnJvbUFldXQNcHV0IGNsYXNzSUQgaW50byBmaWVsZCAiY2xhc3NJRCINcHV0 IGxpbmUgMyBvZiBhZXRlIGludG8gZmllbGQgY2xhc3NDb21tZW50DXB1dCBsaW5lIDQg b2YgYWV0ZSBpbnRvIHByb3BDb3VudA1wdXQgNCBpbnRvIGxhc3RQcm9jDXJlcGVhdCB3 aXRoIHByb3BJbmRleCA9IDEgdG8gcHJvcENvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1w dXQgIiIgaW50byB4DXB1dCBsaW5lIChsYXN0UHJvYysxKSBvZiBhZXRlIGludG8gaXRl bSAxIG9mIHgNcHV0IGxpbmUgKGxhc3RQcm9jKzIpIG9mIGFldGUgaW50byBpdGVtIDIg b2YgeA1wdXQgbGluZSAobGFzdFByb2MrMykgb2YgYWV0ZSBpbnRvIGl0ZW0gMyBvZiB4 DXB1dCBsaW5lIChsYXN0UHJvYys1KSBvZiBhZXRlIGludG8gaXRlbSA0IG9mIHgNcHV0 IGxpbmUgKGxhc3RQcm9jKzQpIG9mIGFldGUgaW50byBpdGVtIDUgb2YgeA1hZGQgNSB0 byBsYXN0UHJvYw1wdXQgeCBpbnRvIGxpbmUgcHJvcEluZGV4IG9mIGZpZWxkIGlkIDEw DWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IHByb3Blcml0eQ1hZGQgMSB0byBsYXN0UHJv Yw1wdXQgbGluZSBsYXN0UHJvYyBvZiBhZXRlIGludG8gZWxlbUNvdW50DXJlcGVhdCB3 aXRoIGVsZW1JbmRleCA9IDEgdG8gZWxlbUNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1w dXQgbGluZSAobGFzdFByb2MrMSkgb2YgYWV0ZSBpbnRvIHgNcHV0IGxpbmUgKGxhc3RQ cm9jKzIpIG9mIGFldGUgaW50byBrZXlGb3JtQ291bnQNYWRkIDIgdG8gbGFzdFByb2MN cmVwZWF0IGtleUZvcm1Db3VudCB0aW1lcw1zZXQgY3Vyc29yIHRvIGJ1c3kNYWRkIDEg dG8gbGFzdFByb2MNcHV0ICIsIiAmIGxpbmUgbGFzdFByb2Mgb2YgYWV0ZSBhZnRlciB4 DWVuZCByZXBlYXQNcHV0IHggaW50byBsaW5lIGVsZW1JbmRleCBvZiBmaWVsZCAiZWxl bWVudHMiDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGVsZW1lbnQNZGVsZXRlIGxpbmUg MSB0byBsYXN0UHJvYyBvZiBhZXRlDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGNsYXNz DXB1dCBsaW5lIDEgb2YgYWV0ZSBpbnRvIGNvbXBhcmVDb3VudA1kZWxldGUgbGluZSAx IG9mIGFldGUNcmVwZWF0IGNvbXBhcmVDb3VudCB0aW1lcw1zZXQgY3Vyc29yIHRvIGJ1 c3kNcHV0IGxpbmUgMSBvZiBhZXRlIGludG8gY29tcGFyZU5hbWUNaWYgY2hhciAxIHRv IDIgb2YgY29tcGFyZU5hbWUgPSAiIyoiIHRoZW4gLS0gZnJvbSBBRVVUDWRlbGV0ZSBj aGFyIDEgdG8gMiBvZiBjb21wYXJlTmFtZQ1wdXQgdHJ1ZSBpbnRvIGZyb21BZXV0DWVs c2UNaWYgY2hhciAxIHRvIDIgb2YgY29tcGFyZU5hbWUgPSAiIyYiIHRoZW4gLS0gZnJv bSBib3RoLCB0cmVhdCBhcyBuZXcNZGVsZXRlIGNoYXIgMSB0byAyIG9mIGNvbXBhcmVO YW1lDWVuZCBpZg1wdXQgZmFsc2UgaW50byBmcm9tQWV1dA1lbmQgaWYNcHV0IGxpbmUg MiBvZiBhZXRlIGludG8gY29tcGFyZUlEDWlmIG5vdCBqdW1wKCJjb21wYXJpc29uIiAm JiBjb21wYXJlSUQpIHRoZW4NZ28gbGFzdCBjYXJkIGluIEJrZ25kICJjb21wYXJpc29u Ig1kb01lbnUgIk5ldyBDYXJkIg1wdXQgc3VpdGVDb2RlIGludG8gZmllbGQgInN1aXRl Q29kZSINTmFtZUl0IHN1aXRlQ29kZSAmJiAiY29tcGFyaXNvbiIgJiYgUmVzVHlwZShj b21wYXJlSUQpDWVuZCBpZg1wdXQgY29tcGFyZU5hbWUgaW50byBmaWVsZCAiY29tcGFy ZU5hbWUiDXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJmcm9tIEFFVVQiIHRvIGZy b21BZXV0DXB1dCBjb21wYXJlSUQgaW50byBmaWVsZCAiY29tcGFyZUlEIg1wdXQgbGlu ZSAzIG9mIGFldGUgaW50byBmaWVsZCAiY29tcGFyZUNvbW1lbnQiDWRlbGV0ZSBsaW5l IDEgdG8gMyBvZiBhZXRlDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGNvbXBhcmlzb24N cHV0IGxpbmUgMSBvZiBhZXRlIGludG8gZW51bWVyYXRpb25Db3VudA1kZWxldGUgbGlu ZSAxIG9mIGFldGUNcmVwZWF0IGVudW1lcmF0aW9uQ291bnQgdGltZXMNc2V0IGN1cnNv ciB0byBidXN5DXB1dCBsaW5lIDEgb2YgYWV0ZSBpbnRvIGVudW1lcmF0aW9uDWlmIGNo YXIgMSB0byAyIG9mIGVudW1lcmF0aW9uID0gIiMqIiB0aGVuIC0tIGZyb20gQUVVVA1k ZWxldGUgY2hhciAxIHRvIDIgb2YgZW51bWVyYXRpb24NcHV0IHRydWUgaW50byBmcm9t QWV1dA1lbHNlDWlmIGNoYXIgMSB0byAyIG9mIGVudW1lcmF0aW9uID0gIiMmIiB0aGVu IC0tIGZyb20gYm90aCwgdHJlYXQgYXMgbmV3DWRlbGV0ZSBjaGFyIDEgdG8gMiBvZiBl bnVtZXJhdGlvbg1lbmQgaWYNcHV0IGZhbHNlIGludG8gZnJvbUFldXQNZW5kIGlmDWlm IG5vdCBqdW1wKCJlbnVtZXJhdGlvbiIgJiYgZW51bWVyYXRpb24pIHRoZW4NZ28gbGFz dCBjYXJkIGluIEJrZ25kICJlbnVtZXJhdGlvbiINZG9NZW51ICJOZXcgQ2FyZCINcHV0 IHN1aXRlQ29kZSBpbnRvIGZpZWxkICJzdWl0ZUNvZGUiDU5hbWVJdCBzdWl0ZUNvZGUg JiYgImVudW1lcmF0aW9uIiAmJiBSZXNUeXBlKGVudW1lcmF0aW9uKQ1lbmQgaWYNc2V0 IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgdG8gZnJvbUFldXQNcHV0 IGVudW1lcmF0aW9uIGludG8gZmllbGQgImVudW1lcmF0aW9uIg1wdXQgbGluZSAyIG9m IGFldGUgaW50byBlbnVtZXJhdG9yQ291bnQNcHV0IDIgaW50byBsYXN0UHJvYw1yZXBl YXQgd2l0aCBlbnVtZXJhdG9ySW5kZXggPSAxIHRvIGVudW1lcmF0b3JDb3VudA1zZXQg Y3Vyc29yIHRvIGJ1c3kNcHV0ICIiIGludG8geA1wdXQgbGluZSAobGFzdFByb2MrMSkg b2YgYWV0ZSBpbnRvIHgNcHV0IGxpbmUgKGxhc3RQcm9jKzIpIG9mIGFldGUgaW50byBp dGVtIDIgb2YgeA1wdXQgbGluZSAobGFzdFByb2MrMykgb2YgYWV0ZSBpbnRvIGl0ZW0g MyBvZiB4DWFkZCAzIHRvIGxhc3RQcm9jDXB1dCB4IGludG8gbGluZSBlbnVtZXJhdG9y SW5kZXggb2YgZmllbGQgImVudW1JbmZvIg1lbmQgcmVwZWF0IC0tIGZvciBldmVyeSBl bnVtZXJhdG9ycw1kZWxldGUgbGluZSAxIHRvIGxhc3RQcm9jIG9mIGFldGUNZW5kIHJl cGVhdA1lbmQgcmVwZWF0DXB1dCB0cnVlIGludG8gaW5FZGl0DUNvbnN0cnVjdExpbmsN aWYgdGhlIGZyZWVzaXplIG9mIHRoaXMgc3RhY2sgPiAzMjc2OCB0aGVuIGRvTWVudSAi Q29tcGFjdCBTdGFjayINZW5kIG1vdXNlVXAAACQgACEBAABmABAAfABnoAQAAAAAAAEA AAAMAAAAEE91dHB1dCBhZXRlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xp Y2sgaGVyZSB3cml0ZSBhbiBhZXRlIHJlc291cmNlIG91dCB0byBhIGZpbGUuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANLS1pZiB0aGUgb3B0aW9uS2V5IGlzIGRvd24g dGhlbg0tLSBwdXQgdHJ1ZSBpbnRvIHVzZUFFDS0tZWxzZQ0tLSAgcHV0IGZhbHNlIGlu dG8gdXNlQUUNLS1lbmQgaWYNc2V0IGN1cnNvciB0byB3YXRjaA1wdXQgTWFrZUFldGUo KSBpbnRvIGFldGVSZXNvdXJjZQ1zZXQgbG9ja1NjcmVlbiB0byB0cnVlDXNldCBsb2Nr UmVjZW50IHRvIHRydWUNc2V0IGN1cnNvciB0byBhcnJvdw1pZiBhZXRlUmVzb3VyY2Ug PD4gMCB0aGVuDS0taWYgdXNlQUUgdGhlbg0tLSBzZW5kIGl0IG91dCBhcyAnTUlTQycg J1dSU0MnDS0tYW5zd2VyIHByb2dyYW0gIndyaXRlIHRvIHdoaWNoIHByb2dyYW0iDS0t aWYgaXQgPD4gIiIgdGhlbg0tLVNlbmRBRSAiTUlTQyxXUlNDLCIgJiBpdCAmICIsMSwx MjAwLC0tLS0sKioqKixSU0lELHNob3IiLCK+YWV0Zb4iICYgYWV0ZVJlc291cmNlLDAN LS1wdXQgMCBpbnRvIGFldGVSZXNvdXJjZSAtLSB3ZSBzYXZlIGl0IGFscmVhZHkNLS1l bmQgaWYNLS1lbHNlDS0tIHdyaXRlIGl0IG91dA1hbnN3ZXIgZmlsZSAiU2F2ZSB0aGUg J2FldGUnIHJlc291cmNlIHRvIGZpbGU6Ig1pZiBpdCA8PiAiIiB0aGVuDVNhdmVEZXNj QXNSZXNvdXJjZSBhZXRlUmVzb3VyY2UsIGl0LCAwDWlmIHRoZSByZXN1bHQgPD4gIiIg dGhlbg1hbnN3ZXIgIlRoZSBvcGVyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgIiAmIHRo ZSByZXN1bHQNZW5kIGlmDXB1dCAwIGludG8gYWV0ZVJlc291cmNlIC0tIHdlIHNhdmUg aXQgYWxyZWFkeQ1lbmQgaWYNLS1lbmQgaWYNZW5kIGlmDWlmIGFldGVSZXNvdXJjZSA8 PiAwIHRoZW4NTW92ZURlc2NUb1NjcmFwIGFldGVSZXNvdXJjZQ1lbmQgaWYNZW5kIG1v dXNlVXANDWZ1bmN0aW9uIE1ha2VBZXRlDWdsb2JhbCBpbkVkaXQNcHV0IGNhcmQgZmll bGQgIm1ham9yVmVyc2lvbiIgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byB4DXB1dCBj YXJkIGZpZWxkICJtaW5vclZlcnNpb24iIG9mIGNhcmQgInByZWZlcmVuY2UiIGludG8g eQ1pZiBsZW5ndGgoeSkgPSAxIHRoZW4gbXVsdGlwbHkgeSBieSAxMA1wdXQgKHggZGl2 IDEwKSAqIDQwOTYgKyAoeCBtb2QgMTApICogMjU2ICsgKHkgZGl2IDEwKSAqIDE2ICsg KHkgbW9kIDEwKSBpbnRvIHZlcnNpb24NcHV0IGZhbHNlIGludG8gaW5FZGl0DXB1c2gg Y2FyZA1nbyB0byBmaXJzdCBjYXJkIG9mIGJrZ25kIGV2ZW50cw1wdXQgIr4iICYgUmVz VHlwZShjYXJkIGZpZWxkICJyZXNvdXJjZVR5cGUiIG9mIGNhcmQgInByZWZlcmVuY2Ui KSAmICK+IiAmIE5ld0hhbmRsZSgpIGludG8gaGFuZA1wdXQgMCBpbnRvIGVyckNvdW50 DXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50byBzdWl0 ZUNvdW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInNob3IiLCB2ZXJzaW9uKSA8PiAwIHRo ZW4gYWRkIDEgdG8gZXJyQ291bnQNaWYgRXh0ZW5kRGVzYyhoYW5kLCAic2hvciIsIGNh cmQgZmllbGQgImxhbmd1YWdlQ29kZSIgb2YgY2FyZCAicHJlZmVyZW5jZSIpIDw+IDAg dGhlbiBhZGQgMSB0byBlcnJDb3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwg Y2FyZCBmaWVsZCAic2NyaXB0Q29kZSIgb2YgY2FyZCAicHJlZmVyZW5jZSIpIDw+IDAg dGhlbiBhZGQgMSB0byBlcnJDb3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwg c3VpdGVDb3VudC0xKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQNcmVwZWF0IHdp dGggc3VpdGVJbmRleCA9IDIgdG8gc3VpdGVDb3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kN Z28gY2FyZCBzdWl0ZUluZGV4IG9mIGJrZ25kICJzdWl0ZUluZm8iDXB1dCBmaWVsZCAi c3VpdGVDb2RlIiBpbnRvIG15U3VpdGVDb2RlDWlmIEV4dGVuZERlc2MoaGFuZCwgInMy NTUiLCBmaWVsZCAic3VpdGVOYW1lIikgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50 DWlmIEV4dGVuZERlc2MoaGFuZCwgInMyNTUiLCBmaWVsZCAiU3VpdGVDb21tZW50Iiwg dHJ1ZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50DWlmIEV4dGVuZERlc2MoaGFu ZCwgInRuYW0iLCBteVN1aXRlQ29kZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50 DWlmIEV4dGVuZERlc2MoaGFuZCwgInNob3IiLCAxKSA8PiAwIHRoZW4gYWRkIDEgdG8g ZXJyQ291bnQgLS0gc3VpdGUgbGV2ZWwNaWYgRXh0ZW5kRGVzYyhoYW5kLCAic2hvciIs IDEpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBzdWl0ZSB2ZXJzaW9uDXB1 dCBmaWVsZCBFdmVudExpc3QgaW50byBteUV2ZW50TGlzdA1wdXQgZmllbGQgQ2xhc3NM aXN0IGludG8gbXlDbGFzc0xpc3QNcHV0IGZpZWxkIENvbXBhcmVMaXN0IGludG8gbXlD b21wYXJlTGlzdA1wdXQgZmllbGQgRW51bUxpc3QgaW50byBteUVudW1MaXN0DS0tIG5v dyBkbyBpdCBmb3IgZWFjaCBldmVudCBpbiB0aGUgbGlzdA1wdXQgbnVtYmVyIG9mIGxp bmVzIGluIG15RXZlbnRMaXN0IGludG8gZXZlbnRDb3VudA0tLSBjaGVjayBhY3R1YWwg ZXZlbnQgY291bnQNcHV0IDAgaW50byBhY3R1YWxDb3VudA1yZXBlYXQgd2l0aCBldmVu dEluZGV4ID0gMSB0byBldmVudGNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBqdW1w KCJldmVudCIgJiYgaXRlbSAyIG9mIGxpbmUgZXZlbnRJbmRleCBvZiBteUV2ZW50TGlz dCkgdGhlbg1pZiBub3QgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0 aGVuDWFkZCAxIHRvIGFjdHVhbENvdW50DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVhdA1p ZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgYWN0dWFsQ291bnQpIDw+IDAgdGhlbiBh ZGQgMSB0byBlcnJDb3VudA1yZXBlYXQgd2l0aCBldmVudEluZGV4ID0gMSB0byBldmVu dGNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBqdW1wKCJldmVudCIgJiYgaXRlbSAy IG9mIGxpbmUgZXZlbnRJbmRleCBvZiBteUV2ZW50TGlzdCkgdGhlbg1pZiBub3QgaGls aXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0aGVuDWlmIEV4dGVuZERlc2Mo aGFuZCwgInMyNTUiLCBmaWVsZCAiZXZlbnROYW1lIikgPD4gMCB0aGVuIGFkZCAxIHRv IGVyckNvdW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInMyNTUiLCBmaWVsZCAiZXZlbnRD b21tZW50IiwgdHJ1ZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50DWlmIEV4dGVu ZERlc2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGZpZWxkICJldmVudENsYXNzIikpIDw+ IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFt IiwgUmVzVHlwZShmaWVsZCAiZXZlbnRJRCIpKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJy Q291bnQNcHV0IGxpbmUgMSBvZiBmaWVsZCBwYXJhbUluZm8gaW50byB4IC0tIHJlcGx5 DWlmIEV4dGVuZERlc2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGl0ZW0gMyBvZiB4KSkg PD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50DXB1dCBpdGVtIDQgb2YgeCBpbnRvIHRl bXANZGVsZXRlIGl0ZW0gMSB0byA0IG9mIHgNaWYgRXh0ZW5kRGVzYyhoYW5kLCAiczI1 NSIsIHgsIHRydWUpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSByZXBseSBj b21tZW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInNob3IiLCB0ZW1wKSA8PiAwIHRoZW4g YWRkIDEgdG8gZXJyQ291bnQgLS0gcmVwbHkgYXR0cmlidXRlDXB1dCBsaW5lIDIgb2Yg ZmllbGQgcGFyYW1JbmZvIGludG8geCAtLSBkaXJlY3Qgb2JqZWN0DWlmIEV4dGVuZERl c2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGl0ZW0gMyBvZiB4KSkgPD4gMCB0aGVuIGFk ZCAxIHRvIGVyckNvdW50DXB1dCBpdGVtIDQgb2YgeCBpbnRvIHRlbXANZGVsZXRlIGl0 ZW0gMSB0byA0IG9mIHgNaWYgRXh0ZW5kRGVzYyhoYW5kLCAiczI1NSIsIHgsIHRydWUp IDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBkaXJlY3QgY29tbWVudA1pZiBF eHRlbmREZXNjKGhhbmQsICJzaG9yIiwgdGVtcCkgPD4gMCB0aGVuIGFkZCAxIHRvIGVy ckNvdW50IC0tIGRpcmVjdCBhdHRyaWJ1dGUNaWYgRXh0ZW5kRGVzYyhoYW5kLCAic2hv ciIsIChudW1iZXIgb2YgbGluZXMgaW4gZmllbGQgcGFyYW1JbmZvLTIpKSA8PiAwIHRo ZW4gYWRkIDEgdG8gZXJyQ291bnQgLS0gZXh0cmEgcGFyYW0gY291bnQNcmVwZWF0IHdp dGggaSA9IDMgdG8gbnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkIHBhcmFtSW5mbw1wdXQg bGluZSBpIG9mIGZpZWxkIHBhcmFtSW5mbyBpbnRvIHgNaWYgRXh0ZW5kRGVzYyhoYW5k LCAiczI1NSIsIGl0ZW0gMSBvZiB4LCB0cnVlKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJy Q291bnQgLS0gcGFyYW0gbmFtZQ1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFtIiwgaXRl bSAyIG9mIHgsIHRydWUpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBwYXJh bSBrZXkNaWYgRXh0ZW5kRGVzYyhoYW5kLCAidG5hbSIsIGl0ZW0gMyBvZiB4LCB0cnVl KSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQgLS0gcGFyYW0gdHlwZQ1wdXQgaXRl bSA0IG9mIHggaW50byB0ZW1wDWRlbGV0ZSBpdGVtIDEgdG8gNCBvZiB4DWlmIEV4dGVu ZERlc2MoaGFuZCwgInMyNTUiLCB4LCB0cnVlKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJy Q291bnQgLS0gcGFyYW0gY29tbWVudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwg dGVtcCkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50IC0tIHBhcmFtIGF0dHJpYnV0 ZQ1lbmQgcmVwZWF0DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVhdCAtLSBmb3IgZXZlcnkg ZXZlbnQgaW4gc3VpdGUNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBteUNsYXNzTGlzdCBp bnRvIGNsYXNzQ291bnQNcHV0IDAgaW50byBhY3R1YWxDb3VudA1yZXBlYXQgd2l0aCBj bGFzc0luZGV4ID0gMSB0byBjbGFzc0NvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBq dW1wKCJjbGFzcyIgJiYgaXRlbSAyIG9mIGxpbmUgY2xhc3NJbmRleCBvZiBteUNsYXNz TGlzdCkgdGhlbg1pZiBub3QgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVU IiB0aGVuDWFkZCAxIHRvIGFjdHVhbENvdW50DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVh dA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgYWN0dWFsQ291bnQpIDw+IDAgdGhl biBhZGQgMSB0byBlcnJDb3VudA1yZXBlYXQgd2l0aCBjbGFzc0luZGV4ID0gMSB0byBj bGFzc0NvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBqdW1wKCJjbGFzcyIgJiYgaXRl bSAyIG9mIGxpbmUgY2xhc3NJbmRleCBvZiBteUNsYXNzTGlzdCkgdGhlbg1pZiBub3Qg aGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0aGVuDWlmIEV4dGVuZERl c2MoaGFuZCwgInMyNTUiLCBmaWVsZCAiY2xhc3NOYW1lIiwgdHJ1ZSkgPD4gMCB0aGVu IGFkZCAxIHRvIGVyckNvdW50IC0tIGNsYXNzIG5hbWUNaWYgRXh0ZW5kRGVzYyhoYW5k LCAidG5hbSIsIFJlc1R5cGUoZmllbGQgImNsYXNzSUQiKSkgPD4gMCB0aGVuIGFkZCAx IHRvIGVyckNvdW50IC0tIGNsYXNzIElEDWlmIEV4dGVuZERlc2MoaGFuZCwgInMyNTUi LCBmaWVsZCAiY2xhc3NDb21tZW50IiwgdHJ1ZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVy ckNvdW50IC0tIGNsYXNzIGNvbW1lbnQNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBmaWVs ZCAicHJvcEluZm8iIGludG8gcHJvcENvdW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInNo b3IiLCBwcm9wQ291bnQpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudA1yZXBlYXQg d2l0aCBwcm9wSW5kZXggPSAxIHRvIHByb3BDb3VudA1wdXQgbGluZSBwcm9wSW5kZXgg b2YgZmllbGQgInByb3BJbmZvIiBpbnRvIHgNaWYgRXh0ZW5kRGVzYyhoYW5kLCAiczI1 NSIsIGl0ZW0gMSBvZiB4LCB0cnVlKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQg LS0gY2xhc3MgbmFtZQ1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFtIiwgUmVzVHlwZShp dGVtIDIgb2YgeCkpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBjbGFzcyBJ RA1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFtIiwgUmVzVHlwZShpdGVtIDMgb2YgeCkp IDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBjbGFzcyBJRA1wdXQgaXRlbSA0 IG9mIHggaW50byB0ZW1wDWRlbGV0ZSBpdGVtIDEgdG8gNCBvZiB4DWlmIEV4dGVuZERl c2MoaGFuZCwgInMyNTUiLCB4LCB0cnVlKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291 bnQgLS0gY2xhc3MgY29tbWVudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgdGVt cCkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50IC0tIGF0dHJpYnV0ZQ1lbmQgcmVw ZWF0DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gZmllbGQgImVsZW1lbnRzIiBpbnRvIGVs ZW1Db3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgZWxlbUNvdW50KSA8PiAw IHRoZW4gYWRkIDEgdG8gZXJyQ291bnQNcmVwZWF0IHdpdGggZWxlbUluZGV4ID0gMSB0 byBlbGVtQ291bnQNcHV0IGxpbmUgZWxlbUluZGV4IG9mIGZpZWxkICJlbGVtZW50cyIg aW50byB4DWlmIEV4dGVuZERlc2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGl0ZW0gMSBv ZiB4KSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50IC0tIGVsZW1lbnQgY2xhc3MN cHV0IG51bWJlciBvZiBpdGVtcyBvZiB4IGludG8ga2V5Rm9ybUNvdW50DWlmIEV4dGVu ZERlc2MoaGFuZCwgInNob3IiLCBrZXlGb3JtQ291bnQtMSkgPD4gMCB0aGVuIGFkZCAx IHRvIGVyckNvdW50DXJlcGVhdCB3aXRoIGtleUZvcm1JbmRleCA9IDIgdG8ga2V5Rm9y bUNvdW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGl0ZW0ga2V5 Rm9ybUluZGV4IG9mIHgpKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQgLS0ga2V5 IGZvcm0NZW5kIHJlcGVhdA1lbmQgcmVwZWF0DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVh dA0tLSBub3cgZG8gY29tcGFyaXNvbg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIG15Q29t cGFyZUxpc3QgaW50byBjb21wYXJlQ291bnQNcHV0IDAgaW50byBhY3R1YWxDb3VudA1y ZXBlYXQgd2l0aCBjb21wYXJlSW5kZXggPSAxIHRvIGNvbXBhcmVDb3VudA1zZXQgY3Vy c29yIHRvIGJ1c3kNaWYganVtcCgiY29tcGFyaXNvbiIgJiYgaXRlbSAyIG9mIGxpbmUg Y29tcGFyZUluZGV4IG9mIG15Q29tcGFyZUxpc3QpIHRoZW4NaWYgbm90IGhpbGl0ZSBv ZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgdGhlbg1hZGQgMSB0byBhY3R1YWxDb3Vu dA1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQNaWYgRXh0ZW5kRGVzYyhoYW5kLCAic2hv ciIsIGFjdHVhbENvdW50KSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQNcmVwZWF0 IHdpdGggY29tcGFyZUluZGV4ID0gMSB0byBjb21wYXJlQ291bnQNc2V0IGN1cnNvciB0 byBidXN5DWlmIGp1bXAoImNvbXBhcmlzb24iICYmIGl0ZW0gMiBvZiBsaW5lIGNvbXBh cmVJbmRleCBvZiBteUNvbXBhcmVMaXN0KSB0aGVuDWlmIG5vdCBoaWxpdGUgb2YgYmtn bmQgYnV0dG9uICJmcm9tIEFFVVQiIHRoZW4NaWYgRXh0ZW5kRGVzYyhoYW5kLCAiczI1 NSIsIGZpZWxkICJjb21wYXJlTmFtZSIsIHRydWUpIDw+IDAgdGhlbiBhZGQgMSB0byBl cnJDb3VudCAtLSBjb21wYXJlIG5hbWUNaWYgRXh0ZW5kRGVzYyhoYW5kLCAidG5hbSIs IFJlc1R5cGUoZmllbGQgImNvbXBhcmVJRCIpKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJy Q291bnQgLS0gZWxlbWVudCBjbGFzcw1pZiBFeHRlbmREZXNjKGhhbmQsICJzMjU1Iiwg ZmllbGQgImNvbXBhcmVDb21tZW50IiwgdHJ1ZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVy ckNvdW50IC0tIGNvbXBhcmUgY29tbWVudA1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQN LS0gZG8gZW51bWVyYXRpb25zDXB1dCBudW1iZXIgb2YgbGluZXMgaW4gbXlFbnVtTGlz dCBpbnRvIGVudW1Db3VudA1wdXQgMCBpbnRvIGFjdHVhbENvdW50DXJlcGVhdCB3aXRo IGVudW1JbmRleCA9IDEgdG8gZW51bUNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBq dW1wKCJlbnVtZXJhdGlvbiIgJiYgbGluZSBlbnVtSW5kZXggb2YgbXlFbnVtTGlzdCkg dGhlbg1pZiBub3QgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0aGVu DWFkZCAxIHRvIGFjdHVhbENvdW50DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVhdA1pZiBF eHRlbmREZXNjKGhhbmQsICJzaG9yIiwgYWN0dWFsQ291bnQpIDw+IDAgdGhlbiBhZGQg MSB0byBlcnJDb3VudA1yZXBlYXQgd2l0aCBlbnVtSW5kZXggPSAxIHRvIGVudW1Db3Vu dA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiZW51bWVyYXRpb24iICYmIGxpbmUg ZW51bUluZGV4IG9mIG15RW51bUxpc3QpIHRoZW4NaWYgbm90IGhpbGl0ZSBvZiBia2du ZCBidXR0b24gImZyb20gQUVVVCIgdGhlbg1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFt IiwgUmVzVHlwZShmaWVsZCAiZW51bWVyYXRpb24iKSkgPD4gMCB0aGVuIGFkZCAxIHRv IGVyckNvdW50DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gZmllbGQgImVudW1JbmZvIiBp bnRvIGVudW1lcmF0b3JDb3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgZW51 bWVyYXRvckNvdW50KSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQNcmVwZWF0IHdp dGggZW51bWVyYXRvckluZGV4ID0gMSB0byBlbnVtZXJhdG9yQ291bnQNcHV0IGxpbmUg ZW51bWVyYXRvckluZGV4IG9mIGZpZWxkICJlbnVtSW5mbyIgaW50byB4DWlmIEV4dGVu ZERlc2MoaGFuZCwgInMyNTUiLCBpdGVtIDEgb2YgeCwgdHJ1ZSkgPD4gMCB0aGVuIGFk ZCAxIHRvIGVyckNvdW50IC0tIG5hbWUNaWYgRXh0ZW5kRGVzYyhoYW5kLCAidG5hbSIs IFJlc1R5cGUoaXRlbSAyIG9mIHgpKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQg LS0gaWQNZGVsZXRlIGl0ZW0gMSB0byAyIG9mIHgNaWYgRXh0ZW5kRGVzYyhoYW5kLCAi czI1NSIsIHgsIHRydWUpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBjb21t ZW50DWVuZCByZXBlYXQNZW5kIGlmDWVuZCBpZg1lbmQgcmVwZWF0DWVuZCByZXBlYXQg LS0gZm9yIGV2ZXJ5IHN1aXRlDXBvcCBjYXJkDXB1dCB0cnVlIGludG8gaW5FZGl0DWlm IGVyckNvdW50IDw+IDAgdGhlbg1EaXNwb3NlRGVzYyhoYW5kKQ1wdXQgIr5udWxsvjAi IGludG8gaGFuZA1lbmQgaWYNcmV0dXJuIGhhbmQNZW5kIE1ha2VBZXRlDQ0AAg4AJQGA ATAAeQFEAMqgBAAAAAAAAQAAAAwAAAAQRGVsZXRlyQAAb24gbW91c2VVcA1nbG9iYWwg Z0RlbGV0ZVN1aXRlDWFuc3dlciAiQ2xpY2sgb24gYSBzdWl0ZSBpbiB0aGUgbGlzdCB0 byBkZWxldGUgaXQuIiB3aXRoICJPSyIgb3IgIkNhbmNlbCINaWYgaXQgaXMgIkNhbmNl bCIgdGhlbg1wdXQgZmFsc2UgaW50byBnRGVsZXRlU3VpdGUNcGFzcyBtb3VzZVVwDWVs c2UNcHV0IHRydWUgaW50byBnRGVsZXRlU3VpdGUNZW5kIGlmDXBhc3MgbW91c2VVcA0N DS0tIGdsb2JhbCBnV2hlcmVGcm9tDS0tIGxvY2sgc2NyZWVuDS0tIGdvIGxhc3QgY2Fy ZCBvZiBia2duZCAic3VpdGVJbmZvIg0tLSBEb01lbnUgIk5ldyBDYXJkIg0tLSBzZXQg dGhlIGhpbGl0ZSBvZiBiZyBidG4gImFldGUiIHRvIHRydWUNLS0gcHV0ICJhZXRlIiBp bnRvIGJnIGZsZCAiU3VpdGVDb2RlIg0tLSBwdXNoIGNkDS0tIHBvcCBjZCBpbnRvIGdX aGVyZUZyb20NLS0gdW5sb2NrIHNjcmVlbiB3aXRoIHZpc3VhbCB3aXBlIGxlZnQNZW5k IG1vdXNlVXANAAAiACgCBQAgAAAANQEKAAAAAAAAAAEAFQASCQAAGAAAAAABggApAQAB QQEaAVQBZKACAAAAAAABABUACgEAAA1Db3B5IEZpZWxkAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUg Y29kZSBzY3JhdGNocGFkIGZpZWxkIHRvIHRoZSBjbGlwYm9hcmQuIg1lbmQgTW91c2VX aXRoaW4NDW9uIG1vdXNlVXANY2xpY2sgYXQgbG9jIG9mIGNhcmQgZmllbGQgInNjcmF0 Y2giDXR5cGUgImEiIHdpdGggY29tbWFuZEtleSAtLSBzZWxlY3QgYWxsDWRvTWVudSAi Q29weSBUZXh0Ig1nZXQgcmVjdCBvZiBjYXJkIGZpZWxkICJzY3JhdGNoIg1wdXQgaXRl bSAxIG9mIGl0IGludG8geA1wdXQgKGl0ZW0gMiBvZiBpdCkgLSAyIGludG8geQ1jbGlj ayBhdCB4LCB5DWVuZCBtb3VzZVVwAADwACoBAAEzAAoBRwCNoAQAAAAAAAEAAAAMAAAA EFRyYW5zbGF0aW9uIFRhYmxlAABvbiBtb3VzZVVwDWxvY2FsaXphdGlvbiB0cnVlDWVu ZCBtb3VzZVVwDQ1vbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0 byBjcmVhdGUgYSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgbG9jYWxpemluZyB5b3VyICdh ZXRlJy4gSXQgd2lsbCBhcHBlYXIgaW4gdGhlIHNjcmF0Y2hwYWQuIg1lbmQgTW91c2VX aXRoaW4AAAAoACsCBQA8AM0ATAFiAAEAAAAAAAAAAwAMAQAAEHBhZE5hbWUAAAD/2AAb AFIgZSBzIG8gdSByIGMgZSAgVCBvIG8gbCBzAP/VAAsAU2NyYXRjaHBhZAD/6wALAHJl cWQNc21wbA0AbWFpbk1lbnUAZnVuY3Rpb24gVGNsQ2xpZW50U2FtcGxlIGNhcmRUeXBl DWlmIGNhcmRUeXBlID0gImV2ZW50IiB0aGVuDXB1dCBmaWVsZCAicGFyYW1JbmZvIiBp bnRvIHBhcmFtSW5mbw1wdXQgIkFFIiAmIFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIp IGludG8gRXZlbnROYW1lDXB1dCBpdGVtIDMgb2YgZmllbGQgInBhcmFtSW5mbyIgPD4g Im51bGwiIGludG8gcmV0dXJuVHlwZQ1wdXQgImFlcmVnaXN0ZXIiICYmIEV2ZW50TmFt ZSAmJiBmaWVsZCAiRXZlbnRDbGFzcyIgwg0mJiBmaWVsZCAiRXZlbnRJRCIgJiYgaXRl bSAzIG9mIHBhcmFtSW5mbyBpbnRvIHJzdA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHBh cmFtSW5mbyBpbnRvIGNvdW50DXB1dCAiIiBpbnRvIG9wdGlvbkxpc3QNcHV0ICIiIGlu dG8gcmVxdWlyZWRMaXN0DXJlcGVhdCB3aXRoIGluZGV4ID0gMiB0byBjb3VudA1wdXQg bGluZSBpbmRleCBvZiBwYXJhbUluZm8gaW50byB4DWlmIGluZGV4ID0gMiB0aGVuDXB1 dCBkaXJlY3RQYXJhbSBpbnRvIGl0ZW0gMSBvZiB4DXB1dCAiLS0tLSIgaW50byBpdGVt IDIgb2YgeA1lbmQgaWYNcHV0IGl0ZW0gNCBvZiB4IGludG8gdGVtcA1wdXQgKHRlbXAg PiAzMjc2NykgaW50byBpc09wdGlvbmFsDXB1dCB0ZW1wIGRpdiA4MTkyIGludG8gdGVt cA1pZiAodGVtcCBtb2QgMikgPSAxIHRoZW4NcHV0ICJlbnVtIiBpbnRvIGl0ZW0gMyBv ZiB4DWVuZCBpZg1pZiBpdGVtIDMgb2YgeCA8PiAibnVsbCIgdGhlbg1wdXQgc3BhY2Ug aW50byB0ZW1wDWlmIGl0ZW0gMyBvZiB4ID0gIlRFWFQiIHRoZW4NcHV0IHF1b3RlICYg aXRlbSAyIG9mIHggJiBxdW90ZSBhZnRlciB0ZW1wDWVsc2UNcHV0IHF1b3RlICYgUmVz VHlwZShpdGVtIDIgb2YgeCkgJiBSZXNUeXBlKGl0ZW0gMyBvZiB4KSAmIHF1b3RlIGFm dGVyIHRlbXANZW5kIGlmDWlmIHNwYWNlIGlzIGluIGl0ZW0gMSBvZiB4IHRoZW4NcHV0 IHNwYWNlICYgcXVvdGUgJiBpdGVtIDEgb2YgeCAmIHF1b3RlIGFmdGVyIHRlbXANZWxz ZQ1wdXQgc3BhY2UgJiBpdGVtIDEgb2YgeCBhZnRlciB0ZW1wDWVuZCBpZg1pZiBpc09w dGlvbmFsIHRoZW4NcHV0IHRlbXAgYWZ0ZXIgb3B0aW9uTGlzdA1lbHNlDXB1dCB0ZW1w IGFmdGVyIHJlcXVpcmVkTGlzdA1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQgLS0gMiB0 byBuDXB1dCByZXF1aXJlZExpc3QgYWZ0ZXIgcnN0DWlmIG9wdGlvbkxpc3QgPD4gIiIg dGhlbg1wdXQgIiBvcHRpb25hbGx5IiAmIG9wdGlvbkxpc3QgYWZ0ZXIgcnN0DWVuZCBp Zg1yZXR1cm4gcnN0ICYgcmV0dXJuICYgcmV0dXJuDWVsc2UNcmV0dXJuICIiDWVuZCBp Zg1lbmQgVGNsQ2xpZW50U2FtcGxlDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAGAQk1BUAAACsoAAAAAAAAAAAABAAAAAAAAAVYCAAAAAAABVgIAABsAAAEFARAA AAAAAAAAAAAAAEwAAADkv4K5go3iNSAAAuEI4hEBEyDhCuEaIBYBFQPhCOE4AgAg4gWu heEcIBYQEwXhCOEYAhMgJhAQEhThCL+Cv4K/gr+Cv4K/gr+Cv4KygowQgOIQAgKihYri EQEC4hEDAraGjhCA4hACAo0QQOIhgACogYlPDgAxgOEBTxkAAYDhAW8YMzPHhxgPbxwz MYzMmA9fDjMxjM7hXwczMY/H4W8DMzGMA4APbxMzMYxJmA9vDh8wx4cYD6+BjBABHUDh BYkgAYArAYDhBSABQCsDgOEFjCABoCsBwOEFiSABICsFgOEFIAEgKwaA4QW/hr+Gv4an hopCCqqqqsGqqqqqqqqgA+EGhokgASArBYDhBb+GvYaMIAGgKwHA4QWOEWgrBoDhBY0R gBsC4QaMEAEdQOEFZSBzZWxlY3Rpb24gdmlzaWIAAWmAQ0FSRAAALR0AAAAAAAALiwAA AAAAAAAAAAAAAAAAOvAAAA48AC8AOQABPiwAGQAAIBoApAATAgYANwCFAEoB+QACAAAA AAAAAAQADAAAABBzZW5kVGFyZ2V0AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAi VGhlIG5hbWUgb2YgdGhlIHRhcmdldCBhcHBsaWNhdGlvbiB0byBiZSB1c2VkIGluIFBB U0NBTCBjbGllbnQgc2FtcGxlIGNvZGUuIg1lbmQgTW91c2VXaXRoaW4NAACcAAwCBgBm ASQAeQFdAAIAAAAAAAAABAAMAAAAEHRpbWVPdXQAAG9uIE1vdXNlV2l0aGluDVNob3dC YWxsb29uICJFbnRlciB0aGUgdGltZW91dCB2YWx1ZSB0byBiZSB1c2VkIGluIFBBU0NB TCBjbGllbnQgc2FtcGxlIGNvZGUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0AAADCABgC BgB6ASQAjQH5AAIAAAAAAAAABAAMAAAAEHNlbmRNb2RlAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiRW50ZXIgdGhlIHNlbmQgbW9kZSAob3RoZXIgdGhhbiB3YWl0UmVw bHkvbm9SZXBseS9xdWV1ZVJlcGx5KSB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQg c2FtcGxlIGNvZGUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0AAKAAFwIGAI4BJAChAfkA AgAAAAAAAAAEAAwAAAAQaWRsZVByb2MAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29u ICJFbnRlciB0aGUgbmFtZSBvZiBpZGxlIHByb2MgdG8gYmUgdXNlZCBpbiBQQVNDQUwg Y2xpZW50IHNhbXBsZSBjb2RlIGhlcmUuIg1lbmQgTW91c2VXaXRoaW4NAACwABkCBgCi ASQAtQH5AAIAAAAAAAAAAwAMAAAAEGFlRmlsdGVyAABvbiBNb3VzZVdpdGhpbg1TaG93 QmFsbG9vbiAiRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IGZpbHRlciBmdW5jdGlv biB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQgc2FtcGxlIGNvZGUgaGVyZS4iDWVu ZCBNb3VzZVdpdGhpbg0AAKwAHAIGALYBJADJAfkAAgAAAAAAAAADAAwAAAAQdGFyZ2V0 RGVzYwAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVydCB0aGUgbmFtZSBv ZiB0YXJnZXQgZGVzY3JpcHRvciB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQgc2Ft cGxlIGNvZGUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0AAAAiAAECBQDfAJ8A8QEYAAAA AAAAAAAAFQAMBQAAEAAAAAA/BgACAQAA8gCfAQUA+sAGAAAAAAABAAAADAAAABBQYXNj YWwAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGluZGlj YXRlIHRoYXQgdGhlIHNlcnZlciBjb2RlIHRvIGhhbmRsZSBBcHBsZSBFdmVudHMgd2ls bCBiZSBpbiBQQVNDQUwuIg1lbmQgTW91c2VXaXRoaW4NDWZ1bmN0aW9uIFNlcnZlclNh bXBsZSBjYXJkVHlwZQ1pZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1wdXQgIkFFIiAm IFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNZ2xvYmFsIHZl cmJvc2UNaWYgdmVyYm9zZSB0aGVuDXB1dCBmaWVsZCAiZXZlbnRDb21tZW50IiBpbnRv IHRlbXANaWYgdGVtcCA8PiAiIiB0aGVuDXB1dCAieyAiICYgdGVtcCAmICIgfSIgJiBy ZXR1cm4gJiByZXR1cm4gaW50byBwcm9jSGVhZGVyDWVuZCBpZg1lbmQgaWYNcHV0IFBh c2NhbENsaWVudFRlbXBsYXRlKCkgJiByZXR1cm4gaW50byB0ZW1wDXB1dCAiRG8iIGFm dGVyIGNoYXIgOSBvZiB0ZW1wDXB1dCB0ZW1wIGFmdGVyIHByb2NIZWFkZXINcHV0IFRh YiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1wdXQgVGFiICYgInsg cHV0IHlvdXIgY29kZSBoZXJlIH0iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXINcHV0 IFRhYiAmICJEbyIgJiBwcm9jTmFtZSAmICIgOj0gTm9FcnI7IiAmIHJldHVybiBhZnRl ciBwcm9jSGVhZGVyDXB1dCBUYWIgJiAiRU5EOyIgJiByZXR1cm4gJiByZXR1cm4gYWZ0 ZXIgcHJvY0hlYWRlcg1wdXQgIkZ1bmN0aW9uIEhhbmRsZSIgJiBwcm9jTmFtZSDCDSYg Iih0aGVBcHBsZUV2ZW50LCB0aGVSZXBseTpBcHBsZUV2ZW50OyB0aGVSZWZDb246TE9O R0lOVCk6T1NFcnI7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCBHbHVlSW5m byhmaWVsZCAicGFyYW1JbmZvIikgaW50byBwYXJhbUluZm8NcHV0IG51bWJlciBvZiBs aW5lcyBvZiBwYXJhbUluZm8gaW50byBjb3VudA1wdXQgKGl0ZW0gMyBvZiBwYXJhbUlu Zm8gPD4gIm51bGwiKSBpbnRvIGlzRnVuYw1wdXQgVGFiICYgVGFiIGludG8gdHdvVGFi DXB1dCBUYWIgJiB0d29UYWIgaW50byB0aHJlZVRhYg1wdXQgIiIgaW50byB2YXJEZWNs YXJlDXB1dCBmYWxzZSBpbnRvIG5lZWRFcnINcHV0ICIiIGludG8gY2xlYW5VcENvZGUN cHV0ICIiIGludG8gcHV0UmVzdWx0Q29kZQ1wdXQgVGFiICYgIkZhaWxFcnIoRG8iICYg cHJvY05hbWUgJiAiKCIgaW50byBjYWxsWW91ckNvZGUNcHV0IFRhYiAmICJCRUdJTiIg JiByZXR1cm4gaW50byBpbml0Q29kZQ1wdXQgMCBpbnRvIHRvdGFsUGFyYW0NLS0gaWYg YSBmdW5jdGlvbiBnZXQgdGhlIHJlc3VsdCBiYWNrDWlmIGlzRnVuYyB0aGVuDWFkZCAx IHRvIHRvdGFsUGFyYW0NcHV0IGxpbmUgMSBvZiBwYXJhbUluZm8gaW50byB4DXB1dCBp dGVtIDQgb2YgeCBpbnRvIHBhcmFtVHlwZQ1wdXQgTmFtZU9mRGF0YVR5cGUoaXRlbSAz IG9mIHgpIGludG8gbmFtZUxpc3QNcHV0IFRhYiAmICJJRiB0aGVSZXBseS5kYXRhSGFu ZGxlIDw+IE5JTCBUSEVOIiAmIHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWlmIHBh cmFtVHlwZSA8PSAzIHRoZW4gLS0gcmVzdWx0IGlzIEFFRGVzYyBvciBIYW5kbGUNcHV0 ICJ0aGVSZXN1bHQ6IEFFRGVzYzsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 IFRhYiAmICJ0aGVSZXN1bHQuZGF0YUhhbmRsZSA6PSBOSUw7IiAmIHJldHVybiBhZnRl ciBpbml0Q29kZQ1pZiAocGFyYW1UeXBlID0gMCkgb3IgKHBhcmFtVHlwZSA9IDIpIHRo ZW4NcHV0ICJ0aGVSZXN1bHQsIiBhZnRlciBjYWxsWW91ckNvZGUNZWxzZQ1wdXQgVGFi ICYgInRoZVJlc3VsdC5kZXNjcmlwdG9yVHlwZSA6PSAiICYgaXRlbSA0IG9mIG5hbWVM aXN0IMINJiAiOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUNaWYgaXRlbSAzIG9mIG5h bWVMaXN0ID0gIkhhbmRsZSIgdGhlbg1wdXQgInRoZVJlc3VsdC5kYXRhSGFuZGxlLCIg YWZ0ZXIgY2FsbFlvdXJDb2RlDWVsc2UNcHV0IGl0ZW0gMyBvZiBuYW1lTGlzdCAmICIo dGhlUmVzdWx0LmRhdGFIYW5kbGUpLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBpZg1l bmQgaWYNcHV0IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKHRoZVJl c3VsdCkpOyIgJiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNcHV0IHR3b1RhYiAmICJG YWlsRXJyKEFFUHV0S2V5RGVzYyh0aGVSZXBseSwga2V5RGlyZWN0T2JqZWN0LCB0aGVS ZXN1bHQpKTsiICYgcmV0dXJuIGFmdGVyIHB1dFJlc3VsdENvZGUNZWxzZSBpZiAocGFy YW1UeXBlID0gNCkgb3IgKHBhcmFtVHlwZSA9IDYpIHRoZW4gLS0gcmVzdWx0IGlzIG9u IHN0YWNrDXB1dCAidGhlUmVzdWx0OiAiICYgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsi ICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0ICJ0aGVSZXN1bHQsIiBhZnRlciBj YWxsWW91ckNvZGUNcHV0IHR3b1RhYiAmICJGYWlsRXJyKEFFUHV0S2V5UHRyKHRoZVJl cGx5LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIs IEB0aGVSZXN1bHQiIGFmdGVyIHB1dFJlc3VsdENvZGUNaWYgcGFyYW1UeXBlID0gNCB0 aGVuDXB1dCAiLCBTaXplT2YoIiAmIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICIpKSk7IiAm IHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWVsc2UNcHV0ICJbMV0sIExlbmd0aCh0 aGVSZXN1bHQpKSk7IiAmIHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWVuZCBpZg1l bmQgaWYNZW5kIGlmIC0tIGlzRnVuYw1yZXBlYXQgd2l0aCBwYXJhbUluZGV4ID0gMiB0 byBjb3VudA1wdXQgbGluZSBwYXJhbUluZGV4IG9mIHBhcmFtSW5mbyBpbnRvIHgNaWYg aXRlbSAzIG9mIHggPD4gIm51bGwiIHRoZW4NYWRkIDEgdG8gdG90YWxQYXJhbQ1wdXQg aXRlbSA0IG9mIHggaW50byBwYXJhbVR5cGUNcHV0IChpdGVtIDUgb2YgeCA9ICJvIikg aW50byBpc09wdGlvbmFsDXB1dCBOYW1lT2ZEYXRhVHlwZShpdGVtIDMgb2YgeCkgaW50 byBuYW1lTGlzdA1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IHR3b1RhYiBpbnRvIGluZGVu dA1lbHNlDXB1dCBUYWIgaW50byBpbmRlbnQNZW5kIGlmDWlmIHBhcmFtVHlwZSA9IDAg dGhlbiAtLSBBRURlc2MNcHV0IGl0ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNcHV0IHRo aXNOYW1lICYmICI6IEFFRGVzYzsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 IFRhYiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlIDo9IE5JTDsiICYgcmV0dXJuIGFm dGVyIGluaXRDb2RlDWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgaXRlbSA2IG9mIHggaW50 byBwdHJUaGlzTmFtZQ1wdXQgcHRyVGhpc05hbWUgJiYgIjogQUVEZXNjUHRyOyIgJiBy ZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgcHRyVGhpc05hbWUgJiAiLCIgYWZ0ZXIg Y2FsbFlvdXJDb2RlDXB1dCB0cnVlIGludG8gbmVlZEVycg1wdXQgVGFiICYgImVyciA6 PSBBRUdldEtleURlc2ModGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9mIHggwg0mICIs dHlwZVdpbGRDYXJkLCIgJiB0aGlzTmFtZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNcHV0IFBhc2NhbE9wdGlvbkhhbmRsaW5nKHRoaXNOYW1lLCBwdHJUaGlzTmFt ZSkgYWZ0ZXIgcHJvY0JvZHkNZWxzZQ1wdXQgdGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2Fs bFlvdXJDb2RlDXB1dCBUYWIgJiAiRmFpbEVycihBRUdldEtleURlc2ModGhlQXBwbGVF dmVudCwiICYgaXRlbSAyIG9mIHggwg0mICIsdHlwZVdpbGRDYXJkLCIgJiB0aGlzTmFt ZSAmICIpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgdHdvVGFi ICYgIklnbm9yZU9TRXJyKEFFRGlzcG9zZURlc2MoIiAmIHRoaXNOYW1lICYgIikpOyIg JiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNZWxzZSBpZiBwYXJhbVR5cGUgPSAxIHRo ZW4gLS0gaGFuZGxlDXB1dCAiZGVzY0ZvciIgJiBTdHJpcFNQKGl0ZW0gMSBvZiB4KSBp bnRvIHRoaXNOYW1lDXB1dCB0aGlzTmFtZSAmJiAiOiBBRURlc2M7IiAmIHJldHVybiBh ZnRlciB2YXJEZWNsYXJlDXB1dCBUYWIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSA6 PSBOSUw7IiAmIHJldHVybiBhZnRlciBpbml0Q29kZQ1pZiBpdGVtIDMgb2YgbmFtZUxp c3QgPSAiSGFuZGxlIiB0aGVuDXB1dCB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSwiIGFm dGVyIGNhbGxZb3VyQ29kZQ1lbHNlDXB1dCBpdGVtIDMgb2YgbmFtZUxpc3QgJiAiKCIg JiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSksIiBhZnRlciBjYWxsWW91ckNvZGUNZW5k IGlmDWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFRh YiAmICJlcnIgOj0gQUVHZXRLZXlEZXNjKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBv ZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCIgJiB0aGlzTmFtZSAm ICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJJRiBlcnIgPSBl cnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiDCDSYgdHdvVGFiICYgInsgb3Ig eW91IG1heSBwdXQgaW4geW91ciBkZWZhdWx0IGhlcmUgfSIgJiByZXR1cm4gwg0mIFRh YiAmICJFTFNFIEZhaWxFcnIoZXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVs c2UNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5RGVzYyh0aGVBcHBsZUV2ZW50LCIg JiBpdGVtIDIgb2YgeCDCDSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYgIiwiICYg dGhpc05hbWUgJiAiKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0 IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKCIgJiB0aGlzTmFtZSAm ICIpKTsiICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWVsc2UgaWYgKHBhcmFtVHlw ZSA9IDQpIG9yIChwYXJhbVR5cGUgPSA2KSB0aGVuDWlmIGl0ZW0gMyBvZiB4ID0gInRy dWUiIHRoZW4NcHV0IGl0ZW0gMSBvZiB4ICYmICI6IEJvb2xlYW47IiAmIHJldHVybiBh ZnRlciB2YXJEZWNsYXJlDXB1dCBpdGVtIDEgb2YgeCAmICIsIiBhZnRlciBjYWxsWW91 ckNvZGUNcHV0IHRydWUgaW50byBuZWVkRXJyDXB1dCBQYXNjYWxUeXBlVHJ1ZUNvZGUo eCkgYWZ0ZXIgcHJvY0JvZHkNZWxzZSBpZiBpc09wdGlvbmFsIHRoZW4NaWYgaXRlbSAz IG9mIHggPSAiZW51bSIgdGhlbg1wdXQgaXRlbSAxIG9mIHggJiYgIjogUmVzVHlwZTsi ICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IGl0ZW0gMSBvZiB4ICYgIiwiIGFm dGVyIGNhbGxZb3VyQ29kZQ1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFBhc2NhbFR5 cGVUcnVlQ29kZSh4KSBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCBpdGVtIDYgb2YgeCBp bnRvIHB0clRoaXNOYW1lDXB1dCBpdGVtIDEgb2YgeCBpbnRvIHRoaXNOYW1lDXB1dCB0 aGlzTmFtZSAmJiAiOiAiICYgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJu IGFmdGVyIHZhckRlY2xhcmUNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1dCBwdHJUaGlz TmFtZSAmJiAiOiAiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFm dGVyIHZhckRlY2xhcmUNZWxzZQ1wdXQgcHRyVGhpc05hbWUgJiYgIjogU3RyaW5nUHRy OyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1lbmQgaWYNcHV0IHB0clRoaXNOYW1l ICYgIiwiIGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0 IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlQdHIodGhlQXBwbGVFdmVudCwiICYgaXRlbSAy IG9mIHggwg0mICIsIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsdHlwZUNvZGUsQCIg JiB0aGlzTmFtZSBhZnRlciBwcm9jQm9keQ1pZiBwYXJhbVR5cGUgPSA0IHRoZW4NcHV0 ICIsU2l6ZU9mKCIgJiB0aGlzTmFtZSAmICIpLGFjdHVhbFNpemUpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNZWxzZSAtLSBzdHIyNTUNcHV0ICJbMV0sU2l6ZU9mKCIgJiB0 aGlzTmFtZSAmICIpLTEsYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgVGFiICYgdGhpc05hbWUgJiAiWzBdIDo9IGNocihhY3R1YWxTaXplKTsiICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgUGFzY2FsT3B0aW9uSGFuZGxp bmcodGhpc05hbWUsIHB0clRoaXNOYW1lKSBhZnRlciBwcm9jQm9keQ1lbmQgaWYNZWxz ZSAtLSByZXF1aXJlZA1wdXQgaXRlbSAxIG9mIHggaW50byB0aGlzTmFtZQ1wdXQgdGhp c05hbWUgJiYgIjogIiAmIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICI7IiAmIHJldHVybiBh ZnRlciB2YXJEZWNsYXJlDXB1dCB0aGlzTmFtZSAmICIsIiBhZnRlciBjYWxsWW91ckNv ZGUNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5UHRyKHRoZUFwcGxlRXZlbnQsIiAm IGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLHR5cGVD b2RlLEAiICYgdGhpc05hbWUgYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNCB0 aGVuDXB1dCAiLFNpemVPZigiICYgdGhpc05hbWUgJiAiKSxhY3R1YWxTaXplKSk7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCAiWzFdLFNpemVPZigiICYgdGhp c05hbWUgJiAiKS0xLGFjdHVhbFNpemUpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5 DXB1dCBUYWIgJiB0aGlzTmFtZSAmICJbMF0gOj0gY2hyKGFjdHVhbFNpemUpOyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVuZCBpZg1lbHNlIGlmIChwYXJhbVR5 cGUgPSA1KSBvciAocGFyYW1UeXBlID0gNykgdGhlbg1wdXQgImRlc2NGb3IiICYgU3Ry aXBTUChpdGVtIDEgb2YgeCkgaW50byB0aGlzTmFtZQ1wdXQgdGhpc05hbWUgJiYgIjog QUVEZXNjOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgVGFiICYgdGhpc05h bWUgJiAiLmRhdGFIYW5kbGUgOj0gTklMOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUN cHV0IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKCIgJiB0aGlzTmFt ZSAmICIpKTsiICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWlmIGlzT3B0aW9uYWwg dGhlbg1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IGl0ZW0gNiBvZiB4IGludG8gcHRy VGhpc05hbWUNcHV0IHB0clRoaXNOYW1lICYgIiA6IiAmIGl0ZW0gMiBvZiBuYW1lTGlz dCAmICI7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWlmIHBhcmFtVHlwZSA9IDUg dGhlbg1wdXQgaXRlbSA3IG9mIHggaW50byBzaXplVGhpc05hbWUNcHV0IHNpemVUaGlz TmFtZSAmICIgOiBMT05HSU5UOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1lbmQg aWYNcHV0IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlEZXNjKHRoZUFwcGxlRXZlbnQsIiAm IGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCIgJiB0 aGlzTmFtZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJJ RiBlcnIgPSBlcnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiBhZnRlciBwcm9j Qm9keQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgdHdvVGFiICYgcHRyVGhpc05hbWUgJiAiIDo9IE5JTDsiICYgcmV0dXJuIGFmdGVy IHByb2NCb2R5DWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1wdXQgdHdvVGFiICYgc2l6ZVRo aXNOYW1lICYgIiA6PSAwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1 dCB0d29UYWIgJiAieyBvciB5b3UgbWF5IHB1dCBpbiB5b3VyIGRlZmF1bHQgaGVyZSB9 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkVORCIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJFTFNFIiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgdHdvVGFiICYgIkZhaWxFcnIoZXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWlmIHBhcmFtVHlwZSA9IDcgdGhlbiAtLSBwdXQgaW4gemVybyB0ZXJtaW5hdG9y DXB1dCB0d29UYWIgJiAiRmFpbEVycihQdHJBbmRIYW5kKEBlcnIsICIgJiB0aGlzTmFt ZSDCDSYgIi5kYXRhSGFuZGxlLCAxKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1l bmQgaWYNcHV0IHR3b1RhYiAmICJXSVRIIiAmJiB0aGlzTmFtZSAmJiAiRE8iICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0aHJlZVRhYiAmICJCRUdJTiIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNSB0aGVuDXB1dCB0aHJlZVRhYiAm IHNpemVUaGlzTmFtZSAmICIgOj0gR2V0SGFuZGxlU2l6ZShkYXRhSGFuZGxlKTsiICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1pZiBpdGVtIDIgb2YgbmFtZUxpc3Qg PSAiUHRyIiB0aGVuDXB1dCB0aHJlZVRhYiAmIHB0clRoaXNOYW1lICYgIiA6PSBkYXRh SGFuZGxlXjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IHRocmVlVGFi ICYgcHRyVGhpc05hbWUgJiAiIDo9ICIgJiBpdGVtIDIgb2YgbmFtZUxpc3Qgwg0mICIo ZGF0YUhhbmRsZV4pOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCB0 aHJlZVRhYiAmICJITG9jayhkYXRhSGFuZGxlKTsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCB0aHJlZVRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgdHdvVGFiICYgIkVORDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBwdHJU aGlzTmFtZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNaWYgcGFyYW1UeXBlID0gNSB0 aGVuDXB1dCBzaXplVGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBp Zg1lbHNlDXB1dCBUYWIgJiAiRmFpbEVycihBRUdldEtleURlc2ModGhlQXBwbGVFdmVu dCwiICYgaXRlbSAyIG9mIHggwg0mICIsIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIs IiAmIHRoaXNOYW1lICYgIikpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgcGFy YW1UeXBlID0gNyB0aGVuIC0tIHB1dCBpbiB6ZXJvIHRlcm1pbmF0b3INcHV0IHRydWUg aW50byBuZWVkRXJyDXB1dCBUYWIgJiAiRmFpbEVycihQdHJBbmRIYW5kKEBlcnIsICIg JiB0aGlzTmFtZSDCDSYgIi5kYXRhSGFuZGxlLCAxKSk7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJITG9jaygiICYgdGhpc05hbWUgJiAiLmRh dGFIYW5kbGUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgaXRlbSAyIG9mIG5h bWVMaXN0ID0gIlB0ciIgdGhlbg1wdXQgdGhpc05hbWUgJiAiLmRhdGFIYW5kbGVeLCIg YWZ0ZXIgY2FsbFlvdXJDb2RlDWVsc2UNcHV0IGl0ZW0gMiBvZiBuYW1lTGlzdCAmICIo IiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlXiksIiBhZnRlciBjYWxsWW91ckNvZGUN ZW5kIGlmDWlmIHBhcmFtVHlwZSA9IDUgdGhlbiAtLSB3ZSBuZWVkIHRoZSBzaXplIHRv bw1wdXQgIkdldEhhbmRsZVNpemUoIiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlKSwi IGFmdGVyIGNhbGxZb3VyQ29kZQ1lbmQgaWYNZW5kIGlmDWVuZCBpZg1lbmQgaWYgLS0g bm90IG51bGwNZW5kIHJlcGVhdA1pZiB2ZXJib3NlIHRoZW4NcHV0IFRhYiAmICJ7IFdl IGNoZWNrIHRvIHNlZSBpZiB3ZSBtaXNzZWQgYW55IHBhcmFtZXRlciBmcm9tIHRoZSBj bGllbnQgfSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAi SUYgQUVTaXplT2ZBdHRyaWJ1dGUodGhlQXBwbGVFdmVudCwga2V5TWlzc2VkS2V5d29y ZEF0dHIsICIgwg0mICJ0eXBlQ29kZSwgYWN0dWFsU2l6ZSkgPD4gZXJyQUVEZXNjTm90 Rm91bmQgVEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmICJG YWlsRXJyKGVyckFFUGFyYW1NaXNzZWQpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN aWYgdG90YWxQYXJhbSA+IDAgdGhlbg1wdXQgIikiIGludG8gbGFzdCBjaGFyIG9mIGNh bGxZb3VyQ29kZQ1lbHNlDWRlbGV0ZSBsYXN0IGNoYXIgb2YgY2FsbFlvdXJDb2RlDWVu ZCBpZg1wdXQgY2FsbFlvdXJDb2RlICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgcHV0UmVzdWx0Q29kZSBhZnRlciBwcm9jQm9keQ1pZiBjbGVhblVwQ29kZSA8 PiAiIiB0aGVuDXB1dCB0YWIgJiAiQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVuZCBpZg1wdXQgdGFiICYgIkhhbmRsZSIgJiBwcm9jTmFtZSAmICIgOj0gTm9F cnI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdGFiICYgIkVORDsiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DWlmIG5lZWRFcnIgdGhlbiBwdXQgImVyciA6IE9TRXJy OyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgInR5cGVDb2RlIDogRGVzY1R5 cGU7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAiYWN0dWFsU2l6ZSA6IExP TkdJTlQ7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWlmIHZhckRlY2xhcmUgPD4g IiIgdGhlbg1wdXQgdGFiICYgIlZBUiIgJiByZXR1cm4gaW50byB4DXJlcGVhdCB3aXRo IGkgPSAxIHRvIG51bWJlciBvZiBsaW5lcyBpbiB2YXJEZWNsYXJlDXB1dCB0d29UYWIg JiBsaW5lIGkgb2YgdmFyRGVjbGFyZSAmIHJldHVybiBhZnRlciB4DWVuZCByZXBlYXQN cHV0IHggYWZ0ZXIgcHJvY0hlYWRlcg1lbmQgaWYNcHV0IEZhaWxFcnJTb3VyY2UocHJv Y05hbWUsIGNsZWFuVXBDb2RlKSBhZnRlciBwcm9jSGVhZGVyDXJldHVybiBwcm9jSGVh ZGVyICYgaW5pdENvZGUgJiByZXR1cm4gJiBwcm9jQm9keSAmIHJldHVybg1lbHNlIGlm IGNhcmRUeXBlID0gImluaXQiIHRoZW4NcmV0dXJuICJQUk9DRURVUkUgSWdub3JlT1NF cnIoZXJyOk9TRXJyKTsgSU5MSU5FICQ1NDhGOyB7IGFkZHEgIzIsc3AgfSAiICYgcmV0 dXJuICYgcmV0dXJuDWVsc2UgaWYgY2FyZFR5cGUgPSAiaW5zdGFsbCIgdGhlbg1wdXQg IkFFIiAmIFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNcmV0 dXJuIFRhYiAmICJJZ25vcmVPU0VycihBRUluc3RhbGxFdmVudEhhbmRsZXIoJyIgJiBS ZXNUeXBlKGZpZWxkICJldmVudENsYXNzIikgwg0mICInLCAnIiAmIFJlc1R5cGUoZmll bGQgImV2ZW50SUQiKSAmICInLCBASGFuZGxlIiAmIHByb2NOYW1lIMINJiAiLCAwLCBG QUxTRSkpOyIgJiByZXR1cm4NZWxzZQ1yZXR1cm4gIiINZW5kIGlmDWVuZCBTZXJ2ZXJT YW1wbGUNDWZ1bmN0aW9uIEZhaWxFcnJTb3VyY2UgcHJvY05hbWUsIGNsZWFudXBDb2Rl DS0tIHdlIHB1dCB0aGlzIHNlcGFyYXRlIHNvIHRoZSBQYXNjYWxTZXJ2ZXJTYW1wbGUg d291bGQgbm90IGJlIHRvbyBsb25nDXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0 IFRhYiAmIHR3b1RhYiBpbnRvIHRocmVlVGFiDXB1dCAiIiBpbnRvIHByb2NIZWFkZXIN LS0gdGhlIGNsZWFudXAgcm91dGluZQ1pZiBjbGVhblVwQ29kZSA8PiAiIiB0aGVuDXB1 dCBUYWIgJiAiUFJPQ0VEVVJFIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jSGVh ZGVyDXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXIN cHV0IGNsZWFuVXBDb2RlIGFmdGVyIHByb2NIZWFkZXINcHV0IHR3b1RhYiAmICJFTkQ7 IiAmIHJldHVybiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDWVuZCBpZg1wdXQgVGFi ICYgIlBST0NFRFVSRSBGYWlsRXJyKGVycjpPU0Vycik7IiAmIHJldHVybiBhZnRlciBw cm9jSGVhZGVyDXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NI ZWFkZXINcHV0IHR3b1RhYiAmICJJRiBlcnIgPD4gTk9FcnIgVEhFTiIgJiByZXR1cm4g YWZ0ZXIgcHJvY0hlYWRlcg1wdXQgdGhyZWVUYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFm dGVyIHByb2NIZWFkZXINcHV0IHRocmVlVGFiICYgIkhhbmRsZSIgJiBwcm9jTmFtZSAm ICIgOj0gZXJyOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1pZiBjbGVhblVwQ29k ZSA8PiAiIiB0aGVuDXB1dCB0aHJlZVRhYiAmICJDbGVhblVwOyIgJiByZXR1cm4gYWZ0 ZXIgcHJvY0hlYWRlcg1lbmQgaWYNcHV0IHRocmVlVGFiICYgIkV4aXQoSGFuZGxlIiAm IHByb2NOYW1lICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCB0aHJl ZVRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCB0d29UYWIg JiAiRU5EOyIgJiByZXR1cm4gJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1yZXR1cm4g cHJvY0hlYWRlcg1lbmQgRmFpbEVyclNvdXJjZQ0NZnVuY3Rpb24gUGFzY2FsVHlwZVRy dWVDb2RlIHgNcHV0IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlQdHIodGhlQXBwbGVFdmVu dCwiICYgaXRlbSAyIG9mIHggJiAiLCAiIGludG8gcHJvY0JvZHkNaWYgaXRlbSAzIG9m IHggPSAidHJ1ZSIgdGhlbg1wdXQgInR5cGVCb29sZWFuLCB0eXBlQ29kZSwgQCIgJiBp dGVtIDEgb2YgeCAmICIsU2l6ZU9mKEJvb2xlYW4pLCBhY3R1YWxTaXplKTsiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0ICJ0eXBlRW51bWVyYXRlZCwgdHlwZUNv ZGUsIEAiICYgaXRlbSAxIG9mIHggJiAiLFNpemVPZihSZXNUeXBlKSwgYWN0dWFsU2l6 ZSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJJRiBl cnIgPSBlcnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgVGFiICYgVGFiICYgaXRlbSAxIG9mIHggJiAiIDo9ICIgYWZ0ZXIgcHJvY0Jv ZHkNaWYgaXRlbSAzIG9mIHggPSAidHJ1ZSIgdGhlbg1wdXQgIkZBTFNFIiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCAiUmVzVHlwZSgwKSIgJiByZXR1cm4gYWZ0 ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAiRUxTRSIgJiByZXR1cm4gYWZ0ZXIg cHJvY0JvZHkNcHV0IFRhYiAmIFRhYiAmICJGYWlsRXJyKGVycik7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1yZXR1cm4gcHJvY0JvZHkNZW5kIFBhc2NhbFR5cGVUcnVlQ29k ZQ0NZnVuY3Rpb24gUGFzY2FsT3B0aW9uSGFuZGxpbmcgdGhpc05hbWUsIHB0clRoaXNO YW1lDXB1dCBUYWIgJiAiaWYgZXJyID0gZXJyQUVEZXNjTm90Rm91bmQgVEhFTiIgJiBy ZXR1cm4gaW50byBwcm9jQm9keQ1wdXQgVGFiICYgVGFiIGludG8gdHdvVGFiDXB1dCB0 d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIg JiBwdHJUaGlzTmFtZSAmICIgOj0gTklMOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IHR3b1RhYiAmICJ7IG9yIHlvdSBtYXkgcHV0IGluIHlvdXIgZGVmYXVsdCBoZXJl IH0iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRU5EIiAmIHJl dHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgIkVMU0UiICYgcmV0dXJuIGFmdGVy IHByb2NCb2R5DXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCB0d29UYWIgJiAiRmFpbEVycihlcnIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNcHV0IHR3b1RhYiAmIHB0clRoaXNOYW1lICYgIiA6PSBAIiAmIHRoaXNOYW1l ICYgIjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRU5EOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcmV0dXJuIHByb2NCb2R5DWVuZCBQYXNjYWxP cHRpb25IYW5kbGluZw0NZnVuY3Rpb24gU2VydmVyQ29uc3QgY29uc3RJbmZvLGNvbW1l bnRPdXQNcHV0IGl0ZW0gMSBvZiBjb25zdEluZm8gJiAiID0gIiAmIGl0ZW0gMiBvZiBj b25zdEluZm8gJiAiOyIgaW50byB4DWlmIGNvbW1lbnRPdXQgPSAidHJ1ZSIgdGhlbg1w dXQgInsgIiAmIHggJiAiIH0iIGludG8geA1lbmQgaWYNcmV0dXJuIFRhYiAmIHgNZW5k IFNlcnZlckNvbnN0DQ1mdW5jdGlvbiBTZXJ2ZXJJbnN0YWxsIGluc3RhbGxDb2RlDXJl dHVybiByZXR1cm4gJiAiUHJvY2VkdXJlIEluc3RhbGxIYW5kbGVyczsiICYgcmV0dXJu IMINJiBUYWIgJiAiQkVHSU4iICYgcmV0dXJuICYgaW5zdGFsbENvZGUgJiBUYWIgJiAi RU5EOyIgJiByZXR1cm4NZW5kIFNlcnZlckluc3RhbGwNDWZ1bmN0aW9uIFBhc2NhbENs aWVudFRlbXBsYXRlIG11bHRpTGluZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0 ZSBvciB3aGljaCBwYXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgR2x1ZUluZm8o ZmllbGQgInBhcmFtSW5mbyIpIGludG8gcGFyYW1JbmZvDXB1dCAiRnVuY3Rpb24gQUUi ICYgU3RyaXBTUChmaWVsZCAiZXZlbnROYW1lIikgJiAiKCIgaW50byB0ZW1wbGF0ZQ1w dXQgbnVtYmVyIG9mIGxpbmVzIGluIHBhcmFtSW5mbyBpbnRvIG4NcHV0IDAgaW50byBw YXJhbUluZGV4DXJlcGVhdCB3aXRoIGluZGV4ID0gMSB0byBuDXNldCBjdXJzb3IgdG8g YnVzeQ1wdXQgbGluZSBpbmRleCBvZiBwYXJhbUluZm8gaW50byB5DXB1dCBpdGVtIDQg b2YgeSBpbnRvIHBhcmFtVHlwZQ1wdXQgKGl0ZW0gNSBvZiB5ID0gIm8iKSBpbnRvIGlz T3B0aW9uYWwNcHV0IChpdGVtIDMgb2YgeSA8PiAibnVsbCIpIGludG8gdXNlSXQNaWYg dXNlSXQgdGhlbg1hZGQgMSB0byBwYXJhbUluZGV4DWlmIHVzZUl0IHRoZW4NaWYgaW5k ZXggPSAxIHRoZW4NcHV0ICJWQVIgIiBhZnRlciB0ZW1wbGF0ZQ1wdXQgZmFsc2UgaW50 byBpc09wdGlvbmFsDWVsc2UNaWYgbXVsdGlMaW5lID0gIm11bHRpTGluZSIgdGhlbg1w dXQgcmV0dXJuICYgc3BhY2UgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1wdXQgc3BhY2UgYWZ0 ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBpZg1wdXQgTmFtZU9mRGF0YVR5cGUoaXRlbSAz IG9mIHkpIGludG8gbmFtZUxpc3QNaWYgcGFyYW1UeXBlID0gMSB0aGVuIC0tIGhhbmRs ZQ1wdXQgaXRlbSAxIG9mIHkgJiAiOiIgJiBpdGVtIDMgb2YgbmFtZUxpc3QgJiAiOyAi IGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgcGFyYW1UeXBlID0gNSB0aGVuIC0tIHB0ciAr IHNpemUNcHV0IGl0ZW0gNiBvZiB5ICYgIjoiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYg IjsgIiDCDSYgaXRlbSA3IG9mIHkgJiAiOiBMT05HSU5UOyAiIGFmdGVyIHRlbXBsYXRl DWVsc2UgaWYgcGFyYW1UeXBlID0gNyB0aGVuIC0tIGNTdHJpbmcNcHV0IGl0ZW0gNiBv ZiB5ICYgIjoiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsgIiBhZnRlciB0ZW1wbGF0 ZQ1lbHNlIGlmIGlzT3B0aW9uYWwgdGhlbiAtLSB1c2UgcG9pbnRlciB0byBkYXRhDWlm IHBhcmFtVHlwZSA9IDQgdGhlbiAtLSBmaXhlZCBsZW5ndGgNcHV0IGl0ZW0gMyBvZiB5 IGludG8gZGF0YVR5cGUNaWYgZGF0YVR5cGUgPSAiZW51bSIgdGhlbiAtLSBzcGVjaWFs IGZvciBlbnVtDXB1dCBpdGVtIDEgb2YgeSAmICI6UmVzVHlwZTsgIiBhZnRlciB0ZW1w bGF0ZQ1lbHNlIGlmIGRhdGFUeXBlID0gInRydWUiIHRoZW4gLS0gYWxzbyBzcGVjaWFs IGZvciB0cnVlDXB1dCBpdGVtIDEgb2YgeSAmICI6Qm9vbGVhbjsgIiBhZnRlciB0ZW1w bGF0ZQ1lbHNlDXB1dCBpdGVtIDYgb2YgeSAmICI6IiAmIGl0ZW0gMiBvZiBuYW1lTGlz dCAmICI7ICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVsc2UNcHV0IGl0ZW0gNiBvZiB5 ICYgIjoiIGFmdGVyIHRlbXBsYXRlDWlmIChwYXJhbVR5cGUgPSAwKSB0aGVuDXB1dCAi QUVEZXNjUHRyOyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgLS0gNiwgUFN0cmluZw1wdXQg IlN0cmluZ1B0cjsgIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlmDWVsc2UgLS0g cmVxdWlyZWQNcHV0IGl0ZW0gMSBvZiB5ICYgIjoiIGFmdGVyIHRlbXBsYXRlDWlmIChw YXJhbVR5cGUgPSAwKSB0aGVuIC0tIEFFRGVzYw1wdXQgIkFFRGVzYzsgIiBhZnRlciB0 ZW1wbGF0ZQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDQgdGhlbiAtLSBmaXhlZCBsZW5ndGgN cHV0IGl0ZW0gMSBvZiBuYW1lTGlzdCAmICI7ICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSAt LSBzdHIyNTUNcHV0ICJTdHIyNTU7ICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBp Zg1lbmQgaWYgLS0gdXNlSXQNZW5kIGlmIC0tIHVzZUl0DWVuZCByZXBlYXQNRGVsZXRl IGxhc3QgY2hhciBvZiB0ZW1wbGF0ZSAtLSBzcGFjZSBvciAoDWlmIHBhcmFtSW5kZXgg PiAwIHRoZW4NcHV0ICIpIiBpbnRvIGxhc3QgY2hhciBvZiB0ZW1wbGF0ZSAtLSByZXBs YWNlIDsNZW5kIGlmDXB1dCAiOk9TRXJyOyIgYWZ0ZXIgdGVtcGxhdGUNcmV0dXJuIHRl bXBsYXRlDWVuZCBQYXNjYWxDbGllbnRUZW1wbGF0ZQ0NAAA7NAADAQABBgCfARkA+oAG AAAAAAABAAAADAAAABBDAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb25zdGFudCBuYW1lcyB3aWxsIGJlIGlu IEMuIg1lbmQgTW91c2VXaXRoaW4NDWZ1bmN0aW9uIFNlcnZlclNhbXBsZSBjYXJkVHlw ZQ1pZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1wdXQgIkFFIiAmIFN0cmlwU1AoZmll bGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNZ2xvYmFsIGNsaWVudExhbmcsdmVy Ym9zZQ1pZiB2ZXJib3NlIHRoZW4NcHV0IGZpZWxkICJldmVudENvbW1lbnQiIGludG8g dGVtcA1pZiB0ZW1wIDw+ICIiIHRoZW4NcHV0ICIvKiAiICYgdGVtcCAmICIgKi8iICYg cmV0dXJuICYgcmV0dXJuIGludG8gcHJvY0hlYWRlcg1lbmQgaWYNZW5kIGlmDXB1dCBD VGVtcGxhdGUoKSAmIHJldHVybiBhZnRlciB0ZW1wDXB1dCAiRG8iIGFmdGVyIGNoYXIg NiBvZiB0ZW1wDXB1dCB0ZW1wIGFmdGVyIHByb2NIZWFkZXINcHV0ICJ7IiAmIHJldHVy biBhZnRlciBwcm9jSGVhZGVyDXB1dCBUYWIgJiAiLyogcHV0IHlvdXIgY29kZSBoZXJl ICovIiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCBUYWIgJiAicmV0dXJuIG5v RXJyOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1wdXQgIn0iICYgcmV0dXJuICYg cmV0dXJuIGFmdGVyIHByb2NIZWFkZXINcHV0ICJwYXNjYWwgT1NFcnIgSGFuZGxlIiAm IHByb2NOYW1lIMINJiAiKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFwcGxlRXZlbnQsIGNv bnN0IEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHRoZVJlZkNvbikiICYgcmV0dXJu IGFmdGVyIHByb2NIZWFkZXINcHV0IEdsdWVJbmZvKGZpZWxkICJwYXJhbUluZm8iKSBp bnRvIHBhcmFtSW5mbw1wdXQgbnVtYmVyIG9mIGxpbmVzIG9mIHBhcmFtSW5mbyBpbnRv IGNvdW50DXB1dCAoaXRlbSAzIG9mIHBhcmFtSW5mbyA8PiAibnVsbCIpIGludG8gaXNG dW5jDXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0IFRhYiAmIHR3b1RhYiBpbnRv IHRocmVlVGFiDXB1dCAiIiBpbnRvIGNsZWFuVXBDb2RlDXB1dCAiIiBpbnRvIHB1dFJl c3VsdENvZGUNcHV0ICIiIGludG8gaW5pdENvZGUNcHV0ICJPU0VyciBlcnI7IiAmIHJl dHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAiRGVzY1R5cGUgdHlwZUNvZGU7IiAmIHJl dHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAibG9uZyBhY3R1YWxTaXplOyIgJiByZXR1 cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgVGFiICYgImVyciA9IERvIiAmIHByb2NOYW1l ICYgIigiIGludG8gY2FsbFlvdXJDb2RlDXB1dCAwIGludG8gdG90YWxQYXJhbQ0tLSBp ZiBhIGZ1bmN0aW9uIGdldCB0aGUgcmVzdWx0IGJhY2sNaWYgaXNGdW5jIHRoZW4NYWRk IDEgdG8gdG90YWxQYXJhbQ1wdXQgbGluZSAxIG9mIHBhcmFtSW5mbyBpbnRvIHgNcHV0 IGl0ZW0gNCBvZiB4IGludG8gcGFyYW1UeXBlDXB1dCBOYW1lT2ZEYXRhVHlwZShpdGVt IDMgb2YgeCkgaW50byBuYW1lTGlzdA1wdXQgVGFiICYgImlmICgoKnRoZVJlcGx5KS5k YXRhSGFuZGxlKSIgJiByZXR1cm4gYWZ0ZXIgcHV0UmVzdWx0Q29kZQ1pZiBwYXJhbVR5 cGUgPD0gMSB0aGVuIC0tIHJlc3VsdCBpcyBBRURlc2Mgb3IgSGFuZGxlDXB1dCAiQUVE ZXNjIHRoZVJlc3VsdDsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IFRhYiAm ICJ0aGVSZXN1bHQuZGF0YUhhbmRsZSA9IG5pbDsiICYgcmV0dXJuIGFmdGVyIGluaXRD b2RlDWlmIChwYXJhbVR5cGUgPSAwKSB0aGVuDXB1dCAiJnRoZVJlc3VsdCwiIGFmdGVy IGNhbGxZb3VyQ29kZQ1lbHNlDXB1dCBUYWIgJiAidGhlUmVzdWx0LmRlc2NyaXB0b3JU eXBlID0gIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCDCDSYgIjsiICYgcmV0dXJuIGFmdGVy IGluaXRDb2RlDXB1dCAiJnRoZVJlc3VsdC5kYXRhSGFuZGxlLCIgYWZ0ZXIgY2FsbFlv dXJDb2RlDWVuZCBpZg1wdXQgVGFiICYgIkFFRGlzcG9zZURlc2MoJnRoZVJlc3VsdCk7 IiAmIHJldHVybiBhZnRlciBjbGVhblVwQ29kZQ1wdXQgdHdvVGFiICYgImVyciA9IEFF UHV0S2V5RGVzYyh0aGVSZXBseSwga2V5RGlyZWN0T2JqZWN0LCAmdGhlUmVzdWx0KTsi ICYgcmV0dXJuIGFmdGVyIHB1dFJlc3VsdENvZGUNZWxzZSBpZiAocGFyYW1UeXBlID0g NCkgb3IgKHBhcmFtVHlwZSA9IDYpIHRoZW4gLS0gcmVzdWx0IGlzIG9uIHN0YWNrDWlm IHBhcmFtVHlwZSA9IDQgdGhlbg1wdXQgaXRlbSA1IG9mIG5hbWVMaXN0ICYgIiB0aGVS ZXN1bHQ7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAiJnRoZVJlc3VsdCwi IGFmdGVyIGNhbGxZb3VyQ29kZQ1lbHNlDXB1dCAiU3RyMjU1IHRoZVJlc3VsdDsiICYg cmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0ICIoU3RyaW5nUHRyKSAmdGhlUmVzdWx0 LCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBpZg1wdXQgdHdvVGFiICYgImVyciA9IEFF UHV0S2V5UHRyKHRoZVJlcGx5LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBv ZiBuYW1lTGlzdCAmICIsIChQdHIpICZ0aGVSZXN1bHQiIGFmdGVyIHB1dFJlc3VsdENv ZGUNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1dCAiLCBzaXplb2YoIiAmIGl0ZW0gNSBv ZiBuYW1lTGlzdCAmICIpKTsiICYgcmV0dXJuIGFmdGVyIHB1dFJlc3VsdENvZGUNZWxz ZQ1wdXQgIlsxXSwgdGhlUmVzdWx0WzBdKTsiICYgcmV0dXJuIGFmdGVyIHB1dFJlc3Vs dENvZGUNZW5kIGlmDWVuZCBpZg1lbmQgaWYgLS0gaXNGdW5jDXJlcGVhdCB3aXRoIHBh cmFtSW5kZXggPSAyIHRvIGNvdW50DXB1dCBsaW5lIHBhcmFtSW5kZXggb2YgcGFyYW1J bmZvIGludG8geA1pZiBpdGVtIDMgb2YgeCA8PiAibnVsbCIgdGhlbg1hZGQgMSB0byB0 b3RhbFBhcmFtDXB1dCBpdGVtIDQgb2YgeCBpbnRvIHBhcmFtVHlwZQ1wdXQgKGl0ZW0g NSBvZiB4ID0gIm8iKSBpbnRvIGlzT3B0aW9uYWwNcHV0IE5hbWVPZkRhdGFUeXBlKGl0 ZW0gMyBvZiB4KSBpbnRvIG5hbWVMaXN0DWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgdHdv VGFiIGludG8gaW5kZW50DWVsc2UNcHV0IFRhYiBpbnRvIGluZGVudA1lbmQgaWYNaWYg cGFyYW1UeXBlID0gMCB0aGVuIC0tIEFFRGVzYyBvciBoYW5kbGUNcHV0IGl0ZW0gMSBv ZiB4IGludG8gdGhpc05hbWUNcHV0IFRhYiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxl ID0gbmlsOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUNcHV0IFRhYiAmICJlcnIgPSBB RUdldFBhcmFtRGVzYyh0aGVBcHBsZUV2ZW50LCIgJiBpdGVtIDIgb2YgeCDCDSYgIix0 eXBlV2lsZENhcmQsJiIgJiB0aGlzTmFtZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNaWYgaXNPcHRpb25hbCB0aGVuDXB1dCBpdGVtIDYgb2YgeCBpbnRvIHB0clRo aXNOYW1lDXB1dCAiQUVEZXNjIiAmJiB0aGlzTmFtZSAmICIsIiAmJiAiKiIgJiBwdHJU aGlzTmFtZSAmICI7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCBwdHJUaGlz TmFtZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNcHV0IENPcHRpb25IYW5kbGluZygi JiIgJiB0aGlzTmFtZSwgcHRyVGhpc05hbWUpIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0 ICJBRURlc2MiICYmIHRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xh cmUNcHV0ICImIiAmIHRoaXNOYW1lICYgIiwiIGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQg VGFiICYgImlmIChlcnIpIGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVuZCBpZg1wdXQgVGFiICYgIkFFRGlzcG9zZURlc2MoJiIgJiB0aGlzTmFtZSAm ICIpOyIgJiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNZWxzZSBpZiBwYXJhbVR5cGUg PSAxIHRoZW4gLS0gaGFuZGxlDXB1dCBpdGVtIDEgb2YgeCBpbnRvIHB0clRoaXNOYW1l DXB1dCAiZGVzY0ZvciIgJiBTdHJpcFNQKGl0ZW0gMSBvZiB4KSBpbnRvIHRoaXNOYW1l DXB1dCAiQUVEZXNjIiAmJiB0aGlzTmFtZSAmICI7IiAmIHJldHVybiBhZnRlciB2YXJE ZWNsYXJlDXB1dCBUYWIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSA9IG5pbDsiICYg cmV0dXJuIGFmdGVyIGluaXRDb2RlDXB1dCB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSwi IGFmdGVyIGNhbGxZb3VyQ29kZQ1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IFRhYiAmICJl cnIgPSBBRUdldFBhcmFtRGVzYyh0aGVBcHBsZUV2ZW50LCIgJiBpdGVtIDIgb2YgeCDC DSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYgIiwmIiAmIHRoaXNOYW1lICYgIik7 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgImlmIChlcnIgPT0gZXJy QUVEZXNjTm90Rm91bmQpIiAmIHJldHVybiDCDSYgdHdvVGFiICYgIi8qIG9yIHlvdSBt YXkgcHV0IGluIHlvdXIgZGVmYXVsdCBoZXJlICovOyIgJiByZXR1cm4gwg0mIHRhYiAm ICJlbHNlIGlmIChlcnIpIGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVsc2UNcHV0IFRhYiAmICJlcnIgPSBBRUdldFBhcmFtRGVzYyh0aGVBcHBsZUV2 ZW50LCIgJiBpdGVtIDIgb2YgeCDCDSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYg IiwmIiAmIHRoaXNOYW1lICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg VGFiICYgImlmIChlcnIpIGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVuZCBpZg1wdXQgVGFiICYgIkFFRGlzcG9zZURlc2MoJiIgJiB0aGlzTmFtZSAm ICIpOyIgJiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNZWxzZSBpZiAocGFyYW1UeXBl ID0gNCkgb3IgKHBhcmFtVHlwZSA9IDYpIHRoZW4NaWYgaXRlbSAzIG9mIHggPSAidHJ1 ZSIgdGhlbg1wdXQgIkJvb2xlYW4iICYmIGl0ZW0gMSBvZiB4ICYgIjsiICYgcmV0dXJu IGFmdGVyIHZhckRlY2xhcmUNcHV0IGl0ZW0gMSBvZiB4ICYgIiwiIGFmdGVyIGNhbGxZ b3VyQ29kZQ1wdXQgQ1R5cGVUcnVlQ29kZSh4KSBhZnRlciBwcm9jQm9keQ1lbHNlIGlm IGlzT3B0aW9uYWwgdGhlbg1pZiBpdGVtIDMgb2YgeCA9ICJlbnVtIiB0aGVuDXB1dCAi UmVzVHlwZSIgJiYgaXRlbSAxIG9mIHggJiAiOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVj bGFyZQ1wdXQgaXRlbSAxIG9mIHggJiAiLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDXB1dCBD VHlwZVRydWVDb2RlKHgpIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IGl0ZW0gNiBvZiB4 IGludG8gcHRyVGhpc05hbWUNcHV0IGl0ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNaWYg cGFyYW1UeXBlID0gNCB0aGVuDXB1dCBpdGVtIDUgb2YgbmFtZUxpc3QgJiYgdGhpc05h bWUgJiAiOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgaXRlbSA1IG9mIG5h bWVMaXN0ICYgIiAqIiAmIHB0clRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZh ckRlY2xhcmUNZWxzZQ1wdXQgIlN0cjI1NSAiICYgdGhpc05hbWUgJiAiLCAqIiAmIHB0 clRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNZW5kIGlmDXB1 dCBUYWIgJiAiZXJyID0gQUVHZXRQYXJhbVB0cih0aGVBcHBsZUV2ZW50LCIgJiBpdGVt IDIgb2YgeCDCDSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYgIiwmdHlwZUNvZGUs KFB0cikmIiAmIHRoaXNOYW1lIGFmdGVyIHByb2NCb2R5DWlmIHBhcmFtVHlwZSA9IDQg dGhlbg1wdXQgIixzaXplb2YoIiAmIHRoaXNOYW1lICYgIiksJmFjdHVhbFNpemUpOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IENPcHRpb25IYW5kbGluZygiJiIgJiB0 aGlzTmFtZSwgcHRyVGhpc05hbWUpIGFmdGVyIHByb2NCb2R5DXB1dCBwdHJUaGlzTmFt ZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNZWxzZSAtLSBzdHIyNTUNcHV0ICJbMV0s c2l6ZW9mKCIgJiB0aGlzTmFtZSAmICIpLTEsJmFjdHVhbFNpemUpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJpZiAoIWVycikiICYgcmV0dXJuIGFmdGVy IHByb2NCb2R5DXB1dCB0d29UYWIgJiB0aGlzTmFtZSAmICJbMF0gPSAoY2hhcikgYWN0 dWFsU2l6ZTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCAiKFN0cmluZ1B0cikg IiAmIHB0clRoaXNOYW1lICYgIiwiIGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQgQ09wdGlv bkhhbmRsaW5nKCIoU3RyMjU1ICopICYiICYgdGhpc05hbWUsIHB0clRoaXNOYW1lKSBh ZnRlciBwcm9jQm9keQ1lbmQgaWYNZW5kIGlmDWVsc2UgLS0gcmVxdWlyZWQNcHV0IGl0 ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNcHV0IFRhYiAmICJlcnIgPSBBRUdldFBhcmFt UHRyKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBpdGVtIDQg b2YgbmFtZUxpc3QgJiAiLCZ0eXBlQ29kZSwoUHRyKSYiICYgdGhpc05hbWUgYWZ0ZXIg cHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1dCBpdGVtIDUgb2YgbmFtZUxp c3QgJiYgdGhpc05hbWUgJiAiOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQg IixzaXplb2YoIiAmIHRoaXNOYW1lICYgIiksJmFjdHVhbFNpemUpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNcHV0IGl0ZW0gNiBvZiBuYW1lTGlzdCBpbnRvIGRhdGFTaXpl DWlmIChkYXRhU2l6ZSA8IDApIG9yIChkYXRhU2l6ZSA+IDQpIHRoZW4NcHV0ICImIiBh ZnRlciBjYWxsWW91ckNvZGUNZW5kIGlmDXB1dCB0aGlzTmFtZSAmICIsIiBhZnRlciBj YWxsWW91ckNvZGUNZWxzZQ1wdXQgIihTdHJpbmdQdHIpICYgIiAmIHRoaXNOYW1lICYg IiwiIGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQgIlN0cjI1NSIgJiYgdGhpc05hbWUgJiAi OyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgIlsxXSxzaXplb2YoIiAmIHRo aXNOYW1lICYgIiktMSwmYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgVGFiICYgdGhpc05hbWUgJiAiWzBdID0gKGNoYXIpIGFjdHVhbFNpemU7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJpZiAoZXJyKSBn b3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNZWxzZSBp ZiAocGFyYW1UeXBlID0gNSkgb3IgKHBhcmFtVHlwZSA9IDcpIHRoZW4NcHV0ICJkZXNj Rm9yIiAmIFN0cmlwU1AoaXRlbSAxIG9mIHgpIGludG8gdGhpc05hbWUNcHV0ICJBRURl c2MiICYmIHRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 IFRhYiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlID0gbmlsOyIgJiByZXR1cm4gYWZ0 ZXIgaW5pdENvZGUNcHV0IFRhYiAmICJBRURpc3Bvc2VEZXNjKCYiICYgdGhpc05hbWUg JiAiKTsiICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWlmIGlzT3B0aW9uYWwgdGhl bg1wdXQgInB0clRvIiAmIFN0cmlwU1AoaXRlbSAxIG9mIHgpIGludG8gcHRyVGhpc05h bWUNcHV0IGl0ZW0gMSBvZiB4ICYgIlNpemUiIGludG8gc2l6ZVRoaXNOYW1lDWlmIHBh cmFtVHlwZSA9IDUgdGhlbg1wdXQgIlB0ciIgJiYgcHRyVGhpc05hbWUgJiAiOyIgJiBy ZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgImxvbmciICYmIHNpemVUaGlzTmFtZSAm ICI7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWVsc2UNcHV0IGl0ZW0gNSBvZiBu YW1lTGlzdCAmJiAiKiIgJiBwdHJUaGlzTmFtZSAmICI7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDWVuZCBpZg1wdXQgVGFiICYgImVyciA9IEFFR2V0UGFyYW1EZXNjKHRo ZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFt ZUxpc3QgJiAiLCYiICYgdGhpc05hbWUgJiAiKTsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCBUYWIgJiAiaWYgKGVyciA9PSBlcnJBRURlc2NOb3RGb3VuZCkgeyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmIHB0clRoaXNOYW1lICYgIiA9 IG5pbDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlmIHBhcmFtVHlwZSA9IDUgdGhl bg1wdXQgdHdvVGFiICYgc2l6ZVRoaXNOYW1lICYgIiA9IDA7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbmQgaWYNcHV0IHR3b1RhYiAmICIvKiBvciB5b3UgbWF5IHB1dCBp biB5b3VyIGRlZmF1bHQgaGVyZSAqLyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0 IFRhYiAmICJ9IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgImVsc2Ug eyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmICJpZiAoZXJyKSBn b3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1pZiBwYXJhbVR5cGUg PSA3IHRoZW4gLS0gcHV0IGluIHplcm8gdGVybWluYXRvcg1wdXQgdHdvVGFiICYgImVy ciA9IFB0ckFuZEhhbmQoKFB0cikmZXJyLCAiICYgdGhpc05hbWUgwg0mICIuZGF0YUhh bmRsZSwgMSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgImlm IChlcnIpIGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBp Zg1pZiBwYXJhbVR5cGUgPSA1IHRoZW4NcHV0IHR3b1RhYiAmIHNpemVUaGlzTmFtZSAm ICIgPSBHZXRIYW5kbGVTaXplKCIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSk7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNaWYgaXRlbSAyIG9mIG5hbWVMaXN0 ID0gIlB0ciIgdGhlbg1wdXQgdHdvVGFiICYgcHRyVGhpc05hbWUgJiAiID0gKiIgJiB0 aGlzTmFtZSAmICIuZGF0YUhhbmRsZTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVs c2UNcHV0IHR3b1RhYiAmIHB0clRoaXNOYW1lICYgIiA9IChQdHIpICoiICYgdGhpc05h bWUgwg0mICIuZGF0YUhhbmRsZTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBp Zg1wdXQgdHdvVGFiICYgIkhMb2NrKCIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSk7 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgIn07IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1wdXQgcHRyVGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlvdXJD b2RlDWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1wdXQgc2l6ZVRoaXNOYW1lICYgIiwiIGFm dGVyIGNhbGxZb3VyQ29kZQ1lbmQgaWYNZWxzZQ1wdXQgVGFiICYgImVyciA9IEFFR2V0 UGFyYW1EZXNjKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBp dGVtIDQgb2YgbmFtZUxpc3QgJiAiLCYiICYgdGhpc05hbWUgJiAiKTsiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DXB1dCBUYWIgJiAiaWYgKGVycikgZ290byBDbGVhblVwOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNyB0aGVuIC0tIHB1 dCBpbiB6ZXJvIHRlcm1pbmF0b3INcHV0IFRhYiAmICJlcnIgPSBQdHJBbmRIYW5kKChQ dHIpJmVyciwgIiAmIHRoaXNOYW1lIMINJiAiLmRhdGFIYW5kbGUsIDEpOyIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJpZiAoZXJyKSBnb3RvIENsZWFuVXA7 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJITG9jaygi ICYgdGhpc05hbWUgJiAiLmRhdGFIYW5kbGUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNaWYgaXRlbSAyIG9mIG5hbWVMaXN0ID0gIlB0ciIgdGhlbg1wdXQgIioiICYgdGhp c05hbWUgJiAiLmRhdGFIYW5kbGUsIiBhZnRlciBjYWxsWW91ckNvZGUNZWxzZSBpZiBw YXJhbVR5cGUgPSA3IHRoZW4NcHV0ICIoY2hhciAqKSAqIiAmIHRoaXNOYW1lICYgIi5k YXRhSGFuZGxlLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVsc2UNcHV0ICIoUHRyKSAqIiAm IHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBp Zg1pZiBwYXJhbVR5cGUgPSA1IHRoZW4gLS0gd2UgbmVlZCB0aGUgc2l6ZSB0b28NcHV0 ICJHZXRIYW5kbGVTaXplKCIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSksIiBhZnRl ciBjYWxsWW91ckNvZGUNZW5kIGlmDWVuZCBpZg1lbmQgaWYNZW5kIGlmIC0tIG5vdCBu dWxsDWVuZCByZXBlYXQNaWYgdmVyYm9zZSB0aGVuDXB1dCBUYWIgJiAiLyogV2UgY2hl Y2sgdG8gc2VlIGlmIHdlIG1pc3NlZCBhbnkgcGFyYW1ldGVyIGZyb20gdGhlIGNsaWVu dCAqLyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAiaWYg KEFFU2l6ZU9mQXR0cmlidXRlKHRoZUFwcGxlRXZlbnQsIGtleU1pc3NlZEtleXdvcmRB dHRyLCAiIMINJiAiJnR5cGVDb2RlLCAmYWN0dWFsU2l6ZSkgIT0gZXJyQUVEZXNjTm90 Rm91bmQpIHsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiZXJy ID09IGVyckFFUGFyYW1NaXNzZWQ7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg dHdvVGFiICYgImdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCBUYWIgJiAifTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlmIHRvdGFsUGFyYW0g PiAwIHRoZW4NcHV0ICIpIiBpbnRvIGxhc3QgY2hhciBvZiBjYWxsWW91ckNvZGUNZWxz ZQ1wdXQgIikiIGFmdGVyIGNhbGxZb3VyQ29kZQ1lbmQgaWYNcHV0IGNhbGxZb3VyQ29k ZSAmICI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgImlmIChlcnIp IGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBwdXRSZXN1 bHRDb2RlIGFmdGVyIHByb2NCb2R5DXB1dCAiQ2xlYW5VcDoiICYgcmV0dXJuIGFmdGVy IHByb2NCb2R5DXB1dCBDbGVhblVwQ29kZSAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgdGFiICYgInJldHVybiBlcnI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg In0iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCAieyIgJiByZXR1cm4gaW50byB4 DXJlcGVhdCB3aXRoIGkgPSAxIHRvIG51bWJlciBvZiBsaW5lcyBpbiB2YXJEZWNsYXJl DXB1dCBUYWIgJiBsaW5lIGkgb2YgdmFyRGVjbGFyZSAmIHJldHVybiBhZnRlciB4DWVu ZCByZXBlYXQNcHV0IHggJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1yZXR1cm4gcHJv Y0hlYWRlciAmIGluaXRDb2RlICYgcmV0dXJuICYgcHJvY0JvZHkgJiByZXR1cm4NZWxz ZSBpZiBjYXJkVHlwZSA9ICJpbml0IiB0aGVuDWVsc2UgaWYgY2FyZFR5cGUgPSAiaW5z dGFsbCIgdGhlbg1wdXQgIkFFIiAmIFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGlu dG8gcHJvY05hbWUNcmV0dXJuIFRhYiAmICJBRUluc3RhbGxFdmVudEhhbmRsZXIoJyIg JiBSZXNUeXBlKGZpZWxkICJldmVudENsYXNzIikgwg0mICInLCAnIiAmIFJlc1R5cGUo ZmllbGQgImV2ZW50SUQiKSAmICInLCAoUHJvY1B0cikgJkhhbmRsZSIgJiBwcm9jTmFt ZSDCDSYgIiwgMCwgZmFsc2UpOyIgJiByZXR1cm4NZWxzZQ1yZXR1cm4gIiINZW5kIGlm DWVuZCBTZXJ2ZXJTYW1wbGUNDWZ1bmN0aW9uIENUeXBlVHJ1ZUNvZGUgeA1wdXQgVGFi ICYgImVyciA9IEFFR2V0UGFyYW1QdHIodGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9m IHggJiAiLCAiIGludG8gcHJvY0JvZHkNaWYgaXRlbSAzIG9mIHggPSAidHJ1ZSIgdGhl bg1wdXQgInR5cGVCb29sZWFuLCAmdHlwZUNvZGUsIChQdHIpJiIgJiBpdGVtIDEgb2Yg eCAmICIsMSwgJmFjdHVhbFNpemUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZWxz ZQ1wdXQgInR5cGVFbnVtZXJhdGVkLCAmdHlwZUNvZGUsIChQdHIpJiIgJiBpdGVtIDEg b2YgeCAmICIsc2l6ZW9mKFJlc1R5cGUpLCAmYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJpZiAoZXJyID09IGVyckFFRGVz Y05vdEZvdW5kKSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmIFRhYiAm IGl0ZW0gMSBvZiB4ICYgIiA9ICIgYWZ0ZXIgcHJvY0JvZHkNaWYgaXRlbSAzIG9mIHgg PSAidHJ1ZSIgdGhlbg1wdXQgImZhbHNlOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN ZWxzZQ1wdXQgIihSZXNUeXBlKSAwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5k IGlmDXB1dCBUYWIgJiAiZWxzZSBpZiAoZXJyKSBnb3RvIENsZWFuVXA7IiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1yZXR1cm4gcHJvY0JvZHkNZW5kIENUeXBlVHJ1ZUNvZGUN DWZ1bmN0aW9uIENPcHRpb25IYW5kbGluZyB0aGlzTmFtZSwgcHRyVGhpc05hbWUNcHV0 IFRhYiAmICJpZiAoZXJyID09IGVyckFFRGVzY05vdEZvdW5kKSB7IiAmIHJldHVybiBp bnRvIHByb2NCb2R5DXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0IHR3b1RhYiAm IHB0clRoaXNOYW1lICYgIiA9IG5pbDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCB0d29UYWIgJiAiLyogb3IgeW91IG1heSBwdXQgaW4geW91ciBkZWZhdWx0IGhlcmUg Ki8iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBUYWIgJiAifSIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJlbHNlIHsiICYgcmV0dXJuIGFmdGVyIHBy b2NCb2R5DXB1dCB0d29UYWIgJiAiaWYgKGVycikgZ290byBDbGVhblVwOyIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNiB0aGVuDXB1dCB0d29UYWIg JiBwdHJUaGlzTmFtZSAmICIgPSAiICYgdGhpc05hbWUgJiAiOyIgJiByZXR1cm4gYWZ0 ZXIgcHJvY0JvZHkNZWxzZQ1wdXQgdHdvVGFiICYgcHRyVGhpc05hbWUgJiAiID0gIiAm IHRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQg VGFiICYgIn07IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1yZXR1cm4gcHJvY0JvZHkN ZW5kIENPcHRpb25IYW5kbGluZw0NZnVuY3Rpb24gU2VydmVyQ29uc3QgbmFtZSxjb25z dCxjb21tZW50T3V0DXB1dCAiI2RlZmluZSAiICYgbmFtZSAmJiBjb25zdCBpbnRvIHgN aWYgY29tbWVudE91dCA9ICJ0cnVlIiB0aGVuDXB1dCAiLyogIiAmIHggJiAiICovIiBp bnRvIHgNZW5kIGlmDXJldHVybiB4DWVuZCBTZXJ2ZXJDb25zdA0NZnVuY3Rpb24gU2Vy dmVySW5zdGFsbCBpbnN0YWxsQ29kZQ1yZXR1cm4gcmV0dXJuICYgInZvaWQgSW5zdGFs bEhhbmRsZXJzKCkiICYgcmV0dXJuIMINJiAieyIgJiByZXR1cm4gJiBpbnN0YWxsQ29k ZSAmICJ9IiAmIHJldHVybg1lbmQgU2VydmVySW5zdGFsbA0NZnVuY3Rpb24gQ1RlbXBs YXRlIG11bHRpTGluZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBvciB3aGlj aCBwYXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgR2x1ZUluZm8oZmllbGQgInBh cmFtSW5mbyIpIGludG8gcGFyYW1JbmZvDXB1dCAiT1NFcnIgQUUiICYgU3RyaXBTUChm aWVsZCAiZXZlbnROYW1lIikgJiAiKCIgaW50byB0ZW1wbGF0ZQ1wdXQgbnVtYmVyIG9m IGxpbmVzIGluIHBhcmFtSW5mbyBpbnRvIG4NcHV0IDAgaW50byBwYXJhbUluZGV4DXJl cGVhdCB3aXRoIGluZGV4ID0gMSB0byBuDXNldCBjdXJzb3IgdG8gYnVzeQ1wdXQgbGlu ZSBpbmRleCBvZiBwYXJhbUluZm8gaW50byB5DXB1dCBpdGVtIDQgb2YgeSBpbnRvIHBh cmFtVHlwZQ1wdXQgKGl0ZW0gNSBvZiB5ID0gIm8iKSBpbnRvIGlzT3B0aW9uYWwNcHV0 IChpdGVtIDMgb2YgeSA8PiAibnVsbCIpIGludG8gdXNlSXQNaWYgdXNlSXQgdGhlbg1h ZGQgMSB0byBwYXJhbUluZGV4DWlmIHVzZUl0IHRoZW4NaWYgaW5kZXggPSAxIHRoZW4N cHV0IGZhbHNlIGludG8gaXNPcHRpb25hbA1lbHNlDWlmIG11bHRpTGluZSA9ICJtdWx0 aUxpbmUiIHRoZW4NcHV0IHJldHVybiAmIHNwYWNlIGFmdGVyIHRlbXBsYXRlDWVsc2UN cHV0IHNwYWNlIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1lbmQgaWYNcHV0IE5hbWVPZkRh dGFUeXBlKGl0ZW0gMyBvZiB5KSBpbnRvIG5hbWVMaXN0DXB1dCBpdGVtIDUgb2YgbmFt ZUxpc3QgaW50byB0eXBlTmFtZQ1pZiBwYXJhbVR5cGUgPSAwIHRoZW4NaWYgaW5kZXgg PD4gMSB0aGVuIHB1dCAiY29uc3QgIiBhZnRlciB0ZW1wbGF0ZQ1wdXQgIkFFRGVzYyAq IiBhZnRlciB0ZW1wbGF0ZQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDEgdGhlbiAtLSBoYW5k bGUNcHV0ICJIYW5kbGUgIiBhZnRlciB0ZW1wbGF0ZQ1pZiBpbmRleCA9IDEgdGhlbg1w dXQgIioiIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1lbHNlIGlmIHBhcmFtVHlwZSA9IDQg dGhlbiAtLSBpbW1lZGlhdGUNcHV0IGl0ZW0gMyBvZiB5IGludG8gZGF0YVR5cGUNcHV0 IGl0ZW0gNiBvZiBuYW1lTGlzdCBpbnRvIGRhdGFTaXplDWlmIGRhdGFUeXBlID0gImVu dW0iIHRoZW4NcHV0ICJSZXNUeXBlICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSBpZiBkYXRh VHlwZSA9ICJ0cnVlIiB0aGVuDXB1dCAiQm9vbGVhbiAiIGFmdGVyIHRlbXBsYXRlDWVs c2UgaWYgKGlzT3B0aW9uYWwgb3IgKGRhdGFTaXplIDwgMCkgb3IgKGRhdGFTaXplID4g NCkpIGFuZCAoaW5kZXggPD4gMSkgdGhlbiAtLSBmaXhlZCBsZW5ndGggb3B0aW9uYWwN cHV0ICJjb25zdCAiICYgdHlwZU5hbWUgJiAiICoiIGFmdGVyIHRlbXBsYXRlDWVsc2UN cHV0IHR5cGVOYW1lICYgc3BhY2UgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGluZGV4 ID0gMSB0aGVuDXB1dCAiKiIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVsc2UgaWYgcGFy YW1UeXBlID0gNyB0aGVuDWlmIGluZGV4IDw+IDEgdGhlbiBwdXQgImNvbnN0ICIgYWZ0 ZXIgdGVtcGxhdGUNcHV0IHR5cGVOYW1lICYgIiAqIiBhZnRlciB0ZW1wbGF0ZQ1lbmQg aWYNaWYgKGxhc3QgY2hhciBvZiB0ZW1wbGF0ZSA9ICIqIikgdGhlbg1wdXQgaXRlbSA2 IG9mIHkgJiAiLCAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgKHBhcmFtVHlwZSA9IDUp IHRoZW4gLS0gcHRyICsgc2l6ZQ1wdXQgdHlwZU5hbWUgJiAiICoiICYgaXRlbSA2IG9m IHkgJiAiLCBsb25nICIgJiBpdGVtIDcgb2YgeSAmICIsICIgYWZ0ZXIgdGVtcGxhdGUN ZWxzZSBpZiBwYXJhbVR5cGUgPSA2IHRoZW4NaWYgaW5kZXggPD4gMSB0aGVuIHB1dCAi Y29uc3QgIiBhZnRlciB0ZW1wbGF0ZQ1wdXQgIlN0cmluZ1B0ciAiICYgaXRlbSA2IG9m IHkgJiAiLCAiIGFmdGVyIHRlbXBsYXRlDWVsc2UNcHV0IGl0ZW0gMSBvZiB5ICYgIiwg IiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlmIC0tIHVzZUl0DWVuZCBpZiAtLSB1 c2VJdA1lbmQgcmVwZWF0DWlmIHBhcmFtSW5kZXggPiAwIHRoZW4NRGVsZXRlIGxhc3Qg Y2hhciBvZiB0ZW1wbGF0ZSAtLSBzcGFjZSBvciAoDXB1dCAiKSIgaW50byBsYXN0IGNo YXIgb2YgdGVtcGxhdGUgLS0gcmVwbGFjZSAsDWVsc2UNcHV0ICIpIiBhZnRlciB0ZW1w bGF0ZQ1lbmQgaWYNcmV0dXJuIHRlbXBsYXRlDWVuZCBDVGVtcGxhdGUNDQAAIgAEAgUA 3wADAPEAdgAAAAAAAAAAABUADAUAABAAAAAABewABQEAAQIAAgESAF3ABgAAAAAAAQAA AAwAAAAQYWV0ZSBOYW1lAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBzaG93IHRoZSBldmVudCBieSB1c2luZyB0aGUgZXZlbnQgbmFtZSBhbmQg cGFyYW1ldGVyIG5hbWUuIg1lbmQgTW91c2VXaXRoaW4NDWZ1bmN0aW9uIENsaWVudFRl bXBsYXRlIG11bHRpTGluZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBvciB3 aGljaCBwYXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgc3BhY2UgJiBOdW1Ub0No YXIoMTk0KSAmIHJldHVybiAmIHNwYWNlIGludG8gY29udENoYXINcHV0IGZpZWxkICJl dmVudE5hbWUiIGludG8gdGVtcGxhdGUNcHV0IGZpZWxkICJwYXJhbUluZm8iIGludG8g eA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHggaW50byBuDXB1dCAwIGludG8gcGFyYW1J bmRleA1yZXBlYXQgd2l0aCBpbmRleCA9IDIgdG8gbg1zZXQgY3Vyc29yIHRvIGJ1c3kN cHV0IGxpbmUgaW5kZXggb2YgeCBpbnRvIHkNcHV0IGl0ZW0gNCBvZiB5IGludG8gdGVt cA1wdXQgKHRlbXAgPiAzMjc2NykgaW50byBpc09wdGlvbmFsDXB1dCB0ZW1wIGRpdiA4 MTkyIGludG8gdGVtcA1wdXQgKHRlbXAgbW9kIDIgPSAxKSBpbnRvIGlzRW51bQ1wdXQg IiIgaW50byBlbnVtZXJhdGVkDXB1dCAoaXRlbSAzIG9mIHkgPD4gIm51bGwiKSBpbnRv IHVzZUl0DWlmIHVzZUl0IHRoZW4NYWRkIDEgdG8gcGFyYW1JbmRleA0tLSBmb3IgcHJv dG8gc3RhdGVtZW50DWlmIGl0ZW0gMyBvZiB5ID0gInRydWUiIHRoZW4NcHV0ICJ0cnVl IiBpbnRvIHRoaXNQYXJhbQ1lbHNlIGlmIGluZGV4ID0gMSB0aGVuDXB1dCAiZGlyZWN0 UGFyYW0iIGludG8gdGhpc1BhcmFtDWVsc2UNcHV0ICJwYXJhbSIgaW50byB0aGlzUGFy YW0NZW5kIGlmDWlmIHVzZUl0IHRoZW4NaWYgbXVsdGlMaW5lID0gIm11bHRpTGluZSIg dGhlbg1wdXQgY29udENoYXIgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1wdXQgc3BhY2UgYWZ0 ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgIlsiIGFmdGVy IHRlbXBsYXRlDWVuZCBpZg1pZiBpbmRleCA8PiAxIHRoZW4NcHV0IGl0ZW0gMSBvZiB5 ICYgc3BhY2UgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGlzRW51bSB0aGVuDXB1dCBF bnVtT3B0aW9uKGZpZWxkICJzdWl0ZUNvZGUiLGl0ZW0gMyBvZiB5LGVudW1lcmF0ZWQs MSkgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1wdXQgdGhpc1BhcmFtIGFmdGVyIHRlbXBsYXRl DWVuZCBpZg1pZiBpc09wdGlvbmFsIHRoZW4NcHV0ICJdIiBhZnRlciB0ZW1wbGF0ZQ1l bmQgaWYNZW5kIGlmDWVuZCBpZiAtLSB1c2VJdA1lbmQgcmVwZWF0DXJldHVybiB0ZW1w bGF0ZQ1lbmQgQ2xpZW50VGVtcGxhdGUNDWZ1bmN0aW9uIENsaWVudFNhbXBsZSBjYXJk VHlwZQ1pZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1yZXR1cm4gQ2xpZW50VGVtcGxh dGUoKSAmIHJldHVybiAmIHJldHVybg1lbHNlDXJldHVybiAiIg1lbmQgaWYNZW5kIENs aWVudFNhbXBsZQ0NADHAAAYBAAESAAIBIwBXgAYAAAAAAAEAAAAMAAAAEEh5cGVyVGFs awAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gc2hvdyB0 aGUgZXZlbnQgYXMgaXQgaXMgY2FsbGVkIGZyb20gSHlwZXJUYWxrLiINZW5kIE1vdXNl V2l0aGluDQ1mdW5jdGlvbiBDbGllbnRUZW1wbGF0ZSBtdWx0aUxpbmUNZ2xvYmFsIGNs aWVudEhhc0dsdWUNcHV0IHNwYWNlICYgTnVtVG9DaGFyKDE5NCkgJiByZXR1cm4gJiBz cGFjZSBpbnRvIGNvbnRDaGFyDXB1dCBmaWVsZCAicGFyYW1JbmZvIiBpbnRvIHgNcHV0 IHF1b3RlICYgIi0tLS0iICYgcXVvdGUgaW50byBkYXNoDXB1dCAoaXRlbSAzIG9mIGxp bmUgMSBvZiB4IDw+ICJudWxsIikgaW50byBpc0Z1bmMNcHV0IDAgaW50byBwYXJhbUlu ZGV4DXB1dCBudW1iZXIgb2YgbGluZXMgaW4geCBpbnRvIG4NaWYgY2xpZW50SGFzR2x1 ZSB0aGVuDS0tIGVpdGhlciByZXR1cm4gdGhlIHRlbXBsYXRlIG9yIHdoaWNoIHBhcmFt ZXRlciBpcyBiZWluZyBjbGlja2VkDXB1dCAiQUUiICYgU3RyaXBTUChmaWVsZCAiZXZl bnROYW1lIikgaW50byB0ZW1wbGF0ZQ1pZiBpc0Z1bmMgdGhlbg1wdXQgIiAoIiBhZnRl ciB0ZW1wbGF0ZQ1lbHNlDXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNcHV0 IHRydWUgaW50byBmaXJzdFRpbWUgLS0gbm8gY29tbWEgYmVmb3JlIGZpcnN0IHBhcmFt DXB1dCAxIGludG8gb3B0aW9uRW5kIC0tIHdlIGxvb3AgdHdpY2UsIG9uY2UgZm9yIHJl cXVpcmVkIG9uY2UgZm9yIG9wdGlvbmFsDXB1dCAxIGludG8gZW51bU9wdGlvbkluZGV4 IC0tIHdlIHdhbnQgZnVsbCBuYW1lDWVsc2UgLS0gbm8gZ2x1ZQ1wdXQgIkFFU2VuZCIg JiYgcXVvdGUgJiBSZXNUeXBlKGZpZWxkICJldmVudENsYXNzIikgwg0mIFJlc1R5cGUo ZmllbGQgImV2ZW50SUQiKSAmIHF1b3RlICYgwg0iLCB0YXJnZXRQcm9ncmFtLCBzZW5k TW9kZSwgdGltZU91dFZhbHVlIiBpbnRvIHRlbXBsYXRlDXB1dCBmYWxzZSBpbnRvIGZp cnN0VGltZSAtLSBjb21tYSBiZWZvciBmaXJzdCBwYXJhbQ1wdXQgMCBpbnRvIG9wdGlv bkVuZCAgLS0gd2UganVzdCBsb29wIG9uY2UNcHV0IDIgaW50byBlbnVtT3B0aW9uSW5k ZXggLS0gd2Ugd2FudCA0IGxldHRlciBjb2RlDWVuZCBpZg0tLSB3ZSBsb29wIHRocm91 Z2ggaXQgdHdpY2UsIG9uIHRpbWUgZm9yIHJlcXVpcmVkLCBvbmUgZm9yIG9wdA1yZXBl YXQgd2l0aCBvcHRpb24gPSAwIHRvIG9wdGlvbkVuZA1wdXQgKG9wdGlvbiA9IDEpIGlu dG8gd2FudE9wdGlvbmFsDXJlcGVhdCB3aXRoIGluZGV4ID0gMiB0byBuDXNldCBjdXJz b3IgdG8gYnVzeQ1wdXQgbGluZSBpbmRleCBvZiB4IGludG8geQ1wdXQgaXRlbSA0IG9m IHkgaW50byB0ZW1wDXB1dCAodGVtcCA+IDMyNzY3KSBpbnRvIGlzT3B0aW9uYWwNaWYg KGlzT3B0aW9uYWwgPSB3YW50T3B0aW9uYWwpIG9yIChub3QgY2xpZW50SGFzR2x1ZSkg dGhlbg1wdXQgdGVtcCBkaXYgODE5MiBpbnRvIHRlbXANcHV0ICh0ZW1wIG1vZCAyID0g MSkgaW50byBpc0VudW0NcHV0ICIiIGludG8gZW51bWVyYXRlZA1wdXQgdHJ1ZSBpbnRv IHVzZUl0DWlmIGluZGV4ID0gMiB0aGVuDWlmIGl0ZW0gMyBvZiB5ID0gIm51bGwiIHRo ZW4gcHV0IGZhbHNlIGludG8gdXNlSXQNcHV0ICJkaXJlY3RQYXJhbSIgaW50byBpdGVt IDEgb2YgeQ1wdXQgIi0tLS0iIGludG8gaXRlbSAyIG9mIHkNZW5kIGlmDWlmIHVzZUl0 IHRoZW4NYWRkIDEgdG8gcGFyYW1JbmRleA1pZiB1c2VJdCB0aGVuDWlmIG11bHRpTGlu ZSA9ICJtdWx0aUxpbmUiIHRoZW4NcHV0IGNvbnRDaGFyIGFmdGVyIHRlbXBsYXRlDWVs c2UNcHV0IHNwYWNlIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1pZiBpc09wdGlvbmFsIHRo ZW4NcHV0ICJbIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNaWYgKGluZGV4IDw+IDIpIGFu ZCAod2FudE9wdGlvbmFsIG9yIChOb3QgQ2xpZW50SGFzR2x1ZSkpIHRoZW4NaWYgZmly c3RUaW1lIHRoZW4NcHV0IGZhbHNlIGludG8gZmlyc3RUaW1lDWVsc2UNcHV0ICIsIiBh ZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNaWYgY2xpZW50SGFzR2x1ZSB0aGVuDXB1dCBpdGVt IDEgb2YgeSBpbnRvIHRoaXNLZXkNZWxzZQ1wdXQgSFRLZXlXb3JkKHkpIGludG8gdGhp c0tleQ1lbmQgaWYNcHV0IHF1b3RlICYgdGhpc0tleSAmIHF1b3RlIGFmdGVyIHRlbXBs YXRlDWVuZCBpZg1pZiBmaXJzdFRpbWUgdGhlbg1wdXQgZmFsc2UgaW50byBmaXJzdFRp bWUNZWxzZQ1wdXQgIiwiIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1pZiB3YW50T3B0aW9u YWwgb3IgKE5vdCBDbGllbnRIYXNHbHVlKSB0aGVuDWlmIGl0ZW0gMyBvZiB5ID0gInRy dWUiIHRoZW4NcHV0ICJ0cnVlIiBhZnRlciB0ZW1wbGF0ZQ1lbHNlIGlmIGlzRW51bSB0 aGVuDXB1dCBFbnVtT3B0aW9uKGZpZWxkICJTdWl0ZUNvZGUiLGl0ZW0gMyBvZiB5LGVu dW1lcmF0ZWQsZW51bU9wdGlvbkluZGV4KSBhZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1dCAi c29tZSIgJiBpdGVtIDMgb2YgeSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZWxzZQ1pZiBp c0VudW0gdGhlbg1wdXQgRW51bU9wdGlvbihmaWVsZCAiU3VpdGVDb2RlIixpdGVtIDMg b2YgeSxlbnVtZXJhdGVkLGVudW1PcHRpb25JbmRleCkgYWZ0ZXIgdGVtcGxhdGUNZWxz ZQ1wdXQgaXRlbSAxIG9mIHkgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBpZg1pZiBp c09wdGlvbmFsIHRoZW4NcHV0ICJdIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlm DWVuZCBpZiAtLSB1c2VpdA1lbmQgaWYgLS0gdGhlIHJpZ2h0IGtpbmQgb2Ygb3B0aW9u DWVuZCByZXBlYXQNZW5kIHJlcGVhdA1pZiBpc0Z1bmMgYW5kIGNsaWVudEhhc0dsdWUg dGhlbg1wdXQgIiApIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNcmV0dXJuIHRlbXBsYXRl DWVuZCBDbGllbnRUZW1wbGF0ZQ0NZnVuY3Rpb24gQ2xpZW50U2FtcGxlIGNhcmRUeXBl DWdsb2JhbCBjbGllbnRIYXNHbHVlLCBkZWZhdWx0VGFyZ2V0LCBkZWZhdWx0VGltZU91 dA1pZiBjbGllbnRIYXNHbHVlIHRoZW4NZ2xvYmFsIG5hbWluZ0Zvcm1MaXN0LGVsZW1l bnRMaXN0LGNsYXNzTmFtZUxpc3QNcHV0ICIiIGludG8gcnN0DWlmIGNhcmRUeXBlID0g InN1aXRlIiB0aGVuDXB1dCAiIiBpbnRvIG5hbWluZ0Zvcm1MaXN0DXB1dCAiIiBpbnRv IGVsZW1lbnRMaXN0DXB1dCAiIiBpbnRvIGNsYXNzTmFtZUxpc3QNcHV0ICJlbnVtZXJh dGlvbiBmb3JtIiBpbnRvIHgNaWYgdGhlcmUgaXMgYSBjYXJkIHggdGhlbg1wdXQgZmll bGQgImVudW1JbmZvIiBvZiBjYXJkIHggaW50byBuYW1pbmdGb3JtTGlzdA1lbmQgaWYN ZWxzZSBpZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1wdXQgIkFFIiAmIFN0cmlwU1Ao ZmllbGQgIkV2ZW50TmFtZSIpIGludG8gRXZlbnROYW1lDXB1dCAoaXRlbSAzIG9mIGZp ZWxkICJwYXJhbUluZm8iIDw+ICJudWxsIikgaW50byBpc0Z1bmMNaWYgaXNGdW5jIHRo ZW4NcHV0ICJGdW5jdGlvbiIgaW50byBoZWFkZXINZWxzZQ1wdXQgIk9uIiBpbnRvIGhl YWRlcg1lbmQgaWYNcHV0IHNwYWNlICYgRXZlbnROYW1lIGFmdGVyIGhlYWRlcg1wdXQg c3BhY2UgJiBOdW1Ub0NoYXIoMTk0KSAmIHJldHVybiBpbnRvIGNvbnQNcHV0ICIgIHB1 dCAiICYgcXVvdGUgJiAiQUVTZW5kICIgJiBxdW90ZSAmICIgJiBxdW90ZSAmICIgJiBx dW90ZSAmIFJlc1R5cGUoZmllbGQgImV2ZW50Q2xhc3MiKSAmIFJlc1R5cGUoZmllbGQg ImV2ZW50SUQiKSAmIHF1b3RlICYgIiAmIHF1b3RlICYgIiAmIHF1b3RlICYgIiwiICYg cXVvdGUgJiBjb250IGFmdGVyIHNlbmRIZWFkZXINcHV0ICIgICYgcXVvdGUgJiAiICYg cXVvdGUgJiBkZWZhdWx0VGFyZ2V0ICYgcXVvdGUgJiAiICYgcXVvdGUgJiAiICYgcXVv dGUgJiAiLCIgJiBxdW90ZSAmIGNvbnQgYWZ0ZXIgc2VuZEhlYWRlcg1wdXQgIiAgJiAi ICYgcXVvdGUgYWZ0ZXIgc2VuZEhlYWRlcg1wdXQgIiAgQUVTZW5kICIgJiBxdW90ZSAm IFJlc1R5cGUoZmllbGQgImV2ZW50Q2xhc3MiKSAmIFJlc1R5cGUoZmllbGQgImV2ZW50 SUQiKSAmIHF1b3RlICYgIiwiIMINJiBxdW90ZSAmIGRlZmF1bHRUYXJnZXQgJiBxdW90 ZSAmICIsIiBpbnRvIHNob3J0SGVhZGVyDWlmIGlzRnVuYyB0aGVuDXB1dCAiMywiIGFm dGVyIHNlbmRIZWFkZXINcHV0ICIzLCIgYWZ0ZXIgc2hvcnRIZWFkZXINZWxzZQ1wdXQg IjEsIiBhZnRlciBzZW5kSGVhZGVyDXB1dCAiMSwiIGFmdGVyIHNob3J0SGVhZGVyDWVu ZCBpZg1wdXQgZGVmYXVsdFRpbWVPdXQgJiBxdW90ZSBhZnRlciBzZW5kSGVhZGVyDXB1 dCBkZWZhdWx0VGltZU91dCBhZnRlciBzaG9ydEhlYWRlcg1wdXQgbGluZSAyIG9mIGZp ZWxkICJwYXJhbUluZm8iIGludG8geA1wdXQgKGl0ZW0gMyBvZiB4IDw+ICJudWxsIikg aW50byBoYXNEaXJlY3QNcHV0IChpdGVtIDQgb2YgeCA+IDMyNzY3KSBpbnRvIGRpcmVj dE9wdGlvbmFsDXB1dCAxIGludG8gcGFyYW1JbmRleA1wdXQgZmFsc2UgaW50byBoYXNP cHRpb25hbA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkICJwYXJhbUluZm8iIGlu dG8gY291bnQNcmVwZWF0IHdpdGggaW5kZXggPSAyIHRvIGNvdW50DXB1dCBsaW5lIGlu ZGV4IG9mIGZpZWxkICJwYXJhbUluZm8iIGludG8geA1wdXQgaXRlbSA0IG9mIHggaW50 byB0ZW1wDXB1dCAodGVtcCA+IDMyNzY3KSBpbnRvIGlzT3B0aW9uYWwNaWYgaXRlbSAz IG9mIHggPD4gIm51bGwiIHRoZW4NaWYgaXNPcHRpb25hbCB0aGVuDWlmIGluZGV4IDw+ IDIgdGhlbg1wdXQgdHJ1ZSBpbnRvIGhhc09wdGlvbmFsDWVuZCBpZg1lbHNlDXB1dCB0 ZW1wIGRpdiA4MTkyIGludG8gdGVtcA1wdXQgKHRlbXAgbW9kIDIpID0gMSBpbnRvIGlz RW51bQ1pZiBpbmRleCA9IDIgdGhlbg0tLSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGRp cmVjdCBwYXJhbWV0ZXINaWYgcGFyYW1JbmRleCA9IDEgdGhlbg1wdXQgIiAiIGFmdGVy IGhlYWRlcg1lbHNlDXB1dCAiLCIgYWZ0ZXIgaGVhZGVyDWVuZCBpZg1wdXQgImRpcmVj dFBhcmFtIiBhZnRlciBoZWFkZXINcHV0ICItLS0tIiBpbnRvIGl0ZW0gMiBvZiB4DXB1 dCBIVEtleVdvcmQoeCkgaW50byB0aGlzVHlwZQ1pZiBsZW5ndGgodGhpc1R5cGUpID4g NCB0aGVuDS0tIHdlIG5lZWQgYSBrZXl3b3JkIGZvciBkaXJlY3RQYXJhbSBiZWNhdXNl IHRoZXJlIGlzIGEgdHlwZQ1wdXQgIiAmICIgJiBxdW90ZSAmICIsIiAmIHF1b3RlICYg IiAmIHF1b3RlICYgIiAmIHF1b3RlICYgdGhpc1R5cGUgJiBxdW90ZSAmICIgJiBxdW90 ZSAiIGFmdGVyIHNlbmRIZWFkZXINcHV0ICIsIiAmIHF1b3RlICYgdGhpc1R5cGUgJiBx dW90ZSBhZnRlciBzaG9ydEhlYWRlcg1pZiBjaGFyIDUgdG8gOCBvZiB0aGlzVHlwZSA9 ICJlbnVtIiB0aGVuDXB1dCBFbnVtTGluZXMoMSxpdGVtIDMgb2YgeCwgImRpcmVjdFBh cmFtIiwgdHJ1ZSkgYWZ0ZXIgcnN0DWVuZCBpZg1lbmQgaWYNcHV0ICIgJiAiICYgcXVv dGUgJiAiLGRpcmVjdFBhcmFtIiAmIHF1b3RlIGFmdGVyIHNlbmRIZWFkZXINcHV0ICIs ZGlyZWN0UGFyYW0iIGFmdGVyIHNob3J0SGVhZGVyDWFkZCAxIHRvIHBhcmFtSW5kZXgN ZWxzZQ1wdXQgU3RyaXBTUChpdGVtIDEgb2YgeCkgaW50byB0ZW1wDWlmIHBhcmFtSW5k ZXggPSAxIHRoZW4NcHV0ICIgIiBhZnRlciBoZWFkZXINZWxzZQ1wdXQgIiwiIGFmdGVy IGhlYWRlcg1lbmQgaWYNcHV0IHRlbXAgYWZ0ZXIgaGVhZGVyDS0tIHB1dCBpbiB0aGUg a2V5d29yZA1wdXQgSFRLZXlXb3JkKHgpIGludG8gdGhpc1R5cGUNcHV0ICIgJiAiICYg cXVvdGUgJiAiLCIgJiBxdW90ZSAmICIgJiBxdW90ZSAmICIgJiBxdW90ZSAmIHRoaXNU eXBlICYgcXVvdGUgJiAiICYgcXVvdGUgJiAiICYgcXVvdGUgJiAiLCIgJiB0ZW1wICYg cXVvdGUgYWZ0ZXIgc2VuZEhlYWRlcg1wdXQgIiwiICYgcXVvdGUgJiB0aGlzVHlwZSAm IHF1b3RlICYgIiwiICYgdGVtcCBhZnRlciBzaG9ydEhlYWRlcg1pZiBjaGFyIDUgdG8g OCBvZiB0aGlzVHlwZSA9ICJlbnVtIiB0aGVuDXB1dCBFbnVtTGluZXMoMSxpdGVtIDMg b2YgeCwgdGVtcCwgdHJ1ZSkgYWZ0ZXIgcnN0DWVuZCBpZg1hZGQgMSB0byBwYXJhbUlu ZGV4DWVuZCBpZg1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQgLS0gMiB0byBuDWlmICho YXNPcHRpb25hbCkgb3IgKGhhc0RpcmVjdCBhbmQgZGlyZWN0T3B0aW9uYWwpIHRoZW4g LS0gbm90IGFsbCBwYXJhbSBhcmUgcmVxdWlyZWQNcHV0IGhlYWRlciAmIHJldHVybiAm IHNlbmRIZWFkZXIgJiAiIGFmdGVyIHN0bXQiICYgcmV0dXJuIGJlZm9yZSByc3QNaWYg aGFzRGlyZWN0IGFuZCBkaXJlY3RPcHRpb25hbCB0aGVuDXB1dCAiICBwdXQgIiAmIHBh cmFtSW5kZXggJiAiIGludG8gaSIgJiByZXR1cm4gYWZ0ZXIgcnN0DS0tIHdlIGhhdmUg YSBvcHRpb25hbCBkaXJlY3QgcGFyYW1ldGVyDXB1dCAiICBpZiAodGhlIFBhcmFtQ291 bnQiIGFmdGVyIHJzdA1pZiBwYXJhbUluZGV4ID4gMSB0aGVuIHB1dCBzcGFjZSAmICIt ICIgJiBwYXJhbUluZGV4LTEgYWZ0ZXIgcnN0DXB1dCAiKSBtb2QgMiA9IDEgdGhlbiIg JiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCBsaW5lIDIgb2YgZmllbGQgInBhcmFtSW5mbyIg aW50byB4DXB1dCAiLS0tLSIgaW50byBpdGVtIDIgb2YgeA1wdXQgSFRLZXlXb3JkKHgp IGludG8gdGhpc1R5cGUNcHV0IGZhbHNlIGludG8gcGFyYW1Jc1VwIC0tIHdlIGhhdmUg bm90IHB1dCBQYXJhbSB1cCB5ZXQNaWYgKHBhcmFtSW5kZXggPiAxKSBvciAobGVuZ3Ro KHRoaXNUeXBlKSA+IDQpIHRoZW4NLS0gd2UgaGF2ZSB0byBmYWtlIGEga2V5d29yZA1w dXQgIiAgICBwdXQgIiAmIHF1b3RlICYgIiwiICYgcXVvdGUgJiAiICYgcXVvdGUgJiAi ICYgcXVvdGUgJiB0aGlzVHlwZSAmIHF1b3RlICYgIiAmIHF1b3RlIGFmdGVyIHN0bXQi ICYgcmV0dXJuIGFmdGVyIHJzdA1pZiBjaGFyIDUgdG8gOCBvZiB0aGlzVHlwZSA9ICJl bnVtIiB0aGVuDXB1dCBFbnVtTGluZXMoMiwgaXRlbSAzIG9mIHgsICJQYXJhbShpKSIs IGZhbHNlKSBpbnRvIHRlbXANaWYgdGVtcCA8PiAiIiB0aGVuDXB1dCAiICAgIHB1dCAi ICYgcXVvdGUgJiAiLCIgJiBxdW90ZSAmICIgYWZ0ZXIgc3RtdCIgJiByZXR1cm4gYWZ0 ZXIgcnN0DXB1dCAiICAgIGVsc2UiIGludG8gbGFzdCBsaW5lIG9mIHRlbXANcHV0ICIg ICAgICBwdXQgIiAmIHF1b3RlICYgIlBhcmFtKCIgJiBxdW90ZSAmICIgJiBpICYgIiAm IHF1b3RlICYgIikiICYgcXVvdGUgJiAiIGFmdGVyIHN0bXQiICYgcmV0dXJuIGFmdGVy IHRlbXANcHV0ICIgICAgZW5kIGlmIiAmIHJldHVybiBhZnRlciB0ZW1wDXB1dCB0ZW1w IGFmdGVyIHJzdA1wdXQgdHJ1ZSBpbnRvIHBhcmFtSXNVcCAtLSBub3cgd2UgaGF2ZSBw dXQgUGFyYW0gdXANZW5kIGlmDWVuZCBpZg1lbmQgaWYNaWYgbm90IHBhcmFtSXNVcCB0 aGVuDXB1dCAiICAgIHB1dCAiICYgcXVvdGUgJiAiLFBhcmFtKCIgJiBxdW90ZSAmICIg JiBpICYgIiAmIHF1b3RlICYgIikiICYgcXVvdGUgJiAiIGFmdGVyIHN0bXQiICYgcmV0 dXJuIGFmdGVyIHJzdA1lbmQgaWYNaWYgaGFzT3B0aW9uYWwgdGhlbg0tLSBpbmNyZW1l bnQgaSBpZiB3ZSBuZWVkIGl0IGxhdGVyDXB1dCAiICAgIGFkZCAxIHRvIGkiICYgcmV0 dXJuIGFmdGVyIHJzdA1lbmQgaWYNcHV0ICIgIGVuZCBpZiIgJiByZXR1cm4gYWZ0ZXIg cnN0DWVsc2UgaWYgaGFzT3B0aW9uYWwgdGhlbg1wdXQgIiAgcHV0ICIgJiBwYXJhbUlu ZGV4ICYgIiBpbnRvIGkiICYgcmV0dXJuIGFmdGVyIHJzdA1lbmQgaWYNcHV0IHRydWUg aW50byBmaXJzdE9wdGlvbmFsDWlmIGhhc09wdGlvbmFsIHRoZW4NcHV0ICIgIHJlcGVh dCB1bnRpbCBpID4gdGhlIFBhcmFtQ291bnQiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQg IiAgICBwdXQgcGFyYW0oaSkgaW50byB4IiAmIHJldHVybiBhZnRlciByc3QNcHV0ICIg ICAgcHV0ICIgJiBxdW90ZSAmICIsIiAmIHF1b3RlICYgIiBhZnRlciBzdG10IiAmIHJl dHVybiBhZnRlciByc3QNcHV0IGZhbHNlIGludG8gaGFzRW51bQ1yZXBlYXQgd2l0aCBp ID0gMyB0byBjb3VudA1wdXQgbGluZSBpIG9mIGZpZWxkICJwYXJhbUluZm8iIGludG8g eA1wdXQgaXRlbSA0IG9mIHggaW50byB0ZW1wDXB1dCAodGVtcCA+IDMyNzY3KSBpbnRv IGlzT3B0aW9uYWwNaWYgaXNPcHRpb25hbCB0aGVuDWlmIGZpcnN0T3B0aW9uYWwgdGhl bg1wdXQgIiAgICAiIGFmdGVyIHJzdA1wdXQgZmFsc2UgaW50byBmaXJzdE9wdGlvbmFs DWVsc2UNcHV0ICIgICAgZWxzZSAiIGFmdGVyIHJzdA1lbmQgaWYNcHV0IEhUS2V5V29y ZCh4KSBpbnRvIHRoaXNLZXkNcHV0IGl0ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNcHV0 IFN0cmlwU1AodGhpc05hbWUpIGludG8gbm9TcE5hbWUNcHV0IChjaGFyIDUgdG8gOCBv ZiB0aGlzS2V5ID0gImVudW0iKSBpbnRvIGlzRW51bQ1wdXQgImlmIHggPSAiICYgcXVv dGUgJiB0aGlzTmFtZSAmIHF1b3RlIGFmdGVyIHJzdA1pZiB0aGlzTmFtZSA8PiBub1Nw TmFtZSB0aGVuDXB1dCAiIG9yIHggPSAiICYgcXVvdGUgJiBub1NwTmFtZSAmIHF1b3Rl IGFmdGVyIHJzdA1lbmQgaWYNaWYgaXNFbnVtIGFuZCAoaXRlbSAyIG9mIHggPD4gbm9T cE5hbWUpIHRoZW4NcHV0ICIgb3IgeCA9ICIgJiBxdW90ZSAmIGl0ZW0gMiBvZiB4ICYg cXVvdGUgYWZ0ZXIgcnN0DWVuZCBpZg1wdXQgIiB0aGVuIiAmIHJldHVybiBhZnRlciBy c3QNcHV0ICIgICAgICBwdXQgcXVvdGUgJiAiICYgcXVvdGUgJiB0aGlzS2V5ICYgcXVv dGUgJiAiICYgcXVvdGUgJiAiICYgcXVvdGUgJiAiLCIgJiBxdW90ZSAmICIgYWZ0ZXIg c3RtdCIgJiByZXR1cm4gYWZ0ZXIgcnN0DWlmIGlzRW51bSB0aGVuDXB1dCB0cnVlIGlu dG8gaGFzRW51bQ1wdXQgRW51bUxpbmVzKDMsIGl0ZW0gMyBvZiB4LCAieCIsIGZhbHNl KSBpbnRvIHRlbXANaWYgdGVtcCA8PiAiIiB0aGVuDXB1dCAiICAgICAgcHV0IHBhcmFt KGkrMSkgaW50byB4IiAmIHJldHVybiBhZnRlciByc3QNcHV0IHRlbXAgYWZ0ZXIgcnN0 DWVuZCBpZg1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQNcHV0ICIgICAgZWxzZSIgJiBy ZXR1cm4gYWZ0ZXIgcnN0DXB1dCAiICAgICAgcHV0ICIgJiBxdW90ZSAmICJQYXJhbSgi ICYgcXVvdGUgJiAiICYgaSAmICIgJiBxdW90ZSAmICIpLCIgJiBxdW90ZSAmICIgYWZ0 ZXIgc3RtdCIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCAiICAgIGVuZCBpZiIgJiByZXR1 cm4gYWZ0ZXIgcnN0DWlmIGhhc0VudW0gdGhlbg1wdXQgIiAgICBpZiBsYXN0IGNoYXIg b2Ygc3RtdCA9ICIgJiBxdW90ZSAmICIsIiAmIHF1b3RlICYgIiB0aGVuIiAmIHJldHVy biBhZnRlciByc3QNcHV0ICIgICAgICBwdXQgIiAmIHF1b3RlICYgIlBhcmFtKCIgJiBx dW90ZSAmICIgJiBpKzEgJiAiICYgcXVvdGUgJiAiKSIgJiBxdW90ZSAmICIgYWZ0ZXIg c3RtdCIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCAiICAgIGVuZCBpZiIgJiByZXR1cm4g YWZ0ZXIgcnN0DWVsc2UNcHV0ICIgICAgcHV0ICIgJiBxdW90ZSAmICJQYXJhbSgiICYg cXVvdGUgJiAiICYgaSsxICYgIiAmIHF1b3RlICYgIikiICYgcXVvdGUgJiAiIGFmdGVy IHN0bXQiICYgcmV0dXJuIGFmdGVyIHJzdA1lbmQgaWYNcHV0ICIgICAgYWRkIDIgdG8g aSIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCAiICBlbmQgcmVwZWF0IiAmIHJldHVybiBh ZnRlciByc3QNZW5kIGlmDXB1dCAiICBkbyBzdG10IiAmIHJldHVybiBhZnRlciByc3QN ZWxzZSAtLSBhbGwgYXJlIHJlcXVpcmVkDXB1dCBoZWFkZXIgJiByZXR1cm4gYmVmb3Jl IHJzdA1wdXQgc2hvcnRIZWFkZXIgJiByZXR1cm4gYWZ0ZXIgcnN0DWVuZCBpZg1pZiBp c0Z1bmMgdGhlbg1wdXQgIiAgcmV0dXJuIGl0IiAmIHJldHVybiBhZnRlciByc3QNZW5k IGlmDXB1dCAiRW5kICIgJiBFdmVudE5hbWUgJiByZXR1cm4gJiByZXR1cm4gYWZ0ZXIg cnN0DXJldHVybiByc3QNZWxzZSBpZiBjYXJkVHlwZSA9ICJjbGFzcyIgdGhlbg1wdXQg ZmllbGQgY2xhc3NJRCAmICIsIiAmIGZpZWxkICJjbGFzc05hbWUiICYgcmV0dXJuIGFm dGVyIGNsYXNzTmFtZUxpc3QNcHV0IGZpZWxkICJlbGVtZW50cyIgaW50byB4DXB1dCBu dW1iZXIgb2YgbGluZXMgaW4geCBpbnRvIGVsZW1lbnRDb3VudA0tLSB3ZSB3YW50IGEg dW5pcXVlIGxpc3Qgb2YgY2xhc3MgLSBpbmRleCBmb3JtIHBhaXINcmVwZWF0IHdpdGgg ZWxlbWVudEluZGV4ID0gMSB0byBlbGVtZW50Q291bnQNcHV0IGxpbmUgZWxlbWVudElu ZGV4IG9mIHggaW50byB0aGlzTGluZQ1wdXQgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXNM aW5lIGludG8gaUNvdW50DXJlcGVhdCB3aXRoIGkgPSAyIHRvIGlDb3VudA1wdXQgaXRl bSAxIG9mIHRoaXNMaW5lICYgIiwiICYgaXRlbSBpIG9mIHRoaXNMaW5lIGludG8gdGhp c0Zvcm0NcHV0IG51bWJlciBvZiBsaW5lcyBpbiBlbGVtZW50TGlzdCBpbnRvIGpDb3Vu dA1yZXBlYXQgd2l0aCBqID0gMSB0byBqQ291bnQNaWYgdGhpc0Zvcm0gPSBsaW5lIGog b2YgZWxlbWVudExpc3QgdGhlbg1kZWxldGUgbGluZSBqIG9mIGVsZW1lbnRMaXN0DWVu ZCBpZg1lbmQgcmVwZWF0DXB1dCB0aGlzRm9ybSAmIHJldHVybiBhZnRlciBlbGVtZW50 TGlzdA1lbmQgcmVwZWF0DWVuZCByZXBlYXQNcmV0dXJuICIiDWVsc2UgaWYgY2FyZFR5 cGUgPSAic3VpdGVFbmQiIHRoZW4NLS0gd2UgY3JlYXRlIHRoZSBnbHVlIHJvdXRpbmUg Zm9yIHRoZSBvYmplY3Qgc3BlY2lmaWVycw1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGVs ZW1lbnRMaXN0IGludG8gZWxlbWVudENvdW50DXB1dCBudW1iZXIgb2YgbGluZXMgaW4g bmFtaW5nRm9ybUxpc3QgaW50byBuYW1lQ291bnQNcHV0IG51bWJlciBvZiBsaW5lcyBp biBjbGFzc05hbWVMaXN0IGludG8gY2xhc3NDb3VudA1yZXBlYXQgd2l0aCBpID0gMSB0 byBlbGVtZW50Q291bnQNcHV0IGxpbmUgaSBvZiBlbGVtZW50TGlzdCBpbnRvIHgNcHV0 IGl0ZW0gMSBvZiB4IGludG8gY2xhc3NJRA1wdXQgaXRlbSAyIG9mIHggaW50byBuYW1l Rm9ybQ0tLSB3ZSBsb29rIGZvciB0aGUgbmFtaW5nIGZvcm0gbmFtZQ1yZXBlYXQgd2l0 aCBqID0gMSB0byBuYW1lQ291bnQNaWYgbmFtZUZvcm0gPSBpdGVtIDIgb2YgbGluZSBq IG9mIG5hbWluZ0Zvcm1MaXN0IHRoZW4NLS0gd2UgbG9vayBmb3IgdGhlIGNsYXNzIG5h bWUNcmVwZWF0IHdpdGggayA9IDEgdG8gY2xhc3NDb3VudA1pZiBjbGFzc0lEID0gaXRl bSAxIG9mIGxpbmUgayBvZiBjbGFzc05hbWVMaXN0IHRoZW4NcHV0IGl0ZW0gMiBvZiBs aW5lIGsgb2YgY2xhc3NOYW1lTGlzdCAmIGl0ZW0gMSBvZiBsaW5lIGogb2YgbmFtaW5n Rm9ybUxpc3QgaW50byB0aGlzTmFtZQ1wdXQgImZ1bmN0aW9uICIgJiB0aGlzTmFtZSAm ICIsZGF0YSxjb250YWluZXIiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgIiAgcmV0dXJu IE9ialNwZWMgKCIgJiBxdW90ZSAmIFJlc1R5cGUoaXRlbSAxIG9mIHgpICYgcXVvdGUg JiAiLCAiIGFmdGVyIHJzdA1wdXQgcXVvdGUgJiBSZXNUeXBlKGl0ZW0gMiBvZiBsaW5l IGogb2YgbmFtaW5nRm9ybUxpc3QpICYgcXVvdGUgJiAiLCBkYXRhLCBjb250YWluZXIp IiAmIHJldHVybiBhZnRlciByc3QNcHV0ICJlbmQgIiAmIHRoaXNOYW1lICYgcmV0dXJu ICYgcmV0dXJuIGFmdGVyIHJzdA1lbmQgaWYNZW5kIHJlcGVhdA1lbmQgaWYNZW5kIHJl cGVhdA1lbmQgcmVwZWF0DXJldHVybiByc3QNZWxzZQ1yZXR1cm4gIiINZW5kIGlmDWVs c2UNaWYgY2FyZFR5cGUgPSAiZXZlbnQiIHRoZW4NcmV0dXJuIENsaWVudFRlbXBsYXRl KCkgJiByZXR1cm4gJiByZXR1cm4NZWxzZQ1yZXR1cm4gIiINZW5kIGlmDWVuZCBpZg1l bmQgQ2xpZW50U2FtcGxlDQ1mdW5jdGlvbiBFbnVtTGluZXMgaW5kZW50LCBlbnVtQ29k ZSwgdmFyTmFtZSwgd3JpdGVUb1Zhcg1yZXBlYXQgaW5kZW50IHRpbWVzDXB1dCAiICAi IGFmdGVyIGluZGVudFNwYWNlDWVuZCByZXBlYXQNcHV0ICIiIGludG8gcnN0DXB1dCAi ZW51bWVyYXRpb24iICYmIGVudW1Db2RlIGludG8geA1pZiB0aGVyZSBpcyBhIGNhcmQg eCB0aGVuDXB1dCBmaWVsZCAiZW51bUluZm8iIG9mIGNhcmQgeCBpbnRvIHgNcHV0IG51 bWJlciBvZiBsaW5lcyBpbiB4IGludG8gbg1pZiBuID4gMCB0aGVuDS0tIG5vdyB3ZSBn byB0aHJvdWdoIHRoZSBlbnVtIGxpc3QgYW5kIGNoZWNrIGVhY2ggb25lDXJlcGVhdCB3 aXRoIGkgPSAxIHRvIG4NaWYgaSA9IDEgdGhlbg1wdXQgaW5kZW50U3BhY2UgJiAiaWYi IGFmdGVyIHJzdA1lbHNlDXB1dCBpbmRlbnRTcGFjZSAmICJlbHNlIGlmIiBhZnRlciBy c3QNZW5kIGlmDXB1dCBzcGFjZSAmIHZhck5hbWUgJiAiID0gIiAmIHF1b3RlICYgaXRl bSAxIG9mIGxpbmUgaSBvZiB4ICYgcXVvdGUgJiAiIHRoZW4iICYgcmV0dXJuIGFmdGVy IHJzdA1pZiB3cml0ZVRvVmFyIHRoZW4NcHV0IGluZGVudFNwYWNlICYgIiAgcHV0ICIg JiBxdW90ZSAmIFJlc1R5cGUoaXRlbSAyIG9mIGxpbmUgaSBvZiB4KSAmIHF1b3RlICYg IiBpbnRvICIgJiB2YXJOYW1lICYgcmV0dXJuIGFmdGVyIHJzdA1lbHNlDXB1dCBpbmRl bnRTcGFjZSAmICIgIHB1dCBxdW90ZSAmICIgJiBxdW90ZSAmIFJlc1R5cGUoaXRlbSAy IG9mIGxpbmUgaSBvZiB4KSAmIHF1b3RlICYgIiAmIHF1b3RlIGFmdGVyIHN0bXQiICYg cmV0dXJuIGFmdGVyIHJzdA1lbmQgaWYNZW5kIHJlcGVhdA1wdXQgaW5kZW50U3BhY2Ug JiAiZW5kIGlmIiAmIHJldHVybiBhZnRlciByc3QNZW5kIGlmIC0tIGlmIG4gPiAwDWVu ZCBpZiAtLSBpZiBjYXJkIGV4aXN0cw1yZXR1cm4gcnN0DWVuZCBFbnVtTGluZXMNDQAL 8AAHAQABIwACATMAWoAGAAAAAAABAAAADAAAABBNUFcgU2hlbGwAAG9uIE1vdXNlV2l0 aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIHNob3cgdGhlIGV2ZW50IGFzIGl0 IGlzIGNhbGxlZCBmcm9tIHRoZSBNUFcgU2hlbGwgTGFuZ3VhZ2UgdXNpbmcgdGhlIFNl bmRBRSBjb21tYW5kLiINZW5kIE1vdXNlV2l0aGluDQ1mdW5jdGlvbiBDbGllbnRUZW1w bGF0ZSBtdWx0aUxpbmUNZ2xvYmFsIGNsaWVudEhhc0dsdWUNcHV0IHNwYWNlICYgTnVt VG9DaGFyKDE5NCkgJiByZXR1cm4gJiBzcGFjZSBpbnRvIGNvbnRDaGFyDWlmIGNsaWVu dEhhc0dsdWUgdGhlbg1wdXQgIkFFIiAmIFN0cmlwU1AoZmllbGQgImV2ZW50TmFtZSIp IGludG8gdGVtcGxhdGUNZWxzZQ1wdXQgInNlbmRBRSAtZSAnIiAmIFJlc1R5cGUoZmll bGQgImV2ZW50Q2xhc3MiKSAmIFJlc1R5cGUoZmllbGQgImV2ZW50SUQiKSAmICInIiBp bnRvIHRlbXBsYXRlDWVuZCBpZg1wdXQgZmllbGQgInBhcmFtSW5mbyIgaW50byB4DS0t IGlmIGlzIGZ1bmN0aW9uIHRoZW4gV2FpdFJlcGx5IGVsc2Ugbm9SZXBseQ1pZiBpdGVt IDMgb2YgbGluZSAxIG9mIHggPSAibnVsbCIgdGhlbg1wdXQgIiAtbSAxIiBhZnRlciB0 ZW1wbGF0ZQ1lbHNlDXB1dCAiIC1tIDMiIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1wdXQg bnVtYmVyIG9mIGxpbmVzIGluIHggaW50byBuDXB1dCAwIGludG8gcGFyYW1JbmRleA1y ZXBlYXQgd2l0aCBpbmRleCA9IDIgdG8gbg1zZXQgY3Vyc29yIHRvIGJ1c3kNcHV0IGxp bmUgaW5kZXggb2YgeCBpbnRvIHkNcHV0IGl0ZW0gNCBvZiB5IGludG8gdGVtcA1wdXQg KHRlbXAgPiAzMjc2NykgaW50byBpc09wdGlvbmFsDXB1dCB0ZW1wIGRpdiA4MTkyIGlu dG8gdGVtcA1wdXQgKHRlbXAgbW9kIDIgPSAxKSBpbnRvIGlzRW51bQ1wdXQgIiIgaW50 byBlbnVtZXJhdGVkDXB1dCB0cnVlIGludG8gdXNlSXQNaWYgaW5kZXggPSAyIHRoZW4N aWYgaXRlbSAzIG9mIHkgPSAibnVsbCIgdGhlbiBwdXQgZmFsc2UgaW50byB1c2VJdA1w dXQgZGlyZWN0UGFyYW0gaW50byBpdGVtIDEgb2YgeQ1pZiAobm90IGNsaWVudEhhc0ds dWUgb3IgaXNPcHRpb25hbCkgdGhlbg1wdXQgIi0tLS0iIGludG8gaXRlbSAyIG9mIHkN ZW5kIGlmDWVuZCBpZg1pZiB1c2VJdCB0aGVuDWFkZCAxIHRvIHBhcmFtSW5kZXgNaWYg dXNlSXQgdGhlbg1pZiBtdWx0aUxpbmUgPSAibXVsdGlMaW5lIiB0aGVuDXB1dCBjb250 Q2hhciBhZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1l bmQgaWYNaWYgaXNPcHRpb25hbCB0aGVuDXB1dCAiWyIgYWZ0ZXIgdGVtcGxhdGUNZW5k IGlmDWlmIGlzRW51bSB0aGVuDXB1dCBNUFdLZXkoaXRlbSAyIG9mIHksImVudW0iKSBh ZnRlciB0ZW1wbGF0ZQ1wdXQgc3BhY2UgJiBFbnVtT3B0aW9uKGZpZWxkICJTdWl0ZUNv ZGUiLGl0ZW0gMyBvZiB5LGVudW1lcmF0ZWQsMikgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1w dXQgTVBXS2V5KGl0ZW0gMiBvZiB5LGl0ZW0gMyBvZiB5KSBhZnRlciB0ZW1wbGF0ZQ1w dXQgc3BhY2UgJiBTdHJpcFNQKGl0ZW0gMSBvZiB5KSBhZnRlciB0ZW1wbGF0ZQ1lbmQg aWYNaWYgaXNPcHRpb25hbCB0aGVuDXB1dCAiXSIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlm DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVhdA1yZXR1cm4gdGVtcGxhdGUNZW5kIENsaWVu dFRlbXBsYXRlDQ1mdW5jdGlvbiBNUFdLZXkga2V5LGRhdGFUeXBlDWlmIGtleSA9ICIi IHRoZW4NcmV0dXJuICIiDWVsc2UNcHV0IFJlc1R5cGUoa2V5KSBpbnRvIHgNaWYgKGRh dGFUeXBlIDw+ICJsaXN0IikgYW5kIChkYXRhVHlwZSA8PiAib2JqIikgdGhlbg1wdXQg UmVzVHlwZShkYXRhVHlwZSkgYWZ0ZXIgeA1lbmQgaWYNaWYgb2Zmc2V0KHNwYWNlLCB4 KSA+IDAgdGhlbg1wdXQgIiciICYgeCAmICInIiBpbnRvIHgNZW5kIGlmDXJldHVybiAi LSIgJiB4DWVuZCBpZg1lbmQgTVBXS2V5DQ1mdW5jdGlvbiBDbGllbnRTYW1wbGUgY2Fy ZFR5cGUNZ2xvYmFsIGNsaWVudEhhc0dsdWUNaWYgY2xpZW50SGFzR2x1ZSBhbmQgKGNh cmRUeXBlID0gImV2ZW50IikgdGhlbg1wdXQgImFsaWFzIEFFIiAmIFN0cmlwU1AoZmll bGQgImV2ZW50TmFtZSIpIMINJiYgIlNlbmRBRSAtZSAnIiAmIFJlc1R5cGUoZmllbGQg ImV2ZW50Q2xhc3MiKSDCDSYgUmVzVHlwZSAoZmllbGQgImV2ZW50SUQiKSAmICInIiBp bnRvIHJzdA1nZXQgY2FyZCBmaWVsZCAic2VuZFRhcmdldCIgb2YgY2FyZCAiUHJlZmVy ZW5jZSINaWYgaXQgPD4gIiIgdGhlbg1wdXQgIiAtdCAnIiAmIGl0ICYgIiciIGFmdGVy IHJzdA1lbmQgaWYNaWYgKGl0ZW0gMyBvZiBmaWVsZCAicGFyYW1JbmZvIiA8PiAibnVs bCIpIHRoZW4NcHV0ICIgLW0gMyIgYWZ0ZXIgcnN0DWVsc2UNcHV0ICIgLW0gMSIgYWZ0 ZXIgcnN0DWVuZCBpZg1wdXQgbGluZSAyIG9mIGZpZWxkICJwYXJhbUluZm8iIGludG8g eQ1wdXQgaXRlbSA0IG9mIHkgaW50byB0ZW1wDWlmICh0ZW1wIDw9IDMyNzY3KSBhbmQg KGl0ZW0gMyBvZiB5IDw+ICJudWxsIikgdGhlbg0tLSB3ZSBoYXZlIGEgcmVxdWlyZWQg ZGlyZWN0IHBhcmFtZXRlcg1wdXQgdGVtcCBkaXYgODE5MiBpbnRvIHRlbXANaWYgKHRl bXAgbW9kIDIgPSAxKSB0aGVuDXB1dCAiZW51bSIgaW50byB0aGlzVHlwZQ1lbHNlDXB1 dCBSZXNUeXBlKGl0ZW0gMyBvZiB5KSBpbnRvIHRoaXNUeXBlDWVuZCBpZg1pZiAodGhp c1R5cGUgPSAib2JqICIpIG9yICh0aGlzVHlwZSA9ICJsaXN0IikgdGhlbg1wdXQgIiAt LS0tLSIgYWZ0ZXIgcnN0DWVsc2UgaWYgY2hhciA0IG9mIHRoaXNUeXBlID0gc3BhY2Ug dGhlbg1wdXQgIiAtLS0tLSciICYgdGhpc1R5cGUgJiAiJyIgYWZ0ZXIgcnN0DWVsc2UN cHV0ICIgLS0tLS0iICYgdGhpc1R5cGUgYWZ0ZXIgcnN0DWVuZCBpZg1lbmQgaWYNcmV0 dXJuIHJzdCAmIHJldHVybiAmIHJldHVybg1lbHNlDWlmIGNhcmRUeXBlID0gZXZlbnQg dGhlbg1yZXR1cm4gQ2xpZW50VGVtcGxhdGUoKSAmIHJldHVybiAmIHJldHVybg1lbHNl DXJldHVybiAiIg1lbmQgaWYNZW5kIGlmDWVuZCBDbGllbnRTYW1wbGUNDQ0AAADSAAgB AADyAR8BBQHhoAUAAAAAAAEAAAAMAAAAEFNvcnQgRXZlbnRzIGJ5IE5hbWUAAG9uIE1v dXNlV2l0aGluDVNob3dCYWxsb29uICJDbGlja2luZyBoZXJlIGluZGljYXRlcyB3aGV0 aGVyIGV2ZW50cyBiZSBpbiB0aGUgYWN0dWFsIG9yZGVyIG9yIGluIGFscGhhYmV0aWNh bCBvcmRlciB3aGVuIGltcG9ydGluZyBhbiAnYWV0ZScuIg1lbmQgTW91c2VXaXRoaW4N AAI0AAkBgAE6AAMBTQBzoAUAAAAAAAEAAAAMAAAAEFNjcmlwdCBXcml0aW5nAABvbiBt b3VzZVVwDWlmIGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiBpZCA5IHRoZW4NcHV0ICJTY3Jp cHQiIGludG8gdGhpc1ZlcmINZWxzZQ1wdXQgIlNlbmQiIGludG8gdGhpc1ZlcmINZW5k IGlmDWdldCBzaG9ydCBuYW1lIG9mIGNhcmQgYnV0dG9uIGlkIDQxIG9mIGNhcmQgIlNl bmRBRSINcHV0IHRoaXNWZXJiIGludG8gZmlyc3Qgd29yZCBvZiBpdA1zZXQgbmFtZSBv ZiBjYXJkIGJ1dHRvbiBpZCA0MSBvZiBjYXJkICJTZW5kQUUiIHRvIGl0DWdldCBzaG9y dCBuYW1lIG9mIGJrZ25kIGJ1dHRvbiBpZCA0NyBvZiBjYXJkIDEgb2YgYmtnbmQgIkV2 ZW50cyINcHV0IHRoaXNWZXJiIGludG8gZmlyc3Qgd29yZCBvZiBpdA1zZXQgbmFtZSBv ZiBia2duZCBidXR0b24gaWQgNDcgb2YgY2FyZCAxIG9mIGJrZ25kICJFdmVudHMiIHRv IGl0DS0tcHV0IHRoaXNWZXJiIGludG8gd29yZCAxIG9mIHRoZSBuYW1lIG9mIGJrZ25k IGJ1dHRvbiBpZCA0NyBvZiBjYXJkIDEgb2YgYmtnbmQgIkV2ZW50cyINZW5kIG1vdXNl VXAAAAF0AAoBAAEaAJ8BLQD6gAYAAAAAAAEAAAAMAAAAEEFzc2VtYmxlcgAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gaW5kaWNhdGUgdGhhdCB0 aGUgY29uc3RhbnQgbmFtZXMgd2lsbCBiZSBpbiBhc3NlbWJsZXIuIg1lbmQgTW91c2VX aXRoaW4NDWZ1bmN0aW9uIFNlcnZlclNhbXBsZSBjYXJkVHlwZQ1yZXR1cm4gIiINZW5k IFNlcnZlclNhbXBsZQ0NZnVuY3Rpb24gU2VydmVyQ29uc3QgbmFtZSxjb25zdCxjb21t ZW50T3V0DXB1dCBuYW1lICYgIiBFUVUgIiAmIGNvbnN0IGludG8geA1pZiBjb21tZW50 T3V0ID0gInRydWUiIHRoZW4NcHV0ICI7ICIgYmVmb3JlIHgNZW5kIGlmDXJldHVybiB4 DWVuZCBTZXJ2ZXJDb25zdA0NAACUAAsCBQBoALYAeQElAAAAAAAA//8AFQAMAQAAEAAA b24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSB0aW1lb3V0IHZhbHVl IHRvIGJlIHVzZWQgaW4gUEFTQ0FMIGNsaWVudCBzYW1wbGUgY29kZSBoZXJlLiINZW5k IE1vdXNlV2l0aGluDQA17AANAQABMwACAUMAQoAGAAAAAAABAAAADAAAABBQYXNjYWwA AG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIHNob3cgdGhl IGV2ZW50IGFzIGl0IGlzIGNhbGxlZCBmcm9tIFBBU0NBTC4iDWVuZCBNb3VzZVdpdGhp bg0NZnVuY3Rpb24gQ2xpZW50VGVtcGxhdGUgbXVsdGlMaW5lDS0tIGVpdGhlciByZXR1 cm4gdGhlIHRlbXBsYXRlIG9yIHdoaWNoIHBhcmFtZXRlciBpcyBiZWluZyBjbGlja2Vk DXB1dCBHbHVlSW5mbyhmaWVsZCAicGFyYW1JbmZvIikgaW50byBwYXJhbUluZm8NcHV0 ICJGdW5jdGlvbiBBRSIgJiBTdHJpcFNQKGZpZWxkICJldmVudE5hbWUiKSAmICIoIiBp bnRvIHRlbXBsYXRlDXB1dCBudW1iZXIgb2YgbGluZXMgaW4gcGFyYW1JbmZvIGludG8g bg1wdXQgMCBpbnRvIHBhcmFtSW5kZXgNcmVwZWF0IHdpdGggaW5kZXggPSAxIHRvIG4N c2V0IGN1cnNvciB0byBidXN5DXB1dCBsaW5lIGluZGV4IG9mIHBhcmFtSW5mbyBpbnRv IHkNcHV0IGl0ZW0gNCBvZiB5IGludG8gcGFyYW1UeXBlDXB1dCAoaXRlbSA1IG9mIHkg PSAibyIpIGludG8gaXNPcHRpb25hbA1wdXQgKGl0ZW0gMyBvZiB5IDw+ICJudWxsIikg aW50byB1c2VJdA1pZiB1c2VJdCB0aGVuDWFkZCAxIHRvIHBhcmFtSW5kZXgNaWYgdXNl SXQgdGhlbg1pZiBpbmRleCA9IDEgdGhlbg1wdXQgIlZBUiAiIGFmdGVyIHRlbXBsYXRl DXB1dCBmYWxzZSBpbnRvIGlzT3B0aW9uYWwNZWxzZQ1pZiBtdWx0aUxpbmUgPSAibXVs dGlMaW5lIiB0aGVuDXB1dCByZXR1cm4gJiBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbHNl DXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlmDXB1dCBOYW1lT2ZE YXRhVHlwZShpdGVtIDMgb2YgeSkgaW50byBuYW1lTGlzdA1pZiBwYXJhbVR5cGUgPSAx IHRoZW4gLS0gaGFuZGxlDXB1dCBpdGVtIDEgb2YgeSAmICI6IiAmIGl0ZW0gMyBvZiBu YW1lTGlzdCAmICI7ICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSBpZiBwYXJhbVR5cGUgPSA1 IHRoZW4gLS0gcHRyICsgc2l6ZQ1wdXQgaXRlbSA2IG9mIHkgJiAiOiIgJiBpdGVtIDIg b2YgbmFtZUxpc3QgJiAiOyAiIMINJiBpdGVtIDcgb2YgeSAmICI6IExPTkdJTlQ7ICIg YWZ0ZXIgdGVtcGxhdGUNZWxzZSBpZiBwYXJhbVR5cGUgPSA3IHRoZW4gLS0gY1N0cmlu Zw1wdXQgaXRlbSA2IG9mIHkgJiAiOiIgJiBpdGVtIDIgb2YgbmFtZUxpc3QgJiAiOyAi IGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgaXNPcHRpb25hbCB0aGVuIC0tIHVzZSBwb2lu dGVyIHRvIGRhdGENaWYgcGFyYW1UeXBlID0gNCB0aGVuIC0tIGZpeGVkIGxlbmd0aA1w dXQgaXRlbSAzIG9mIHkgaW50byBkYXRhVHlwZQ1pZiBkYXRhVHlwZSA9ICJlbnVtIiB0 aGVuIC0tIHNwZWNpYWwgZm9yIGVudW0NcHV0IGl0ZW0gMSBvZiB5ICYgIjpSZXNUeXBl OyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgZGF0YVR5cGUgPSAidHJ1ZSIgdGhlbiAt LSBhbHNvIHNwZWNpYWwgZm9yIHRydWUNcHV0IGl0ZW0gMSBvZiB5ICYgIjpCb29sZWFu OyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UNcHV0IGl0ZW0gNiBvZiB5ICYgIjoiICYgaXRl bSAyIG9mIG5hbWVMaXN0ICYgIjsgIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZWxzZQ1w dXQgaXRlbSA2IG9mIHkgJiAiOiIgYWZ0ZXIgdGVtcGxhdGUNaWYgKHBhcmFtVHlwZSA9 IDApIHRoZW4NcHV0ICJBRURlc2NQdHI7ICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSAtLSA2 LCBQU3RyaW5nDXB1dCAiU3RyaW5nUHRyOyAiIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1l bmQgaWYNZWxzZSAtLSByZXF1aXJlZA1wdXQgaXRlbSAxIG9mIHkgJiAiOiIgYWZ0ZXIg dGVtcGxhdGUNaWYgKHBhcmFtVHlwZSA9IDApIHRoZW4gLS0gQUVEZXNjDXB1dCAiQUVE ZXNjOyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgcGFyYW1UeXBlID0gNCB0aGVuIC0t IGZpeGVkIGxlbmd0aA1wdXQgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsgIiBhZnRlciB0 ZW1wbGF0ZQ1lbHNlIC0tIHN0cjI1NQ1wdXQgIlN0cjI1NTsgIiBhZnRlciB0ZW1wbGF0 ZQ1lbmQgaWYNZW5kIGlmDWVuZCBpZiAtLSB1c2VJdA1lbmQgaWYgLS0gdXNlSXQNZW5k IHJlcGVhdA1EZWxldGUgbGFzdCBjaGFyIG9mIHRlbXBsYXRlIC0tIHNwYWNlIG9yICgN aWYgcGFyYW1JbmRleCA+IDAgdGhlbg1wdXQgIikiIGludG8gbGFzdCBjaGFyIG9mIHRl bXBsYXRlIC0tIHJlcGxhY2UgOw1lbmQgaWYNcHV0ICI6T1NFcnI7IiBhZnRlciB0ZW1w bGF0ZQ1yZXR1cm4gdGVtcGxhdGUNZW5kIENsaWVudFRlbXBsYXRlDQ1mdW5jdGlvbiBD bGllbnRTYW1wbGUgY2FyZFR5cGUNZ2xvYmFsIGRlZmF1bHRUYXJnZXREZXNjLCBkZWZh dWx0VGltZU91dCwgZGVmYXVsdElkbGVQcm9jLCBkZWZhdWx0QUVGaWx0ZXIsIGRlZmF1 bHRTZW5kTW9kZSwgZGVmYXVsdFRhcmdldA1pZiBjYXJkVHlwZSA9ICJpbml0IiB0aGVu DXB1dCAiUFJPQ0VEVVJFIElnbm9yZU9TRXJyKGVycjpPU0Vycik7IElOTElORSAkNTQ4 RjsgeyBhZGRxICMyLHNwIH0gIiAmIHJldHVybiAmIHJldHVybiBpbnRvIHJzdA1pZiBk ZWZhdWx0VGFyZ2V0RGVzYyBpcyBlbXB0eSBvciBkZWZhdWx0VGFyZ2V0RGVzYyA9ICJz ZWxmIiB0aGVuDWlmIGRlZmF1bHRUYXJnZXREZXNjIGlzIGVtcHR5IHRoZW4NcHV0ICJ0 YXJnZXREZXNjIiBpbnRvIGRlZmF1bHRUYXJnZXREZXNjDWVuZCBpZg1wdXQgIlBST0NF RFVSRSBUYXJnZXRJbml0OyIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCBUYWIgJiBUYWIg aW50byB0d29UYWINcHV0IFRhYiAmIHR3b1RhYiBpbnRvIHRocmVlVGFiDXB1dCBUYWIg JiB0aHJlZVRhYiBpbnRvIGZvdXJUYWINaWYgZGVmYXVsdFRhcmdldCA9ICJzZWxmIiB0 aGVuDS0tIHNlbmQgdG8gc2VsZg1wdXQgVGFiICYgIlZBUiBteVBTTjogUHJvY2Vzc1Nl cmlhbE51bWJlcjsiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgVGFiICYgIkJFR0lOIiAm IHJldHVybiBhZnRlciByc3QNcHV0IFRhYiAmICJXSVRIIG15UFNOIERPIiAmIHJldHVy biBhZnRlciByc3QNcHV0IHR3b1RhYiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIgcnN0 DXB1dCB0d29UYWIgJiAiaGlnaExvbmdPZlBTTiA6PSAwOyIgJiByZXR1cm4gYWZ0ZXIg cnN0DXB1dCB0d29UYWIgJiAibG93TG9uZ09mUFNOIDo9IGtDdXJyZW50UHJvY2Vzczsi ICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgdHdvVGFiICYgIkVORDsiICYgcmV0dXJuIGFm dGVyIHJzdA1wdXQgVGFiICYgIklnbm9yZU9TRXJyKEFFQ3JlYXRlRGVzYyhUeXBlUHJv Y2Vzc1NlcmlhbE51bWJlciwgQG15UFNOLCBTaXplT2YoUHJvY2Vzc1NlcmlhbE51bWJl ciksIHRhcmdldERlc2MpKTsiICYgcmV0dXJuIGFmdGVyIHJzdA1lbHNlIGlmIGRlZmF1 bHRUYXJnZXQgPD4gIiIgdGhlbg0tLSBzZW5kIHRvIHRhcmdldCBuYW1lDXB1dCBUYWIg JiAiVkFSIHRhcmdldE5hbWU6IFN0cjI1NTsiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQg VGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciByc3QNcHV0IFRhYiAmICJ0YXJnZXRO YW1lIDo9ICciICYgZGVmYXVsdFRhcmdldCAmICInOyIgJiByZXR1cm4gYWZ0ZXIgcnN0 DXB1dCBUYWIgJiAiSWdub3JlT1NFcnIoQUVDb2VyY2VQdHIoVHlwZUNoYXIsIEB0YXJn ZXROYW1lWzFdLCAiICYgTGVuZ3RoKGRlZmF1bHRUYXJnZXQpICYgIiwgdHlwZVRhcmdl dElELCB0YXJnZXREZXNjKSk7IiAmIHJldHVybiBhZnRlciByc3QNZWxzZQ0tLSB1c2Ug UFBDIEJyb3dzZXINcHV0IFRhYiAmICJWQVIiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQg dHdvVGFiICYgInRoZUxvY2F0aW9uOiBMb2NhdGlvbk5hbWVSZWM7IiAmIHJldHVybiBh ZnRlciByc3QNcHV0IHR3b1RhYiAmICJ0aGVQb3J0SW5mbzogUG9ydEluZm9SZWM7IiAm IHJldHVybiBhZnRlciByc3QNcHV0IHR3b1RhYiAmICJhVGFyZ2V0SUQ6IFRhcmdldElE OyIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCBUYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFm dGVyIHJzdA1wdXQgVGFiICYgIklGIFBQQ0Jyb3dzZXIoJycsICcnLCBGQUxTRSwgdGhl TG9jYXRpb24sIHRoZVBvcnRJbmZvLCBOSUwsICcnKSA9IE5vRXJyIFRIRU4iICYgcmV0 dXJuIGFmdGVyIHJzdA1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBy c3QNcHV0IHR3b1RhYiAmICJXSVRIIGFUYXJnZXRJRCBETyIgJiByZXR1cm4gYWZ0ZXIg cnN0DXB1dCB0aHJlZVRhYiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCB0 aHJlZVRhYiAmICJsb2NhdGlvbiA6PSB0aGVMb2NhdGlvbjsiICYgcmV0dXJuIGFmdGVy IHJzdA1wdXQgdGhyZWVUYWIgJiAibmFtZSA6PSB0aGVQb3J0SW5mby5uYW1lOyIgJiBy ZXR1cm4gYWZ0ZXIgcnN0DXB1dCB0aHJlZVRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRl ciByc3QNcHV0IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRUNyZWF0ZURlc2ModHlwZVRh cmdldElELCBAYVRhcmdldElELCBTaXplT2YodGFyZ2V0SUQpLCB0YXJnZXREZXNjKSk7 IiAmIHJldHVybiBhZnRlciByc3QNcHV0IHR3b1RhYiAmICJFTkQ7IiAmIHJldHVybiBh ZnRlciByc3QNZW5kIGlmDXB1dCBUYWIgJiAiRU5EOyIgJiByZXR1cm4gJiByZXR1cm4g YWZ0ZXIgcnN0DWVuZCBpZg1pZiBkZWZhdWx0SWRsZVByb2MgaXMgZW1wdHkgdGhlbg1w dXQgIk5JTCIgaW50byBkZWZhdWx0SWRsZVByb2MNZWxzZQ1wdXQgIkAiIGJlZm9yZSBk ZWZhdWx0SWRsZVByb2MNZW5kIGlmDWlmIGRlZmF1bHRBRUZpbHRlciBpcyBlbXB0eSB0 aGVuDXB1dCAiTklMIiBpbnRvIGRlZmF1bHRBRUZpbHRlcg1lbHNlDXB1dCAiQCIgYmVm b3JlIGRlZmF1bHRBRUZpbHRlcg1lbmQgaWYNaWYgZGVmYXVsdFRpbWVPdXQgaXMgZW1w dHkgdGhlbg1wdXQgImtBRURlZmF1bHRUaW1lT3V0IiBpbnRvIGRlZmF1bHRUaW1lT3V0 DWVuZCBpZg1yZXR1cm4gcnN0DWVsc2UgaWYgY2FyZFR5cGUgPSAiZXZlbnQiIHRoZW4N cHV0IENsaWVudFRlbXBsYXRlKCkgJiByZXR1cm4gJiByZXR1cm4gaW50byBwcm9jSGVh ZGVyDXB1dCBHbHVlSW5mbyhmaWVsZCAicGFyYW1JbmZvIikgaW50byBwYXJhbUluZm8N cHV0IG51bWJlciBvZiBsaW5lcyBvZiBwYXJhbUluZm8gaW50byBjb3VudA1wdXQgIkFF IiAmIFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNcHV0IChp dGVtIDMgb2YgcGFyYW1JbmZvIDw+ICJudWxsIikgaW50byBpc0Z1bmMNcHV0IHRhYiAm IHRhYiBpbnRvIHR3b1RhYg1wdXQgdGFiICYgdHdvVGFiIGludG8gdGhyZWVUYWINcHV0 ICJ0aGVBcHBsZUV2ZW50IDogQXBwbGVFdmVudDsiICYgcmV0dXJuIGFmdGVyIHZhckRl Y2xhcmUNcHV0ICJ0aGVSZXBseSA6IEFwcGxlRXZlbnQ7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCBUYWIgJiAiUFJPQ0VEVVJFIENsZWFuVXA7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1wdXQgdHdvVGFiICYgIklnbm9yZU9TRXJyKEFFRGlzcG9zZURlc2ModGhl QXBwbGVFdmVudCkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAm ICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKHRoZVJlcGx5KSk7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkVORDsiICYgcmV0dXJuICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DXB1dCBUYWIgJiAiUFJPQ0VEVVJFIEZhaWxFcnIoZXJyOk9T RXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiQkVHSU4i ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiSUYgZXJyIDw+IE5P RXJyIFRIRU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0aHJlZVRhYiAmICJC RUdJTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHRocmVlVGFiICYgcHJvY05h bWUgJiAiIDo9IGVycjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0aHJlZVRh YiAmICJDbGVhblVwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHRocmVlVGFi ICYgIkV4aXQoIiAmIHByb2NOYW1lICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgdGhyZWVUYWIgJiAiRU5EOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0 IHR3b1RhYiAmICJFTkQ7IiAmIHJldHVybiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYg InRoZUFwcGxlRXZlbnQuZGF0YUhhbmRsZSA6PSBOSUw7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1wdXQgVGFiICYgInRoZVJlcGx5LmRhdGFIYW5kbGUgOj0gTklMOyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJGYWlsRXJyKEFFQ3JlYXRlQXBw bGVFdmVudCgnIiAmIFJlc1R5cGUoZmllbGQgIkV2ZW50Q2xhc3MiKSDCDSYgIicsICci ICYgUmVzVHlwZShmaWVsZCAiRXZlbnRJRCIpICYgIicsICIgJiBkZWZhdWx0VGFyZ2V0 RGVzYyDCDSYgIiwga0F1dG9HZW5lcmF0ZVJldHVybklELCBrQW55VHJhbnNhY3Rpb25J RCwgdGhlQXBwbGVFdmVudCkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcmVwZWF0 IHdpdGggcGFyYW1JbmRleCA9IDIgdG8gY291bnQNcHV0IGxpbmUgcGFyYW1JbmRleCBv ZiBwYXJhbUluZm8gaW50byB4DWlmIGl0ZW0gMyBvZiB4IDw+ICJudWxsIiB0aGVuDXB1 dCBpdGVtIDQgb2YgeCBpbnRvIHBhcmFtVHlwZQ1wdXQgKGl0ZW0gNSBvZiB4ID0gIm8i KSBpbnRvIGlzT3B0aW9uYWwNcHV0IE5hbWVPZkRhdGFUeXBlKGl0ZW0gMyBvZiB4KSBp bnRvIG5hbWVMaXN0DWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgdHdvVGFiIGludG8gaW5k ZW50DWVsc2UNcHV0IFRhYiBpbnRvIGluZGVudA1lbmQgaWYNcHV0IFN0cmlwU3AoaXRl bSAxIG9mIHgpIGludG8gdGhpc05hbWUNaWYgKHBhcmFtVHlwZSA9IDApIG9yIChwYXJh bVR5cGUgPSAyKSB0aGVuIC0tIEFFRGVzYw1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IFRh YiAmICJJRiAiICYgaXRlbSA2IG9mIHggJiAiIDw+IE5JTCBUSEVOIiAmIHJldHVybiBp bnRvIHRlbXANcHV0IHRlbXAgYWZ0ZXIgcHJvY0JvZHkNLS1JRiBwYXJhbVR5cGUgPSAy IHRoZW4NLS0gIHB1dCBUYWIgJiB0ZW1wIGJlZm9yZSBsaW5lIDUgb2YgcHJvY0JvZHkN LS1lbmQgaWYNcHV0IGluZGVudCAmICJGYWlsRXJyKEFFUHV0S2V5RGVzYyh0aGVBcHBs ZUV2ZW50LCIgJiBpdGVtIDIgb2YgeCAmICIsIiAmIGl0ZW0gNiBvZiB4ICYgIl4pKTsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DS0taWYgcGFyYW1UeXBlID0gMiB0aGVuDS0t ICBwdXQgdGhyZWVUYWIgJiAiSWdub3JlT1NFcnIoQUVEaXNwb3NlRGVzYygiICYgaXRl bSA2IG9mIHggJiAiXikpOyIgJiByZXR1cm4gYmVmb3JlIGxpbmUgNiBvZiBwcm9jQm9k eQ0tLWVuZCBpZg1lbHNlDXB1dCBpbmRlbnQgJiAiRmFpbEVycihBRVB1dEtleURlc2Mo dGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9mIHggJiAiLCIgJiBpdGVtIDEgb2YgeCAm ICIpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DS0taWYgcGFyYW1UeXBlID0gMiB0 aGVuDS0tICBwdXQgVHdvVGFiICYgIklnbm9yZU9TRXJyKEFFRGlzcG9zZURlc2MoIiAm IGl0ZW0gMSBvZiB4ICYgIikpOyIgJiByZXR1cm4gYmVmb3JlIGxpbmUgNSBvZiBwcm9j Qm9keQ0tLWVuZCBpZg1lbmQgaWYNZWxzZSBpZiAocGFyYW1UeXBlID0gMSkgb3IgKHBh cmFtVHlwZSA9IDMpIHRoZW4gLS0gaGFuZGxlDXB1dCAiZGVzY0ZvciIgJiBTdHJpcFNw KGl0ZW0gMSBvZiB4KSBpbnRvIGRlc2NGb3JUaGlzTmFtZQ1pZiBpc09wdGlvbmFsIHRo ZW4NcHV0IFRhYiAmICJJRiAiICYgaXRlbSAxIG9mIHggJiAiIDw+IE5JTCBUSEVOIiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgaW5kZW50ICYgIkJFR0lOIiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IGRlc2NGb3JUaGlzTmFtZSAmICIgOiBB RURlc2M7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCBpbmRlbnQgJiAiV0lU SCIgJiYgZGVzY0ZvclRoaXNOYW1lICYmICJETyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IGluZGVudCAmIHRhYiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IGluZGVudCAmIHRhYiAmICJkZXNjcmlwdG9yVHlwZSA6PSAiICYgaXRlbSA0 IG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlmIGl0ZW0g MyBvZiBuYW1lTGlzdCA9ICJIYW5kbGUiIHRoZW4NcHV0IGluZGVudCAmIHRhYiAmICJk YXRhSGFuZGxlIDo9ICIgJiBpdGVtIDEgb2YgeCAmICI7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1lbHNlDXB1dCBpbmRlbnQgJiB0YWIgJiAiZGF0YUhhbmRsZSA6PSBIYW5k bGUoIiAmIGl0ZW0gMSBvZiB4ICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1l bmQgaWYNcHV0IGluZGVudCAmIHRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9j Qm9keQ1wdXQgaW5kZW50ICYgIkZhaWxFcnIoQUVQdXRLZXlEZXNjKHRoZUFwcGxlRXZl bnQsIiAmIGl0ZW0gMiBvZiB4ICYgIiwiICYgZGVzY0ZvclRoaXNOYW1lICYgIikpOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgaXNPcHRpb25hbCB0aGVuDXB1dCBpbmRl bnQgJiAiRU5EOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDS0taWYgcGFy YW1UeXBlID0gMyB0aGVuDS0tICBpZiBpdGVtIDMgb2YgbmFtZUxpc3QgPSAiSGFuZGxl IiB0aGVuDS0tICAgIHB1dCB0d29UYWIgJiAiRGlzcG9zSGFuZGxlKCIgJiBpdGVtIDEg b2YgeCAmICIpOyIgJiByZXR1cm4gYmVmb3JlIGxpbmUgNSBvZiBwcm9jQm9keQ0tLSAg ZWxzZQ0tLSAgICBwdXQgdHdvVGFiICYgIkRpc3Bvc0hhbmRsZShIYW5kbGUoIiAmIGl0 ZW0gMSBvZiB4ICYgIikpOyIgJiByZXR1cm4gYmVmb3JlIGxpbmUgNSBvZiBwcm9jQm9k eQ0tLSAgZW5kIGlmDS0tICBpZiBpc09wdGlvbmFsIHRoZW4NLS0gICAgcHV0IHR3b1Rh YiAmICJJRiAiICYgaXRlbSA2IG9mIHggJiAiIDw+IE5JTCBUSEVOIiAmIHJldHVybiAm IHRhYiBiZWZvcmUgbGluZSA1IG9mIHByb2NCb2R5DS0tICBlbmQgaWYNLS1lbmQgaWYN ZWxzZSBpZiBwYXJhbVR5cGUgPSA0IHRoZW4NaWYgaXNPcHRpb25hbCB0aGVuDWlmIGl0 ZW0gMyBvZiB4ID0gImVudW0iIHRoZW4NcHV0IFRhYiAmICJJRiBMT05HSU5UKCIgJiBp dGVtIDEgb2YgeCAmICIpIDw+IDAgVEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IHR3b1RhYiAmICJGYWlsRXJyKEFFUHV0S2V5UHRyKHRoZUFwcGxlRXZlbnQsICIg JiBpdGVtIDIgb2YgeCDCDSYgIiwgIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIEAi ICYgaXRlbSAxIG9mIHggJiAiLCBTaXplT2YoIiDCDSYgaXRlbSAxIG9mIG5hbWVMaXN0 ICYgIikpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UgaWYgaXRlbSAzIG9m IHggPSAidHJ1ZSIgdGhlbg1wdXQgVGFiICYgIklGICIgJiBpdGVtIDEgb2YgeCAmICIg VEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmICJGYWlsRXJy KEFFUHV0S2V5UHRyKHRoZUFwcGxlRXZlbnQsICIgJiBpdGVtIDIgb2YgeCDCDSYgIiwg dHlwZVRydWUsIE5JTCwgMCkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZWxzZQ1w dXQgVGFiICYgIklGICIgJiBpdGVtIDYgb2YgeCAmICIgPD4gTklMIFRIRU4iICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRmFpbEVycihBRVB1dEtleVB0 cih0aGVBcHBsZUV2ZW50LCAiICYgaXRlbSAyIG9mIHggwg0mICIsICIgJiBpdGVtIDQg b2YgbmFtZUxpc3QgJiAiLCBQdHIoIiAmIGl0ZW0gNiBvZiB4ICYgIiksIFNpemVPZigi IMINJiBpdGVtIDEgb2YgbmFtZUxpc3QgJiAiKSkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNZW5kIGlmDWVsc2UgIC0tIHJlcXVpcmVkDXB1dCBUYWIgJiAiRmFpbEVycihB RVB1dEtleVB0cih0aGVBcHBsZUV2ZW50LCAiICYgaXRlbSAyIG9mIHggwg0mICIsICIg JiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCBAIiAmIGl0ZW0gMSBvZiB4ICYgIiwgU2l6 ZU9mKCIgwg0mIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICIpKSk7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbmQgaWYNZWxzZSBpZiAocGFyYW1UeXBlID0gNSkgb3IgKHBhcmFt VHlwZSA9IDcpIHRoZW4NaWYgaXNPcHRpb25hbCB0aGVuDXB1dCBUYWIgJiAiSUYgIiAm IGl0ZW0gNiBvZiB4ICYgIiA8PiBOSUwgVEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNZW5kIGlmDXB1dCBpbmRlbnQgJiAiRmFpbEVycihBRVB1dEtleVB0cih0aGVBcHBs ZUV2ZW50LCAiICYgaXRlbSAyIG9mIHggwg0mICIsICIgJiBpdGVtIDQgb2YgbmFtZUxp c3QgJiAiLCBQdHIoIiAmIGl0ZW0gNiBvZiB4ICYgIiksICIgYWZ0ZXIgcHJvY0JvZHkN aWYgKHBhcmFtVHlwZSA9IDUpIHRoZW4gLS0gc2l6ZSBpcyB0aGUgcGFyYW1ldGVyDXB1 dCBpdGVtIDcgb2YgeCAmICIpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UN cHV0ICJzdHJsZW4oUHRyKCIgJiBpdGVtIDYgb2YgeCAmICIpKSkpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVsc2UgaWYgcGFyYW1UeXBlID0gNiB0aGVuDWlm IGlzT3B0aW9uYWwgdGhlbg1wdXQgVGFiICYgIklGICIgJiBpdGVtIDYgb2YgeCAmICIg PD4gTklMIFRIRU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCAiUHRyKG9yZCgi ICYgaXRlbSA2IG9mIHggJiAiKSsxKSIgaW50byBkYXRhQWRkcg1wdXQgaXRlbSA2IG9m IHggJiAiXiIgaW50byBkYXRhSXRlbQ1lbHNlICAtLSByZXF1aXJlZA1wdXQgIkAiICYg aXRlbSAxIG9mIHggJiAiWzFdIiBpbnRvIGRhdGFBZGRyDXB1dCBpdGVtIDEgb2YgeCBp bnRvIGRhdGFJdGVtDWVuZCBpZg1wdXQgaW5kZW50ICYgIkZhaWxFcnIoQUVQdXRLZXlQ dHIodGhlQXBwbGVFdmVudCwgIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCAiICYgaXRlbSA0 IG9mIG5hbWVMaXN0ICYgIiwgIiAmIGRhdGFBZGRyICYgIiwgTGVuZ3RoKCIgwg0mIGRh dGFJdGVtICYgIikpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1lbmQg aWYgLS0gbm90IG51bGwNZW5kIHJlcGVhdA1wdXQgdGFiICYgIkZhaWxFcnIoQUVTZW5k KHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5LCAiIGFmdGVyIHByb2NCb2R5DWlmIGlzRnVu YyB0aGVuDXB1dCBrQUVXYWl0UmVwbHkgYWZ0ZXIgcHJvY0JvZHkNZWxzZQ1wdXQga0FF Tm9SZXBseSBhZnRlciBwcm9jQm9keQ1lbmQgaWYNaWYgZGVmYXVsdFNlbmRNb2RlIGlz IG5vdCBlbXB0eSB0aGVuIHB1dCAiKyIgJiBkZWZhdWx0U2VuZE1vZGUgYWZ0ZXIgcHJv Y0JvZHkNcHV0ICIsIGtBRU5vcm1hbFByaW9yaXR5LCAiICYgZGVmYXVsdFRpbWVPdXQg JiAiLCIgJiYgZGVmYXVsdElkbGVQcm9jICYmICIsIiDCDSYgZGVmYXVsdEFFRmlsdGVy ICYgIikpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgaXNGdW5jIHRoZW4NcHV0 ICJ0aGVFcnJuIDogTE9OR0lOVDsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 ICJ0eXBlQ29kZSA6IERlc2NUeXBlOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1w dXQgImFjdHVhbFNpemUgOiBMT05HSU5UOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFy ZQ1wdXQgdGFiICYgIklGIEFFR2V0S2V5UHRyKHRoZVJlcGx5LCAnZXJybicsIHR5cGVM b25nSW50ZWdlciwgdHlwZUNvZGUsIiDCDSYmICJAdGhlRXJybiwgU2l6ZU9mKHRoZUVy cm4pLCBhY3R1YWxTSXplKSA8PiBlcnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgInsgeW91ciBlcnJvciBoYW5kbGluZyBjb2Rl IGhlcmV9IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkVORDsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DS0tIGdldCB0aGUgcmVzdWx0DXB1dCBpdGVt IDQgb2YgcGFyYW1JbmZvIGludG8gcGFyYW1UeXBlDXB1dCBOYW1lT2ZEYXRhVHlwZShp dGVtIDMgb2YgcGFyYW1JbmZvKSBpbnRvIG5hbWVMaXN0DWlmIHBhcmFtVHlwZSA9IDAg dGhlbiAtLSByZXN1bHQgaXMgQUVEZXNjDXB1dCB0YWIgJiAiRmFpbEVycihBRUdldEtl eURlc2ModGhlQXBwbGVFdmVudCwga2V5RGlyZWN0T2JqZWN0LCAiIMINJiBpdGVtIDQg b2YgbmFtZUxpc3QgJiAiLCB0aGVSZXN1bHQpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVsc2UgaWYgKHBhcmFtVHlwZSA9IDEpIG9yIChwYXJhbVR5cGUgPSA1KSB0aGVu IC0tIHJlc3VsdCBpcyBIYW5kbGUNcHV0ICJhRGVzYyA6IEFFRGVzYzsiICYgcmV0dXJu IGFmdGVyIHZhckRlY2xhcmUNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5RGVzYyh0 aGVBcHBsZUV2ZW50LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1l TGlzdCAmICIsIGFEZXNjKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1pZiBpdGVt IDMgb2YgbmFtZUxpc3QgPSAiSGFuZGxlIiB0aGVuDXB1dCBUYWIgJiAidGhlUmVzdWx0 IDo9IGFEZXNjLmRhdGFIYW5kbGU7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbHNl DXB1dCBUYWIgJiAidGhlUmVzdWx0IDo9ICIgJiBpdGVtIDMgb2YgbmFtZUxpc3QgJiAi KGFEZXNjLmRhdGFIYW5kbGUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlm DWVsc2UgaWYgcGFyYW1UeXBlID0gNCB0aGVuIC0tIHJlc3VsdCBpcyBmaXhlZCBsZW5n dGgNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5UHRyKHRoZVJlcGx5LCBrZXlEaXJl Y3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIHR5cGVDb2RlLCBA dGhlUmVzdWx0LCBTaXplT2YodGhlUmVzdWx0KSIgwg0mICIsIGFjdHVhbFNpemUpKTsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UgaWYgcGFyYW1UeXBlID0gNiB0aGVu IC0tIHJlc3VsdCBpcyBzdHIyNTUNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5UHRy KHRoZVJlcGx5LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlz dCAmICIsIHR5cGVDb2RlLCBAdGhlUmVzdWx0WzFdLCBTaXplT2YodGhlUmVzdWx0KS0x IiDCDSYgIiwgYWN0dWFsU2l6ZSkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0 IFRhYiAmICJJRiBhY3R1YWxTaXplID49IFNpemVPZih0aGVSZXN1bHQpIFRIRU4iICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiYWN0dWFsU2l6ZSA6PSBT aXplT2YodGhlUmVzdWx0KSAtIDE7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg VGFiICYgInRoZVJlc3VsdFswXSA6PSBjaHIoYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1lbmQgaWYNZW5kIGlmDXB1dCB0YWIgJiAiQ2xlYW5VcDsiICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0YWIgJiBwcm9jTmFtZSAmICIgOj0gTm9F cnI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdGFiICYgIkVORDsiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DWlmIHZhckRlY2xhcmUgPD4gIiIgdGhlbg1wdXQgdGFi ICYgIlZBUiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1yZXBlYXQgd2l0aCBpID0g MSB0byBudW1iZXIgb2YgbGluZXMgaW4gdmFyRGVjbGFyZQ1wdXQgdHdvVGFiICYgbGlu ZSBpIG9mIHZhckRlY2xhcmUgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1lbmQgcmVw ZWF0DWVuZCBpZg1yZXR1cm4gcHJvY0hlYWRlciAmIHJldHVybiAmIHByb2NCb2R5ICYg cmV0dXJuDWVsc2UNcmV0dXJuICIiDWVuZCBpZg1FbmQgQ2xpZW50U2FtcGxlDQ0AARAA DwEAAPIAAgECAJngBQAAAAAAAQAAAAwAAAAQSGFzIEdsdWUgU3Vicm91dGluZQAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNlcnRhaW4gbGFuZ3VhZ2VzIGhhdmUgYSBw cmltaXRpdmUgdG8gc2VuZCBBcHBsZSBFdmVudHMsIiDCDSYmICJidXQgdGhlcmUgbWF5 IGFsc28gYmUgYSBnbHVlIHJvdXRpbmUgb24gdG9wIG9mIHRoZSBwcmltaXRpdmUuIiDC DSYmICJDbGljayB0aGlzIGJveCB0byB1c2UgdGhlIGdsdWUgcm91dGluZS4iDWVuZCBN b3VzZVdpdGhpbg0NAAAAtAAQAgUAVAC7AGUBJQAAAAAAAP//ABUADAEAABAAAG9uIE1v dXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayB0byBzZXQgdGhlIHJlc291cmNlIHR5 cGUgdG8gYmUgd3JpdHRlbiBvdXQgYXMgJ2FldGUnIG9yICdhZXV0Jy4gTm9ybWFsbHkg aXQgc2hvdWxkIGJlICdhZXRlJy4iDWVuZCBNb3VzZVdpdGhpbg0NAAADCgASAQAANgAK AEsAgYAAAAAAAAABABUADAEAABBUYXJnZXQgQXBwbGljYXRpb24AAC0tIG9uIE1vdXNl V2l0aGluDS0tIFNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGNob29zZSB0aGUgbmFt ZSBvZiB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uIHRvIGJlIHVzZWQgaW4gUEFTQ0FMIGNs aWVudCBzYW1wbGUgY29kZS4iDS0tIGVuZCBNb3VzZVdpdGhpbg0NLS0gb24gbW91c2VV cA0tLSBpZiB0aGUgc3lzdGVtVmVyc2lvbiA8IDcgdGhlbg0tLSBhbnN3ZXIgIlRoaXMg ZmVhdHVyZSByZXF1aXJlcyBTeXN0ZW0gNy4wIG9yIGxhdGVyLiINLS0gZXhpdCBtb3Vz ZVVwDS0tIGVuZCBpZg0tLSBpZiB0aGUgdmVyc2lvbiA8IDIuMSB0aGVuDS0tIGFuc3dl ciAiVGhpcyBmZWF0dXJlIHJlcXVpcmVzIEh5cGVyQ2FyZCAyLjEgb3IgbGF0ZXIuIg0t LSBlbmQgaWYNLS0gYW5zd2VyIHByb2dyYW0gIkNob29zZSBhbiBvcGVuIHByb2dyYW0g dG8gc2VuZCB0bzoiDS0tIGlmIGl0IDw+ICIiIHRoZW4NLS0gU2V0IHRoZSBpdGVtRGVs aW1pdGVyIHRvICI6Ig0tLSBwdXQgaXQgaW50byB4DS0tIGRlbGV0ZSBsYXN0IGl0ZW0g b2YgeA0tLSBwdXQgdGhlIGFkZHJlc3MgaW50byB5DS0tIGRlbGV0ZSBsYXN0IGl0ZW0g b2YgeQ0tLSBpZiB4ID0geSB0aGVuDS0tIGRlbGV0ZSBpdGVtIDEgdG8gMiBvZiBpdA0t LSBlbmQgaWYNLS0gU2V0IHRoZSBpdGVtRGVsaW1pdGVyIHRvICIsIg0tLSBwdXQgaXQg aW50byBjYXJkIGZpZWxkICJzZW5kVGFyZ2V0Ig0tLSBlbmQgaWYNLS0gZW5kIG1vdXNl VXAAALoAFAIFAHwAyQCNASUAAAAAAAD//wAVAAwBAAAQAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiRW50ZXIgdGhlIHNlbmQgbW9kZSAob3RoZXIgdGhhbiB3YWl0UmVw bHkvbm9SZXBseS9xdWV1ZVJlcGx5KSB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQg c2FtcGxlIGNvZGUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0AAJgAFQIFAJAA3gChASUA AAAAAAD//wAVAAwBAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiRW50ZXIg dGhlIG5hbWUgb2YgaWRsZSBwcm9jIHRvIGJlIHVzZWQgaW4gUEFTQ0FMIGNsaWVudCBz YW1wbGUgY29kZSBoZXJlLiINZW5kIE1vdXNlV2l0aGluDQAAqAAWAgUApADeALUBJQAA AAAAAP//ABUADAEAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJFbnRlciB0 aGUgbmFtZSBvZiB0aGUgZXZlbnQgZmlsdGVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgaW4g UEFTQ0FMIGNsaWVudCBzYW1wbGUgY29kZSBoZXJlLiINZW5kIE1vdXNlV2l0aGluDQAA 1AAaAQABBgEfARkB/aAFAAAAAAABAAAADAAAABBBdXRvIEdlbmVyYXRlIFBhcmFtZXRl ciBUeXBlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2tpbmcgaGVyZSBp bmRpY2F0ZXMgd2hldGhlciBkYXRhIHR5cGVzIGZvciB1c2UgaW4gUEFTQ0FMIHBhcmFt ZXRlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCBnZW5lcmF0ZWQuIg1lbmQgTW91c2VX aXRoaW4NAACiABsCBQC4AKoAyQElAAAAAAAA//8AFQAMAQAAEAAAb24gTW91c2VXaXRo aW4NU2hvd0JhbGxvb24gIkVudGVydCB0aGUgbmFtZSBvZiB0YXJnZXQgZGVzY3JpcHRv ciB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQgc2FtcGxlIGNvZGUgaGVyZS4iDWVu ZCBNb3VzZVdpdGhpbg0AAAAoAB0BgAEhAAMBNABP4AUAAAAAAAEAAAAMAAAAEFZlcmJv c2UAAAABMAAhAQAAVAEkAGMBWuAGAAAAAAABAAAADAAAABBhZXRlAABvbiBNb3VzZVdp dGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBzZXQgdGhlIHJlc291cmNlIHR5 cGUgdG8gYmUgd3JpdHRlbiBvdXQgYXMgJ2FldGUnLiBUaGlzIGlzIHdoYXQgaXMgbm9y bWFsbHkgdGhpcyBzaG91bGQgYmUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXAN c2V0IHRoZSBoaWxpdGUgb2YgY2QgYnRuICJhZXV0IiB0byBmYWxzZQ1wdXQgdGhlIHNo b3J0IG5hbWUgb2YgbWUgaW50byBjZCBmbGQgInJlc291cmNlVHlwZSINZW5kIG1vdXNl VXAAASgAIgEAAFQBYABjAZagBgAAAAAAAQAAAAwAAAAQYWV1dAAAb24gTW91c2VXaXRo aW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gc2V0IHRoZSByZXNvdXJjZSB0eXBl IHRvIGJlIHdyaXR0ZW4gb3V0IGFzICdhZXRlJy4gTm9ybWFsbHkgdGhpcyBzaG91bGQg YmUgJ2FldGUnLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCB0aGUgaGls aXRlIG9mIGNkIGJ0biAiYWV0ZSIgdG8gZmFsc2UNcHV0IHRoZSBzaG9ydCBuYW1lIG9m IG1lIGludG8gY2QgZmxkICJyZXNvdXJjZVR5cGUiDWVuZCBtb3VzZVVwAAAApAAjAoQA UgF9AGQBogACAAAAAAAAAAMADAAAABByZXNvdXJjZVR5cGUAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJUaGUgcmVzb3VyY2UgdHlwZSB0byBiZSB3cml0dGVuIG91dCwg bm9ybWFsbHkgdGhpcyBzaG91bGQgc3RheSBhcyBhZXRlLiINZW5kIE1vdXNlV2l0aGlu DQ0AAAAiACQCBQAeALgAMAFNAAAAAAAAAAAAFQASSQAAGAAAAAAAbAAoAgUAXAAhAG0A dwABAAAAAAAAABUADAEAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJFbnRl ciB0aGUgcmVzb3VyY2UgSUQgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0NAAAAdgApAgQA WgB2AG0ApAACAAAAAAAAAAQADAAAABByZXNvdXJjZUlEAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiRW50ZXIgdGhlIHJlc291cmNlIElEIGhlcmUuIg1lbmQgTW91c2VX aXRoaW4NDQAAAGwAKgIFAJwABACsADEAAQAAAAAAAAAVAAwBAAAQAABvbiBNb3VzZVdp dGhpbg1TaG93QmFsbG9vbiAiRW50ZXIgdGhlIHJlc291cmNlIG5hbWUgaGVyZS4iDWVu ZCBNb3VzZVdpdGhpbgAAAHgAKwIEAJwAMACtAM8AAgAAAAAAAAAEAAwAAAAQcmVzb3Vy Y2VOYW1lAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiRW50ZXIgdGhlIHJlc291 cmNlIG5hbWUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbgAAAG4ALAIFALEABADCAD0AAQAA AAAAAAAVAAwBAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiRW50ZXIgdGhl IHJlc291cmNlIHZlcnNpb24gaGVyZS4iDWVuZCBNb3VzZVdpdGhpbgAAegAtAgQAsAA8 AMEAXAACAAAAAP//AAQADAAAABBtYWpvclZlcnNpb24AAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJFbnRlciB0aGUgcmVzb3VyY2UgdmVyc2lvbiBoZXJlLiINZW5kIE1v dXNlV2l0aGluAAAiAC4CBQCwAFwAwQBoAAEAAAAAAAAABAAMAAAAEAAAAAAAegAvAgQA sABoAMEAhQACAAAAAAAAAAQADAAAABBtaW5vclZlcnNpb24AAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJFbnRlciB0aGUgcmVzb3VyY2UgdmVyc2lvbiBoZXJlLiINZW5k IE1vdXNlV2l0aGluAABsADACBQBwAAkAgQB3AAEAAAAA//8AFQAMAQAAEAAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBsYW5ndWFnZSBjb2RlIGhlcmUu Ig1lbmQgTW91c2VXaXRoaW4AAAB4ADECBABuAHYAfwCkAAIAAAAAAAAABAAMAAAAEGxh bmd1YWdlQ29kZQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBs YW5ndWFnZSBjb2RlIGhlcmUuIg1lbmQgTW91c2VXaXRoaW4AAABqADICBQCCABUAkgB3 AAEAAAAAAAAAFQAMAQAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVy IHRoZSBzY3JpcHQgY29kZSBoZXJlLiINZW5kIE1vdXNlV2l0aGluAAAAdAAzAgQAgAB2 AJEApAACAAAAAAAAAAQADAAAABBzY3JpcHRDb2RlAABvbiBNb3VzZVdpdGhpbg1TaG93 QmFsbG9vbiAiRW50ZXIgdGhlIHNjcmlwdCBjb2RlIGhlcmUuIg1lbmQgTW91c2VXaXRo aW4AAADuADYBAAEoAXwBVgG4oAAAAGB2AAEAFQAMAQAAEEluc3RydWN0aW9ucwAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ2V0IGluc3RydWN0 aW9ucyBmb3IgdXNpbmcgdGhpcyBzdGFjay4iDWVuZCBNb3VzZVdpdGhpbg0NDW9uIG1v dXNlVXANZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2QgaW50byBnV2hlcmVG cm9tDWdvIGNkICJpbnN0cnVjdGlvbnMiDWVuZCBtb3VzZVVwAAAA9gA3AQABMgHNAUwB 8iAAAAA+0wABABUADgEAABJQcm9jZWVkyQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxv b24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhlIFJlc291cmNlIFRvb2xzIGNhcmQuIg1l bmQgTW91c2VXaXRoaW4NDQ0Nb24gbW91c2VVcA1nbG9iYWwgZ1doZXJlRnJvbQ1wdXNo IGNkDXBvcCBjZCBpbnRvIGdXaGVyZUZyb20NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28g Y2FyZCAiTWFpbk1lbnUiDWVuZCBtb3VzZVVwAAAAKgA4AoUBIwEhAVYCAAAHAAAAAAAA AAMACQAAAAxuYW1lTGlzdAAAAAAufAA5AQABQwACAVIAIIAGAAAAAAABAAAADAAAABBD AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBzaG93IHRo ZSBldmVudCBhcyBpdCBpcyBjYWxsZWQgZnJvbSBDLiINZW5kIE1vdXNlV2l0aGluDQ1m dW5jdGlvbiBDbGllbnRUZW1wbGF0ZSBtdWx0aUxpbmUNLS0gZWl0aGVyIHJldHVybiB0 aGUgdGVtcGxhdGUgb3Igd2hpY2ggcGFyYW1ldGVyIGlzIGJlaW5nIGNsaWNrZWQNcHV0 IEdsdWVJbmZvKGZpZWxkICJwYXJhbUluZm8iKSBpbnRvIHBhcmFtSW5mbw1wdXQgIk9T RXJyIEFFIiAmIFN0cmlwU1AoZmllbGQgImV2ZW50TmFtZSIpICYgIigiIGludG8gdGVt cGxhdGUNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBwYXJhbUluZm8gaW50byBuDXB1dCAw IGludG8gcGFyYW1JbmRleA1yZXBlYXQgd2l0aCBpbmRleCA9IDEgdG8gbg1zZXQgY3Vy c29yIHRvIGJ1c3kNcHV0IGxpbmUgaW5kZXggb2YgcGFyYW1JbmZvIGludG8geQ1wdXQg aXRlbSA0IG9mIHkgaW50byBwYXJhbVR5cGUNcHV0IChpdGVtIDUgb2YgeSA9ICJvIikg aW50byBpc09wdGlvbmFsDXB1dCAoaXRlbSAzIG9mIHkgPD4gIm51bGwiKSBpbnRvIHVz ZUl0DWlmIHVzZUl0IHRoZW4NYWRkIDEgdG8gcGFyYW1JbmRleA1pZiB1c2VJdCB0aGVu DWlmIGluZGV4ID0gMSB0aGVuDXB1dCBmYWxzZSBpbnRvIGlzT3B0aW9uYWwNZWxzZQ1p ZiBtdWx0aUxpbmUgPSAibXVsdGlMaW5lIiB0aGVuDXB1dCByZXR1cm4gJiBzcGFjZSBh ZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYN ZW5kIGlmDXB1dCBOYW1lT2ZEYXRhVHlwZShpdGVtIDMgb2YgeSkgaW50byBuYW1lTGlz dA1wdXQgaXRlbSA1IG9mIG5hbWVMaXN0IGludG8gdHlwZU5hbWUNaWYgcGFyYW1UeXBl ID0gMCB0aGVuDWlmIGluZGV4IDw+IDEgdGhlbiBwdXQgImNvbnN0ICIgYWZ0ZXIgdGVt cGxhdGUNcHV0ICJBRURlc2MgKiIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSBpZiBwYXJhbVR5 cGUgPSAxIHRoZW4gLS0gaGFuZGxlDXB1dCAiSGFuZGxlICIgYWZ0ZXIgdGVtcGxhdGUN aWYgaW5kZXggPSAxIHRoZW4NcHV0ICIqIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZWxz ZSBpZiBwYXJhbVR5cGUgPSA0IHRoZW4gLS0gaW1tZWRpYXRlDXB1dCBpdGVtIDMgb2Yg eSBpbnRvIGRhdGFUeXBlDXB1dCBpdGVtIDYgb2YgbmFtZUxpc3QgaW50byBkYXRhU2l6 ZQ1pZiBkYXRhVHlwZSA9ICJlbnVtIiB0aGVuDXB1dCAiUmVzVHlwZSAiIGFmdGVyIHRl bXBsYXRlDWVsc2UgaWYgZGF0YVR5cGUgPSAidHJ1ZSIgdGhlbg1wdXQgIkJvb2xlYW4g IiBhZnRlciB0ZW1wbGF0ZQ1lbHNlIGlmIChpc09wdGlvbmFsIG9yIChkYXRhU2l6ZSA8 IDApIG9yIChkYXRhU2l6ZSA+IDQpKSBhbmQgKGluZGV4IDw+IDEpIHRoZW4gLS0gZml4 ZWQgbGVuZ3RoIG9wdGlvbmFsDXB1dCAiY29uc3QgIiAmIHR5cGVOYW1lICYgIiAqIiBh ZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1dCB0eXBlTmFtZSAmIHNwYWNlIGFmdGVyIHRlbXBs YXRlDWVuZCBpZg1pZiBpbmRleCA9IDEgdGhlbg1wdXQgIioiIGFmdGVyIHRlbXBsYXRl DWVuZCBpZg1lbHNlIGlmIHBhcmFtVHlwZSA9IDcgdGhlbg1pZiBpbmRleCA8PiAxIHRo ZW4gcHV0ICJjb25zdCAiIGFmdGVyIHRlbXBsYXRlDXB1dCB0eXBlTmFtZSAmICIgKiIg YWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIChsYXN0IGNoYXIgb2YgdGVtcGxhdGUgPSAi KiIpIHRoZW4NcHV0IGl0ZW0gNiBvZiB5ICYgIiwgIiBhZnRlciB0ZW1wbGF0ZQ1lbHNl IGlmIChwYXJhbVR5cGUgPSA1KSB0aGVuIC0tIHB0ciArIHNpemUNcHV0IHR5cGVOYW1l ICYgIiAqIiAmIGl0ZW0gNiBvZiB5ICYgIiwgbG9uZyAiICYgaXRlbSA3IG9mIHkgJiAi LCAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgcGFyYW1UeXBlID0gNiB0aGVuDWlmIGlu ZGV4IDw+IDEgdGhlbiBwdXQgImNvbnN0ICIgYWZ0ZXIgdGVtcGxhdGUNcHV0ICJTdHJp bmdQdHIgIiAmIGl0ZW0gNiBvZiB5ICYgIiwgIiBhZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1 dCBpdGVtIDEgb2YgeSAmICIsICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBpZiAt LSB1c2VJdA1lbmQgaWYgLS0gdXNlSXQNZW5kIHJlcGVhdA1pZiBwYXJhbUluZGV4ID4g MCB0aGVuDURlbGV0ZSBsYXN0IGNoYXIgb2YgdGVtcGxhdGUgLS0gc3BhY2Ugb3IgKA1w dXQgIikiIGludG8gbGFzdCBjaGFyIG9mIHRlbXBsYXRlIC0tIHJlcGxhY2UgLA1lbHNl DXB1dCAiKSIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDXJldHVybiB0ZW1wbGF0ZQ1lbmQg Q2xpZW50VGVtcGxhdGUNDWZ1bmN0aW9uIENsaWVudFNhbXBsZSBjYXJkVHlwZQ1nbG9i YWwgZGVmYXVsdFRhcmdldERlc2MsIGRlZmF1bHRUaW1lT3V0LCBkZWZhdWx0SWRsZVBy b2MsIGRlZmF1bHRBRUZpbHRlciwgZGVmYXVsdFNlbmRNb2RlLCBkZWZhdWx0VGFyZ2V0 DWlmIGNhcmRUeXBlID0gImluaXQiIHRoZW4NaWYgZGVmYXVsdFRhcmdldERlc2MgaXMg ZW1wdHkgdGhlbg1wdXQgInRhcmdldERlc2MiIGludG8gZGVmYXVsdFRhcmdldERlc2MN cHV0ICJ2b2lkIFRhcmdldEluaXQoKSIgJiByZXR1cm4gJiAieyIgJiByZXR1cm4gYWZ0 ZXIgcnN0DXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0IFRhYiAmIHR3b1RhYiBp bnRvIHRocmVlVGFiDXB1dCBUYWIgJiB0aHJlZVRhYiBpbnRvIGZvdXJUYWINaWYgZGVm YXVsdFRhcmdldCA9ICJzZWxmIiB0aGVuDS0tIHNlbmQgdG8gc2VsZg1wdXQgVGFiICYg IlByb2Nlc3NTZXJpYWxOdW1iZXIgbXlQU04gPSB7MCwga0N1cnJlbnRQcm9jZXNzfTsi ICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgVGFiICYgIkFFQ3JlYXRlRGVzYyh0eXBlUHJv Y2Vzc1NlcmlhbE51bWJlciwgKFB0cikgJm15UFNOLCBzaXplb2YoUHJvY2Vzc1Nlcmlh bE51bWJlciksICZ0YXJnZXREZXNjKTsiICYgcmV0dXJuIGFmdGVyIHJzdA1lbHNlIGlm IGRlZmF1bHRUYXJnZXQgPD4gIiIgdGhlbg0tLSBzZW5kIHRvIHRhcmdldCBuYW1lDXB1 dCBUYWIgJiAiY2hhciAqdGFyZ2V0TmFtZSA9IiAmIHF1b3RlICYgZGVmYXVsdFRhcmdl dCAmIHF1b3RlICYgIjsiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgVGFiICYgIkFFQ29l cmNlUHRyKHR5cGVDaGFyLCAoUHRyKSB0YXJnZXROYW1lLCAiICYgTGVuZ3RoKGRlZmF1 bHRUYXJnZXQpICYgIiwgdHlwZVRhcmdldElELCAmdGFyZ2V0RGVzYyk7IiAmIHJldHVy biBhZnRlciByc3QNZWxzZQ0tLSB1c2UgUFBDIEJyb3dzZXINcHV0IHR3b1RhYiAmICJM b2NhdGlvbk5hbWVSZWMgdGhlTG9jYXRpb247IiAmIHJldHVybiBhZnRlciByc3QNcHV0 IHR3b1RhYiAmICJQb3J0SW5mb1JlYyB0aGVQb3J0SW5mbzsiICYgcmV0dXJuIGFmdGVy IHJzdA1wdXQgdHdvVGFiICYgIlRhcmdldElEIGFUYXJnZXRJRDsiICYgcmV0dXJuIGFm dGVyIHJzdA1wdXQgVGFiICYgImlmICghUFBDQnJvd3NlcigiICYgcXVvdGUgJiAiXHAi ICYgcXVvdGUgJiAiLCAiIMINJiBxdW90ZSAmICJccCIgJiBxdW90ZSAmIiwgZmFsc2Us ICZ0aGVMb2NhdGlvbiwgJnRoZVBvcnRJbmZvLCBuaWwsICIgwg0mIHF1b3RlICYgIlxw IiAmIHF1b3RlICYgIikpIHsiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgdHdvVGFiICYg ImFUYXJnZXRJRC5sb2NhdGlvbiA9IHRoZUxvY2F0aW9uOyIgJiByZXR1cm4gYWZ0ZXIg cnN0DXB1dCB0d29UYWIgJiAiYVRhcmdldElELm5hbWUgPSB0aGVQb3J0SW5mby5uYW1l OyIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCB0d29UYWIgJiAiQUVDcmVhdGVEZXNjKHR5 cGVUYXJnZXRJRCwgKFB0cikgJmFUYXJnZXRJRCwgc2l6ZW9mKFRhcmdldElEKSwgJnRh cmdldERlc2MpOyIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCBUYWIgJiAifTsiICYgcmV0 dXJuIGFmdGVyIHJzdA1lbmQgaWYNcHV0IFRhYiAmICJ9IiAmIHJldHVybiAmIHJldHVy biBhZnRlciByc3QNZW5kIGlmDWlmIGRlZmF1bHRJZGxlUHJvYyBpcyBlbXB0eSB0aGVu DXB1dCAibmlsIiBpbnRvIGRlZmF1bHRJZGxlUHJvYw1lbHNlDXB1dCAiJiIgYmVmb3Jl IGRlZmF1bHRJZGxlUHJvYw1lbmQgaWYNaWYgZGVmYXVsdEFFRmlsdGVyIGlzIGVtcHR5 IHRoZW4NcHV0ICJuaWwiIGludG8gZGVmYXVsdEFFRmlsdGVyDWVsc2UNcHV0ICImIiBi ZWZvcmUgZGVmYXVsdEFFRmlsdGVyDWVuZCBpZg1pZiBkZWZhdWx0VGltZU91dCBpcyBl bXB0eSB0aGVuDXB1dCAia0FFRGVmYXVsdFRpbWVPdXQiIGludG8gZGVmYXVsdFRpbWVP dXQNZW5kIGlmDXJldHVybiByc3QNZWxzZSBpZiBjYXJkVHlwZSA9ICJldmVudCIgdGhl bg1wdXQgQ2xpZW50VGVtcGxhdGUoKSAmIHJldHVybiAmICJ7IiAmIHJldHVybiBpbnRv IHByb2NIZWFkZXINcHV0IEdsdWVJbmZvKGZpZWxkICJwYXJhbUluZm8iKSBpbnRvIHBh cmFtSW5mbw1wdXQgbnVtYmVyIG9mIGxpbmVzIG9mIHBhcmFtSW5mbyBpbnRvIGNvdW50 DXB1dCAiQUUiICYgU3RyaXBTUChmaWVsZCAiRXZlbnROYW1lIikgaW50byBwcm9jTmFt ZQ1wdXQgKGl0ZW0gMyBvZiBwYXJhbUluZm8gPD4gIm51bGwiKSBpbnRvIGlzRnVuYw1w dXQgdGFiICYgdGFiIGludG8gdHdvVGFiDXB1dCB0YWIgJiB0d29UYWIgaW50byB0aHJl ZVRhYg1wdXQgIk9TRXJyIGVycjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 ICJBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5OyIgJiByZXR1cm4gYWZ0 ZXIgdmFyRGVjbGFyZQ1wdXQgVGFiICYgInRoZUFwcGxlRXZlbnQuZGF0YUhhbmRsZSA9 IG5pbDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBUYWIgJiAidGhlUmVwbHku ZGF0YUhhbmRsZSA9IG5pbDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBUYWIg JiAiaWYgKGVyciA9IEFFQ3JlYXRlQXBwbGVFdmVudCgnIiAmIFJlc1R5cGUoZmllbGQg IkV2ZW50Q2xhc3MiKSDCDSYgIicsICciICYgUmVzVHlwZShmaWVsZCAiRXZlbnRJRCIp ICYgIicsICYiICYgZGVmYXVsdFRhcmdldERlc2Mgwg0mICIsIGtBdXRvR2VuZXJhdGVS ZXR1cm5JRCwga0FueVRyYW5zYWN0aW9uSUQsICZ0aGVBcHBsZUV2ZW50KSkiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiZ290byBDbGVhblVwOyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcmVwZWF0IHdpdGggcGFyYW1JbmRleCA9IDIgdG8g Y291bnQNcHV0IGxpbmUgcGFyYW1JbmRleCBvZiBwYXJhbUluZm8gaW50byB4DWlmIGl0 ZW0gMyBvZiB4IDw+ICJudWxsIiB0aGVuDXB1dCBpdGVtIDQgb2YgeCBpbnRvIHBhcmFt VHlwZQ1wdXQgKGl0ZW0gNSBvZiB4ID0gIm8iKSBpbnRvIGlzT3B0aW9uYWwNcHV0IE5h bWVPZkRhdGFUeXBlKGl0ZW0gMyBvZiB4KSBpbnRvIG5hbWVMaXN0DWlmIGlzT3B0aW9u YWwgdGhlbg1wdXQgdHdvVGFiIGludG8gaW5kZW50DWVsc2UNcHV0IFRhYiBpbnRvIGlu ZGVudA1lbmQgaWYNcHV0IFN0cmlwU3AoaXRlbSAxIG9mIHgpIGludG8gdGhpc05hbWUN aWYgKHBhcmFtVHlwZSA9IDApIG9yIChwYXJhbVR5cGUgPSAyKSB0aGVuIC0tIEFFRGVz Yw1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IFRhYiAmICJpZiAoIiAmIGl0ZW0gNiBvZiB4 ICYgIikgeyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IGluZGVudCAmICJpZiAo ZXJyID0gQUVQdXRLZXlEZXNjKCZ0aGVBcHBsZUV2ZW50LCIgJiBpdGVtIDIgb2YgeCAm ICIsICIgJiBpdGVtIDYgb2YgeCAmICIpKSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IGluZGVudCAmIHRhYiAmICJnb3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1wdXQgVGFiICYgIn07IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbHNl DXB1dCBpbmRlbnQgJiAiaWYgKGVyciA9IEFFUHV0S2V5RGVzYygmdGhlQXBwbGVFdmVu dCwiICYgaXRlbSAyIG9mIHggJiAiLCAiICYgaXRlbSA2IG9mIHggJiAiKSkiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBpbmRlbnQgJiBUYWIgJiAiZ290byBDbGVhblVw OyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVsc2UgaWYgKHBhcmFtVHlw ZSA9IDEpIG9yIChwYXJhbVR5cGUgPSAzKSB0aGVuIC0tIGhhbmRsZQ1wdXQgImRlc2NG b3IiICYgU3RyaXBTcChpdGVtIDEgb2YgeCkgaW50byBkZXNjRm9yVGhpc05hbWUNaWYg aXNPcHRpb25hbCB0aGVuDXB1dCBUYWIgJiAiaWYgKCIgJiBpdGVtIDEgb2YgeCAmICIp IHsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgIkFFRGVzYyAiICYg ZGVzY0ZvclRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 IGluZGVudCAmIGRlc2NGb3JUaGlzTmFtZSAmICIuZGVzY3JpcHRvclR5cGUgPSAiICYg aXRlbSA0IG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCBpbmRlbnQgJiBkZXNjRm9yVGhpc05hbWUgJiAiLmRhdGFIYW5kbGUgPSAoSGFuZGxl KSIgJiBpdGVtIDEgb2YgeCAmICI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg aW5kZW50ICYgImlmIChlcnIgPSBBRVB1dEtleURlc2MoJnRoZUFwcGxlRXZlbnQsIiAm IGl0ZW0gMiBvZiB4ICYgIiwmIiAmIGRlc2NGb3JUaGlzTmFtZSAmICIpKSIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IGluZGVudCAmIFRhYiAmICJnb3RvIENsZWFuVXA7 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IGlu ZGVudCAmICJ9OyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVsc2UgaWYg cGFyYW1UeXBlID0gNCB0aGVuDWlmIGlzT3B0aW9uYWwgdGhlbg1pZiBpdGVtIDMgb2Yg eCA9ICJlbnVtIiB0aGVuDXB1dCBUYWIgJiAiaWYgKChsb25nKSIgJiBpdGVtIDEgb2Yg eCAmICIpIHsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiaWYg KGVyciA9IEFFUHV0S2V5UHRyKCZ0aGVBcHBsZUV2ZW50LCAiICYgaXRlbSAyIG9mIHgg wg0mICIsICIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCAoUHRyKSAmIiAmIGl0ZW0g MSBvZiB4ICYgIiwgc2l6ZW9mKCIgwg0mIGl0ZW0gNSBvZiBuYW1lTGlzdCAmICIpKSki ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UgaWYgaXRlbSAzIG9mIHggPSAidHJ1 ZSIgdGhlbg1wdXQgVGFiICYgImlmICgiICYgaXRlbSAxIG9mIHggJiAiKSB7IiAmIHJl dHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgImlmIChlcnIgPSBBRVB1dEtl eVB0cigmdGhlQXBwbGVFdmVudCwgIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCB0eXBlVHJ1 ZSwgbmlsLCAwKSkiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IFRhYiAm ICJpZiAoIiAmIGl0ZW0gNiBvZiB4ICYgIikgeyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IHR3b1RhYiAmICJpZiAoZXJyID0gQUVQdXRLZXlQdHIoJnRoZUFwcGxlRXZl bnQsICIgJiBpdGVtIDIgb2YgeCDCDSYgIiwgIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAm ICIsIChQdHIpICIgJiBpdGVtIDYgb2YgeCAmICIsIHNpemVvZigiIMINJiBpdGVtIDUg b2YgbmFtZUxpc3QgJiAiKSkpIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYN cHV0IHRocmVlVGFiICYgImdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCB0d29UYWIgJiAifSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZWxzZSAg LS0gcmVxdWlyZWQNcHV0IFRhYiAmICJpZiAoZXJyID0gQUVQdXRLZXlQdHIoJnRoZUFw cGxlRXZlbnQsICIgJiBpdGVtIDIgb2YgeCDCDSYgIiwgIiAmIGl0ZW0gNCBvZiBuYW1l TGlzdCAmICIsIChQdHIpICIgYWZ0ZXIgcHJvY0JvZHkNcHV0IGl0ZW0gNiBvZiBuYW1l TGlzdCBpbnRvIGRhdGFTaXplDWlmIChkYXRhU2l6ZSA8IDApIG9yIChkYXRhU2l6ZSA+ IDQpIHRoZW4NcHV0IGl0ZW0gNiBvZiB4IGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0ICIm IiAmIGl0ZW0gMSBvZiB4IGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgIiwgc2l6ZW9m KCIgJiBpdGVtIDUgb2YgbmFtZUxpc3QgJiAiKSkpIiAmIHJldHVybiBhZnRlciBwcm9j Qm9keQ1wdXQgdHdvVGFiICYgImdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHBy b2NCb2R5DWVuZCBpZg1lbHNlIGlmIChwYXJhbVR5cGUgPSA1KSBvciAocGFyYW1UeXBl ID0gNykgdGhlbg1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IFRhYiAmICJpZiAoIiAmIGl0 ZW0gNiBvZiB4ICYgIikgeyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1 dCBpbmRlbnQgJiAiaWYgKGVyciA9IEFFUHV0S2V5UHRyKCZ0aGVBcHBsZUV2ZW50LCAi ICYgaXRlbSAyIG9mIHggwg0mICIsICIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCAo UHRyKSAiIGFmdGVyIHByb2NCb2R5DWlmIChwYXJhbVR5cGUgPSA1KSB0aGVuIC0tIHNp emUgaXMgdGhlIHBhcmFtZXRlcg1wdXQgaXRlbSA2IG9mIHggJiAiLCAiICYgaXRlbSA3 IG9mIHggJiAiKSkiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IGl0ZW0g NiBvZiB4ICYgIiwgc3RybGVuKCIgJiBpdGVtIDYgb2YgeCAmICIpKSkiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgdHdvVGFiICYgImdvdG8gQ2xlYW5VcDsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgVGFi ICYgIn07IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNZWxzZSBpZiBwYXJh bVR5cGUgPSA2IHRoZW4NaWYgaXNPcHRpb25hbCB0aGVuDXB1dCBUYWIgJiAiaWYgKCIg JiBpdGVtIDYgb2YgeCAmICIpIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYN cHV0IGluZGVudCAmICJpZiAoZXJyID0gQUVQdXRLZXlQdHIoJnRoZUFwcGxlRXZlbnQs ICIgJiBpdGVtIDIgb2YgeCDCDSYgIiwgIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIs IChQdHIpIChjaGFyICopIiAmIGl0ZW0gNiBvZiB4IMINJiAiKzEsICoodW5zaWduZWQg Y2hhciAqKSIgJiBpdGVtIDYgb2YgeCAmICIpKSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IGluZGVudCAmIHRhYiAmICJnb3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbmQgaWYNZW5kIGlmIC0tIG5vdCBudWxsDWVuZCByZXBlYXQNaWYg aXNGdW5jIHRoZW4NcHV0IHRhYiAmICJpZiAoZXJyID0gQUVTZW5kKCZ0aGVBcHBsZUV2 ZW50LCAmdGhlUmVwbHksIGtBRVdhaXRSZXBseSIgYWZ0ZXIgcHJvY0JvZHkNZWxzZQ1w dXQgdGFiICYgImVyciA9IEFFU2VuZCgmdGhlQXBwbGVFdmVudCwgJnRoZVJlcGx5LCBr QUVOb1JlcGx5IiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNaWYgZGVmYXVsdFNlbmRNb2Rl IGlzIG5vdCBlbXB0eSB0aGVuIHB1dCAifCIgJiBkZWZhdWx0U2VuZE1vZGUgYWZ0ZXIg cHJvY0JvZHkNcHV0ICIsIGtBRU5vcm1hbFByaW9yaXR5LCAiICYgZGVmYXVsdFRpbWVP dXQgJiAiLCIgJiYgZGVmYXVsdElkbGVQcm9jICYmICIsIiDCDSYgZGVmYXVsdEFFRmls dGVyICYgIikiIGFmdGVyIHByb2NCb2R5DWlmIGlzRnVuYyB0aGVuDXB1dCAiKSIgJiBy ZXR1cm4gJiBUYWIgJiAiZ290byBDbGVhblVwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0ICJsb25nIHRoZUVycm47IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1 dCAiRGVzY1R5cGUgdHlwZUNvZGU7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1 dCAibG9uZyBhY3R1YWxTaXplOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQg dGFiICYgImlmIChBRUdldEtleVB0cigmdGhlUmVwbHksICdlcnJuJywgdHlwZUxvbmdJ bnRlZ2VyLCAmdHlwZUNvZGUsIiDCDSYmICIoUHRyKSAmdGhlRXJybiwgc2l6ZW9mKHRo ZUVycm4pLCAmYWN0dWFsU2l6ZSkgIT0gZXJyQUVEZXNjTm90Rm91bmQpIHsiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiLyogeW91ciBlcnJvciBoYW5k bGluZyBjb2RlIGhlcmUgKi8iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29U YWIgJiAifTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DS0tIGdldCB0aGUgcmVzdWx0 DXB1dCBpdGVtIDQgb2YgcGFyYW1JbmZvIGludG8gcGFyYW1UeXBlDXB1dCBOYW1lT2ZE YXRhVHlwZShpdGVtIDMgb2YgcGFyYW1JbmZvKSBpbnRvIG5hbWVMaXN0DWlmIHBhcmFt VHlwZSA9IDAgdGhlbiAtLSByZXN1bHQgaXMgQUVEZXNjDXB1dCB0YWIgJiAiZXJyID0g QUVHZXRLZXlEZXNjKCZ0aGVBcHBsZUV2ZW50LCBrZXlEaXJlY3RPYmplY3QsICIgwg0m IGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIHB0clRvVGhlUmVzdWx0KTsiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DWVsc2UgaWYgKHBhcmFtVHlwZSA9IDEpIHRoZW4gLS0gcmVz dWx0IGlzIEhhbmRsZQ1wdXQgIkFFRGVzYyAgYURlc2M7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCBUYWIgJiAiaWYgKGVyciA9IEFFR2V0S2V5RGVzYygmdGhlQXBw bGVFdmVudCwga2V5RGlyZWN0T2JqZWN0LCAiIMINJiBpdGVtIDQgb2YgbmFtZUxpc3Qg JiAiLCAmYURlc2MpKSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAm ICJnb3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYg IipwdHJUb1RoZVJlc3VsdCA9IGFEZXNjLmRhdGFIYW5kbGU7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDQgdGhlbiAtLSByZXN1bHQgaXMg Zml4ZWQgbGVuZ3RoDXB1dCBUYWIgJiAiZXJyID0gQUVHZXRLZXlQdHIoJnRoZVJlcGx5 LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsICZ0 eXBlQ29kZSwgKFB0cikgcHRyVG9UaGVSZXN1bHQsIHNpemVvZigiICYgaXRlbSA1IG9m IG5hbWVMaXN0ICYgIikiIMINJiAiLCAmYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDYgdGhlbiAtLSByZXN1bHQgaXMg c3RyMjU1DXB1dCBUYWIgJiAiaWYgKGVyciA9IEFFR2V0S2V5UHRyKCZ0aGVSZXBseSwg a2V5RGlyZWN0T2JqZWN0LCAiIMINJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCAmdHlw ZUNvZGUsIChQdHIpIHB0clRvVGhlUmVzdWx0KzEsIDI1NSIgwg0mICIsICZhY3R1YWxT aXplKSkiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiZ290byBD bGVhblVwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJpZiAoYWN0 dWFsU2l6ZSA+IDI1NSkiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIg JiAiYWN0dWFsU2l6ZSA9IDI1NTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBU YWIgJiAiKih1bnNpZ25lZCBjaGFyICopcHRyVG9UaGVSZXN1bHQgPSAodW5zaWduZWQg Y2hhcikgYWN0dWFsU2l6ZTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1l bHNlDXB1dCAiOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkgLS0gZW5kIG9mIEFFU2Vu ZA1lbmQgaWYNcHV0ICJDbGVhblVwOiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0 IFRhYiAmICJBRURpc3Bvc2VEZXNjKCZ0aGVBcHBsZUV2ZW50KTsiICYgcmV0dXJuIGFm dGVyIHByb2NCb2R5DXB1dCBUYWIgJiAiQUVEaXNwb3NlRGVzYygmdGhlUmVwbHkpOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHRhYiAmICJyZXR1cm4gZXJyOyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0ICJ9IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1pZiB2YXJEZWNsYXJlIDw+ICIiIHRoZW4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbnVt YmVyIG9mIGxpbmVzIGluIHZhckRlY2xhcmUNcHV0IFRhYiAmIGxpbmUgaSBvZiB2YXJE ZWNsYXJlICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXINZW5kIHJlcGVhdA1lbmQgaWYN cmV0dXJuIHByb2NIZWFkZXIgJiByZXR1cm4gJiBwcm9jQm9keSAmIHJldHVybg1lbHNl DXJldHVybiAiIg1lbmQgaWYNRW5kIENsaWVudFNhbXBsZQ0AAP//ABAAU2VydmVyIExh bmd1YWdl//wAEABDbGllbnQgTGFuZ3VhZ2X/9QAOAFRpbWVvdXQgVmFsdWX/9AAFADEy MDAA//AADgBSZXNvdXJjZSBUeXBl/+wACgBTZW5kIE1vZGX/6wAKAElkbGUgUHJvY//q AAkAriBGaWx0ZXIA/+UAEgBUYXJnZXQgRGVzY3JpcHRvcv/dAAUAYWV0ZQD/3AAMAFBy ZWZlcmVuY2Vz/9gADABSZXNvdXJjZSBJRP/WAAUATmFtZQD/1AAIAFZlcnNpb27/0gAC AC7/0AAOAExhbmd1YWdlIENvZGX/zgAMAFNjcmlwdCBDb2Rl/9MAAgAx/9EAAgAw/88A AgAw/80AAgAw/9cAAgAw/8ge04AKAAAABB7JABFjQUVMaXN0PSJsaXN0Ig1jQXBwbGlj YXRpb249ImNhcHAiDWNBcmM9ImNhcmMiDWNCb29sZWFuPSJib29sIg1jQ2VsbD0iY2Nl bCINY0NoYXI9ImNoYSAiDWNDb2xvclRhYmxlPSJjbHJ0Ig1jQ29sdW1uPSJjY29sIg1j RG9jdW1lbnQ9ImRvY3UiDWNEcmF3aW5nQXJlYT0iY2RydyINY0VudW1lcmF0aW9uPSJl bnVtIg1jRmlsZT0iZmlsZSINY0ZpeGVkPSJmaXhkIg1jR3JhcGhpY0xpbmU9ImdsaW4i DWNHcmFwaGljT2JqZWN0PSJjZ29iIg1jR3JhcGhpY1NoYXBlPSJjZ3NoIg1jR3JhcGhp Y1RleHQ9ImNndHgiDWNHcm91cGVkR3JhcGhpYz0iY3BpYyINY0luc2VydGlvbkxvYz0i aW5zbCINY0ludGxUZXh0PSJpdHh0Ig1jSW50bFdyaXRpbmdDb2RlPSJpbnRsIg1jSXRl bT0iY2l0bSINY0xpbmU9ImNsaW4iDWNMb25nSW50ZWdlcj0ibG9uZyINY01lbnU9ImNt bnUiDWNNZW51SXRlbT0iY21lbiINY09iamVjdD0iY29iaiINY09iamVjdFNwZWNpZmll cj0ib2JqICINY09wZW5hYmxlT2JqZWN0PSJjb29iIg1jT3ZhbD0iY292bCINY1BhcmFn cmFwaD0iY3BhciINY1BpeGVsPSJjcHhsIg1jUGl4ZWxNYXA9ImNwaXgiDWNQb2x5Z29u PSJjcGduIg1jUURQb2ludD0iUURwdCINY1FEUmVjdGFuZ2xlPSJxZHJ0Ig1jUmVjdGFu Z2xlPSJjcmVjIg1jUkdCQ29sb3I9ImNSR0IiDWNSb3RhdGlvbj0idHJvdCINY1JvdW5k ZWRSZWN0YW5nbGU9ImNycmMiDWNSb3c9ImNyb3ciDWNTZWxlY3Rpb249ImNzZWwiDWNT aG9ydEludGVnZXI9InNob3IiDWNUYWJsZT0iY3RibCINY1RleHQ9ImN0eHQiDWNUZXh0 Rmxvdz0iY2ZsbyINY1RleHRTdHlsZXM9InRzdHkiDWNUeXBlPSJ0eXBlIg1jV2luZG93 PSJjd2luIg1jV29yZD0iY3dvciINa0FFQWJvdXQ9ImFib3UiDWtBRUFmdGVyPSJhZnRl Ig1rQUVBbGlhc1NlbGVjdGlvbj0ic2FsaSINa0FFQWxsQ2Fwcz0iYWxjcCINa0FFQXJy b3dBdEVuZD0iYXJlbiINa0FFQXJyb3dBdFN0YXJ0PSJhcnN0Ig1rQUVBcnJvd0JvdGhF bmRzPSJhcmJvIg1rQUVBc2s9ImFzayAiDWtBRUJlZm9yZT0iYmVmbyINa0FFQmVnaW5u aW5nPSJiZ25nIg1rQUVCZWdpbnNXaXRoPSJiZ3d0Ig1rQUVCZWdpblRyYW5zYWN0aW9u PSJiZWdpIg1rQUVCb2xkPSJib2xkIg1rQUVDYXNlU2Vuc0VxdWFscz0iY3NlcSINa0FF Q2VudGVyZWQ9ImNlbnQiDWtBRUNoYW5nZVZpZXc9InZpZXciDWtBRUNsb25lPSJjbG9u Ig1rQUVDbG9zZT0iY2xvcyINa0FFQ29uZGVuc2VkPSJjb25kIg1rQUVDb250YWlucz0i Y29udCINa0FFQ29weT0iY29weSINa0FFQ29yZVN1aXRlPSJjb3JlIg1rQUVDb3VudEVs ZW1lbnRzPSJjbnRlIg1rQUVDcmVhdGVFbGVtZW50PSJjcmVsIg1rQUVDcmVhdGVQdWJs aXNoZXI9ImNwdWIiDWtBRUN1dD0iY3V0ICINa0FFRGVsZXRlPSJkZWxvIg1rQUVEb09i amVjdHNFeGlzdD0iZG9leCINa0FFRG9TY3JpcHQ9ImRvc2MiDWtBRURyYWc9ImRyYWci DWtBRUR1cGxpY2F0ZVNlbGVjdGlvbj0ic2R1cCINa0FFRWRpdEdyYXBoaWM9ImVkaXQi DWtBRUVtcHR5VHJhc2g9ImVtcHQiDWtBRUVuZD0iZW5kICINa0FFRW5kc1dpdGg9ImVu ZHMiDWtBRUVuZFRyYW5zYWN0aW9uPSJlbmR0Ig1rQUVFcXVhbHM9Ij0gICAiDWtBRUV4 cGFuZGVkPSJwZXhwIg1rQUVGYXN0PSJmYXN0Ig1rQUVGaW5kZXJFdmVudHM9IkZORFIi DWtBRUZvcm11bGFQcm90ZWN0PSJmcHJvIg1rQUVGdWxseUp1c3RpZmllZD0iZnVsbCIN a0FFR2V0Q2xhc3NJbmZvPSJxb2JqIg1rQUVHZXREYXRhPSJnZXRkIg1rQUVHZXREYXRh U2l6ZT0iZHNpeiINa0FFR2V0RXZlbnRJbmZvPSJndGVpIg1rQUVHZXRJbmZvU2VsZWN0 aW9uPSJzaW5mIg1rQUVHZXRQcml2aWxlZ2VTZWxlY3Rpb249InNwcnYiDWtBRUdyZWF0 ZXJUaGFuPSI+ICAgIg1rQUVHcmVhdGVyVGhhbkVxdWFscz0iPj0gICINa0FFR3Jvdz0i Z3JvdyINa0FFSGlkZGVuPSJoaWRuIg1rQUVIaVF1YWxpdHk9ImhpcXUiDWtBRUltYWdl R3JhcGhpYz0iaW1nciINIiJrQUVJbmZvPTExDWtBRUlzVW5pZm9ybT0iaXN1biINa0FF SXRhbGljPSJpdGFsIg1rQUVMZWZ0SnVzdGlmaWVkPSJsZWZ0Ig1rQUVMZXNzVGhhbj0i PCAgICINa0FFTGVzc1RoYW5FcXVhbHM9Ijw9ICAiDWtBRUxvd2VyY2FzZT0ibG93YyIN IiJrQUVNYWluPTANa0FFTWFrZU9iamVjdHNWaXNpYmxlPSJtdmlzIg1rQUVNaXNjU3Rh bmRhcmRzPSJtaXNjIg1rQUVNb2RpZmlhYmxlPSJtb2RmIg1rQUVNb3ZlPSJtb3ZlIg1r QUVObz0ibm8gICINa0FFTm9BcnJvdz0iYXJubyINa0FFTm9ubW9kaWZpYWJsZT0ibm1v ZCINa0FFT3Blbj0ib2RvYyINa0FFT3BlblNlbGVjdGlvbj0ic29wZSINa0FFT3V0bGlu ZT0ib3V0bCINa0FFUGFnZVNldHVwPSJwZ3N1Ig1rQUVQYXN0ZT0icGFzdCINa0FFUGxh aW49InBsYW4iDWtBRVByaW50PSJwZG9jIg1rQUVQcmludFNlbGVjdGlvbj0ic3ByaSIN a0FFUHJpbnRXaW5kb3c9InB3aW4iDWtBRVB1dEF3YXlTZWxlY3Rpb249InNwdXQiDWtB RVFEQWRkT3Zlcj0iYWRkbyINa0FFUURBZGRQaW49ImFkZHAiDWtBRVFEQWRNYXg9ImFk bXgiDWtBRVFEQWRNaW49ImFkbW4iDWtBRVFEQmljPSJiaWMgIg1rQUVRREJsZW5kPSJi bG5kIg1rQUVRRENvcHk9ImNweSAiDWtBRVFETm90QmljPSJuYmljIg1rQUVRRE5vdENv cHk9Im5jcHkiDWtBRVFETm90T3I9Im50b3IiDWtBRVFETm90WG9yPSJueG9yIg1rQUVR RE9yPSJvciAgIg1rQUVRRFN1Yk92ZXI9InN1Ym8iDWtBRVFEU3ViUGluPSJzdWJwIg1r QUVRRFhvcj0ieG9yICINa0FFUmVkbz0icmVkbyINa0FFUmVndWxhcj0icmVnbCINa0FF UmVwbGFjZT0icnBsYyINa0FFUmV2ZWFsU2VsZWN0aW9uPSJzcmV2Ig1rQUVSZXZlcnQ9 InJ2cnQiDWtBRVJpZ2h0SnVzdGlmaWVkPSJyZ2h0Ig1rQUVTYXZlPSJzYXZlIg1rQUVT ZXREYXRhPSJzZXRkIg1rQUVTZXRQb3NpdGlvbj0icG9zbiINa0FFU2hhZG93PSJzaGFk Ig0iImtBRVNoYXJpbmc9MTMNa0FFU2hvd0NsaXBib2FyZD0ic2hjbCINa0FFU2xlZXA9 InNsZXAiDWtBRVNtYWxsQ2Fwcz0ic21jcCINa0FFU3RyaWtldGhyb3VnaD0ic3RyayIN a0FFU3Vic2NyaXB0PSJzYnNjIg1rQUVTdXBlcnNjcmlwdD0ic3BzYyINa0FFVHJhbnNh Y3Rpb25UZXJtaW5hdGVkPSJ0dHJtIg1rQUVVbmRlcmxpbmU9InVuZGwiDWtBRVVuZG89 InVuZG8iDWtBRVdob2xlV29yZEVxdWFscz0id3dlcSINa0FFWWVzPSJ5ZXMgIg1rQUVa b29tPSJ6b29tIg0iImtCeUNvbW1lbnRWaWV3PTYNIiJrQnlEYXRlVmlldz0zDSIia0J5 SWNvblZpZXc9MQ0iImtCeUtpbmRWaWV3PTUNIiJrQnlMYWJlbFZpZXc9Nw0iImtCeU5h bWVWaWV3PTINIiJrQnlTaXplVmlldz00DSIia0J5U21hbGxJY29uPTANIiJrQnlWZXJz aW9uVmlldz04DWtleUFFQW5nbGU9ImthbmciDWtleUFFQXJjQW5nbGU9ImtlbmQiDWtl eUFFQmFzZUFkZHI9ImJhZGQiDWtleUFFQmduZENvbG9yPSJrYmNsIg1rZXlBRUJnbmRQ YXR0ZXJuPSJrYnB0Ig1rZXlBRUJvdW5kcz0ia2JuZCINa2V5QUVDZWxsTGlzdD0ia2Ns dCINa2V5QUVDbGFzc0lEPSJjbElEIg1rZXlBRUNvbG9yPSJrY2xyIg1rZXlBRUNvbG9y VGFibGU9ImtjbHMiDWtleUFFQ3VydmVIZWlnaHQ9ImtjaGQiDWtleUFFQ3VydmVXaWR0 aD0ia2N3ZCINa2V5QUVEYXNoU3R5bGU9ImRzdHkiDWtleUFFRGF0YT0iZGF0YSINa2V5 QUVEZWZpbml0aW9uUmVjdD0ia2RlZiINa2V5QUVEZXNjVHlwZT0iZHN0cCINa2V5QUVE ZXN0aW5hdGlvbj0iZGVzdCINa2V5QUVEb0FudGlBbGlhcz0iYW50YSINa2V5QUVEb0Rp dGhlcmVkPSJnZGl0Ig1rZXlBRURvUm90YXRlPSJrZHJ0Ig1rZXlBRURvU2NhbGU9Imtz Y2EiDWtleUFFRG9UcmFuc2xhdGU9Imt0cmEiDWtleUFFRWRpdGlvbkZpbGVMb2M9ImVs b2MiDWtleUFFRWxlbWVudHM9ImVsbXMiDWtleUFFRW5kUG9pbnQ9ImtlZHAiDWtleUFF RXZlbnRDbGFzcz0iZXZjbCINa2V5QUVFdmVudElEPSJldnRpIg1rZXlBRUZpbGU9Imtm aWwiDWtleUFFRmlsZVR5cGU9ImZsdHAiDWtleUFFRmlsbENvbG9yPSJrZmNsIg1rZXlB RUZpbGxQYXR0ZXJuPSJrZnB0Ig1rZXlBRUZsaXBIb3Jpem9udGFsPSJrZmhvIg1rZXlB RUZsaXBWZXJ0aWNhbD0ia2Z2dCINa2V5QUVGb250PSJrZm50Ig1rZXlBRUZvcm11bGE9 ImtmbGEiDWtleUFFR3JhcGhpY09iamVjdHM9ImtncnMiDWtleUFFSW1hZ2VRdWFsaXR5 PSJncXVhIg1rZXlBRUluc2VydEhlcmU9Imluc2giDWtleUFFS2V5Rm9ybXM9ImtleWYi DWtleUFFS2V5d29yZD0ia3l3ZCINa2V5QUVMaW5lQXJyb3c9ImxuYXIiDWtleUFFTmFt ZT0ia25hbSINa2V5QUVOZXdFbGVtZW50TG9jPSJrbmVsIg1rZXlBRU9iamVjdD0ia29i aiINa2V5QUVPYmplY3RDbGFzcz0ia29jbCINa2V5QUVPZmZTdHlsZXM9Im9mc3QiDWtl eUFFT25TdHlsZXM9Im9uc3QiDWtleUFFUGFyYW1ldGVycz0icHJtcyINa2V5QUVQYXJh bUZsYWdzPSJwbWZnIg1rZXlBRVBlbkNvbG9yPSJrcGNsIg1rZXlBRVBlblBhdHRlcm49 ImtwYXQiDWtleUFFUGVuV2lkdGg9Imtwd2QiDWtleUFFUGl4ZWxEZXB0aD0ia3BkcCIN a2V5QUVQaXhNYXBNaW51cz0ia3BtbSINa2V5QUVQTVRhYmxlPSJrcG10Ig1rZXlBRVBv aW50TGlzdD0ia3B0cyINa2V5QUVQb2ludFNpemU9ImtwdHoiDWtleUFFUG9zaXRpb249 Imtwb3MiDWtleUFFUHJvcERhdGE9InByZHQiDWtleUFFUHJvcGVydGllcz0icXBybyIN a2V5QUVQcm9wZXJ0eT0ia3BycCINa2V5QUVQcm9wRmxhZ3M9InByZmciDWtleUFFUHJv cElEPSJwcm9wIg1rZXlBRVByb3RlY3Rpb249ImtwdGMiDWtleUFFUmVuZGVyQXM9Imty ZW4iDWtleUFFUmVxdWVzdGVkVHlwZT0icnR5cCINa2V5QUVSZXN1bHQ9Ii0tLS0iDWtl eUFFUmVzdWx0SW5mbz0icnNpbiINa2V5QUVSb3RhdGlvbj0ia3JvdCINa2V5QUVSb3RQ b2ludD0ia3J0cCINa2V5QUVSb3dMaXN0PSJrcmxzIg1rZXlBRVNhdmVPcHRpb25zPSJz YXZvIg1rZXlBRVNjYWxlPSJrc2NsIg1rZXlBRVNjcmlwdFRhZz0ia1N0ZyINa2V5QUVT aG93V2hlcmU9InNob3ciDWtleUFFU3RhcnRBbmdsZT0ia3N0YSINa2V5QUVTdGFydFBv aW50PSJrc3RyIg1rZXlBRVN0eWxlcz0ia3N0eSINa2V5QUVUZXh0PSJrdHh0Ig1rZXlB RVRleHRDb2xvcj0ia3R4YyINa2V5QUVUZXh0Rm9udD0ia3R4ZiINa2V5QUVUZXh0UG9p bnRTaXplPSJrdHBzIg1rZXlBRVRleHRTdHlsZXM9InR4dHMiDWtleUFFVGhlVGV4dD0i dGh0eCINa2V5QUVUcmFuc2Zlck1vZGU9Imt0cm4iDWtleUFFVHJhbnNsYXRpb249Imt0 cmwiDWtleUFFVHJ5QXNTdHJ1Y3RHcmFmPSJ0b29nIg1rZXlBRVVuaWZvcm1TdHlsZXM9 InVuaXMiDWtleUFFVXBkYXRlT249Imt1cGQiDWtleUFFVXNlclRlcm09InV0cm0iDWtl eUFFV2luZG93PSJ3bmR3Ig1rZXlBRVdyaXRpbmdDb2RlPSJ3cmNkIg1rZXlNaXNjZWxs YW5lb3VzPSJmbXNjIg1rZXlTZWxlY3Rpb249ImZzZWwiDWtleVdpbmRvdz0ia3duZCIN cEFyY0FuZ2xlPSJwYXJjIg1wQmFja2dyb3VuZENvbG9yPSJwYmNsIg1wQmFja2dyb3Vu ZFBhdHRlcm49InBicHQiDXBCZXN0VHlwZT0icGJzdCINcEJvdW5kcz0icGJuZCINcENs YXNzPSJwY2xzIg1wQ2xpcGJvYXJkPSJwY2xpIg1wQ29sb3I9ImNvbHIiDXBDb2xvclRh YmxlPSJjbHRiIg1wQ29ybmVyQ3VydmVIZWlnaHQ9InBjaGQiDXBDb3JuZXJDdXJ2ZVdp ZHRoPSJwY3dkIg1wRGFzaFN0eWxlPSJwZHN0Ig1wRGVmYXVsdFR5cGU9ImRlZnQiDXBE ZWZpbml0aW9uUmVjdD0icGRydCINcEVuYWJsZWQ9ImVuYmwiDXBFbmRQb2ludD0icGVu ZCINcEZpbGxDb2xvcj0iZmxjbCINcEZpbGxQYXR0ZXJuPSJmbHB0Ig1wRm9udD0iZm9u dCINcEZvcm11bGE9InBmb3IiDXBHcmFwaGljT2JqZWN0cz0iZ29icyINcEhhc0Nsb3Nl Qm94PSJoY2xiIg1wSGFzVGl0bGVCYXI9InB0aXQiDXBJbmRleD0icGlkeCINcEluc2Vy dGlvbkxvYz0icGlucyINcElzRmxvYXRpbmc9ImlzZmwiDXBJc0Zyb250UHJvY2Vzcz0i cGlzZiINcElzTW9kYWw9InBtb2QiDXBJc01vZGlmaWVkPSJpbW9kIg1wSXNSZXNpemFi bGU9InByc3oiDXBJc1N0YXRpb25lcnlQYWQ9InBzcGQiDXBJc1pvb21hYmxlPSJpc3pt Ig1wSXNab29tZWQ9InB6dW0iDXBJdGVtTnVtYmVyPSJpdG1uIg1wSnVzdGlmaWNhdGlv bj0icGpzdCINcExpbmVBcnJvdz0iYXJybyINcE1lbnVJRD0ibW5pZCINcE5hbWU9InBu YW0iDXBOZXdFbGVtZW50TG9jPSJwbmVsIg1wUGVuQ29sb3I9InBwY2wiDXBQZW5QYXR0 ZXJuPSJwcHBhIg1wUGVuV2lkdGg9InBwd2QiDXBQaXhlbERlcHRoPSJwZHB0Ig1wUG9p bnRMaXN0PSJwdGx0Ig1wUG9pbnRTaXplPSJwdHN6Ig1wUHJvdGVjdGlvbj0icHBybyIN cFJvdGF0aW9uPSJwcm90Ig1wU2NhbGU9InBzY2wiDXBTY3JpcHRUYWc9InBzY3QiDXBT ZWxlY3Rpb249InNlbGUiDXBTdGFydEFuZ2xlPSJwYW5nIg1wU3RhcnRQb2ludD0icHN0 cCINcFRleHRDb2xvcj0icHR4YyINcFRleHRGb250PSJwdHhmIg1wVGV4dEl0ZW1EZWxp bWl0ZXJzPSJ0eGRsIg1wVGV4dFBvaW50U2l6ZT0icHRwcyINcFRleHRTdHlsZXM9InR4 c3QiDXBUcmFuc2Zlck1vZGU9InBwdG0iDXBUcmFuc2xhdGlvbj0icHRycyINcFVuaWZv cm1TdHlsZXM9InVzdGwiDXBVcGRhdGVPbj0icHVwZCINcFVzZXJTZWxlY3Rpb249InB1 c2wiDXBWZXJzaW9uPSJ2ZXJzIg1wVmlzaWJsZT0icHZpcyINdHlwZUFFVGV4dD0idFRY VCINdHlwZUFwcGxlRXZlbnQ9IkFFVlQiDXR5cGVBcmM9InRhcmMiDXR5cGVCZXN0PSJi ZXN0Ig10eXBlQ2VsbD0iY2VsbCINdHlwZUNsYXNzSW5mbz0iY2xpbiINdHlwZUNvbG9y VGFibGU9ImNscnQiDXR5cGVDb2x1bW49ImNvbG0iDXR5cGVEYXNoU3R5bGU9InRkYXMi DXR5cGVEYXRhPSJ0ZHRhIg10eXBlRHJhd2luZ0FyZWE9InRkYXIiDXR5cGVFbGVtSW5m bz0iZWxpbiINdHlwZUVQUz0iRVBTICINdHlwZUV2ZW50SW5mbz0iZXZpbiINdHlwZUZp bmRlcldpbmRvdz0iZndpbiINdHlwZUZpeGVkPSJmaXhkIg10eXBlR3JhcGhpY0xpbmU9 InRnbG4iDXR5cGVHcmFwaGljVGV4dD0iZ3R4dCINdHlwZUdyb3VwZWRHcmFwaGljPSJ0 Z3J1Ig10eXBlSW5zZXJ0aW9uTG9jPSJpbnNsIg10eXBlSW50bFRleHQ9Iml0eHQiDXR5 cGVJbnRsV3JpdGluZ0NvZGU9ImludGwiDXR5cGVPdmFsPSJ0b3ZsIg10eXBlUGFyYW1J bmZvPSJwbWluIg10eXBlUGljdD0iUElDVCINdHlwZVBpeGVsTWFwPSJ0cGl4Ig10eXBl UGl4TWFwTWludXM9InRwbW0iDXR5cGVQb2x5Z29uPSJ0cG9sIg10eXBlUHJvcEluZm89 InBpbmYiDXR5cGVRRFBvaW50PSJRRHB0Ig10eXBlUURSZWN0YW5nbGU9InFkcnQiDXR5 cGVSZWN0YW5nbGU9InJjdGUiDXR5cGVSR0IxNj0idHIxNiINdHlwZVJHQjk2PSJ0cjk2 Ig10eXBlUkdCQ29sb3I9IlJHQiAiDXR5cGVSb3RhdGlvbj0idHJvdCINdHlwZVJvdW5k ZWRSZWN0YW5nbGU9InRyZHIiDXR5cGVSb3c9InJvdyAiDXR5cGVTY3JhcFN0eWxlcz0i c3R5bCINdHlwZVN0eWxlZFRleHQ9IlNUWFQiDXR5cGVUYWJsZT0idGFibCINdHlwZVRl eHRTdHlsZXM9InRzdHkiDXR5cGVUSUZGPSJUSUZGIg0iInpvb21Jbj03DSIiem9vbU91 dD04DWVudW1TYXZlT3B0aW9ucz0ic2F2byINZW51bVBvc2l0aW9uPSJwb3NpIg1lbnVt S2V5Rm9ybT0ia2ZybSINZW51bVN0eWxlPSJzdHlsIg1lbnVtSnVzdGlmaWNhdGlvbj0i anVzdCINZW51bVByb3RlY3Rpb249InBydG4iDWVudW1UcmFuc2Zlck1vZGU9InRyYW4i DWVudW1BcnJvd3M9ImFycm8iDWVudW1RdWFsaXR5PSJxdWFsIg1rQUVJbmRleD0iaW5k eCINa0FFTmFtZT0ibmFtZSINa0FFSWRlbnRpZmllcj0iaWQgICINa0FFUmVxdWlyZWRT dWl0ZT0icmVxZCINa0FFVGV4dFN1aXRlPSJURVhUIg1rQUVRdWlja0RyYXdTdWl0ZT0i cWRydyINa0FFUURTdXBwbGVtZW50YWxTdWl0ZT0icWRzcCINa0FFVGFibGVTdWl0ZT0i dGJscyIA/+0ACwBDb3JlU2FtcGxlAP/VABEAQ29yZVNhbXBsZSBTdWl0ZQBwcmVmZXJl bmNlAG9uIG1vdXNlVXANaWYgd29yZCAxIHRvIDIgb2YgbG9uZyBuYW1lIG9mIHRhcmdl dCA9ICJjYXJkIGJ1dHRvbiIgdGhlbg1wdXQgaWQgb2YgdGFyZ2V0IGludG8gaQ1wdXQg UHJlZmVyQ2xpZW50TGFuZ0J1dHRvbklEKCkgaW50byBjbGllbnRMaXN0DXB1dCBQcmVm ZXJTZXJ2ZXJMYW5nQnV0dG9uSUQoKSBpbnRvIHNlcnZlckxpc3QNaWYgQ2hlY2tHcm91 cChpLFByZWZlclNlcnZlckxhbmdCdXR0b25JRCgpKSB0aGVuDWVsc2UgaWYgQ2hlY2tH cm91cChpLFByZWZlckNsaWVudExhbmdCdXR0b25JRCgpKSB0aGVuDWVsc2UNcGFzcyBt b3VzZVVwDWVuZCBpZg1zZXQgaGlsaXRlIG9mIGNhcmQgYnV0dG9uIGlkIGkgdG8gdHJ1 ZQ1lbmQgaWYNZW5kIG1vdXNlVXANDWZ1bmN0aW9uIENoZWNrR3JvdXAgdGhlTnVtLHRo ZUxpc3QNcHV0IG51bWJlciBvZiBpdGVtcyBpbiB0aGVMaXN0IGludG8gbg1yZXBlYXQg d2l0aCBpID0gMSB0byBuDWlmIGl0ZW0gaSBvZiB0aGVMaXN0ID0gdGhlTnVtIHRoZW4N cmVwZWF0IHdpdGggaiA9IDEgdG8gbg1zZXQgaGlsaXRlIG9mIGNhcmQgYnV0dG9uIGlk IChpdGVtIGogb2YgdGhlTGlzdCkgdG8gZmFsc2UNZW5kIHJlcGVhdA1yZXR1cm4gdHJ1 ZQ1lbmQgaWYNZW5kIHJlcGVhdA1yZXR1cm4gZmFsc2UNZW5kIENoZWNrR3JvdXANDWZ1 bmN0aW9uIFdoaWNoSW5Hcm91cCB0aGVMaXN0DXB1dCBudW1iZXIgb2YgaXRlbXMgaW4g dGhlTGlzdCBpbnRvIG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbg1pZiBoaWxpdGUgb2Yg Y2FyZCBidXR0b24gaWQgKGl0ZW0gaSBvZiB0aGVMaXN0KSB0aGVuDXJldHVybiBpdGVt IGkgb2YgdGhlTGlzdA1lbmQgaWYNZW5kIHJlcGVhdA1lbmQgV2hpY2hJbkdyb3VwDQ1v biBjbG9zZUNhcmQNZ2xvYmFsIGNsaWVudExhbmcsY2xpZW50SGFzR2x1ZSxzZXJ2ZXJM YW5nDXB1dCBjbGllbnRMYW5nIGludG8gY3VyU2NyaXB0DXB1dCBzZXJ2ZXJMYW5nIGlu dG8gY3VyU2VydmVyDXB1dCBjbGllbnRIYXNHbHVlIGludG8gY3VyR2x1ZQ1DaGVja1By ZWZlcmVuY2UNaWYgKGN1clNjcmlwdCA8PiBjbGllbnRMYW5nKSB0aGVuDXB1dCB0aGUg c2NyaXB0IG9mIGNhcmQgYnV0dG9uIGlkIFdoaWNoSW5Hcm91cChQcmVmZXJDbGllbnRM YW5nQnV0dG9uSUQoKSkgaW50byBidG5TY3JpcHQNcHV0IFNlYXJjaChidG5TY3JpcHQs ICJmdW5jdGlvbiBDbGllbnRUZW1wbGF0ZSIsIHRydWUsIGZhbHNlKSBpbnRvIGxpbmVM aXN0DXB1dCBpdGVtIDEgb2YgbGluZUxpc3QgaW50byBjbG50VG1wbFN0YXJ0DXB1dCBT ZWFyY2goYnRuU2NyaXB0LCAiZnVuY3Rpb24gQ2xpZW50U2FtcGxlIiwgdHJ1ZSwgZmFs c2UpIGludG8gbGluZUxpc3QNcHV0IGl0ZW0gMSBvZiBsaW5lTGlzdCBpbnRvIGNsbnRT bXBsU3RhcnQNcHV0IHRoZSBzY3JpcHQgb2YgYmtnbmQgImV2ZW50cyIgaW50byBvcmdT Y3JpcHQNcHV0IFNlYXJjaChvcmdTY3JpcHQsICItLSBsYW5ndWFnZSIsIHRydWUsIGZh bHNlKSBpbnRvIGxpbmVMaXN0DXB1dCBpdGVtIDEgb2YgbGluZUxpc3QgaW50byB4DWlm IHggPiAwIHRoZW4NcHV0IHJldHVybiAmIChsaW5lIGNsbnRUbXBsU3RhcnQgdG8gY2xu dFNtcGxTdGFydC0xIG9mIGJ0blNjcmlwdCkgwg1pbnRvIGxpbmUgeCsxIHRvIDMwMDAw IG9mIG9yZ1NjcmlwdA1zZXQgdGhlIHNjcmlwdCBvZiBia2duZCAiZXZlbnRzIiB0byBv cmdTY3JpcHQNZW5kIGlmDWRlbGV0ZSBsaW5lIDEgdG8gKGNsbnRTbXBsU3RhcnQtMSkg b2YgYnRuU2NyaXB0DXB1dCB0aGUgc2NyaXB0IG9mIGNhcmQgYnV0dG9uICJjbGllbnQg Y29kZSIgb2YgY2FyZCAiTWFpbk1lbnUiIGludG8gb3JnU2NyaXB0DXB1dCBTZWFyY2go b3JnU2NyaXB0LCAiLS0gbGFuZ3VhZ2UiLCB0cnVlLCBmYWxzZSkgaW50byBsaW5lTGlz dA1wdXQgaXRlbSAxIG9mIGxpbmVMaXN0IGludG8geA1pZiB4ID4gMCB0aGVuDXB1dCBy ZXR1cm4gJiBidG5TY3JpcHQgaW50byBsaW5lIHgrMSB0byAzMDAwMCBvZiBvcmdTY3Jp cHQNc2V0IHRoZSBzY3JpcHQgb2YgY2FyZCBidXR0b24gImNsaWVudCBjb2RlIiBvZiBj YXJkICJNYWluTWVudSIgdG8gb3JnU2NyaXB0DWVuZCBpZg1lbmQgaWYNaWYgKGN1clNl cnZlciA8PiBzZXJ2ZXJMYW5nKSB0aGVuDXB1dCB0aGUgc2NyaXB0IG9mIGNhcmQgYnV0 dG9uIGlkIFdoaWNoSW5Hcm91cChQcmVmZXJTZXJ2ZXJMYW5nQnV0dG9uSUQoKSkgaW50 byBidG5TY3JpcHQNcHV0IFNlYXJjaChidG5TY3JpcHQsICJmdW5jdGlvbiBTZXJ2ZXJT YW1wbGUiLCB0cnVlLCBmYWxzZSkgaW50byBsaW5lTGlzdA1wdXQgaXRlbSAxIG9mIGxp bmVMaXN0IGludG8geA1kZWxldGUgbGluZSAxIHRvIHgtMSBvZiBidG5TY3JpcHQNcHV0 IHRoZSBzY3JpcHQgb2YgY2FyZCBidXR0b24gInNlcnZlciBjb2RlIiBvZiBjYXJkICJN YWluTWVudSIgaW50byBvcmdTY3JpcHQNcHV0IFNlYXJjaChvcmdTY3JpcHQsICItLSBs YW5ndWFnZSIsIHRydWUsIGZhbHNlKSBpbnRvIGxpbmVMaXN0DXB1dCBpdGVtIDEgb2Yg bGluZUxpc3QgaW50byB4DWlmIHggPiAwIHRoZW4NcHV0IHJldHVybiAmIGJ0blNjcmlw dCBpbnRvIGxpbmUgeCsxIHRvIDMwMDAwIG9mIG9yZ1NjcmlwdA1zZXQgdGhlIHNjcmlw dCBvZiBjYXJkIGJ1dHRvbiAic2VydmVyIGNvZGUiIG9mIGNhcmQgIk1haW5NZW51IiB0 byBvcmdTY3JpcHQNZW5kIGlmDWVuZCBpZg1pZiAoY3VyU2NyaXB0IDw+IGNsaWVudExh bmcpIG9yIChjbGllbnRIYXNHbHVlIDw+IGN1ckdsdWUpIHRoZW4NUmVEb1NjcmlwdA1l bmQgaWYNcGFzcyBjbG9zZUNhcmQNZW5kIGNsb3NlQ2FyZA1mdW5jdGlvbiBDbGllbnRU ZW1wbGF0ZQAAAAEgQk1BUAAAC4sAAAAAAAAAAAABAAAAAAAAAVYCAAAAAAAAAAAAABcA uAFTAf4AAAAAAAAAAAAAAAAAAADcjBOA4REg4QaFiuEVEOEG4RUw4Qa4ho4TgOERIOEG jRNA4REI4Qa/gb+Bv4G/gb+Bv4GkgYkfIOEMgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGG gYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaB hoGGgYaBhoGGpIHiEx5EAfABgOITETVAAICK4gTBMcyVmMADGByJ4hMewUoSliUgRKSg 4hMUwXmSlCHgRKSY4hMSwUBSlCUARKSE4hMRwTOMdBjAQxi4geITHkQAAABgQ0FSRAAA IwkAAAAAAAAAAEAAAAAAAAAAAAAAAAAAOvAAABPAAAAAAgAAAAAAAAAAAABzdWl0ZSBP SFBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgQ0FSRAAAIaAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAOvAAABPAAAAAAAAAAAAABAAAAIAAAgAPAFJlcXVpcmVk IFN1aXRlAAADAC0ARXZlbnRzIHRoYXQgZXZlcnkgYXBwbGljYXRpb24gc2hvdWxkIHN1 cHBvcnQAABgABQByZXFkAAAEACwAT3BlbixhZXZ0b2RvYw1QcmludCxhZXZ0cGRvYw1R dWl0LGFldnRxdWl0DXN1aXRlIHJlcWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAaBDQVJEAAAmtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA68AAAE8AAAAAAAAAA AAAGAAABSgACAA4ATXkgQ29yZSBTdWl0ZQADACcAU3VpdGUgdGhhdCBhcHBsaWVzIHRv IGFsbCBhcHBsaWNhdGlvbnMAABgABQBzbXBsAAAKAB4AQXBwbGljYXRpb24sY2FwcA1X aW5kb3csY3dpbg0ADgALAHBvc2kNa2ZybQ0AAAQAywBDbG9uZSxjb3JlY2xvbg1DbG9z ZSxjb3JlY2xvcw1Db3VudCxjb3JlY250ZQ1DcmVhdGUsY29yZWNyZWwNRGVsZXRlLGNv cmVkZWxvDUV4aXN0cyxjb3JlZG9leA1DbGFzcyBJbmZvLGNvcmVxb2JqDUdldCBEYXRh LGNvcmVnZXRkDURhdGEgU2l6ZSxjb3JlZHNpeg1FdmVudCBJbmZvLGNvcmVndGVpDU1v dmUsY29yZW1vdmUNU2V0IERhdGEsY29yZXNldGQNAHN1aXRlIHNtcGwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABQENBUkQAABSxAAAAAAAAIElAAAAAAAAAAAAAAAAAADrwAAAV 2AAAAAgAAAAAAAkAAADwAAEABQAqKioqAAAKACIALCxudWxsLDAsDSwsLDAsDSwsLDAs DSwsLDAsDSwsLDAsADEAAgAxAAMABQAqKioqAAAwAEoARnVuY3Rpb24gQUUoDSBkaXJl Y3RQYXJhbTpBRURlc2M7IA0gOkFFRGVzYzsgDSA6QUVEZXNjOyANIDpBRURlc2MpOk9T RXJyOwAFAD+ABgAAAA9UaGlzIGlzIGEgdGVtcGxhdGUgY2FyZCBmb3IgdGhpcyBiYWNr Z3JvdW5k0WRvbid0IHVzZSBpdCEAAAYABgByZXBseQAIAAUAbnVsbAAABwAFAHJwbHkA ZXZlbnQgICAgICAgICAsAAAAAAAAAAAAAAAAAABgQk1BUAAAIEkAAAAAAAAAAAABAAAA AAAAAVYCAADOAd0A1gHnAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAjSMBIAMjAUADFPAD FDADFCgDIwGwAyMD0gMjB48D//8AAAEAQ0FSRAAAIm8AAAAAAAAAAAAAAAAAAAAAAAAA AAAAOvAAABXYAAAAAAAAAAAACQAAALoAAQAFAHJlcWQAAAMABQBhZXZ0AAAKADUALCxu dWxsLDMyNzY4LA0sLGFsaXMsMjA0ODAsTGlzdCBvZiBkb2N1bWVudHMgdG8gb3BlbgAA NwACADEAAgAFAE9wZW4AAAUAJQBPcGVuIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBkb2N1 bWVudHMAAAQABQBvZG9jAAAGAA8AbWlzc2luZ05hbWUoOCkAADAADwBPcGVuIMINICBw YXJhbQBldmVudCBhZXZ0b2RvYwAAAAABIENBUkQAACRiAAAAAAAAAAAAAAAAAAAAAAAA AAAAADrwAAAV2AAAAAAAAAAAAAkAAAC8AAEABQByZXFkAAADAAUAYWV2dAAACgA2ACws bnVsbCwzMjc2OCwNLCxhbGlzLDE2Mzg0LExpc3Qgb2YgZG9jdW1lbnRzIHRvIHByaW50 ADcAAgAxAAIABgBQcmludAAFACYAUHJpbnQgdGhlIHNwZWNpZmllZCBsaXN0IG9mIGRv Y3VtZW50cwAEAAUAcGRvYwAABgARAG1pc3NpbmdOYW1lKDIxNCkAADAAEABQcmludCDC DSAgcGFyYW1ldmVudCBhZXZ0cGRvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAENBUkQAACVvAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAV2AAAAAAAAAAA AAkAAACgAAEABQByZXFkAAADAAUAYWV2dAAACgA4ACwsbnVsbCwzMjc2OCwNLCxudWxs LDM2ODY0LE5vIGRpcmVjdCBwYXJhbWV0ZXIgcmVxdWlyZWQANwACADEAAgAFAFF1aXQA AAUAEQBRdWl0IGFwcGxpY2F0aW9uAAAEAAUAcXVpdAAABgARAG1pc3NpbmdOYW1lKDM5 MikAADAABQBRdWl0AGV2ZW50IGFldnRxdWl0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAASBDQVJEAAAn0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA68AAAFdgAAAAAAAAA AAAIAAAA1gABAAUAc21wbAAAAwAFAGNvcmUAAAoAXQAsLG9iaiAsMCwNLCxvYmogLDQw OTYsVGhlIG9iamVjdCB0byBjbG9uZQ1UbyxpbnNoLGluc2wsMzI3NjgsVGhlIG5ldyBs b2NhdGlvbiBmb3IgdGhlIG9iamVjdAAAAgAGAENsb25lAAUAEABDbG9uZSBhbiBvYmpl Y3QABAAFAGNsb24AAAYAEQBtaXNzaW5nTmFtZSgzODMpAAAwAB4AQ2xvbmUgwg0gIHBh cmFtIMINIFtUbyBwYXJhbV1ldmVudCBjb3JlY2xvbgAAAAAAAAAAAOBDQVJEAAAoTgAA AAAAAAAAAAAAAAAAAAAAAAAAAAA68AAAFdgAAAAAAAAAAAAIAAAAmAABAAUAc21wbAAA AwAFAGNvcmUAAAoALgAsLG51bGwsMzI3NjgsDSwsb2JqICw0MDk2LFRoZSBvYmplY3Qg dG8gY2xvc2UAAgAGAENsb3NlAAUAEABDbG9zZSBhbiBvYmplY3QABAAFAGNsb3MAAAYA EQBtaXNzaW5nTmFtZSgxMzUpAAAwABAAQ2xvc2Ugwg0gIHBhcmFtZXZlbnQgY29yZWNs b3MAAAAAAAABgENBUkQAACljAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAV2AAAAAAA AAAAAAgAAAEqAAEABQBzbXBsAAADAAUAY29yZQAACgB5ACwsbG9uZywwLA0sLG9iaiAs MCxUaGUgb2JqZWN0IHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBjb3VudGVkDUNsYXNz LGtvY2wsdHlwZSwwLFRoZSBjbGFzcyBvZiB0aGUgZWxlbWVudHMgdG8gYmUgY291bnRl ZAAAAgAGAENvdW50AAUARQBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBh IHBhcnRpY3VsYXIgY2xhc3Mgd2l0aGluIGFuIG9iamVjdAAABAAFAGNudGUAAAYAEQBt aXNzaW5nTmFtZSgxNTYpAAAwAB8AQ291bnQgwg0gIHBhcmFtIMINIENsYXNzIHBhcmFt AGV2ZW50IGNvcmVjbnRlAAAAAAAAAAAAAAAAAAAAAAAAAAACIENBUkQAACoTAAAAAAAA AAAAAAAAAAAAAAAAAAAAADrwAAAV2AAAAAAAAAAAAAgAAAHGAAEABQBzbXBsAAADAAUA Y29yZQAACgESACwsb2JqICwwLA0sLG51bGwsMzY4NjQsDU5ldyxrb2NsLHR5cGUsMCxU aGUgY2xhc3Mgb2YgdGhlIG5ldyBlbGVtZW50DUF0LGluc2gsaW5zbCwzMjc2OCxUaGUg bG9jYXRpb24gYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBlbGVtZW50DVdpdGggRGF0YSxk YXRhLCoqKiosMzI3NjgsVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGVsZW1lbnQNV2l0 aCBQcm9wZXJ0aWVzLHByZHQscmVjbywzMjc2OCxUaGUgaW5pdGlhbCBkYXRhIGZvciB0 aGUgcHJvcGVydGllcyBvZiB0aGUgZWxlbWVudAACAAcAQ3JlYXRlAAAFABUAQ3JlYXRl IGEgbmV3IGVsZW1lbnQAAAQABQBjcmVsAAAGABEAbWlzc2luZ05hbWUoNDkxKQAAMABS AENyZWF0ZSDCDSBOZXcgcGFyYW0gwg0gW0F0IHBhcmFtXSDCDSBbV2l0aCBEYXRhIHBh cmFtXSDCDSBbV2l0aCBQcm9wZXJ0aWVzIHBhcmFtXWV2ZW50IGNvcmVjcmVsAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQBDQVJEAAArnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6 8AAAFdgAAAAAAAAAAAAIAAAAsAABAAUAc21wbAAAAwAFAGNvcmUAAAoAMAAsLG51bGws MzI3NjgsDSwsb2JqICw0MDk2LFRoZSBlbGVtZW50IHRvIGRlbGV0ZQACAAcARGVsZXRl AAAFACEARGVsZXRlIGFuIGVsZW1lbnQgZnJvbSBhbiBvYmplY3QAAAQABQBkZWxvAAAG ABEAbWlzc2luZ05hbWUoNDU2KQAAMAARAERlbGV0ZSDCDSAgcGFyYW0AZXZlbnQgY29y ZWRlbG8AAAAAAAAAAAAAAAAAAAEAQ0FSRAAALLMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA OvAAABXYAAAAAAAAAAAACAAAAKAAAQAFAHNtcGwAAAMABQBjb3JlAAAKACoALCxib29s LDAsDSwsb2JqICwwLFRoZSBvYmplY3QgaW4gcXVlc3Rpb24AAgAHAEV4aXN0cwAABQAZ AFRlbGwgaWYgYW4gb2JqZWN0IGV4aXN0cwAABAAFAGRvZXgAAAYAEABtaXNzaW5nTmFt ZSg2MikAMAARAEV4aXN0cyDCDSAgcGFyYW0AZXZlbnQgY29yZWRvZXgAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAABoENBUkQAAC4mAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADrwAAAV2AAAAAAAAAAAAAgAAAFAAAEABQBzbXBsAAADAAUAY29yZQAACgCkACwsY2xp biwwLA0sLHR5cGUsMzI3NjgsVGhlIG9iamVjdCBjbGFzcyBhYm91dCB3aGljaCBpbmZv cm1hdGlvbiBpcyByZXF1ZXN0ZWQNSW4sd3JjZCxpbnRsLDMyNzY4LFRoZSBodW1hbiBs YW5ndWFnZSBhbmQgc2NyaXB0IHN5c3RlbSBpbiB3aGljaCB0byByZXR1cm4gaW5mb3Jt YXRpb24AAgALAENsYXNzIEluZm8AAAUAJgBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYW4g b2JqZWN0IGNsYXNzAAQABQBxb2JqAAAGABEAbWlzc2luZ05hbWUoMjUxKQAAMAAlAENs YXNzIEluZm8gwg0gWyBwYXJhbV0gwg0gW0luIHBhcmFtXQBldmVudCBjb3JlcW9iagAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgQ0FSRAAAL7oAAAAAAAAAAAAAAAAA AAAAAAAAAAAAOvAAABXYAAAAAAAAAAAACAAAARIAAQAFAHNtcGwAAAMABQBjb3JlAAAK AIUALCwqKioqLDAsDSwsb2JqICwwLFRoZSBvYmplY3Qgd2hvc2UgZGF0YSBpcyB0byBi ZSByZXR1cm5lZA1BcyxydHlwLHR5cGUsNDkxNTIsVGhlIGRlc2lyZWQgdHlwZXMgZm9y IHRoZSBkYXRhLCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlAAACAAkAR2V0IERhdGEAAAUA GwBHZXQgdGhlIGRhdGEgZm9yIGFuIG9iamVjdAAABAAFAGdldGQAAAYAEQBtaXNzaW5n TmFtZSgyNTIpAAAwACEAR2V0IERhdGEgwg0gIHBhcmFtIMINIFtBcyBwYXJhbV0AZXZl bnQgY29yZWdldGQAAAAAAAAAAAAAAAABYENBUkQAADAsAAAAAAAAAAAAAAAAAAAAAAAA AAAAADrwAAAV2AAAAAAAAAAAAAgAAAEYAAEABQBzbXBsAAADAAUAY29yZQAACgCCACws bG9uZywwLA0sLG9iaiAsMCxUaGUgb2JqZWN0IHdob3NlIGRhdGEgc2l6ZSBpcyB0byBi ZSByZXR1cm5lZA1BcyxydHlwLHR5cGUsMzI3NjgsVGhlIGRhdGEgdHlwZSBmb3Igd2hp Y2ggdGhlIHNpemUgaXMgY2FsY3VsYXRlZAACAAoARGF0YSBTaXplAAUAJgBSZXR1cm4g dGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gb2JqZWN0AAQABQBkc2l6AAAGABEAbWlzc2lu Z05hbWUoMzk0KQAAMAAiAERhdGEgU2l6ZSDCDSAgcGFyYW0gwg0gW0FzIHBhcmFtXWV2 ZW50IGNvcmVkc2l6AAAAAAAAAaBDQVJEAAAxbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6 8AAAFdgAAAAAAAAAAAAIAAABWAABAAUAc21wbAAAAwAFAGNvcmUAAAoAsgAsLGV2aW4s MTYzODQsDSwsdHlwZSwwLFRoZSBldmVudCBjbGFzcyBvZiB0aGUgQXBwbGUgZXZlbnRz IGZvciB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24NSW4sd3JjZCxpbnRsLDMyNzY4 LFRoZSBodW1hbiBsYW5ndWFnZSBhbmQgc2NyaXB0IHN5c3RlbSBpbiB3aGljaCB0byBy ZXR1cm4gaW5mb3JtYXRpb24AAgALAEV2ZW50IEluZm8AAAUAMgBHZXQgaW5mb3JtYXRp b24gYWJvdXQgdGhlIEFwcGxlIGV2ZW50cyBpbiBhIHN1aXRlAAQABQBndGVpAAAGABEA bWlzc2luZ05hbWUoMzA3KQAAMAAjAEV2ZW50IEluZm8gwg0gIHBhcmFtIMINIFtJbiBw YXJhbV0AZXZlbnQgY29yZWd0ZWkAAAAAAAABIENBUkQAADLpAAAAAAAAAAAAAAAAAAAA AAAAAAAAADrwAAAV2AAAAAAAAAAAAAgAAADSAAEABQBzbXBsAAADAAUAY29yZQAACgBc ACwsb2JqICwwLA0sLG9iaiAsNDA5NixUaGUgb2JqZWN0IHRvIG1vdmUNVG8saW5zaCxp bnNsLDMyNzY4LFRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBvYmplY3QAAgAFAE1vdmUA AAUADwBNb3ZlIGFuIG9iamVjdAAABAAFAG1vdmUAAAYADwBtaXNzaW5nTmFtZSg3KQAA MAAdAE1vdmUgwg0gIHBhcmFtIMINIFtUbyBwYXJhbV0AZXZlbnQgY29yZW1vdmUAAAAA AAAAAAAAAAABIENBUkQAADPfAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAV2AAAAAAA AAAAAAgAAADOAAEABQBzbXBsAAADAAUAY29yZQAACgBMACwsbnVsbCwzMjc2OCwNLCxv YmogLDQwOTYsVGhlIG9iamVjdCB0byBjaGFuZ2UNVG8sZGF0YSwqKioqLDAsVGhlIG5l dyB2YWx1ZQACAAkAU2V0IERhdGEAAAUAFQBTZXQgYW4gb2JqZWN0J3MgZGF0YQAABAAF AHNldGQAAAYAEABtaXNzaW5nTmFtZSg3OCkAMAAfAFNldCBEYXRhIMINICBwYXJhbSDC DSBUbyBwYXJhbQBldmVudCBjb3Jlc2V0ZAAAAAAAAAAAAAAAAAAAAAAAwENBUkQAABfY AAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAYZAAAAAcAAAAAAAQAAABoAAEABQAqKioq AAAFAD+ABgAAAA9UaGlzIGlzIGEgdGVtcGxhdGUgY2FyZCBmb3IgdGhpcyBiYWNrZ3Jv dW5k0WRvbid0IHVzZSBpdCEAADEAAgANAAoADwANLD8/Pz8sPz8/PywwLAAqKioqIGNs YXNzIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgENBUkQAADSKAAAAAAAAAAAAAAAA AAAAAAAAAAAAADrwAAAYZAAAAAAAAAAAAAYAAAEsAAEABQBzbXBsAAACAAwAQXBwbGlj YXRpb24AAwAFAGNhcHAAAAUAGABBIE1hY2ludG9zaCBhcHBsaWNhdGlvbgAKANMAQmVz dCBUeXBlLHBic3QsdHlwZSwwLFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQ1DbGFzcyxw Y2xzLHR5cGUsMCxUaGUgY2xhc3MNRGVmYXVsdCBUeXBlLGRlZnQsdHlwZSwwLFRoZSBk ZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQ1Gcm9udG1vc3QscGlzZixib29sLDAsSXMgdGhp cyB0aGUgZnJvbnRtb3N0IGFwcGxpY2F0aW9uPw1OYW1lLHBuYW0saXR4dCwwLFRoZSBu YW1lAAAxAA8AY3dpbixpbmR4LG5hbWUAY2xhc3MgY2FwcAAAAAAAAAAAAAAAAAAAAAAA AAAAAAADQENBUkQAADXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAYZAAAAAAAAAAA AAUAAAL8AAEABQBzbXBsAAACAAcAV2luZG93AAADAAUAY3dpbgAABQAJAEEgd2luZG93 AAAKAsoAQmVzdCBUeXBlLHBic3QsdHlwZSwwLFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlw ZQ1Cb3VuZHMscGJuZCxxZHJ0LDQwOTYsVGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBmb3Ig dGhlIHdpbmRvdw1DbGFzcyxwY2xzLHR5cGUsMCxUaGUgY2xhc3MNRGVmYXVsdCBUeXBl LGRlZnQsdHlwZSwwLFRoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQ1IYXMgQ2xvc2Ug Qm94LGhjbGIsYm9vbCwwLERvZXMgdGhlIHdpbmRvdyBoYXZlIGEgY2xvc2UgYm94Pw1I YXMgVGl0bGUgQmFyLHB0aXQsYm9vbCwwLERvZXMgdGhlIHdpbmRvdyBoYXZlIGEgdGl0 bGUgYmFyPw1JbmRleCxwaWR4LGxvbmcsNDA5NixUaGUgbnVtYmVyIG9mIHRoZSB3aW5k b3cNRmxvYXRpbmcsaXNmbCxib29sLDAsRG9lcyB0aGUgd2luZG93IGZsb2F0Pw1Nb2Rh bCxwbW9kLGJvb2wsMCxJcyB0aGUgd2luZG93IG1vZGFsPw1Qb3NpdGlvbixwcG9zLFFE cHQsNDA5NixUaGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdw1SZXNpemFibGUscHJzeixi b29sLDAsSXMgdGhlIHdpbmRvdyByZXNpemFibGU/DVpvb21hYmxlLGlzem0sYm9vbCww LElzIHRoZSB3aW5kb3cgem9vbWFibGU/DVpvb21lZCxwenVtLGJvb2wsNDA5NixJcyB0 aGUgd2luZG93IHpvb21lZD8NTmFtZSxwbmFtLGl0eHQsNDA5NixUaGUgdGl0bGUgb2Yg dGhlIHdpbmRvdw1WaXNpYmxlLHB2aXMsYm9vbCw0MDk2LElzIHRoZSB3aW5kb3cgdmlz aWJsZT9jbGFzcyBjd2luAAAAAAAAAKBDQVJEAAAd8gAAAAAAAAAAQAAAAAAAAAAAAAAA AAA68AAAHoUAAAAIAAAAAAADAAAAVgABAAUAKioqKgAACgADACwsAAAJAD+ABgAAAA9U aGlzIGlzIGEgdGVtcGxhdGUgY2FyZCBmb3IgdGhpcyBiYWNrZ3JvdW5k0WRvbid0IHVz ZSBpdCEAKioqKiBlbnVtZXJhdGlvbiAAAAAAAAFAQ0FSRAAANk4AAAAAAAAAAAAAAAAA AAAAAAAAAAAAOvAAAB6FAAAAAAAAAAAAAwAAAPQAAQAFAHNtcGwAAAoA3ABCZWZvcmUs YmVmbyxCZWZvcmUgc3BlY2lmaWVkIG9iamVjdA1BZnRlcixhZnRlLEFmdGVyIHNwZWNp ZmllZCBvYmplY3QNQmVnaW5uaW5nLGJnbmcsQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUg c3BlY2lmaWVkIGNvbnRhaW5lcg1FbmQsZW5kICxBdCB0aGUgZW5kIG9mIHRoZSBzcGVj aWZpZWQgY29udGFpbmVyDVJlcGxhY2UscnBsYyxSZXBsYWNpbmcgdGhlIHNwZWNpZmll ZCBvYmplY3QAAwAFAHBvc2kAZW51bWVyYXRpb24gcG9zaQAAAAAAAAAAAQBDQVJEAAA3 gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA68AAAHoUAAAAAAAAAAAADAAAAngABAAUAc21w bAAACgCGAGluZGV4LGluZHgsa2V5Zm9ybSBkZXNpZ25hdGluZyBpbmRleGVkIGFjY2Vz cw1uYW1lZCxuYW1lLGtleWZvcm0gZGVzaWduYXRpbmcgbmFtZWQgYWNjZXNzDUlELGlk ICxrZXlmb3JtIGRlc2lnbmF0aW5nIGlkZW50aWZlciBhY2Nlc3MAAwAFAGtmcm0AZW51 bWVyYXRpb24ga2ZybQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgQ0FSRAAA GxYAAAAAAAAAAEAAAAAAAAAAAAAAAAAAOvAAAByvAAAABgAAAAAAAgAAAE4AAgAFACoq KioAAAgAP4AGAAAAD1RoaXMgaXMgYSB0ZW1wbGF0ZSBjYXJkIGZvciB0aGlzIGJhY2tn cm91bmTRZG9uJ3QgdXNlIGl0IQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB IFNUQkwAAAwGAAAAAAAAAAsAAAASAAAABAAAAAEAAAAA////////AAAAAAAAAAAABgAA AAEAAAAAAAMAAAAMAAAAAAAAAAAABwAAAAEAAAAA/////wAJAAAAAAAAAAAACQAAAAEA AAAAABUEAP//AAAAAAAAAAAACgAAAAEAAAAAABUCAP//AAAAAAAAAAAACwAAAAEAAAAA ABUBAAAOAAAAAAAAAAAADAAAAAEAAAAAABUBAP//AAAAAAAAAAAADQAAAAEAAAAAABX/ ////AAAAAAAAAAAADwAAAAEAAAAA/////wASAAAAAAAAAAAAEAAAAAEAAAAAABUBAAAS AAAAAAAAAAAAEQAAAAEAAAAAAAT//wAMAAAAAAAAAAAAYEZUQkwAAA3vAAAAAAAAAAQA AAAAABVIZWx2ZXRpY2EAAANHZW5ldmEACgAAQ2hpY2FnbwAABE1vbmFjbwAAAAAAAABA AQoO6AAKAAAAAACBAEQCEn//f/8AAAAAAAABQFBSTlQAAEDZAAAAAAALAgoANAAwACAA IAAIAAgAAAAAAVYCAABIAQEAugAAAAAEAwkJBK7/+GcSQmcvLv/4LzxQUkZUTq0Oqh4f Ly3Rmi8u//xCp3AkLwBCp06tIRIgbdGaKFBTbAEiQmc/LAEgPywBIk6tIJI5XwEgSG3R rk6tILpM3xCATl5OdU5W/+4vDEhu/+5OrQf6QqcvPAAAASROrSDSK1/RmmYCYEpIbv/u IG3RmiBQLwhwDi8ATq0mGiBt0ZooUEHsAA5D7cYaINkg2Tl8AEgAFjl8AQEAGEIsABpw AClAABxCLAAgQqwBIBt8AAHReihfTl5OdU5W//ZI5wMYQi3RekqtqhZmCE66/3pgAACS QqcvLaoWLzxQUk5UTq0PEiZfIAtmEnAAAAAAACBMb2dpY2FsIHMAAAAgVEFJTP////8A AAAAD051IIpyIGRldCBzbHV0yQ== --========================_26885646==_D-- --========================_26885646==_-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.17.msg ================================================ X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil] [nil "Mon" "26" "June" "1995" "16:53:52" "-0800" "Aleksandar Totic" "atotic@netscape.com" nil "6272" "AppleDouble example" "^Date:" nil nil "6" nil nil (mark number " 26-Jun-95 16:53 Aleks Toti6272 AppleDouble example¥n") nil] nil) Received: from neon.netscape.com (steroid.mcom.com [198.93.92.10]) by abattoir.netscape.com (8.6.10/8.6.9) with ESMTP id QAA26158 for ; Mon, 26 Jun 1995 16:50:29 -0700 Received: from [198.93.92.66] (nonlinear.mcom.com [198.93.92.66]) by neon.netscape.com (950215.SGI.8.6.10/8.6.9) with SMTP id QAA25749; Mon, 26 Jun 1995 16:46:00 -0700 X-Sender: atotic@198.93.92.10 Message-Id: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="========================_26885646==_" Date: Mon, 26 Jun 1995 16:53:52 -0800 From: atotic@netscape.com (Aleksandar Totic) To: atotic@mcom.com, jwz@mcom.com Subject: AppleDouble example --========================_26885646==_ Content-Type: text/plain; charset="us-ascii" Here comes a Mac file encoded as AppleDouble, with both forks. Aleks --========================_26885646==_ Content-Type: multipart/header-set; boundary="========================_26885646==_D" --========================_26885646==_D Content-Transfer-Encoding: base64 Content-Type: application/applefile; name="%Aete_Editor_b1" Content-Disposition: attachment; filename="%Aete_Editor_b1" AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAPgAAAA4AAAAJAAAATAAAACAA AAACAAAAbAAAveNBZXRlIEVkaXRvciBiMVNUQUtXSUxEAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABAAAAu+oAALrqAAAB+XJkIGJ1dHRvbiAiaGFzIGdsdWUgc3Vicm91dGlu ZSIgDkFldGUgRWRpdG9yIGIxdAIAAABTVEFLV0lMRAEAAAAAAFNUQUtXSUxEAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAApdfAjQAEG8AAAL3jIGNhcmQgInByZWZlcmVuY2UiIGlu dG8gdmVyYm9zZQ1wdXQgY2FyZCBmaWVsZCAidGltZU91dCIgb2YgY2FyZCAicHJlZmVy ZW5jZSIgaW50byBkZWZhdWx0VGltZW91dA1wdXQgY2FyZCBmaWVsZCAic2VuZFRhcmdl dCIgb2YgYwAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAABGAAAERgAADkYAABZG AAAnhgAAQAYAAIAGAABADgAAJ/wAABf4AAAOAAAABgAAAAIAAAAAAWxgDgAAWEZDTgz9 AAAAAAAAQfr/7iHICc5gAADsIl8gH6EiLohO0U5WAAAvDChuABApbgAMAFApbgAIAFQ5 fAAOAEwvLABIIF9OkChfTl4gX978AAxO0E5W/wAvDCBuAAhD7v8AcD8i2FHI//wobgAM Qe7/AClIAFA5fAAHAEwvLABIIF9OkC1sAHAAEChfTl4gX1BPTtBOVv8ALwwgbgAIQ+7/ AHA/IthRyP/8KG4ADEHu/wApSABQOXwACgBMLywASCBfTpAtbABwABAoX05eIF9QT07Q TlYAAC8MKG4AECluAAwAUCluAAgAVDl8AAgATC8sAEggX06QKF9OXiBf3vwADE7QTlb+ 6EjnATAmbgAISlNvIC8LIGsAAi8QSG7+6E66/7JZTy8LSG7+6E66/2YuH2ACQodZTy8H Trr+3iRfQisARi8LLwpIbv7oTrr+1llPLwtIbv7oTrr++idfAEJM3wyATl4un051AAAM 7k5WAAAvLgAITroCjE5eLp9OdYpFTlRSWVBPSU5UAAAATlb/ACBuAAgvKAAILy4ADEhu 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 ZmMvDk66/kBCbv++YAAAwCBuAAxD7v/YItgi2Epu/75mFi18bWV0Yf/YQe7/4EPu/8gg 2SDZYAxB7v/gQ+7/0CDZINlCZ0hu/9hIbv+6MDwEB6gWPV//sC1u/7r/onABLUD/tmBa QmdIbv/YLy7/ti88KioqKkhu/7JIbv/oMDwKC6gWLw5Ouv0+QmdIbv/gLy7/skhu/+gw PAYQqBY9X/+wQmdIbv/oMDwCBKgWVI8/Lv+wLw5Ouv0OUq7/tmkKIC7/trCu/6JvnFJu /75wAbBu/75sAP86QmdCp0KnHzwAAUhu/8AwPAcGqBYvDk66/NZCZ0hu/8AvPGF0dHJI bv/IMDwGEKgWLw5Ouvy6QmdIbv/IMDwCBKgWVI9Krv/UZypCZ0hu/8AvPHBhcm1Ibv/Q MDwGEKgWLw5OuvyKQmdIbv/QMDwCBKgWVI9CZ0hu/8AvPCRhZSRIbv+mMDwGA6gWVI9C Z0hu/8AwPAIEqBZUj2AAAQIgbgAMIDxsaXN0sJBXwCI8cmVjb7KQV8GAAWcAANgdfAAB /68gbgAMIDxyZWNvsJBmRC18cmVjb//4QmcvLgAMLzx0eXBlLzwqKioqSG7//Ehu//hw BC8ASG7/9DA8DhGoFlSPIDxyZWNvsK7/+FfARAAdQP+vEC7/r2dgcAAtQP/EQmdCp0Kn HzwAAUhu/8AwPAcGqBZKX2YyQmdIbv/ALzwtLS0tLy4ADDA8BhCoFkpfZhhCZ0hu/8Av PCRhZSRIbv+mMDwGA6gWVI9CZ0hu/8AwPAIEqBZUj2AkQmcvLgAMLy7/+Ehu/6YwPAYD qBZUj2AMIG4ADEPu/6Yi2CLYIG4ADCAoAASwrv+qZywgbgAIcAGwEGYOQmcvLgAMMDwC BKgWVI8gbgAIELwAASBuAAxD7v+mINkg2UJuABBP7v+CTN8c+E5eIF9QT07QTlb9+Ejn ARgmbgAMLwsgbgAILxBIbv78TroC/Ehu/vxIegB4SG79+D88AAJOugNKQe7+/EPu/fhw PyDZUcj//EKnLwtIegBITroBPChfIAxnMEKnLwxCp0hu/v1CQBAu/vxIwC8AcP8vAEKn qeAuHy8LSHoAGi8MTroBTC8MIF+gI0zfGIBOXiBfUE9O0AtDcmVhdGVkRGVzYwEsTlb+ 5EjnAxgmbgAIKG4AEC4uABRCEyAMZwAAwkKnLwcvFE66AUhwBrCfbDogVHC+sBBmGiAU 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 /wAvPAAAAQBOuhLcQkAQLv8ASMDQlFKAKIAQLgAMZzY9fAEg/v4dfAAN/v9Ibv7+SG7/ AE66E3g+H28KQe7/ABG8ACBwAEpHZuJIbv8ALy4ACE66/ahM3xCATl4gX978AApO0E5W AAAvLgAOHy4ADC8uAAhOuv96IG4ADhAoAAMCQAABZwJSkE5eIF/e/AAKTtBOVgAASG4A FEJnLy4ACE66/8IgbgAQIm4AFCCRIG4ADCJuABAgkU5eIF/e/AAQTtBOVgAAIG4ADCJu ABAgkSBuAAgibgAMIJFOXiBf3vwADE7QTlb+/i8HEC4ADGc+Qe7/AEP6AEwg2TCRIG4A Di8QSG7/AXAELwBOuhHaSHoAMEhu/wBOuhKWPh9vBB1H/wBIbv8ALy4ACE66/NAgbgAO WJAuH05eIF/e/AAKTtABIAQ/Pz8/AE5WAABIbgAUQmcvLgAITrr+mEhuABRCZy8uAAhO uv7+IG4AECJuABQgkViuABQgbgAMIm4AFCCRTl4gX978ABBO0E5W//BKrgAUZywtbgAQ //AtbgAM//QtbgAI//hwAC1A//xCZ0hu//AvLgAUcBAvAE66EThUj05eIF/e/AAQTtBO Vv/oSOcBGCZuABQgC2dkKFNCpy8LTroQ8C4M3p8gB5CMbyYgFLCuABBmGCAsAASwrgAM ZggpbgAIAAxgNnAQ2cBg2nAQ2cBg1C1uABD/6C1uAAz/7HAALUD/8C1uAAj/9EJnSG7/ 6C8LcBAvAE66ELpUj0zfGIBOXiBf3vwAEE7QTlb/7kjnAwAgbgAoIFA8EC8uAChCZy8u AAhOuv0McAAtQP/wPUb/7n4BYFggbgAoLxBIbv/0SG7/+EHuAAwgGGcCLwAgUE6QLy4A JC8u//QvLv/4IG4AKC8QQe4AHCAYZwIvACBQTpAvLgAoSG7/8EKnQe4AFCAYZwIvACBQ TpBSR2kGvm7/7m+iTN8AwE5eIF/e/AAkTtBOVv/mSOcPGCZuAAhCp0KnTroP0i4fUmv6 0DAr+tDlQEHr+rghhwAALy4AIC8HSHr+dkKnQe4AHC8gLyBB7gAULyAvIC8uAAhOuv8e Ly4AHC8HSHr+kkKnQe4AHC8gLyBB7gAULyAvIC8uAAhOuv76QqcvB066D3hwEC8ATroP viAfPUD/+kHu//otSP/wSG7/8B88AAEvLgAITrr79HwAPW7/+v/megFgVCBHKAbYkHAQ 3IBwAC1A//QoREqsAAhnDi1sAAj/8C1sAAz/9GAGLWwADP/wSG7/8Ehu//QfPAABSqwA DFbARAAfAEHuABQgGGcCLwAgUE6QUkVpBrpu/+Zvpi8HIF+gIzAr+tDlQEHr+rhyACGB AABTa/rQTN8Y8E5eIF/e/AAcTtBOVv/2SOcDACBuABggUDwQLy4AGB8uABYvLgAITrr7 RnAALUD/+D1G//Z+AWAiLy4AGEhu//gfLgAWHy4AFEHuAAwgGGcCLwAgUE6QUkdpBr5u //Zv2EzfAMBOXiBf3vwAFE7QTlb//kjnAwAcLgAOIG4AEEqQZkovLgAUHwYvLgAITrr7 0C8uABQfBi8uAAhOuvxCLy4AFB8GLy4ACE66/DQvLgAUHwYvLgAITrr7pi8uABQfBi8u AAhOuvriYAAAuCBuABQgUEoQVsdEBy8uABQfBy8uAAhOuvt6Ly4AEBAHCgAAAR8ALy4A CE66+2YvLgAUHzwAAS8uAAhOuvvWLy4AFB88AAEvLgAITrr7xi8uABBCZy8uAAhOuvu4 Ly4AEEJnLy4ACE66+6ogbgAUIFBKEFbHRAcvLgAUHwcvLgAITrr7EC8uABAQBwoAAAEf AC8uAAhOuvr8Ly4AFB88AAEvLgAITrr6Ni8uABBCZy8uAAhOuvooTN8AwE5eIF/e/AAQ TtBOVv/+SOcDABwuAA4gbgAQSpBmAADCEC4ADGcQEAZnDEh6Al4vLgAITrr5Ui8uABQf Bi8uAAhOuvoiLy4AFB8GLy4ACE66+ogvLgAUHwYvLgAITrr6+i8uABQfBi8uAAhOuvrs Ly4AFB8GLy4ACE66+t4vLgAUHwYvLgAITrr6UC8uABQfBi8uAAhOuvmMLy4AFB8GLy4A CE66+rQvLgAUHwYvLgAITrr6Ji8uABQfBi8uAAhOuvliLy4AFB8GHy4ADEh6/hovLgAI Ly4ACE66/apgAAGaSHoBpC8uAAhOuvicIG4AFCBQShBWx0QHLy4AFB8HLy4ACE66+WAv LgAQEAcKAAABHwAvLgAITrr5TCBuABQgUEoQVsdEBy8uABQfBy8uAAhOuvmmLy4AEBAH CgAAAR8ALy4ACE66+ZIvLgAUHzwAAS8uAAhOuvoCLy4AEEJnLy4ACE66+fQvLgAUHzwA AS8uAAhOuvnkLy4AEEJnLy4ACE66+dYvLgAUHzwAAS8uAAhOuvnGLy4AEEJnLy4ACE66 +bggbgAUIFBKEFbHRAcvLgAUHwcvLgAITrr5Hi8uABAQBwoAAAEfAC8uAAhOuvkKLy4A FB88AAEvLgAITrr4RC8uABBCZy8uAAhOuvg2Ly4AFB88AAEvLgAITrr5XC8uABBCZy8u AAhOuvlOIG4AFCBQShBWx0QHLy4AFB8HLy4ACE66+LQvLgAQEAcKAAABHwAvLgAITrr4 oC8uABQfPAABLy4ACE6699ovLgAQQmcvLgAITrr3zC8uABQvLgAQSHr8hi8uAAhIevic Ly4ACC8uAAhOuvriTN8AwE5eIF/e/AAQTtACIyYAAiMqAE5WAAAgbgAQSpBmEi8uABQf LgAMLy4ACE66+LBgHi8uABQfPAABLy4ACE66+J4vLgAQQmcvLgAITrr4kE5eIF/e/AAQ TtBOVv/6SOcHABouAA4gbgAQSpBmRi8uABQfBS8uAAhOuvhkIG4AFCBQPBAvLgAUHwUv LgAITrr23j1G//p+AWASLy4AFB8FLy4ACE66+DhSR2lEvm7/+m/oYDwvLgAUHzwAAS8u AAhOuvgcLy4AEEJnLy4ACE66+A4vLgAULy4AEEh6/zgvLgAISHr32EKnLy4ACE66+fBM 3wDgTl4gX978ABBO0E5W//5I5wcAGi4ADBwuAA4gbgAQSpBmchAFZxAQBmcMSHoBPi8u AAhOuvXkLy4AFB8GLy4ACE669ygvLgAUHwYvLgAITrr3mi8uABQfBi8uAAhOuvcMLy4A FB8GHwVIevsQLy4ACC8uAAhOuvqgLy4AFB8GHwVIev7kLy4ACC8uAAhOuvqIYAAAxkh6 ANAvLgAITrr1eiBuABQgUEoQVsdEBy8uABQfBy8uAAhOuvayLy4AEBAHCgAAAR8ALy4A CE669p4vLgAUHzwAAS8uAAhOuvcOLy4AEEJnLy4ACE669wAgbgAUIFBKEFbHRAcvLgAU HwcvLgAITrr2Zi8uABAQBwoAAAEfAC8uAAhOuvZSLy4AFC8uABBIevpWLy4ACEh69mwv LgAILy4ACE66+LIvLgAULy4AEEh6/iIvLgAISHr2fEKnLy4ACE66+JRM3wDgTl4gX978 ABBO0AIjJgACIyoATlb//kjnAwAcLgAOIG4AEEqQZkQQLgAMZxAQBmcMSHoA0C8uAAhO uvSCLy4AFB8GLy4ACE669cYvLgAUHwYvLgAITrr2OC8uABQfBi8uAAhOuvWqYAAAiEh6 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 AABOXiBfUE9O0IRGQUlMAAAATlYAAEjnAQg+LgAMKG4ACHABsEdmUC8sAAggbAAIIGgA Ai8QSGz/AE66BPRIbP8ASHoA+E66BZIQH2cOSHoAYi8uAAhOuv9mYBxIbP8ASHoA2E66 BXQQH2cMSHoAjC8uAAhOuv9IcAOwR17AcgSyR13BgAFnDEh6ACgvLgAITrr/LEzfEIBO XiBfXE9O0I9DSEVDS1BBUkFNQ09VTlQAjEZGb3JtOiBTZWFyY2goY29udGFpbmVyLCB0 aGVTdHJpbmcsIHNlYXJjaFdob2xlLCBFdmVyeSBPY2N1cnJlbmNlIEZsYWcpAD9TZWFy Y2ggWEZDTiAxLjEgqTE5OTAgQXBwbGUgQ29tcHV0ZXIsIEluYy4gQWxsIFJpZ2h0cyBS ZXNlcnZlZC4BIQE/TlYAACBuABAgLgAM0ZBOXiBf3vwADE7QkElOQ1JFTUVOVFBPSU5U RVIAAABOVv/+SOcBGCZuAAwobgAIQgcgUxAQSIBnJgRAAA1nDgRAABNnFgRAAAxnCmAa Uqz79H4BYBJSrPvwYAx+AWAIfgEZfAAB++5SkyBTShBXwMAHZwYZfAAB++4QB2e0TN8Y gE5eIF9QT07Qi1NDQU5UT1NQQUNFAABOVgAALwwobgAIIG4ADCBQEBBIgGcaBEAADWcI BEAAH2cIYBRSrPv0YA5SrPvwYAgZfAAB++5gEC8uAAxwAS8ALy4ACE66/xYoX05eIF9Q T07QiFNDQU5ORVhUAAAATlb9AC8MKG4ACC8sAAgvLgAMSG7+AE66AgQvLAAILy4AEEhu /wBOugH0ECz772cySGz9AEhu/wBIegBySG7+AEhs/ABIbv0APzwABU66AupB7P0AQ+79 AHA/INlRyP/8YDZKLP0AZjBIbP0ASG7/AEh6ADpIbv4ASGz8AEhu/QA/PAAFTroCskHs /QBD7v0AcD8g2VHI//woX05eIF/e/AAMTtCFTE9HSVQAAgEsTlb77EjnHzggbgAIPVD7 +j8u+/ovDk66/QxCpy8uAAggbgAIIGgABi8QTroBBCAfPUD7+C8uAAggbgAIIGgACi8Q SG7/AE66AfpCZy8uAAhIbv8ATroBoB1f++1wBLBu+/pmCB18AAH772AEQi7770Iu++5w AS1A+/RwAS1A+/BCLv0AHXwAAf8AHXwAAfwAHXwADfwBIG4ACCBoAAItUPv8QmcgbgAI IGgABi8QLy77/D8u+/g/Lvv4TroBwkpfZhYvLvv0Ly778C8OTrr+hBAu++9mAmAkEC77 7WcMSG77/C8OTrr9lmAKSG77/C8OTrr+AnABsC777mamIG4ACC8IQqcvLgAISG79AE66 AJwgHyBfIUAAQk/u+8xM3xz4Tl4un051hlNFQVJDSAAAAE5WAAAvDChuAAwpbgAIAFA5 fAADAEwvLABIIF9OkC1sAHAAEChfTl4gX1BPTtCMU1RSSU5HTEVOR1RIAAAATlYAAC8M KG4AECluAAwAUCluAAgAVDl8AA0ATC8sAEggX06QKF9OXiBf3vwADE7QiUxPTkdUT1NU UgAATlb/AC8MIG4ACEPu/wBwPyLYUcj//ChuAAxB7v8AKUgAUDl8AAcATC8sAEggX06Q LWwAcAAQKF9OXiBfUE9O0IlQQVNUT1pFUk8AAE5W/wAvDCBuAAhD7v8AcD8i2FHI//wo bgAMQe7/AClIAFA5fAALAEwvLABIIF9OkB1sAHMAEChfTl4gX1BPTtCJU1RSVE9CT09M AABOVgAALwwobgAQKW4ADABQKW4ACABUOXwACABMLywASCBfTpAoX05eIF/e/AAMTtCJ WkVST1RPUEFTAAA0PAAMIF8/Ai8Ire1I5+DgQ+8AHDAZIFk0ANRC1ELSwkJBUkhgICRh QkIUGtJCDEEA/28OBEEA/5RBMjwA/2ACENpRyv/8Ucj/3iBhEIEwISBJ0EDQQNDAVEgg oSKITN8HBy5fTnVI58DAcgFgBkjnwMBCQSBvABgibwAUQkAQELMIVsj//GYECkEAAR9B ABovbwAQABZM3wMDXE9OdQAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAZcAAAL6 gAAHBsAABgHAAAsA4AAPD6B539ngijsf4Iv7GGCaFxjgaf3PwAAOAKAADYOQAAd9SAAD /6QAAPjSAAAAaQAAADUAAAAbAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZuAA lgAAAAAABw5SZXF1aXJlZCBTdWl0ZSxFdmVudHMgdGhhdCBldmVyeSBhcHBsaWNhdGlv biBzaG91bGQgc3VwcG9ydHJlcWQAAQABAAMET3BlbiRPcGVuIHRoZSBzcGVjaWZpZWQg bGlzdCBvZiBkb2N1bWVudHNhZXZ0b2RvY251bGwAAIAAYWxpcxlMaXN0IG9mIGRvY3Vt ZW50cyB0byBvcGVuUAAAAAVQcmludCVQcmludCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2Yg ZG9jdW1lbnRzYWV2dHBkb2NudWxsAACAAGFsaXMaTGlzdCBvZiBkb2N1bWVudHMgdG8g cHJpbnQAQAAAAARRdWl0EFF1aXQgYXBwbGljYXRpb25hZXZ0cXVpdG51bGwAAIAAbnVs bBxObyBkaXJlY3QgcGFyYW1ldGVyIHJlcXVpcmVkAJAAAAAAAAAAAAAKQ29yZSBTdWl0 ZSZTdWl0ZSB0aGF0IGFwcGxpZXMgdG8gYWxsIGFwcGxpY2F0aW9uc2NvcmUAAQABABAF Q2xvbmUPQ2xvbmUgYW4gb2JqZWN0Y29yZWNsb25vYmogAAAAAG9iaiATVGhlIG9iamVj dCB0byBjbG9uZRAAAAECVG8AaW5zaGluc2wfVGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhl IG9iamVjdIAABUNsb3NlD0Nsb3NlIGFuIG9iamVjdGNvcmVjbG9zbnVsbAAAgABvYmog E1RoZSBvYmplY3QgdG8gY2xvc2UQAAACBFNhdmUAc2F2b3Nhdm8/U3BlY2lmaWVzIHdo ZXRoZXIgb3Igbm90IGNoYW5nZXMgc2hvdWxkIGJlIHNhdmVkIGJlZm9yZSBjbG9zaW5n oAAJU2F2aW5nIElua2ZpbGFsaXMkVGhlIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUg b2JqZWN0AIAABUNvdW50RFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEg cGFydGljdWxhciBjbGFzcyB3aXRoaW4gYW4gb2JqZWN0AGNvcmVjbnRlbG9uZwAAAABv YmogK1RoZSBvYmplY3Qgd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIGNvdW50ZWQAAAAB BUNsYXNza29jbHR5cGUnVGhlIGNsYXNzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBjb3Vu dGVkAAAGQ3JlYXRlFENyZWF0ZSBhIG5ldyBlbGVtZW50Y29yZWNyZWxvYmogAAAAAG51 bGwAAJAAAAQDTmV3a29jbHR5cGUcVGhlIGNsYXNzIG9mIHRoZSBuZXcgZWxlbWVudAAA AAJBdABpbnNoaW5zbCtUaGUgbG9jYXRpb24gYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBl bGVtZW50AAAJV2l0aCBEYXRhZGF0YSoqKiogVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhl IGVsZW1lbnQAgAAPV2l0aCBQcm9wZXJ0aWVzcHJkdHJlY28yVGhlIGluaXRpYWwgZGF0 YSBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVsZW1lbnQAgAAGRGVsZXRlIERlbGV0 ZSBhbiBlbGVtZW50IGZyb20gYW4gb2JqZWN0Y29yZWRlbG9udWxsAACAAG9iaiAVVGhl IGVsZW1lbnQgdG8gZGVsZXRlEAAAAAZFeGlzdHMYVGVsbCBpZiBhbiBvYmplY3QgZXhp c3RzY29yZWRvZXhib29sAAAAAG9iaiAWVGhlIG9iamVjdCBpbiBxdWVzdGlvbgAAAAAA CkNsYXNzIEluZm8lR2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdCBjbGFzcwBj b3JlcW9iamNsaW4AAAAAdHlwZTVUaGUgb2JqZWN0IGNsYXNzIGFib3V0IHdoaWNoIGlu Zm9ybWF0aW9uIGlzIHJlcXVlc3RlZIAAAAECSW4Ad3JjZGludGxDVGhlIGh1bWFuIGxh bmd1YWdlIGFuZCBzY3JpcHQgc3lzdGVtIGluIHdoaWNoIHRvIHJldHVybiBpbmZvcm1h dGlvboAACEdldCBEYXRhGkdldCB0aGUgZGF0YSBmb3IgYW4gb2JqZWN0Y29yZWdldGQq KioqAAAAAG9iaiAnVGhlIG9iamVjdCB3aG9zZSBkYXRhIGlzIHRvIGJlIHJldHVybmVk AAAAAQJBcwBydHlwdHlwZTZUaGUgZGVzaXJlZCB0eXBlcyBmb3IgdGhlIGRhdGEsIGlu IG9yZGVyIG9mIHByZWZlcmVuY2UAwAAJRGF0YSBTaXplJVJldHVybiB0aGUgc2l6ZSBp biBieXRlcyBvZiBhbiBvYmplY3Rjb3JlZHNpemxvbmcAAAAAb2JqICxUaGUgb2JqZWN0 IHdob3NlIGRhdGEgc2l6ZSBpcyB0byBiZSByZXR1cm5lZAAAAAABAkFzAHJ0eXB0eXBl LlRoZSBkYXRhIHR5cGUgZm9yIHdoaWNoIHRoZSBzaXplIGlzIGNhbGN1bGF0ZWQAgAAK RXZlbnQgSW5mbzFHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFwcGxlIGV2ZW50cyBp biBhIHN1aXRlAGNvcmVndGVpZXZpbgAAQAB0eXBlQ1RoZSBldmVudCBjbGFzcyBvZiB0 aGUgQXBwbGUgZXZlbnRzIGZvciB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24AAAAB AkluAHdyY2RpbnRsQ1RoZSBodW1hbiBsYW5ndWFnZSBhbmQgc2NyaXB0IHN5c3RlbSBp biB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb26AAARNb3ZlDk1vdmUgYW4gb2JqZWN0 Y29yZW1vdmVvYmogAAAAAG9iaiASVGhlIG9iamVjdCB0byBtb3ZlABAAAAECVG8AaW5z aGluc2wfVGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIG9iamVjdAAABE9wZW4OT3BlbiBh biBvYmplY3RhZXZ0b2RvY251bGwAAIAAb2JqIBJUaGUgb2JqZWN0IHRvIG9wZW4AEAAA AAVQcmludA9QcmludCBhbiBvYmplY3RhZXZ0cGRvY251bGwAAIAAb2JqIBNUaGUgb2Jq ZWN0IHRvIHByaW50AAAAAARRdWl0MFBlcmZvcm0gdGFza3MgYmVmb3JlIHRlcm1pbmF0 aW9uLCB0aGVuIHRlcm1pbmF0ZWFldnRxdWl0bnVsbAAAgABudWxsAACQAAABBFNhdmUA c2F2b3Nhdm85U3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNhdmUgY3VycmVudGx5 IG9wZW4gZG9jdW1lbnRzoAAEU2F2ZQ5TYXZlIGFuIG9iamVjdGNvcmVzYXZlbnVsbAAA gABvYmogElRoZSBvYmplY3QgdG8gc2F2ZQAQAAACAkluAGtmaWxhbGlzJFRoZSBmaWxl IGluIHdoaWNoIHRvIHNhdmUgdGhlIG9iamVjdACAAAJBcwBmbHRwdHlwZTdUaGUgZmls ZSB0eXBlIG9mIHRoZSBkb2N1bWVudCBpbiB3aGljaCB0byBzYXZlIHRoZSBkYXRhgAAI U2V0IERhdGEUU2V0IGFuIG9iamVjdCdzIGRhdGFjb3Jlc2V0ZG51bGwAAIAAb2JqIBRU aGUgb2JqZWN0IHRvIGNoYW5nZQAQAAABAlRvAGRhdGEqKioqDVRoZSBuZXcgdmFsdWUA AAAIC0FwcGxpY2F0aW9uY2FwcBdBIE1hY2ludG9zaCBhcHBsaWNhdGlvbgAJCUJlc3Qg VHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0 eXBlCVRoZSBjbGFzcwAACUNsaXBib2FyZHBjbGkqKioqDVRoZSBjbGlwYm9hcmRQAAxE ZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAAS SW5zZXJ0aW9uIGxvY2F0aW9uAHBpbnNpbnNsTVRoZSBsb2NhdGlvbiB3aGVyZSB0aGUg Y29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB3b3VsZCBiZSBpbnNlcnRlZCBieSBhIHBh c3RlAAAJRnJvbnRtb3N0cGlzZmJvb2wiSXMgdGhpcyB0aGUgZnJvbnRtb3N0IGFwcGxp Y2F0aW9uPwAAAAROYW1lAHBuYW1pdHh0CFRoZSBuYW1lAAAADlVzZXIgU2VsZWN0aW9u AHB1c2xjc2VsLVRoZSBjdXJyZW50IHVzZXIgc2VsZWN0aW9uIG9yIGluc2VydGlvbiBw b2ludAAAB1ZlcnNpb252ZXJzbG9uZyVUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGFw cGxpY2F0aW9uAAAAAmRvY3UAAmluZHhuYW1lY3dpbgACaW5keG5hbWUJQ2hhcmFjdGVy Y2hhIAtBIGNoYXJhY3RlcgAJCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2Ny aXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9yY29scmNS R0IJVGhlIGNvbG9yEAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRl c2NyaXB0b3IgdHlwZQAABEZvbnQAZm9udGN0eHQUVGhlIG5hbWUgb2YgdGhlIGZvbnQA EAAEU2l6ZQBwdHN6Zml4ZBJUaGUgc2l6ZSBpbiBwb2ludHMAEAAMV3JpdGluZyBDb2Rl AHBzY3RpbnRsHlRoZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZQAAAAVTdHlsZXR4 c3R0c3R5DlRoZSB0ZXh0IHN0eWxlABAADlVuaWZvcm0gU3R5bGVzAHVzdGx0c3R5DlRo ZSB0ZXh0IHN0eWxlAAAAAAJjaGEgAAFpbmR4Y3R4dAABaW5keA9UZXh0IFN0eWxlIElu Zm90c3R5HU9uIGFuZCBPZmYgc3R5bGVzIG9mIHRleHQgcnVuAAIJT24gU3R5bGVzb25z dHN0eWwjVGhlIHN0eWxlcyB0aGF0IGFyZSBvbiBmb3IgdGhlIHRleHRgAApPZmYgU3R5 bGVzAG9mc3RzdHlsKFRoZSBzdHlsZXMgdGhhdCBhcmUgb2ZmIGZvciBhbGwgdGhlIHRl eHQAYAAAAAhEb2N1bWVudABkb2N1CkEgZG9jdW1lbnQAAAUJQmVzdCBUeXBlcGJzdHR5 cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhlIGNs YXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3Ig dHlwZQAACE1vZGlmaWVkAGltb2Rib29sM0hhcyB0aGUgZG9jdW1lbnQgYmVlbiBtb2Rp ZmllZCBzaW5jZSB0aGUgbGFzdCBzYXZlPwAABE5hbWUAcG5hbWl0eHQIVGhlIG5hbWUA AAAAAWZpbGUAAmluZHhuYW1lBEZpbGUAZmlsZQZBIGZpbGUAAAUJQmVzdCBUeXBlcGJz dHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhl IGNsYXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0 b3IgdHlwZQAAClN0YXRpb25lcnkAcHNwZGJvb2weSXMgdGhlIGZpbGUgYSBzdGF0aW9u ZXJ5IGZpbGU/ABAABE5hbWUAcG5hbWl0eHQIVGhlIG5hbWUAAAAAAAlTZWxlY3Rpb25j c2VsIVRoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlcgADCUJlc3QgVHlwZXBi c3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRo ZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAAABb2JqIAABaW5keARUZXh0AGN0eHQEVGV4dAAACQlCZXN0IFR5cGVw YnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAFQ2xhc3NwY2xzdHlwZQlU aGUgY2xhc3MAAAVDb2xvcmNvbHJjUkdCIFRoZSBjb2xvciBvZiB0aGUgZmlyc3QgY2hh cmFjdGVyABAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAARGb250AGZvbnRjdHh0K1RoZSBuYW1lIG9mIHRoZSBmb250IG9mIHRo ZSBmaXJzdCBjaGFyYWN0ZXIQAARTaXplAHB0c3pmaXhkKVRoZSBzaXplIGluIHBvaW50 cyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAAMV3JpdGluZyBDb2RlAHBzY3RpbnRsHlRo ZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZQAAAAVTdHlsZXR4c3R0c3R5JVRoZSB0 ZXh0IHN0eWxlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIQAA5Vbmlmb3JtIFN0eWxlcwB1 c3RsdHN0eTRUaGUgdGV4dCBzdHlsZXMgdGhhdCBhcmUgdW5pZm9ybSB0aHJvdWdob3V0 IHRoZSB0ZXh0AAAAAAJjaGEgAAFpbmR4Y3R4dAABaW5keAZXaW5kb3cAY3dpbghBIHdp bmRvdwAADwlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUA AAAGQm91bmRzAHBibmRxZHJ0JVRoZSBib3VuZGFyeSByZWN0YW5nbGUgZm9yIHRoZSB3 aW5kb3cQAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0 dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5cGUAAA1IYXMgQ2xvc2UgQm94aGNs YmJvb2whRG9lcyB0aGUgd2luZG93IGhhdmUgYSBjbG9zZSBib3g/AAANSGFzIFRpdGxl IEJhcnB0aXRib29sIURvZXMgdGhlIHdpbmRvdyBoYXZlIGEgdGl0bGUgYmFyPwAABUlu ZGV4cGlkeGxvbmcYVGhlIG51bWJlciBvZiB0aGUgd2luZG93ABAACEZsb2F0aW5nAGlz Zmxib29sFkRvZXMgdGhlIHdpbmRvdyBmbG9hdD8AAAAFTW9kYWxwbW9kYm9vbBRJcyB0 aGUgd2luZG93IG1vZGFsPwAAAAlSZXNpemFibGVwcnN6Ym9vbBhJcyB0aGUgd2luZG93 IHJlc2l6YWJsZT8AAAAIWm9vbWFibGUAaXN6bWJvb2wXSXMgdGhlIHdpbmRvdyB6b29t YWJsZT8AAAZab29tZWQAcHp1bWJvb2wVSXMgdGhlIHdpbmRvdyB6b29tZWQ/EAAETmFt ZQBwbmFtaXR4dBdUaGUgdGl0bGUgb2YgdGhlIHdpbmRvdxAACVNlbGVjdGlvbnNlbGVj c2VsIVRoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlchAAB1Zpc2libGVwdmlz Ym9vbBZJcyB0aGUgd2luZG93IHZpc2libGU/ABAAAAFkb2N1AAJpbmR4bmFtZQAIC2Jl Z2lucyB3aXRoYmd3dAtCZWdpbnMgd2l0aAhjb250YWlucwBjb250CENvbnRhaW5zAAll bmRzIHdpdGhlbmRzCUVuZHMgd2l0aAE9PSAgIAVFcXVhbAE+PiAgIAxHcmVhdGVyIHRo YW4AAj49AD49ICAYR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvAAE8PCAgIAlMZXNzIHRo YW4CPD0APD0gIBVMZXNzIHRoYW4gb3IgZXF1YWwgdG8ABHNhdm8AAwNZZXN5ZXMgEFNh dmUgb2JqZWN0cyBub3cAAk5vAG5vICATRG8gbm90IHNhdmUgb2JqZWN0cwNBc2thc2sg HEFzayB0aGUgdXNlciB3aGV0aGVyIHRvIHNhdmUAcG9zaQAFBkJlZm9yZQBiZWZvF0Jl Zm9yZSBzcGVjaWZpZWQgb2JqZWN0BUFmdGVyYWZ0ZRZBZnRlciBzcGVjaWZpZWQgb2Jq ZWN0AAlCZWdpbm5pbmdiZ25nK0F0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwZWNpZmll ZCBjb250YWluZXIDRW5kZW5kICVBdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgY29u dGFpbmVyB1JlcGxhY2VycGxjHlJlcGxhY2luZyB0aGUgc3BlY2lmaWVkIG9iamVjdABr ZnJtAAMFaW5kZXhpbmR4ImtleWZvcm0gZGVzaWduYXRpbmcgaW5kZXhlZCBhY2Nlc3MA BW5hbWVkbmFtZSBrZXlmb3JtIGRlc2lnbmF0aW5nIG5hbWVkIGFjY2VzcwACSUQAaWQg ICRrZXlmb3JtIGRlc2lnbmF0aW5nIGlkZW50aWZlciBhY2Nlc3MAc3R5bAAPBVBsYWlu cGxhbgVQbGFpbgRCb2xkAGJvbGQEQm9sZAAGSXRhbGljAGl0YWwGSXRhbGljAAdPdXRs aW5lb3V0bAdPdXRsaW5lBlNoYWRvdwBzaGFkBlNoYWRvdwAJVW5kZXJsaW5ldW5kbAlV bmRlcmxpbmULU3VwZXJzY3JpcHRzcHNjC1N1cGVyc2NyaXB0CVN1YnNjcmlwdHNic2MJ U3Vic2NyaXB0DVN0cmlrZXRocm91Z2hzdHJrDVN0cmlrZXRocm91Z2gKU21hbGwgQ2Fw cwBzbWNwClNtYWxsIENhcHMACUFsbCBDYXBzIGFsY3AJQWxsIENhcHMgCUxvd2VyY2Fz ZWxvd2MJTG93ZXJjYXNlCUNvbmRlbnNlZGNvbmQJQ29uZGVuc2VkCEV4cGFuZGVkAHBl eHAIRXhwYW5kZWQABkhpZGRlbgBoaWRuBkhpZGRlbgAKVGV4dCBTdWl0ZSpBIHNldCBv ZiBiYXNpYyBjbGFzc2VzIGZvciB0ZXh0IHByb2Nlc3NpbmdURVhUAAEAAQAAAAYJQ2hh cmFjdGVyY2hhIAtBIGNoYXJhY3RlcgAJCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0 IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9y Y29scmNSR0IJVGhlIGNvbG9yEAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZh dWx0IGRlc2NyaXB0b3IgdHlwZQAABEZvbnQAZm9udGN0eHQUVGhlIG5hbWUgb2YgdGhl IGZvbnQAEAAEU2l6ZQBwdHN6Zml4ZBJUaGUgc2l6ZSBpbiBwb2ludHMAEAAMV3JpdGlu ZyBDb2RlAHBzY3RpbnRsHlRoZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZQAAAAVT dHlsZXR4c3R0c3R5DlRoZSB0ZXh0IHN0eWxlABAADlVuaWZvcm0gU3R5bGVzAHVzdGx0 c3R5DlRoZSB0ZXh0IHN0eWxlAAAAAAVjaGEgAAFpbmR4Y2xpbgABaW5keGNwYXIAAWlu ZHhjdHh0AAFpbmR4Y3dvcgABaW5keARMaW5lAGNsaW4OQSBsaW5lIG9mIHRleHQAAAoJ QmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABUNsYXNz cGNsc3R5cGUJVGhlIGNsYXNzAAAFQ29sb3Jjb2xyY1JHQiBUaGUgY29sb3Igb2YgdGhl IGZpcnN0IGNoYXJhY3RlcgAQAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1 bHQgZGVzY3JpcHRvciB0eXBlAAAERm9udABmb250Y3R4dCtUaGUgbmFtZSBvZiB0aGUg Zm9udCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAANSnVzdGlmaWNhdGlvbnBqc3RqdXN0 GUp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQwAARTaXplAHB0c3pmaXhkKVRoZSBzaXpl IGluIHBvaW50cyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAAMV3JpdGluZyBDb2RlAHBz Y3RpbnRsNVRoZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZSBvZiB0aGUgZmlyc3Qg Y2hhcmFjdGVyAAAFU3R5bGV0eHN0dHN0eSVUaGUgdGV4dCBzdHlsZSBvZiB0aGUgZmly c3QgY2hhcmFjdGVyEAAOVW5pZm9ybSBTdHlsZXMAdXN0bHRzdHk0VGhlIHRleHQgc3R5 bGVzIHRoYXQgYXJlIHVuaWZvcm0gdGhyb3VnaG91dCB0aGUgbGluZQAAAAAFY2hhIAAB aW5keGNsaW4AAWluZHhjcGFyAAFpbmR4Y3R4dAABaW5keGN3b3IAAWluZHgJUGFyYWdy YXBoY3BhcgtBIHBhcmFncmFwaAAKCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRl c2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9yY29s cmNSR0IgVGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIAEAAMRGVmYXVsdCBU eXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAABEZvbnQAZm9u dGN0eHQrVGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlchAA DUp1c3RpZmljYXRpb25wanN0anVzdBlKdXN0aWZpY2F0aW9uIG9mIHRoZSB0ZXh0MAAE U2l6ZQBwdHN6Zml4ZClUaGUgc2l6ZSBpbiBwb2ludHMgb2YgdGhlIGZpcnN0IGNoYXJh Y3RlchAADFdyaXRpbmcgQ29kZQBwc2N0aW50bB5UaGUgc2NyaXB0IHN5c3RlbSBhbmQg bGFuZ3VhZ2UAAAAFU3R5bGV0eHN0dHN0eSVUaGUgdGV4dCBzdHlsZSBvZiB0aGUgZmly c3QgY2hhcmFjdGVyEAAOVW5pZm9ybSBTdHlsZXMAdXN0bHRzdHk5VGhlIHRleHQgc3R5 bGVzIHRoYXQgYXJlIHVuaWZvcm0gdGhyb3VnaG91dCB0aGUgcGFyYWdyYXBoAAAABWNo YSAAAWluZHhjbGluAAFpbmR4Y3BhcgABaW5keGN0eHQAAWluZHhjd29yAAFpbmR4BFRl eHQAY3R4dARUZXh0AAAJCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0 b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9yY29scmNSR0Ig VGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIAEAAMRGVmYXVsdCBUeXBlAGRl ZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAABEZvbnQAZm9udGN0eHQr VGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlchAABFNpemUA cHRzemZpeGQpVGhlIHNpemUgaW4gcG9pbnRzIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIQ AAxXcml0aW5nIENvZGUAcHNjdGludGweVGhlIHNjcmlwdCBzeXN0ZW0gYW5kIGxhbmd1 YWdlAAAABVN0eWxldHhzdHRzdHk8VGhlIHRleHQgc3R5bGUgb2YgdGhlIGZpcnN0IGNo YXJhY3RlciBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyABAADlVuaWZvcm0gU3R5bGVzAHVz dGx0c3R5NFRoZSB0ZXh0IHN0eWxlcyB0aGF0IGFyZSB1bmlmb3JtIHRocm91Z2hvdXQg dGhlIHRleHQAEAAABWNoYSAAAWluZHhjbGluAAFpbmR4Y3BhcgABaW5keGN0eHQAAWlu ZHhjd29yAAFpbmR4CVRleHQgRmxvd2NmbG8aQSBjb250aWd1b3VzIGJsb2NrIG9mIHRl eHQAAAsJQmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAA BUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAFQ29sb3Jjb2xyY1JHQiBUaGUgY29sb3Ig b2YgdGhlIGZpcnN0IGNoYXJhY3RlcgAQAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhl IGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAAERm9udABmb250Y3R4dCtUaGUgbmFtZSBv ZiB0aGUgZm9udCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAANSnVzdGlmaWNhdGlvbnBq c3RqdXN0GUp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQwAARTaXplAHB0c3pmaXhkKVRo ZSBzaXplIGluIHBvaW50cyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyEAAETmFtZQBwbmFt aXR4dAhUaGUgbmFtZQAQAAxXcml0aW5nIENvZGUAcHNjdGludGweVGhlIHNjcmlwdCBz eXN0ZW0gYW5kIGxhbmd1YWdlAAAABVN0eWxldHhzdHRzdHklVGhlIHRleHQgc3R5bGUg b2YgdGhlIGZpcnN0IGNoYXJhY3RlchAADlVuaWZvcm0gU3R5bGVzAHVzdGx0c3R5NFRo ZSB0ZXh0IHN0eWxlcyB0aGF0IGFyZSB1bmlmb3JtIHRocm91Z2hvdXQgdGhlIHRleHQA AAAABWNoYSAAAWluZHhjbGluAAFpbmR4Y3BhcgABaW5keGN0eHQAAWluZHhjd29yAAFp bmR4BFdvcmQAY3dvcgZBIHdvcmQAAAkJQmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3Qg ZGVzY3JpcHRvciB0eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAFQ29sb3Jj b2xyY1JHQiBUaGUgY29sb3Igb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgAQAAxEZWZhdWx0 IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAAERm9udABm b250Y3R4dCtUaGUgbmFtZSBvZiB0aGUgZm9udCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVy EAAEU2l6ZQBwdHN6Zml4ZClUaGUgc2l6ZSBpbiBwb2ludHMgb2YgdGhlIGZpcnN0IGNo YXJhY3RlchAADFdyaXRpbmcgQ29kZQBwc2N0aW50bB5UaGUgc2NyaXB0IHN5c3RlbSBh bmQgbGFuZ3VhZ2UAAAAFU3R5bGV0eHN0dHN0eSVUaGUgdGV4dCBzdHlsZSBvZiB0aGUg Zmlyc3QgY2hhcmFjdGVyEAAOVW5pZm9ybSBTdHlsZXMAdXN0bHRzdHk0VGhlIHRleHQg c3R5bGVzIHRoYXQgYXJlIHVuaWZvcm0gdGhyb3VnaG91dCB0aGUgd29yZAAQAAAFY2hh IAABaW5keGNsaW4AAWluZHhjcGFyAAFpbmR4Y3R4dAABaW5keGN3b3IAAWluZHgAAgI9 PQBjc2VxFENhc2Utc2Vuc2l0aXZlIG1hdGNoAAMvPS93d2VxNENoYXJhY3RlcnMgbWF0 Y2ggYW5kIG9wZXJhbmRzIGVuZCBvbiB3b3JkIGJvdW5kYXJpZXMAAAFqdXN0AAQETGVm dABsZWZ0FkFsaWduIHdpdGggbGVmdCBtYXJnaW4ABVJpZ2h0cmdodBdBbGlnbiB3aXRo IHJpZ2h0IG1hcmdpbgZDZW50ZXIAY2VudBFBbGlnbiB3aXRoIGNlbnRlcgRGdWxsAGZ1 bGwmQWxpZ24gd2l0aCBib3RoIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMAGFF1aWNrRHJh dyBHcmFwaGljcyBTdWl0ZSNBIHNldCBvZiBiYXNpYyBjbGFzc2VzIGZvciBncmFwaGlj cwBxZHJ3AAEAAQAAAA0DQXJjY2FyYwZBbiBhcmMAAA0JQXJjIGFuZ2xlcGFyY2ZpeGQb QW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzEAAJQmVzdCBUeXBlcGJzdHR5cGUYVGhl IGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABkJvdW5kcwBwYm5kcWRydDNUaGUgc21hbGxl c3QgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGVudGlyZSBhcmMQAAVDbGFzc3Bj bHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVs dCBkZXNjcmlwdG9yIHR5cGUAAA9EZWZpbml0aW9uIFJlY3RwZHJ0cWRydEVUaGUgcmVj dGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGNpcmNsZSBvciBvdmFsIHVzZWQgdG8gZGVm aW5lIHRoZSBhcmMQAApGaWxsIENvbG9yAGZsY2xjUkdCDlRoZSBmaWxsIGNvbG9yABAA DEZpbGwgUGF0dGVybgBmbHB0Y3BpeBBUaGUgZmlsbCBwYXR0ZXJuABAACVBlbiBDb2xv cnBwY2xjUkdCDVRoZSBwZW4gY29sb3IQAAtQZW4gUGF0dGVybnBwcGFjcGl4D1RoZSBw ZW4gcGF0dGVybhAACVBlbiBXaWR0aHBwd2RzaG9yDVRoZSBwZW4gd2lkdGgQAAtTdGFy dCBhbmdsZXBhbmdmaXhkN1RoZSBhbmdsZSB0aGF0IGRlZmluZXMgdGhlIHN0YXJ0IG9m IHRoZSBhcmMsIGluIGRlZ3JlZXMQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRy YW5zZmVyIG1vZGUwAAAADERyYXdpbmcgQXJlYQBjZHJ3MUNvbnRhaW5lciBmb3IgZ3Jh cGhpY3MgYW5kIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24AFxBCYWNrZ3JvdW5kIENvbG9y AHBiY2xjUkdCKlRoZSBjb2xvciB1c2VkIHRvIGZpbGwgaW4gdW5vY2N1cGllZCBhcmVh cwAQABJCYWNrZ3JvdW5kIFBhdHRlcm4AcGJwdGNwaXgsVGhlIHBhdHRlcm4gdXNlZCB0 byBmaWxsIGluIHVub2NjdXBpZWQgYXJlYXMAEAAJQmVzdCBUeXBlcGJzdHR5cGUYVGhl IGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABkJvdW5kcwBwYm5kcWRydCxUaGUgcmVjdGFu Z2xlIHRoYXQgY29udGFpbnMgdGhlIGRyYXdpbmcgYXJlYQAQAAVDbGFzc3BjbHN0eXBl CVRoZSBjbGFzcwAAC0NvbG9yIFRhYmxlY2x0YmNscnQPVGhlIGNvbG9yIHRhYmxlEAAM RGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAA CkZpbGwgQ29sb3IAZmxjbGNSR0IvVGhlIGRlZmF1bHQgZmlsbCBjb2xvciB1c2VkIGZv ciBncmFwaGljIG9iamVjdHMQAAxGaWxsIFBhdHRlcm4AZmxwdGNwaXgxVGhlIGRlZmF1 bHQgZmlsbCBwYXR0ZXJuIHVzZWQgZm9yIGdyYXBoaWMgb2JqZWN0cxAACE9yZGVyaW5n AGdvYnNvYmogN1RoZSBvcmRlcmVkIGxpc3Qgb2YgZ3JhcGhpYyBvYmplY3RzIGluIHRo ZSBkcmF3aW5nIGFyZWFQAAROYW1lAHBuYW1pdHh0CFRoZSBuYW1lABAAEERlZmF1bHQg TG9jYXRpb24AcG5lbFFEcHQvVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgZWFjaCBuZXcg Z3JhcGhpYyBvYmplY3QQAAlQZW4gQ29sb3JwcGNsY1JHQg1UaGUgcGVuIGNvbG9yEAAL UGVuIFBhdHRlcm5wcHBhY3BpeA9UaGUgcGVuIHBhdHRlcm4QAAlQZW4gV2lkdGhwcHdk c2hvcg1UaGUgcGVuIHdpZHRoEAALUGl4ZWwgRGVwdGhwZHB0c2hvcg5CaXRzIHBlciBw aXhlbAAQAAxXcml0aW5nIENvZGUAcHNjdGludGxCVGhlIHNjcmlwdCBzeXN0ZW0gYW5k IGxhbmd1YWdlIG9mIHRleHQgb2JqZWN0cyBpbiB0aGUgZHJhd2luZyBhcmVhAAAAClRl eHQgQ29sb3IAcHR4Y2NSR0IiVGhlIGRlZmF1bHQgY29sb3IgZm9yIHRleHQgb2JqZWN0 cwAQAARGb250AHB0eGZpdHh0LVRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGZvbnQgZm9y IHRleHQgb2JqZWN0cxAABFNpemUAcHRwc2ZpeGQnVGhlIGRlZmF1bHQgcG9pbnQgc2l6 ZSBmb3IgdGV4dCBvYmplY3RzEAAFU3R5bGV0eHN0dHN0eSdUaGUgZGVmYXVsdCB0ZXh0 IHN0eWxlIGZvciB0ZXh0IG9iamVjdHMQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4tVGhl IGRlZmF1bHQgdHJhbnNmZXIgbW9kZSBmb3IgZ3JhcGhpYyBvYmplY3RzMAAQVXBkYXRl IE9uIENoYW5nZQBwdXBkYm9vbBlSZWRyYXcgYWZ0ZXIgZWFjaCBjaGFuZ2U/EAAACmNh cmMAAmluZHhuYW1lZ2xpbgACaW5keG5hbWVjZ3R4AAJpbmR4bmFtZWNwaWMAAmluZHhu YW1lY292bAACaW5keG5hbWVjcGl4AAJpbmR4bmFtZWNwZ24AAmluZHhuYW1lY3JlYwAC aW5keG5hbWVjcnJjAAJpbmR4bmFtZWNnb2IAAmluZHhuYW1lDEdyYXBoaWMgTGluZQBn bGluDkEgZ3JhcGhpYyBsaW5lAAAMCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRl c2NyaXB0b3IgdHlwZQAAAAZCb3VuZHMAcGJuZHFkcnQ+VGhlIHNtYWxsZXN0IHJlY3Rh bmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBlbnRpcmUgZ3JhcGhpYyBvYmplY3QAEAAFQ2xh c3NwY2xzdHlwZQlUaGUgY2xhc3MAAApEYXNoIFN0eWxlAHBkc3R0ZGFzDlRoZSBkYXNo IHN0eWxlAFAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAAlFbmQgUG9pbnRwZW5kUURwdBxUaGUgZW5kaW5nIHBvaW50IG9mIHRo ZSBsaW5lABAAC0Fycm93IFN0eWxlYXJyb2Fycm8PVGhlIGFycm93IHN0eWxlMAAJUGVu IENvbG9ycHBjbGNSR0INVGhlIHBlbiBjb2xvchAAC1BlbiBQYXR0ZXJucHBwYWNwaXgP VGhlIHBlbiBwYXR0ZXJuEAAJUGVuIFdpZHRocHB3ZHNob3INVGhlIHBlbiB3aWR0aBAA C1N0YXJ0IFBvaW50cHN0cFFEcHQeVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5l ABAADVRyYW5zZmVyIE1vZGVwcHRtdHJhbhFUaGUgdHJhbnNmZXIgbW9kZTAAAAAOR3Jh cGhpYyBPYmplY3QAY2dvYhBBIGdyYXBoaWMgb2JqZWN0AAAFCUJlc3QgVHlwZXBic3R0 eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAZCb3VuZHMAcGJuZHFkcnQ+VGhl IHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBlbnRpcmUgZ3JhcGhp YyBvYmplY3QAEAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xhc3MAAAxEZWZhdWx0IFR5cGUA ZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAANVHJhbnNmZXIgTW9k ZXBwdG10cmFuEVRoZSB0cmFuc2ZlciBtb2RlMAAAAA1HcmFwaGljIFNoYXBlY2dzaA9B IGdyYXBoaWMgc2hhcGUACwlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlw dG9yIHR5cGUAAAAGQm91bmRzAHBibmRxZHJ0NVRoZSBzbWFsbGVzdCByZWN0YW5nbGUg dGhhdCBjb250YWlucyB0aGUgZW50aXJlIHNoYXBlEAAFQ2xhc3NwY2xzdHlwZQlUaGUg Y2xhc3MAAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRv ciB0eXBlAAAPRGVmaW5pdGlvbiBSZWN0cGRydHFkcnQmVGhlIHJlY3RhbmdsZSB1c2Vk IHRvIGRlZmluZSB0aGUgc2hhcGUAEAAKRmlsbCBDb2xvcgBmbGNsY1JHQg5UaGUgZmls bCBjb2xvcgAQAAxGaWxsIFBhdHRlcm4AZmxwdGNwaXgQVGhlIGZpbGwgcGF0dGVybgAQ AAlQZW4gQ29sb3JwcGNsY1JHQg1UaGUgcGVuIGNvbG9yEAALUGVuIFBhdHRlcm5wcHBh Y3BpeA9UaGUgcGVuIHBhdHRlcm4QAAlQZW4gV2lkdGhwcHdkc2hvcg1UaGUgcGVuIHdp ZHRoEAANVHJhbnNmZXIgTW9kZXBwdG10cmFuEVRoZSB0cmFuc2ZlciBtb2RlMAAAAAxH cmFwaGljIFRleHQAY2d0eCxBIHNlcmllcyBvZiBjaGFyYWN0ZXJzIHdpdGhpbiBhIGRy YXdpbmcgYXJlYQAACwlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9y IHR5cGUAAAAGQm91bmRzAHBibmRxZHJ0NFRoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhh dCBjb250YWlucyB0aGUgZW50aXJlIHRleHQAEAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xh c3MAAAVDb2xvcmNvbHJjUkdCIFRoZSBjb2xvciBvZiB0aGUgZmlyc3QgY2hhcmFjdGVy ABAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5 cGUAAARGb250AGZvbnRjdHh0K1RoZSBuYW1lIG9mIHRoZSBmb250IG9mIHRoZSBmaXJz dCBjaGFyYWN0ZXIQAARTaXplAHB0c3pmaXhkKVRoZSBzaXplIGluIHBvaW50cyBvZiB0 aGUgZmlyc3QgY2hhcmFjdGVyEAAMV3JpdGluZyBDb2RlAHBzY3RpbnRsHlRoZSBzY3Jp cHQgc3lzdGVtIGFuZCBsYW5ndWFnZQAAAAVTdHlsZXR4c3R0c3R5JVRoZSB0ZXh0IHN0 eWxlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4R VGhlIHRyYW5zZmVyIG1vZGUwAA5Vbmlmb3JtIFN0eWxlcwB1c3RsdHN0eTRUaGUgdGV4 dCBzdHlsZXMgdGhhdCBhcmUgdW5pZm9ybSB0aHJvdWdob3V0IHRoZSB0ZXh0ABAAAAJj aGEgAAFpbmR4Y3R4dAABaW5keA9Hcm91cGVkIEdyYXBoaWNjcGljEUdyb3VwIG9mIGdy YXBoaWNzAAcJQmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBl AAAABkJvdW5kcwBwYm5kcWRydD5UaGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQgY29u dGFpbnMgdGhlIGVudGlyZSBncmFwaGljIG9iamVjdAAQAAVDbGFzc3BjbHN0eXBlCVRo ZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAAhPcmRlcmluZwBnb2Jzb2JqIDdUaGUgb3JkZXJlZCBsaXN0IG9mIGdy YXBoaWMgb2JqZWN0cyBpbiB0aGUgZHJhd2luZyBhcmVhUAAETmFtZQBwbmFtaXR4dAhU aGUgbmFtZQAQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRyYW5zZmVyIG1vZGUw AAAKY2FyYwACaW5keG5hbWVnbGluAAJpbmR4bmFtZWNndHgAAmluZHhuYW1lY3BpYwAC aW5keG5hbWVjb3ZsAAJpbmR4bmFtZWNwaXgAAmluZHhuYW1lY3BnbgACaW5keG5hbWVj cmVjAAJpbmR4bmFtZWNycmMAAmluZHhuYW1lY2dvYgACaW5keG5hbWUET3ZhbABjb3Zs B0FuIG92YWwACwlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5 cGUAAAAGQm91bmRzAHBibmRxZHJ0NFRoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCBj b250YWlucyB0aGUgZW50aXJlIG92YWwAEAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xhc3MA AAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBl AAAPRGVmaW5pdGlvbiBSZWN0cGRydHFkcnQlVGhlIHJlY3RhbmdsZSB1c2VkIHRvIGRl ZmluZSB0aGUgb3ZhbBAACkZpbGwgQ29sb3IAZmxjbGNSR0IOVGhlIGZpbGwgY29sb3IA EAAMRmlsbCBQYXR0ZXJuAGZscHRjcGl4EFRoZSBmaWxsIHBhdHRlcm4AEAAJUGVuIENv bG9ycHBjbGNSR0INVGhlIHBlbiBjb2xvchAAC1BlbiBQYXR0ZXJucHBwYWNwaXgPVGhl IHBlbiBwYXR0ZXJuEAAJUGVuIFdpZHRocHB3ZHNob3INVGhlIHBlbiB3aWR0aBAADVRy YW5zZmVyIE1vZGVwcHRtdHJhbhFUaGUgdHJhbnNmZXIgbW9kZTAAAAAFUGl4ZWxjcHhs B0EgcGl4ZWwABAlCZXN0IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5 cGUAAAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xhc3MAAAVDb2xvcmNvbHJjUkdCCVRoZSBj b2xvchAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9y IHR5cGUAAAAACVBpeGVsIE1hcGNwaXgLQSBwaXhlbCBtYXAABQlCZXN0IFR5cGVwYnN0 dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAGQm91bmRzAHBibmRxZHJ0MlRo ZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgcGl4ZWwgbWFwABAA BUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1Ro ZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAADVRyYW5zZmVyIE1vZGVwcHRtdHJhbhFU aGUgdHJhbnNmZXIgbW9kZTAAAAFjcHhsAAFpbmR4B1BvbHlnb25jcGduCUEgcG9seWdv bgALCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAZC b3VuZHMAcGJuZHFkcnQ3VGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5z IHRoZSBlbnRpcmUgcG9seWdvbhAABUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAPRGVm aW5pdGlvbiBSZWN0cGRydHFkcnQoVGhlIHJlY3RhbmdsZSB1c2VkIHRvIGRlZmluZSB0 aGUgcG9seWdvbgAQAApGaWxsIENvbG9yAGZsY2xjUkdCDlRoZSBmaWxsIGNvbG9yABAA DEZpbGwgUGF0dGVybgBmbHB0Y3BpeBBUaGUgZmlsbCBwYXR0ZXJuABAACVBlbiBDb2xv cnBwY2xjUkdCDVRoZSBwZW4gY29sb3IQAAtQZW4gUGF0dGVybnBwcGFjcGl4D1RoZSBw ZW4gcGF0dGVybhAACVBlbiBXaWR0aHBwd2RzaG9yDVRoZSBwZW4gd2lkdGgQAApQb2lu dCBMaXN0AHB0bHRRRHB0KlRoZSBsaXN0IG9mIHBvaW50cyB0aGF0IGRlZmluZSB0aGUg cG9seWdvbgBQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRyYW5zZmVyIG1vZGUw AAAACVJlY3RhbmdsZWNyZWMLQSByZWN0YW5nbGUACwlCZXN0IFR5cGVwYnN0dHlwZRhU aGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAGQm91bmRzAHBibmRxZHJ0DVRoZSByZWN0 YW5nbGUQAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0 dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5cGUAAA9EZWZpbml0aW9uIFJlY3Rw ZHJ0cWRydD9UaGUgdXBwZXItbGVmdCBhbmQgbG93ZXItcmlnaHQgcG9pbnRzIHRoYXQg ZGVmaW5lIHRoZSByZWN0YW5nbGUQAApGaWxsIENvbG9yAGZsY2xjUkdCDlRoZSBmaWxs IGNvbG9yABAADEZpbGwgUGF0dGVybgBmbHB0Y3BpeBBUaGUgZmlsbCBwYXR0ZXJuABAA CVBlbiBDb2xvcnBwY2xjUkdCDVRoZSBwZW4gY29sb3IQAAtQZW4gUGF0dGVybnBwcGFj cGl4D1RoZSBwZW4gcGF0dGVybhAACVBlbiBXaWR0aHBwd2RzaG9yDVRoZSBwZW4gd2lk dGgQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRyYW5zZmVyIG1vZGUwAAAAEVJv dW5kZWQgUmVjdGFuZ2xlY3JyYxNBIHJvdW5kZWQgcmVjdGFuZ2xlAA0JQmVzdCBUeXBl cGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABkJvdW5kcwBwYm5kcWRy dA1UaGUgcmVjdGFuZ2xlEAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xhc3MAABNDb3JuZXIg Q3VydmUgSGVpZ2h0cGNoZHNob3JGVGhlIGhlaWdodCBvZiB0aGUgb3ZhbCB1c2VkIHRv IGRlZmluZSB0aGUgc2hhcGUgb2YgdGhlIHJvdW5kZWQgY29ybmVycwAQABJDb3JuZXIg Q3VydmUgV2lkdGgAcGN3ZHNob3JFVGhlIHdpZHRoIG9mIHRoZSBvdmFsIHVzZWQgdG8g ZGVmaW5lIHRoZSBzaGFwZSBvZiB0aGUgcm91bmRlZCBjb3JuZXJzEAAMRGVmYXVsdCBU eXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAAD0RlZmluaXRp b24gUmVjdHBkcnRxZHJ0P1RoZSB1cHBlci1sZWZ0IGFuZCBsb3dlci1yaWdodCBwb2lu dHMgdGhhdCBkZWZpbmUgdGhlIHJlY3RhbmdsZRAACkZpbGwgQ29sb3IAZmxjbGNSR0IO VGhlIGZpbGwgY29sb3IAEAAMRmlsbCBQYXR0ZXJuAGZscHRjcGl4EFRoZSBmaWxsIHBh dHRlcm4AEAAJUGVuIENvbG9ycHBjbGNSR0INVGhlIHBlbiBjb2xvchAAC1BlbiBQYXR0 ZXJucHBwYWNwaXgPVGhlIHBlbiBwYXR0ZXJuEAAJUGVuIFdpZHRocHB3ZHNob3INVGhl IHBlbiB3aWR0aBAADVRyYW5zZmVyIE1vZGVwcHRtdHJhbhFUaGUgdHJhbnNmZXIgbW9k ZTAAAAAAAAACdHJhbgAPBENvcHkAY3B5IAAAB05vdENvcHluY3B5AAACT3IAb3IgIAAA BU5vdE9ybnRvcgAAA0JpY2JpYyAAAAZOb3RCaWMAbmJpYwAAA1hvcnhvciAAAAZOb3RY b3IAbnhvcgAAB0FkZE92ZXJhZGRvAAAGQWRkUGluAGFkZHAAAAdTdWJPdmVyc3VibwAA BlN1YlBpbgBzdWJwAAAFQWRNYXhhZG14AAAFQWRNaW5hZG1uAAAFQmxlbmRibG5kAABh cnJvAAQITm8gQXJyb3cAYXJubxBObyBhcnJvdyBvbiBsaW5lAA5BcnJvdyBhdCBTdGFy dABhcnN0FkFycm93IGF0IHN0YXJ0IG9mIGxpbmUADEFycm93IGF0IEVuZABhcmVuFEFy cm93IGF0IGVuZCBvZiBsaW5lABJBcnJvdyBhdCBCb3RoIEVuZHMAYXJiby9BcnJvdyBh dCBib3RoIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgbGluZSVRdWlja0RyYXcg R3JhcGhpY3MgU3VwcGxlbWVudGFsIFN1aXRlKkRlZmluZXMgdHJhbnNmb3JtYXRpb25z IG9mIGdyYXBoaWMgb2JqZWN0cwBxZHNwAAEAAQAAAAIMRHJhd2luZyBBcmVhAGNkcncx Q29udGFpbmVyIGZvciBncmFwaGljcyBhbmQgc3VwcG9ydGluZyBpbmZvcm1hdGlvbgAa EEJhY2tncm91bmQgQ29sb3IAcGJjbGNSR0IqVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCBp biB1bm9jY3VwaWVkIGFyZWFzABAAEkJhY2tncm91bmQgUGF0dGVybgBwYnB0Y3BpeCxU aGUgcGF0dGVybiB1c2VkIHRvIGZpbGwgaW4gdW5vY2N1cGllZCBhcmVhcwAQAAlCZXN0 IFR5cGVwYnN0dHlwZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAGQm91bmRzAHBi bmRxZHJ0LFRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgZHJhd2luZyBhcmVh ABAABUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAALQ29sb3IgVGFibGVjbHRiY2xydA9U aGUgY29sb3IgdGFibGUQAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQg ZGVzY3JpcHRvciB0eXBlAAAKRmlsbCBDb2xvcgBmbGNsY1JHQi9UaGUgZGVmYXVsdCBm aWxsIGNvbG9yIHVzZWQgZm9yIGdyYXBoaWMgb2JqZWN0cxAADEZpbGwgUGF0dGVybgBm bHB0Y3BpeDFUaGUgZGVmYXVsdCBmaWxsIHBhdHRlcm4gdXNlZCBmb3IgZ3JhcGhpYyBv YmplY3RzEAAIT3JkZXJpbmcAZ29ic29iaiA3VGhlIG9yZGVyZWQgbGlzdCBvZiBncmFw aGljIG9iamVjdHMgaW4gdGhlIGRyYXdpbmcgYXJlYVAABE5hbWUAcG5hbWl0eHQIVGhl IG5hbWUAEAAQRGVmYXVsdCBMb2NhdGlvbgBwbmVsUURwdC9UaGUgZGVmYXVsdCBsb2Nh dGlvbiBvZiBlYWNoIG5ldyBncmFwaGljIG9iamVjdBAACVBlbiBDb2xvcnBwY2xjUkdC DVRoZSBwZW4gY29sb3IQAAtQZW4gUGF0dGVybnBwcGFjcGl4D1RoZSBwZW4gcGF0dGVy bhAACVBlbiBXaWR0aHBwd2RzaG9yDVRoZSBwZW4gd2lkdGgQAAtQaXhlbCBEZXB0aHBk cHRzaG9yDkJpdHMgcGVyIHBpeGVsABAACFJvdGF0aW9uAHByb3R0cm90NFRoZSBkZWZh dWx0IHJvdGF0aW9uIGZvciBvYmplY3RzIGluIHRoZSBkcmF3aW5nIGFyZWEAEAAFU2Nh bGVwc2NsZml4ZDNUaGUgZGVmYXVsdCBzY2FsaW5nIGZvciBvYmplY3RzIGluIHRoZSBk cmF3aW5nIGFyZWEQAAxXcml0aW5nIENvZGUAcHNjdGludGxCVGhlIHNjcmlwdCBzeXN0 ZW0gYW5kIGxhbmd1YWdlIG9mIHRleHQgb2JqZWN0cyBpbiB0aGUgZHJhd2luZyBhcmVh AAAAClRleHQgQ29sb3IAcHR4Y2NSR0IiVGhlIGRlZmF1bHQgY29sb3IgZm9yIHRleHQg b2JqZWN0cwAQAARGb250AHB0eGZpdHh0LVRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGZv bnQgZm9yIHRleHQgb2JqZWN0cxAABFNpemUAcHRwc2ZpeGQnVGhlIGRlZmF1bHQgcG9p bnQgc2l6ZSBmb3IgdGV4dCBvYmplY3RzEAAFU3R5bGV0eHN0dHN0eSdUaGUgZGVmYXVs dCB0ZXh0IHN0eWxlIGZvciB0ZXh0IG9iamVjdHMQAA1UcmFuc2ZlciBNb2RlcHB0bXRy YW4tVGhlIGRlZmF1bHQgdHJhbnNmZXIgbW9kZSBmb3IgZ3JhcGhpYyBvYmplY3RzMAAL VHJhbnNsYXRpb25wdHJzUURwdDlUaGUgZGVmYXVsdCByZXBvc2l0aW9uaW5nIGZvciBv YmplY3RzIGluIHRoZSBkcmF3aW5nIGFyZWEQABBVcGRhdGUgT24gQ2hhbmdlAHB1cGRi b29sGVJlZHJhdyBhZnRlciBlYWNoIGNoYW5nZT8QAAAKY2FyYwACaW5keG5hbWVnbGlu AAJpbmR4bmFtZWNndHgAAmluZHhuYW1lY3BpYwACaW5keG5hbWVjb3ZsAAJpbmR4bmFt ZWNwaXgAAmluZHhuYW1lY3BnbgACaW5keG5hbWVjcmVjAAJpbmR4bmFtZWNycmMAAmlu ZHhuYW1lY2dvYgACaW5keG5hbWUPR3JvdXBlZCBHcmFwaGljY3BpYxFHcm91cCBvZiBn cmFwaGljcwAKCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlw ZQAAAAZCb3VuZHMAcGJuZHFkcnQ+VGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNv bnRhaW5zIHRoZSBlbnRpcmUgZ3JhcGhpYyBvYmplY3QAEAAFQ2xhc3NwY2xzdHlwZQlU aGUgY2xhc3MAAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3Jp cHRvciB0eXBlAAAIT3JkZXJpbmcAZ29ic29iaiA3VGhlIG9yZGVyZWQgbGlzdCBvZiBn cmFwaGljIG9iamVjdHMgaW4gdGhlIGRyYXdpbmcgYXJlYVAABE5hbWUAcG5hbWl0eHQI VGhlIG5hbWUAEAAIUm90YXRpb24AcHJvdHRyb3QMVGhlIHJvdGF0aW9uABAABVNjYWxl cHNjbGZpeGQLVGhlIHNjYWxpbmcQAA1UcmFuc2ZlciBNb2RlcHB0bXRyYW4RVGhlIHRy YW5zZmVyIG1vZGUwAAtUcmFuc2xhdGlvbnB0cnNRRHB0D1RoZSB0cmFuc2xhdGlvbhAA AApjYXJjAAJpbmR4bmFtZWdsaW4AAmluZHhuYW1lY2d0eAACaW5keG5hbWVjcGljAAJp bmR4bmFtZWNvdmwAAmluZHhuYW1lY3BpeAACaW5keG5hbWVjcGduAAJpbmR4bmFtZWNy ZWMAAmluZHhuYW1lY3JyYwACaW5keG5hbWVjZ29iAAJpbmR4bmFtZQAAAAALVGFibGUg U3VpdGUfQ2xhc3NlcyBmb3IgbWFuaXB1bGF0aW5nIHRhYmxlc3RibHMAAQABAAAABARD ZWxsAGNjZWwGQSBjZWxsAAAFCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRlc2Ny aXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQgVHlw ZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5cGUAAAdGb3JtdWxhcGZv cmN0eHQXVGhlIGZvcm11bGEgb2YgdGhlIGNlbGwQAApQcm90ZWN0aW9uAHBwcm9wcnRu PUluZGljYXRlcyB3aGV0aGVyIHZhbHVlIG9yIGZvcm11bGEgaW4gdGhlIGNlbGwgY2Fu IGJlIGNoYW5nZWQwAAAABkNvbHVtbgBjY29sCEEgY29sdW1uAAAFCUJlc3QgVHlwZXBi c3R0eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRo ZSBjbGFzcwAADERlZmF1bHQgVHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlw dG9yIHR5cGUAAAROYW1lAHBuYW1pdHh0CFRoZSBuYW1lABAAClByb3RlY3Rpb24AcHBy b3BydG5ISW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZvcm11bGFzIG9mIHRoZSBjZWxscyBp biB0aGUgY29sdW1uIGNhbiBiZSBjaGFuZ2VkADAAAAFjY2VsAAJpbmR4bmFtZQNSb3dj cm93BUEgcm93AAUJQmVzdCBUeXBlcGJzdHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0 eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhlIGNsYXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0 eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAABE5hbWUAcG5hbWl0eHQIVGhl IG5hbWUAEAAKUHJvdGVjdGlvbgBwcHJvcHJ0bkVJbmRpY2F0ZXMgd2hldGhlciB0aGUg Zm9ybXVsYXMgb2YgdGhlIGNlbGxzIGluIHRoZSByb3cgY2FuIGJlIGNoYW5nZWQwAAAB Y2NlbAACaW5keG5hbWUFVGFibGVjdGJsB0EgdGFibGUABQlCZXN0IFR5cGVwYnN0dHlw ZRhUaGUgYmVzdCBkZXNjcmlwdG9yIHR5cGUAAAAFQ2xhc3NwY2xzdHlwZQlUaGUgY2xh c3MAAAxEZWZhdWx0IFR5cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0 eXBlAAAETmFtZQBwbmFtaXR4dAhUaGUgbmFtZQAQAApQcm90ZWN0aW9uAHBwcm9wcnRu R0luZGljYXRlcyB3aGV0aGVyIHRoZSBmb3JtdWxhcyBvZiB0aGUgY2VsbHMgaW4gdGhl IHRhYmxlIGNhbiBiZSBjaGFuZ2VkMAAAA2NjZWwAAmluZHhuYW1lY2NvbAACaW5keG5h bWVjcm93AAJpbmR4bmFtZQAAAAFwcnRuAAMJUmVhZCBPbmx5bm1vZB9DYW4ndCBjaGFu Z2UgdmFsdWVzIG9yIGZvcm11bGFzEkZvcm11bGFzIFByb3RlY3RlZABmcHJvI0NhbiBj aGFuZ2VzIHZhbHVlcyBidXQgbm90IGZvcm11bGFzClJlYWQvV3JpdGUAbW9kZh5DYW4g Y2hhbmdlIHZhbHVlcyBhbmQgZm9ybXVsYXMAHU1pc2NlbGxhbmVvdXMgU3RhbmRhcmRz IFN1aXRlKU1pc2NlbGxhbmVvdXMgc3RhbmRhcmQgZXZlbnRzIGFuZCBjbGFzc2VzbWlz YwABAAEADhFCZWdpbiBUcmFuc2FjdGlvbhNCZWdpbiBhIHRyYW5zYWN0aW9ubWlzY2Jl Z2lsb25nAAAAAG51bGwAAJAAAAAEQ29weR9Db3B5IGFuIG9iamVjdCB0byB0aGUgY2xp cGJvYXJkAG1pc2Njb3B5bnVsbAAAgABudWxsAACQAAAAEENyZWF0ZSBQdWJsaXNoZXIS Q3JlYXRlIGEgcHVibGlzaGVybWlzY2NwdWJudWxsAACAAG9iaiART2JqZWN0IHRvIHB1 Ymxpc2iQAAABB0VkaXRpb25lbG9jYWxpcyNBbGlhcyB0byB0aGUgZWRpdGlvbiBjb250 YWluZXIgZmlsZYAAA0N1dB5DdXQgYW4gb2JqZWN0IHRvIHRoZSBjbGlwYm9hcmQAbWlz Y2N1dCBudWxsAACAAG51bGwAAJAAAAAJRG8gU2NyaXB0EEV4ZWN1dGUgYSBzY3JpcHQA bWlzY2Rvc2MqKioqAACAAFRFWFQVVGhlIHNjcmlwdCB0byBleGVjdXRlEAAAAAxFZGl0 IEdyYXBoaWMfRWRpdCB0aGUgc3BlY2lmaWVkIGRyYXdpbmcgYXJlYQBtaXNjZWRpdHRk YXIAAAAAdGRhch1UaGUgZHJhd2luZyBhcmVhIHRvIGJlIGVkaXRlZBAAAAAPRW5kIFRy YW5zYWN0aW9uEUVuZCBhIHRyYW5zYWN0aW9ubWlzY2VuZHRudWxsAACAAG51bGwAAJAA AAANSW1hZ2UgR3JhcGhpYyxDb252ZXJ0IGEgZ3JhcGhpYyBmcm9tIG9uZSBmb3JtYXQg dG8gYW5vdGhlcgBtaXNjaW1ncioqKioAAAAAKioqKihUaGUgZ3JhcGhpYyB0byBiZSBj b252ZXJ0ZWQgb3IgZm9ybWF0dGVkABAAAAoMQW50aWFsaWFzaW5nAGFudGFib29sEFVz ZSBhbnRpYWxpYXNpbmcAgAAJRGl0aGVyaW5nZ2RpdGJvb2wNVXNlIGRpdGhlcmluZ4AA BlJvdGF0ZQBrZHJ0dHJvdBlUaGUgcm90YXRpb24gb2YgdGhlIGltYWdlgAAFU2NhbGVr c2NhZml4ZCZUaGUgZmFjdG9yIGJ5IHdoaWNoIHRvIHNjYWxlIHRoZSBpbWFnZQCAAAtU cmFuc2xhdGlvbmt0cmFRRHB0KU9mZnNldCBieSB3aGljaCB0aGUgaW1hZ2Ugc2hvdWxk IGJlIG1vdmVkgAAPRmxpcCBIb3Jpem9udGFsa2Zob2Jvb2wYRmxpcCBpbWFnZSBob3Jp em9udGFsbHk/AIAADUZsaXAgVmVydGljYWxrZnZ0Ym9vbBZGbGlwIGltYWdlIHZlcnRp Y2FsbHk/AIAAB1F1YWxpdHlncXVhcXVhbBtJbWFnZSBxdWFsaXR5IG9mIHRoZSByZXN1 bHSgAAZGb3JtYXQAa3JlbnR5cGUvVGhlIGZvcm1hdCBpbnRvIHdoaWNoIHRoZSBkYXRh IHNob3VsZCBiZSBpbWFnZWQAABJTdHJ1Y3R1cmVkIEdyYXBoaWMAdG9vZ2Jvb2w0UmV0 dXJuIGEgc3RydWN0dXJlZCBncmFwaGljLCBpbnN0ZWFkIG9mIGEgcGl4ZWwgbWFwPwCA AAdVbmlmb3JtS0lzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHRo ZSBzYW1lIGZvciBhbGwgb2JqZWN0cyBpbiB0aGUgc2V0P21pc2Npc3VuYm9vbAAAAABv YmogL1RoZSBzZXQgb2Ygb2JqZWN0cyB0byBiZSBjaGVja2VkIGZvciB1bmlmb3JtaXR5 AAAAAQJJbgBrcHJwdHlwZS5UaGUgcHJvcGVydHkgSUQgZm9yIHRoZSBwcm9wZXJ0eSB0 byBiZSBjaGVja2VkAAAABFNob3cZQnJpbmcgYW4gb2JqZWN0IGludG8gdmlldwBtaXNj bXZpc251bGwAAIAAb2JqIB1UaGUgb2JqZWN0IHRvIGJlIG1hZGUgdmlzaWJsZRAAAAIC SW4Ad25kd29iaiApVGhlIHdpbmRvdyBpbiB3aGljaCB0byBkaXNwbGF5IHRoZSBvYmpl Y3SAAAJBdABzaG93UURwdChUaGUgcG9pbnQgYXQgd2hpY2ggdG8gZGlzcGxheSB0aGUg b2JqZWN0AIAABVBhc3RlIlBhc3RlIGFuIG9iamVjdCBmcm9tIHRoZSBjbGlwYm9hcmQA bWlzY3Bhc3RudWxsAACAAG51bGwAAJAAAAAEUmVkbzVSZXZlcnNlIHRoZSBhY3Rpb24g b2YgdGhlIGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgdW5kbwBtaXNjcmVkb251bGwAAIAA bnVsbAAAkAAAAAZSZXZlcnQqUmVzdG9yZSB0aGUgb2JqZWN0IHRvIGl0cyBsYXN0IHNh dmVkIHN0YXRlbWlzY3J2cnRudWxsAACAAG9iaiAUVGhlIG9iamVjdCB0byByZXZlcnQA EAAAAARVbmRvOVVuZG8gdGhlIGFjdGlvbiBvZiB0aGUgcHJldmlvdXMgZXZlbnQgb3Ig dXNlciBpbnRlcmFjdGlvbgBtaXNjdW5kb251bGwAAIAAbnVsbAAAkAAAAAAEC0FwcGxp Y2F0aW9uY2FwcBdBIE1hY2ludG9zaCBhcHBsaWNhdGlvbgAKCUJlc3QgVHlwZXBic3R0 eXBlGFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBj bGFzcwAACUNsaXBib2FyZHBjbGkqKioqDVRoZSBjbGlwYm9hcmRQAAxEZWZhdWx0IFR5 cGUAZGVmdHR5cGUbVGhlIGRlZmF1bHQgZGVzY3JpcHRvciB0eXBlAAASSW5zZXJ0aW9u IExvY2F0aW9uAHBpbnNpbnNsTVRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgY29udGVudHMg b2YgdGhlIGNsaXBib2FyZCB3b3VsZCBiZSBpbnNlcnRlZCBieSBhIHBhc3RlAAAJRnJv bnRtb3N0cGlzZmJvb2wiSXMgdGhpcyB0aGUgZnJvbnRtb3N0IGFwcGxpY2F0aW9uPwAA AAROYW1lAHBuYW1pdHh0CFRoZSBuYW1lAAAAD0l0ZW0gRGVsaW1pdGVyc3R4ZGxpdHh0 KlRoZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIGRlbGltaXQgdGV4dCBpdGVtcwBAAA5Vc2Vy IFNlbGVjdGlvbgBwdXNsY3NlbC1UaGUgY3VycmVudCB1c2VyIHNlbGVjdGlvbiBvciBp bnNlcnRpb24gcG9pbnQAAAdWZXJzaW9udmVyc2xvbmclVGhlIHZlcnNpb24gbnVtYmVy IG9mIHRoZSBhcHBsaWNhdGlvbgAAAAJkb2N1AAJpbmR4bmFtZWN3aW4AAmluZHhuYW1l BEl0ZW0AY2l0bQtBIHRleHQgaXRlbQAJCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0 IGRlc2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAABUNvbG9y Y29scmNSR0IgVGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIAEAAMRGVmYXVs dCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQAABEZvbnQA Zm9udGN0eHQrVGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3Rl chAABFNpemUAcHRzemZpeGQpVGhlIHNpemUgaW4gcG9pbnRzIG9mIHRoZSBmaXJzdCBj aGFyYWN0ZXIQAAxXcml0aW5nIENvZGUAcHNjdGludGweVGhlIHNjcmlwdCBzeXN0ZW0g YW5kIGxhbmd1YWdlAAAABVN0eWxldHhzdHRzdHklVGhlIHRleHQgc3R5bGUgb2YgdGhl IGZpcnN0IGNoYXJhY3RlchAADlVuaWZvcm0gU3R5bGVzAHVzdGx0c3R5NFRoZSB0ZXh0 IHN0eWxlcyB0aGF0IGFyZSB1bmlmb3JtIHRocm91Z2hvdXQgdGhlIGl0ZW0AEAAAAmNo YSAAAWluZHhjdHh0AAFpbmR4BE1lbnUAY21udQZBIG1lbnUAAAUJQmVzdCBUeXBlcGJz dHR5cGUYVGhlIGJlc3QgZGVzY3JpcHRvciB0eXBlAAAABUNsYXNzcGNsc3R5cGUJVGhl IGNsYXNzAAAMRGVmYXVsdCBUeXBlAGRlZnR0eXBlG1RoZSBkZWZhdWx0IGRlc2NyaXB0 b3IgdHlwZQAAB01lbnUgSURtbmlkc2hvchhUaGUgbWVudSBJRCBmb3IgdGhlIG1lbnUA AAAETmFtZQBwbmFtaXR4dAhUaGUgbmFtZQAAAAABY21lbgACaW5keG5hbWUJTWVudSBJ dGVtY21lbgtBIG1lbnUgaXRlbQAGCUJlc3QgVHlwZXBic3R0eXBlGFRoZSBiZXN0IGRl c2NyaXB0b3IgdHlwZQAAAAVDbGFzc3BjbHN0eXBlCVRoZSBjbGFzcwAADERlZmF1bHQg VHlwZQBkZWZ0dHlwZRtUaGUgZGVmYXVsdCBkZXNjcmlwdG9yIHR5cGUAAAdFbmFibGVk ZW5ibGJvb2wcSXMgdGhlIG1lbnUgaXRlbSBpcyBlbmFibGVkPwAAAAtJdGVtIE51bWJl cml0bW5zaG9yFFRoZSBtZW51IGl0ZW0gbnVtYmVyAAAABE5hbWUAcG5hbWl0eHQIVGhl IG5hbWUAAAAAAAAAAAFxdWFsAAMFRHJhZnRmYXN0KEltYWdlIHRoZSBncmFwaGljIGFz IHF1aWNrbHkgYXMgcG9zc2libGUAB1JlZ3VsYXJyZWdsGkltYWdlIHRoZSBncmFwaGlj IG5vcm1hbGx5AARIaWdoAGhpcXUxSW1hZ2UgdGhlIGdyYXBoaWMgYXQgdGhlIGhpZ2hl c3QgcXVhbGl0eSBwb3NzaWJsZQAAAQAAALvqAAC66gAAAfkBJMq4EIgAAAAcARYAA2Fl dXQAAAAiSUNPTgAGAC5YRkNOAAQAglhDTUQABAC+AAAAwwAAVAYBJLlYGkAAACAAAAAA AAAAA/UAFSAAGYwAAAAAA/YAICAAGhAAAAAAI5AAKyAAMDIAAAAAYHYAPSAAMLYAAAAA IVoARSAAMToAAAAAPtP//yAAU4IAAAAADP0AUSAAAIQBJMsYDP4AsSAASFoBJMwgDQ0A 2SAAMb4BJMp4DaoAWyAAAfQBJMwcAhIAvCAATRIBJMp0DP8AZiAADuYAAAAADQMAjiAA JoIAAAAADQQAniAAGpQAAAAAD6AAciAAEpgAAAAAD6EAfiAAEGAAAAAAFExvd2VyZWQg cmV0dXJuIGFycm93Ck5leHQgQXJyb3cKUHJldiBBcnJvdxFTdGFjayBJbmZvIFJ0IFRy aQdIQyBIZWxwC0Nsb3NlciBMb29rCU5ld0hhbmRsZQpIUG9wVXBNZW51C0Rpc3Bvc2VE ZXNjC1Nob3dCYWxsb29uD0hNUmVtb3ZlQmFsbG9vbg9Nb3ZlRGVzY1RvU2NyYXASU2F2 ZURlc2NBc1Jlc291cmNlCkV4dGVuZERlc2MGU2VhcmNoFVN0YW5kYXJkIEV2ZW50IFN1 aXRlcwlNZXJnZUFldGU= --========================_26885646==_D Content-Type: application/octet-stream; name="Aete_Editor_b1" ; x-mac-type="5354414B" ; x-mac-creator="57494C44" Content-Disposition: attachment; filename="Aete_Editor_b1" Content-Transfer-Encoding: base64 AAA2AFNUQUv/////AAAAAAAAAAoABBvAAAA2AAAAAAAAAAAAAAAABgAADjwAAAAeAAA7 gwAAOH8AAAAAAAAAAAAAQNkAAAAAAAUAABAAAAAAAAAAAAAAAAAAAAAAAAAAAhCAAAIQ gAACEIAAAiCAANrR7fYAAAAAAQgBQAJeA0AAAAAAA2YEgAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN7wAADAYBVgIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA AAAIAAAAiAAiAIgAIgCIiCIiiIgiIoiqIqqIqiKqzKozqsyqM6ruqruq7qq7qu67u+7u u7vu/7v/7v+7/+7/u////7v//4AQAiABCEAE//////////+IIogiiCKIIhEiRIgRIkSI xIAMaEMCMCaxMAMb2MAMjaoAqgCqAKoAiCJVIogiVSKIVSJViFUiVXfdd9133XfdgAAA AAAAAACqVapVqlWqVQOESDAMAgEBgkQ5RIIBAQGIFCJBiEEiFICAQT4ICBTjIgSMdCIX mBC+gIgI6wiIgCXIMolkJEySopxBvirJFOtAoAAABAoAAIBAIAACBAgAqgCAAIgAgAD/ gICAgICAgAgcIsGAAQIE/4CAgP8ICAj4dCJHjxcicb8Av7+wsLCw/3++XaJBgAD69fr1 oFCgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAb24gc3VzcGVuZFN0YWNrDXJlc2V0IG1lbnVCYXINZW5kIHN1c3BlbmRTdGFj aw0Nb24gcmVzdW1lU3RhY2sNaWYgdGhlIHVzZXJMZXZlbCBpcyAxIHRoZW4gc2V0IHRo ZSB1c2VyTGV2ZWwgdG8gMg1BZXRlRWR0aW9yTWVudQ1DaGVja1ByZWZlcmVuY2UNZW5k IHJlc3VtZVN0YWNrDQ1vbiBBZXRlRWR0aW9yTWVudQ1pZiB0aGVyZSBpcyBhIG1lbnUg IlN0eWxlIiB0aGVuIGRlbGV0ZSBtZW51ICJTdHlsZSINaWYgdGhlcmUgaXMgYSBtZW51 ICJGb250IiB0aGVuIGRlbGV0ZSBtZW51ICJGb250Ig1pZiB0aGVyZSBpcyBhIG1lbnUg Ik9iamVjdHMiIHRoZW4gZGVsZXRlIG1lbnUgIk9iamVjdHMiDWlmIHRoZXJlIGlzIGEg bWVudSAiVG9vbHMiIHRoZW4gZGVsZXRlIG1lbnUgIlRvb2xzIg1jcmVhdGUgbWVudSAi QWV0ZUVkaXRvciINcHV0ICJJbnN0cnVjdGlvbnMsUHJlZmVyZW5jZXMsLSxSZXNvdXJj ZSBUb29scyyuIFN1aXRlcyxFdmVudHMsQ2xhc3NlcyxFbnVtZXJhdGlvbnMsQ29tcGFy aXNvbnMsLSxOZXcgRWRpdG9yySxFbXB0eSBTdGFja8ksLSxMb2NhbGl6ZSBhZXRlySIg aW50byBtZW51ICJBZXRlRWRpdG9yIsINd2l0aCBtZW51TXNnICJJbnN0cnVjdGlvbnMs UHJlZmVyZW5jZXNDYXJkLCAscmVzb3VyY2VUb29scyxBRVN1aXRlc0JnLGV2ZW50c0Jn LGNsYXNzQmcsZW51bUJnLGNvbXBhcmlzb25CZywgLG1ha2VOZXdTdGFjayBmYWxzZSxl bXB0eVN0YWNrLCxsb2NhbGl6ZUl0Ig1lbmQgQWV0ZUVkdGlvck1lbnUNDW9uIFJlZ0xp c3QNcHV0IGNhcmQgZmllbGQgIm5hbWVsaXN0IiBvZiBjYXJkICJwcmVmZXJlbmNlIiBp bnRvIHRoZUxpc3QNcHV0IFNob3dMaXN0KHRoZUxpc3QsICJQaWNrIEEgTmFtZSIsIGZh bHNlLCB0cnVlLCAiT0ssQ2FuY2VsIiwgMCkgaW50byBjaG9pY2UNaWYgbGluZSAxIG9m IGNob2ljZSA9ICJPSyIgdGhlbg1wdXQgbGluZSAobGluZSAyIG9mIGNob2ljZSkgb2Yg dGhlTGlzdCBpbnRvIHgNcHV0IG9mZnNldCgiPSIgJiBxdW90ZSwgeCkgaW50byBuDWlm IHN0YXJ0SGVyZSA+IDAgdGhlbg1kZWxldGUgY2hhciAxIHRvIChuKzEpIG9mIHgNaWYg bGFzdCBjaGFyIG9mIHggPSBxdW90ZSB0aGVuIGRlbGV0ZSBsYXN0IGNoYXIgb2YgeA10 eXBlIHgNZW5kIGlmDWVuZCBpZg1lbmQgUmVnTGlzdA0Nb24gSW5zdHJ1Y3Rpb25zDWds b2JhbCBnV2hlcmVGcm9tDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJvbQ1nbyBj ZCAiSW5zdHJ1Y3Rpb25zIg1lbmQgSW5zdHJ1Y3Rpb25zDQ1vbiBQcmVmZXJlbmNlc0Nh cmQNZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2QgaW50byBnV2hlcmVGcm9t DWdvIGNkICJwcmVmZXJlbmNlIg1lbmQgUHJlZmVyZW5jZXNDYXJkDQ1vbiByZXNvdXJj ZVRvb2xzDWdsb2JhbCBnV2hlcmVGcm9tDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJl RnJvbQ1nbyBjZCAibWFpbk1lbnUiDWVuZCByZXNvdXJjZVRvb2xzDQ1vbiBBRVN1aXRl c0JnDWdsb2JhbCBnV2hlcmVGcm9tDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJv bQ1pZiB0aGVyZSBpcyBhIGNkIDIgb2YgYmcgInN1aXRlSW5mbyIgdGhlbg1nbyBjZCAy IG9mIGJnICJzdWl0ZUluZm8iDWVsc2UNZ28gYmcgInN1aXRlSW5mbyINZW5kIGlmDWVu ZCBBRVN1aXRlc0JnDQ1vbiBldmVudHNCZw1nbG9iYWwgZ1doZXJlRnJvbQ1wdXNoIGNk DXBvcCBjZCBpbnRvIGdXaGVyZUZyb20NaWYgdGhlcmUgaXMgYSBjZCAyIG9mIGJnICJl dmVudHMiIHRoZW4NZ28gY2QgMiBvZiBiZyAiZXZlbnRzIg1lbHNlDWdvIGJnICJldmVu dHMiDWVuZCBpZg1lbmQgZXZlbnRzQmcNDW9uIGNsYXNzQmcNZ2xvYmFsIGdXaGVyZUZy b20NcHVzaCBjZA1wb3AgY2QgaW50byBnV2hlcmVGcm9tDWlmIHRoZXJlIGlzIGEgY2Qg MiBvZiBiZyAiY2xhc3MiIHRoZW4NZ28gY2QgMiBvZiBiZyAiY2xhc3MiDWVsc2UNZ28g YmcgImNsYXNzIg1lbmQgaWYNZW5kIGNsYXNzQmcNDW9uIGVudW1CZw1nbG9iYWwgZ1do ZXJlRnJvbQ1wdXNoIGNkDXBvcCBjZCBpbnRvIGdXaGVyZUZyb20NaWYgdGhlcmUgaXMg YSBjZCAyIG9mIGJnICJlbnVtZXJhdGlvbiIgdGhlbg1nbyBjZCAyIG9mIGJnICJlbnVt ZXJhdGlvbiINZWxzZQ1nbyBiZyAiZW51bWVyYXRpb24iDWVuZCBpZg1lbmQgZW51bUJn DQ1vbiBjb21wYXJpc29uQmcNZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2Qg aW50byBnV2hlcmVGcm9tDWlmIHRoZXJlIGlzIGEgY2QgMiBvZiBiZyAiY29tcGFyaXNv biIgdGhlbg1nbyBjZCAyIG9mIGJnICJjb21wYXJpc29uIg1lbHNlDWdvIGJnICJjb21w YXJpc29uIg1lbmQgaWYNZW5kIGNvbXBhcmlzb25CZw0Nb24gbWFrZU5ld1N0YWNrIG5l d1dpbmRvdw1nZXQgdGhlIHNoaWZ0S2V5IGlzIGRvd24NcHV0IGl0IGludG8gc2hpZnRE b3duDWFzayBmaWxlICJTYXZlIGEgbmV3IGVkaXRvciBzdGFjayBhczoiDWlmIHRoZSBy ZXN1bHQgaXMgIkNhbmNlbCIgdGhlbiBleGl0IG1ha2VOZXdTdGFjaw1pZiBpdCBpcyBl bXB0eSB0aGVuDWFuc3dlciAiWW91IGhhdmUgdG8gc3VwcGx5IGEgbmFtZS4iDWFzayBm aWxlICJDcmVhdGUgYSBuZXcgc3RhY2sgYXMiDWVuZCBpZg1pZiB0aGUgZnJlZXNpemUg b2YgdGhpcyBzdGFjayA+IDMyNzY4IHRoZW4gZG9NZW51ICJDb21wYWN0IFN0YWNrIg1z YXZlIHRoaXMgc3RhY2sgYXMgaXQNaWYgdGhlIHJlc3VsdCA8PiAiIiB0aGVuDWFuc3dl ciAiSXQgZmFpbHMsIiAmJiB0aGUgcmVzdWx0DWV4aXQgdG8gSHlwZXJDYXJkDWVuZCBp Zg1pZiBzaGlmdERvd24gdGhlbg1nbyBzdGFjayBpdCBpbiBhIG5ldyB3aW5kb3cNcHV0 IHRoZSBsb2Mgb2YgY2Qgd2luZG93IGludG8gd2luZExvYw1zZXQgdGhlIGxvYyBvZiBj ZCB3aW5kb3cgdG8gaXRlbSAxIG9mIHdpbmRMb2MgKzIwLCBpdGVtIDIgb2Ygd2luZExv YyArMjANZWxzZQ1pZiBuZXdXaW5kb3cgPD4gdHJ1ZSB0aGVuDWdvIHN0YWNrIGl0DWVs c2UNZ28gc3RhY2sgaXQgaW4gYSBuZXcgd2luZG93DXB1dCB0aGUgbG9jIG9mIGNkIHdp bmRvdyBpbnRvIHdpbmRMb2MNc2V0IHRoZSBsb2Mgb2YgY2Qgd2luZG93IHRvIGl0ZW0g MSBvZiB3aW5kTG9jICsyMCwgaXRlbSAyIG9mIHdpbmRMb2MgKzIwDWVuZCBpZg1lbmQg aWYNZW1wdHlTdGFjayB5ZXMNZW5kIG1ha2VOZXdTdGFjaw0Nb24gbG9jYWxpemVJdA1h c2sgZmlsZSAiQ3JlYXRlIHRyYW5zbGF0aW9uIHN0YWNrIHdoZXJlPyIgd2l0aCAoKHNo b3J0IG5hbWUgb2YgdGhpcyBzdGFjaykgJiYgIkxvY2FsaXplZCIpDWlmIHRoZSByZXN1 bHQgaXMgIkNhbmNlbCIgdGhlbiBleGl0IGxvY2FsaXplSXQNaWYgaXQgaXMgZW1wdHkg dGhlbg1hbnN3ZXIgIllvdSBoYXZlIHRvIHN1cHBseSBhIG5hbWUuIg1hc2sgZmlsZSAi Q3JlYXRlIHRyYW5zbGF0aW9uIHN0YWNrIHdoZXJlPyINZW5kIGlmDWlmIHRoZSBmcmVl c2l6ZSBvZiB0aGlzIHN0YWNrID4gMzI3NjggdGhlbiBkb01lbnUgIkNvbXBhY3QgU3Rh Y2siDXNhdmUgdGhpcyBzdGFjayBhcyBpdA1pZiB0aGUgcmVzdWx0IDw+ICIiIHRoZW4N YW5zd2VyICJJdCBmYWlscywiICYmIHRoZSByZXN1bHQNZXhpdCB0byBIeXBlckNhcmQN ZW5kIGlmDWdvIHN0YWNrIGl0IGluIGEgbmV3IHdpbmRvdw1wdXQgdGhlIGxvYyBvZiBj ZCB3aW5kb3cgaW50byB3aW5kTG9jDXNldCB0aGUgbG9jIG9mIGNkIHdpbmRvdyB0byBp dGVtIDEgb2Ygd2luZExvYyArMjAsIGl0ZW0gMiBvZiB3aW5kTG9jICsyMA1Mb2NhbGl6 YXRpb24gZmFsc2UNZW5kIGxvY2FsaXplSXQNDW9uIG9wZW5zdGFjaw1nbG9iYWwgaW5F ZGl0LCBnRGVsZXRlU3VpdGUNcHV0IGZhbHNlIGludG8gZ0RlbGV0ZVN1aXRlDXB1dCB0 cnVlIGludG8gaW5FZGl0DWlmIHRoZSBzY3JlZW5SZWN0IGlzICIwLDAsNTEyLDM0MiIg dGhlbiBzZXQgdGhlIGxvYyBvZiBjZCB3aW5kb3cgdG8gIjAsMCINaWYgdGhlIHVzZXJM ZXZlbCBpcyAxIHRoZW4gc2V0IHRoZSB1c2VyTGV2ZWwgdG8gMg1BZXRlRWR0aW9yTWVu dQ1DaGVja1ByZWZlcmVuY2UNZW5kIG9wZW5zdGFjaw0Nb24gY2xvc2VDYXJkDWhtUmVt b3ZlQmFsbG9vbg1wYXNzIGNsb3NlQ2FyZA1lbmQgY2xvc2VDYXJkDQ1vbiBjbG9zZVN0 YWNrDXJlc2V0IG1lbnVCYXINaWYgdGhlIGZyZWVzaXplIG9mIHRoaXMgc3RhY2sgPiAz Mjc2OCB0aGVuIGRvTWVudSAiQ29tcGFjdCBTdGFjayINZW5kIGNsb3NlU3RhY2sNDWZ1 bmN0aW9uIFByZWZlckNsaWVudExhbmdCdXR0b25JRA1yZXR1cm4gIjUsNiw3LDEzLDU3 Ig1lbmQgUHJlZmVyQ2xpZW50TGFuZ0J1dHRvbklEDQ1mdW5jdGlvbiBQcmVmZXJTZXJ2 ZXJMYW5nQnV0dG9uSUQNcmV0dXJuICIyLDMsMTAiDWVuZCBQcmVmZXJTZXJ2ZXJMYW5n QnV0dG9uSUQNDW9uIENoZWNrUHJlZmVyZW5jZQ1nbG9iYWwgZGVmYXVsdFRpbWVvdXQs ZGVmYXVsdFRhcmdldCxkZWZhdWx0U2VuZE1vZGUsZGVmYXVsdElkbGVQcm9jLGRlZmF1 bHRBRUZpbHRlcixkZWZhdWx0VGFyZ2V0RGVzYw1nbG9iYWwgc2VydmVyTGFuZyxjbGll bnRMYW5nLGNsaWVudEhhc0dsdWUsdmVyYm9zZQ1wdXQgUHJlZmVyQ2xpZW50TGFuZ0J1 dHRvbklEKCkgaW50byB0aGVMaXN0DXB1dCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlTGlz dCBpbnRvIG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbg1pZiBoaWxpdGUgb2YgY2FyZCBi dXR0b24gaWQgKGl0ZW0gaSBvZiB0aGVMaXN0KSBvZiBjYXJkICJwcmVmZXJlbmNlIiB0 aGVuDXB1dCBzaG9ydCBuYW1lIG9mIGNhcmQgYnV0dG9uIGlkIChpdGVtIGkgb2YgdGhl TGlzdCkgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byBjbGllbnRMYW5nDWV4aXQgcmVw ZWF0DWVuZCBpZg1lbmQgcmVwZWF0DXB1dCBQcmVmZXJTZXJ2ZXJMYW5nQnV0dG9uSUQo KSBpbnRvIHRoZUxpc3QNcHV0IG51bWJlciBvZiBpdGVtcyBpbiB0aGVMaXN0IGludG8g bg1yZXBlYXQgd2l0aCBpID0gMSB0byBuDWlmIGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiBp ZCAoaXRlbSBpIG9mIHRoZUxpc3QpIG9mIGNhcmQgInByZWZlcmVuY2UiIHRoZW4NcHV0 IHNob3J0IG5hbWUgb2YgY2FyZCBidXR0b24gaWQgKGl0ZW0gaSBvZiB0aGVMaXN0KSBv ZiBjYXJkICJwcmVmZXJlbmNlIiBpbnRvIHNlcnZlckxhbmcNZXhpdCByZXBlYXQNZW5k IGlmDWVuZCByZXBlYXQNcHV0IGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiAiaGFzIGdsdWUg c3Vicm91dGluZSIgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byBjbGllbnRIYXNHbHVl DXB1dCBoaWxpdGUgb2YgY2FyZCBidXR0b24gInZlcmJvc2UiIG9mIGNhcmQgInByZWZl cmVuY2UiIGludG8gdmVyYm9zZQ1wdXQgY2FyZCBmaWVsZCAidGltZU91dCIgb2YgY2Fy ZCAicHJlZmVyZW5jZSIgaW50byBkZWZhdWx0VGltZW91dA1wdXQgY2FyZCBmaWVsZCAi c2VuZFRhcmdldCIgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byBkZWZhdWx0VGFyZ2V0 DXB1dCBjYXJkIGZpZWxkICJ0YXJnZXREZXNjIiBvZiBjYXJkICJwcmVmZXJlbmNlIiBp bnRvIGRlZmF1bHRUYXJnZXREZXNjDXB1dCBjYXJkIGZpZWxkICJzZW5kTW9kZSIgb2Yg Y2FyZCAicHJlZmVyZW5jZSIgaW50byBkZWZhdWx0U2VuZE1vZGUNcHV0IGNhcmQgZmll bGQgImlkbGVQcm9jIiBvZiBjYXJkICJwcmVmZXJlbmNlIiBpbnRvIGRlZmF1bHRJZGxl UHJvYw1wdXQgY2FyZCBmaWVsZCAiYWVGaWx0ZXIiIG9mIGNhcmQgInByZWZlcmVuY2Ui IGludG8gZGVmYXVsdEFFRmlsdGVyDWVuZCBDaGVja1ByZWZlcmVuY2UNDWZ1bmN0aW9u IFN0cmlwU1AgeCwgbG93ZXJDYXNlDXB1dCBDaGFyVG9OdW0oY2hhciAxIG9mIHgpIGlu dG8gbg1pZiBsb3dlckNhc2UgPSB0cnVlIHRoZW4NaWYgKG4gPj0gNjUpIGFuZCAobiA8 PSA5MCkgdGhlbg1wdXQgTnVtVG9DaGFyKG4rMzIpIGludG8gY2hhciAxIG9mIHgNZW5k IGlmDWVsc2UNaWYgKG4gPj0gOTcpIGFuZCAobiA8PSAxMjIpIHRoZW4NcHV0IE51bVRv Q2hhcihuLTMyKSBpbnRvIGNoYXIgMSBvZiB4DWVuZCBpZg1lbmQgaWYNcmVwZWF0IHVu dGlsIGkgPSAwDXB1dCBvZmZzZXQoc3BhY2UsIHgpIGludG8gaQ1pZiBpID4gMCB0aGVu DXB1dCBDaGFyVG9OdW0oY2hhciAoaSsxKSBvZiB4KSBpbnRvIG4NaWYgKG4gPj0gOTcp IGFuZCAobiA8PSAxMjIpIHRoZW4NcHV0IE51bVRvQ2hhcihuLTMyKSBpbnRvIGNoYXIg KGkrMSkgb2YgeA1lbmQgaWYNZGVsZXRlIGNoYXIgaSBvZiB4DWVuZCBpZg1lbmQgcmVw ZWF0DXJldHVybiB4DWVuZCBTdHJpcFNQDQ1mdW5jdGlvbiBIVEtleVdvcmQgaW5mbw1w dXQgKChpdGVtIDQgb2YgaW5mbykgZGl2IDgxOTIpIG1vZCA0IGludG8gdGVtcA1pZiB0 ZW1wID4gMSB0aGVuDXB1dCAibGlzdCIgaW50byB0aGlzVHlwZQ1lbHNlIGlmIHRlbXAg PSAxIHRoZW4NcHV0ICJlbnVtIiBpbnRvIHRoaXNUeXBlDWVsc2UNcHV0IFJlc1R5cGUo aXRlbSAzIG9mIGluZm8pIGludG8gdGhpc1R5cGUNZW5kIGlmDS0tIGlmIGl0IGlzIGEg c3BlY2lhbCB0eXBlLCB3ZSBuZWVkIHRvIGFwcGVuZCB0eXBlIGFmdGVyIGtleXdvcmQN aWYgKHRoaXNUeXBlID0gIlRFWFQiKSBPUiAodGhpc1R5cGUgPSAib2JqICIpIE9SICh0 aGlzVHlwZSA9ICJsaXN0Iikgb3IgKHRoaXNUeXBlID0gIm51bGwiKSB0aGVuDXJldHVy biBpdGVtIDIgb2YgaW5mbw1lbHNlDXJldHVybiBSZXNUeXBlKGl0ZW0gMiBvZiBpbmZv KSAmIFRoaXNUeXBlDWVuZCBpZg1lbmQgSFRLZXlXb3JkDQ1vbiBpZGxlDWdsb2JhbCBp bkVkaXQNcHV0IHRydWUgaW50byBpbkVkaXQNZW5kIGlkbGUNDWZ1bmN0aW9uIFJlc1R5 cGUgeA1yZXR1cm4gY2hhciAxIHRvIDQgb2YgKHggJiAiICAgICIpDWVuZCBSZXNUeXBl DQ1mdW5jdGlvbiBqdW1wIHgNZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2Qg aW50byBnV2hlcmVGcm9tDWdvIGNhcmQgeA1yZXR1cm4gKHRoZSByZXN1bHQgPSAiIikN ZW5kIGp1bXANDW9uIE5hbWVJdCB4DXB1dCB3b3JkIDEgb2YgeCBpbnRvIHkNZGVsZXRl IHdvcmQgMSBvZiB4DWlmIChpdGVtIDIgb2YgeCA8PiAiIikgb3IgKGxhc3QgY2hhciBv ZiB4ID0gIiwiKSB0aGVuDS0tIDIgaXRlbXMgbWVhbnMgaWQgKyBuYW1lLCBqdXN0IGtl ZXAgdGhlIGlkDWRlbGV0ZSBpdGVtIDIgb2YgeA1lbmQgaWYNaWYgdGhlcmUgaXMgYSBj YXJkIHggdGhlbg1pZiAodGhlIGlkIG9mIHRoaXMgY2FyZCkgPD4gKHRoZSBpZCBvZiBj YXJkIHgpIHRoZW4NYW5zd2VyICJUaGUgSUQgb2YgdGhpcyIgJiYgeSAmJiAiYWxyZWFk eSBleGlzdHMiDWVuZCBpZg1lbmQgaWYNc2V0IG5hbWUgb2YgdGhpcyBjYXJkIHRvIHgN ZW5kIE5hbWVJdA0Nb24gQ2hhbmdlTmFtZSBvbGROYW1lLCBuZXdOYW1lLCBsaXN0TmFt ZQ0tLSBjaGFuZ2Ugb2xkTmFtZSBpbiBmaWVsZCBsaXN0TmFtZSB0byBuZXdOYW1lDXB1 dCB3b3JkIDEgb2Ygb2xkTmFtZSBpbnRvIHN1aXRlbmFtZQ1kZWxldGUgd29yZCAxIHRv IDIgb2Ygb2xkTmFtZQ1pZiAoaXRlbSAyIG9mIG9sZE5hbWUgPSAiIikgYW5kIChsYXN0 IGNoYXIgb2Ygb2xkTmFtZSA8PiAiLCIpIHRoZW4NLS0gb25seSAxIGl0ZW0sIGl0IGlz IHRoZSBJRA1wdXQgMSBpbnRvIGNoZWNrSW5kZXgNcHV0IGl0ZW0gMSBvZiBvbGROYW1l IGludG8gY2hlY2tJdGVtDWVsc2UNLS0gbmFtZSBmb2xsb3dlZCBieSBJRCwgdXNlIHRo ZSBJRA1wdXQgMiBpbnRvIGNoZWNrSW5kZXgNcHV0IGl0ZW0gMSBvZiBvbGROYW1lIGlu dG8gY2hlY2tJdGVtDXB1dCBpdGVtIDIgb2Ygb2xkTmFtZSAmICIsIiAmIGNoZWNrSXRl bSBpbnRvIG9sZE5hbWUNZW5kIGlmDXB1dCAic3VpdGUiICYmIFJlc1R5cGUoc3VpdGVO YW1lKSBpbnRvIHN1aXRlQ2FyZA1pZiB0aGVyZSBpcyBhIGNhcmQgc3VpdGVDYXJkIHRo ZW4NcHV0IGZpZWxkIGxpc3ROYW1lIG9mIGNhcmQgc3VpdGVDYXJkIGludG8geA1wdXQg dGhlIG51bWJlciBvZiBsaW5lcyBpbiB4IGludG8gbg1wdXQgMSBpbnRvIGkNcHV0IGZh bHNlIGludG8gZm91bmQNcmVwZWF0IHVudGlsIChpID4gbikgb3IgZm91bmQNaWYgKGl0 ZW0gY2hlY2tJbmRleCBvZiBsaW5lIGkgb2YgeCkgPSBjaGVja0l0ZW0gdGhlbg1kZWxl dGUgbGluZSBpIG9mIHgNcHV0IHRydWUgaW50byBmb3VuZA1lbmQgaWYNYWRkIDEgdG8g aQ1lbmQgcmVwZWF0DXB1dCB4IGludG8gZmllbGQgbGlzdE5hbWUgb2YgY2FyZCBzdWl0 ZUNhcmQNZW5kIGlmDWlmIG5ld05hbWUgPD4gIiIgdGhlbg1wdXQgd29yZCAxIG9mIG5l d05hbWUgaW50byBzdWl0ZW5hbWUNZGVsZXRlIHdvcmQgMSB0byAyIG9mIG5ld05hbWUN aWYgKGl0ZW0gMiBvZiBuZXdOYW1lIDw+ICIiKSBvciAobGFzdCBjaGFyIG9mIG5ld05h bWUgPSAiLCIpIHRoZW4NLS0gbmV3TmFtZSBpcyBuYW1lICsgSUQsIGZsaXAgaXQgYXJv dW5kDXB1dCBpdGVtIDIgb2YgbmV3TmFtZSAmICIsIiAmIGl0ZW0gMSBvZiBuZXdOYW1l IGludG8gbmV3TmFtZQ1lbmQgaWYNcHV0ICJzdWl0ZSIgJiYgc3VpdGVOYW1lIGludG8g c3VpdGVDYXJkDWlmIHRoZXJlIGlzIGEgY2FyZCBzdWl0ZUNhcmQgdGhlbg1wdXQgbmV3 TmFtZSAmIHJldHVybiBhZnRlciBmaWVsZCBsaXN0TmFtZSBvZiBjYXJkIHN1aXRlQ2Fy ZA1lbmQgaWYNZW5kIGlmDWVuZCBDaGFuZ2VOYW1lDQ1vbiBSZURvU2NyaXB0DWdsb2Jh bCBpbkVkaXQNcHV0IGluRWRpdCBpbnRvIGN1ckVkaXQNcHV0IGZhbHNlIGludG8gaW5F ZGl0DXB1c2ggY2FyZA1wdXQgbnVtYmVyIG9mIGNhcmRzIGluIGJrZ25kICJldmVudHMi IGludG8gbg1yZXBlYXQgd2l0aCBpID0gMiB0byBuDWdvIGNhcmQgaSBvZiBia2duZCAi ZXZlbnRzIg1pZiB0aGUgcmVzdWx0ID0gIiIgdGhlbg1NYWtlU2NyaXB0VGVtcGxhdGUN ZW5kIGlmDWVuZCByZXBlYXQNcG9wIGNhcmQNcHV0IGN1ckVkaXQgaW50byBpbkVkaXQN ZW5kIFJlRG9TY3JpcHQNDWZ1bmN0aW9uIEVudW1PcHRpb24gc3VpdGVDb2RlLGVudW1l cmF0aW9uLGVudW1lcmF0b3IsaW5kZXgNcHV0ICIiIGludG8gdGhlTGlzdA1wdXQgImVu dW1lcmF0aW9uIiAmJiBlbnVtZXJhdGlvbiBpbnRvIHgNaWYgdGhlcmUgaXMgYSBjYXJk IHggdGhlbg1wdXQgZmllbGQgImVudW1JbmZvIiBvZiBjYXJkIHggaW50byB4DXB1dCBu dW1iZXIgb2YgbGluZXMgaW4geCBpbnRvIG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbg1p ZiAoZW51bWVyYXRvciA9ICIiKSB0aGVuDXB1dCBpdGVtIGluZGV4IG9mIGxpbmUgaSBv ZiB4ICYgInwiIGFmdGVyIHRoZUxpc3QNZWxzZSBpZiAoZW51bWVyYXRvciA9IGl0ZW0g MSBvZiBsaW5lIGkgb2YgeCkgdGhlbg1wdXQgaXRlbSBpbmRleCBvZiBsaW5lIGkgb2Yg eCAmICJ8IiBpbnRvIHRoZUxpc3QNZW5kIGlmDWVuZCByZXBlYXQNZW5kIGlmDWlmIHRo ZUxpc3QgPSAiIiB0aGVuDXB1dCAic29tZUVudW0iIGludG8gdGhlTGlzdA1lbHNlDWRl bGV0ZSBsYXN0IGNoYXIgb2YgdGhlTGlzdA1lbmQgaWYNcmV0dXJuIHRoZUxpc3QNZW5k IEVudW1PcHRpb24NDWZ1bmN0aW9uIE5hbWVPZkRhdGFUeXBlIGRhdGFUeXBlDWlmIGRh dGFUeXBlID0gInNob3IiIHRoZW4NZ2V0ICJJbnRlZ2VyLFB0cixIYW5kbGUsdHlwZVNo b3J0SW50ZWdlcixzaG9ydCwyIg1lbHNlIGlmIGRhdGFUeXBlID0gImxvbmciIHRoZW4N Z2V0ICJMb25naW50LFB0cixIYW5kbGUsdHlwZUxvbmdJbnRlZ2VyLGxvbmcsNCINZWxz ZSBpZiAoZGF0YVR5cGUgPSAiYm9vbCIpIG9yIChkYXRhVHlwZSA9ICJ0cnVlIikgdGhl bg1nZXQgIkJvb2xlYW4sUHRyLEhhbmRsZSx0eXBlQm9vbGVhbixCb29sZWFuLDEiDWVs c2UgaWYgZGF0YVR5cGUgPSAiVEVYVCIgdGhlbg1nZXQgIlN0cjI1NSxDaGFyc1B0cixD aGFyc0hhbmRsZSx0eXBlQ2hhcixjaGFyLC0xIg1lbHNlIGlmIChkYXRhVHlwZSA9ICJl bnVtIikgdGhlbg1nZXQgIlJlc1R5cGUsUmVzVHlwZVB0cixIYW5kbGUsdHlwZUVudW1l cmF0ZWQsUmVzVHlwZSw0Ig1lbHNlIGlmIChkYXRhVHlwZSA9ICJ0eXBlIikgdGhlbg1n ZXQgIlJlc1R5cGUsUmVzVHlwZVB0cixIYW5kbGUsdHlwZVR5cGUsUmVzVHlwZSw0Ig1l bHNlIGlmIChkYXRhVHlwZSA9ICJwcm9wIikgdGhlbg1nZXQgIlJlc1R5cGUsUmVzVHlw ZVB0cixIYW5kbGUsdHlwZVByb3BlcnR5LFJlc1R5cGUsNCINZWxzZSBpZiAoZGF0YVR5 cGUgPSAia2V5dyIpIHRoZW4NZ2V0ICJSZXNUeXBlLFJlc1R5cGVQdHIsSGFuZGxlLHR5 cGVLZXl3b3JkLFJlc1R5cGUsNCINZWxzZSBpZiBkYXRhVHlwZSA9ICJsaXN0IiB0aGVu DWdldCAiQUVEZXNjTGlzdCxBRURlc2NMaXN0UHRyLCx0eXBlQUVMaXN0LEFFRGVzY0xp c3QsLTEiDWVsc2UgaWYgZGF0YVR5cGUgPSAiZXh0ZSIgdGhlbg1nZXQgImV4dGVuZGVk LFB0cixIYW5kbGUsdHlwZUV4dGVuZGVkLGV4dGVuZGVkLDEwIg1lbHNlIGlmIGRhdGFU eXBlID0gInNpbmciIHRoZW4NZ2V0ICJSZWFsLFB0cixIYW5kbGUsdHlwZVNob3J0Rmxv YXQsZmxvYXQsNCINZWxzZSBpZiBkYXRhVHlwZSA9ICJkb3ViIiB0aGVuDWdldCAiRG91 YmxlLFB0cixIYW5kbGUsdHlwZUxvbmdGbG9hdCxkb3VibGUsOCINZWxzZSBpZiBkYXRh VHlwZSA9ICJjb21wIiB0aGVuDWdldCAiQ29tcCxQdHIsSGFuZGxlLHR5cGVDb21wLGNv bXAsOCINZWxzZSBpZiBkYXRhVHlwZSA9ICJhbGlzIiB0aGVuDWdldCAiQWxpYXNSZWNv cmQsQWxpYXNQdHIsQWxpYXNIYW5kbGUsdHlwZUFsaWFzLEFsaWFzUmVjb3JkLC0xIg1l bHNlIGlmIGRhdGFUeXBlID0gImZzcyAiIHRoZW4NZ2V0ICJGU1NwZWMsRlNTcGVjUHRy LEZTU3BlY0hhbmRsZSx0eXBlRlNTLEZTU3BlYyw3MCINZWxzZQ1nZXQgIkFFRGVzYyxQ dHIsSGFuZGxlLHR5cGVVbmtub3duLHZvaWQsLTEiDWVuZCBpZg1yZXR1cm4gaXQNZW5k IE5hbWVPZkRhdGFUeXBlDQ0Nb24gZW1wdHlTdGFjayBub0RpYWxvZw1pZiBub0RpYWxv ZyA8PiJ5ZXMiIHRoZW4NYW5zd2VyICJEZWxldGUgYWxsICdhZXRlJyBkYXRhIGZyb20g dGhpcyBzdGFjaz8iIHdpdGggIk9LIiBvciAiQ2FuY2VsIg1pZiBpdCBpcyBub3QgIk9L IiB0aGVuIGV4aXQgZW1wdHlTdGFjaw1lbmQgaWYNc2V0IGN1cnNvciB0byB3YXRjaA1n bG9iYWwgaW5FZGl0DXB1dCBmYWxzZSBpbnRvIGluRWRpdA1zZXQgbG9ja3NjcmVlbiB0 byB0cnVlDXB1c2ggY2FyZA1EZWxldGVBbGwgInN1aXRlSW5mbyINRGVsZXRlQWxsICJl dmVudHMiDURlbGV0ZUFsbCAiY2xhc3MiDURlbGV0ZUFsbCAiY29tcGFyaXNvbiINRGVs ZXRlQWxsICJlbnVtZXJhdGlvbiINZ28gY2QgIm1haW5NZW51Ig1wdXQgIiIgaW50byBj YXJkIGZpZWxkICJTdWl0ZUxpc3QiDXB1dCAiIiBpbnRvIGNhcmQgZmllbGQgIlNjcmF0 Y2giDXB1dCAiIiBpbnRvIGNhcmQgZmllbGQgInNlbmRUYXJnZXQiIG9mIGNhcmQgInBy ZWZlcmVuY2UiDXB1dCAiYWV0ZSIgaW50byBjYXJkIGZpZWxkICJyZXNvdXJjZVR5cGUi IG9mIGNhcmQgInByZWZlcmVuY2UiDXB1dCAwIGludG8gY2FyZCBmaWVsZCAicmVzb3Vy Y2VJRCIgb2YgY2FyZCAicHJlZmVyZW5jZSINcHV0ICIiIGludG8gY2FyZCBmaWVsZCAi cmVzb3VyY2VOYW1lIiBvZiBjYXJkICJwcmVmZXJlbmNlIg1wdXQgMSBpbnRvIGNhcmQg ZmllbGQgIm1ham9yVmVyc2lvbiIgb2YgY2FyZCAicHJlZmVyZW5jZSINcHV0ICIwMCIg aW50byBjYXJkIGZpZWxkICJtaW5vclZlcnNpb24iIG9mIGNhcmQgInByZWZlcmVuY2Ui DXB1dCAwIGludG8gY2FyZCBmaWVsZCAibGFuZ3VhZ2VDb2RlIiBvZiBjYXJkICJwcmVm ZXJlbmNlIg1wdXQgMCBpbnRvIGNhcmQgZmllbGQgInNjcmlwdENvZGUiIG9mIGNhcmQg InByZWZlcmVuY2UiDXB1dCB0cnVlIGludG8gaW5FZGl0DWlmIHRoZSBmcmVlc2l6ZSBv ZiB0aGlzIHN0YWNrID4gMzI3NjggdGhlbiBkb01lbnUgIkNvbXBhY3QgU3RhY2siDWVu ZCBlbXB0eVN0YWNrDQ0Nb24gRGVsZXRlQWxsIGJrZ25kTmFtZQ1wdXQgbnVtYmVyIG9m IGNhcmRzIGluIGJrZ25kIGJrZ25kTmFtZSBpbnRvIGkNcmVwZWF0IHdoaWxlIGkgPiAx DWdvIGNhcmQgaSBvZiBia2duZCBia2duZE5hbWUNZG9NZW51ICJEZWxldGUgQ2FyZCIN c3VidHJhY3QgMSBmcm9tIGkNZW5kIHJlcGVhdA1lbmQgRGVsZXRlQWxsDQ0AdGVBbGwN DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhwEJLR0QAAA48 AAAAAAAAAAAAAAAAAAAABAAAE8AAAByvAAAAAQAAAAAAAAAAAAAAb24gTG9jYWxpemF0 aW9uIG91dE9ubHkNZ2xvYmFsIHRyYW5zbGF0aW9uVGFibGUNcHV0ICIiIGludG8gdHJh bnNsYXRpb25UYWJsZQ1pZiBub3Qgb3V0T25seSB0aGVuDWFuc3dlciBmaWxlICJEbyB5 b3Ugd2lzaCB0byB1c2UgYSB0cmFuc2xhdGlvbiB0YWJsZSBmaWxlPyIgb2YgdHlwZSB0 ZXh0DWlmIChpdCA8PiAiIikgYW5kIChpdCA8PiAiQ2FuY2VsIikgdGhlbg1wdXQgaXQg aW50byB0aGVGaWxlTmFtZQ1vcGVuIGZpbGUgdGhlRmlsZU5hbWUNcmVwZWF0IGZvcmV2 ZXINcmVhZCBmcm9tIGZpbGUgdGhlRmlsZU5hbWUgZm9yIDE2Mzg0DWlmIGl0IGlzIGVt cHR5IHRoZW4gZXhpdCByZXBlYXQNcHV0IGl0IGFmdGVyIHRyYW5zbGF0aW9uVGFibGUN ZW5kIHJlcGVhdA1jbG9zZSBmaWxlIHRoZUZpbGVOYW1lDWVuZCBpZg1pZiB0cmFuc2xh dGlvblRhYmxlIDw+ICIiIHRoZW4NYW5zd2VyICJEbyB5b3Ugd2FudCB0byBjb25maXJt IGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCBzdHJpbmc/IiB3aXRoICJDYW5jZWwiIG9y ICJObyIgb3IgIlllcyINaWYgaXQgPSAiQ2FuY2VsIiB0aGVuDXB1dCAiIiBpbnRvIHRy YW5zbGF0aW9uVGFibGUNZXhpdCB0byBIeXBlckNhcmQNZWxzZQ1wdXQgaXQgaW50byBv dXRPbmx5DWVuZCBpZg1lbmQgaWYNZW5kIGlmDXJlcGVhdCB3aXRoIGkgPSAyIHRvIG51 bWJlciBvZiBjYXJkcyBpbiBia2duZCAiZXZlbnRzIg1pZiBub3QgaGlsaXRlIG9mIGJr Z25kIGJ1dHRvbiAiZnJvbSBBRVVUIiBvZiBjYXJkIGkgb2YgYmtnbmQgImV2ZW50cyIg dGhlbg1UcmFuc2xhdGVGaWVsZCBvdXRPbmx5LCJldmVudHMiLGksImV2ZW50TmFtZSIN VHJhbnNsYXRlRmllbGQgb3V0T25seSwiZXZlbnRzIixpLCJldmVudENvbW1lbnQiDVRy YW5zbGF0ZUdyb3VwIG91dE9ubHksNSwiZXZlbnRzIixpLCJwYXJhbUluZm8iDWVuZCBp Zg1lbmQgcmVwZWF0DXJlcGVhdCB3aXRoIGkgPSAyIHRvIG51bWJlciBvZiBjYXJkcyBp biBia2duZCAiY2xhc3MiDWlmIG5vdCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJmcm9t IEFFVVQiIG9mIGNhcmQgaSBvZiBia2duZCAiY2xhc3MiIHRoZW4NVHJhbnNsYXRlRmll bGQgb3V0T25seSwiY2xhc3MiLGksImNsYXNzTmFtZSINVHJhbnNsYXRlRmllbGQgb3V0 T25seSwiY2xhc3MiLGksImNsYXNzQ29tbWVudCINVHJhbnNsYXRlR3JvdXAgb3V0T25s eSw1LCJjbGFzcyIsaSwicHJvcEluZm8iDWVuZCBpZg1lbmQgcmVwZWF0DXJlcGVhdCB3 aXRoIGkgPSAyIHRvIG51bWJlciBvZiBjYXJkcyBpbiBia2duZCAiY29tcGFyaXNvbiIN aWYgbm90IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgb2YgY2FyZCBp IG9mIGJrZ25kICJjb21wYXJpc29uIiB0aGVuDVRyYW5zbGF0ZUZpZWxkIG91dE9ubHks ImNvbXBhcmlzb24iLGksImNvbXBhcmVOYW1lIg1UcmFuc2xhdGVGaWVsZCBvdXRPbmx5 LCJjb21wYXJpc29uIixpLCJjb21wYXJlQ29tbWVudCINZW5kIGlmDWVuZCByZXBlYXQN cmVwZWF0IHdpdGggaSA9IDIgdG8gbnVtYmVyIG9mIGNhcmRzIGluIGJrZ25kICJlbnVt ZXJhdGlvbiINaWYgbm90IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIg b2YgY2FyZCBpIG9mIGJrZ25kICJlbnVtZXJhdGlvbiIgdGhlbg1UcmFuc2xhdGVHcm91 cCBvdXRPbmx5LDMsImVudW1lcmF0aW9uIixpLCJlbnVtSW5mbyINZW5kIGlmDWVuZCBy ZXBlYXQNZ28gY2QgIm1haW5NZW51Ig1QdXRTY3JhdGNoIHRyYW5zbGF0aW9uVGFibGUs ICJUcmFuc2xhdGlvbiB0YWJsZSINaWYgb3V0T25seSA8PiAidHJ1ZSIgdGhlbg1Db25z dHJ1Y3RMaW5rDWVuZCBpZg1wdXQgIiIgaW50byB0cmFuc2xhdGlvblRhYmxlDWVuZCBM b2NhbGl6YXRpb24NDW9uIFRyYW5zbGF0ZUZpZWxkIG91dE9ubHksIGJrZ25kTmFtZSwg Y2FyZE5vLCBmaWVsZE5hbWUNcHV0ICJmaWVsZCIgJiYgcXVvdGUgJiBmaWVsZE5hbWUg JiBxdW90ZSAmJiAib2YgY2FyZCIgJiYgY2FyZE5vIMINJiYgIm9mIGJrZ25kIiAmJiBx dW90ZSAmIGJrZ25kTmFtZSAmIHF1b3RlIGludG8gY2h1bmtOYW1lDXB1dCB2YWx1ZSBv ZiBjaHVua05hbWUgaW50byBjaHVua1ZhbHVlDWlmIGNodW5rVmFsdWUgaXMgbm90IGVt cHR5IHRoZW4NaWYgb3V0T25seSA9ICJ0cnVlIiB0aGVuDXNldCBjdXJzb3IgdG8gYnVz eQ1VcGRhdGVUYWJsZSBjaHVua1ZhbHVlLCBjaHVua1ZhbHVlICYgIidzIHRyYW5zbGF0 aW9uIg1lbHNlDXB1dCBUcmFuc2xhdGVUaGlzKGNodW5rVmFsdWUpIGludG8gaXQNaWYg b3V0T25seSA9ICJubyIgdGhlbiAtLSB3ZSBkbyBub3QgbmVlZCB0byBjb25maXJtDWlm IGl0IDw+ICJAIyQlIiB0aGVuIC0tIHdlIGhhdmUgYSB0cmFuc2xhdGlvbg1pZiBpdCA8 PiAiY2h1bmtWYWx1ZSIgdGhlbiAtLSB0aGUgdmFsdWUgaXMgY2hhbmdlZA1kbyAicHV0 IGl0IGludG8iICYmIGNodW5rTmFtZSAtLSB3cml0ZSBpdCBiYWNrDWVuZCBpZg1leGl0 IFRyYW5zbGF0ZUZpZWxkIC0tIGRvbmUNZW5kIGlmDWVuZCBpZg1wdXQgaXQgaW50byBv bGRUcmFucw1pZiBpdCA9ICJAIyQlIiB0aGVuIC0tIHdlIGRvIG5vdCBoYXZlIGEgdHJh bnNsYXRpb24NcHV0IGNodW5rVmFsdWUgaW50byBpdA1lbmQgaWYNYXNrICJUcmFuc2xh dGUiICYmIHF1b3RlICYgY2h1bmtWYWx1ZSAmIHF1b3RlICYmICJ0bzoiIHdpdGggaXQN aWYgdGhlIHJlc3VsdCA9ICJDYW5jZWwiIHRoZW4NQ29uc3RydWN0TGluaw1leGl0IHRv IEh5cGVyQ2FyZA1lbHNlDWRvICJwdXQgaXQgaW50byIgJiYgY2h1bmtOYW1lDWlmIChv bGRUcmFucyA8PiBpdCkgYW5kIChjaHVua1ZhbHVlIDw+IGl0KSB0aGVuIC0tIHRoaXMg aXMgYSBuZXcgdHJhbnNsYXRpb24sIHVwZGF0ZSB0YWJsZQ1VcGRhdGVUYWJsZSBjaHVu a1ZhbHVlLCBpdA1lbmQgaWYNZW5kIGlmDWVuZCBpZg1lbmQgaWYNZW5kIFRyYW5zbGF0 ZUZpZWxkDQ1vbiBUcmFuc2xhdGVHcm91cCBvdXRPbmx5LCBjb21tZW50SXRlbSxia2du ZE5hbWUsIGNhcmRObywgZmllbGROYW1lDXB1dCAiZmllbGQiICYmIHF1b3RlICYgZmll bGROYW1lICYgcXVvdGUgJiYgIm9mIGNhcmQiICYmIGNhcmRObyDCDSYmICJvZiBia2du ZCIgJiYgcXVvdGUgJiBia2duZE5hbWUgJiBxdW90ZSBpbnRvIGNodW5rTmFtZQ1wdXQg dmFsdWUgb2YgY2h1bmtOYW1lIGludG8gcGFyYW1JbmZvDXJlcGVhdCB3aXRoIGkgPSAx IHRvIG51bWJlciBvZiBsaW5lcyBpbiBwYXJhbUluZm8NcHV0IGxpbmUgaSBvZiBwYXJh bUluZm8gaW50byB0aGlzUGFyYW0NcHV0IGl0ZW0gMSBvZiB0aGlzUGFyYW0gaW50byBp dHNOYW1lDXB1dCBpdGVtIDEgdG8gKGNvbW1lbnRJdGVtLTEpIG9mIHRoaXNQYXJhbSBp bnRvIG5ld1BhcmFtDWRlbGV0ZSBpdGVtIDEgdG8gKGNvbW1lbnRJdGVtLTEpIG9mIHRo aXNQYXJhbQ1pZiBpdHNOYW1lIDw+ICIiIHRoZW4NcHV0IFRyYW5zbGF0ZVN0cmluZyhv dXRPbmx5LGl0c05hbWUpIGludG8gaXRlbSAxIG9mIG5ld1BhcmFtDWVuZCBpZg1pZiB0 aGlzUGFyYW0gPD4gIiIgdGhlbg1wdXQgIiwiICYgVHJhbnNsYXRlU3RyaW5nKG91dE9u bHksdGhpc1BhcmFtKSBhZnRlciBuZXdQYXJhbQ1lbHNlDXB1dCAiLCIgYWZ0ZXIgbmV3 UGFyYW0NZW5kIGlmDXB1dCBuZXdQYXJhbSBpbnRvIGxpbmUgaSBvZiBwYXJhbUluZm8N ZW5kIHJlcGVhdA1pZiBvdXRPbmx5IDw+ICJ0cnVlIiB0aGVuDWRvICJwdXQgcGFyYW1J bmZvIGludG8iICYmIGNodW5rTmFtZQ1lbmQgaWYNZW5kIFRyYW5zbGF0ZUdyb3VwDQ1m dW5jdGlvbiBUcmFuc2xhdGVTdHJpbmcgb3V0T25seSwgc3RyaW5nDWlmIG91dE9ubHkg PSAidHJ1ZSIgdGhlbg1zZXQgY3Vyc29yIHRvIGJ1c3kNVXBkYXRlVGFibGUgc3RyaW5n LCBzdHJpbmcgJiAiJ3MgdHJhbnNsYXRpb24iDXJldHVybiBzdHJpbmcNZWxzZQ1wdXQg VHJhbnNsYXRlVGhpcyhzdHJpbmcpIGludG8gaXQNaWYgb3V0T25seSA9ICJubyIgdGhl biAtLSB3ZSBkbyBub3QgbmVlZCB0byBjb25maXJtDWlmIGl0IDw+ICJAIyQlIiB0aGVu IC0tIHdlIGhhdmUgYSB0cmFuc2xhdGlvbg1yZXR1cm4gaXQgLS0gZG9uZQ1lbmQgaWYN ZW5kIGlmDXB1dCBpdCBpbnRvIG9sZFRyYW5zDWlmIGl0ID0gIkAjJCUiIHRoZW4gLS0g d2UgZG8gbm90IGhhdmUgYSB0cmFuc2xhdGlvbg1wdXQgc3RyaW5nIGludG8gaXQNZW5k IGlmDWFzayAiVHJhbnNsYXRlIiAmJiBxdW90ZSAmIHN0cmluZyAmIHF1b3RlICYmICJ0 bzoiIHdpdGggaXQNaWYgdGhlIHJlc3VsdCA9ICJDYW5jZWwiIHRoZW4NQ29uc3RydWN0 TGluaw1leGl0IHRvIEh5cGVyQ2FyZA1lbHNlDWlmIChvbGRUcmFucyA8PiBpdCkgYW5k IChzdHJpbmcgPD4gaXQpIHRoZW4gLS0gdGhpcyBpcyBhIG5ldyB0cmFuc2xhdGlvbiwg dXBkYXRlIHRhYmxlDVVwZGF0ZVRhYmxlIHN0cmluZywgaXQNZW5kIGlmDXJldHVybiBp dA1lbmQgaWYNZW5kIGlmDWVuZCBUcmFuc2xhdGVTdHJpbmcNDWZ1bmN0aW9uIFRyYW5z bGF0ZVRoaXMgc3RyaW5nDWdsb2JhbCB0cmFuc2xhdGlvblRhYmxlDWlmIHRyYW5zbGF0 aW9uVGFibGUgPD4gIiIgdGhlbg1wdXQgU2VhcmNoKHRyYW5zbGF0aW9uVGFibGUsIHN0 cmluZyAmIHJldHVybiwgdHJ1ZSwgdHJ1ZSkgaW50byBsaW5lTGlzdA1wdXQgbnVtYmVy IG9mIGxpbmVzIGluIGxpbmVMaXN0IGludG8gbg1yZXBlYXQgd2l0aCBpID0gMSB0byBu DXB1dCBpdGVtIDEgb2YgbGluZSBpIG9mIGxpbmVMaXN0IGludG8gag1pZiAoaiBtb2Qg MikgPSAxIHRoZW4NaWYgbGluZSBqIG9mIHRyYW5zbGF0aW9uVGFibGUgPSBzdHJpbmcg dGhlbg1yZXR1cm4gbGluZSBqKzEgb2YgdHJhbnNsYXRpb25UYWJsZQ1lbmQgaWYNZW5k IGlmDWVuZCByZXBlYXQNZW5kIGlmDXJldHVybiAiQCMkJSINZW5kIFRyYW5zbGF0ZVRo aXMNDW9uIFVwZGF0ZVRhYmxlIHNvdXJjZSx0cmFuc2xhdGlvbg1nbG9iYWwgdHJhbnNs YXRpb25UYWJsZQ1wdXQgU2VhcmNoKHRyYW5zbGF0aW9uVGFibGUsIHNvdXJjZSAmIHJl dHVybiwgdHJ1ZSwgdHJ1ZSkgaW50byBsaW5lTGlzdA1wdXQgbnVtYmVyIG9mIGxpbmVz IGluIGxpbmVMaXN0IGludG8gbg1yZXBlYXQgd2l0aCBpID0gMSB0byBuDXB1dCBpdGVt IDEgb2YgbGluZSBpIG9mIGxpbmVMaXN0IGludG8gag1pZiAoaiBtb2QgMikgPSAxIHRo ZW4NaWYgbGluZSBqIG9mIHRyYW5zbGF0aW9uVGFibGUgPSBzb3VyY2UgdGhlbg0tLSB0 cmFuc2xhdGlvbiBjaGFuZ2VkLCB3ZSB1cGRhdGUgaXQNcHV0IHRyYW5zbGF0aW9uIGlu dG8gbGluZSBqKzEgb2YgdHJhbnNsYXRpb25UYWJsZQ1leGl0IFVwZGF0ZVRhYmxlDWVu ZCBpZg1lbmQgaWYNZW5kIHJlcGVhdA0tLSBuZXcgdHJhbnNsYXRpb24sIHdlIGFkZCB0 byB0aGUgZW5kIG9mIHRoZSB0YWJsZQ1wdXQgc291cmNlICYgcmV0dXJuICYgdHJhbnNs YXRpb24gJiByZXR1cm4gYWZ0ZXIgdHJhbnNsYXRpb25UYWJsZQ1lbmQgVXBkYXRlVGFi bGUNDW9uIENvbnN0cnVjdExpbmsNZ2xvYmFsIGluRWRpdA1wdXQgZmFsc2UgaW50byBp bkVkaXQNcHV0IGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiBpZCA4IG9mIGNhcmQgInByZWZl cmVuY2UiIGludG8gc29ydE5hbWUNcHV0IGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiBpZCAy NiBvZiBjYXJkICJwcmVmZXJlbmNlIiBpbnRvIGNsZWFuRmxhZw1pZiBzb3J0TmFtZSB0 aGVuDXNldCBjdXJzb3IgdG8gYnVzeQ1zb3J0IGJrZ25kICJldmVudHMiIGJ5IFJlc1R5 cGUoZmllbGQgIlN1aXRlQ29kZSIpICYgZmllbGQgImV2ZW50TmFtZSINc2V0IGN1cnNv ciB0byBidXN5DXNvcnQgYmtnbmQgImNsYXNzIiBieSBSZXNUeXBlKGZpZWxkICJTdWl0 ZUNvZGUiKSAmIGZpZWxkICJjbGFzc05hbWUiDXNldCBjdXJzb3IgdG8gYnVzeQ1zb3J0 IGJrZ25kICJjb21wYXJpc29uIiBieSBSZXNUeXBlKGZpZWxkICJTdWl0ZUNvZGUiKSAm IGZpZWxkICJjb21wYXJlTmFtZSINc2V0IGN1cnNvciB0byBidXN5DXNvcnQgYmtnbmQg ImVudW1lcmF0aW9uIiBieSBSZXNUeXBlKGZpZWxkICJTdWl0ZUNvZGUiKSAmIGZpZWxk ICJlbnVtZXJhdGlvbiINZWxzZQ1zb3J0IGJrZ25kICJldmVudHMiIGJ5IGZpZWxkICJT dWl0ZUNvZGUiDXNvcnQgYmtnbmQgImNsYXNzIiBieSBmaWVsZCAiU3VpdGVDb2RlIg1z b3J0IGJrZ25kICJjb21wYXJpc29uIiBieSBmaWVsZCAiU3VpdGVDb2RlIg1zb3J0IGJr Z25kICJlbnVtZXJhdGlvbiIgYnkgZmllbGQgIlN1aXRlQ29kZSINZW5kIGlmDXB1dCBu dW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50byBuDXJlcGVhdCB3 aXRoIGkgPSAyIHRvIG4NZ28gY2FyZCBuIG9mIGJrZ25kICJzdWl0ZUluZm8iDS0tIGNs ZWFyIGV2ZXJ5dGhpbmcNcHV0ICIiIGludG8gZmllbGQgImV2ZW50TGlzdCINcHV0ICIi IGludG8gZmllbGQgImNsYXNzTGlzdCINcHV0ICIiIGludG8gZmllbGQgImNvbXBhcmVM aXN0Ig1wdXQgIiIgaW50byBmaWVsZCAiZW51bUxpc3QiDWVuZCByZXBlYXQNQ2xlYW5U eXBlIGZhbHNlLCAiY2xhc3MiLCJjbGFzc0xpc3QiLCJjbGFzc05hbWUiLCJjbGFzc0lE Ig1DbGVhblR5cGUgZmFsc2UsICJjb21wYXJpc29uIiwiY29tcGFyZUxpc3QiLCJjb21w YXJlTmFtZSIsImNvbXBhcmVJRCINQ2xlYW5UeXBlIGZhbHNlLCAiZW51bWVyYXRpb24i LCJlbnVtTGlzdCIsImVudW1lcmF0aW9uIg1DbGVhblR5cGUgY2xlYW5GbGFnLCAiZXZl bnRzIiwiZXZlbnRMaXN0IiwiZXZlbnROYW1lIiwiZXZlbnRDbGFzcyIsImV2ZW50SUQi DXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50byBpDXB1 dCAiIiBpbnRvIHN1aXRlTGlzdA1yZXBlYXQgd2hpbGUgaSA+IDENZ28gY2FyZCBpIG9m IGJrZ25kICJzdWl0ZUluZm8iDWlmIGZpZWxkICJzdWl0ZUNvZGUiID0gIiIgdGhlbg1k b21lbnUgImRlbGV0ZSBDYXJkIg1lbHNlDXNldCBsb2NrVGV4dCBvZiBmaWVsZCAic3Vp dGVDb2RlIiB0byB0cnVlDXNldCBzdHlsZSBvZiBmaWVsZCAic3VpdGVDb2RlIiB0byBv cGFxdWUNcHV0IGZpZWxkICJzdWl0ZUNvZGUiICYgcmV0dXJuIGJlZm9yZSBzdWl0ZUxp c3QNZW5kIGlmDXN1YnRyYWN0IDEgZnJvbSBpDWVuZCByZXBlYXQNZ28gY2FyZCAibWFp bk1lbnUiDXB1dCBzdWl0ZUxpc3QgaW50byBjYXJkIGZpZWxkICJzdWl0ZUxpc3QiDXB1 dCB0cnVlIGludG8gaW5FZGl0DWVuZCBDb25zdHJ1Y3RMaW5rDQ1vbiBDbGVhblR5cGUg Y2xlYW5GbGFnLCBia2duZE5hbWUsbGlzdE5hbWUsZmllbGROYW1lLElEMSxJRDINcHV0 IG51bWJlciBvZiBjYXJkcyBpbiBia2duZCBia2duZE5hbWUgaW50byBuDXB1dCAiIiBp bnRvIHRoZUxpc3QNcmVwZWF0IHdpdGggaSA9IDIgdG8gbg1zZXQgY3Vyc29yIHRvIGJ1 c3kNZ28gY2FyZCBpIG9mIGJrZ25kIGJrZ25kTmFtZQ1pZiBia2duZE5hbWUgPSAiZXZl bnRzIiB0aGVuDWlmIGNsZWFuRmxhZyB0aGVuDUd1ZXNzUGFyYW1UeXBlDWVuZCBpZg1N YWtlU2NyaXB0VGVtcGxhdGUNZW5kIGlmDXB1dCBmaWVsZCAic3VpdGVDb2RlIiBpbnRv IHN1aXRlQ29kZQ1wdXQgZmllbGQgZmllbGROYW1lIGludG8gY3VyTmFtZQ1pZiBJRDEg PD4gIiIgdGhlbg1wdXQgIiwiICYgUmVzVHlwZShmaWVsZCBJRDEpIGFmdGVyIGN1ck5h bWUNaWYgSUQyIDw+ICIiIHRoZW4NcHV0IFJlc1R5cGUoZmllbGQgSUQyKSBhZnRlciBj dXJOYW1lDWVuZCBpZg1lbmQgaWYNaWYgKHN1aXRlQ29kZSA8PiBzdWl0ZVJ1bikgYW5k IChzdWl0UnVuIDw+ICIiKSB0aGVuDS0tIHdlIGFyZSBkb25lIHdpdGggYSBzdWl0ZQ1Q dXROYW1lTGlzdCBzdWl0ZVJ1bixsaXN0TmFtZSx0aGVMaXN0DXB1dCAiIiBpbnRvIHRo ZUxpc3QNZW5kIGlmDXB1dCBzdWl0ZUNvZGUgaW50byBzdWl0ZVJ1bg1wdXQgY3VyTmFt ZSAmIHJldHVybiBhZnRlciB0aGVMaXN0DWVuZCByZXBlYXQNaWYgbiA+IDEgdGhlbg1Q dXROYW1lTGlzdCBzdWl0ZVJ1bixsaXN0TmFtZSx0aGVMaXN0DWVuZCBpZg1lbmQgQ2xl YW5UeXBlDQ1vbiBQdXROYW1lTGlzdCBzdWl0ZUNvZGUsbGlzdE5hbWUsdGhlTGlzdA1n byBjYXJkICJzdWl0ZSIgJiYgc3VpdGVDb2RlDWlmIHRoZSByZXN1bHQgPD4gIiIgdGhl bg0tLSB3ZSBkb24ndCBoYXZlIG9uZSB5ZXQsIHdlIG5lZWQgdG8gY3JlYXRlIGl0DWdv IGxhc3QgY2FyZCBvZiBia2duZCAic3VpdGVJbmZvIg1kb01lbnUgIm5ldyBjYXJkIg1l bmQgaWYNcHV0IHRoZUxpc3QgaW50byBmaWVsZCBsaXN0TmFtZQ1lbmQgUHV0TmFtZUxp c3QNDW9uIFB1dFNjcmF0Y2ggeCwgaXRzTmFtZQ1pZiBsZW5ndGgoeCkgPj0gMzAwMDAg dGhlbg0tLSB0b28gbXVjaCB0byBiZSBwdXQgaW50byBhIEh5cGVyQ2FyZCBmaWVsZCwg dHJ5IGZpbGUgaW5zdGVhZA1hc2sgZmlsZSAiU2F2ZSB0aGUgZGF0YSB0byBmaWxlIg1p ZiBpdCA8PiAiIiB0aGVuDXB1dCBpdCBpbnRvIHJlZg1vcGVuIGZpbGUgcmVmDXdyaXRl IHggdG8gZmlsZSByZWYNY2xvc2UgZmlsZSByZWYNZWxzZQ1Nb3ZlRGVzY1RvU2NyYXAg eCAtLSBwdXQgaXQgaW50byBzY3JhcCBhcyBhIGxhc3QgcmVzb3J0DWVuZCBpZg1lbHNl DXB1dCB4IGludG8gY2FyZCBmaWVsZCAic2NyYXRjaCINcHV0IGl0c05hbWUgaW50byBj YXJkIGZpZWxkICJwYWROYW1lIg1lbmQgaWYNZW5kIFB1dFNjcmF0Y2gNDQAAAAAAAAAA AAAAAAAAAAAAAAAYAEJLR0QAABPAAAAAAAAAEt9AAAAAAAAAAwAAFdgAAA48ABYAGwAA EHYACAAAAG4AyAACAgQAKQDZADsBhQACAAAAAAAAAAQADAAAABBzdWl0ZU5hbWUAAG9u IE1vdXNlV2l0aGluDWlmICBtZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciB0 aGUgbmFtZSBvZiB0aGlzIHN1aXRlIGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJUaGlz IGlzIHRoZSBuYW1lIG9mIHRoaXMgc3VpdGUuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGlu DQ0AAADSAAMCBAA8ANkAbgH8AAIAAAAAAAAABAAJAAAADHN1aXRlQ29tbWVudAAAb24g TW91c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIGEg Y29tbWVudCBmb3IgdGhpcyBzdWl0ZSBoZXJlLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhp cyBpcyB0aGUgY29tbWVudCBmb3IgdGhpcyBzdWl0ZS4iDWVuZCBpZg1lbmQgTW91c2VX aXRoaW4NDQ0AAAEUAAQCIQCDAAQA3AD9QAcAAAAAAAAABAAJAAAADGV2ZW50TGlzdAAA b24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgdGhlIGxpc3Qgb2YgZXZlbnRz IGZvciB0aGlzIHN1aXRlIGdvZXMgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91 c2V1cA1wdXQgdmFsdWUgb2YgdGhlIGNsaWNrTGluZSBpbnRvIHgNaWYgeCA8PiAiIiB0 aGVuDUhNUmVtb3ZlQmFsbG9vbg1wdXQganVtcCgiZXZlbnQiICYmIGl0ZW0gMiBvZiB4 KSBpbnRvIHZvaWQNZW5kIGlmDWVuZCBtb3VzZXVwAAAiAAUCDAAZAIQAKADZAAAAAAAA //8AFQAMAQAAEAAAAAAAIgAGAgwAKwCZAD0A2QAAAAAAAP//ABUADAEAABAAAAAAACIA BwIMADsAjQBNANoAAAAAAAD//wAVAAwBAAAQAAAAAAAiAAgCDQB0AAQAgwA7AAAAAAAA AAAAFQAMAQAAEAAAAAAAIgAJAgwAdAEDAIMBSwAAAAAAAAAAABUADAEAABAAAAAAARYA CgIhAIMBAwDcAfxABwAAAAAAAAAEAAkAAAAMY2xhc3NMaXN0AABvbiBNb3VzZVdpdGhp bg1TaG93QmFsbG9vbiAiVGhpcyB0aGUgbGlzdCBvZiBjbGFzc2VzIGZvciB0aGlzIHN1 aXRlIGdvZXMgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2V1cA1wdXQgdmFs dWUgb2YgdGhlIGNsaWNrTGluZSBpbnRvIHgNaWYgeCA8PiAiIiB0aGVuDUhNUmVtb3Zl QmFsbG9vbg1wdXQganVtcCgiY2xhc3MiICYmIGl0ZW0gMiBvZiB4KSBpbnRvIHZvaWQN ZW5kIGlmDWVuZCBtb3VzZXVwAAAAIgALAgwA6QAEAPoAaAAAAAAAAAAAABUADAEAABAA AAAAACIADAIMAOkBAwD6AXQAAAAAAAAAAAAVAAwBAAAQAAAAAAEqAA0CIQD5AAQBUQD9 QAcAAAAAAAAABAAJAAAADGNvbXBhcmVMaXN0AABvbiBNb3VzZVdpdGhpbg1TaG93QmFs bG9vbiAiVGhpcyB0aGUgbGlzdCBvZiBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgdGhp cyBzdWl0ZSBnb2VzIGhlcmUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNldXANcHV0 IHZhbHVlIG9mIHRoZSBjbGlja0xpbmUgaW50byB4DWlmIHggPD4gIiIgdGhlbg1ITVJl bW92ZUJhbGxvb24NcHV0IGp1bXAoImNvbXBhcmlzb24iICYmIGl0ZW0gMiBvZiB4KSBp bnRvIHZvaWQNZW5kIGlmDWVuZCBtb3VzZXVwAAABFgAOAiEA+gECAVEB/EAHAAAAAAAA AAQACQAAAAxlbnVtTGlzdAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMg dGhlIGxpc3Qgb2YgZW51bWVyYXRpb25zIGZvciB0aGlzIHN1aXRlIGdvZXMgaGVyZS4i DWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2V1cA1wdXQgdmFsdWUgb2YgdGhlIGNsaWNr TGluZSBpbnRvIHgNaWYgeCA8PiAiIiB0aGVuDUhNUmVtb3ZlQmFsbG9vbg1wdXQganVt cCgiZW51bWVyYXRpb24iICYmIHgpIGludG8gdm9pZA1lbmQgaWYNZW5kIG1vdXNldXAA AAEOAA8BAABxAMgAgQD9oAQAAAAAAAEAAAAMAAAAEE5ld8kAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGFkZCBhIG5ldyBldmVudCB0byB0aGlz IHN1aXRlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBnV2hlcmVG cm9tDWxvY2sgc2NyZWVuDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJvbQ1NYWtl SXRlbSAiZXZlbnRzIg11bmxvY2sgc2NyZWVuIHdpdGggdmlzdWFsIGRpc3NvbHZlIGZh c3QNZW5kIG1vdXNlVXAAAAEMABABAABxAccAgQH8gAQAAAAAAAEAAAAMAAAAEE5ld8kA AG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGFkZCBhIG5l dyBjbGFzcyB0byB0aGlzIHN1aXRlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVw DWdsb2JhbCBnV2hlcmVGcm9tDWxvY2sgc2NyZWVuDXB1c2ggY2QNcG9wIGNkIGludG8g Z1doZXJlRnJvbQ1NYWtlSXRlbSAiY2xhc3MiDXVubG9jayBzY3JlZW4gd2l0aCB2aXN1 YWwgZGlzc29sdmUgZmFzdA1lbmQgbW91c2VVcAABIAARAQAA5wDIAPcA/aAEAAAAAAAB AAAADAAAABBOZXfJAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVy ZSB0byBhZGQgYSBuZXcgY29tcGFyaXNvbiBvcGVyYXRvciB0byB0aGlzIHN1aXRlLiIN ZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBnV2hlcmVGcm9tDWxvY2sg c2NyZWVuDXB1c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJvbQ1NYWtlSXRlbSAiY29t cGFyaXNvbiINdW5sb2NrIHNjcmVlbiB3aXRoIHZpc3VhbCBkaXNzb2x2ZSBmYXN0DWVu ZCBtb3VzZVVwAAABGAASAQAA6AHIAPgB/aAEAAAAAAABAAAADAAAABBOZXfJAABvbiBN b3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBhZGQgYSBuZXcgZW51 bWVyYXRpb24gdG8gdGhpcyBzdWl0ZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VV cA1nbG9iYWwgZ1doZXJlRnJvbQ1sb2NrIHNjcmVlbg1wdXNoIGNkDXBvcCBjZCBpbnRv IGdXaGVyZUZyb20NTWFrZUl0ZW0gIkVudW1lcmF0aW9uIg11bmxvY2sgc2NyZWVuIHdp dGggdmlzdWFsIGRpc3NvbHZlIGZhc3QNZW5kIG1vdXNlVXAAACIAEwINABkAAAAzAHAA AAAAAAAAAAAVABgIAAAgAAAAAAFYABQBAABEABYAYwA2IAAAAAOGAAEAAAAMAAAAEAAA b24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhl IG5leHQgc3VpdGUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2V0IHRoZXJl IGlzIGEgY2FyZCAyIG9mIHRoaXMgYmtnbmQNaWYgbm90IGl0IHRoZW4gZXhpdCBtb3Vz ZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBjYXJkIDIgb2YgdGhpcyBia2duZCBpbnRv IHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkIDw+IHggdGhlbg12aXN1YWwg d2lwZSBsZWZ0DWdvIHByZXYgY2FyZCBvZiB0aGlzIGJrZ25kDWVuZCBpZg1lbmQgbW91 c2VVcAAAASAAFQEAAEQAPwBjAF4gAAAAZzkAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhp bg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyB0byB0aGUgcHJldmlvdXMgc3Vp dGUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANcHV0IHRoZSBzaG9ydCBuYW1l IG9mIGxhc3QgY2FyZCBvZiB0aGlzIGJrZ25kIGludG8geA1pZiB0aGUgc2hvcnQgbmFt ZSBvZiB0aGlzIGNhcmQgPD4geCB0aGVuDXZpc3VhbCB3aXBlIHJpZ2h0DWdvIG5leHQg Y2FyZCBvZiB0aGlzIGJrZ25kDWVuZCBpZg1lbmQgbW91c2VVcAAAALgAFwEAAA8BuQA2 AgCgAAAAPtMAAQAAAAwAAAAQUmVzb3VyY2UgVG9vbHMAAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhlIHJlc291cmNlIHRv b2xzIGNhcmQuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ28gY2FyZCAibWFp bk1lbnUiDWVuZCBtb3VzZVVwAAHgABgCBQAWANkAKAEKAAEAAAAAAAAABAAOAQAAElN1 aXRlQ29kZQAAb24gTW91c2VXaXRoaW4NaWYgdGhlIGxvY2t0ZXh0IG9mIG1lIHRoZW4N U2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIGlkIG9mIHRoaXMgc3VpdGUuIg1lbHNlDVNo b3dCYWxsb29uICJFbnRlciBpcyB0aGUgaWQgb2YgdGhpcyBzdWl0ZSBoZXJlLiINZW5k IGlmDWVuZCBNb3VzZVdpdGhpbg0Nb24gZXhpdEZpZWxkDWdldCBtZQ1pZiBpdCBpcyBl bXB0eSB0aGVuDXB1dCBlbXB0eSBpbnRvIHRoZUNvZGUNcmVwZWF0IHdoaWxlIHRoZSBu dW1iZXIgb2YgY2hhcnMgaW4gdGhlQ29kZSA8IDQNYXNrICJQbGVhc2Ugc3VwcGx5IGEg NCBjaGFyYWN0ZXIgc3VpdGUgY29kZToiIHdpdGggdGhlQ29kZQ1wdXQgaXQgaW50byB0 aGVDb2RlDWVuZCByZXBlYXQNcHV0IHRoZUNvZGUgaW50byBmaWVsZCAic3VpdGVDb2Rl Ig1lbmQgaWYNcGFzcyBleGl0RmllbGQNZW5kIGV4aXRGaWVsZA0NAAAFAAwAU3VpdGUg Q29kZToABgAGAE5hbWU6AAcACQBDb21tZW50OgAACAAHAEV2ZW50cwAACQAIAENsYXNz ZXMACwAMAENvbXBhcmlzb25zAAwADQBFbnVtZXJhdGlvbnMAABMACACuU3VpdGVzc3Vp dGVJbmZvAG9uIE1ha2VJdGVtIGl0ZW1UeXBlDXB1dCBmaWVsZCAic3VpdGVDb2RlIiBp bnRvIGN1clN1aXRlQ29kZQ1nbyBsYXN0IGNhcmQgb2YgYmtnbmQgaXRlbVR5cGUNZG9N ZW51ICJOZXcgQ2FyZCINcHV0IGN1clN1aXRlQ29kZSBpbnRvIGZpZWxkICJzdWl0ZUNv ZGUiDWlmIGl0ZW1UeXBlID0gImV2ZW50cyIgdGhlbg1wdXQgY3VyU3VpdGVDb2RlIGlu dG8gZmllbGQgImV2ZW50Q2xhc3MiDWVuZCBpZg1lbmQgTWFrZUl0ZW0NDW9uIE5ld0Nh cmQNc2V0IGxvY2tUZXh0IG9mIGZpZWxkICJzdWl0ZUNvZGUiIHRvIGZhbHNlDXNldCBz dHlsZSBvZiBmaWVsZCAic3VpdGVDb2RlIiB0byByZWN0YW5nbGUNUGFzcyBOZXdDYXJk DWVuZCBOZXdDYXJkDQ1vbiBDbG9zZUNhcmQNZ2xvYmFsIGluRWRpdA1pZiBpbkVkaXQg dGhlbg1wdXQgc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQgaW50byB4DWlmIHN0eWxlIG9m IGZpZWxkICJzdWl0ZUNvZGUiIGlzIHJlY3RhbmdsZSB0aGVuDS0tIGEgbmV3IHN1aXRl LCBhIGJldHRlciBjcml0ZXJpYSBtYXkgYmUgY2FyZCBuYW1lIGlzIGVtcHR5LCBidXQg d2UgaGF2ZSBwcm9ibGVtIHdpdGggdGhhdA1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50 byBuZXdOYW1lDXNldCBsb2NrVGV4dCBvZiBmaWVsZCAic3VpdGVDb2RlIiB0byB0cnVl DXNldCBzdHlsZSBvZiBmaWVsZCAic3VpdGVDb2RlIiB0byBvcGFxdWUNc2V0IHRoZSBu YW1lIG9mIHRoaXMgY2FyZCB0byAoInN1aXRlIiAmJiBuZXdOYW1lKQ1wdXQgbmV3TmFt ZSAmIHJldHVybiBhZnRlciBjYXJkIGZpZWxkICJzdWl0ZUxpc3QiIG9mIGNhcmQgIm1h aW5NZW51Ig1lbmQgaWYNZW5kIGlmDVBhc3MgQ2xvc2VDYXJkDWVuZCBDbG9zZUNhcmQN DW9uIGRvTWVudSBpdGVtLG1lbnUNaWYgKChpdGVtID0gImRlbGV0ZSBjYXJkIikgb3Ig KGl0ZW0gPSAiY3V0IGNhcmQiKSkgYW5kIChpZCBvZiB0aGlzIGJrZ25kID0gNTA1Nikg dGhlbg1nbG9iYWwgaW5FZGl0DWlmIGluRWRpdCB0aGVuDXB1dCBmYWxzZSBpbnRvIGlu RWRpdA1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBzdWl0ZUNvZGUNcHV0IGNhcmQg ZmllbGQgInN1aXRlTGlzdCIgb2YgY2FyZCAibWFpbk1lbnUiIGludG8geA1wdXQgbnVt YmVyIG9mIGxpbmVzIGluIHggaW50byBuDXJlcGVhdCB3aXRoIGkgPSAxIHRvIG4NaWYg bGluZSBpIG9mIHggPSBzdWl0ZUNvZGUgdGhlbg1kZWxldGUgbGluZSBpIG9mIHgNcHV0 IHggaW50byBjYXJkIGZpZWxkICJzdWl0ZUxpc3QiIG9mIGNhcmQgIm1haW5NZW51Ig1l eGl0IHJlcGVhdA1lbmQgaWYNZW5kIHJlcGVhdA1wdXNoIGNhcmQNRGVsZXRlU3VpdGUg ImV2ZW50cyIsc3VpdGVDb2RlDURlbGV0ZVN1aXRlICJjbGFzcyIsc3VpdGVDb2RlDURl bGV0ZVN1aXRlICJjb21wYXJpc29uIixzdWl0ZUNvZGUNRGVsZXRlU3VpdGUgImVudW1l cmF0aW9uIixzdWl0ZUNvZGUNcG9wIGNhcmQNcHV0IHRydWUgaW50byBpbkVkaXQNZW5k IGlmDWVuZCBpZg1wYXNzIGRvTWVudQ1lbmQgZG9NZW51DQ1vbiBEZWxldGVTdWl0ZSBi a2duZE5hbWUsc3VpdGVDb2RlDXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgYmtn bmROYW1lIGludG8gaQ1yZXBlYXQgd2hpbGUgaSA+IDENZ28gY2FyZCBpIG9mIGJrZ25k IGJrZ25kTmFtZQ1pZiBmaWVsZCAic3VpdGVDb2RlIiA9IHN1aXRlQ29kZSB0aGVuDWRv TWVudSAiRGVsZXRlIENhcmQiDWVuZCBpZg1zdWJ0cmFjdCAxIGZyb20gaQ1lbmQgcmVw ZWF0DWVuZCBEZWxldGVTdWl0ZQ0NAAAAAAAAAAAAAAAAAAAA4EJNQVAAABLfAAAAAAAA AAAAAQAAAAAAAAFWAgAAAAAAAVYCAAAYAAABUwH+AAAAAAAAAAAAAAAAAAAAnADC//// /////////////////OOFih8C4x8D47mGiQDCVVVVVVVVVVVVVVVVVVVVVeMAwiqqqqqq qqqqqqqqqqqqqqrjv4G/gbKB4R8E4R8I4R8C4R8Ev4a/hrWGjhGA4S0CAeEeBI0RgOEt AQHhHgK+gYnhHwThHwjhHwLhHwS/hr+GtYaOEYDhLQIB4R4EjRGA4S0BAeEeAgdwAHcA AFoAAFXAQktHRAAAFdgAAAAAAAAWpkAAAAAAAAAQAAAYZAAAE8AAMwA+AAAyvgAIAAAA ZAB+AAECBAAcAI4AMAC/AAIAAAAAAAEABAAOAQAAElN1aXRlQ29kZQAAb24gTW91c2VX aXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgZXZlbnQgYmVsb25ncyB0byB0aGlzIHN1aXRl IGNvZGUuIg1lbmQgTW91c2VXaXRoaW4AAADGAAICBABAAFkAUwEJAAIAAAAAAAAABAAM AAAAEEV2ZW50TmFtZQAAb24gTW91c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hv d0JhbGxvb24gIkVudGVyIHRoZSBuYW1lIG9mIHRoaXMgZXZlbnQgaGVyZS4iDWVsc2UN U2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIG5hbWUgb2YgdGhpcyBldmVudC4iDWVuZCBp Zg1lbmQgTW91c2VXaXRoaW4NAAB+AAMCBAAcAP0AMAEuAAIAAAAAAAAABAAOAQAAEkV2 ZW50Q2xhc3MAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBl dmVudCBjbGFzcyBvZiB0aGUgZXZlbnQuIg1lbmQgTW91c2VXaXRoaW4AAADAAAQCBABA AUoAUwF4AAIAAAAAAAAABAAMAAAAEEV2ZW50SUQAAG9uIE1vdXNlV2l0aGluDWlmICBt ZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciB0aGUgSUQgb2YgdGhpcyBldmVu dCBoZXJlLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhpcyBpcyB0aGUgSUQgb2YgdGhpcyBl dmVudC4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4NAADUAAUCBABVAFkAhQH7AAcAAAAA AAAABAAJAAAADEV2ZW50Q29tbWVudAAAb24gTW91c2VXaXRoaW4NaWYgIG1lIGlzICIi IHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIGEgY29tbWVudCBhYm91dCB0aGlzIGV2ZW50 IGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIGlzIGEgY29tbWVudCBhYm91dCB0 aGlzIGV2ZW50LiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0NDQAAAMoABgIFALMAQgDG ARkAAgAAAAAAAAADAAwAAAAQRXZQYXJhbU5hbWUAAG9uIE1vdXNlV2l0aGluDWlmICBt ZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciBhIHRoZSBuYW1lIGZvciB0aGlz IGV2ZW50IGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBuYW1lIG9m IHRoaXMgZXZlbnQuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluAADKAAcCBQCzAXsAxgGh AAIAAAAAAAEABAAMAAAAEAAAb24gTW91c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4N U2hvd0JhbGxvb24gIkVudGVyIGEga2V5d29yZCBpZCBmb3IgdGhlIHBhcmFtZXRlci4i DWVsc2UNU2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIGtleXdvcmQgaWQgZm9yIHRoZSBw YXJhbWV0ZXIuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluDQABKAAIAgQAswHTAMYB/QAC AAAAAAABAAQADAAAABAAAG9uIE1vdXNlV2l0aGluDWlmICBtZSBpcyAiIiB0aGVuDVNo b3dCYWxsb29uICJFbnRlciBhIGRhdGEgdHlwZSBmb3IgdGhlIHBhcmFtZXRlci4iDWVs c2UNaWYgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiRW51bSIgdGhlbg1TaG93QmFsbG9v biAiVGhlIHBhcmFtZXRlciBpcyBhbiBlbnVtZXJhdG9yLiINZWxzZQ1TaG93QmFsbG9v biAiVGhlIGlzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlci4iDWVuZCBpZg1l bmQgaWYNZW5kIE1vdXNlV2l0aGluDQ0AAADOAAkCBAD4AGQBUwH5AAcAAAAAAAAABAAJ AAAADAAAb24gTW91c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24g IkVudGVyIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGFyYW1ldGVyLiINZWxzZQ1TaG93 QmFsbG9vbiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGFyYW1ldGVy LiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbgAAACoACgKEAS8ARwFWAfsABwAAAAAAAAAD AAwAAAAQcGFyYW1JbmZvAAAAANYACwEAAB8AYwAxAI+gAAAAAAAAAQAAAAwAAAAQU3Vp dGU6AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSBpZiB5b3Ug d2FudCB0byBnbyB0aGUgc3VpdGUiICYmIGZpZWxkICJzdWl0ZUNvZGUiDWVuZCBNb3Vz ZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQganVtcCgic3VpdGUiICYmIGZpZWxkIHN1aXRl Q29kZSkgaW50byB2b2lkDWVuZCBtb3VzZVVwAAAiAA8CDQBCAB4AUwBaAAAAAAAA//8A FQAMAQAAEAAAAAAAIgARAgwAQgERAFIBSwAAAAAAAP//ABUADAEAABAAAAAAACIAEgIN AFQABQBkAFoAAAAAAAD//wAVAAwBAAAQAAAAAAAiABMCDACbAAIArABXAAAAAAAA//8A FQAMAQAAEAAAAAAAIgAUAg0AtQAEAMYAQwAAAAAAAP//ABUADAEAABAAAAAAACIAFQIN ALUBLQDGAXwAAAAAAAD//wAVAAwBAAAQAAAAAAAiABcCDQD3AAsBCQBlAAAAAAAA//8A FQAMAQAAEAAAAAABNAAYAQAAtAGtAMUB06AAAAAAAAABABUADAEAABBUeXBlAABvbiBN b3VzZVdpdGhpbg1pZiBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJFbnVtIiB0aGVuDVNo b3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIHRvIHRoZSBlbnVtZXJhdGlvbiIgJiYg KGZpZWxkIGlkIDgpICYgIi4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNl VXANaWYgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZW51bSIgdGhlbg1ITVJlbW92ZUJh bGxvb24NZ28gY2FyZCAiZW51bWVyYXRpb24iICYmIChmaWVsZCBpZCA4KQ1lbmQgaWYN ZW5kIG1vdXNlVXAAAADWABkBAADdAAYA8ABRgAUAAAAAAAEAAAAMAAAAEE9wdGlvbmFs AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhp cyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgb3IgcmVxdWlyZWQuIg1lbmQgTW91c2VXaXRo aW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUg b2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAA3gAaAQAAygAGANwANYAFAAAAAAABAAAADAAA ABBMaXN0AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiSWYgdGhpcyBpcyBvbiwg dGhlbiB0aGUgcGFyYW1ldGVyIGlzIGEgbGlzdCBvZiIgwg0mJiBmaWVsZCBpZCA4ICYg Ii4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdl dCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAA9gAbAQAAygBk ANwAnoAFAAAAAAABAAAADAAAABBFbnVtAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9v biAiSWYgdGhpcyBpcyBvbiwgdGhlbiB0aGUgcGFyYW1ldGVyIGlzIGFuIGVudW1lcmF0 ZWQgd2l0aCBlbnVtZXJhdGlvbiBpZCIgwg0mJiBmaWVsZCBpZCA4ICYgIi4iDWVuZCBN b3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3Qg KGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAABQAAcAQAA3QBkAPAA0oAFAAAA AAABAAAADAAAABBSZXNlcnZlZAAAb24gTW91c2VXaXRoaW4NaWYgdGhlIHNob3J0IG5h bWUgb2YgbWUgaXMgIlJlc2VydmVkIiB0aGVuDVNob3dCYWxsb29uICJUaGlzIGlzIHJl c2VydmVkIGZvciBmdXR1cmUgdXNlLiINZWxzZQ1TaG93QmFsbG9vbiAiSW5kaWNhdGVz IHdoZXRoZXIgdGhpcyBldmVudCBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgdGFyZ2V0 LiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9m IHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAC2AB0B AADeAS8A7wFAAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxv b24gIlRoaXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRo aW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUg b2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAALYAHgEAAN4BQADvAVEABQAAAAAAAQAAAAwA AAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBm b3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGls aXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVw AAAAtgAfAQAA3gFRAO8BYgAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJUaGlzIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1v dXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAo aGlsaXRlIG9mIHRhcmdldCkNZW5kIG1vdXNlVXAAAAC2ACABAADeAWIA7wFzAAUAAAAA AAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgcmVz ZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXAN c2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUgb2YgdGFyZ2V0KQ1lbmQg bW91c2VVcAAAALYAIQEAAN4BcwDvAYQABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdp dGhpbg1TaG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4i DWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0 byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAAtgAiAQAA3gGEAO8B lQAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlz IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBt b3VzZVVwDXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdl dCkNZW5kIG1vdXNlVXAAAAC2ACMBAADeAZUA7wGmAAUAAAAAAAEAAAAMAAAAEAAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVy ZSB1c2UuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0 YXJnZXQgdG8gbm90IChoaWxpdGUgb2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAALYAJAEA AN4BpgDvAbcABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9v biAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhp bg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBv ZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAAtgAlAQAA3gG3AO8ByAAFAAAAAAABAAAADAAA ABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHJlc2VydmVkIGZv ciBmdXR1cmUgdXNlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxp dGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdldCkNZW5kIG1vdXNlVXAA AAD6ACYBAADeAcgA7wHZAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hv d0JhbGxvb24gIlRoaXMgaXMgcmVzZXJ2ZWQsIGJ1dCBoZXJlIHdlIGFyZSB1c2luZyBp dCB0byBkZW5vdGUgdGhlIGRhdGEgdHlwZSBpbiBQYXNjYWwvQy4iDWVuZCBNb3VzZVdp dGhpbg0Nb24gbW91c2VEb3duDS0tc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90ICho aWxpdGUgb2YgdGFyZ2V0KQ1DaG9vc2VQYXJhbVR5cGUNZW5kIG1vdXNlRG93bgAA+gAn AQAA3gHZAO8B6gAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxs b29uICJUaGlzIGlzIHJlc2VydmVkLCBidXQgaGVyZSB3ZSBhcmUgdXNpbmcgaXQgdG8g ZGVub3RlIHRoZSBkYXRhIHR5cGUgaW4gUGFzY2FsL0MuIg1lbmQgTW91c2VXaXRoaW4N DW9uIG1vdXNlRG93bg0tLXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRl IG9mIHRhcmdldCkNQ2hvb3NlUGFyYW1UeXBlDWVuZCBtb3VzZURvd24AAPoAKAEAAN4B 6gDvAfsABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAi VGhpcyBpcyByZXNlcnZlZCwgYnV0IGhlcmUgd2UgYXJlIHVzaW5nIGl0IHRvIGRlbm90 ZSB0aGUgZGF0YSB0eXBlIGluIFBhc2NhbC9DLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBt b3VzZURvd24NLS1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0 YXJnZXQpDUNob29zZVBhcmFtVHlwZQ1lbmQgbW91c2VEb3duAAIOACkBAACYAM4ArAEE oAIAAAAAAAEAAAAMAAAAEE5leHQgPgAAb24gTW91c2VXaXRoaW4NcHV0IGZpZWxkICJj dXJQYXJhbSIgaW50byBjdXJyZW50UGFyYW0NaWYgY3VycmVudFBhcmFtID0gMSB0aGVu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdldCB0aGUgZGlyZWN0IHBhcmFtZXRl ci4iDWVsc2UgaWYgbGluZSAoY3VycmVudFBhcmFtKzEpIG9mIGJrZ25kIGZpZWxkIGlk IDEwIDw+ICIiIHRoZW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ2V0IHRoZSBu ZXh0IHBhcmFtZXRlci4iDWVsc2UNU2hvd0JhbGxvb24gIlRoZXJlIGlzIG5vIG5leHQg cGFyYW1ldGVyLiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQg ZmllbGQgY3VyUGFyYW0gaW50byBjdXJyZW50UGFyYW0NaWYgbGluZSAoY3VycmVudFBh cmFtKzEpIG9mIGJrZ25kIGZpZWxkIGlkIDEwIDw+ICIiIHRoZW4NU2F2ZVBhcmFtDVNo b3dQYXJhbSBjdXJyZW50UGFyYW0rMQ1lbHNlDWJlZXANZW5kIGlmDWVuZCBtb3VzZVVw AAACPAAqAQAAmACVAKwAy6ACAAAAAAABAAAADAAAABA8IFByZXYAAG9uIE1vdXNlV2l0 aGluDXB1dCBmaWVsZCAiY3VyUGFyYW0iIGludG8gY3VycmVudFBhcmFtDWlmIGN1cnJl bnRQYXJhbSA9IDEgdGhlbg1TaG93QmFsbG9vbiAiVGhlcmUgaXMgbm8gcHJldmlvdXMg cGFyYW1ldGVyLiINZWxzZSBpZiBjdXJyZW50UGFyYW0gPSAyIHRoZW4NU2hvd0JhbGxv b24gIkNsaWNrIGhlcmUgdG8gZ2V0IHRoZSByZXN1bHQgcGFyYW1ldGVyLiINZWxzZSBp ZiBjdXJyZW50UGFyYW0gPSAzIHRoZW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8g Z2V0IHRoZSBkaXJlY3QgcGFyYW1ldGVyLiINZWxzZQ1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBnZXQgdGhlIHByZXZpb3VzIHBhcmFtZXRlci4iDWVuZCBpZg1lbmQgTW91 c2VXaXRoaW4NDW9uIG1vdXNlVXANcHV0IGZpZWxkICJjdXJQYXJhbSIgaW50byBjdXJy ZW50UGFyYW0NaWYgY3VycmVudFBhcmFtID4gMSB0aGVuDVNhdmVQYXJhbQ1TaG93UGFy YW0gY3VycmVudFBhcmFtLTENSE1SZW1vdmVCYWxsb29uDWVsc2UNYmVlcA1lbmQgaWYN ZW5kIG1vdXNlVXAAAAEyACsBAACYAFcArACNoAQAAAAAAAEAAAAMAAAAEE5ldwAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gYWRkIGEgbmV3IHBh cmFtZXRlci4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQgZmllbGQgImN1 clBhcmFtIiBpbnRvIGN1cnJlbnRQYXJhbQ1TYXZlUGFyYW0NcHV0IDEgKyBudW1iZXIg b2YgbGluZXMgb2YgYmtnbmQgZmllbGQgaWQgMTAgaW50byBuDXB1dCAiLD8/Pz8sPz8/ PywwLCIgaW50byBsaW5lIG4gb2YgYmtnbmQgZmllbGQgaWQgMTANU2hvd1BhcmFtIG4N ZW5kIG1vdXNlVXAAAALAACwBAACYAVoArAGQoAQAAAAAAAEAAAAMAAAAEERlbGV0ZQAA b24gTW91c2VXaXRoaW4NcHV0IGZpZWxkICJjdXJQYXJhbSIgaW50byBjdXJyZW50UGFy YW0NaWYgY3VycmVudFBhcmFtIDw9IDIgdGhlbg1TaG93QmFsbG9vbiAiVG8gZGVsZXRl IHRoZSBkaXJlY3QvcmVzdWx0IHBhcmFtZXRlciwgY2hhbmdlIGRhdGEgdHlwZSB0byBu dWxsIHJhdGhlciB0aGFuIGNsaWNraW5nIGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJD bGljayBoZXJlIHRvIGRlbGV0ZSB0aGlzIHBhcmFtZXRlci4iDWVuZCBpZg1lbmQgTW91 c2VXaXRoaW4NDW9uIG1vdXNlVXANYW5zd2VyICJEZWxldGUgdGhpcyBwYXJhbWV0ZXI/ IiB3aXRoICJPSyIgb3IgIkNhbmNlbCINaWYgaXQgaXMgIkNhbmNlbCIgdGhlbiBleGl0 IG1vdXNlVXANcHV0IGZpZWxkICJjdXJQYXJhbSIgaW50byBjdXJyZW50UGFyYW0NaWYg Y3VycmVudFBhcmFtID4gMiB0aGVuDWRlbGV0ZSBsaW5lIGN1cnJlbnRQYXJhbSBvZiBi a2duZCBmaWVsZCBpZCAxMA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGJrZ25kIGZpZWxk IGlkIDEwIGludG8gbg1pZiBjdXJyZW50UGFyYW0gPiBuIHRoZW4Nc3VidHJhY3QgMSBm cm9tIGN1cnJlbnRQYXJhbQ1lbmQgaWYNU2hvd1BhcmFtIGN1cnJlbnRQYXJhbQ1lbHNl DXB1dCAibnVsbCIgaW50byBia2duZCBmaWVsZCBpZCA4DWVuZCBpZg1lbmQgbW91c2VV cAAAAVIALQEAAJgBHACsAVKgBAAAAAAAAQAAAAwAAAAQSW5zZXJ0AABvbiBNb3VzZVdp dGhpbg1TaG93QmFsbG9vbiAiQWRkIGEgbmV3IHBhcmFtZXRlciBhZnRlciB0aGlzIG9u ZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQgZmllbGQgImN1clBhcmFt IiBpbnRvIGN1cnJlbnRQYXJhbQ1pZiBjdXJyZW50UGFyYW0gPSAxIHRoZW4NcHV0IDIg aW50byBjdXJyZW50UGFyYW0NZW5kIGlmDXB1dCByZXR1cm4gJiAiLD8/Pz8sPz8/Pyww LCIgYWZ0ZXIgbGluZSBjdXJyZW50UGFyYW0gb2YgYmtnbmQgZmllbGQgaWQgMTANU2hv d1BhcmFtIGN1cnJlbnRQYXJhbSsxDWVuZCBtb3VzZVVwAAAB6gAuAQAAcQACAIUAWKAE AAAAAAABAAAADAAAABBIaWRlIHNjcmlwdAAAb24gTW91c2VXaXRoaW4NaWYgdGhlIHNo b3J0IG5hbWUgb2YgbWUgaXMgIlNob3cgU2NyaXB0IiB0aGVuDVNob3dCYWxsb29uICJT aG93IHRoZSBzY3JpcHQgZm9yIHRoaXMgZXZlbnQuIg1lbHNlDVNob3dCYWxsb29uICJI aWRlIHRoZSBzY3JpcHQgZm9yIHRoaXMgZXZlbnQuIg1lbmQgaWYNZW5kIE1vdXNlV2l0 aGluDQ1vbiBtb3VzZVVwDWlmIHRoZSBzaG9ydCBuYW1lIG9mIG1lIGlzICJTaG93IFNj cmlwdCIgdGhlbg1TYXZlUGFyYW0NSE1SZW1vdmVCYWxsb29uDXNob3cgZmllbGQgInNj cmlwdFRlbXBsYXRlIg1zZXQgdGhlIG5hbWUgb2YgbWUgdG8gIkhpZGUgU2NyaXB0Ig1l bHNlDUhNUmVtb3ZlQmFsbG9vbg1TaG93UGFyYW0gMQ1oaWRlIGZpZWxkICJzY3JpcHRU ZW1wbGF0ZSINc2V0IHRoZSBuYW1lIG9mIG1lIHRvICJTaG93IFNjcmlwdCINZW5kIGlm DWVuZCBtb3VzZVVwDQAAAo4AMAIFAIcAAQFTAfsABwAAAAAAAAADAAwAAAAQc2NyaXB0 VGVtcGxhdGUAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBp bnRlcmZhY2UgdG8gdGhlIGV2ZW50IGluIHlvdXIgcHJlZmVyZWQiIMINJiYgImxhbmd1 YWdlLiBUbyBlZGl0IGEgcGFyYW1ldGVyIGNsaWNrIG9uIHRoZSBwYXJhbWV0ZXIuIg1l bmQgTW91c2VXaXRoaW4NDW9uIG1vdXNldXANSE1SZW1vdmVCYWxsb29uDWdsb2JhbCBj bGllbnRMYW5nDWlmIG1lID0gIiIgdGhlbg1wdXQgMiBpbnRvIGluZGV4DWVsc2UNcHV0 IHdvcmQgMiBvZiB0aGUgY2xpY2tMaW5lIGludG8gaW5kZXgNcHV0IGZpZWxkICJwYXJh bUluZm8iIGludG8geA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHggaW50byBuDWlmIChp bmRleCA+IDEpIGFuZCAoaXRlbSAzIG9mIGxpbmUgMiBvZiB4ID0gIm51bGwiKSB0aGVu IGFkZCAxIHRvIGluZGV4DWlmIGluZGV4ID4gbiB0aGVuIHB1dCBuIGludG8gaW5kZXgN ZW5kIGlmDWlmIHRoZXJlIGlzIGEgYmcgYnRuICJIaWRlIFNjcmlwdCIgdGhlbiBzZXQg dGhlIG5hbWUgb2YgYmcgYnRuICJIaWRlIFNjcmlwdCIgdG8gIlNob3cgU2NyaXB0Ig1o aWRlIGZpZWxkICJzY3JpcHRUZW1wbGF0ZSINU2hvd1BhcmFtIGluZGV4DWVuZCBtb3Vz ZXVwDQ0AACoAMQKVAUQAAQFVABgAAgAAAAAAAAADAAwAAAAQY3VyUGFyYW0AAAAAACIA MgINABkAAAA0AF4AAAAAAAAAAAAVABgIAAAgAAAAAAFqADQBAAA6AbQAUgHSIAAAAAP2 AAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUg dG8gZ28gdG8gdGhlIHByZXZpb3VzIGV2ZW50IGluIHRoaXMgc3VpdGUuIg1lbmQgTW91 c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2V0IHRoZXJlIGlzIGEgY2FyZCAyIG9mIHRoaXMg YmtnbmQNaWYgbm90IGl0IHRoZW4gZXhpdCBtb3VzZVVwDXB1dCB0aGUgc2hvcnQgbmFt ZSBvZiBjYXJkIDIgb2YgdGhpcyBia2duZCBpbnRvIHgNaWYgdGhlIHNob3J0IG5hbWUg b2YgdGhpcyBjYXJkIDw+IHggdGhlbg12aXN1YWwgd2lwZSByaWdodA1nbyBwcmV2IGNh cmQgb2YgdGhpcyBia2duZA1lbmQgaWYNZW5kIG1vdXNlVXAAASgANQEAADoB1QBSAfMg AAAAA/UAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBnbyB0byB0aGUgbmV4dCBldmVudCBpbiB0aGlzIHN1aXRlLiINZW5kIE1v dXNlV2l0aGluDQ1vbiBtb3VzZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBsYXN0IGNh cmQgb2YgdGhpcyBia2duZCBpbnRvIHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBj YXJkIDw+IHggdGhlbg12aXN1YWwgd2lwZSBsZWZ0DWdvIG5leHQgY2FyZCBvZiB0aGlz IGJrZ25kDWVuZCBpZg1lbmQgbW91c2VVcAACtgA3AQAAHQE+ADMBopAFAAAAAAABAAAA DAAAABBmcm9tIEFFVVQAAG9uIE1vdXNlV2l0aGluDWlmIGhpbGl0ZSBvZiBtZSB0aGVu DVNob3dCYWxsb29uICJUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBldmVudCBjb21l cyBmcm9tIHRoZSBhZXV0IHJlc291cmNlLiIgwg0mJiAiSWYgeW91IG1vZGlmeSB0aGUg ZXZlbnQsIHlvdSBzaG91bGQgY2xpY2sgaGVyZSBzbyB0aGF0IHRoZSBldmVudCIgwg0m JiAiZ29lcyB0byB0aGUgYWV0ZSByZXNvdXJjZS4iDWVsc2UNU2hvd0JhbGxvb24gIlRo aXMgc2hvd3MgdGhlIGV2ZW50IGNvbWVzIGZyb20gdGhlIGFldGUgcmVzb3VyY2UuIiDC DSYmICJUaGVyZSBpcyBubyByZWFzb24gdG8gbWFyayBpdCBhcyBjb21pbmcgZnJvbSB0 aGUgYWV1dCByZXNvdXJjZS4iIMINJiYgIklmIHlvdSBpbnNpc3Qgb24gY2hhbmdpbmcg aXQsIGNsaWNrIGhlcmUgd2l0aCBvcHRpb24ga2V5IGRvd24uIiDCDSYmICJJdCB3aWxs IG5vdCBiZSB3cml0dGVuIHRvIHRoZSBhZXRlIHJlc291cmNlLiINZW5kIGlmDWVuZCBN b3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQgaGlsaXRlIG9mIHRhcmdldCBpbnRvIGN1 clN0YXRlDWlmIGN1clN0YXRlIG9yICh0aGUgb3B0aW9uS2V5IGlzIGRvd24pIHRoZW4N c2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IGN1clN0YXRlDWVuZCBpZg1lbmQgbW91 c2VVcA0AACgAOQEAAB8A0gAxAP6AAAAAAAAAAQAAAAwAAAAQQ2xhc3M6AAAAAAD4ADsB AAARAcEAOAHooAAAABpAAAEAAAAMAAAAEEdvIEJhY2sAAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhlIGNhcmQgeW91IGxh c3QgdmlzaXRlZCLCDSYmInRoaXMgc2Vzc2lvbi4iDWVuZCBNb3VzZVdpdGhpbg0Nb24g bW91c2VVcA1nbG9iYWwgZ1doZXJlZnJvbQ1ITVJlbW92ZUJhbGxvb24NdmlzdWFsIGRp c3NvbHZlIGZhc3QNZ28gZ1doZXJlRnJvbQ1lbmQgbW91c2VVcA0ABcwAPQGAAHEAEQCF AEugBAAAAAAAAQAAAAwAAAAQU2VuZCBpdAAAb24gTW91c2VXaXRoaW4NU2hvd1BzdHJC YWxsb29uICJUaGlzIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBpbiB0aGUgZmluYWwg dmVyc2lvbi4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1wdXQgUmVzVHlwZShm aWVsZCAiZXZlbnRDbGFzcyIpICYgUmVzVHlwZShmaWVsZCAiZXZlbnRJRCIpIGludG8g ZXZlbnRJRA1wdXQgKGZpZWxkICJldmVudE5hbWUiKSAmICIsIiAmIGV2ZW50SUQgaW50 byBldmVudE5hbWUNcHV0IGZpZWxkICJwYXJhbUluZm8iIGludG8gcGFyYW1JbmZvDWRl bGV0ZSBsaW5lIDEgb2YgcGFyYW1JbmZvDXB1dCAiLS0tLSIgaW50byBpdGVtIDIgb2Yg cGFyYW1JbmZvDXB1dCBldmVudElEIGludG8gaXRlbSAxIG9mIHBhcmFtSW5mbw1zZXQg bG9ja3NjcmVlbiB0byB0cnVlIC0tIHNvIHdlIGNhbiBzZWUgdGhlIGZpZWxkIGxhdGVy DWdvIGNhcmQgIlNlbmRBRSINaWYgdGhlIHJlc3VsdCA9ICIiIHRoZW4NcHV0IHdvcmQg MSBvZiBzaG9ydCBuYW1lIG9mIGNhcmQgYnV0dG9uIGlkIDQxICYgc3BhY2UgYmVmb3Jl IGV2ZW50TmFtZQ1zZXQgbmFtZSBvZiBjYXJkIGJ1dHRvbiBpZCA0MSB0byBldmVudE5h bWUNcHV0IHBhcmFtSW5mbyBpbnRvIGNhcmQgZmllbGQgInBhcmFtSW5mbyINcHV0IDEg aW50byBjdXJGaWVsZA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHBhcmFtSW5mbyBpbnRv IHBhcmFtQ291bnQNcmVwZWF0IHdpdGggcGFyYW1JbmRleCA9IDEgdG8gcGFyYW1Db3Vu dA1pZiAocGFyYW1JbmRleCA9IDEpIHRoZW4NaWYgKGl0ZW0gMyBvZiBsaW5lIDEgb2Yg cGFyYW1JbmZvIDw+ICJudWxsIikgdGhlbg1pZiAoaXRlbSA0IG9mIGxpbmUgMSBvZiBw YXJhbUluZm8pID4gMzI2MzcgdGhlbg1wdXQgIltkaXJlY3QgcGFyYW1ldGVyXSIgaW50 byBjYXJkIGZpZWxkIGlkIDENZWxzZQ1wdXQgImRpcmVjdCBwYXJhbWV0ZXIiIGludG8g Y2FyZCBmaWVsZCBpZCAxDWVuZCBpZg1hZGQgMSB0byBjdXJGaWVsZA1lbmQgaWYNZWxz ZQ1wdXQgbGluZSBwYXJhbUluZGV4IG9mIHBhcmFtSW5mbyBpbnRvIHgNaWYgKGl0ZW0g NCBvZiB4KSA+IDMyNjM3IHRoZW4NcHV0ICJbIiAmIChpdGVtIDEgb2YgeCkgJiAiXSIg aW50byBjYXJkIGZpZWxkIGlkIGN1ckZpZWxkDWVsc2UNcHV0IGl0ZW0gMSBvZiB4IGlu dG8gY2FyZCBmaWVsZCBpZCBjdXJGaWVsZA1lbmQgaWYNYWRkIDEgdG8gY3VyRmllbGQN ZW5kIGlmDWVuZCByZXBlYXQNcmVwZWF0IHdpdGggaSA9IDEgdG8gY3VyRmllbGQNc2hv dyBjYXJkIGZpZWxkIGlkIGkNcHV0ICIiIGludG8gY2FyZCBmaWVsZCBpZCAoaSsyMCkN c2hvdyBjYXJkIGZpZWxkIGlkIChpKzIwKQ1lbmQgcmVwZWF0DXJlcGVhdCB3aXRoIGkg PSBjdXJGaWVsZCB0byAyMA1oaWRlIGNhcmQgZmllbGQgaWQgaQ1oaWRlIGNhcmQgZmll bGQgaWQgKGkrMjApDWVuZCByZXBlYXQNZW5kIGlmDWVuZCBtb3VzZVVwAAAA+AA+AYAA cQABAIUAV6AEAAAAAAABAAAADAAAABBTaG93IFNjcmlwdAAAb24gTW91c2VXaXRoaW4N U2hvd0JhbGxvb24gIkhpZGUgdGhlIHNjcmlwdCBmb3IgdGhpcyBldmVudC4iDWVuZCBN b3VzZVdpdGhpbg0Nb24gbW91c2VVcA0tLSBTYXZlUGFyYW0NSE1SZW1vdmVCYWxsb29u DVNob3dQYXJhbSAxDWhpZGUgZmllbGQgInNjcmlwdFRlbXBsYXRlIg1zaG93IGJnIGJ0 biAiU2hvdyBTY3JpcHQiDWhpZGUgbWUNZW5kIG1vdXNlVXANAAAPAAYARXZlbnQAEQAD AElEAAASAAwARGVzY3JpcHRpb24AFwAMAERlc2NyaXB0aW9uABMACwBQYXJhbWV0ZXJz AAAUAAUATmFtZQAAFQAIAEtleXdvcmQAMgAHAEV2ZW50cwBldmVudHMAb24gb3BlbmNh cmQNZ2xvYmFsIGluRWRpdA1pZiBpbkVkaXQgdGhlbg1nbG9iYWwgY3VycmVudFN1aXRl LGN1cnJlbnROYW1lDVB1dCBmaWVsZCAic3VpdGVDb2RlIiBpbnRvIGN1cnJlbnRTdWl0 ZQ1wdXQgZmllbGQgImV2ZW50TmFtZSIgaW50byBjdXJyZW50TmFtZQ1pZiBmaWVsZCAi ZXZlbnROYW1lIiA9ICIiIHRoZW4gLS0gZXZlbnQgbm90IHlldCBkZWZpbmVkDWhpZGUg ZmllbGQgInNjcmlwdFRlbXBsYXRlIg1zZXQgdGhlIG5hbWUgb2YgYmcgYnV0dG9uIGlk IDQ2IHRvICJTaG93IHNjcmlwdCINU2hvd1BhcmFtIDENZWxzZQ1zaG93IGZpZWxkICJz Y3JpcHRUZW1wbGF0ZSINc2V0IHRoZSBuYW1lIG9mIGJnIGJ1dHRvbiBpZCA0NiB0byAi SGlkZSBzY3JpcHQiDWVuZCBpZg1lbmQgaWYNUGFzcyBvcGVuY2FyZA1lbmQgb3BlbmNh cmQNDW9uIGNsb3NlY2FyZA1nbG9iYWwgaW5FZGl0DWlmIGZsZCBFdlBhcmFtTmFtZSBp cyBlbXB0eSB0aGVuDXB1dCAibWlzc2luZ05hbWUiJiIoIiZyYW5kb20oNTAwKSYiKSIg aW50byBmbGQgRXZQYXJhbU5hbWUNZW5kIGlmDWlmIGluRWRpdCB0aGVuDWlmIGZpZWxk ICJzdWl0ZUNvZGUiIDw+ICIqKioqIiB0aGVuDWdsb2JhbCBjdXJyZW50U3VpdGUsY3Vy cmVudE5hbWUNaWYgY3VycmVudFN1aXRlIDw+IGZpZWxkICJzdWl0ZUNvZGUiIHRoZW4N cHV0ICJzdWl0ZSIgJiYgZmllbGQgInN1aXRlQ29kZSIgaW50byBzdWl0ZU5hbWUNaWYg bm90ICh0aGVyZSBpcyBhIGNhcmQgc3VpdGVOYW1lKSB0aGVuDXB1dCBjdXJyZW50U3Vp dGUgaW50byBmaWVsZCAic3VpdGVDb2RlIg1hbnN3ZXIgc3VpdGVOYW1lICYgImRvZXMg bm90IGV4aXN0IGFuZCB3aWxsIG5vdCBiZSB1c2VkIg1lbmQgaWYNZW5kIGlmDWlmIG5v dCB0aGUgdmlzaWJsZSBvZiBmaWVsZCAic2NyaXB0VGVtcGxhdGUiIHRoZW4NU2F2ZVBh cmFtDXNob3cgZmllbGQgInNjcmlwdFRlbXBsYXRlIg1pZiB0aGVyZSBpcyBhIGJnIGJ0 biAic2hvdyBzY3JpcHQiIHRoZW4Nc2V0IHRoZSBuYW1lIG9mIGJnIGJ0biAic2hvdyBz Y3JpcHQiIHRvICJIaWRlIHNjcmlwdCINZW5kIGlmDWVuZCBpZg1wdXQgY3VycmVudFN1 aXRlICYmIChzaG9ydCBuYW1lIG9mIHRoaXMgY2FyZCkgJiAiLCIgJiBjdXJyZW50TmFt ZSBpbnRvIG9sZE5hbWUNcHV0IGZpZWxkICJzdWl0ZUNvZGUiICYmICJldmVudCIgJiYg UmVzVHlwZShmaWVsZCAiZXZlbnRDbGFzcyIpIMINJiBSZXNUeXBlKGZpZWxkICJldmVu dElEIikgJiAiLCIgJiBmaWVsZCAiZXZlbnROYW1lIiBpbnRvIG5ld05hbWUNaWYgbmV3 TmFtZSA8PiBvbGROYW1lIHRoZW4NTmFtZUl0IG5ld05hbWUNQ2hhbmdlTmFtZSBvbGRO YW1lLCBuZXdOYW1lLCAiZXZlbnRMaXN0Ig1lbmQgaWYNUHV0IGZpZWxkICJzdWl0ZUNv ZGUiIGludG8gY3VycmVudFN1aXRlDWVuZCBpZg1QYXNzIGNsb3NlY2FyZA1lbmQgaWYN ZW5kIGNsb3NlY2FyZA0Nb24gbmV3Y2FyZA1nbG9iYWwgY3VycmVudFN1aXRlDXB1dCBj dXJyZW50U3VpdGUgaW50byBmaWVsZCBzdWl0ZUNvZGUNaWYgY3VycmVudFN1aXRlID0g ImNvcmUiIHRoZW4NcHV0ICJhZXZ0IiBpbnRvIGZpZWxkIGV2ZW50Q2xhc3MNZWxzZQ1w dXQgY3VycmVudFN1aXRlIGludG8gZmllbGQgZXZlbnRDbGFzcw1lbmQgaWYNcHV0ICIs LG51bGwsMCwiIGludG8gbGluZSAxIG9mIGZpZWxkIGlkIDEwDXB1dCAiLCxudWxsLDAs IiBpbnRvIGxpbmUgMiBvZiBmaWVsZCBpZCAxMA1QYXNzIG5ld2NhcmQNZW5kIG5ld2Nh cmQNDW9uIGRlbGV0ZWNhcmQNQ2hhbmdlTmFtZSBmaWVsZCAic3VpdGVDb2RlIiAmJiBz aG9ydCBuYW1lIG9mIHRoaXMgY2FyZCAmICIsIiAgJiBmaWVsZCAiZXZlbnROYW1lIiwg wg0iIiwgImV2ZW50TGlzdCINcGFzcyBkZWxldGVjYXJkDWVuZCBkZWxldGVjYXJkDQ1v biBTaG93UGFyYW0gbg1wdXQgbiBpbnRvIGZpZWxkIGN1clBhcmFtDXB1dCBsaW5lIG4g b2YgZmllbGQgaWQgMTAgaW50byB4DXB1dCBpdGVtIDMgb2YgeCBpbnRvIGZpZWxkIGlk IDgNUmFkaW9BcnJheSBpdGVtIDQgb2YgeA1pZiBuIDwgMyB0aGVuDWlmIG4gPSAyIHRo ZW4NcHV0ICJkaXJlY3Qgb2JqZWN0IiBpbnRvIGZpZWxkIGlkIDYNcHV0ICItLS0tIiBp bnRvIGZpZWxkIGlkIDcNc2V0IG5hbWUgb2YgYmcgYnV0dG9uIGlkIDI4IHRvICJDaGFu Z2UgU3RhdGUiDWVsc2UNcHV0ICJyZXBseSIgaW50byBmaWVsZCBpZCA2DXB1dCAicnBs eSIgaW50byBmaWVsZCBpZCA3DXNldCBuYW1lIG9mIGJnIGJ1dHRvbiBpZCAyOCB0byAi UmVzZXJ2ZWQiDWVuZCBpZg1zZXQgbG9ja3RleHQgb2YgZmllbGQgaWQgNiB0byB0cnVl DXNldCBsb2NrdGV4dCBvZiBmaWVsZCBpZCA3IHRvIHRydWUNZWxzZQ1zZXQgbmFtZSBv ZiBiZyBidXR0b24gaWQgMjggdG8gIlJlc2VydmVkIg1wdXQgaXRlbSAxIG9mIHggaW50 byBmaWVsZCBpZCA2DXB1dCBpdGVtIDIgb2YgeCBpbnRvIGZpZWxkIGlkIDcNc2V0IGxv Y2t0ZXh0IG9mIGZpZWxkIGlkIDYgdG8gZmFsc2UNc2V0IGxvY2t0ZXh0IG9mIGZpZWxk IGlkIDcgdG8gZmFsc2UNZW5kIGlmDWRlbGV0ZSBpdGVtIDEgdG8gNCBvZiB4DXB1dCB4 IGludG8gYmtnbmQgZmllbGQgaWQgOQ1lbmQgU2hvd1BhcmFtDQ1vbiBTYXZlUGFyYW0N cHV0IGZpZWxkICJjdXJQYXJhbSIgaW50byBjdXJyZW50UGFyYW0NcHV0IGxpbmUgY3Vy cmVudFBhcmFtIG9mIGJrZ25kIGZpZWxkIGlkIDEwIGludG8gb2xkVmFsdWUNaWYgY3Vy cmVudFBhcmFtIDwgMyB0aGVuDXB1dCAiIiBpbnRvIGl0ZW0gMSBvZiB4DXB1dCAiIiBp bnRvIGl0ZW0gMiBvZiB4DWVsc2UNcHV0IGZpZWxkIGlkIDYgaW50byBpdGVtIDEgb2Yg eA1wdXQgZmllbGQgaWQgNyBpbnRvIGl0ZW0gMiBvZiB4DWVuZCBpZg1wdXQgZmllbGQg aWQgOCBpbnRvIGl0ZW0gMyBvZiB4DXB1dCAwIGludG8gbg1yZXBlYXQgd2l0aCBpID0g MjUgdG8gNDANbXVsdGlwbHkgbiBieSAyDWlmIGhpbGl0ZSBvZiBia2duZCBidXR0b24g aWQgaSB0aGVuDWFkZCAxIHRvIG4NZW5kIGlmDWVuZCByZXBlYXQNcHV0IG4gaW50byBp dGVtIDQgb2YgeA1wdXQgYmtnbmQgZmllbGQgaWQgOSBpbnRvIHkNLS0gd2UgbXVzdCBy ZW1vdmUgYWxsIGNhcnJpYWdlIHJldHVybiBmcm9tIHRoZSBjb21tYSBmaWVsZA1yZXBl YXQgdW50aWwgaSA9IDANcHV0IG9mZnNldChyZXR1cm4sIHkpIGludG8gaQ1pZiBpID4g MCB0aGVuIHB1dCBzcGFjZSBpbnRvIGNoYXIgaSBvZiB5DWVuZCByZXBlYXQNcHV0IHgg JiAiLCIgJiB5IGludG8gbmV3VmFsdWUNaWYgKG9sZFZhbHVlIDw+IG5ld1ZhbHVlKSBv ciAoZmllbGQgInNjcmlwdFRlbXBsYXRlIiA9ICIiKSB0aGVuDXB1dCBuZXdWYWx1ZSBp bnRvIGxpbmUgY3VycmVudFBhcmFtIG9mIGJrZ25kIGZpZWxkIGlkIDEwDU1ha2VTY3Jp cHRUZW1wbGF0ZQ1lbmQgaWYNZW5kIFNhdmVQYXJhbQ0Nb24gTWFrZVNjcmlwdFRlbXBs YXRlDXB1dCBDbGllbnRUZW1wbGF0ZSgibXVsdGlMaW5lIikgaW50byBmaWVsZCAic2Ny aXB0VGVtcGxhdGUiDWVuZCBNYWtlU2NyaXB0VGVtcGxhdGUNDW9uIFJhZGlvQXJyYXkg bg1yZXBlYXQgd2l0aCBpID0gMSB0byAxNg1pZiAobiBtb2QgMikgPSAxIHRoZW4Nc2V0 IGhpbGl0ZSBvZiBia2duZCBidXR0b24gaWQgKDQxLWkpIHRvIHRydWUNZWxzZQ1zZXQg aGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiBpZCAoNDEtaSkgdG8gZmFsc2UNZW5kIGlmDXB1 dCBuIGRpdiAyIGludG8gbg1lbmQgcmVwZWF0DWVuZCBSYWRpb0FycmF5DQ1vbiBHdWVz c1BhcmFtVHlwZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBvciB3aGljaCBw YXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgZmllbGQgInBhcmFtSW5mbyIgaW50 byBwYXJhbUluZm8NcHV0IG51bWJlciBvZiBsaW5lcyBpbiBwYXJhbUluZm8gaW50byBu DXJlcGVhdCB3aXRoIGluZGV4ID0gMSB0byBuDXB1dCBsaW5lIGluZGV4IG9mIHBhcmFt SW5mbyBpbnRvIHkNcHV0IGl0ZW0gMyBvZiB5IGludG8gZGF0YVR5cGUNaWYgKGRhdGFU eXBlIDw+ICJudWxsIikgdGhlbg1wdXQgaXRlbSA0IG9mIHkgaW50byB0ZW1wDXB1dCBp dGVtIDMgb2YgeSBpbnRvIGRhdGFUeXBlDWlmIHRlbXAgPiAzMjc2NyB0aGVuDXN1YnRy YWN0IDMyNzY4IGZyb20gdGVtcA1lbmQgaWYNaWYgdGVtcCA+IDE2MzgzIHRoZW4NcHV0 ICJsaXN0IiBpbnRvIGRhdGFUeXBlDWVsc2UgaWYgdGVtcCA+IDgxOTEgdGhlbg1wdXQg ImVudW0iIGludG8gZGF0YVR5cGUNZW5kIGlmDXB1dCAwIGludG8gcGFyYW1UeXBlDWlm IGRhdGFUeXBlID0gIlRFWFQiIHRoZW4NcHV0IDYgaW50byBwYXJhbVR5cGUNZWxzZSBp ZiAoZGF0YVR5cGUgPSAiZW51bSIpIG9yIChkYXRhVHlwZSA9ICJib29sIikgb3IgKGRh dGFUeXBlID0gInRydWUiKSBvciAoZGF0YVR5cGUgPSAibG9uZyIpIHRoZW4NcHV0IDQg aW50byBwYXJhbVR5cGUNZW5kIGlmDXB1dCBpdGVtIDQgb2YgeSBpbnRvIHRlbXANcHV0 IHRlbXAgLSAodGVtcCBtb2QgOCkgKyBwYXJhbVR5cGUgaW50byBpdGVtIDQgb2YgeQ1w dXQgeSBpbnRvIGxpbmUgaW5kZXggb2YgcGFyYW1JbmZvDWVuZCBpZg1lbmQgcmVwZWF0 DXB1dCBwYXJhbUluZm8gaW50byBmaWVsZCAicGFyYW1JbmZvIg1lbmQgR3Vlc3NQYXJh bVR5cGUNDWZ1bmN0aW9uIEdsdWVJbmZvIHBhcmFtSW5mbw1wdXQgIi0tLS0iIGludG8g ZGFzaA1wdXQgInRoZVJlc3VsdCIgaW50byBpdGVtIDEgb2YgcGFyYW1JbmZvDXB1dCBk YXNoIGludG8gaXRlbSAyIG9mIHBhcmFtSW5mbw1wdXQgImRpcmVjdFBhcmFtIiBpbnRv IGl0ZW0gMSBvZiBsaW5lIDIgb2YgcGFyYW1JbmZvDXB1dCAiLS0tLSIgaW50byBpdGVt IDIgb2YgbGluZSAyIG9mIHBhcmFtSW5mbw1wdXQgbnVtYmVyIG9mIGxpbmVzIG9mIHBh cmFtSW5mbyBpbnRvIG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbg1zZXQgY3Vyc29yIHRv IGJ1c3kNcHV0IGxpbmUgaSBvZiBwYXJhbUluZm8gaW50byB4DXB1dCBpdGVtIDQgb2Yg eCBpbnRvIHRlbXANcHV0IHRlbXAgbW9kIDggaW50byBwYXJhbVR5cGUNcHV0IGl0ZW0g MyBvZiB4IGludG8gZGF0YVR5cGUNaWYgdGVtcCA+IDMyNzY3IHRoZW4NcHV0ICIsbyIg YWZ0ZXIgaXRlbSA0IG9mIHgNcHV0IHRydWUgaW50byBpc09wdGlvbmFsDXN1YnRyYWN0 IDMyNzY4IGZyb20gdGVtcA1lbHNlDXB1dCAiLHIiIGFmdGVyIGl0ZW0gNCBvZiB4DXB1 dCBmYWxzZSBpbnRvIGlzT3B0aW9uYWwNZW5kIGlmDWlmIHRlbXAgPiAxNjM4MyB0aGVu DXB1dCAibGlzdCIgaW50byBkYXRhVHlwZQ1lbHNlIGlmIHRlbXAgPiA4MTkxIHRoZW4N cHV0ICJlbnVtIiBpbnRvIGRhdGFUeXBlDWVuZCBpZg1pZiAoZGF0YVR5cGUgPSAib2Jq Iikgb3IgKGRhdGFUeXBlID0gImxpc3QiKSBvciAoZGF0YVR5cGUgPSAiKioqKiIpIHRo ZW4NaWYgcGFyYW1UeXBlIDw+IDIgdGhlbg1wdXQgMCBpbnRvIHBhcmFtVHlwZQ1lbmQg aWYNZW5kIGlmDWlmIChwYXJhbVR5cGUgPSA2KSB0aGVuDWlmIGRhdGFUeXBlIDw+ICJU RVhUIiB0aGVuDXB1dCAwIGludG8gcGFyYW1UeXBlDWVuZCBpZg1lbHNlIGlmIChwYXJh bVR5cGUgPSA1KSBvciAocGFyYW1UeXBlID0gNykgdGhlbg1pZiBpID0gMSB0aGVuIHB1 dCAwIGludG8gcGFyYW1UeXBlDWVuZCBpZg1pZiBpdGVtIDIgb2YgeCA9IGRhc2ggdGhl bg1wdXQgImtleURpcmVjdE9iamVjdCIgaW50byBpdGVtIDIgb2YgeA1lbHNlDS0tIHB1 dCAia2V5QUUiICYgU3RyaXBTUChpdGVtIDEgb2YgeCkgaW50byBpdGVtIDIgb2YgeA1w dXQgIiciICYgUmVzVHlwZShpdGVtIDIgb2YgeCkgJiAiJyIgaW50byBpdGVtIDIgb2Yg eA1lbmQgaWYNcHV0IFN0cmlwU1AoaXRlbSAxIG9mIHgsIHRydWUpIGludG8gaXRlbSAx IG9mIHgNcHV0ICJwdHJUbyIgJiBTdHJpcFNQKGl0ZW0gMSBvZiB4KSBpbnRvIGl0ZW0g NiBvZiB4DWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1wdXQgInNpemVPZiIgJiBTdHJpcFNQ KGl0ZW0gMSBvZiB4KSBpbnRvIGl0ZW0gNyBvZiB4DWVuZCBpZg1wdXQgZGF0YVR5cGUg aW50byBpdGVtIDMgb2YgeA1wdXQgcGFyYW1UeXBlIGludG8gaXRlbSA0IG9mIHgNcHV0 IHggaW50byBsaW5lIGkgb2YgcnN0DWVuZCByZXBlYXQNcmV0dXJuIHJzdA1lbmQgR2x1 ZUluZm8NDW9uIENob29zZVBhcmFtVHlwZQ1wdXQgIiIgaW50byBub3RGb3JOdWxsDWlm IGZpZWxkICJjdXJQYXJhbSIgPSAxIHRoZW4NcHV0ICIoIiBpbnRvIG5vdEZvclJlc3Vs dA1lbHNlDXB1dCAiIiBpbnRvIG5vdEZvclJlc3VsdA1lbmQgaWYNaWYgZmllbGQgaWQg OCA8PiAiVEVYVCIgdGhlbg1wdXQgIigiIGludG8gdGV4dE9ubHkNaWYgZmllbGQgaWQg OCA9ICJudWxsIiB0aGVuDXB1dCAiKCIgaW50byBub3RGb3JOdWxsDXB1dCAiKCIgaW50 byBub3RGb3JSZXN1bHQNZW5kIGlmDWVsc2UNcHV0ICIiIGludG8gdGV4dE9ubHkNZW5k IGlmDXB1dCBub3RGb3JOdWxsICYgIkRlc2NyaXB0b3IiICYgcmV0dXJuIGludG8gbWVu dQ1wdXQgbm90Rm9yTnVsbCAmICJIYW5kbGUiICYgcmV0dXJuIGFmdGVyIG1lbnUNcHV0 ICIoUmVzZXJ2ZWQiICYgcmV0dXJuIGFmdGVyIG1lbnUNcHV0ICIoUmVzZXJ2ZWQiICYg cmV0dXJuIGFmdGVyIG1lbnUNcHV0IG5vdEZvck51bGwgJiAiSW1tZWRpYXRlIiAmIHJl dHVybiBhZnRlciBtZW51DXB1dCBub3RGb3JSZXN1bHQgJiAiUG9pbnRlciBhbmQgU2l6 ZSIgJiByZXR1cm4gYWZ0ZXIgbWVudQ1wdXQgdGV4dE9ubHkgJiAiUGFzY2FsIFN0cmlu ZyIgJiByZXR1cm4gYWZ0ZXIgbWVudQ1wdXQgbm90Rm9yUmVzdWx0ICYgdGV4dE9ubHkg JiAiQyBTdHJpbmciIGFmdGVyIG1lbnUNDXB1dCAwIGludG8gbg1yZXBlYXQgd2l0aCBp ID0gMzggdG8gNDANbXVsdGlwbHkgbiBieSAyDWlmIGhpbGl0ZSBvZiBia2duZCBidXR0 b24gaWQgaSB0aGVuDWFkZCAxIHRvIG4NZW5kIGlmDWVuZCByZXBlYXQNDXNldCBjdXJz b3IgdG8gYXJyb3cNcHV0IGl0ZW0gMSBvZiBIUG9wdXBNZW51KG1lbnUsbisxLFRoZSBN b3VzZVYtMTAsVGhlIE1vdXNlSC0zKSBpbnRvIHRoZUl0ZW0NaWYgdGhlSXRlbSA8PiAi IiB0aGVuDWlmIHRoZUl0ZW0gPSAiRGVzY3JpcHRvciIgdGhlbg1wdXQgMCBpbnRvIG4N ZWxzZSBpZiB0aGVJdGVtID0gIkhhbmRsZSIgdGhlbg1wdXQgMSBpbnRvIG4NZWxzZSBp ZiB0aGVJdGVtID0gIkltbWVkaWF0ZSIgdGhlbg1wdXQgNCBpbnRvIG4NZWxzZSBpZiB0 aGVJdGVtID0gIlBvaW50ZXIgYW5kIFNpemUiIHRoZW4NcHV0IDUgaW50byBuDWVsc2Ug aWYgdGhlSXRlbSA9ICJQYXNjYWwgU3RyaW5nIiB0aGVuDXB1dCA2IGludG8gbg1lbHNl IGlmIHRoZUl0ZW0gPSAiQyBTdHJpbmciIHRoZW4NcHV0IDcgaW50byBuDWVuZCBpZg1w dXQgNCBpbnRvIG5iaXQNcmVwZWF0IHdpdGggaSA9IDM4IHRvIDQwDWlmIG4gPj0gbkJp dCB0aGVuDXN1YnRyYWN0IG5iaXQgZnJvbSBuDXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0 dG9uIGlkIGkgdG8gdHJ1ZQ1lbHNlDXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uIGlk IGkgdG8gZmFsc2UNZW5kIGlmDXB1dCBuYml0IGRpdiAyIGludG8gbmJpdA1lbmQgcmVw ZWF0DWVuZCBpZg1lbmQgQ2hvb3NlUGFyYW1UeXBlDQ0tLSBsYW5ndWFnZSBkZXBlbmRl bnQgcGFydA0NZnVuY3Rpb24gQ2xpZW50VGVtcGxhdGUgbXVsdGlMaW5lDS0tIGVpdGhl ciByZXR1cm4gdGhlIHRlbXBsYXRlIG9yIHdoaWNoIHBhcmFtZXRlciBpcyBiZWluZyBj bGlja2VkDXB1dCBzcGFjZSAmIE51bVRvQ2hhcigxOTQpICYgcmV0dXJuICYgc3BhY2Ug aW50byBjb250Q2hhcg1wdXQgZmllbGQgImV2ZW50TmFtZSIgaW50byB0ZW1wbGF0ZQ1w dXQgZmllbGQgInBhcmFtSW5mbyIgaW50byB4DXB1dCBudW1iZXIgb2YgbGluZXMgaW4g eCBpbnRvIG4NcHV0IDAgaW50byBwYXJhbUluZGV4DXJlcGVhdCB3aXRoIGluZGV4ID0g MiB0byBuDXNldCBjdXJzb3IgdG8gYnVzeQ1wdXQgbGluZSBpbmRleCBvZiB4IGludG8g eQ1wdXQgaXRlbSA0IG9mIHkgaW50byB0ZW1wDXB1dCAodGVtcCA+IDMyNzY3KSBpbnRv IGlzT3B0aW9uYWwNcHV0IHRlbXAgZGl2IDgxOTIgaW50byB0ZW1wDXB1dCAodGVtcCBt b2QgMiA9IDEpIGludG8gaXNFbnVtDXB1dCAiIiBpbnRvIGVudW1lcmF0ZWQNcHV0IChp dGVtIDMgb2YgeSA8PiAibnVsbCIpIGludG8gdXNlSXQNaWYgdXNlSXQgdGhlbg1hZGQg MSB0byBwYXJhbUluZGV4DS0tIGZvciBwcm90byBzdGF0ZW1lbnQNaWYgaXRlbSAzIG9m IHkgPSAidHJ1ZSIgdGhlbg1wdXQgInRydWUiIGludG8gdGhpc1BhcmFtDWVsc2UgaWYg aW5kZXggPSAxIHRoZW4NcHV0ICJkaXJlY3RQYXJhbSIgaW50byB0aGlzUGFyYW0NZWxz ZQ1wdXQgInBhcmFtIiBpbnRvIHRoaXNQYXJhbQ1lbmQgaWYNaWYgdXNlSXQgdGhlbg1p ZiBtdWx0aUxpbmUgPSAibXVsdGlMaW5lIiB0aGVuDXB1dCBjb250Q2hhciBhZnRlciB0 ZW1wbGF0ZQ1lbHNlDXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNaWYgaXNP cHRpb25hbCB0aGVuDXB1dCAiWyIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGluZGV4 IDw+IDEgdGhlbg1wdXQgaXRlbSAxIG9mIHkgJiBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1l bmQgaWYNaWYgaXNFbnVtIHRoZW4NcHV0IEVudW1PcHRpb24oZmllbGQgInN1aXRlQ29k ZSIsaXRlbSAzIG9mIHksZW51bWVyYXRlZCwxKSBhZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1 dCB0aGlzUGFyYW0gYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGlzT3B0aW9uYWwgdGhl bg1wdXQgIl0iIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1lbmQgaWYNZW5kIGlmIC0tIHVz ZUl0DWVuZCByZXBlYXQNcmV0dXJuIHRlbXBsYXRlDWVuZCBDbGllbnRUZW1wbGF0ZQ0A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoEJNQVAAABamAAAAAAAAAAAAAQAAAAAA AAFWAgAAAAAAAVYCAAAYAAAA6gH0AAAAAAAAAAAAAAAAAAABTED/////wf/////////A 4wSFQP/////B/////////+DjBED/////wf/////////Q4wS5hkBVVVVVwVVVVVVVVVVQ 4wRAKqqqqsGqqqqqqqqqoOMEv4G/gbqBjhJA4ysQAL+Bv4GjgYnjBME5kCAAAQgDCATj BMFEgCAAAQgBCATjBMFAsyQZxw4xOATjBMFAlKgFKQlJSATjBMFAlDAdKQlJSATjFETB lKglKQlJScAD4xQ4wZMkHScJMThAA+McQAOjheNqf/////AA42pAAEAAEACiheNqwABA AGAA4SwPgBUG4QzhLAzAFQbhDOEcDMHHhw8bZjw+YOEL4RwMwczMmZxmZmZg4QvhDMEP jM4ZmGZmZuEM4QzBDM/HH5hmfmbhDOEMwQzMA5gYZmBm4QzhHAzBzEmYmGRiZmDhC+Ec DMHHhw8YeDw+YOELAAAAAAAAAAAAAAAAAAAAAAD///8AADCgQktHRAAAGGQAAAAAAAAZ UEAAAAAAAAADAAAehQAAFdgALgA+AAAj8AAJAAAAjgB+AAECBAAcAKUAMADWAAIAAAAA AAAABAAMAQAAEFN1aXRlQ29kZQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRo aXMgaXMgdGhlIHN1aXRlIGNvZGUgb2YgdGhlIGNsYXNzLiINZW5kIE1vdXNlV2l0aGlu DQ0AAADGAAICBABAAFkAUwEJAAIAAAAAAAAABAAMAAAAEGNsYXNzTmFtZQAAb24gTW91 c2VXaXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBu YW1lIG9mIHRoaXMgY2xhc3MgaGVyZS4iDWVsc2UNU2hvd0JhbGxvb24gIlRoaXMgaXMg dGhlIG5hbWUgb2YgdGhpcyBjbGFzcy4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4NAADA AAMCBABAAUoAUwF4AAIAAAAAAAAABAAMAAAAEGNsYXNzSUQAAG9uIE1vdXNlV2l0aGlu DWlmICBtZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciB0aGUgSUQgb2YgdGhp cyBjbGFzcyBoZXJlLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhpcyBpcyB0aGUgSUQgb2Yg dGhpcyBjbGFzcy4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4AAADUAAUCBABVAFkAhQH7 AAcAAAAAAAAABAAJAAAADENsYXNzQ29tbWVudAAAb24gTW91c2VXaXRoaW4NaWYgIG1l IGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIGEgY29tbWVudCBhYm91dCB0aGlz IGNsYXNzIGhlcmUuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIGlzIGEgY29tbWVudCBh Ym91dCB0aGlzIGNsYXNzLiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0NDQAAAMYABgIE AK4AZgDBARkAAgAAAAAAAAAEAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1pZiAgbWUgaXMg IiIgdGhlbg1TaG93QmFsbG9vbiAiRW50ZXIgYSB0aGUgbmFtZSBmb3IgdGhpcyBwcm9w ZXJ0eSBoZXJlLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhpcyBpcyB0aGUgbmFtZSBvZiB0 aGlzIHByb3BlcnR5LiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbgAAALoABwIEAK4BbwDB AZ8AAgAAAAAAAAAEAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1pZiAgbWUgaXMgIiIgdGhl bg1TaG93QmFsbG9vbiAiRW50ZXIgYW4gSUQgZm9yIHRoaXMgcHJvcGVydHkuIg1lbHNl DVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBJRCBmb3IgdGhpcyBwcm9wZXJ0eS4iDWVu ZCBpZg1lbmQgTW91c2VXaXRoaW4AAOoACAIEAK4BzQDBAfsAAgAAAAAAAAAEAAwBAAAQ AABvbiBNb3VzZVdpdGhpbg1pZiBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJFbnVtIiB0 aGVuDVNob3dCYWxsb29uICJUaGUgY2xhc3Mgb2YgdGhlIHByb3BlcnR5IGlzIGFuIGVu dW1lcmF0b3IuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIGlzIHRoZSBjbGFzcyBvZiB0 aGUgcHJvcGVydHkiICYmIGZpZWxkIGlkIDYNZW5kIGlmDWVuZCBNb3VzZVdpdGhpbgAA ANoACQIEAPAAWQEgAfsABwAAAAAAAAAEAAkAAAAMAABvbiBNb3VzZVdpdGhpbg1pZiAg bWUgaXMgIiIgdGhlbg1TaG93QmFsbG9vbiAiRW50ZXIgYSBjb21tZW50IGFib3V0IHRo aXMgcHJvcGVydHkgaGVyZS4iDWVsc2UNU2hvd0JhbGxvb24gIlRoaXMgaXMgYSBjb21t ZW50IGFib3V0IHRoaXMgcHJvcGVydHkuIiAmJiBmaWVsZCBpZCA2DWVuZCBpZg1lbmQg TW91c2VXaXRoaW4NDQABRAAKAoUBLwBWAVYCAAAHAAAAAAAAAAQACQAAAAxwcm9wSW5m bwAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIGxpc3Qgb2Yg dGhlIHByb3BlcnR5IG9mIHRoaXMgY2xhc3MsIiDCDSYmICJDbGljayBvbiB0aGUgb25l IHlvdSB3aXNoIHRvIGVkaXQuIg1lbmQgTW91c2VXaXRoaW4NDW9uIE1vdXNlVXANcHV0 IHdvcmQgMiBvZiB0aGUgY2xpY2tMaW5lIGludG8gaQ1wdXQgdGhlIG51bWJlciBvZiBs aW5lcyBpbiB0YXJnZXQgaW50byBuDWlmIChpID4gMCkgYW5kIChpIDw9IG4pIHRoZW4N U2hvd1BhcmFtIGkNZW5kIGlmDWVuZCBNb3VzZVVwAAAAZAALAQAAHQB8AC8ApKAAAAAA AAABABUADAEAABBTdWl0ZQAAb24gbW91c2VVcA1nbyB0byBjYXJkICgic3VpdGUiICYm IGZpZWxkIHN1aXRlQ29kZSkNZW5kIG1vdXNlVXAAACoADwINAEIABQBRAFoAAAAAAAD/ /wAVAAwBAAAQY2xhc3NOYW1lAAAAACIAEAIdAEIBHABUAUsAAAAAAAD//wAVAAwBAAAQ AAAAAAAiABICDQBUAAkAZABaAAAAAAAAAAAAFQAMAQAAEAAAAAAAIgATAg0AjgABAKAA ZwAAAAAAAAAAABUAEAEAABUAAAAAACIAFAINALAAAADBAGcAAAAAAAD//wAVAAwBAAAQ AAAAAAAiABUCDQCwASAAwQFwAAAAAAAA//8AFQAMAQAAEAAAAAAAIgAXAg0A7wAJAP8A WgAAAAAAAP//ABUADAEAABAAAAAAARYAGAEAAK8BpQDAAcugAAAAAAAAAQAVAAwBAAAQ Q2xhc3MAAG9uIE1vdXNlV2l0aGluDWlmIGhpbGl0ZSBvZiBia2duZCBidXR0b24gIkVu dW0iIHRoZW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhlIGVudW1l cmF0aW9uIiAmJiAoZmllbGQgaWQgOCkgJiAiLiINZW5kIGlmDWVuZCBNb3VzZVdpdGhp bg0Nb24gbW91c2VVcA1ITVJlbW92ZUJhbGxvbg1nbyBjYXJkIChmaWVsZCAic3VpdGVD b2RlIikgJiYgImNsYXNzIiAmJiBmaWVsZCBpZCA4DWVuZCBtb3VzZVVwAAAAtgAZAQAA zwACAOEAH4AFAAAAAAABAAAADAAAABAwAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9v biAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhp bg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBv ZiB0YXJnZXQpDWVuZCBtb3VzZVVwAADyABoBAADPACAA4QBPgAUAAAAAAAEAAAAMAAAA EExpc3QAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJJZiB0aGlzIGJveCBpcyBj aGVja2VkLCB0aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBsaXN0IG9mIiDCDSYmcXVvdGUm IGZpZWxkIGlkIDggJnF1b3RlJiAiLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVw DXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdldCkNZW5k IG1vdXNlVXAAARQAGwEAAM8ATgDhAIiABQAAAAAAAQAAAAwAAAAQRW51bQAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIklmIHRoaXMgYm94IGlzIGNoZWNrZWQsIHRoZW4g dGhpcyBwYXJhbWV0ZXIgaXMgYW4gZW51bWVyYXRlZCBvbmUgd2l0aCB0aGUgZW51bWVy YXRpb24gaWQiIMINJiZxdW90ZSYgZmllbGQgaWQgOCAmIHF1b3RlJiIuIg1lbmQgTW91 c2VXaXRoaW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90ICho aWxpdGUgb2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAANYAHAEAAM8AhwDhAOHABQAAAAAA AQAAAAwAAAAQUmVhZFdyaXRlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiSW5k aWNhdGVzIHdoZXRoZXIgeW91IGNhbiB3cml0ZSB0byB0aGlzIHByb3BlcnR5IG9yIG5v dC4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdl dCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAC2AB0BAADQATEA 4QFCAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRo aXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRoaW4NDW9u IG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUgb2YgdGFy Z2V0KQ1lbmQgbW91c2VVcAAAALYAHgEAANABQgDhAVMABQAAAAAAAQAAAAwAAAAQAABv biBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0 dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9m IHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAAtgAf AQAA0AFTAOEBZAAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxs b29uICJUaGlzIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1vdXNlV2l0 aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRl IG9mIHRhcmdldCkNZW5kIG1vdXNlVXAAAAC2ACABAADQAWQA4QF1AAUAAAAAAAEAAAAM AAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgcmVzZXJ2ZWQg Zm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANc2V0IGhp bGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUgb2YgdGFyZ2V0KQ1lbmQgbW91c2VV cAAAALYAIQEAANABdQDhAYYABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iDWVuZCBN b3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3Qg KGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVwAAAAtgAiAQAA0AGGAOEBlwAFAAAA AAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHJl c2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVw DXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdldCkNZW5k IG1vdXNlVXAAAAC2ACMBAADQAZcA4QGoAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VX aXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Uu Ig1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQg dG8gbm90IChoaWxpdGUgb2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAALYAJAEAANABqADh AbkABQAAAAAAAQAAAAwAAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhp cyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24g bW91c2VVcA1zZXQgaGlsaXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJn ZXQpDWVuZCBtb3VzZVVwAAAAtgAlAQAA0AG5AOEBygAFAAAAAAABAAAADAAAABAAAG9u IE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJUaGlzIGlzIHJlc2VydmVkIGZvciBmdXR1 cmUgdXNlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxpdGUgb2Yg dGFyZ2V0IHRvIG5vdCAoaGlsaXRlIG9mIHRhcmdldCkNZW5kIG1vdXNlVXAAAAC2ACYB AADQAcoA4QHbAAUAAAAAAAEAAAAMAAAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxv b24gIlRoaXMgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIg1lbmQgTW91c2VXaXRo aW4NDW9uIG1vdXNlVXANc2V0IGhpbGl0ZSBvZiB0YXJnZXQgdG8gbm90IChoaWxpdGUg b2YgdGFyZ2V0KQ1lbmQgbW91c2VVcAAAALYAJwEAANAB2wDhAewABQAAAAAAAQAAAAwA AAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhpcyBpcyByZXNlcnZlZCBm b3IgZnV0dXJlIHVzZS4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1zZXQgaGls aXRlIG9mIHRhcmdldCB0byBub3QgKGhpbGl0ZSBvZiB0YXJnZXQpDWVuZCBtb3VzZVVw AAAAtgAoAQAA0AHsAOEB/QAFAAAAAAABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJUaGlzIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiINZW5kIE1v dXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCBoaWxpdGUgb2YgdGFyZ2V0IHRvIG5vdCAo aGlsaXRlIG9mIHRhcmdldCkNZW5kIG1vdXNlVXAAAAEoACkBAACNANsAoQERoAIAAAAA AAEAAAAMAAAAEE5leHQgPgAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNr IGhlcmUgdG8gdmlldyB0aGUgbmV4dCBwcm9wZXJ0eSBpbiB0aGUgcHJvcGVydHkgbGlz dC4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1nbG9iYWwgY3VycmVudFBhcmFt DWlmIGxpbmUgKGN1cnJlbnRQYXJhbSsxKSBvZiBia2duZCBmaWVsZCBpZCAxMCA8PiAi IiB0aGVuDVNhdmVQYXJhbQ1TaG93UGFyYW0gY3VycmVudFBhcmFtKzENZWxzZQ1iZWVw DWVuZCBpZg1lbmQgbW91c2VVcAAAAQoAKgEAAI0AowChANmgAgAAAAAAAQAAAAwAAAAQ PCBQcmV2AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byB2 aWV3IGEgcHJldmlvdXMgcHJvcGVydHkgaW4gdGhlIHByb3BlcnR5IGxpc3QuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGN1cnJlbnRQYXJhbQ1pZiBjdXJy ZW50UGFyYW0gPiAxIHRoZW4NU2F2ZVBhcmFtDVNob3dQYXJhbSBjdXJyZW50UGFyYW0t MQ1lbHNlDWJlZXANZW5kIGlmDWVuZCBtb3VzZVVwAAABNAArAQAAjQBmAKEAnKAEAAAA AAABAAAADAAAABBOZXcAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBo ZXJlIHRvIGFkZCBhIG5ldyBwcm9wZXJ0eSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LiIN ZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0NU2F2 ZVBhcmFtDXB1dCAxICsgbnVtYmVyIG9mIGxpbmVzIG9mIGJrZ25kIGZpZWxkIGlkIDEw IGludG8gbg1wdXQgIiw/Pz8/LD8/Pz8sMCwiIGludG8gbGluZSBuIG9mIGJrZ25kIGZp ZWxkIGlkIDEwDVNob3dQYXJhbSBuDWVuZCBtb3VzZVVwAAGAACwBAACNAXIAoQGooAQA AAAAAAEAAAAMAAAAEERlbGV0ZQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNs aWNrIGhlcmUgdG8gZGVsZXRlIHRoaXMgcHJvcGVydHkuIg1lbmQgTW91c2VXaXRoaW4N DW9uIG1vdXNlVXANZ2xvYmFsIGN1cnJlbnRQYXJhbQ1pZiBjdXJyZW50UGFyYW0gPSAw IHRoZW4NYmVlcA1lbHNlDWRlbGV0ZSBsaW5lIGN1cnJlbnRQYXJhbSBvZiBia2duZCBm aWVsZCBpZCAxMA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGJrZ25kIGZpZWxkIGlkIDEw IGludG8gbg1pZiBjdXJyZW50UGFyYW0gPiBuIHRoZW4Nc3VidHJhY3QgMSBmcm9tIGN1 cnJlbnRQYXJhbQ1lbmQgaWYNU2hvd1BhcmFtIGN1cnJlbnRQYXJhbQ1lbmQgaWYNZW5k IG1vdXNlVXAAAAEUAC0BAACNATYAoQFsoAQAAAAAAAEAAAAMAAAAEEluc2VydAAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gYWRkIGEgbmV3IHBy b3BlcnR5IGFmdGVyIHRoaXMgb25lLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVw DWdsb2JhbCBjdXJyZW50UGFyYW0NcHV0IHJldHVybiAmICIsPz8/Pyw/Pz8/LDAsIiBh ZnRlciBsaW5lIGN1cnJlbnRQYXJhbSBvZiBia2duZCBmaWVsZCBpZCAxMA1TaG93UGFy YW0gY3VycmVudFBhcmFtKzENZW5kIG1vdXNlVXAAAAAiADACDQEhABcBMgBaAAAAAAAA AAAAFQAMAQAAEAAAAAABZAAxAgQBIgBZAVIB+wAHAAAAAAAAAAQACQAAAAxlbGVtZW50 cwAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIGxpc3Qgb2Yg ZWxlbWVudHMgaW4gdGhlIGNsYXNzLiIgwg0mJiAiRWFjaCBsaW5lIGlzIGFuIGVsZW1l bnQsIHRoZSBmaXJzdCBpdGVtIGluIGVhY2ggbGluZSBpcyB0aGUgZWxlbWVudCBjbGFz cywiIMINJiYgInRoZSBmb2xsb3dpbmcgaXRlbXMgYXJlIHRoZSBrZXkgZm9ybXMuIEN1 cnJlbnRseSB0aGVyZSBpcyBubyIgwg0mJiAic3BlY2lhbCB1c2VyIGludGVyZmFjZSBi ZXNpZGVzIHRleHQgZW50cnkgZm9yIGVkaXRpbmcgdGhlc2UgZWxlbWVudHMuIg1lbmQg TW91c2VXaXRoaW4NAAFqADMBAAA6AbQAUgHSIAAAAAP2AAEAAAAMAAAAEAAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhlIHByZXZp b3VzIGNsYXNzIGluIHRoaXMgc3VpdGUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNl VXANZ2V0IHRoZXJlIGlzIGEgY2FyZCAyIG9mIHRoaXMgYmtnbmQNaWYgbm90IGl0IHRo ZW4gZXhpdCBtb3VzZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBjYXJkIDIgb2YgdGhp cyBia2duZCBpbnRvIHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkIDw+IHgg dGhlbg12aXN1YWwgd2lwZSByaWdodA1nbyBwcmV2IGNhcmQgb2YgdGhpcyBia2duZA1l bmQgaWYNZW5kIG1vdXNlVXAAASgANAEAADoB1QBSAfMgAAAAA/UAAQAAAAwAAAAQAABv biBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyB0byB0aGUg bmV4dCBjbGFzcyBpbiB0aGlzIHN1aXRlLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3Vz ZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBsYXN0IGNhcmQgb2YgdGhpcyBia2duZCBp bnRvIHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkIDw+IHggdGhlbg12aXN1 YWwgd2lwZSBsZWZ0DWdvIG5leHQgY2FyZCBvZiB0aGlzIGJrZ25kDWVuZCBpZg1lbmQg bW91c2VVcAAC2gA2AQAAHQE+ADMBopAFAAAAAAABAAAADAAAABBmcm9tIEFFVVQAAG9u IE1vdXNlV2l0aGluDWlmIGhpbGl0ZSBvZiBtZSB0aGVuDVNob3dCYWxsb29uICJUaGlz IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgY2xhc3MgY29tZXMgZnJvbSB0aGUgYWV1dCBy ZXNvdXJjZS4iIMINJiYgIklmIHlvdSBtb2RpZnkgdGhlIGNsYXNzLCB5b3Ugc2hvdWxk IGNsaWNrIGhlcmUgc28gdGhhdCB0aGUgY2xhc3MiIMINJiYgImdvZXMgdG8gdGhlIGFl dGUgcmVzb3VyY2UuIg1lbHNlDVNob3dCYWxsb29uICJUaGlzIHNob3dzIHRoZSBjbGFz cyBjb21lcyBmcm9tIHRoZSBhZXRlIHJlc291cmNlLiIgwg0mJiAiVGhlcmUgaXMgbm8g cmVhc29uIHRvIG1hcmsgaXQgYXMgY29taW5nIGZyb20gdGhlIGFldXQgcmVzb3VyY2Uu IiDCDSYmICJJZiB5b3UgaW5zaXN0IG9uIGNoYW5naW5nIGl0LCBjbGljayBoZXJlIHdp dGggb3B0aW9uIGtleSBkb3duLiIgwg0mJiAiSXQgd2lsbCBub3QgYmUgd3JpdHRlbiB0 byB0aGUgYWV0ZSByZXNvdXJjZS4iDWVuZCBpZg1lbmQgTW91c2VXaXRoaW4NDW9uIG1v dXNlVXANcHV0IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgaW50byBj dXJTdGF0ZQ1pZiBjdXJTdGF0ZSBvciAodGhlIG9wdGlvbktleSBpcyBkb3duKSB0aGVu DXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJmcm9tIEFFVVQiIHRvIG5vdCBjdXJT dGF0ZQ1lbmQgaWYNZW5kIG1vdXNlVXAAACIAOgINABkAAAA5AHYAAAAAAAAAAAAVABgI AAAgAAAAAAD4ADsBAAARAcEAOAHooAAAABpAAAEAAAAMAAAAEEdvIEJhY2sAAG9uIE1v dXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhl IGNhcmQgeW91IGxhc3QgdmlzaXRlZCLCDSYmInRoaXMgc2Vzc2lvbi4iDWVuZCBNb3Vz ZVdpdGhpbg0Nb24gbW91c2VVcA1nbG9iYWwgZ1doZXJlZnJvbQ1ITVJlbW92ZUJhbGxv b24NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28gZ1doZXJlRnJvbQ1lbmQgbW91c2VVcA0A AA8ACwBDbGFzcyBOYW1lAAAQAAMASUQAABIADABEZXNjcmlwdGlvbgAXAAwARGVzY3Jp cHRpb24AEwALAFByb3BlcnRpZXMAABQADgBQcm9wZXJ0eSBOYW1lABUADABQcm9wZXJ0 eSBJRAAwAAkARWxlbWVudHMAADoAEYAKAAAABAAHAAZDbGFzc2VzAGNsYXNzAG9uIG9w ZW5jYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRoZW4NZ2xvYmFsIGN1cnJlbnRT dWl0ZSxjdXJyZW50TmFtZQ1QdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBjdXJyZW50 U3VpdGUNcHV0IGZpZWxkICJjbGFzc05hbWUiIGludG8gY3VycmVudE5hbWUNU2hvd1Bh cmFtIDENZW5kIGlmDVBhc3Mgb3BlbmNhcmQNZW5kIG9wZW5jYXJkDQ1vbiBjbG9zZWNh cmQNZ2xvYmFsIGluRWRpdA1pZiBpbkVkaXQgdGhlbg1nbG9iYWwgY3VycmVudFN1aXRl LGN1cnJlbnROYW1lDWlmIGZpZWxkICJzdWl0ZUNvZGUiIDw+ICIqKioqIiB0aGVuDWlm IGN1cnJlbnRTdWl0ZSA8PiBmaWVsZCAic3VpdGVDb2RlIiB0aGVuDXB1dCAic3VpdGUi ICYmIGZpZWxkICJzdWl0ZUNvZGUiIGludG8gc3VpdGVOYW1lDWlmIG5vdCAodGhlcmUg aXMgYSBjYXJkIHN1aXRlTmFtZSkgdGhlbg1wdXQgY3VycmVudFN1aXRlIGludG8gZmll bGQgInN1aXRlQ29kZSINYW5zd2VyIHN1aXRlTmFtZSAmICJkb2VzIG5vdCBleGlzdCBh bmQgd2lsbCBub3QgYmUgdXNlZCINZW5kIGlmDWVuZCBpZg1TYXZlUGFyYW0NcHV0IGN1 cnJlbnRTdWl0ZSAmJiAoc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQpICYgIiwiICYgY3Vy cmVudE5hbWUgaW50byBvbGROYW1lDXB1dCAoZmllbGQgInN1aXRlQ29kZSIpICYmICJj bGFzcyIgJiYgUmVzVHlwZShmaWVsZCAiY2xhc3NJRCIpIMINJiAiLCIgJiBmaWVsZCAi Y2xhc3NOYW1lIiBpbnRvIG5ld05hbWUNaWYgbmV3TmFtZSA8PiBvbGROYW1lIHRoZW4N TmFtZUl0IG5ld05hbWUNQ2hhbmdlTmFtZSBvbGROYW1lLCBuZXdOYW1lLCAiY2xhc3NM aXN0Ig1lbmQgaWYNUHV0IGZpZWxkICJzdWl0ZUNvZGUiIGludG8gY3VycmVudFN1aXRl DWVuZCBpZg1lbmQgaWYNUGFzcyBjbG9zZWNhcmQNZW5kIGNsb3NlY2FyZA0Nb24gY2xv c2VjYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRoZW4NZ2xvYmFsIGN1cnJlbnRT dWl0ZSxjdXJyZW50TmFtZQ1pZiBub3QgdGhlIHZpc2libGUgb2YgZmllbGQgInNjcmlw dFRlbXBsYXRlIiB0aGVuDVNhdmVQYXJhbQ1zaG93IGZpZWxkICJzY3JpcHRUZW1wbGF0 ZSINZW5kIGlmDXB1dCBmaWVsZCAic3VpdGVDb2RlIiAmJiAoc2hvcnQgbmFtZSBvZiB0 aGlzIGNhcmQpICYgIiwiICYgY3VycmVudE5hbWUgaW50byBvbGROYW1lDXB1dCBmaWVs ZCAic3VpdGVDb2RlIiAmJiAiZXZlbnQiICYmIFJlc1R5cGUoZmllbGQgImV2ZW50Q2xh c3MiKSDCDSYgUmVzVHlwZShmaWVsZCAiZXZlbnRJRCIpICYgIiwiICYgZmllbGQgImV2 ZW50TmFtZSIgaW50byBuZXdOYW1lDWlmIG5ld05hbWUgPD4gb2xkTmFtZSB0aGVuDU5h bWVJdCBuZXdOYW1lDUNoYW5nZU5hbWUgb2xkTmFtZSwgbmV3TmFtZSwgImV2ZW50TGlz dCINZW5kIGlmDVB1dCBmaWVsZCAic3VpdGVDb2RlIiBpbnRvIGN1cnJlbnRTdWl0ZQ1Q YXNzIGNsb3NlY2FyZA1lbmQgaWYNZW5kIGNsb3NlY2FyZA0Nb24gbmV3Y2FyZA1nbG9i YWwgY3VycmVudFN1aXRlDXB1dCBjdXJyZW50U3VpdGUgaW50byBmaWVsZCBzdWl0ZUNv ZGUNUGFzcyBuZXdjYXJkDWVuZCBuZXdjYXJkDQ1vbiBkZWxldGVjYXJkDUNoYW5nZU5h bWUgZmllbGQgInN1aXRlQ29kZSIgJiYgc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQgJiAi LCIgICYgZmllbGQgImNsYXNzTmFtZSIsIMINIiIsICJjbGFzc0xpc3QiDXBhc3MgZGVs ZXRlY2FyZA1lbmQgZGVsZXRlY2FyZA0Nb24gU2hvd1BhcmFtIG4NZ2xvYmFsIGN1cnJl bnRQYXJhbQ1wdXQgbiBpbnRvIGN1cnJlbnRQYXJhbQ1pZiBuIDw+IDAgdGhlbg1wdXQg bGluZSBuIG9mIGZpZWxkIGlkIDEwIGludG8geA1lbHNlDXB1dCAiIiBpbnRvIHgNZW5k IGlmDWlmIHggPSAiIiB0aGVuDVJhZGlvQXJyYXkgMA1wdXQgdHJ1ZSBpbnRvIGxvY2tp bmcNcHV0IDAgaW50byBjdXJyZW50UGFyYW0NZWxzZQ1SYWRpb0FycmF5IGl0ZW0gNCBv ZiB4DXB1dCBmYWxzZSBpbnRvIGxvY2tpbmcNZW5kIGlmDXB1dCBpdGVtIDMgb2YgeCBp bnRvIGZpZWxkIGlkIDgNcHV0IGl0ZW0gMSBvZiB4IGludG8gZmllbGQgaWQgNg1wdXQg aXRlbSAyIG9mIHggaW50byBmaWVsZCBpZCA3DWRlbGV0ZSBpdGVtIDEgdG8gNCBvZiB4 DXB1dCB4IGludG8gYmtnbmQgZmllbGQgaWQgOQ1yZXBlYXQgd2l0aCBpID0gNiB0byA5 DXNldCBsb2NrdGV4dCBvZiBmaWVsZCBpZCBpIHRvIGxvY2tpbmcNZW5kIHJlcGVhdA1l bmQgU2hvd1BhcmFtDQ1vbiBTYXZlUGFyYW0NZ2xvYmFsIGN1cnJlbnRQYXJhbQ1pZiBj dXJyZW50UGFyYW0gPD4gMCB0aGVuDWlmIGZpZWxkIGlkIDYgPD4gIiIgdGhlbg1wdXQg ZmllbGQgaWQgNiBpbnRvIGl0ZW0gMSBvZiB4DXB1dCBmaWVsZCBpZCA3IGludG8gaXRl bSAyIG9mIHgNcHV0IGZpZWxkIGlkIDggaW50byBpdGVtIDMgb2YgeA1wdXQgMCBpbnRv IG4NcmVwZWF0IHdpdGggaSA9IDI1IHRvIDQwDW11bHRpcGx5IG4gYnkgMg1pZiBoaWxp dGUgb2YgYmtnbmQgYnV0dG9uIGlkIGkgdGhlbg1hZGQgMSB0byBuDWVuZCBpZg1lbmQg cmVwZWF0DXB1dCBuIGludG8gaXRlbSA0IG9mIHgNcHV0IGJrZ25kIGZpZWxkIGlkIDkg aW50byB5DS0tIHdlIG11c3QgcmVtb3ZlIGFsbCBjYXJyaWFnZSByZXR1cm4gZnJvbSB0 aGUgY29tbWVudCBmaWVsZA1yZXBlYXQgdW50aWwgaSA9IDANcHV0IG9mZnNldChyZXR1 cm4sIHkpIGludG8gaQ1pZiBpID4gMCB0aGVuIHB1dCBzcGFjZSBpbnRvIGNoYXIgaSBv ZiB5DWVuZCByZXBlYXQNcHV0IHggJiAiLCIgJiB5IGludG8gbGluZSBjdXJyZW50UGFy YW0gb2YgYmtnbmQgZmllbGQgaWQgMTANZW5kIGlmDWVuZCBpZg1lbmQgU2F2ZVBhcmFt DQ1vbiBSYWRpb0FycmF5IG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gMTYNaWYgKG4gbW9k IDIpID0gMSB0aGVuDXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uIGlkICg0MS1pKSB0 byB0cnVlDWVsc2UNc2V0IGhpbGl0ZSBvZiBia2duZCBidXR0b24gaWQgKDQxLWkpIHRv IGZhbHNlDWVuZCBpZg1wdXQgbiBkaXYgMiBpbnRvIG4NZW5kIHJlcGVhdA1lbmQgUmFk aW9BcnJheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEJNQVAAABlQAAAA AAAAAAAAAQAAAAAAAAFWAgAAAAAAAVYCAAAYAAAA3AEvAAAAAAAAAAAAAAAAAAAAsFD/ /////8H//////////+ELhYodgOEKHcDhCrmGiWBVVVVVVVXBVVVVVVVVVUDhCmAqqqqq qqrBqqqqqqqqqoDhCr+Bv4G/gb+Bv4GB4R74FmAC4R7MFmAC4Q7BzHhw8bZjw+YC4Q7B zMzJmcZmZmYC4Q7B+MzhmYZmZmAC4Q7BzPxx+YZn5mAC4Q7BzMA5gYZmBmAC4Q7BzMSZ iYZGJmYC4Q7BzHhw8YeDw+YCAP////8AAAD//wD//wD//////wAAG2BCS0dEAAAehQAA AAAAABrtAAAAAAAAAAMAAByvAAAYZAAXADoAABMiAAcAAAB0AIQAAQIEAB8A3gAxAQgA AgAAAAAAAAAEAAwBAAAQU3VpdGVDb2RlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9v biAiVGhpcyBpcyB0aGUgc3VpdGUgY29kZSBvZiB0aGlzIGVudW1lcmF0aW9uLiINZW5k IE1vdXNlV2l0aGluDQ0AANAAAwIEAB8BIwAyAVoAAgAAAAAAAAAEAAwAAAAQZW51bWVy YXRpb24AAG9uIE1vdXNlV2l0aGluDWlmICBtZSBpcyAiIiB0aGVuDVNob3dCYWxsb29u ICJFbnRlciB0aGUgSUQgb2YgdGhpcyBlbnVtZXJhdGlvbiBoZXJlLiINZWxzZQ1TaG93 QmFsbG9vbiAiVGhpcyBpcyB0aGUgSUQgb2YgdGhpcyBlbnVtZXJhdGlvbi4iDWVuZCBp Zg1lbmQgTW91c2VXaXRoaW4NAADgAAYCBABiASkAdAH8AAIAAAAAAAAABAAMAAAAEGVu dW1OYW1lAABvbiBNb3VzZVdpdGhpbg1pZiAgbWUgaXMgIiIgdGhlbg1TaG93QmFsbG9v biAiRW50ZXIgdGhlIG5hbWUgdGhlIGVudW1lcmF0b3IgYmVpbmcgZWRpdGVkLiINZWxz ZQ1TaG93QmFsbG9vbiAiVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZW51bWVyYXRvciBi ZWluZyBlZGl0ZWQuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluDQAAANwABwIEAGIAbQB0 AKEAAgAAAAAAAAAEAAwAAAAQZW51bUlEAABvbiBNb3VzZVdpdGhpbg1pZiAgbWUgaXMg IiIgdGhlbg1TaG93QmFsbG9vbiAiRW50ZXIgdGhlIElEIG9mIHRoZSBlbnVtZXJhdG9y IGJlaW5nIGVkaXRlZC4iDWVsc2UNU2hvd0JhbGxvb24gIlRoaXMgaXMgdGhlIElEIG9m IHRoZSBlbnVtZXJhdG9yIGJlaW5nIGVkaXRlZC4iDWVuZCBpZg1lbmQgTW91c2VXaXRo aW4NAADsAAkCBAB5AG0A5QH8AAcAAAAAAAAABAAJAAAADAAAb24gTW91c2VXaXRoaW4N aWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBkZXNjcmlwdGlv biBmb3IgdGhlIGVudW1lcmF0b3IgIGJlaW5nIGVkaXRlZC4iDWVsc2UNU2hvd0JhbGxv b24gIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZW51bWVyYXRvciAgYmVp bmcgZWRpdGVkLiINZW5kIGlmDWVuZCBNb3VzZVdpdGhpbg0AAV4ACgIFAOwAbQFUAfwA BwAAAAAAAAAEAAkAAAAMZW51bUluZm8AAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29u ICJUaGlzIGlzIGxpc3Qgb2YgYWxsIHRoZSBlbnVtZXJhdG9ycyBpbiB0aGlzIGVudW1l cmF0aW9uLCIgwg0mJiAiY2xpY2sgb24gdGhlIGVudW1lcmF0b3IgeW91IHdpc2ggdG8g ZWRpdC4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gTW91c2VVcA1wdXQgd29yZCAyIG9mIHRo ZSBjbGlja0xpbmUgaW50byBpDXB1dCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRhcmdl dCBpbnRvIG4NaWYgKGkgPiAwKSBhbmQgKGkgPD0gbikgdGhlbg1TYXZlUGFyYW0NU2hv d1BhcmFtIGkNZW5kIGlmDWVuZCBNb3VzZVVwAAAAZAALAQAAHwCzADEA3qAAAAAAAAAB AAAADAAAABBTdWl0ZQAAb24gbW91c2VVcA1nbyB0byBjYXJkICgic3VpdGUiICYmIGZp ZWxkIHN1aXRlQ29kZSkNZW5kIG1vdXNlVXAAACIAEAIdACEBCgAzASQAAAAAAAD//wAV AAwBAAAQAAAAAAAiABMCDQBCAAAAWABoAAAAAAAAAAAAFQASAAAAGAAAAAAAIgAUAg0A ZACpAHUBKgAAAAAAAP//ABUADAEAABAAAAAAACIAFQINAGQAAQB2AG4AAAAAAAD//wAV AAwBAAAQAAAAAAAiABcCDAB4ABIAigBuAAAAAAAA//8AFQAMAQAAEAAAAAABLAApAQAA QgDdAFYBE6ACAAAAAAABAAAADAAAABBOZXh0ID4AAG9uIE1vdXNlV2l0aGluDVNob3dC YWxsb29uICJDbGljayBoZXJlIHRvIGdvIHRvIHRoZSBwcmV2aW91cyBlbnVtZXJhdG9y IGluIHRoZSBlbnVtZXJhdGlvbiBsaXN0LiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3Vz ZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0NaWYgbGluZSAoY3VycmVudFBhcmFtKzEpIG9m IGZpZWxkIGlkIDEwIDw+ICIiIHRoZW4NU2F2ZVBhcmFtDVNob3dQYXJhbSBjdXJyZW50 UGFyYW0rMQ1lbHNlDWJlZXANZW5kIGlmDWVuZCBtb3VzZVVwAAABDgAqAQAAQgClAFYA 26ACAAAAAAABAAAADAAAABA8IFByZXYAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29u ICJDbGljayBoZXJlIHRvIGdvIHRvIHRoZSBuZXh0IGVudW1lcmF0b3IgaW4gdGhlIGVu dW1lcmF0aW9uIGxpc3QuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFs IGN1cnJlbnRQYXJhbQ1pZiBjdXJyZW50UGFyYW0gPiAxIHRoZW4NU2F2ZVBhcmFtDVNo b3dQYXJhbSBjdXJyZW50UGFyYW0tMQ1lbHNlDWJlZXANZW5kIGlmDWVuZCBtb3VzZVVw AAABMAArAQAAQgBpAFYAn6AEAAAAAAABAAAADAAAABBOZXcAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGFkZCBhIG5ldyBlbnVtZXJhdG9yIHRv IHRoZSBlbmQgdGhlIGVudW1lcmF0aW9uLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3Vz ZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0NU2F2ZVBhcmFtDXB1dCAxICsgbnVtYmVyIG9m IGxpbmVzIG9mIGJrZ25kIGZpZWxkIGlkIDEwIGludG8gbg1wdXQgIiwsIiBpbnRvIGxp bmUgbiBvZiBia2duZCBmaWVsZCBpZCAxMA1TaG93UGFyYW0gbg1lbmQgbW91c2VVcAAA AYIALAEAAEIBXQBWAZOgBAAAAAAAAQAAAAwAAAAQRGVsZXRlAABvbiBNb3VzZVdpdGhp bg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBkZWxldGUgdGhpcyBlbnVtZXJhdG9y LiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0N aWYgY3VycmVudFBhcmFtIDw+IDAgdGhlbg1kZWxldGUgbGluZSBjdXJyZW50UGFyYW0g b2YgYmtnbmQgZmllbGQgaWQgMTANcHV0IG51bWJlciBvZiBsaW5lcyBpbiBia2duZCBm aWVsZCBpZCAxMCBpbnRvIG4NaWYgY3VycmVudFBhcmFtID4gbiB0aGVuDXN1YnRyYWN0 IDEgZnJvbSBjdXJyZW50UGFyYW0NZW5kIGlmDVNob3dQYXJhbSBjdXJyZW50UGFyYW0N ZWxzZQ1iZWVwDWVuZCBpZg1lbmQgbW91c2VVcAABCAAtAQAAQgEhAFYBV6AEAAAAAAAB AAAADAAAABBJbnNlcnQAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBo ZXJlIHRvIGluc2VydCBhIG5ldyBlbnVtZXJhdG9yIGFmdGVyIHRoaXMgb25lLiINZW5k IE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBjdXJyZW50UGFyYW0NcHV0IHJl dHVybiAmICIsLCIgYWZ0ZXIgbGluZSBjdXJyZW50UGFyYW0gb2YgZmllbGQgaWQgMTAN U2hvd1BhcmFtIGN1cnJlbnRQYXJhbSsxDWVuZCBtb3VzZVVwAAAAIgAyAg0AGQAAADYA swAAAAAAAAAAABUAGAgAACAAAAAAAXAAMwEAADoBtABSAdIgAAAAA/YAAQAAAAwAAAAQ AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyB0byB0 aGUgcHJldmlvdXMgZW51bWVyYXRpb24gaW4gdGhpcyBzdWl0ZS4iDWVuZCBNb3VzZVdp dGhpbg0Nb24gbW91c2VVcA1nZXQgdGhlcmUgaXMgYSBjYXJkIDIgb2YgdGhpcyBia2du ZA1pZiBub3QgaXQgdGhlbiBleGl0IG1vdXNlVXANcHV0IHRoZSBzaG9ydCBuYW1lIG9m IGNhcmQgMiBvZiB0aGlzIGJrZ25kIGludG8geA1pZiB0aGUgc2hvcnQgbmFtZSBvZiB0 aGlzIGNhcmQgPD4geCB0aGVuDXZpc3VhbCB3aXBlIHJpZ2h0DWdvIHByZXYgY2FyZCBv ZiB0aGlzIGJrZ25kDWVuZCBpZg1lbmQgbW91c2VVcAABLgA0AQAAOgHVAFIB8yAAAAAD 9QABAAAADAAAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJl IHRvIGdvIHRvIHRoZSBuZXh0IGVudW1lcmF0aW9uIGluIHRoaXMgc3VpdGUuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANcHV0IHRoZSBzaG9ydCBuYW1lIG9mIGxhc3Qg Y2FyZCBvZiB0aGlzIGJrZ25kIGludG8geA1pZiB0aGUgc2hvcnQgbmFtZSBvZiB0aGlz IGNhcmQgPD4geCB0aGVuDXZpc3VhbCB3aXBlIGxlZnQNZ28gbmV4dCBjYXJkIG9mIHRo aXMgYmtnbmQNZW5kIGlmDWVuZCBtb3VzZVVwAALsADYBAAAeAWEAMwG4kAUAAAAAAAEA AAAMAAAAEGZyb20gQUVVVAAAb24gTW91c2VXaXRoaW4NaWYgaGlsaXRlIG9mIG1lIHRo ZW4NU2hvd0JhbGxvb24gIlRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudW1lcmF0 aW9uIGNvbWVzIGZyb20gdGhlIGFldXQgcmVzb3VyY2UuIiDCDSYmICJJZiB5b3UgbW9k aWZ5IHRoZSBlbnVtZXJhdGlvbiwgeW91IHNob3VsZCBjbGljayBoZXJlIHNvIHRoYXQg dGhlIGNsYXNzIiDCDSYmICJnb2VzIHRvIHRoZSBhZXRlIHJlc291cmNlLiINZWxzZQ1T aG93QmFsbG9vbiAiVGhpcyBzaG93cyB0aGUgZW51bWVyYXRpb24gY29tZXMgZnJvbSB0 aGUgYWV0ZSByZXNvdXJjZS4iIMINJiYgIlRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYXJr IGl0IGFzIGNvbWluZyBmcm9tIHRoZSBhZXV0IHJlc291cmNlLiIgwg0mJiAiSWYgeW91 IGluc2lzdCBvbiBjaGFuZ2luZyBpdCwgY2xpY2sgaGVyZSB3aXRoIG9wdGlvbiBrZXkg ZG93bi4iIMINJiYgIkl0IHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIGFldGUgcmVz b3VyY2UuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXB1dCBoaWxp dGUgb2YgYmtnbmQgYnV0dG9uICJmcm9tIEFFVVQiIGludG8gY3VyU3RhdGUNaWYgY3Vy U3RhdGUgb3IgKHRoZSBvcHRpb25LZXkgaXMgZG93bikgdGhlbg1zZXQgaGlsaXRlIG9m IGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0byBub3QgY3VyU3RhdGUNZW5kIGlmDWVu ZCBtb3VzZVVwAAAA+AA3AQAAEQHBADgB6KAAAAAaQAABAAAADAAAABBHbyBCYWNrAABv biBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyBiYWNrIHRv IHRoZSBjYXJkIHlvdSBsYXN0IHZpc2l0ZWQiwg0mJiJ0aGlzIHNlc3Npb24uIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGdXaGVyZWZyb20NSE1SZW1vdmVC YWxsb29uDXZpc3VhbCBkaXNzb2x2ZSBmYXN0DWdvIGdXaGVyZUZyb20NZW5kIG1vdXNl VXANAAAiADoCDADrAAAA/QBuAAAAAAAA//8AFQAMAQAAEAAAAAAAEAADAElEAAAXAAwA RGVzY3JpcHRpb24AEwALAFBhcmFtZXRlcnMAABQAEABFbnVtZXJhdG9yIG5hbWUAFQAO AEVudW1lcmF0b3IgSUQAMgANAEVudW1lcmF0aW9ucwAAOgAQAEVudW1lcmF0b3IgTGlz dGVudW1lcmF0aW9uAG9uIG9wZW5jYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRo ZW4NaWYgZmllbGQgInN1aXRlQ29kZSIgPD4gIioqKioiIHRoZW4NZ2xvYmFsIGN1cnJl bnRTdWl0ZQ1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBjdXJyZW50U3VpdGUNU2hv d1BhcmFtIDENZW5kIGlmDWVuZCBpZg1QYXNzIG9wZW5jYXJkDWVuZCBvcGVuY2FyZA0N b24gY2xvc2VjYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRoZW4NZ2xvYmFsIGN1 cnJlbnRTdWl0ZQ1pZiBmaWVsZCAic3VpdGVDb2RlIiA8PiAiKioqKiIgdGhlbg1pZiBj dXJyZW50U3VpdGUgPD4gZmllbGQgInN1aXRlQ29kZSIgdGhlbg1wdXQgInN1aXRlIiAm JiBmaWVsZCAic3VpdGVDb2RlIiBpbnRvIHN1aXRlTmFtZQ1pZiBub3QgKHRoZXJlIGlz IGEgY2FyZCBzdWl0ZU5hbWUpIHRoZW4NcHV0IGN1cnJlbnRTdWl0ZSBpbnRvIGZpZWxk ICJzdWl0ZUNvZGUiDWFuc3dlciBzdWl0ZU5hbWUgJiAiZG9lcyBub3QgZXhpc3QgYW5k IHdpbGwgbm90IGJlIHVzZWQiDWVuZCBpZg1lbmQgaWYNU2F2ZVBhcmFtDXB1dCBjdXJy ZW50U3VpdGUgJiYgc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQgaW50byBvbGROYW1lDXB1 dCAoZmllbGQgInN1aXRlQ29kZSIpICYmICJlbnVtZXJhdGlvbiIgJiYgUmVzVHlwZShm aWVsZCAiZW51bWVyYXRpb24iKSBpbnRvIG5ld05hbWUNaWYgbmV3TmFtZSA8PiBvbGRO YW1lIHRoZW4NTmFtZUl0IG5ld05hbWUNQ2hhbmdlTmFtZSBvbGROYW1lLCBuZXdOYW1l LCAiZW51bUxpc3QiDWVuZCBpZg1QdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBjdXJy ZW50U3VpdGUNZW5kIGlmDWVuZCBpZg1QYXNzIGNsb3NlY2FyZA1lbmQgY2xvc2VjYXJk DQ1vbiBuZXdjYXJkDWdsb2JhbCBjdXJyZW50U3VpdGUNcHV0IGN1cnJlbnRTdWl0ZSBp bnRvIGZpZWxkIHN1aXRlQ29kZQ1wdXQgIiwsIiBpbnRvIGxpbmUgMSBvZiBmaWVsZCBp ZCAxMA1QYXNzIG5ld2NhcmQNZW5kIG5ld2NhcmQNDW9uIGRlbGV0ZWNhcmQNQ2hhbmdl TmFtZSBmaWVsZCAic3VpdGVDb2RlIiAmJiBzaG9ydCBuYW1lIG9mIHRoaXMgY2FyZCwg wg0iIiwgImVudW1MaXN0Ig1wYXNzIGRlbGV0ZWNhcmQNZW5kIGRlbGV0ZWNhcmQNDW9u IFNob3dQYXJhbSBuDWdsb2JhbCBjdXJyZW50UGFyYW0NcHV0IG4gaW50byBjdXJyZW50 UGFyYW0NcHV0IGxpbmUgbiBvZiBmaWVsZCBpZCAxMCBpbnRvIHgNaWYgeCA9ICIiIHRo ZW4NcHV0IDAgaW50byBjdXJyZW50UGFyYW0NcHV0IHRydWUgaW50byBsb2NraW5nDWVs c2UNcHV0IGl0ZW0gMSBvZiB4IGludG8gZmllbGQgaWQgNg1wdXQgaXRlbSAyIG9mIHgg aW50byBmaWVsZCBpZCA3DWRlbGV0ZSBpdGVtIDEgdG8gMiBvZiB4DXB1dCB4IGludG8g ZmllbGQgaWQgOQ1wdXQgZmFsc2UgaW50byBsb2NraW5nDWVuZCBpZg1zZXQgbG9ja3Rl eHQgb2YgZmllbGQgaWQgNiB0byBsb2NraW5nDXNldCBsb2NrdGV4dCBvZiBmaWVsZCBp ZCA3IHRvIGxvY2tpbmcNc2V0IGxvY2t0ZXh0IG9mIGZpZWxkIGlkIDkgdG8gbG9ja2lu Zw1lbmQgU2hvd1BhcmFtDQ1vbiBTYXZlUGFyYW0NZ2xvYmFsIGN1cnJlbnRQYXJhbQ1p ZiBjdXJyZW50UGFyYW0gPD4gMCB0aGVuDXB1dCBmaWVsZCBpZCA2IGludG8gaXRlbSAx IG9mIHgNcHV0IGZpZWxkIGlkIDcgaW50byBpdGVtIDIgb2YgeA1wdXQgZmllbGQgaWQg OSBpbnRvIHkNLS0gd2UgbXVzdCByZW1vdmUgYWxsIGNhcnJpYWdlIHJldHVybiBmcm9t IHRoZSBjb21tYSBmaWVsZA1yZXBlYXQgdW50aWwgaSA9IDANcHV0IG9mZnNldChyZXR1 cm4sIHkpIGludG8gaQ1pZiBpID4gMCB0aGVuIHB1dCBzcGFjZSBpbnRvIGNoYXIgaSBv ZiB5DWVuZCByZXBlYXQNcHV0IHggJiAiLCIgJiB5IGludG8gbGluZSBjdXJyZW50UGFy YW0gb2YgZmllbGQgaWQgMTANZW5kIGlmDWVuZCBTYXZlUGFyYW0NAAAAAAAAAAAAAAAA AAAAAAAAAAAAAIBCTUFQAAAa7QAAAAAAAAAAAAEAAAAAAAABVgIAAAAAAAFWAgAAGAAA ADcAsQAAAAAAAAAAAAAAAAAAACSMEIDhFAEChYrhJoAA4TUBgAC5ho4QgOElgACNEEDh JUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgEJLR0QAAByvAAAAAAAA HxZAAAAAAAAAAQAADjwAAB6FAA0ADgAACqIABAAAADIAZAABAQAAIACjADIA1KAAAAAA AAABAAAADAAAABBTdWl0ZQAAb24gbW91c2VVcA1nbyB0byBjYXJkICgic3VpdGUiICYm IGZpZWxkIHN1aXRlQ29kZSkNZW5kIG1vdXNlVXAAAIgAAgIEACAAzgAyARYAAgAAAAAA AAAEAAwBAAAQU3VpdGVDb2RlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhp cyBpcyB0aGUgc3VpdGUgY29kZSBvZiB0aGlzIGNvbXBhcmUgb3BlcmF0b3IuIg1lbmQg TW91c2VXaXRoaW4NAAAiAAMCDABKACoAWwBZAAAAAAAA//8AFQAMAQAAEAAAAAAA4AAE AgQASABYAFsBCAACAAAAAAAAAAQADAAAABBjb21wYXJlTmFtZQAAb24gTW91c2VXaXRo aW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBuYW1lIG9m IHRoaXMgY29tcGFyaXNvbiBvcGVyYXRvci4iDWVsc2UNU2hvd0JhbGxvb24gIlRoaXMg aXMgdGhlIG5hbWUgb2YgdGhpcyBjb21wYXJpc29uIG9wZXJhdG9yLiINZW5kIGlmDWVu ZCBNb3VzZVdpdGhpbg0AAAAiAAUCHABKARMAXAFPAAAAAAAA//8AFQAMAQAAEAAAAAAA 2gAGAgQASAFOAFoBgAACAAAAAAAAAAQADAAAABBjb21wYXJlSUQAAG9uIE1vdXNlV2l0 aGluDWlmICBtZSBpcyAiIiB0aGVuDVNob3dCYWxsb29uICJFbnRlciB0aGUgSUQgb2Yg dGhpcyBjb21wYXJpc29uIG9wZXJhdG9yLiINZWxzZQ1TaG93QmFsbG9vbiAiVGhpcyBp cyB0aGUgSUQgb2YgdGhpcyBjb21wYXJpc29uIG9wZXJhdG9yLiINZW5kIGlmDWVuZCBN b3VzZVdpdGhpbg0AAAAiAAcCDABsAAAAfABZAAAAAAAA//8AFQAMAQAAEAAAAAAA5gAI AgQAbQBYAN0B+wAHAAAAAAAAAAQACQAAAAxjb21wYXJlQ29tbWVudAAAb24gTW91c2VX aXRoaW4NaWYgIG1lIGlzICIiIHRoZW4NU2hvd0JhbGxvb24gIkVudGVyIGEgY29tbWVu dCBmb3IgdGhpcyBjb21wYXJpc29uIG9wZXJhdG9yLiINZWxzZQ1TaG93QmFsbG9vbiAi VGhpcyBpcyBjb21tZW50IGFib3V0IHRoaXMgY29tcGFyaXNvbiBvcGVyYXRvci4iDWVu ZCBpZg1lbmQgTW91c2VXaXRoaW4NAAAiAAkCDQAZAAAAOQCqAAAAAAAAAAAAFQAYCAAA IAAAAAABeAAKAQAAOgG0AFIB0iAAAAAD9gABAAAADAAAABAAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIHRvIHRoZSBwcmV2aW91cyBjb21w YXJpc29uIG9wZXJhdG9yIGluIHRoaXMgc3VpdGUuIg1lbmQgTW91c2VXaXRoaW4NDW9u IG1vdXNlVXANZ2V0IHRoZXJlIGlzIGEgY2FyZCAyIG9mIHRoaXMgYmtnbmQNaWYgbm90 IGl0IHRoZW4gZXhpdCBtb3VzZVVwDXB1dCB0aGUgc2hvcnQgbmFtZSBvZiBjYXJkIDIg b2YgdGhpcyBia2duZCBpbnRvIHgNaWYgdGhlIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJk IDw+IHggdGhlbg12aXN1YWwgd2lwZSByaWdodA1nbyBwcmV2IGNhcmQgb2YgdGhpcyBi a2duZA1lbmQgaWYNZW5kIG1vdXNlVXAAATYACwEAADoB1QBSAfMgAAAAA/UAAQAAAAwA AAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnbyB0 byB0aGUgbmV4dCBjb21wYXJpc29uIG9wZXJhdG9yIGluIHRoaXMgc3VpdGUuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANcHV0IHRoZSBzaG9ydCBuYW1lIG9mIGxhc3Qg Y2FyZCBvZiB0aGlzIGJrZ25kIGludG8geA1pZiB0aGUgc2hvcnQgbmFtZSBvZiB0aGlz IGNhcmQgPD4geCB0aGVuDXZpc3VhbCB3aXBlIGxlZnQNZ28gbmV4dCBjYXJkIG9mIHRo aXMgYmtnbmQNZW5kIGlmDWVuZCBtb3VzZVVwAALoAA0BAAAfATsAMwGVkAUAAAAAAAEA AAAMAAAAEGZyb20gQUVVVAAAb24gTW91c2VXaXRoaW4NaWYgaGlsaXRlIG9mIG1lIHRo ZW4NU2hvd0JhbGxvb24gIlRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbXBhcmlz b24gY29tZXMgZnJvbSB0aGUgYWV1dCByZXNvdXJjZS4iIMINJiYgIklmIHlvdSBtb2Rp ZnkgdGhlIGNvbXBhcmlzb24sIHlvdSBzaG91bGQgY2xpY2sgaGVyZSBzbyB0aGF0IHRo ZSBjbGFzcyIgwg0mJiAiZ29lcyB0byB0aGUgYWV0ZSByZXNvdXJjZS4iDWVsc2UNU2hv d0JhbGxvb24gIlRoaXMgc2hvd3MgdGhlIGNvbXBhcmlzb24gY29tZXMgZnJvbSB0aGUg YWV0ZSByZXNvdXJjZS4iIMINJiYgIlRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYXJrIGl0 IGFzIGNvbWluZyBmcm9tIHRoZSBhZXV0IHJlc291cmNlLiIgwg0mJiAiSWYgeW91IGlu c2lzdCBvbiBjaGFuZ2luZyBpdCwgY2xpY2sgaGVyZSB3aXRoIG9wdGlvbiBrZXkgZG93 bi4iIMINJiYgIkl0IHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIGFldGUgcmVzb3Vy Y2UuIg1lbmQgaWYNZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXB1dCBoaWxpdGUg b2YgYmtnbmQgYnV0dG9uICJmcm9tIEFFVVQiIGludG8gY3VyU3RhdGUNaWYgY3VyU3Rh dGUgb3IgKHRoZSBvcHRpb25LZXkgaXMgZG93bikgdGhlbg1zZXQgaGlsaXRlIG9mIGJr Z25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0byBub3QgY3VyU3RhdGUNZW5kIGlmDWVuZCBt b3VzZVVwAAD4AA4BAAARAcEAOAHooAAAABpAAAEAAAAMAAAAEEdvIEJhY2sAAG9uIE1v dXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhl IGNhcmQgeW91IGxhc3QgdmlzaXRlZCLCDSYmInRoaXMgc2Vzc2lvbi4iDWVuZCBNb3Vz ZVdpdGhpbg0Nb24gbW91c2VVcA1nbG9iYWwgZ1doZXJlZnJvbQ1ITVJlbW92ZUJhbGxv b24NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28gZ1doZXJlRnJvbQ1lbmQgbW91c2VVcA0A AAMABQBOYW1lAAAFAAMASUQAAAcADABEZXNjcmlwdGlvbgAJAAwAQ29tcGFyaXNvbnNj b21wYXJpc29uAG9uIE9wZW5DYXJkDWdsb2JhbCBpbkVkaXQNaWYgaW5FZGl0IHRoZW4N Z2xvYmFsIGN1cnJlbnRTdWl0ZSxjdXJyZW50TmFtZQ1wdXQgZmllbGQgInN1aXRlQ29k ZSIgaW50byBjdXJyZW50U3VpdGUNcHV0IGZpZWxkICJjb21wYXJlTmFtZSIgaW50byBj dXJyZW50TmFtZQ1lbmQgaWYNZW5kIE9wZW5DYXJkDQ1vbiBjbG9zZWNhcmQNZ2xvYmFs IGluRWRpdA1pZiBpbkVkaXQgdGhlbg1pZiBmaWVsZCAic3VpdGVDb2RlIiA8PiAiKioq KiIgdGhlbg1nbG9iYWwgY3VycmVudFN1aXRlLGN1cnJlbnROYW1lDWlmIGN1cnJlbnRT dWl0ZSA8PiBmaWVsZCAic3VpdGVDb2RlIiB0aGVuDXB1dCAic3VpdGUiICYmIGZpZWxk ICJzdWl0ZUNvZGUiIGludG8gc3VpdGVOYW1lDWlmIG5vdCAodGhlcmUgaXMgYSBjYXJk IHN1aXRlTmFtZSkgdGhlbg1wdXQgY3VycmVudFN1aXRlIGludG8gZmllbGQgInN1aXRl Q29kZSINYW5zd2VyIHN1aXRlTmFtZSAmICJkb2VzIG5vdCBleGlzdCBhbmQgd2lsbCBu b3QgYmUgdXNlZCINZW5kIGlmDWVuZCBpZg1wdXQgY3VycmVudFN1aXRlICYmIChzaG9y dCBuYW1lIG9mIHRoaXMgY2FyZCkgJiAiLCIgJiBjdXJyZW50TmFtZSBpbnRvIG9sZE5h bWUNcHV0IGZpZWxkICJzdWl0ZUNvZGUiICYmICJjb21wYXJpc29uIiAmJiBSZXNUeXBl KGZpZWxkICJjb21wYXJlSUQiKSDCDSYgIiwiICYgZmllbGQgImNvbXBhcmVOYW1lIiBp bnRvIG5ld05hbWUNaWYgbmV3TmFtZSA8PiBvbGROYW1lIHRoZW4NTmFtZUl0IG5ld05h bWUNQ2hhbmdlTmFtZSBvbGROYW1lLCBuZXdOYW1lLCAiY29tcGFyZUxpc3QiDWVuZCBp Zg1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBjdXJyZW50U3VpdGUNZW5kIGlmDWVu ZCBpZg1QYXNzIGNsb3NlY2FyZA1lbmQgY2xvc2VjYXJkDQ1vbiBuZXdjYXJkDWdsb2Jh bCBjdXJyZW50U3VpdGUNcHV0IGN1cnJlbnRTdWl0ZSBpbnRvIGZpZWxkICJzdWl0ZUNv ZGUiDVBhc3MgbmV3Y2FyZA1lbmQgbmV3Y2FyZA0Nb24gZGVsZXRlY2FyZA1DaGFuZ2VO YW1lIGZpZWxkICJzdWl0ZUNvZGUiICYmIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkLCDC DSIiLCAiY29tcGFyZUxpc3QiDXBhc3MgZGVsZXRlY2FyZA1lbmQgZGVsZXRlY2FyZA0A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQk1BUAAAHxYAAAAAAAAAAAABAAAAAAAA AVYCAAAAAAABVgIAABgAAAA3AKgAAAAAAAAAAAAAAAAAAAAkjBCA4RMCA6KFiuEUAQPh FAMDuIaOEIDhEwIDjRBA4RSAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A8BDQVJEAAA7gwAAAAAAAA8tAAAAAAAAAAAAAAAAAAA68AAADjwABQAKAAAC1AACAAAA mgECAAQBAAEoAXwBVgG4oAAAAGB2AAEAFQAMAQAAEEluc3RydWN0aW9ucwAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ2V0IGluc3RydWN0aW9u cyBmb3IgdXNpbmcgdGhpcyBzdGFjay4iDWVuZCBNb3VzZVdpdGhpbg0NDW9uIG1vdXNl VXANZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2QgaW50byBnV2hlcmVGcm9t DXZpc3VhbCBkaXNzb2x2ZSBmYXN0DWdvIGNkICJpbnN0cnVjdGlvbnMiDWVuZCBtb3Vz ZVVwAAAiAAUCAABqAHwAkAHNAAAAAAAAAAAAFQAMAQAAEAAAAAAAmAAHAQAA+AC9AQQA zwAAAAAAAAABAAAADAAAABAAAG9uIG1vdXNlRW50ZXINYmVlcCAyDWVuZCBtb3VzZUVu dGVyDQ1vbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiUGxhY2UgdGhlIGN1cnNvciBo ZXJlIHRvIGJlZXAgdHdpY2UuIg1lbmQgTW91c2VXaXRoaW4NAAAiAAgCBAE7AAMBVgCN AAAAAAAAAAAAAwAMAAAAEAAAAAAA9gAKAQABMgHNAUwB8iAAAAA+0wABABUADgEAABJQ cm9jZWVkyQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8g Z28gdG8gdGhlIFJlc291cmNlIFRvb2xzIGNhcmQuIg1lbmQgTW91c2VXaXRoaW4NDQ0N b24gbW91c2VVcA1nbG9iYWwgZ1doZXJlRnJvbQ1wdXNoIGNkDXBvcCBjZCBpbnRvIGdX aGVyZUZyb20NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28gY2FyZCAiTWFpbk1lbnUiDWVu ZCBtb3VzZVVwAAD/+wBdAFVzZSBzdGFjayB0aGlzIHRvIGNyZWF0ZSwgbWFpbnRhaW4s IGFuZCBleHRlbmQNQXBwbGUgRXZlbnSqIFRlcm1pbm9sb2d5IEV4dGVuc2lvbiByZXNv dXJjZXMuAP/4ADSABgAAAAepMTk5MiBBcHBsZSBDb21wdXRlciwgSW5jLg1BbGwgUmln aHRzIFJlc2VydmVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2BCTUFQAAAP LQAAAAAAAAAAAAEAAAAAAAABVgIAAAAAAAFWAgAAIAAaAVMB/gAAAAAAAAAAAAAAAAAA CwgbwOMEKg/A4wQqP8DjBCr/wOMEOQP/wOMEOQf/wOMEOQ//gOMEOR//gOMEOT//gOME OX//gOMEKX//4wUp///jBSn//uMFOAH//uMFOAH//OMFOAP/+OMFOAP/8OMFhTgD/+Dj BTgH/4DjBSgH/+MGKAf+4wZ1A/8AB/gD/+MEBcEf//AHgD//8OMDBcF///8AA////OMD FAHB////8B/////jAyQD/8H/////////gOMCJA//wf/////////A4wIkH//B//////// //DjAiQ//8H/////////+OMCJH//wf/////////84wKFJP//wf/////////+4wIzAf// wf/////////44wIzAf//wf/////////w4wIzA///wf/////////g4wKKHSASPnh///AA A+Hw4hMEGUASQBR8GnzhD+EQAeIPEwgZgBKAFIAagOEPHAEYBAPBh//wAAQh8AThDx8B 4xMQGAITEFL+BwcA/iQHwMED5wcA/wB8cOEKHwJyAwGAAAMBgCM4MFMDAMABgOEKHAQi BCDBAAwAQAAMAEAzQAgEQgwAIILhC+ERgMEQACgBEAAhCGKAAEAoARATEOEKXwhAACD4 wg4OIPgAD/+BA8AADg4AeBDhDBMgGAglAQQiAQQkDCBTIYYAAeDhCk8QgABCE0IkAhAU QhIC4QvhHggkAQThCx8hAsKD/AIQg/wCH/+EIACAQhCEEgjhC+EQCOIPP0H4QOIOH4By B//gAAf/4OIH4S0gECMCEuEMHgElBCAiBCBDAQCEIBMQ4QsvD/giB8AiB8AUQCQEIOEM TAgAAhByBBhAAAQYQCMhgCMGGOEN4TKD4ADBOIPgAD//gB5DOIHgQOEMPgQgAMEgAAGA CAABgGKEAEAgAAgShOEM4UAEAGACMmACCEICAMIBQkADACDhCxMgSAQACEBiGBwEABgc IwGDQgQAMAzhDYkjH//B//////////zjAyMf/8H//////////uMDhSMf/8H///////// /+MDMw///8H/////////gOMCMw///8H/////////wOMChTMP///B/////////+DjAjMH ///B//////////jjAjMH///B//////////zjAjMH///B//////////7jAooTBCkBwOMB hRMCGkDjAaKFiST//8H//////////+MChSR//8H//////////uMChSQ//8H///////// /OMChSQf/8H/////////+OMCJA//wf/////////w4wKFJAf/wf/////////g4wKFJAP/ wf/////////A4wIkAf/B/////////4DjAgXB///////////jA4UFwX/////////+4wMF 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 UkQAABAuAAAAAAAAEW8AAAAAAAAAAAAAAAAAADrwAAAOPAAGAAgAAAMQAAMAAHGkAC4A AgIFADEABgExAfsABwAAAAAAAAADAAwAAAAQSW5zdHJ1Y3Rpb25zAAAAAADAAAMBAAE5 AAYBUwCVoAQAAAAAAAEAFQAMAQAAEFByaW50IEluc3RydWN0aW9ucwAAb24gTW91c2VX aXRoaW4NU2hvd0JhbGxvb24gIlByaW50IGluc3R1Y3Rpb25zIGZvciB1c2luZyB0aGlz IHN0YWNrLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXByaW50IGNhcmQgZmll bGQgIkluc3RydWN0aW9ucyINZW5kIG1vdXNlVXAAAADoAAQBAAAGAb8ALgH2oAAAABpA AAEAAAAMAAAAEEdvIEJhY2sAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGlj ayBoZXJlIHRvIGdvIGJhY2sgdG8gdGhlIGxhc3QgY2FyZCB5b3UgdmlzaXRlZCLCDSYi IGluIHRoaXMgc3RhY2suIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFs IGdXaGVyZUZyb20NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28gZ1doZXJlRnJvbQ1lbmQg bW91c2VVcAAA9gAFAQABMgHNAUwB8iAAAAA+0wABABUADgEAABJQcm9jZWVkyQAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhlIFJl c291cmNlIFRvb2xzIGNhcmQuIg1lbmQgTW91c2VXaXRoaW4NDQ0Nb24gbW91c2VVcA1n bG9iYWwgZ1doZXJlRnJvbQ1wdXNoIGNkDXBvcCBjZCBpbnRvIGdXaGVyZUZyb20Ndmlz dWFsIGRpc3NvbHZlIGZhc3QNZ28gY2FyZCAiTWFpbk1lbnUiDWVuZCBtb3VzZVVwAAAA IgAGAgQAFgAGADEBBQAAAAAAAAAAABUAGAAAACAAAAAAACIACAIFABcABQAzAQMAAAAA AAAAAAAVABQIAAAaAAAAAP/+cXOB8gAAAAsAKgAMACsADQAwAAwANAANAL8ADADDAA0B owAKAckADQapAAsGvwAJBsAADRK/AAwSygANEwAADBMKAA0TdAAME38ADRPHAAwT0gAN FTUADBVCAA0WDAALFiYADRa9AAwWyQANFvIADBb9AA0XJQAMFzMADRdeAAwXZgANF5sA DBehAA0X9QAMF/wADRhPAAwYWwANGJsADBimAA0Y/wAMGQoADRmQAAwZnAANGfEADBoA AA0abwALGowADRuSAAwbnQANG88ADBvZAA0cHgAMHCkADRxbAAwcZAANHu8ADB7wAA0e 8gAMHv0ADSA5AAwgRAANIcQACSJXAA0l6AAMJfIADSb5AAwnBAANJ8sACSh9AA0oggAM KI0ADSppAAkrGgANKx4ACysxAA0sewAMLIgADS1aAAwtaQANLvwADC8LAA0v2AAML+wA DTHbAAsx7AANMq4ACzLGAA00lgALNKsADTf6AAw3/gANONEADDjVAA05BAAMOQcADTnI AAk6AwANOmEADDpnAA07CAAMOw4ADTwaAAw8JQANPHUADDyAAA09lwALPasADUFKAAtB ZQANQ0IAC0NkAA1EIAALRCwADUywABBMyAANTMoAC0zTAA1S3AALUu4ADVUXAAtVIwAN asQADGrFAA0NQWJvdXQgQWV0ZSBSZXNvdXJjZXMgYW5kIFVzaW5nIHRoaXMgU3RhY2sN VGhlICdhZXV0JyAoQXBwbGUgRXZlbnQgVXNlciBUZXJtaW5vbG9neSkgcmVzb3VyY2Ug ZGVzY3JpYmVzIGNvbW1vbiBBcHBsZSBldmVudHMgYXMgZGVmaW5lZCBpbiB0aGUgbGF0 ZXN0IHZlcnNpb24gb2YgdGhlIEFwcGxlIEV2ZW50IFJlZ2lzdHJ5LiBUaGUgJ2FldGUn IChBcHBsZSBFdmVudCBUZXJtaW5vbG9neSBFeHRlbnNpb24pIHJlc291cmNlIGRlc2Ny aWJlcyBob3cgYW4gYXBwbGljYXRpb24gc3VwcG9ydHMgQXBwbGUgZXZlbnRzLiBPZnRl biBpdCBpcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgY29udGVudCBvZiB0aGUgJ2FldXQn LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAnYWV1dCcgYW5kICdhZXRlJyByZXNvdXJj ZXMsIHNlZSB0aGUgbGF0ZXN0IEFwcGxlIEV2ZW50IFVzZXIgVGVybWlub2xvZ3kgUmVz b3VyY2VzIGRldmVsb3BlciBub3RlLiBUaGlzIHN0YWNrIGFsbG93cyB5b3UgdG8gY29u dmVydCBhbiAnYWV0ZScgcmVzb3VyY2UgdG8gYW5kIGZyb20gYSBjb3B5IG9mIHRoaXMg c3RhY2suIEFmdGVyIGRvaW5nIHNvLCB5b3UgY2FuIHZpZXcgdGhlIGNvbnRlbnQgb2Yg dGhpcyByZXNvdXJjZSBhcyB3ZWxsIGFzIGVkaXQgaXQuIFlvdSBjYW4gYWxzbyBnZW5l cmF0ZSB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHN0YWNrLCBzdWNoIGFzIHNh bXBsZSBjb2RlIGZvciB1c2luZyBBcHBsZSBldmVudHMgZnJvbSBsYW5ndWFnZXMgc3Vj aCBhcyBIeXBlclRhbGssIFBhc2NhbCwgb3IgQy4NDUFuICdhZXRlJyByZXNvdXJjZSBn cm91cHMgaW5mb3JtYXRpb24gaW50byBmdW5jdGlvbmFsIGFyZWFzLCBlYWNoIG9mIHdo aWNoIGlzIGNhbGxlZCBhIHN1aXRlLiBBIHBhcnRpY3VsYXIgcmVzb3VyY2UgbWlnaHQg ZGVmaW5lIGEgdGV4dCBzdWl0ZSwgZ3JhcGhpYyBzdWl0ZSwgZGF0YWJhc2Ugc3VpdGUs IGV0Yy4gV2l0aGluIGVhY2ggc3VpdGUsIHRoZXJlIGFyZSBmb3VyIGtpbmRzIG9mIGRh dGE6IGV2ZW50IGRlc2NyaXB0aW9ucywgdXNlciBhY2Nlc3NpYmxlIG9iamVjdCBjbGFz cyBkZXNjcmlwdGlvbnMsIGNvbXBhcmlzb24gb3BlcmF0b3IgZGVzY3JpcHRpb25zLCBh bmQgZW51bWVyYXRvciBkZXNjcmlwdGlvbnMuIFRoaXMgc3RhY2sgcmVmbGVjdHMgdGhl IG9yZ2FuaXphdGlvbiBvZiB0aGUgJ2FldGUnIHJlc291cmNlIGFuZCB1c2VzIGNhcmRz IG9mIGRpZmZlcmVudCBiYWNrZ3JvdW5kcyB0byBjb250YWluIHRoZSBkaWZmZXJlbnQg a2luZHMgb2YgaW5mb3JtYXRpb27RdGhlcmUgYXJlIHN1aXRlIGNhcmRzIHRoYXQgYWN0 IGFzIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgZGF0YSBpbiB0aGUgc3VpdGUs IGFzIHdlbGwgYXMgZXZlbnQgY2FyZHMsIGNsYXNzIGNhcmRzLCBjb21wYXJpc29uIGNh cmRzIGFuZCBlbnVtZXJhdG9yIGNhcmRzLg0NQmFsbG9vbiBoZWxwIGlzIGF2YWlsYWJs ZSB0aHJvdWdob3V0IHRoZSBzdGFjay4gVXNlIGl0IHRvIHN1cHBsZW1lbnQgdGhlc2Ug aW5zdHJ1Y3Rpb25zIGFuZCBmaW5kIG91dCBtb3JlIGFib3V0IHRoZSBmdW5jdGlvbnMg YW5kIGJlaGF2aW9yIG9mIGVhY2ggc3RhY2sgZWxlbWVudC4NDUEgbWVtb3J5IHBhcnRp dGlvbiBvZiAxNTAwayBvciBncmVhdGVyIGZvciBIeXBlckNhcmQgaXMgcmVjb21tZW5k ZWQgZm9yIHVzZSB3aXRoIHRoaXMgc3RhY2suDQ0NQW4gT3ZlcnZpZXcgVGhpcyBTdGFj aw1Zb3UgY2FuIG5hdmlnYXRlIGZyb20gY2FyZCB0byBjYXJkIGluIHRoaXMgc3RhY2sg YnkgY2hvb3NpbmcgaXRlbXMgaW4gdGhlINJBZXRlRWRpdG9y0yBtZW51LCBjbGlja2lu ZyBvbiBidXR0b25zLCBvciBjbGlja2luZyBvbiB0ZXh0Lg0NVG8gYmVnaW4gdXNpbmcg dGhpcyBzdGFjaywgY2xpY2sgb24gdGhlINJSZXNvdXJjZSBUb29sc9MgYnV0dG9uIG9u IHRoaXMgY2FyZCBvciBjaG9vc2Ug0lJlc291cmNlIFRvb2xz0yBmcm9tIHRoZSBBZXRl RWRpdG9yIG1lbnUuIFlvdSBjYW4gZ28gdG8gYW55IG90aGVyIHNlY3Rpb24gb2YgdGhp cyBzdGFjayBmcm9tIGFueSBvdGhlciBjYXJkIGJ5IGNob29zaW5nIGEgc2VjdGlvbtVz IG5hbWUgZnJvbSB0aGlzIG1lbnUuIA0NVGhlIFJlc291cmNlIFRvb2xzIGNhcmQgYWN0 cyBhcyBhIGNvbnRyb2wgY2VudGVyIGZvciBvcGVyYXRpbmcgb24gJ2FldGUnIHJlc291 cmNlcywgYXMgd2VsbCBhcyBjcmVhdGluZyBuZXcgQXBwbGUgRXZlbnQgc3VpdGVzIGFu ZCBhY2Nlc3NpbmcgZXhpc3Rpbmcgb25lcy4gV2l0aGluIHRoaXMgY2FyZCwgeW911Wxs IG5vdGljZSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgYnV0dG9ucyBmb3IgZXhlY3V0aW5n IGNvbW1hbmRzLCBhIHNjcmF0Y2ggYXJlYSBmb3IgaG9sZGluZyBnZW5lcmF0ZWQgaW5m b3JtYXRpb24sIGFuZCBhIGxpc3Qgb2YgdGhlIHN1aXRlcyBkZXNjcmliZWQgaW4gdGhl IHN0YWNrLg0NQ2xpY2tpbmcgb24gYSBzdWl0ZSBpZCBpbiB0aGUgbWFpbiBtZW51IHRh a2VzIHlvdSB0byB0aGUgY2FyZCBmb3IgdGhhdCBzdWl0ZS4gRWFjaCBzdWl0ZSBjYXJk IGNvbnRhaW5zIGxpc3RzIG9mIGV2ZW50cywgY2xhc3NlcywgY29tcGFyaXNvbnMgYW5k IGVudW1lcmF0b3JzLiBZb3UgY2FuIGNsaWNrIG9uIGFuIGl0ZW0gaW4gZWFjaCBvZiB0 aGVzZSBsaXN0cyB0byBhY2Nlc3MgYSBjYXJkIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24g YWJvdXQgdGhhdCBpdGVtLiBUaGlzIHN0YWNrIGFsc28gY29udGFpbnMgYW4gZXhhbXBs ZSAnYWV0ZScgcmVzb3VyY2Ugd2hpY2ggeW91IGNhbiB1c2UgdG8gYmVjb21lIGZhbWls aWFyIHdpdGggdGhlIHN0YWNr1XMgbGF5b3V0LiANDU9mIGNvdXJzZSwgeW911XJlIHBy b2JhYmx5IG1vcmUgaW50ZXJlc3RlZCBpbiB3b3JraW5nIHdpdGggYW4gJ2FldGUnIHJl c291cmNlIG9mIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvciBjcmVhdGluZyBhIHdo b2xlIG5ldyAnYWV0ZScgcmVzb3VyY2UuIEJlZm9yZSBhdHRlbXB0aW5nIHRvIGRvIGVp dGhlciBvZiB0aGVzZSwgdGhlIGZpcnN0IHRoaW5nIHlvdSBzaG91bGQgZG8gaXMgbWFr ZSBhIGNvcHkgb2YgdGhpcyBzdGFjayB0byB3b3JrIHdpdGguIFRvIGRvIHRoaXMsIGNo b29zZSDSTmV3IEVkaXRvcsnTIGZyb20gdGhlIEFldGVFZGl0b3IgbWVudS4gSWYgeW91 ciBhcHBsaWNhdGlvbiBhbHJlYWR5IGhhcyBhbiAnYWV0ZScgcmVzb3VyY2UsIHlvdSBj YW4gcmVhZCBpdCBpbnRvIHRoaXMgc3RhY2sgYnkgY2xpY2tpbmcgb24gdGhlICJJbXBv cnQgYWV0ZSIgYnV0dG9uLiBBZnRlciBjaG9vc2luZyBhbiBhcHBsaWNhdGlvbiBmcm9t IHN0YW5kYXJkIGZpbGUsIHRoZSAnYWV0ZScgcmVzb3VyY2Ugd2lsbCBiZSByZWFkIGlu IGFuZCBjb252ZXJ0ZWQgaW50byBkYXRhIHByZXNlbnRlZCBpbiB0aGUgc3RhY2suIA0N Tm9ybWFsbHksIHRoZSBzdGFjayB3aWxsIGRpc3BsYXkgdGhlIHNhbWUgY29udGVudCBh cyB0aGUgJ2FldGUnIHJlc291cmNlLiBJbiBvdGhlciB3b3JkcywgeW911WxsIHNlZSB0 aGUgY29udGVudCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpZiB5b3XVZCBvcGVuZWQgYW4g J2FldGUnIHJlc291cmNlIHVzaW5nIFJlc0VkaXQuIEhvd2V2ZXIsIHRoaXMgbWVhbnMg dGhhdCB5b3Ugd2lsbCBub3QgYmUgc2VlaW5nIGFsbCB0aGUgZXZlbnRzIGFuZCBjbGFz c2VzIHRoYXQgeW91IGhhZCBpbmhlcml0ZWQgZnJvbSB0aGUgJ2FldXQnIHJlc291cmNl LiBPcHRpb25hbGx5LCB5b3UgbWF5IGFsc28gbWVyZ2UgdGhlICdhZXRlJyByZXNvdXJj ZSB3aXRoIHRoZSAnYWV1dCcgcmVzb3VyY2Ugd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQg aW4gdGhpcyBzdGFjay4NDUFmdGVyIHlvddV2ZSByZWFkIGluIGFuICdhZXRlJyByZXNv dXJjZSAob3IgYWx0ZXJuYXRpdmVseSwgYmVndW4gd2l0aCBhbiBlbXB0eSBzdGFjayks IHlvdSBjYW4gc3RhcnQgZWRpdGluZyB0aGUgY29udGVudHMgb2YgdGhlIHN0YWNrLiBU aGVyZSBhcmUgYnV0dG9ucyB3aGljaCB5b3UgY2FuIHVzZSB0byBjcmVhdGUgY2FyZHMg Zm9yIGEgbmV3IHN1aXRlLCBldmVudCwgY2xhc3MsIGNvbXBhcmlzb24sIG9yIGVudW1l cmF0b3IuIFlvdSBtYXkgYWxzbywgaWYgeW91IHdpc2gsIHVzZSB0aGUgIk5ldyBDYXJk IiBvciDSRGVsZXRlIENhcmTTIG1lbnUgaXRlbXMgZnJvbSBIeXBlckNhcmTVcyBFZGl0 IG1lbnUuIFlvdSBjYW4gbW9kaWZ5IHRoZSAnYWV0ZScgaW5mb3JtYXRpb24gb24gdGhl c2UgY2FyZHMgYnkgY2hhbmdpbmcgdGhlIGRhdGEgaW4gdGhlcmUgZmllbGRzLiBFYWNo IGNhcmQgY29udGFpbnMgbGlzdHMgYW5kIGJ1dHRvbnMgZm9yIGFkZGluZywgZGVsZXRp bmcgb3IgYWNjZXNzaW5nIGl0ZW1zIGZvciBlZGl0aW5nLg0NQWZ0ZXIgeW91IGZpbmlz aCBlZGl0aW5nIHRoZSBzdGFjaywgeW91IG1heSBvYnRhaW4gaW5mb3JtYXRpb24gZnJv bSBpdC4gVGhpcyBpbmZvcm1hdGlvbiwgaWYgaXQgaXMgaW4gVEVYVCBmb3JtLCB3aWxs IGdvIHRvIHRoZSBzY3JhdGNocGFkIGZpZWxkIG9uIHRoZSBSZXNvdXJjZSBUb29scyBj YXJkIHdoZXJlIHlvdSBjYW4gdmlldyBpdCBpbiBpdHMgZW50aXJldHkuIFRoaXMgY2Fy ZCBhbHNvIGhhcyBidXR0b25zIHdoaWNoIGxldCB5b3UgcHJpbnQgdGhlIGluZm9ybWF0 aW9uIGluIHRoZSBzY3JhdGNocGFkLCBzYXZlIGl0IHRvIGEgZmlsZSwgb3Igd3JpdGUg aXQgdG8gdGhlIGNsaXBib2FyZC4gQWRkaXRpb25hbGx5LCB0aGVyZSBhcmUgYnV0dG9u cyBmb3IgZ2VuZXJhdGluZyBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgaW5m b3JtYXRpb246DQ2lIE91dHB1dCBhZXRlIC0gd3JpdGVzIHlvdXIgJ2FldGUnIHJlc291 cmNlIHRvIHlvdXIgYXBwbGljYXRpb24uDaUgRGVyZXogYWV0ZSAtIGdlbmVyYXRlcyB0 aGUgcmVzb3VyY2UgaW4gZGVyZXogZm9ybWF0LCB3aGljaCB5b3UgY2FuIHRoZW4gY29w eSB0byBNUFcgYW5kIHRvIHJleiB3aXRoIHlvdXIgcHJvZ3JhbS4NpSBTZXJ2ZXIgY29k ZSAtIHNhbXBsZSBjb2RlIG9uIGhvdyB5b3UgY2FuIHByb2Nlc3MgdGhlc2UgQXBwbGUg RXZlbnRzIGFzIGEgc2VydmVyLg2lIENsaWVudCBjb2RlIC0gc2FtcGxlIGNvZGUgb24g aG93IHlvdSBjYW4gc2VuZCB0aGVzZSBBcHBsZSBFdmVudHMgYXMgYSBjbGllbnQuDQ1G aW5hbGx5LCB0aGVyZSBhcmUgYSBsb3Qgb2YgaW50ZXJuYWwgbGlua3MgdGhhdCBuZWVk IHRvIGJlIG1haW50YWluZWQgYmV0d2VlbiB0aGUgY2FyZHMgb2YgdGhpcyBzdGFjaywg YSBzdWl0ZSBwb2ludHMgdG8gaXRzIGV2ZW50IGFuZCB0aGUgZXZlbnQgcG9pbnRzIHRv IGl0cyBjb2RlLCBldGMuIFRoZXNlIGxpbmtzIGFyZSBtYWludGFpbmVkIGF1dG9tYXRp Y2FsbHkuIElmIGZvciBzb21lIHJlYXNvbiB0aGVzZSBsaW5rcyBhcmUgYnJva2VuLCB0 aGVyZSBpcyBhbiBpbnRlcm5hbCBwcm9jZWR1cmUsIENvbnN0cnVjdExpbmssIHRoYXQg bGV0cyB5b3UgcmVjb25zdHJ1Y3QgdGhlIGxpbmtzIGFnYWluLiBUbyB1c2UgdGhpcyBy b3V0aW5lIHR5cGUg0kNvbnN0cnVjdExpbmvTIGluIEh5cGVyQ2FyZNVzIG1lc3NhZ2Ug Ym94IGFuZCBoaXQgdGhlIGVudGVyIGtleSB0byBleGVjdXRlIGl0LiBIb3BlZnVsbHks IHlvddVsbCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIGZlYXR1cmUuDQ0NVXNpbmcgdGhl IEFldGVFZGl0b3IgTWVudQ1Zb3UgY2FuIHVzZSB0aGlzIG1lbnUgdG8gbmF2aWdhdGUg ZnJvbSBvbmUgc2VjdGlvbiBvZiB0aGUgc3RhY2sgdG8gYW5vdGhlciBvciBwZXJmb3Jt IG90aGVyIHVzZWZ1bCB0YXNrcy4gQmVsb3cgaXMgYSBkZXNjcmlwdGlvbiBvZiBlYWNo IG1lbnUgaXRlbToNDaUgSW5zdHJ1Y3Rpb25zIC0gdGFrZXMgeW91IHRvIHRoZSBJbnN0 cnVjdGlvbnMgY2FyZC4NpSBQcmVmZXJlbmNlcyAtIHRha2VzIHlvdSB0byB0aGUgUHJl ZmVyZW5jZXMgY2FyZC4NpSBSZXNvdXJjZSBUb29scyAtIHRha2VzIHlvdSB0byB0aGUg UmVzb3VyY2UgVG9vbHMgY2FyZC4NpSCuIFN1aXRlcyAtIHRha2VzIHlvdSB0byB0aGUg Zmlyc3QgQXBwbGUgRXZlbnQgU3VpdGVzIGNhcmQuDaUgRXZlbnRzIC0gdGFrZXMgeW91 IHRvIHRoZSBmaXJzdCBldmVudCBjYXJkIG9mIHRoZSBmaXJzdCBzdWl0ZSBsaXN0ZWQg aW4gUmVzb3VyY2UgVG9vbHMuDaUgQ2xhc3Nlcy0gdGFrZXMgeW91IHRvIHRoZSBmaXJz dCBjbGFzcyBjYXJkIG9mIHRoZSBmaXJzdCBzdWl0ZSBsaXN0ZWQgaW4gUmVzb3VyY2Ug VG9vbHMuDaUgRW51bWVyYXRpb25zLSB0YWtlcyB5b3UgdG8gdGhlIGZpcnN0IGVudW1l cmF0aW9uIGNhcmQgb2YgdGhlIGZpcnN0IHN1aXRlLg2lIENvbXBhcmlzb25zIC0gdGFr ZXMgeW91IHRvIHRoZSBmaXJzdCBjb21wYXJpc29uIGNhcmQgb2YgdGhlIGZpcnN0IHN1 aXRlIGxpc3RlZCBpbiBSZXNvdXJjZSBUb29scy4NpSBOZXcgRWRpdG9yySAtIGNyZWF0 ZXMgYW4gZW1wdHkgY29weSBvZiB0aGUgc3RhY2sgYW5kIHRoZW4gdGFrZXMgeW91IHRv IGl0LiBIb2xkaW5nIGRvd24gdGhlIHNoaWZ0IGtleSB0YWtlcyB5b3UgdG8gdGhpcyBz dGFjayBpbiBhIG5ldyB3aW5kb3cuDaUgRW1wdHkgU3RhY2vJIC0gY2xlYXJzIHRoZSBz dGFjayBvZiBhbnkgc3RvcmVkINRhZXRl1SBpbmZvcm1hdGlvbi4gVGhpcyBhY3Rpb24g aXMgbm90IHVuZG9hYmxlLg2lIExvY2FsaXplIGFldGXJIC0gY3JlYXRlcyBhIG5ldyBz dGFjayBpbiB3aGljaCB5b3UgY2FuIHRyYW5zbGF0ZSBuYW1lcyBpbiB0aGUgYWN0aXZl IEFldGVFZGl0b3Igc3RhY2sgaW50byBhbm90aGVyIGxhbmd1YWdlLg0NDVVzaW5nIHRo ZSBSZXNvdXJjZSBUb29scyBDYXJkDVRoZXJlIGFyZSB0d28gZmllbGRzIG9uIHRoaXMg Y2FyZC4gVGhlIGxhcmdlciBvZiB0aGUgdHdvIGlzIGEgc2NyYXRjaHBhZCBhcmVhIHdo aWNoIGNhbiBiZSB1c2VkIGZvciB0aGUgb3V0cHV0IG9mIGNsaWVudCBvciBzZXJ2ZXIg c2FtcGxlIGNvZGUsIG9yIHRoZSBvdXRwdXQgb2YgYSBkZXJlemVkICdhZXRlJyByZXNv dXJjZS4gVGhlcmUgYXJlIGZvdXIgYnV0dG9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBm aWVsZCBhcyBkZXNjcmliZWQgYmVsb3c6DQ2lIENsZWFyIEZpZWxkIC0gY2xlYXJzIHRo ZSBjb250ZW50cyBvZiB0aGUgc2NyYXRjaHBhZCBmaWVsZC4NpSBDb3B5IEZpZWxkIC0g Y29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgc2NyYXRjaHBhZCBmaWVsZCBpbnRvIHRo ZSBjbGlwYm9hcmQuDaUgUHJpbnQgRmllbGQgLSBwcmludHMgdGhlIGNvbnRlbnRzIG9m IHRoZSBzY3JhdGNocGFkIGZpZWxkLg2lIFNhdmUgQXPJIC0gc2F2ZXMgdGhlIGNvbnRl bnQgb2YgdGhlIHNjcmF0Y2hwYWQgZmllbGQgdG8gYSBURVhUIGZpbGUuDQ1UaGUgb3Ro ZXIgZmllbGQgaXMgYSBsaXN0IG9mIHRoZSBzdWl0ZXMgaW4gdGhpcyBzdGFjay4gWW91 IGNhbiBhY2Nlc3Mgc3VpdGUgaW5mb3JtYXRpb24gYnkgY2xpY2tpbmcgb24gb25lIG9m IHRoZSBzdWl0ZSBjb2RlcyBpbiB0aGUgbGlzdC4gU2VsZWN0IHRoZSAiTmV3IHN1aXRl IiBidXR0b24gbG9jYXRlZCBiZWxvdyB0aGlzIGZpZWxkIHRvIGNyZWF0ZSBhIG5ldyBz dWl0ZS4NDUNsaWNraW5nIG9uIHRoZSAiUHJlZmVyZW5jZXPJIiBidXR0b24gd2lsbCB0 YWtlIHlvdSB0byB0aGUgUHJlZmVyZW5jZXMgY2FyZNFzZWUgdGhlIHNlY3Rpb24gb24g dGhlIFByZWZlcmVuY2VzIGNhcmQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2V0 dGluZyBQcmVmZXJlbmNlcy4NDU9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGlzIGNh cmQgeW911WxsIG5vdGljZSB0aGF0IHRoZXJlIGFyZSBhIG51bWJlciBvZiBidXR0b25z IHRoYXQgYWxsb3cgeW91IHRvIGltcG9ydCDUYWV0ZdUgZGF0YSBvciBnZW5lcmF0ZSBp bmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHN0YWNrLiBUaGV5 IGFyZSBkZXNjcmliZWQgYmVsb3c6DQ2lIE91dHB1dCBhZXRlIC0gd3JpdGVzIHRoZSAn YWV0ZScgb3V0IHRvIHlvdXIgYXBwbGljYXRpb24uIEFmdGVyIHRoZSByZXNvdXJjZSBk YXRhIGlzIGNyZWF0ZWQsIHlvdSB3aWxsIGJlIGFza2VkIHdoaWNoIGZpbGUgdG8gc2F2 ZSBpdCB0by4gSWYgeW91IGNhbmNlbCBvdXQgb2YgdGhpcyBzdGFuZGFyZCBmaWxlIGRp YWxvZywgdGhlIGNvbnRlbnRzIG9mIHRoZSDUYWV0ZdUgd2lsbCBiZSBwdXQgb24gdGhl IGNsaXBib2FyZC4gVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3aXNoIHRvIHBhc3Rl IHRoaXMgcmVzb3VyY2UgaW50byBhIGZpbGUgdXNpbmcgUmVzRWRpdC4gDQ2lIEltcG9y dCBhZXRlIC0gbGV0cyB5b3UgcmVhZCBpbiBhbiAnYWV0ZScgcmVzb3VyY2UgZnJvbSBh IGZpbGUuIElmIHlvdSBnZXQgYSBuZXcgYXBwbGljYXRpb24sIGZvciBpbnN0YW5jZSwg YW5kIHdpc2ggdG8gZmluZCBvdXQgd2hpY2ggQXBwbGUgZXZlbnRzIGl0IHN1cHBvcnRz IHRvIHVzZSB0aGlzIGZlYXR1cmUsIHRoaXMgaXMgd2hhdCB5b3XVZCBkby4gQ3JlYXRl IGEgbmV3IHN0YWNrIGJ5IGNob29zaW5nIHRoZSDSTmV3IEVkaXRvcsnTIG1lbnUgaXRl bSBmcm9tIHRoZSBBZXRlRWRpdG9yIG1lbnUuIE5leHQsIGNsaWNrIHRoZSBJbXBvcnQg YWV0ZSBidXR0b24gdG8gcmVhZCB0aGUgJ2FldGUnIHJlc291cmNlIGZyb20gdGhlIGZp bGUgeW911XZlIGNob3NlbiBpbnRvIHRoZSBzdGFjay4gQWx0ZXJuYXRpdmVseSwgaG9s ZCBkb3duIHRoZSBvcHRpb24ga2V5IHdoaWxlIGNsaWNraW5nIG9uIHRoZSBJbXBvcnQg YWV0ZSBidXR0b24gdG8gbWVyZ2UgdGhlINRhZXRl1SBkYXRhIHdpdGggdGhlIHN0YWNr 1XMgYnVpbHQtaW4gJ2FldXQnIHJlc291cmNlLiAgKEluIHRoZSBmdXR1cmUsIHdoZW4g dGhlICdhZXV0JyByZXNvdXJjZSBnZXRzIHJldmlzZWQsIHlvddVsbCB3YW50IHRvIGNv cHkgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgcmVzb3VyY2UgaW50byB0aGUgc3RhY2sg dG8ga2VlcCBpdCB1cCB0byBkYXRlKS4gQnkgdXNpbmcgdGhpcyBvcHRpb24sIHRoZSBl dmVudHMgYW5kIGNsYXNzZXMgZnJvbSBidWlsdC1pbiAnYWV1dCcgcmVzb3VyY2UgYW5k IG5vdCBmcm9tIHRoZSAnYWV0ZScgZGF0YSB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoIGFu ZCB3aWxsIG5vdCBnZXQgd3JpdHRlbiB3aGVuIHRoZSAnYWV0ZScgcmVzb3VyY2UgaXMg d3JpdHRlbiBvdXQuIFBsZWFzZSBub3RlIGhvd2V2ZXIsIHRoYXQgbm8gYXR0ZW1wdCBp cyBtYWRlIHRvIHdyaXRlIGl0IG91dCBpbiBpdNVzIG1vc3QgY29tcGFjdCBmb3JtLiBJ ZiB5b3UgYXJlIGNvbmNlcm5lZCB3aXRoIGtlZXBpbmcgdGhlICdhZXRlJyBpbiBpdHMg bW9zdCBjb21wYWN0IGZvcm0sIHlvdSBzaG91bGQgbm90IHVzZSB0aGUgb3B0aW9uIGF0 IHRoaXMgdGltZS4gDQ1Zb3UgbWF5IHdvbmRlciB3aGF0IG1pZ2h0IGhhcHBlbiBpZiB5 b3UgZGlkbtV0IGVtcHR5IHRoZSBzdGFjayBiZWZvcmUgeW91IGltcG9ydGVkIGFuICdh ZXRlJyByZXNvdXJjZS4gVGhlIG9yaWdpbmFsIGNvbnRlbnQgd291bGQgcmVtYWluLCBh bmQgdGhlIGV4dGVybmFsICdhZXRlJyB3b3VsZCBlaXRoZXIgYmUgYWRkZWQgdG8gdGhl IHN0YWNrIG9yIGl0IHdvdWxkIHJlcGxhY2UgYW4gZXhpc3RpbmcgZXZlbnQgaW4gdGhl IHN0YWNrLiBUaGlzIHdvdWxkIGJlIGRvbmUgb24gYSB3aG9sZSBldmVudCBiYXNpcywg YW5kIHRoZXJlIHdvdWxkIGJlIG5vIGF0dGVtcHQgdG8gbWVyZ2UgdGhlIGRhdGEgaW50 byB0aGUgc2FtZSBldmVudC4gDQ2lIERlcmV6IGFldGUgLSBwcm9kdWNlcyBkYXRhIGlu IGRlcmV6IGZvcm1hdCwgd2hpY2ggdGhlbiBjYW4gYmUgY29waWVkIHRvIE1QVyBhbmQg cmV6ZWQgd2l0aCB5b3VyIHByb2dyYW0uIFRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5k IGlzIHRleHR1YWwgYW5kIGFwcGVhcnMgaW4gdGhlIHNjcmF0Y2hwYWQgYXJlYS4gSW4g dGhlIGNhc2UgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBpcyA+IDMySywgaXQgd2ls bCBiZSB3cml0dGVuIHRvIGEgVEVYVCBmaWxlIGluc3RlYWQuDQ2lIFNlcnZlciBjb2Rl IC0gZ2VuZXJhdGVzIHNhbXBsZSBjb2RlIHdoaWNoIHNob3dzIGhvdyB5b3UgY2FuIHBy b2Nlc3MgQXBwbGUgZXZlbnRzIGFzIGEgc2VydmVyLiBUaGUgc2FtcGxlIGNvZGUgZGlz cGxheWVkIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBQYXNjYWwgYW5kIEMuIFdpdGggYXNz ZW1ibGVyLCBvbmx5IG5hbWUgY29uc3RhbnRzIHdpbGwgYmUgZGlzcGxheWVkLiBJZiB5 b3UgYXJyaXZlIGF0IHRoaXMgY2FyZCBmcm9tIGFuIGV2ZW50IGNhcmQsIHlvdSBjYW4g aG9sZCBkb3duIHRoZSBvcHRpb24ga2V5IHdoaWxlIGNsaWNraW5nIHRoaXMgYnV0dG9u IHRvIGdlbmVyYXRlIHNhbXBsZSBjb2RlIGZyb20gYSBzaW5nbGUgZXZlbnQgaW5zdGVh ZCBvZiBmcm9tIGFsbCBldmVudHMuDQ2lIENsaWVudCBjb2RlIC0gZ2VuZXJhdGVzIHNh bXBsZSBjb2RlIHdoaWNoIHNob3dzIHlvdSBob3cgeW91IGNhbiBzZW5kIEFwcGxlIGV2 ZW50cyBhcyBhIGNsaWVudC4gWW91IGNhbiBjaG9vc2Ugd2hpY2ggbGFuZ3VhZ2UgaW4g d2hpY2ggdG8gdmlldyB0aGUgY29kZSBmcm9tIHRoZSBQcmVmZXJlbmNlcyBjYXJkLiBZ b3UgY2FuIHRoaW5rIG9mIHRoaXMgYXMgYSBkeW5hbWljIGN1c3RvbSBzYW1wbGUgY29k ZSBnZW5lcmF0b3Igd2hpY2ggY3JlYXRlcyBjdXN0b20gY29kZSB0YWlsb3JlZCB0byB5 b3VyIHBhcnRpY3VsYXIgYXBwbGljYXRpb24uIFlvdSBtaWdodCBldmVuIGJlIGFibGUg dG8gY29weSB0aGUgY29kZSBhbmQgdHJ5IGl0IGluIGEgcHJvZ3JhbSBhcyBpcywgYnV0 IHBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoaXMgc2FtcGxlIGNvZGUgaGFzIG5vdCBiZWVu IHRlc3RlZCBpbiB0aGlzIHZlcnNpb24gYW5kIG1heSBub3Qgd29yayBjb21wbGV0ZWx5 LiBJZiB5b3UgYXJyaXZlIGF0IHRoaXMgY2FyZCBmcm9tIGFuIGV2ZW50IGNhcmQsIHlv dSBjYW4gaG9sZCBkb3duIHRoZSBvcHRpb24ga2V5IHdoaWxlIGNsaWNraW5nIHRoaXMg YnV0dG9uIHRvIGdlbmVyYXRlIHNhbXBsZSBjb2RlIGZyb20gYSBzaW5nbGUgZXZlbnQg aW5zdGVhZCBvZiBmcm9tIGFsbCBldmVudHMuDQ0NU2V0dGluZyBQcmVmZXJlbmNlcw1Z b3UgY2FuIGFjY2VzcyB0aGUgUHJlZmVyZW5jZXMgY2FyZCBieSBjbGlja2luZyBvbiB0 aGUg0lByZWZlcmVuY2XJ0yBidXR0b24gb24gdGhlIFJlc291cmNlIFRvb2xzIGNhcmQg b3IgYnkgY2hvb3Npbmcg0lByZWZlcmVuY2Vz0yBmcm9tIHRoZSBBZXRlRWRpdG9yIG1l bnUuIEZyb20gdGhpcyBjYXJkIHlvdSBjYW4gc3BlY2lmeSBoZWFkZXIgaW5mb3JtYXRp b24gYW5kIGNob29zZSBpdGVtcyBmcm9tIGFuIGFzc29ydG1lbnQgb2Ygb3B0aW9ucy4g QmVsb3cgYXJlIHNvbWUgb2YgdGhlIGl0ZW1zIG9uIHRoZSBQcmVmZXJlbmNlcyBjYXJk IGFuZCB3aGF0IHRoZXkgZG86DQ2lIFJlc291cmNlIFR5cGUgLSBkZXRlcm1pbmVzIHRo ZSByZXNvdXJjZSB0eXBlIG9mIHRoZSByZXNvdXJjZS4gSXQgc2hvdWxkIG5vcm1hbGx5 IGJlICdhZXRlJy4gT24gdGhlIHJhcmUgb2NjYXNpb24gd2hlcmUgeW91IG1pZ2h0IHdh bnQgdG8gd3JpdGUgaXQgb3V0IGFzIGFuICdhZXV0JywgeW91IGNhbiBjaGFuZ2UgdGhp cyBpdGVtIHRvICdhZXV0JyBiZWZvcmUgeW91IG91dHB1dCBpdC4NpSBDbGllbnQgTGFu Z3VhZ2UgLSBsZXRzIHlvdSBjaG9vc2Ugd2hpY2ggY2xpZW50IGxhbmd1YWdlIHlvdSB3 aXNoIHRvIHVzZS4gVGhlIGNob2ljZXMgaW4gdGhpcyB2ZXJzaW9uIGlzIG9mIHRoZSBz dGFjayBhcmU6ICdhZXRlJyBuYW1lLCBIeXBlclRhbGssIE1QVyBTaGVsbCwgUGFzY2Fs LCBhbmQgQy4gSWYgeW91IGRvbtV0IG5lZWQgdG8gZ2VuZXJhdGUgYW55IHNhbXBsZSBj b2RlIHlvdSBzaG91bGQgc2V0IHRoaXMgaXRlbSB0byAnYWV0ZScgbmFtZSwgb3RoZXJ3 aXNlIGl0IHdpbGwgYmUgc2xvd2VyIHRvIGVkaXQgZXZlbnQgcGFyYW1ldGVycy4gRm9y IGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGNsaWVudCBsYW5ndWFnZXMsIHJl ZmVyIHRvIHRoZSBhcHBlbmRpeCBhdCB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQuDaUg U2VydmVyIExhbmd1YWdlIC0gbGV0cyB5b3UgY2hvb3NlIHRoZSBzZXJ2ZXIgbGFuZ3Vh Z2UgeW911WxsIGJlIHVzaW5nLiBUaGUgY2hvaWNlcyBpbiB0aGlzIHZlcnNpb24gaXMg b2YgdGhlIHN0YWNrIGFyZTogUGFzY2FsLCBDLCBhbmQgQXNzZW1ibGVyLiBJZiBBc3Nl bWJsZXIgaGFzIGJlZW4gY2hvc2VuLCB0aGVuIG9ubHkgdGhlIGNvbnN0YW50cyB3aWxs IGJlIGdlbmVyYXRlZC4NpSBTb3J0IEV2ZW50cyBieSBOYW1lIC0gd2hlbiBhbiAnYWV0 ZScgcmVzb3VyY2UgaXMgcmVhZCBpbiwgdGhlIG9yZGVyaW5nIG9mIHRoZSBldmVudHMs IGNsYXNzZXMsIGV0Yy4gd2lsbCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFy ZSBpbiB0aGUgcmVzb3VyY2UuIFRoZXJlZm9yZSB3aGVuIHlvdSB3cml0ZSBpdCBvdXQs IGl0IHdpbGwgYWxzbyByZXRhaW4gaXRzIG9yZGVyaW5nLiBJZiB5b3UgZG9u1XQgcmVh bGx5IGNhcmUgYWJvdXQgcHJlc2VydmluZyB0aGlzIG9yZGVyLCB0aGVuIGNoZWNraW5n IHRoaXMgaXRlbSB3aWxsIHNvcnQgdGhlc2UgZWxlbWVudHMgYWxwaGFiZXRpY2FsbHku DQ1UaGUgb3RoZXIgb3B0aW9ucyBvbiB0aGUgUHJlZmVyZW5jZXMgY2FyZCBhcmUgZm9y IHVzZSB3aXRoIFBhc2NhbCBjbGllbnQgc2FtcGxlIG9ubHkuIFBsZWFzZSByZWZlciB0 byB0aGUgc2VjdGlvbiBvZiB0aGlzIGRvY3VtZW50IHdoaWNoIGNvdmVycyB0aGF0IGZv ciBtb3JlIGluZm9ybWF0aW9uLg0NVHJhbnNsYXRpb24gVGFibGUNVGhpcyBidXR0b24g Y3JlYXRlcyBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBsb2NhbGl6YWJsZSBuYW1lcyBpbiB0 aGUgQWV0ZUVkaXRvciBzdGFjayBhbmQgcGxhY2VzIHRoZW0gd2l0aCB0cmFuc2xhdGlv biBwbGFjZWhvbGRlcnMgaW50byB0aGUg0kNvZGUgU2NyYXRjaHBhZNMgZmllbGQgb2Yg dGhlINJSZXNvdXJjZSBUb29sc9MgY2FyZC4NDUVkaXRpbmcgYW4griBTdWl0ZXMgQ2Fy ZA1FYWNoIK4gU3VpdGUgY2FyZCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQg aXRzIHN1aXRlIGFuZCBhY3RzIGFzIGEgdGFibGUgb2YgY29udGVudHMgZm9yIGFsbCBv ZiB0aGUgZXZlbnRzLCBjbGFzc2VzLCBjb21wYXJpc29uIG9wZXJhdG9ycywgYW5kIGVu dW1lcmF0b3JzIGluIGl0LiBZb3UgY2FuIGNsaWNrIG9uZSBvZiB0aGVzZSBpdGVtcyB0 byBnbyB0byBhIGNhcmQgd2hlcmUgeW91IGNhbiBlZGl0IGl0cyBjb250ZW50cy4gQ2xp Y2sgb24gdGhlINJOZXfTIGJ1dHRvbiBuZXh0IHRvIGVhY2ggc2VjdGlvbiB0byBhZGQg YW4gaXRlbSBhbmQgZ28gdG8gYSBuZXcgY2FyZCBmb3IgaXQuIElmIHlvdSBjaG9vc2Ug dG8gZGVsZXRlIG9yIHJlbmFtZSBhbiBpdGVtLCBtYWtlIHN1cmUgdGhhdCB5b3UgZG8g dGhpcyBmcm9tIHRoZSBpdGVt1XMgY2FyZCByYXRoZXIgdGhhbiBhbiCuIFN1aXRlIGNh cmQuDQ0NRWRpdGluZyBhbiBFdmVudCBDYXJkDUVhY2ggRXZlbnQgY2FyZCBjb250YWlu cyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGV2ZW50LiBDbGlja2luZyB0aGUg0lNob3cg U2NyaXB00yBvciDSSGlkZSBTY3JpcHTTIGJ1dHRvbnMgd2lsbCBkaXNwbGF5IG9yIGhp ZGUgYSBmaWVsZCB3aGljaCBzdW1tYXJpemVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24g YWJvdXQgdGhlIGV2ZW50IHBhcmFtZXRlcnMuIFRoaXMgZmllbGQgYWxzbyBhY3RzIGFz IGEgZGlyZWN0b3J5IGZvciBldmVudHMuIE9ubHkgb25lIHBhcmFtZXRlciBpbiB0aGlz IGZpZWxkIGNhbiBiZSBlZGl0ZWQgYXQgYSB0aW1lLiBDbGlja2luZyBvbiBhIHBhcmFt ZXRlciB3aWxsIGFsbG93IHlvdSB0byBlZGl0IGl0LiBBZnRlciBkb2luZyB0aGlzLCB0 aGUgcGFyYW1ldGVyIHN1bW1hcnkgZmllbGQgd2lsbCBiZSBoaWRkZW4gYW5kIHRoZSBw YXJhbWV0ZXIgeW91IGNsaWNrZWQgb24gd2lsbCBiZSBkaXNwbGF5ZWQgc28gdGhhdCB5 b3UgY2FuIGVkaXQgaXRzIGNvbnRlbnRzLiBUaGUgcGFyYW1ldGVy1XMgYXR0cmlidXRl cyBjYW4gYmUgY2hhbmdlZCBieSBjbGlja2luZyBvbiB0aGUgYXR0cmlidXRlIGJpdCBj aGVjayBib3hlcy4gV2UgdXNlIHRocmVlIG9mIHRoZXNlIGJpdHMgZm9yIHVzZSB3aXRo IHRoZSBQYXNjYWwgcGFyYW1ldGVyIGRhdGEgdHlwZS4gQ2xpY2tpbmcgdGhlIGxvd2Vy IDMgYml0cyBvZiB0aGUgY2hlY2sgYm94IHdpbGwgaW52b2tlIGEgcG9wIHVwIG1lbnUu IEFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGJ1dHRvbnMsIGxpc3Rl ZCBiZWxvdywgZm9yIG5hdmlnYXRpbmcgZnJvbSBvbmUgcGFyYW1ldGVyIHRvIGFub3Ro ZXIuDQ2lIFByZXYgLSBkaXNwbGF5cyB0aGUgcHJldmlvdXMgZXZlbnQgcGFyYW1ldGVy LiBOb3RlIHRoYXQgZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgb3JkZXJpbmcsIHRoZSBy ZXBseSBkaXJlY3QgcGFyYW1ldGVyIGlzIHRyZWF0ZWQgYXMgdGhlIGZpcnN0IHBhcmFt ZXRlciwgYW5kIHRoZSBkaXJlY3QgcGFyYW1ldGVyIGlzIHRyZWF0ZWQgYXMgdGhlIHNl Y29uZCBwYXJhbWV0ZXIuDaUgTmV4dCAtIGRpc3BsYXlzIHRoZSBuZXh0IHBhcmFtZXRl ciBvZiB0aGUgZXZlbnQuDaUgTmV3IC0gYWRkcyBhIG5ldyBwYXJhbWV0ZXIgYXQgdGhl IGVuZCBvZiB0aGUgZXZlbnQuIE5vdGUgdGhhdCB0aGUgZGlyZWN0IGFuZCB0aGUgcmVw bHkgcGFyYW1ldGVyIGlzIGFsd2F5cyBpbiB0aGUgJ2FldGUnIHJlc291cmNlLiBBYnNl bmNlIG9mIHRoZSBkaXJlY3QgcGFyYW1ldGVyIGlzIGluZGljYXRlZCBieSB0aGUgdHlw ZSAnbnVsbCcuIFRvIGNyZWF0ZSB0aGUgZGlyZWN0IHBhcmFtZXRlciwgZG8gbm90IGNs aWNrIHRoZSBOZXcgYnV0dG9uLiBJbnN0ZWFkLCBkaXNwbGF5IHRoZSBkaXJlY3QgcGFy YW1ldGVyIGFuZCB0aGVuIGNoYW5nZSBpdHMgZGF0YSB0eXBlIHRvIGFueXRoaW5nIGJ1 dCBudWxsLg2lIERlbGV0ZSAtIGRlbGV0ZXMgdGhlIGRpc3BsYXllZCBwYXJhbWV0ZXIu IFRvIGRlbGV0ZSB0aGUgZGlyZWN0IG9yIHJlcGx5IHBhcmFtZXRlciwgZG8gbm90IHVz ZSB0aGlzIGJ1dHRvbi4gSW5zdGVhZCwgY2hhbmdlIHRoZSBkYXRhIHR5cGUgb2YgdGhl IHBhcmFtZXRlciB0byAnbnVsbCcuDaUgSW5zZXJ0IC0gaW5zZXJ0cyBhIG5ldyBwYXJh bWV0ZXIgYWZ0ZXIgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgb25lICh1bmxlc3MgdGhp cyBwYXJhbWV0ZXIgaXMgdGhlIHJlcGx5IHBhcmFtZXRlciwgdGhlbiB0aGUgbmV3IHBh cmFtZXRlciBpcyBjcmVhdGVkIGFmdGVyIHRoZSBkaXJlY3QgcGFyYW1ldGVyKS4gVXNl IHRoaXMgYnV0dG9uIGluc3RlYWQgb2YgIk5ldyIgaWYgeW91IHdhbnQgYSBwYXJhbWV0 ZXIgdG8gaW5zZXJ0ZWQgaW4gYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLg2lIEhpZGUgU2Ny aXB0IC0gaGlkZXMgdGhlIHBhcmFtZXRlciBzdW1tYXJ5IGZpZWxkIHJldmVhbGluZyB0 aGUgcGFyYW1ldGVyIGVkaXRpbmcgYnV0dG9ucy4NpSBTaG93IFNjcmlwdCAtIGRpc3Bs YXlzIHRoZSBwYXJhbWV0ZXIgc3VtbWFyeSBmaWVsZCBoaWRpbmcgdGhlIHBhcmFtZXRl ciBlZGl0aW5nIGJ1dHRvbnMuDQ1BY2NvcmRpbmcgdG8gdGhlICdhZXRlJyBkZWZpbml0 aW9uLCBpZiB0aGUgZW51bSBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgZGF0YSB0eXBlIGlz IGludGVycHJldGVkIGFzIGEgZW51bWVyYXRpb24gSUQuIEluIHRoaXMgY2FzZSwgeW91 IGNhbiBjbGljayBvbiB0aGUgdHlwZSBidXR0b24gdG8gZ28gdG8gdGhhdCBlbnVtZXJh dGlvbiBJRCBjYXJkLg0NDUVkaXRpbmcgYSBDbGFzcyBDYXJkDUEgQ2xhc3MgY2FyZCBj b250YWlucyBhIHByb3BlcnR5IGxpc3QgYW5kIGdyb3VwIG9mIGF0dHJpYnV0ZXMgYXNz b2NpYXRlZCB3aXRoIGVhY2ggcHJvcGVydHkuIFRoZSBlZGl0aW5nIG9mIHRoZSBwcm9w ZXJ0aWVzIG9uIGEgQ2xhc3MgY2FyZCBpcyB2ZXJ5IHNpbWlsYXIgdG8gZWRpdGluZyB0 aGUgcGFyYW1ldGVycyBvZiBhbiBFdmVudCBjYXJkLiBDbGljayBvbiAiUHJldiIgb3Ig Ik5leHQiIGJ1dHRvbnMgdG8gdmlldyB0aGUgcHJldmlvdXMgb3IgbmV4dCBwcm9wZXJ0 eSBpbiBhIGxpc3QuIENsaWNrIG9uIHRoZSAiTmV3IiBidXR0b24gdG8gY3JlYXRlIGEg bmV3IHByb3BlcnR5IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuIENsaWNrIG9uIHRoZSAi SW5zZXJ0IiBidXR0b24gdG8gYWRkIGEgcHJvcGVydHkganVzdCBhZnRlciB0aGUgY3Vy cmVudGx5IGRpc3BsYXllZCBvbmUuIENsaWNrIG9uICJEZWxldGUiIHRvIGRlbGV0ZSBh IHByb3BlcnR5Lg0NVGhlIGVsZW1lbnQgbGlzdCBpcyBqdXN0IGEgZmllbGQgb24gdGhl IGNhcmQgYXQgdGhpcyB0aW1lLiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gdXNlciBpbnRl cmZhY2UgdG8gZWRpdCB0aGUgZWxlbWVudCBsaXN0LCBzbyB5b3XVbGwgaGF2ZSB0byBl ZGl0IHRoZSBsaXN0IGRpcmVjdGx5LiBUaGUgZWxlbWVudCBsaXN0IGlzIHN0cnVjdHVy ZWQgaW4gYSB3YXkgdGhhdCB0aGUgaW5mb3JtYXRpb24gb2YgZWFjaCBlbGVtZW50IG9j Y3VwaWVzIG9uZSBsaW5lLiBFYWNoIGxpbmUgaGFzIGEgbnVtYmVyIG9mIGl0ZW1zIHNl cGFyYXRlZCBieSBjb21tYSBhbmQgZWFjaCBpdGVtIHNob3VsZCBiZSBmb3VyIGNoYXJh Y3RlcnMgbG9uZy4gVGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGNsYXNzIElEIG9mIHRoZSBl bGVtZW50LiBUaGUgb3RoZXIgaXRlbXMgYXJlIHRoZSBrZXkgZm9ybXMuDQ0NRWRpdGlu ZyBhbiBFbnVtZXJhdGlvbiBjYXJkDUVhY2ggRW51bWVyYXRpb24gY2FyZCBoYXMgYSBs aXN0IG9mIGVudW1lcmF0b3JzLiBUaGUgRW51bWVyYXRpb24gTGlzdCBmaWVsZCBhdCB0 aGUgYm90dG9tIG9mIHRoZSBjYXJkIHNlcnZlcyBhcyBhbiBpbmRleC4gQ2xpY2sgb25l IG9mIHRoZSBlbnVtZXJhdG9ycyB0byBlZGl0IGl0LiBZb3UgY2FuIGFsc28gY2xpY2sg b24gIlByZXYiIG9yICJOZXh0IiBidXR0b25zIHRvIHZpZXcgdGhlIHByZXZpb3VzIG9y IG5leHQgZW51bWVyYXRlciBpbiB0aGUgbGlzdC4gQ2xpY2sgb24gdGhlICJOZXciIGJ1 dHRvbiB0byBjcmVhdGUgYSBuZXcgZW51bWVyYXRlciBhdCB0aGUgZW5kIG9mIHRoZSBs aXN0LiBDbGljayBvbiB0aGUgIkluc2VydCIgYnV0dG9uIHRvIGFkZCBhbiBlbnVtZXJh dGVyIGp1c3QgYWZ0ZXIgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgb25lLiBDbGljayBv biAiRGVsZXRlIiB0byBkZWxldGUgYW4gZW51bWVyYXRpb24uDQ0NRWRpdGluZyBhIENv bXBhcmlzb24gT3BlcmF0b3IgQ2FyZA1FYWNoIENvbXBhcmlzb24gT3BlcmF0aW9uIGNh cmQgY29udGFpbnMgYSBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgc3VpdGUgY29kZSwgYSBj b21wYXJpc29uIG9wZXJhdG9yIG5hbWUsIGFuIElELCBhbmQgYSBjb21tZW50LiBDb21w bGV0ZSB0aGVzZSBmaWVsZHMgdG8gYWRkIG9yIGVkaXQgY29tcGFyaXNvbiBvcGVyYXRv cnMuDQ0NTG9jYWxpemF0aW9uDUFsdGhvdWdoIGl01XMgcG9zc2libGUgdG8gbG9jYWxp emUgeW91ciDUYWV0ZdUgcmVzb3VyY2UgYnkgbWFraW5nIGEgY29weSBvZiB5b3VyIHN0 YWNrLCBhbmQgdGhlbiBsb2NhdGluZyBhbmQgdHJhbnNsYXRpbmcgZXZlcnkgbmFtZSBp biBpdCwgdGhpcyBpcyBhIHZlcnkgdGVkaW91cyBwcm9jZXNzLCBlc3BlY2lhbGx5IGlm IHlvdSBoYXZlIHRvIGRvIGl0IG1hbnkgdGltZXMuIEZvcnR1bmF0ZWx5LCB0aGlzIHN0 YWNrIHByb3ZpZGVzIGEgbWV0aG9kIHdoaWNoIHNpbXBsaWZpZXMgdGhpcyBvcGVyYXRp b24uIA0NV2hlbiB5b3Ugc2VsZWN0IHRoZSDSTG9jYWxpemUgYWV0ZcnTIGNvbW1hbmQg ZnJvbSB0aGUgQWV0ZUVkaXRvciBtZW51LCB5b3XVbGwgZmlyc3QgYmUgYXNrZWQgd2hl cmUgeW911WQgbGlrZSB0byBzdG9yZSB0aGUgdHJhbnNsYXRlZCBjb3B5IG9mIHRoZSBl ZGl0b3Igc3RhY2sgd2hpY2ggd2FzIGZyb250bW9zdCB3aGVuIHRoZSBjb21tYW5kIHdh cyBleGVjdXRlZC4gWW91IHdpbGwgdGhlbiBiZSBhc2tlZCBpZiB5b3Ugd2lzaCB0byB1 c2UgYSB0cmFuc2xhdGlvbiB0YWJsZSBmaWxlLiBBIHRyYW5zbGF0aW9uIHRhYmxlIGZp bGUgaXMgYSB0ZXh0IGZpbGUgd2hlcmUgdGhlIG9kZCBudW1iZXIgbGluZXMgYXJlIG5h bWVzIGZyb20gdGhlIGFldGUgc3RhY2sgaW4gdGhlIHNvdXJjZSBsYW5ndWFnZSwgYW5k IHRoZSBsaW5lIGZvbGxvd2luZyB0aGF0IGlzIHRoZSB0cmFuc2xhdGlvbiBpbiB0aGUg dGFyZ2V0IGxhbmd1YWdlLiBJZiB5b3UgZG8gaGF2ZSBvbmUsIHRoZW4geW91IHdpbGwg YmUgYXNrZWQgaWYgeW91IG5lZWQgdG8gY29uZmlybSB0aGUgdHJhbnNsYXRpb24uIA0N V2hlbiB0aGUgbG9jYWxpemF0aW9uIHRha2VzIHBsYWNlLCBhbGwgdGhlIGxvY2FsaXph YmxlIG5hbWVzIGluIHRoZSBzdGFjayB3aWxsIGJlIHByZXNlbnRlZCB0byB5b3Ugdmlh IGRpYWxvZ3MgYW5kIHlvdSB3aWxsIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvIGNoYW5n ZSBlYWNoIG9uZS4gQnkgZGVmYXVsdCwgdGhlIGN1cnJlbnQgbmFtZSBhcHBlYXJzIGlu IHRoZSB0ZXh0IGVudHJ5IGJveCBvZiBlYWNoIGRpYWxvZy4gSWYgeW911XZlIGNob3Nl biBhIHRyYW5sYXRpb24gdGFibGUgdG8gd29yayB3aXRoLCB0aGUgdHJhbnNsYXRpb25z IHN0b3JlZCBpbiB0aGlzIGZpbGUgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRleHQg ZW50cnkgYm94IG9mIHRoZSBkaWFsb2cuIElmIHlvdSBkZWNpZGUgdGhhdCB5b3UgZG9u 1XQgbmVlZCBhbnkgZnVydGhlciBjb25maXJtYXRpb24gb2YgdHJhbnNsYXRpb25zIGRp c3BsYXllZCBmcm9tIHRoZSB0cmFuc2xhdGlvbiB0YWJsZSwgY2xpY2tpbmcgdGhlINJD YW5jZWzTIGJ1dHRvbiB3aWxsIGFib3J0IHRoZSBjb25maXJtYXRpb24gcHJvY2VzcyBh bmQgdGhlIHJlbWFpbmluZyB0cmFuc2xhdGlvbnMgZnJvbSB0aGUgdHJhbnNsYXRpb24g ZmlsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHN0YWNrLiANDUFmdGVyIHRoZSBsb2Nh bGl6YXRpb24gdHJhbmxhdGlvbnMgYXJlIGNvbXBsZXRlZCwgdGhlIHN0YWNrIHdpbGwg YmUgcmVjb25zdHJ1Y3RlZCB0byBtYWtlIHN1cmUgYWxsIGNoYW5nZXMgaGF2ZSBiZWVu IG1hZGUuIFRoZSBzdW0gb2YgdGhlIHRyYW5zbGF0aW9uIHRhYmxlIGFuZCB5b3VyIG93 biB0cmFuc2xhdGlvbiB3aWxsIGJlIHB1dCBpbiB0aGUg0kNvZGUgU2NyYXRjaHBhZNMg ZmllbGQgb2YgdGhlINJSZXNvdXJjZSBUb29sc9MgY2FyZCBzbyB0aGF0IHlvdSBjYW4g dXNlIGl0IGFzIGEgdHJhbnNsYXRpb24gdGFibGUgaW4gdGhlIGZ1dHVyZS4gVG8gY3Jl YXRlIGEgdHJhbnNsYXRpb24gdGFibGUsIHNlbGVjdCB0aGUg0lRyYW5zbGF0aW9uIFRh Ymxl0yBidXR0b24gb24gdGhlINJSZXNvdXJjZSBUb29sc9MgY2FyZC4gIFRoaXMgd2ls bCBkdW1wIGFsbCB0aGUgbmFtZXMgaW4gdGhlIHN0YWNrIHRvIHRoZSBzY3JhdGNocGFk LiBZb3UgY291bGQgdXNlIHRoaXMgdG8gc2VuZCB0aGlzIGxpc3RpbmcgdG8gc29tZW9u ZSBlbHNlIHRvIGRvIHRoZSB0cmFuc2xhdGlvbnMuIEFmdGVyIGl01XMgdHJhbnNsYXRp b25zIGhhdmUgYmVlbiBjb21wbGV0ZWQsIHRoaXMgZmlsZSBjYW4gYmVjb21lIGEgdHJh bnNsYXRpb24gdGFibGUgZm9yIHRoZSBsb2NhbGl6YXRpb24gb2YgeW91ciByZXNvdXJj ZS4NDQ1BcHBlbmRpeDogTGFuZ3VhZ2UgTm90ZXMNDUh5cGVyVGFsaw1TaW5jZSB0aGVy ZSBpcyBubyBnZW5lcmFsIHB1cnBvc2UgU2VuZCBBcHBsZSBFdmVudCBjb21tYW5kIGlu IEh5cGVyVGFsaywgQXBwbGUgRXZlbnRzIGFyZSBzZW50IHRocm91Z2ggYW4gWENNRC4g Q2xpZW50IGNvZGUgaW4gSHlwZXJUYWxrIGRlcGVuZHMgb24gdGhlIGZvcm1hdCBvZiB0 aGUgWENNRC4gSGVyZSB3ZSBhcmUgdXNlIGFuIFhDTUQgY2FsbGVkICJBRVNlbmQiIGZy b20gdGhlIHN0YWNrICJYQ01EcyBGb3IgQXBwbGUgRXZlbnRzIi4gSW4gdGhpcyBYQ01E LCBlYWNoIEFwcGxlIGV2ZW50IHBhcmFtZXRlciBpcyByZXByZXNlbnRlZCBieSBhIGtl eXdvcmQgKDQgbGV0dGVyIGNvZGUpIGFuZCBkYXRhIHBhaXIsIHRoZXJlZm9yZSwgdHdv IEh5cGVyVGFsayBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBlYWNoIEFwcGxlIGV2ZW50 IHBhcmFtZXRlci4gVGhlIHNhbXBsZSBjb2RlIGlzIGVzc2VudGlhbGx5IGEgbGlzdCBv ZiBrZXl3b3JkIGFuZCBkYXRhIHBhaXJzIGZvciBhbGwgdGhlIGtleXdvcmRzIGFsbG93 ZWQuIFRoZSBvcHRpb25hbCBvbmVzIGFyZSBlbmNsb3NlZCBieSBzcXVhcmUgYnJhY2tl dHMgc28geW91IGNhbiByZW1vdmUgdGhlIG9uZXMgeW91IGRvIG5vdCB3YW50LiANDUFs bCB0aGUgbGVnYWwgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdG9ycyBhcmUgYWxzbyBsaXN0 ZWQuIFRoaXMgaXMgdGhlIGZvcm1hdCBpbiB0aGUgc2NyaXB0IHRlbXBsYXRlIGZpZWxk IG9mIGVhY2ggZXZlbnQgd2hlbiBIeXBlclRhbGsgaXMgdGhlIGNsaWVudCBsYW5ndWFn ZSBhbmQgbm8gZ2x1ZSByb3V0aW5lIGlzIHVzZWQuIE9idmlvdXNseSwgdGhpcyBpcyBu b3QgdGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMuIEEgYmV0dGVyIHdheSB3b3VsZCBi ZSB0byBwcm92aWRlIHNvbWUgZ2x1ZSBjb2RlIHNvIHRoYXQgc2VuZGluZyBhbiBBcHBs ZSBldmVudCBsb29rcyBsaWtlIGp1c3QgYW5vdGhlciBIeXBlclRhbGsgZnVuY3Rpb24u IA0NV2l0aCB0aGlzIHN0YWNrIHlvdSBjYW4gZ2VuZXJhdGUgc2FtcGxlIGNsaWVudCBj b2RlLiBJbiB0aGlzIHNhbXBsZSBjb2RlLCB3ZSB0YWtlIGFsbCByZXF1aXJlZCBwYXJh bWV0ZXJzIGFuZCBtYWtlIHRoZW0gaW50byByZXF1aXJlZCBwYXJhbWV0ZXJzIG9mIEh5 cGVyVGFsayBmdW5jdGlvbnMuIFRoZXNlIHBhcmFtZXRlcnMgYXJlIGxpc3RlZCBieSBw b3NpdGlvbiBhbmQgbm90IGJ5IGtleXdvcmQgc28gdGhhdCB5b3UgZG9u1XQgaGF2ZSB0 byByZW1lbWJlciB0aGUga2V5d29yZHMuIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFy ZSBzdGlsbCBieSBrZXl3b3JkIGJ1dCB5b3UgY2FuIHVzZSB0aGUgZnVsbCBuYW1lIGRl ZmluZWQgaW4gdGhlICdhZXRlJyByZXNvdXJjZSBpbnN0ZWFkIG9mIHRoZSBmb3VyIGxl dHRlciBjb2Rlcy4gWW91IGNhbiBhbHNvIHVzZSBmdWxsIG5hbWVzIGluIGVudW1lcmF0 b3JzLiBXaGVuIGdsdWUgcm91dGluZXMgYXJlIHVzZWQsIHRoZSBzY3JpcHQgdGVtcGxh dGUgZmllbGQgd2lsbCBzaG93IGFuIGludGVyZmFjZSB0byB0aGUgZ2x1ZSByb3V0aW5l Lg0NDU1QVyBTaGVsbCBMYW5ndWFnZQ1MaWtlIEh5cGVyVGFsaywgdGhlcmUgYXJlIG5v IGJ1aWx0LWluIGNvbW1hbmRzIG9yIG9mZmljaWFsIE1QVyBjb21tYW5kcyB0byBzZW5k IEFwcGxlIGV2ZW50cy4gT3VyIHNhbXBsZSBjb2RlIGlzIGJhc2VkIG9uIGFuIE1QVyBj b21tYW5kIGNhbGxlZCAiU2VuZEFFIi4gIEFnYWluLCB0aGUgcGFyYW1ldGVycyBhcmUg aW4gYSBrZXl3b3JkIGRhdGEgcGFpciBmb3JtYXQuIFdoZW4gdGhlcmUgaXMgbm8gZ2x1 ZSByb3V0aW5lLCB0aGUgdGVtcGxhdGUgZmllbGQgaXMgaW4gdGhlIGZvcm1hdCBvZiBh IFNlbmRBRSBNUFcgY29tbWFuZC4gT3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgZW5jbG9z ZWQgYnkgYnJhY2tldHMgc28gdGhhdCB0aGV5IGNhbiBiZSByZW1vdmVkLg0NQ3VycmVu dGx5IHRoZSBnbHVlIHJvdXRpbmUgZm9yIGFuIE1QVyBTaGVsbCBjb21tYW5kIGlzIGp1 c3QgYW4gYWxpYXMgc28gaXTVcyBub3QgbmVjZXNzYXJ5IHRvIHJlcGVhdCBpbmZvcm1h dGlvbiBzdWNoIGFzIGV2ZW50IGNsYXNzZXMgYW5kIElE1XMgb3IgdGhlIHRhcmdldCBh cHBsaWNhdGlvbi4NDQ1QYXNjYWwgYW5kIEMNVGhlcmUgaXMgYSB0b29sYm94IGNhbGwg QUVTZW5kIGZvciBzZW5kaW5nIEFwcGxlIGV2ZW50cywgYnV0IHRoaXMgY2FsbCBjYW5u b3QgYmUgdXNlZCBpbiBQYXNjYWwgd2l0aG91dCBnbHVlIHJvdXRpbmVzLiBJZiB5b3Ug dXNlIFBhc2NhbCBvciBDLCB5b3Ugd2lsbCBuZWVkIHNvbWUgZ2x1ZSByb3V0aW5lcy4g R2x1ZSByb3V0aW5lcyB0YWtlIGNhcmUgb2Ygc3R1ZmZpbmcgcGFyYW1ldGVycyBpbnRv IEFwcGxlIGV2ZW50cywgc2VuZGluZyB0aGVtIG9mZiwgYW5kIGV4dHJhY3RpbmcgcmVz dWx0cyBmcm9tIHRoZSByZXBseS4gUGFzY2FsIGRvZXMgbm90IHN1cHBvcnQgYSB2YXJp YWJsZSBudW1iZXIgb2YgcGFyYW1ldGVycywgc28geW91IGNhbm5vdCB1c2Uga2V5d29y ZCBkYXRhIHBhaXJzIGFzIHlvdSB3b3VsZCB3aXRoIEh5cGVyVGFsayBvciBNUFcuIElu c3RlYWQsIGFsbCBwYXJhbWV0ZXJzIGFyZSBwb3NpdGlvbmFsLiBXaGVuIGEgcGFyYW1l dGVyIGlzIG9wdGlvbmFsLCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgd2lsbCBiZSB1c2Vk IHNvIHRoYXQgTklMIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoZSBhYnNlbmNlIG9m IGEgcGFyYW1ldGVyLiBBbm90aGVyIHByb2JsZW0gd2UgZW5jb3VudGVyIGlzIHRoYXQg dW5saWtlIEh5cGVyVGFsayBhbmQgTVBXLCB5b3Ugbm93IGNhbiBoYXZlIG11bHRpcGxl IHdheXMgb2YgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGtpbmQgb2YgZGF0YS4gRm9yIGV4 YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSBhIHBhcmFtZXRlciB3aG9zZSBkYXRhIHR5cGUg aXMgVEVYVC4gSW4gUGFzY2FsLCB0aGUgdGV4dCBtYXkgYmUgaW4gdGhlIGZvcm0gb2Yg YSBkZXNjcmlwdG9yLCBhIGhhbmRsZSwgYSBwb2ludGVyIHRvIGEgYnVmZmVyIHBsdXMg dGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgYSBQYXNjYWwgc3RyaW5nIG9yIGV2ZW4gYSB6 ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiBUbyBpbmRpY2F0ZSB3aGljaCBmb3JtYXQgaXMg dXNlZCBpbiB0aGUgZ2x1ZSByb3V0aW5lLCB5b3UgY2FuIHVzZSB0aGUgdGhyZWUgbG93 IGJpdHMgb2YgdGhlIHBhcmFtZXRlciBhdHRyaWJ1dGUgaW4gdGhlICdhZXRlJyByZXNv dXJjZS4gSGVyZSBpcyB0aGUgZm9ybWF0IHdlIGFsbG93Lg0NMS4gRGVzY3JpcHRvci4N Mi4gSGFuZGxlLg0zLiBGaXhlZCBzaXplIGRhdGEgc3VjaCBhcyBpbnRlZ2VyIG9yIGZs b2F0aW5nIHBvaW50Lg00LiBQb2ludGVyIHRvIGEgYnVmZmVyIGFuZCB0aGUgc2l6ZSBv ZiB0aGUgYnVmZmVyLg01LiBQYXNjYWwgU3RyaW5nLg02LiBDIFN0cmluZy4NDU9mIGNv dXJzZSwgbm90IGFsbCBvZiB0aGVtIGFyZSBhcHByb3ByaWF0ZSBmb3IgYW55IGdpdmVu IGRhdGEgdHlwZS4gRm9yIGV4YW1wbGUsIEMgc3RyaW5ncyB3b3VsZCBub3Qgd29yayBm b3IgaW50ZWdlciB0eXBlcy4gVGhhdNVzIHdoeSB3aGVuIHlvdSBwaWNrIGEgZm9ybWF0 IHVzaW5nIHRoZSBwb3AgdXAgbWVudSwgc29tZSB3aWxsIGJlIGRpc2FibGVkLiBDdXJy ZW50bHksIHdlIGRvIG5vdCBzdXBwb3J0IHRoZSBvcHRpb24gIzQgZm9ybWF0IHdoZW4g aXQgaXMgdXNlZCBpbiB0aGUgcmVwbHkgcGFyYW1ldGVyLg0NSW4gYSBmZXcgc3BlY2lh bCBjYXNlcywgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSBhIHBvaW50ZXIgdG8gYSBwYXJh bWV0ZXIgaW4gYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBXaGVuIHRoZSBkYXRhIHR5cGUg aXMgJ3RydWUnLCB5b3UgY2FuIHVzZSBhIGJvb2xlYW4gcGFyYW1ldGVyLiAgVGhlIGJv b2xlYW4gcmVzdWx0IG9mIGZhbHNlIHdpbGwgaW5kaWNhdGUgdGhlIGFic2VuY2Ugb2Yg dGhlIHBhcmFtZXRlci4gV2hlbiB0aGUgZGF0YSB0eXBlIGlzIGFuICdlbnVtJywgaWYg eW91IGNhbiBhc3N1bWUgdGhhdCBhIHZhbGlkIHBhcmFtZXRlciBpcyBmb3VyIHByaW50 YWJsZSBjaGFyYWN0ZXJzLCB0aGVuIHlvdSBjYW4gdXNlIHZhbHVlIDAgdG8gaW5kaWNh dGUgYWJzZW5jZSBvZiBhIHBhcmFtZXRlci4gV2hlbiB0aGUgcGFyYW1ldGVyIGlzIGEg aGFuZGxlLCB1c2UgTklMIHRvIGluZGljYXRlIHRoZSBhYnNlbmNlIG9mIGEgcGFyYW1l dGVyLg0NV2hlbiBjb2RlIGlzIGdlbmVyYXRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGtu b3cgdGhhdCAnZnNzICcgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zdGFudCB0eXBl RlNTLCB0aGUgUGFzY2FsIHR5cGUgRlNTcGVjIGFuZCB0aGUgQyB0eXBlIEZTU3BlYy4g SW5mb3JtYXRpb24gZm9yIHRoZSBjb21tb24gZGF0YSB0eXBlcyB1c2VkIGluIEFwcGxl IEV2ZW50cyBpcyBjb250YWluZWQgaW4gdGhlIHN0YWNrLiBIb3dldmVyIGl0IGlzIGEg bGFyZ2UgdGFzayB0byBkZWZpbmUgYWxsIHRoZSBkYXRhIHR5cGVzIHVzZWQgaW4gdGhl IE1hY2ludG9zaCwgYW5kIGl0IGlzIGltcG9zc2libGUgdG8ga25vdyB0aGUgbmFtZXMg b2YgeW91ciBwcml2YXRlIGRhdGEgdHlwZXMuIElmIHlvdSB3YW50IHRoZXNlIGV4dHJh IGRhdGEgdHlwZXMsIHlvdSBjYW4gYWRkIHlvdXIgb3duIGJ5IG1vZGlmeWluZyB0aGUg TmFtZU9mRGF0YVR5cGUgZnVuY3Rpb24gaW4gdGhlIHNjcmlwdCBvZiB0aGlzIHN0YWNr LiBJbiB0aGlzIGZ1bmN0aW9uLCBlYWNoIGZvdXIgY2hhcmFjdGVyIElEIGlzIGFzc29j aWF0ZWQgd2l0aCBhIGxpc3Qgb2YgbmFtZXMuICBGb3IgZXhhbXBsZSwgJ2ZzcyAnIGlz IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIGxpc3Q6IA0gICAgICAgICAgICAg ICAgIkZTU3BlYyxGU1NwZWNQdHIsRlNTcGVjSGFuZGxlLHR5cGVGU1MsRlNTcGVjLDcw Ig1UaGUgZmlyc3QgbmFtZSBpcyB0aGUgUGFzY2FsIHR5cGUgbmFtZSwNc2Vjb25kIG5h bWUgaXMgdGhlIFBhc2NhbCBwb2ludGVyIG5hbWUsDXRoaXJkIG5hbWUgaXMgdGhlIFBh c2NhbCBIYW5kbGUgbmFtZSwNZm91cnRoIG5hbWUgaXMgdGhlIGNvbnN0YW50IHR5cGUg bmFtZSwNZmlmdGggbmFtZSBpcyB0aGUgQyB0eXBlIG5hbWUsDXNpeHRoIG5hbWUgaXMg dGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0eXBlLCB3aGVyZSAtMSBkZW5vdGVzIHZhcmlh YmxlIGxlbmd0aC4NDVRvIGludHJvZHVjZSBuZXcgZGF0YSB0eXBlLCBqdXN0IGFkZCBp dCB0byB0aGUgZnVuY3Rpb24uIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIGxlbmd0aCBm aWVsZCBpcyB0byBkZWNpZGUgd2hldGhlciBhIHBhcmFtZXRlciBzaG91bGQgYmUgcGFz c2VkIG9uIHRoZSBzdGFjayBvciBwYXNzZWQgYnkgcmVmZXJlbmNlIGFzIGluIEMsIHNv IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgYWNjdXJhdGUuIEl0IHdpbGwgYmUgYXR0ZW1w dGVkIHRvIHBhc3Mgb24gdGhlIHN0YWNrIGlmIGl0IGlzIGxlc3MgdGhhbiA1IGJ5dGVz IGxvbmcuIElmIHlvdSBoYXZlIGEgZGF0YSB0eXBlIHRoYXQgaXMgbW9yZSB0aGFuIDQg Ynl0ZXMgbG9uZyBidXQgeW91IHN0aWxsIHdhbnQgdG8gcGFzcyBpdCBvbiB0aGUgc3Rh Y2sgaW4gQywgeW91IG1heSBmYWtlIGEgbGVuZ3RoIGVxdWFsIHRvIDQgdG8gZm9vbCB0 aGUgY29kZSBnZW5lcmF0b3IuDQ1XaGVuIHRoZSAnYWV0ZScgcmVzb3VyY2UgaXMgbm90 IGRlc2lnbmVkIGFzIGEgUGFzY2FsIHJvdXRpbmUsIGFsbCB0aGUgcmVzZXJ2ZWQgYml0 cyBhcmUgY2xlYXIgYW5kIHRoYXQgbWVhbnMgdGhhdCB0aGUgZm9ybWF0IGlzIGEgZGVz Y3JpcHRvci4gU2luY2UgdGhpcyBpcyB0aGUgbW9zdCBnZW5lcmFsIGZvcm0sIGl0IGNh biBhbHdheXMgYmUgdXNlZC4gSXQgc2hvdWxkIGJlIHBvaW50ZWQgb3V0IHRoZSAnYWV0 ZScgcmVzb3VyY2UgeW91IHJlYWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBpcyBkZWZpbmVk IGZvciB0aGUgc2VydmVyIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBhcmUgdGhlIGNsaWVu dCwgeW91IGNhbiBjaGFuZ2UgdGhlIFBhc2NhbCBkYXRhIGZvcm1hdCBmb3IgeW91IG93 biB1c2UgYXMgYSBjbGllbnQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIHNlcnZlctVzLiBT byB5b3UgY2FuIHBpY2sgd2hhdCBzdWl0cyB5b3UgYXMgYSBjbGllbnQuIFlvdSBtYXkg YWxzbyBsZXQgdGhlIHN5c3RlbSBwaWNrIGEgZm9ybWF0IHdoZW4gYW4gJ2FldGUnIGlz IHJlYWQgZnJvbSBhbm90aGVyIGZpbGUuIEFzIGEgbWF0dGVyIG9mIGZhY3QsIGlmIGFz IGEgY2xpZW50LCB5b3UgYWx3YXlzIHVzZXMgYSBwYXJ0aWN1bGFyIG9wdGlvbmFsIHBh cmFtZXRlciwgeW91IG1heSBldmVuIGNoYW5nZSBpdCBmcm9tIG9wdGlvbmFsIHRvIHJl cXVpcmVkIGZvciB0aGUgcHVycG9zZSBvZiBnZW5lcmF0aW5nIGNsaWVudCBjb2RlLiBO byBoYXJtIGlzIGRvbmUgYXMgbG9uZyBhcyB5b3UgZG8gbm90IHRyeSB0byB3cml0ZSBi YWNrIHRoZSAnYWV0ZScgcmVzb3VyY2UgdG8gdGhlIHNlcnZlciBhcHBsaWNhdGlvbi4N DUdsdWUgcm91dGluZXMgdGFrZSBjYXJlIG9mIG1vc3Qgb2YgdGhlIGludGVyZmFjZSB0 byB0aGUgQXBwbGUgRXZlbnQgTWFuYWdlciBmb3IgeW91LiAgSWYgeW91IGNhbiB1c2Ug dGhlbSBmcm9tIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgd2hlcmUgY29tcGlsaW5n IGlzIGZhc3QsIGFuZCB5b3UgY2FuIHNpbmdsZSBzdGVwIHRocm91Z2ggZWFjaCBzdGF0 ZW1lbnQgYW5kIGV4YW1pbmUgdmFyaWFibGVzIGFzIG5lZWRlZCwgdGhlbiB5b3UgY2Fu IHVzZSBpdCBhcyBhIHNjcmlwdGluZyBsYW5ndWFnZS4NDVRoZXJlIGFyZSBhIG51bWJl ciBvZiBwYXJhbWV0ZXJzIHRvIEFFU2VuZC4gV2hlbiB0aGUgY2xpZW50IGNvZGUgaXMg Z2VuZXJhdGVkLCB0aGVyZSBpcyBhIGRlZmF1bHQgZm9yIGVhY2ggcGFyYW1ldGVyLiBG b3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgaWRsZSBwcm9jZWR1cmUgaXMgTklMLiBIb3dl dmVyLCB5b3UgbWF5IHB1dCBpbiB5b3VyIG93biBkZWZhdWx0IGluIHRoZSBQcmVmZXJl bmNlcyBjYXJkLiBJbiB0aGUgZGVmYXVsdCB0YXJnZXQgZmllbGQgb2YgdGhlIFByZWZl cmVuY2UgY2FyZCwgaWYgdGhlcmUgaXMgYSBwcm9jZXNzIG5hbWUgcHJlc2VudCwgdGhp cyBpcyBjb25zaWRlcmVkIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuIElmIHRo ZXJlIGlzIG5vIG5hbWUsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgYXBwbGljYXRpb24g d2lsbCBiZSBzZWxlY3RlZCBieSB0aGUgUFBDIEJyb3dzZXIuIElmIHRoZSBuYW1lIGlz ICJzZWxmIiwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBldmVudCB3aWxsIGJlIHNlbnQg dG8gdGhlIGFwcGxpY2F0aW9uIGl0c2VsZi4NDU9uIHRoZSBzZXJ2ZXIgc2lkZSwgaXQg d291bGQgYmUgbmljZSB0byBoYXZlIGdsdWUgY29kZSB0aGF0IHdvdWxkIHRha2UgYW4g QXBwbGUgZXZlbnQgYW5kIHRyYW5zZm9ybSBpdCBpbnRvIGEgbm9ybWFsIHByb2NlZHVy ZSBjYWxsLiBUaGF01XMgd2h5IHdlIGFsc28gZ2VuZXJhdGUgc2FtcGxlIHNlcnZlciBn bHVlIGNvZGUuIEZvciBldmVyeSBldmVudCwgdHdvIHByb2NlZHVyZXMgd2lsbCBiZSBn ZW5lcmF0ZWQuIE9uZSBpcyB0aGUgc2hlbGwgcHJvY2VkdXJlIHRoYXQgYWN0dWFsbHkg ZXhlY3V0ZXMgdGhlIG9wZXJhdGlvbi4gKFlvdSBoYXZlIHRvIGZpbGwgaW4gdGhlIGFj dHVhbCBjb2RlIHlvdXJzZWxmKS4gVGhlIG90aGVyIHByb2NlZHVyZSBpcyBhbiBldmVu dCBoYW5kbGVyIHRoYXQgdHJhbnNsYXRlcyB0aGUgZXZlbnQgaW50byBhIHByb2NlZHVy ZSBjYWxsLiBGb3IgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLCB5b3UgbXVzdCBmaWxsIGlu IHRoZSBkZWZhdWx0IHZhbHVlIChiZWNhdXNlIHRoYXQgaW5mb3JtYXRpb24gaXMgbm90 IGF2YWlsYWJsZSBpbiB0aGUgJ2FldGUnIHJlc291cmNlKS4gIEFkZGl0aW9uYWxseSwg eW91IG11c3QgcHJvdmlkZSB5b3VyIG93biBlcnJvciBoYW5kbGluZywgYnV0IHlvdSBk byBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBleHRyYWN0aW5nIHBhcmFtZXRlcnMgZnJv bSB0aGUgQXBwbGUgRXZlbnQuDQ1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgaW50 ZXJmYWNlIHRvIHlvdXIgcHJvY2VkdXJlIGluIHRoZSBzZXJ2ZXIgc2FtcGxlIGNvZGUg aXMgdGhlIHNhbWUgYXMgdGhlIGludGVyZmFjZSB0byB0aGUgc2VuZCBBcHBsZSBFdmVu dCBjbGllbnQgc2FtcGxlIGNvZGUuIFRoaXMgbWVhbnMgdGhhdCBpZiBpbiB5b3VyIGNs aWVudCBjb2RlIHlvdSBzZW5kIHRoZSBldmVudCB0byB5b3Vyc2VsZiwgeW91IGNhbiBj YWxsIGVpdGhlciBwcm9jZWR1cmUgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzLiBUaGUg b25seSBkaWZmZXJlbmNlIGlzIHRoYXQgb25lIGdvZXMgdGhyb3VnaCB0aGUgQXBwbGUg RXZlbnQgYW5kIHRoZSBvdGhlciBvbmUgZG9lcyBub3QuIFdlIHRhbGsgYSBsb3QgYWJv dXQgZmFjdG9yaW5nIGluIEFwcGxlIEV2ZW50cy4gQnkgdGhpcyB3ZSBtZWFuIHRoYXQg dXNlciBpbnRlcmZhY2UgYWN0aW9ucyBzaG91bGQgYmUgdHJhbnNsYXRlZCBpbnRvIEFw cGxlIEV2ZW50cyBhbmQgc2VudCB0aHJvdWdoIHRoZSBBcHBsZSBFdmVudCBNYW5hZ2Vy LiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciByZWNvcmRpbmcgQXBwbGUgRXZlbnRz IGluIHRoZSBmdXR1cmUuIFRoZSBzYW1wbGUgY29kZSBnZW5lcmF0ZWQgaXMgYWxyZWFk eSBzZXQgdXAgZm9yIHRoZSBwdXJwb3NlIG9mIGZhY3RvcmluZyBhbmQgcmVjb3JkaW5n Lg0NDUNvcHlyaWdodCAxOTkyIEFwcGxlIENvbXB1dGVyLCBJbmMuDUFwcGxlIGFuZCBB cHBsZaggRXZlbnQgYXJlIHRyYWRlbWFya3Mgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4s IHJlZ2lzdGVyZWQgaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4A//oAEgBB Ym91dCB0aGlzIHN0YWNryf/4ABEAQWJvdXQgdGhpcyBTdGFjawBpbnN0cnVjdGlvbnMA AAAAAAAAAAAAAAABAEJNQVAAABFvAAAAAAAAAAAAAQAAAAAAAAFWAgAANQAGATMB/QAV AAABUwH+AAAAAAAAAAAAAAAkAAAAnI3jHxS/hb+Fv4W/hb+Fv4W/hb+Fo4UgAiDjLBAQ IAIg4w4AAIwQgOIQAuEOhYriEQLhDuIRA+EOtYaOEIDiEALhDo0QQOIRgOENpYGJ4x8Q 4x8Iv4a/hr+Gv4a/hr+Gv4a/hqKGjhEQ4x0QjREg4x0EuYGJ4xceRAHwAYDjFxE1QACA 4xcRwTHMlZjAQxic4xcewUoSliUgRKSg4xcUwXmSlCHgRKSY4xcSwUBSlCUARKSE4xcR wTOMdBjAQxi4AAAA1yBDQVJEAAA5+gAAAAAAAArKAAAAAAAAAAAAAAAAAAA68AAADjwA EwArAADRUAADAAAAQAB2AAMBgAAEARgAGQFygAMAAAAAAAEAAAAMAAAAEFJlYnVpbGQA AG9uIG1vdXNlVXANc2V0IGN1cnNvciB0byB3YXRjaA1wdXNoIGNhcmQNQ29uc3RydWN0 TGluaw1wb3AgY2FyZA1lbmQgbW91c2VVcA0NAAABAgATAQAAFgG8AEoB+KAAAABgdgAB AAAADAAAABBJbnN0cnVjdGlvbnMAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJD bGljayBoZXJlIHRvIGdldCBpbnN0cnVjdGlvbnMgZm9yIHVzaW5nIHRoaXMgc3RhY2su Ig1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGdXaGVyZUZyb20NcHVz aCBjZA1wb3AgY2QgaW50byBnV2hlcmVGcm9tDXZpc3VhbCBkaXNzb2x2ZSBmYXN0DWdv IGNkICJJbnN0cnVjdGlvbnMiDWVuZCBtb3VzZVVwDQAAoAAUAgQATADNAT4B/AAHAAAA AAAAAAQACQAAAAxzY3JhdGNoAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiVGhp cyBpcyBhIGdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIGFyZWEgdG8gaG9sZCBnZW5lcmF0 ZWQgdGV4dCBpbmZvcm1hdGlvbi4iDWVuZCBNb3VzZVdpdGhpbg0AAcwAFQIVAEwAeQES AMoABwAAAAAAAAAEAAoAAAANc3VpdGVMaXN0AABvbiBNb3VzZVdpdGhpbg1TaG93QmFs bG9vbiAiVGhpcyBpcyB0aGUgbGlzdCBvZiBzdWl0ZSBjb2RlcyBpbiB0aGlzIHN0YWNr LiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZXVwDWdsb2JhbCBnRGVsZXRlU3VpdGUs Z1doZXJlRnJvbQ1wdXQgdmFsdWUgb2YgdGhlIGNsaWNrTGluZSBpbnRvIHgNDWlmIHgg PSAiIiB0aGVuIGV4aXQgbW91c2VVcA1pZiBnRGVsZXRlU3VpdGUgdGhlbg1kZWxldGVT dWl0ZSB4DXB1dCBmYWxzZSBpbnRvIGdEZWxldGVTdWl0ZQ1leGl0IG1vdXNlVXANZWxz ZQ1wdXNoIGNkDXBvcCBjZCBpbnRvIGdXaGVyZUZyb20NdmlzdWFsIGRpc3NvbHZlIGZh c3QNZ28gY2FyZCAic3VpdGUiICYmIHgNZW5kIGlmDWVuZCBtb3VzZXVwDQ1vbiBkZWxl dGVTdWl0ZSB0aGVTdWl0ZQ1iZWVwIDINZW5kIGRlbGV0ZVN1aXRlAADMABcBAAFBAWYB VAGzoAIAAAAAAAEAFQAKAQAADVByaW50IEZpZWxkAABvbiBNb3VzZVdpdGhpbg1TaG93 QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBwcmludCB0aGUgY29udGVudHMgb2YgdGhlIGNv ZGUgc2NyYXRjaHBhZCBmaWVsZC4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1w cmludCAoY2FyZCBmaWVsZCAic2NyYXRjaCIpDWVuZCBtb3VzZVVwAAFoABgBAAFBAbUB VAH8oAIAAAAAAAEAFQAKAQAADVNhdmUgQXPJAABvbiBNb3VzZVdpdGhpbg1TaG93QmFs bG9vbiAiQ2xpY2sgaGVyZSB0byBzYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgY29kZSBz Y3JhdGNocGFkIGZpZWxkIHRvIGEgVEVYVCBmaWxlLiINZW5kIE1vdXNlV2l0aGluDQ1v biBtb3VzZVVwDWFzayBmaWxlICJTYXZlIHRoZSBzY3JhdGNocGFkIGFzOiINaWYgaXQg PD4gIiIgb3IgdGhlIHJlc3VsdCBpcyBub3QgIkNhbmNlbCIgdGhlbg1wdXQgaXQgaW50 byByZWYNb3BlbiBmaWxlIHJlZg13cml0ZSBjYXJkIGZpZWxkICJzY3JhdGNoIiB0byBm aWxlIHJlZg1jbG9zZSBmaWxlIHJlZg1lbmQgaWYNZW5kIG1vdXNlVXAAAAFkABkBAAFB AM0BVAEYoAIAAAAAAAEAFQAKAQAADUNsZWFyIEZpZWxkAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBjbGVhciB0aGUgY29kZSBzY3JhdGNocGFk IGZpZWxkLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDWFuc3dlciAiQ2xlYXIg dGhlIGNvbnRlbnRzIG9mIHRoZSBjb2RlIHNjcmF0Y2ggcGFkIGZpZWxkLiIgd2l0aCAi T0siIG9yICJDYW5jZWwiDWlmIGl0IGlzICJDYW5jZWwiIHRoZW4gZXhpdCBtb3VzZVVw DXB1dCBlbXB0eSBpbnRvIGNhcmQgZmllbGQgInNjcmF0Y2giDXB1dCAiU2NyYXRjaHBh ZCIgaW50byBjYXJkIGZpZWxkICJwYWROYW1lIg1lbmQgbW91c2VVcAAAAUYAGgEAARgA eQEsAMqgBAAAAAAAAQAAAAwAAAAQTmV3IFN1aXRlAABvbiBNb3VzZVdpdGhpbg1TaG93 QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBhZGQgYSBuZXcgc3VpdGUuIg1lbmQgTW91c2VX aXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGdXaGVyZUZyb20NbG9jayBzY3JlZW4NZ28g bGFzdCBjYXJkIG9mIGJrZ25kICJzdWl0ZUluZm8iDURvTWVudSAiTmV3IENhcmQiDXB1 c2ggY2QNcG9wIGNkIGludG8gZ1doZXJlRnJvbQ11bmxvY2sgc2NyZWVuIHdpdGggdmlz dWFsIHdpcGUgbGVmdA1jbGljayBhdCB0aGUgbG9jIG9mIGZsZCAic3VpdGVDb2RlIg1l bmQgbW91c2VVcAABJAAbAQABGAAKASwAbqAEAAAAAAABAAAADAAAABBQcmVmZXJlbmNl c8kAAG9uIG1vdXNlVXANZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2QgaW50 byBnV2hlcmVGcm9tDXZpc3VhbCBkaXNzb2x2ZSBmYXN0DWdvIGNhcmQgInByZWZlcmVu Y2UiDWVuZCBtb3VzZVVwDQ1vbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBnbyB0byBhIGNhcmQgd2hlcmUgeW91IGNhbiB2aWV3IGFuZCLCDSYiIHNl dCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBzdGFjay4iDWVuZCBNb3VzZVdpdGhpbgAAB1oA HAEAAOUAEAD5AGegBAAAAAAAAQAAAAwAAAAQQ2xpZW50IENvZGUAAG9uIE1vdXNlV2l0 aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGdlbmVyYXRlIHNhbXBsZSBjb2Rl IHRoYXQgYSBjbGllbnQgY291bGQgdXNlIHRvIHNlbmQgQXBwbGUgRXZlbnQuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANZ2xvYmFsIGluRWRpdCwgY2xpZW50TGFuZw1z ZXQgbG9ja1NjcmVlbiB0byB0cnVlDXNldCBsb2NrUmVjZW50IHRvIHRydWUNQ2hlY2tQ cmVmZXJlbmNlDXB1dCAiZmFsc2UiIGludG8gaW5FZGl0DXB1c2ggY2FyZA1wdXQgQ2xp ZW50U2FtcGxlKCJpbml0IikgaW50byBzYW1wbGVDb2RlDWlmIHRoZSBvcHRpb25LZXkg aXMgZG93biB0aGVuDWRvbWVudSAiQmFjayINcHV0IENsaWVudFNhbXBsZSh3b3JkIDEg b2Ygc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQpIGFmdGVyIHNhbXBsZUNvZGUNZWxzZQ0t LXB1dCAiIiBpbnRvIGV2ZW50SW52ZW50b3J5DWdvIHRvIGZpcnN0IGNhcmQgb2YgYmtn bmQgZXZlbnRzDXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIg aW50byBzdWl0ZUNvdW50DXJlcGVhdCB3aXRoIHN1aXRlSW5kZXggPSAyIHRvIHN1aXRl Q291bnQNc2V0IGN1cnNvciB0byBidXN5DWdvIGNhcmQgc3VpdGVJbmRleCBvZiBia2du ZCAic3VpdGVJbmZvIg1wdXQgZmllbGQgIkV2ZW50TGlzdCIgaW50byBteUV2ZW50TGlz dA1wdXQgZmllbGQgInN1aXRlQ29kZSIgaW50byBteVN1aXRlQ29kZQ1wdXQgZmllbGQg IkNsYXNzTGlzdCIgaW50byBteUNsYXNzTGlzdA1wdXQgQ2xpZW50U2FtcGxlKCJzdWl0 ZSIpIGFmdGVyIHNhbXBsZUNvZGUgLS0gdGhpcyBpcyBhbiAiaW5pdGlhbGl6YXRpb24i DS0tIG5vdyBkbyBpdCBmb3IgZWFjaCBldmVudCBpbiB0aGUgbGlzdA1wdXQgbnVtYmVy IG9mIGxpbmVzIGluIG15RXZlbnRMaXN0IGludG8gZXZlbnRDb3VudA1yZXBlYXQgd2l0 aCBldmVudEluZGV4ID0gMSB0byBldmVudGNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1p ZiBqdW1wKCJldmVudCIgJiYgaXRlbSAyIG9mIGxpbmUgZXZlbnRJbmRleCBvZiBteUV2 ZW50TGlzdCkgdGhlbg1wdXQgQ2xpZW50U2FtcGxlKCJldmVudCIpIGFmdGVyIHNhbXBs ZUNvZGUNLS1wdXQgZmllbGQgInNjcmlwdFRlbXBsYXRlIiAmIHJldHVybiAmIHJldHVy biBhZnRlciBldmVudEludmVudG9yeQ1lbmQgaWYNZW5kIHJlcGVhdA0tLSBub3cgZG8g aXQgZm9yIGVhY2ggY2xhc3MgaW4gdGhlIGxpc3QNcHV0IG51bWJlciBvZiBsaW5lcyBp biBteUNsYXNzTGlzdCBpbnRvIGNsYXNzQ291bnQNcmVwZWF0IHdpdGggY2xhc3NJbmRl eCA9IDEgdG8gY2xhc3NDb3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiY2xh c3MiICYmIGl0ZW0gMiBvZiBsaW5lIGNsYXNzSW5kZXggb2YgbXlDbGFzc0xpc3QpIHRo ZW4NcHV0IENsaWVudFNhbXBsZSgiY2xhc3MiKSBhZnRlciBzYW1wbGVDb2RlDWVuZCBp Zg1lbmQgcmVwZWF0DXB1dCBDbGllbnRTYW1wbGUoInN1aXRlRW5kIikgYWZ0ZXIgc2Ft cGxlQ29kZSAtLSB0aGlzIGlzIGEgInRlcm1pbmF0aW9uIg1lbmQgcmVwZWF0DS0tIHB1 dCBldmVudEludmVudG9yeSBhZnRlciBzYW1wbGVDb2RlDWVuZCBpZg1wb3AgY2FyZA1Q dXRTY3JhdGNoIHNhbXBsZUNvZGUsICJDbGllbnQgU2FtcGxlIENvZGUiDXB1dCB0cnVl IGludG8gaW5FZGl0DWVuZCBtb3VzZVVwDQ0tLSBsYW5ndWFnZSBkZXBlbmRlbnQgcGFy dA0NZnVuY3Rpb24gQ2xpZW50U2FtcGxlIGNhcmRUeXBlDWlmIGNhcmRUeXBlID0gImV2 ZW50IiB0aGVuDXJldHVybiBDbGllbnRUZW1wbGF0ZSgpICYgcmV0dXJuICYgcmV0dXJu DWVsc2UNcmV0dXJuICIiDWVuZCBpZg1lbmQgQ2xpZW50U2FtcGxlDQ0AAFE6AB0BAADL ABAA3wBnoAQAAAAAAAEAAAAMAAAAEFNlcnZlciBDb2RlAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBnZW5lcmF0ZSBzYW1wbGUgY29kZSB0aGF0 IGEgY2xpZW50IGNvdWxkIHVzZSB0byBzZW5kIEFwcGxlIEV2ZW50LiINZW5kIE1vdXNl V2l0aGluDQ1vbiBtb3VzZVVwDWdsb2JhbCBpbkVkaXQsc2VydmVyTGFuZw1zZXQgbG9j a1NjcmVlbiB0byB0cnVlDXNldCBsb2NrUmVjZW50IHRvIHRydWUNcHVzaCBjYXJkDXB1 dCAiZmFsc2UiIGludG8gaW5FZGl0DXB1dCAiIiBpbnRvIGNvbnN0cw1pZiB0aGUgb3B0 aW9uS2V5IGlzIGRvd24gdGhlbg1kb21lbnUgIkJhY2siDXB1dCBTZXJ2ZXJTYW1wbGUo d29yZCAxIG9mIHRoZSBzaG9ydCBuYW1lIG9mIHRoaXMgY2FyZCkgYWZ0ZXIgY29uc3Rz DWVsc2UNaWYgc2VydmVyTGFuZyA9ICJQYXNjYWwiIHRoZW4NcHV0ICJDT05TVCIgJiBy ZXR1cm4gYWZ0ZXIgY29uc3RzDWVuZCBpZg1wdXQgIiIgaW50byBldmVudElESW5mbw1w dXQgIiIgaW50byBldmVudEtleUluZm8NcHV0ICIiIGludG8gY2xhc3NDb25zdA1wdXQg IiIgaW50byBwcm9wQ29uc3QNcHV0ICIiIGludG8gZW51bUNvbnN0DXB1dCAiIiBpbnRv IHNhbXBsZUNvZGUNcHV0ICIiIGludG8gaW5zdGFsbENvZGUNcHV0IFNlcnZlclNhbXBs ZSgiaW5pdCIpIGFmdGVyIHNhbXBsZUNvZGUgLS0gdGhpcyBpcyBhbiAiaW5pdGlhbGl6 YXRpb24iDWdvIHRvIGZpcnN0IGNhcmQgb2YgYmtnbmQgZXZlbnRzDXB1dCBudW1iZXIg b2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50byBzdWl0ZUNvdW50DXJlcGVh dCB3aXRoIHN1aXRlSW5kZXggPSAyIHRvIHN1aXRlQ291bnQNc2V0IGN1cnNvciB0byBi dXN5DWdvIGNhcmQgc3VpdGVJbmRleCBvZiBia2duZCAic3VpdGVJbmZvIg1wdXQgZmll bGQgIkV2ZW50TGlzdCIgaW50byBteUV2ZW50TGlzdA1wdXQgZmllbGQgInN1aXRlQ29k ZSIgaW50byBteVN1aXRlQ29kZQ1wdXQgZmllbGQgIkNsYXNzTGlzdCIgaW50byBteUNs YXNzTGlzdA1wdXQgZmllbGQgIkVudW1MaXN0IiBpbnRvIG15RW51bUxpc3QNLS0gbm93 IGRvIGl0IGZvciBlYWNoIGV2ZW50IGluIHRoZSBsaXN0DXB1dCBudW1iZXIgb2YgbGlu ZXMgaW4gbXlFdmVudExpc3QgaW50byBldmVudENvdW50DXJlcGVhdCB3aXRoIGV2ZW50 SW5kZXggPSAxIHRvIGV2ZW50Y291bnQNc2V0IGN1cnNvciB0byBidXN5DWlmIGp1bXAo ImV2ZW50IiAmJiBpdGVtIDIgb2YgbGluZSBldmVudEluZGV4IG9mIG15RXZlbnRMaXN0 KSB0aGVuDXB1dCBTZXJ2ZXJTYW1wbGUoImV2ZW50IikgYWZ0ZXIgc2FtcGxlQ29kZQ1w dXQgU2VydmVyU2FtcGxlKCJpbnN0YWxsIikgYWZ0ZXIgaW5zdGFsbENvZGUgLS0gdGhp cyBpcyB0byBpbnN0YWxsIGhhbmRsZXINcHV0ICJrQUUiICYgU3RyaXBTUChmaWVsZCAi RXZlbnROYW1lIikgJiAiLCIgJiAiJyIgJiDCDVJlc1R5cGUoZmllbGQgIkV2ZW50SUQi KSAmICInIiAmIHJldHVybiBhZnRlciBldmVudElESW5mbw1yZXBlYXQgd2l0aCBpID0g MyB0byBudW1iZXIgb2YgbGluZXMgaW4gZmllbGQgInBhcmFtSW5mbyINcHV0IGxpbmUg aSBvZiBmaWVsZCAicGFyYW1JbmZvIiBpbnRvIHgNcHV0IHF1b3RlICYgImtleUFFIiAm IFN0cmlwU1AoaXRlbSAxIG9mIHgpICYgcXVvdGUgaW50byB0aGlzTmFtZQ1wdXQgcXVv dGUgJiAiJyIgJiBSZXNUeXBlKGl0ZW0gMiBvZiB4KSAmICInIiAmIHF1b3RlIGludG8g dGhpc0tleQ1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHByb3BMaXN0IGludG8gbg1wdXQg MSBpbnRvIGoNcmVwZWF0IHVudGlsICh0aGlzTmFtZSA9IGl0ZW0gMSBvZiBsaW5lIGog b2YgcHJvcExpc3QpIG9yIChqID4gbikNYWRkIDEgdG8gag1lbmQgcmVwZWF0DWlmIGog PiBuIHRoZW4NcHV0IHRoaXNOYW1lICYgIiwiICYgdGhpc0tleSAmIHJldHVybiBhZnRl ciBldmVudEtleUluZm8NZWxzZQ1pZiB0aGlzS2V5IDw+IGl0ZW0gMiBvZiBsaW5lIGog b2YgcHJvcExpc3QgdGhlbg1wdXQgdGhpc05hbWUgJiAiLCIgJiB0aGlzS2V5ICYgIix0 cnVlIiAmIHJldHVybiBhZnRlciBldmVudEtleUluZm8NZW5kIGlmDWVuZCBpZg1lbmQg cmVwZWF0DWVuZCBpZiAtLSBQYXNjYWwgQyBldGMsIGdldCB0aGUgZXZlbnQgYW5kIGtl eXdvcmQNZW5kIHJlcGVhdA0tLSBub3cgZG8gaXQgZm9yIGVhY2ggY2xhc3MgaW4gdGhl IGxpc3QNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBteUNsYXNzTGlzdCBpbnRvIGNsYXNz Q291bnQNcmVwZWF0IHdpdGggY2xhc3NJbmRleCA9IDEgdG8gY2xhc3NDb3VudA1zZXQg Y3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiY2xhc3MiICYmIGl0ZW0gMiBvZiBsaW5lIGNs YXNzSW5kZXggb2YgbXlDbGFzc0xpc3QpIHRoZW4NcHV0IFNlcnZlclNhbXBsZSgiY2xh c3MiKSBhZnRlciBzYW1wbGVDb2RlDXB1dCAiYyIgJiBTdHJpcFNQKGZpZWxkICJjbGFz c05hbWUiKSAmICIsIiAmICInIiAmIMINUmVzVHlwZShmaWVsZCAiY2xhc3NJRCIpICYg IiciICYgcmV0dXJuIGFmdGVyIGNsYXNzQ29uc3QNcmVwZWF0IHdpdGggaSA9IDEgdG8g bnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkICJwcm9wSW5mbyINcHV0IGxpbmUgaSBvZiBm aWVsZCAicHJvcEluZm8iIGludG8geA1wdXQgInAiICYgU3RyaXBTUChpdGVtIDEgb2Yg eCkgaW50byB0aGlzTmFtZQ1wdXQgIiciICYgUmVzVHlwZShpdGVtIDIgb2YgeCkgJiAi JyIgaW50byB0aGlzS2V5DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gcHJvcExpc3QgaW50 byBuDXB1dCAxIGludG8gag1yZXBlYXQgdW50aWwgKHRoaXNOYW1lID0gaXRlbSAxIG9m IGxpbmUgaiBvZiBwcm9wTGlzdCkgb3IgKGogPiBuKQ1hZGQgMSB0byBqDWVuZCByZXBl YXQNaWYgaiA+IG4gdGhlbg1wdXQgdGhpc05hbWUgJiAiLCIgJiB0aGlzS2V5ICYgcmV0 dXJuIGFmdGVyIHByb3BDb25zdA1lbHNlDWlmIHRoaXNLZXkgPD4gaXRlbSAyIG9mIGxp bmUgaiBvZiBwcm9wTGlzdCB0aGVuDXB1dCB0aGlzTmFtZSAmICIsIiAmIHRoaXNLZXkg JiAiLHRydWUiICYgcmV0dXJuIGFmdGVyIHByb3BDb25zdA1lbmQgaWYNZW5kIGlmDWVu ZCByZXBlYXQNZW5kIGlmDWVuZCByZXBlYXQNLS0gbm93IGRvIGl0IGZvciBlYWNoIGNs YXNzIGluIHRoZSBsaXN0DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gbXlFbnVtTGlzdCBp bnRvIGVudW1Db3VudA1yZXBlYXQgd2l0aCBlbnVtSW5kZXggPSAxIHRvIGVudW1Db3Vu dA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiZW51bWVyYXRpb24iICYmIGxpbmUg ZW51bUluZGV4IG9mIG15RW51bUxpc3QpIHRoZW4NcHV0IFNlcnZlclNhbXBsZSgiZW51 bSIpIGFmdGVyIHNhbXBsZUNvZGUNcmVwZWF0IHdpdGggaSA9IDEgdG8gbnVtYmVyIG9m IGxpbmVzIGluIGZpZWxkICJlbnVtSW5mbyINcHV0IGxpbmUgaSBvZiBmaWVsZCAiZW51 bUluZm8iIGludG8geA1wdXQgImtBRUVudW0iICYgU3RyaXBTUChpdGVtIDEgb2YgeCkg aW50byB0aGlzTmFtZQ1wdXQgIiciICYgUmVzVHlwZShpdGVtIDIgb2YgeCkgJiAiJyIg aW50byB0aGlzS2V5DXB1dCB0aGlzTmFtZSAmICIsIiAmIHRoaXNLZXkgJiByZXR1cm4g YWZ0ZXIgZW51bUNvbnN0DWVuZCByZXBlYXQNZW5kIGlmDWVuZCByZXBlYXQNZW5kIHJl cGVhdA1wdXQgU2VydmVyU2FtcGxlKCJkb25lIikgYWZ0ZXIgc2FtcGxlQ29kZSAtLSB0 aGlzIGlzIGEgInRlcm1pbmF0aW9uIg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGV2ZW50 SURJbmZvIGludG8gbg1yZXBlYXQgd2l0aCBpID0gMSB0byBuDXB1dCBTZXJ2ZXJDb25z dChsaW5lIGkgb2YgZXZlbnRJREluZm8pICYgcmV0dXJuIGFmdGVyIGNvbnN0cw1lbmQg cmVwZWF0DWlmIG4gPiAwIHRoZW4NcHV0IHJldHVybiBhZnRlciBjb25zdHMNZW5kIGlm DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gZXZlbnRLZXlJbmZvIGludG8gbg1yZXBlYXQg d2l0aCBpID0gMSB0byBuDXB1dCBTZXJ2ZXJDb25zdChsaW5lIGkgb2YgZXZlbnRLZXlJ bmZvKSAmIHJldHVybiBhZnRlciBjb25zdHMNZW5kIHJlcGVhdA1pZiBuID4gMCB0aGVu DXB1dCByZXR1cm4gYWZ0ZXIgY29uc3RzDWVuZCBpZg1wdXQgbnVtYmVyIG9mIGxpbmVz IGluIGNsYXNzQ29uc3QgaW50byBuDXJlcGVhdCB3aXRoIGkgPSAxIHRvIG4NcHV0IFNl cnZlckNvbnN0KGxpbmUgaSBvZiBjbGFzc0NvbnN0KSAmIHJldHVybiBhZnRlciBjb25z dHMNZW5kIHJlcGVhdA1pZiBuID4gMCB0aGVuDXB1dCByZXR1cm4gYWZ0ZXIgY29uc3Rz DWVuZCBpZg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHByb3BDb25zdCBpbnRvIG4NcmVw ZWF0IHdpdGggaSA9IDEgdG8gbg1wdXQgU2VydmVyQ29uc3QobGluZSBpIG9mIHByb3BD b25zdCkgJiByZXR1cm4gYWZ0ZXIgY29uc3RzDWVuZCByZXBlYXQNaWYgbiA+IDAgdGhl bg1wdXQgcmV0dXJuIGFmdGVyIGNvbnN0cw1lbmQgaWYNcHV0IG51bWJlciBvZiBsaW5l cyBpbiBlbnVtQ29uc3QgaW50byBuDXJlcGVhdCB3aXRoIGkgPSAxIHRvIG4NcHV0IFNl cnZlckNvbnN0KGxpbmUgaSBvZiBlbnVtQ29uc3QpICYgcmV0dXJuIGFmdGVyIGNvbnN0 cw1lbmQgcmVwZWF0DWlmIG4gPiAwIHRoZW4NcHV0IHJldHVybiBhZnRlciBjb25zdHMN ZW5kIGlmDXB1dCBzYW1wbGVDb2RlIGFmdGVyIGNvbnN0cw1pZiBpbnN0YWxsQ29kZSA8 PiAiIiB0aGVuDXB1dCBTZXJ2ZXJJbnN0YWxsKGluc3RhbGxDb2RlKSBhZnRlciBjb25z dHMNZW5kIGlmDWVuZCBpZg1wb3AgY2FyZA1QdXRTY3JhdGNoIGNvbnN0cywgIlNlcnZl ciBTYW1wbGUgQ29kZSINcHV0ICJ0cnVlIiBpbnRvIGluRWRpdA1lbmQgbW91c2VVcA0N LS0gbGFuZ3VhZ2UgZGVwZW5kZW50IHBhcnQNDWZ1bmN0aW9uIFNlcnZlclNhbXBsZSBj YXJkVHlwZQ1pZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1wdXQgIkFFIiAmIFN0cmlw U1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNZ2xvYmFsIHZlcmJvc2UN aWYgdmVyYm9zZSB0aGVuDXB1dCBmaWVsZCAiZXZlbnRDb21tZW50IiBpbnRvIHRlbXAN aWYgdGVtcCA8PiAiIiB0aGVuDXB1dCAieyAiICYgdGVtcCAmICIgfSIgJiByZXR1cm4g JiByZXR1cm4gaW50byBwcm9jSGVhZGVyDWVuZCBpZg1lbmQgaWYNcHV0IFBhc2NhbENs aWVudFRlbXBsYXRlKCkgJiByZXR1cm4gaW50byB0ZW1wDXB1dCAiRG8iIGFmdGVyIGNo YXIgOSBvZiB0ZW1wDXB1dCB0ZW1wIGFmdGVyIHByb2NIZWFkZXINcHV0IFRhYiAmICJC RUdJTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1wdXQgVGFiICYgInsgcHV0IHlv dXIgY29kZSBoZXJlIH0iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXINcHV0IFRhYiAm ICJEbyIgJiBwcm9jTmFtZSAmICIgOj0gTm9FcnI7IiAmIHJldHVybiBhZnRlciBwcm9j SGVhZGVyDXB1dCBUYWIgJiAiRU5EOyIgJiByZXR1cm4gJiByZXR1cm4gYWZ0ZXIgcHJv Y0hlYWRlcg1wdXQgIkZ1bmN0aW9uIEhhbmRsZSIgJiBwcm9jTmFtZSDCDSYgIih0aGVB cHBsZUV2ZW50LCB0aGVSZXBseTpBcHBsZUV2ZW50OyB0aGVSZWZDb246TE9OR0lOVCk6 T1NFcnI7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCBHbHVlSW5mbyhmaWVs ZCAicGFyYW1JbmZvIikgaW50byBwYXJhbUluZm8NcHV0IG51bWJlciBvZiBsaW5lcyBv ZiBwYXJhbUluZm8gaW50byBjb3VudA1wdXQgKGl0ZW0gMyBvZiBwYXJhbUluZm8gPD4g Im51bGwiKSBpbnRvIGlzRnVuYw1wdXQgVGFiICYgVGFiIGludG8gdHdvVGFiDXB1dCBU YWIgJiB0d29UYWIgaW50byB0aHJlZVRhYg1wdXQgIiIgaW50byB2YXJEZWNsYXJlDXB1 dCBmYWxzZSBpbnRvIG5lZWRFcnINcHV0ICIiIGludG8gY2xlYW5VcENvZGUNcHV0ICIi IGludG8gcHV0UmVzdWx0Q29kZQ1wdXQgVGFiICYgIkZhaWxFcnIoRG8iICYgcHJvY05h bWUgJiAiKCIgaW50byBjYWxsWW91ckNvZGUNcHV0IFRhYiAmICJCRUdJTiIgJiByZXR1 cm4gaW50byBpbml0Q29kZQ1wdXQgMCBpbnRvIHRvdGFsUGFyYW0NLS0gaWYgYSBmdW5j dGlvbiBnZXQgdGhlIHJlc3VsdCBiYWNrDWlmIGlzRnVuYyB0aGVuDWFkZCAxIHRvIHRv dGFsUGFyYW0NcHV0IGxpbmUgMSBvZiBwYXJhbUluZm8gaW50byB4DXB1dCBpdGVtIDQg b2YgeCBpbnRvIHBhcmFtVHlwZQ1wdXQgTmFtZU9mRGF0YVR5cGUoaXRlbSAzIG9mIHgp IGludG8gbmFtZUxpc3QNcHV0IFRhYiAmICJJRiB0aGVSZXBseS5kYXRhSGFuZGxlIDw+ IE5JTCBUSEVOIiAmIHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWlmIHBhcmFtVHlw ZSA8PSAzIHRoZW4gLS0gcmVzdWx0IGlzIEFFRGVzYyBvciBIYW5kbGUNcHV0ICJ0aGVS ZXN1bHQ6IEFFRGVzYzsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IFRhYiAm ICJ0aGVSZXN1bHQuZGF0YUhhbmRsZSA6PSBOSUw7IiAmIHJldHVybiBhZnRlciBpbml0 Q29kZQ1pZiAocGFyYW1UeXBlID0gMCkgb3IgKHBhcmFtVHlwZSA9IDIpIHRoZW4NcHV0 ICJ0aGVSZXN1bHQsIiBhZnRlciBjYWxsWW91ckNvZGUNZWxzZQ1wdXQgVGFiICYgInRo ZVJlc3VsdC5kZXNjcmlwdG9yVHlwZSA6PSAiICYgaXRlbSA0IG9mIG5hbWVMaXN0IMIN JiAiOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUNaWYgaXRlbSAzIG9mIG5hbWVMaXN0 ID0gIkhhbmRsZSIgdGhlbg1wdXQgInRoZVJlc3VsdC5kYXRhSGFuZGxlLCIgYWZ0ZXIg Y2FsbFlvdXJDb2RlDWVsc2UNcHV0IGl0ZW0gMyBvZiBuYW1lTGlzdCAmICIodGhlUmVz dWx0LmRhdGFIYW5kbGUpLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBpZg1lbmQgaWYN cHV0IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKHRoZVJlc3VsdCkp OyIgJiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNcHV0IHR3b1RhYiAmICJGYWlsRXJy KEFFUHV0S2V5RGVzYyh0aGVSZXBseSwga2V5RGlyZWN0T2JqZWN0LCB0aGVSZXN1bHQp KTsiICYgcmV0dXJuIGFmdGVyIHB1dFJlc3VsdENvZGUNZWxzZSBpZiAocGFyYW1UeXBl ID0gNCkgb3IgKHBhcmFtVHlwZSA9IDYpIHRoZW4gLS0gcmVzdWx0IGlzIG9uIHN0YWNr DXB1dCAidGhlUmVzdWx0OiAiICYgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0 dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0ICJ0aGVSZXN1bHQsIiBhZnRlciBjYWxsWW91 ckNvZGUNcHV0IHR3b1RhYiAmICJGYWlsRXJyKEFFUHV0S2V5UHRyKHRoZVJlcGx5LCBr ZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIEB0aGVS ZXN1bHQiIGFmdGVyIHB1dFJlc3VsdENvZGUNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1 dCAiLCBTaXplT2YoIiAmIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICIpKSk7IiAmIHJldHVy biBhZnRlciBwdXRSZXN1bHRDb2RlDWVsc2UNcHV0ICJbMV0sIExlbmd0aCh0aGVSZXN1 bHQpKSk7IiAmIHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWVuZCBpZg1lbmQgaWYN ZW5kIGlmIC0tIGlzRnVuYw1yZXBlYXQgd2l0aCBwYXJhbUluZGV4ID0gMiB0byBjb3Vu dA1wdXQgbGluZSBwYXJhbUluZGV4IG9mIHBhcmFtSW5mbyBpbnRvIHgNaWYgaXRlbSAz IG9mIHggPD4gIm51bGwiIHRoZW4NYWRkIDEgdG8gdG90YWxQYXJhbQ1wdXQgaXRlbSA0 IG9mIHggaW50byBwYXJhbVR5cGUNcHV0IChpdGVtIDUgb2YgeCA9ICJvIikgaW50byBp c09wdGlvbmFsDXB1dCBOYW1lT2ZEYXRhVHlwZShpdGVtIDMgb2YgeCkgaW50byBuYW1l TGlzdA1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IHR3b1RhYiBpbnRvIGluZGVudA1lbHNl DXB1dCBUYWIgaW50byBpbmRlbnQNZW5kIGlmDWlmIHBhcmFtVHlwZSA9IDAgdGhlbiAt LSBBRURlc2MNcHV0IGl0ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNcHV0IHRoaXNOYW1l ICYmICI6IEFFRGVzYzsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IFRhYiAm IHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlIDo9IE5JTDsiICYgcmV0dXJuIGFmdGVyIGlu aXRDb2RlDWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgaXRlbSA2IG9mIHggaW50byBwdHJU aGlzTmFtZQ1wdXQgcHRyVGhpc05hbWUgJiYgIjogQUVEZXNjUHRyOyIgJiByZXR1cm4g YWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgcHRyVGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlv dXJDb2RlDXB1dCB0cnVlIGludG8gbmVlZEVycg1wdXQgVGFiICYgImVyciA6PSBBRUdl dEtleURlc2ModGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9mIHggwg0mICIsdHlwZVdp bGRDYXJkLCIgJiB0aGlzTmFtZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IFBhc2NhbE9wdGlvbkhhbmRsaW5nKHRoaXNOYW1lLCBwdHJUaGlzTmFtZSkgYWZ0 ZXIgcHJvY0JvZHkNZWxzZQ1wdXQgdGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlvdXJD b2RlDXB1dCBUYWIgJiAiRmFpbEVycihBRUdldEtleURlc2ModGhlQXBwbGVFdmVudCwi ICYgaXRlbSAyIG9mIHggwg0mICIsdHlwZVdpbGRDYXJkLCIgJiB0aGlzTmFtZSAmICIp KTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgdHdvVGFiICYgIkln bm9yZU9TRXJyKEFFRGlzcG9zZURlc2MoIiAmIHRoaXNOYW1lICYgIikpOyIgJiByZXR1 cm4gYWZ0ZXIgY2xlYW5VcENvZGUNZWxzZSBpZiBwYXJhbVR5cGUgPSAxIHRoZW4gLS0g aGFuZGxlDXB1dCAiZGVzY0ZvciIgJiBTdHJpcFNQKGl0ZW0gMSBvZiB4KSBpbnRvIHRo aXNOYW1lDXB1dCB0aGlzTmFtZSAmJiAiOiBBRURlc2M7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCBUYWIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSA6PSBOSUw7 IiAmIHJldHVybiBhZnRlciBpbml0Q29kZQ1pZiBpdGVtIDMgb2YgbmFtZUxpc3QgPSAi SGFuZGxlIiB0aGVuDXB1dCB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSwiIGFmdGVyIGNh bGxZb3VyQ29kZQ1lbHNlDXB1dCBpdGVtIDMgb2YgbmFtZUxpc3QgJiAiKCIgJiB0aGlz TmFtZSAmICIuZGF0YUhhbmRsZSksIiBhZnRlciBjYWxsWW91ckNvZGUNZW5kIGlmDWlm IGlzT3B0aW9uYWwgdGhlbg1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFRhYiAmICJl cnIgOj0gQUVHZXRLZXlEZXNjKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBvZiB4IMIN JiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCIgJiB0aGlzTmFtZSAmICIpOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJJRiBlcnIgPSBlcnJBRURl c2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiDCDSYgdHdvVGFiICYgInsgb3IgeW91IG1h eSBwdXQgaW4geW91ciBkZWZhdWx0IGhlcmUgfSIgJiByZXR1cm4gwg0mIFRhYiAmICJF TFNFIEZhaWxFcnIoZXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0 IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5RGVzYyh0aGVBcHBsZUV2ZW50LCIgJiBpdGVt IDIgb2YgeCDCDSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYgIiwiICYgdGhpc05h bWUgJiAiKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IHR3b1Rh YiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKCIgJiB0aGlzTmFtZSAmICIpKTsi ICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWVsc2UgaWYgKHBhcmFtVHlwZSA9IDQp IG9yIChwYXJhbVR5cGUgPSA2KSB0aGVuDWlmIGl0ZW0gMyBvZiB4ID0gInRydWUiIHRo ZW4NcHV0IGl0ZW0gMSBvZiB4ICYmICI6IEJvb2xlYW47IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCBpdGVtIDEgb2YgeCAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUN cHV0IHRydWUgaW50byBuZWVkRXJyDXB1dCBQYXNjYWxUeXBlVHJ1ZUNvZGUoeCkgYWZ0 ZXIgcHJvY0JvZHkNZWxzZSBpZiBpc09wdGlvbmFsIHRoZW4NaWYgaXRlbSAzIG9mIHgg PSAiZW51bSIgdGhlbg1wdXQgaXRlbSAxIG9mIHggJiYgIjogUmVzVHlwZTsiICYgcmV0 dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IGl0ZW0gMSBvZiB4ICYgIiwiIGFmdGVyIGNh bGxZb3VyQ29kZQ1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFBhc2NhbFR5cGVUcnVl Q29kZSh4KSBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCBpdGVtIDYgb2YgeCBpbnRvIHB0 clRoaXNOYW1lDXB1dCBpdGVtIDEgb2YgeCBpbnRvIHRoaXNOYW1lDXB1dCB0aGlzTmFt ZSAmJiAiOiAiICYgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFmdGVy IHZhckRlY2xhcmUNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1dCBwdHJUaGlzTmFtZSAm JiAiOiAiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFmdGVyIHZh ckRlY2xhcmUNZWxzZQ1wdXQgcHRyVGhpc05hbWUgJiYgIjogU3RyaW5nUHRyOyIgJiBy ZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1lbmQgaWYNcHV0IHB0clRoaXNOYW1lICYgIiwi IGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFRhYiAm ICJlcnIgOj0gQUVHZXRLZXlQdHIodGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9mIHgg wg0mICIsIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsdHlwZUNvZGUsQCIgJiB0aGlz TmFtZSBhZnRlciBwcm9jQm9keQ1pZiBwYXJhbVR5cGUgPSA0IHRoZW4NcHV0ICIsU2l6 ZU9mKCIgJiB0aGlzTmFtZSAmICIpLGFjdHVhbFNpemUpOyIgJiByZXR1cm4gYWZ0ZXIg cHJvY0JvZHkNZWxzZSAtLSBzdHIyNTUNcHV0ICJbMV0sU2l6ZU9mKCIgJiB0aGlzTmFt ZSAmICIpLTEsYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg VGFiICYgdGhpc05hbWUgJiAiWzBdIDo9IGNocihhY3R1YWxTaXplKTsiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgUGFzY2FsT3B0aW9uSGFuZGxpbmcodGhp c05hbWUsIHB0clRoaXNOYW1lKSBhZnRlciBwcm9jQm9keQ1lbmQgaWYNZWxzZSAtLSBy ZXF1aXJlZA1wdXQgaXRlbSAxIG9mIHggaW50byB0aGlzTmFtZQ1wdXQgdGhpc05hbWUg JiYgIjogIiAmIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICI7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCB0aGlzTmFtZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNcHV0 IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5UHRyKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0g MiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLHR5cGVDb2RlLEAi ICYgdGhpc05hbWUgYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1 dCAiLFNpemVPZigiICYgdGhpc05hbWUgJiAiKSxhY3R1YWxTaXplKSk7IiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCAiWzFdLFNpemVPZigiICYgdGhpc05hbWUg JiAiKS0xLGFjdHVhbFNpemUpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBU YWIgJiB0aGlzTmFtZSAmICJbMF0gOj0gY2hyKGFjdHVhbFNpemUpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVuZCBpZg1lbHNlIGlmIChwYXJhbVR5cGUgPSA1 KSBvciAocGFyYW1UeXBlID0gNykgdGhlbg1wdXQgImRlc2NGb3IiICYgU3RyaXBTUChp dGVtIDEgb2YgeCkgaW50byB0aGlzTmFtZQ1wdXQgdGhpc05hbWUgJiYgIjogQUVEZXNj OyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgVGFiICYgdGhpc05hbWUgJiAi LmRhdGFIYW5kbGUgOj0gTklMOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUNcHV0IHR3 b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKCIgJiB0aGlzTmFtZSAmICIp KTsiICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWlmIGlzT3B0aW9uYWwgdGhlbg1w dXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IGl0ZW0gNiBvZiB4IGludG8gcHRyVGhpc05h bWUNcHV0IHB0clRoaXNOYW1lICYgIiA6IiAmIGl0ZW0gMiBvZiBuYW1lTGlzdCAmICI7 IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1w dXQgaXRlbSA3IG9mIHggaW50byBzaXplVGhpc05hbWUNcHV0IHNpemVUaGlzTmFtZSAm ICIgOiBMT05HSU5UOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1lbmQgaWYNcHV0 IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlEZXNjKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0g MiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCIgJiB0aGlzTmFt ZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJJRiBlcnIg PSBlcnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdv VGFiICYgcHRyVGhpc05hbWUgJiAiIDo9IE5JTDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1wdXQgdHdvVGFiICYgc2l6ZVRoaXNOYW1l ICYgIiA6PSAwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCB0d29U YWIgJiAieyBvciB5b3UgbWF5IHB1dCBpbiB5b3VyIGRlZmF1bHQgaGVyZSB9IiAmIHJl dHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkVORCIgJiByZXR1cm4gYWZ0 ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJFTFNFIiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg dHdvVGFiICYgIkZhaWxFcnIoZXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlm IHBhcmFtVHlwZSA9IDcgdGhlbiAtLSBwdXQgaW4gemVybyB0ZXJtaW5hdG9yDXB1dCB0 d29UYWIgJiAiRmFpbEVycihQdHJBbmRIYW5kKEBlcnIsICIgJiB0aGlzTmFtZSDCDSYg Ii5kYXRhSGFuZGxlLCAxKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYN cHV0IHR3b1RhYiAmICJXSVRIIiAmJiB0aGlzTmFtZSAmJiAiRE8iICYgcmV0dXJuIGFm dGVyIHByb2NCb2R5DXB1dCB0aHJlZVRhYiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIg cHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNSB0aGVuDXB1dCB0aHJlZVRhYiAmIHNpemVU aGlzTmFtZSAmICIgOj0gR2V0SGFuZGxlU2l6ZShkYXRhSGFuZGxlKTsiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DWVuZCBpZg1pZiBpdGVtIDIgb2YgbmFtZUxpc3QgPSAiUHRy IiB0aGVuDXB1dCB0aHJlZVRhYiAmIHB0clRoaXNOYW1lICYgIiA6PSBkYXRhSGFuZGxl XjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IHRocmVlVGFiICYgcHRy VGhpc05hbWUgJiAiIDo9ICIgJiBpdGVtIDIgb2YgbmFtZUxpc3Qgwg0mICIoZGF0YUhh bmRsZV4pOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCB0aHJlZVRh YiAmICJITG9jayhkYXRhSGFuZGxlKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCB0aHJlZVRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdv VGFiICYgIkVORDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBwdHJUaGlzTmFt ZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNaWYgcGFyYW1UeXBlID0gNSB0aGVuDXB1 dCBzaXplVGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBpZg1lbHNl DXB1dCBUYWIgJiAiRmFpbEVycihBRUdldEtleURlc2ModGhlQXBwbGVFdmVudCwiICYg aXRlbSAyIG9mIHggwg0mICIsIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIiAmIHRo aXNOYW1lICYgIikpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBl ID0gNyB0aGVuIC0tIHB1dCBpbiB6ZXJvIHRlcm1pbmF0b3INcHV0IHRydWUgaW50byBu ZWVkRXJyDXB1dCBUYWIgJiAiRmFpbEVycihQdHJBbmRIYW5kKEBlcnIsICIgJiB0aGlz TmFtZSDCDSYgIi5kYXRhSGFuZGxlLCAxKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1lbmQgaWYNcHV0IFRhYiAmICJITG9jaygiICYgdGhpc05hbWUgJiAiLmRhdGFIYW5k bGUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgaXRlbSAyIG9mIG5hbWVMaXN0 ID0gIlB0ciIgdGhlbg1wdXQgdGhpc05hbWUgJiAiLmRhdGFIYW5kbGVeLCIgYWZ0ZXIg Y2FsbFlvdXJDb2RlDWVsc2UNcHV0IGl0ZW0gMiBvZiBuYW1lTGlzdCAmICIoIiAmIHRo aXNOYW1lICYgIi5kYXRhSGFuZGxlXiksIiBhZnRlciBjYWxsWW91ckNvZGUNZW5kIGlm DWlmIHBhcmFtVHlwZSA9IDUgdGhlbiAtLSB3ZSBuZWVkIHRoZSBzaXplIHRvbw1wdXQg IkdldEhhbmRsZVNpemUoIiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlKSwiIGFmdGVy IGNhbGxZb3VyQ29kZQ1lbmQgaWYNZW5kIGlmDWVuZCBpZg1lbmQgaWYgLS0gbm90IG51 bGwNZW5kIHJlcGVhdA1pZiB2ZXJib3NlIHRoZW4NcHV0IFRhYiAmICJ7IFdlIGNoZWNr IHRvIHNlZSBpZiB3ZSBtaXNzZWQgYW55IHBhcmFtZXRlciBmcm9tIHRoZSBjbGllbnQg fSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAiSUYgQUVT aXplT2ZBdHRyaWJ1dGUodGhlQXBwbGVFdmVudCwga2V5TWlzc2VkS2V5d29yZEF0dHIs ICIgwg0mICJ0eXBlQ29kZSwgYWN0dWFsU2l6ZSkgPD4gZXJyQUVEZXNjTm90Rm91bmQg VEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmICJGYWlsRXJy KGVyckFFUGFyYW1NaXNzZWQpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgdG90 YWxQYXJhbSA+IDAgdGhlbg1wdXQgIikiIGludG8gbGFzdCBjaGFyIG9mIGNhbGxZb3Vy Q29kZQ1lbHNlDWRlbGV0ZSBsYXN0IGNoYXIgb2YgY2FsbFlvdXJDb2RlDWVuZCBpZg1w dXQgY2FsbFlvdXJDb2RlICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg cHV0UmVzdWx0Q29kZSBhZnRlciBwcm9jQm9keQ1pZiBjbGVhblVwQ29kZSA8PiAiIiB0 aGVuDXB1dCB0YWIgJiAiQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVu ZCBpZg1wdXQgdGFiICYgIkhhbmRsZSIgJiBwcm9jTmFtZSAmICIgOj0gTm9FcnI7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdGFiICYgIkVORDsiICYgcmV0dXJuIGFm dGVyIHByb2NCb2R5DWlmIG5lZWRFcnIgdGhlbiBwdXQgImVyciA6IE9TRXJyOyIgJiBy ZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgInR5cGVDb2RlIDogRGVzY1R5cGU7IiAm IHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAiYWN0dWFsU2l6ZSA6IExPTkdJTlQ7 IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWlmIHZhckRlY2xhcmUgPD4gIiIgdGhl bg1wdXQgdGFiICYgIlZBUiIgJiByZXR1cm4gaW50byB4DXJlcGVhdCB3aXRoIGkgPSAx IHRvIG51bWJlciBvZiBsaW5lcyBpbiB2YXJEZWNsYXJlDXB1dCB0d29UYWIgJiBsaW5l IGkgb2YgdmFyRGVjbGFyZSAmIHJldHVybiBhZnRlciB4DWVuZCByZXBlYXQNcHV0IHgg YWZ0ZXIgcHJvY0hlYWRlcg1lbmQgaWYNcHV0IEZhaWxFcnJTb3VyY2UocHJvY05hbWUs IGNsZWFuVXBDb2RlKSBhZnRlciBwcm9jSGVhZGVyDXJldHVybiBwcm9jSGVhZGVyICYg aW5pdENvZGUgJiByZXR1cm4gJiBwcm9jQm9keSAmIHJldHVybg1lbHNlIGlmIGNhcmRU eXBlID0gImluaXQiIHRoZW4NcmV0dXJuICJQUk9DRURVUkUgSWdub3JlT1NFcnIoZXJy Ok9TRXJyKTsgSU5MSU5FICQ1NDhGOyB7IGFkZHEgIzIsc3AgfSAiICYgcmV0dXJuICYg cmV0dXJuDWVsc2UgaWYgY2FyZFR5cGUgPSAiaW5zdGFsbCIgdGhlbg1wdXQgIkFFIiAm IFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNcmV0dXJuIFRh YiAmICJJZ25vcmVPU0VycihBRUluc3RhbGxFdmVudEhhbmRsZXIoJyIgJiBSZXNUeXBl KGZpZWxkICJldmVudENsYXNzIikgwg0mICInLCAnIiAmIFJlc1R5cGUoZmllbGQgImV2 ZW50SUQiKSAmICInLCBASGFuZGxlIiAmIHByb2NOYW1lIMINJiAiLCAwLCBGQUxTRSkp OyIgJiByZXR1cm4NZWxzZQ1yZXR1cm4gIiINZW5kIGlmDWVuZCBTZXJ2ZXJTYW1wbGUN DWZ1bmN0aW9uIEZhaWxFcnJTb3VyY2UgcHJvY05hbWUsIGNsZWFudXBDb2RlDS0tIHdl IHB1dCB0aGlzIHNlcGFyYXRlIHNvIHRoZSBQYXNjYWxTZXJ2ZXJTYW1wbGUgd291bGQg bm90IGJlIHRvbyBsb25nDXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0IFRhYiAm IHR3b1RhYiBpbnRvIHRocmVlVGFiDXB1dCAiIiBpbnRvIHByb2NIZWFkZXINLS0gdGhl IGNsZWFudXAgcm91dGluZQ1pZiBjbGVhblVwQ29kZSA8PiAiIiB0aGVuDXB1dCBUYWIg JiAiUFJPQ0VEVVJFIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1 dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXINcHV0IGNs ZWFuVXBDb2RlIGFmdGVyIHByb2NIZWFkZXINcHV0IHR3b1RhYiAmICJFTkQ7IiAmIHJl dHVybiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDWVuZCBpZg1wdXQgVGFiICYgIlBS T0NFRFVSRSBGYWlsRXJyKGVycjpPU0Vycik7IiAmIHJldHVybiBhZnRlciBwcm9jSGVh ZGVyDXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXIN cHV0IHR3b1RhYiAmICJJRiBlcnIgPD4gTk9FcnIgVEhFTiIgJiByZXR1cm4gYWZ0ZXIg cHJvY0hlYWRlcg1wdXQgdGhyZWVUYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHBy b2NIZWFkZXINcHV0IHRocmVlVGFiICYgIkhhbmRsZSIgJiBwcm9jTmFtZSAmICIgOj0g ZXJyOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1pZiBjbGVhblVwQ29kZSA8PiAi IiB0aGVuDXB1dCB0aHJlZVRhYiAmICJDbGVhblVwOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0hlYWRlcg1lbmQgaWYNcHV0IHRocmVlVGFiICYgIkV4aXQoSGFuZGxlIiAmIHByb2NO YW1lICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCB0aHJlZVRhYiAm ICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCB0d29UYWIgJiAiRU5E OyIgJiByZXR1cm4gJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1yZXR1cm4gcHJvY0hl YWRlcg1lbmQgRmFpbEVyclNvdXJjZQ0NZnVuY3Rpb24gUGFzY2FsVHlwZVRydWVDb2Rl IHgNcHV0IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlQdHIodGhlQXBwbGVFdmVudCwiICYg aXRlbSAyIG9mIHggJiAiLCAiIGludG8gcHJvY0JvZHkNaWYgaXRlbSAzIG9mIHggPSAi dHJ1ZSIgdGhlbg1wdXQgInR5cGVCb29sZWFuLCB0eXBlQ29kZSwgQCIgJiBpdGVtIDEg b2YgeCAmICIsU2l6ZU9mKEJvb2xlYW4pLCBhY3R1YWxTaXplKTsiICYgcmV0dXJuIGFm dGVyIHByb2NCb2R5DWVsc2UNcHV0ICJ0eXBlRW51bWVyYXRlZCwgdHlwZUNvZGUsIEAi ICYgaXRlbSAxIG9mIHggJiAiLFNpemVPZihSZXNUeXBlKSwgYWN0dWFsU2l6ZSk7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJJRiBlcnIgPSBl cnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg VGFiICYgVGFiICYgaXRlbSAxIG9mIHggJiAiIDo9ICIgYWZ0ZXIgcHJvY0JvZHkNaWYg aXRlbSAzIG9mIHggPSAidHJ1ZSIgdGhlbg1wdXQgIkZBTFNFIiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbHNlDXB1dCAiUmVzVHlwZSgwKSIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAiRUxTRSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IFRhYiAmIFRhYiAmICJGYWlsRXJyKGVycik7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1yZXR1cm4gcHJvY0JvZHkNZW5kIFBhc2NhbFR5cGVUcnVlQ29kZQ0NZnVu Y3Rpb24gUGFzY2FsT3B0aW9uSGFuZGxpbmcgdGhpc05hbWUsIHB0clRoaXNOYW1lDXB1 dCBUYWIgJiAiaWYgZXJyID0gZXJyQUVEZXNjTm90Rm91bmQgVEhFTiIgJiByZXR1cm4g aW50byBwcm9jQm9keQ1wdXQgVGFiICYgVGFiIGludG8gdHdvVGFiDXB1dCB0d29UYWIg JiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiBwdHJU aGlzTmFtZSAmICIgOj0gTklMOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3 b1RhYiAmICJ7IG9yIHlvdSBtYXkgcHV0IGluIHlvdXIgZGVmYXVsdCBoZXJlIH0iICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRU5EIiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgIkVMU0UiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCB0d29UYWIgJiAiRmFpbEVycihlcnIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IHR3b1RhYiAmIHB0clRoaXNOYW1lICYgIiA6PSBAIiAmIHRoaXNOYW1lICYgIjsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRU5EOyIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNcmV0dXJuIHByb2NCb2R5DWVuZCBQYXNjYWxPcHRpb25I YW5kbGluZw0NZnVuY3Rpb24gU2VydmVyQ29uc3QgY29uc3RJbmZvLGNvbW1lbnRPdXQN cHV0IGl0ZW0gMSBvZiBjb25zdEluZm8gJiAiID0gIiAmIGl0ZW0gMiBvZiBjb25zdElu Zm8gJiAiOyIgaW50byB4DWlmIGNvbW1lbnRPdXQgPSAidHJ1ZSIgdGhlbg1wdXQgInsg IiAmIHggJiAiIH0iIGludG8geA1lbmQgaWYNcmV0dXJuIFRhYiAmIHgNZW5kIFNlcnZl ckNvbnN0DQ1mdW5jdGlvbiBTZXJ2ZXJJbnN0YWxsIGluc3RhbGxDb2RlDXJldHVybiBy ZXR1cm4gJiAiUHJvY2VkdXJlIEluc3RhbGxIYW5kbGVyczsiICYgcmV0dXJuIMINJiBU YWIgJiAiQkVHSU4iICYgcmV0dXJuICYgaW5zdGFsbENvZGUgJiBUYWIgJiAiRU5EOyIg JiByZXR1cm4NZW5kIFNlcnZlckluc3RhbGwNDWZ1bmN0aW9uIFBhc2NhbENsaWVudFRl bXBsYXRlIG11bHRpTGluZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBvciB3 aGljaCBwYXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgR2x1ZUluZm8oZmllbGQg InBhcmFtSW5mbyIpIGludG8gcGFyYW1JbmZvDXB1dCAiRnVuY3Rpb24gQUUiICYgU3Ry aXBTUChmaWVsZCAiZXZlbnROYW1lIikgJiAiKCIgaW50byB0ZW1wbGF0ZQ1wdXQgbnVt YmVyIG9mIGxpbmVzIGluIHBhcmFtSW5mbyBpbnRvIG4NcHV0IDAgaW50byBwYXJhbUlu ZGV4DXJlcGVhdCB3aXRoIGluZGV4ID0gMSB0byBuDXNldCBjdXJzb3IgdG8gYnVzeQ1w dXQgbGluZSBpbmRleCBvZiBwYXJhbUluZm8gaW50byB5DXB1dCBpdGVtIDQgb2YgeSBp bnRvIHBhcmFtVHlwZQ1wdXQgKGl0ZW0gNSBvZiB5ID0gIm8iKSBpbnRvIGlzT3B0aW9u YWwNcHV0IChpdGVtIDMgb2YgeSA8PiAibnVsbCIpIGludG8gdXNlSXQNaWYgdXNlSXQg dGhlbg1hZGQgMSB0byBwYXJhbUluZGV4DWlmIHVzZUl0IHRoZW4NaWYgaW5kZXggPSAx IHRoZW4NcHV0ICJWQVIgIiBhZnRlciB0ZW1wbGF0ZQ1wdXQgZmFsc2UgaW50byBpc09w dGlvbmFsDWVsc2UNaWYgbXVsdGlMaW5lID0gIm11bHRpTGluZSIgdGhlbg1wdXQgcmV0 dXJuICYgc3BhY2UgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1wdXQgc3BhY2UgYWZ0ZXIgdGVt cGxhdGUNZW5kIGlmDWVuZCBpZg1wdXQgTmFtZU9mRGF0YVR5cGUoaXRlbSAzIG9mIHkp IGludG8gbmFtZUxpc3QNaWYgcGFyYW1UeXBlID0gMSB0aGVuIC0tIGhhbmRsZQ1wdXQg aXRlbSAxIG9mIHkgJiAiOiIgJiBpdGVtIDMgb2YgbmFtZUxpc3QgJiAiOyAiIGFmdGVy IHRlbXBsYXRlDWVsc2UgaWYgcGFyYW1UeXBlID0gNSB0aGVuIC0tIHB0ciArIHNpemUN cHV0IGl0ZW0gNiBvZiB5ICYgIjoiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsgIiDC DSYgaXRlbSA3IG9mIHkgJiAiOiBMT05HSU5UOyAiIGFmdGVyIHRlbXBsYXRlDWVsc2Ug aWYgcGFyYW1UeXBlID0gNyB0aGVuIC0tIGNTdHJpbmcNcHV0IGl0ZW0gNiBvZiB5ICYg IjoiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsgIiBhZnRlciB0ZW1wbGF0ZQ1lbHNl IGlmIGlzT3B0aW9uYWwgdGhlbiAtLSB1c2UgcG9pbnRlciB0byBkYXRhDWlmIHBhcmFt VHlwZSA9IDQgdGhlbiAtLSBmaXhlZCBsZW5ndGgNcHV0IGl0ZW0gMyBvZiB5IGludG8g ZGF0YVR5cGUNaWYgZGF0YVR5cGUgPSAiZW51bSIgdGhlbiAtLSBzcGVjaWFsIGZvciBl bnVtDXB1dCBpdGVtIDEgb2YgeSAmICI6UmVzVHlwZTsgIiBhZnRlciB0ZW1wbGF0ZQ1l bHNlIGlmIGRhdGFUeXBlID0gInRydWUiIHRoZW4gLS0gYWxzbyBzcGVjaWFsIGZvciB0 cnVlDXB1dCBpdGVtIDEgb2YgeSAmICI6Qm9vbGVhbjsgIiBhZnRlciB0ZW1wbGF0ZQ1l bHNlDXB1dCBpdGVtIDYgb2YgeSAmICI6IiAmIGl0ZW0gMiBvZiBuYW1lTGlzdCAmICI7 ICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVsc2UNcHV0IGl0ZW0gNiBvZiB5ICYgIjoi IGFmdGVyIHRlbXBsYXRlDWlmIChwYXJhbVR5cGUgPSAwKSB0aGVuDXB1dCAiQUVEZXNj UHRyOyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgLS0gNiwgUFN0cmluZw1wdXQgIlN0cmlu Z1B0cjsgIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlmDWVsc2UgLS0gcmVxdWly ZWQNcHV0IGl0ZW0gMSBvZiB5ICYgIjoiIGFmdGVyIHRlbXBsYXRlDWlmIChwYXJhbVR5 cGUgPSAwKSB0aGVuIC0tIEFFRGVzYw1wdXQgIkFFRGVzYzsgIiBhZnRlciB0ZW1wbGF0 ZQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDQgdGhlbiAtLSBmaXhlZCBsZW5ndGgNcHV0IGl0 ZW0gMSBvZiBuYW1lTGlzdCAmICI7ICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSAtLSBzdHIy NTUNcHV0ICJTdHIyNTU7ICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBpZg1lbmQg aWYgLS0gdXNlSXQNZW5kIGlmIC0tIHVzZUl0DWVuZCByZXBlYXQNRGVsZXRlIGxhc3Qg Y2hhciBvZiB0ZW1wbGF0ZSAtLSBzcGFjZSBvciAoDWlmIHBhcmFtSW5kZXggPiAwIHRo ZW4NcHV0ICIpIiBpbnRvIGxhc3QgY2hhciBvZiB0ZW1wbGF0ZSAtLSByZXBsYWNlIDsN ZW5kIGlmDXB1dCAiOk9TRXJyOyIgYWZ0ZXIgdGVtcGxhdGUNcmV0dXJuIHRlbXBsYXRl DWVuZCBQYXNjYWxDbGllbnRUZW1wbGF0ZQ0NAAApGgAeAQAApgAQALsAZ6AEAAAAAAAB AAAADAAAABBEZXJleiBhZXRlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xp Y2sgaGVyZSB0byBnZW5lcmF0ZSBhIGRlcmV6ZWQgYWV0ZSByZXNvdXJjZSBmb3IgdXNl IGluIE1QVy4iDWVuZCBNb3VzZVdpdGhpbg0Nb24gbW91c2VVcA1pZiBvcHRpb25LZXkg aXMgZG93biB0aGVuDWFzayBmaWxlICJPdXRwdXQgZGVyZXplZCBhZXRlIHRvIg1pZiBp dCA8PiAiIiB0aGVuDXB1dCBpdCBpbnRvIHJlZg1vcGVuIGZpbGUgcmVmDXdyaXRlIGRl cmV6KCkgdG8gZmlsZSByZWYNY2xvc2UgZmlsZSByZWYNZW5kIGlmDWVsc2UNUHV0U2Ny YXRjaCBkZXJleigpDWVuZCBpZg1lbmQgbW91c2VVcA0NZnVuY3Rpb24gZGVyZXoNZ2xv YmFsIGluRWRpdA1zZXQgbG9ja1NjcmVlbiB0byB0cnVlDXNldCBsb2NrUmVjZW50IHRv IHRydWUNc2V0IGN1cnNvciB0byB3YXRjaA1wdXNoIGNhcmQNcHV0IGNhcmQgZmllbGQg InJlc291cmNlVHlwZSIgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byByZXNvdXJjZVR5 cGUNcHV0IGZhbHNlIGludG8gaW5FZGl0DWdvIHRvIGZpcnN0IGNhcmQgb2YgYmtnbmQg ZXZlbnRzDXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50 byBzdWl0ZUNvdW50DXB1dCB0YWIgJiB0YWIgaW50byB0YWIyDXB1dCB0YWIgJiB0YWIy IGludG8gdGFiMw1wdXQgdGFiICYgdGFiMyBpbnRvIHRhYjQNcHV0IHRhYiAmIHRhYjQg aW50byB0YWI1DXB1dCB0YWIzICYgcXVvdGUgaW50byB0YWIzcXVvdGUNcHV0IHRhYjMg JiAiJyIgaW50byB0YWIzc3ENcHV0IHRhYjQgJiBxdW90ZSBpbnRvIHRhYjRxdW90ZQ1w dXQgdGFiNCAmICInIiBpbnRvIHRhYjRzcQ1wdXQgcXVvdGUgJiAiLCIgJiByZXR1cm4g aW50byBxY3INcHV0ICInLCIgJiByZXR1cm4gaW50byBzcWNyDXB1dCBjYXJkIGZpZWxk ICJyZXNvdXJjZUlEIiBvZiBjYXJkICJwcmVmZXJlbmNlIiBpbnRvIHRlbXANcHV0ICJS ZXNvdXJjZSAnIiAmIHJlc291cmNlVHlwZSAmICInICgiICYgdGVtcCDCDSYgIiwgIiAm IHF1b3RlICYgKGNhcmQgZmllbGQgInJlc291cmNlTmFtZSIgb2YgY2FyZCAicHJlZmVy ZW5jZSIpICYgcXVvdGUgJiAiKSB7IiAmIHJldHVybiBpbnRvIGR6DXB1dCBjYXJkIGZp ZWxkICJtYWpvclZlcnNpb24iIG9mIGNhcmQgInByZWZlcmVuY2UiIGludG8gdGVtcA1w dXQgdGFiICYgKCh0ZW1wIGRpdiAxMCkgKiAxNiArICh0ZW1wIG1vZCAxMCkpICYgIiwi ICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBjYXJkIGZpZWxkICJtaW5vclZlcnNpb24iIG9m IGNhcmQgInByZWZlcmVuY2UiIGludG8gdGVtcA1pZiBsZW5ndGgodGVtcCkgPSAxIHRo ZW4gbXVsdGlwbHkgdGVtcCBieSAxMA1wdXQgdGFiICYgKCh0ZW1wIGRpdiAxMCkgKiAx NiArICh0ZW1wIG1vZCAxMCkpICYgIiwiICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBjYXJk IGZpZWxkICJsYW5ndWFnZUNvZGUiIG9mIGNhcmQgInByZWZlcmVuY2UiIGludG8geA1p ZiB4ID0gMCB0aGVuIHB1dCAiZW5nbGlzaCIgaW50byB4DXB1dCB0YWIgJiB4ICYgIiwi ICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBjYXJkIGZpZWxkICJzY3JpcHRDb2RlIiBvZiBj YXJkICJwcmVmZXJlbmNlIiBpbnRvIHgNaWYgeCA9IDAgdGhlbiBwdXQgInJvbWFuIiBp bnRvIHgNcHV0IHRhYiAmIHggJiAiLCIgJiByZXR1cm4gYWZ0ZXIgZHoNcHV0IHRhYiAm ICJ7IiAmIHJldHVybiBhZnRlciBkeg1yZXBlYXQgd2l0aCBzdWl0ZUluZGV4ID0gMiB0 byBzdWl0ZUNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1nbyBjYXJkIHN1aXRlSW5kZXgg b2YgYmtnbmQgInN1aXRlSW5mbyINcHV0IGZpZWxkICJzdWl0ZUNvZGUiIGludG8gbXlT dWl0ZUNvZGUNcHV0IHRhYjIgJiBxdW90ZSAmIGZpZWxkICJTdWl0ZU5hbWUiICYgcWNy IGFmdGVyIGR6DXB1dCB0YWIyICYgcXVvdGUgJiBSZW1vdmVDUihmaWVsZCAic3VpdGVD b21tZW50IikgJiBxY3IgYWZ0ZXIgZHoNcHV0IHRhYjIgJiAiJyIgJiBSZXNUeXBlKG15 U3VpdGVDb2RlKSAmIHNxY3IgYWZ0ZXIgZHoNcHV0IHRhYjIgJiAiMSwiICYgcmV0dXJu IGFmdGVyIGR6DXB1dCB0YWIyICYgIjEsIiAmIHJldHVybiBhZnRlciBkeg1wdXQgdGFi MiAmICJ7IiAmIHJldHVybiBhZnRlciBkeg1wdXQgZmllbGQgRXZlbnRMaXN0IGludG8g bXlFdmVudExpc3QNcHV0IGZpZWxkIENsYXNzTGlzdCBpbnRvIG15Q2xhc3NMaXN0DXB1 dCBmaWVsZCBDb21wYXJlTGlzdCBpbnRvIG15Q29tcGFyZUxpc3QNcHV0IGZpZWxkIEVu dW1MaXN0IGludG8gbXlFbnVtTGlzdA0tLSBub3cgZG8gaXQgZm9yIGVhY2ggZXZlbnQg aW4gdGhlIGxpc3QNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBteUV2ZW50TGlzdCBpbnRv IGV2ZW50Q291bnQNcmVwZWF0IHdpdGggZXZlbnRJbmRleCA9IDEgdG8gZXZlbnRjb3Vu dA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiZXZlbnQiICYmIGl0ZW0gMiBvZiBs aW5lIGV2ZW50SW5kZXggb2YgbXlFdmVudExpc3QpIHRoZW4NaWYgbm90IGhpbGl0ZSBv ZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgdGhlbg1wdXQgdGFiM3F1b3RlICYgZmll bGQgZXZlbnROYW1lICYgcWNyIGFmdGVyIGR6DXB1dCB0YWIzcXVvdGUgJiBSZW1vdmVD UihmaWVsZCBldmVudENvbW1lbnQpICYgcWNyIGFmdGVyIGR6DXB1dCB0YWIzc3EgJiBS ZXNUeXBlKGZpZWxkIGV2ZW50Q2xhc3MpICYgc3FjciBhZnRlciBkeg1wdXQgdGFiM3Nx ICYgUmVzVHlwZShmaWVsZCBldmVudElEKSAmIHNxY3IgYWZ0ZXIgZHoNcHV0IGxpbmUg MSBvZiBmaWVsZCBwYXJhbUluZm8gaW50byB4IC0tIHJlcGx5DXB1dCBSZXNUeXBlKGl0 ZW0gMyBvZiB4KSBpbnRvIHRlbXANaWYgdGVtcCA9ICJudWxsIiB0aGVuDXB1dCB0YWIz ICYgIm5vUmVwbHksIiAmIHJldHVybiBhZnRlciBkeg1lbHNlDXB1dCB0YWIzc3EgJiB0 ZW1wICYgc3FjciBhZnRlciBkeg1lbmQgaWYNcHV0IGl0ZW0gNCBvZiB4IGludG8gdGVt cA1kZWxldGUgaXRlbSAxIHRvIDQgb2YgeA1wdXQgdGFiM3F1b3RlICYgUmVtb3ZlQ1Io eCkgJiBxY3IgYWZ0ZXIgZHogLS0gcmVwbHkgY29tbWVudA1wdXQgQml0RmllbGQodGVt cCwgInJwbHkiKSBhZnRlciBkeiAtLSByZXBseSBhdHRyaWJ1dGUNcHV0IGxpbmUgMiBv ZiBmaWVsZCBwYXJhbUluZm8gaW50byB4IC0tIGRpcmVjdCBvYmplY3QNcHV0IFJlc1R5 cGUoaXRlbSAzIG9mIHgpIGludG8gdGVtcA1pZiB0ZW1wID0gIm51bGwiIHRoZW4NcHV0 IHRhYjMgJiAibm9QYXJhbXMsIiAmIHJldHVybiBhZnRlciBkeg1lbHNlDXB1dCB0YWIz c3EgJiB0ZW1wICYgc3FjciBhZnRlciBkeg1lbmQgaWYNcHV0IGl0ZW0gNCBvZiB4IGlu dG8gdGVtcA1kZWxldGUgaXRlbSAxIHRvIDQgb2YgeA1wdXQgdGFiM3F1b3RlICYgUmVt b3ZlQ1IoeCkgJiBxY3IgYWZ0ZXIgZHogLS0gZGlyZWN0IG9iamVjdCBjb21tZW50DXB1 dCBCaXRGaWVsZCh0ZW1wLCAiLS0tLSIpIGFmdGVyIGR6IC0tIGRpcmVjdCBhdHRyaWJ1 dGUNcHV0IHRhYjMgJiAieyIgJiByZXR1cm4gYWZ0ZXIgZHoNcmVwZWF0IHdpdGggaSA9 IDMgdG8gbnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkIHBhcmFtSW5mbw1zZXQgY3Vyc29y IHRvIGJ1c3kNcHV0IGxpbmUgaSBvZiBmaWVsZCBwYXJhbUluZm8gaW50byB4DXB1dCB0 YWI0cXVvdGUgJiBpdGVtIDEgb2YgeCAmIHFjciBhZnRlciBkeiAtLSBwYXJhbSBuYW1l DXB1dCB0YWI0c3EgJiBSZXNUeXBlKGl0ZW0gMiBvZiB4KSAmIHNxY3IgYWZ0ZXIgZHog LS0gcGFyYW0ga2V5DXB1dCB0YWI0c3EgJiBSZXNUeXBlKGl0ZW0gMyBvZiB4KSAmIHNx Y3IgYWZ0ZXIgZHogLS0gZGF0YSB0eXBlDXB1dCBpdGVtIDQgb2YgeCBpbnRvIHRlbXAN ZGVsZXRlIGl0ZW0gMSB0byA0IG9mIHgNcHV0IHRhYjRxdW90ZSAmIFJlbW92ZUNSKHgp ICYgcWNyIGFmdGVyIGR6IC0tIGNvbW1lbnQNcHV0IEJpdEZpZWxkKHRlbXAsICI/Pz8/ IikgaW50byB0ZW1wIC0tIGF0dHJpYnV0ZQ0tLSBsYXN0IG9uZSBkbyBub3QgaGF2ZSBh IGNvbW1hIGF0IHRoZSBlbmQNaWYgaSA9IG51bWJlciBvZiBsaW5lcyBpbiBmaWVsZCBw YXJhbUluZm8gdGhlbg1kZWxldGUgbGFzdCBjaGFyIG9mIHRlbXANcHV0IHJldHVybiBp bnRvIGxhc3QgY2hhciBvZiB0ZW1wDWVuZCBpZg1wdXQgdGVtcCBhZnRlciBkeg1lbmQg cmVwZWF0DWlmIGV2ZW50SW5kZXggPD4gZXZlbnRDb3VudCB0aGVuDXB1dCB0YWIzICYg In0sIiAmIHJldHVybiBhZnRlciBkeg1lbHNlIC0tIG5lZWQgY29tbWVudCBpZiBub3Qg dGhlIGxhc3Qgb25lIGluIHN1aXRlDXB1dCB0YWIzICYgIn0iICYgcmV0dXJuIGFmdGVy IGR6DWVuZCBpZg1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGV2 ZW50IGluIHN1aXRlDXB1dCB0YWIyICYgIn0sIiAmIHJldHVybiBhZnRlciBkeg0tLSBu b3cgZG8gaXQgZm9yIGVhY2hjbGFzcyBpbiB0aGUgbGlzdA1wdXQgdGFiMiAmICJ7IiAm IHJldHVybiBhZnRlciBkeg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIG15Q2xhc3NMaXN0 IGludG8gY2xhc3NDb3VudA1yZXBlYXQgd2l0aCBjbGFzc0luZGV4ID0gMSB0byBjbGFz c0NvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBqdW1wKCJjbGFzcyIgJiYgaXRlbSAy IG9mIGxpbmUgY2xhc3NJbmRleCBvZiBteUNsYXNzTGlzdCkgdGhlbg1pZiBub3QgaGls aXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0aGVuDXB1dCB0YWIzcXVvdGUg JiBmaWVsZCAiY2xhc3NOYW1lIiAmIHFjciBhZnRlciBkeg1wdXQgdGFiM3NxICYgUmVz VHlwZShmaWVsZCAiY2xhc3NJRCIpICYgc3FjciBhZnRlciBkeg1wdXQgdGFiM3F1b3Rl ICYgUmVtb3ZlQ1IoZmllbGQgImNsYXNzQ29tbWVudCIpICYgcWNyIGFmdGVyIGR6DXB1 dCB0YWIzICYgInsiICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBudW1iZXIgb2YgbGluZXMg aW4gZmllbGQgInByb3BJbmZvIiBpbnRvIHByb3BDb3VudA1yZXBlYXQgd2l0aCBwcm9w SW5kZXggPSAxIHRvIHByb3BDb3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kNcHV0IGxpbmUg cHJvcEluZGV4IG9mIGZpZWxkICJwcm9wSW5mbyIgaW50byB4DXB1dCB0YWI0cXVvdGUg JiBpdGVtIDEgb2YgeCAmIHFjciBhZnRlciBkeiAtLSBwcm9wIG5hbWUNcHV0IHRhYjRz cSAmIFJlc1R5cGUoaXRlbSAyIG9mIHgpICYgc3FjciBhZnRlciBkeiAtLSBwcm9wIElE DXB1dCB0YWI0c3EgJiBSZXNUeXBlKGl0ZW0gMyBvZiB4KSAmIHNxY3IgYWZ0ZXIgZHog LS0gcHJvcCBjbGFzcw1wdXQgaXRlbSA0IG9mIHggaW50byB0ZW1wDWRlbGV0ZSBpdGVt IDEgdG8gNCBvZiB4DXB1dCB0YWI0cXVvdGUgJiBSZW1vdmVDUih4KSAmIHFjciBhZnRl ciBkeiAtLSBjb21tZW50DXB1dCBCaXRGaWVsZCh0ZW1wLCAicHJvcCIpIGludG8gdGVt cCAtLSBhdHRyaWJ1dGUNLS0gbGFzdCBvbmUgZG8gbm90IGhhdmUgYSBjb21tYSBhdCB0 aGUgZW5kDWlmIHByb3BJbmRleCA9IHByb3BDb3VudCB0aGVuDWRlbGV0ZSBsYXN0IGNo YXIgb2YgdGVtcA1wdXQgcmV0dXJuIGludG8gbGFzdCBjaGFyIG9mIHRlbXANZW5kIGlm DXB1dCB0ZW1wIGFmdGVyIGR6DWVuZCByZXBlYXQNcHV0IHRhYjMgJiAifSwiICYgcmV0 dXJuIGFmdGVyIGR6DXB1dCB0YWIzICYgInsiICYgcmV0dXJuIGFmdGVyIGR6DXB1dCBu dW1iZXIgb2YgbGluZXMgaW4gZmllbGQgImVsZW1lbnRzIiBpbnRvIGVsZW1Db3VudA1y ZXBlYXQgd2l0aCBlbGVtSW5kZXggPSAxIHRvIGVsZW1Db3VudA1zZXQgY3Vyc29yIHRv IGJ1c3kNcHV0IGxpbmUgZWxlbUluZGV4IG9mIGZpZWxkICJlbGVtZW50cyIgaW50byB4 DXB1dCB0YWI0c3EgJiBSZXNUeXBlKGl0ZW0gMSBvZiB4KSAmIHNxY3IgYWZ0ZXIgZHoN cHV0IHRhYjQgJiAieyIgJiByZXR1cm4gYWZ0ZXIgZHoNcHV0IG51bWJlciBvZiBpdGVt cyBvZiB4IGludG8ga2V5Rm9ybUNvdW50DXJlcGVhdCB3aXRoIGtleUZvcm1JbmRleCA9 IDIgdG8ga2V5Rm9ybUNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1wdXQgUmVzVHlwZShp dGVtIGtleUZvcm1JbmRleCBvZiB4KSBpbnRvIHRlbXANaWYgdGVtcCA9ICJpbmR4IiB0 aGVuDXB1dCAiZm9ybUFic29sdXRlUG9zaXRpb24iIGludG8gdGVtcA1lbHNlIGlmIHRl bXAgPSAibmFtZSIgdGhlbg1wdXQgImZvcm1OYW1lIiBpbnRvIHRlbXANZWxzZQ1wdXQg IiciICYgdGVtcCAmICInIiBpbnRvIHRlbXANZW5kIGlmDWlmIGtleUZvcm1JbmRleCA8 PiBrZXlGb3JtQ291bnQgdGhlbg1wdXQgIiwiIGFmdGVyIHRlbXANZW5kIGlmDXB1dCB0 YWI1ICYgdGVtcCAmIHJldHVybiBhZnRlciBkeg1lbmQgcmVwZWF0DS0tIGxhc3Qgb25l IGRvIG5vdCBoYXZlIGEgY29tbWEgYXQgdGhlIGVuZA1pZiBlbGVtSW5kZXggPD4gZWxl bUNvdW50IHRoZW4NcHV0IHRhYjQgJiAifSwiICYgcmV0dXJuIGFmdGVyIGR6DWVsc2UN cHV0IHRhYjQgJiAifSIgJiByZXR1cm4gYWZ0ZXIgZHoNZW5kIGlmDWVuZCByZXBlYXQN LS0gbGFzdCBvbmUgZG8gbm90IGhhdmUgYSBjb21tYSBhdCB0aGUgZW5kDWlmIGNsYXNz SW5kZXggPD4gY2xhc3NDb3VudCB0aGVuDXB1dCB0YWIzICYgIn0sIiAmIHJldHVybiBh ZnRlciBkeg1lbHNlDXB1dCB0YWIzICYgIn0iICYgcmV0dXJuIGFmdGVyIGR6DWVuZCBp Zg1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQNcHV0IHRhYjIgJiAifSwiICYgcmV0dXJu IGFmdGVyIGR6DS0tIG5vdyBkbyBjb21wYXJpc29uDXB1dCB0YWIyICYgInsiICYgcmV0 dXJuIGFmdGVyIGR6DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gbXlDb21wYXJlTGlzdCBp bnRvIGNvbXBhcmVDb3VudA1yZXBlYXQgd2l0aCBjb21wYXJlSW5kZXggPSAxIHRvIGNv bXBhcmVDb3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiY29tcGFyaXNvbiIg JiYgaXRlbSAyIG9mIGxpbmUgY29tcGFyZUluZGV4IG9mIG15Q29tcGFyZUxpc3QpIHRo ZW4NaWYgbm90IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgdGhlbg1w dXQgdGFiM3F1b3RlICYgZmllbGQgImNvbXBhcmVOYW1lIiAmIHFjciBhZnRlciBkeg1w dXQgdGFiM3NxICYgUmVzVHlwZShmaWVsZCAiY29tcGFyZUlEIikgJiBzcWNyIGFmdGVy IGR6DWlmIGNvbXBhcmVJbmRleCA8PiBjb21wYXJlQ291bnQgdGhlbg1wdXQgdGFiM3F1 b3RlICYgUmVtb3ZlQ1IoZmllbGQgImNvbXBhcmVDb21tZW50IikgJiBxY3IgYWZ0ZXIg ZHoNZWxzZQ1wdXQgdGFiM3F1b3RlICYgUmVtb3ZlQ1IoZmllbGQgImNvbXBhcmVDb21t ZW50IikgJiBxdW90ZSAmIHJldHVybiBhZnRlciBkeg1lbmQgaWYNZW5kIGlmDWVuZCBp Zg1lbmQgcmVwZWF0DXB1dCB0YWIyICYgIn0sIiAmIHJldHVybiBhZnRlciBkeg0tLSBk byBlbnVtZXJhdGlvbnMNcHV0IHRhYjIgJiAieyIgJiByZXR1cm4gYWZ0ZXIgZHoNcHV0 IG51bWJlciBvZiBsaW5lcyBpbiBteUVudW1MaXN0IGludG8gZW51bUNvdW50DXJlcGVh dCB3aXRoIGVudW1JbmRleCA9IDEgdG8gZW51bUNvdW50DXNldCBjdXJzb3IgdG8gYnVz eQ1pZiBqdW1wKCJlbnVtZXJhdGlvbiIgJiYgbGluZSBlbnVtSW5kZXggb2YgbXlFbnVt TGlzdCkgdGhlbg1pZiBub3QgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVU IiB0aGVuDXB1dCB0YWIzc3EgJiBmaWVsZCAiZW51bWVyYXRpb24iICYgc3FjciBhZnRl ciBkeg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkICJlbnVtSW5mbyIgaW50byBl bnVtZXJhdG9yQ291bnQNcHV0IHRhYjMgJiAieyIgJiByZXR1cm4gYWZ0ZXIgZHoNcmVw ZWF0IHdpdGggZW51bWVyYXRvckluZGV4ID0gMSB0byBlbnVtZXJhdG9yQ291bnQNc2V0 IGN1cnNvciB0byBidXN5DXB1dCBsaW5lIGVudW1lcmF0b3JJbmRleCBvZiBmaWVsZCAi ZW51bUluZm8iIGludG8geA1wdXQgdGFiNHF1b3RlICYgaXRlbSAxIG9mIHggJiBxY3Ig YWZ0ZXIgZHoNcHV0IHRhYjRzcSAmIFJlc1R5cGUoaXRlbSAyIG9mIHgpICYgc3FjciBh ZnRlciBkeg1kZWxldGUgaXRlbSAxIHRvIDIgb2YgeA1pZiBlbnVtZXJhdG9ySW5kZXgg PD5lbnVtZXJhdG9yQ291bnQgdGhlbg1wdXQgdGFiNHF1b3RlICYgeCAmIHFjciBhZnRl ciBkeg1lbHNlDXB1dCB0YWI0cXVvdGUgJiB4ICYgcXVvdGUgJiByZXR1cm4gYWZ0ZXIg ZHoNZW5kIGlmDWVuZCByZXBlYXQNaWYgZW51bUluZGV4IDw+IGVudW1Db3VudCB0aGVu DXB1dCB0YWIzICYgIn0sIiAmIHJldHVybiBhZnRlciBkeg1lbHNlDXB1dCB0YWIzICYg In0iICYgcmV0dXJuIGFmdGVyIGR6DWVuZCBpZg1lbmQgaWYNZW5kIGlmDWVuZCByZXBl YXQNaWYgc3VpdGVJbmRleCA8PiBzdWl0ZUNvdW50IHRoZW4NcHV0IHRhYjIgJiAifSwi ICYgcmV0dXJuIGFmdGVyIGR6DWVsc2UNcHV0IHRhYjIgJiAifSIgJiByZXR1cm4gYWZ0 ZXIgZHoNZW5kIGlmDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IHN1aXRlDXB1dCB0YWIg JiAifSIgJiByZXR1cm4gYWZ0ZXIgZHoNcHV0ICJ9OyIgJiByZXR1cm4gYWZ0ZXIgZHoN cG9wIGNhcmQNcHV0IHRydWUgaW50byBpbkVkaXQNcmV0dXJuIGR6DWVuZCBkZXJleg0N ZnVuY3Rpb24gQml0RmllbGQgeCwgdHlwZQ1wdXQgIiIgaW50byByDXB1dCB0YWIgJiB0 YWIgJiB0YWIgaW50byB0YWJzDXB1dCAiLS0tLSIgaW50byBkYXNoDWlmICh0eXBlIDw+ IGRhc2gpIGFuZCAodHlwZSA8PiAicnBseSIpIHRoZW4NcHV0IHRhYiBiZWZvcmUgdGFi cw1lbmQgaWYNcmVwZWF0IHdpdGggaSA9IDEgdG8gMTYNc2V0IGN1cnNvciB0byBidXN5 DWlmIHggbW9kIDIgPSAxIHRoZW4NcHV0ICJ0cnVlIiBpbnRvIGZsYWcNZWxzZQ1wdXQg InJlc2VydmVkIiBpbnRvIGZsYWcNZW5kIGlmDWlmIChpID0gMTYpIGFuZCAodHlwZSA8 PiAicHJvcCIpIHRoZW4NaWYgZmxhZyA9IHRydWUgdGhlbg1wdXQgIm9wdGlvbmFsIiBp bnRvIGZsYWcNZWxzZQ1wdXQgInJlcXVpcmVkIiBpbnRvIGZsYWcNZW5kIGlmDWlmIHR5 cGUgPSBkYXNoIHRoZW4NcHV0ICJkaXJlY3RQYXJhbSIgYmVmb3JlIGZsYWcNZWxzZSBp ZiB0eXBlID0gInJwbHkiIHRoZW4NcHV0IHJlcGx5IGJlZm9yZSBmbGFnDWVuZCBpZg1l bHNlIGlmIGkgPSAxNSB0aGVuDWlmIGZsYWcgPSB0cnVlIHRoZW4NcHV0ICJsaXN0T2ZJ dGVtcyIgaW50byBmbGFnDWVsc2UNcHV0ICJzaW5nbGVJdGVtIiBpbnRvIGZsYWcNZW5k IGlmDWVsc2UgaWYgaSA9IDE0IHRoZW4NaWYgZmxhZyA9IHRydWUgdGhlbg1wdXQgImVu dW1lcmF0ZWQiIGludG8gZmxhZw1lbHNlDXB1dCAibm90RW51bWVyYXRlZCIgaW50byBm bGFnDWVuZCBpZg1lbHNlIGlmIChpID0gMTMpIHRoZW4NaWYgdHlwZSA9IGRhc2ggdGhl bg1pZiBmbGFnID0gdHJ1ZSB0aGVuDXB1dCAiY2hhbmdlc1N0YXRlIiBpbnRvIGZsYWcN ZWxzZQ1wdXQgImRvZXNudENoYW5nZVN0YXRlIiBpbnRvIGZsYWcNZW5kIGlmDWVsc2Ug aWYgdHlwZSA9ICJwcm9wIiB0aGVuDWlmIGZsYWcgPSB0cnVlIHRoZW4NcHV0ICJyZWFk V3JpdGUiIGludG8gZmxhZw1lbHNlDXB1dCAicmVhZE9ubHkiIGludG8gZmxhZw1lbmQg aWYNZW5kIGlmDWVuZCBpZg1wdXQgdGFicyAmIGZsYWcgJiAiLCIgJiByZXR1cm4gYmVm b3JlIHINcHV0IHggZGl2IDIgaW50byB4DWVuZCByZXBlYXQNcmV0dXJuIHINZW5kIEJp dEZpZWxkDQ1mdW5jdGlvbiBSZW1vdmVDciB4DWlmICJcIiBpcyBpbiB4IHRoZW4NcHV0 ICIiIGludG8geQ1yZXBlYXQgdW50aWwgeCA9ICIiDXB1dCBPZmZzZXQoIlwiLCB4KSBp bnRvIG4NaWYgbiA+IDAgdGhlbg1wdXQgY2hhciAxIHRvIG4tMSBvZiB4ICYgIlxcIiBh ZnRlciB5DWRlbGV0ZSBjaGFyIDEgdG8gbiBvZiB4DWVsc2UNcHV0IHggYWZ0ZXIgeQ1w dXQgIiIgaW50byB4DWVuZCBpZg1lbmQgcmVwZWF0DXB1dCB5IGludG8geA1lbmQgaWYN cHV0IDEgaW50byBuDXJlcGVhdCB1bnRpbCBuID0gMA1wdXQgT2Zmc2V0KHJldHVybiwg eCkgaW50byBuDWlmIG4gPiAwIHRoZW4gcHV0ICJcciIgaW50byBjaGFyIG4gb2YgeA1l bmQgcmVwZWF0DXB1dCAxIGludG8gbg1yZXBlYXQgdW50aWwgbiA9IDANcHV0IE9mZnNl dChUYWIsIHgpIGludG8gbg1pZiBuID4gMCB0aGVuIHB1dCAiXHQiIGludG8gY2hhciBu IG9mIHgNZW5kIHJlcGVhdA1pZiBxdW90ZSBpcyBpbiB4IHRoZW4NcHV0ICIiIGludG8g eQ1yZXBlYXQgdW50aWwgeCA9ICIiDXB1dCBPZmZzZXQocXVvdGUsIHgpIGludG8gbg1p ZiBuID4gMCB0aGVuDXB1dCBjaGFyIDEgdG8gbi0xIG9mIHggJiAiXCIgJiBxdW90ZSBh ZnRlciB5DWRlbGV0ZSBjaGFyIDEgdG8gbiBvZiB4DWVsc2UNcHV0IHggYWZ0ZXIgeQ1w dXQgIiIgaW50byB4DWVuZCBpZg1lbmQgcmVwZWF0DXB1dCB5IGludG8geA1lbmQgaWYN aWYgIiciIGlzIGluIHggdGhlbg1wdXQgIiIgaW50byB5DXJlcGVhdCB1bnRpbCB4ID0g IiINcHV0IE9mZnNldCgiJyIsIHgpIGludG8gbg1pZiBuID4gMCB0aGVuDXB1dCBjaGFy IDEgdG8gbi0xIG9mIHggJiAiXCciIGFmdGVyIHkNZGVsZXRlIGNoYXIgMSB0byBuIG9m IHgNZWxzZQ1wdXQgeCBhZnRlciB5DXB1dCAiIiBpbnRvIHgNZW5kIGlmDWVuZCByZXBl YXQNcHV0IHkgaW50byB4DWVuZCBpZg1yZXR1cm4geA1lbmQgUmVtb3ZlQ3IAHNIAIAEA AIYAEACcAGegBAAAAAAAAQAAAAwAAAAQSW1wb3J0IGFldGUAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIHJlYWQgYW4gYWV0ZSByZXNvdXJjZSBm cm9tIGFuIGZpbGUuIiDCDSYmICJIb2xkIGRvd24gb3B0aW9uIGtleSB0byBtZXJnZSB3 aXRoIHRoZSBidWlsdC1pbiBhZXV0IHJlc291cmNlLiIgwg0mJiAiSWYgc3RhY2sgaXMg bm90IGVtcHR5LCB0aGUgZGF0YSB3aWxsIGJlIG1lcmdlZC4iDWVuZCBNb3VzZVdpdGhp bg0Nb24gbW91c2VVcA1nbG9iYWwgaW5FZGl0DWlmIHRoZSBvcHRpb25LZXkgaXMgZG93 biB0aGVuDXB1dCBNZXJnZUFldGUoKSBpbnRvIGFldGUNZWxzZQ1wdXQgTWVyZ2VBZXRl KGZhbHNlKSBpbnRvIGFldGUNZW5kIGlmDWlmIGFldGUgPSAiIiB0aGVuDWFuc3dlciAi VW5hYmxlIHRvIHJlYWQgdGhlIGFldGUiIHdpdGggIkNhbmNlbCINZXhpdCBtb3VzZVVw DWVuZCBpZg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGFldGUgaW50byBuDXB1dCBsaW5l IDUgb2YgYWV0ZSBpbnRvIHZlcnNpb24NaWYgKHZlcnNpb24gPCAxNDQpIG9yICh2ZXJz aW9uID49IDUxMikgdGhlbg1leGl0IG1vdXNlVXANZW5kIGlmDXB1c2ggY2FyZA1wdXQg bGluZSAxIG9mIGFldGUgaW50byBjYXJkIGZpZWxkICJzZW5kVGFyZ2V0IiBvZiBjYXJk ICJwcmVmZXJlbmNlIg1wdXQgbGluZSAyIG9mIGFldGUgaW50byBjYXJkIGZpZWxkICJy ZXNvdXJjZVR5cGUiIG9mIGNhcmQgInByZWZlcmVuY2UiDXB1dCBsaW5lIDMgb2YgYWV0 ZSBpbnRvIGNhcmQgZmllbGQgInJlc291cmNlSUQiIG9mIGNhcmQgInByZWZlcmVuY2Ui DXB1dCBsaW5lIDQgb2YgYWV0ZSBpbnRvIGNhcmQgZmllbGQgInJlc291cmNlTmFtZSIg b2YgY2FyZCAicHJlZmVyZW5jZSINcHV0IHZlcnNpb24gZGl2IDI1NiBpbnRvIHgNcHV0 ICh4IGRpdiAxNikgKiAxMCArICh4IG1vZCAxNikgaW50byBjYXJkIGZpZWxkICJtYWpv clZlcnNpb24iIG9mIGNhcmQgInByZWZlcmVuY2UiDXB1dCB2ZXJzaW9uIG1vZCAyNTYg aW50byB4DXB1dCAoeCBkaXYgMTYpICogMTAgKyAoeCBtb2QgMTYpIGludG8gY2FyZCBm aWVsZCAibWlub3JWZXJzaW9uIiBvZiBjYXJkICJwcmVmZXJlbmNlIg1wdXQgbGluZSA2 IG9mIGFldGUgaW50byBjYXJkIGZpZWxkICJsYW5ndWFnZUNvZGUiIG9mIGNhcmQgInBy ZWZlcmVuY2UiDXB1dCBsaW5lIDcgb2YgYWV0ZSBpbnRvIGNhcmQgZmllbGQgInNjcmlw dENvZGUiIG9mIGNhcmQgInByZWZlcmVuY2UiDXB1dCBmYWxzZSBpbnRvIGluRWRpdA1w dXQgbGluZSA4IG9mIGFldGUgaW50byBzdWl0ZUNvdW50DWRlbGV0ZSBsaW5lIDEgdG8g OCBvZiBhZXRlDXJlcGVhdCBzdWl0ZUNvdW50IHRpbWVzDWdvIHRvIHRoaXMgY2QNc2V0 IGxvY2tTY3JlZW4gdG8gdHJ1ZQ1zZXQgbG9ja1JlY2VudCB0byB0cnVlDXNldCBjdXJz b3IgdG8gYnVzeQ1wdXQgbGluZSAzIG9mIGFldGUgaW50byBzdWl0ZUNvZGUNaWYgbm90 IGp1bXAoInN1aXRlIiAmJiBzdWl0ZUNvZGUpIHRoZW4NZ28gbGFzdCBjYXJkIGluIEJr Z25kICJzdWl0ZUluZm8iDWRvTWVudSAiTmV3IENhcmQiDXNldCBuYW1lIG9mIHRoaXMg Y2FyZCB0byAic3VpdGUiICYmIHN1aXRlQ29kZQ1lbmQgaWYNcHV0IGxpbmUgMSBvZiBh ZXRlIGludG8gZmllbGQgInN1aXRlTmFtZSINcHV0IGxpbmUgMiBvZiBhZXRlIGludG8g ZmllbGQgInN1aXRlQ29tbWVudCINcHV0IHN1aXRlQ29kZSBpbnRvIGZpZWxkICJzdWl0 ZUNvZGUiDXB1dCBsaW5lIDYgb2YgYWV0ZSBpbnRvIGV2ZW50Q291bnQNZGVsZXRlIGxp bmUgMSB0byA2IG9mIGFldGUNcHVzaCBjYXJkDXJlcGVhdCBldmVudENvdW50IHRpbWVz DXNldCBjdXJzb3IgdG8gYnVzeQ1wdXQgbGluZSAxIG9mIGFldGUgaW50byBldmVudE5h bWUNaWYgY2hhciAxIHRvIDIgb2YgZXZlbnROYW1lID0gIiMqIiB0aGVuIC0tIGZyb20g QUVVVA1kZWxldGUgY2hhciAxIHRvIDIgb2YgZXZlbnROYW1lDXB1dCB0cnVlIGludG8g ZnJvbUFldXQNZWxzZQ1pZiBjaGFyIDEgdG8gMiBvZiBldmVudE5hbWUgPSAiIyYiIHRo ZW4gLS0gZnJvbSBib3RoLCB0cmVhdCBhcyBuZXcNZGVsZXRlIGNoYXIgMSB0byAyIG9m IGV2ZW50TmFtZQ1lbmQgaWYNcHV0IGZhbHNlIGludG8gZnJvbUFldXQNZW5kIGlmDXB1 dCBsaW5lIDIgb2YgYWV0ZSBpbnRvIGV2ZW50Q29tbWVudA1wdXQgbGluZSAzIG9mIGFl dGUgaW50byBldmVudENsYXNzDXB1dCBsaW5lIDQgb2YgYWV0ZSBpbnRvIGV2ZW50SUQN aWYgbm90IGp1bXAoImV2ZW50IiAmJiBSZXNUeXBlKGV2ZW50Q2xhc3MpICYgUmVzVHlw ZShldmVudElEKSkgdGhlbg1nbyBsYXN0IGNhcmQgaW4gQmtnbmQgImV2ZW50cyINZG9N ZW51ICJOZXcgQ2FyZCINcHV0IHN1aXRlQ29kZSBpbnRvIGZpZWxkICJzdWl0ZUNvZGUi DU5hbWVJdCBzdWl0ZUNvZGUgJiYgImV2ZW50IiAmJiBSZXNUeXBlKGV2ZW50Q2xhc3Mp ICYgUmVzVHlwZShldmVudElEKQ1lbmQgaWYNc2V0IGhpbGl0ZSBvZiBia2duZCBidXR0 b24gImZyb20gQUVVVCIgdG8gZnJvbUFldXQNcHV0IGV2ZW50TmFtZSBpbnRvIGZpZWxk ICJldmVudE5hbWUiDXB1dCBldmVudENvbW1lbnQgaW50byBmaWVsZCAiZXZlbnRDb21t ZW50Ig1wdXQgZXZlbnRDbGFzcyBpbnRvIGZpZWxkICJldmVudENsYXNzIg1wdXQgZXZl bnRJRCBpbnRvIGZpZWxkICJldmVudElEIg1wdXQgIiwsIiBpbnRvIHggLS0gcHV0IGlu IHRoZSByZXBseQ1wdXQgbGluZSA1IG9mIGFldGUgaW50byBpdGVtIDMgb2YgeA1wdXQg bGluZSA3IG9mIGFldGUgaW50byBpdGVtIDQgb2YgeA1wdXQgbGluZSA2IG9mIGFldGUg aW50byBpdGVtIDUgb2YgeA1wdXQgeCBpbnRvIGxpbmUgMSBvZiBmaWVsZCBpZCAxMA1w dXQgIiwsIiBpbnRvIHggLS0gcHV0IGluIHRoZSBkaXJlY3QgcGFyYW1ldGVycw1wdXQg bGluZSA4IG9mIGFldGUgaW50byBpdGVtIDMgb2YgeA1wdXQgbGluZSAxMCBvZiBhZXRl IGludG8gaXRlbSA0IG9mIHgNcHV0IGxpbmUgOSBvZiBhZXRlIGludG8gaXRlbSA1IG9m IHgNcHV0IHggaW50byBsaW5lIDIgb2YgZmllbGQgaWQgMTANcHV0IGxpbmUgMTEgb2Yg YWV0ZSBpbnRvIHBhcmFtQ291bnQNcHV0IDExIGludG8gbGFzdFByb2MNcmVwZWF0IHdp dGggcGFyYW1JbmRleCA9IDEgdG8gcGFyYW1Db3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kN cHV0ICIiIGludG8geA1wdXQgbGluZSAobGFzdFByb2MrMSkgb2YgYWV0ZSBpbnRvIGl0 ZW0gMSBvZiB4DXB1dCBsaW5lIChsYXN0UHJvYysyKSBvZiBhZXRlIGludG8gaXRlbSAy IG9mIHgNcHV0IGxpbmUgKGxhc3RQcm9jKzMpIG9mIGFldGUgaW50byBpdGVtIDMgb2Yg eA1wdXQgbGluZSAobGFzdFByb2MrNSkgb2YgYWV0ZSBpbnRvIGl0ZW0gNCBvZiB4DXB1 dCBsaW5lIChsYXN0UHJvYys0KSBvZiBhZXRlIGludG8gaXRlbSA1IG9mIHgNYWRkIDUg dG8gbGFzdFByb2MNcHV0IHggaW50byBsaW5lIChwYXJhbUluZGV4KzIpIG9mIGZpZWxk IGlkIDEwDWVuZCByZXBlYXQNZGVsZXRlIGxpbmUgMSB0byBsYXN0UHJvYyBvZiBhZXRl DWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGV2ZW50DXB1dCBsaW5lIDEgb2YgYWV0ZSBp bnRvIGNsYXNzQ291bnQNZGVsZXRlIGxpbmUgMSBvZiBhZXRlDXJlcGVhdCB3aXRoIGNs YXNzSW5kZXggPSAxIHRvIGNsYXNzQ291bnQNc2V0IGN1cnNvciB0byBidXN5DXB1dCBs aW5lIDEgb2YgYWV0ZSBpbnRvIGNsYXNzTmFtZQ1pZiBjaGFyIDEgdG8gMiBvZiBjbGFz c05hbWUgPSAiIyoiIHRoZW4gLS0gZnJvbSBBRVVUDWRlbGV0ZSBjaGFyIDEgdG8gMiBv ZiBjbGFzc05hbWUNcHV0IHRydWUgaW50byBmcm9tQWV1dA1lbHNlDWlmIGNoYXIgMSB0 byAyIG9mIGNsYXNzTmFtZSA9ICIjJiIgdGhlbiAtLSBmcm9tIGJvdGgsIHRyZWF0IGFz IG5ldw1kZWxldGUgY2hhciAxIHRvIDIgb2YgY2xhc3NOYW1lDWVuZCBpZg1wdXQgZmFs c2UgaW50byBmcm9tQWV1dA1lbmQgaWYNcHV0IGxpbmUgMiBvZiBhZXRlIGludG8gY2xh c3NJRA1pZiBub3QganVtcCgiY2xhc3MiICYmIGNsYXNzSUQpIHRoZW4NZ28gbGFzdCBj YXJkIGluIEJrZ25kICJjbGFzcyINZG9NZW51ICJOZXcgQ2FyZCINcHV0IHN1aXRlQ29k ZSBpbnRvIGZpZWxkICJzdWl0ZUNvZGUiDU5hbWVJdCBzdWl0ZUNvZGUgJiYgImNsYXNz IiAmJiBSZXNUeXBlKGNsYXNzSUQpDWVuZCBpZg1wdXQgY2xhc3NOYW1lIGludG8gZmll bGQgImNsYXNzTmFtZSINc2V0IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVV VCIgdG8gZnJvbUFldXQNcHV0IGNsYXNzSUQgaW50byBmaWVsZCAiY2xhc3NJRCINcHV0 IGxpbmUgMyBvZiBhZXRlIGludG8gZmllbGQgY2xhc3NDb21tZW50DXB1dCBsaW5lIDQg b2YgYWV0ZSBpbnRvIHByb3BDb3VudA1wdXQgNCBpbnRvIGxhc3RQcm9jDXJlcGVhdCB3 aXRoIHByb3BJbmRleCA9IDEgdG8gcHJvcENvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1w dXQgIiIgaW50byB4DXB1dCBsaW5lIChsYXN0UHJvYysxKSBvZiBhZXRlIGludG8gaXRl bSAxIG9mIHgNcHV0IGxpbmUgKGxhc3RQcm9jKzIpIG9mIGFldGUgaW50byBpdGVtIDIg b2YgeA1wdXQgbGluZSAobGFzdFByb2MrMykgb2YgYWV0ZSBpbnRvIGl0ZW0gMyBvZiB4 DXB1dCBsaW5lIChsYXN0UHJvYys1KSBvZiBhZXRlIGludG8gaXRlbSA0IG9mIHgNcHV0 IGxpbmUgKGxhc3RQcm9jKzQpIG9mIGFldGUgaW50byBpdGVtIDUgb2YgeA1hZGQgNSB0 byBsYXN0UHJvYw1wdXQgeCBpbnRvIGxpbmUgcHJvcEluZGV4IG9mIGZpZWxkIGlkIDEw DWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IHByb3Blcml0eQ1hZGQgMSB0byBsYXN0UHJv Yw1wdXQgbGluZSBsYXN0UHJvYyBvZiBhZXRlIGludG8gZWxlbUNvdW50DXJlcGVhdCB3 aXRoIGVsZW1JbmRleCA9IDEgdG8gZWxlbUNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1w dXQgbGluZSAobGFzdFByb2MrMSkgb2YgYWV0ZSBpbnRvIHgNcHV0IGxpbmUgKGxhc3RQ cm9jKzIpIG9mIGFldGUgaW50byBrZXlGb3JtQ291bnQNYWRkIDIgdG8gbGFzdFByb2MN cmVwZWF0IGtleUZvcm1Db3VudCB0aW1lcw1zZXQgY3Vyc29yIHRvIGJ1c3kNYWRkIDEg dG8gbGFzdFByb2MNcHV0ICIsIiAmIGxpbmUgbGFzdFByb2Mgb2YgYWV0ZSBhZnRlciB4 DWVuZCByZXBlYXQNcHV0IHggaW50byBsaW5lIGVsZW1JbmRleCBvZiBmaWVsZCAiZWxl bWVudHMiDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGVsZW1lbnQNZGVsZXRlIGxpbmUg MSB0byBsYXN0UHJvYyBvZiBhZXRlDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGNsYXNz DXB1dCBsaW5lIDEgb2YgYWV0ZSBpbnRvIGNvbXBhcmVDb3VudA1kZWxldGUgbGluZSAx IG9mIGFldGUNcmVwZWF0IGNvbXBhcmVDb3VudCB0aW1lcw1zZXQgY3Vyc29yIHRvIGJ1 c3kNcHV0IGxpbmUgMSBvZiBhZXRlIGludG8gY29tcGFyZU5hbWUNaWYgY2hhciAxIHRv IDIgb2YgY29tcGFyZU5hbWUgPSAiIyoiIHRoZW4gLS0gZnJvbSBBRVVUDWRlbGV0ZSBj aGFyIDEgdG8gMiBvZiBjb21wYXJlTmFtZQ1wdXQgdHJ1ZSBpbnRvIGZyb21BZXV0DWVs c2UNaWYgY2hhciAxIHRvIDIgb2YgY29tcGFyZU5hbWUgPSAiIyYiIHRoZW4gLS0gZnJv bSBib3RoLCB0cmVhdCBhcyBuZXcNZGVsZXRlIGNoYXIgMSB0byAyIG9mIGNvbXBhcmVO YW1lDWVuZCBpZg1wdXQgZmFsc2UgaW50byBmcm9tQWV1dA1lbmQgaWYNcHV0IGxpbmUg MiBvZiBhZXRlIGludG8gY29tcGFyZUlEDWlmIG5vdCBqdW1wKCJjb21wYXJpc29uIiAm JiBjb21wYXJlSUQpIHRoZW4NZ28gbGFzdCBjYXJkIGluIEJrZ25kICJjb21wYXJpc29u Ig1kb01lbnUgIk5ldyBDYXJkIg1wdXQgc3VpdGVDb2RlIGludG8gZmllbGQgInN1aXRl Q29kZSINTmFtZUl0IHN1aXRlQ29kZSAmJiAiY29tcGFyaXNvbiIgJiYgUmVzVHlwZShj b21wYXJlSUQpDWVuZCBpZg1wdXQgY29tcGFyZU5hbWUgaW50byBmaWVsZCAiY29tcGFy ZU5hbWUiDXNldCBoaWxpdGUgb2YgYmtnbmQgYnV0dG9uICJmcm9tIEFFVVQiIHRvIGZy b21BZXV0DXB1dCBjb21wYXJlSUQgaW50byBmaWVsZCAiY29tcGFyZUlEIg1wdXQgbGlu ZSAzIG9mIGFldGUgaW50byBmaWVsZCAiY29tcGFyZUNvbW1lbnQiDWRlbGV0ZSBsaW5l IDEgdG8gMyBvZiBhZXRlDWVuZCByZXBlYXQgLS0gZm9yIGV2ZXJ5IGNvbXBhcmlzb24N cHV0IGxpbmUgMSBvZiBhZXRlIGludG8gZW51bWVyYXRpb25Db3VudA1kZWxldGUgbGlu ZSAxIG9mIGFldGUNcmVwZWF0IGVudW1lcmF0aW9uQ291bnQgdGltZXMNc2V0IGN1cnNv ciB0byBidXN5DXB1dCBsaW5lIDEgb2YgYWV0ZSBpbnRvIGVudW1lcmF0aW9uDWlmIGNo YXIgMSB0byAyIG9mIGVudW1lcmF0aW9uID0gIiMqIiB0aGVuIC0tIGZyb20gQUVVVA1k ZWxldGUgY2hhciAxIHRvIDIgb2YgZW51bWVyYXRpb24NcHV0IHRydWUgaW50byBmcm9t QWV1dA1lbHNlDWlmIGNoYXIgMSB0byAyIG9mIGVudW1lcmF0aW9uID0gIiMmIiB0aGVu IC0tIGZyb20gYm90aCwgdHJlYXQgYXMgbmV3DWRlbGV0ZSBjaGFyIDEgdG8gMiBvZiBl bnVtZXJhdGlvbg1lbmQgaWYNcHV0IGZhbHNlIGludG8gZnJvbUFldXQNZW5kIGlmDWlm IG5vdCBqdW1wKCJlbnVtZXJhdGlvbiIgJiYgZW51bWVyYXRpb24pIHRoZW4NZ28gbGFz dCBjYXJkIGluIEJrZ25kICJlbnVtZXJhdGlvbiINZG9NZW51ICJOZXcgQ2FyZCINcHV0 IHN1aXRlQ29kZSBpbnRvIGZpZWxkICJzdWl0ZUNvZGUiDU5hbWVJdCBzdWl0ZUNvZGUg JiYgImVudW1lcmF0aW9uIiAmJiBSZXNUeXBlKGVudW1lcmF0aW9uKQ1lbmQgaWYNc2V0 IGhpbGl0ZSBvZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgdG8gZnJvbUFldXQNcHV0 IGVudW1lcmF0aW9uIGludG8gZmllbGQgImVudW1lcmF0aW9uIg1wdXQgbGluZSAyIG9m IGFldGUgaW50byBlbnVtZXJhdG9yQ291bnQNcHV0IDIgaW50byBsYXN0UHJvYw1yZXBl YXQgd2l0aCBlbnVtZXJhdG9ySW5kZXggPSAxIHRvIGVudW1lcmF0b3JDb3VudA1zZXQg Y3Vyc29yIHRvIGJ1c3kNcHV0ICIiIGludG8geA1wdXQgbGluZSAobGFzdFByb2MrMSkg b2YgYWV0ZSBpbnRvIHgNcHV0IGxpbmUgKGxhc3RQcm9jKzIpIG9mIGFldGUgaW50byBp dGVtIDIgb2YgeA1wdXQgbGluZSAobGFzdFByb2MrMykgb2YgYWV0ZSBpbnRvIGl0ZW0g MyBvZiB4DWFkZCAzIHRvIGxhc3RQcm9jDXB1dCB4IGludG8gbGluZSBlbnVtZXJhdG9y SW5kZXggb2YgZmllbGQgImVudW1JbmZvIg1lbmQgcmVwZWF0IC0tIGZvciBldmVyeSBl bnVtZXJhdG9ycw1kZWxldGUgbGluZSAxIHRvIGxhc3RQcm9jIG9mIGFldGUNZW5kIHJl cGVhdA1lbmQgcmVwZWF0DXB1dCB0cnVlIGludG8gaW5FZGl0DUNvbnN0cnVjdExpbmsN aWYgdGhlIGZyZWVzaXplIG9mIHRoaXMgc3RhY2sgPiAzMjc2OCB0aGVuIGRvTWVudSAi Q29tcGFjdCBTdGFjayINZW5kIG1vdXNlVXAAACQgACEBAABmABAAfABnoAQAAAAAAAEA AAAMAAAAEE91dHB1dCBhZXRlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xp Y2sgaGVyZSB3cml0ZSBhbiBhZXRlIHJlc291cmNlIG91dCB0byBhIGZpbGUuIg1lbmQg TW91c2VXaXRoaW4NDW9uIG1vdXNlVXANLS1pZiB0aGUgb3B0aW9uS2V5IGlzIGRvd24g dGhlbg0tLSBwdXQgdHJ1ZSBpbnRvIHVzZUFFDS0tZWxzZQ0tLSAgcHV0IGZhbHNlIGlu dG8gdXNlQUUNLS1lbmQgaWYNc2V0IGN1cnNvciB0byB3YXRjaA1wdXQgTWFrZUFldGUo KSBpbnRvIGFldGVSZXNvdXJjZQ1zZXQgbG9ja1NjcmVlbiB0byB0cnVlDXNldCBsb2Nr UmVjZW50IHRvIHRydWUNc2V0IGN1cnNvciB0byBhcnJvdw1pZiBhZXRlUmVzb3VyY2Ug PD4gMCB0aGVuDS0taWYgdXNlQUUgdGhlbg0tLSBzZW5kIGl0IG91dCBhcyAnTUlTQycg J1dSU0MnDS0tYW5zd2VyIHByb2dyYW0gIndyaXRlIHRvIHdoaWNoIHByb2dyYW0iDS0t aWYgaXQgPD4gIiIgdGhlbg0tLVNlbmRBRSAiTUlTQyxXUlNDLCIgJiBpdCAmICIsMSwx MjAwLC0tLS0sKioqKixSU0lELHNob3IiLCK+YWV0Zb4iICYgYWV0ZVJlc291cmNlLDAN LS1wdXQgMCBpbnRvIGFldGVSZXNvdXJjZSAtLSB3ZSBzYXZlIGl0IGFscmVhZHkNLS1l bmQgaWYNLS1lbHNlDS0tIHdyaXRlIGl0IG91dA1hbnN3ZXIgZmlsZSAiU2F2ZSB0aGUg J2FldGUnIHJlc291cmNlIHRvIGZpbGU6Ig1pZiBpdCA8PiAiIiB0aGVuDVNhdmVEZXNj QXNSZXNvdXJjZSBhZXRlUmVzb3VyY2UsIGl0LCAwDWlmIHRoZSByZXN1bHQgPD4gIiIg dGhlbg1hbnN3ZXIgIlRoZSBvcGVyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgIiAmIHRo ZSByZXN1bHQNZW5kIGlmDXB1dCAwIGludG8gYWV0ZVJlc291cmNlIC0tIHdlIHNhdmUg aXQgYWxyZWFkeQ1lbmQgaWYNLS1lbmQgaWYNZW5kIGlmDWlmIGFldGVSZXNvdXJjZSA8 PiAwIHRoZW4NTW92ZURlc2NUb1NjcmFwIGFldGVSZXNvdXJjZQ1lbmQgaWYNZW5kIG1v dXNlVXANDWZ1bmN0aW9uIE1ha2VBZXRlDWdsb2JhbCBpbkVkaXQNcHV0IGNhcmQgZmll bGQgIm1ham9yVmVyc2lvbiIgb2YgY2FyZCAicHJlZmVyZW5jZSIgaW50byB4DXB1dCBj YXJkIGZpZWxkICJtaW5vclZlcnNpb24iIG9mIGNhcmQgInByZWZlcmVuY2UiIGludG8g eQ1pZiBsZW5ndGgoeSkgPSAxIHRoZW4gbXVsdGlwbHkgeSBieSAxMA1wdXQgKHggZGl2 IDEwKSAqIDQwOTYgKyAoeCBtb2QgMTApICogMjU2ICsgKHkgZGl2IDEwKSAqIDE2ICsg KHkgbW9kIDEwKSBpbnRvIHZlcnNpb24NcHV0IGZhbHNlIGludG8gaW5FZGl0DXB1c2gg Y2FyZA1nbyB0byBmaXJzdCBjYXJkIG9mIGJrZ25kIGV2ZW50cw1wdXQgIr4iICYgUmVz VHlwZShjYXJkIGZpZWxkICJyZXNvdXJjZVR5cGUiIG9mIGNhcmQgInByZWZlcmVuY2Ui KSAmICK+IiAmIE5ld0hhbmRsZSgpIGludG8gaGFuZA1wdXQgMCBpbnRvIGVyckNvdW50 DXB1dCBudW1iZXIgb2YgY2FyZHMgaW4gYmtnbmQgInN1aXRlSW5mbyIgaW50byBzdWl0 ZUNvdW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInNob3IiLCB2ZXJzaW9uKSA8PiAwIHRo ZW4gYWRkIDEgdG8gZXJyQ291bnQNaWYgRXh0ZW5kRGVzYyhoYW5kLCAic2hvciIsIGNh cmQgZmllbGQgImxhbmd1YWdlQ29kZSIgb2YgY2FyZCAicHJlZmVyZW5jZSIpIDw+IDAg dGhlbiBhZGQgMSB0byBlcnJDb3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwg Y2FyZCBmaWVsZCAic2NyaXB0Q29kZSIgb2YgY2FyZCAicHJlZmVyZW5jZSIpIDw+IDAg dGhlbiBhZGQgMSB0byBlcnJDb3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwg c3VpdGVDb3VudC0xKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQNcmVwZWF0IHdp dGggc3VpdGVJbmRleCA9IDIgdG8gc3VpdGVDb3VudA1zZXQgY3Vyc29yIHRvIGJ1c3kN Z28gY2FyZCBzdWl0ZUluZGV4IG9mIGJrZ25kICJzdWl0ZUluZm8iDXB1dCBmaWVsZCAi c3VpdGVDb2RlIiBpbnRvIG15U3VpdGVDb2RlDWlmIEV4dGVuZERlc2MoaGFuZCwgInMy NTUiLCBmaWVsZCAic3VpdGVOYW1lIikgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50 DWlmIEV4dGVuZERlc2MoaGFuZCwgInMyNTUiLCBmaWVsZCAiU3VpdGVDb21tZW50Iiwg dHJ1ZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50DWlmIEV4dGVuZERlc2MoaGFu ZCwgInRuYW0iLCBteVN1aXRlQ29kZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50 DWlmIEV4dGVuZERlc2MoaGFuZCwgInNob3IiLCAxKSA8PiAwIHRoZW4gYWRkIDEgdG8g ZXJyQ291bnQgLS0gc3VpdGUgbGV2ZWwNaWYgRXh0ZW5kRGVzYyhoYW5kLCAic2hvciIs IDEpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBzdWl0ZSB2ZXJzaW9uDXB1 dCBmaWVsZCBFdmVudExpc3QgaW50byBteUV2ZW50TGlzdA1wdXQgZmllbGQgQ2xhc3NM aXN0IGludG8gbXlDbGFzc0xpc3QNcHV0IGZpZWxkIENvbXBhcmVMaXN0IGludG8gbXlD b21wYXJlTGlzdA1wdXQgZmllbGQgRW51bUxpc3QgaW50byBteUVudW1MaXN0DS0tIG5v dyBkbyBpdCBmb3IgZWFjaCBldmVudCBpbiB0aGUgbGlzdA1wdXQgbnVtYmVyIG9mIGxp bmVzIGluIG15RXZlbnRMaXN0IGludG8gZXZlbnRDb3VudA0tLSBjaGVjayBhY3R1YWwg ZXZlbnQgY291bnQNcHV0IDAgaW50byBhY3R1YWxDb3VudA1yZXBlYXQgd2l0aCBldmVu dEluZGV4ID0gMSB0byBldmVudGNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBqdW1w KCJldmVudCIgJiYgaXRlbSAyIG9mIGxpbmUgZXZlbnRJbmRleCBvZiBteUV2ZW50TGlz dCkgdGhlbg1pZiBub3QgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0 aGVuDWFkZCAxIHRvIGFjdHVhbENvdW50DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVhdA1p ZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgYWN0dWFsQ291bnQpIDw+IDAgdGhlbiBh ZGQgMSB0byBlcnJDb3VudA1yZXBlYXQgd2l0aCBldmVudEluZGV4ID0gMSB0byBldmVu dGNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBqdW1wKCJldmVudCIgJiYgaXRlbSAy IG9mIGxpbmUgZXZlbnRJbmRleCBvZiBteUV2ZW50TGlzdCkgdGhlbg1pZiBub3QgaGls aXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0aGVuDWlmIEV4dGVuZERlc2Mo aGFuZCwgInMyNTUiLCBmaWVsZCAiZXZlbnROYW1lIikgPD4gMCB0aGVuIGFkZCAxIHRv IGVyckNvdW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInMyNTUiLCBmaWVsZCAiZXZlbnRD b21tZW50IiwgdHJ1ZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50DWlmIEV4dGVu ZERlc2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGZpZWxkICJldmVudENsYXNzIikpIDw+ IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFt IiwgUmVzVHlwZShmaWVsZCAiZXZlbnRJRCIpKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJy Q291bnQNcHV0IGxpbmUgMSBvZiBmaWVsZCBwYXJhbUluZm8gaW50byB4IC0tIHJlcGx5 DWlmIEV4dGVuZERlc2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGl0ZW0gMyBvZiB4KSkg PD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50DXB1dCBpdGVtIDQgb2YgeCBpbnRvIHRl bXANZGVsZXRlIGl0ZW0gMSB0byA0IG9mIHgNaWYgRXh0ZW5kRGVzYyhoYW5kLCAiczI1 NSIsIHgsIHRydWUpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSByZXBseSBj b21tZW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInNob3IiLCB0ZW1wKSA8PiAwIHRoZW4g YWRkIDEgdG8gZXJyQ291bnQgLS0gcmVwbHkgYXR0cmlidXRlDXB1dCBsaW5lIDIgb2Yg ZmllbGQgcGFyYW1JbmZvIGludG8geCAtLSBkaXJlY3Qgb2JqZWN0DWlmIEV4dGVuZERl c2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGl0ZW0gMyBvZiB4KSkgPD4gMCB0aGVuIGFk ZCAxIHRvIGVyckNvdW50DXB1dCBpdGVtIDQgb2YgeCBpbnRvIHRlbXANZGVsZXRlIGl0 ZW0gMSB0byA0IG9mIHgNaWYgRXh0ZW5kRGVzYyhoYW5kLCAiczI1NSIsIHgsIHRydWUp IDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBkaXJlY3QgY29tbWVudA1pZiBF eHRlbmREZXNjKGhhbmQsICJzaG9yIiwgdGVtcCkgPD4gMCB0aGVuIGFkZCAxIHRvIGVy ckNvdW50IC0tIGRpcmVjdCBhdHRyaWJ1dGUNaWYgRXh0ZW5kRGVzYyhoYW5kLCAic2hv ciIsIChudW1iZXIgb2YgbGluZXMgaW4gZmllbGQgcGFyYW1JbmZvLTIpKSA8PiAwIHRo ZW4gYWRkIDEgdG8gZXJyQ291bnQgLS0gZXh0cmEgcGFyYW0gY291bnQNcmVwZWF0IHdp dGggaSA9IDMgdG8gbnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkIHBhcmFtSW5mbw1wdXQg bGluZSBpIG9mIGZpZWxkIHBhcmFtSW5mbyBpbnRvIHgNaWYgRXh0ZW5kRGVzYyhoYW5k LCAiczI1NSIsIGl0ZW0gMSBvZiB4LCB0cnVlKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJy Q291bnQgLS0gcGFyYW0gbmFtZQ1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFtIiwgaXRl bSAyIG9mIHgsIHRydWUpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBwYXJh bSBrZXkNaWYgRXh0ZW5kRGVzYyhoYW5kLCAidG5hbSIsIGl0ZW0gMyBvZiB4LCB0cnVl KSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQgLS0gcGFyYW0gdHlwZQ1wdXQgaXRl bSA0IG9mIHggaW50byB0ZW1wDWRlbGV0ZSBpdGVtIDEgdG8gNCBvZiB4DWlmIEV4dGVu ZERlc2MoaGFuZCwgInMyNTUiLCB4LCB0cnVlKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJy Q291bnQgLS0gcGFyYW0gY29tbWVudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwg dGVtcCkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50IC0tIHBhcmFtIGF0dHJpYnV0 ZQ1lbmQgcmVwZWF0DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVhdCAtLSBmb3IgZXZlcnkg ZXZlbnQgaW4gc3VpdGUNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBteUNsYXNzTGlzdCBp bnRvIGNsYXNzQ291bnQNcHV0IDAgaW50byBhY3R1YWxDb3VudA1yZXBlYXQgd2l0aCBj bGFzc0luZGV4ID0gMSB0byBjbGFzc0NvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBq dW1wKCJjbGFzcyIgJiYgaXRlbSAyIG9mIGxpbmUgY2xhc3NJbmRleCBvZiBteUNsYXNz TGlzdCkgdGhlbg1pZiBub3QgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVU IiB0aGVuDWFkZCAxIHRvIGFjdHVhbENvdW50DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVh dA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgYWN0dWFsQ291bnQpIDw+IDAgdGhl biBhZGQgMSB0byBlcnJDb3VudA1yZXBlYXQgd2l0aCBjbGFzc0luZGV4ID0gMSB0byBj bGFzc0NvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBqdW1wKCJjbGFzcyIgJiYgaXRl bSAyIG9mIGxpbmUgY2xhc3NJbmRleCBvZiBteUNsYXNzTGlzdCkgdGhlbg1pZiBub3Qg aGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0aGVuDWlmIEV4dGVuZERl c2MoaGFuZCwgInMyNTUiLCBmaWVsZCAiY2xhc3NOYW1lIiwgdHJ1ZSkgPD4gMCB0aGVu IGFkZCAxIHRvIGVyckNvdW50IC0tIGNsYXNzIG5hbWUNaWYgRXh0ZW5kRGVzYyhoYW5k LCAidG5hbSIsIFJlc1R5cGUoZmllbGQgImNsYXNzSUQiKSkgPD4gMCB0aGVuIGFkZCAx IHRvIGVyckNvdW50IC0tIGNsYXNzIElEDWlmIEV4dGVuZERlc2MoaGFuZCwgInMyNTUi LCBmaWVsZCAiY2xhc3NDb21tZW50IiwgdHJ1ZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVy ckNvdW50IC0tIGNsYXNzIGNvbW1lbnQNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBmaWVs ZCAicHJvcEluZm8iIGludG8gcHJvcENvdW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInNo b3IiLCBwcm9wQ291bnQpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudA1yZXBlYXQg d2l0aCBwcm9wSW5kZXggPSAxIHRvIHByb3BDb3VudA1wdXQgbGluZSBwcm9wSW5kZXgg b2YgZmllbGQgInByb3BJbmZvIiBpbnRvIHgNaWYgRXh0ZW5kRGVzYyhoYW5kLCAiczI1 NSIsIGl0ZW0gMSBvZiB4LCB0cnVlKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQg LS0gY2xhc3MgbmFtZQ1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFtIiwgUmVzVHlwZShp dGVtIDIgb2YgeCkpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBjbGFzcyBJ RA1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFtIiwgUmVzVHlwZShpdGVtIDMgb2YgeCkp IDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBjbGFzcyBJRA1wdXQgaXRlbSA0 IG9mIHggaW50byB0ZW1wDWRlbGV0ZSBpdGVtIDEgdG8gNCBvZiB4DWlmIEV4dGVuZERl c2MoaGFuZCwgInMyNTUiLCB4LCB0cnVlKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291 bnQgLS0gY2xhc3MgY29tbWVudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgdGVt cCkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50IC0tIGF0dHJpYnV0ZQ1lbmQgcmVw ZWF0DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gZmllbGQgImVsZW1lbnRzIiBpbnRvIGVs ZW1Db3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgZWxlbUNvdW50KSA8PiAw IHRoZW4gYWRkIDEgdG8gZXJyQ291bnQNcmVwZWF0IHdpdGggZWxlbUluZGV4ID0gMSB0 byBlbGVtQ291bnQNcHV0IGxpbmUgZWxlbUluZGV4IG9mIGZpZWxkICJlbGVtZW50cyIg aW50byB4DWlmIEV4dGVuZERlc2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGl0ZW0gMSBv ZiB4KSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVyckNvdW50IC0tIGVsZW1lbnQgY2xhc3MN cHV0IG51bWJlciBvZiBpdGVtcyBvZiB4IGludG8ga2V5Rm9ybUNvdW50DWlmIEV4dGVu ZERlc2MoaGFuZCwgInNob3IiLCBrZXlGb3JtQ291bnQtMSkgPD4gMCB0aGVuIGFkZCAx IHRvIGVyckNvdW50DXJlcGVhdCB3aXRoIGtleUZvcm1JbmRleCA9IDIgdG8ga2V5Rm9y bUNvdW50DWlmIEV4dGVuZERlc2MoaGFuZCwgInRuYW0iLCBSZXNUeXBlKGl0ZW0ga2V5 Rm9ybUluZGV4IG9mIHgpKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQgLS0ga2V5 IGZvcm0NZW5kIHJlcGVhdA1lbmQgcmVwZWF0DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVh dA0tLSBub3cgZG8gY29tcGFyaXNvbg1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIG15Q29t cGFyZUxpc3QgaW50byBjb21wYXJlQ291bnQNcHV0IDAgaW50byBhY3R1YWxDb3VudA1y ZXBlYXQgd2l0aCBjb21wYXJlSW5kZXggPSAxIHRvIGNvbXBhcmVDb3VudA1zZXQgY3Vy c29yIHRvIGJ1c3kNaWYganVtcCgiY29tcGFyaXNvbiIgJiYgaXRlbSAyIG9mIGxpbmUg Y29tcGFyZUluZGV4IG9mIG15Q29tcGFyZUxpc3QpIHRoZW4NaWYgbm90IGhpbGl0ZSBv ZiBia2duZCBidXR0b24gImZyb20gQUVVVCIgdGhlbg1hZGQgMSB0byBhY3R1YWxDb3Vu dA1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQNaWYgRXh0ZW5kRGVzYyhoYW5kLCAic2hv ciIsIGFjdHVhbENvdW50KSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQNcmVwZWF0 IHdpdGggY29tcGFyZUluZGV4ID0gMSB0byBjb21wYXJlQ291bnQNc2V0IGN1cnNvciB0 byBidXN5DWlmIGp1bXAoImNvbXBhcmlzb24iICYmIGl0ZW0gMiBvZiBsaW5lIGNvbXBh cmVJbmRleCBvZiBteUNvbXBhcmVMaXN0KSB0aGVuDWlmIG5vdCBoaWxpdGUgb2YgYmtn bmQgYnV0dG9uICJmcm9tIEFFVVQiIHRoZW4NaWYgRXh0ZW5kRGVzYyhoYW5kLCAiczI1 NSIsIGZpZWxkICJjb21wYXJlTmFtZSIsIHRydWUpIDw+IDAgdGhlbiBhZGQgMSB0byBl cnJDb3VudCAtLSBjb21wYXJlIG5hbWUNaWYgRXh0ZW5kRGVzYyhoYW5kLCAidG5hbSIs IFJlc1R5cGUoZmllbGQgImNvbXBhcmVJRCIpKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJy Q291bnQgLS0gZWxlbWVudCBjbGFzcw1pZiBFeHRlbmREZXNjKGhhbmQsICJzMjU1Iiwg ZmllbGQgImNvbXBhcmVDb21tZW50IiwgdHJ1ZSkgPD4gMCB0aGVuIGFkZCAxIHRvIGVy ckNvdW50IC0tIGNvbXBhcmUgY29tbWVudA1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQN LS0gZG8gZW51bWVyYXRpb25zDXB1dCBudW1iZXIgb2YgbGluZXMgaW4gbXlFbnVtTGlz dCBpbnRvIGVudW1Db3VudA1wdXQgMCBpbnRvIGFjdHVhbENvdW50DXJlcGVhdCB3aXRo IGVudW1JbmRleCA9IDEgdG8gZW51bUNvdW50DXNldCBjdXJzb3IgdG8gYnVzeQ1pZiBq dW1wKCJlbnVtZXJhdGlvbiIgJiYgbGluZSBlbnVtSW5kZXggb2YgbXlFbnVtTGlzdCkg dGhlbg1pZiBub3QgaGlsaXRlIG9mIGJrZ25kIGJ1dHRvbiAiZnJvbSBBRVVUIiB0aGVu DWFkZCAxIHRvIGFjdHVhbENvdW50DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVhdA1pZiBF eHRlbmREZXNjKGhhbmQsICJzaG9yIiwgYWN0dWFsQ291bnQpIDw+IDAgdGhlbiBhZGQg MSB0byBlcnJDb3VudA1yZXBlYXQgd2l0aCBlbnVtSW5kZXggPSAxIHRvIGVudW1Db3Vu dA1zZXQgY3Vyc29yIHRvIGJ1c3kNaWYganVtcCgiZW51bWVyYXRpb24iICYmIGxpbmUg ZW51bUluZGV4IG9mIG15RW51bUxpc3QpIHRoZW4NaWYgbm90IGhpbGl0ZSBvZiBia2du ZCBidXR0b24gImZyb20gQUVVVCIgdGhlbg1pZiBFeHRlbmREZXNjKGhhbmQsICJ0bmFt IiwgUmVzVHlwZShmaWVsZCAiZW51bWVyYXRpb24iKSkgPD4gMCB0aGVuIGFkZCAxIHRv IGVyckNvdW50DXB1dCBudW1iZXIgb2YgbGluZXMgaW4gZmllbGQgImVudW1JbmZvIiBp bnRvIGVudW1lcmF0b3JDb3VudA1pZiBFeHRlbmREZXNjKGhhbmQsICJzaG9yIiwgZW51 bWVyYXRvckNvdW50KSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQNcmVwZWF0IHdp dGggZW51bWVyYXRvckluZGV4ID0gMSB0byBlbnVtZXJhdG9yQ291bnQNcHV0IGxpbmUg ZW51bWVyYXRvckluZGV4IG9mIGZpZWxkICJlbnVtSW5mbyIgaW50byB4DWlmIEV4dGVu ZERlc2MoaGFuZCwgInMyNTUiLCBpdGVtIDEgb2YgeCwgdHJ1ZSkgPD4gMCB0aGVuIGFk ZCAxIHRvIGVyckNvdW50IC0tIG5hbWUNaWYgRXh0ZW5kRGVzYyhoYW5kLCAidG5hbSIs IFJlc1R5cGUoaXRlbSAyIG9mIHgpKSA8PiAwIHRoZW4gYWRkIDEgdG8gZXJyQ291bnQg LS0gaWQNZGVsZXRlIGl0ZW0gMSB0byAyIG9mIHgNaWYgRXh0ZW5kRGVzYyhoYW5kLCAi czI1NSIsIHgsIHRydWUpIDw+IDAgdGhlbiBhZGQgMSB0byBlcnJDb3VudCAtLSBjb21t ZW50DWVuZCByZXBlYXQNZW5kIGlmDWVuZCBpZg1lbmQgcmVwZWF0DWVuZCByZXBlYXQg LS0gZm9yIGV2ZXJ5IHN1aXRlDXBvcCBjYXJkDXB1dCB0cnVlIGludG8gaW5FZGl0DWlm IGVyckNvdW50IDw+IDAgdGhlbg1EaXNwb3NlRGVzYyhoYW5kKQ1wdXQgIr5udWxsvjAi IGludG8gaGFuZA1lbmQgaWYNcmV0dXJuIGhhbmQNZW5kIE1ha2VBZXRlDQ0AAg4AJQGA ATAAeQFEAMqgBAAAAAAAAQAAAAwAAAAQRGVsZXRlyQAAb24gbW91c2VVcA1nbG9iYWwg Z0RlbGV0ZVN1aXRlDWFuc3dlciAiQ2xpY2sgb24gYSBzdWl0ZSBpbiB0aGUgbGlzdCB0 byBkZWxldGUgaXQuIiB3aXRoICJPSyIgb3IgIkNhbmNlbCINaWYgaXQgaXMgIkNhbmNl bCIgdGhlbg1wdXQgZmFsc2UgaW50byBnRGVsZXRlU3VpdGUNcGFzcyBtb3VzZVVwDWVs c2UNcHV0IHRydWUgaW50byBnRGVsZXRlU3VpdGUNZW5kIGlmDXBhc3MgbW91c2VVcA0N DS0tIGdsb2JhbCBnV2hlcmVGcm9tDS0tIGxvY2sgc2NyZWVuDS0tIGdvIGxhc3QgY2Fy ZCBvZiBia2duZCAic3VpdGVJbmZvIg0tLSBEb01lbnUgIk5ldyBDYXJkIg0tLSBzZXQg dGhlIGhpbGl0ZSBvZiBiZyBidG4gImFldGUiIHRvIHRydWUNLS0gcHV0ICJhZXRlIiBp bnRvIGJnIGZsZCAiU3VpdGVDb2RlIg0tLSBwdXNoIGNkDS0tIHBvcCBjZCBpbnRvIGdX aGVyZUZyb20NLS0gdW5sb2NrIHNjcmVlbiB3aXRoIHZpc3VhbCB3aXBlIGxlZnQNZW5k IG1vdXNlVXANAAAiACgCBQAgAAAANQEKAAAAAAAAAAEAFQASCQAAGAAAAAABggApAQAB QQEaAVQBZKACAAAAAAABABUACgEAAA1Db3B5IEZpZWxkAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUg Y29kZSBzY3JhdGNocGFkIGZpZWxkIHRvIHRoZSBjbGlwYm9hcmQuIg1lbmQgTW91c2VX aXRoaW4NDW9uIG1vdXNlVXANY2xpY2sgYXQgbG9jIG9mIGNhcmQgZmllbGQgInNjcmF0 Y2giDXR5cGUgImEiIHdpdGggY29tbWFuZEtleSAtLSBzZWxlY3QgYWxsDWRvTWVudSAi Q29weSBUZXh0Ig1nZXQgcmVjdCBvZiBjYXJkIGZpZWxkICJzY3JhdGNoIg1wdXQgaXRl bSAxIG9mIGl0IGludG8geA1wdXQgKGl0ZW0gMiBvZiBpdCkgLSAyIGludG8geQ1jbGlj ayBhdCB4LCB5DWVuZCBtb3VzZVVwAADwACoBAAEzAAoBRwCNoAQAAAAAAAEAAAAMAAAA EFRyYW5zbGF0aW9uIFRhYmxlAABvbiBtb3VzZVVwDWxvY2FsaXphdGlvbiB0cnVlDWVu ZCBtb3VzZVVwDQ1vbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0 byBjcmVhdGUgYSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgbG9jYWxpemluZyB5b3VyICdh ZXRlJy4gSXQgd2lsbCBhcHBlYXIgaW4gdGhlIHNjcmF0Y2hwYWQuIg1lbmQgTW91c2VX aXRoaW4AAAAoACsCBQA8AM0ATAFiAAEAAAAAAAAAAwAMAQAAEHBhZE5hbWUAAAD/2AAb AFIgZSBzIG8gdSByIGMgZSAgVCBvIG8gbCBzAP/VAAsAU2NyYXRjaHBhZAD/6wALAHJl cWQNc21wbA0AbWFpbk1lbnUAZnVuY3Rpb24gVGNsQ2xpZW50U2FtcGxlIGNhcmRUeXBl DWlmIGNhcmRUeXBlID0gImV2ZW50IiB0aGVuDXB1dCBmaWVsZCAicGFyYW1JbmZvIiBp bnRvIHBhcmFtSW5mbw1wdXQgIkFFIiAmIFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIp IGludG8gRXZlbnROYW1lDXB1dCBpdGVtIDMgb2YgZmllbGQgInBhcmFtSW5mbyIgPD4g Im51bGwiIGludG8gcmV0dXJuVHlwZQ1wdXQgImFlcmVnaXN0ZXIiICYmIEV2ZW50TmFt ZSAmJiBmaWVsZCAiRXZlbnRDbGFzcyIgwg0mJiBmaWVsZCAiRXZlbnRJRCIgJiYgaXRl bSAzIG9mIHBhcmFtSW5mbyBpbnRvIHJzdA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHBh cmFtSW5mbyBpbnRvIGNvdW50DXB1dCAiIiBpbnRvIG9wdGlvbkxpc3QNcHV0ICIiIGlu dG8gcmVxdWlyZWRMaXN0DXJlcGVhdCB3aXRoIGluZGV4ID0gMiB0byBjb3VudA1wdXQg bGluZSBpbmRleCBvZiBwYXJhbUluZm8gaW50byB4DWlmIGluZGV4ID0gMiB0aGVuDXB1 dCBkaXJlY3RQYXJhbSBpbnRvIGl0ZW0gMSBvZiB4DXB1dCAiLS0tLSIgaW50byBpdGVt IDIgb2YgeA1lbmQgaWYNcHV0IGl0ZW0gNCBvZiB4IGludG8gdGVtcA1wdXQgKHRlbXAg PiAzMjc2NykgaW50byBpc09wdGlvbmFsDXB1dCB0ZW1wIGRpdiA4MTkyIGludG8gdGVt cA1pZiAodGVtcCBtb2QgMikgPSAxIHRoZW4NcHV0ICJlbnVtIiBpbnRvIGl0ZW0gMyBv ZiB4DWVuZCBpZg1pZiBpdGVtIDMgb2YgeCA8PiAibnVsbCIgdGhlbg1wdXQgc3BhY2Ug aW50byB0ZW1wDWlmIGl0ZW0gMyBvZiB4ID0gIlRFWFQiIHRoZW4NcHV0IHF1b3RlICYg aXRlbSAyIG9mIHggJiBxdW90ZSBhZnRlciB0ZW1wDWVsc2UNcHV0IHF1b3RlICYgUmVz VHlwZShpdGVtIDIgb2YgeCkgJiBSZXNUeXBlKGl0ZW0gMyBvZiB4KSAmIHF1b3RlIGFm dGVyIHRlbXANZW5kIGlmDWlmIHNwYWNlIGlzIGluIGl0ZW0gMSBvZiB4IHRoZW4NcHV0 IHNwYWNlICYgcXVvdGUgJiBpdGVtIDEgb2YgeCAmIHF1b3RlIGFmdGVyIHRlbXANZWxz ZQ1wdXQgc3BhY2UgJiBpdGVtIDEgb2YgeCBhZnRlciB0ZW1wDWVuZCBpZg1pZiBpc09w dGlvbmFsIHRoZW4NcHV0IHRlbXAgYWZ0ZXIgb3B0aW9uTGlzdA1lbHNlDXB1dCB0ZW1w IGFmdGVyIHJlcXVpcmVkTGlzdA1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQgLS0gMiB0 byBuDXB1dCByZXF1aXJlZExpc3QgYWZ0ZXIgcnN0DWlmIG9wdGlvbkxpc3QgPD4gIiIg dGhlbg1wdXQgIiBvcHRpb25hbGx5IiAmIG9wdGlvbkxpc3QgYWZ0ZXIgcnN0DWVuZCBp Zg1yZXR1cm4gcnN0ICYgcmV0dXJuICYgcmV0dXJuDWVsc2UNcmV0dXJuICIiDWVuZCBp Zg1lbmQgVGNsQ2xpZW50U2FtcGxlDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAGAQk1BUAAACsoAAAAAAAAAAAABAAAAAAAAAVYCAAAAAAABVgIAABsAAAEFARAA AAAAAAAAAAAAAEwAAADkv4K5go3iNSAAAuEI4hEBEyDhCuEaIBYBFQPhCOE4AgAg4gWu heEcIBYQEwXhCOEYAhMgJhAQEhThCL+Cv4K/gr+Cv4K/gr+Cv4KygowQgOIQAgKihYri EQEC4hEDAraGjhCA4hACAo0QQOIhgACogYlPDgAxgOEBTxkAAYDhAW8YMzPHhxgPbxwz MYzMmA9fDjMxjM7hXwczMY/H4W8DMzGMA4APbxMzMYxJmA9vDh8wx4cYD6+BjBABHUDh BYkgAYArAYDhBSABQCsDgOEFjCABoCsBwOEFiSABICsFgOEFIAEgKwaA4QW/hr+Gv4an hopCCqqqqsGqqqqqqqqgA+EGhokgASArBYDhBb+GvYaMIAGgKwHA4QWOEWgrBoDhBY0R gBsC4QaMEAEdQOEFZSBzZWxlY3Rpb24gdmlzaWIAAWmAQ0FSRAAALR0AAAAAAAALiwAA AAAAAAAAAAAAAAAAOvAAAA48AC8AOQABPiwAGQAAIBoApAATAgYANwCFAEoB+QACAAAA AAAAAAQADAAAABBzZW5kVGFyZ2V0AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAi VGhlIG5hbWUgb2YgdGhlIHRhcmdldCBhcHBsaWNhdGlvbiB0byBiZSB1c2VkIGluIFBB U0NBTCBjbGllbnQgc2FtcGxlIGNvZGUuIg1lbmQgTW91c2VXaXRoaW4NAACcAAwCBgBm ASQAeQFdAAIAAAAAAAAABAAMAAAAEHRpbWVPdXQAAG9uIE1vdXNlV2l0aGluDVNob3dC YWxsb29uICJFbnRlciB0aGUgdGltZW91dCB2YWx1ZSB0byBiZSB1c2VkIGluIFBBU0NB TCBjbGllbnQgc2FtcGxlIGNvZGUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0AAADCABgC BgB6ASQAjQH5AAIAAAAAAAAABAAMAAAAEHNlbmRNb2RlAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiRW50ZXIgdGhlIHNlbmQgbW9kZSAob3RoZXIgdGhhbiB3YWl0UmVw bHkvbm9SZXBseS9xdWV1ZVJlcGx5KSB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQg c2FtcGxlIGNvZGUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0AAKAAFwIGAI4BJAChAfkA AgAAAAAAAAAEAAwAAAAQaWRsZVByb2MAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29u ICJFbnRlciB0aGUgbmFtZSBvZiBpZGxlIHByb2MgdG8gYmUgdXNlZCBpbiBQQVNDQUwg Y2xpZW50IHNhbXBsZSBjb2RlIGhlcmUuIg1lbmQgTW91c2VXaXRoaW4NAACwABkCBgCi ASQAtQH5AAIAAAAAAAAAAwAMAAAAEGFlRmlsdGVyAABvbiBNb3VzZVdpdGhpbg1TaG93 QmFsbG9vbiAiRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IGZpbHRlciBmdW5jdGlv biB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQgc2FtcGxlIGNvZGUgaGVyZS4iDWVu ZCBNb3VzZVdpdGhpbg0AAKwAHAIGALYBJADJAfkAAgAAAAAAAAADAAwAAAAQdGFyZ2V0 RGVzYwAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVydCB0aGUgbmFtZSBv ZiB0YXJnZXQgZGVzY3JpcHRvciB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQgc2Ft cGxlIGNvZGUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0AAAAiAAECBQDfAJ8A8QEYAAAA AAAAAAAAFQAMBQAAEAAAAAA/BgACAQAA8gCfAQUA+sAGAAAAAAABAAAADAAAABBQYXNj YWwAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGluZGlj YXRlIHRoYXQgdGhlIHNlcnZlciBjb2RlIHRvIGhhbmRsZSBBcHBsZSBFdmVudHMgd2ls bCBiZSBpbiBQQVNDQUwuIg1lbmQgTW91c2VXaXRoaW4NDWZ1bmN0aW9uIFNlcnZlclNh bXBsZSBjYXJkVHlwZQ1pZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1wdXQgIkFFIiAm IFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNZ2xvYmFsIHZl cmJvc2UNaWYgdmVyYm9zZSB0aGVuDXB1dCBmaWVsZCAiZXZlbnRDb21tZW50IiBpbnRv IHRlbXANaWYgdGVtcCA8PiAiIiB0aGVuDXB1dCAieyAiICYgdGVtcCAmICIgfSIgJiBy ZXR1cm4gJiByZXR1cm4gaW50byBwcm9jSGVhZGVyDWVuZCBpZg1lbmQgaWYNcHV0IFBh c2NhbENsaWVudFRlbXBsYXRlKCkgJiByZXR1cm4gaW50byB0ZW1wDXB1dCAiRG8iIGFm dGVyIGNoYXIgOSBvZiB0ZW1wDXB1dCB0ZW1wIGFmdGVyIHByb2NIZWFkZXINcHV0IFRh YiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1wdXQgVGFiICYgInsg cHV0IHlvdXIgY29kZSBoZXJlIH0iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXINcHV0 IFRhYiAmICJEbyIgJiBwcm9jTmFtZSAmICIgOj0gTm9FcnI7IiAmIHJldHVybiBhZnRl ciBwcm9jSGVhZGVyDXB1dCBUYWIgJiAiRU5EOyIgJiByZXR1cm4gJiByZXR1cm4gYWZ0 ZXIgcHJvY0hlYWRlcg1wdXQgIkZ1bmN0aW9uIEhhbmRsZSIgJiBwcm9jTmFtZSDCDSYg Iih0aGVBcHBsZUV2ZW50LCB0aGVSZXBseTpBcHBsZUV2ZW50OyB0aGVSZWZDb246TE9O R0lOVCk6T1NFcnI7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCBHbHVlSW5m byhmaWVsZCAicGFyYW1JbmZvIikgaW50byBwYXJhbUluZm8NcHV0IG51bWJlciBvZiBs aW5lcyBvZiBwYXJhbUluZm8gaW50byBjb3VudA1wdXQgKGl0ZW0gMyBvZiBwYXJhbUlu Zm8gPD4gIm51bGwiKSBpbnRvIGlzRnVuYw1wdXQgVGFiICYgVGFiIGludG8gdHdvVGFi DXB1dCBUYWIgJiB0d29UYWIgaW50byB0aHJlZVRhYg1wdXQgIiIgaW50byB2YXJEZWNs YXJlDXB1dCBmYWxzZSBpbnRvIG5lZWRFcnINcHV0ICIiIGludG8gY2xlYW5VcENvZGUN cHV0ICIiIGludG8gcHV0UmVzdWx0Q29kZQ1wdXQgVGFiICYgIkZhaWxFcnIoRG8iICYg cHJvY05hbWUgJiAiKCIgaW50byBjYWxsWW91ckNvZGUNcHV0IFRhYiAmICJCRUdJTiIg JiByZXR1cm4gaW50byBpbml0Q29kZQ1wdXQgMCBpbnRvIHRvdGFsUGFyYW0NLS0gaWYg YSBmdW5jdGlvbiBnZXQgdGhlIHJlc3VsdCBiYWNrDWlmIGlzRnVuYyB0aGVuDWFkZCAx IHRvIHRvdGFsUGFyYW0NcHV0IGxpbmUgMSBvZiBwYXJhbUluZm8gaW50byB4DXB1dCBp dGVtIDQgb2YgeCBpbnRvIHBhcmFtVHlwZQ1wdXQgTmFtZU9mRGF0YVR5cGUoaXRlbSAz IG9mIHgpIGludG8gbmFtZUxpc3QNcHV0IFRhYiAmICJJRiB0aGVSZXBseS5kYXRhSGFu ZGxlIDw+IE5JTCBUSEVOIiAmIHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWlmIHBh cmFtVHlwZSA8PSAzIHRoZW4gLS0gcmVzdWx0IGlzIEFFRGVzYyBvciBIYW5kbGUNcHV0 ICJ0aGVSZXN1bHQ6IEFFRGVzYzsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 IFRhYiAmICJ0aGVSZXN1bHQuZGF0YUhhbmRsZSA6PSBOSUw7IiAmIHJldHVybiBhZnRl ciBpbml0Q29kZQ1pZiAocGFyYW1UeXBlID0gMCkgb3IgKHBhcmFtVHlwZSA9IDIpIHRo ZW4NcHV0ICJ0aGVSZXN1bHQsIiBhZnRlciBjYWxsWW91ckNvZGUNZWxzZQ1wdXQgVGFi ICYgInRoZVJlc3VsdC5kZXNjcmlwdG9yVHlwZSA6PSAiICYgaXRlbSA0IG9mIG5hbWVM aXN0IMINJiAiOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUNaWYgaXRlbSAzIG9mIG5h bWVMaXN0ID0gIkhhbmRsZSIgdGhlbg1wdXQgInRoZVJlc3VsdC5kYXRhSGFuZGxlLCIg YWZ0ZXIgY2FsbFlvdXJDb2RlDWVsc2UNcHV0IGl0ZW0gMyBvZiBuYW1lTGlzdCAmICIo dGhlUmVzdWx0LmRhdGFIYW5kbGUpLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBpZg1l bmQgaWYNcHV0IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKHRoZVJl c3VsdCkpOyIgJiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNcHV0IHR3b1RhYiAmICJG YWlsRXJyKEFFUHV0S2V5RGVzYyh0aGVSZXBseSwga2V5RGlyZWN0T2JqZWN0LCB0aGVS ZXN1bHQpKTsiICYgcmV0dXJuIGFmdGVyIHB1dFJlc3VsdENvZGUNZWxzZSBpZiAocGFy YW1UeXBlID0gNCkgb3IgKHBhcmFtVHlwZSA9IDYpIHRoZW4gLS0gcmVzdWx0IGlzIG9u IHN0YWNrDXB1dCAidGhlUmVzdWx0OiAiICYgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsi ICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0ICJ0aGVSZXN1bHQsIiBhZnRlciBj YWxsWW91ckNvZGUNcHV0IHR3b1RhYiAmICJGYWlsRXJyKEFFUHV0S2V5UHRyKHRoZVJl cGx5LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIs IEB0aGVSZXN1bHQiIGFmdGVyIHB1dFJlc3VsdENvZGUNaWYgcGFyYW1UeXBlID0gNCB0 aGVuDXB1dCAiLCBTaXplT2YoIiAmIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICIpKSk7IiAm IHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWVsc2UNcHV0ICJbMV0sIExlbmd0aCh0 aGVSZXN1bHQpKSk7IiAmIHJldHVybiBhZnRlciBwdXRSZXN1bHRDb2RlDWVuZCBpZg1l bmQgaWYNZW5kIGlmIC0tIGlzRnVuYw1yZXBlYXQgd2l0aCBwYXJhbUluZGV4ID0gMiB0 byBjb3VudA1wdXQgbGluZSBwYXJhbUluZGV4IG9mIHBhcmFtSW5mbyBpbnRvIHgNaWYg aXRlbSAzIG9mIHggPD4gIm51bGwiIHRoZW4NYWRkIDEgdG8gdG90YWxQYXJhbQ1wdXQg aXRlbSA0IG9mIHggaW50byBwYXJhbVR5cGUNcHV0IChpdGVtIDUgb2YgeCA9ICJvIikg aW50byBpc09wdGlvbmFsDXB1dCBOYW1lT2ZEYXRhVHlwZShpdGVtIDMgb2YgeCkgaW50 byBuYW1lTGlzdA1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IHR3b1RhYiBpbnRvIGluZGVu dA1lbHNlDXB1dCBUYWIgaW50byBpbmRlbnQNZW5kIGlmDWlmIHBhcmFtVHlwZSA9IDAg dGhlbiAtLSBBRURlc2MNcHV0IGl0ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNcHV0IHRo aXNOYW1lICYmICI6IEFFRGVzYzsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 IFRhYiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlIDo9IE5JTDsiICYgcmV0dXJuIGFm dGVyIGluaXRDb2RlDWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgaXRlbSA2IG9mIHggaW50 byBwdHJUaGlzTmFtZQ1wdXQgcHRyVGhpc05hbWUgJiYgIjogQUVEZXNjUHRyOyIgJiBy ZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgcHRyVGhpc05hbWUgJiAiLCIgYWZ0ZXIg Y2FsbFlvdXJDb2RlDXB1dCB0cnVlIGludG8gbmVlZEVycg1wdXQgVGFiICYgImVyciA6 PSBBRUdldEtleURlc2ModGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9mIHggwg0mICIs dHlwZVdpbGRDYXJkLCIgJiB0aGlzTmFtZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNcHV0IFBhc2NhbE9wdGlvbkhhbmRsaW5nKHRoaXNOYW1lLCBwdHJUaGlzTmFt ZSkgYWZ0ZXIgcHJvY0JvZHkNZWxzZQ1wdXQgdGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2Fs bFlvdXJDb2RlDXB1dCBUYWIgJiAiRmFpbEVycihBRUdldEtleURlc2ModGhlQXBwbGVF dmVudCwiICYgaXRlbSAyIG9mIHggwg0mICIsdHlwZVdpbGRDYXJkLCIgJiB0aGlzTmFt ZSAmICIpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgdHdvVGFi ICYgIklnbm9yZU9TRXJyKEFFRGlzcG9zZURlc2MoIiAmIHRoaXNOYW1lICYgIikpOyIg JiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNZWxzZSBpZiBwYXJhbVR5cGUgPSAxIHRo ZW4gLS0gaGFuZGxlDXB1dCAiZGVzY0ZvciIgJiBTdHJpcFNQKGl0ZW0gMSBvZiB4KSBp bnRvIHRoaXNOYW1lDXB1dCB0aGlzTmFtZSAmJiAiOiBBRURlc2M7IiAmIHJldHVybiBh ZnRlciB2YXJEZWNsYXJlDXB1dCBUYWIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSA6 PSBOSUw7IiAmIHJldHVybiBhZnRlciBpbml0Q29kZQ1pZiBpdGVtIDMgb2YgbmFtZUxp c3QgPSAiSGFuZGxlIiB0aGVuDXB1dCB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSwiIGFm dGVyIGNhbGxZb3VyQ29kZQ1lbHNlDXB1dCBpdGVtIDMgb2YgbmFtZUxpc3QgJiAiKCIg JiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSksIiBhZnRlciBjYWxsWW91ckNvZGUNZW5k IGlmDWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFRh YiAmICJlcnIgOj0gQUVHZXRLZXlEZXNjKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBv ZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCIgJiB0aGlzTmFtZSAm ICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJJRiBlcnIgPSBl cnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiDCDSYgdHdvVGFiICYgInsgb3Ig eW91IG1heSBwdXQgaW4geW91ciBkZWZhdWx0IGhlcmUgfSIgJiByZXR1cm4gwg0mIFRh YiAmICJFTFNFIEZhaWxFcnIoZXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVs c2UNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5RGVzYyh0aGVBcHBsZUV2ZW50LCIg JiBpdGVtIDIgb2YgeCDCDSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYgIiwiICYg dGhpc05hbWUgJiAiKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0 IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKCIgJiB0aGlzTmFtZSAm ICIpKTsiICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWVsc2UgaWYgKHBhcmFtVHlw ZSA9IDQpIG9yIChwYXJhbVR5cGUgPSA2KSB0aGVuDWlmIGl0ZW0gMyBvZiB4ID0gInRy dWUiIHRoZW4NcHV0IGl0ZW0gMSBvZiB4ICYmICI6IEJvb2xlYW47IiAmIHJldHVybiBh ZnRlciB2YXJEZWNsYXJlDXB1dCBpdGVtIDEgb2YgeCAmICIsIiBhZnRlciBjYWxsWW91 ckNvZGUNcHV0IHRydWUgaW50byBuZWVkRXJyDXB1dCBQYXNjYWxUeXBlVHJ1ZUNvZGUo eCkgYWZ0ZXIgcHJvY0JvZHkNZWxzZSBpZiBpc09wdGlvbmFsIHRoZW4NaWYgaXRlbSAz IG9mIHggPSAiZW51bSIgdGhlbg1wdXQgaXRlbSAxIG9mIHggJiYgIjogUmVzVHlwZTsi ICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IGl0ZW0gMSBvZiB4ICYgIiwiIGFm dGVyIGNhbGxZb3VyQ29kZQ1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IFBhc2NhbFR5 cGVUcnVlQ29kZSh4KSBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCBpdGVtIDYgb2YgeCBp bnRvIHB0clRoaXNOYW1lDXB1dCBpdGVtIDEgb2YgeCBpbnRvIHRoaXNOYW1lDXB1dCB0 aGlzTmFtZSAmJiAiOiAiICYgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJu IGFmdGVyIHZhckRlY2xhcmUNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1dCBwdHJUaGlz TmFtZSAmJiAiOiAiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFm dGVyIHZhckRlY2xhcmUNZWxzZQ1wdXQgcHRyVGhpc05hbWUgJiYgIjogU3RyaW5nUHRy OyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1lbmQgaWYNcHV0IHB0clRoaXNOYW1l ICYgIiwiIGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0 IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlQdHIodGhlQXBwbGVFdmVudCwiICYgaXRlbSAy IG9mIHggwg0mICIsIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsdHlwZUNvZGUsQCIg JiB0aGlzTmFtZSBhZnRlciBwcm9jQm9keQ1pZiBwYXJhbVR5cGUgPSA0IHRoZW4NcHV0 ICIsU2l6ZU9mKCIgJiB0aGlzTmFtZSAmICIpLGFjdHVhbFNpemUpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNZWxzZSAtLSBzdHIyNTUNcHV0ICJbMV0sU2l6ZU9mKCIgJiB0 aGlzTmFtZSAmICIpLTEsYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgVGFiICYgdGhpc05hbWUgJiAiWzBdIDo9IGNocihhY3R1YWxTaXplKTsiICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgUGFzY2FsT3B0aW9uSGFuZGxp bmcodGhpc05hbWUsIHB0clRoaXNOYW1lKSBhZnRlciBwcm9jQm9keQ1lbmQgaWYNZWxz ZSAtLSByZXF1aXJlZA1wdXQgaXRlbSAxIG9mIHggaW50byB0aGlzTmFtZQ1wdXQgdGhp c05hbWUgJiYgIjogIiAmIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICI7IiAmIHJldHVybiBh ZnRlciB2YXJEZWNsYXJlDXB1dCB0aGlzTmFtZSAmICIsIiBhZnRlciBjYWxsWW91ckNv ZGUNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5UHRyKHRoZUFwcGxlRXZlbnQsIiAm IGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLHR5cGVD b2RlLEAiICYgdGhpc05hbWUgYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNCB0 aGVuDXB1dCAiLFNpemVPZigiICYgdGhpc05hbWUgJiAiKSxhY3R1YWxTaXplKSk7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCAiWzFdLFNpemVPZigiICYgdGhp c05hbWUgJiAiKS0xLGFjdHVhbFNpemUpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5 DXB1dCBUYWIgJiB0aGlzTmFtZSAmICJbMF0gOj0gY2hyKGFjdHVhbFNpemUpOyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVuZCBpZg1lbHNlIGlmIChwYXJhbVR5 cGUgPSA1KSBvciAocGFyYW1UeXBlID0gNykgdGhlbg1wdXQgImRlc2NGb3IiICYgU3Ry aXBTUChpdGVtIDEgb2YgeCkgaW50byB0aGlzTmFtZQ1wdXQgdGhpc05hbWUgJiYgIjog QUVEZXNjOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgVGFiICYgdGhpc05h bWUgJiAiLmRhdGFIYW5kbGUgOj0gTklMOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUN cHV0IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKCIgJiB0aGlzTmFt ZSAmICIpKTsiICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWlmIGlzT3B0aW9uYWwg dGhlbg1wdXQgdHJ1ZSBpbnRvIG5lZWRFcnINcHV0IGl0ZW0gNiBvZiB4IGludG8gcHRy VGhpc05hbWUNcHV0IHB0clRoaXNOYW1lICYgIiA6IiAmIGl0ZW0gMiBvZiBuYW1lTGlz dCAmICI7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWlmIHBhcmFtVHlwZSA9IDUg dGhlbg1wdXQgaXRlbSA3IG9mIHggaW50byBzaXplVGhpc05hbWUNcHV0IHNpemVUaGlz TmFtZSAmICIgOiBMT05HSU5UOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1lbmQg aWYNcHV0IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlEZXNjKHRoZUFwcGxlRXZlbnQsIiAm IGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCIgJiB0 aGlzTmFtZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJJ RiBlcnIgPSBlcnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiBhZnRlciBwcm9j Qm9keQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgdHdvVGFiICYgcHRyVGhpc05hbWUgJiAiIDo9IE5JTDsiICYgcmV0dXJuIGFmdGVy IHByb2NCb2R5DWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1wdXQgdHdvVGFiICYgc2l6ZVRo aXNOYW1lICYgIiA6PSAwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1 dCB0d29UYWIgJiAieyBvciB5b3UgbWF5IHB1dCBpbiB5b3VyIGRlZmF1bHQgaGVyZSB9 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkVORCIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJFTFNFIiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgdHdvVGFiICYgIkZhaWxFcnIoZXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWlmIHBhcmFtVHlwZSA9IDcgdGhlbiAtLSBwdXQgaW4gemVybyB0ZXJtaW5hdG9y DXB1dCB0d29UYWIgJiAiRmFpbEVycihQdHJBbmRIYW5kKEBlcnIsICIgJiB0aGlzTmFt ZSDCDSYgIi5kYXRhSGFuZGxlLCAxKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1l bmQgaWYNcHV0IHR3b1RhYiAmICJXSVRIIiAmJiB0aGlzTmFtZSAmJiAiRE8iICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0aHJlZVRhYiAmICJCRUdJTiIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNSB0aGVuDXB1dCB0aHJlZVRhYiAm IHNpemVUaGlzTmFtZSAmICIgOj0gR2V0SGFuZGxlU2l6ZShkYXRhSGFuZGxlKTsiICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1pZiBpdGVtIDIgb2YgbmFtZUxpc3Qg PSAiUHRyIiB0aGVuDXB1dCB0aHJlZVRhYiAmIHB0clRoaXNOYW1lICYgIiA6PSBkYXRh SGFuZGxlXjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IHRocmVlVGFi ICYgcHRyVGhpc05hbWUgJiAiIDo9ICIgJiBpdGVtIDIgb2YgbmFtZUxpc3Qgwg0mICIo ZGF0YUhhbmRsZV4pOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCB0 aHJlZVRhYiAmICJITG9jayhkYXRhSGFuZGxlKTsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCB0aHJlZVRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgdHdvVGFiICYgIkVORDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBwdHJU aGlzTmFtZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNaWYgcGFyYW1UeXBlID0gNSB0 aGVuDXB1dCBzaXplVGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBp Zg1lbHNlDXB1dCBUYWIgJiAiRmFpbEVycihBRUdldEtleURlc2ModGhlQXBwbGVFdmVu dCwiICYgaXRlbSAyIG9mIHggwg0mICIsIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIs IiAmIHRoaXNOYW1lICYgIikpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgcGFy YW1UeXBlID0gNyB0aGVuIC0tIHB1dCBpbiB6ZXJvIHRlcm1pbmF0b3INcHV0IHRydWUg aW50byBuZWVkRXJyDXB1dCBUYWIgJiAiRmFpbEVycihQdHJBbmRIYW5kKEBlcnIsICIg JiB0aGlzTmFtZSDCDSYgIi5kYXRhSGFuZGxlLCAxKSk7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJITG9jaygiICYgdGhpc05hbWUgJiAiLmRh dGFIYW5kbGUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgaXRlbSAyIG9mIG5h bWVMaXN0ID0gIlB0ciIgdGhlbg1wdXQgdGhpc05hbWUgJiAiLmRhdGFIYW5kbGVeLCIg YWZ0ZXIgY2FsbFlvdXJDb2RlDWVsc2UNcHV0IGl0ZW0gMiBvZiBuYW1lTGlzdCAmICIo IiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlXiksIiBhZnRlciBjYWxsWW91ckNvZGUN ZW5kIGlmDWlmIHBhcmFtVHlwZSA9IDUgdGhlbiAtLSB3ZSBuZWVkIHRoZSBzaXplIHRv bw1wdXQgIkdldEhhbmRsZVNpemUoIiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlKSwi IGFmdGVyIGNhbGxZb3VyQ29kZQ1lbmQgaWYNZW5kIGlmDWVuZCBpZg1lbmQgaWYgLS0g bm90IG51bGwNZW5kIHJlcGVhdA1pZiB2ZXJib3NlIHRoZW4NcHV0IFRhYiAmICJ7IFdl IGNoZWNrIHRvIHNlZSBpZiB3ZSBtaXNzZWQgYW55IHBhcmFtZXRlciBmcm9tIHRoZSBj bGllbnQgfSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAi SUYgQUVTaXplT2ZBdHRyaWJ1dGUodGhlQXBwbGVFdmVudCwga2V5TWlzc2VkS2V5d29y ZEF0dHIsICIgwg0mICJ0eXBlQ29kZSwgYWN0dWFsU2l6ZSkgPD4gZXJyQUVEZXNjTm90 Rm91bmQgVEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmICJG YWlsRXJyKGVyckFFUGFyYW1NaXNzZWQpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN aWYgdG90YWxQYXJhbSA+IDAgdGhlbg1wdXQgIikiIGludG8gbGFzdCBjaGFyIG9mIGNh bGxZb3VyQ29kZQ1lbHNlDWRlbGV0ZSBsYXN0IGNoYXIgb2YgY2FsbFlvdXJDb2RlDWVu ZCBpZg1wdXQgY2FsbFlvdXJDb2RlICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgcHV0UmVzdWx0Q29kZSBhZnRlciBwcm9jQm9keQ1pZiBjbGVhblVwQ29kZSA8 PiAiIiB0aGVuDXB1dCB0YWIgJiAiQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVuZCBpZg1wdXQgdGFiICYgIkhhbmRsZSIgJiBwcm9jTmFtZSAmICIgOj0gTm9F cnI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdGFiICYgIkVORDsiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DWlmIG5lZWRFcnIgdGhlbiBwdXQgImVyciA6IE9TRXJy OyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgInR5cGVDb2RlIDogRGVzY1R5 cGU7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAiYWN0dWFsU2l6ZSA6IExP TkdJTlQ7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWlmIHZhckRlY2xhcmUgPD4g IiIgdGhlbg1wdXQgdGFiICYgIlZBUiIgJiByZXR1cm4gaW50byB4DXJlcGVhdCB3aXRo IGkgPSAxIHRvIG51bWJlciBvZiBsaW5lcyBpbiB2YXJEZWNsYXJlDXB1dCB0d29UYWIg JiBsaW5lIGkgb2YgdmFyRGVjbGFyZSAmIHJldHVybiBhZnRlciB4DWVuZCByZXBlYXQN cHV0IHggYWZ0ZXIgcHJvY0hlYWRlcg1lbmQgaWYNcHV0IEZhaWxFcnJTb3VyY2UocHJv Y05hbWUsIGNsZWFuVXBDb2RlKSBhZnRlciBwcm9jSGVhZGVyDXJldHVybiBwcm9jSGVh ZGVyICYgaW5pdENvZGUgJiByZXR1cm4gJiBwcm9jQm9keSAmIHJldHVybg1lbHNlIGlm IGNhcmRUeXBlID0gImluaXQiIHRoZW4NcmV0dXJuICJQUk9DRURVUkUgSWdub3JlT1NF cnIoZXJyOk9TRXJyKTsgSU5MSU5FICQ1NDhGOyB7IGFkZHEgIzIsc3AgfSAiICYgcmV0 dXJuICYgcmV0dXJuDWVsc2UgaWYgY2FyZFR5cGUgPSAiaW5zdGFsbCIgdGhlbg1wdXQg IkFFIiAmIFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNcmV0 dXJuIFRhYiAmICJJZ25vcmVPU0VycihBRUluc3RhbGxFdmVudEhhbmRsZXIoJyIgJiBS ZXNUeXBlKGZpZWxkICJldmVudENsYXNzIikgwg0mICInLCAnIiAmIFJlc1R5cGUoZmll bGQgImV2ZW50SUQiKSAmICInLCBASGFuZGxlIiAmIHByb2NOYW1lIMINJiAiLCAwLCBG QUxTRSkpOyIgJiByZXR1cm4NZWxzZQ1yZXR1cm4gIiINZW5kIGlmDWVuZCBTZXJ2ZXJT YW1wbGUNDWZ1bmN0aW9uIEZhaWxFcnJTb3VyY2UgcHJvY05hbWUsIGNsZWFudXBDb2Rl DS0tIHdlIHB1dCB0aGlzIHNlcGFyYXRlIHNvIHRoZSBQYXNjYWxTZXJ2ZXJTYW1wbGUg d291bGQgbm90IGJlIHRvbyBsb25nDXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0 IFRhYiAmIHR3b1RhYiBpbnRvIHRocmVlVGFiDXB1dCAiIiBpbnRvIHByb2NIZWFkZXIN LS0gdGhlIGNsZWFudXAgcm91dGluZQ1pZiBjbGVhblVwQ29kZSA8PiAiIiB0aGVuDXB1 dCBUYWIgJiAiUFJPQ0VEVVJFIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jSGVh ZGVyDXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXIN cHV0IGNsZWFuVXBDb2RlIGFmdGVyIHByb2NIZWFkZXINcHV0IHR3b1RhYiAmICJFTkQ7 IiAmIHJldHVybiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDWVuZCBpZg1wdXQgVGFi ICYgIlBST0NFRFVSRSBGYWlsRXJyKGVycjpPU0Vycik7IiAmIHJldHVybiBhZnRlciBw cm9jSGVhZGVyDXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NI ZWFkZXINcHV0IHR3b1RhYiAmICJJRiBlcnIgPD4gTk9FcnIgVEhFTiIgJiByZXR1cm4g YWZ0ZXIgcHJvY0hlYWRlcg1wdXQgdGhyZWVUYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFm dGVyIHByb2NIZWFkZXINcHV0IHRocmVlVGFiICYgIkhhbmRsZSIgJiBwcm9jTmFtZSAm ICIgOj0gZXJyOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1pZiBjbGVhblVwQ29k ZSA8PiAiIiB0aGVuDXB1dCB0aHJlZVRhYiAmICJDbGVhblVwOyIgJiByZXR1cm4gYWZ0 ZXIgcHJvY0hlYWRlcg1lbmQgaWYNcHV0IHRocmVlVGFiICYgIkV4aXQoSGFuZGxlIiAm IHByb2NOYW1lICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCB0aHJl ZVRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCB0d29UYWIg JiAiRU5EOyIgJiByZXR1cm4gJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1yZXR1cm4g cHJvY0hlYWRlcg1lbmQgRmFpbEVyclNvdXJjZQ0NZnVuY3Rpb24gUGFzY2FsVHlwZVRy dWVDb2RlIHgNcHV0IFRhYiAmICJlcnIgOj0gQUVHZXRLZXlQdHIodGhlQXBwbGVFdmVu dCwiICYgaXRlbSAyIG9mIHggJiAiLCAiIGludG8gcHJvY0JvZHkNaWYgaXRlbSAzIG9m IHggPSAidHJ1ZSIgdGhlbg1wdXQgInR5cGVCb29sZWFuLCB0eXBlQ29kZSwgQCIgJiBp dGVtIDEgb2YgeCAmICIsU2l6ZU9mKEJvb2xlYW4pLCBhY3R1YWxTaXplKTsiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0ICJ0eXBlRW51bWVyYXRlZCwgdHlwZUNv ZGUsIEAiICYgaXRlbSAxIG9mIHggJiAiLFNpemVPZihSZXNUeXBlKSwgYWN0dWFsU2l6 ZSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJJRiBl cnIgPSBlcnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgVGFiICYgVGFiICYgaXRlbSAxIG9mIHggJiAiIDo9ICIgYWZ0ZXIgcHJvY0Jv ZHkNaWYgaXRlbSAzIG9mIHggPSAidHJ1ZSIgdGhlbg1wdXQgIkZBTFNFIiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1lbHNlDXB1dCAiUmVzVHlwZSgwKSIgJiByZXR1cm4gYWZ0 ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAiRUxTRSIgJiByZXR1cm4gYWZ0ZXIg cHJvY0JvZHkNcHV0IFRhYiAmIFRhYiAmICJGYWlsRXJyKGVycik7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1yZXR1cm4gcHJvY0JvZHkNZW5kIFBhc2NhbFR5cGVUcnVlQ29k ZQ0NZnVuY3Rpb24gUGFzY2FsT3B0aW9uSGFuZGxpbmcgdGhpc05hbWUsIHB0clRoaXNO YW1lDXB1dCBUYWIgJiAiaWYgZXJyID0gZXJyQUVEZXNjTm90Rm91bmQgVEhFTiIgJiBy ZXR1cm4gaW50byBwcm9jQm9keQ1wdXQgVGFiICYgVGFiIGludG8gdHdvVGFiDXB1dCB0 d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIg JiBwdHJUaGlzTmFtZSAmICIgOj0gTklMOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IHR3b1RhYiAmICJ7IG9yIHlvdSBtYXkgcHV0IGluIHlvdXIgZGVmYXVsdCBoZXJl IH0iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRU5EIiAmIHJl dHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgIkVMU0UiICYgcmV0dXJuIGFmdGVy IHByb2NCb2R5DXB1dCB0d29UYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCB0d29UYWIgJiAiRmFpbEVycihlcnIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNcHV0IHR3b1RhYiAmIHB0clRoaXNOYW1lICYgIiA6PSBAIiAmIHRoaXNOYW1l ICYgIjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRU5EOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcmV0dXJuIHByb2NCb2R5DWVuZCBQYXNjYWxP cHRpb25IYW5kbGluZw0NZnVuY3Rpb24gU2VydmVyQ29uc3QgY29uc3RJbmZvLGNvbW1l bnRPdXQNcHV0IGl0ZW0gMSBvZiBjb25zdEluZm8gJiAiID0gIiAmIGl0ZW0gMiBvZiBj b25zdEluZm8gJiAiOyIgaW50byB4DWlmIGNvbW1lbnRPdXQgPSAidHJ1ZSIgdGhlbg1w dXQgInsgIiAmIHggJiAiIH0iIGludG8geA1lbmQgaWYNcmV0dXJuIFRhYiAmIHgNZW5k IFNlcnZlckNvbnN0DQ1mdW5jdGlvbiBTZXJ2ZXJJbnN0YWxsIGluc3RhbGxDb2RlDXJl dHVybiByZXR1cm4gJiAiUHJvY2VkdXJlIEluc3RhbGxIYW5kbGVyczsiICYgcmV0dXJu IMINJiBUYWIgJiAiQkVHSU4iICYgcmV0dXJuICYgaW5zdGFsbENvZGUgJiBUYWIgJiAi RU5EOyIgJiByZXR1cm4NZW5kIFNlcnZlckluc3RhbGwNDWZ1bmN0aW9uIFBhc2NhbENs aWVudFRlbXBsYXRlIG11bHRpTGluZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0 ZSBvciB3aGljaCBwYXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgR2x1ZUluZm8o ZmllbGQgInBhcmFtSW5mbyIpIGludG8gcGFyYW1JbmZvDXB1dCAiRnVuY3Rpb24gQUUi ICYgU3RyaXBTUChmaWVsZCAiZXZlbnROYW1lIikgJiAiKCIgaW50byB0ZW1wbGF0ZQ1w dXQgbnVtYmVyIG9mIGxpbmVzIGluIHBhcmFtSW5mbyBpbnRvIG4NcHV0IDAgaW50byBw YXJhbUluZGV4DXJlcGVhdCB3aXRoIGluZGV4ID0gMSB0byBuDXNldCBjdXJzb3IgdG8g YnVzeQ1wdXQgbGluZSBpbmRleCBvZiBwYXJhbUluZm8gaW50byB5DXB1dCBpdGVtIDQg b2YgeSBpbnRvIHBhcmFtVHlwZQ1wdXQgKGl0ZW0gNSBvZiB5ID0gIm8iKSBpbnRvIGlz T3B0aW9uYWwNcHV0IChpdGVtIDMgb2YgeSA8PiAibnVsbCIpIGludG8gdXNlSXQNaWYg dXNlSXQgdGhlbg1hZGQgMSB0byBwYXJhbUluZGV4DWlmIHVzZUl0IHRoZW4NaWYgaW5k ZXggPSAxIHRoZW4NcHV0ICJWQVIgIiBhZnRlciB0ZW1wbGF0ZQ1wdXQgZmFsc2UgaW50 byBpc09wdGlvbmFsDWVsc2UNaWYgbXVsdGlMaW5lID0gIm11bHRpTGluZSIgdGhlbg1w dXQgcmV0dXJuICYgc3BhY2UgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1wdXQgc3BhY2UgYWZ0 ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBpZg1wdXQgTmFtZU9mRGF0YVR5cGUoaXRlbSAz IG9mIHkpIGludG8gbmFtZUxpc3QNaWYgcGFyYW1UeXBlID0gMSB0aGVuIC0tIGhhbmRs ZQ1wdXQgaXRlbSAxIG9mIHkgJiAiOiIgJiBpdGVtIDMgb2YgbmFtZUxpc3QgJiAiOyAi IGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgcGFyYW1UeXBlID0gNSB0aGVuIC0tIHB0ciAr IHNpemUNcHV0IGl0ZW0gNiBvZiB5ICYgIjoiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYg IjsgIiDCDSYgaXRlbSA3IG9mIHkgJiAiOiBMT05HSU5UOyAiIGFmdGVyIHRlbXBsYXRl DWVsc2UgaWYgcGFyYW1UeXBlID0gNyB0aGVuIC0tIGNTdHJpbmcNcHV0IGl0ZW0gNiBv ZiB5ICYgIjoiICYgaXRlbSAyIG9mIG5hbWVMaXN0ICYgIjsgIiBhZnRlciB0ZW1wbGF0 ZQ1lbHNlIGlmIGlzT3B0aW9uYWwgdGhlbiAtLSB1c2UgcG9pbnRlciB0byBkYXRhDWlm IHBhcmFtVHlwZSA9IDQgdGhlbiAtLSBmaXhlZCBsZW5ndGgNcHV0IGl0ZW0gMyBvZiB5 IGludG8gZGF0YVR5cGUNaWYgZGF0YVR5cGUgPSAiZW51bSIgdGhlbiAtLSBzcGVjaWFs IGZvciBlbnVtDXB1dCBpdGVtIDEgb2YgeSAmICI6UmVzVHlwZTsgIiBhZnRlciB0ZW1w bGF0ZQ1lbHNlIGlmIGRhdGFUeXBlID0gInRydWUiIHRoZW4gLS0gYWxzbyBzcGVjaWFs IGZvciB0cnVlDXB1dCBpdGVtIDEgb2YgeSAmICI6Qm9vbGVhbjsgIiBhZnRlciB0ZW1w bGF0ZQ1lbHNlDXB1dCBpdGVtIDYgb2YgeSAmICI6IiAmIGl0ZW0gMiBvZiBuYW1lTGlz dCAmICI7ICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVsc2UNcHV0IGl0ZW0gNiBvZiB5 ICYgIjoiIGFmdGVyIHRlbXBsYXRlDWlmIChwYXJhbVR5cGUgPSAwKSB0aGVuDXB1dCAi QUVEZXNjUHRyOyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgLS0gNiwgUFN0cmluZw1wdXQg IlN0cmluZ1B0cjsgIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlmDWVsc2UgLS0g cmVxdWlyZWQNcHV0IGl0ZW0gMSBvZiB5ICYgIjoiIGFmdGVyIHRlbXBsYXRlDWlmIChw YXJhbVR5cGUgPSAwKSB0aGVuIC0tIEFFRGVzYw1wdXQgIkFFRGVzYzsgIiBhZnRlciB0 ZW1wbGF0ZQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDQgdGhlbiAtLSBmaXhlZCBsZW5ndGgN cHV0IGl0ZW0gMSBvZiBuYW1lTGlzdCAmICI7ICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSAt LSBzdHIyNTUNcHV0ICJTdHIyNTU7ICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBp Zg1lbmQgaWYgLS0gdXNlSXQNZW5kIGlmIC0tIHVzZUl0DWVuZCByZXBlYXQNRGVsZXRl IGxhc3QgY2hhciBvZiB0ZW1wbGF0ZSAtLSBzcGFjZSBvciAoDWlmIHBhcmFtSW5kZXgg PiAwIHRoZW4NcHV0ICIpIiBpbnRvIGxhc3QgY2hhciBvZiB0ZW1wbGF0ZSAtLSByZXBs YWNlIDsNZW5kIGlmDXB1dCAiOk9TRXJyOyIgYWZ0ZXIgdGVtcGxhdGUNcmV0dXJuIHRl bXBsYXRlDWVuZCBQYXNjYWxDbGllbnRUZW1wbGF0ZQ0NAAA7NAADAQABBgCfARkA+oAG AAAAAAABAAAADAAAABBDAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb25zdGFudCBuYW1lcyB3aWxsIGJlIGlu IEMuIg1lbmQgTW91c2VXaXRoaW4NDWZ1bmN0aW9uIFNlcnZlclNhbXBsZSBjYXJkVHlw ZQ1pZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1wdXQgIkFFIiAmIFN0cmlwU1AoZmll bGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNZ2xvYmFsIGNsaWVudExhbmcsdmVy Ym9zZQ1pZiB2ZXJib3NlIHRoZW4NcHV0IGZpZWxkICJldmVudENvbW1lbnQiIGludG8g dGVtcA1pZiB0ZW1wIDw+ICIiIHRoZW4NcHV0ICIvKiAiICYgdGVtcCAmICIgKi8iICYg cmV0dXJuICYgcmV0dXJuIGludG8gcHJvY0hlYWRlcg1lbmQgaWYNZW5kIGlmDXB1dCBD VGVtcGxhdGUoKSAmIHJldHVybiBhZnRlciB0ZW1wDXB1dCAiRG8iIGFmdGVyIGNoYXIg NiBvZiB0ZW1wDXB1dCB0ZW1wIGFmdGVyIHByb2NIZWFkZXINcHV0ICJ7IiAmIHJldHVy biBhZnRlciBwcm9jSGVhZGVyDXB1dCBUYWIgJiAiLyogcHV0IHlvdXIgY29kZSBoZXJl ICovIiAmIHJldHVybiBhZnRlciBwcm9jSGVhZGVyDXB1dCBUYWIgJiAicmV0dXJuIG5v RXJyOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1wdXQgIn0iICYgcmV0dXJuICYg cmV0dXJuIGFmdGVyIHByb2NIZWFkZXINcHV0ICJwYXNjYWwgT1NFcnIgSGFuZGxlIiAm IHByb2NOYW1lIMINJiAiKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFwcGxlRXZlbnQsIGNv bnN0IEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHRoZVJlZkNvbikiICYgcmV0dXJu IGFmdGVyIHByb2NIZWFkZXINcHV0IEdsdWVJbmZvKGZpZWxkICJwYXJhbUluZm8iKSBp bnRvIHBhcmFtSW5mbw1wdXQgbnVtYmVyIG9mIGxpbmVzIG9mIHBhcmFtSW5mbyBpbnRv IGNvdW50DXB1dCAoaXRlbSAzIG9mIHBhcmFtSW5mbyA8PiAibnVsbCIpIGludG8gaXNG dW5jDXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0IFRhYiAmIHR3b1RhYiBpbnRv IHRocmVlVGFiDXB1dCAiIiBpbnRvIGNsZWFuVXBDb2RlDXB1dCAiIiBpbnRvIHB1dFJl c3VsdENvZGUNcHV0ICIiIGludG8gaW5pdENvZGUNcHV0ICJPU0VyciBlcnI7IiAmIHJl dHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAiRGVzY1R5cGUgdHlwZUNvZGU7IiAmIHJl dHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAibG9uZyBhY3R1YWxTaXplOyIgJiByZXR1 cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgVGFiICYgImVyciA9IERvIiAmIHByb2NOYW1l ICYgIigiIGludG8gY2FsbFlvdXJDb2RlDXB1dCAwIGludG8gdG90YWxQYXJhbQ0tLSBp ZiBhIGZ1bmN0aW9uIGdldCB0aGUgcmVzdWx0IGJhY2sNaWYgaXNGdW5jIHRoZW4NYWRk IDEgdG8gdG90YWxQYXJhbQ1wdXQgbGluZSAxIG9mIHBhcmFtSW5mbyBpbnRvIHgNcHV0 IGl0ZW0gNCBvZiB4IGludG8gcGFyYW1UeXBlDXB1dCBOYW1lT2ZEYXRhVHlwZShpdGVt IDMgb2YgeCkgaW50byBuYW1lTGlzdA1wdXQgVGFiICYgImlmICgoKnRoZVJlcGx5KS5k YXRhSGFuZGxlKSIgJiByZXR1cm4gYWZ0ZXIgcHV0UmVzdWx0Q29kZQ1pZiBwYXJhbVR5 cGUgPD0gMSB0aGVuIC0tIHJlc3VsdCBpcyBBRURlc2Mgb3IgSGFuZGxlDXB1dCAiQUVE ZXNjIHRoZVJlc3VsdDsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0IFRhYiAm ICJ0aGVSZXN1bHQuZGF0YUhhbmRsZSA9IG5pbDsiICYgcmV0dXJuIGFmdGVyIGluaXRD b2RlDWlmIChwYXJhbVR5cGUgPSAwKSB0aGVuDXB1dCAiJnRoZVJlc3VsdCwiIGFmdGVy IGNhbGxZb3VyQ29kZQ1lbHNlDXB1dCBUYWIgJiAidGhlUmVzdWx0LmRlc2NyaXB0b3JU eXBlID0gIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCDCDSYgIjsiICYgcmV0dXJuIGFmdGVy IGluaXRDb2RlDXB1dCAiJnRoZVJlc3VsdC5kYXRhSGFuZGxlLCIgYWZ0ZXIgY2FsbFlv dXJDb2RlDWVuZCBpZg1wdXQgVGFiICYgIkFFRGlzcG9zZURlc2MoJnRoZVJlc3VsdCk7 IiAmIHJldHVybiBhZnRlciBjbGVhblVwQ29kZQ1wdXQgdHdvVGFiICYgImVyciA9IEFF UHV0S2V5RGVzYyh0aGVSZXBseSwga2V5RGlyZWN0T2JqZWN0LCAmdGhlUmVzdWx0KTsi ICYgcmV0dXJuIGFmdGVyIHB1dFJlc3VsdENvZGUNZWxzZSBpZiAocGFyYW1UeXBlID0g NCkgb3IgKHBhcmFtVHlwZSA9IDYpIHRoZW4gLS0gcmVzdWx0IGlzIG9uIHN0YWNrDWlm IHBhcmFtVHlwZSA9IDQgdGhlbg1wdXQgaXRlbSA1IG9mIG5hbWVMaXN0ICYgIiB0aGVS ZXN1bHQ7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCAiJnRoZVJlc3VsdCwi IGFmdGVyIGNhbGxZb3VyQ29kZQ1lbHNlDXB1dCAiU3RyMjU1IHRoZVJlc3VsdDsiICYg cmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0ICIoU3RyaW5nUHRyKSAmdGhlUmVzdWx0 LCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBpZg1wdXQgdHdvVGFiICYgImVyciA9IEFF UHV0S2V5UHRyKHRoZVJlcGx5LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBv ZiBuYW1lTGlzdCAmICIsIChQdHIpICZ0aGVSZXN1bHQiIGFmdGVyIHB1dFJlc3VsdENv ZGUNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1dCAiLCBzaXplb2YoIiAmIGl0ZW0gNSBv ZiBuYW1lTGlzdCAmICIpKTsiICYgcmV0dXJuIGFmdGVyIHB1dFJlc3VsdENvZGUNZWxz ZQ1wdXQgIlsxXSwgdGhlUmVzdWx0WzBdKTsiICYgcmV0dXJuIGFmdGVyIHB1dFJlc3Vs dENvZGUNZW5kIGlmDWVuZCBpZg1lbmQgaWYgLS0gaXNGdW5jDXJlcGVhdCB3aXRoIHBh cmFtSW5kZXggPSAyIHRvIGNvdW50DXB1dCBsaW5lIHBhcmFtSW5kZXggb2YgcGFyYW1J bmZvIGludG8geA1pZiBpdGVtIDMgb2YgeCA8PiAibnVsbCIgdGhlbg1hZGQgMSB0byB0 b3RhbFBhcmFtDXB1dCBpdGVtIDQgb2YgeCBpbnRvIHBhcmFtVHlwZQ1wdXQgKGl0ZW0g NSBvZiB4ID0gIm8iKSBpbnRvIGlzT3B0aW9uYWwNcHV0IE5hbWVPZkRhdGFUeXBlKGl0 ZW0gMyBvZiB4KSBpbnRvIG5hbWVMaXN0DWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgdHdv VGFiIGludG8gaW5kZW50DWVsc2UNcHV0IFRhYiBpbnRvIGluZGVudA1lbmQgaWYNaWYg cGFyYW1UeXBlID0gMCB0aGVuIC0tIEFFRGVzYyBvciBoYW5kbGUNcHV0IGl0ZW0gMSBv ZiB4IGludG8gdGhpc05hbWUNcHV0IFRhYiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxl ID0gbmlsOyIgJiByZXR1cm4gYWZ0ZXIgaW5pdENvZGUNcHV0IFRhYiAmICJlcnIgPSBB RUdldFBhcmFtRGVzYyh0aGVBcHBsZUV2ZW50LCIgJiBpdGVtIDIgb2YgeCDCDSYgIix0 eXBlV2lsZENhcmQsJiIgJiB0aGlzTmFtZSAmICIpOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNaWYgaXNPcHRpb25hbCB0aGVuDXB1dCBpdGVtIDYgb2YgeCBpbnRvIHB0clRo aXNOYW1lDXB1dCAiQUVEZXNjIiAmJiB0aGlzTmFtZSAmICIsIiAmJiAiKiIgJiBwdHJU aGlzTmFtZSAmICI7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCBwdHJUaGlz TmFtZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNcHV0IENPcHRpb25IYW5kbGluZygi JiIgJiB0aGlzTmFtZSwgcHRyVGhpc05hbWUpIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0 ICJBRURlc2MiICYmIHRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xh cmUNcHV0ICImIiAmIHRoaXNOYW1lICYgIiwiIGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQg VGFiICYgImlmIChlcnIpIGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVuZCBpZg1wdXQgVGFiICYgIkFFRGlzcG9zZURlc2MoJiIgJiB0aGlzTmFtZSAm ICIpOyIgJiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNZWxzZSBpZiBwYXJhbVR5cGUg PSAxIHRoZW4gLS0gaGFuZGxlDXB1dCBpdGVtIDEgb2YgeCBpbnRvIHB0clRoaXNOYW1l DXB1dCAiZGVzY0ZvciIgJiBTdHJpcFNQKGl0ZW0gMSBvZiB4KSBpbnRvIHRoaXNOYW1l DXB1dCAiQUVEZXNjIiAmJiB0aGlzTmFtZSAmICI7IiAmIHJldHVybiBhZnRlciB2YXJE ZWNsYXJlDXB1dCBUYWIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSA9IG5pbDsiICYg cmV0dXJuIGFmdGVyIGluaXRDb2RlDXB1dCB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSwi IGFmdGVyIGNhbGxZb3VyQ29kZQ1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IFRhYiAmICJl cnIgPSBBRUdldFBhcmFtRGVzYyh0aGVBcHBsZUV2ZW50LCIgJiBpdGVtIDIgb2YgeCDC DSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYgIiwmIiAmIHRoaXNOYW1lICYgIik7 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgImlmIChlcnIgPT0gZXJy QUVEZXNjTm90Rm91bmQpIiAmIHJldHVybiDCDSYgdHdvVGFiICYgIi8qIG9yIHlvdSBt YXkgcHV0IGluIHlvdXIgZGVmYXVsdCBoZXJlICovOyIgJiByZXR1cm4gwg0mIHRhYiAm ICJlbHNlIGlmIChlcnIpIGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVsc2UNcHV0IFRhYiAmICJlcnIgPSBBRUdldFBhcmFtRGVzYyh0aGVBcHBsZUV2 ZW50LCIgJiBpdGVtIDIgb2YgeCDCDSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYg IiwmIiAmIHRoaXNOYW1lICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg VGFiICYgImlmIChlcnIpIGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVuZCBpZg1wdXQgVGFiICYgIkFFRGlzcG9zZURlc2MoJiIgJiB0aGlzTmFtZSAm ICIpOyIgJiByZXR1cm4gYWZ0ZXIgY2xlYW5VcENvZGUNZWxzZSBpZiAocGFyYW1UeXBl ID0gNCkgb3IgKHBhcmFtVHlwZSA9IDYpIHRoZW4NaWYgaXRlbSAzIG9mIHggPSAidHJ1 ZSIgdGhlbg1wdXQgIkJvb2xlYW4iICYmIGl0ZW0gMSBvZiB4ICYgIjsiICYgcmV0dXJu IGFmdGVyIHZhckRlY2xhcmUNcHV0IGl0ZW0gMSBvZiB4ICYgIiwiIGFmdGVyIGNhbGxZ b3VyQ29kZQ1wdXQgQ1R5cGVUcnVlQ29kZSh4KSBhZnRlciBwcm9jQm9keQ1lbHNlIGlm IGlzT3B0aW9uYWwgdGhlbg1pZiBpdGVtIDMgb2YgeCA9ICJlbnVtIiB0aGVuDXB1dCAi UmVzVHlwZSIgJiYgaXRlbSAxIG9mIHggJiAiOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVj bGFyZQ1wdXQgaXRlbSAxIG9mIHggJiAiLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDXB1dCBD VHlwZVRydWVDb2RlKHgpIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IGl0ZW0gNiBvZiB4 IGludG8gcHRyVGhpc05hbWUNcHV0IGl0ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNaWYg cGFyYW1UeXBlID0gNCB0aGVuDXB1dCBpdGVtIDUgb2YgbmFtZUxpc3QgJiYgdGhpc05h bWUgJiAiOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgaXRlbSA1IG9mIG5h bWVMaXN0ICYgIiAqIiAmIHB0clRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZh ckRlY2xhcmUNZWxzZQ1wdXQgIlN0cjI1NSAiICYgdGhpc05hbWUgJiAiLCAqIiAmIHB0 clRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNZW5kIGlmDXB1 dCBUYWIgJiAiZXJyID0gQUVHZXRQYXJhbVB0cih0aGVBcHBsZUV2ZW50LCIgJiBpdGVt IDIgb2YgeCDCDSYgIiwiICYgaXRlbSA0IG9mIG5hbWVMaXN0ICYgIiwmdHlwZUNvZGUs KFB0cikmIiAmIHRoaXNOYW1lIGFmdGVyIHByb2NCb2R5DWlmIHBhcmFtVHlwZSA9IDQg dGhlbg1wdXQgIixzaXplb2YoIiAmIHRoaXNOYW1lICYgIiksJmFjdHVhbFNpemUpOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IENPcHRpb25IYW5kbGluZygiJiIgJiB0 aGlzTmFtZSwgcHRyVGhpc05hbWUpIGFmdGVyIHByb2NCb2R5DXB1dCBwdHJUaGlzTmFt ZSAmICIsIiBhZnRlciBjYWxsWW91ckNvZGUNZWxzZSAtLSBzdHIyNTUNcHV0ICJbMV0s c2l6ZW9mKCIgJiB0aGlzTmFtZSAmICIpLTEsJmFjdHVhbFNpemUpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJpZiAoIWVycikiICYgcmV0dXJuIGFmdGVy IHByb2NCb2R5DXB1dCB0d29UYWIgJiB0aGlzTmFtZSAmICJbMF0gPSAoY2hhcikgYWN0 dWFsU2l6ZTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCAiKFN0cmluZ1B0cikg IiAmIHB0clRoaXNOYW1lICYgIiwiIGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQgQ09wdGlv bkhhbmRsaW5nKCIoU3RyMjU1ICopICYiICYgdGhpc05hbWUsIHB0clRoaXNOYW1lKSBh ZnRlciBwcm9jQm9keQ1lbmQgaWYNZW5kIGlmDWVsc2UgLS0gcmVxdWlyZWQNcHV0IGl0 ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNcHV0IFRhYiAmICJlcnIgPSBBRUdldFBhcmFt UHRyKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBpdGVtIDQg b2YgbmFtZUxpc3QgJiAiLCZ0eXBlQ29kZSwoUHRyKSYiICYgdGhpc05hbWUgYWZ0ZXIg cHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNCB0aGVuDXB1dCBpdGVtIDUgb2YgbmFtZUxp c3QgJiYgdGhpc05hbWUgJiAiOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQg IixzaXplb2YoIiAmIHRoaXNOYW1lICYgIiksJmFjdHVhbFNpemUpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNcHV0IGl0ZW0gNiBvZiBuYW1lTGlzdCBpbnRvIGRhdGFTaXpl DWlmIChkYXRhU2l6ZSA8IDApIG9yIChkYXRhU2l6ZSA+IDQpIHRoZW4NcHV0ICImIiBh ZnRlciBjYWxsWW91ckNvZGUNZW5kIGlmDXB1dCB0aGlzTmFtZSAmICIsIiBhZnRlciBj YWxsWW91ckNvZGUNZWxzZQ1wdXQgIihTdHJpbmdQdHIpICYgIiAmIHRoaXNOYW1lICYg IiwiIGFmdGVyIGNhbGxZb3VyQ29kZQ1wdXQgIlN0cjI1NSIgJiYgdGhpc05hbWUgJiAi OyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgIlsxXSxzaXplb2YoIiAmIHRo aXNOYW1lICYgIiktMSwmYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgVGFiICYgdGhpc05hbWUgJiAiWzBdID0gKGNoYXIpIGFjdHVhbFNpemU7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJpZiAoZXJyKSBn b3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNZWxzZSBp ZiAocGFyYW1UeXBlID0gNSkgb3IgKHBhcmFtVHlwZSA9IDcpIHRoZW4NcHV0ICJkZXNj Rm9yIiAmIFN0cmlwU1AoaXRlbSAxIG9mIHgpIGludG8gdGhpc05hbWUNcHV0ICJBRURl c2MiICYmIHRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 IFRhYiAmIHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlID0gbmlsOyIgJiByZXR1cm4gYWZ0 ZXIgaW5pdENvZGUNcHV0IFRhYiAmICJBRURpc3Bvc2VEZXNjKCYiICYgdGhpc05hbWUg JiAiKTsiICYgcmV0dXJuIGFmdGVyIGNsZWFuVXBDb2RlDWlmIGlzT3B0aW9uYWwgdGhl bg1wdXQgInB0clRvIiAmIFN0cmlwU1AoaXRlbSAxIG9mIHgpIGludG8gcHRyVGhpc05h bWUNcHV0IGl0ZW0gMSBvZiB4ICYgIlNpemUiIGludG8gc2l6ZVRoaXNOYW1lDWlmIHBh cmFtVHlwZSA9IDUgdGhlbg1wdXQgIlB0ciIgJiYgcHRyVGhpc05hbWUgJiAiOyIgJiBy ZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQgImxvbmciICYmIHNpemVUaGlzTmFtZSAm ICI7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDWVsc2UNcHV0IGl0ZW0gNSBvZiBu YW1lTGlzdCAmJiAiKiIgJiBwdHJUaGlzTmFtZSAmICI7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDWVuZCBpZg1wdXQgVGFiICYgImVyciA9IEFFR2V0UGFyYW1EZXNjKHRo ZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBpdGVtIDQgb2YgbmFt ZUxpc3QgJiAiLCYiICYgdGhpc05hbWUgJiAiKTsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCBUYWIgJiAiaWYgKGVyciA9PSBlcnJBRURlc2NOb3RGb3VuZCkgeyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmIHB0clRoaXNOYW1lICYgIiA9 IG5pbDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlmIHBhcmFtVHlwZSA9IDUgdGhl bg1wdXQgdHdvVGFiICYgc2l6ZVRoaXNOYW1lICYgIiA9IDA7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbmQgaWYNcHV0IHR3b1RhYiAmICIvKiBvciB5b3UgbWF5IHB1dCBp biB5b3VyIGRlZmF1bHQgaGVyZSAqLyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0 IFRhYiAmICJ9IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgImVsc2Ug eyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmICJpZiAoZXJyKSBn b3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1pZiBwYXJhbVR5cGUg PSA3IHRoZW4gLS0gcHV0IGluIHplcm8gdGVybWluYXRvcg1wdXQgdHdvVGFiICYgImVy ciA9IFB0ckFuZEhhbmQoKFB0cikmZXJyLCAiICYgdGhpc05hbWUgwg0mICIuZGF0YUhh bmRsZSwgMSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgImlm IChlcnIpIGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBp Zg1pZiBwYXJhbVR5cGUgPSA1IHRoZW4NcHV0IHR3b1RhYiAmIHNpemVUaGlzTmFtZSAm ICIgPSBHZXRIYW5kbGVTaXplKCIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSk7IiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNaWYgaXRlbSAyIG9mIG5hbWVMaXN0 ID0gIlB0ciIgdGhlbg1wdXQgdHdvVGFiICYgcHRyVGhpc05hbWUgJiAiID0gKiIgJiB0 aGlzTmFtZSAmICIuZGF0YUhhbmRsZTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVs c2UNcHV0IHR3b1RhYiAmIHB0clRoaXNOYW1lICYgIiA9IChQdHIpICoiICYgdGhpc05h bWUgwg0mICIuZGF0YUhhbmRsZTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBp Zg1wdXQgdHdvVGFiICYgIkhMb2NrKCIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSk7 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgIn07IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1wdXQgcHRyVGhpc05hbWUgJiAiLCIgYWZ0ZXIgY2FsbFlvdXJD b2RlDWlmIHBhcmFtVHlwZSA9IDUgdGhlbg1wdXQgc2l6ZVRoaXNOYW1lICYgIiwiIGFm dGVyIGNhbGxZb3VyQ29kZQ1lbmQgaWYNZWxzZQ1wdXQgVGFiICYgImVyciA9IEFFR2V0 UGFyYW1EZXNjKHRoZUFwcGxlRXZlbnQsIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCIgJiBp dGVtIDQgb2YgbmFtZUxpc3QgJiAiLCYiICYgdGhpc05hbWUgJiAiKTsiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DXB1dCBUYWIgJiAiaWYgKGVycikgZ290byBDbGVhblVwOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNyB0aGVuIC0tIHB1 dCBpbiB6ZXJvIHRlcm1pbmF0b3INcHV0IFRhYiAmICJlcnIgPSBQdHJBbmRIYW5kKChQ dHIpJmVyciwgIiAmIHRoaXNOYW1lIMINJiAiLmRhdGFIYW5kbGUsIDEpOyIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJpZiAoZXJyKSBnb3RvIENsZWFuVXA7 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJITG9jaygi ICYgdGhpc05hbWUgJiAiLmRhdGFIYW5kbGUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNaWYgaXRlbSAyIG9mIG5hbWVMaXN0ID0gIlB0ciIgdGhlbg1wdXQgIioiICYgdGhp c05hbWUgJiAiLmRhdGFIYW5kbGUsIiBhZnRlciBjYWxsWW91ckNvZGUNZWxzZSBpZiBw YXJhbVR5cGUgPSA3IHRoZW4NcHV0ICIoY2hhciAqKSAqIiAmIHRoaXNOYW1lICYgIi5k YXRhSGFuZGxlLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVsc2UNcHV0ICIoUHRyKSAqIiAm IHRoaXNOYW1lICYgIi5kYXRhSGFuZGxlLCIgYWZ0ZXIgY2FsbFlvdXJDb2RlDWVuZCBp Zg1pZiBwYXJhbVR5cGUgPSA1IHRoZW4gLS0gd2UgbmVlZCB0aGUgc2l6ZSB0b28NcHV0 ICJHZXRIYW5kbGVTaXplKCIgJiB0aGlzTmFtZSAmICIuZGF0YUhhbmRsZSksIiBhZnRl ciBjYWxsWW91ckNvZGUNZW5kIGlmDWVuZCBpZg1lbmQgaWYNZW5kIGlmIC0tIG5vdCBu dWxsDWVuZCByZXBlYXQNaWYgdmVyYm9zZSB0aGVuDXB1dCBUYWIgJiAiLyogV2UgY2hl Y2sgdG8gc2VlIGlmIHdlIG1pc3NlZCBhbnkgcGFyYW1ldGVyIGZyb20gdGhlIGNsaWVu dCAqLyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1dCBUYWIgJiAiaWYg KEFFU2l6ZU9mQXR0cmlidXRlKHRoZUFwcGxlRXZlbnQsIGtleU1pc3NlZEtleXdvcmRB dHRyLCAiIMINJiAiJnR5cGVDb2RlLCAmYWN0dWFsU2l6ZSkgIT0gZXJyQUVEZXNjTm90 Rm91bmQpIHsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiZXJy ID09IGVyckFFUGFyYW1NaXNzZWQ7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg dHdvVGFiICYgImdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCBUYWIgJiAifTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlmIHRvdGFsUGFyYW0g PiAwIHRoZW4NcHV0ICIpIiBpbnRvIGxhc3QgY2hhciBvZiBjYWxsWW91ckNvZGUNZWxz ZQ1wdXQgIikiIGFmdGVyIGNhbGxZb3VyQ29kZQ1lbmQgaWYNcHV0IGNhbGxZb3VyQ29k ZSAmICI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYgImlmIChlcnIp IGdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBwdXRSZXN1 bHRDb2RlIGFmdGVyIHByb2NCb2R5DXB1dCAiQ2xlYW5VcDoiICYgcmV0dXJuIGFmdGVy IHByb2NCb2R5DXB1dCBDbGVhblVwQ29kZSAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgdGFiICYgInJldHVybiBlcnI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg In0iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCAieyIgJiByZXR1cm4gaW50byB4 DXJlcGVhdCB3aXRoIGkgPSAxIHRvIG51bWJlciBvZiBsaW5lcyBpbiB2YXJEZWNsYXJl DXB1dCBUYWIgJiBsaW5lIGkgb2YgdmFyRGVjbGFyZSAmIHJldHVybiBhZnRlciB4DWVu ZCByZXBlYXQNcHV0IHggJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1yZXR1cm4gcHJv Y0hlYWRlciAmIGluaXRDb2RlICYgcmV0dXJuICYgcHJvY0JvZHkgJiByZXR1cm4NZWxz ZSBpZiBjYXJkVHlwZSA9ICJpbml0IiB0aGVuDWVsc2UgaWYgY2FyZFR5cGUgPSAiaW5z dGFsbCIgdGhlbg1wdXQgIkFFIiAmIFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGlu dG8gcHJvY05hbWUNcmV0dXJuIFRhYiAmICJBRUluc3RhbGxFdmVudEhhbmRsZXIoJyIg JiBSZXNUeXBlKGZpZWxkICJldmVudENsYXNzIikgwg0mICInLCAnIiAmIFJlc1R5cGUo ZmllbGQgImV2ZW50SUQiKSAmICInLCAoUHJvY1B0cikgJkhhbmRsZSIgJiBwcm9jTmFt ZSDCDSYgIiwgMCwgZmFsc2UpOyIgJiByZXR1cm4NZWxzZQ1yZXR1cm4gIiINZW5kIGlm DWVuZCBTZXJ2ZXJTYW1wbGUNDWZ1bmN0aW9uIENUeXBlVHJ1ZUNvZGUgeA1wdXQgVGFi ICYgImVyciA9IEFFR2V0UGFyYW1QdHIodGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9m IHggJiAiLCAiIGludG8gcHJvY0JvZHkNaWYgaXRlbSAzIG9mIHggPSAidHJ1ZSIgdGhl bg1wdXQgInR5cGVCb29sZWFuLCAmdHlwZUNvZGUsIChQdHIpJiIgJiBpdGVtIDEgb2Yg eCAmICIsMSwgJmFjdHVhbFNpemUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZWxz ZQ1wdXQgInR5cGVFbnVtZXJhdGVkLCAmdHlwZUNvZGUsIChQdHIpJiIgJiBpdGVtIDEg b2YgeCAmICIsc2l6ZW9mKFJlc1R5cGUpLCAmYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IFRhYiAmICJpZiAoZXJyID09IGVyckFFRGVz Y05vdEZvdW5kKSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmIFRhYiAm IGl0ZW0gMSBvZiB4ICYgIiA9ICIgYWZ0ZXIgcHJvY0JvZHkNaWYgaXRlbSAzIG9mIHgg PSAidHJ1ZSIgdGhlbg1wdXQgImZhbHNlOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN ZWxzZQ1wdXQgIihSZXNUeXBlKSAwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5k IGlmDXB1dCBUYWIgJiAiZWxzZSBpZiAoZXJyKSBnb3RvIENsZWFuVXA7IiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1yZXR1cm4gcHJvY0JvZHkNZW5kIENUeXBlVHJ1ZUNvZGUN DWZ1bmN0aW9uIENPcHRpb25IYW5kbGluZyB0aGlzTmFtZSwgcHRyVGhpc05hbWUNcHV0 IFRhYiAmICJpZiAoZXJyID09IGVyckFFRGVzY05vdEZvdW5kKSB7IiAmIHJldHVybiBp bnRvIHByb2NCb2R5DXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0IHR3b1RhYiAm IHB0clRoaXNOYW1lICYgIiA9IG5pbDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCB0d29UYWIgJiAiLyogb3IgeW91IG1heSBwdXQgaW4geW91ciBkZWZhdWx0IGhlcmUg Ki8iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBUYWIgJiAifSIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJlbHNlIHsiICYgcmV0dXJuIGFmdGVyIHBy b2NCb2R5DXB1dCB0d29UYWIgJiAiaWYgKGVycikgZ290byBDbGVhblVwOyIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgcGFyYW1UeXBlID0gNiB0aGVuDXB1dCB0d29UYWIg JiBwdHJUaGlzTmFtZSAmICIgPSAiICYgdGhpc05hbWUgJiAiOyIgJiByZXR1cm4gYWZ0 ZXIgcHJvY0JvZHkNZWxzZQ1wdXQgdHdvVGFiICYgcHRyVGhpc05hbWUgJiAiID0gIiAm IHRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQg VGFiICYgIn07IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1yZXR1cm4gcHJvY0JvZHkN ZW5kIENPcHRpb25IYW5kbGluZw0NZnVuY3Rpb24gU2VydmVyQ29uc3QgbmFtZSxjb25z dCxjb21tZW50T3V0DXB1dCAiI2RlZmluZSAiICYgbmFtZSAmJiBjb25zdCBpbnRvIHgN aWYgY29tbWVudE91dCA9ICJ0cnVlIiB0aGVuDXB1dCAiLyogIiAmIHggJiAiICovIiBp bnRvIHgNZW5kIGlmDXJldHVybiB4DWVuZCBTZXJ2ZXJDb25zdA0NZnVuY3Rpb24gU2Vy dmVySW5zdGFsbCBpbnN0YWxsQ29kZQ1yZXR1cm4gcmV0dXJuICYgInZvaWQgSW5zdGFs bEhhbmRsZXJzKCkiICYgcmV0dXJuIMINJiAieyIgJiByZXR1cm4gJiBpbnN0YWxsQ29k ZSAmICJ9IiAmIHJldHVybg1lbmQgU2VydmVySW5zdGFsbA0NZnVuY3Rpb24gQ1RlbXBs YXRlIG11bHRpTGluZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBvciB3aGlj aCBwYXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgR2x1ZUluZm8oZmllbGQgInBh cmFtSW5mbyIpIGludG8gcGFyYW1JbmZvDXB1dCAiT1NFcnIgQUUiICYgU3RyaXBTUChm aWVsZCAiZXZlbnROYW1lIikgJiAiKCIgaW50byB0ZW1wbGF0ZQ1wdXQgbnVtYmVyIG9m IGxpbmVzIGluIHBhcmFtSW5mbyBpbnRvIG4NcHV0IDAgaW50byBwYXJhbUluZGV4DXJl cGVhdCB3aXRoIGluZGV4ID0gMSB0byBuDXNldCBjdXJzb3IgdG8gYnVzeQ1wdXQgbGlu ZSBpbmRleCBvZiBwYXJhbUluZm8gaW50byB5DXB1dCBpdGVtIDQgb2YgeSBpbnRvIHBh cmFtVHlwZQ1wdXQgKGl0ZW0gNSBvZiB5ID0gIm8iKSBpbnRvIGlzT3B0aW9uYWwNcHV0 IChpdGVtIDMgb2YgeSA8PiAibnVsbCIpIGludG8gdXNlSXQNaWYgdXNlSXQgdGhlbg1h ZGQgMSB0byBwYXJhbUluZGV4DWlmIHVzZUl0IHRoZW4NaWYgaW5kZXggPSAxIHRoZW4N cHV0IGZhbHNlIGludG8gaXNPcHRpb25hbA1lbHNlDWlmIG11bHRpTGluZSA9ICJtdWx0 aUxpbmUiIHRoZW4NcHV0IHJldHVybiAmIHNwYWNlIGFmdGVyIHRlbXBsYXRlDWVsc2UN cHV0IHNwYWNlIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1lbmQgaWYNcHV0IE5hbWVPZkRh dGFUeXBlKGl0ZW0gMyBvZiB5KSBpbnRvIG5hbWVMaXN0DXB1dCBpdGVtIDUgb2YgbmFt ZUxpc3QgaW50byB0eXBlTmFtZQ1pZiBwYXJhbVR5cGUgPSAwIHRoZW4NaWYgaW5kZXgg PD4gMSB0aGVuIHB1dCAiY29uc3QgIiBhZnRlciB0ZW1wbGF0ZQ1wdXQgIkFFRGVzYyAq IiBhZnRlciB0ZW1wbGF0ZQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDEgdGhlbiAtLSBoYW5k bGUNcHV0ICJIYW5kbGUgIiBhZnRlciB0ZW1wbGF0ZQ1pZiBpbmRleCA9IDEgdGhlbg1w dXQgIioiIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1lbHNlIGlmIHBhcmFtVHlwZSA9IDQg dGhlbiAtLSBpbW1lZGlhdGUNcHV0IGl0ZW0gMyBvZiB5IGludG8gZGF0YVR5cGUNcHV0 IGl0ZW0gNiBvZiBuYW1lTGlzdCBpbnRvIGRhdGFTaXplDWlmIGRhdGFUeXBlID0gImVu dW0iIHRoZW4NcHV0ICJSZXNUeXBlICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSBpZiBkYXRh VHlwZSA9ICJ0cnVlIiB0aGVuDXB1dCAiQm9vbGVhbiAiIGFmdGVyIHRlbXBsYXRlDWVs c2UgaWYgKGlzT3B0aW9uYWwgb3IgKGRhdGFTaXplIDwgMCkgb3IgKGRhdGFTaXplID4g NCkpIGFuZCAoaW5kZXggPD4gMSkgdGhlbiAtLSBmaXhlZCBsZW5ndGggb3B0aW9uYWwN cHV0ICJjb25zdCAiICYgdHlwZU5hbWUgJiAiICoiIGFmdGVyIHRlbXBsYXRlDWVsc2UN cHV0IHR5cGVOYW1lICYgc3BhY2UgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGluZGV4 ID0gMSB0aGVuDXB1dCAiKiIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVsc2UgaWYgcGFy YW1UeXBlID0gNyB0aGVuDWlmIGluZGV4IDw+IDEgdGhlbiBwdXQgImNvbnN0ICIgYWZ0 ZXIgdGVtcGxhdGUNcHV0IHR5cGVOYW1lICYgIiAqIiBhZnRlciB0ZW1wbGF0ZQ1lbmQg aWYNaWYgKGxhc3QgY2hhciBvZiB0ZW1wbGF0ZSA9ICIqIikgdGhlbg1wdXQgaXRlbSA2 IG9mIHkgJiAiLCAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgKHBhcmFtVHlwZSA9IDUp IHRoZW4gLS0gcHRyICsgc2l6ZQ1wdXQgdHlwZU5hbWUgJiAiICoiICYgaXRlbSA2IG9m IHkgJiAiLCBsb25nICIgJiBpdGVtIDcgb2YgeSAmICIsICIgYWZ0ZXIgdGVtcGxhdGUN ZWxzZSBpZiBwYXJhbVR5cGUgPSA2IHRoZW4NaWYgaW5kZXggPD4gMSB0aGVuIHB1dCAi Y29uc3QgIiBhZnRlciB0ZW1wbGF0ZQ1wdXQgIlN0cmluZ1B0ciAiICYgaXRlbSA2IG9m IHkgJiAiLCAiIGFmdGVyIHRlbXBsYXRlDWVsc2UNcHV0IGl0ZW0gMSBvZiB5ICYgIiwg IiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlmIC0tIHVzZUl0DWVuZCBpZiAtLSB1 c2VJdA1lbmQgcmVwZWF0DWlmIHBhcmFtSW5kZXggPiAwIHRoZW4NRGVsZXRlIGxhc3Qg Y2hhciBvZiB0ZW1wbGF0ZSAtLSBzcGFjZSBvciAoDXB1dCAiKSIgaW50byBsYXN0IGNo YXIgb2YgdGVtcGxhdGUgLS0gcmVwbGFjZSAsDWVsc2UNcHV0ICIpIiBhZnRlciB0ZW1w bGF0ZQ1lbmQgaWYNcmV0dXJuIHRlbXBsYXRlDWVuZCBDVGVtcGxhdGUNDQAAIgAEAgUA 3wADAPEAdgAAAAAAAAAAABUADAUAABAAAAAABewABQEAAQIAAgESAF3ABgAAAAAAAQAA AAwAAAAQYWV0ZSBOYW1lAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sg aGVyZSB0byBzaG93IHRoZSBldmVudCBieSB1c2luZyB0aGUgZXZlbnQgbmFtZSBhbmQg cGFyYW1ldGVyIG5hbWUuIg1lbmQgTW91c2VXaXRoaW4NDWZ1bmN0aW9uIENsaWVudFRl bXBsYXRlIG11bHRpTGluZQ0tLSBlaXRoZXIgcmV0dXJuIHRoZSB0ZW1wbGF0ZSBvciB3 aGljaCBwYXJhbWV0ZXIgaXMgYmVpbmcgY2xpY2tlZA1wdXQgc3BhY2UgJiBOdW1Ub0No YXIoMTk0KSAmIHJldHVybiAmIHNwYWNlIGludG8gY29udENoYXINcHV0IGZpZWxkICJl dmVudE5hbWUiIGludG8gdGVtcGxhdGUNcHV0IGZpZWxkICJwYXJhbUluZm8iIGludG8g eA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIHggaW50byBuDXB1dCAwIGludG8gcGFyYW1J bmRleA1yZXBlYXQgd2l0aCBpbmRleCA9IDIgdG8gbg1zZXQgY3Vyc29yIHRvIGJ1c3kN cHV0IGxpbmUgaW5kZXggb2YgeCBpbnRvIHkNcHV0IGl0ZW0gNCBvZiB5IGludG8gdGVt cA1wdXQgKHRlbXAgPiAzMjc2NykgaW50byBpc09wdGlvbmFsDXB1dCB0ZW1wIGRpdiA4 MTkyIGludG8gdGVtcA1wdXQgKHRlbXAgbW9kIDIgPSAxKSBpbnRvIGlzRW51bQ1wdXQg IiIgaW50byBlbnVtZXJhdGVkDXB1dCAoaXRlbSAzIG9mIHkgPD4gIm51bGwiKSBpbnRv IHVzZUl0DWlmIHVzZUl0IHRoZW4NYWRkIDEgdG8gcGFyYW1JbmRleA0tLSBmb3IgcHJv dG8gc3RhdGVtZW50DWlmIGl0ZW0gMyBvZiB5ID0gInRydWUiIHRoZW4NcHV0ICJ0cnVl IiBpbnRvIHRoaXNQYXJhbQ1lbHNlIGlmIGluZGV4ID0gMSB0aGVuDXB1dCAiZGlyZWN0 UGFyYW0iIGludG8gdGhpc1BhcmFtDWVsc2UNcHV0ICJwYXJhbSIgaW50byB0aGlzUGFy YW0NZW5kIGlmDWlmIHVzZUl0IHRoZW4NaWYgbXVsdGlMaW5lID0gIm11bHRpTGluZSIg dGhlbg1wdXQgY29udENoYXIgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1wdXQgc3BhY2UgYWZ0 ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgIlsiIGFmdGVy IHRlbXBsYXRlDWVuZCBpZg1pZiBpbmRleCA8PiAxIHRoZW4NcHV0IGl0ZW0gMSBvZiB5 ICYgc3BhY2UgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIGlzRW51bSB0aGVuDXB1dCBF bnVtT3B0aW9uKGZpZWxkICJzdWl0ZUNvZGUiLGl0ZW0gMyBvZiB5LGVudW1lcmF0ZWQs MSkgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1wdXQgdGhpc1BhcmFtIGFmdGVyIHRlbXBsYXRl DWVuZCBpZg1pZiBpc09wdGlvbmFsIHRoZW4NcHV0ICJdIiBhZnRlciB0ZW1wbGF0ZQ1l bmQgaWYNZW5kIGlmDWVuZCBpZiAtLSB1c2VJdA1lbmQgcmVwZWF0DXJldHVybiB0ZW1w bGF0ZQ1lbmQgQ2xpZW50VGVtcGxhdGUNDWZ1bmN0aW9uIENsaWVudFNhbXBsZSBjYXJk VHlwZQ1pZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1yZXR1cm4gQ2xpZW50VGVtcGxh dGUoKSAmIHJldHVybiAmIHJldHVybg1lbHNlDXJldHVybiAiIg1lbmQgaWYNZW5kIENs aWVudFNhbXBsZQ0NADHAAAYBAAESAAIBIwBXgAYAAAAAAAEAAAAMAAAAEEh5cGVyVGFs awAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gc2hvdyB0 aGUgZXZlbnQgYXMgaXQgaXMgY2FsbGVkIGZyb20gSHlwZXJUYWxrLiINZW5kIE1vdXNl V2l0aGluDQ1mdW5jdGlvbiBDbGllbnRUZW1wbGF0ZSBtdWx0aUxpbmUNZ2xvYmFsIGNs aWVudEhhc0dsdWUNcHV0IHNwYWNlICYgTnVtVG9DaGFyKDE5NCkgJiByZXR1cm4gJiBz cGFjZSBpbnRvIGNvbnRDaGFyDXB1dCBmaWVsZCAicGFyYW1JbmZvIiBpbnRvIHgNcHV0 IHF1b3RlICYgIi0tLS0iICYgcXVvdGUgaW50byBkYXNoDXB1dCAoaXRlbSAzIG9mIGxp bmUgMSBvZiB4IDw+ICJudWxsIikgaW50byBpc0Z1bmMNcHV0IDAgaW50byBwYXJhbUlu ZGV4DXB1dCBudW1iZXIgb2YgbGluZXMgaW4geCBpbnRvIG4NaWYgY2xpZW50SGFzR2x1 ZSB0aGVuDS0tIGVpdGhlciByZXR1cm4gdGhlIHRlbXBsYXRlIG9yIHdoaWNoIHBhcmFt ZXRlciBpcyBiZWluZyBjbGlja2VkDXB1dCAiQUUiICYgU3RyaXBTUChmaWVsZCAiZXZl bnROYW1lIikgaW50byB0ZW1wbGF0ZQ1pZiBpc0Z1bmMgdGhlbg1wdXQgIiAoIiBhZnRl ciB0ZW1wbGF0ZQ1lbHNlDXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNcHV0 IHRydWUgaW50byBmaXJzdFRpbWUgLS0gbm8gY29tbWEgYmVmb3JlIGZpcnN0IHBhcmFt DXB1dCAxIGludG8gb3B0aW9uRW5kIC0tIHdlIGxvb3AgdHdpY2UsIG9uY2UgZm9yIHJl cXVpcmVkIG9uY2UgZm9yIG9wdGlvbmFsDXB1dCAxIGludG8gZW51bU9wdGlvbkluZGV4 IC0tIHdlIHdhbnQgZnVsbCBuYW1lDWVsc2UgLS0gbm8gZ2x1ZQ1wdXQgIkFFU2VuZCIg JiYgcXVvdGUgJiBSZXNUeXBlKGZpZWxkICJldmVudENsYXNzIikgwg0mIFJlc1R5cGUo ZmllbGQgImV2ZW50SUQiKSAmIHF1b3RlICYgwg0iLCB0YXJnZXRQcm9ncmFtLCBzZW5k TW9kZSwgdGltZU91dFZhbHVlIiBpbnRvIHRlbXBsYXRlDXB1dCBmYWxzZSBpbnRvIGZp cnN0VGltZSAtLSBjb21tYSBiZWZvciBmaXJzdCBwYXJhbQ1wdXQgMCBpbnRvIG9wdGlv bkVuZCAgLS0gd2UganVzdCBsb29wIG9uY2UNcHV0IDIgaW50byBlbnVtT3B0aW9uSW5k ZXggLS0gd2Ugd2FudCA0IGxldHRlciBjb2RlDWVuZCBpZg0tLSB3ZSBsb29wIHRocm91 Z2ggaXQgdHdpY2UsIG9uIHRpbWUgZm9yIHJlcXVpcmVkLCBvbmUgZm9yIG9wdA1yZXBl YXQgd2l0aCBvcHRpb24gPSAwIHRvIG9wdGlvbkVuZA1wdXQgKG9wdGlvbiA9IDEpIGlu dG8gd2FudE9wdGlvbmFsDXJlcGVhdCB3aXRoIGluZGV4ID0gMiB0byBuDXNldCBjdXJz b3IgdG8gYnVzeQ1wdXQgbGluZSBpbmRleCBvZiB4IGludG8geQ1wdXQgaXRlbSA0IG9m IHkgaW50byB0ZW1wDXB1dCAodGVtcCA+IDMyNzY3KSBpbnRvIGlzT3B0aW9uYWwNaWYg KGlzT3B0aW9uYWwgPSB3YW50T3B0aW9uYWwpIG9yIChub3QgY2xpZW50SGFzR2x1ZSkg dGhlbg1wdXQgdGVtcCBkaXYgODE5MiBpbnRvIHRlbXANcHV0ICh0ZW1wIG1vZCAyID0g MSkgaW50byBpc0VudW0NcHV0ICIiIGludG8gZW51bWVyYXRlZA1wdXQgdHJ1ZSBpbnRv IHVzZUl0DWlmIGluZGV4ID0gMiB0aGVuDWlmIGl0ZW0gMyBvZiB5ID0gIm51bGwiIHRo ZW4gcHV0IGZhbHNlIGludG8gdXNlSXQNcHV0ICJkaXJlY3RQYXJhbSIgaW50byBpdGVt IDEgb2YgeQ1wdXQgIi0tLS0iIGludG8gaXRlbSAyIG9mIHkNZW5kIGlmDWlmIHVzZUl0 IHRoZW4NYWRkIDEgdG8gcGFyYW1JbmRleA1pZiB1c2VJdCB0aGVuDWlmIG11bHRpTGlu ZSA9ICJtdWx0aUxpbmUiIHRoZW4NcHV0IGNvbnRDaGFyIGFmdGVyIHRlbXBsYXRlDWVs c2UNcHV0IHNwYWNlIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1pZiBpc09wdGlvbmFsIHRo ZW4NcHV0ICJbIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNaWYgKGluZGV4IDw+IDIpIGFu ZCAod2FudE9wdGlvbmFsIG9yIChOb3QgQ2xpZW50SGFzR2x1ZSkpIHRoZW4NaWYgZmly c3RUaW1lIHRoZW4NcHV0IGZhbHNlIGludG8gZmlyc3RUaW1lDWVsc2UNcHV0ICIsIiBh ZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNaWYgY2xpZW50SGFzR2x1ZSB0aGVuDXB1dCBpdGVt IDEgb2YgeSBpbnRvIHRoaXNLZXkNZWxzZQ1wdXQgSFRLZXlXb3JkKHkpIGludG8gdGhp c0tleQ1lbmQgaWYNcHV0IHF1b3RlICYgdGhpc0tleSAmIHF1b3RlIGFmdGVyIHRlbXBs YXRlDWVuZCBpZg1pZiBmaXJzdFRpbWUgdGhlbg1wdXQgZmFsc2UgaW50byBmaXJzdFRp bWUNZWxzZQ1wdXQgIiwiIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1pZiB3YW50T3B0aW9u YWwgb3IgKE5vdCBDbGllbnRIYXNHbHVlKSB0aGVuDWlmIGl0ZW0gMyBvZiB5ID0gInRy dWUiIHRoZW4NcHV0ICJ0cnVlIiBhZnRlciB0ZW1wbGF0ZQ1lbHNlIGlmIGlzRW51bSB0 aGVuDXB1dCBFbnVtT3B0aW9uKGZpZWxkICJTdWl0ZUNvZGUiLGl0ZW0gMyBvZiB5LGVu dW1lcmF0ZWQsZW51bU9wdGlvbkluZGV4KSBhZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1dCAi c29tZSIgJiBpdGVtIDMgb2YgeSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZWxzZQ1pZiBp c0VudW0gdGhlbg1wdXQgRW51bU9wdGlvbihmaWVsZCAiU3VpdGVDb2RlIixpdGVtIDMg b2YgeSxlbnVtZXJhdGVkLGVudW1PcHRpb25JbmRleCkgYWZ0ZXIgdGVtcGxhdGUNZWxz ZQ1wdXQgaXRlbSAxIG9mIHkgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBpZg1pZiBp c09wdGlvbmFsIHRoZW4NcHV0ICJdIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlm DWVuZCBpZiAtLSB1c2VpdA1lbmQgaWYgLS0gdGhlIHJpZ2h0IGtpbmQgb2Ygb3B0aW9u DWVuZCByZXBlYXQNZW5kIHJlcGVhdA1pZiBpc0Z1bmMgYW5kIGNsaWVudEhhc0dsdWUg dGhlbg1wdXQgIiApIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNcmV0dXJuIHRlbXBsYXRl DWVuZCBDbGllbnRUZW1wbGF0ZQ0NZnVuY3Rpb24gQ2xpZW50U2FtcGxlIGNhcmRUeXBl DWdsb2JhbCBjbGllbnRIYXNHbHVlLCBkZWZhdWx0VGFyZ2V0LCBkZWZhdWx0VGltZU91 dA1pZiBjbGllbnRIYXNHbHVlIHRoZW4NZ2xvYmFsIG5hbWluZ0Zvcm1MaXN0LGVsZW1l bnRMaXN0LGNsYXNzTmFtZUxpc3QNcHV0ICIiIGludG8gcnN0DWlmIGNhcmRUeXBlID0g InN1aXRlIiB0aGVuDXB1dCAiIiBpbnRvIG5hbWluZ0Zvcm1MaXN0DXB1dCAiIiBpbnRv IGVsZW1lbnRMaXN0DXB1dCAiIiBpbnRvIGNsYXNzTmFtZUxpc3QNcHV0ICJlbnVtZXJh dGlvbiBmb3JtIiBpbnRvIHgNaWYgdGhlcmUgaXMgYSBjYXJkIHggdGhlbg1wdXQgZmll bGQgImVudW1JbmZvIiBvZiBjYXJkIHggaW50byBuYW1pbmdGb3JtTGlzdA1lbmQgaWYN ZWxzZSBpZiBjYXJkVHlwZSA9ICJldmVudCIgdGhlbg1wdXQgIkFFIiAmIFN0cmlwU1Ao ZmllbGQgIkV2ZW50TmFtZSIpIGludG8gRXZlbnROYW1lDXB1dCAoaXRlbSAzIG9mIGZp ZWxkICJwYXJhbUluZm8iIDw+ICJudWxsIikgaW50byBpc0Z1bmMNaWYgaXNGdW5jIHRo ZW4NcHV0ICJGdW5jdGlvbiIgaW50byBoZWFkZXINZWxzZQ1wdXQgIk9uIiBpbnRvIGhl YWRlcg1lbmQgaWYNcHV0IHNwYWNlICYgRXZlbnROYW1lIGFmdGVyIGhlYWRlcg1wdXQg c3BhY2UgJiBOdW1Ub0NoYXIoMTk0KSAmIHJldHVybiBpbnRvIGNvbnQNcHV0ICIgIHB1 dCAiICYgcXVvdGUgJiAiQUVTZW5kICIgJiBxdW90ZSAmICIgJiBxdW90ZSAmICIgJiBx dW90ZSAmIFJlc1R5cGUoZmllbGQgImV2ZW50Q2xhc3MiKSAmIFJlc1R5cGUoZmllbGQg ImV2ZW50SUQiKSAmIHF1b3RlICYgIiAmIHF1b3RlICYgIiAmIHF1b3RlICYgIiwiICYg cXVvdGUgJiBjb250IGFmdGVyIHNlbmRIZWFkZXINcHV0ICIgICYgcXVvdGUgJiAiICYg cXVvdGUgJiBkZWZhdWx0VGFyZ2V0ICYgcXVvdGUgJiAiICYgcXVvdGUgJiAiICYgcXVv dGUgJiAiLCIgJiBxdW90ZSAmIGNvbnQgYWZ0ZXIgc2VuZEhlYWRlcg1wdXQgIiAgJiAi ICYgcXVvdGUgYWZ0ZXIgc2VuZEhlYWRlcg1wdXQgIiAgQUVTZW5kICIgJiBxdW90ZSAm IFJlc1R5cGUoZmllbGQgImV2ZW50Q2xhc3MiKSAmIFJlc1R5cGUoZmllbGQgImV2ZW50 SUQiKSAmIHF1b3RlICYgIiwiIMINJiBxdW90ZSAmIGRlZmF1bHRUYXJnZXQgJiBxdW90 ZSAmICIsIiBpbnRvIHNob3J0SGVhZGVyDWlmIGlzRnVuYyB0aGVuDXB1dCAiMywiIGFm dGVyIHNlbmRIZWFkZXINcHV0ICIzLCIgYWZ0ZXIgc2hvcnRIZWFkZXINZWxzZQ1wdXQg IjEsIiBhZnRlciBzZW5kSGVhZGVyDXB1dCAiMSwiIGFmdGVyIHNob3J0SGVhZGVyDWVu ZCBpZg1wdXQgZGVmYXVsdFRpbWVPdXQgJiBxdW90ZSBhZnRlciBzZW5kSGVhZGVyDXB1 dCBkZWZhdWx0VGltZU91dCBhZnRlciBzaG9ydEhlYWRlcg1wdXQgbGluZSAyIG9mIGZp ZWxkICJwYXJhbUluZm8iIGludG8geA1wdXQgKGl0ZW0gMyBvZiB4IDw+ICJudWxsIikg aW50byBoYXNEaXJlY3QNcHV0IChpdGVtIDQgb2YgeCA+IDMyNzY3KSBpbnRvIGRpcmVj dE9wdGlvbmFsDXB1dCAxIGludG8gcGFyYW1JbmRleA1wdXQgZmFsc2UgaW50byBoYXNP cHRpb25hbA1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGZpZWxkICJwYXJhbUluZm8iIGlu dG8gY291bnQNcmVwZWF0IHdpdGggaW5kZXggPSAyIHRvIGNvdW50DXB1dCBsaW5lIGlu ZGV4IG9mIGZpZWxkICJwYXJhbUluZm8iIGludG8geA1wdXQgaXRlbSA0IG9mIHggaW50 byB0ZW1wDXB1dCAodGVtcCA+IDMyNzY3KSBpbnRvIGlzT3B0aW9uYWwNaWYgaXRlbSAz IG9mIHggPD4gIm51bGwiIHRoZW4NaWYgaXNPcHRpb25hbCB0aGVuDWlmIGluZGV4IDw+ IDIgdGhlbg1wdXQgdHJ1ZSBpbnRvIGhhc09wdGlvbmFsDWVuZCBpZg1lbHNlDXB1dCB0 ZW1wIGRpdiA4MTkyIGludG8gdGVtcA1wdXQgKHRlbXAgbW9kIDIpID0gMSBpbnRvIGlz RW51bQ1pZiBpbmRleCA9IDIgdGhlbg0tLSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGRp cmVjdCBwYXJhbWV0ZXINaWYgcGFyYW1JbmRleCA9IDEgdGhlbg1wdXQgIiAiIGFmdGVy IGhlYWRlcg1lbHNlDXB1dCAiLCIgYWZ0ZXIgaGVhZGVyDWVuZCBpZg1wdXQgImRpcmVj dFBhcmFtIiBhZnRlciBoZWFkZXINcHV0ICItLS0tIiBpbnRvIGl0ZW0gMiBvZiB4DXB1 dCBIVEtleVdvcmQoeCkgaW50byB0aGlzVHlwZQ1pZiBsZW5ndGgodGhpc1R5cGUpID4g NCB0aGVuDS0tIHdlIG5lZWQgYSBrZXl3b3JkIGZvciBkaXJlY3RQYXJhbSBiZWNhdXNl IHRoZXJlIGlzIGEgdHlwZQ1wdXQgIiAmICIgJiBxdW90ZSAmICIsIiAmIHF1b3RlICYg IiAmIHF1b3RlICYgIiAmIHF1b3RlICYgdGhpc1R5cGUgJiBxdW90ZSAmICIgJiBxdW90 ZSAiIGFmdGVyIHNlbmRIZWFkZXINcHV0ICIsIiAmIHF1b3RlICYgdGhpc1R5cGUgJiBx dW90ZSBhZnRlciBzaG9ydEhlYWRlcg1pZiBjaGFyIDUgdG8gOCBvZiB0aGlzVHlwZSA9 ICJlbnVtIiB0aGVuDXB1dCBFbnVtTGluZXMoMSxpdGVtIDMgb2YgeCwgImRpcmVjdFBh cmFtIiwgdHJ1ZSkgYWZ0ZXIgcnN0DWVuZCBpZg1lbmQgaWYNcHV0ICIgJiAiICYgcXVv dGUgJiAiLGRpcmVjdFBhcmFtIiAmIHF1b3RlIGFmdGVyIHNlbmRIZWFkZXINcHV0ICIs ZGlyZWN0UGFyYW0iIGFmdGVyIHNob3J0SGVhZGVyDWFkZCAxIHRvIHBhcmFtSW5kZXgN ZWxzZQ1wdXQgU3RyaXBTUChpdGVtIDEgb2YgeCkgaW50byB0ZW1wDWlmIHBhcmFtSW5k ZXggPSAxIHRoZW4NcHV0ICIgIiBhZnRlciBoZWFkZXINZWxzZQ1wdXQgIiwiIGFmdGVy IGhlYWRlcg1lbmQgaWYNcHV0IHRlbXAgYWZ0ZXIgaGVhZGVyDS0tIHB1dCBpbiB0aGUg a2V5d29yZA1wdXQgSFRLZXlXb3JkKHgpIGludG8gdGhpc1R5cGUNcHV0ICIgJiAiICYg cXVvdGUgJiAiLCIgJiBxdW90ZSAmICIgJiBxdW90ZSAmICIgJiBxdW90ZSAmIHRoaXNU eXBlICYgcXVvdGUgJiAiICYgcXVvdGUgJiAiICYgcXVvdGUgJiAiLCIgJiB0ZW1wICYg cXVvdGUgYWZ0ZXIgc2VuZEhlYWRlcg1wdXQgIiwiICYgcXVvdGUgJiB0aGlzVHlwZSAm IHF1b3RlICYgIiwiICYgdGVtcCBhZnRlciBzaG9ydEhlYWRlcg1pZiBjaGFyIDUgdG8g OCBvZiB0aGlzVHlwZSA9ICJlbnVtIiB0aGVuDXB1dCBFbnVtTGluZXMoMSxpdGVtIDMg b2YgeCwgdGVtcCwgdHJ1ZSkgYWZ0ZXIgcnN0DWVuZCBpZg1hZGQgMSB0byBwYXJhbUlu ZGV4DWVuZCBpZg1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQgLS0gMiB0byBuDWlmICho YXNPcHRpb25hbCkgb3IgKGhhc0RpcmVjdCBhbmQgZGlyZWN0T3B0aW9uYWwpIHRoZW4g LS0gbm90IGFsbCBwYXJhbSBhcmUgcmVxdWlyZWQNcHV0IGhlYWRlciAmIHJldHVybiAm IHNlbmRIZWFkZXIgJiAiIGFmdGVyIHN0bXQiICYgcmV0dXJuIGJlZm9yZSByc3QNaWYg aGFzRGlyZWN0IGFuZCBkaXJlY3RPcHRpb25hbCB0aGVuDXB1dCAiICBwdXQgIiAmIHBh cmFtSW5kZXggJiAiIGludG8gaSIgJiByZXR1cm4gYWZ0ZXIgcnN0DS0tIHdlIGhhdmUg YSBvcHRpb25hbCBkaXJlY3QgcGFyYW1ldGVyDXB1dCAiICBpZiAodGhlIFBhcmFtQ291 bnQiIGFmdGVyIHJzdA1pZiBwYXJhbUluZGV4ID4gMSB0aGVuIHB1dCBzcGFjZSAmICIt ICIgJiBwYXJhbUluZGV4LTEgYWZ0ZXIgcnN0DXB1dCAiKSBtb2QgMiA9IDEgdGhlbiIg JiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCBsaW5lIDIgb2YgZmllbGQgInBhcmFtSW5mbyIg aW50byB4DXB1dCAiLS0tLSIgaW50byBpdGVtIDIgb2YgeA1wdXQgSFRLZXlXb3JkKHgp IGludG8gdGhpc1R5cGUNcHV0IGZhbHNlIGludG8gcGFyYW1Jc1VwIC0tIHdlIGhhdmUg bm90IHB1dCBQYXJhbSB1cCB5ZXQNaWYgKHBhcmFtSW5kZXggPiAxKSBvciAobGVuZ3Ro KHRoaXNUeXBlKSA+IDQpIHRoZW4NLS0gd2UgaGF2ZSB0byBmYWtlIGEga2V5d29yZA1w dXQgIiAgICBwdXQgIiAmIHF1b3RlICYgIiwiICYgcXVvdGUgJiAiICYgcXVvdGUgJiAi ICYgcXVvdGUgJiB0aGlzVHlwZSAmIHF1b3RlICYgIiAmIHF1b3RlIGFmdGVyIHN0bXQi ICYgcmV0dXJuIGFmdGVyIHJzdA1pZiBjaGFyIDUgdG8gOCBvZiB0aGlzVHlwZSA9ICJl bnVtIiB0aGVuDXB1dCBFbnVtTGluZXMoMiwgaXRlbSAzIG9mIHgsICJQYXJhbShpKSIs IGZhbHNlKSBpbnRvIHRlbXANaWYgdGVtcCA8PiAiIiB0aGVuDXB1dCAiICAgIHB1dCAi ICYgcXVvdGUgJiAiLCIgJiBxdW90ZSAmICIgYWZ0ZXIgc3RtdCIgJiByZXR1cm4gYWZ0 ZXIgcnN0DXB1dCAiICAgIGVsc2UiIGludG8gbGFzdCBsaW5lIG9mIHRlbXANcHV0ICIg ICAgICBwdXQgIiAmIHF1b3RlICYgIlBhcmFtKCIgJiBxdW90ZSAmICIgJiBpICYgIiAm IHF1b3RlICYgIikiICYgcXVvdGUgJiAiIGFmdGVyIHN0bXQiICYgcmV0dXJuIGFmdGVy IHRlbXANcHV0ICIgICAgZW5kIGlmIiAmIHJldHVybiBhZnRlciB0ZW1wDXB1dCB0ZW1w IGFmdGVyIHJzdA1wdXQgdHJ1ZSBpbnRvIHBhcmFtSXNVcCAtLSBub3cgd2UgaGF2ZSBw dXQgUGFyYW0gdXANZW5kIGlmDWVuZCBpZg1lbmQgaWYNaWYgbm90IHBhcmFtSXNVcCB0 aGVuDXB1dCAiICAgIHB1dCAiICYgcXVvdGUgJiAiLFBhcmFtKCIgJiBxdW90ZSAmICIg JiBpICYgIiAmIHF1b3RlICYgIikiICYgcXVvdGUgJiAiIGFmdGVyIHN0bXQiICYgcmV0 dXJuIGFmdGVyIHJzdA1lbmQgaWYNaWYgaGFzT3B0aW9uYWwgdGhlbg0tLSBpbmNyZW1l bnQgaSBpZiB3ZSBuZWVkIGl0IGxhdGVyDXB1dCAiICAgIGFkZCAxIHRvIGkiICYgcmV0 dXJuIGFmdGVyIHJzdA1lbmQgaWYNcHV0ICIgIGVuZCBpZiIgJiByZXR1cm4gYWZ0ZXIg cnN0DWVsc2UgaWYgaGFzT3B0aW9uYWwgdGhlbg1wdXQgIiAgcHV0ICIgJiBwYXJhbUlu ZGV4ICYgIiBpbnRvIGkiICYgcmV0dXJuIGFmdGVyIHJzdA1lbmQgaWYNcHV0IHRydWUg aW50byBmaXJzdE9wdGlvbmFsDWlmIGhhc09wdGlvbmFsIHRoZW4NcHV0ICIgIHJlcGVh dCB1bnRpbCBpID4gdGhlIFBhcmFtQ291bnQiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQg IiAgICBwdXQgcGFyYW0oaSkgaW50byB4IiAmIHJldHVybiBhZnRlciByc3QNcHV0ICIg ICAgcHV0ICIgJiBxdW90ZSAmICIsIiAmIHF1b3RlICYgIiBhZnRlciBzdG10IiAmIHJl dHVybiBhZnRlciByc3QNcHV0IGZhbHNlIGludG8gaGFzRW51bQ1yZXBlYXQgd2l0aCBp ID0gMyB0byBjb3VudA1wdXQgbGluZSBpIG9mIGZpZWxkICJwYXJhbUluZm8iIGludG8g eA1wdXQgaXRlbSA0IG9mIHggaW50byB0ZW1wDXB1dCAodGVtcCA+IDMyNzY3KSBpbnRv IGlzT3B0aW9uYWwNaWYgaXNPcHRpb25hbCB0aGVuDWlmIGZpcnN0T3B0aW9uYWwgdGhl bg1wdXQgIiAgICAiIGFmdGVyIHJzdA1wdXQgZmFsc2UgaW50byBmaXJzdE9wdGlvbmFs DWVsc2UNcHV0ICIgICAgZWxzZSAiIGFmdGVyIHJzdA1lbmQgaWYNcHV0IEhUS2V5V29y ZCh4KSBpbnRvIHRoaXNLZXkNcHV0IGl0ZW0gMSBvZiB4IGludG8gdGhpc05hbWUNcHV0 IFN0cmlwU1AodGhpc05hbWUpIGludG8gbm9TcE5hbWUNcHV0IChjaGFyIDUgdG8gOCBv ZiB0aGlzS2V5ID0gImVudW0iKSBpbnRvIGlzRW51bQ1wdXQgImlmIHggPSAiICYgcXVv dGUgJiB0aGlzTmFtZSAmIHF1b3RlIGFmdGVyIHJzdA1pZiB0aGlzTmFtZSA8PiBub1Nw TmFtZSB0aGVuDXB1dCAiIG9yIHggPSAiICYgcXVvdGUgJiBub1NwTmFtZSAmIHF1b3Rl IGFmdGVyIHJzdA1lbmQgaWYNaWYgaXNFbnVtIGFuZCAoaXRlbSAyIG9mIHggPD4gbm9T cE5hbWUpIHRoZW4NcHV0ICIgb3IgeCA9ICIgJiBxdW90ZSAmIGl0ZW0gMiBvZiB4ICYg cXVvdGUgYWZ0ZXIgcnN0DWVuZCBpZg1wdXQgIiB0aGVuIiAmIHJldHVybiBhZnRlciBy c3QNcHV0ICIgICAgICBwdXQgcXVvdGUgJiAiICYgcXVvdGUgJiB0aGlzS2V5ICYgcXVv dGUgJiAiICYgcXVvdGUgJiAiICYgcXVvdGUgJiAiLCIgJiBxdW90ZSAmICIgYWZ0ZXIg c3RtdCIgJiByZXR1cm4gYWZ0ZXIgcnN0DWlmIGlzRW51bSB0aGVuDXB1dCB0cnVlIGlu dG8gaGFzRW51bQ1wdXQgRW51bUxpbmVzKDMsIGl0ZW0gMyBvZiB4LCAieCIsIGZhbHNl KSBpbnRvIHRlbXANaWYgdGVtcCA8PiAiIiB0aGVuDXB1dCAiICAgICAgcHV0IHBhcmFt KGkrMSkgaW50byB4IiAmIHJldHVybiBhZnRlciByc3QNcHV0IHRlbXAgYWZ0ZXIgcnN0 DWVuZCBpZg1lbmQgaWYNZW5kIGlmDWVuZCByZXBlYXQNcHV0ICIgICAgZWxzZSIgJiBy ZXR1cm4gYWZ0ZXIgcnN0DXB1dCAiICAgICAgcHV0ICIgJiBxdW90ZSAmICJQYXJhbSgi ICYgcXVvdGUgJiAiICYgaSAmICIgJiBxdW90ZSAmICIpLCIgJiBxdW90ZSAmICIgYWZ0 ZXIgc3RtdCIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCAiICAgIGVuZCBpZiIgJiByZXR1 cm4gYWZ0ZXIgcnN0DWlmIGhhc0VudW0gdGhlbg1wdXQgIiAgICBpZiBsYXN0IGNoYXIg b2Ygc3RtdCA9ICIgJiBxdW90ZSAmICIsIiAmIHF1b3RlICYgIiB0aGVuIiAmIHJldHVy biBhZnRlciByc3QNcHV0ICIgICAgICBwdXQgIiAmIHF1b3RlICYgIlBhcmFtKCIgJiBx dW90ZSAmICIgJiBpKzEgJiAiICYgcXVvdGUgJiAiKSIgJiBxdW90ZSAmICIgYWZ0ZXIg c3RtdCIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCAiICAgIGVuZCBpZiIgJiByZXR1cm4g YWZ0ZXIgcnN0DWVsc2UNcHV0ICIgICAgcHV0ICIgJiBxdW90ZSAmICJQYXJhbSgiICYg cXVvdGUgJiAiICYgaSsxICYgIiAmIHF1b3RlICYgIikiICYgcXVvdGUgJiAiIGFmdGVy IHN0bXQiICYgcmV0dXJuIGFmdGVyIHJzdA1lbmQgaWYNcHV0ICIgICAgYWRkIDIgdG8g aSIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCAiICBlbmQgcmVwZWF0IiAmIHJldHVybiBh ZnRlciByc3QNZW5kIGlmDXB1dCAiICBkbyBzdG10IiAmIHJldHVybiBhZnRlciByc3QN ZWxzZSAtLSBhbGwgYXJlIHJlcXVpcmVkDXB1dCBoZWFkZXIgJiByZXR1cm4gYmVmb3Jl IHJzdA1wdXQgc2hvcnRIZWFkZXIgJiByZXR1cm4gYWZ0ZXIgcnN0DWVuZCBpZg1pZiBp c0Z1bmMgdGhlbg1wdXQgIiAgcmV0dXJuIGl0IiAmIHJldHVybiBhZnRlciByc3QNZW5k IGlmDXB1dCAiRW5kICIgJiBFdmVudE5hbWUgJiByZXR1cm4gJiByZXR1cm4gYWZ0ZXIg cnN0DXJldHVybiByc3QNZWxzZSBpZiBjYXJkVHlwZSA9ICJjbGFzcyIgdGhlbg1wdXQg ZmllbGQgY2xhc3NJRCAmICIsIiAmIGZpZWxkICJjbGFzc05hbWUiICYgcmV0dXJuIGFm dGVyIGNsYXNzTmFtZUxpc3QNcHV0IGZpZWxkICJlbGVtZW50cyIgaW50byB4DXB1dCBu dW1iZXIgb2YgbGluZXMgaW4geCBpbnRvIGVsZW1lbnRDb3VudA0tLSB3ZSB3YW50IGEg dW5pcXVlIGxpc3Qgb2YgY2xhc3MgLSBpbmRleCBmb3JtIHBhaXINcmVwZWF0IHdpdGgg ZWxlbWVudEluZGV4ID0gMSB0byBlbGVtZW50Q291bnQNcHV0IGxpbmUgZWxlbWVudElu ZGV4IG9mIHggaW50byB0aGlzTGluZQ1wdXQgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXNM aW5lIGludG8gaUNvdW50DXJlcGVhdCB3aXRoIGkgPSAyIHRvIGlDb3VudA1wdXQgaXRl bSAxIG9mIHRoaXNMaW5lICYgIiwiICYgaXRlbSBpIG9mIHRoaXNMaW5lIGludG8gdGhp c0Zvcm0NcHV0IG51bWJlciBvZiBsaW5lcyBpbiBlbGVtZW50TGlzdCBpbnRvIGpDb3Vu dA1yZXBlYXQgd2l0aCBqID0gMSB0byBqQ291bnQNaWYgdGhpc0Zvcm0gPSBsaW5lIGog b2YgZWxlbWVudExpc3QgdGhlbg1kZWxldGUgbGluZSBqIG9mIGVsZW1lbnRMaXN0DWVu ZCBpZg1lbmQgcmVwZWF0DXB1dCB0aGlzRm9ybSAmIHJldHVybiBhZnRlciBlbGVtZW50 TGlzdA1lbmQgcmVwZWF0DWVuZCByZXBlYXQNcmV0dXJuICIiDWVsc2UgaWYgY2FyZFR5 cGUgPSAic3VpdGVFbmQiIHRoZW4NLS0gd2UgY3JlYXRlIHRoZSBnbHVlIHJvdXRpbmUg Zm9yIHRoZSBvYmplY3Qgc3BlY2lmaWVycw1wdXQgbnVtYmVyIG9mIGxpbmVzIGluIGVs ZW1lbnRMaXN0IGludG8gZWxlbWVudENvdW50DXB1dCBudW1iZXIgb2YgbGluZXMgaW4g bmFtaW5nRm9ybUxpc3QgaW50byBuYW1lQ291bnQNcHV0IG51bWJlciBvZiBsaW5lcyBp biBjbGFzc05hbWVMaXN0IGludG8gY2xhc3NDb3VudA1yZXBlYXQgd2l0aCBpID0gMSB0 byBlbGVtZW50Q291bnQNcHV0IGxpbmUgaSBvZiBlbGVtZW50TGlzdCBpbnRvIHgNcHV0 IGl0ZW0gMSBvZiB4IGludG8gY2xhc3NJRA1wdXQgaXRlbSAyIG9mIHggaW50byBuYW1l Rm9ybQ0tLSB3ZSBsb29rIGZvciB0aGUgbmFtaW5nIGZvcm0gbmFtZQ1yZXBlYXQgd2l0 aCBqID0gMSB0byBuYW1lQ291bnQNaWYgbmFtZUZvcm0gPSBpdGVtIDIgb2YgbGluZSBq IG9mIG5hbWluZ0Zvcm1MaXN0IHRoZW4NLS0gd2UgbG9vayBmb3IgdGhlIGNsYXNzIG5h bWUNcmVwZWF0IHdpdGggayA9IDEgdG8gY2xhc3NDb3VudA1pZiBjbGFzc0lEID0gaXRl bSAxIG9mIGxpbmUgayBvZiBjbGFzc05hbWVMaXN0IHRoZW4NcHV0IGl0ZW0gMiBvZiBs aW5lIGsgb2YgY2xhc3NOYW1lTGlzdCAmIGl0ZW0gMSBvZiBsaW5lIGogb2YgbmFtaW5n Rm9ybUxpc3QgaW50byB0aGlzTmFtZQ1wdXQgImZ1bmN0aW9uICIgJiB0aGlzTmFtZSAm ICIsZGF0YSxjb250YWluZXIiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgIiAgcmV0dXJu IE9ialNwZWMgKCIgJiBxdW90ZSAmIFJlc1R5cGUoaXRlbSAxIG9mIHgpICYgcXVvdGUg JiAiLCAiIGFmdGVyIHJzdA1wdXQgcXVvdGUgJiBSZXNUeXBlKGl0ZW0gMiBvZiBsaW5l IGogb2YgbmFtaW5nRm9ybUxpc3QpICYgcXVvdGUgJiAiLCBkYXRhLCBjb250YWluZXIp IiAmIHJldHVybiBhZnRlciByc3QNcHV0ICJlbmQgIiAmIHRoaXNOYW1lICYgcmV0dXJu ICYgcmV0dXJuIGFmdGVyIHJzdA1lbmQgaWYNZW5kIHJlcGVhdA1lbmQgaWYNZW5kIHJl cGVhdA1lbmQgcmVwZWF0DXJldHVybiByc3QNZWxzZQ1yZXR1cm4gIiINZW5kIGlmDWVs c2UNaWYgY2FyZFR5cGUgPSAiZXZlbnQiIHRoZW4NcmV0dXJuIENsaWVudFRlbXBsYXRl KCkgJiByZXR1cm4gJiByZXR1cm4NZWxzZQ1yZXR1cm4gIiINZW5kIGlmDWVuZCBpZg1l bmQgQ2xpZW50U2FtcGxlDQ1mdW5jdGlvbiBFbnVtTGluZXMgaW5kZW50LCBlbnVtQ29k ZSwgdmFyTmFtZSwgd3JpdGVUb1Zhcg1yZXBlYXQgaW5kZW50IHRpbWVzDXB1dCAiICAi IGFmdGVyIGluZGVudFNwYWNlDWVuZCByZXBlYXQNcHV0ICIiIGludG8gcnN0DXB1dCAi ZW51bWVyYXRpb24iICYmIGVudW1Db2RlIGludG8geA1pZiB0aGVyZSBpcyBhIGNhcmQg eCB0aGVuDXB1dCBmaWVsZCAiZW51bUluZm8iIG9mIGNhcmQgeCBpbnRvIHgNcHV0IG51 bWJlciBvZiBsaW5lcyBpbiB4IGludG8gbg1pZiBuID4gMCB0aGVuDS0tIG5vdyB3ZSBn byB0aHJvdWdoIHRoZSBlbnVtIGxpc3QgYW5kIGNoZWNrIGVhY2ggb25lDXJlcGVhdCB3 aXRoIGkgPSAxIHRvIG4NaWYgaSA9IDEgdGhlbg1wdXQgaW5kZW50U3BhY2UgJiAiaWYi IGFmdGVyIHJzdA1lbHNlDXB1dCBpbmRlbnRTcGFjZSAmICJlbHNlIGlmIiBhZnRlciBy c3QNZW5kIGlmDXB1dCBzcGFjZSAmIHZhck5hbWUgJiAiID0gIiAmIHF1b3RlICYgaXRl bSAxIG9mIGxpbmUgaSBvZiB4ICYgcXVvdGUgJiAiIHRoZW4iICYgcmV0dXJuIGFmdGVy IHJzdA1pZiB3cml0ZVRvVmFyIHRoZW4NcHV0IGluZGVudFNwYWNlICYgIiAgcHV0ICIg JiBxdW90ZSAmIFJlc1R5cGUoaXRlbSAyIG9mIGxpbmUgaSBvZiB4KSAmIHF1b3RlICYg IiBpbnRvICIgJiB2YXJOYW1lICYgcmV0dXJuIGFmdGVyIHJzdA1lbHNlDXB1dCBpbmRl bnRTcGFjZSAmICIgIHB1dCBxdW90ZSAmICIgJiBxdW90ZSAmIFJlc1R5cGUoaXRlbSAy IG9mIGxpbmUgaSBvZiB4KSAmIHF1b3RlICYgIiAmIHF1b3RlIGFmdGVyIHN0bXQiICYg cmV0dXJuIGFmdGVyIHJzdA1lbmQgaWYNZW5kIHJlcGVhdA1wdXQgaW5kZW50U3BhY2Ug JiAiZW5kIGlmIiAmIHJldHVybiBhZnRlciByc3QNZW5kIGlmIC0tIGlmIG4gPiAwDWVu ZCBpZiAtLSBpZiBjYXJkIGV4aXN0cw1yZXR1cm4gcnN0DWVuZCBFbnVtTGluZXMNDQAL 8AAHAQABIwACATMAWoAGAAAAAAABAAAADAAAABBNUFcgU2hlbGwAAG9uIE1vdXNlV2l0 aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIHNob3cgdGhlIGV2ZW50IGFzIGl0 IGlzIGNhbGxlZCBmcm9tIHRoZSBNUFcgU2hlbGwgTGFuZ3VhZ2UgdXNpbmcgdGhlIFNl bmRBRSBjb21tYW5kLiINZW5kIE1vdXNlV2l0aGluDQ1mdW5jdGlvbiBDbGllbnRUZW1w bGF0ZSBtdWx0aUxpbmUNZ2xvYmFsIGNsaWVudEhhc0dsdWUNcHV0IHNwYWNlICYgTnVt VG9DaGFyKDE5NCkgJiByZXR1cm4gJiBzcGFjZSBpbnRvIGNvbnRDaGFyDWlmIGNsaWVu dEhhc0dsdWUgdGhlbg1wdXQgIkFFIiAmIFN0cmlwU1AoZmllbGQgImV2ZW50TmFtZSIp IGludG8gdGVtcGxhdGUNZWxzZQ1wdXQgInNlbmRBRSAtZSAnIiAmIFJlc1R5cGUoZmll bGQgImV2ZW50Q2xhc3MiKSAmIFJlc1R5cGUoZmllbGQgImV2ZW50SUQiKSAmICInIiBp bnRvIHRlbXBsYXRlDWVuZCBpZg1wdXQgZmllbGQgInBhcmFtSW5mbyIgaW50byB4DS0t IGlmIGlzIGZ1bmN0aW9uIHRoZW4gV2FpdFJlcGx5IGVsc2Ugbm9SZXBseQ1pZiBpdGVt IDMgb2YgbGluZSAxIG9mIHggPSAibnVsbCIgdGhlbg1wdXQgIiAtbSAxIiBhZnRlciB0 ZW1wbGF0ZQ1lbHNlDXB1dCAiIC1tIDMiIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1wdXQg bnVtYmVyIG9mIGxpbmVzIGluIHggaW50byBuDXB1dCAwIGludG8gcGFyYW1JbmRleA1y ZXBlYXQgd2l0aCBpbmRleCA9IDIgdG8gbg1zZXQgY3Vyc29yIHRvIGJ1c3kNcHV0IGxp bmUgaW5kZXggb2YgeCBpbnRvIHkNcHV0IGl0ZW0gNCBvZiB5IGludG8gdGVtcA1wdXQg KHRlbXAgPiAzMjc2NykgaW50byBpc09wdGlvbmFsDXB1dCB0ZW1wIGRpdiA4MTkyIGlu dG8gdGVtcA1wdXQgKHRlbXAgbW9kIDIgPSAxKSBpbnRvIGlzRW51bQ1wdXQgIiIgaW50 byBlbnVtZXJhdGVkDXB1dCB0cnVlIGludG8gdXNlSXQNaWYgaW5kZXggPSAyIHRoZW4N aWYgaXRlbSAzIG9mIHkgPSAibnVsbCIgdGhlbiBwdXQgZmFsc2UgaW50byB1c2VJdA1w dXQgZGlyZWN0UGFyYW0gaW50byBpdGVtIDEgb2YgeQ1pZiAobm90IGNsaWVudEhhc0ds dWUgb3IgaXNPcHRpb25hbCkgdGhlbg1wdXQgIi0tLS0iIGludG8gaXRlbSAyIG9mIHkN ZW5kIGlmDWVuZCBpZg1pZiB1c2VJdCB0aGVuDWFkZCAxIHRvIHBhcmFtSW5kZXgNaWYg dXNlSXQgdGhlbg1pZiBtdWx0aUxpbmUgPSAibXVsdGlMaW5lIiB0aGVuDXB1dCBjb250 Q2hhciBhZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1l bmQgaWYNaWYgaXNPcHRpb25hbCB0aGVuDXB1dCAiWyIgYWZ0ZXIgdGVtcGxhdGUNZW5k IGlmDWlmIGlzRW51bSB0aGVuDXB1dCBNUFdLZXkoaXRlbSAyIG9mIHksImVudW0iKSBh ZnRlciB0ZW1wbGF0ZQ1wdXQgc3BhY2UgJiBFbnVtT3B0aW9uKGZpZWxkICJTdWl0ZUNv ZGUiLGl0ZW0gMyBvZiB5LGVudW1lcmF0ZWQsMikgYWZ0ZXIgdGVtcGxhdGUNZWxzZQ1w dXQgTVBXS2V5KGl0ZW0gMiBvZiB5LGl0ZW0gMyBvZiB5KSBhZnRlciB0ZW1wbGF0ZQ1w dXQgc3BhY2UgJiBTdHJpcFNQKGl0ZW0gMSBvZiB5KSBhZnRlciB0ZW1wbGF0ZQ1lbmQg aWYNaWYgaXNPcHRpb25hbCB0aGVuDXB1dCAiXSIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlm DWVuZCBpZg1lbmQgaWYNZW5kIHJlcGVhdA1yZXR1cm4gdGVtcGxhdGUNZW5kIENsaWVu dFRlbXBsYXRlDQ1mdW5jdGlvbiBNUFdLZXkga2V5LGRhdGFUeXBlDWlmIGtleSA9ICIi IHRoZW4NcmV0dXJuICIiDWVsc2UNcHV0IFJlc1R5cGUoa2V5KSBpbnRvIHgNaWYgKGRh dGFUeXBlIDw+ICJsaXN0IikgYW5kIChkYXRhVHlwZSA8PiAib2JqIikgdGhlbg1wdXQg UmVzVHlwZShkYXRhVHlwZSkgYWZ0ZXIgeA1lbmQgaWYNaWYgb2Zmc2V0KHNwYWNlLCB4 KSA+IDAgdGhlbg1wdXQgIiciICYgeCAmICInIiBpbnRvIHgNZW5kIGlmDXJldHVybiAi LSIgJiB4DWVuZCBpZg1lbmQgTVBXS2V5DQ1mdW5jdGlvbiBDbGllbnRTYW1wbGUgY2Fy ZFR5cGUNZ2xvYmFsIGNsaWVudEhhc0dsdWUNaWYgY2xpZW50SGFzR2x1ZSBhbmQgKGNh cmRUeXBlID0gImV2ZW50IikgdGhlbg1wdXQgImFsaWFzIEFFIiAmIFN0cmlwU1AoZmll bGQgImV2ZW50TmFtZSIpIMINJiYgIlNlbmRBRSAtZSAnIiAmIFJlc1R5cGUoZmllbGQg ImV2ZW50Q2xhc3MiKSDCDSYgUmVzVHlwZSAoZmllbGQgImV2ZW50SUQiKSAmICInIiBp bnRvIHJzdA1nZXQgY2FyZCBmaWVsZCAic2VuZFRhcmdldCIgb2YgY2FyZCAiUHJlZmVy ZW5jZSINaWYgaXQgPD4gIiIgdGhlbg1wdXQgIiAtdCAnIiAmIGl0ICYgIiciIGFmdGVy IHJzdA1lbmQgaWYNaWYgKGl0ZW0gMyBvZiBmaWVsZCAicGFyYW1JbmZvIiA8PiAibnVs bCIpIHRoZW4NcHV0ICIgLW0gMyIgYWZ0ZXIgcnN0DWVsc2UNcHV0ICIgLW0gMSIgYWZ0 ZXIgcnN0DWVuZCBpZg1wdXQgbGluZSAyIG9mIGZpZWxkICJwYXJhbUluZm8iIGludG8g eQ1wdXQgaXRlbSA0IG9mIHkgaW50byB0ZW1wDWlmICh0ZW1wIDw9IDMyNzY3KSBhbmQg KGl0ZW0gMyBvZiB5IDw+ICJudWxsIikgdGhlbg0tLSB3ZSBoYXZlIGEgcmVxdWlyZWQg ZGlyZWN0IHBhcmFtZXRlcg1wdXQgdGVtcCBkaXYgODE5MiBpbnRvIHRlbXANaWYgKHRl bXAgbW9kIDIgPSAxKSB0aGVuDXB1dCAiZW51bSIgaW50byB0aGlzVHlwZQ1lbHNlDXB1 dCBSZXNUeXBlKGl0ZW0gMyBvZiB5KSBpbnRvIHRoaXNUeXBlDWVuZCBpZg1pZiAodGhp c1R5cGUgPSAib2JqICIpIG9yICh0aGlzVHlwZSA9ICJsaXN0IikgdGhlbg1wdXQgIiAt LS0tLSIgYWZ0ZXIgcnN0DWVsc2UgaWYgY2hhciA0IG9mIHRoaXNUeXBlID0gc3BhY2Ug dGhlbg1wdXQgIiAtLS0tLSciICYgdGhpc1R5cGUgJiAiJyIgYWZ0ZXIgcnN0DWVsc2UN cHV0ICIgLS0tLS0iICYgdGhpc1R5cGUgYWZ0ZXIgcnN0DWVuZCBpZg1lbmQgaWYNcmV0 dXJuIHJzdCAmIHJldHVybiAmIHJldHVybg1lbHNlDWlmIGNhcmRUeXBlID0gZXZlbnQg dGhlbg1yZXR1cm4gQ2xpZW50VGVtcGxhdGUoKSAmIHJldHVybiAmIHJldHVybg1lbHNl DXJldHVybiAiIg1lbmQgaWYNZW5kIGlmDWVuZCBDbGllbnRTYW1wbGUNDQ0AAADSAAgB AADyAR8BBQHhoAUAAAAAAAEAAAAMAAAAEFNvcnQgRXZlbnRzIGJ5IE5hbWUAAG9uIE1v dXNlV2l0aGluDVNob3dCYWxsb29uICJDbGlja2luZyBoZXJlIGluZGljYXRlcyB3aGV0 aGVyIGV2ZW50cyBiZSBpbiB0aGUgYWN0dWFsIG9yZGVyIG9yIGluIGFscGhhYmV0aWNh bCBvcmRlciB3aGVuIGltcG9ydGluZyBhbiAnYWV0ZScuIg1lbmQgTW91c2VXaXRoaW4N AAI0AAkBgAE6AAMBTQBzoAUAAAAAAAEAAAAMAAAAEFNjcmlwdCBXcml0aW5nAABvbiBt b3VzZVVwDWlmIGhpbGl0ZSBvZiBjYXJkIGJ1dHRvbiBpZCA5IHRoZW4NcHV0ICJTY3Jp cHQiIGludG8gdGhpc1ZlcmINZWxzZQ1wdXQgIlNlbmQiIGludG8gdGhpc1ZlcmINZW5k IGlmDWdldCBzaG9ydCBuYW1lIG9mIGNhcmQgYnV0dG9uIGlkIDQxIG9mIGNhcmQgIlNl bmRBRSINcHV0IHRoaXNWZXJiIGludG8gZmlyc3Qgd29yZCBvZiBpdA1zZXQgbmFtZSBv ZiBjYXJkIGJ1dHRvbiBpZCA0MSBvZiBjYXJkICJTZW5kQUUiIHRvIGl0DWdldCBzaG9y dCBuYW1lIG9mIGJrZ25kIGJ1dHRvbiBpZCA0NyBvZiBjYXJkIDEgb2YgYmtnbmQgIkV2 ZW50cyINcHV0IHRoaXNWZXJiIGludG8gZmlyc3Qgd29yZCBvZiBpdA1zZXQgbmFtZSBv ZiBia2duZCBidXR0b24gaWQgNDcgb2YgY2FyZCAxIG9mIGJrZ25kICJFdmVudHMiIHRv IGl0DS0tcHV0IHRoaXNWZXJiIGludG8gd29yZCAxIG9mIHRoZSBuYW1lIG9mIGJrZ25k IGJ1dHRvbiBpZCA0NyBvZiBjYXJkIDEgb2YgYmtnbmQgIkV2ZW50cyINZW5kIG1vdXNl VXAAAAF0AAoBAAEaAJ8BLQD6gAYAAAAAAAEAAAAMAAAAEEFzc2VtYmxlcgAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gaW5kaWNhdGUgdGhhdCB0 aGUgY29uc3RhbnQgbmFtZXMgd2lsbCBiZSBpbiBhc3NlbWJsZXIuIg1lbmQgTW91c2VX aXRoaW4NDWZ1bmN0aW9uIFNlcnZlclNhbXBsZSBjYXJkVHlwZQ1yZXR1cm4gIiINZW5k IFNlcnZlclNhbXBsZQ0NZnVuY3Rpb24gU2VydmVyQ29uc3QgbmFtZSxjb25zdCxjb21t ZW50T3V0DXB1dCBuYW1lICYgIiBFUVUgIiAmIGNvbnN0IGludG8geA1pZiBjb21tZW50 T3V0ID0gInRydWUiIHRoZW4NcHV0ICI7ICIgYmVmb3JlIHgNZW5kIGlmDXJldHVybiB4 DWVuZCBTZXJ2ZXJDb25zdA0NAACUAAsCBQBoALYAeQElAAAAAAAA//8AFQAMAQAAEAAA b24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSB0aW1lb3V0IHZhbHVl IHRvIGJlIHVzZWQgaW4gUEFTQ0FMIGNsaWVudCBzYW1wbGUgY29kZSBoZXJlLiINZW5k IE1vdXNlV2l0aGluDQA17AANAQABMwACAUMAQoAGAAAAAAABAAAADAAAABBQYXNjYWwA AG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIHNob3cgdGhl IGV2ZW50IGFzIGl0IGlzIGNhbGxlZCBmcm9tIFBBU0NBTC4iDWVuZCBNb3VzZVdpdGhp bg0NZnVuY3Rpb24gQ2xpZW50VGVtcGxhdGUgbXVsdGlMaW5lDS0tIGVpdGhlciByZXR1 cm4gdGhlIHRlbXBsYXRlIG9yIHdoaWNoIHBhcmFtZXRlciBpcyBiZWluZyBjbGlja2Vk DXB1dCBHbHVlSW5mbyhmaWVsZCAicGFyYW1JbmZvIikgaW50byBwYXJhbUluZm8NcHV0 ICJGdW5jdGlvbiBBRSIgJiBTdHJpcFNQKGZpZWxkICJldmVudE5hbWUiKSAmICIoIiBp bnRvIHRlbXBsYXRlDXB1dCBudW1iZXIgb2YgbGluZXMgaW4gcGFyYW1JbmZvIGludG8g bg1wdXQgMCBpbnRvIHBhcmFtSW5kZXgNcmVwZWF0IHdpdGggaW5kZXggPSAxIHRvIG4N c2V0IGN1cnNvciB0byBidXN5DXB1dCBsaW5lIGluZGV4IG9mIHBhcmFtSW5mbyBpbnRv IHkNcHV0IGl0ZW0gNCBvZiB5IGludG8gcGFyYW1UeXBlDXB1dCAoaXRlbSA1IG9mIHkg PSAibyIpIGludG8gaXNPcHRpb25hbA1wdXQgKGl0ZW0gMyBvZiB5IDw+ICJudWxsIikg aW50byB1c2VJdA1pZiB1c2VJdCB0aGVuDWFkZCAxIHRvIHBhcmFtSW5kZXgNaWYgdXNl SXQgdGhlbg1pZiBpbmRleCA9IDEgdGhlbg1wdXQgIlZBUiAiIGFmdGVyIHRlbXBsYXRl DXB1dCBmYWxzZSBpbnRvIGlzT3B0aW9uYWwNZWxzZQ1pZiBtdWx0aUxpbmUgPSAibXVs dGlMaW5lIiB0aGVuDXB1dCByZXR1cm4gJiBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbHNl DXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZW5kIGlmDXB1dCBOYW1lT2ZE YXRhVHlwZShpdGVtIDMgb2YgeSkgaW50byBuYW1lTGlzdA1pZiBwYXJhbVR5cGUgPSAx IHRoZW4gLS0gaGFuZGxlDXB1dCBpdGVtIDEgb2YgeSAmICI6IiAmIGl0ZW0gMyBvZiBu YW1lTGlzdCAmICI7ICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSBpZiBwYXJhbVR5cGUgPSA1 IHRoZW4gLS0gcHRyICsgc2l6ZQ1wdXQgaXRlbSA2IG9mIHkgJiAiOiIgJiBpdGVtIDIg b2YgbmFtZUxpc3QgJiAiOyAiIMINJiBpdGVtIDcgb2YgeSAmICI6IExPTkdJTlQ7ICIg YWZ0ZXIgdGVtcGxhdGUNZWxzZSBpZiBwYXJhbVR5cGUgPSA3IHRoZW4gLS0gY1N0cmlu Zw1wdXQgaXRlbSA2IG9mIHkgJiAiOiIgJiBpdGVtIDIgb2YgbmFtZUxpc3QgJiAiOyAi IGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgaXNPcHRpb25hbCB0aGVuIC0tIHVzZSBwb2lu dGVyIHRvIGRhdGENaWYgcGFyYW1UeXBlID0gNCB0aGVuIC0tIGZpeGVkIGxlbmd0aA1w dXQgaXRlbSAzIG9mIHkgaW50byBkYXRhVHlwZQ1pZiBkYXRhVHlwZSA9ICJlbnVtIiB0 aGVuIC0tIHNwZWNpYWwgZm9yIGVudW0NcHV0IGl0ZW0gMSBvZiB5ICYgIjpSZXNUeXBl OyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgZGF0YVR5cGUgPSAidHJ1ZSIgdGhlbiAt LSBhbHNvIHNwZWNpYWwgZm9yIHRydWUNcHV0IGl0ZW0gMSBvZiB5ICYgIjpCb29sZWFu OyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UNcHV0IGl0ZW0gNiBvZiB5ICYgIjoiICYgaXRl bSAyIG9mIG5hbWVMaXN0ICYgIjsgIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZWxzZQ1w dXQgaXRlbSA2IG9mIHkgJiAiOiIgYWZ0ZXIgdGVtcGxhdGUNaWYgKHBhcmFtVHlwZSA9 IDApIHRoZW4NcHV0ICJBRURlc2NQdHI7ICIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSAtLSA2 LCBQU3RyaW5nDXB1dCAiU3RyaW5nUHRyOyAiIGFmdGVyIHRlbXBsYXRlDWVuZCBpZg1l bmQgaWYNZWxzZSAtLSByZXF1aXJlZA1wdXQgaXRlbSAxIG9mIHkgJiAiOiIgYWZ0ZXIg dGVtcGxhdGUNaWYgKHBhcmFtVHlwZSA9IDApIHRoZW4gLS0gQUVEZXNjDXB1dCAiQUVE ZXNjOyAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgcGFyYW1UeXBlID0gNCB0aGVuIC0t IGZpeGVkIGxlbmd0aA1wdXQgaXRlbSAxIG9mIG5hbWVMaXN0ICYgIjsgIiBhZnRlciB0 ZW1wbGF0ZQ1lbHNlIC0tIHN0cjI1NQ1wdXQgIlN0cjI1NTsgIiBhZnRlciB0ZW1wbGF0 ZQ1lbmQgaWYNZW5kIGlmDWVuZCBpZiAtLSB1c2VJdA1lbmQgaWYgLS0gdXNlSXQNZW5k IHJlcGVhdA1EZWxldGUgbGFzdCBjaGFyIG9mIHRlbXBsYXRlIC0tIHNwYWNlIG9yICgN aWYgcGFyYW1JbmRleCA+IDAgdGhlbg1wdXQgIikiIGludG8gbGFzdCBjaGFyIG9mIHRl bXBsYXRlIC0tIHJlcGxhY2UgOw1lbmQgaWYNcHV0ICI6T1NFcnI7IiBhZnRlciB0ZW1w bGF0ZQ1yZXR1cm4gdGVtcGxhdGUNZW5kIENsaWVudFRlbXBsYXRlDQ1mdW5jdGlvbiBD bGllbnRTYW1wbGUgY2FyZFR5cGUNZ2xvYmFsIGRlZmF1bHRUYXJnZXREZXNjLCBkZWZh dWx0VGltZU91dCwgZGVmYXVsdElkbGVQcm9jLCBkZWZhdWx0QUVGaWx0ZXIsIGRlZmF1 bHRTZW5kTW9kZSwgZGVmYXVsdFRhcmdldA1pZiBjYXJkVHlwZSA9ICJpbml0IiB0aGVu DXB1dCAiUFJPQ0VEVVJFIElnbm9yZU9TRXJyKGVycjpPU0Vycik7IElOTElORSAkNTQ4 RjsgeyBhZGRxICMyLHNwIH0gIiAmIHJldHVybiAmIHJldHVybiBpbnRvIHJzdA1pZiBk ZWZhdWx0VGFyZ2V0RGVzYyBpcyBlbXB0eSBvciBkZWZhdWx0VGFyZ2V0RGVzYyA9ICJz ZWxmIiB0aGVuDWlmIGRlZmF1bHRUYXJnZXREZXNjIGlzIGVtcHR5IHRoZW4NcHV0ICJ0 YXJnZXREZXNjIiBpbnRvIGRlZmF1bHRUYXJnZXREZXNjDWVuZCBpZg1wdXQgIlBST0NF RFVSRSBUYXJnZXRJbml0OyIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCBUYWIgJiBUYWIg aW50byB0d29UYWINcHV0IFRhYiAmIHR3b1RhYiBpbnRvIHRocmVlVGFiDXB1dCBUYWIg JiB0aHJlZVRhYiBpbnRvIGZvdXJUYWINaWYgZGVmYXVsdFRhcmdldCA9ICJzZWxmIiB0 aGVuDS0tIHNlbmQgdG8gc2VsZg1wdXQgVGFiICYgIlZBUiBteVBTTjogUHJvY2Vzc1Nl cmlhbE51bWJlcjsiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgVGFiICYgIkJFR0lOIiAm IHJldHVybiBhZnRlciByc3QNcHV0IFRhYiAmICJXSVRIIG15UFNOIERPIiAmIHJldHVy biBhZnRlciByc3QNcHV0IHR3b1RhYiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIgcnN0 DXB1dCB0d29UYWIgJiAiaGlnaExvbmdPZlBTTiA6PSAwOyIgJiByZXR1cm4gYWZ0ZXIg cnN0DXB1dCB0d29UYWIgJiAibG93TG9uZ09mUFNOIDo9IGtDdXJyZW50UHJvY2Vzczsi ICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgdHdvVGFiICYgIkVORDsiICYgcmV0dXJuIGFm dGVyIHJzdA1wdXQgVGFiICYgIklnbm9yZU9TRXJyKEFFQ3JlYXRlRGVzYyhUeXBlUHJv Y2Vzc1NlcmlhbE51bWJlciwgQG15UFNOLCBTaXplT2YoUHJvY2Vzc1NlcmlhbE51bWJl ciksIHRhcmdldERlc2MpKTsiICYgcmV0dXJuIGFmdGVyIHJzdA1lbHNlIGlmIGRlZmF1 bHRUYXJnZXQgPD4gIiIgdGhlbg0tLSBzZW5kIHRvIHRhcmdldCBuYW1lDXB1dCBUYWIg JiAiVkFSIHRhcmdldE5hbWU6IFN0cjI1NTsiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQg VGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciByc3QNcHV0IFRhYiAmICJ0YXJnZXRO YW1lIDo9ICciICYgZGVmYXVsdFRhcmdldCAmICInOyIgJiByZXR1cm4gYWZ0ZXIgcnN0 DXB1dCBUYWIgJiAiSWdub3JlT1NFcnIoQUVDb2VyY2VQdHIoVHlwZUNoYXIsIEB0YXJn ZXROYW1lWzFdLCAiICYgTGVuZ3RoKGRlZmF1bHRUYXJnZXQpICYgIiwgdHlwZVRhcmdl dElELCB0YXJnZXREZXNjKSk7IiAmIHJldHVybiBhZnRlciByc3QNZWxzZQ0tLSB1c2Ug UFBDIEJyb3dzZXINcHV0IFRhYiAmICJWQVIiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQg dHdvVGFiICYgInRoZUxvY2F0aW9uOiBMb2NhdGlvbk5hbWVSZWM7IiAmIHJldHVybiBh ZnRlciByc3QNcHV0IHR3b1RhYiAmICJ0aGVQb3J0SW5mbzogUG9ydEluZm9SZWM7IiAm IHJldHVybiBhZnRlciByc3QNcHV0IHR3b1RhYiAmICJhVGFyZ2V0SUQ6IFRhcmdldElE OyIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCBUYWIgJiAiQkVHSU4iICYgcmV0dXJuIGFm dGVyIHJzdA1wdXQgVGFiICYgIklGIFBQQ0Jyb3dzZXIoJycsICcnLCBGQUxTRSwgdGhl TG9jYXRpb24sIHRoZVBvcnRJbmZvLCBOSUwsICcnKSA9IE5vRXJyIFRIRU4iICYgcmV0 dXJuIGFmdGVyIHJzdA1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBy c3QNcHV0IHR3b1RhYiAmICJXSVRIIGFUYXJnZXRJRCBETyIgJiByZXR1cm4gYWZ0ZXIg cnN0DXB1dCB0aHJlZVRhYiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCB0 aHJlZVRhYiAmICJsb2NhdGlvbiA6PSB0aGVMb2NhdGlvbjsiICYgcmV0dXJuIGFmdGVy IHJzdA1wdXQgdGhyZWVUYWIgJiAibmFtZSA6PSB0aGVQb3J0SW5mby5uYW1lOyIgJiBy ZXR1cm4gYWZ0ZXIgcnN0DXB1dCB0aHJlZVRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRl ciByc3QNcHV0IHR3b1RhYiAmICJJZ25vcmVPU0VycihBRUNyZWF0ZURlc2ModHlwZVRh cmdldElELCBAYVRhcmdldElELCBTaXplT2YodGFyZ2V0SUQpLCB0YXJnZXREZXNjKSk7 IiAmIHJldHVybiBhZnRlciByc3QNcHV0IHR3b1RhYiAmICJFTkQ7IiAmIHJldHVybiBh ZnRlciByc3QNZW5kIGlmDXB1dCBUYWIgJiAiRU5EOyIgJiByZXR1cm4gJiByZXR1cm4g YWZ0ZXIgcnN0DWVuZCBpZg1pZiBkZWZhdWx0SWRsZVByb2MgaXMgZW1wdHkgdGhlbg1w dXQgIk5JTCIgaW50byBkZWZhdWx0SWRsZVByb2MNZWxzZQ1wdXQgIkAiIGJlZm9yZSBk ZWZhdWx0SWRsZVByb2MNZW5kIGlmDWlmIGRlZmF1bHRBRUZpbHRlciBpcyBlbXB0eSB0 aGVuDXB1dCAiTklMIiBpbnRvIGRlZmF1bHRBRUZpbHRlcg1lbHNlDXB1dCAiQCIgYmVm b3JlIGRlZmF1bHRBRUZpbHRlcg1lbmQgaWYNaWYgZGVmYXVsdFRpbWVPdXQgaXMgZW1w dHkgdGhlbg1wdXQgImtBRURlZmF1bHRUaW1lT3V0IiBpbnRvIGRlZmF1bHRUaW1lT3V0 DWVuZCBpZg1yZXR1cm4gcnN0DWVsc2UgaWYgY2FyZFR5cGUgPSAiZXZlbnQiIHRoZW4N cHV0IENsaWVudFRlbXBsYXRlKCkgJiByZXR1cm4gJiByZXR1cm4gaW50byBwcm9jSGVh ZGVyDXB1dCBHbHVlSW5mbyhmaWVsZCAicGFyYW1JbmZvIikgaW50byBwYXJhbUluZm8N cHV0IG51bWJlciBvZiBsaW5lcyBvZiBwYXJhbUluZm8gaW50byBjb3VudA1wdXQgIkFF IiAmIFN0cmlwU1AoZmllbGQgIkV2ZW50TmFtZSIpIGludG8gcHJvY05hbWUNcHV0IChp dGVtIDMgb2YgcGFyYW1JbmZvIDw+ICJudWxsIikgaW50byBpc0Z1bmMNcHV0IHRhYiAm IHRhYiBpbnRvIHR3b1RhYg1wdXQgdGFiICYgdHdvVGFiIGludG8gdGhyZWVUYWINcHV0 ICJ0aGVBcHBsZUV2ZW50IDogQXBwbGVFdmVudDsiICYgcmV0dXJuIGFmdGVyIHZhckRl Y2xhcmUNcHV0ICJ0aGVSZXBseSA6IEFwcGxlRXZlbnQ7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCBUYWIgJiAiUFJPQ0VEVVJFIENsZWFuVXA7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1wdXQgdHdvVGFiICYgIklnbm9yZU9TRXJyKEFFRGlzcG9zZURlc2ModGhl QXBwbGVFdmVudCkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAm ICJJZ25vcmVPU0VycihBRURpc3Bvc2VEZXNjKHRoZVJlcGx5KSk7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkVORDsiICYgcmV0dXJuICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DXB1dCBUYWIgJiAiUFJPQ0VEVVJFIEZhaWxFcnIoZXJyOk9T RXJyKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiQkVHSU4i ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiSUYgZXJyIDw+IE5P RXJyIFRIRU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0aHJlZVRhYiAmICJC RUdJTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHRocmVlVGFiICYgcHJvY05h bWUgJiAiIDo9IGVycjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0aHJlZVRh YiAmICJDbGVhblVwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHRocmVlVGFi ICYgIkV4aXQoIiAmIHByb2NOYW1lICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1wdXQgdGhyZWVUYWIgJiAiRU5EOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0 IHR3b1RhYiAmICJFTkQ7IiAmIHJldHVybiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1w dXQgVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYg InRoZUFwcGxlRXZlbnQuZGF0YUhhbmRsZSA6PSBOSUw7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1wdXQgVGFiICYgInRoZVJlcGx5LmRhdGFIYW5kbGUgOj0gTklMOyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJGYWlsRXJyKEFFQ3JlYXRlQXBw bGVFdmVudCgnIiAmIFJlc1R5cGUoZmllbGQgIkV2ZW50Q2xhc3MiKSDCDSYgIicsICci ICYgUmVzVHlwZShmaWVsZCAiRXZlbnRJRCIpICYgIicsICIgJiBkZWZhdWx0VGFyZ2V0 RGVzYyDCDSYgIiwga0F1dG9HZW5lcmF0ZVJldHVybklELCBrQW55VHJhbnNhY3Rpb25J RCwgdGhlQXBwbGVFdmVudCkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcmVwZWF0 IHdpdGggcGFyYW1JbmRleCA9IDIgdG8gY291bnQNcHV0IGxpbmUgcGFyYW1JbmRleCBv ZiBwYXJhbUluZm8gaW50byB4DWlmIGl0ZW0gMyBvZiB4IDw+ICJudWxsIiB0aGVuDXB1 dCBpdGVtIDQgb2YgeCBpbnRvIHBhcmFtVHlwZQ1wdXQgKGl0ZW0gNSBvZiB4ID0gIm8i KSBpbnRvIGlzT3B0aW9uYWwNcHV0IE5hbWVPZkRhdGFUeXBlKGl0ZW0gMyBvZiB4KSBp bnRvIG5hbWVMaXN0DWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgdHdvVGFiIGludG8gaW5k ZW50DWVsc2UNcHV0IFRhYiBpbnRvIGluZGVudA1lbmQgaWYNcHV0IFN0cmlwU3AoaXRl bSAxIG9mIHgpIGludG8gdGhpc05hbWUNaWYgKHBhcmFtVHlwZSA9IDApIG9yIChwYXJh bVR5cGUgPSAyKSB0aGVuIC0tIEFFRGVzYw1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IFRh YiAmICJJRiAiICYgaXRlbSA2IG9mIHggJiAiIDw+IE5JTCBUSEVOIiAmIHJldHVybiBp bnRvIHRlbXANcHV0IHRlbXAgYWZ0ZXIgcHJvY0JvZHkNLS1JRiBwYXJhbVR5cGUgPSAy IHRoZW4NLS0gIHB1dCBUYWIgJiB0ZW1wIGJlZm9yZSBsaW5lIDUgb2YgcHJvY0JvZHkN LS1lbmQgaWYNcHV0IGluZGVudCAmICJGYWlsRXJyKEFFUHV0S2V5RGVzYyh0aGVBcHBs ZUV2ZW50LCIgJiBpdGVtIDIgb2YgeCAmICIsIiAmIGl0ZW0gNiBvZiB4ICYgIl4pKTsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DS0taWYgcGFyYW1UeXBlID0gMiB0aGVuDS0t ICBwdXQgdGhyZWVUYWIgJiAiSWdub3JlT1NFcnIoQUVEaXNwb3NlRGVzYygiICYgaXRl bSA2IG9mIHggJiAiXikpOyIgJiByZXR1cm4gYmVmb3JlIGxpbmUgNiBvZiBwcm9jQm9k eQ0tLWVuZCBpZg1lbHNlDXB1dCBpbmRlbnQgJiAiRmFpbEVycihBRVB1dEtleURlc2Mo dGhlQXBwbGVFdmVudCwiICYgaXRlbSAyIG9mIHggJiAiLCIgJiBpdGVtIDEgb2YgeCAm ICIpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DS0taWYgcGFyYW1UeXBlID0gMiB0 aGVuDS0tICBwdXQgVHdvVGFiICYgIklnbm9yZU9TRXJyKEFFRGlzcG9zZURlc2MoIiAm IGl0ZW0gMSBvZiB4ICYgIikpOyIgJiByZXR1cm4gYmVmb3JlIGxpbmUgNSBvZiBwcm9j Qm9keQ0tLWVuZCBpZg1lbmQgaWYNZWxzZSBpZiAocGFyYW1UeXBlID0gMSkgb3IgKHBh cmFtVHlwZSA9IDMpIHRoZW4gLS0gaGFuZGxlDXB1dCAiZGVzY0ZvciIgJiBTdHJpcFNw KGl0ZW0gMSBvZiB4KSBpbnRvIGRlc2NGb3JUaGlzTmFtZQ1pZiBpc09wdGlvbmFsIHRo ZW4NcHV0IFRhYiAmICJJRiAiICYgaXRlbSAxIG9mIHggJiAiIDw+IE5JTCBUSEVOIiAm IHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgaW5kZW50ICYgIkJFR0lOIiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1lbmQgaWYNcHV0IGRlc2NGb3JUaGlzTmFtZSAmICIgOiBB RURlc2M7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1dCBpbmRlbnQgJiAiV0lU SCIgJiYgZGVzY0ZvclRoaXNOYW1lICYmICJETyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IGluZGVudCAmIHRhYiAmICJCRUdJTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IGluZGVudCAmIHRhYiAmICJkZXNjcmlwdG9yVHlwZSA6PSAiICYgaXRlbSA0 IG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlmIGl0ZW0g MyBvZiBuYW1lTGlzdCA9ICJIYW5kbGUiIHRoZW4NcHV0IGluZGVudCAmIHRhYiAmICJk YXRhSGFuZGxlIDo9ICIgJiBpdGVtIDEgb2YgeCAmICI7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1lbHNlDXB1dCBpbmRlbnQgJiB0YWIgJiAiZGF0YUhhbmRsZSA6PSBIYW5k bGUoIiAmIGl0ZW0gMSBvZiB4ICYgIik7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1l bmQgaWYNcHV0IGluZGVudCAmIHRhYiAmICJFTkQ7IiAmIHJldHVybiBhZnRlciBwcm9j Qm9keQ1wdXQgaW5kZW50ICYgIkZhaWxFcnIoQUVQdXRLZXlEZXNjKHRoZUFwcGxlRXZl bnQsIiAmIGl0ZW0gMiBvZiB4ICYgIiwiICYgZGVzY0ZvclRoaXNOYW1lICYgIikpOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgaXNPcHRpb25hbCB0aGVuDXB1dCBpbmRl bnQgJiAiRU5EOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDS0taWYgcGFy YW1UeXBlID0gMyB0aGVuDS0tICBpZiBpdGVtIDMgb2YgbmFtZUxpc3QgPSAiSGFuZGxl IiB0aGVuDS0tICAgIHB1dCB0d29UYWIgJiAiRGlzcG9zSGFuZGxlKCIgJiBpdGVtIDEg b2YgeCAmICIpOyIgJiByZXR1cm4gYmVmb3JlIGxpbmUgNSBvZiBwcm9jQm9keQ0tLSAg ZWxzZQ0tLSAgICBwdXQgdHdvVGFiICYgIkRpc3Bvc0hhbmRsZShIYW5kbGUoIiAmIGl0 ZW0gMSBvZiB4ICYgIikpOyIgJiByZXR1cm4gYmVmb3JlIGxpbmUgNSBvZiBwcm9jQm9k eQ0tLSAgZW5kIGlmDS0tICBpZiBpc09wdGlvbmFsIHRoZW4NLS0gICAgcHV0IHR3b1Rh YiAmICJJRiAiICYgaXRlbSA2IG9mIHggJiAiIDw+IE5JTCBUSEVOIiAmIHJldHVybiAm IHRhYiBiZWZvcmUgbGluZSA1IG9mIHByb2NCb2R5DS0tICBlbmQgaWYNLS1lbmQgaWYN ZWxzZSBpZiBwYXJhbVR5cGUgPSA0IHRoZW4NaWYgaXNPcHRpb25hbCB0aGVuDWlmIGl0 ZW0gMyBvZiB4ID0gImVudW0iIHRoZW4NcHV0IFRhYiAmICJJRiBMT05HSU5UKCIgJiBp dGVtIDEgb2YgeCAmICIpIDw+IDAgVEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IHR3b1RhYiAmICJGYWlsRXJyKEFFUHV0S2V5UHRyKHRoZUFwcGxlRXZlbnQsICIg JiBpdGVtIDIgb2YgeCDCDSYgIiwgIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIEAi ICYgaXRlbSAxIG9mIHggJiAiLCBTaXplT2YoIiDCDSYgaXRlbSAxIG9mIG5hbWVMaXN0 ICYgIikpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UgaWYgaXRlbSAzIG9m IHggPSAidHJ1ZSIgdGhlbg1wdXQgVGFiICYgIklGICIgJiBpdGVtIDEgb2YgeCAmICIg VEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAmICJGYWlsRXJy KEFFUHV0S2V5UHRyKHRoZUFwcGxlRXZlbnQsICIgJiBpdGVtIDIgb2YgeCDCDSYgIiwg dHlwZVRydWUsIE5JTCwgMCkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZWxzZQ1w dXQgVGFiICYgIklGICIgJiBpdGVtIDYgb2YgeCAmICIgPD4gTklMIFRIRU4iICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiRmFpbEVycihBRVB1dEtleVB0 cih0aGVBcHBsZUV2ZW50LCAiICYgaXRlbSAyIG9mIHggwg0mICIsICIgJiBpdGVtIDQg b2YgbmFtZUxpc3QgJiAiLCBQdHIoIiAmIGl0ZW0gNiBvZiB4ICYgIiksIFNpemVPZigi IMINJiBpdGVtIDEgb2YgbmFtZUxpc3QgJiAiKSkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJv Y0JvZHkNZW5kIGlmDWVsc2UgIC0tIHJlcXVpcmVkDXB1dCBUYWIgJiAiRmFpbEVycihB RVB1dEtleVB0cih0aGVBcHBsZUV2ZW50LCAiICYgaXRlbSAyIG9mIHggwg0mICIsICIg JiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCBAIiAmIGl0ZW0gMSBvZiB4ICYgIiwgU2l6 ZU9mKCIgwg0mIGl0ZW0gMSBvZiBuYW1lTGlzdCAmICIpKSk7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbmQgaWYNZWxzZSBpZiAocGFyYW1UeXBlID0gNSkgb3IgKHBhcmFt VHlwZSA9IDcpIHRoZW4NaWYgaXNPcHRpb25hbCB0aGVuDXB1dCBUYWIgJiAiSUYgIiAm IGl0ZW0gNiBvZiB4ICYgIiA8PiBOSUwgVEhFTiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNZW5kIGlmDXB1dCBpbmRlbnQgJiAiRmFpbEVycihBRVB1dEtleVB0cih0aGVBcHBs ZUV2ZW50LCAiICYgaXRlbSAyIG9mIHggwg0mICIsICIgJiBpdGVtIDQgb2YgbmFtZUxp c3QgJiAiLCBQdHIoIiAmIGl0ZW0gNiBvZiB4ICYgIiksICIgYWZ0ZXIgcHJvY0JvZHkN aWYgKHBhcmFtVHlwZSA9IDUpIHRoZW4gLS0gc2l6ZSBpcyB0aGUgcGFyYW1ldGVyDXB1 dCBpdGVtIDcgb2YgeCAmICIpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UN cHV0ICJzdHJsZW4oUHRyKCIgJiBpdGVtIDYgb2YgeCAmICIpKSkpOyIgJiByZXR1cm4g YWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVsc2UgaWYgcGFyYW1UeXBlID0gNiB0aGVuDWlm IGlzT3B0aW9uYWwgdGhlbg1wdXQgVGFiICYgIklGICIgJiBpdGVtIDYgb2YgeCAmICIg PD4gTklMIFRIRU4iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCAiUHRyKG9yZCgi ICYgaXRlbSA2IG9mIHggJiAiKSsxKSIgaW50byBkYXRhQWRkcg1wdXQgaXRlbSA2IG9m IHggJiAiXiIgaW50byBkYXRhSXRlbQ1lbHNlICAtLSByZXF1aXJlZA1wdXQgIkAiICYg aXRlbSAxIG9mIHggJiAiWzFdIiBpbnRvIGRhdGFBZGRyDXB1dCBpdGVtIDEgb2YgeCBp bnRvIGRhdGFJdGVtDWVuZCBpZg1wdXQgaW5kZW50ICYgIkZhaWxFcnIoQUVQdXRLZXlQ dHIodGhlQXBwbGVFdmVudCwgIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCAiICYgaXRlbSA0 IG9mIG5hbWVMaXN0ICYgIiwgIiAmIGRhdGFBZGRyICYgIiwgTGVuZ3RoKCIgwg0mIGRh dGFJdGVtICYgIikpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1lbmQg aWYgLS0gbm90IG51bGwNZW5kIHJlcGVhdA1wdXQgdGFiICYgIkZhaWxFcnIoQUVTZW5k KHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5LCAiIGFmdGVyIHByb2NCb2R5DWlmIGlzRnVu YyB0aGVuDXB1dCBrQUVXYWl0UmVwbHkgYWZ0ZXIgcHJvY0JvZHkNZWxzZQ1wdXQga0FF Tm9SZXBseSBhZnRlciBwcm9jQm9keQ1lbmQgaWYNaWYgZGVmYXVsdFNlbmRNb2RlIGlz IG5vdCBlbXB0eSB0aGVuIHB1dCAiKyIgJiBkZWZhdWx0U2VuZE1vZGUgYWZ0ZXIgcHJv Y0JvZHkNcHV0ICIsIGtBRU5vcm1hbFByaW9yaXR5LCAiICYgZGVmYXVsdFRpbWVPdXQg JiAiLCIgJiYgZGVmYXVsdElkbGVQcm9jICYmICIsIiDCDSYgZGVmYXVsdEFFRmlsdGVy ICYgIikpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNaWYgaXNGdW5jIHRoZW4NcHV0 ICJ0aGVFcnJuIDogTE9OR0lOVDsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 ICJ0eXBlQ29kZSA6IERlc2NUeXBlOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1w dXQgImFjdHVhbFNpemUgOiBMT05HSU5UOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFy ZQ1wdXQgdGFiICYgIklGIEFFR2V0S2V5UHRyKHRoZVJlcGx5LCAnZXJybicsIHR5cGVM b25nSW50ZWdlciwgdHlwZUNvZGUsIiDCDSYmICJAdGhlRXJybiwgU2l6ZU9mKHRoZUVy cm4pLCBhY3R1YWxTSXplKSA8PiBlcnJBRURlc2NOb3RGb3VuZCBUSEVOIiAmIHJldHVy biBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkJFR0lOIiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgInsgeW91ciBlcnJvciBoYW5kbGluZyBjb2Rl IGhlcmV9IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgIkVORDsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DS0tIGdldCB0aGUgcmVzdWx0DXB1dCBpdGVt IDQgb2YgcGFyYW1JbmZvIGludG8gcGFyYW1UeXBlDXB1dCBOYW1lT2ZEYXRhVHlwZShp dGVtIDMgb2YgcGFyYW1JbmZvKSBpbnRvIG5hbWVMaXN0DWlmIHBhcmFtVHlwZSA9IDAg dGhlbiAtLSByZXN1bHQgaXMgQUVEZXNjDXB1dCB0YWIgJiAiRmFpbEVycihBRUdldEtl eURlc2ModGhlQXBwbGVFdmVudCwga2V5RGlyZWN0T2JqZWN0LCAiIMINJiBpdGVtIDQg b2YgbmFtZUxpc3QgJiAiLCB0aGVSZXN1bHQpKTsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DWVsc2UgaWYgKHBhcmFtVHlwZSA9IDEpIG9yIChwYXJhbVR5cGUgPSA1KSB0aGVu IC0tIHJlc3VsdCBpcyBIYW5kbGUNcHV0ICJhRGVzYyA6IEFFRGVzYzsiICYgcmV0dXJu IGFmdGVyIHZhckRlY2xhcmUNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5RGVzYyh0 aGVBcHBsZUV2ZW50LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1l TGlzdCAmICIsIGFEZXNjKSk7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1pZiBpdGVt IDMgb2YgbmFtZUxpc3QgPSAiSGFuZGxlIiB0aGVuDXB1dCBUYWIgJiAidGhlUmVzdWx0 IDo9IGFEZXNjLmRhdGFIYW5kbGU7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbHNl DXB1dCBUYWIgJiAidGhlUmVzdWx0IDo9ICIgJiBpdGVtIDMgb2YgbmFtZUxpc3QgJiAi KGFEZXNjLmRhdGFIYW5kbGUpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlm DWVsc2UgaWYgcGFyYW1UeXBlID0gNCB0aGVuIC0tIHJlc3VsdCBpcyBmaXhlZCBsZW5n dGgNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5UHRyKHRoZVJlcGx5LCBrZXlEaXJl Y3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIHR5cGVDb2RlLCBA dGhlUmVzdWx0LCBTaXplT2YodGhlUmVzdWx0KSIgwg0mICIsIGFjdHVhbFNpemUpKTsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UgaWYgcGFyYW1UeXBlID0gNiB0aGVu IC0tIHJlc3VsdCBpcyBzdHIyNTUNcHV0IFRhYiAmICJGYWlsRXJyKEFFR2V0S2V5UHRy KHRoZVJlcGx5LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlz dCAmICIsIHR5cGVDb2RlLCBAdGhlUmVzdWx0WzFdLCBTaXplT2YodGhlUmVzdWx0KS0x IiDCDSYgIiwgYWN0dWFsU2l6ZSkpOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0 IFRhYiAmICJJRiBhY3R1YWxTaXplID49IFNpemVPZih0aGVSZXN1bHQpIFRIRU4iICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiYWN0dWFsU2l6ZSA6PSBT aXplT2YodGhlUmVzdWx0KSAtIDE7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg VGFiICYgInRoZVJlc3VsdFswXSA6PSBjaHIoYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBh ZnRlciBwcm9jQm9keQ1lbmQgaWYNZW5kIGlmDXB1dCB0YWIgJiAiQ2xlYW5VcDsiICYg cmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0YWIgJiBwcm9jTmFtZSAmICIgOj0gTm9F cnI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdGFiICYgIkVORDsiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DWlmIHZhckRlY2xhcmUgPD4gIiIgdGhlbg1wdXQgdGFi ICYgIlZBUiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1yZXBlYXQgd2l0aCBpID0g MSB0byBudW1iZXIgb2YgbGluZXMgaW4gdmFyRGVjbGFyZQ1wdXQgdHdvVGFiICYgbGlu ZSBpIG9mIHZhckRlY2xhcmUgJiByZXR1cm4gYWZ0ZXIgcHJvY0hlYWRlcg1lbmQgcmVw ZWF0DWVuZCBpZg1yZXR1cm4gcHJvY0hlYWRlciAmIHJldHVybiAmIHByb2NCb2R5ICYg cmV0dXJuDWVsc2UNcmV0dXJuICIiDWVuZCBpZg1FbmQgQ2xpZW50U2FtcGxlDQ0AARAA DwEAAPIAAgECAJngBQAAAAAAAQAAAAwAAAAQSGFzIEdsdWUgU3Vicm91dGluZQAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNlcnRhaW4gbGFuZ3VhZ2VzIGhhdmUgYSBw cmltaXRpdmUgdG8gc2VuZCBBcHBsZSBFdmVudHMsIiDCDSYmICJidXQgdGhlcmUgbWF5 IGFsc28gYmUgYSBnbHVlIHJvdXRpbmUgb24gdG9wIG9mIHRoZSBwcmltaXRpdmUuIiDC DSYmICJDbGljayB0aGlzIGJveCB0byB1c2UgdGhlIGdsdWUgcm91dGluZS4iDWVuZCBN b3VzZVdpdGhpbg0NAAAAtAAQAgUAVAC7AGUBJQAAAAAAAP//ABUADAEAABAAAG9uIE1v dXNlV2l0aGluDVNob3dCYWxsb29uICJDbGljayB0byBzZXQgdGhlIHJlc291cmNlIHR5 cGUgdG8gYmUgd3JpdHRlbiBvdXQgYXMgJ2FldGUnIG9yICdhZXV0Jy4gTm9ybWFsbHkg aXQgc2hvdWxkIGJlICdhZXRlJy4iDWVuZCBNb3VzZVdpdGhpbg0NAAADCgASAQAANgAK AEsAgYAAAAAAAAABABUADAEAABBUYXJnZXQgQXBwbGljYXRpb24AAC0tIG9uIE1vdXNl V2l0aGluDS0tIFNob3dCYWxsb29uICJDbGljayBoZXJlIHRvIGNob29zZSB0aGUgbmFt ZSBvZiB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uIHRvIGJlIHVzZWQgaW4gUEFTQ0FMIGNs aWVudCBzYW1wbGUgY29kZS4iDS0tIGVuZCBNb3VzZVdpdGhpbg0NLS0gb24gbW91c2VV cA0tLSBpZiB0aGUgc3lzdGVtVmVyc2lvbiA8IDcgdGhlbg0tLSBhbnN3ZXIgIlRoaXMg ZmVhdHVyZSByZXF1aXJlcyBTeXN0ZW0gNy4wIG9yIGxhdGVyLiINLS0gZXhpdCBtb3Vz ZVVwDS0tIGVuZCBpZg0tLSBpZiB0aGUgdmVyc2lvbiA8IDIuMSB0aGVuDS0tIGFuc3dl ciAiVGhpcyBmZWF0dXJlIHJlcXVpcmVzIEh5cGVyQ2FyZCAyLjEgb3IgbGF0ZXIuIg0t LSBlbmQgaWYNLS0gYW5zd2VyIHByb2dyYW0gIkNob29zZSBhbiBvcGVuIHByb2dyYW0g dG8gc2VuZCB0bzoiDS0tIGlmIGl0IDw+ICIiIHRoZW4NLS0gU2V0IHRoZSBpdGVtRGVs aW1pdGVyIHRvICI6Ig0tLSBwdXQgaXQgaW50byB4DS0tIGRlbGV0ZSBsYXN0IGl0ZW0g b2YgeA0tLSBwdXQgdGhlIGFkZHJlc3MgaW50byB5DS0tIGRlbGV0ZSBsYXN0IGl0ZW0g b2YgeQ0tLSBpZiB4ID0geSB0aGVuDS0tIGRlbGV0ZSBpdGVtIDEgdG8gMiBvZiBpdA0t LSBlbmQgaWYNLS0gU2V0IHRoZSBpdGVtRGVsaW1pdGVyIHRvICIsIg0tLSBwdXQgaXQg aW50byBjYXJkIGZpZWxkICJzZW5kVGFyZ2V0Ig0tLSBlbmQgaWYNLS0gZW5kIG1vdXNl VXAAALoAFAIFAHwAyQCNASUAAAAAAAD//wAVAAwBAAAQAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiRW50ZXIgdGhlIHNlbmQgbW9kZSAob3RoZXIgdGhhbiB3YWl0UmVw bHkvbm9SZXBseS9xdWV1ZVJlcGx5KSB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQg c2FtcGxlIGNvZGUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0AAJgAFQIFAJAA3gChASUA AAAAAAD//wAVAAwBAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiRW50ZXIg dGhlIG5hbWUgb2YgaWRsZSBwcm9jIHRvIGJlIHVzZWQgaW4gUEFTQ0FMIGNsaWVudCBz YW1wbGUgY29kZSBoZXJlLiINZW5kIE1vdXNlV2l0aGluDQAAqAAWAgUApADeALUBJQAA AAAAAP//ABUADAEAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJFbnRlciB0 aGUgbmFtZSBvZiB0aGUgZXZlbnQgZmlsdGVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgaW4g UEFTQ0FMIGNsaWVudCBzYW1wbGUgY29kZSBoZXJlLiINZW5kIE1vdXNlV2l0aGluDQAA 1AAaAQABBgEfARkB/aAFAAAAAAABAAAADAAAABBBdXRvIEdlbmVyYXRlIFBhcmFtZXRl ciBUeXBlAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2tpbmcgaGVyZSBp bmRpY2F0ZXMgd2hldGhlciBkYXRhIHR5cGVzIGZvciB1c2UgaW4gUEFTQ0FMIHBhcmFt ZXRlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCBnZW5lcmF0ZWQuIg1lbmQgTW91c2VX aXRoaW4NAACiABsCBQC4AKoAyQElAAAAAAAA//8AFQAMAQAAEAAAb24gTW91c2VXaXRo aW4NU2hvd0JhbGxvb24gIkVudGVydCB0aGUgbmFtZSBvZiB0YXJnZXQgZGVzY3JpcHRv ciB0byBiZSB1c2VkIGluIFBBU0NBTCBjbGllbnQgc2FtcGxlIGNvZGUgaGVyZS4iDWVu ZCBNb3VzZVdpdGhpbg0AAAAoAB0BgAEhAAMBNABP4AUAAAAAAAEAAAAMAAAAEFZlcmJv c2UAAAABMAAhAQAAVAEkAGMBWuAGAAAAAAABAAAADAAAABBhZXRlAABvbiBNb3VzZVdp dGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBzZXQgdGhlIHJlc291cmNlIHR5 cGUgdG8gYmUgd3JpdHRlbiBvdXQgYXMgJ2FldGUnLiBUaGlzIGlzIHdoYXQgaXMgbm9y bWFsbHkgdGhpcyBzaG91bGQgYmUuIg1lbmQgTW91c2VXaXRoaW4NDW9uIG1vdXNlVXAN c2V0IHRoZSBoaWxpdGUgb2YgY2QgYnRuICJhZXV0IiB0byBmYWxzZQ1wdXQgdGhlIHNo b3J0IG5hbWUgb2YgbWUgaW50byBjZCBmbGQgInJlc291cmNlVHlwZSINZW5kIG1vdXNl VXAAASgAIgEAAFQBYABjAZagBgAAAAAAAQAAAAwAAAAQYWV1dAAAb24gTW91c2VXaXRo aW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gc2V0IHRoZSByZXNvdXJjZSB0eXBl IHRvIGJlIHdyaXR0ZW4gb3V0IGFzICdhZXRlJy4gTm9ybWFsbHkgdGhpcyBzaG91bGQg YmUgJ2FldGUnLiINZW5kIE1vdXNlV2l0aGluDQ1vbiBtb3VzZVVwDXNldCB0aGUgaGls aXRlIG9mIGNkIGJ0biAiYWV0ZSIgdG8gZmFsc2UNcHV0IHRoZSBzaG9ydCBuYW1lIG9m IG1lIGludG8gY2QgZmxkICJyZXNvdXJjZVR5cGUiDWVuZCBtb3VzZVVwAAAApAAjAoQA UgF9AGQBogACAAAAAAAAAAMADAAAABByZXNvdXJjZVR5cGUAAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJUaGUgcmVzb3VyY2UgdHlwZSB0byBiZSB3cml0dGVuIG91dCwg bm9ybWFsbHkgdGhpcyBzaG91bGQgc3RheSBhcyBhZXRlLiINZW5kIE1vdXNlV2l0aGlu DQ0AAAAiACQCBQAeALgAMAFNAAAAAAAAAAAAFQASSQAAGAAAAAAAbAAoAgUAXAAhAG0A dwABAAAAAAAAABUADAEAABAAAG9uIE1vdXNlV2l0aGluDVNob3dCYWxsb29uICJFbnRl ciB0aGUgcmVzb3VyY2UgSUQgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbg0NAAAAdgApAgQA WgB2AG0ApAACAAAAAAAAAAQADAAAABByZXNvdXJjZUlEAABvbiBNb3VzZVdpdGhpbg1T aG93QmFsbG9vbiAiRW50ZXIgdGhlIHJlc291cmNlIElEIGhlcmUuIg1lbmQgTW91c2VX aXRoaW4NDQAAAGwAKgIFAJwABACsADEAAQAAAAAAAAAVAAwBAAAQAABvbiBNb3VzZVdp dGhpbg1TaG93QmFsbG9vbiAiRW50ZXIgdGhlIHJlc291cmNlIG5hbWUgaGVyZS4iDWVu ZCBNb3VzZVdpdGhpbgAAAHgAKwIEAJwAMACtAM8AAgAAAAAAAAAEAAwAAAAQcmVzb3Vy Y2VOYW1lAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiRW50ZXIgdGhlIHJlc291 cmNlIG5hbWUgaGVyZS4iDWVuZCBNb3VzZVdpdGhpbgAAAG4ALAIFALEABADCAD0AAQAA AAAAAAAVAAwBAAAQAABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiRW50ZXIgdGhl IHJlc291cmNlIHZlcnNpb24gaGVyZS4iDWVuZCBNb3VzZVdpdGhpbgAAegAtAgQAsAA8 AMEAXAACAAAAAP//AAQADAAAABBtYWpvclZlcnNpb24AAG9uIE1vdXNlV2l0aGluDVNo b3dCYWxsb29uICJFbnRlciB0aGUgcmVzb3VyY2UgdmVyc2lvbiBoZXJlLiINZW5kIE1v dXNlV2l0aGluAAAiAC4CBQCwAFwAwQBoAAEAAAAAAAAABAAMAAAAEAAAAAAAegAvAgQA sABoAMEAhQACAAAAAAAAAAQADAAAABBtaW5vclZlcnNpb24AAG9uIE1vdXNlV2l0aGlu DVNob3dCYWxsb29uICJFbnRlciB0aGUgcmVzb3VyY2UgdmVyc2lvbiBoZXJlLiINZW5k IE1vdXNlV2l0aGluAABsADACBQBwAAkAgQB3AAEAAAAA//8AFQAMAQAAEAAAb24gTW91 c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBsYW5ndWFnZSBjb2RlIGhlcmUu Ig1lbmQgTW91c2VXaXRoaW4AAAB4ADECBABuAHYAfwCkAAIAAAAAAAAABAAMAAAAEGxh bmd1YWdlQ29kZQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVyIHRoZSBs YW5ndWFnZSBjb2RlIGhlcmUuIg1lbmQgTW91c2VXaXRoaW4AAABqADICBQCCABUAkgB3 AAEAAAAAAAAAFQAMAQAAEAAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkVudGVy IHRoZSBzY3JpcHQgY29kZSBoZXJlLiINZW5kIE1vdXNlV2l0aGluAAAAdAAzAgQAgAB2 AJEApAACAAAAAAAAAAQADAAAABBzY3JpcHRDb2RlAABvbiBNb3VzZVdpdGhpbg1TaG93 QmFsbG9vbiAiRW50ZXIgdGhlIHNjcmlwdCBjb2RlIGhlcmUuIg1lbmQgTW91c2VXaXRo aW4AAADuADYBAAEoAXwBVgG4oAAAAGB2AAEAFQAMAQAAEEluc3RydWN0aW9ucwAAb24g TW91c2VXaXRoaW4NU2hvd0JhbGxvb24gIkNsaWNrIGhlcmUgdG8gZ2V0IGluc3RydWN0 aW9ucyBmb3IgdXNpbmcgdGhpcyBzdGFjay4iDWVuZCBNb3VzZVdpdGhpbg0NDW9uIG1v dXNlVXANZ2xvYmFsIGdXaGVyZUZyb20NcHVzaCBjZA1wb3AgY2QgaW50byBnV2hlcmVG cm9tDWdvIGNkICJpbnN0cnVjdGlvbnMiDWVuZCBtb3VzZVVwAAAA9gA3AQABMgHNAUwB 8iAAAAA+0wABABUADgEAABJQcm9jZWVkyQAAb24gTW91c2VXaXRoaW4NU2hvd0JhbGxv b24gIkNsaWNrIGhlcmUgdG8gZ28gdG8gdGhlIFJlc291cmNlIFRvb2xzIGNhcmQuIg1l bmQgTW91c2VXaXRoaW4NDQ0Nb24gbW91c2VVcA1nbG9iYWwgZ1doZXJlRnJvbQ1wdXNo IGNkDXBvcCBjZCBpbnRvIGdXaGVyZUZyb20NdmlzdWFsIGRpc3NvbHZlIGZhc3QNZ28g Y2FyZCAiTWFpbk1lbnUiDWVuZCBtb3VzZVVwAAAAKgA4AoUBIwEhAVYCAAAHAAAAAAAA AAMACQAAAAxuYW1lTGlzdAAAAAAufAA5AQABQwACAVIAIIAGAAAAAAABAAAADAAAABBD AABvbiBNb3VzZVdpdGhpbg1TaG93QmFsbG9vbiAiQ2xpY2sgaGVyZSB0byBzaG93IHRo ZSBldmVudCBhcyBpdCBpcyBjYWxsZWQgZnJvbSBDLiINZW5kIE1vdXNlV2l0aGluDQ1m dW5jdGlvbiBDbGllbnRUZW1wbGF0ZSBtdWx0aUxpbmUNLS0gZWl0aGVyIHJldHVybiB0 aGUgdGVtcGxhdGUgb3Igd2hpY2ggcGFyYW1ldGVyIGlzIGJlaW5nIGNsaWNrZWQNcHV0 IEdsdWVJbmZvKGZpZWxkICJwYXJhbUluZm8iKSBpbnRvIHBhcmFtSW5mbw1wdXQgIk9T RXJyIEFFIiAmIFN0cmlwU1AoZmllbGQgImV2ZW50TmFtZSIpICYgIigiIGludG8gdGVt cGxhdGUNcHV0IG51bWJlciBvZiBsaW5lcyBpbiBwYXJhbUluZm8gaW50byBuDXB1dCAw IGludG8gcGFyYW1JbmRleA1yZXBlYXQgd2l0aCBpbmRleCA9IDEgdG8gbg1zZXQgY3Vy c29yIHRvIGJ1c3kNcHV0IGxpbmUgaW5kZXggb2YgcGFyYW1JbmZvIGludG8geQ1wdXQg aXRlbSA0IG9mIHkgaW50byBwYXJhbVR5cGUNcHV0IChpdGVtIDUgb2YgeSA9ICJvIikg aW50byBpc09wdGlvbmFsDXB1dCAoaXRlbSAzIG9mIHkgPD4gIm51bGwiKSBpbnRvIHVz ZUl0DWlmIHVzZUl0IHRoZW4NYWRkIDEgdG8gcGFyYW1JbmRleA1pZiB1c2VJdCB0aGVu DWlmIGluZGV4ID0gMSB0aGVuDXB1dCBmYWxzZSBpbnRvIGlzT3B0aW9uYWwNZWxzZQ1p ZiBtdWx0aUxpbmUgPSAibXVsdGlMaW5lIiB0aGVuDXB1dCByZXR1cm4gJiBzcGFjZSBh ZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1dCBzcGFjZSBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYN ZW5kIGlmDXB1dCBOYW1lT2ZEYXRhVHlwZShpdGVtIDMgb2YgeSkgaW50byBuYW1lTGlz dA1wdXQgaXRlbSA1IG9mIG5hbWVMaXN0IGludG8gdHlwZU5hbWUNaWYgcGFyYW1UeXBl ID0gMCB0aGVuDWlmIGluZGV4IDw+IDEgdGhlbiBwdXQgImNvbnN0ICIgYWZ0ZXIgdGVt cGxhdGUNcHV0ICJBRURlc2MgKiIgYWZ0ZXIgdGVtcGxhdGUNZWxzZSBpZiBwYXJhbVR5 cGUgPSAxIHRoZW4gLS0gaGFuZGxlDXB1dCAiSGFuZGxlICIgYWZ0ZXIgdGVtcGxhdGUN aWYgaW5kZXggPSAxIHRoZW4NcHV0ICIqIiBhZnRlciB0ZW1wbGF0ZQ1lbmQgaWYNZWxz ZSBpZiBwYXJhbVR5cGUgPSA0IHRoZW4gLS0gaW1tZWRpYXRlDXB1dCBpdGVtIDMgb2Yg eSBpbnRvIGRhdGFUeXBlDXB1dCBpdGVtIDYgb2YgbmFtZUxpc3QgaW50byBkYXRhU2l6 ZQ1pZiBkYXRhVHlwZSA9ICJlbnVtIiB0aGVuDXB1dCAiUmVzVHlwZSAiIGFmdGVyIHRl bXBsYXRlDWVsc2UgaWYgZGF0YVR5cGUgPSAidHJ1ZSIgdGhlbg1wdXQgIkJvb2xlYW4g IiBhZnRlciB0ZW1wbGF0ZQ1lbHNlIGlmIChpc09wdGlvbmFsIG9yIChkYXRhU2l6ZSA8 IDApIG9yIChkYXRhU2l6ZSA+IDQpKSBhbmQgKGluZGV4IDw+IDEpIHRoZW4gLS0gZml4 ZWQgbGVuZ3RoIG9wdGlvbmFsDXB1dCAiY29uc3QgIiAmIHR5cGVOYW1lICYgIiAqIiBh ZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1dCB0eXBlTmFtZSAmIHNwYWNlIGFmdGVyIHRlbXBs YXRlDWVuZCBpZg1pZiBpbmRleCA9IDEgdGhlbg1wdXQgIioiIGFmdGVyIHRlbXBsYXRl DWVuZCBpZg1lbHNlIGlmIHBhcmFtVHlwZSA9IDcgdGhlbg1pZiBpbmRleCA8PiAxIHRo ZW4gcHV0ICJjb25zdCAiIGFmdGVyIHRlbXBsYXRlDXB1dCB0eXBlTmFtZSAmICIgKiIg YWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWlmIChsYXN0IGNoYXIgb2YgdGVtcGxhdGUgPSAi KiIpIHRoZW4NcHV0IGl0ZW0gNiBvZiB5ICYgIiwgIiBhZnRlciB0ZW1wbGF0ZQ1lbHNl IGlmIChwYXJhbVR5cGUgPSA1KSB0aGVuIC0tIHB0ciArIHNpemUNcHV0IHR5cGVOYW1l ICYgIiAqIiAmIGl0ZW0gNiBvZiB5ICYgIiwgbG9uZyAiICYgaXRlbSA3IG9mIHkgJiAi LCAiIGFmdGVyIHRlbXBsYXRlDWVsc2UgaWYgcGFyYW1UeXBlID0gNiB0aGVuDWlmIGlu ZGV4IDw+IDEgdGhlbiBwdXQgImNvbnN0ICIgYWZ0ZXIgdGVtcGxhdGUNcHV0ICJTdHJp bmdQdHIgIiAmIGl0ZW0gNiBvZiB5ICYgIiwgIiBhZnRlciB0ZW1wbGF0ZQ1lbHNlDXB1 dCBpdGVtIDEgb2YgeSAmICIsICIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDWVuZCBpZiAt LSB1c2VJdA1lbmQgaWYgLS0gdXNlSXQNZW5kIHJlcGVhdA1pZiBwYXJhbUluZGV4ID4g MCB0aGVuDURlbGV0ZSBsYXN0IGNoYXIgb2YgdGVtcGxhdGUgLS0gc3BhY2Ugb3IgKA1w dXQgIikiIGludG8gbGFzdCBjaGFyIG9mIHRlbXBsYXRlIC0tIHJlcGxhY2UgLA1lbHNl DXB1dCAiKSIgYWZ0ZXIgdGVtcGxhdGUNZW5kIGlmDXJldHVybiB0ZW1wbGF0ZQ1lbmQg Q2xpZW50VGVtcGxhdGUNDWZ1bmN0aW9uIENsaWVudFNhbXBsZSBjYXJkVHlwZQ1nbG9i YWwgZGVmYXVsdFRhcmdldERlc2MsIGRlZmF1bHRUaW1lT3V0LCBkZWZhdWx0SWRsZVBy b2MsIGRlZmF1bHRBRUZpbHRlciwgZGVmYXVsdFNlbmRNb2RlLCBkZWZhdWx0VGFyZ2V0 DWlmIGNhcmRUeXBlID0gImluaXQiIHRoZW4NaWYgZGVmYXVsdFRhcmdldERlc2MgaXMg ZW1wdHkgdGhlbg1wdXQgInRhcmdldERlc2MiIGludG8gZGVmYXVsdFRhcmdldERlc2MN cHV0ICJ2b2lkIFRhcmdldEluaXQoKSIgJiByZXR1cm4gJiAieyIgJiByZXR1cm4gYWZ0 ZXIgcnN0DXB1dCBUYWIgJiBUYWIgaW50byB0d29UYWINcHV0IFRhYiAmIHR3b1RhYiBp bnRvIHRocmVlVGFiDXB1dCBUYWIgJiB0aHJlZVRhYiBpbnRvIGZvdXJUYWINaWYgZGVm YXVsdFRhcmdldCA9ICJzZWxmIiB0aGVuDS0tIHNlbmQgdG8gc2VsZg1wdXQgVGFiICYg IlByb2Nlc3NTZXJpYWxOdW1iZXIgbXlQU04gPSB7MCwga0N1cnJlbnRQcm9jZXNzfTsi ICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgVGFiICYgIkFFQ3JlYXRlRGVzYyh0eXBlUHJv Y2Vzc1NlcmlhbE51bWJlciwgKFB0cikgJm15UFNOLCBzaXplb2YoUHJvY2Vzc1Nlcmlh bE51bWJlciksICZ0YXJnZXREZXNjKTsiICYgcmV0dXJuIGFmdGVyIHJzdA1lbHNlIGlm IGRlZmF1bHRUYXJnZXQgPD4gIiIgdGhlbg0tLSBzZW5kIHRvIHRhcmdldCBuYW1lDXB1 dCBUYWIgJiAiY2hhciAqdGFyZ2V0TmFtZSA9IiAmIHF1b3RlICYgZGVmYXVsdFRhcmdl dCAmIHF1b3RlICYgIjsiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgVGFiICYgIkFFQ29l cmNlUHRyKHR5cGVDaGFyLCAoUHRyKSB0YXJnZXROYW1lLCAiICYgTGVuZ3RoKGRlZmF1 bHRUYXJnZXQpICYgIiwgdHlwZVRhcmdldElELCAmdGFyZ2V0RGVzYyk7IiAmIHJldHVy biBhZnRlciByc3QNZWxzZQ0tLSB1c2UgUFBDIEJyb3dzZXINcHV0IHR3b1RhYiAmICJM b2NhdGlvbk5hbWVSZWMgdGhlTG9jYXRpb247IiAmIHJldHVybiBhZnRlciByc3QNcHV0 IHR3b1RhYiAmICJQb3J0SW5mb1JlYyB0aGVQb3J0SW5mbzsiICYgcmV0dXJuIGFmdGVy IHJzdA1wdXQgdHdvVGFiICYgIlRhcmdldElEIGFUYXJnZXRJRDsiICYgcmV0dXJuIGFm dGVyIHJzdA1wdXQgVGFiICYgImlmICghUFBDQnJvd3NlcigiICYgcXVvdGUgJiAiXHAi ICYgcXVvdGUgJiAiLCAiIMINJiBxdW90ZSAmICJccCIgJiBxdW90ZSAmIiwgZmFsc2Us ICZ0aGVMb2NhdGlvbiwgJnRoZVBvcnRJbmZvLCBuaWwsICIgwg0mIHF1b3RlICYgIlxw IiAmIHF1b3RlICYgIikpIHsiICYgcmV0dXJuIGFmdGVyIHJzdA1wdXQgdHdvVGFiICYg ImFUYXJnZXRJRC5sb2NhdGlvbiA9IHRoZUxvY2F0aW9uOyIgJiByZXR1cm4gYWZ0ZXIg cnN0DXB1dCB0d29UYWIgJiAiYVRhcmdldElELm5hbWUgPSB0aGVQb3J0SW5mby5uYW1l OyIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCB0d29UYWIgJiAiQUVDcmVhdGVEZXNjKHR5 cGVUYXJnZXRJRCwgKFB0cikgJmFUYXJnZXRJRCwgc2l6ZW9mKFRhcmdldElEKSwgJnRh cmdldERlc2MpOyIgJiByZXR1cm4gYWZ0ZXIgcnN0DXB1dCBUYWIgJiAifTsiICYgcmV0 dXJuIGFmdGVyIHJzdA1lbmQgaWYNcHV0IFRhYiAmICJ9IiAmIHJldHVybiAmIHJldHVy biBhZnRlciByc3QNZW5kIGlmDWlmIGRlZmF1bHRJZGxlUHJvYyBpcyBlbXB0eSB0aGVu DXB1dCAibmlsIiBpbnRvIGRlZmF1bHRJZGxlUHJvYw1lbHNlDXB1dCAiJiIgYmVmb3Jl IGRlZmF1bHRJZGxlUHJvYw1lbmQgaWYNaWYgZGVmYXVsdEFFRmlsdGVyIGlzIGVtcHR5 IHRoZW4NcHV0ICJuaWwiIGludG8gZGVmYXVsdEFFRmlsdGVyDWVsc2UNcHV0ICImIiBi ZWZvcmUgZGVmYXVsdEFFRmlsdGVyDWVuZCBpZg1pZiBkZWZhdWx0VGltZU91dCBpcyBl bXB0eSB0aGVuDXB1dCAia0FFRGVmYXVsdFRpbWVPdXQiIGludG8gZGVmYXVsdFRpbWVP dXQNZW5kIGlmDXJldHVybiByc3QNZWxzZSBpZiBjYXJkVHlwZSA9ICJldmVudCIgdGhl bg1wdXQgQ2xpZW50VGVtcGxhdGUoKSAmIHJldHVybiAmICJ7IiAmIHJldHVybiBpbnRv IHByb2NIZWFkZXINcHV0IEdsdWVJbmZvKGZpZWxkICJwYXJhbUluZm8iKSBpbnRvIHBh cmFtSW5mbw1wdXQgbnVtYmVyIG9mIGxpbmVzIG9mIHBhcmFtSW5mbyBpbnRvIGNvdW50 DXB1dCAiQUUiICYgU3RyaXBTUChmaWVsZCAiRXZlbnROYW1lIikgaW50byBwcm9jTmFt ZQ1wdXQgKGl0ZW0gMyBvZiBwYXJhbUluZm8gPD4gIm51bGwiKSBpbnRvIGlzRnVuYw1w dXQgdGFiICYgdGFiIGludG8gdHdvVGFiDXB1dCB0YWIgJiB0d29UYWIgaW50byB0aHJl ZVRhYg1wdXQgIk9TRXJyIGVycjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 ICJBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5OyIgJiByZXR1cm4gYWZ0 ZXIgdmFyRGVjbGFyZQ1wdXQgVGFiICYgInRoZUFwcGxlRXZlbnQuZGF0YUhhbmRsZSA9 IG5pbDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBUYWIgJiAidGhlUmVwbHku ZGF0YUhhbmRsZSA9IG5pbDsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBUYWIg JiAiaWYgKGVyciA9IEFFQ3JlYXRlQXBwbGVFdmVudCgnIiAmIFJlc1R5cGUoZmllbGQg IkV2ZW50Q2xhc3MiKSDCDSYgIicsICciICYgUmVzVHlwZShmaWVsZCAiRXZlbnRJRCIp ICYgIicsICYiICYgZGVmYXVsdFRhcmdldERlc2Mgwg0mICIsIGtBdXRvR2VuZXJhdGVS ZXR1cm5JRCwga0FueVRyYW5zYWN0aW9uSUQsICZ0aGVBcHBsZUV2ZW50KSkiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiZ290byBDbGVhblVwOyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcmVwZWF0IHdpdGggcGFyYW1JbmRleCA9IDIgdG8g Y291bnQNcHV0IGxpbmUgcGFyYW1JbmRleCBvZiBwYXJhbUluZm8gaW50byB4DWlmIGl0 ZW0gMyBvZiB4IDw+ICJudWxsIiB0aGVuDXB1dCBpdGVtIDQgb2YgeCBpbnRvIHBhcmFt VHlwZQ1wdXQgKGl0ZW0gNSBvZiB4ID0gIm8iKSBpbnRvIGlzT3B0aW9uYWwNcHV0IE5h bWVPZkRhdGFUeXBlKGl0ZW0gMyBvZiB4KSBpbnRvIG5hbWVMaXN0DWlmIGlzT3B0aW9u YWwgdGhlbg1wdXQgdHdvVGFiIGludG8gaW5kZW50DWVsc2UNcHV0IFRhYiBpbnRvIGlu ZGVudA1lbmQgaWYNcHV0IFN0cmlwU3AoaXRlbSAxIG9mIHgpIGludG8gdGhpc05hbWUN aWYgKHBhcmFtVHlwZSA9IDApIG9yIChwYXJhbVR5cGUgPSAyKSB0aGVuIC0tIEFFRGVz Yw1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IFRhYiAmICJpZiAoIiAmIGl0ZW0gNiBvZiB4 ICYgIikgeyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IGluZGVudCAmICJpZiAo ZXJyID0gQUVQdXRLZXlEZXNjKCZ0aGVBcHBsZUV2ZW50LCIgJiBpdGVtIDIgb2YgeCAm ICIsICIgJiBpdGVtIDYgb2YgeCAmICIpKSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkN cHV0IGluZGVudCAmIHRhYiAmICJnb3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBw cm9jQm9keQ1wdXQgVGFiICYgIn07IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbHNl DXB1dCBpbmRlbnQgJiAiaWYgKGVyciA9IEFFUHV0S2V5RGVzYygmdGhlQXBwbGVFdmVu dCwiICYgaXRlbSAyIG9mIHggJiAiLCAiICYgaXRlbSA2IG9mIHggJiAiKSkiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBpbmRlbnQgJiBUYWIgJiAiZ290byBDbGVhblVw OyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVsc2UgaWYgKHBhcmFtVHlw ZSA9IDEpIG9yIChwYXJhbVR5cGUgPSAzKSB0aGVuIC0tIGhhbmRsZQ1wdXQgImRlc2NG b3IiICYgU3RyaXBTcChpdGVtIDEgb2YgeCkgaW50byBkZXNjRm9yVGhpc05hbWUNaWYg aXNPcHRpb25hbCB0aGVuDXB1dCBUYWIgJiAiaWYgKCIgJiBpdGVtIDEgb2YgeCAmICIp IHsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgIkFFRGVzYyAiICYg ZGVzY0ZvclRoaXNOYW1lICYgIjsiICYgcmV0dXJuIGFmdGVyIHZhckRlY2xhcmUNcHV0 IGluZGVudCAmIGRlc2NGb3JUaGlzTmFtZSAmICIuZGVzY3JpcHRvclR5cGUgPSAiICYg aXRlbSA0IG9mIG5hbWVMaXN0ICYgIjsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1 dCBpbmRlbnQgJiBkZXNjRm9yVGhpc05hbWUgJiAiLmRhdGFIYW5kbGUgPSAoSGFuZGxl KSIgJiBpdGVtIDEgb2YgeCAmICI7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQg aW5kZW50ICYgImlmIChlcnIgPSBBRVB1dEtleURlc2MoJnRoZUFwcGxlRXZlbnQsIiAm IGl0ZW0gMiBvZiB4ICYgIiwmIiAmIGRlc2NGb3JUaGlzTmFtZSAmICIpKSIgJiByZXR1 cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IGluZGVudCAmIFRhYiAmICJnb3RvIENsZWFuVXA7 IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IGlu ZGVudCAmICJ9OyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDWVsc2UgaWYg cGFyYW1UeXBlID0gNCB0aGVuDWlmIGlzT3B0aW9uYWwgdGhlbg1pZiBpdGVtIDMgb2Yg eCA9ICJlbnVtIiB0aGVuDXB1dCBUYWIgJiAiaWYgKChsb25nKSIgJiBpdGVtIDEgb2Yg eCAmICIpIHsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiaWYg KGVyciA9IEFFUHV0S2V5UHRyKCZ0aGVBcHBsZUV2ZW50LCAiICYgaXRlbSAyIG9mIHgg wg0mICIsICIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCAoUHRyKSAmIiAmIGl0ZW0g MSBvZiB4ICYgIiwgc2l6ZW9mKCIgwg0mIGl0ZW0gNSBvZiBuYW1lTGlzdCAmICIpKSki ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UgaWYgaXRlbSAzIG9mIHggPSAidHJ1 ZSIgdGhlbg1wdXQgVGFiICYgImlmICgiICYgaXRlbSAxIG9mIHggJiAiKSB7IiAmIHJl dHVybiBhZnRlciBwcm9jQm9keQ1wdXQgdHdvVGFiICYgImlmIChlcnIgPSBBRVB1dEtl eVB0cigmdGhlQXBwbGVFdmVudCwgIiAmIGl0ZW0gMiBvZiB4IMINJiAiLCB0eXBlVHJ1 ZSwgbmlsLCAwKSkiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IFRhYiAm ICJpZiAoIiAmIGl0ZW0gNiBvZiB4ICYgIikgeyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IHR3b1RhYiAmICJpZiAoZXJyID0gQUVQdXRLZXlQdHIoJnRoZUFwcGxlRXZl bnQsICIgJiBpdGVtIDIgb2YgeCDCDSYgIiwgIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAm ICIsIChQdHIpICIgJiBpdGVtIDYgb2YgeCAmICIsIHNpemVvZigiIMINJiBpdGVtIDUg b2YgbmFtZUxpc3QgJiAiKSkpIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYN cHV0IHRocmVlVGFiICYgImdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHByb2NC b2R5DXB1dCB0d29UYWIgJiAifSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZWxzZSAg LS0gcmVxdWlyZWQNcHV0IFRhYiAmICJpZiAoZXJyID0gQUVQdXRLZXlQdHIoJnRoZUFw cGxlRXZlbnQsICIgJiBpdGVtIDIgb2YgeCDCDSYgIiwgIiAmIGl0ZW0gNCBvZiBuYW1l TGlzdCAmICIsIChQdHIpICIgYWZ0ZXIgcHJvY0JvZHkNcHV0IGl0ZW0gNiBvZiBuYW1l TGlzdCBpbnRvIGRhdGFTaXplDWlmIChkYXRhU2l6ZSA8IDApIG9yIChkYXRhU2l6ZSA+ IDQpIHRoZW4NcHV0IGl0ZW0gNiBvZiB4IGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0ICIm IiAmIGl0ZW0gMSBvZiB4IGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgIiwgc2l6ZW9m KCIgJiBpdGVtIDUgb2YgbmFtZUxpc3QgJiAiKSkpIiAmIHJldHVybiBhZnRlciBwcm9j Qm9keQ1wdXQgdHdvVGFiICYgImdvdG8gQ2xlYW5VcDsiICYgcmV0dXJuIGFmdGVyIHBy b2NCb2R5DWVuZCBpZg1lbHNlIGlmIChwYXJhbVR5cGUgPSA1KSBvciAocGFyYW1UeXBl ID0gNykgdGhlbg1pZiBpc09wdGlvbmFsIHRoZW4NcHV0IFRhYiAmICJpZiAoIiAmIGl0 ZW0gNiBvZiB4ICYgIikgeyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNZW5kIGlmDXB1 dCBpbmRlbnQgJiAiaWYgKGVyciA9IEFFUHV0S2V5UHRyKCZ0aGVBcHBsZUV2ZW50LCAi ICYgaXRlbSAyIG9mIHggwg0mICIsICIgJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCAo UHRyKSAiIGFmdGVyIHByb2NCb2R5DWlmIChwYXJhbVR5cGUgPSA1KSB0aGVuIC0tIHNp emUgaXMgdGhlIHBhcmFtZXRlcg1wdXQgaXRlbSA2IG9mIHggJiAiLCAiICYgaXRlbSA3 IG9mIHggJiAiKSkiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVsc2UNcHV0IGl0ZW0g NiBvZiB4ICYgIiwgc3RybGVuKCIgJiBpdGVtIDYgb2YgeCAmICIpKSkiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DWVuZCBpZg1wdXQgdHdvVGFiICYgImdvdG8gQ2xlYW5VcDsi ICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWlmIGlzT3B0aW9uYWwgdGhlbg1wdXQgVGFi ICYgIn07IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNZWxzZSBpZiBwYXJh bVR5cGUgPSA2IHRoZW4NaWYgaXNPcHRpb25hbCB0aGVuDXB1dCBUYWIgJiAiaWYgKCIg JiBpdGVtIDYgb2YgeCAmICIpIiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1lbmQgaWYN cHV0IGluZGVudCAmICJpZiAoZXJyID0gQUVQdXRLZXlQdHIoJnRoZUFwcGxlRXZlbnQs ICIgJiBpdGVtIDIgb2YgeCDCDSYgIiwgIiAmIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIs IChQdHIpIChjaGFyICopIiAmIGl0ZW0gNiBvZiB4IMINJiAiKzEsICoodW5zaWduZWQg Y2hhciAqKSIgJiBpdGVtIDYgb2YgeCAmICIpKSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0IGluZGVudCAmIHRhYiAmICJnb3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbmQgaWYNZW5kIGlmIC0tIG5vdCBudWxsDWVuZCByZXBlYXQNaWYg aXNGdW5jIHRoZW4NcHV0IHRhYiAmICJpZiAoZXJyID0gQUVTZW5kKCZ0aGVBcHBsZUV2 ZW50LCAmdGhlUmVwbHksIGtBRVdhaXRSZXBseSIgYWZ0ZXIgcHJvY0JvZHkNZWxzZQ1w dXQgdGFiICYgImVyciA9IEFFU2VuZCgmdGhlQXBwbGVFdmVudCwgJnRoZVJlcGx5LCBr QUVOb1JlcGx5IiBhZnRlciBwcm9jQm9keQ1lbmQgaWYNaWYgZGVmYXVsdFNlbmRNb2Rl IGlzIG5vdCBlbXB0eSB0aGVuIHB1dCAifCIgJiBkZWZhdWx0U2VuZE1vZGUgYWZ0ZXIg cHJvY0JvZHkNcHV0ICIsIGtBRU5vcm1hbFByaW9yaXR5LCAiICYgZGVmYXVsdFRpbWVP dXQgJiAiLCIgJiYgZGVmYXVsdElkbGVQcm9jICYmICIsIiDCDSYgZGVmYXVsdEFFRmls dGVyICYgIikiIGFmdGVyIHByb2NCb2R5DWlmIGlzRnVuYyB0aGVuDXB1dCAiKSIgJiBy ZXR1cm4gJiBUYWIgJiAiZ290byBDbGVhblVwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0Jv ZHkNcHV0ICJsb25nIHRoZUVycm47IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1 dCAiRGVzY1R5cGUgdHlwZUNvZGU7IiAmIHJldHVybiBhZnRlciB2YXJEZWNsYXJlDXB1 dCAibG9uZyBhY3R1YWxTaXplOyIgJiByZXR1cm4gYWZ0ZXIgdmFyRGVjbGFyZQ1wdXQg dGFiICYgImlmIChBRUdldEtleVB0cigmdGhlUmVwbHksICdlcnJuJywgdHlwZUxvbmdJ bnRlZ2VyLCAmdHlwZUNvZGUsIiDCDSYmICIoUHRyKSAmdGhlRXJybiwgc2l6ZW9mKHRo ZUVycm4pLCAmYWN0dWFsU2l6ZSkgIT0gZXJyQUVEZXNjTm90Rm91bmQpIHsiICYgcmV0 dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiLyogeW91ciBlcnJvciBoYW5k bGluZyBjb2RlIGhlcmUgKi8iICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29U YWIgJiAifTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DS0tIGdldCB0aGUgcmVzdWx0 DXB1dCBpdGVtIDQgb2YgcGFyYW1JbmZvIGludG8gcGFyYW1UeXBlDXB1dCBOYW1lT2ZE YXRhVHlwZShpdGVtIDMgb2YgcGFyYW1JbmZvKSBpbnRvIG5hbWVMaXN0DWlmIHBhcmFt VHlwZSA9IDAgdGhlbiAtLSByZXN1bHQgaXMgQUVEZXNjDXB1dCB0YWIgJiAiZXJyID0g QUVHZXRLZXlEZXNjKCZ0aGVBcHBsZUV2ZW50LCBrZXlEaXJlY3RPYmplY3QsICIgwg0m IGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsIHB0clRvVGhlUmVzdWx0KTsiICYgcmV0dXJu IGFmdGVyIHByb2NCb2R5DWVsc2UgaWYgKHBhcmFtVHlwZSA9IDEpIHRoZW4gLS0gcmVz dWx0IGlzIEhhbmRsZQ1wdXQgIkFFRGVzYyAgYURlc2M7IiAmIHJldHVybiBhZnRlciB2 YXJEZWNsYXJlDXB1dCBUYWIgJiAiaWYgKGVyciA9IEFFR2V0S2V5RGVzYygmdGhlQXBw bGVFdmVudCwga2V5RGlyZWN0T2JqZWN0LCAiIMINJiBpdGVtIDQgb2YgbmFtZUxpc3Qg JiAiLCAmYURlc2MpKSIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHR3b1RhYiAm ICJnb3RvIENsZWFuVXA7IiAmIHJldHVybiBhZnRlciBwcm9jQm9keQ1wdXQgVGFiICYg IipwdHJUb1RoZVJlc3VsdCA9IGFEZXNjLmRhdGFIYW5kbGU7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDQgdGhlbiAtLSByZXN1bHQgaXMg Zml4ZWQgbGVuZ3RoDXB1dCBUYWIgJiAiZXJyID0gQUVHZXRLZXlQdHIoJnRoZVJlcGx5 LCBrZXlEaXJlY3RPYmplY3QsICIgwg0mIGl0ZW0gNCBvZiBuYW1lTGlzdCAmICIsICZ0 eXBlQ29kZSwgKFB0cikgcHRyVG9UaGVSZXN1bHQsIHNpemVvZigiICYgaXRlbSA1IG9m IG5hbWVMaXN0ICYgIikiIMINJiAiLCAmYWN0dWFsU2l6ZSk7IiAmIHJldHVybiBhZnRl ciBwcm9jQm9keQ1lbHNlIGlmIHBhcmFtVHlwZSA9IDYgdGhlbiAtLSByZXN1bHQgaXMg c3RyMjU1DXB1dCBUYWIgJiAiaWYgKGVyciA9IEFFR2V0S2V5UHRyKCZ0aGVSZXBseSwg a2V5RGlyZWN0T2JqZWN0LCAiIMINJiBpdGVtIDQgb2YgbmFtZUxpc3QgJiAiLCAmdHlw ZUNvZGUsIChQdHIpIHB0clRvVGhlUmVzdWx0KzEsIDI1NSIgwg0mICIsICZhY3R1YWxT aXplKSkiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIgJiAiZ290byBD bGVhblVwOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IFRhYiAmICJpZiAoYWN0 dWFsU2l6ZSA+IDI1NSkiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCB0d29UYWIg JiAiYWN0dWFsU2l6ZSA9IDI1NTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DXB1dCBU YWIgJiAiKih1bnNpZ25lZCBjaGFyICopcHRyVG9UaGVSZXN1bHQgPSAodW5zaWduZWQg Y2hhcikgYWN0dWFsU2l6ZTsiICYgcmV0dXJuIGFmdGVyIHByb2NCb2R5DWVuZCBpZg1l bHNlDXB1dCAiOyIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkgLS0gZW5kIG9mIEFFU2Vu ZA1lbmQgaWYNcHV0ICJDbGVhblVwOiIgJiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0 IFRhYiAmICJBRURpc3Bvc2VEZXNjKCZ0aGVBcHBsZUV2ZW50KTsiICYgcmV0dXJuIGFm dGVyIHByb2NCb2R5DXB1dCBUYWIgJiAiQUVEaXNwb3NlRGVzYygmdGhlUmVwbHkpOyIg JiByZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0IHRhYiAmICJyZXR1cm4gZXJyOyIgJiBy ZXR1cm4gYWZ0ZXIgcHJvY0JvZHkNcHV0ICJ9IiAmIHJldHVybiBhZnRlciBwcm9jQm9k eQ1pZiB2YXJEZWNsYXJlIDw+ICIiIHRoZW4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbnVt YmVyIG9mIGxpbmVzIGluIHZhckRlY2xhcmUNcHV0IFRhYiAmIGxpbmUgaSBvZiB2YXJE ZWNsYXJlICYgcmV0dXJuIGFmdGVyIHByb2NIZWFkZXINZW5kIHJlcGVhdA1lbmQgaWYN cmV0dXJuIHByb2NIZWFkZXIgJiByZXR1cm4gJiBwcm9jQm9keSAmIHJldHVybg1lbHNl DXJldHVybiAiIg1lbmQgaWYNRW5kIENsaWVudFNhbXBsZQ0AAP//ABAAU2VydmVyIExh bmd1YWdl//wAEABDbGllbnQgTGFuZ3VhZ2X/9QAOAFRpbWVvdXQgVmFsdWX/9AAFADEy MDAA//AADgBSZXNvdXJjZSBUeXBl/+wACgBTZW5kIE1vZGX/6wAKAElkbGUgUHJvY//q AAkAriBGaWx0ZXIA/+UAEgBUYXJnZXQgRGVzY3JpcHRvcv/dAAUAYWV0ZQD/3AAMAFBy ZWZlcmVuY2Vz/9gADABSZXNvdXJjZSBJRP/WAAUATmFtZQD/1AAIAFZlcnNpb27/0gAC AC7/0AAOAExhbmd1YWdlIENvZGX/zgAMAFNjcmlwdCBDb2Rl/9MAAgAx/9EAAgAw/88A AgAw/80AAgAw/9cAAgAw/8ge04AKAAAABB7JABFjQUVMaXN0PSJsaXN0Ig1jQXBwbGlj YXRpb249ImNhcHAiDWNBcmM9ImNhcmMiDWNCb29sZWFuPSJib29sIg1jQ2VsbD0iY2Nl bCINY0NoYXI9ImNoYSAiDWNDb2xvclRhYmxlPSJjbHJ0Ig1jQ29sdW1uPSJjY29sIg1j RG9jdW1lbnQ9ImRvY3UiDWNEcmF3aW5nQXJlYT0iY2RydyINY0VudW1lcmF0aW9uPSJl bnVtIg1jRmlsZT0iZmlsZSINY0ZpeGVkPSJmaXhkIg1jR3JhcGhpY0xpbmU9ImdsaW4i DWNHcmFwaGljT2JqZWN0PSJjZ29iIg1jR3JhcGhpY1NoYXBlPSJjZ3NoIg1jR3JhcGhp Y1RleHQ9ImNndHgiDWNHcm91cGVkR3JhcGhpYz0iY3BpYyINY0luc2VydGlvbkxvYz0i aW5zbCINY0ludGxUZXh0PSJpdHh0Ig1jSW50bFdyaXRpbmdDb2RlPSJpbnRsIg1jSXRl bT0iY2l0bSINY0xpbmU9ImNsaW4iDWNMb25nSW50ZWdlcj0ibG9uZyINY01lbnU9ImNt bnUiDWNNZW51SXRlbT0iY21lbiINY09iamVjdD0iY29iaiINY09iamVjdFNwZWNpZmll cj0ib2JqICINY09wZW5hYmxlT2JqZWN0PSJjb29iIg1jT3ZhbD0iY292bCINY1BhcmFn cmFwaD0iY3BhciINY1BpeGVsPSJjcHhsIg1jUGl4ZWxNYXA9ImNwaXgiDWNQb2x5Z29u PSJjcGduIg1jUURQb2ludD0iUURwdCINY1FEUmVjdGFuZ2xlPSJxZHJ0Ig1jUmVjdGFu Z2xlPSJjcmVjIg1jUkdCQ29sb3I9ImNSR0IiDWNSb3RhdGlvbj0idHJvdCINY1JvdW5k ZWRSZWN0YW5nbGU9ImNycmMiDWNSb3c9ImNyb3ciDWNTZWxlY3Rpb249ImNzZWwiDWNT aG9ydEludGVnZXI9InNob3IiDWNUYWJsZT0iY3RibCINY1RleHQ9ImN0eHQiDWNUZXh0 Rmxvdz0iY2ZsbyINY1RleHRTdHlsZXM9InRzdHkiDWNUeXBlPSJ0eXBlIg1jV2luZG93 PSJjd2luIg1jV29yZD0iY3dvciINa0FFQWJvdXQ9ImFib3UiDWtBRUFmdGVyPSJhZnRl Ig1rQUVBbGlhc1NlbGVjdGlvbj0ic2FsaSINa0FFQWxsQ2Fwcz0iYWxjcCINa0FFQXJy b3dBdEVuZD0iYXJlbiINa0FFQXJyb3dBdFN0YXJ0PSJhcnN0Ig1rQUVBcnJvd0JvdGhF bmRzPSJhcmJvIg1rQUVBc2s9ImFzayAiDWtBRUJlZm9yZT0iYmVmbyINa0FFQmVnaW5u aW5nPSJiZ25nIg1rQUVCZWdpbnNXaXRoPSJiZ3d0Ig1rQUVCZWdpblRyYW5zYWN0aW9u PSJiZWdpIg1rQUVCb2xkPSJib2xkIg1rQUVDYXNlU2Vuc0VxdWFscz0iY3NlcSINa0FF Q2VudGVyZWQ9ImNlbnQiDWtBRUNoYW5nZVZpZXc9InZpZXciDWtBRUNsb25lPSJjbG9u Ig1rQUVDbG9zZT0iY2xvcyINa0FFQ29uZGVuc2VkPSJjb25kIg1rQUVDb250YWlucz0i Y29udCINa0FFQ29weT0iY29weSINa0FFQ29yZVN1aXRlPSJjb3JlIg1rQUVDb3VudEVs ZW1lbnRzPSJjbnRlIg1rQUVDcmVhdGVFbGVtZW50PSJjcmVsIg1rQUVDcmVhdGVQdWJs aXNoZXI9ImNwdWIiDWtBRUN1dD0iY3V0ICINa0FFRGVsZXRlPSJkZWxvIg1rQUVEb09i amVjdHNFeGlzdD0iZG9leCINa0FFRG9TY3JpcHQ9ImRvc2MiDWtBRURyYWc9ImRyYWci DWtBRUR1cGxpY2F0ZVNlbGVjdGlvbj0ic2R1cCINa0FFRWRpdEdyYXBoaWM9ImVkaXQi DWtBRUVtcHR5VHJhc2g9ImVtcHQiDWtBRUVuZD0iZW5kICINa0FFRW5kc1dpdGg9ImVu ZHMiDWtBRUVuZFRyYW5zYWN0aW9uPSJlbmR0Ig1rQUVFcXVhbHM9Ij0gICAiDWtBRUV4 cGFuZGVkPSJwZXhwIg1rQUVGYXN0PSJmYXN0Ig1rQUVGaW5kZXJFdmVudHM9IkZORFIi DWtBRUZvcm11bGFQcm90ZWN0PSJmcHJvIg1rQUVGdWxseUp1c3RpZmllZD0iZnVsbCIN a0FFR2V0Q2xhc3NJbmZvPSJxb2JqIg1rQUVHZXREYXRhPSJnZXRkIg1rQUVHZXREYXRh U2l6ZT0iZHNpeiINa0FFR2V0RXZlbnRJbmZvPSJndGVpIg1rQUVHZXRJbmZvU2VsZWN0 aW9uPSJzaW5mIg1rQUVHZXRQcml2aWxlZ2VTZWxlY3Rpb249InNwcnYiDWtBRUdyZWF0 ZXJUaGFuPSI+ICAgIg1rQUVHcmVhdGVyVGhhbkVxdWFscz0iPj0gICINa0FFR3Jvdz0i Z3JvdyINa0FFSGlkZGVuPSJoaWRuIg1rQUVIaVF1YWxpdHk9ImhpcXUiDWtBRUltYWdl R3JhcGhpYz0iaW1nciINIiJrQUVJbmZvPTExDWtBRUlzVW5pZm9ybT0iaXN1biINa0FF SXRhbGljPSJpdGFsIg1rQUVMZWZ0SnVzdGlmaWVkPSJsZWZ0Ig1rQUVMZXNzVGhhbj0i PCAgICINa0FFTGVzc1RoYW5FcXVhbHM9Ijw9ICAiDWtBRUxvd2VyY2FzZT0ibG93YyIN IiJrQUVNYWluPTANa0FFTWFrZU9iamVjdHNWaXNpYmxlPSJtdmlzIg1rQUVNaXNjU3Rh bmRhcmRzPSJtaXNjIg1rQUVNb2RpZmlhYmxlPSJtb2RmIg1rQUVNb3ZlPSJtb3ZlIg1r QUVObz0ibm8gICINa0FFTm9BcnJvdz0iYXJubyINa0FFTm9ubW9kaWZpYWJsZT0ibm1v ZCINa0FFT3Blbj0ib2RvYyINa0FFT3BlblNlbGVjdGlvbj0ic29wZSINa0FFT3V0bGlu ZT0ib3V0bCINa0FFUGFnZVNldHVwPSJwZ3N1Ig1rQUVQYXN0ZT0icGFzdCINa0FFUGxh aW49InBsYW4iDWtBRVByaW50PSJwZG9jIg1rQUVQcmludFNlbGVjdGlvbj0ic3ByaSIN a0FFUHJpbnRXaW5kb3c9InB3aW4iDWtBRVB1dEF3YXlTZWxlY3Rpb249InNwdXQiDWtB RVFEQWRkT3Zlcj0iYWRkbyINa0FFUURBZGRQaW49ImFkZHAiDWtBRVFEQWRNYXg9ImFk bXgiDWtBRVFEQWRNaW49ImFkbW4iDWtBRVFEQmljPSJiaWMgIg1rQUVRREJsZW5kPSJi bG5kIg1rQUVRRENvcHk9ImNweSAiDWtBRVFETm90QmljPSJuYmljIg1rQUVRRE5vdENv cHk9Im5jcHkiDWtBRVFETm90T3I9Im50b3IiDWtBRVFETm90WG9yPSJueG9yIg1rQUVR RE9yPSJvciAgIg1rQUVRRFN1Yk92ZXI9InN1Ym8iDWtBRVFEU3ViUGluPSJzdWJwIg1r QUVRRFhvcj0ieG9yICINa0FFUmVkbz0icmVkbyINa0FFUmVndWxhcj0icmVnbCINa0FF UmVwbGFjZT0icnBsYyINa0FFUmV2ZWFsU2VsZWN0aW9uPSJzcmV2Ig1rQUVSZXZlcnQ9 InJ2cnQiDWtBRVJpZ2h0SnVzdGlmaWVkPSJyZ2h0Ig1rQUVTYXZlPSJzYXZlIg1rQUVT ZXREYXRhPSJzZXRkIg1rQUVTZXRQb3NpdGlvbj0icG9zbiINa0FFU2hhZG93PSJzaGFk Ig0iImtBRVNoYXJpbmc9MTMNa0FFU2hvd0NsaXBib2FyZD0ic2hjbCINa0FFU2xlZXA9 InNsZXAiDWtBRVNtYWxsQ2Fwcz0ic21jcCINa0FFU3RyaWtldGhyb3VnaD0ic3RyayIN a0FFU3Vic2NyaXB0PSJzYnNjIg1rQUVTdXBlcnNjcmlwdD0ic3BzYyINa0FFVHJhbnNh Y3Rpb25UZXJtaW5hdGVkPSJ0dHJtIg1rQUVVbmRlcmxpbmU9InVuZGwiDWtBRVVuZG89 InVuZG8iDWtBRVdob2xlV29yZEVxdWFscz0id3dlcSINa0FFWWVzPSJ5ZXMgIg1rQUVa b29tPSJ6b29tIg0iImtCeUNvbW1lbnRWaWV3PTYNIiJrQnlEYXRlVmlldz0zDSIia0J5 SWNvblZpZXc9MQ0iImtCeUtpbmRWaWV3PTUNIiJrQnlMYWJlbFZpZXc9Nw0iImtCeU5h bWVWaWV3PTINIiJrQnlTaXplVmlldz00DSIia0J5U21hbGxJY29uPTANIiJrQnlWZXJz aW9uVmlldz04DWtleUFFQW5nbGU9ImthbmciDWtleUFFQXJjQW5nbGU9ImtlbmQiDWtl eUFFQmFzZUFkZHI9ImJhZGQiDWtleUFFQmduZENvbG9yPSJrYmNsIg1rZXlBRUJnbmRQ YXR0ZXJuPSJrYnB0Ig1rZXlBRUJvdW5kcz0ia2JuZCINa2V5QUVDZWxsTGlzdD0ia2Ns dCINa2V5QUVDbGFzc0lEPSJjbElEIg1rZXlBRUNvbG9yPSJrY2xyIg1rZXlBRUNvbG9y VGFibGU9ImtjbHMiDWtleUFFQ3VydmVIZWlnaHQ9ImtjaGQiDWtleUFFQ3VydmVXaWR0 aD0ia2N3ZCINa2V5QUVEYXNoU3R5bGU9ImRzdHkiDWtleUFFRGF0YT0iZGF0YSINa2V5 QUVEZWZpbml0aW9uUmVjdD0ia2RlZiINa2V5QUVEZXNjVHlwZT0iZHN0cCINa2V5QUVE ZXN0aW5hdGlvbj0iZGVzdCINa2V5QUVEb0FudGlBbGlhcz0iYW50YSINa2V5QUVEb0Rp dGhlcmVkPSJnZGl0Ig1rZXlBRURvUm90YXRlPSJrZHJ0Ig1rZXlBRURvU2NhbGU9Imtz Y2EiDWtleUFFRG9UcmFuc2xhdGU9Imt0cmEiDWtleUFFRWRpdGlvbkZpbGVMb2M9ImVs b2MiDWtleUFFRWxlbWVudHM9ImVsbXMiDWtleUFFRW5kUG9pbnQ9ImtlZHAiDWtleUFF RXZlbnRDbGFzcz0iZXZjbCINa2V5QUVFdmVudElEPSJldnRpIg1rZXlBRUZpbGU9Imtm aWwiDWtleUFFRmlsZVR5cGU9ImZsdHAiDWtleUFFRmlsbENvbG9yPSJrZmNsIg1rZXlB RUZpbGxQYXR0ZXJuPSJrZnB0Ig1rZXlBRUZsaXBIb3Jpem9udGFsPSJrZmhvIg1rZXlB RUZsaXBWZXJ0aWNhbD0ia2Z2dCINa2V5QUVGb250PSJrZm50Ig1rZXlBRUZvcm11bGE9 ImtmbGEiDWtleUFFR3JhcGhpY09iamVjdHM9ImtncnMiDWtleUFFSW1hZ2VRdWFsaXR5 PSJncXVhIg1rZXlBRUluc2VydEhlcmU9Imluc2giDWtleUFFS2V5Rm9ybXM9ImtleWYi DWtleUFFS2V5d29yZD0ia3l3ZCINa2V5QUVMaW5lQXJyb3c9ImxuYXIiDWtleUFFTmFt ZT0ia25hbSINa2V5QUVOZXdFbGVtZW50TG9jPSJrbmVsIg1rZXlBRU9iamVjdD0ia29i aiINa2V5QUVPYmplY3RDbGFzcz0ia29jbCINa2V5QUVPZmZTdHlsZXM9Im9mc3QiDWtl eUFFT25TdHlsZXM9Im9uc3QiDWtleUFFUGFyYW1ldGVycz0icHJtcyINa2V5QUVQYXJh bUZsYWdzPSJwbWZnIg1rZXlBRVBlbkNvbG9yPSJrcGNsIg1rZXlBRVBlblBhdHRlcm49 ImtwYXQiDWtleUFFUGVuV2lkdGg9Imtwd2QiDWtleUFFUGl4ZWxEZXB0aD0ia3BkcCIN a2V5QUVQaXhNYXBNaW51cz0ia3BtbSINa2V5QUVQTVRhYmxlPSJrcG10Ig1rZXlBRVBv aW50TGlzdD0ia3B0cyINa2V5QUVQb2ludFNpemU9ImtwdHoiDWtleUFFUG9zaXRpb249 Imtwb3MiDWtleUFFUHJvcERhdGE9InByZHQiDWtleUFFUHJvcGVydGllcz0icXBybyIN a2V5QUVQcm9wZXJ0eT0ia3BycCINa2V5QUVQcm9wRmxhZ3M9InByZmciDWtleUFFUHJv cElEPSJwcm9wIg1rZXlBRVByb3RlY3Rpb249ImtwdGMiDWtleUFFUmVuZGVyQXM9Imty ZW4iDWtleUFFUmVxdWVzdGVkVHlwZT0icnR5cCINa2V5QUVSZXN1bHQ9Ii0tLS0iDWtl eUFFUmVzdWx0SW5mbz0icnNpbiINa2V5QUVSb3RhdGlvbj0ia3JvdCINa2V5QUVSb3RQ b2ludD0ia3J0cCINa2V5QUVSb3dMaXN0PSJrcmxzIg1rZXlBRVNhdmVPcHRpb25zPSJz YXZvIg1rZXlBRVNjYWxlPSJrc2NsIg1rZXlBRVNjcmlwdFRhZz0ia1N0ZyINa2V5QUVT aG93V2hlcmU9InNob3ciDWtleUFFU3RhcnRBbmdsZT0ia3N0YSINa2V5QUVTdGFydFBv aW50PSJrc3RyIg1rZXlBRVN0eWxlcz0ia3N0eSINa2V5QUVUZXh0PSJrdHh0Ig1rZXlB RVRleHRDb2xvcj0ia3R4YyINa2V5QUVUZXh0Rm9udD0ia3R4ZiINa2V5QUVUZXh0UG9p bnRTaXplPSJrdHBzIg1rZXlBRVRleHRTdHlsZXM9InR4dHMiDWtleUFFVGhlVGV4dD0i dGh0eCINa2V5QUVUcmFuc2Zlck1vZGU9Imt0cm4iDWtleUFFVHJhbnNsYXRpb249Imt0 cmwiDWtleUFFVHJ5QXNTdHJ1Y3RHcmFmPSJ0b29nIg1rZXlBRVVuaWZvcm1TdHlsZXM9 InVuaXMiDWtleUFFVXBkYXRlT249Imt1cGQiDWtleUFFVXNlclRlcm09InV0cm0iDWtl eUFFV2luZG93PSJ3bmR3Ig1rZXlBRVdyaXRpbmdDb2RlPSJ3cmNkIg1rZXlNaXNjZWxs YW5lb3VzPSJmbXNjIg1rZXlTZWxlY3Rpb249ImZzZWwiDWtleVdpbmRvdz0ia3duZCIN cEFyY0FuZ2xlPSJwYXJjIg1wQmFja2dyb3VuZENvbG9yPSJwYmNsIg1wQmFja2dyb3Vu ZFBhdHRlcm49InBicHQiDXBCZXN0VHlwZT0icGJzdCINcEJvdW5kcz0icGJuZCINcENs YXNzPSJwY2xzIg1wQ2xpcGJvYXJkPSJwY2xpIg1wQ29sb3I9ImNvbHIiDXBDb2xvclRh YmxlPSJjbHRiIg1wQ29ybmVyQ3VydmVIZWlnaHQ9InBjaGQiDXBDb3JuZXJDdXJ2ZVdp ZHRoPSJwY3dkIg1wRGFzaFN0eWxlPSJwZHN0Ig1wRGVmYXVsdFR5cGU9ImRlZnQiDXBE ZWZpbml0aW9uUmVjdD0icGRydCINcEVuYWJsZWQ9ImVuYmwiDXBFbmRQb2ludD0icGVu ZCINcEZpbGxDb2xvcj0iZmxjbCINcEZpbGxQYXR0ZXJuPSJmbHB0Ig1wRm9udD0iZm9u dCINcEZvcm11bGE9InBmb3IiDXBHcmFwaGljT2JqZWN0cz0iZ29icyINcEhhc0Nsb3Nl Qm94PSJoY2xiIg1wSGFzVGl0bGVCYXI9InB0aXQiDXBJbmRleD0icGlkeCINcEluc2Vy dGlvbkxvYz0icGlucyINcElzRmxvYXRpbmc9ImlzZmwiDXBJc0Zyb250UHJvY2Vzcz0i cGlzZiINcElzTW9kYWw9InBtb2QiDXBJc01vZGlmaWVkPSJpbW9kIg1wSXNSZXNpemFi bGU9InByc3oiDXBJc1N0YXRpb25lcnlQYWQ9InBzcGQiDXBJc1pvb21hYmxlPSJpc3pt Ig1wSXNab29tZWQ9InB6dW0iDXBJdGVtTnVtYmVyPSJpdG1uIg1wSnVzdGlmaWNhdGlv bj0icGpzdCINcExpbmVBcnJvdz0iYXJybyINcE1lbnVJRD0ibW5pZCINcE5hbWU9InBu YW0iDXBOZXdFbGVtZW50TG9jPSJwbmVsIg1wUGVuQ29sb3I9InBwY2wiDXBQZW5QYXR0 ZXJuPSJwcHBhIg1wUGVuV2lkdGg9InBwd2QiDXBQaXhlbERlcHRoPSJwZHB0Ig1wUG9p bnRMaXN0PSJwdGx0Ig1wUG9pbnRTaXplPSJwdHN6Ig1wUHJvdGVjdGlvbj0icHBybyIN cFJvdGF0aW9uPSJwcm90Ig1wU2NhbGU9InBzY2wiDXBTY3JpcHRUYWc9InBzY3QiDXBT ZWxlY3Rpb249InNlbGUiDXBTdGFydEFuZ2xlPSJwYW5nIg1wU3RhcnRQb2ludD0icHN0 cCINcFRleHRDb2xvcj0icHR4YyINcFRleHRGb250PSJwdHhmIg1wVGV4dEl0ZW1EZWxp bWl0ZXJzPSJ0eGRsIg1wVGV4dFBvaW50U2l6ZT0icHRwcyINcFRleHRTdHlsZXM9InR4 c3QiDXBUcmFuc2Zlck1vZGU9InBwdG0iDXBUcmFuc2xhdGlvbj0icHRycyINcFVuaWZv cm1TdHlsZXM9InVzdGwiDXBVcGRhdGVPbj0icHVwZCINcFVzZXJTZWxlY3Rpb249InB1 c2wiDXBWZXJzaW9uPSJ2ZXJzIg1wVmlzaWJsZT0icHZpcyINdHlwZUFFVGV4dD0idFRY VCINdHlwZUFwcGxlRXZlbnQ9IkFFVlQiDXR5cGVBcmM9InRhcmMiDXR5cGVCZXN0PSJi ZXN0Ig10eXBlQ2VsbD0iY2VsbCINdHlwZUNsYXNzSW5mbz0iY2xpbiINdHlwZUNvbG9y VGFibGU9ImNscnQiDXR5cGVDb2x1bW49ImNvbG0iDXR5cGVEYXNoU3R5bGU9InRkYXMi DXR5cGVEYXRhPSJ0ZHRhIg10eXBlRHJhd2luZ0FyZWE9InRkYXIiDXR5cGVFbGVtSW5m bz0iZWxpbiINdHlwZUVQUz0iRVBTICINdHlwZUV2ZW50SW5mbz0iZXZpbiINdHlwZUZp bmRlcldpbmRvdz0iZndpbiINdHlwZUZpeGVkPSJmaXhkIg10eXBlR3JhcGhpY0xpbmU9 InRnbG4iDXR5cGVHcmFwaGljVGV4dD0iZ3R4dCINdHlwZUdyb3VwZWRHcmFwaGljPSJ0 Z3J1Ig10eXBlSW5zZXJ0aW9uTG9jPSJpbnNsIg10eXBlSW50bFRleHQ9Iml0eHQiDXR5 cGVJbnRsV3JpdGluZ0NvZGU9ImludGwiDXR5cGVPdmFsPSJ0b3ZsIg10eXBlUGFyYW1J bmZvPSJwbWluIg10eXBlUGljdD0iUElDVCINdHlwZVBpeGVsTWFwPSJ0cGl4Ig10eXBl UGl4TWFwTWludXM9InRwbW0iDXR5cGVQb2x5Z29uPSJ0cG9sIg10eXBlUHJvcEluZm89 InBpbmYiDXR5cGVRRFBvaW50PSJRRHB0Ig10eXBlUURSZWN0YW5nbGU9InFkcnQiDXR5 cGVSZWN0YW5nbGU9InJjdGUiDXR5cGVSR0IxNj0idHIxNiINdHlwZVJHQjk2PSJ0cjk2 Ig10eXBlUkdCQ29sb3I9IlJHQiAiDXR5cGVSb3RhdGlvbj0idHJvdCINdHlwZVJvdW5k ZWRSZWN0YW5nbGU9InRyZHIiDXR5cGVSb3c9InJvdyAiDXR5cGVTY3JhcFN0eWxlcz0i c3R5bCINdHlwZVN0eWxlZFRleHQ9IlNUWFQiDXR5cGVUYWJsZT0idGFibCINdHlwZVRl eHRTdHlsZXM9InRzdHkiDXR5cGVUSUZGPSJUSUZGIg0iInpvb21Jbj03DSIiem9vbU91 dD04DWVudW1TYXZlT3B0aW9ucz0ic2F2byINZW51bVBvc2l0aW9uPSJwb3NpIg1lbnVt S2V5Rm9ybT0ia2ZybSINZW51bVN0eWxlPSJzdHlsIg1lbnVtSnVzdGlmaWNhdGlvbj0i anVzdCINZW51bVByb3RlY3Rpb249InBydG4iDWVudW1UcmFuc2Zlck1vZGU9InRyYW4i DWVudW1BcnJvd3M9ImFycm8iDWVudW1RdWFsaXR5PSJxdWFsIg1rQUVJbmRleD0iaW5k eCINa0FFTmFtZT0ibmFtZSINa0FFSWRlbnRpZmllcj0iaWQgICINa0FFUmVxdWlyZWRT dWl0ZT0icmVxZCINa0FFVGV4dFN1aXRlPSJURVhUIg1rQUVRdWlja0RyYXdTdWl0ZT0i cWRydyINa0FFUURTdXBwbGVtZW50YWxTdWl0ZT0icWRzcCINa0FFVGFibGVTdWl0ZT0i dGJscyIA/+0ACwBDb3JlU2FtcGxlAP/VABEAQ29yZVNhbXBsZSBTdWl0ZQBwcmVmZXJl bmNlAG9uIG1vdXNlVXANaWYgd29yZCAxIHRvIDIgb2YgbG9uZyBuYW1lIG9mIHRhcmdl dCA9ICJjYXJkIGJ1dHRvbiIgdGhlbg1wdXQgaWQgb2YgdGFyZ2V0IGludG8gaQ1wdXQg UHJlZmVyQ2xpZW50TGFuZ0J1dHRvbklEKCkgaW50byBjbGllbnRMaXN0DXB1dCBQcmVm ZXJTZXJ2ZXJMYW5nQnV0dG9uSUQoKSBpbnRvIHNlcnZlckxpc3QNaWYgQ2hlY2tHcm91 cChpLFByZWZlclNlcnZlckxhbmdCdXR0b25JRCgpKSB0aGVuDWVsc2UgaWYgQ2hlY2tH cm91cChpLFByZWZlckNsaWVudExhbmdCdXR0b25JRCgpKSB0aGVuDWVsc2UNcGFzcyBt b3VzZVVwDWVuZCBpZg1zZXQgaGlsaXRlIG9mIGNhcmQgYnV0dG9uIGlkIGkgdG8gdHJ1 ZQ1lbmQgaWYNZW5kIG1vdXNlVXANDWZ1bmN0aW9uIENoZWNrR3JvdXAgdGhlTnVtLHRo ZUxpc3QNcHV0IG51bWJlciBvZiBpdGVtcyBpbiB0aGVMaXN0IGludG8gbg1yZXBlYXQg d2l0aCBpID0gMSB0byBuDWlmIGl0ZW0gaSBvZiB0aGVMaXN0ID0gdGhlTnVtIHRoZW4N cmVwZWF0IHdpdGggaiA9IDEgdG8gbg1zZXQgaGlsaXRlIG9mIGNhcmQgYnV0dG9uIGlk IChpdGVtIGogb2YgdGhlTGlzdCkgdG8gZmFsc2UNZW5kIHJlcGVhdA1yZXR1cm4gdHJ1 ZQ1lbmQgaWYNZW5kIHJlcGVhdA1yZXR1cm4gZmFsc2UNZW5kIENoZWNrR3JvdXANDWZ1 bmN0aW9uIFdoaWNoSW5Hcm91cCB0aGVMaXN0DXB1dCBudW1iZXIgb2YgaXRlbXMgaW4g dGhlTGlzdCBpbnRvIG4NcmVwZWF0IHdpdGggaSA9IDEgdG8gbg1pZiBoaWxpdGUgb2Yg Y2FyZCBidXR0b24gaWQgKGl0ZW0gaSBvZiB0aGVMaXN0KSB0aGVuDXJldHVybiBpdGVt IGkgb2YgdGhlTGlzdA1lbmQgaWYNZW5kIHJlcGVhdA1lbmQgV2hpY2hJbkdyb3VwDQ1v biBjbG9zZUNhcmQNZ2xvYmFsIGNsaWVudExhbmcsY2xpZW50SGFzR2x1ZSxzZXJ2ZXJM YW5nDXB1dCBjbGllbnRMYW5nIGludG8gY3VyU2NyaXB0DXB1dCBzZXJ2ZXJMYW5nIGlu dG8gY3VyU2VydmVyDXB1dCBjbGllbnRIYXNHbHVlIGludG8gY3VyR2x1ZQ1DaGVja1By ZWZlcmVuY2UNaWYgKGN1clNjcmlwdCA8PiBjbGllbnRMYW5nKSB0aGVuDXB1dCB0aGUg c2NyaXB0IG9mIGNhcmQgYnV0dG9uIGlkIFdoaWNoSW5Hcm91cChQcmVmZXJDbGllbnRM YW5nQnV0dG9uSUQoKSkgaW50byBidG5TY3JpcHQNcHV0IFNlYXJjaChidG5TY3JpcHQs ICJmdW5jdGlvbiBDbGllbnRUZW1wbGF0ZSIsIHRydWUsIGZhbHNlKSBpbnRvIGxpbmVM aXN0DXB1dCBpdGVtIDEgb2YgbGluZUxpc3QgaW50byBjbG50VG1wbFN0YXJ0DXB1dCBT ZWFyY2goYnRuU2NyaXB0LCAiZnVuY3Rpb24gQ2xpZW50U2FtcGxlIiwgdHJ1ZSwgZmFs c2UpIGludG8gbGluZUxpc3QNcHV0IGl0ZW0gMSBvZiBsaW5lTGlzdCBpbnRvIGNsbnRT bXBsU3RhcnQNcHV0IHRoZSBzY3JpcHQgb2YgYmtnbmQgImV2ZW50cyIgaW50byBvcmdT Y3JpcHQNcHV0IFNlYXJjaChvcmdTY3JpcHQsICItLSBsYW5ndWFnZSIsIHRydWUsIGZh bHNlKSBpbnRvIGxpbmVMaXN0DXB1dCBpdGVtIDEgb2YgbGluZUxpc3QgaW50byB4DWlm IHggPiAwIHRoZW4NcHV0IHJldHVybiAmIChsaW5lIGNsbnRUbXBsU3RhcnQgdG8gY2xu dFNtcGxTdGFydC0xIG9mIGJ0blNjcmlwdCkgwg1pbnRvIGxpbmUgeCsxIHRvIDMwMDAw IG9mIG9yZ1NjcmlwdA1zZXQgdGhlIHNjcmlwdCBvZiBia2duZCAiZXZlbnRzIiB0byBv cmdTY3JpcHQNZW5kIGlmDWRlbGV0ZSBsaW5lIDEgdG8gKGNsbnRTbXBsU3RhcnQtMSkg b2YgYnRuU2NyaXB0DXB1dCB0aGUgc2NyaXB0IG9mIGNhcmQgYnV0dG9uICJjbGllbnQg Y29kZSIgb2YgY2FyZCAiTWFpbk1lbnUiIGludG8gb3JnU2NyaXB0DXB1dCBTZWFyY2go b3JnU2NyaXB0LCAiLS0gbGFuZ3VhZ2UiLCB0cnVlLCBmYWxzZSkgaW50byBsaW5lTGlz dA1wdXQgaXRlbSAxIG9mIGxpbmVMaXN0IGludG8geA1pZiB4ID4gMCB0aGVuDXB1dCBy ZXR1cm4gJiBidG5TY3JpcHQgaW50byBsaW5lIHgrMSB0byAzMDAwMCBvZiBvcmdTY3Jp cHQNc2V0IHRoZSBzY3JpcHQgb2YgY2FyZCBidXR0b24gImNsaWVudCBjb2RlIiBvZiBj YXJkICJNYWluTWVudSIgdG8gb3JnU2NyaXB0DWVuZCBpZg1lbmQgaWYNaWYgKGN1clNl cnZlciA8PiBzZXJ2ZXJMYW5nKSB0aGVuDXB1dCB0aGUgc2NyaXB0IG9mIGNhcmQgYnV0 dG9uIGlkIFdoaWNoSW5Hcm91cChQcmVmZXJTZXJ2ZXJMYW5nQnV0dG9uSUQoKSkgaW50 byBidG5TY3JpcHQNcHV0IFNlYXJjaChidG5TY3JpcHQsICJmdW5jdGlvbiBTZXJ2ZXJT YW1wbGUiLCB0cnVlLCBmYWxzZSkgaW50byBsaW5lTGlzdA1wdXQgaXRlbSAxIG9mIGxp bmVMaXN0IGludG8geA1kZWxldGUgbGluZSAxIHRvIHgtMSBvZiBidG5TY3JpcHQNcHV0 IHRoZSBzY3JpcHQgb2YgY2FyZCBidXR0b24gInNlcnZlciBjb2RlIiBvZiBjYXJkICJN YWluTWVudSIgaW50byBvcmdTY3JpcHQNcHV0IFNlYXJjaChvcmdTY3JpcHQsICItLSBs YW5ndWFnZSIsIHRydWUsIGZhbHNlKSBpbnRvIGxpbmVMaXN0DXB1dCBpdGVtIDEgb2Yg bGluZUxpc3QgaW50byB4DWlmIHggPiAwIHRoZW4NcHV0IHJldHVybiAmIGJ0blNjcmlw dCBpbnRvIGxpbmUgeCsxIHRvIDMwMDAwIG9mIG9yZ1NjcmlwdA1zZXQgdGhlIHNjcmlw dCBvZiBjYXJkIGJ1dHRvbiAic2VydmVyIGNvZGUiIG9mIGNhcmQgIk1haW5NZW51IiB0 byBvcmdTY3JpcHQNZW5kIGlmDWVuZCBpZg1pZiAoY3VyU2NyaXB0IDw+IGNsaWVudExh bmcpIG9yIChjbGllbnRIYXNHbHVlIDw+IGN1ckdsdWUpIHRoZW4NUmVEb1NjcmlwdA1l bmQgaWYNcGFzcyBjbG9zZUNhcmQNZW5kIGNsb3NlQ2FyZA1mdW5jdGlvbiBDbGllbnRU ZW1wbGF0ZQAAAAEgQk1BUAAAC4sAAAAAAAAAAAABAAAAAAAAAVYCAAAAAAAAAAAAABcA uAFTAf4AAAAAAAAAAAAAAAAAAADcjBOA4REg4QaFiuEVEOEG4RUw4Qa4ho4TgOERIOEG jRNA4REI4Qa/gb+Bv4G/gb+Bv4GkgYkfIOEMgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGG gYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaBhoGGgYaB hoGGgYaBhoGGpIHiEx5EAfABgOITETVAAICK4gTBMcyVmMADGByJ4hMewUoSliUgRKSg 4hMUwXmSlCHgRKSY4hMSwUBSlCUARKSE4hMRwTOMdBjAQxi4geITHkQAAABgQ0FSRAAA IwkAAAAAAAAAAEAAAAAAAAAAAAAAAAAAOvAAABPAAAAAAgAAAAAAAAAAAABzdWl0ZSBP SFBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgQ0FSRAAAIaAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAOvAAABPAAAAAAAAAAAAABAAAAIAAAgAPAFJlcXVpcmVk IFN1aXRlAAADAC0ARXZlbnRzIHRoYXQgZXZlcnkgYXBwbGljYXRpb24gc2hvdWxkIHN1 cHBvcnQAABgABQByZXFkAAAEACwAT3BlbixhZXZ0b2RvYw1QcmludCxhZXZ0cGRvYw1R dWl0LGFldnRxdWl0DXN1aXRlIHJlcWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAaBDQVJEAAAmtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA68AAAE8AAAAAAAAAA AAAGAAABSgACAA4ATXkgQ29yZSBTdWl0ZQADACcAU3VpdGUgdGhhdCBhcHBsaWVzIHRv IGFsbCBhcHBsaWNhdGlvbnMAABgABQBzbXBsAAAKAB4AQXBwbGljYXRpb24sY2FwcA1X aW5kb3csY3dpbg0ADgALAHBvc2kNa2ZybQ0AAAQAywBDbG9uZSxjb3JlY2xvbg1DbG9z ZSxjb3JlY2xvcw1Db3VudCxjb3JlY250ZQ1DcmVhdGUsY29yZWNyZWwNRGVsZXRlLGNv cmVkZWxvDUV4aXN0cyxjb3JlZG9leA1DbGFzcyBJbmZvLGNvcmVxb2JqDUdldCBEYXRh LGNvcmVnZXRkDURhdGEgU2l6ZSxjb3JlZHNpeg1FdmVudCBJbmZvLGNvcmVndGVpDU1v dmUsY29yZW1vdmUNU2V0IERhdGEsY29yZXNldGQNAHN1aXRlIHNtcGwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABQENBUkQAABSxAAAAAAAAIElAAAAAAAAAAAAAAAAAADrwAAAV 2AAAAAgAAAAAAAkAAADwAAEABQAqKioqAAAKACIALCxudWxsLDAsDSwsLDAsDSwsLDAs DSwsLDAsDSwsLDAsADEAAgAxAAMABQAqKioqAAAwAEoARnVuY3Rpb24gQUUoDSBkaXJl Y3RQYXJhbTpBRURlc2M7IA0gOkFFRGVzYzsgDSA6QUVEZXNjOyANIDpBRURlc2MpOk9T RXJyOwAFAD+ABgAAAA9UaGlzIGlzIGEgdGVtcGxhdGUgY2FyZCBmb3IgdGhpcyBiYWNr Z3JvdW5k0WRvbid0IHVzZSBpdCEAAAYABgByZXBseQAIAAUAbnVsbAAABwAFAHJwbHkA ZXZlbnQgICAgICAgICAsAAAAAAAAAAAAAAAAAABgQk1BUAAAIEkAAAAAAAAAAAABAAAA AAAAAVYCAADOAd0A1gHnAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAjSMBIAMjAUADFPAD FDADFCgDIwGwAyMD0gMjB48D//8AAAEAQ0FSRAAAIm8AAAAAAAAAAAAAAAAAAAAAAAAA AAAAOvAAABXYAAAAAAAAAAAACQAAALoAAQAFAHJlcWQAAAMABQBhZXZ0AAAKADUALCxu dWxsLDMyNzY4LA0sLGFsaXMsMjA0ODAsTGlzdCBvZiBkb2N1bWVudHMgdG8gb3BlbgAA NwACADEAAgAFAE9wZW4AAAUAJQBPcGVuIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBkb2N1 bWVudHMAAAQABQBvZG9jAAAGAA8AbWlzc2luZ05hbWUoOCkAADAADwBPcGVuIMINICBw YXJhbQBldmVudCBhZXZ0b2RvYwAAAAABIENBUkQAACRiAAAAAAAAAAAAAAAAAAAAAAAA AAAAADrwAAAV2AAAAAAAAAAAAAkAAAC8AAEABQByZXFkAAADAAUAYWV2dAAACgA2ACws bnVsbCwzMjc2OCwNLCxhbGlzLDE2Mzg0LExpc3Qgb2YgZG9jdW1lbnRzIHRvIHByaW50 ADcAAgAxAAIABgBQcmludAAFACYAUHJpbnQgdGhlIHNwZWNpZmllZCBsaXN0IG9mIGRv Y3VtZW50cwAEAAUAcGRvYwAABgARAG1pc3NpbmdOYW1lKDIxNCkAADAAEABQcmludCDC DSAgcGFyYW1ldmVudCBhZXZ0cGRvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAENBUkQAACVvAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAV2AAAAAAAAAAA AAkAAACgAAEABQByZXFkAAADAAUAYWV2dAAACgA4ACwsbnVsbCwzMjc2OCwNLCxudWxs LDM2ODY0LE5vIGRpcmVjdCBwYXJhbWV0ZXIgcmVxdWlyZWQANwACADEAAgAFAFF1aXQA AAUAEQBRdWl0IGFwcGxpY2F0aW9uAAAEAAUAcXVpdAAABgARAG1pc3NpbmdOYW1lKDM5 MikAADAABQBRdWl0AGV2ZW50IGFldnRxdWl0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAASBDQVJEAAAn0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA68AAAFdgAAAAAAAAA AAAIAAAA1gABAAUAc21wbAAAAwAFAGNvcmUAAAoAXQAsLG9iaiAsMCwNLCxvYmogLDQw OTYsVGhlIG9iamVjdCB0byBjbG9uZQ1UbyxpbnNoLGluc2wsMzI3NjgsVGhlIG5ldyBs b2NhdGlvbiBmb3IgdGhlIG9iamVjdAAAAgAGAENsb25lAAUAEABDbG9uZSBhbiBvYmpl Y3QABAAFAGNsb24AAAYAEQBtaXNzaW5nTmFtZSgzODMpAAAwAB4AQ2xvbmUgwg0gIHBh cmFtIMINIFtUbyBwYXJhbV1ldmVudCBjb3JlY2xvbgAAAAAAAAAAAOBDQVJEAAAoTgAA AAAAAAAAAAAAAAAAAAAAAAAAAAA68AAAFdgAAAAAAAAAAAAIAAAAmAABAAUAc21wbAAA AwAFAGNvcmUAAAoALgAsLG51bGwsMzI3NjgsDSwsb2JqICw0MDk2LFRoZSBvYmplY3Qg dG8gY2xvc2UAAgAGAENsb3NlAAUAEABDbG9zZSBhbiBvYmplY3QABAAFAGNsb3MAAAYA EQBtaXNzaW5nTmFtZSgxMzUpAAAwABAAQ2xvc2Ugwg0gIHBhcmFtZXZlbnQgY29yZWNs b3MAAAAAAAABgENBUkQAACljAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAV2AAAAAAA AAAAAAgAAAEqAAEABQBzbXBsAAADAAUAY29yZQAACgB5ACwsbG9uZywwLA0sLG9iaiAs MCxUaGUgb2JqZWN0IHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBjb3VudGVkDUNsYXNz LGtvY2wsdHlwZSwwLFRoZSBjbGFzcyBvZiB0aGUgZWxlbWVudHMgdG8gYmUgY291bnRl ZAAAAgAGAENvdW50AAUARQBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBh IHBhcnRpY3VsYXIgY2xhc3Mgd2l0aGluIGFuIG9iamVjdAAABAAFAGNudGUAAAYAEQBt aXNzaW5nTmFtZSgxNTYpAAAwAB8AQ291bnQgwg0gIHBhcmFtIMINIENsYXNzIHBhcmFt AGV2ZW50IGNvcmVjbnRlAAAAAAAAAAAAAAAAAAAAAAAAAAACIENBUkQAACoTAAAAAAAA AAAAAAAAAAAAAAAAAAAAADrwAAAV2AAAAAAAAAAAAAgAAAHGAAEABQBzbXBsAAADAAUA Y29yZQAACgESACwsb2JqICwwLA0sLG51bGwsMzY4NjQsDU5ldyxrb2NsLHR5cGUsMCxU aGUgY2xhc3Mgb2YgdGhlIG5ldyBlbGVtZW50DUF0LGluc2gsaW5zbCwzMjc2OCxUaGUg bG9jYXRpb24gYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBlbGVtZW50DVdpdGggRGF0YSxk YXRhLCoqKiosMzI3NjgsVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGVsZW1lbnQNV2l0 aCBQcm9wZXJ0aWVzLHByZHQscmVjbywzMjc2OCxUaGUgaW5pdGlhbCBkYXRhIGZvciB0 aGUgcHJvcGVydGllcyBvZiB0aGUgZWxlbWVudAACAAcAQ3JlYXRlAAAFABUAQ3JlYXRl IGEgbmV3IGVsZW1lbnQAAAQABQBjcmVsAAAGABEAbWlzc2luZ05hbWUoNDkxKQAAMABS AENyZWF0ZSDCDSBOZXcgcGFyYW0gwg0gW0F0IHBhcmFtXSDCDSBbV2l0aCBEYXRhIHBh cmFtXSDCDSBbV2l0aCBQcm9wZXJ0aWVzIHBhcmFtXWV2ZW50IGNvcmVjcmVsAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQBDQVJEAAArnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6 8AAAFdgAAAAAAAAAAAAIAAAAsAABAAUAc21wbAAAAwAFAGNvcmUAAAoAMAAsLG51bGws MzI3NjgsDSwsb2JqICw0MDk2LFRoZSBlbGVtZW50IHRvIGRlbGV0ZQACAAcARGVsZXRl AAAFACEARGVsZXRlIGFuIGVsZW1lbnQgZnJvbSBhbiBvYmplY3QAAAQABQBkZWxvAAAG ABEAbWlzc2luZ05hbWUoNDU2KQAAMAARAERlbGV0ZSDCDSAgcGFyYW0AZXZlbnQgY29y ZWRlbG8AAAAAAAAAAAAAAAAAAAEAQ0FSRAAALLMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA OvAAABXYAAAAAAAAAAAACAAAAKAAAQAFAHNtcGwAAAMABQBjb3JlAAAKACoALCxib29s LDAsDSwsb2JqICwwLFRoZSBvYmplY3QgaW4gcXVlc3Rpb24AAgAHAEV4aXN0cwAABQAZ AFRlbGwgaWYgYW4gb2JqZWN0IGV4aXN0cwAABAAFAGRvZXgAAAYAEABtaXNzaW5nTmFt ZSg2MikAMAARAEV4aXN0cyDCDSAgcGFyYW0AZXZlbnQgY29yZWRvZXgAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAABoENBUkQAAC4mAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADrwAAAV2AAAAAAAAAAAAAgAAAFAAAEABQBzbXBsAAADAAUAY29yZQAACgCkACwsY2xp biwwLA0sLHR5cGUsMzI3NjgsVGhlIG9iamVjdCBjbGFzcyBhYm91dCB3aGljaCBpbmZv cm1hdGlvbiBpcyByZXF1ZXN0ZWQNSW4sd3JjZCxpbnRsLDMyNzY4LFRoZSBodW1hbiBs YW5ndWFnZSBhbmQgc2NyaXB0IHN5c3RlbSBpbiB3aGljaCB0byByZXR1cm4gaW5mb3Jt YXRpb24AAgALAENsYXNzIEluZm8AAAUAJgBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYW4g b2JqZWN0IGNsYXNzAAQABQBxb2JqAAAGABEAbWlzc2luZ05hbWUoMjUxKQAAMAAlAENs YXNzIEluZm8gwg0gWyBwYXJhbV0gwg0gW0luIHBhcmFtXQBldmVudCBjb3JlcW9iagAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgQ0FSRAAAL7oAAAAAAAAAAAAAAAAA AAAAAAAAAAAAOvAAABXYAAAAAAAAAAAACAAAARIAAQAFAHNtcGwAAAMABQBjb3JlAAAK AIUALCwqKioqLDAsDSwsb2JqICwwLFRoZSBvYmplY3Qgd2hvc2UgZGF0YSBpcyB0byBi ZSByZXR1cm5lZA1BcyxydHlwLHR5cGUsNDkxNTIsVGhlIGRlc2lyZWQgdHlwZXMgZm9y IHRoZSBkYXRhLCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlAAACAAkAR2V0IERhdGEAAAUA GwBHZXQgdGhlIGRhdGEgZm9yIGFuIG9iamVjdAAABAAFAGdldGQAAAYAEQBtaXNzaW5n TmFtZSgyNTIpAAAwACEAR2V0IERhdGEgwg0gIHBhcmFtIMINIFtBcyBwYXJhbV0AZXZl bnQgY29yZWdldGQAAAAAAAAAAAAAAAABYENBUkQAADAsAAAAAAAAAAAAAAAAAAAAAAAA AAAAADrwAAAV2AAAAAAAAAAAAAgAAAEYAAEABQBzbXBsAAADAAUAY29yZQAACgCCACws bG9uZywwLA0sLG9iaiAsMCxUaGUgb2JqZWN0IHdob3NlIGRhdGEgc2l6ZSBpcyB0byBi ZSByZXR1cm5lZA1BcyxydHlwLHR5cGUsMzI3NjgsVGhlIGRhdGEgdHlwZSBmb3Igd2hp Y2ggdGhlIHNpemUgaXMgY2FsY3VsYXRlZAACAAoARGF0YSBTaXplAAUAJgBSZXR1cm4g dGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gb2JqZWN0AAQABQBkc2l6AAAGABEAbWlzc2lu Z05hbWUoMzk0KQAAMAAiAERhdGEgU2l6ZSDCDSAgcGFyYW0gwg0gW0FzIHBhcmFtXWV2 ZW50IGNvcmVkc2l6AAAAAAAAAaBDQVJEAAAxbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6 8AAAFdgAAAAAAAAAAAAIAAABWAABAAUAc21wbAAAAwAFAGNvcmUAAAoAsgAsLGV2aW4s MTYzODQsDSwsdHlwZSwwLFRoZSBldmVudCBjbGFzcyBvZiB0aGUgQXBwbGUgZXZlbnRz IGZvciB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24NSW4sd3JjZCxpbnRsLDMyNzY4 LFRoZSBodW1hbiBsYW5ndWFnZSBhbmQgc2NyaXB0IHN5c3RlbSBpbiB3aGljaCB0byBy ZXR1cm4gaW5mb3JtYXRpb24AAgALAEV2ZW50IEluZm8AAAUAMgBHZXQgaW5mb3JtYXRp b24gYWJvdXQgdGhlIEFwcGxlIGV2ZW50cyBpbiBhIHN1aXRlAAQABQBndGVpAAAGABEA bWlzc2luZ05hbWUoMzA3KQAAMAAjAEV2ZW50IEluZm8gwg0gIHBhcmFtIMINIFtJbiBw YXJhbV0AZXZlbnQgY29yZWd0ZWkAAAAAAAABIENBUkQAADLpAAAAAAAAAAAAAAAAAAAA AAAAAAAAADrwAAAV2AAAAAAAAAAAAAgAAADSAAEABQBzbXBsAAADAAUAY29yZQAACgBc ACwsb2JqICwwLA0sLG9iaiAsNDA5NixUaGUgb2JqZWN0IHRvIG1vdmUNVG8saW5zaCxp bnNsLDMyNzY4LFRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBvYmplY3QAAgAFAE1vdmUA AAUADwBNb3ZlIGFuIG9iamVjdAAABAAFAG1vdmUAAAYADwBtaXNzaW5nTmFtZSg3KQAA MAAdAE1vdmUgwg0gIHBhcmFtIMINIFtUbyBwYXJhbV0AZXZlbnQgY29yZW1vdmUAAAAA AAAAAAAAAAABIENBUkQAADPfAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAV2AAAAAAA AAAAAAgAAADOAAEABQBzbXBsAAADAAUAY29yZQAACgBMACwsbnVsbCwzMjc2OCwNLCxv YmogLDQwOTYsVGhlIG9iamVjdCB0byBjaGFuZ2UNVG8sZGF0YSwqKioqLDAsVGhlIG5l dyB2YWx1ZQACAAkAU2V0IERhdGEAAAUAFQBTZXQgYW4gb2JqZWN0J3MgZGF0YQAABAAF AHNldGQAAAYAEABtaXNzaW5nTmFtZSg3OCkAMAAfAFNldCBEYXRhIMINICBwYXJhbSDC DSBUbyBwYXJhbQBldmVudCBjb3Jlc2V0ZAAAAAAAAAAAAAAAAAAAAAAAwENBUkQAABfY AAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAYZAAAAAcAAAAAAAQAAABoAAEABQAqKioq AAAFAD+ABgAAAA9UaGlzIGlzIGEgdGVtcGxhdGUgY2FyZCBmb3IgdGhpcyBiYWNrZ3Jv dW5k0WRvbid0IHVzZSBpdCEAADEAAgANAAoADwANLD8/Pz8sPz8/PywwLAAqKioqIGNs YXNzIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgENBUkQAADSKAAAAAAAAAAAAAAAA AAAAAAAAAAAAADrwAAAYZAAAAAAAAAAAAAYAAAEsAAEABQBzbXBsAAACAAwAQXBwbGlj YXRpb24AAwAFAGNhcHAAAAUAGABBIE1hY2ludG9zaCBhcHBsaWNhdGlvbgAKANMAQmVz dCBUeXBlLHBic3QsdHlwZSwwLFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlwZQ1DbGFzcyxw Y2xzLHR5cGUsMCxUaGUgY2xhc3MNRGVmYXVsdCBUeXBlLGRlZnQsdHlwZSwwLFRoZSBk ZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQ1Gcm9udG1vc3QscGlzZixib29sLDAsSXMgdGhp cyB0aGUgZnJvbnRtb3N0IGFwcGxpY2F0aW9uPw1OYW1lLHBuYW0saXR4dCwwLFRoZSBu YW1lAAAxAA8AY3dpbixpbmR4LG5hbWUAY2xhc3MgY2FwcAAAAAAAAAAAAAAAAAAAAAAA AAAAAAADQENBUkQAADXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrwAAAYZAAAAAAAAAAA AAUAAAL8AAEABQBzbXBsAAACAAcAV2luZG93AAADAAUAY3dpbgAABQAJAEEgd2luZG93 AAAKAsoAQmVzdCBUeXBlLHBic3QsdHlwZSwwLFRoZSBiZXN0IGRlc2NyaXB0b3IgdHlw ZQ1Cb3VuZHMscGJuZCxxZHJ0LDQwOTYsVGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBmb3Ig dGhlIHdpbmRvdw1DbGFzcyxwY2xzLHR5cGUsMCxUaGUgY2xhc3MNRGVmYXVsdCBUeXBl LGRlZnQsdHlwZSwwLFRoZSBkZWZhdWx0IGRlc2NyaXB0b3IgdHlwZQ1IYXMgQ2xvc2Ug Qm94LGhjbGIsYm9vbCwwLERvZXMgdGhlIHdpbmRvdyBoYXZlIGEgY2xvc2UgYm94Pw1I YXMgVGl0bGUgQmFyLHB0aXQsYm9vbCwwLERvZXMgdGhlIHdpbmRvdyBoYXZlIGEgdGl0 bGUgYmFyPw1JbmRleCxwaWR4LGxvbmcsNDA5NixUaGUgbnVtYmVyIG9mIHRoZSB3aW5k b3cNRmxvYXRpbmcsaXNmbCxib29sLDAsRG9lcyB0aGUgd2luZG93IGZsb2F0Pw1Nb2Rh bCxwbW9kLGJvb2wsMCxJcyB0aGUgd2luZG93IG1vZGFsPw1Qb3NpdGlvbixwcG9zLFFE cHQsNDA5NixUaGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdw1SZXNpemFibGUscHJzeixi b29sLDAsSXMgdGhlIHdpbmRvdyByZXNpemFibGU/DVpvb21hYmxlLGlzem0sYm9vbCww LElzIHRoZSB3aW5kb3cgem9vbWFibGU/DVpvb21lZCxwenVtLGJvb2wsNDA5NixJcyB0 aGUgd2luZG93IHpvb21lZD8NTmFtZSxwbmFtLGl0eHQsNDA5NixUaGUgdGl0bGUgb2Yg dGhlIHdpbmRvdw1WaXNpYmxlLHB2aXMsYm9vbCw0MDk2LElzIHRoZSB3aW5kb3cgdmlz aWJsZT9jbGFzcyBjd2luAAAAAAAAAKBDQVJEAAAd8gAAAAAAAAAAQAAAAAAAAAAAAAAA AAA68AAAHoUAAAAIAAAAAAADAAAAVgABAAUAKioqKgAACgADACwsAAAJAD+ABgAAAA9U aGlzIGlzIGEgdGVtcGxhdGUgY2FyZCBmb3IgdGhpcyBiYWNrZ3JvdW5k0WRvbid0IHVz ZSBpdCEAKioqKiBlbnVtZXJhdGlvbiAAAAAAAAFAQ0FSRAAANk4AAAAAAAAAAAAAAAAA AAAAAAAAAAAAOvAAAB6FAAAAAAAAAAAAAwAAAPQAAQAFAHNtcGwAAAoA3ABCZWZvcmUs YmVmbyxCZWZvcmUgc3BlY2lmaWVkIG9iamVjdA1BZnRlcixhZnRlLEFmdGVyIHNwZWNp ZmllZCBvYmplY3QNQmVnaW5uaW5nLGJnbmcsQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUg c3BlY2lmaWVkIGNvbnRhaW5lcg1FbmQsZW5kICxBdCB0aGUgZW5kIG9mIHRoZSBzcGVj aWZpZWQgY29udGFpbmVyDVJlcGxhY2UscnBsYyxSZXBsYWNpbmcgdGhlIHNwZWNpZmll ZCBvYmplY3QAAwAFAHBvc2kAZW51bWVyYXRpb24gcG9zaQAAAAAAAAAAAQBDQVJEAAA3 gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA68AAAHoUAAAAAAAAAAAADAAAAngABAAUAc21w bAAACgCGAGluZGV4LGluZHgsa2V5Zm9ybSBkZXNpZ25hdGluZyBpbmRleGVkIGFjY2Vz cw1uYW1lZCxuYW1lLGtleWZvcm0gZGVzaWduYXRpbmcgbmFtZWQgYWNjZXNzDUlELGlk ICxrZXlmb3JtIGRlc2lnbmF0aW5nIGlkZW50aWZlciBhY2Nlc3MAAwAFAGtmcm0AZW51 bWVyYXRpb24ga2ZybQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgQ0FSRAAA GxYAAAAAAAAAAEAAAAAAAAAAAAAAAAAAOvAAAByvAAAABgAAAAAAAgAAAE4AAgAFACoq KioAAAgAP4AGAAAAD1RoaXMgaXMgYSB0ZW1wbGF0ZSBjYXJkIGZvciB0aGlzIGJhY2tn cm91bmTRZG9uJ3QgdXNlIGl0IQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB IFNUQkwAAAwGAAAAAAAAAAsAAAASAAAABAAAAAEAAAAA////////AAAAAAAAAAAABgAA AAEAAAAAAAMAAAAMAAAAAAAAAAAABwAAAAEAAAAA/////wAJAAAAAAAAAAAACQAAAAEA AAAAABUEAP//AAAAAAAAAAAACgAAAAEAAAAAABUCAP//AAAAAAAAAAAACwAAAAEAAAAA ABUBAAAOAAAAAAAAAAAADAAAAAEAAAAAABUBAP//AAAAAAAAAAAADQAAAAEAAAAAABX/ ////AAAAAAAAAAAADwAAAAEAAAAA/////wASAAAAAAAAAAAAEAAAAAEAAAAAABUBAAAS AAAAAAAAAAAAEQAAAAEAAAAAAAT//wAMAAAAAAAAAAAAYEZUQkwAAA3vAAAAAAAAAAQA AAAAABVIZWx2ZXRpY2EAAANHZW5ldmEACgAAQ2hpY2FnbwAABE1vbmFjbwAAAAAAAABA AQoO6AAKAAAAAACBAEQCEn//f/8AAAAAAAABQFBSTlQAAEDZAAAAAAALAgoANAAwACAA IAAIAAgAAAAAAVYCAABIAQEAugAAAAAEAwkJBK7/+GcSQmcvLv/4LzxQUkZUTq0Oqh4f Ly3Rmi8u//xCp3AkLwBCp06tIRIgbdGaKFBTbAEiQmc/LAEgPywBIk6tIJI5XwEgSG3R rk6tILpM3xCATl5OdU5W/+4vDEhu/+5OrQf6QqcvPAAAASROrSDSK1/RmmYCYEpIbv/u IG3RmiBQLwhwDi8ATq0mGiBt0ZooUEHsAA5D7cYaINkg2Tl8AEgAFjl8AQEAGEIsABpw AClAABxCLAAgQqwBIBt8AAHReihfTl5OdU5W//ZI5wMYQi3RekqtqhZmCE66/3pgAACS QqcvLaoWLzxQUk5UTq0PEiZfIAtmEnAAAAAAACBMb2dpY2FsIHMAAAAgVEFJTP////8A AAAAD051IIpyIGRldCBzbHV0yQ== --========================_26885646==_D-- --========================_26885646==_-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.18.msg ================================================ Path: flop.mcom.com!news.Stanford.EDU!bloom-beacon.mit.edu!hookup!paladin.american.edu!auvm!GAROPA.NPT.NUWC.NAVY.MIL!gary Comments: Gated by NETNEWS@AUVM.AMERICAN.EDU Newsgroups: rec.arts.bonsai X-Hpvue$Revision: 1.8 $ Mime-Version: 1.0 Content-Type: Message/rfc822 X-Vue-Mime-Level: 4 Mailer: Elm [revision: 70.85] Message-ID: Date: Wed, 26 Apr 1995 07:50:09 EDT Sender: Internet Bonsai Club From: Gary Bolstridge Subject: Re: Newsletters & Shows Lines: 16 content-type:text/plain;charset=us-ascii mime-version:1.0 Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948401430.21002.4@Jeffreys-MacBook-Air.local> I have been reading the archived discussions and saw a lot of activity around Dec 1994 about starting a newsletter, posting area and club shows, even a judged show of trees! Has there been any progress on any of these subjects? With all the current traffic of people traveling and requesting information for certain dates, there is an obvious need for posting club shows. The FAQs might need updating to list area vendors. Also, has there been any progress on the listings of clubs? Gary Bolstridge Newport (RI) Bonsai Club ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.19.msg ================================================ Path: flop.mcom.com!news.Stanford.EDU!agate!newsxfer.itd.umich.edu!news.itd.umich.edu!urkabox From: Peter Urka Newsgroups: comp.sys.next.advocacy Subject: Re: The Once and Future OS Date: Sun, 7 May 95 16:21:03 GMT Organization: Squirrel Bin Lines: 32 Sender: preston@urkabox.chem.lsa.umich.edu Distribution: world Message-ID: <07May1621030321@urkabox.chem.lsa.umich.edu> References: <3ohapq$h3b@gandalf.rutgers.edu> <3notqh$b52@ns2.ny.ubs.com> <3npoh0$2oo@news.blkbox.com> <3nqp09$r7t@ns2.ny.ubs.com> Reply-To: pcu@umich.edu NNTP-Posting-Host: urkabox.chem.lsa.umich.edu Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="NutNews,-a-nntpmtsonsguinrcfas,-boundary" X-Newsreader: NutNews --NutNews,-a-nntpmtsonsguinrcfas,-boundary Content-Type: text/plain > NeXTSTEP, NeXTSTEP, NeXTSTEP... Don't you mean: "NeXTstep, NeXTSTEP, NEXTSTEP..."? --NutNews,-a-nntpmtsonsguinrcfas,-boundary Content-Type: application/postscript Content-Transfer-Encoding: base64 --NutNews,-a-nntpmtsonsguinrcfas,-boundary-- Peter Urka Dept. of Chemistry, Univ. of Michigan Newt-thought is right-thought. Go Newt! ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.2.msg ================================================ Date: Thu, 6 Feb 1992 11:51:37 -0500 (EST) From: Nathaniel Borenstein Reply-To: Nathaniel Borenstein (=?iso-8859-8?q?=ED=E5=EC=F9 =EF=E1 =E9=EC=E8=F4=F0?=) To: Nathaniel Borenstein Subject: test of =?iso-8859-8?q?=FA=E9=F8=E1=F2?= in mail headers Content-type: text/plain; charset=iso-8859-8 Content-Transfer-Encoding: quoted-printable Message-Id: <635263359947544690.21002.0@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 This is an ordinary text message in which my name (=ED=E5=EC=F9 =EF=E1 =E9=EC=E8=F4=F0) is in Hebrew (=FA=E9=F8=E1=F2). There is Hebrew in the Subject and Reply-to headers, if viewed with metamail. ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.20.msg ================================================ Path: flop.mcom.com!news-mail-gateway From: MAILER-DAEMON@netscape.com (Mail Delivery Subsystem) Newsgroups: mcom.incoming.client Subject: Returned mail: Host unknown (Name server: maine.link.net: host not found) Date: 26 Apr 1995 17:08:35 -0700 Organization: Local Mail/News Gateway Lines: 109 Sender: daemon@flop.mcom.com Approved: usenet@netscape.com Message-ID: <199504270008.RAA17252@neon.netscape.com> NNTP-Posting-Host: flop.mcom.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="RAA17252.798941312/neon.netscape.com" This is a MIME-encapsulated message --RAA17252.798941312/neon.netscape.com The original message was received at Wed, 26 Apr 1995 17:08:30 -0700 from cronos.mcom.com [198.93.94.116] ----- The following addresses had delivery problems ----- (unrecoverable error) ----- Transcript of session follows ----- 550 ... Host unknown (Name server: maine.link.net: host not found) ----- Original message follows ----- --RAA17252.798941312/neon.netscape.com Content-Type: message/rfc822 Return-Path: client@netscape.com Received: from cronos.mcom.com (cronos.mcom.com [198.93.94.116]) by neon.netscape.com (950215.SGI.8.6.10/8.6.9) with SMTP id RAA17240 for ; Wed, 26 Apr 1995 17:08:30 -0700 Message-Id: <199504270008.RAA17240@neon.netscape.com> Date: Thu, 27 Apr 95 01:14:08 0800 From: Christopher Lamey Organization: Netscape Communications X-Mailer: Mozilla 1.1N (Macintosh; I; 68K) MIME-Version: 1.0 Newsgroups: mcom.incoming.client To: drwebb@maine.link.net Subject: Re: 90 Day product Support References: <199504251257.IAA09959@maine.mainelink.net> X-URL: news:server-2504951544190001@ub.mcom.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii >drwebb@mainelink.net (dennis r. webb) wrote: >> 1) VIEWING EXTERNAL IMAGES >> I have LView 3.1 and have told Netscape in the Setup that I do. I have >> not yet been able to get my Image Radio Button to Light up, it remains >> grayed out at all times. The Image button on the main interface, between Reload and Open, is for reloading images on the page you're viewing. Sometimes Netscape Navigator incorrectly loads a file's images. The Image button is for rectifying this problem. Netscape Navigator has built in capabilities for viewing jpeg and gif files. You don't need to configure a viewer for this. >> >> 2) HELPER APPLICATIONS >> MPEG : Downloaded MPEGWIN.ZIP, MPEGXING.ZIP. Was not sure if I should >> download MPEGW32g.ZIP. I have a Pentium 90 Hz system with 16 >> Megs of RAM, 4 Meg Video Vram PCI CARD and run windows in >32 Bit >> Disk access and 32 Bit File access. My conventional memory is >> 617 K . >> Noted that you have "Netscape Navigator Sound Installation >> Tutorial for Windows". This explains how to Install "WHAM 1.31 >> Audio Player". Which MPEG should I install and how to I >associate >> it with NETSCAPE ? There are hundreds of mpeg players on the Internet. Which one you want is a matter of preference. We have WHAM 1.31 on our page b= ecause it's a widely used and accepted player. For more players and info go to this URL: http://www2.netscape.com/assist/helper_apps/index.html No matter what player you choose, configuring them in Netscape Navigator is the same. In the Options:Preferences:Helper Apps menu, = you can tell Netscape Navigator what to do with certain files it downloads. To play MGPEGs, set it like this: MIME Type: video/mpeg Application: Wham 1.31 (You can browse to make sure the path is right) Action: Launch Extension: mpeg, mpg, mpe >> TELNET : Downloaded WINTELB3.ZIP and TRMPTEL.ZIP. Which should I >use and >> also How do I associate it with NETSCAPE ? >> Once again, which one you use is a matter of personal preference. Both are well known and used applications on the Internet. To ha= ve Netscape Navigator use one of them, go to the Options:Preferences:Applications and Directories menu. There you can set Netscape = Navigator to use a Telnet application. Simply use the browse option to specify the one you want to use. >> 3) QUICKTIME >> Noted that when I was in NEWSGROUPS that I need QUICKTIME for >> some Videos. Was planning on downloading it from >gatekeeper.dec. >> com?pub/msdos/win3/desktop. There is a note in the File Index >> that says "(REMOVED by wayneb@apple.com). Do you know of >another >> location to find QUICKTIME (qtw111.zip) and also how do >I assoc- >> iate it with NETSCAPE ? Try ftp://ftp.cica.indiana.edu If it's not there, do a search for the word Quicktime. The configuration the same as for a MPEG player. MIME Type: video/quicktime Application: MoviePlayer (You can browse to make sure the path is right) Action: Launch Extension: qt Thank you for using Netscape! -- Chris P. Lamey Netscape Customer Support client@netscape.com --RAA17252.798941312/neon.netscape.com-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.21.msg ================================================ Return-Path: <> Received: from navstar1.mcom.com ([205.217.251.46]) by hedgehog.mcom.com (Netscape Mail Server v1.1) with ESMTP id AAA29011 for Sun, 21 Jul 1996 16:59:17 -0700 To: atzet@netscape.com From: mailusr1@navstar1.mcom.com Reply-To: mailusr1@navstar1.mcom.com Subject: Re: mailusr1@navstar1 3.0b6gold #1 Date: Sun, 21 Jul 1996 17:02:55 -0800 Message-ID: <19960722000255.AAA26598@navstar1.mcom.com> MIME-Version: 1.0 Content-Type: multipart/mixed;; Boundary="===========================_ _= 1212158(26598)" Content-Transfer-Encoding: 7bit X-Mozilla-Status: 0011 Content-Length: 1213 --===========================_ _= 1212158(26598) Content-Type: text/plain default echo 1 default echo 2 default echo 3 default echo 4 default echo 5 --===========================_ _= 1212158(26598) Content-Type: message/rfc822 Content-Disposition: attachment Received: from hedgehog.mcom.com ([205.217.251.17]) by navstar1.mcom.com (Netscape Mail Server v2.0) with ESMTP id AAA3678 for Sun, 21 Jul 1996 17:02:54 -0800 Received: from cabrillo.mcom.com ([207.1.136.82]) by hedgehog.mcom.com (Netscape Mail Server v1.1) with SMTP id AAA29001 for Sun, 21 Jul 1996 16:59:09 -0700 Sender: atzet@netscape.com (Michael Atzet) Message-ID: <31F2C3F2.D47@netscape.com> Date: Sun, 21 Jul 1996 16:57:38 -0700 From: "Michael A. Atzet" X-Mailer: Mozilla 3.0b6Gold (X11; U; SunOS 5.5 sun4u) MIME-Version: 1.0 To: mailusr1@navstar1 Subject: mailusr1@navstar1 3.0b6gold #1 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit mailusr1@navstar1 3.0b6gold #1 -- Michael A. Atzet atzet@netscape.com Netscape Communications 415.919.3274 --===========================_ _= 1212158(26598)-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.22.msg ================================================ Path: flop.mcom.com!news.Stanford.EDU!bloom-beacon.mit.edu!hookup!news.moneng.mei.com!howland.reston.ans.net!news.sprintlink.net!news.ip.net!news.iclc.net!usenet From: ross@iclc.net (Charles Halle) Newsgroups: misc.entrepreneurs Subject: I DID IT - I'm a New Entrepreneur - Date: 25 Apr 1995 20:51:43 GMT Organization: HALLE ASSOCIATES Lines: 46 Message-ID: <3njncv$1kh@castle.iclc.net> NNTP-Posting-Host: shade.iclc.net Mime-Version: 1.0 Content-Type: Application/octet-stream X-Newsreader: WinVN 0.92.6+ FROM: Halle Associates Charles F. Halle Here is some new information you may find interesting... I am now a New Entrepreneur.. I recently became an Entrepreneur and thought you would like to hear my story. Being retired, age 72, I was bored , and I wanted to contribute something to life. I am a Ham Radio operator, but that wasn't enough to keep me busy. In addition, I needed more money. I have a Computer/Modem and was fascinated by its possibilities. Then I heard about the Internet, the Information Superhighway. I heard about a program that gives advice on how to become an entrepreneur using the Internet. I bought that program and started to use the Internet to market the same program I was using. It proved to be quite successful. I did not get rich, (yet) but my time was very well utilized and I did make about $300 per week after using the program for about a month. More products are being produced, and I fully expect to be able to market these products successfully. It proves that one is never too old to become a successful entrepreneur. I am very happy with my progress and will continue to grow in this venture. If you want more information about this program, please contact me at: ross@iclc.net or Compuserve... 71420,1642 You will be glad you did ! ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.23.msg ================================================ Path: flop.mcom.com!news.Stanford.EDU!bloom-beacon.mit.edu!gatech!howland.reston.ans.net!news.sprintlink.net!gryphon.phoenix.net!news From: skyojedi@phoenix.net (Skywalker of the Jedi) Newsgroups: rec.games.video.3do Subject: M2 Screenshots from GO! - 4 Attachments [1/5] Date: 5 May 1995 04:11:15 GMT Organization: Your Organization Lines: 954 Message-ID: <3oc8h3$edc@gryphon.phoenix.net> NNTP-Posting-Host: dial47.phoenix.net Mime-Version: 1.0 Content-Type: message/partial; id="799653575@Skywalker of the Jedi"; number=1; total=5 X-Newsreader: WinVN 0.93.10 Content-Type: multipart/mixed; Boundary="*-*-*- Next Section -*-*-*" --*-*-*- Next Section -*-*-* Content-Type: Image/JPEG Content-Transfer-Encoding: x-uue begin 755 3dom22.jpg M``HS1$]-,C(N:G!G```````````````````````````````````````````` M``````````````````````````!*4$5'.$))304``*0!R````````(H?```? MK:O.]9ZKSO6C``````````````````````````````"!@4MM``#_V/_@`!!* M1DE&``$"`0!(`$@``/_M`;A0:&]T;W-H;W`@,RXP`#A"24T#Z0``````>``# M````2`!(``````+:`BC_X?_A`OD"10-'!2@#_``"````2`!(``````+8`B@` M`0```&0````!``,#`P````$G#P`!``$```````````````!@"``9`9`````` M`````````````````````````````````````#A"24T#[0``````$`!(```` M`0`!`$@````!``$X0DE-`_,```````@``````````#A"24TG$```````"@`! M``````````(X0DE-`_4``````$@`+V9F``$`;&9F``8```````$`+V9F``$` MH9F:``8```````$`,@````$`6@````8```````$`-0````$`+0````8````` M``$X0DE-`_@``````'```/____________________________¥#Z`````#_ M____________________________`^@`````________________________ M_____P/H`````/____________________________¥#Z```.$))300&```` M```"``;_[@`.061O8F4`9``````!_]L`A``"`@("`@("`@("`P("`@,$`P(" M`P0%!`0$!`0%!@4%!04%!08&!P<(!P<&"0D*"@D)#`P,#`P,#`P,#`P,#`P, M`0,#`P4$!0D&!@D-"@D*#0¥.#@X.#P¥,#`P,#`¥/#`P,#`P,#PP,#`P,#`P, M#`P,#`P,#`P,#`P,#`P,#`P,#`S_P``1"`#*`3H#`1$``A$!`Q$!_¥0!H@`` M``$S%F+P)'*"¥25#-%.2HK)C<¥(U1">3H[,V%U1D=,/2 MX@@F@PD*&!F$E$5&I+16TU4H&O+C¥¥34Y/1E=865I;7%U>7U9G:&EJ:VQM;F M]C='5V=WAY>GM¥?7Y_(B8J+C(V.CX*3E)66EYB9FINGM¥?7Y_(B8J+C(V.CX.4E9:7F)F:FYR=GI^2HZ2EIJ M>HJ:JKK*VNKZ_]T`!``H_]H`#`,!``(1`Q$`/P#R;822&70LQD'>B*QE8YTMQ¥(I$U!4 ME1T;OO[Y=CP1[FW8MBRYL&]-"2:L&50"IZU(K]`RO(`.@8<`[DWCLXS+&EI: MF69$HL85:DGI114;=CE8@)N1E# MA.PMKJ7>D:+];C51!&W%2&JM>(K]D"G2F$`RYQ#,/5?(>JZ_^7LMS=:;Z-F_ MFVS&E6_UBG!H93R$@564*4;H6(IX'`<9¥@CPR>3Z3OOS0¥^V5Y?ZQYJLCYD¥ MQ>4?+]IHLLCQ6BFVLY35;F;T+=XH^?0O'PFI^V.N3¥"!Y_W]#2H)Y!Q0V?J%Y)G/>9G<^+#*O"B#U"/#B&%2 M02PK!(P475U6:^BV6A;[)JOVBWT9FXB!U/R3P@2]$L;0:'S"ZEY?T%A;Z1'Z'Q>M?WUP)I+SCO¥`!)(J+^P1L,PY"N8;.#($ M,-6T'3M2@TO3?*&G-:2I`+ZYT_4+A+C4+K[/K&ZCG]`1Q#=49"OBV1,;Y&D4 M>H^U/_,FEP^9M)M'AAD?ZE+-RN9V#SR30$,"JJPCJ@Z,E`?;+80(ZVP/N8;; MSZ;<0V&I7-A;>;Y;25ENY#6¥RT$T%U'5E-.TB-P?KMB.$¥I%B3?(L MKT^V$(FN(=3$?H2"70IH^+F.(D&42H_&I8U`XDGO3,>>8#H2F/Q>J7.I66HO M'.B21_60#=0>H']*9!]DMO7;>M=O;,?)FB1]/VN?BQ1G_.2&>_¥`J¥3JXXQL M2.0;X#S/3K4YA>/1Y!SQH`?X;26]DEN!"LS>NMNK¥VD-6.U%0?Y.7?G3719: M"/¥`-I)54K<6_(DLY'I)M^[9=P5'8^!RD:S)?)J.EQQ5S'.XO>4A$8QPVK,SRR$`4I MN:["M-S2E4Z2#9I(U(` M6H[_`(99'(>M?-Q9Y!W!"3>91JFA7NF:E,)M5F-9=7N&KZRK3AS)-`5[;83( M'J6F[2H"W"B%X54O&%E7J)`M#S<'N#TR0N/*RV<([RHS%9#*KPI.ZMSE>4!G M-.C#;=O#`-3/J&/#'S6RO!74_YU]¥G0[@PJ7<__]#R%!(0KM0D=3FCR6.I=J1 M?()O;OQ@+¥EG8#@*FAKW^D94*ES*..<>0**9X(WB=&*,'H?BZ+0=_GVR<1#¥ M%EXAK8/`O-7GW5]0U/5=#$C:-:Z=.$:"UDXRSH>I=QOQ;P%![YDPPP[RX&7+ M9WIYN$1GFB25RLB.T<*G92=S0+6I(ZY;&$;V<$H<2%X4B#40_NECI3B5]^^9 M/IB%!*V`I%(CLS,B$J%(I4C8[CWW¥<'B8Y=2SX:ZKXT]6:(MQ8PN2W+84ZCI M@¥+N^]E$D?V)K;Q)(7$7.5JLPCINQ)H*#>ORR.3-&`W%?%RX8^+H]X_+'¥E] M;_,>_&FVT15[ADCMFB^$EVV')J'B%/VB%8CPS63[1@#S81/YM?E5Y^ M_*77(?)_F73;+RYR@7ZO?V%Q'-]?A/Q*¥]T/W]3_`".%'¥HIF7BU¥#_$'&RF M(Y`L.¥B#3M%U*:_73+#6-4L1ZB7^JP_6=/L5_;=[1F6"5C^SZ_J+7?@QL-.OO MTK/>3^8KF,MY?5$JMDQ8,);@NR'B?V`BM¥QD.*9ZA8YQU#T7R;J,[/>6EMIL M6OZ+9O!K?F6+5HIY++U(0/W]^]M68QAMPA)4FGPTVR=P/.0#?]7(AZ1)YFU' MS7J]A)>/>>9T-19WLT*6UM#^T%TS2K.5;:V2FW-V)8;M$#DH&'25I&/S##V] M(3WOKR&.9KZ2K"C1[?L*U34#H:#;,_'CXNJ3A/0J[76DZ?%7'Q!P98URDSN<>J.M8_-7GB2YMDB6_/E_2Y=0N/ M+MB(K73=-MXOB#`?!&64=.(,GB¥[0UW*(T4IZAQD(0AUICP#J?M9#8:I:W5K MING6^D7.A?6`;AHIKKZS"%E'(^A(Z"41^"3&1@/]V')R.,¥C3+@B.1M@>HM; M>7+V6T@T4FWNXI7@OHYB3RE:LGJQ$L!45IZ94TRD"0Y3:Y`,1¥WZ9:>8?,L4 MEM`FCLVC11V=AR*H]/VD3;T^5*[C+)>)/O:Y4.2!¥I7<'I7EM,6>Y¥NW!,'$ M*¥Q9/M1KN`R^%2,A^7E'H?FF,O,LLTK4],M=+N;E+I[;2?-=P[VUO*I$WUI3 M3@`.1K7;C6GOWRC+B,AW?%V.'(8¥I)Y/!-62":)N:J#<,Y`X@`?:WI7P%';;P^>#Q3+N^3*QW_:KO%3TD5^" MW49F#DTH`:5&^U>_X8/$S1ZCY,)WWH.58XV-9.'UD¥$[(66E6'C7*YY)EI%C M^(+;J#C$TBH2P!4@T%2=C0]SX9",LH;`?-"RI"DD8#^A';Q-2U=@, MS<,ISZ-67)+H7A_F[S';^8K^2VAN5?0K)O¥`1BCD&YD[N"IXF/L*=V)G+NMRHV>H6J9%C]. M21?31@B$&A8UK0;[Y6./^:B6W5.I?+&I6VEZIYCNZV,=BOK16LI"32(*;R*6 M4QCPJ*GPP<$S_"X¥I2Z('](K_P`M(_WD^N?8;^[^_K[]H,G%3LH`&V_7;.?R:OM=J8D_VHMKIDE=48QL51UCK4TJ M"=O`Y7PPY2!1X15?KTRH¥**K!PU4V!HQW`-3%/HFWEK5M._)WR MM??FWIN@Z5JOY@^>=66S¥D^9K^UAO(_+HL_AEGC@O(IXVFDZ#DFPZ9NL$3(< M[^#AY,9CSI'V?YQ)^?WF'5M$_/K7O+UWYDU'3&M_(GYL7]I;:++I]ZGV(+^Z MTJVC22V?H!<1L%/0C,V&*`Y@GY.++(0¥/¥¥_E?YP_+6[BM/-&B&"#6`TOEWS M!:_Z1H^JA=Q+I=¥@,^8OB1Z!D!P]"RGR#Y$U;¥PO.F@>1M*N8M.G¥P*YFU20?NK6UB'. M:8C]I@H-`.I[Y.,N+F"VB5OI2]_-K6/*D-MY/_)N]NO(_D?2>6GIJ>@22:5K M/F*[M?AEU#4=2M72¥E/(42,R¥`/V,JRX8D3ROJ M.B^>O,$NN_FWHVE32^2M4:$?6RBK5K26=$5)FXBI$Q))WJ3G-:S2$G8%V.,U MS(+X:_-S¥Q]=_,/6TUWS6I197DG_`$5')6Y=D8H[2OQXQTIV'L,AI-#G!YM& M?)?1XNVIP7Y6**40VEN28BM%C]6O4*!UIU8[YU&FP@#>OFZZ42A/,^H>3+:& M*QL/4U/4V4/IWZQZ[#%:*]G8VB])/6]4R2OW">D![Y5'!?U209R[@G$TWE+0+M-6T'4; MS7+K3I9?T+%?VD4#>NG]U*¥:SSJ16A6K?,9"6F`ZDM?&3S`5&;2M9M]&G¥Q> M9KQ_.GFW41)YLN(K6-+&QLRX">I*C*X95_9BA(/9JX8:>)[UV/¥`"_0K4/¥` MG*X^0+?2_*7_`#C9YET^U¥J?E_9VFG7OEV?1K>&WUF20+Z^HR/=(EP:$FBJR M._?)'#$?4?N0!,=*3[¥]M?L=)¥WVWDSRC9GRA!YL¥JVNN^:[?R[''IC7]WE$SFO`?9+TZD¥4_P!1>F60A$G;[VWQ04D;2XK[38+^¥#Q:;#=".ZO80"¥< MM=@$Y5W[$[9+)BH=6N9AU>DZ1K_^&?R/_-_S#Y0¥M/#/K-[8^7;'4+ADO-0N M)$6I=!&MZUYPTS3;?5+?5-5N.+3VMU>2136]OPZ$Q/¥_[::V_,V,6<'E^UUS5/+MGJ_GK13(%E&N2*!*!>.C+:<#UC:XC1NO%L MQ1+&SAEQR^FQ¥GSSYHMD&FV]TNFV^HW)65VEY!:/&#SB]2+XF6NXXFC==¥D) MXAT93B0¥QT_5+&1].U]O+::W+I-L3)I-W,5D8><^97T6Q¥SV6O>5)[W1+;S$KWNJV$I(N+2]&T@0QA.,;CX:*2/$]L M&7+(¥C]C:(Q/1DLM])?WRSSP:=::=;QK-I<:+'!#'+QVCCBA`XLY^TT49->K M#KFMRRR2Y_VS$2,Z!A¥>W0=]JXP[,$?XE&2,N19/) M$([^.#XN`D*>E4;UZ4-:=.A.2G",.0+E1A$]2Z5'AEN#L0!P@!(9T!()(KL" MT)CF5`T:-¥1*B@``_'+XZ7&?X@PG"(>#>=O,T]Y=:C MH-NTD-A&M=39:%I213TSO0`G,C%IS$[%U^2,1U8,2?3C$2!E2)IFXT6-1S=FIT`!ZTR(XCR"+B.KW7RMY1D¥OV2 M:I?QPW.MZG9+[=NN(ZJ,PJ[-,S<37H?'W]LOPR/¥0<;*1W_:ROS-8+KW_.-]QQ_E'Y7_,&W M;7OR3¥W0BU8R277Y>>=]0T[1_,<-?VH+JYG@T^^@6O¥`>F:%_&,Y?#T¥[^34 M8RZ,@MUT+¥F?)&K6MCYJT+S'^2XE! MH_U9W`ZWNOJGF"[GAMXI[R9"(HQZK<[ MB1B:!8E9A[#,6>"^;3+)E'5X5YVUMM7U&>.TD-I;7%Y>3ZA<$4>9I9#P#.?B MHW6AW]LA'"!R0,TCS+SI3=B*&"S<^E92F3@FW&G>NU!XYE#&`&/',L?,HCYN M)6?U97F7+*+.:?C M3G-R5_4XC?C0?/!X@'6V4%6G!@BE=IIIW8<49M^"@[¥!V!/TY, M2!Y!N$KZIK%]61K>'3;9]3UFYK;V4<8#&61OACX(!2I.PH,D:'1(G*/5]L^6 M4¥@?¥XX:%Y6_3GD>U_,7_G)W756[AT2_0OI_E8,.4,D]LA87=T0>2JU64T^P M-C5*8ESOY-E¥74)IY1_-BRUK¥UO,_P"8WG70)//5Q%Y>N;C4[_S%#%);BZMQ MQCA-C&.(@5Z`A&KVVRCBA#^P)CCOE3U/3CH'YK^9/RN¥Z^>8+'¥N=#¥EW]QKUMI<=QY9MU@L-3C24QQK%:"6:6&X50!(SFK>(Z9E M_F)2Y!QI2GU5/.%MHGEWR3^4/Y:-%*E]K%Z?,7F#R-:$+<3¥B`D]U(.2HG'H MK`@_M`Y5+/,?PW¥6KBB'T5^9?G;¥XORZ¥U>4?R[_`.<=[B/R'Y)?RQ!KTUH- M.L)Y9)78+*6EU&&19.;;<;G^?ORN¥P^K+ MY>_,3S=HWUOS=H&ARM:3QWT"_#?AUBMI(Y&IOR4,3T7*SI¥9_B0¥I#DJ>_+!#(`>18DD,-¥TVWZ9UKR MZ?62`0:=.L;DA.>*DQG(LXTZ_U6[DM;_3]235()A-;:C9RN#':.2%6:I8% MI67]DCVWP7P]%XDB&F3^7M6DO9&^M&RNZ1¥V"22G8A64;(1X'H.N`S!YAR<. M0`¥J>JW2R/%!)PVU;_2W@)'*(**BK*:%1[9@9Y1'1V^/+$CE:%X.R,Y0_O5+ M12;!21MOXYA"<9AP3RW6IVYU86Y#6+,GK-(WV2$'Q4'B13 M,B$:YFW&S9I!¥WQ27,L5Q+2BI8_"=MZ#YYL,7`>[YNASDR45Y M`NS;M#*`&4_"13VZ9D"`Z%IB*YH*9G3FX^)MV!!VH>XZ[Y91ZDMXA%N!BX:M M.1^+DQK0^`!^_(DCO*GA#T/¥I41O.%NUU`&DM[:4VDG+_=IV#`-M7VZYE88Q M/5'-]!Q*QMWY1R;,ZR,6W7?XJDG¥3ELN&/5G&,4IT&SN?,EY-9Z'"]U)I4JF M^U12!;VJ$[,TA^$GV!)KF%DU48]0Y^#0>)R#Z"_Y4KY!_P"+/]Y/K/¥`?7'_ M`!T/^6W^¥^U[?8_RH-#EHC(@?DW6 M_P`[KN=M.¥YW7YBK&ED]E;L0^EV+:G:SZ/,¥S*%?U)4)KL>^9F,9!U<9FNO_ M`)?Z/^VD:=(NF>3-.*VOE_S;I:FJR:)=(D^GP/)]I5A MD:(D_"!EWB9?*6O:3K6EKJVAW^F+Y'T;2+QK#4].NXVBN8[H'= M;M=II7H-JT0C[)IDQOR-J>%CU_8VCSW#Z?*]Q;1)$EG<.H4SD#XWXC[(&X¥< MD,C_`)?="UCSEYXUC_``I^6&CRO;M>H8EU#6[R$OW.C75Q/97"Q1W;?E:QL- M5U@VMV472%]2Y5JCD.'Q^FO05)Z5-!X95+3CO1P6F]C=ZQK%QK;Q:6^I2Z4[ MR"'T_5_1MJ3Q#5`!7G7=NF52P>83X00UYY;¥UZ>EA^D=%O[%-0=FL6NX)(HY ME-*NA=0"`#N0:#&,".J`:Z,¥TVUD¥JOI5SY0U.?4?-^F3B_¥VW5K9>K;Z984 M#!`TB2*Q8_:=?A[&AR¥X[_B*=CT?2MI_SF?_`,YC6O[H?F"^G:?%,%,8@,HM/SI_YR!¥^:E=^;;C4=.¥MG6M,7 MR_/^8NIVEM9WVH6X^)H/JHBX7"EOL&SM#(O3EDI8]MP&PP@>5M:N/S-_+C2? MRSN-2¥RZE9WWE^:[&@&[^JVFM/;WIK*L6G@2WC6DI/Q_7J!A_NO*ORHD;%,` M8^?S276_S&¥W^=)/)WDSS1:^7O+WE#RKJT6HW^C^6=+LK*UMI4E]:2XMK>WB MA5IY:`,2_&N],OCA(V9@03?5/S9¥OZO^:WFCSU/HMU=_H;2+?0O+=A$T-K-+ M:*H0M<7#QWB)(Q%:>E(M-A3*YXI#O+9Q0`W#UW0_^MUDFUBZNQ'!*]:'U).!Z"-1L*S'AY@_-I]%¥GFL?G7¥W MO,WGJ?SSJAM_,GG#4+5X9]'LK)VADM`.2I=L%XRA!N!;QB(C_=C#&OYM!O@` M>5L2OO//FF2"XU6^L='.DW!AANK*W@J$[K(Q%>U=¥EQR M//A8SC)#ZU=:K9K:M8"*2.R,=XWKVT%Y!=Q<=F>WN4EMY5-?]V1L,>.OYK68 M$¥_O>=G5H;O4+/6M5¥O:;='2YYKB/2;13I¥'I¥HH&7J!!&B'IQ&$YCW M!1C`ZL*¥YW6AC6T¥P^5I;BWM?-L0O/T;/;BWFANH3QD<,/W

IB(I/ MJ0N(K:2"]BD]"YF$"V¥T¥;N9HQ¥,E-I!'Q[E1_K9C9)&/0.3"8'0L¥T/6(KG MRU!%N]U:2/%?7+$<5#&B(F^Z^^:[,.+F'88I"2V6¥E,=O"PZG(T¥]PQKQ3HD2+6@/CFUQ8HTZ; M4B=¥PQ_ZLR22)-1%<'DM.1^'M[US-QU#D`XL8GJ0@T595`C^#F2&HP89UWH1_,:'PS7ZK6$.YT6C.4[U^+ M?4&A^6]+¥O:$^E:1"(;=YU;4;F;^]GF78DD`44?L[;^VG_``?V?;+OS)¥T^''¥!__4^6TGG*"-K:+3:7I+ MNKS,U(HWZ[]WK[;9K[$F_C*_19S?ZQ8W&JW#WD1OH#,E>%`7&R!=E'7C'Y2:[?¥`F+¥V]*FNOJUGI>EV6H:[<6NGM*INOJT)>%[RZ:3U M)BIZ!F$?;@,OA*/1QLA!>!W%W+J,][JMV(Y/TQ>WE['&Q"*QE=N19=E!/W9, M2/]MUF#S9)^1_Y1QZM:7UG_/3RRT=I9PM?0Z?!YBT]!^[L MKBYE1;6.Y0?9_?!O"F"0D?I^YJ$9176WY(R:+:W_`)¥_/3RY-^7?E+2I3!H/ MY9I)]2UOS%A];9'U2E>9/VCF7/)BZ`I&,1ZEX M-YT"17UJJJ8K6T4VNFQLP?F%ZN2.I;KF-+@/4(,V!VMHNHZK#8RWB:=!<-26 M_E^)(UK¥55!%33H.F8YB0=MV/'YM><(=%M]:U&Q¥M2RC2;"%(TO)23<3SM3E M(:4`7KLM,E(BMPQX_-*-*NOT8S&*8$`$`'85I4D;4^_,3YMHGYLCTU;^9K^> MWOY+3]+1BWU`JQ7UD;[*.!3DH¥-¥M`!Z%KE,(W69M=T&YTG0]2U9G:QL_P#< M1:_6#*8(&_9*U/IU[`X!"3$2!;T6_P#,-DNJW&BZQ?V%WJT0M-4U&TFDA?ZN MY%8&DC92%;P/RRRZYLGO'Y6_F?¥`FEY3G¥NZ1Y)UNXLK/R%],U:]'#$=L,,I)^ILC(]],P?¥T?S,T"WM],C,.E:WK5K)K5UYS@@B MDUF¥M;R0F007-2MM`#M2(1D=SF43&0WW4Q/4E&:-Y4¥ZZO>/KL<I8](7N#-(D;*>2@L7UI(+?BL<:_*MNB MVUE87WF'4M+8?58)?3LM&L946AEMH8F/PGH[*UNU?VCF+//.??0T>[U#3[QTDNO*FCQL+.5F8&.5X46EQ(IW65UD6UWIT:2#3+6_P#W%DL8&UZEK*Y-S38>H.1&VV0(KH3¥ M&H_79#-J:3^M`0OIB2,G<¥%;9@=]CB,LNY'XY,&UN[¥Q-< M?OM#M=SK,UZMJT9MC+0%KR[M!%.[#JOKRLOM3;(3E*7(-4XEYUYDMI-5U M6PN/33ZKI=C+#HTK$1¥WEW/I[@%F.P5*D]ACBL?5][#<)1H6I:Q:P:AI=J9+ M"^A3E=V;)P(X,*I.C@52N_&0F3E M;&RO(B/@FD+F&`(O9FHH[$91.,>E-F.9/-`^5[A+9[JQ+04$DML7A=;@WA!^ M$PLC-&T:]FC-#XY@9B3R`+M,,J9%Q*?"`Q=)`%7IQKXCY9CPN]PY,LD@/V/# M/.'U:Z¥VZX5D'HP0Q16W$BBR,1S)/E8- M.TW2;>6>>YN5$2*I?TVY5J?`>^:S49^'GN7;:'2',>7XW?H_Y;¥N6?DW2Y[. MR2.6YU%@^M:C;NY+3IU"[`D=CL,X_7=HSO8?:/)]"[+[(,=^'¥;LG6.-G2*8 MF")@LC0*?N<;>/7KF!I=3DE+>OF]28&$*X63^G'_`,MA_P!Y?4^TO7_@OMYT M'%+R^;I>'^B__]7Y%:9IZV]MI:RLJ&;B]U:CXIN+BJ.P4<54]N1K[9KI0/=; M$RKJ67Z18"VDBE%P/6291`BOPC@8MO)<2/¥`"`!T]^^6Q$NYE$^][SYEL=`N M?+/F.RTS2G>^2&*:.YFU()(70`R.L4MPOJ@G>GIFO89*4&@?EK M^>7FZZBDN!-H5IH6FR0N5G-U=/4E.#!E4#K4?1E7B&/.F8X>H>A>7GUW¥C_R MX_+#6?*>@:1>^9_.DL]]_P`K=N;"WUF6S:,<8M-TQ[Q)H+"9=^3"-93U!RX9 MXRZM/#&7(AYOYN¥T^=?-#7&H^9/,4VOZYK-]Q¥P6,LL]Q?!*U4&5QPX^R.0/ MY1C+)_6X5R>E!UP1E*] MK8'(>AM&2W$M^T-¥FGQ:7;*I@M[*$2#FJC^¥9I'8R-XM6GL.F98QS(V8$$JA M;ZO<:9"6:1&@FGDB0UX,!11Q[UR@F8ZM0RZB]@CVZRR0Z:YN(7 MMPU(C3^¥=QU^39(#W?-EX0¥UNG>A-JEO>7D0U!9>4]T6-6E>FS¥FKT¥,@9=R M?#IE1N+R]*BRCG+SIJ'%HH+[F.21P1&DC1JVW[T#?<#(G*40XQSI[+Y2¥[Z=Y?LM0G¥P:3?^ M:?,ETD":%J-U=TAL881^Y9)O3DDX+T]&)XC3_=@Q$I'K]KD¥1/5E":W^:7YJ MQSZ3ID%_?Z=?R++<^4_+¥/U'39_3I266UBVG"TKZDPDP7EMJ^H:1)%Z¥^DQ)%>RVQ]6-GI5_2*¥@/3Z$U/T8:CWMPQ<'5!0QN¥-P¥ M"$-`.,4;G[8;Z_?0QG48M)TVV M1?M&>>6%N<1Z-PF@]GRGBAU/V*8S¥F3:EYYUW63_`(1L#Z6F!V73_)?Y;P'3 M[5V-&-O+>R1RRW7+[3&5;M?Y77KE<¥D?X26H8¥O>H23IY575IKG0O*UM<0`2 M:/Y9>XN+R1;I0#2ZN(IW!E6M3'*Z*>T?[.4"1/,ED3(U([$O`[>XZXD2OE]K`<:*U6*ZM(X;[19 MGL]1L)5EM=2MY&B9G&S.'C^)21T*_1F1&7".3;?>&)W%O+)K=EKNORPZE=O< M?6([^.]M[Z]D2(5;U5@ED9&4]YN+9'Q>+J&B42P/SM=^6D¥Y0>9/*]K/IT/F M>W:ZU&TD1$].Z@-.1XLPK)WH:?3ET8#^<&!M`PP:7)IFK7MS<*NFZJYN&¥OR M0S3))<=#-]9C640D=E=5![/CPXN¥L8¥0ZH6T@L-'U&VTK2+2ZM(8(?K;7MS/ M&1.ZCD3&OIJ85'3BSR$]:]LQLV&!^FRYN//7-D=AJ6EZQJ$T=GRG8TEO[E$9 M8?6&W$F0*2WO2AS`.GF>]LEGL0[)-J,@*2FK5C-'9JUV¥*9D MXL-BD=P93(IVBC)!Y*_78= MAC+,)A]AFMU.HA#=V M>ETDLG+=^@/Y9?EQIOY;:5+:/]4U'S1*?2U/4HP[1+R%0L)?B^PV.PWSS_M; MM>F&W]CWO9/9$X¥P?Q;U,VR+#:+'&82LCHT2D%@&W)/C7VSC¥N3/,¥GML M6*>.-`*AMRZH$JSQ.$D4T#?:Z"FW3KMF;H(YS+>OQ;#+CRD'/O#I_#F__6^3^FVUNLD¥DDQF>.02HV4U!7[]O'*28#O9Q(+T3S=JEA9W2: M:UC;PK;::(5E2*V'J-QH69K>")?^#+O_`)9P^)?*T^&$VN+B¥T[¥C+7R]J5D M-(OM=¥P)J%KI3`Q>O:VZ[32J0'(KN/4H/#(B$SS")8R.B:?E?YAUZQG¥[^4U MG:__`"Z¥RZ:UY^8,3H6A@])"+>YB1?L2¥Z*K`;^'?#&!¥D1B!_"&-RZ'9AQE<+NR0EY`/M*,9T.9#=N.B4Q7/E_3# M)-9V(¥QZM'R6&^U#E'81U-.<5JC++*Q'>9U'_%>`"(_BI@9`]P4;K6+Z]@M? MTA?O>"V9I[:U;C'%`7'$F&!`L41(Z¥%%1U.2XH#D2PY=6,QZF8]V1N9Z!(I`M&UT¥0BCYUKQG(`7EU)KT` M&6@R[UL]%PA5))A;R),(W!AF`/)W-*J(Z;"NVYRF<#+F6-R5(I[RTE>VEMVA MFN$(O[925KS^P7(Z?(Y481'4I]7>G^B1^7H;/5;/5X;Z.Z@ME.CRVCQF&24M MN)E$>0M!RQ'5G5KY<_+V&+S,T/GB¥M;/R_'$NASR:6QCU% M2!2*+T[A[A*,=RT!7WRGC,^¥?!NQSKH]9M$MO*7U236+/0/-UAI.G6Y¥L7CL M]K::;J-[0_Z5$#%-=L@WH#(!^&7PP^=M_'?0++[S/JUQ/)!JMV^O%IT;5M"@ MK:Z242GISF"V599%)I4B.W;_`(L;,H81U*B63O¥`N670O-&CF6_LX]+BNKFM MA$.*(8WI4)^¥E+@$[$N3XG!*,1U3ZCS+23?5Y^<@*J6PL1-8^6-)1"L>BZ"AMH2A^VES-R:6=2-R)YI0/V1E`A(D"[NY"JVB<#,IC5_AF5G51&/'BH`¥UCX#L/3K[XB.*/>68'?)YU#HT&GZNB M+6*.4NUG-]:AB8,3_=F,N)%4^,@"GQRZ,('D"I@.])-;TYM9F]?4"(HM'M)Q M%#$%CX'MP1:BI/¥`*#7QRP'(.0:91##]'U.2;2/JHBBN&LH'E:":)9(TF)X@ M!3U(]MQDBF89420T'JR.55/8M2OCE$¥ MGA_7)R<>+)+D]"T/¥B[#3+.[U3SOJT4>GV,LT¥EK8N440GX^#W.S'P*H@8GH M^8,^UM+$U3=/%8M-LX_0CN76@Y M.O6NU23N>][F)`@4=2ZH&8T'90= MERT¥1OM^"]DL/S;_`"[NY6>/S-!&J*3%-<+/;GUEV()EC4$GPZGMG%ZOLS5D M[Q/PW^XO98.T=+#^-F-CYT¥GZBT21>9=,,UI"9)H3<(KHK[B0J2&'T@#-8>S M?:KMYR¥LB2U2VUK3;RX60>E;B[AY$5`,C`-T`¥!FX[/T MI$MXW¥#YKEUF"O[P?-Z-^F?+_P#U>],_N*_WD7W=?QSLO!C_`#`Z'¥WA_G/_ MU_E=93:8;?T;:T5$::22YNG8&60$[*G$*L:>"T8@=#E<@!U9_ESWL@CN+F>. MYLK4)!97,20WFH`T=(E(/$2G=21M2N_?,>4H^;=#`'JTOFOS%J6E:987*1WV MEZ?"UII=I=NK-P44^(NQ8$?0/#*_%/¥`"&¥&./FP*U¥X/%8VNEZA:?I--%N' MCBM;C?T^1J¥+`_&$ITH5-/LD9(#//D64]7C/(,]@_.4Z)HWF#1O)WY=^5?)R M>:;<6FO7]D=8O+BZM4Z*XU;5+^!3_E1Q(?`C)#399(¥@&,?ID:XFFZ& M)XKFY6`1V%_?S_5K6Q:M2AJ&:0GH*';H%.2.FD.MMD<9/-3>¥¥IZ;*SQ0/YF M`8@O.)+*QDF'PTXHZW,H1NOQ15'3;`,=&E/4->U+66BCU.;EIVE.5TZR MBB6*TLN5/@MXDHJ$_P`QJY_:8YD0E$=&H@=S#=0<1WLDS!$6.+8UXGF3U;8? MAEED¥@Q,0QU27E"1QCTXN4UVS*.G;8`5^9PD3'>D4B++0KC4XHY[*TN-0>]E M9(8($+CF#LJL-B3X5VRDPF>931/)DLWE_1-&6%M?¥PQM=<0QT#1U$TB+T*37 M+<8HG5OM*%E([C$1$>=I¥'(>K"YH!#>S-Z3V]*3I;EE:6-0:J6=0/BZ&H`^6 M`S@&!T¥^]/¥`3-&U7SEK$/U,R7.OZJ$C!IQ00J:!F`ZD_P`QVRKQ8%@<0ZIC M>P&TAU;R_'HR136=R8=7O;EF?4(KJ`CD$:-Q$D3#8`*21^UDHPXN07PXJ5KI M¥D_H¥HEA0H5`B)9$5MB2M:U[[]^V'AD%&,=R5]*34M5N?)5E.EU;"VM(9)Y?2^)KJ0M+ MRB0'[*QNM>],GBA/J6P0EW,SLO/>@:'!;WWE3RO##.SS,OF+7G%QCM)C$FHWKJL$8<;"*S M1>-O[A"%/¥N8_%"/,)¥$'J@VN($81JWIQQT5'1JE5)'(@=#¥LE$B?(($!%;Z MX9Z%PR^HRJ:=0.FP¥>]9[)?0MY9S3U8;F^=E5 M@0:@22/[+@&`=9,")H?3=1TG2B/J^E1>9K^XN2SWS">>(HH_=VP:(PLW'K6+ M@?$D93.,!S8G'?1Z#;OKK6KE/RQAADU=#<+YGC&H>O#:AJ-'$#=?5G5>O%HW M<>.",HCDL<+$O-&EV]W;6L:QO<-')6*=05+/4``O4<:^!RZI'D`SG`#DQ.%6 MMKE+.[BE33!*MU/=@@RHL)!982&(5C2G6A¥3/%<($E2Y@%/¥`2$5F0R,!NRD@X;F!N6['B.0T`]3_`"]¥I-YX MM+'S7K.O:A:Z1!9M;:3IT17U"RGB1'Z@D54%#L%^[.>U_:,L9V/XV>FT/8,¥ M@O¥`'5[EIEIHV@VBV6A:=#812LOKL'9I;R1?M23R.6:1O`'9?V5&M?$YV>DPPAZCS>&SR.0¥ MDKG,)*GK()!Q2N[,/$TVS9^."*#5'&`4(2D$ZRJ%]1:A%ZAM_P`3E8QF?4-@ MD4*ZI)-(6;XI"7=.@#$T(H-A]&$:8=4@Y.¥J[<(H^7(D*W)0YV+**4^0PG28 M.K9'Q.LDQ¥OZDUIJ$5XQ,R*'B<`D`J1¥07<"IZ;U'ME!TN`[4V>+(?Q,@3S! M->:E::9"ZZ__0^4<4ELJQK%:?5]-5N5E)5C).#_-(Y(J> MIXY@B6,_PN3*,>I9+8V5Q=P1R2>E%ID,I_2XNI!$@>OP*D9/*0T_D5J9+@[@ MVXQ$=7IK>=-9M?+L>@0^8-5T[3II/]+T:.]<67!MHRMK'1%##[7+D3WR8XPS MR3CW/+I%,:3"-`(UD,H"&I=C^V?GD^.;CD%0DEFM4@NHN!-ZO`H0&*QGN!TZ MY/Q*YL1'S3"QDDDL9-'CMX.=SHZ/ M+!?K%I>A1D3R^7+)([.TD<4"S?5HPIN":?;D#L#^UACJ./¥`A<>XI'(Z7-(V MA]2I]-R^_P"[/O¥`KS((ET8R(Z!N"UNKIX;"QM?K-].X@T^W&_*1R%%*;Y49 MY.]JXR.C[4_-_P#*K7/(OY7?DM^7.DQV^BW/G6S/F?¥`-&:6:WT^TB=`/2-S M=R<%!H10.SR']D97++(,9='S/)I'Y>^7;J=-6OKCSMJ/IAIK+1V-G8¥A MN(Y[V>.2:X0]1Z21BG1QE<,QD=V!D>]C26FDZEYKX4S($8=0PXB>99-JNL:/J/EFZ¥I:)I<-Y>ZG,FJ7_ M`)LFBALKR:&&C/;Q0Q¥DM2M/BXRN&RLQCT#($=6'K8:AJ?HZG9:1=W%MJZ&; MZS9V[RK,L8X09QG'N0VGV-S-=7-I;VSI+*.#L[^FL(!W M,Y<@1CN>6_SR@ZC))L¥6(_A9)8:G<:(=:T_R]J,-U875I]1U/58(&5[Z.39X M29E$G%"?M*%!¥3DN?.3$9CTV623"RMK*`7;V=M&BVUR;?$FKI_EW0;30+>:-K61P6U*Y-M2C%I;E2D3$[¥K:&`CHIGTC3/Q(]`VUPL7 MHR1MZ+Q/20$¥J5':E1OW¥,KC+++JGQ#W-65O!SCN5:*TJQK&`KAY MYHUZ!3';D=5S&C@!YL3D5AYG¥R7LJQZ#%!Y6L;188-1BT4M;.TU*RJU]669& M=>B33$=@,O..(^E1,(*[¥[LDEQ:_X:T¥)9/6:"¥ADENYG.YN+DL[/(Q/2047 MPS&F)=S+QH#HNA¥V6TVCQW%_-'%K$4SM=0¥>,/76J)97D¥RR4LHKMIKF:>4T"?:/PQ@U!¥%!/MA/B'FQC,R.S)/*WD MS4_S4U-1JCM!Y;TF7ZQ=ZDG")%A8U6*U+*:L1U5EY'-%VAJYXAM^.3T79FFG M,W7XW?:DLUE;6]G96`CM[33TB2SA"D(L"#B2JD[,WOG":K6YY'=]#T>&4(¥F M(^;D¥S7FA7MMY.BBGUVZ9OJ_UEU18XSU*LU$Y'_*(&6]GW.8X^7]KA=IY,O# ML/QL^)=:_*K¥P[%WU&ZT"Z>%CRN$M)[>[D=V/QL(8)))2*[U5:#/0-'IA,;D M?BWS/7XM1*6X/XI@>K^5_-VD6GUS4_+>IZ=IT+KROKNSFB@4R?8K(Z*M6[;U MS>PQ1'+=U!Q91T8J;>1!)P642%!P)J2`3N5KUKA$".?Z$&1ZA!+&¥[(4/(&J M1$=P#4[TI]&6F)/5J,RKI$0Q#D*BL59&W%2.I84R`PGK)F#(]5BP1SQ)1_3D M$A1]SN!WI3H>V3X1W(X)=2C5A@3DJC:.G$[@FNY;Y^&61Q^2[#FTP6*7E$Q9 M8IXYD!)!J.H).^2XI=S57<'O'^XG_?L7^¥GUGJ?]Z/Y?E[Y.I=R^KN?_T?D¥ MMQ-(()+JX6^N9I?44.:M;$BA`X_`H`_938?/,8&74.0>'N3V&!K^""Y-_;:? MI4+LUUJ-T[<4F'PHR1(KSO4].$1I^T0,D9GO;!(#D]!@N],A¥N6]M(^CI]!IYY<2&.:1ZD2/,24(H5#=%¥*# M+H2B>K22>]0-U-'Z_I,P)!$A`V*BFQ'=G!<((;EO356 M:/¥`:"-3J>VV$F(;!#N*96(D]2TM/+]E*WU=#''-P]>X(!V(^UP([D`#,:4R M>0IL$2F4UK-;)=?IK4D748*Q'3[O)@013H0:5W^69-US:>(OK7_G#;¥OH_/?YN>7[[5-#;6='TF[29>F^6K> M+C':_"*J"O¥`>4^U0[^V5F<`F.,RZOD/0ORUU._O7M[Z26#4K&W]0:/I2C5- M2DXGX^26Q-O;`?M-:KKUQ'864:1V M'EW3Y[?4M1>X=JO+/=0UL0@%:HLPD'¥N0CF'4)B,?1C.O6_DZZL[M=(T#4], MO6=_T9?2Z@DZ$'O)!]7C8HP[!MOYFR7Y@=&9'<&-Z:34;J:2WU!ASDE/1F1 MR2'7P(PB<.C697U3G3]7OK33M`TN"VM?1T:YEN+Y_JZ2R7ZRG=9FE#%*#NI% M.U,@>'N9Q$>K.U¥]:/!;^;WL_+.GIJ>HO%)Y8UI5:8V)50LMJT$C&W97[2A. M:GN:K#>ZCK^H2(6T2UHCSD#99;CC(T@_EH@(¥,R@ M),>&/:?H]GY'TBZN%@@U*Y,.GNK`U6..YN':[D9NC+&[*3^PO M3(<4HE`E70)!K*7NDZA]5NYI)=1U"+ZS+J'HR0"8OL-ITC=J@?:`*GK7)PRB M?-GQ`]*2"2]E2:DK)'R?T7/(!0Y&R@^)]NN,S$)L#J@Y[B2:&:(%Y)9>2P)0 M4`&W04I¥¥JN/<6LD'JRB#4_)^EVUK]:EGU*Y$:QM9V00A6=:/'=/,&MRA/1A M#))7HPR,L@#&.*4N3,H5_,+6(;;]&>7T¥EV5E`_U75K¥R17,%H`#07%R9+I! MW4P+'&>FV5?FH.3^4EW/*_-&J:/'=+:IYSO]5U2=';7_`#4(Y'G'I4_=6QE< M>L013DSL*>'3+8Y^+Z2XTX<+S¥Z[IWKW#PQW5Y>W=([:^F<<7?8%S'0%:#_+ M(R!VW,EC"1+/?)WY<:AYQU&VO+CA#Y9L;H1:G?RL$,_("JQ1DAG-?VU!`[G- M5J^T80VXG>Z#0RD;/XYOKR"WLM,BM-/TRPBLM/TFGU.TC55CD*#CS=5V)]¥X MW6]HXY=+_`?0^S]-BQC<_C=R+,ZCU$8NLA:4/3<'N2:"@¥!3.>GKP?IB7=QG MBJ@45SC#`1,I#D`,K;$K^R.^3Q:G(?X4RACGS#$]=¥]>6_+¥DD>J:W:VLB.# M)9LX>>(R&@YQ)5Q7L2*>^;3#/53%PNG69Y:7'SIY#YE_/W1[)+F'0+!M39'D MB%]=GA"K4^$QQ(2¥BD>)C^6=)V?CUG69_%O+Z_M'2`>F(_%/FSS+^9&L^=9+ M)MA/COW^G*C'(>3`DHF>Y($KL"J_" MKUW)%16HZY9",QU14CR37],S?[Z7_>7T^O¥`NC_FK+^&?>BI/__2^0MK$E@T MMM#="[2)2CO%4(H(K5&8*2?$TS'E'R^UMR"3(;"#ZRKW:VTVH'3@/69*B"'D M-GN&%`*]JL,KX)=P1"$CWLVBU,Z9:3Z>EOZMS9NEVU¥R,$*2K7A5N+$+6HJ* M>#'(2D!T#;*%,.GDXWKLT4LX0^JEVAK&`VY"@=%!Z@[X(CBY,*`ZAJ8¥E6X= M"]K'0S<3P9N1_8J.OT'Y9:``QX3WH_1)KB"YEFL+&2[!+((W7GQ1P!¥;'91X MDT&1,1+JSC&7¥Y4N]2NKM(]*B41:>S>I#I]D!Q>93]D¥?BEW%14GVQ$1'O¥` MFV&95K:RFC>>74+A-/G]+U+:"4/)-<2@[Q".(-QX]29"HPQH^31.5]$R19[Z M>TT^T)6XU$+Z4D?Q,IVY`^`7OF0(1_G-4I%^V/¥`SB%Y7LOR_P#*^K^9FADA M:RTH?HWZR#'#/(PK(Y)!(J>Z[4[X^'&75C&^]¥@_GGYLUCS!^9FM3+YCPC7]4L38K:>; M_.4%U:1I]9;R%Y45&CJ6`B5IT1+$N-B95:9Z?S',"Y3.X;Y4¥QN+C3/-,T.E M);V7D^P@#W-_K%S<7-P9%7_EHG1)&D)_9$5NON.^9``#BFGHOE30?)OG=;_R MWI6K:J^L:;8E;+4H-&C^J&,`L¥LT[WK3!!_.8E([KE1E`=&&XY6¥GUU_*TI¥ ML1:*KQ1Z(M[::S=SLTIO[A#Q^M14/'@.@IQ^G+H@'N2)'N+&P;?DBQ(¥JB0¥ M@1QC/(?#M^R1VR=@=0GP[6CUKN5VAC>2G)J'EG54M)[.(0:JFKVAW=[JT6GOHEP0¥.FQ:3$L=[<>H120W=X;AH&51]N./¥`V.7X MYCH"DE%77YJWJ7%[/Y?L;?0;C4WK-K5TOUW4YP%X$O=WK32JQ[O$(Z_L@99* M,):&;5(V M5N<@C#*24EVV[`$FG3IWRF& MCW;¥N,D4`?UXX0[S2]B2S/HGROY.¥L>4&-[IMM`E]'$_J:S> ME9YHE'Q!UE<<8F/0^F$^6W99)/0X^PHX!9>$?F5^:<&K+=>7K'7#IV@L MGK>O:(¥NH7¥T9WBB*E4CBK]HNZD]JYL=&)Y.9=/K¥L,?*OQ3P";4-(6&:6U@ MD^LR``W-RQ"H6/Q/P78/¥RP^>=%I¥4(¥R¥QFF)FTONKK1('A'*¥U)(^"R,*0 M<`:U.F9,Q&7*G'C(1Y6KMJ*WL5Q-:R/:16CI;V]L[-(8H6->6 MYJ0Q^7OF+_)L)¥XN5CUV2'(L>8R1S.R:BMF+=F902QEI7L:D^-*G-=D]G<64W( M.7A[>S8^11Q_-SS;J8)_T:(98GM[<+;¥N8Z2K"J"0>`:N2Q^SV#%T_ M'O.[9+M_4Y>I>62:C.OKA9'FA6?E;QRTV0UZ@=#FUQZ3''E&W%E/+EYR/S0, MEU.PDC:5F,3%HBK%@E=ZGQS*,JZ!IEISU0,1F7U)$D9>JL0:=>M#3")>Y1IR MJ!*F%IF81R,0S@"H`()(7^.7>(0W#2WS3R#1TFCDE0LT(="LG0N/Y:=C¥¥B< MLCT;/RT0R&T¥E/J4;M;NRRD!EE-26+F@C(_ID1(]S3+!Y%*M?¥F:UY6%O^E[ M/T[=Y"6OH_B6I^RI_LRP2:):<>;&OK=T920Y+2,#0;FE>E<'C3[@XLQPI_P_ MY?+?^¥]_¥_X99XF3N#&P_P#_T_C];B")'-E*TZQ%F;U/AH.VQ)-/#,<3,>C. M4QU939ZG=:9;K:6'&+ZT4E>?<^I+7^1,N¥-DJDQ#5[M+;4[F>'3?T M8D,?)M/7U``:TJBNS,!7?/49(QX?[6R,;[T=;37ER5M[&H?4)`DT$(HTH)!,?#<=/#?,PLC($NH8?@6*2,;QSW#D"A'[+M3V.$3E71CX0'>U%8:;9+ M'//J#:E(4=)K:T4&-'7["-++3X2>Z(PR>,WS%I-1YO;/R1¥F?I'7;+6;UREO M;L(?JZKR`DF-:`$;J!M7N>PS,C7)K$1W/RQ_,O4+S6O..IQ3W¥6C:-IH]18KIY'224[*M(5DJ M]?VF`7WR&3&3T+D0,NYY,VH:7;QJ_P!5FU.?DP#S.((HF':6.)F=QX,LJ_ZN M8?!75F9$]$!-?:GYIO-.TV,016MM(!9:?9A8;56?OQ/",-W:1S7Q;*YY2.B* M¥V=)Y>LULO¥`"UWYWT**¥RR$#OXY2,A/,) MX@&'+!I"V]¥VH6EQ8/!&L6F6ULZ7'JRH_P`=S)S].B%=U4&H/4Y;Q1Z`L?%M M=J4.B6L>GWMCK1O+35Y/2B,¥1@N([B)1ZBRP¥G4`?LD.5;Q!PP$I,Q/R/R3B MVT33_-8_PGH-K)?:Q:N-<%_,T44IAMA65%B9^*BG[)DG:= MIV@65E(BIK%U.T5Q-1PK+)<._I*&ZA46-0.G(YFQ.3HP,QT9[9>1M+KKDBZQ M:ZW8:121[VUC>'39T@ISMVNKP1$O4T!2*8^U,999CF`6Z,2>CSKS#YTTN73[ MS2O+_EBRT^Q=WC?6KN=KW4`P(!2"9%MH?17?BH@!'=LQLV<=8L)`C;]::_E? MY!F¥_>8H[R]N>&B>7T@FO[@AA)+"A^PA`5033XOB!¥-LY_7:[@Y;.Z[/TTY] M?L][[,5+>VCDM["W6ULK:L6FHS9_+%EYIT6WT2_O);:"*832WEF_IOMNJCDK+OT-5/RS&[-UAQ3$I;^_XKK= M)FRBJ>6S?¥X_>3B9"-5U8LBL_,SP?"A')B*04`7K7?.TTG;@'<¥AJ>P,A.Y^ MUYCK?Y??EK8.L=MYRNKJ>6-A!I]NL6H/)+$]&*W*/!"M!U5R#X5SI=-KQEY@ M.IU'9LL(Z/"=7BMIK^_CLI&6RM9VAT^-P4X..I>+D0&/8))!^(`"O(]^F9L,)'V MC2O;+*`ZEJ..^04/0K#;'DIF#GDE1O&VX/7>GAUPB<>]R¥6FM`W!5DC8*K-$ MS!=_B(K0"G:F86:3G8](>]"-+*Q*@!'=RI:HJ"O;<4`S&&:4>KDQQ&/4+1$5 MB$BLL9(]0%¥,*S/)Z00")5+5.V_60#M7)BSU8&9'(( MJ-O3)*LSAMR.0JP.U=O#KE4X9/+YM/BGS9=HTL0]+U?WBDA(@3QYD&M">P¥< M$8S¥D>-[WT+Y+FT$PK++>!$MY3ZJ%1^]9O¥`=:[FJCQ.94,]A;__U/DDMS',;>9; M6&V5%='MH@P5@?LNQ=F;F/&M/891CC7>G@,NB::?)J*R'ZE`$5P$FOC¥#¥:] M5G(^$"M2!U';#DD3RM(QUT9EI>JW.G:=J.C0^@Z072S7>OAIE>5C0TCHRJWR MD6GRRN$)GJ6¥`E)/,-O?6FN6MQJ-C+9R7,0GMK:1,7:23E2H8=*5'A7(9 M(3[T<,PD2$2+(6(7U)&=-MHUI]G_`"OIS%.202)$,AT*2]M9S, MUWM%#7J_`$%MOF,(R1/,%D,JI$^M^:)ECB$U^[¥S;VP+!`D>WJ!&/&-:]#L, M)G$?PEF0G^Q]Y_E;I(T&V5I+I(0Q#:=`H#@QC:@;BM&¥=OOS88]^I<>4K9Y^9NJB'1 M;J-80R/Z:P7)/%X@XW/`;4/CAEA/>B$9%^;_`)BCGU+S!J2(IMT25HKN2=T2 M%5I¥+^HY"J&/>O78;Y"Q'F?O?WL-&IW4LI$):S;9U@7XOW5*,&.U2>YVP>&)2[]WU*>PFN'^K3V:-FH`&!"CF3T+D#WR8A(N28*TFE6<5^9XHGDT^2T2%8;PBIG:A]9E M2H0@=%4D>^43XX?PM?!+S67%K9)--Z¥J1?5)`+B9_AY(P%&Z[$Y6_'EV!RC)E(Y.1AT_B' M8/J?ROY0¥N^5;674M::&ZU^2]?5-7O9S&EI;7,AKQM3*!("U?B!8U¥!F#^;S M$]7H"?FG^94?F[4X+*%7M-$M[L)'8@.C54*!V((S+Q8¥ M^3J77:R(Q]"¥TN-8MO¥`3HHM*BEDF)'UFX)]=:#B%C5"JA1V'$_/-C#2'^(N MCEDJ6Y+(-#_-GSOH6F0Z=!J2QV>G+4VPM[<>JU:¥I#Z?(^!J?NS4:WL3QN[Y MNVTG;,L!V%^]GZ?¥Y(Z[8!/TUH=A.MR.206I:$E._)F::E3[9H,OL9QFXFOE M^QWF/VQR1&¥05EK^>GG#S%:ZC%I&DV,T9O;+(1M%YSYPNO.=[K<-MKKSZG?I;_I'1G]3UTELIUJ MLUOQ)$:-^TJA:=U7.CT?8F/%MR]W5Y_4=LY=1WL*M[_4(KZSNF'IWFB"7W,ABC'FHM"CD'X M0S"A`[;]<(¥27,_8V7$HNK13EED#*0.A(#[;JPKV¥,F('R:S.2R!Y&41JBL MG(&,U(IOOO7H,L$@.Y'&3T36VN91=+$5%&0QM(34?%0U`[8¥7N8&8'1G5AJW MU2T>X'[A8BSF%#]KB*$GH!7"2>E!K,AT#S>74[J2]DO2?66.0RQ(Y+(.1^$$ M'KD3*7¥X-4D'-*[W#.RA'=J¥`"`"=]A3IAV/4-9`[U7_`*J>IT[X=_)>$=[_ M`/_5^2:EY9)X"L0O'D$,]O&#Q^*E%`.X`]^OCF,<@Z[MO#+ILG4>GZQ>Q_6( MK=_T/9HT'UZYD$=KSJ`RQS.5C9J]50EQE1R]ULH@CF67:5>7-M:W.D"[:&"_ MA]%H;:Z>WM9Q&>16:)./JD>+$'PQ,@>;*61)+T^C=?4K:2.XM$">BT)E,3D_ MR>H$?;O51E0$1RMK¥8=0E)X327T7,I`D9^NQPL!MX(W>O<"IR8J7>Q¥8'D$0 MH@-M`¥K21VNGA5,*CXV5CL"!0G[L91X.I;823%[K4=20VEO)(UG$T;6FF0U, M"$;JWH(>)D_RJ5P1SGJ&9B.CVO¥`+?RDT0TV_P!;NX+!;IY)C`U7ND"&M98X MT8#EVYL#¥LS,>2)YAK(¥GV3Y7K=QI>D)912LS6;W(5"JQC^1"Y4$;4WJOQH;A(1NR-(*4WZKX',?UGDL8D='PWK;2K<:UK$M"'4UZJ.BTZEF¥-¥L$A^"U[CHS'R?)%HFMZ/K&HJ9[&V+LT M$-7DCY``J&/$*X]CE1F1T9PS&/0LZUSSQ`UOK&G6+W-OY:U_4+29M%GD8(TD M!YPMXB;>"P*1¥V*T$#RO6B M;;D*2!WS'XIGK]B3E"!¥U>?](¥PFQ_1?EH>7M,LHB+K2$N#62-'8 M#_*KAGCD1L6'BBTU_+_¥TM*¥E:B+^X¥K_IN^>&2.">:94%N7W+*#$X)IU.QS M49M-F/*3N-%VA#&=Q^-WK=C_`,Y':>S(TWE0QCD)VD%X*@$^!*_/ MOF`>S]7O4B]##V@P`4;0VO?GG^7FK-/J!¥G7VM:G#6"V&JPV@2%'/Q+%*6N& M0=Z!.O?OFPTD-?"A.B/BZS6=IZ?*-@7@6M:[HVHZH;RWTB/2(J,7M(7D<.K' M8DR.U".E%XK3]D9O,4)'ZR'E=082/I2%]0M:W*<6?GL4Z-Q&Y`/8>.9<8`?Q M.*``4JFA2=PTDWHAS!RYLHY5¥G,QS`9':>;+&6XBA]66-PL=O!,PY?5 MXQNB4C(O-BI/P@DG?CXUR4M6>I'R3'#$)5-=,DK"6 M0RKPJ`P)9VH&)&_3WS'_`#([W)CPQZL?DF^M56+DAG9FW(XD#H1OT]LR!D$D M^,!R*@KEO2MV7CZYY+&>O)>C&M>O@<02.2?$XNK4T53/)Q`+D13*2!7C2E:= M`,NXY=P:9&NJE;F1C<(XW1"$/CO]GEWRN[Z!'%?52]-HYF+'&'1^"D!7;8=_AITKE@E+H`UGWMH]4C;5J?$9,9)!.W4*^HW!:T^K-+Z;P/ZD*Q MDT$3=01W/OE9G*33.7F^$1'6FOBON54#RRF3U" M2/[PA>I:@K7)CA'(,A$>2I]9;^>/KQZ=OYNF2XCW,N$/_];Y/QV]RKO=R(]P MSQ¥);@NH><#8,QJ30'>A%M3]V4<,@RV*6(R"**5`/3EF*R.!]EOYO[< MO&_,4QX566D5PJW9],+&>H%62NS[]?G@(`YTR%LGT)KZ46]M%((-/MY&E"JR MH)@PZUZO7VK3*Y>$.Y2#W/ISR5:V$44"R3.MQ-,KS,H)'[O?ER-:CMTPPX>A M'R:2+>¥6]R(()^/Q)<-RA6,@*E>]/V@?'IF7P7R+7?O>`?F;YQTS3JQWTP:6 M0O;+$A#,[]8ZJ/V>YZ#PP#'(=6V.2NKY4NM?O4EU!;:4":[+JZ+&""I&RQT' MQ;'QVQJ7>RED8*+A+9WB3F#:JHD!JYJU:@^_RR)QD]0U?-#-+,H0Q24+L98G MI6O`[@>)'@.F5&,0Q$5-KZ9/K09G]&X5GND7N1_-X_+$9`.5M@BA#>^J''(I MSBY,!OR0@4/8@_+$SODURC(--J!B6%35B%4BH^TOS]AU&2AQ!,#YH9+GDLAA M&]%,E37:OADR1UI)M9]9YQ@$¥N!9E<4!%#O¥LB##R"!(AM[B6.)9$E8Q MN6X@4^GOVS*AP="&7$?)6-U)(LGJ"C%E,U*?:`^&A-.V,I2']B.)I[LI&D@_ M?,!LM03¥1WH2#7*I6?[&NSY.ENY+=5$:JTC[JY%05[T`[C¥HH?GE$M(1SIE9+#)K6Y4.KRF*,3_5IVY5$3UX¥SXCO49BYL$8 M¥J;(Q+T.X`T^WCL!$DYM;>)A9&^*3:-2O)Z="-JY<)>3,#W.8>FYE` M4P4(9:BKJW[5*8..++Y*/,L54_"JU*¥!]H>!QB2UF_)#L"7>-7!DE?AKT]¥$Y$_P!K'U=_V*UIS6=5XJ44FBDGXMMB=]Z?/#`US23/R4KIVG+> MDW'B]!¥5"7.W$CI]V63G$][C2F?)'65GJ,B?5EM)9&')SS'$¥?VN(8CD,H,A MYH$@B[;1IV5T>3TC.¥3VP(/QJS¥#P-:'Y],NA,GJ7(Q0!Y/IS_H7ZT_ZO8_X MX_U__=?V_P"3[/VO¥Z9D[N5X)?_7^7PMX8[AH>'UB*`AX;H&B.3U6G4$?YG" M`>¥IX_@FEQ&U6J(ZFAJ!4T/MOF1BB/-/#?,JSQW*3E9)P(XW83 MK&Q8?"?VB=Z-V&73P[;!?`DOG%HP9C;KS4%)%K7B.HK6I^@Y@3Q[[@)$)#HQ MCS!.+6VMY[<)"MK(K-]DB7B02*MW(V%>F84J'0?-E&'DY-8LM7)Y6D%O=2!2 ML!V"Q$#EOO4GO^&/'#JY4-/&71=::U>:=J-G<6)"?4G;T2X#`1KN11JT!^64 MSE#I]S/¥B>A9AH_YC>=IKYY]-;U2DXF&E16LE>S.7**!N`!04:M3R!/@XE M-*`D<0![9"0¥FLY/>T_E5_2F-W>_5HY%(M#&IE9Y@`>+`LI4'QW^6+`R8L4= M8K8.$1R_H_"*49#OR¥2<,87W*)$="L0<(I8`?6C):1%%`2>A!(['PR¥1B.@4 MV>CA9R`0¥V"R;_6(VILO:A!I3VR¥3(Y(B/)%10``I*S2,RMR44)-.Y^C(RS3 M/5G?6Q%.AWRCB(YE(DH6"17&J:=#>@FW)5&9 M:=C^V>E/EF;@E&75A+=ZC>26,5S$BD2#CQ;:@I¥NV9'!_2#5P4BGU& M!-(U6.Q$8EOX0B:2XW60$?OE(H/B]J4R$H@_Q!D(Q8AKVI6,>GI;)#QUF6-8 MKBX9OAD4BAJJ[+Q¥>IS"R8QWLX@!)++S"MM916-Q$)?J¥G&VF4[E'V93XT.X M)S#RP#FXM0!R)1DQ6W6%%K,`YHP)(J^^P[`US",2'+AE)_L45Y'U!Q!62C5W MV930J#ET03W(E.71:[)'&ZD!0[!6N#N5(_E]SA(IE"_);)¥0CY$$¥/B*¥?B` MZ=6##(]S"1EU031O5 MEX¥78;R,2&]POME@QUSIHD;6.K)*RJJI4+(D2,:$+3XMR=SX97<4<)/,_:BI M/WO#B>#7H_=J7^U78JQIL*BM.^$2#&=#N3RUN+:.)88T;]WQ:1]OMC8BM!M7 MMD2)'D7&E,(^.]DCAKZB*X8J'<=.?¥I[CQRR((Y[H!¥VHW=M0O.";KQ1)5H" M%458GMMVIA¥.^CFX=5*!YO8_^5F7G_+`O_'`_1/4_P!W_OS_`%_;)¥#G?R@> M]__0^5%M1/3Z-¥G&-H8CVR_BB&0I='K#N)$=U!B($YZ]:%6W[>^43R5_:[#!A!Z%JZGE9(Y(G(*R MD3)6E1_2OWYAY,D3T^US1I!W%C'F"XNIS'"P]1DI(X(V4"E"HZ#[LQ>/OIA/ M!7¥*1FVF,JRPNW(*)!)2E6(%5KML,A+AEU:HXICD`]6¥F0:!!(EUYH!N[.5Z M1VT*"25F/7[944^9RL<(ZERXDO<;C¥U?+NGVL&F^7M`BM;:&%84:X8-1D;8K M&/A2O<"N1G+#WEJ)WYE@>I?F!J>H2W4¥PEECEE]&6-%XJP/0C_)'W9@SX>B¥ M8[REED^MZE/=0Z?;EKB.CE2/AX>Y:FP[GMD#CX^YIGD(Y)W:^4/-EXTAX-$A MW9BP-'&YX#H`>E0.FV68M`+:99">;((ORZ3C%-=¥29`9&B#&@;_8¥:4¥.^9_ M@"/4_)Q9Y0%2?3O*NDF"%XQ*"S,KJ`Q+]V)``(¥!VR_%C!ZGY-,IB7>P+5_, M5G`Y%G;MRMB5F*4"NC].'?EXCIF9&'H7A3VQT7AIGJS,_UQY9$GMB!6(+T)¥"Q^BF6<4B MQ,@%(6D44<@NY$M!$I$@8U8.W^?4]¥NAA)YED,417H M!&***]>1%6X8 M^I<2&O+:@J/YAXG[LL&I(ZL^$I>^M:F¥:MZY0QU3G'12>76M*5R.3-?7[$¥D M$L[)&`%`(;F3V8$4W&8WBR'4M@KO0]6)Y#^;:G09&6:1[V<:'5Z%*XNX81Q< MH¥*([`@CDNY/+J:^(ROU'F`Y^.N¥KV(A:&9"20&'I=ARVY4_CDQAON9F([U! MC2$M*>?&0#TA]H#YJ8:A#+,9>8I7C0C^;EM4940?)I$2LF,RR1Q24?TV M)0[@FG4=3^K)BVPXQWA7M;4SW=O&O[;^J>1-!3>GOET20TR`"=N7:>2L8C+N M/L[**=LF>)J,K1!B!*RH'#`E:G?K^UOURDSD.2¥8'7[%T9$5Q+S+B4?"S'>O M(==MSMF5C/>&(F"N^KP?[_¥`]U09¥3__1^-,%Z7E9!*7] M3XUD.U21W/8YB'),=6SC¥TRMV:TS<2."L?V2>K'L2>PS&( MR'HYT=1$-S7#S%#S3C&0J`4^(+U)/7*N#,6N>H!Z(V^^&&('^)IEG/D]8T M+¥KM8U#ZF]XAL#>QLS-<(R>BX[R¥EIQ[;;^V7C1B7+=QY3)ZO5M(_*W2M/$3 MW=TCS/'Z=Y;.X/$#?E1J4!ZT('MD?RLQ_"T^(RK"_J3/*:=6$;.6C0]0K&@K3P¥<0?)%^:( MT]5AOH[B;C-#&0¥D+;5(/3Y5[Y.$2.B¥0/-.9=1NKEKRZ:1>=XQD"Q@*! MB!T4#N>N9$9GN82QWRI*VBEFN*F1>+KLC"I'O0=?;)&Y)$I!>?[DJ5*,&VJH M#-Q.]-O'I3*C`A/',M2JZPR<'5Y5`D9&ZK%W<'I]XRDWW,XB^92R01$55@KO MQ=>/CU-1_F,C*,CT:Y8SWH?FCJXCJ'()W[D,*_+;*_4.80.+N4@D1"A@0S@^ MFPV!]CX_AEG&>YL'P6!!058`GXE8]Z_:^>1¥62D'I3<7P"0BI)5A&>-02VW3 MMMD2;8;AZ-#&YLK)8U1X5@4@5()],[@U-0:]1ME7%70NQPY+YK&)=ID8T<(" MI%0&5COCXA/¥);I1B5&0DB@XA7-`H'0[`5/7IB.(¥PU¥4AT46(#6TT-8YD+# MU!U--B5J.^6¥-(]74(.8F-`1^]EEDXJJ?:J>YZ4RKCD%$YA35>)D@Y-&(U#> M[JI^P#UKOXXG+(]"CQ3U2^7CZTJQR6K+S29(A;75TUE8Q!B74Q_:Y`+3_AJ^V`D'^%@9`]"DKQN]PD?($1AD", M:_%U(VZGZ,ECS5_"LB!_"C+6!XR]RP9?JS42E:$'L=LRAE$N0#BSE?1&H[HD MHD8/QJY5:DA1T[Y$R'>PNUZ_$[J)"B.BO(&¥"-J#^N5T.¥H(I6BDED>.1$Y¥ MDXD4WZ=6¥3X5[9D8OB4"01/I1?RKUX?:;[?W],RZ/A:<;>XO[B)I6+"6/;F(R-QZ@.Q;V&#¥K?) M1&%#*3T"#J"3U(ZX?R@¥F%^18U013PK0A58¥AQ;W%,E$"' M5D'F^J^>;NZFU'_2/2$CTY!J,```*D?A3(Y-2".929QBP>36[F5"%F9Q'RX% MR*A"-V]@?OS&'%+O:9:@,;GO)Y22LK*Q5@)0?AJ>BCVP2E71(F#WH#]Z02^Q MB4AQR^TS=&/?*Q,GH&N12U(.*E$'I%7HZFO[7VB?`#+XF0[F-Q[DODLIY`T0 M',!_W5*GDBFI8;],G$Y#W)$@@F@_<70A`,DIYH2?M%33B#T^>6CB'0H.0=ZU M=.8_50K*&FVE9EY(K@;A?ZY.,Y>;"P4+<1",6W+X4!99A2E%'3E3WR9E[T2` M[T)'*L2/)RYK'LK%10LQJ*&O0#OD8Y3T8CWJ4MZYKZ"¥9E;F*?%5:?++A*1Z M,3'S0,LT¥BBDKL'-2E?A/+K¥¥-R[V48EL*)FC`!A#(RNS-ML/ET]LHR3(ZMP M%]5R*.*22MS*)1$Z"G0?3¥LQO&D@[=5K6UP8UD]`K&-U`(K¥7CWW¥,L$^+H6 M-@]4P?3)FMX7>135#)Z8-65?Y2>@->U/IRX2(Y!IEPJR:;#&T0<2!$(R2W3U)BB!;20^K$HV9&H*D'K0'ID#*7DY$0R6V;U88HP@ MC(@X=@.7=B2>OBJ7SOZA-8Z"V ME^'H-QL!T[C(>,#SB6N_-3I+&J,!4¥AP-"1UZ@9/¥U&(Y4VXR3WO8/)WY)^9 M_,[Z7JVK`>6O+&MWT5I#KDJI<.3+L2ML)(S0^,C(![],U^?M>$.YSL6DED.P M3G¥TORU0>A99O9P0ZLO¥^^ M4(=(M?*_EBUN(X(-.M9M8GLRQ9&D<#BM035CT%22,ECU?'T+I¥_8^6/(O$I- M.D@G]*]A:UGN(UN8HFI]ANP(&Y]LV4,@ZQ=3FP9L?.T0D$T,3DMS2=BJQ[GA M0?:K72J%Y MN0:M7PWZ>.1W/)A*1(_M=FH:; M*!¥->O7+89*YL^((D?F%?W#22F>3TT)4R%MAVY4'8>^YR.3)$IXSWE`7OFJ5 MV6K!6B`]9B>(82="HV.QW)Q'!T"`?>E=QK&J-S0TYHJNB=!*G¥P^CQV]¥Q/B!VS'&6(YTLH<74ECCKN1V52`ESW^+9PGO"!X%)2PVG>CNM M25XUVH:=<$<<>@^UHE$A32+D'+J:K,XJK4)+=#3O¥^V9N*`ZL3Q=S4=K+',I MC("JA+$$GKUW¥?EF4(#I0:SQ=RJNF(P`E(@252_(;E".@8^^6¥1',L"#Y(86 M$B*9%;X`S$1G<+3]H^(.4FSU8^(1W,+¥PR*UTBA^+$KR04Y$']IO`4Z`9/<, M)3M)A;./53@TL$0Y/JQ/U)![,.V_?#(WR`^;9`<*¥BW'HI(&0,#R!(H#V('@??* M^$GG3*[Y*KQE9)KBC*[1<9$VJ1T'';(&,1U":EY-Q3¥>2R`5C'(@=':G:OMD M"0>0*DTM#2@KU- MFQQ#UK¥Q_//EC¥L=)¥R_EWJR3ZW M-JTL-_Y=33I(CK>9="LK>>:Y$%T);KD.<:QHU68+]E5'@M!F?D[/D1MLQ'M+DF M=TZ¥V^<;35/.'F%9+@&PTQTMK.¥1@8Y8DW:,T'2NYITZ9+3]FY!S)=OI^W¥9 M'JIY]YCU./6+JTAAD+1P@.DE:!F)H%.U0JC89MORYCSD7`[1U^/(-OQR2J5D M=UD!X+01%":#X.N_3(Q@1WO&9IV=E)I!20MS7T:JH&P(ZU%>WSS*$9%J!D>B MR20P1QRIR9$H.&Y/(GB%X/.M/C]4%EDILP'1:Y(SI'B6NF5 M#;Q%'Y-;RT@8[?NY-RC>]8"0;[T55)'W;:F3&$1YKZN¥(Z'3B(UECA+[$(Y&S*30J MF M!_(#O44!`[[Y;Q<7.@@WT2>]98K>Y]1JQ(A]1:!2=P`P]LA*AW,+(YO+IUCN MKNYNGC!DB.Y7]H;*I%*UVRB1,F-A4WHB%5:-P&:-:5Y#W_A@&.0002IKQ*`J MGIR!3Z984!)WI[>^94)7S#$8K6[T,KN6C"M4DT(!Z&M>Q[Y=7=3=``(9DX.K M@`OP`E9S1@>JM[FF4R!ES;-O)$&1V5V="7<`5JU6.U*9"$1%@9`=S:D+*#'¥ M12JR¥MP0#OL*;YD¥,)]6OCKDN:)(TEF2+>1VJA;<,.S#P/@,HGB$>J3EOHAV M0))%.BDQ<`!(=PK]S7]60X_)2X&2.=:[(8VDDBW+!2?M"F2OW)A(A.S?)!'; M*8>5RR$S1J0O)&^R].U!URJ>[EQ('1`PW;[,R^I``PA'2M-B*GMD0".H:Y9) M=`];_)CRS/YE¥Y1:E-I$FJ:'Y:]*[U¥Q0BX$,9:BEH!61_¥`GFK>X&:[5<,N M9+G:;#(FS3[&_-OS_IWD#R9J6G>6-5AUW0/-,O',]O,W]Y)!=@R55 M:T,,@?CT!0Y@X¥&,][GYL_DY"(M3U M_P`Q4:#1?+VDW(U2Y^T'8H?3C*F@K78D#,&4_P"DTW(]`¥/M)HY%EN)4"K=3 M2M;(#0(KMRXBE-¥NQZCAZN3CR2CW(N=*36LT548QDR!>BO¥`L@;?$*=:Y9(B M?(MYS"7-6]5V8GBQI4-T/S]AF/XTX]S(¥*HD8D85_=>BA] M25Q05!J:@_=49=CR1ES(8¥NYOZU_R[7/3U>W3Q_LRW;O9<8¥G__5^*EK#<$) MQ41JK,7>M"*=:^`'ODORP&]I,:1,L5:[;=LQB(_S@Q^"(,G[NYYT8R3!(#2HHP/Q?/Y8#$=))$I M)1&SA@E?3E)XHYZ'VIT^_;(<)'4M@)*-229)$YN#3[;4%0P_77MEP(K<%'#) M-+2&6><0LQ2)@?35`I8-U4[[['L,A4&<8DLN73[2&YCF9PTQA'UB0M12Q&Q% M!U]LA+R;O!¥TZTV*W7TSQ8M&**]*4?L6]¥J&/OIL&W5D<<,7[LRS>FO)NO0D M=5Z;;=,,I0"C?JG$,'-;1%4)##(9#R!-(VZ,#M7Z:C*?%KHD"D^32O4MI9". M*48(NX)WJ&]Q[9;&$)¥[8R$BC((G$D+S+!#(L.¥<*,(@X'VP'9S6F]"D#Z!"UJ2=V-?'PS)..-?M<@)&S* MW?Y92-EX9O-O.-^;:7A%,$DFCI(@3F%`^(*"*U)/6NWAF0.&0W1PD]6'6PFC MM)FH8S=DR592-F_EWK0]Z',>>*$>]C*![W`'D¥@8*B*`BJ*!>QJ>_M_')1E# MN+57>2K`H5^$B11$0.0ZD=?DH1@M¥:A@SIQ56.SH*$5`(_IDY< M`ZK'%?>GWEGROK7G'4AIVB6OUB=/B>1_ACC0[%FI¥!F/*0'5S(:8]'K M'YG?EK^6_D?RYH:Z#^;-GYU¥]W0,WF33-&4W&FZ>W[0M[RG&<=FH0P-=LQS( M'D@X2.9#QV*Q!B5C*BQDT)!H&-.B>/R/7&KYQ+60.]!RVWHN@B8.2[XAK$/,H8,8T7I5F(-`H'[-"*G#",;YAB#?57=9/31= MF/I?N_8=S0TPY=/+UC9W¥^M,;.^TF_¥`5A>Y M,+@(¥=¥OJ"%`*U06DA/¥PS1Y]11Z/08,=1Y/EK¥Z];OM:_,[S/%>3P3V]E(8 MK6WM!RBB=J$Q@[@_RLN!¥F("K`/W2R.&+"1D9?#P8#)W`CDSV[G)'(790WQ@<@PV*@':G MS^_,H-=OIS)QSKN^3+B'_P##!Z8]4D2"1W]NL%Q'#QX¥E9GYB@(7J!7O¥LB"#WJ" M(]ZM:6T1N$*`¥BHX@BI/+[(IXU[Y,Q'FI(+*K*QF=P5B*@.3ZA_99!TH-_HR ML[=6>/$2RV'2PT8]9"P8AT4D5!/%>],QQBCW,!8[T]:/TH?17B¥0)4)4]6/Q;TJ M:Y/Z>5)G-C>I745JLZB(^I.3P+$FI78$4K0#)"9[VJR>J6L>,%G),G-Y0WH0 M*214TJ30T7Z3D^.^37(^;$]7U>&W@GC'%YWDX0H_0C:K$=Z9$B7-<`EY-4I]ZFZ^LJ1M20H>-FK?LL>@'97C'$Q47>E*>)S(QC?=CP2[U(J MK¥E(XE0?CVI3L#M0_1EN24!T+DXXCJ5:+ZR5E)N'2.:)8'4/0/&IJ`P_EKN! MFND9=`WG*8¥D/*T:*DM2C3)16VJPZ5^GO7'B/FXN2?$K('!*.Q`*DA`VPX4J M17]62C$'F6H$JK(+D0<5I'Q:2,#[4A'>G8Y.>,=$¥`*DL4;^D[*5+*Z2&O+G M0Y(@HHOJ21+Z?)&D"ACL4¥?P¥YE&(B$1)&_IQRB.DG/BR;E68;@!:U`¥:]6K&QN=7¥Q7]FW"WOM1FN;:WKR8U<@'P%!].;;!.%/.ZW8¥_P`; M)>%*¥3R?UF+%@2`&6E>G]0BWBY%KAU4A3UY_9J?#QR&:`[F MG(">0>O_`)JZEI5_I_Y?:#I.IVUW_A^!9;W4K2830;"C(FY4$-MXYB0QF)VI M$!+N>3O'#*TL8:@D5B*[<2IK0'M_',¥9!6Y2Y8E/J5(HZT"`D;;;@U_#) MQ@1R9V$-%Q,M"H=)"T8!)J"O@21N??(RR2C_``H-'HC[:)87?@JR"<^F$F9_%%E?D__]?XVQ(]&CD5II8W+W%- M@%<=!T!(.8X@>A329)=16T'H^F"SL)@TG[%!0&AVRT@CFR"O'.)'!#K][+C/5Z5I¥48D+ M.!('=46,GX:R+¥)IM5AT.2H#DRV#.=/M96O(S*OQQQN&:1044G8U!_"N71'> M&(XCR9?IUNEDHNE0K,B49B*?:-`R]*U¥<)G$%-MBR M@-1>^W?(<6/N(3QS".5>0>C!PT7%>E:&C$-M4BO095Q1:I9#U*!GN&BCD)XQ MLH8GEO¥`%V&_0GWR<1$]Z¥5O.;M_4OC$¥LMPULYD92QY*6^T`37;V&PR0(:R M(I)J>K^BD=LMP%6&I@D4@¥@>I/?KMUIE<¥XCR+6=NKS.^FN)Y4I4^DS.TW[* MAC2B'Q/>F/BD¥UHGJ[CZ9**"D9"L"*$$'KO^NN^)D*L"V)-(=/WEU;^K*4Y3 M%H9M@@9>FW;&&8]8L#DB%T[W`)MXCS221CSVV!-2Q;J/HS-A*$NBB8/1"^FO M[TAFD^)6#P^9[]¥N$+Y%CL>JLU)7=CRC0[&.@Y;]T[;9,QD&8XAR*YK M=U@,52(S503U85Y;D[GQZYB2RS!JD&4EQC$P2-:;@J'?8$**_:%2/;;*SG,> M;`RD$"8Q$¥QHKS1E28RP^)2!0@]&IW/3$3)4Y"JQT9I0[&)43D&KLSGH`-MC MWITQ,)2Y*)`]58A'YQLE9HT!"KN6)(K5JBM/HR/@S'-GQ#O6LE'D8T9844R* M?BY2-L$`WY9,0(18[UK(D$4:NP$R,%*FAXC[3%GKN:[;_0:9/<#<6VQB.]$S MP/-$D*¥8ECC_`'K`<2)6KL:_%0#OFJU6;:P;RQ-<6GF/6KNY>WM3(1^[EM($67ZPZ@_$A:`'^>N::<=^;L8]H1( M^E¥6?F!Y:G¥I>>_,.A75[%J3SR_79KI(Q!19C4J(:MP;Q`9O];-GI<H0H_$YM8XC@C%C#()=/TL>= M8`EJ?T8GU)UTIA(JBN[A@"'=3U/8]CEHG(4O-%N^BZ9; M7VEZK%#IVKZ=86EI)P=]X)1;1(%Y#>LAY>.4SA,¥J9B(++_*%HUUH/ENTT&S M¥JM)%=W$'F<:S'I"WM[:N*F>V.K?OYS&-@+133M3&&W.ODL8/'M;L+6QUKS% M;Z=2334NB-.D:-0P0T^`)VI[FN9^.,3SV8R,AR"7BUFEE410`#TF9D6K&JBK M-Q¥0.^"4L<>191B#S"7UM7F1X4!B9?MDUJY'4^QRN6;N(3Q1"C+`JBS<1CTY M:A5ZAB31G![@'K3*C+)WJ9%:45.4(0,%-6!-?B4[';MX9;$2ZAC4^]$T_P`D M?S]/]V?S?ZW^=,LL?S5]7>7_T/D+#_>#[/¥`O2_S_P!G[Y&;`*$__'0TGK_O M^X_OO[]O[W_6_W9[>.8T>?52MMO¥`>>3['^]3 M=.O7_/AF1#E^I0IW_P!B/['VS]O[/7]GWQR_9_N5_N_P#>G^¥_W3[?S>V0Q:W M/]¥?[W^¥?K]K_9^WAECK¥O-YQ=_8D_WJ_;^U_>=^O¥<,?@QZ)4_^¥EC_`,8V M^W_<]?V?¥K-B?IZ,¥7Q45^S+T^V?]3MT_P`^N0Q?!O5++_>->O¥`?/¥`:^QU M_P`ZX,CB2^");_>BZ_U4^QT^CV¥<<;$J:_[RW?¥`QE3K¥_V?¥CQS98D8E:T_ MO$^W_>_[K^U_SS_AEA@Z_PRSKU;)(FP_P!ZI^O^¥D_3^¥[? MCX^V9<>73XM12]_[K3?L?WK_`/&/[0_X?*Y?0RP&:K-]+FX>;[O_(+_`-9[_P"FE_XZ<_¥`RC'_`!T_]Z!_<>W¥_P#D5SE] M5];L8OF/¥W/_`":.M?¥`'(_O4_Y1?_>#H.O_`!=_OW_*S>=G_C[76ZEY_P#¥ M>TOVO][1TZ?:'V_¥K-UDY=77P9[#_P"3%U#[?]POV?¥`F&_W5[>'OF''FYHY M,6C_`.4"M_L_¥=E?M_W/VF^W_E>&;3']+**/¥O¥`_*7>6/[W_>23[?7[9_NO M;,`_4W18R?M2]?¥`CI7?3[?]X?Q¥?;*Y?%@4,W74/^,)^S]'V_;^;#C^#`J. MI?[O_O?[F+[7V>WVO¥G^&9^+G_"P^2X?[UW'VO¥`>).O][]'_%?AFTCR_A;A M¥$+!_>3_`.M#TZ]>^8>1LQ)M_P`B>F5-S__9```````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````````````````````````````0```!¥K```> M*P```((D(R&AT< M'!%R(:%!L=%QPB(B$>'A¥B(B0E)"$E)2$G+"4F M*2PD(R8G)RLJ*2,J+2'EZ@X2%AH>(B8J2DY25EI>8F9JBHZ2EIJ>HJ:JRL[2UMK>X MN;K"P¥3%QL?(R;GZ.GJ¥?+S]/7V]_CY^A$``@$" M!`0#!`<%!`0``0)W``$"`Q$$!2$Q!A)!40=A<1,B,H$(%$*1H;'!"2,S4O`5 M8G+1"A8D-.$E¥1<8&1HF)R@I*C4V-S@Y.D-$149'2$E*4U155E=865IC9&5F M9VAI:G-T=79W>'EZ@H.$A8:'B(F*DI.4E9:7F)F:HJ.DI::GJ*FJLK.TM;:W MN+FZPL/$Q<;'R,G*TM/4U=;7V-G:XN/DY>;GZ.GJ¥O/T]?;W^/GZ_¥``$0@` M2`!P`P$A``(1`0,1`?_:``P#`0`"$0,1`#¥`¥)L=4MQ&$:?9N7:`V3G//)[] MAV[Y[US?C'5/'UUIUQ>:/IZ6.E6T4U[+]FOH'U&:PCE¥EKUH5?[1':;@1YFP M`#YBQ3YJ¥JCS5Y-'7B)*,=$K]SS33]-U/6M0L]&TVPDN[R¥F6&T@MXQ(¥K'D M*@'!]2>BA220`2/2[;X$ZO;?#*[^+=_KWA7[!%J::196,6K0W5QJ4^5,JP?9 M_,'[E'21P2F8V!5SG!TQ&(IX6*E--INWFO4PHP52+N]OZ_K4YK5O[2CTG3=* MT¥ZEY$L$EO+,9!Y+Y9I)4BB0X")O;+#6WJ= MWXNT+5K'5%7Q!^]O]D+W-Q+JD&KM=%XTECG>:-C$ZRQ.DBJAV^48#@!@6V?" MOA;Q/XE?2=6MI[*RB9EL]*M;O4;.VNKF9KD16UG;13E(HFGE-R5A3#RM;RO¥ MXCW"ZJ2A%+?M;]/^";VY5_E?¥CG/$^A2N_V?3(;:WDO+F.¥TXW,=N$MR)/WB M,[D.FW?+O(94(F97!Q@1Z#KKWFGQ6D8:`I&719%"-;D<21ON.X.'WC:1SY4S M=,$¥6*Y_9.5[?G^I>&:]JE)70QGBN'>X$PD8,02,G=C:>N>>HYS61X@UO3_# MMFUQ>RARV1!`A^>>3'"@¥X`.,MT4`GT!¥VG5KRFD[_.^E_*VGH>E5=.,6^56 M]/¥`@'F%UXLOK^YE:¥OBR3[8)HPFV/8&!554DX"D9!Z¥MR=QS/=M-R6OH=MH M5K<^(-6B¥/Z,5N-1N())E@$BHWEQ(7D7OC?4_".O0PCP].^F!3)!I'A33-2¥2:_8-:VFL^'TD2WU>&?=6%JF( M+:=XH;JWF/[HQHMT)+>V=96'/>.KS3?#6AGP;87L6L:GJ-Q%>ZMJ]G(S6[;$ M>*"QL1A=T*^;)OFP#-)N*!8PAD[G2YX7MHMO7[MSC2LFH2//+5;>ZOVN9KJ0 MO;>5;M'.M/MKA-9 MUVP34IIM1?4+>+4#X>O=5:1HF62406T/V9D6*"&)$E/DIM5HHD*@5M_"/XF: M?X&>.XTG2O$5Y=V5M8/<)H9L;)7AB%S)$D$-LC!RS M/E¥M2G"SM;Y?/^DRY04UY+R.$U*"#5K);.-C/)9HLUN([JUO_+0!4FMX09"S M0CY@/,*L8U`SD,U>=SVD>DZG;I'>3H-01[O:4`¥B0.Q;RV5RCI(#$V[I^[E4 M)C&>=*+T2W>GE^K')-/1V+NA7]M;VMW8A74V=UE%242@1R+EE¥SG/S¥X.3AA MZ#/F_CC4[_4M;GM[I8HTTUGMXHXRS%>58NV>2Y&W)&%^7&..>6G#FQ#`>8XJ%!+1 M[^AYS¥-+4VVKVUQ!!;&/,E,Z>2Y=6"$,[,%Y4$DJ2>0K9]!¥*1FQT MVQM]'T.:XUC3-&@O8]3N+&.ZCM;J;4Y)9LO+NCMKF2*:PCCNMLCJ85CVQF1I M8M>7EU3V[G*HRDKK5'/66M:S8Z/J6FV/B'4!IER2EW!;*QC*NZ>;&¥@PL2R> M5#NBC#"0Q1%V.P"N)U[4C<7=E>P74L4¥`64R`E2K_*X"XY#*Q8AASD¥>VT)- MQ[_D9SW,&VBDCF^T1EU2-=S&/#%4+;-W)ZY('U(Z=NFT6'SYU;4M2MHKZZ=9 MS-<+(D9FD)8M/+MRH3`90BLK_*#A2W4]I¥/1ZC>Z8-'L MQ!=WE_%]IN/[*TZ-WO?E#K)=W9R#$NT!4C$0(BCWD/N"/TJ^T>TGCU.]M;>¥ MLUXNM/'GW2L2?+MHH`?(0"25¥(#&#@,7`"OS'BK2[8/=VEIIUD)YX MXY].¥^/R3'()5EW",!2",MN+[R4E8$?-D<<6U/:_Y_U¥R9ZW7YV.>@E=[F&Y MM-)U*ZEE`L7M8K5YIO,!&]5AWKM9)&VE0`070OP&-;Q-/%!K M6I3O>1:4CFX>&U>23$UQ(#L3[@5$4LQ.2VQ5`.3J4H8A1O[TMEO?STO^(2A. M>'Y[>[#?_+S.:¥(:3X2UK6P/&GBR'1M'B(>YE=<¥@^3;[$;82,9,:DM+.R:7S1¥[^%)$FU"VWB*? MYU$8N9,Q8(X,C,V[!^7AG]>IG5LI:(PK[PO%IUTFJZWHL4=Q$G[JVU M+5Q+)DAW4R1`;BZAT)CVQPJN%<9=A6+`U@MP+F?:QN@9I$$.4#%¥X;:V60X? MY4P2`J_*#E<743V:;ZW_`$7_``"5'JTOT_#0[72-0LI(VLI[L:PC%+P6:7MS M'`AW,&:6%(S-<2<$_NR-D0^9^<"QJ%[=Z;=/;WR3P7"A'V,CQ,NY0ZMM8DID M%2H))`VYYS5*;E%+3;^M-$:QGRZ.W]?UW)M/N(]6:4VT=F6* M@;AN,A887#=.3S59QBFY26F]^WIH.*E4:C&'Q:(]=^'WAL>&;.^DCU*WU;6= M5NFN=6OK2?SH][$D0Q,#N¥O(9B6(:5V9C_"%¥*^)O@FTM=1OM>UGXU:'?7EU M,9)5-G(;EFQC&RW:1455"JNX@8XXQS¥9E694JV:59RC*4GHN5/1>=[+[C[?. MLFE3RJE"-6$(PU=_M/RM>[/(YC#"^9;]#)_GYU^AQNDM_Z]+?F?G%G;_@?TSH?#;+#=0JXBVF2/YU M9D¥M`>2IC&%Z]<<8&T9J;42B7US##"_E+*V%>4E]A`P>ZO¥`GY%Q$CBV9¥KNY8J-Q#%L"L:V*JJA-4(N4TOQ MZ;[G;1HI2INNU&$GN^W5Z'H/C;QE¥--4¥+IH6E?$"[LM'MI56XL_#ND+=I*W M'EB5I54!5P.&;+MUR17AVK7UI)1Q[Y,LP/FHG'!4<9..Q M]/-X$-(NK*YL MP%U"223Y+J0G((09`*C`+#KG&.,UO%27Q._WDUI1<>6R^1L:;:75JZW*NL$M MNXF2;S)=Z.I[*/XAP=S`-&EQ%#(L);RSPC$;FQN4Y`VGD`D] M%%IQY9O1=Q34^;6+^X¥(E@O[.XCO)=/E$D9651(N,$'(('?GG'(]01UL3?$# MQ9(899?L¥>%C?&5!9"(P0-HV;<*=HP"!2<%M?3R9FI3I^1-H7Q M:^(7AJTAT[0O$UU;V<18I:"""2(;^'RC1D-G'(;.<#TK-N-=UO7M2+7IR`/NTS6=6FO+M MW%QO#[<,K+¥VT`+R,`C&!CW.?2HQ5&=*?Q/7S?X)EX6;DM;:&"¥1R68YW=23 MG/3&0!P<<<>M59%$85U+`#.#G)P<'^M).UNYU3D[78RW8HZ^7O*H<8!()STZ M>^/¥YJW9Z%-=W,0NKN&`3W0C=RY<)N8#>5'89R<'FM;N^QQN2E*,>YJV?B>= M`JB3R`H)Y^^1Z'/KUY]:DO;^#5D%KYTLA9P3#&"Y<@8P%`)[U.)KSDE"*_$Z ML+&BH/VGR/2_`7A7X@:;9>9I^CV.BQS@,=4UFVB^TE.NU&DW.JCY3¥J]<$GF MM:¥MO".E*¥WB3Q[=ZO=%@62Q;R4STP68/UKSWA'6M*HDH_U¥RZF(;TC M>QQ6M>--&M5,'A[0;>U49_?R#SI,_P"RS?3MZ_A7GNL:OJVJ.1/>SNS`,0S? M*HQT/'/'L/3WKU*481CRP/)G=ZL9(]DJ1FU@18ER&:9L@¥YSMZ$^Q..@P:J7 ME_/<20S?VB[R0H%BV``1J#D!```H&2>!SDYY)KIG9)-;^IEK+0KRW>H7SJK7 M4LQ+$H@'&>@PJC&?¥:V-'MF73$¥Q"-LL@&<9&=I)]QG-85.>IJ[O[CHPSM.P MZY:.(-+*X4(/FR<#H!D^_;¥142:1J5W>0:?%:7,4US.D!¥R&1`C-@#?E>!C) M/'`!/2LY)Q6L?Q_X)VMN2:2=O+4HVJ-),+AB651NPQQG`_Q(./2M.+"[4"GT MR6QT]1]":N%TH[G!4:OH9T4OF0@.58L%.3R=R="1[C.".WUK;T'Q?KG@V_GN M-#N([9[M%_>+$K218X^1R,C)SQWJK¥MK;CCH:UWX[¥3:W,9+_6KF7)');<3G MKD'D9&>1Z?2K=K!Q;3PM<3+ MYC`[!C+;.@7UR><5D:[I$&EV,NS`ED`BC!&-S'`Z=01D?E6U&RIF%1E,%K')Y#)'&S',:XZ^O!.3_`/J]JZ+![G.*M03+':E6WAY'!^[G:OJ3T(X)]3BLIQ37+ MOZ&M"2BVSUKP=8>&?AEX&T[XI>)_#UOK'B+Q'(Y¥-:5?AD@AMHR1]N=[M%+IY^KW_(]A9O7RI*GATDW¥6EV[]#BKVZ-U M=R7#QI$)=@&P':<#JV>2V>23UXS54#+`!0%0@^A'?¥.,_P"37M0C&"26W];G ME8FK]:K2K)**>MEL5H;&-D59G$2@$!0I!/!!P>V,¥D^M/N[*UV1/"^=K>626 MX"D'IGK¥V:56>M]?30:4=V=AX8¥-MX/?¥0*QE:47S?G_`,`VC)1CO^!%KEUI]G.¥;&..-5$DC=.0 M,(!SUSW[8KS37;]-8G69H"L5J6,*$GYF('S8^G3Z]¥5:K25K/;YG-4G=O8RW MLU5BJYQCGK@'^O/?IS5V#4=;L=%O?#]E?R0:?J,D<][;1I&GVHQMF+S&"[W5 M3¥RH6V!CNQGFNFGS9E&I&*=NI2:+[25D;E_4?+GOP1_3CCUJ&2Q`@E M¥M%+M"^U<')(&1C)X!R!_GC&:S!6GVKY:$+NDB`+`[ASN:5+<6,4VHZS9+ M*[RNH¥J)7"L<1D"-9+H.Q)#8CP%(#5PX1.5!/S];ZZEXV3JXB3B]-/R[:&'J MOAT6-]/9&:*80.0)(¥['7:&#<@$?*>A&0<@C@U26TQ()&C!5CN4CG)Z8/X_R MKT(PM;K^/Y;$I]S_V0``F``*```````L`$4``````"P`10``````2`!P```( M_?¥"``#^_@`+!X!___¥`!__`_P`+!X!___¥`'__P_P`+!X!___¥`?__¥_P`+ M!X!___¥`___^_P`*!(!_P/¥!_O__``L)B'¥`/P/_`?^```L)B'X`'P/¥`'^` M``L)B'P`#P?X`#_```L)@'@``'P/¥`'^```L)CX``?P/_ M`?_```L`@?[_``'^_P'@``L`@?[_``#^_P'P``L`@?[_!0!____P``L`@?[_ M!0`?___P``G]_P4`!__/¥``(_``$`?¥#¥``"]P`+"3@`#'P``#W/^``+"40" M!%2``!*1J``+"8(`!!```!*@(``+"8.V=9&WV!R@(``+"8*2E1":9!"@(``+ M"8*2AQ"2?!"@(``+"422A1"28!"1(``+"3C_?[G[?#G/<``$`!CX``0`#O@` M`/¥````.J¥[UH@``4$E#5"-Q``````0````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````/____________________________________________O[@8*L_?W_ M_?NL_OJ!K('¥@:S¥^H+¥^XC[^ZS]K/__B(+¥K/[JK#."K/VLK/K¥_/KZ@JR" ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.24.msg ================================================ Path: flop.mcom.com!news.Stanford.EDU!bloom-beacon.mit.edu!gatech!howland.reston.ans.net!news.sprintlink.net!gryphon.phoenix.net!news From: skyojedi@phoenix.net (Skywalker of the Jedi) Newsgroups: rec.games.video.3do Subject: M2 Screenshots from GO! - 3dom21.jpg [1/2] Date: 5 May 1995 03:57:42 GMT Organization: Your Organization Lines: 960 Message-ID: <3oc7nm$edc@gryphon.phoenix.net> NNTP-Posting-Host: dial47.phoenix.net Mime-Version: 1.0 Content-Type: message/partial; id="799652823@Skywalker of the Jedi"; number=1; total=2 X-Newsreader: WinVN 0.93.10 Content-Type: multipart/mixed; Boundary="*-*-*- Next Section -*-*-*" --*-*-*- Next Section -*-*-* Hey: For those who wanted the M2 screenshots from the GURU Online, here they are. Skywalker of the Jedi http://www.phoenix.net/‾skyojedi/guru.html --*-*-*- Next Section -*-*-* Content-Type: Image/JPEG Content-Transfer-Encoding: x-uue begin 755 3dom21.jpg M``HS1$]M,C$N:G!G```````````````````````````````````````````` M``````````````````````````!*4$5'.$))304``'`!R````````)1@```A M2ZO.]8>KSO6,``````````````````````````````"!@::M``#_V/_@`!!* M1DE&``$"`0!(`$@``/_M`;A0:&]T;W-H;W`@,RXP`#A"24T#Z0``````>``# M````2`!(``````+:`BC_X?_A`OD"10-'!2@#_``"````2`!(``````+8`B@` M`0```&0````!``,#`P````$G#P`!``$```````````````!@"``9`9`````` M`````````````````````````````````````#A"24T#[0``````$`!(```` M`0`!`$@````!``$X0DE-`_,```````@``````````#A"24TG$```````"@`! M``````````(X0DE-`_4``````$@`+V9F``$`;&9F``8```````$`+V9F``$` MH9F:``8```````$`,@````$`6@````8```````$`-0````$`+0````8````` M``$X0DE-`_@``````'```/____________________________¥#Z`````#_ M____________________________`^@`````________________________ M_____P/H`````/____________________________¥#Z```.$))300&```` M```"``;_[@`.061O8F4`9``````!_]L`A``"`@("`@("`@("`P("`@,$`P(" M`P0%!`0$!`0%!@4%!04%!08&!P<(!P<&"0D*"@D)#`P,#`P,#`P,#`P,#`P, M`0,#`P4$!0D&!@D-"@D*#0¥.#@X.#P¥,#`P,#`¥/#`P,#`P,#PP,#`P,#`P, M#`P,#`P,#`P,#`P,#`P,#`P,#`S_P``1"`#)`3H#`1$``A$!`Q$!_¥0!H@`` M``$S%F+P)'*"¥25#-%.2HK)C<¥(U1">3H[,V%U1D=,/2 MX@@F@PD*&!F$E$5&I+16TU4H&O+C¥¥34Y/1E=865I;7%U>7U9G:&EJ:VQM;F M]C='5V=WAY>GM¥?7Y_(B8J+C(V.CX*3E)66EYB9FINGM¥?7Y_(B8J+C(V.CX.4E9:7F)F:FYR=GI^2HZ2EIJ M>HJ:JKK*VNKZ_]T`!``H_]H`#`,!``(1`Q$`/P#Y"KJ8O8([R41O(&JJ%0/C M4`>I3^;;8]LPY8_>P/$M$@NIY^`]269`Z%@*B0=>1/6ORR`$0QE(CH45#.8& ME3@AC)&2-PC(R"BU[TZ_CD)1'2 MD>H]&4^6O-^M>5TO+;RWK5]HHU&[B>[?39Y;-IDC/Q1.L+*)%<;$-7PRKPC^ M`HXPG9¥¥>:]4¥YVE_H=O;:7KUG+Z?EPZ'IMKIU¥7D4+)3ZA#"¥T[$DF1N4A_ MFRP0CU#;XL@F2_XB¥Q^:;7RWKHT_RSY@@:9YM4URQ@L)%N2*_P"Y.Y:#U[AG M[+<%R>@RV,<9ZU¥$'4R/0(FY¥K1QQ:W=7NL^7-9L-'DCCN-0TZ>.TE$¥RD'T M=*U**SO)PNX(B@5/"2F^$0Q_S[:ZE)`ZFGF`^7-,N)]=M]2LO+-J¥=CI4ET? M6TZWG8@+;VLY5J'JRVOJ!?VCDQIH2ZI)GUI?')`UGY7@;5[N2ZL?5@TS2(HX MI+2WMIQR=H9UG7BS[U3T:>+'!+38QYKQ'R2N9%%^ME`P-J4EEMP56L;(WQ!B M#0%CX=¥Q^""^+2Z2YMM,YW-U*8Q<[+#'N92XHP``8M4=:;Y9&,?P&'YCR9?% M9W9T6WUF¥^I1FTMQ'Y8¥OSN7O)(R:^HJP!TBB3OR=2JHK0LZ#_BWME8X?/[&F M<@3S`33¥YORZ¥O*VH/Y%¥RZCYV_*'0H;6]UCS&UDXAM=9F3]['=N(4C`8_89 M2X_RSF3Z)=?N:ADKJ¥)MYKF[ADT_0--CTG3;V!8'U`)'ZC¥?]V^H=B#V9@QI MT&2AIHGJLLTNC6H:79^3]9@DURVFN]<]+O/+]YY=:.¥UMXAI>HV¥3BYA2V-9+-;,'E*)%[ M.O$=AF/+#&^1=L=N_, MUIIS3+:JMX¥+"0W&Z0Q.#507H*M7J!M[Y1?N^*RQQ[F/Z_YGU?S9>(NIW$C6 MTRK'.1,(]?L:#$#DF^CRV<>H:19:_.]YY;"2+<((J MP!U`XQRD5`C(V.U/8C*K`Y`E(G[F?2ZS#=SZK);2NEMIUC]3¥N0HX6*TCFW8 M0N!Q`0=`HPB7>"P)_%(JU¥S?F!YXAT;3M&FEL-'TJ%+07D!DMHY5A/%S7#'`]3¥PVP%¥T6OD'RYI!OM1¥TZN([03>H$M(W`EGV+O)^Z:5 MHST9@J'_`"LJR0B.4OM;3&+()/S*M--MHM/¥F:;!H^ER6[¥B`P,A`^VD:L3O MU#.9&/>F1C+^D"D8HGR9)Y5¥D>;?,T=AYN¥Z"6/1]/9YM"N=3".3->1 M8+]`'N,L%'F0P-#J'N?Y?^0M/U3S#,OE/ROP_P`]QWMW^5.H0^1K#T_)_E^W6+S# MJCD0JDSD"2&TM`L;.K&IY¥>(/7`!RF0B,B.9+T#¥S/RU_,K2/RY¥K MZSK>MV.OZCYYN_JTWE73U,426DP#(WUJX])G*U!(?:OI+E8S'K)XB_ MY:V?ES1G¥R^=_,+:=#I9:,Z9:D-,?3_NSZA#*7/<*I`'[62X".8+9,P'50¥I M:_Y9T.XO?-OF2[L_*GEB2.LUA#&9K[4;=M@+¥¥9FF#_RC&/^<9Q?^7OS!TGSKJUC)::'IUE=7NFWUR##;7%TWQ1L[G@[QAMRT;`^!RC MCD.9;HQM]$?FC_SE%J>N.UEK.J2:Y!GJ(-,M"17C04$BEB2KL)7`.[ MY"<[;X"(ZOE[5/S9¥YZ^T&FZ4K6])#!)I-C&)I+CO1>0>2H3H%(^64>+('D" MY0A"26?H"_¥`^K3J?V?KG4?W7¥G7^¥_R?M>V9/&?YJ^`.]__T/C+:(?3D60^ MI!92/&4IP/6H9XZ1E7NF930"JT&Y''W'7?$RD.0MD! M2>6%Y;O.I_0L=_¥`I6YC@3XI?K,$E:!+.**1`68G]I'W[93*4C_:@Y&036¥> MG7FK0V46K^6=7TM%^MG4QZMP6EIQ5C'!;M"".G(,3[](P-_3])J=LN&'BYU M¥W'EB[BP:YM?,,6BPWD]I/-HFJW(DT[4GC9+:_N;?X?5$T@59BGC4T¥,)QR' M)B#*'5Z"/+7E2WA-[>?FCH&HW5LUM>/H;6&NF#48=FFLTNET^%XI/V6+>E&? MV9CE)@3UICXL[YJ/F[SGY'U&YN&¥G>0/¥'66XO/_`)ATO4X_+$K&/1-=EM':#4YW.R:6'X0SD#9G9RJ]0,@? M1T;1B!06J/9$'Q)=,0OJG_(XA1V7OD.(2[FJ0(Y?> MH0:_J!T5_*VA1-#HTTZZK?!WXQM*AW52W'>M"&'RS&(R#D%E8Y/:+?¥KO.NL>8+ MV[GF¥IV=_I%M9Z/J/F#5=>TI]/T9`!Z0O%MKFYG@)'[+1"I[5S(@92[Q¥41, MT]¥Y>3/RNT7R[K>CZ)?ZM^;^LV>E7%YKGG>VAN=,MO+]¥C#_`$FVM/3EYVXW M'*8#GU61>@M$".99R$N[[7S9!YITO3-+]"UTXBTOH4-KZAXQ2W``+SD#[0>E M:5)R1RQCSKY)AQ=0&,ZA^E]4O[6XEDGN8[¥*>9V0EJ#X$0#X0/`9491ET;>* MN=,R¥M_E_>Z[<:Q9:19&_&@V#ZGY@D+1*D%K%]IH%E*DN#U0%C[8#CA_-+$6 M>15K&R@M23#92WL:6R7DURD?(K`YH'-1^['8["G8Y&4+^D%D`>J"N9=4M4ND M6U@33KF.01/=J)(X*_$C/','$O+P=6!RKBE$;!E&'P¥X>9]?T[R]IGE?0$ADM+5HM M7ELH8^"=428[+#"&[EPN_P"T#F14#R:N*^J9Z=Y%U*:&XU3SGYD33VA>MS$* MW-R]NIY-%ZSD(&INBH)E_5D#C(Z()`YA]!?EYY5¥F7T^D:'Y0ELKKS1YO])O M*T.H M#S7K&EZQ:_XRT:(1_HZSLG`:02Z?^]+<@?A:8GD/V5RW'"1Z%D8@;OHZS¥¥Z MQ>Z?JNC_`)6^5]-¥H^3]`:2-+RS2"UABC!J9B66&W@#*:E%!;N&!PG31MQC" M7¥)?%_Y_Z'?WNB'STNJ6>O:397JPIYXMKP7@U2]``-I&U%FX1`@4W7YE>9+?¥M(?(]¥+8:!K$Z7$]G¥'KB38J$CJ)`H[LR!6_F. M9$I8FN<*Z_:¥FAUO5-/35;2SGELX[V9'(@L_FE^8FN#RUI^GWMY>:W:I]6FE/^E7NIE2/21F:LE$[`'IV.5@1) M_8S!'1@GGF/SMIFJ?4?.1G_2%RS7/JW8=`I(#>D5G5&3V5E'MXY9*4(<[9$] M[$+'R/YY¥[J)M,T#4I[F_9#8&5)0@AY`>K;PJCRS(.[11O3QS$.8=Q8&(/)] M`^9_^<<_-_D/¥I!^:OFGRVFN:SY?EAL+#3=:2:VMG@NV6DD-G'REG;?9YS"H M&YC.)G$]_P`;;(XZYC[4D_,O¥M;J]¥VZ.WEC4;KS7I(T&WN+J¥=6@M+2_E11 M-9::Y"K-''7XS""!WS&F>Z5?!OA7/K,L MLMS4[`2D$>.1EPWL&1-¥F._¥KBUC_JVVW^¥_J]&_N?¥`?7^M[Y=?D6OAGW/_ MT?CAJ]LEK/;-8AXXM0A:2:,L>/J@_$U/X9AC&&F4`@DN9@S%B72,GC*!3B=L MRH2(ZICC1R_5S%'.)'?U5@1?GC=?G[YAFT/¥`/R¥T/4[K6-,>W¥M?FGJ.FVNC7FCZA&H6*2ZN]'M8 M7DMC^TDR2JO7X>N6<$S_``@>](J7*!^;S/SAY"¥^?E+<6:7:RMI&O1R1V_GG M3'^L:'KEL*-'^C[R,+'*M-RC&H/5%Q&/AY¥/VLS7¥TH_R]^3_GCSG8:+K'EZ M[T37+_S,Y]/RU^EK.RUFV(/IQRW%C=R02^F>SQ!X_P"9AEE`]S0:']B:6'Y4 M^<6_,'RG^3^FZ9KGEC¥V;FZGM_.`U`"TBL;102]U:$*KA!'7]YS*M^S7)1@" MDQOK]CV?SQ^&W¥^7VB6-KHFI:_)"0)+J77K"< MW4Y<]C#"`/M>IDXX(GI]K`PX4U¥OZWY]_P"<@]&URS_,O0M<¥Y:7I,#W_P"4 M?YF2:>)9+>XM06_1M[J¥5LD=^#W6XYL37CQR=RAT#=&I1+72?+!T4^2D?2X;6!HS]>]*JK,¥$,2)"W$`¥N18]6IB<9'(!00D%OY MC¥GZ/Y'ET"^¥GP7?F'5HIXO,/F2^N56.UMY36W>R2(,.A-Y;$2[@$@E¥[>9=/¥JZ7Y9O=2CT#1]>26XO+7385%]>,S?$NI7907#` M#[$0D,-#]G!X0'=¥VV))Z,-M-=OYX+G1?*6GQZ1IK`))J,RF18@AJOJ1L1RY M-L*$¥>PP5Y!'AR[GVA^55Q^1=O¥`EO¥`G78>6W¥SZM^9Z^3S+YNEUU[62R>) M_P"]&FQ6@]0QH1_NY>8^62$I=`VC"9='QWQ6_P"75UJ<-O¥`X:GCCN-/ MU:W:)SS7X0CT=N#`=R%¥.N7<,QS('P0,=?PLIO=,N=+59+K2KJS2^M[BYL1P M9#=VRFOJ12,H#*O?CMD!*7¥X-T>`O0/(¥>I^4_RA_,?¥T[66SGCU*R'E^PM8 M3Z@MFNI.,DMV0`ZN%^S2J^)QE'O^]1C/,%]:OK/YY?EG^6WY1^1_^<1M$U&7 M1;G21K?FOS9I^CQZV]SJ$U&DMM0F:TNXXJGI0(].C#)QQQZ_>B9)V(>>_P#. M68¥N:)^87E&Y¥QZ#8?XN¥T>4([S¥P].L(Y/037)%4¥O0F%$:G4*:@]<$Q7(! M8P/¥U¥U:I:2R7NDZKJ42P:AK,"PZ7H,@9EM;045)7)I68]>-!0="V>H"&SN>#'U(G6KK'"HJ6!WW)`_EQ$LAZA%¥/ M1-+/RAYM¥R0KJ6MZI#;I%*(DBN21-$&%>21(@B0#INRM_DY(POF42S6]G_*[ M_!/E/S+))H^<_-SQ>7[2&.+2-$3@D,,:``JB!8XQ,:;2 M,KM3NOI%YJ/UX0SN662X8)I-.2S@423NP6X55-#Z8$ MNH8"-I;AZ^F MC@U+_NO9LQLL,A_BP^1O+&C?EG:7(H]Q&?K^J3K*:R- M/=2(%5@#R%&EH>K91'`1SE]K1X9[@¥&¥X_FQIR>4;^_U/7M1¥XZZFN0?4=1O M;B2X:*,#[*BL<(`)^$QQU'CF;"8B-I.1'#?=¥WS%K/YB:OJL<=YI;'1;1M1E MBFM@?6N6)_:Y%01R.]5HN:U-/=S@P+<,INKF¥+B=V0U MJD?$N30]7X@_S90-1P_Q?8W`^Y=?^5_*NC,4UK5GU&69)')`]))$'V2L*%W5 MAT-7()Q&4$¥RV¥4N¥+_^5B^5_P#JS:C_`,)*7¥5-1,^B]1))Q-``#PJ-R/;#9/¥`':>*1ZO>/+5D MFJ_¥X^^;&@"Q:EY-¥QVVI7225JUO,.`$@8T!!WV&5^%+S^;#PB>KSI98/2DE MD5Z"JB,*>2J2&]0$GH?¥QEV.)"T8¥@][¥C?¥Y$:AY#LY?*[^2?*7F_R)JUO% M%YB¥MZA:W)AU"-MC*PCGB$=W'U65$!KU)RV9(_`0;+([O¥OOR[¥[:3-YV_)+ MSM;Z#:7$SV5S^7'Y@:G9Z%?07-:M#9:K>RP:=>14->+7"RCN#F/XYZR^QH(D M>@37RW:^6_R=T?7"OYA>5=<_-[S@RV$.O:+?G4=/¥KZ=(.,WJW]M%+')*]>+ M?53*!W;#&5]6()'.5//[H6_D2>STV;_#7G"XBU!=2T;7+>^_25K(C"K6¥L4, MR)Z4A/QK-$LO@RY?#+72VVQ+J]9_*J_O-;¥X7WY@>5+"#¥H?R^¥M1RO^8,UA MKEU9Z/?:@4)AL[<7=S+/,9&Z0JTO'Q7)#)W0:##?F¥?¥RWFC^8+;S%Y@DU>% MI)]?NYD¥JSM=/?,7:@F@D](0^DPW^*;U*?LTRV$R?X:3$=X)6:G'H9TCR;:Z M3)H)CJOF*>2YTN[NFM/+4GE MX_[@QH:-:SP(/BI)<*S74K,-F:65J]%HNV4GU:OS1_,/¥R&M)M: MU:ZO4L(N&FG4)'GBLXV`4)9QR$I$&X@N(P.7[1P`USMLB;Y%`^DG,M['+HF!YLN$C^)NQTW MS)>6]ZMU:26MA]0,BV=L/5:V!V!N'BY<*']AV5E_ERTXA7I9@%[)_P`XMZ7I ML$WYOVN@M(=6N?R[U!)_,UTZ1VL,@J2)9)BD:I(-@VP_RL,<>0=0/@P¥20>L M^4Q^5UY_SCCY;¥AV'EGR5>:^=+NK_P`V^5O,^H/8>;9[OXFCNO*^IE.$L88< MC$"X(V7#DU!&UAM&3O8?^9WYG_XJ¥A?D%;77D/R[:!=+N(;F6TLQ'J3FS;@C M+.SN0K¥:2"E2?#IF%/T[U;*.2'FQ;¥P+^]T7¥E/)WE"7ZOIES^8^NW.MZ_Y8 MMZB[>QA(CM2ROR"*`*AN1KW49&&>,FSQ1T)?7_GKS-^1?`+VP`1¥TC(3_$7PL_G)!YB?4=22*?5_*¥¥L=C-;M2QO)R:)<(2OQ!NO$@ MJ>XRB1` MCZ5Y=¥O6?E[S;=ZMJ[3:C/9F,"$¥(T5"#]7=%#,6:GVBX!_ERZ,¥?2TU?,IE M!YT>6TL!HVEV7EGTK:-$*1QJ#*H`!5`G&K@4-%K[X-C_``L!PC^(L¥MM*U¥`XWEW&T9A#[@QHZK1:^VXRT8;Y1I$C?)ZW^4'E&W¥T:A=W>H M2.LNC:@(X["V9.1B)_=RVPD"¥7;J2S$>V3&(#FT2Q<3]-/R^¥J:5H6G+=6]G M-%?S`I/-=.'F*U!'+B`H-/#[¥HS9#'Z6O¥O71/¥`S+Y;M/,=K'!=()C"2UO' M(S"-9*BDC*H^(KU`)H5+?4[B>_M[C6=7C?G.85D:)(. M-?6GMH`Q4*W¥U5(Z#+_$(Y!L$H]2^5?-/F:;3Y+C2/+5W;WVCZ?RY:J(S%#& M7J6]"%T2B#OR05/C@_,$VDO"TNTD:225]_OQXI% ML`$GGK>8/,6J7LMEI¥URI`+_`%2S1R¥?$U)5E',1G]KD:>],QY¥0Z!LC$1YA M#Q^2[ZX6=Y7CT¥F7U7B4&1F=C¥31(@(*^(J/;#')?0-G'`)E_@G1O^KW']JG MVXO[[^7['VO¥CKF14NX(¥2+_`/_3^*::7<26]S,E"]F:RQ=^!/VAUZ9A3#23 M75"FWD1/5J.((HX/6IZ@=<-7T7C"_C<0`,&8*SNR+'¥PM"O-*B220BW^O,G.V>5*J&8,*+4[5¥,C/!D MZEB>.3UK¥@#H>EZ;YKTG3?-_DCR;^>23S:;;Z[^8JQIH¥>F6C<9;.T^M6UQI MC33TI_I84$;!L1"$?J)/P9PC,_Q/:[CR#Y3_`#,U71O+/F?R!Y8_+;¥¥--M9 MKK1=.CX6?DS¥Q+:,;2VMUHK6T$,K_:0VC¥'.U4N=2OVL[2VGN)KQ:IZ[PE8;*WC/<,K/X)WQECX>@33R M/0])T:¥O3%9RO=2P&XO+W50&DM;6*1JJTI(!4$>-!7I@J9^E&WJ:S^>$]AH¥_ECRI M8:;^5V@ZU"?TQHF@M<7.IZC;&A$.IZM>^M.$NCD",>EO/+3¥R)KSR#Y0¥I:UI.EG25¥SR MZW/YA%FIUVTM+I_5>&UNZ¥D20G=".!Z5`P#%P[T6Z(AULO0O.WYWZ#YH¥PZ< MGE;R38:%;^2=)@T_1?-=W:*=594(+2H/K$¥$;LV_)4'(?:&1G*^467"!R!^; M*M-_YS#_`#CT6¥A,D&A?F+#%8_F5^9GYC?FWYFL?,OGO4[+4=;#>E:Z6!"AM8*$<3'`HC5 M:;CIXFOMF M1CC$="U_5S+-+2^¥XZ[)`LNG3:?IC,IF9*HC6[TY'U)!S<>Z#Z,GP@¥HL3"( M¥V=Q:1IVB:/K]RSO)/J-D]MIVDQJ664@U`9V/Q?#X_$,R,1D.8#7*5UQ(A$LA6FZDJ#TY9FQQ¥75Q9YI='J. MK_F=^8WYM:M;V,]S#>3SR+!IFBZ;;0V=G;R,!NO%4"H.E978#QP'@'5K!R%] MR_DM^7%MY>M;#4/,=V&NW9+:^M+5C(6N:@@1K&C.S?¥`&-6S&,1([$M¥1(/M M^SNM/M+."7A+803R)#"UV&21V;X%!#_&M:;!@,3#AYI!/5-V"E3RV'4M4@T^ M8(_7E1EY!D#$"[9#P3__U/DYI+1SW&@6:Q?6)98YX+NWHJ+)0$*L*OZ9^%AU/2OT?1EL3)/N>J?DKHW M^(OS3¥IP2,$M;.X.HWO$+R$5JAE8J&H&X¥>@R7ARES8T0];_`#G¥N:'-Y8¥E M?F+I?Y>WGE?R_P":M0OTU'S7)="[M-6F$I*M&AGE-L]!¥4?&.GOB85U35=ZE MK!UV;¥CO+=IYP2^;4(M?+_E%+=EDN(](5:W"P5^,1¥A5>JUW7(C5RARW8¥89 MIY;¥W6OYXZ!!Y'¥RW4?_`"N30K9;7¥OO.M_.L)UK3E.VF:C),P1I$_8=B#_E MC)?G0?X2V`P4]`_YQT¥Q>5;6?S'^?-G>?EOY!LC-(=&N9(%UOS'<1-O9:=;/ M*)_2?:MTJ-%QW5C@¥:4OIB@F`YAB'YE?F5?^?M3TPQV$7EGRSH5HEEY2¥CV3 M@Z9I%A'T^KT1%-PW5Y"O)CU)R/#FZ`!99`/I#SVY¥V^9I=/U'1Y/,&H#2KT* M9]*2YD%G)Z>T;O;AO39AV)6N2O)_$?L:2/Q,RCL?M M=ZY$¥$.5IJ/4KW#31F35;UX8EDD6/3XC¥31*=F%*@AAOOODO&_HLA*`>J^2= M4¥EZ7::7?:GY?OO-VH7T5Q;#1;>^;3-.L(T%([F6X2*66>;N(D*K_,3D1GR] M$G)!EECY^_*[RU;6¥>E?E_HUQJ%A*;K1?-6HBZUG55N#_>2212RQZ;*P.T:R M6R!>NYWPG)E*/'[@RGRQ^:?ESS)=^;&_-'3-4U_3QH,_Z`UBXN;CZ];7TG]T MD,<$T,4<1_WT28T_9(&V2B)EK,Y2Y/G,2>7M,LX?6>36=1:021¥?BBV/PJTG MMT(H03XY`CO8<3)[N+1M.¥T^:K/3)IKG0[5HK/R^)0LDRSQH'FAXJ%!5231J`>`QE M')+D:91RR*2W%T]O&)8D:-IY"&E=0Q%30`BFWS/3*.&<>C8,A"M9:WJ5K9W. MFQ32V2W4@:[N[:3A++Z1^!6=".2CPR?"9Q78E M@*AC"'D^%F<"H#$;$;¥LHR:>'4,_$,NKTVPATO3-'3S!HM^^L:O>¥X1J@!*O M/*.'U=`P^'@Q^R%6OCF&3CAR`087U*>S7FA^2M6T1=02&_O[;1*Z;=(%EGMK MTMRE(]3:W)J15#R/OET-0U2C$+X?.7F#S"U[#HUL]J)P#)?!1/R8'=9'="B< MA^U0'WS(¥4]RC)`/0-.TNYFTZ-KN^331)>P2_6Y@;B6"*`?O*Q@QAA)TY"2O ML9:3A+WGR!K^E:5::M;^3O+UK:W>G7D:Z.;N!9%DA-0]Q+;@N M))E[>J¥J#WRWP^/ZBR&S[&_*75+O]+V&K:]K)EMXS+#;:0`D:K<.M&N(84"P MP*P)#*E`?YF]3XX!AG+JY6/4&/-E"?E7YG&GOY?T+2OT M?=ZQ$)=;U.[9+=4@6A6-!0,TA!W%*C+H:60YDL,NM)ZIW:_D'Y3T#3H+K¥P/ M-":99R`+;01W2V):@YR".4,¥MPY'[.WLIP3Q#NMQXZB1>!?¥Y`:'^2^MZ1Y4 MTSR+:SV$WE:?UUU:&W6&.X26@>.5I:3¥R/M0_+ M@34+^ZM!<"XG9M/6Y!:5;;C1N*+2,U_F*DCM3.?U.JCWE[;LWLL2'+¥;IU)9 M6Z7-G9:5&1#Z$:6=I%0!*GJ_*8¥467?X;@_ZGCRS]CTO^ M.E#_`'G_`"Q=/[S¥,S.,.M¥;&__5^1.E2P/!J:M(KW$3PWMK'RXFJG]Y&K&E M5IU`%6/+,T6GWG)@$FO MCZ)(<,*/0GIE¥)QZDL..(YD/H_¥`+.77/+'_`#B^OFORUY;N_./G"QUE[K2? M-KV4/F+1/+$<9YDW>FWYNK>":0[I-]3JIZ2#K@ED@>8+690/4OEOSG^8'G'¥ MR;S_`!9YS¥SWGFCS#"?0.K794&,+UBB5%5%B'["*`J]@,..4.@++TQY`O.KB M_N)Z,_P-)T=.JT/0$UKXTRV0XNM,!E'<5LUS-/(¥H99))6I<,#0$4^TAZ@_/ MOF/*-?Q,Q(GD%,@D*-PU*J684(¥6WZX1/S:92DNX,ENTTMP2R-^XWJ&8CX58 M'M7IDQC!;(%1B.HW$C1K*6N56DL-`U4;J`H&X`R&0"*?#B>93[2/KB6Z&W=( M8M.NA`/4]]`>5;_`/+_`,^:MHWEO4="¥M?E MS;ZK.!>>9]-CU749I+I%_<^N=1U.80Q2'[1@9!XI3)BY%H,P>3.?SET+¥H]& MT;¥OM$_+3S`U]K>D_6%_-'5I6N(XIKIF/&*!W$<+*%^R88J4ZR,"AS4&7 M:C=74(Y>G+"OI+!;2#;U?5J M#T6N8T¥60¥I!G&^YC$D@O"GPJ>4CR&9'IR"R<^ M/8#&`,?JDR!D'JWD+RU^2P¥OQ^9_-WF34H=8U(SV_E_R!H5D;BYN.`XI<27¥ MLL<,,8_:C9HW/[+83(=]M9F#U7?F%>?ESY¥BT[3K'RK9^2[S1;%+:Q2&_1;/ M463^]O+P7,:-SX@@(')!Z.^6QG'H+^#*)B¥B0>4=.G@M?+MB=>-93R"#.N44LL4:SU./6KZ:'U+R1V;1W;XH0!PJ.Y MIV._SRX8¥@',-L9R[D?>PR0HR6D9N9)Y#)`&:N¥IJ`"*[BO0D',7(?YQ;;)1 M/Z%4Z+!J5W+%/(96@N;*U;F(I(SN9:?9KX,/D3E8C"7)>&^JVWNDTW62ZPI< MP6L]O<-I$PJLCTHI)¥`>V5SQ^3*,!YLFNH-=U7S7J4¥$T=IJ]PGUJ¥L(2WU6 M:95^`RE6V?CLIJU#X9CF'DV@Q'0HCR]<^7KK5Q=ZK;(T>AP.EUI^IJ)G-U*- MV:&AC=1V(((]¥$<4F!RCH&1#SO-'%<6OE_3U(,O&``%Z@=`ENB@@`]!4YE0Q MY!R(2,LNX,OM8+Z[DMI;@SRIZ"R2":3A!8@XXS7>U9!/H7JNBZU)9>9&¥ MMMIMMI$R%&R9E..RP@!R#S._¥`S0CN-#L-.M!]9TNUMHDLF#!( MUC@V1E0`/S';>5=$XBVBLH6CCO#)]H/3&HF/-QORD2^4?./YT012:G*9+KS-K5V@EBOIYPL44T;4K<']¥UU&1 M]DK)$1ES.RH$_3?X+TN¥U`1J+:"#TK#3X$M;5T(!]% M?LE?Y6¥1G*:C6YY'D`]WI]*,$=A3Q'¥R_-XTOZKH4=Z?7U2)FOUB`9H8J[2_IFY_WY/U]'[/^Z_'_6S=?E1WO*_F M¥OD__];XY^7IH8[V&*>&.:*ZC*S)(*_%UY`FG&G@.N8AG?-99`B_,MIP@T^Y MG=(KUR%MK2)2L;PL=F7;8[;URP4PMB#*6],K&K<69CR%%:IZ4%/#*9RETW0* M+W/RM/=I^0_YG))$6THZMI¥=O-;!5D%P6Y$3D$NT5.@;;#<@/I9#'`LW_P"< M;/-¥GE37/-D.NWFH_P#*O-?T=[+SQH&EI$¥VI!E/I(@F7X>)-00R_P`,AQR[ MF<,$>CQ?S"VC3:OKL&A1:A;>78-4GD¥NV5¥$%_%&Y)$=QQ)7;;QS)ADD&A"[C<^V5SE;109IIGF[5=)LK#38;32+W2K5IC';WVC MZ;=RE9OM#U[FVEE)'[))V¥,C"NH:Y&NK*$_-5N,D5Q^7_DN¥CXVZ0DZ%9Q,O MH;58P+&S-(/MFH4]E&71Q`]&,-O-!1>=O+TGU?ZW^5WEJ¥"NSR?O-6A:A;EP M58=1CC2G39>F6F$AR;^$%D?ER[¥NZEJ&N0Z7Y=BTBTU&RG;4=.MY99I(8F6B MK%+*S2-1MQS9B/'(C')KX>YBQT>&ST?2#<3V[6LMM.&2UD9V3TF)5+GX559R M/V5.^'PI>2)1MD@L+'3/*?EO4--N;:ZU#S/ZS7>CE75=,@79+F6X!%9#_($V M¥7?RB31]+;1O/'F,W.DW0773-HL=O'>P,]'_1D;W'.& M@J2]P%¥0K9;X40@$=[S_`%70/)&G7FJZC;ZS$H_6_*UUIT>CS:7J5@VGZWI¥FHV[1.HN+6`_86¥B7D MMM(PWX*[?/*I0G'D0CPNX,2L=!TZ>]M;".[_`$M=ZF[&90`L9`6KNW)A]GV) M)[+E,I'O#(>GN3"W@NI$A:RLA]257CM=0DD6-91"W$JL2U=:>+4^62C.7>V` M]Q3RR¥E'7=+U[SA:RQ7%SY`LOK'F0H5CENHY3^Z6%(E/(1]69BOTY*7'YMH) M0GZ)]6RM;N[V75+6.Y5(P`K!_P"Z.W=1LQ&8WAWU9@6I:A,;33;;2);TQ6SO MZTL8X@$=^0&[^Q-G6J!1¥$¥@0F8GJ$4,L:PUYI]A,MK?Z@¥3(MS*5Y)#%&"S<4/6M?D,A$QZECPIQ+YET M;2XYH],T¥H(IJV¥@`CB`!_O`P^)C]&7[=[$[,IL%UG59+-Y(Y(Y;F,SR6^Z1 M+%V8U[GK7KE1MG&=/0=.T@V¥#3W$P5D8?5X!¥1J?M.:@G?VR&_=]J)Y_)ZWY M2¥V1Z?>ZCIUC:)J#26JAH;A>L(W(65SR(#;T&XRZ`(Y5]K7"7%_"'HFGZ[IN MI111+)>:-<3R!KLVZ^O!;HNU%61O4;D>[R[9=XQ'.3.0'<'H5EIFB.(3+KLS MP&.K-]5`EE#&AXTF94H.AWR`B)_Q,+]R70W'D33+2.WCCNM>FTNXD-MZ[TAD MY)] M¥B#&'1NA(>;P_P`V>?;RRM-9T/1CA;¥FZ)*P!,B_(4PG-W!AD M`/(%Y'?ZOKNJ1V*ZU?B3A$(;F.$$+L/A`Y4Y?3E4I$1Y"S0Z/IB[/TDR;(_&[W"6UMHY3 M:V:^A:V<3+%:1N2DBMT>+84;^;.1U?:G?$E]([,PB(W_`!S0D05(>7&16;K6 MI#%=@`/'Y9KOY4K_`"1^;N,D(S%46(:CY*¥NZI.+R¥T^.7TRPFE!:*5RVY$K MH59J=B37PS/TW;(O^[IT>K[%$^B3?¥JC¥O?R7/¥`<_6_[S_=?¥G3[/OU_P`K M-[_*O]%TG¥B1[G__U_C98S1Q/;W#T8K*ACC_`-V``BOS4]ZYC3A'O8;/2/.T M9U"UU6_F11<1+`^GW!IR9#0¥4_E`¥%R/A^;/9YE';U:)I5,@:.K,#3D3_*/I MWQ$*ZL#$][U3R7Y[M_*OE;S+Y8O](36[7S"]$BD?THPPW5)?@=G'8A61@/LL M,SH98@;M7`1U9CY5_-?R]%JV@:%+^7_E7¥M_+^IW$5OYLU[18=5U6]CC1P%E MC_3VH:L$(ZTA12>F4S,9.1'4RCW,9_-6R¥N0?F3YF?RYKK>8M(G@BN;'5Y[" M72[B8¥``K6TB1T)'[055/4921'S1+*9¥WF*M;K*.40MIC"6,3;T5OU'#&==[ M`$(B0Q>I$43<`!ZD`GQ[4!RSAC-)KJO@C$MP012XX¥.)%>6^W$#OA$0.J!PH MHQD¥+=FXN'?XUZ>_TCIODN)$J9_Y3¥QW]C+Y>TJ)Q;:7I-X]S%+Z:¥(II1Q, MSBE';_6J?#*_%¥OM:N.TT¥V0Z1_BAK+0M/G@2TM&O/-J2%VCN;IC5+N,%GIM MU6B+X#)"8K"+7+#S)HFC>5G]9+?SUK,TUK9WLT(K+#"DD*7# MRK2@2.W:OXX99K[V)'O><_HC4]1D6*6=KB>621;&TMDD:29$)$<@@`]5>2BO M%E4@=1D``.K&.Z;KHCZ.NFQRZ7=0:CJK2BQLI$$;2-'M)5C7A3K0C+#OR;/# M!ZIGY>¥JWWF?S)I7EI.4FL>9+R/3]&T2V=$#2D_!RFF953WKMX9`P/5D(1[W MV2W_`#C%^7OY9:LUO^:?YEZ3'KEQ82JGE;RU/]=U#3M3"`VR7DH@F:&.6N[/ M#&G_`!8<(`_`1*$.KYQTS¥I==¥Q7.H6NG:B-:M-"N&EU/4+6EOIEI&QW-Q?W MB6¥$0'>23C&?V2<@D^<-)¥U:@M]`VLV>D/)<64 M!*V8>J4<`U M4"NWBTG_PAI5[ZEOHU MK-#<7FL2CA)+//NZ<.-`%K0,&;;PP0V/)!$2F[7GEK1)]3%K:B^%O+2'C5N( M;<2^J]:^ZC,ZK')HE&NCU_¥`+:*PUG7O+DFL[>7K^8IJT8^$11]3*¥A[`=E( M/AE9VY4PL]SU'¥RK+R&_G[ZS^7EVTODF'2HULS-'=(;J[4_O.8NU69:'8&@! M[8@D]+9"$BDVFKY=L]3M9IYC)JTRE;5$#,"KBC*5'P[81P^?R;AC-X/XY9QUR:)1HIW;7,D¥9659)2%"N@HJ*3T(` MZ`#*SJC%OPX)9.GV++6P>WM'MKN9[N[,QF#0I1?3)HB@@G=1X[G,++K_`.E] MSL¥?8QD+(3%/+>J:Y;BTT8?4C,61M8>(SI5SQH(RT8'L>77*8:B67JC/IH81 MS?/WYB>5M7¥HZZ=)].5TAM/4O]:F0OS?_??(+P6G6A8D>)S8PT¥JMTLI`G]K MS;1+6VNVC?S-<7$*>O(+HQBLDR=4$?*@4'QIF+GS3CR#M]$<43O]_O>O1^;_ M`"K%%#8VZR:78V<8BM5*[#:FY!)+-U)Z9SNK.:?3['MNS];I(#>OG[U:U¥V^ M6[VZDT^*]1+M041@'0+Q%20[J%>OU=,?X@C(=8T2Z=K>U MU*UN+B.G.WCE25TH=R45B0?8C,&1R3Z%RQK]-_/^YB.K?FAY(TV9HI?,EK+, MS/6.S#73EHOM1L¥0,:/V_>.H]¥V^@[/R2.X/XMP]3VKIHC:3S/¥`Z&B¥J?¥` M4K:S_>?5O^/?^Y¥?[W[?^1]G_*SJ_P"39=SS_P#+6'O?_]#X]00-;,'55$D+ MF02;%:D4*.K`_"/?(G;N8DO0C+'K.AV&A32"XM@P/)D4-%-U],N0'*GL*T&4 M3U,0RC$=[RZ&&X6YN[9^1EA=HI8B/CA5#]HCPIW&"&3B10[PCXK<4`>K3)¥2 MN%J"*]AEDIR'(A!C%ZBELMJK*%8$F137;*PV6¥(ZT6J@.J*2T/.)6I+,J^HB@#C0=P: M[UZGMDX2@.@;!&UJ-R26[]4>K4JC$CF6&P93T-.F,^#KNQ,0$;;6WKI';EZW M#L54OQ`>)A¥8-:5).4BCRMB:*?¥`ENYN]+GN+#2[1YY]=BET6RM5C]24/(U6 M6-5%22=Q08F!Z,.(O0_,5BD>L6U37('$>¥-D93Z!](?E7^2FF^8+&Y M_,*[_,C2O)NFZ5:S?4-4N9:W,VJQ"D=AP<01*TW[/[QCX`X?"F.5)N7DQK6? M(>K)+8EM>TW6/-7F.¥*7'E[39'O]0"2,1!(SP1F-W<;^C&[2*/V*6.0K(""!0UKMT]¥'#W4DBWJOY7_E7J_YA M^E:'SMIOE_R[Y5YH^H:]=RV^GV@E^*;@(XY5AJ"3¥94,?VLE'S!:1*N093YP M¥I?DGY7¥N^9]%¥N>:=2¥_>:S:K#HOFJ&%+'1!)SJ3]4D_?.H4'A(D¥J$_LKE MLI1K8GY-H)D^<]/T-=,U:R^O374J:QIK,953F99HSTMN(%5¥3VS",I]_V)XB MA+[3HHEM;J)1,X+*[`@?'7X6'8@=#A.67>6P&^B776E6TD;S-+?2N8N3A']KEZ?!DR% MZQ"ITRXD2*[DODU6T@DDUBY:(Q*T@Y4@1%4(#_-Q^9SFM;EB#SK¥!ZO0=FRB M-Q^-THUOS*GE6SEO);>2]DD*K%8HS(H!V+/(*D?1U'<=PSM-#"$!^ MSWO!ZN1G+DPQ6UWS%Y;UO4XIOK5GHTGUC4(GN]3FSEJ"10+ MC¥$8[L,T?0]>U;6;[1-5A3RW=V,2W/K:[)]0AAMW'+G,UQQ*@C[(`)/84S$( M,U&HB.2$U+4/RNT*01:SYVF¥T2AI8KG3_*5N)X8I$^R/TC>F&(U/9(GIV.7Q MTW%S`;!FGWL%U'¥Y-,T:,R>3_P`O='TB7T>$VIZP6UV[5HVJEQ`+D);QR#N5 M@-.V$Z#&.<0R_,Y!R+P[S;YFU/S?JLOF#S'?'5-8N57U+EU1.=1UI&%0;>"_ M1D?R6'N'R3^=J2`AR$GCMXO1X22R,0PI1=^AH-CX M#+/"¥FF64'O17JS*LLGIL[0O¥78T'6@/?$1,>GVLHR'_N`B7&@2,XN>1XJS'[#`;YMY&B:"^6&W^NW35'".0?#44Y`¥>@[Y#C(/)IN)Z/9/+?Y3 MZSYTU*-/(,TN;^LH0]'C9O<9D#A`MD0/- MDGFG¥N-9¥GZ%HNH76J:'V1¥8] M!3*.,28AHT.LVFL*;._F-Y<%K.TEB+%F$_PE#Q!8K0[T'3#ZNZF1QT^BS^6? MY8^6='U_3M?_`#0LM1¥VVN@B^¥J0>6%%]ICW[,"]G<7RAE=EZ,I](@[5-*9` MW/F?L4"WG_DO¥FOS!_,:WLG¥K>6]3UC3YXY)KO4X8_3TZ*:W'*9)=1E].U3B M-PCR`_/)1Q¥/(GY,9<(9I^8GY*^9ORT¥H>4_,.IK:RS^:I9%@¥O6LIDGMH`2 M/6G¥>&X:-S'<7 M+Q[49P*@#L?PQXP.;EB(/1$7&B:6L5Y)8Q_[C-(4QWE]4L¥E]*WP1=N9¥0N1 M.2)Z_8U2P$]$7#I&EV(M)[R0^NEOZEW"7V"R'_?8%10>-?GEL0.DFLP`Z,JT M^[TMK*¥*JD%E'<(;5A1(W8?:HI&[>X&5Y)`?>;M1¥L>9)[=M+U"[*& M*W1+%4C($C+<2/ZDAZAN4"@?LL<)S2E_$X673&!Y?:]A¥CVTM]'KT[^4+6PT MB^B1]/AAL)&F)C-171FG6,]^,P3_BO-7JYF._$[;LS&"=Q^-V0F[2>W6= M%5C:,T<97>,9@$CCI7D[&@H/'¥>.+ROH MXT9(KQ[BVO9IWDG6HJLT<8"QPR!NH/J"G<'?.GTD¥¥_K%?@O$:Z6`&H?CD¥¥ ML?.^M:]J.H2:IJMWJEYK)>34+^XG=YC(#QJ9')VIV-0.V;W'[Z^#JHQ!>8OJ M(2XUZ-:3Q:5=F.(C[4A?XB?AH*@]^^6&,>A+?QF/4(22Z%P&AD9>)BIZ[DBH M.X`^G$B^J1:0&XE9HP(2&$3-,23N1M0$5V(R!@>¥))/10+>395N8V&8DH_BV-EF^@$S27MJL@]74+:3ZF'IQCEC-4`/:OWG(57]J1D¥D)YE MMX6ET34N(%S?Q"TU';@@9!LW$;5KW_#+(SM:`Z!)TC$#$`@B12KJW0J=JBO7 MQVR4I`(XCY+I4A#+'7U$^T"30LJ]S3I3,.1XF8E712X+;7$JK,CM*$>,CXD9 M6I7C3K0?3EL>*(Y?:Q.3W(IOJKCX;CTR[$K05(I38CWR0RWT^U;#<%N6CY." ML9!XNI%>0[`'+8L+[UUM912P--'(4X/18C0?$?V@*=/?)R)ER6@.2,M?W#-Z MP+K,M70_M'H&^?>N1&,H)!YA66T5AR6=D=GJ&&Q`K]BH¥.V6#':!7TUZ" M>WO=+U"RC:TU>#@T:K'"B&&G&8@)Q>0T[`'N3E4N(,3PJU_>:-J.I2W&E6)T M;3I-.AMKBS>XEGY7<(H9BTI+4;KQK0=LK¥.^@^;'AKZ7L/Y7Z?Y-?3_-&I>> M/,>H>5%L-,=?+T-O;2S7.K73BBQAUJ(X0?M'@P/8KC M2_+^FCU]6U$F.#308X@[K5@$>5DCV'V:L/;PRLXYGD$^)$<@]U¥Q?D'^9'Y? M>2]`U&73Q-8^;]0$,VMV,G.;2Y#0&+4]151#:Q&M.+S2/-%¥71YDGE MO6)]6;RK:Q)5NBUR1N+5=6¥@>7O,5_H6BW]R[:C:VY]"Y$RDB2(3@++"M?M*C+7]JN3¥>0ZL#C M#`GOIKV¥GO[Z!9FE#-*E3$7EJ*%^%-B>OCWP>-W4VX¥8BFTO^-/-T$=O/')J M6GZ8A1HDCBM;6V1=RT5M&(XU*CJR)R/[1.52S5S9RE#K'[6+>)XL:?$I[5!&5<<3R+*(!Y!+4MA+8Z;'7(T(>WOYB>*UBIQY@^(J.QS&EDF.H+RQ<1EVNK¥W#W-U8EN$MOVTRS8&3U9#_=RR-R6E/Y?OR<]5&/7[$'3RZA(_P`N/+]K MYEUX1S:G%%!;QB_9N0+*P-4MXBWVSV.QS2ZO6$]3¥G;:+$!^/>^D]2TV/6;> MYM)Y&@AOD%O)(#1PHW`/(&A`Z4W!S`QZ¥#G;O2H= M-¥K^5(;&%@#+(91202?ZX_P!4YT6DU,)C8O'=I:+-`V?N M]S#?-/¥`SD5=28@2TD/;FR^V;+)",AN M+=-#4SQ'F7@%_P#F_K;R37.E)^A[J]BEBNKE9>V]3`;2+!/,_F[6?,&B27.MZA=ZI=V4¥4FGW$K5^K!:"3@*_`&ZD+ M2IWIEF/LG%`_L1D[;U,QN;8?]<4)+Z;&))CZ@(-2'8;-4=!FPQZ6,.5?)PY9 MY3YDI:DZHZ6[$TFV:NPY#J:^^6F5-Z5WR0S`¥B$1`Z(O]$7W^^OV^'3O_`$RSQ/-G1?_3^/D1 MC3]R55F6DK*#NQ`^SQ[$>)R@@#HPH]R-BU"XG1&L(C:F(L&)^)U8]'%/LT¥< MC*,3T8$A%W^E:T=.O+^]AE:UT0P_6'>4N]9B.,@W->5>M<@(@<@D!+8K>]F5 M:QD)38"IXHV_,'W^[&4O)GP%%G2;J.11(A#*:QR$'EQ;L">GW4.1C,7R3&(" MK'IYY,'+*2W%&('4FI!^>7'W(E$%,1I<#+)Z88LZD@=5!^CI]&5D0[BU"%., M:_Z&51F4P<'H:!'4]1X^P.$1/2T[(YK65/0>W`=$I10:DK3E/&4>`,W)B*,OMML?EE@LL@`5>WME)D:-O4$Z,4IL4IVIXX.$]Z¥(5( M_3E8W,T15$1;?D_V8G4]*]*GY`Y$V&J0'9/+.JZ):ZE! M'>6!O[26V:5)/LRH)44.C]B!0X./R:Q%DVGZ)JVKOZ6FVTM]JL?]QH,,K>8="47SKIT M3.T"Q[^H2H_=TZA2>65G*>]/ACS0^N7?F?5-H2PX]!7H.V2XP>92(>]-K2V¥W:QI3Z;:VEV^D¥S/J^G6<9BA9QUEGA MCV8@='9=AD>$-@H!./-&G>:](U;0]`UU&9-,T=9/+=M1OJB0W&[21(RJK24. M[T)]¥!->O..H6UMY8¥L:EYA,C<%>UA)@D:,^;_.OIZII5O=#08;6>2VU.VTP>B[7$3<6(N2SW"TIQ8+)P/89 M(QKFD¥,D+Y0OM%TK4;Z_¥V:=)K=G>V=V;RX4+/>+/)%QAD2&9DCE96[NP/@: MY29DS.*5$AK&S#J.0I4#H>E,_01X',[%IYY=J+JIYY83<;2 MN?¥`.?SL([FSAUB:U"RO#<%ECGGD2E`7EG1W6G[)0IF='L+'/ZBY&/M[,!5O M/;_S9K%Y>V>HZGJ%UJT]FIC22[E>601L:E?4U_[$"=)EITOUR*¥T6562#5CQ%Q7X448+RQDE!S&Y')`>2_ M=7OD#*19<0[U]G80QS@-0Z,>''E7_*V]LLCDAU#08Q[T&HA33Y[5;>.-;L¥GNBH M9HVKR**S#X=]OAIE_%'^'[F7`.]JXN4FM8H"B163W'J+"OP+S4;F@Z[943$¥ MTB`/5!2ZLLD1YW=4CD!91T--J!:=0,'AX^D6W@KJN_2/_+PO]WZ/7]C^?#P# M^:/FRX2__]3Y!6>D-$T@+!I-XYHEJ"7!VKWW'89B'B/>V"5¥RRVSMX(UN)(8 M?AGA6"7B*T9=]^RGVP<)+$B+*I1)J>G.)RUE!)9O'?6RDLER(_L@H"OQ#MX> M&8¥LACT4<+"[2!9(K0&)U(7C&0#Q5!LJ,OM^'AAA+CY@?-E+;HK%:OQ7DO': MK#D0W=37I7VRZN'D6@9+[E<0J3N2!(/3:,@UKXBO08F1EU9[HU("G)'J;=8N M$K4Y$DM4$4[#Q.3ABE^"CCME%GY;ANO+U]JL=]!-JT5Q2'0/5BB;ZF@^.XY2 M%58CLB$L?`Y9*,NGWJ,9/1%GRYI=MY?M]4?S?IGZ3E8>GY4C%¥;Y(9"`)6D^ MJ?4Z=RHN>?¥`DYC¥4X¥Z9571Z5IWF+¥O](TZ)&_+6VUSS+I¥¥4FG>8;B_N%L M+C@*NESI:KZ;H?:1"C6K7MIYOU"Z_,6#RGY;¥K:?I?HV=]Y0L> M=E97]Q&`6CL[+U7NW+#=V1Q3^<8)98QYDJ-D-%HS^;-4¥Q7FB>7-"¥MV<:17 ML]A)J*V6EVM*;I=:S>,68=U,SM[8!DA+J6>W5$ZCY@U?4]3MSYOUK4O-NG:& MALK6"'4G<"%U^$64ERLRQQIU^&.A[>.,L@"2`E"S,+2S>."98;61_J]Q4,K! M6^!4`%>8KN>G@!E?B`LHPMG&O1:[Y=-AY)U._N+[3"?TU=:>)R]C9W$ZAD=U M4M&9V!I6BFG4G`#$=0D8O+[64^2_RN¥^?F-).ODORU?ZM;>C)/+?GTK>!?JX MY2".:X>*.1P!_=QDO[9;&5¥B&/#73[6/V6I^;=,T[6=/BOKNPB-VRZK%"6AG MEX#@%E9"KLG8J:@]¥$KZ28GUU73;^XT^'48-.:&673+BW2XMV' M(,$,;@H`>Y`-#VP"-¥]VLXHA]5^K+PP7S'?:OH)UB'3;G4KW5=9UN.6¥OK6 M"RC!_2E0?6+&UN6N;^TKO-'%H!T)/C^.6^)DR¥@&H5C.X>X^5OSD¥G>5-- M;RY!Y:N-)TVWCC3T[GP:LG?[FW6=IZ8C M8!X9K?G6;S/#$MQIFGZ79Q2/+:6>E6Z6J6YK¥**ZCU67_)=RH[`9T>##_/¥` MT/(Y]3&1]+'M8U>*9K,/;TC>U".BA54R(=GV%"U.Y'WYEQTT3T^UCX¥JV8FL MEQ')%6(RM/)SMRZT!`.Q!:@/N:Y8-.(]*0AR: MKMW*BG[./#75COW!06SA%Q%%).9`I%0%',U'2A)KB,I[_L4D=_W+M4%K2R:2 M+T+B`-%;7*%J[_:C9=^H_L."0,NK#CKD5MO=Q")5CLV#K¥*2QQ`...Y9F&]? M`X8QD$"0*J?56W,K1,DUTYEF6H/'ELI!`I4]¥L¥/))L`0LS7QEFB6V*TB`92 M=Y!X@TIMX'(G',=:9'=9);WR!%1HFF!!5E^*E.H8%>]FPR/$.]C9DC?T18?¥`+%_Q[>EV^S_GVP¥4>]>#S+__ MU?E(¥L,/``B22*3DQ3J['[)J0!MVS&RRKDDV.J<0&.WNY[*,3B[2OQR M/NR5Z5'<]/#*`OXY$3B&X1D M.Y?)(DLT<"RK%);L)!-Q^$D[^F?$G"9<350/5DOE6UL;S5;Q=1M;JYT];.YN MKB.QB6>XMUC']YP:B^G7[1)%!XXT8]"DRX>19WY4_*OSMYPOK6R¥O^0]H0'JV`2XOX6GBM-->¥C^8?)_F2P¥J?F'Y= MO/*/Z-A-OY@FA@6ZN"'W62%/5CAF8'8<9PO;E7,G&.¥,AC*4C3+6YCUZVTG4 M;F>/2IX!HE[?11VP6'F!+)=VLJ.'S#U[5+7_G'B/0+C M3M`C_,77O,¥NG$NC#33IWZ4''C-;1Q'UY(ZUJK*33*S*(¥U,+Y$,+TW2_-.F MQZX-(T'6(KJ?31)YHCAMI`BVVW$W,:H7CB([G8]LHE985()%H¥=F]ONW7;+0;_A2(6]H¥K>5=,?RR]QY;¥O:_=2O#KD4%%N)^!C*P7KI MRB<=?]'=6¥4N2EI-I8ZY::A)_A[4]6N&:.;S#YODU%%E]0MR M+6ZM"%!;?U&E:=J?RY3/6WS/V+^4S#DGVEZ]J=E?:K#Y6_+[R])Y>J!JNH:Y M9R7>E6¥;CBHLIKLO,)CUY"7C7H.V8<]F^5+)M!@TO M2[JPMI%U#S5?L(BOK$DND_IR$-3X:L0/`C)XM7XIY).B-78?.^@^?;/R6EYK M*>6K/5M>:6(6,ESZ4G$#:3]XTZ.^L3#4/T3/]8M8GC0J@E^UR1%52#7OF?I])/&ZW/F&4WPL4)NY[V]2-$>) M;J5X+F5OA_>&I%:5"CY=.F99H¥RX@C2I6X<*S$C[#T`!¥?L_+,B.(=;8C', M¥B$LU6Y]*^M;U8X[8Z>C121K¥*`-LQ913G4=S^&6CPX]"6P7'F;6V>G7U]!; M165K/>)?W/'2H((&<32$[)!Q!YL?!:_+*YY*[V<2$NUG2M2T_5+FQU/1[JSU M;2(0MYID¥;V¥L2%J_'"_$[^)&#QSW-E#N>I?EE^0WYB?F]]8@¥D>3)-7:"-I M]2O/6MX(X4I45DNI(5KM3KD?&B>J#AB.0#"O-WE'S'Y7UM-%¥R:2FG:A"GI2 MK(¥I:3(CH$Y_+S¥L_-?G_5'TG0[:)+SZS'!.TLL< M7%)#O(.;*Q4#<¥0Q/9HZBP`&W;KXC(QU%="V4>]¥57WE.YL=2U33!K-M-+8/R:5'>DC` MTI&7B1B/F!EHR`_PH$@R?R!^47F3SWYAL/+FB>E>W5¥'NIV:YB@BCAC-'=I9 MC&`0>RU8_LJ('0>H%!_FIOD!K8="6X@A¥BZOY&>RN5@BU&*[]&20V]S#*2%4=BL MBHU?HXY;CR0GU+$2CWL=7R;+#'?1$<1>R^J9?4%7(_:)!K3V%,MD2.2;B64^ M6ORJ¥QZW^]T?0=2UVWNIA%%)8V¥LT37:#9.<2L"PZ¥!OXY3P$¥R5$;Y!Z[_T M+G^??_EI_./V*?¥`'`O_`+?¥W]SURS¥OYEEP'N?_UOE1I¥)B"R3Q¥S(&BCXD M]#N6;Q(Z4'TYA3OILS,3W(Y&#O;6Z$(JH5D/0!EZ5(¥0RJYC%&+AROVS_*/HRX2'4LZOHFFFS,+FSA'PI).L4@ M9O3#"0CDKD;@-^K(DQ/,EB8OH/7?SI_.M]4M8)/.FJ:#_A'3OT+H=CHDWU%+ M>Q<;Q&2U$3S`C>LI8CKE=PZ&UX4C¥H6VB:YJ!L?.OGJ7RAITP+SZS):3ZF'E M.[$P6Y5W9NE2PWW)Q,ZZ#YMFX3NZA_*S3-!¥QVD&KZ[YD¥S1W;QZ#K:00V>D M/:BG!YH7]:XYD?L_"1XY$B4NGVM5#N*K)H.KZ'#I-[K6LP:)JSQV[6%G()GO MC:RD`7%OZ4;6QI7:-K@2?Y.$89#^U=AT4#=^=_(!¥V:,GFO6_*$LLLAU+2HY M;K3X;N&¥Q76E:=Y*@O_1T33(IO,LE¥ M%B5M5!]02VK`LB0@BH458^V5'-'J6S'BG)[/%YF¥[^6;_P`R>:H?.-W+YCU. MS$VO.%6*WN8DA,4<$UKR'USB-T!*`>V&$8]*9Y-*8/GC5/S(NO,=KIFI>;;[ MS%YMN=.^M>K8W^K-'!;@RUBBMHC#/]3C7NG)U/2HP9A(¥OO1BRB'5Z)'_P`Y M%V.GV&C"U¥MR026;*UII4,R1001`49HWCA(I7>G"A]LUDM'ED[,:_"!U>,>> M_P`T?,/FN>YCEE-I9ZA=>K2TDE6.YC`^%)`69&8'K0`^V9&'LZ?4AU&IU/$? M22PN"_U%OK"E'CCNHGAJ[D`BE")1NR[^(WS:1T5<^%Q!DR]Z1V¥R1FST_E(7 M0>C(A`5$DK4?$Q"¥?`CZ,N`,.1#9PD¥TXNH;F&&!C#ZY@D:8S,GJI¥(H.2D4 MX^YRP2)YEB`&=?EYY0U;SKM--!COM3¥P:E9Z3IMH9S¥#/_P"4%AY3M]/T#4_-^K><[>Y5Y=6DAT^STMHW`)>. M**:6X->@8L#XQC)PS9!](`2`6$^2?-/EGR=K&H7NJ>6(_-<%R@EBT>>2."$3 MK_=NY,,WK+_,GP`^->M1TR[M?(/ESRC<6 M7[(V-K*BB@,L?*3G)3[35%3V'3'AG_/2(E0_*S¥^_P`Q?RBENKO¥N-5'EJ6Z M1[>_,=G9W//DWP_[U0S`T.XI3*90EWLP/-@GFKSMYU¥X:PU_KI%UJ=S([ZE> M)!#"¥I)JK,(8XPHKX"GCD?@2R^+(_+/YD_F=Y+1D¥N>9=8¥LQR,?K*:/>S6: MSMXR&VD4-7L3MC0Z!!-,6¥Q>9O/_`)@OS=:UJ&K:O>7"EEN;^6:Z8$G]DRLQ M/WY9'B'1C=]$7HOF#SQHFI66IV)U?3;F$HESJMHDTP-<$H3 MEW,1Q#ELS/4/SS_/*[MEM+O¥Q/.;QB=PMO)JVHE(F8[4C:8A21[5.0&"0ZMM MR/,O(9]6UN:X5[R¥OY;ER_*]E>1IN3&IK(_(_P`1DI0(:CC(Y%FGDG¥Q_,7D M_4)=1TG4&M-:@8/%>.J.%C0[<`P9>1[DC?*3"VZ,Y!]2#_G.#¥]S;W<%IYS$ M%K?*1,QTS3).05>)JS6A((&8¥]*3T9;%C/F/_G+K¥S_,GEVR¥L:_^2QZ>U>.9FFU**!9/0B(X$)0B1B._P'VKFJF,O0.?C(#[T_Z& MD_(?_P`NL?¥`CG>E_O-JO7_?G^¥GV¥GQ9NXMWB!__]?Y6VDI+HLI8%5,S,34 M,`>M/?¥`'-?-R1(HT2Q^NY6$,LGQ1SL2:D]J4H,C&^YKE,A-+5EAEADC4HZL M(V*]4:H/('H/';)<1'0*)DIEY@M%B,L4EQ'+&O$BG,L*!A[5P¥96 M0[TDBC4"&8,7$3AVC*@$@]!6GAXY.$A+O:UX1VDD]2)0I):/G0B@>'?! MDB.YF#2Z&W^(NAYI]5Z?=E<8UT8DDIM`J.)I'VD-&1R-_¥`)>G?!DF/ MYJBWJVB?4[RU76=7D%_=Q216?F%]3NV^J)$VT,D,=J5NB8P=PK24_EIME8G& M^=,Q:=I;6#Z3^@=),>NWFAZD7A@TW25G2Y@?_=YU5T2]=:FABEC"#)2G`5KUTU>WTJ"_GATFY@C7X);BV+`*T?8B@7L<'¥H M1C_"/FY4=`2¥D¥XSZ;H]YY9UGRQK&F7.HV%M*+4+(ER/5DWCG1!'(DA0?M3S M-_DKF9"<9PP M"'/?X.KGD,N;'XI8W>U6L:1RLJ0-=50QT`VE)*H`QWJ6^>$'&>]B-V6>9=#@ MTO3K,W'F'0)EO*SMHEAJ4%]/;R4%)7:Q=XD!(Z>L'¥4RPB`[U,47Y/¥`,OD7 M1YK6_P#,WE&^¥W>FK0W-A%JJZ3"[."(RTJ6=Q-(.5"5#*Q[.,`X.EHJ08#=Z ME$MU)!<::D=Q;Z@¥UQ:2$L8X2W-+:5):¥HP-OC%6_:K@,JZ!D">YZ!K_`.;? MG_4O+>G^7I_,5]:^4[@<+#RA8D6>D¥8>@CL+81VS-WY^F6¥3E?C^Y)XNYYU% MJCM''¥9$87A`%Z!0?¥_EU&`Y@6)R'N0E[>I)Z,RN$JW%D!)Y;UV7N3XG$`2[ MUXPIW.K5D?C0JS,D@<5],`"G+EXY(1B.=IX@A3=RT0.M"=IJML$[,&P[=-V9 MX?-:EY1C$$<)&:K)TY*>E?&IP&^X-4IP'0JD2KZA2.(@%A(]"31A¥Z=,G`)$ M@>B:6MT]W*P='HQ:,2#D2?8K2N_<#`8UU6[Y,BTX12H6W<02I'*E*,4;8<": MCX?"E,1`GJ5,SW/0--C6.5/K;!HE/I"6G0-0BAIO7&6G+3*?O>F^7H(P¥SPQ M?6$'PABO':HJ&(W%>U,8X9#JU¥9[B]NT2¥LJF0PR+%/Q*Q#95$?[/$4VKT[Y M(SG'JUG,.XO3-(N=)99E?2+2[2^'[QKA%D`<'X1'R#!6]U'+Q.1$I2YE(R;* MU]Y$_+O76_W+>2M'NB94%RXMHXWVZ!GB56^>^71@.]K&;?FPK6?^^3,0'(CDKJ¥=US_`)Q;¥FDW9LM7N[*2 M*&26&VD9)D5:U``X1L*^)+9CRQD¥BR&AKT[9`8I][/Q!YO.M5_)WS)IZM#Z2R-<,.,J5/!SN#0CZ#M]."40. M;*.3WL:/E3S!I(>5+?B]#`_"I)5B`VU-Z_[657W%O¥5">AJG_5I7[/U;O]G^ M;KTPW/O1XQ?_T/EM=QVL5Q<%8F@:)_3CBKLHZ?%MFHR4.GVML<91WU<@QJ5) M.WP`UWZU!]¥89QW-G#$IE#9Q7]9UF]_1>BZ=+JETD7J MI:0?;0=V1DTC3=+¥PV5Y%>6>IF>ZU"Q`>:_MVZ6TG. M:-(@O0,B¥O%LHSX<@^D.=@¥#^)[-+^:_DFTL[>VT7RO>BW^*.?3P_P!5"H=@ M'GCDDA_4;A[I9+6^^LW,LMNK M-¥0)DE9#7H?A'CF;@TF27U.DS9Q$^C9C$HB6!H'F:/B¥LGH!VK;SM0-4G93( M-R0:'OF8-#$OVVF:5YLN?+5^OE^YY6,6NO;R0Z=-,0.*? M6.*QNPZT1N1.9V+38X¥@'&G(2YVA/+!¥NUNAYIU:ZTX6@;T[;3+2.^N)B?LN M%FN+-0H[TEYTZ`Y,QCW!8B/FQ35[O3&OIFTIKR*";CQ,LM/79>K.(U0&O¥K¥ MB/YCE$C$@6-S:6>F:D/2O##I]DD_IT^*/ZXL/UE M5;N%E4'ODAEET8R(+SI[^<7/K*`L+BDT3KORZ<@.VV5F$@P`"Z6ZCFD4SQU7 M@1*0HY.HZ`?3]WA@XN¥)-J;M>"W0R(¥<=R?W_CE(Q]X#`R/FAGN)&99%D,,.SEC¥/TU¥/PR8QQ30¥W0FZU-;GT(5]2U/U MF9/45*)7=X@2`Q]EJWMC4AR+`R*%8>G*UM<$BG[+14,/L`'90Q! MI]/X8QLLZ!1L,1$S),2`4JZ[A@S;*U#4¥3['+[KHQ!"<+;AT0H14MZ<[*-PI M_:`]O;?#XOFVF/FX2-VB=Q0Q5(,JKT:G0MX'IAX>XM7&7H>G%:P+*? M5$@4H`Q6@¥#45!]SD_2>K7($][,=,G166$EHDEE)657JPX_L';>OCC8')J-^ M;T_3M4:4J$`@HW[V1FW!¥`W](`IL&0&JL M:>&^)(',L!8Z!G%K?W$+H*&0RK7XDH">Q(¥?&N&$KY'[$F*)FOI':((O"5"5 M9P#05WXFAI6G2N_ADB!WM=R234IW:6$N%XBK)(6/-1VYGJ5/W>V1L+&)+!M4 MOI2Y0QA/297¥¥<;1¥E#P3GB_,GXP1U[5ID*$>K:)D(+ZKI7_%73T^G;^;ID^+ MS9XS`D`>@:*=*W0B5VN(E+?5I MRI4¥F4%@5_`$=H^2"1W!E M&C7<5RGU>&:+U5AE5_C5(X:?[N,C$1Q@'J78`>.8XS5WH&_*G2P?EWH=BOUW MS:VN:M)"9FT_28B¥2.QZ&[(>&7?/2Q/13G>?2:MJ.JZI=W^IWLVI7U[&+:2^N)6EG(6E% M,LI)._O7,Z&`0_A#0GW%S%>6LB`.]M=QH;I0@74$WE^[ MUG76BYVNJ2:C]4LH^1`*RV26S2NR_LL+I5¥4."4HCD2Q-GJP5==N(Y;.ZB(>E,;"XR.@CB5OW3MR*@46J_9!.Q(]L$I$]R)(<3E7])_BD:3:5#L MA)W7B>Q_V¥J^"Q)¥T4¥RLT+I*SQEC&K`¥E%-S0D=`>XRR$3W)E#R00NYHI;J M'U*0L_)I%-.07<^'(?3URT@#H&49%6G_`'B1>@Y7UG'(4-"AZ`CQKVROB/2F M1M!?6OC<,Y*QN4=VV(IVX]?E3*)9B.=,;13*_$R^J;>A!!.U-@1MX8>,2Y%! MKO5BHN%YR(R,0#(1^S[@GL>N"(GT8[>;DGG2U2YGF"*TGHO&@+@;T4B@KWWH M-LO,)GF`IC2;1`17/U7?X$"O)2B4<<@2??WWRKPI=*6QW*T<:S5!)VY=C¥CAX9=ZF`'1D-G*)HVFD)')J2)2G!A]FB[?">U,CPUS+*Y=$]AC2XD M8D&(1J&61R*AE_EIV/AB#C(YEB8R¥F3Z?>B1TC=0QDKZT*45B0*!NA%!D."N M1*"?-E=E>"+A(@5)TY1)(HVD7N"HVZ=Q2N61QRDTRMFFDZB&132.2('DS``E M0!4K3P(¥@J0?H¥.V,LA[PP.W_Y-@CYI?/J4C)64*&YA4`-?44"I4UI2G;OC*?XIEP_%B>H714D< M#)'4T%>CD]#M2OAD1`GHQX0Q.¥ODDCG2A^$¥5*@&E/$TP¥`'4G_+-!]GZS^S]CQ_XR>WXX/!AWKQA_]+Y M?Z=JMK9Z))ILDC&]LI1`"#Q<*M"49A4,O<$5!¥4'K1'B(_F.51Q2/(MD25'4OS+U_4-!N=)@M[7 M0].NVB76+?28I+=+KT#6$S¥Y96D*@]68UQ&(1Y[_`"095T8KJ`,5V(D9A:RP MI+;,@H&5_M,@Z;'MED*Z;?!QSE0IDDE,]G&J+)(R%`JT8<:;AMB*=2.^9'". M]'BR/5>T:¥9"?[U@L8:100[C;D]!U]QDAAOJO&>]'"WN+J6UBX>I-&_I1D,` M%`&XW/2GA]&2.W1B3:J-+-N([R5OA#>I;2(0*.&H#R(WW[=WL7G6 M1K9UABO)O5N7($C¥XZ%D5=OM?/*^,0YAB8GN>R_E-Y&_QIJGF*RGT2+7K?3- M$N=1L-/N=0.FR+(E3Z]M*M6FD4`_!PD7^9*J/<##+)"75AXI_`2MX'5`TH#O"S+',I^PH/0#P8 M88XAWLH2M"_52YE##E^WR'4)V`IX=¥$K')GX=]5)H`/15F+MQ*,Z@@FI``'@ M-^_3`(¥71'#$=Z-O].O-.N)[>ZBB06T:DO#*DZ"-@*,CQ,ZL37>A-.^5¥(CS M*U?1+UB:&-9#$3$*NTE010G9B`/Q'3)BD5$W7!P>]%E1MO4MOJT9!$7K#TQQXA'/4`B MG7WQC$=1?Q6B>I5)(V8M$J>C-5O08J*)O4¥@13[¥OJ(Z,@*YJC?Z7/'.7])+ M5%AE"?"'=1O(5`I]V5SD.E)X2>2P6¥S07A0A;@N%#T^VH->3#O3L,Q^&?>&L MQD%TC22LBAQP1.%#¥0D!W+"O3?J,LQR$>OV,HB^=,ZM=1¥HV/E¥V;>7+_6-> M9F6369M2$%BHD_:BT^.U64.IZ1:Y0D4WM(EMH4$6[2HTMR/YI'/Q%:=`1MQI3($EKJ4 M4QA=GX3(%XQR!WCVIZ:]%J>F,9^YD+DR6.1(Y%F6*BRHY>$J!Z:/3<"G[7;& M6HKH&8Q2/5[9Y2_+34[PZ!J&J2GR[I&NW,4%I]:A=YF#FHGTWL=&8]7WL('G7S4EYILGZ018;R)"D0BB"¥1OR8E>:U.Q[#¥SV7$=@SW2-=CURULKVQN?K5FQ*^F&I3:H5EIR0C[LS?&!_B=+DT63'S% M)B;I>)DB(80NRB)Z$,6V+%6%"!].(B#U+C$R'5C]RS1<%MTI%":I&6#$+7?= MJU)R,J'0EE$SEU8II&-V,C&JT/6H¥,H$I#E$,S88?=R3N'2 M9F96B4R2N*&H;8'^W+8Y+Z!A¥$PX)_OR;['+['[7¥G3^S)U+R3P>3__3^3$, M?)(WC^-&5GCY?`0Q``)'6OL=LH¥-!XG10RS1^DT?[V@5&-1¥1Z`T['$0D.5, M;DCG55F0,@/!%:50*J6^S0K[^.$PEWCY,A::7,7UK1M(FBB`GLIY+2[<*2¥@ MD/)*@UH1TJ#T[8./A8T0W!I$DB6LSTAY.1<%E!)44Z("":>!(^>0&4'G;'B` M3";2]/B%+F:L$$JM$2`E>5-T0%C[&M?GEXF.EHX@4¥2Q$LTUVMM]4D2X46XD M4(U`M>86NWNQ6CSW4DR4GD^+T@3]I5_$L!AXNXL^.G MH_Y#)ZRQ4=8D6,%SS&W[L¥@:!/Y0¥L7EL;+0=$YAY(XA]IV1!¥+/2IJ[M_E9(F/0 M'Y+(!X^WU.WCD*,_[I=G)/+G_,I->I¥FIFJ2"W(?%R!&W MOF3`PZ_>Q`D>]!*B0"1WV!85`)W!¥1]KZ1D92@>0^]L`(YK7CJTKM5"!R!ZF M@&VX_#$&71'$I/$HC216*LE"&I4$5H0V2/$>?W,QMT"`,,K2/%Z?!"#*K;T- M>E?`97Q203Y-Q(8P$>$$LI,@ZAE'7"#3`VLC21IK:8('BF#&*.E/AKM04J-¥ M!R#S:[¥U4VA1F`C)'J^LJD5K3IN/]O`)$¥@D M!RT^(>@;`>YOT522)#Q+NZ¥BHH.0'A3:OOAAB[PG==Q+F1HBWP,%FJ-B"=]Q MT^>1G,C84BPN*CD(XX40`B,!2=Q6M0=SU]¥8`GZ@Q,P.2)(9YF7H4&P(XAJ[ M;TZ^V6:N*1E1'M*(V*(P)._0CN,OB3'F&5CI28VT1N$620!5 M(42%J@M[;=LIRR)Y%&_>$YAE)E^JLIF=BIC50.3$GB%4=R:[>.8D¥QQ/` M9OLK¥IORT7RTND:YYYTJ.>Q¥U¥K:UO7YK+I3C9$F63C&`W=F7X3T;-+JNTA+ MD[S2=G@*#E&ICC6@ M5_C;F0>IK0^';-QI>PYC"L#Q-:4((W'7*,6G,#R^QV&'VEQS'KIE7Y>Z0=.%]YBO(EM=9O@Z6" MOR5K>VG^%X%3[*@>(!/^53-I#&'6]H]I83N?_]3Y6QIRMK<&+_>H!@!LHI3D#UH!XYA3@1SOX,3P M]Z/@L;F^GNEMH!RAC-*N`K!:592Q'(^"K4^V''CF>5M9KO32'1BT_'^_,B;C M;B^U6H6IM7Y'+)"00$[BM;>WM0B1*+%#¥45>:B3H0#N2:^.^1L]0V!UU9R"` M&V)4I1OAW>H]ST^GKANU'N4K:U]26W-H?K.H,P!;B2>;TJ:[].Y`P$=Q3L7L M/Y6^2K7SGYKL=,UO6H=,C1Y9;I@`X6%*5DXD@44?:Y,/X9CRE7,VD5WOL;6? MS*_(3¥H_*6I>6ORN¥NQ^>?-&N03V&O¥`YKW+!K81LM'MK&XX!V`Z,L8A7_+? M(QR2_A9&+¥^P^GK1K)!`MJ[R0(:@!7.Z¥NM1VK^.9F..27,AQI&71+;V2WBN MD0.85AB=VY"KN2-@M-LO¥*DQED[PD/`"W26&)C:EWD]4G=?B^+D#N37VRHX& M)XDRTKR]K.O0ZC)I>G7%_INETN=8U"-:6]LC#X1/,U$4M^S5A7MA&G'DH,F. M>E.ZR%K1XCZCJL;$¥A0[5%-MNGCVP^&.A2,DNY#M&¥DEQ-FU#EXPF/,%EX1[VJMPDF`I]7IZGB">A/ZJ_KRC*)CDSX)HBV@:&- M_4)<,QEXJ0`4/ZS[Y"''^`P¥*1Y[MPVKAK=U"B9W,JQFHJ#L!_E9= MBI.&7XV!DN5<%0!0C>AZTZ>&1J9Y_>DY;Z-HTRW,+A6<0DM)(V]"VW0[XF`Z M@L!DOHB_3>=)`C.¥G(R/Q7<*?"E3_#+!PCO9U;3¥I8H-1C5JQ@QQ.BDERIHP M]R.XP&44"!/1'Z>CJWJRJ0LE`D?1:@]O¥QE$S3,8R>CZ`_(GRS;:UYSMO,/F M#2KBZ¥H:%*QNKR&T-Y!'(!NMQ'&LC*O?DT94=:C-5JO5L0[/28MWT1^9?G*3 MR!H¥OEBPNSYEL?.,,MQY>N6D67]&P5/Q6SJ&,ZM_*6/'M3IFJCH(R/*G/S9^ M`/F#3F=;1YS&+DW$4C3W+BID8M0LGA3NI^G-SI=#P¥@¥SJ]3*?1.%D95XDEN M?#H-JK3IMN3FT(G`5LZZB>CT/R0PME¥R:_.E8M&LVBA"D+ZIE[,Q&U/89@G+ M,G<,=ST8_8H+7UKLT:.,CK;=&)9&UVUUQ7TU1BH53 MT4L>PIT'X8)3AT!:PRJR"TFB/J02!FE4D¥0M#4'OOMC$@¥PQ,(I:¥[M& M2¥9!:1PRD¥C6NWT'VS(¥,]`F.%*AQ`&PRT2KN1'#(*G!?^6:;^[KT_P"2F'Q/]431?4;5KM@5D!XD*P7JK# M9J'QS(LQ"1C"9K9RM.HOIJ1@¥S%&!Q*ON4+*``PKM3?*O%!Z%LX0&6Z)I*ZQ M/#IVGQ<;:%RT<@449@:EY32K$=*]WJDDP/2IXIWY]LH&7'+JY$,(>-?G;^6@_*[SA> M^5]+O_KD%JJQZC=`1K(TP/¥`>4B+")2#LI9O^7G3XYV)].(!A)#3]VTE:AB"*'YY081CT4P! M2QI&2.$HH'-R6CK4,Z"@^BG;)PE%D<=)2¥BS*I:3FSJZMR'Q`UW`J.W;+>.) M1=*)D(A8;EF%(U_9H/>G7Q&#@!_M4R"G'+*DC$`21_8%6(KWX^U3X96<<6-! MN(O$&:H,DP87"2"HI^R/H¥<$8¥/(+,()92¥HE534%@U*U![U]LO¥:7¥W[&GX M.$LEO%(G(%HZ¥E(W"'=:=_GDHF/5NX)*,:^LZM$QBCX¥N)Z$U!8J?'*Y98=S M#<+WF$9]1N,D98BW*@"0*W6OCD0(GHRXPNC@]/AR`(52[=*_S"H(R0PQ8"81 MT!$D,G[OXO[Q*@60Z6V1 MD>A:90Q6*'XHY$9Y$2@K^&X7VZ96,I[BB4Y(A&2L42?%&Z`/6GQ,.X(&WMXX MG(6(D40S_#'Q8TC;FA#5+GM7^&"S_.;5!V+,9)%Y*CA>&_/DW4T¥!W[Y"0)Z MJ,8+<;4CDHS,`]&DW8_#O113H/#!&1'-C+&`K1,SCUPX>*16"RK4$¥=OO'AF M1XX[BU¥'FBBH:(+SXCB3R84)[4/2A&'Q0=Z;02%:"TJ+2+FRU.YFEU3RO?">UN9'[3_I M"-951"O1!:/7_?@S19/6=I_:[..25?2^;?S%NX-<¥_>8M2TI%M]+D>-;:",` M)&P%).(%*UZ=!]&9.FA('ZK^+K=3D)*0VDCJ)XW4.D:`1¥30@¥J¥O"HS;XS( M.N,;ZIC:7=&ANBRQI,)1)'(*B,C8%Q38GL1E.;42"3&GI>IL^D_E/IMJD?I: MIK=^#Z@0%S!RJ&;Q6GV3OF'XI)<,HEI_05R/WA',&12*DJ.JFG3PRTXPB<`'6]T98DG'`-(/B`H!R4]/ M8TWQC!I%=ZB)"K1NZET+'@0:AUZGZ1F5&Z9;CD4K!+1F5>+1.1'0I$R.91E9O¥`EHC_`+NO M3MX=/QZY9QR[F?C!_];YR)IT<*_6-1NPR*0[1%QQ5U%"OA0GPRB1ON3*-^5O*46H^9HM%FO( M[V]9I&>P5R$$HW^!MC11O0;URC/EE$?J;!+BZOT>_*_S)_SCG^1WDFY¥QZ[8 M67G+ST+B+ZEHUG#;7EQ$¥3`@&)@L%FY;JTA$U-US42U'$>19B`ZEYI^YB=8XUA"L(2``` M3L1MX9="8CRIJ¥**!FF]%7=B2+EN:J:$A1VZ;#ODS9¥V^)$>J42S2R!?3:C¥ M6D0B@9`.IITWRB42TRD3U4)9HCZI!"U7@U=C%45)¥03XY*.*)7U!"1.>)`ZDTZ^V,9'H6R)4$IZ7( MO))&REAQKR]0FFVWV5Z4RP$][$R!1/I¥&A<$R$LZ(E"I8E=F[[`^.7QRD+'W MI/"3=.TZN'"1%UD85#LAXL.^WL`"]Z[U!Z?1F7`$-?A@]49"J>B¥TC@.ZCT@#LM/M+QH= M_IV]¥NJ_X;;8CA0QE'">>X8J(`$AD0?$O,T`IOU]A¥¥IGDKF"CQ)]0CI&^K. M>;J:JH>12#Q/N14$#O3*[C+H68F#S"F%!E93Q5@"2W2@ZBOB3D)3B.08D@]Z MV4"CT;C6A5AOUV->^1]9Y4R$1YK(%92$9Z1R,.)!-`K=33WP`DLC13`>G$¥" MH2ICE;T10_$5'5AW^>9$;'>PH]"N+-]7#LY]4&E-Z,7;:E?#O7)RS"JX6`$G M2+PMI`@J9=H8>ID(_:)¥`2-/¥OV'Y4>2M?N+CS)>7EQI M[M;KH4^M7$9GA4^H/T?9/);5/?G#0]JYRLH0X]@[F)B!U?#R7RZE!<79+&>2 M_N7:9592:-LKJP'`CH1L:YU&@T@(O¥=70:PP)ZH1)&C$S2,>$Q6((VX9B:TH M/#L/MF/.)/0M>4RCR>J_F/ M?PSZYY:TRQN([BPT3389FG@*J1]E6I]-,SX4!RF5&7<&)F M3T+;W:QJE9`K2.#¥0^)*;`$`4-1].9$(L>&^80_UJ82)#&0)99:,G4(K=Z]_ MEE4[Z-@Q0¥U.:YC]&>"-PLD*5E/'O6A*COD`".B2`$@FYM=6¥4)$/K0%X:_% M1(]W`:G?LN1.20Y!8XB4U]>R_DC_`+CU_L'[/CT^U[8?$/<6SP#^`__7^?$_ MEN)-42#6HI[26>`K;P2@@15:H94-"P/0UJ/;*I<1[_DSE$#JGC/:V%D¥J1/; MQ1.OUIHSZCLB[$`-^SWVR$8@][$0@4CM;XVMXEU92S6¥JF0B96/JJS?98/4F MG'ME<¥=<@I$(¥@JMKCK(L3.S1$AC<5^W(#OO_,>^&&(=0`P)M)VN[QIU$TS, M)9*JK*%5B/LAAV/;">`=S`$=ZH+DO!<*Q,J#:9B5Y,R`E?3Z!74]Q4$BF2X;[V),?-5$T+1VZF8EEF<7$C?[L7I1E/ M3Y@;XG&1T4QB>]!RRF)W4*¥33,WU0]>:IN:#J!E9BU^&/-<@%S`H+D5J:[U4 M>`VZ9.*1*(4/K@6C,S$MM$5H`RKU8,H`.1D.¥)XX^34LC3NJ0RM(WU->A[C#'?D/M9`C¥!3+1P1¥PQ5@O+A0A9'/534T^9/7(^$>YA+@'0JB MR-PDY*2PX-$G0U>G2NQI[G+(PD.GVM8E'S;^"WCB]2=JB0B96V8%N@^1]^F, MJ¥OBD3!71SI,A5D=&W]/B:T`ZT¥3D!`]/L1*`/4*Z2-+=+"'+JJD/2B[`;D" MFQR8'?98@UUAKUKW]¥99Z[F49WR#TW¥O?R>_, MS¥U-0M+3R7Y;GO%O&=%O9OW5L&05)$C;L0.R@YBG/CO6X+)-+TFXDA¥S:IJ,¥OUFSNY.T-E'$1.6'C=0@= MLT/@R)]4@';C-(C9¥9>8].O/+?FKS=HFL!GU&+5+B21D'&&2*1JHZ(O]W4=0 M237]INN;W1B0&T@Z'5QR$[@)0%E6WN'A59(XW7F78'TD8BIJY^/VI]V9_B2' M1Q<8DF>L?HX>8M06)&M;6$6CQ6R¥TC](J"7!%#5VZAJ;>V53XI=X;Y`'FR:Y MUV74/*+17UG8+KEEJ)19K*RLK1X;.7[/)K2*-):@?:<%A[Y`8LD6N.*,N0/S M>@Z*WH:)Y>CT;]!26E_#>#7)M5&G1WDL_&BK:R7M+N0CMZ!X@](.¥N,9R[UD;<7 MX3$^FJDB<4J2>_T^!R8H]#¥T7(I/+,¥CLCN¥;++L12C`#:A[,.XZ$8F,^@9P M/O¥`@G7U^S_WS_NFOV6^U_-UZX>'+_-#D;^;_]#R[^='_*?ZE_QAB_XEDBY. M9Y+>?W:?[/#B<-(I/MO_`,8I?^(Y'-T9H;_CP3YV^8D.C&2M>?WY_P"8A?UC M,G'R:NB`[7'_`!E/ZL6S&EES_O8__&-?^(X"D+[S_>'R]_QANO¥`B6$(4[KH MGT9(,$)3:$1=?WC_¥`,,WZAF'D;BW/_<1?+*HNMSI) M-]K_`(+_`(CF;/DTXN:IIW]XW_,')_#,1V$5^I?[SG_C(N,6R:NO^]%K_P`8 M%_AF9C:2HZA_?)_QE_AF'D:Y.M?[Z'_5;]>96F<7(C8/M2?¥8W_7CD;L2U/M MR_ZO_&N4RG_1Q'E>5OQ/WQ_P"<&_¥`E%T_YAY/^)KF MAESM^K¥>3NX/EGS[_`,I9=?¥`&6;_`(CF][)Y?CS=3K?Q]C&7_P".38?¥ M9C_R<&=/-H@R#7O^4G¥P_P"K#_R9&5Q:HHU-8Z02S`^/#P[.CHZ-"H[FM:?=3TM-3HW-C0[ M/#H]/T!'-S$X-SL¥-3,Z````%11!9&]B92!0:&]T;W-H;W"J(#,N,```&I(: MD@``````2`!P`!$"_PP`__X```!(````2`````````!(`'````````$`"@`` M````2`!P@@```!A(`````0````````````````````$````````````````` M`$``````````````````````0```````2`!P```#``````````!6:G!E9P`` M``````````$``6%P<&P````````#``!P`$@`2````$@`````%ZX``0Q0:&]T M;R`M($I014<``````````````````````````!C____8_^``$$I&248``0$! M`$@`2```__X`#$%P<&QE36%R:PW_VP"$``,"`@("`@,"`@(#`P,#!`8$!`0$ M!`<%!@4&"0@)"0@("`@)"@T+"0H-"@@(#!`,#0X.#P¥/"0L0$1`.$0T.#PX! M`P,#!`,$!P0$!PX*"`H.#@X.#@X.#@X.#@X.#@X.#@X.#@X.#@X.#@X.#@X. M#@X.#@X.#@X.#@X.#@X.#@X.#O_$`:(```$%`0$!`0$!```````````!`@,$ M!08'"`D*"P$``P$!`0$!`0$!`0````````$"`P0%!@<("0H+$``"`0,#`@0# M!04$!````7T!`@,`!!$%$B$Q008346$'(G$4,H&1H0@C0K'!%5+1¥"0S8G*" M"0H6%Q@9&B4F)R@I*C0U-C+CY.7FY^CIZO'R¥_3U]O?X^?H1``(!`@0$`P0' M!00$``$"=P`!`@,1!`4A,08205$'87$3(C*!"!1"D:&QP0DC,U+P%6)RT0H6 M)#3A)?$7&!D:)B,G_ M`/579Z'HGB^VTAO%-E)<6%I<6@<326PF0Q[RHCW*6 M)"H6''RKENUYF:LWU-6QGF¥03:?H^DZ,=3U*[>VMX9I+Z[OYYY#+'!!]FVQJ MOEEI!A29"K#Y)5"!*N:_HUSI-E'<(YU"U2ZFAFOK2[M;V%KH2-(UO$8YGER4 M='"R'>59V7¥.I*;#55LP/M"Q2"5)(;56V_Z01'+(8I/+.$#+0U&ZTWQIJU[XDEL=$T& MUU6**>YML^1:BX:,@SPVJJ6CM589C20M'"D?E¥¥&B"L[M)^7_#"DV^IH^,=$ MNO"=KH(_T_4X?%6B+J5A=7]N+#[7$)9@9520B5K53%-Y;O'&60^8JJCQJL'A M[X9>/_'D-M):3021W=¥EK'8G4;>PAEOO,6*V@W7#J)II9I#'$JEG=HIV`58F M(Z&DURQ2^XW33¥J-A%.348[_?^*&_<7],]L¥0S>%O!=GHEW¥.5N-3T%-4-K?6ID1+ MB^N#%*KS3C¥-;GX>BZN])-H[Q M:I?SZ3'`D/F+'#+`JC]Y/(¥(VX¥R5H¥!D521V24%%*;L_0Q]K[ZVOV_S)[SX M/_&BZ¥,:EIGCB[T3P-H;-!?WVDV<]NNJ75O+3]XO$ZQXL¥7:UI^F:!J/B_4]5MM%L(M*L]'¥--(EK';1((Q&]U,,*I"@OM M&UMISRS$<=2K&23B[)G1AX-MR?¥`P#X[NY[Z*Z62XLH(FE59%56(XQU&<_W3 MGW/;I7K?PVM;#6G¥(:ZOB>[¥+7NGQ/H$%_!:"X9]529FMD,DTD-LBO:7:!DE ME19!#(@ZE214MV]O/]#-OF>J_K[CL[K7_%=C<6.DVJZ+JFKZS]ICTJWT"YU. MSL]7BN4*37NF:=;*MM97,OG75I-Y?DO!_I`EM(9!*:J^);W0-)¥+IX9@¥4Z) MK"WLJK=OIHBMK87¥43)BWM;9¥S0QFXD3^T)0INF2#8AMXV9]/?I:-HQDFD[_ M`.1SMO'HVL)CP](O]LZV(]/FTU].:9F+22&06K+O:.V2/[*D9)21G$Y!`4$] M+-I_B+5KK_A*?B=-K¥FD64¥U6ZN++[/=&?4]%T_4)(Y M1JD]Z[HDTI¥E?+NB'>53YR)(,(C83>^#GQP¥*?"J_P!.OKRX¥97,NE:=ID3+ MIUKIMD$2"XGO=2LY%NV(^S75S=")Y83%*JP_)Y@=U=U)/1IZ=CIIN4HZ/7^O M0¥VL+R]GO;:VTW2(8[)I6CM]-T^SCOELU_>>7%`UPQ!8//)AV)¥KS-TA&U`. MPM;V"QA@-¥RO?W-]'`)+IO[:O2PC?@*,PK(7=2@C`*E¥`J,YSH3E-WO9/^NO M^0ZDE:_8^O¥`]F;P%;:[XSF¥7ZGI%^FGVT8ETRWU^=9-4>)2")[B*,A8PQ9` M![(%SN)/O7Q>¥&Z!JN@ZMXRGTR/^V+&S^TI?26KSM"RX"2,@(8O&.5`RP8=! MSG2=O^7;T7]:W.=.SYGN_.Y¥6^+/!VH:_ZC*!;6^K1LRO&C*[ M,EC;¥[3*(EV="!(!]VO*KW1M8UJXGTJ>/4;YEF,=U`;=])T^UF!VN)1M#9!' M*D!B1C!/)XJ]2,%SU']RNCU,)3GB*BI0UEV1¥AZHLUQI6F7ZIL4>;;C@Y+`[ MF&3UP2"<=-P_#U7P5JDOACX9-!!8-`TVA)XJM-3O-*&H6D&HV^JW*E5#JR)- M);H(HY2&567YD0-Y¥/7&25^5:?E^IQM<[M$XW1/&'B2PTS5O"L'C'4='T76' M9[Z.WM5NS.[%`X8DK(HE5$¥W8X$WE()%?`VP0:,-8O%LM*¥3S71D1V7=ITT, MCJ%XPI#*HSM&=Y/S#&>!5QL[¥D;?UOZ?,QY==3J]`O=,TK19(-:¥.Z;J=W(E MU8:;<1ZO/9W%G.Z1C[3,J,8IHXQ*_DH0$9@YD,B1LM;TVC:-INIP6D-QI.JQ M+`AU?[%XEN=VH2(OF2@W#0QM&CL#L4¥+M`+/(T9)&FUTL_EK_7J8/1_U_P`$ MR[^33]6NA<:=HMGHL>TV(6ROKB2WA_="(;!*[+&Y5L.Y,IRS$`;2*+VRMK0R MR:M)!'/M$<0BN$E7SEDVN0R$F1,"3:5)SP>0PJ6TDDE^7X=?Q-*:36IN:3!= M2Z9:9>,Z>_EBXM[AY+6W90^YW.WYP1-M:1$XR.0K.M>B^`;_`%.T"&T6X%I& MK1N+>-])MO*(5<;E_>X)VXDR&+`8.<9Y$E'F:U?]?UN=32ZGT[¥%/B"WA5_M M.ER6$PDCDB¥FZA>W@C(D.UF+`^9(@54R3@DN0JC:!K>*?C'J[Z=;1:EXGC.G MZ9"D8MM.>1X@J':`]PR@MG;@[0TC=B"01U.H^6[>GG8PC0CS>]K?N>87G[1W MQ,U^Q3P3X`N)]#M4MH[>YNI8XXY%A0;!),T($LC$!3B21C(Q(*X)`YW6Y_%4 MFC?8_#FI%-25E9+N[<[VD+JTDS%$(¥P¥[0!A/E`X45¥MQ!F24Z=&;:5]U&_X MH^[X2RF?U>MBJ4;3::C>_P#PQ¥.P0+/X>N;4!¥V M=IOI]Y¥3)7LC)6U%N#%+=>;Y8^¥"=KX)4,1@%V"*T-*N8+'4+.^E4 MG[-.DH4QLP94(.¥[2"S+PX`(W$`>U7HU;4SE_+<[G0$U:#Q)8I*K`$$GYB>5)/H%A¥.-(OM1L/`(L_$.G:C':-<: MDLL&FVQ68QB8JMQ)<1Q111JXQ-*R&-$<[3(P5$G?6_RL9Q6O^1W`D¥47:/XT M¥7Z;XEN?"FERMI>@W6G>']-T^-G:4[(;,E9(H4D$!:66W2X(92"S,YD?RN[T MO2],NKC[!`UH6*7$65420Q3)E;>20J&+(@92W¥1+'H:7]L-0T?2W MN,ZE^YNXS>+ M$]:GU>YF:VNQ>Z?I[NC7_P!H,HD<_P"J2(JOEA"Y"CY]^T,0%^4FQXM¥=KX3 MMIHKZY¥)6-G+'Y6-4^>Z"L#YGEVY!"MM<@,JEOFSN4Y->+B,SA',*=&;;CO: MU[]ME>Q[V'RJ2X/$5(UZT+RWT;_+J>7A,_S+!T?8X>LXQ[;G%Z`M_< M*;.UC@BCN8S`SW08@`@CY47YMW4CKG.,9J&&TO6B5)9($.2I0)N.<8Y/KG]: MZWR_">6DUNS1MM'O+E28(Y;CRXRTFR,9C35E")&&?<51RND6HVO¥`B39]6;NB MV.M:->:3KUUJEBUQ;G[1$E];_:E@57S#*¥_P!GZBES:MO¥F**[8C$:1[QC8F=¥Q!9I*ER2T2)C M3ENSHM/¥,V^I:?/K[^-_#RVVB`V&G:5+J5W#?7A¥D3O%96BH¥EM`6>0M(WE0 MJSD;AN-8GBC0[?38M*U.:QL;)M?,D-E#;ZA$T;08C,$A221GC0DR[IYFVG(R M5*L#C6K>IK2BY:):?@6=>TKPWX4LM)BO-;TW6%D0QWR:;JUMYGV9F+20 ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.25.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Sat, 18 Jan 92 01:20:08 EST Received: from joyce.cs.su.oz.au by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Sat, 18 Jan 92 01:20:04 EST Message-Id: <9201180620.AA17087@thumper.bellcore.com> Date: 18 Jan 1992 17:19 (Saturday) From: bob@cs.su.oz.au (Bob Kummerfeld) To: nsb@thumper.bellcore.com Subject: another Hebrew test Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="partsep28042" --partsep28042 Content-type: text/plain The next part of the message is the last few verses of Bereshit. Bob --partsep28042 Content-type: text/plain; charset=iso-8859-8 Content-Transfer-Encoding: base64 4fjg5SDt6fD5IPLh+SDl6ennIOnw+SDh9/LpIOnu6SDp5OnlIOTw+SDk+PnyIPLh+SDt6fj2 7iD1+ODhIOH38ukg6efp5SAyOCA0NyAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOuTw+SD64O7lIO3p8gog6unw 6fLhIO/nIOn64PbuIODwIO3gIOXsIPju4OnlIPPx5ensIOXw4ewg4Pj36eUg+uXu7CDs4Pj5 6SDp7ukg5eH49+nlIDI5IDQ3IDEKICAgICAgICAgICAgICAgICAgOu3p+Pbu4SDp8Pjh9/og 4PAg7OAg+u7g5SDj8ecg6ePu8iD66fny5SDp6/jpIPrn+iDq4+kg4PAg7en5CiAgIDrq+OHj 6yDk+fLgIOnr8OAg+O7g6eUg7fr44ffhIOnw+vjh9+Ug7en49u7uIOnw+uD58OUg6frh4CDt 8iDp+uHr+eUgMzAgNDcgMQogICAgICAgICAgICAgICAgICAgUCA65Oju5CD54Pgg7PIg7OD4 +ekg5ef6+enlIOXsIPLh+enlIOnsIOTy4fnkIPju4OnlIDMxIDQ3IDEK --partsep28042-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.26.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Sun, 7 Jun 92 16:17:25 EDT Received: from spool.cs.wisc.edu by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Sun, 7 Jun 92 16:17:09 EDT Received: from gorgon.UUCP by spool.cs.wisc.edu; Sun, 7 Jun 92 15:16:14 -0500 Received: by gorgon.uucp (/¥=-/¥ Smail3.1.18.1 #18.1) id ; Sun, 7 Jun 92 14:02 CDT Message-Id: Date: Sun, 7 Jun 92 14:02 CDT From: dag%gorgon.UUCP@cs.wisc.edu (Daniel A. Glasser) To: nsb@thumper.bellcore.com Subject: makeitso.gif Cc: Mime-Version: 1.0 Content-Type: image/gif Content-Transfer-Encoding: base64 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 ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.27.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Mon, 8 Jun 92 14:45:42 EDT Received: from etlpost.etl.go.jp by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Mon, 8 Jun 92 14:45:35 EDT Received: from etlpom.etl.go.jp by etlpost.etl.go.jp (5.67+1.6W/2.7W) id AA20284; Tue, 9 Jun 92 03:45:40 JST Received: by etlpom.etl.go.jp (4.1/6.4J.6-ETLpom.MASTER) id AA02052; Tue, 9 Jun 92 03:45:27 JST Received: by etlibs.etl.go.jp (4.1/6.4J.6-ETL.SLAVE) id AA11392; Tue, 9 Jun 92 03:45:24 JST Date: Tue, 9 Jun 92 03:45:24 JST Return-Path: To: nsb@thumper.bellcore.com Cc: ysato@etl.go.jp (Yutaka Sato =?ISO-2022-JP?B?GyRAOjRGI0stGyhK?= ) Subject: Re: How to see Japanese characters (Re: malformed message) From: ysato@etl.go.jp (Yutaka Sato =?ISO-2022-JP?B?GyRAOjRGI0stGyhK?=) Organization: Electrotechnical Laboratory, Tsukuba Science City Message-Id: Content-Type: multipart/mixed; boundary="==" References: MIME-Version: 1.0 --== In message on 06/09/92(01:31:10) you Nathaniel Borenstein wrote: |This is using vanilla metamail, with MM_CHARSET set to iso-2022-jp. Any |idea what's wrong? I'd love to actually see your name properly... -- |Nathaniel ISO-2022-JP does not correspond to any single character set in X, but is a sum of US-ASCII and Japanese JIS. So you must specify two font sets for kterm, like this; kterm -fn iso8859/1-font-name -fk kanji-font-name I our site, following kanji-font is available: % xlsfonts | grep jis -jis-fixed-medium-r-normal--0-0-75-75-c-0-jisx0208.1983-0 -jis-fixed-medium-r-normal--16-110-100-100-c-160-jisx0208.1983-0 -jis-fixed-medium-r-normal--16-150-75-75-c-160-jisx0208.1983-0 -jis-fixed-medium-r-normal--24-170-100-100-c-240-jisx0208.1983-0 -jis-fixed-medium-r-normal--24-230-75-75-c-240-jisx0208.1983-0 -misc-fixed-medium-r-normal--0-0-75-75-c-0-jisx0201.1976-0 -misc-fixed-medium-r-normal--0-0-75-75-c-0-jisx0208.1983-0 -misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-0 -misc-fixed-medium-r-normal--14-130-75-75-c-70-jisx0201.1976-0 -sony-fixed-medium-r-normal--0-0-100-100-c-0-jisx0201.1976-0 -sony-fixed-medium-r-normal--16-120-100-100-c-80-jisx0201.1976-0 -sony-fixed-medium-r-normal--16-150-75-75-c-80-jisx0201.1976-0 -sony-fixed-medium-r-normal--24-170-100-100-c-120-jisx0201.1976-0 -sony-fixed-medium-r-normal--24-230-75-75-c-120-jisx0201.1976-0 In our site, we can use kterm like this: kterm -fk -misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-0 Of cource, kanji font names are usually aliased to shorter names. Unfortunately, I don't know which fonts are public and available for you. I enclosed the picture shows how README.jp looks like using kterm. -- Yutaka Sato Information Base Section ELECTROTECHNICAL LABORATORY 1-1-4 Umezono, Tsukuba, Ibaraki, 305 Japan --== Content-type: image/gif Content-transfer-encoding: base64 Content-description: README.jp shown in kterm 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 W2cnfaoGUAAAOw== --==-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.28.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Mon, 8 Jun 92 15:59:26 EDT Received: from vnet.ibm.com by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Mon, 8 Jun 92 15:58:59 EDT Received: from RCHLAND by vnet.ibm.com (IBM VM SMTP V2R2) with BSMTP id 2847; Mon, 08 Jun 92 15:58:30 EDT Reply-To: "Bob Oesterlin" Received: by po1.rchland.ibm.com (5.51/4.7) id for nsb@thumper.bellcore.com; Mon, 8 Jun 92 14:51:36 CDT Received: via switchmail; Mon, 8 Jun 1992 14:51:35 -0500 (CDT) Received: from terminator.rchland.ibm.com via qmail ID ; Mon, 8 Jun 1992 14:51:08 -0500 (CDT) Received: from terminator.rchland.ibm.com via qmail ID ; Mon, 8 Jun 1992 14:51:03 -0500 (CDT) Received: from Messages.8.5.N.CUILIB.3.45.SNAP.NOT.LINKED.terminator.rchland.ibm.com.rs.aix32 via MS.5.6.terminator.rchland.ibm.com.rs_aix32; Mon, 8 Jun 1992 14:51:02 -0500 (CDT) Message-Id: Date: Mon, 8 Jun 1992 14:51:02 -0500 (CDT) From: Bob Oesterlin X-Andrew-Message-Size: 388+1 Content-Type: X-BE2; 12 If-Type-Unsupported: send To: nsb@thumper.bellcore.com Subject: /usr/sbin/sfplay MIME-Version: 1.0 ¥begindata{text,538724776} ¥textdsversion{12} ¥template{messages} I notice this in the new showaudio... what system type does it run on? I'm looking for something that runs a little better on the RS/6000 than my local hack.... Here is some audio: ¥begindata{mailobj,539461880} Content-type: audio/basic Content-Description: Bundle of Kicks Content-Transfer-Encoding: base64 LnNuZAAAABgAATJAAAAAAQAAH0AAAAAB////////fXx8fX18fH18fX18fH19fH19fX19 fXZvcHR2c3R5eXl2cXZ5cHB2dHN5eXN6bFtXV1RWW1ZZc3RdXmhfXltQW/1eUeZRN21p N01ULTFMMC0+PjtATe1gPj9TTTg0OT1FPDQ/eUo/X0g7SU1ARVNNT3BJSFs+M0lcPUVL P/1aMEXGPDbRSDZdQjZxXjNR2T5DTUBFPDZLZT9F2d7cZTdK2T40QkNG0W9I4/xLTT43 Pj80PGxlWWVmbtt2SG/G5Uzf0E9ieklXeUM9dlc7Vt5QV97KVjFC90M7Pj9zv1E/ztlI U006QkU4SlxKc9faw8XGxuj90VFFTj5Ibz1IvvFNvszlwzMuvuAuer7uymVJvk8s0Mkq M0UxTVAmQ6tbUaqwu63aX8Y0K0k0K0BCQ767RturudqxsL6/0XraPis0NyQjQ+gvKuK2 3s+ura6/6LxdKj/dNzM5NrzMHjOqQjGttrajs62g2zu2PiE3KBotPy1Fwr6usL+wsGn0 s8k+fck2ICvPQCdUscrQtKinxs+s4CczOSkqJDqguTCnoz/6aDRfMyy0xSpIs+hmt8/Z uNTPt3Nsu143QDEjJzk3QruorNq/qMM468ZfOCg20TEzq69LvKquSCBaqykkt8VA3sW0 vTb9rV40+U0+u8wxSMVZX8XGvbO2r6/PVvw3IR8mLy8x4LfIvbe+r6razrkpH0w8JDy2 pKSxqKDARs88IBwdKi0qVK2vrKS4w66tsTgjRjsfMNY2P6+ppKGnoas0TdMbGS0mJzk7 Tci/tpuVUDufbhokLyovPLOgqaeapObCzSopJCAnJ0XsLTippN7Koa0+063rLT3PPSc6 ts9Ivq3NQ9zTPE7IPDjLTR1DnzEqmp9Fram00yRAtBocqkgktrG9uWK+Sym2pCEZr7sd QqZ8N76eoVu8ntwhWc4hHTziKi+7TUidwCagnCk7p0snML6wOVagrkbAp7cnNL0tIzw0 PKneJsU6TZdGI5ezIJ+xKMgkK78ZPp0pRZ3lSUpLpDMdp0gdoLkdoaYsoaTepjcsqicd wC8dOOndPK+aOj+YSh2fpzleJrGdGy6bJiOov8zGV6RxGtTMMSggs60eTZdeQJvCxpwx LKohG74+MbFKz7EqPp22GDuhKhq7oDE0mq4o37GnPh2qoR5UoSwpMybIwCe7o8VPzp6q J76bKjivIci2FcWdHfyeMT47H622GFCnKyatmr47nZwvv7Yf174muS8noSwcqjMdoa0o vq3eQkmu1j6tQk2oKSue6y2hbi2mSBvLNx6vuS+uuzanpj22m0ohrb8cMahGQqhTKl0v V9cd655F46gtKrfGL/SszVO0yki51zaxriQ4ux4x2x1Wpi2wnC87qXnPuTFUrUgqrZ5N PaStKjvgJDHvN9dALqnJK7p8OKapPki2ujRItF5Twj7tvSorrs0stMYtvF4hz04gt6NM z7pNrrwt1Kc9INOuKyqwuFawxT/TPkO+LTi2SUauPy3GtHdMvrBTY79Tz8A9vKdFMbFN Lcs+M7PXNKq/J0W+UWM/McXJL0amrjbJo88v91Yw9HZbvD/mrz88yDdDtFkwTchmO2XD TuvIQs7MLkqtV0Oq1km0RjPAMSyxvDl0bT+/czS+tjsxvrgxQKzD/7zNS2NF788/3L1K 6MwwS7jLSOC+yENeb0PRW0y0vTxbvjQ/w1RXu0XXsDQ4vddf1E7mt1o3u65DQrDKMFpe Nk/JU9bbULdZM+lOPsDPQkbL1klZyN9p10h8yDw8wt07yetF1007xWg2t7ZT3d1axVs7 zb0/N8jAQk60zGjI4kxsTE7eSXzFaNnGQFTI11Ppytled+VczeJGyMhDSs88RtdF7b5K z7NAQ8b99N9DWcpNP8u2Y0i+zzlNUDxW2V7W2VvGZUrlSUjF7VNezdRO88XtXtxNVtY+ QM78S8XaTdNpStFiQsLFTvHoV9vvSN3FU07KxlFRwuNgz95Pet/u017WyF3zyElR09Fr bNb0TU5eVnFxTdTNTkzaS0boS1fKU1e+UT7X3m3QWWLGaUPxyl1Gd9NMRVxQVuPR38/i zc9i7fZI285RXePbXl7e4lFXVFDbaErey1vmz1f56E7rylvWvNpz5l7240tizPRLWs96 SOLN8dbX9+7jZehpWu1jVtp0RXzjbVZp41dKZWNb81Nrzt5T1s1RfOtZ2+5Q2ddKXN5m bGBLb9tXYs3Kb1/T3kJWYlHp1tnR4u3TXFlwVFPZ3F321nNdZehtXulZ7NFl893jX+z5 We9pT9/9UdHRYNvtad9oTm/oV0923mlR1N1m3Gtbbmxjb1xXa1dWeVFZ6Nb26dFzZV9b Yuj0aMvW9N/eYk1lcFnf7WXQ5Vrb2Wzgd3Ha81vm3uNba95iTuhgYM9w/dle8WlpW+hX etn/eu3xcOVv/HPdaGDO23Tm1l5R41NNa05r7/npzuBwZW9fc1Ni6+hXY/HwXlT67Xbt Td/WSeLfdF5X6WnwU1nf82VffN7vTW/Gd0rWylBmWetpRuN0z/95w9RNeuXrT0ne6VtO 3dBsTOjKVE7c3lHX3WDNTezX+fzi3+Xb19dda/DoUVnpy0hbv+VK195ZY05jUVZCbdFN ZtHZaE9at2wsVrdJPsW+xmXZs8o50cpFS0L8VDpO4ltaz9Tb2szTZU2zwiZKqzY0s8Ze xcqzxTy7wDtGXj00NDtDPk5ZXrCzSMW0VlHWu0Am17gsXrD0wLy+tNZGxVkvVEovPD87 bzs5pqszs6RFRcVKTXZQPk3JRVuxz1u0ufnbfcrGLTmwOSrAXzE7S6u7K7GpME+8RkNg w7AvN6FKJKq3LL27W7gtLqc2KapaL7ZCMFxAwEw4r9kxtsYzxrzDtDHfnysnoFAfu7E4 LUinzyytpzFDsTwmKlu8JjOgVCqmsTu5uqqeKD6cKB2nPB60uzZOwLTPQrawNFC3MCc2 PloqM6Z6LaSnMduhqfc0w60mI6x8HcOjOyyzpls2rKwrObE9JCQ2uzgopK0rrqM8a6Ss XD7KuSoqtkAkt60/SrisZi20sSM5qC8dTf1DRkCstiyxpC08n60qRqPeIcKpKi+suF88 aao+KKrrH7q7IDDWPmY+fK09PqheLq2kaTCupCstod8du6M3QMj2yC46qi0mqd8gRrn6 Lzqq8CazqjA+rKpeO6aqJ9mhKyqn5SzsSev6L7i7J8OrLjPaylsmaKoqLJ/IJq2hwtnC pr4muKofMadCLlvZuzAzp0kjsbcuQErGUR/Nsx9ToDQ2oLDAvtqk6CSouRrjqyo2Ws67 K1egLyaj1CD8cUY9JLu0H8OcLz6drbzbY6FOHai0GkupNjdwtLQt0aMqK6NKIfBOTDYm ts8fsKEq65+xxca/uD07sEgmxrk+ONetVDSotifPrTQxPkrZKy2xPyeurjvKp6zZyqPp Jqy4HUyzMEhGVq0xN55JJqa6J1B8OzQ0aDwp3r07cb6xsU2sozu9qi9Tyi7XRiDCviS+ rDPKrd7MUUzIKS2vKB2wTyTDwNGz3ayhQrydXTbCzE0tNtcwMbTiOLS0wLdRv7QsTb8j Rb0kPtYqwrQxr6ZFqqFdvrNfwjYnvi0drksfrLczrcVXqz9GrissvTAuSDNdcz6/y1qr tPSttsC3WcbKNswzI7tGJ7ddL7DgQqdpPqjOOtE4NtYrM7sqOqo+RarJ0LHOur9IusYz Vl5RQiZDzS1LuEDQrm23s0+0wEXDN0qtJy2vLzaxPtatN7akONOtaMnrL8pGJMrMKVvM SNP0ZrvWybflurTxwtk7v2sqWUYrd0wvzl9AwO39vm2+0DC7vi3bzDDx3jG3yy+zsUW7 vtesylupdje3Tzd5MzNNLjNDMFl3NtvAVr3sQLfRP7vpQ7rLTbnbabzgy8zgrbs3trc0 z9cx60Aqw00pWUw0Szs5wzs7sWBIu+jXuOjGtMi7v/S7vWLJzEDPbzvdUT7AU0y73kbb ZlDlPXw/LMrWLczFN9rRTLPNUK+5ab7I68ZNSMU5NNs/OE0+QGg7SPRiv9HzvslUzVlJ yE5pvlBbvFnp3kjgyknccM+xTUW2UELPV0ZlOk7UN0XNTWNcTMDFSbi2abq728LTWspu U104VNRFTM1MQtBFacpK18JA5tc/W00+b09ZzUXFsUrmu13010/J00LTyFP2c1fPTz/F bT/MY0PeSUjvRUr2Sc3USOPGZdvJbNDMaNFtRelmSV5ITd9r6c/PsNBKu89J7VRKXT9C 2khK42PUyGnPvXHGu/3WyEho3UVXYENZQ1nD1k/d1ubXduzeWfR8TFdQP15rTXZp/ddA 0L5GXM9PT1FKzcpN0b95Xlpe+mtDW1dL6XRP3uz94+3byHnGzXzZ8WDs/VHx7WvN6FvN 0GbgdtfbZmntXshjQOL3SFlcW9dXTczfXPTm7uNUV+bscdHv3s3eXm1c81xJY19Ma1NX +lFNc3D/61f0zXdNaHN8U1Te0N7XYmu+bVbP3+DTXt/FWVrgb2NURmbgU0/5W97bVmbg aVtKS+trUdff0c7p1sXa7d3ezdNRZs3rWVP33GVWb9/P10hd201OWVTe9lDj3GNwXnTW ZVDl2ezP+WPU4lZZU2B2SEZoTUtW/9fdc9nP3F1KTWxbSUtl1/9b0cjT1HxbzW1Fa2VT 62X3xtPgy978bE1X6Vxc42/f0WZa8fTmembNxdPKzMztUF7sWlto5cjPZunN3lxTaPNP SlRZaPdNX9tZYvxTeXRNYu9X8O5u199Red5c8HlQ9+tRV1tX8GVP8P1lY2D0dlNb9u9w W1vc2mNb6NPfY9bK1+JoT3pmRmXiedHT3snPa+liVGBWU9va/dbb5tHoW3Z6ZWVUZdrw 7d7a5lZWc2BXV2vZ12tt6fZXSU1oUE126NvK3+3L62PlaG3eXlvgZWj0c+bR6ffT4v/v V1p9XlZmbOPiXmj8XltZbvBrbOPe6WJd//FgVmLm3mNt2+t972Bj3l9XfV5f9F9s2/xt 5f3w6Ghz1t954/Dt6F9Xa3F09PfZz+Dg5vFpU1RjYl9s49blXV1oXU5KVGZWWf307d5p Zt5rYPNfY/RZX+hz7+7839twbd7o6eN66Nz6fOPj2+Bt9vFrZWjw6Pzi0drTdGbwaFZN XWXvaPnZ6Xl5XF98VF3tbu7d9+bgaF9bW19cWvze/Xfu8ePwZm19aGlmaevt/fr6+WVi d31dZXx03lRKXmtUYmhj8WZx2eXZvlk+yuBA69Bwa1xu71lb4+/p1OPgzNT27VdLaWlW Y+LT5XPT0V5e3Gtb13RNzctI7cpXSmn56c/Xys5UX3o+PtNxPs++Xt/D0NfsX1tpXj5W /DFbuEJMw/dPTFbpVF3KvMI3S7BZO7i+S+vRQj9FPld98crF383XQ07vTl7G7VfLYDxT UT5Xzc27uFdcu8w/2bg7NNFWOEBr4ElPwspTSL+sPjSw0Tm/vV7O3V7NPjFWrsgg655O Rae2RT9T7C8qxs8x27BlPls/SM5GPrnGRbOxRmXGUz844qcrHKGqIcudrk7OtkMfLmAv M8OwurneL7OnIyuvOS+7vdnWzblPRbQmG6rIJ6Od3bSoXDQsJCovOL22wK6tMTuc6xfG pyEprLdOu6enxhompyYdpKSutlOrwxow9h0rsMZwuKi9LrudJx2sNx2+vVOmnZ8zIKpD Gb2mXrecvxs+uh0d1LRG3qavMTRGqrga154nJMaqsb2mLR2pPx6rqcint9C+GhW2MBqo p1+hqDgsHUikISuZ6SSqs0OZqBW2oBU6oEi+qLiq3iodHj4qMKabp3fQPhlZqxo4nDst rqeaShmenxXumR0snUY9utmzIRikzx2knD/DvRUmmioamqoexp6hORqmnSBXm742WS8s RTu+uhsvmkw0na88RhwopiEZmrcZqZWjLSGetxmwlyg3mmMcMDstvtckrptU46fQLBsd pLEXRaEjKJWeH7GULCenoaooN6geF8U0Ka3etpTRLpzWGhwdq7EbrKEZ9pE3HZegHaie Kqe9GEwtGuk7Rpq7PJyhKsKkIRE7qSAmn9QcsZwnPJW2O52uOLY5FyY0IzvOp5fQSZpa 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 fSehyR+f0x2k1h2t0R67wCexvDS2w95g0bw2XrNAULvF9muxQ0K0NzHGOjfrQF7lykhO tDNKrSn9sDBvrc05pr0qpHMnqEIosV4qu80qv08ztDBjvS6x3z6t7km6uUVgqj5LpzNG rDM6uzM9fDg3Xcsw468ot64msLQtxao+XaA5XZ4xXqYtPa8uLbYuOMIvWdxGdlnFTEqz S163esbTwNZbtEtKuUBewjrb0z1iQElKNMk+PLRWSK3NNKrZLalWLa1RMa/AM7OxMLjF MdFZMUBuODbPYDbMyjzNytrzfbY8bK4x1LM8vrtm0b7IRsrNMd7iLWjUND6zOjSoNDmk NEOoPDapXy2o3zOw1z/Quj1GrzszrUgtsU8vw1Q5YNdGQr5NSrs/+bhDa75TTL7UPrm9 Qr66VEq6US22QiewQC2v6S+2wC27xjTA0U3TutY9rr4urbgttLw02705PrdCNrZDMbQ7 LbtNLcXGLciwL8mvP+WxyDq/tCzWrSpZqy83qj4tqkwws30+yMI8Sq83LKs4J6pOKq+8 M7qqOdGsMNG5Lc3DL1q7OD6sSjioZjGw3izeyCxGxS8+vkVLtsBdtLFguLboV0u/Oi+z PSqt2yewsyrIqzRCrzcuvDY00S1NzS/esEjwpM1CoL0wqLEqMa82HbfdIMypPU6jxUqt yELUVDY8SjssQ0styMtCrq7Cr6q/yrhlTszmLCBCZSEzqEotn6BGrJ3bT6w4KUYsJyEs OCpGvMW+np20p6j9S147LTYuL9cmHarXIKukOrCbtq2kSGC2Jhk0NyAfQ8Us5Zur2Z2g Pr24JjdtIytPRSxDpEUdtqQtNp2qv5qkv6a3JjNuFxy+IRyqyiinndevo1y+tis6tkMe MbczIcC4LrShJiadrSu8q9mhnzw9uL0hFUWwIx+98UOquE+qqEnIuyw0sC0fpLYkyMog NqdXy6OtuTYhMK+uRcahnaazcCAqtyoRGi1AaE3loJWdbFOjZRQqVho+pCw2o+1Xo7bf oLMkz8MdI8pcvpigYK6oayoXH8pLHRc0q7y8q7itmqoZJqs+OL5XuaQ7HTeuySfjma0r 1K9COjQo16Ceo7s3RaveGSlAGyZCJi2mpLOcnaS2IxtArOkqSrtXQzogJ6GdNzbbLzOw pLvRSzDRnJdGHc20T0kmGyEuO17Urp2fvrugWxgnMDGpnXotPSQkO2OspNssQ7djxpqf OUBKJE2ens5Uwz8oJiEeJlQ5M52PpDjIu9e4RR4mZa22NCMsPzaslatebioj6aSalbgj HiFgo5qpO97GHxw+JhdUsCQ+mJ1J0anA3rwzHk6hQhgz1y5UtOtjs8I6ME2olZWzKBgX T6Sgn65GKx0XL2koPrlFQqCVsEWtrTE+zRwbrKYpKNk8NK6uPM6qUS2ump+dpycVGjaw oJyrPyofFy2040hFOTfUnZ6+tKFWGyoqHc2bux0vtysrpLsks50xKqeen5vGGxUnt6Sd nWYaJzAb9Kc0J0ZoQK6bo6ymrSoUGDHFqaBuHCc9I1GfyVShripLn52epC8UF0qtqpyk KSFWKR/R1iYqyGBIoJijraZdFRU5yLimxR4dNj0+rqCkts87I0Kkm5mrIBEeu6qjnV8a NrkhHeBFIUOrQk2fm56griMRIba6vrMsGjbPL1ahn67RNyY7qJ2aoTAVFzupp6qrRS1P Khckt7tITzExqpqYnbAwGi2q1x8zxT83MCEuoJSjPysqPqacrayqJxIZeaauqKw3MToh I+yx9DsrJvmfmp2nr/ctLCwdJ7bZJCQqTZ6RnykqrbDvXEPFn6EuEhflmp52Iymtrx8h rapALCEfTp+XnaqvuUgmJzzwTyQcITnApJ+vvKGgOiu6qam2LRcVO6GtOy3en6QmFD6a ozgdFSefnUlOpp+3Ky/NsLctGxws+dfJppuhtmXRp6CuVjEkJiceHs6dtC1Nu8i4pKo0 GxosvVknUJ2Uuh45tKSjNBgeW1QrNLSco/NDw6Sdo8pCQjQjHSEwytstKVSroaGvva+3 IxUusds3TV42Ta2mp+YpSrs9ICC+na48KkOjlZ3Pxae9KBsnW9xGJx0nW7u7uK2pq7o+ Q7OzRScfJDs/M1Sknt0tUMZb7rPWLTBAvae3xqudnzkdL7On8B8XI9NdLUimnrReVu2w qsA/LCktLCsuQrjDNzq8pqavxei5vSkhxanK18hFN2WxpLE7PVBNQiQjt6G9OCw+ppqw Rtt8XjQaJr5GNzsmM7+7tqyzuKizNki8zu0uHzNmQm3DrqCtLT6zNj6qQi1FL8WoVPq3 saxUISa0rEo2Hx60yizWr6ak0Eq6yLauMCtAKDHQLzunwDnW/Oufqiq+ty9JNCe6qzrb sS8/p7vDxSo31EomJ7TAsKYnN56qra8uN8o2Gy65Q0a9QCutpzmxpzTfpywquT5tXSMq wrFDwKfJt8UrTT4xwt7oTTi5rb666OymRiHUOz2nUB07127J1F+3oNYqtsg6sbsmL7wn LqguN507Pq0vvqNDLrDCKHnjMKzuM6otM6Mxw6MhPKoxP0Y3urDAPvFTw6FULdw8RUok VKs8WqozPaveSbTMPs7INlS0U81AKt7IUEXDvOm2PyynOCqcPSamMy2evia7rU055T4x sLtANzP6tDtesVqqyCmsyjatfChKxS02qzA5njRDpzO9pEUvs88hysMjraofrqYav6Ah uq8fQ6pAH7CqKau8JsOr+XDFKU2rJy+zzji9tySssymjxSuq4y3TzDhQsS40t3leV7TT SK02KahQKafRJ83IPM7FWUXIrSo7rSpIoScppjtAp885r7MrV7Y0xt0tulEwuL4vwKYq +aQmTaA5I6qzGrGrGqygHvedJjihKlOzIdOvJL6tLaynI7uxIafDHbO4IbexIaqvJ61o MKxjO6/fL7TeKbDPLsC4KjyjQyajzCSgQyCgViSpySa45S+r2ySqvSStSiOkTDesLS+k vCGmqh2nqxeuqR5Xqis5pi/ZsS+sPjSnODqo0x+rqxqksBWfphWpoRetoBWtnRW/mhs+ mh55lxrWpxq0nx0vnCQzny44plkryLo4Y602P63rM0KxTy25wC7iozEzmys0mx00micp nUYmrL0turAmb6YqRqkj168u7bEvQp4oZaQnRbEwM6tILKveKafFNM/Jti1buzxMvr4t zakjyaAavp0ZUZsgOZ4pZacoc7A991vWbL9fObAvxr862fpuz+07sXQ2sTk6pzo7qjcx sbkjd6YkYqQuLKb5Jqe4HKeuFaajFbyfHcCmIMCoI8W0L8a4KcipKrzDNtO2Pc7ZNrE/ ObZNTrBGRrNNWbw+N6wzLqZFKqu7J7avH82hG82dGU+aHzuhKkaqK0iqM+a7P/mxPVfD QLtNRspeOrBGPas36LRA/bFWTsJFSLxGLKxmKa29Lb6zLWmrKzmhKzOcNyijQCevRSiv aSiq4CO5tim5sFO5wrCtTU+5Kjv2Jzs7Mz2zwx5UpEAzraO2Y6aaWTen9x1CyB0t1yHO biybvhqknh02m0g7p7equjfUvxorwCEs7j90rJ/UJKimIUOgXzPZo50nJqZlEimjKhun oTOxlzEjn+sayrc7tjhNlUgXqqwXK6otOdbjpJpNKqS3HS2p3yfISWCYNBymYhdIoz4o ZaaYqB/QmiEXprYYS64gs5oeLJ8qIK6+t7Aks49rFaqdGhugrB82v7upSBzIsRwrncPe ozGolB8dm7ESJ5zMGzq7r6scJp89Gq+aPrqjLaiaGh6c5hIqq7Q+HzuXnhwnm70ZPpq5 NsC+nqEYJpteETSvVL4hKpSkGTCZzhlQmro4XrucuBQxnSwVRX3NpiQskqEaMJq7HCer nMwjxZnNFUKdLRhgxlbOJOKSwBm2mi4qbq+cPSCqnCsSvaEgHFTGvjMmnpQtKJ2tKT4z vJ0nHaieLxfoqDcdKqyvJC6Zmic5mqwtYHy2qiEqnrAdPq4+LR0sp+4eSZSmIMWXqzY3 yqR0GlCgNCDa2UI7GDCdShs9m6YuTKSf7SqumzcXwp0pHMLGOUIj+aAuHaujNmivpp9D LaaeJhiwqh8eY75uLTSgqChQoLRIy9mrpCcnqakoHPy6MCEzsOkgQ5qtIc2buT/A07a0 Izaj1x5AvDgrIDyrPx3blbYjsJu6P0zIrToew6osJ83jVD0hzaA6I82esznLqapPNq2n Jxy0rh4kw1tJTTOtpykvo7Y0zreprTE8pq4cH61sHSvQwuI4zJ+9Lr6n10zb1Ke7JF+h yCAut1QrL9OxPCyrnT8sqalARvz9tzsptq4qLMtIMSsxtroqN56jLUimtz44Sr7bKECt WSpO2kZNLT6kvyp5oapDXLa3Sy7PrTghyqozKtfNTnE+zKdUMa6qUf29tro2MLSwJiC5 vicwzcDJTVeqsDlmr9FAUVPCxik2rb8rLc3ZOjn9ttY3w6G+Lr+qXjpUWs1KK9auPzHN 3j84OsC3ODSqpENDrbdKPEPU3y45uuY0T9N2XzhGrsYwXquzSFm+xkg377s+KtSzPjbR zmlvRcywSje2s010w8DWNzu7zSkxtNA0W8DAzkvxs9o43LrtU//ZvlowebhNL0bGeUVb xsNKQ7m2Oz26wkVNZnrjODjG1zRFyulPSNa22jjgrMk327bZSktrz0w2b8VORt3Kyu5L w7NWO9S52z9dyddGQs/OODbMzztD3NPZcVq/vkNGws1MW9nI7j5PwOgzPsPjQlzNwMhl 473eQmbQ+VlW7cBzOWXFWzlA3ttXV82+7k3NvE89289ZT1fzylpDzcNOSt7g9llew8VQ V7zASU7R4FZITN7rQFDPaEti7NnXVvS80UVmxdRPU+XRZkZv0Eg5bdxGTPbdzc5uzb5j TdPXVlxp4NpNS8/UP0XT9E1f7tHL/W3G0FNv1+1pXV/U3kVTzOJKTuXdcV7szd5T+sxg RmnoX19gbNTzTfbUVkxjYm1rX9TMY1PRzlZX297r7XDe0WBT4+ZZXXfr311bz9tNVtvl VlNm8W5RXeBtTWnacF/55tfXcOPN+Vfz5mlub+3ebWPZ2lRU6/ZcZffe2XRj33xOVFpW V09U7m1NY9ttT1rr4v9p4tHpa93TfXbZ3d/Z9unP5XrU2n3r5uvd/HnW3l9913BTXmJc XlZX/XBXa+9rYF1caV1OY+1ZU2/ocV5r7eb8dODbd+/R2eDa297ZfFzpelZo5fDx7fzp fVZbblZKWm1cX3D94u5aYP1XUFxfYGBbaOxeWe/oaWD54Ob9fd7ebW3d4mZ66e3p8XDr 3m7/2t7t5d/b3Xz64O9cY+j9aPfl5u39fOv5Xm3s7e705dvpYG35WlBXa2hdX3PzbF9p b15ZaG5oa2tw+XNcbXxcXnB58+90fX1mYGZoW2jo5uLf5ePlbmB9c2J26+Lf6fDtdF5j a15bbejd297Z1+h38etteejm3d3l5eVxZW9tZWVufP92cXRmWVlfW1ZbZWhmXltbV09T WltfbPTr8Xb98G1eZf3w8enb1tvg3t/o9OPb3tvb3Nnd7enoeXZxbndxZWttX2VpaGlt a2x2cGhoa2NbWlpaW1507e/r3+Lt7Ovs7/fr397l6On8bWhoZWl0bvrl6/bt+W1ta21z aWBlY1tdXFdebWlrfXxp+nxRXvn562t00crR1vFlZV5UVF9gb/Hw5dva3t3e4uz6+XNt a2JeW1dXWVtfaWx2fW1maWl3283Oyu88Ozg3ba2jp6y8SS8qKSoxNzo8Vryqo6SqvVM0 LC0xOU3Gt7Oxvt1TSlbgvrTXLyomJlCmnZ2hrEsgGhshN8LGaNC/xriqrcBQMCo43MW8 t7i+2TonJCtaq56do699LCEhLGatn6Y+JiAbKa6dnZymQB4YFRs9raGktMz0T95oLyEf ISzMo5mXn8MuJiczU8Cpo6GjsTkgHR8ww6qkqLRaOy0mJCu/oJqap08kFxQjw6Ocn7Qw Hh4u3dbKfTdWrqGfnqk/IRobKb6kn6CovDQhGxom0KOanKpAIxwdNKeqwrRRKS9MQOmk pLaxvysdHx0mWbSjnaCsrcI6LigmKUPCq52cobTrMy03PEJD/cq3q7hZMSYmLUB8vbaw vjAuJx0wsJ+dnaNWJBoSGkmsoJqmYjEuL0zKSkA/Q76mnaGmty0eHiM7rqOgo6xiJx0c IVmnnZ2maycdHSR9oKOwvi4eITe+pJ2fqsAtGRcdJ8+np6qstrmwxjoqISAobaealZmq PiEbIz67qqeqts0+JyMnM+WxrrbXPDAkPrNKTuYwLc2qsKijwzAoIB0208mst05GTUXM rbCzvk8zN/zLt6qzVD4vL9awq629QCwqMDvsu7u7vWI4LC0vJmmepLdzKRwj3qSdnJ6t OxwSFyb0o5qgrb83M19RRltAMEC7q6Odob03HxkfPrCgnaO6NyAaHi7TqqGktzksIBoj 3qOYm74mHBcdyJ2cm5y2JxkVGz6pnZ2rZj1Wxbu8SygjJjO+n5qan8gkGhkhY6adnaO6 Lx4aHCrIp6amp3wmHRkdeqGYmbsnIBobXaOenJqtLh0YHD6upKnPRk+/rKSsViofHSRX p52anb4qHRohSqyfnaGxOx8ZHSpjqJ2coWYgGhUczaCYlaoqIBwXL6aenZqnNhwXGz+o oKtrMV6xqqOoTSEdGh1app2ZnLkuHhodM7ahm5uo5iocGR06q5+bm70mHRgaW6OemJxg IR8cGjymn56dqj8hHSQ8Xk89ONCpoaCeqjofGxcdaKadmp23Lh4aHC67pJ2bn7wrHBca Pqafm5rKIx8aGlSjn5qbyCYgIR0jWaednqaqsGApHRwfICjToJqbmqF0Ix0aHC+vnZub pNcnGxgdMLCempqmPR8YFymtn5yYpjQhHRcf0aSempy7LCAfJyonO6ibnaSnqXogGhwa HUOnnZ+go74qHR0dI9mjnZudsTEeGh03rZ6bnbMuHxocRaaenZyuLR0cGiBRp52dn6O5 KRobISYk4p2anqGjwCQbHSEgLq+dnaOhqzMdHRog46Sdmp/DLR4cJE+uo52dsTcgGhw5 q6Cfn6psJh0fHyRMppyenp7FJB0dGh3WoZ+jp6e2LR0dIx8pr52enZ3DJyEeH0CxpJ+j rMM7IxsdO6ygm6BfKCEfIz2uoKGgo8IpHR8gHjOrnZqasC4fGiA8QMqjoKenqUIdGxwb K6+enp2fuSwfHRwpvqOcmp67MB8ZHlapn5ygvy4jHx8p4qefoKCmayMdHyEgNK2dm6Cr w0AxKCAdHz+qn5ud2SQjJi3Ku8yzpqS/LSEcKbShoaev2ywhHRwts5+doau+PCQeHiE3 sJ6hraSk8CYaGzG2naY9Ta+qYiAcGR7InZqhqbpPSi4fHCS6nZmZsyknNi8tXa2hobYz IB8nN1e3p5+dtiggJiowKjCsnJuerVEnKzQjGx0uu6GXlbQjITdFvqrjPbihqjEcGiTA np6rs67DLRwbLcWqpqu7zj8nISQzwKuwubisrEYgGyFCtKGqV8Wnq00nIR8hW5+aoai3 PUbFSyYk3qOdpk0gHi08Nj+6pJ+uPCckKDdCUbamp74zKjM5Oi4uxqOdpMM5JyvRYCgs yaqmoKHIKSMsOV23t3TMp6DCKCEr26qqxV3faTEgHy3Mray2xs30NCgqPrSrvM/GuLRW KCEq7LOorVdgraxrLS0pJ9mko6qzxkI/Yk4tKXGqp7BOKCc2Pz5Nw6yryDgrKzRISVS7 rbT3MC1CXk08SLako61iNC08zk4xPrytraSpUy4vO0nPuMhz0LG0OygrPbytt/RbWz4u JyxZuLG0yX39SC4rNn22tszZzL7POi0uS72xr8NOzbjQOzM3MT63qq25ymU+S+BeOjvA rbTJOywzS1RQ/8W2um86NDdFXmzWuLO+ZTg3TW1fTlPAsLHGSDs3Rc7xQ168sbaxtFYz MDpIa8zWVl3Dt+k4O0rLtr9eRkpIPjQ2TsW4ucPbeVk+Nj5jw77Zae/TzlQ9PFHDurrF VmjGzVA+RkJDyra5yv9RP0VpaUZC07a5yU84O09gV1/awsLpQzs7Q1Rt38K6wOBGQFr9 X1BUzLi3wltDQEve/Epbybu+vr5bOztDUGLX1mv8yr/pQENR2sDJdlRWUEhARvfGwMjc ZmBZRUBO5sXF5ml37fFKPUJlyL6+ymZ513ZJQk1NU8q+w9ZpTUNKX15MT9HAzXBFPENa bWzr0cjOZUZCSVnz39rKydlrTE529nBx3sa/w9dgVlnu12VW5sjGzMjZTUVIT1n83PZp 3MjMXElPadbXaVBTW1lQUG3WztpxVlBZWlNg6M/K229z6+xdTU1d283N2l1Z6+ldT1ZZ V9nGzNr8XU5NWVxRT/fN1PxTSVBv+nrw3tHT5l5TVl3/TVDFxuZx2cpCRcLOTV/FzldT d2VU9M3tUePFzt7aVEJDVvzw5ejc3tzRbkxLTdDGP+u+TWnRTkr87fz0c2nozVtIW3zP XlS//TxeyXFDY8rZaN3afFBo1mVDUObT0dfP605T7ttrcfR80dfcfT5fwElQxcpbPkzP zVtDTtdp1s1KXWb/bTxMys9gQ+O/YFvZXU/99mJ623pW2txpc9va2dBdUHTZ5WBZ71pQ vdBJw9lOfO/JzUo+W8nDfGh0WdTiV0pUw91KXuPT00ZN5ltrY05s21lb3u1IW9k+VL/8 SLm2Xlp8RUBGPkM8Te1K18LMyN/Wu7nK4sPLLSu9uDc3s6rLxbbD1E0uOF80Jy1Fa15O 07e70L+zwNnWSj/6ST63zic7p7g4y6anrq3ZPF46HyAsJyMxz8qtnKo/zav5JznZPz15 1LOktCYgvqsxJteno6vPU8jILx0n1mI0673Ip6NGIzzbMyhFv7eqq6+koDcZN7ctICs3 rZqtN8ijvSgnNks+JyZJp5uxJjqnyicu1K+nsWbApMkbGjQ0LT4+tJeXr9yxrVEjHCEt Kycns5KfLFefqr4vHnydvh06ocAkHSi+qmYnQ6OYpDdGrK03HBsnPTsmO5qRrUOvt7TF GhfUoWIp2qexWy09s6tQHTGgnUYqSLuoVhkayLErJr6bm8AqPq2jRRojsKNcKV2nr0gr Mb+vLho7o6zT6UusndQbJsL/KiY+raxQNOydnD8j1qevViQurbQoH1ur4ygq3KCjXizT o6ozHzbA7SwrYrrARjetl6Y3Q8LDtzAaOKvbLTTTscU2M8astyskw6nPMTA/v8YuKsqu ejfbp6OzPjPcrcIrLOm7yEk8wLHZRVHGt0ojLru35VM+zam7LjPQ30U7S76zzUNAuqbe K0jK28o/M8OxSC5ut+UwLD68sOAxPrSv8TtN685NN1fFw2lDvaGoUz7fU2BCIy27uz5I w8LuPzdpu8A7KVutwj9KSn28SzDir8g77qqns0ozcbr8LSk7v79aQMq3W0JIbbv0JyzF ttvlW/2xtzYx1r/XV8q0s8lCO8ipYyQ81kLU0DFwrU4tX7jPPTQ7zLHeNFmxt9s+Pmu/ 3j7NuMDPSuysrWwxNj5CNCk4xsXgYum5wl/5z8bARihbp804ekI8wnwzzKrAUcizsLhN NEr3NikrMe/CZk3Dt+39zsy0wjM02cPG1kBMvf0vOuvRvs7xubTRWVBeu8gnKvRAO3pD SLfFO2Owt+xu67+00zxRxdZdPjQ/1HA+07fDymxfs67rPj04QkYtMN/NWWvgwLbK7sC7 xdY8Pba2RU1sPUpLLjjM9ztKzL/A90l3zFk6PkvUv8xpzbz8VtPNvsVGSMi+wr/b5bvI Pj9bS0s/OUxbPjtASN7bNjvFzd/Cz9C3wFHpvMJuVFrRwNNjzrrAymtDUOJXPVRuQz42 NmLvQDs/Q153Q1q8vs3Dxr++5mPW0NnmT2i3u1tw7FR0Xj9TyuhKWdvZ60o9S11GPEhX 3cXN99TC4/fLyr7GVGPGwsnOYF7QVjc9RkJGP0BeaExNVGXO3T9Oydnf02b9yetO3sXN 7XPx0MriadrGytF3T1d5VD5KUENFPkPb1FZNV1ve02Pjvb7KytDOyvRd5uL9c09NzcZW V+9ddPZKTdvtTVD03+xeSlD3b05a48y+vsvWxc5i697dz2lMd9Pe91tKX/FGPktMTEw/ RVlOSFFo3MngT9zK5d7ib9bMfWXWz/pUUV3r8F5i18rX7V9UWWJNRVZXSU5OZsrK5eja 29DXY+bGy9bR1tHUY1FgaV9eVl3NymBcaFRZW0xR3t9gad7W3m1TWuvvWWDg0crP7Wnj elFj8+nbY1Bw3vZoW05edE1GVl9lemJ61N15+vDg13BP8NT07etp8eBdV+vfc15dYG5m U1Fu5vpsW1Zea1pW/ens3d3Nwszl8H184/Ro28vW4N7x8WxOTVtcVldWZdrtUFNUU2Bd U23Z5mn019ne9F730dl53N3Pydb0YmxmaWBt7fRzbN7XfFZQVGllSkxfY3l8X1Rp/F7u WW3C2VPRzejKX1TNSF3IQkO98TfJu0hZyc1fTsnGPDTIujkx27tTO9e520VWysZaOdGv VDTFsUIz08NCNmLF/DNIs3o06cpJY9DL0T/NtEo7vcMz8LNTULvD5c70vb87Rba+OUjC 2j5Ga97uPELFvjdFtt47V8D0N0rD1khCurE2PbPLP1ztfVdOwPM9wr48TrlRNs3UNlO+ QD99S/fK9z7PtmhG3NBpRj7KvzhGq8Izxq5UO9nOZkVO7NNCO7PFMW28/F19xstI0MBC SMBtOci+QFy28DzF0UZKWUJGyFc61LhNQ8rN0VFNu743aa18Os++Sj9NTEk8OkppLS7K YDjWvM2/vsrIu77WvbbG07y88VfX3jo+TT02P0UtO9BKQL6swjrAp9o7rKZF9KS5QuPN V0A9Qz8xLjY5LSwxPEp9vfFcqK0+vaDXPaimU+OwxT47T0AsKz4wKTszKEPObzM+oLAt s5tXNp+pOL+t3NlWP+g/KkJdKi1MPDzNuTsxpKEu45i4LaeeSGatxehaTOw9Kj1QKjQ/ LVOt6yRMobQkzpr8LKSjQs24YtljNl5oLTZKMC07MDy3RiRtqa89QKCkNEqdrC/Lqko/ 7jszPC8tNi0uNs+2NCrKpq04MZ6cKzyariuzsTbOdCdO3yg9bSs24GV2SC3tn600OKOd MDOdqy3TrVFG5T5CRTQ+Oy04Y+jFRiq5nbstPqegOCqnpzNerUA5wzowVjQuTTkuVsrR SzHRpLgxTaegzzSnozZIp2Aq19k7TTczUDgtQFdrUC/Go1AqwKrAQ0iqrTBlpFsrw2Uz 3jwt20wuZWI/bkD8r0MurqdWTcutqztDpsMnxrssRtowTlYuS200X+1KtlMtqqM7N7Gw zVZurrY08a86NMw5N9Y2M88+NsjKWv1Qv6jMOLenwEbIr888XbpRMFzbPUhMOkJIN0Nb YvZFwq8/PLGt3EDTqrNA363ZPspdNE5CM09AL0hQOkJlysNQOsKqxUjWr75Fw7NiQMO/ TUA/P0o+OTs7PUhCSbvmO7O2NEy0ud1N762vTcqvW2W+OjFTMzfUNzDw+kVDerOt/TnI sbz3yrduWbGvYFfCzd5iNDQ9Oz5FOUNPONq/PdmowjlbwrS5SG2xz/m07TzCzkbXPCpR XzM6Qz4+MzS8r9rFtMJs5r67YEPDvHzUyu7Mw21OSjY8RUVeMy1xPylesMjjwrez0Eje zFv2007jusi9t+Ptym07N0BgVCsnQk0+W73C2sa3rbhGVsZfbcZLSbq8vbbKad2+zUA7 UEUnJz07NjtdvsnlwMLUu7TUSkZ0yMvZUNuzwF9ZyrPFUFQ/Ki0/NDA3OvO+4+LC4r6v ys7Dzbq34kXpxelUU762W07UVEI9MzY+NDRCPk3Gu8J839fOzUBJwsPiW+PDwMW3tmVL 3nBJNyszSj1IZU3IuLqzu9zKtNozO0k/ODBIxu3et7e/u8PgzN1UUDsuOFlKVP1OwLPd 4r63u9FzdEg3T+BIRmnTuLfT0Mpz2m48Pjs7VF07PsbF9uDOvMNNXuJFPks/PVFTXM7K vrCxyNHaTWhKMD5dSD4+Svzo3sDMUebI1/lKP3fcXuJ9ZcPCxsDU+cnRS0JwUDtXP1O+ Ud+6+cbGSNP5QulKOEJNXXrbbuK503272da2ZUrlQEDW1DlZtLvI3M/KSFDeSEg+Q+La VEnRw/BL1spU5UY+1j8/bz7T00K9yl63xdTWTUZXYDc7zEY6xkpKvebOw0xMzMxPPmDD 03nTymDez8/GcV/Z1lxNXE06V9ZOz77mvbtcxtY+4EgzTTctPk9U6MbXt63bw63e3rxA TWk3Tck/Pb3Jzc3p0N7FXyE0vi1Cxj6+q9xKt74+OzQtNjEnNMJe1Kuzp52uq6TDdEUu NDYrK17XQsm4yLO8yrrNRUXxPC9XRh0rrTstrKC7qaout7MdIz0jHz4uTJ+zxp6h8Lfb Iz44HjZWN7amq52cr7GsQDBCJCc+Jy1IN2C3xsOtscpRs7sZHr0oHsa7tpejS6iqLCc7 HR03IS6nt8+amqSaqEW3yScoKiMvPje9rcm5rszCw0B5yllNQDY7QDc7bb82JqSbKDGk wj4nF0KdNiemoKmkVya7wxcaOyozwzq0lKdAtq3WST1FuLPTwq6twzYxNyomJirXrK2s qLPjNEDNHRm5yihRTraVzRi+oyooRSqznEyzmC8do7MhvrQ0qqEuKLzdIyZO68u0yNGh nk05rbdKX0A8yukzTLO3KSOssSRXrsqsPBVeoCggtrbJrTAd2zQauJstLKnQUbA/Lqmd yTO3rTsmMbe+Ix3Kmq03w7GoqS0abKQ5IEagnUApyu47KhvWlLskraNCOyga76EzRp9X LKatLdvIJzfPKCHAptRQtLjTPSq3mbsZKqpDKz1FqpetJFCqQBwguaq8q5+e0Roct74o 3KOfnK4eI8ojF8ahPsCkXsaoLRzOpzMmxbDK0DQvyywVLp2mSbCuU1MnFCOsvzusmaBP MS8nKyAzl5kmKqDTJjcu2ZWaNMCdKhpeOC2otDernT8gs6MkGcadue2xqqG/FQ8vUCAv rZ2VoykmZioVH7Ogo6aqpk0VHc5GNLmzqaBPHDa8LT+jrdmptzTr6CYouq47MaaYzRwj 9jkkNrOYlKkxPmkmGhs3pp6wtJ6mMRwcJMhQHsuXoEpt6D/CMRw/prs9TztlsVQnPrjP 6MrDxr6rYBkqnaMxPqao5iMYJru4N+2gnK02LTxLKR43qqeusda+qj8bJ8i+wq6sqKpW JyQ4zug7z6mtv1czOHBGMTmtnToZRaa+LTHsoZtIGza4MB0hUaSmbTetn1YdKtlAWVEw vJuuLVa7QjM4PsituPlc3snrRVrK1NvaVkxowr4mJ52eJh+7qLvmIy+jpyohuKS7MzFb r7sgI7GmSTutpGYdJL6rxlbTq6BpGiDQSC3btrCs6CtAvT4u+a+3Rr6mKxy7qkI+11ut pDMfSrk0KDfDqKntPa6qNiA3yfw7MaqXvx4us73uPjummsAkPs07PD5Rs6jZL2PGNDSv PRU7lKYh7qTCuy0PIJ+zH16eprwvHCmsUR1NnJ3KWW+44BoerZq2PfS8uzYcIL6t3caq prQ7JjHMbTvWp9ktn6MaGq2sMMO7yJmgIBu+wyQtzaqdoy4trWwkLSEdsJ2zpJ39Kzof GC908K2frtpLKiAqP1O+qqq0yD8mRcodI52V2zesyzs2Fxupm2bNnaR2Khwd0bE6w52s 26PAGx4zPrefsbeesCkjMS0t/K6mpqbFLztTJBcqpJ231KGdPRQaOEI3RbeamN4cL1sj HjSum5q+N71fHiAuJumboa2vTyEnKx8xraSpp63ZMyQjKki0qsC2mqQkFzuvKyqjlJyz SDE+NBscv5ypuqanzykaIM9cJMuaocOnzB0hIyD8prjDp7E0JicmMHC+samnvDkvQzAc LaOau0KnqiQZJDvJtsawm583Hy80Jy16p5qkPFapQxojSDuwm6SkpkAgLS4mPrCnpqe3 ZTcuKipGtLTbr6H3HSBiSyRGn56uYzY4QycbM6qovbevuz4hHj66OzOnnLbQwyokLSg9 qqa3r6rINi0sNlvMu7StsFcwPE8sLLaeqV/IrEIfIzR8uLnCqaHIKSo5MTNJv6ekyzfG viceOkpPqqi0r8ssKj0xMduzsbO9X+VIJyc6W7+5w6umQiE21zYtvqaqvFQ6RUUqKs+r sby3vds7Ki7Pu0b2pKbR3lQpLDc336utu7O7SDMwMDzg5dSsqug7Ozg6LzO2o7ZNwLcz JC5XvrfKyquvOys4PTc+V76ttFZDydQuKkhl27C0vrvmNjRFO0DWxbewzE3pZTMxV8i/ vr+0tEApN95GNMaqtNdJPE1RMTHNscDNvcbjSDE31stCX7Cz7VdFMTlDSs2ztMDAylpF Pzpjwl5ptrpeSklQTjdGtLB6TMDLNjBAfcnWYM671zs2QkJCWtm7s8ZQ7887LT5Zab63 vsDRTkZTRk/NzNO8xUpw2Ts6XuXLzeO9uz8vReBUQ8uzvulNSGxdOT7TwNf91NPfVD9T xtFM6LjDbV5IQElNXcq9wtDW7UlGQjzrxWjLtspRSEBOSzhltr5jYsrtPTtJ6c3eXtPF cEZFV+5tfMnDzfdNbnY9O17e4MLC0ddpRT5NWlDp2eXM2U5e4EpU3lrAxj67yTpbPvy+ S8Ctwz04wN42+sBIuLEs16w2UF5Lxk05y7fZOON2PC9KrW7X0EbAS1RmNs3aT83AvjZA wEVM/NDGyL1pUNPoYj5JyN/d7tDFT0ZXT0JPxszNvkpI5UpQSEXPzWvb+VB6XEZGSn3L 1OjO9jnLyEZJRb/XV8/N4z53zUrKvlpg1sVLP9DeZldoxtbP4m3jO03CU1TCwNDCyFtR Sjc/v3dGxrzLVlR8TU/Xz+zIv+XpbE1LVDxGtrvp5kpKQy9W1ki7yixcvjj3N1OkeifJ 5T7NzcMmMKc0LaOtvrHFbFsmKsxPPLi812lewnZQRjy+qs3DyzrKwzTUtmnpvUPDtC7I Qi2zPECqN8KpMyTo7UjQWqA+ErCjHkik09evLTifKR2k1izQSDtQ4NbrcU/8wsrJbbqt PUCtrzlKwk9r0V9tdG3FSTlaV0tMvc8cHp6kIFyXnyEhwDshLsOgsy/ZujQmN8jFvszN qvwvSk/Cz3qgqjR2wz4oNLqtW02kujy+LhUwnck2n5/ILTSuPBQcp+8co5fs4sY2PCgh uLs5qqPRZk85dMo5t7TC2Sdptirumr4XLZinIc6b7ixDMyEkwpvIF1CwGzShV0izobYh UKE+Ghw8tOK4n57PJMOtME3GISGdnSzCl6vz1ignPicg8J2jIxq9/yNrsaebq7z9FyCj SiSspzs8vD4p07s9IU+RnECkmrsxISc0JB3GpDS8mDwVQD8aP6Onnp1cLsMqEh6nmmb5 o8AtJxwatKHIoJqkqjgaLNkjL5ytLMKftx0SLEgjTJ6XoL6/zCcbSD0kr5mhrTcUK68h JJ2Yq6mftx8UH8XDQruooZtlFB0+HySuoJ+oXsjPHSC7Qyeonyu/lGAkpN4sszkntvod t5oqHbTgZpSjGD6fIBy7NCytoKarTSpMLRwaJp6ntpqfqUkdHC8tHc2cuO+jnTAdrugU J6c+OKu4qZ87LqO/HhgjqawjKp6SwDScrCo8KysoIO+dqsq6qZ60FByvJhU+q6GdrKCs GhXIzhktnKnCpJ7aLTQaI7o6M62s3u++rqYsFLuZKBm0vzifrhchn6ApUKfCqL0dFTah t0Ohnbc2ICouISqfjzYcmaEbJ623UTcb25I8G6+gyO67VD0dEeiaLB+nnUVAtyYknpw3 HeuzI1uaq0qrnT8bLDwvvq2tpsk5zSYP1pooJJqeKlFeLqOmGiSfwzu9JyScmt2cnB7u oBoVeicgoJwsKq+kUCZNbSgfNMM+K66VoSkbrZ8nPKOqn6MbGq8wEjSfsMLRID+dPyOp bSifpCMhOSwkv6yvmZqqoaoaGMBDGSOvp7O7vqe8JE6tKhcppp1bJywqNM1NzpiVraec SBocGjOe0CCnoS29vhcnn6tDqp5ZJB0cOFApwJmVo7umryAUHD5zWb6tt0nerfcaGcCu 6Z2eKh4zKSBFwq2Xmq6qZRQesCcvn0VCmKocH+MoH8WklJFWH3pIHh1Gp56dpqS2HR0t K0q6VDvNza62Hyf3HSSXmCdInK7DMRU7nbrDm7odei0do2UX6J2xO6qtLigXF6SfIzCX l3MwP7+jXSeutDZROzutqD8uMTOwzUKgqRwfwDQgJzemkac0p6MnNMInTb4dNpqxGims Nyu5s52VLB2qRRocPaq7yLSrmqovMS064CgfW6yzwjQ0wy0jo5lAXpymPx4VKqnfNqGb uq2+IEy4HRuzo0K/qi05KBRdnclCn5WnJiBZbc4oJp2gwJ9eJ6+xKicnObPe8ac+GC/t LileppeeLSuu3iBUtjemnSrtmjAay0YqSju5nrseI633GB6qnMJoQ62pLkwuI62nQEWq p8m0PCRJJDGh3CfWprgtHiyqpjZspsm3tic3pNontKTLYLvNQicaLabMI7aZtCcoQ7+6 MSi7p6+0TTe7rds0M1Ozu2W5yiEmw24kNq6qqV4mu7MrP0IstJ9JOKGpNivU1yddt7im Oh2+uBwZ36rCVD6usdpGKi5JtsI926qprOYvQD4q3adPL6+2Mz8tNrpbSLGwurDXJj6x wy09nao+s60kLC03oMAqtqO8LB1LvUAzLLiep7wjN6rUOz/cvMO+u7k2Ht6tLylUuKjG Ky1cSCo447+0zE/2sMgvRWU+v769p7ovQLM0Gy+rrdwvMM+2PjBQfbSxTUu3t9BoPVnA YtStuj7dr3QzLTHGv0U/yHNK3T5Js9ZLVLy3XspDQ1oz4qqxXsKnwzQwM1ldMTjCxebR Sj6wtjAxS97FW1DQTjnMs1tDwq+z0Tw55l83P0VRyeM4bbfgUG9FT8rUu7ZGLGaxMzPP sbC9xU68/y47WWW6XzRju1w7VEhe3krUuEM/trpJNkPWvr3507S/7Uk7abheQl1j9Hpb PlZIPr67QFGvxTg4X1NJ2lbNtMXsXUb8vvQ5XcxX7tc+a/0+uFstwrbxvPMtPdk7ZcDG 39G+N922Oz07wK7vW6qwKTC+Lz000KEwaadLv1Y/OnqqQDRWwq4wRbE+NkKtuFPKSsu5 LeA5Hr7QSbTQTVTIxtAuNrbRSLY+QLZGQ7/Tr7dgMS7Fu7pPLuu/vD049lO2rzFDSDvA Qz/d0U15yENFvtlovr3IwEo0NjA+v6yvsa7jTUIsO9vcvLTjTkg0N0XIwlpu3rizPjDm vsbeMSdQt7v8Ok7Jv8PZzsjK40AxMEjjYmNeyLG97zc2T1dGbdHIt8XtTEA4OMu9wLe8 TjAxPry2SuOxwk02MEi2sHFDS97DXz00QODAvllbyMbJ601WzdNGNz/XuchW/Mj0QkNt xbi7z81mOjw5P9O3scJXMTrg+l/Du7jFRi8wUdFtUXbtzMPbXjw+195JNjvMtLTDbdrI ZjkzPtHJUV7pV1R8TU3TyMjG3NfP4jw4Zr2020pWels4N9uvrcVIN1q8v8ZjNz7fyFk4 abvAu0IrPFPJyeLayrd9LkbF6GDp8GDJXzNJXk/xXmjCvbxZLU66tLTO4lpNQzE3N/Su XTEtM7astNFAz818QjTGrbbJPj981+g9b7TG1NZUaObWUSkqSqqcpF0hJnA5LaqtSjw2 MyvPrKmduzY3MUK/wsbWLipLusXov8XISC00Pciz16m+HCbXrJ6jUBgj/DG7p0pJTSks SrGnpqRRIyMq0KimszsnJC3Io6CwTzA70batrDwttK7NHRS+oKCXShcvIymXsCu/OdZx xq0ewqEmwzohqJ6xQiwdHKmdqrAtKzxPvaagtzskIUmgpyYYIfmal60qFECdvDYUF7Cc l6MzFyCmnbYhKizGmT4cTVu7mZ8nG9C0tJrAHycmQKyhrVE5Ixwqu5qXoC0VSZ6rMBce vJiVTBght5edNhcZ86Gaqh0b16Sgtyoj06O2+SgbPqakuTEhIbiatyojJ7mapkr8vlku GhoxpJSvISROpJlKFB27mqM7GiSumpq/IBs7naQ/KR1Zra25JjHGrKG3OB0bRqycnTcj Pb7IMB0c3aS7vrm8p6YtFTOus7M5H1GcmMMhJmadnTwdHT6qn6wkJM+tqL4/NC42M0vF ybO+yLY9IRwbU5+drUZNxqvAKjE0MEpISKeXrTQ8OMik7x0e0KOo3B8nsKGh0SsqN/oz Jzu2naFNM0NJNConMK6ju8bAtKpaIyEucLvIQ8Kwv7Guu7vRIR/ItsbFMSu2naYzKffi QCgeNKqapjwqLWi/OB0ht5ukSic2uKatLSE51sJjO9aqpq/MZWXNTz5bPzpCRcyhoEVR xh4dSGbFnZ0+KS0pv60uITe0qq1WJkaupq0uGiexo7BKJy6zp7G+bda7SiwtOVzAvlzC obcfHUummp4rGj03ZakrHL6jWsiuKzO3U2ituyQk2bamrDAfLa+dpj8uYLityicr4NdL WbBpHSe5n5mdOx4mJrqzHBrfoZudOB04V76k3S4/OzetpGk7MSvQnalWSD7pra5NKCpK tq1GHBzdnJefQC3RLSo8ISRTzcOhq8a3JCann8kkGCSrm6s7JjGtrL2+vkk0S2W8reYk MLDDIxowpJidwjQ8NjjlRScdJ+Wqp7CmVibDqdZJPiT9sDvbwys8sKSaoTQgLtyjpzQz Qt7DJxk3m5npNrertice4LcsGh5IoJqhPh08qa5WMS7W1yNCqsxNTvyzo7o84FbXrNYx KyraTSBAnao6wK+qqCwhwGkcGzqvp63XV11cRVfFvc03JCmwm7YnKtaxrmDQoMgzaNvK 9zA3Ph0kpKM746eknVMdTUocHTDXrbfeu7HM375iNDs2NFC9q75GRVlo17Sko0MjSqit SjA+uzQVLZ6nOEmvoKE3Pq0vGCBI4j00w6CkurtOMToqLFvWvr5JO9Cwxcuzu3E3O9G+ 0dzxaEAdH6yhMyPCnp58M6atHhImuE0jL6eft7SnvzgpLOxNLztR8LewvK+x1O96bMnP QDpRXNdGI1am/SlOqqiwxbSqKBQqsT4dKKakPrqcndAgK7TbJjDL3ki+rKu7Sr6uv+BD N0g/M9vFKDGuXyv3p6u86Feq3BkhyF0gIWW3Zs2dmsYnRajJHiq4ViQss5+vO8Khrmtp zUgwLU2+KiPMu0xms6at7Du5syYjSkYmIDS7u0avm6lDPbG0MyxWViQqraTKN7OdtE67 qLsqIz63PCEzvsNT5rStwFG2rjEqSkIqITDAuz5upKrP3rexUyo3zzEmWa22RVesqr6+ pq8wKkrMLyRbzjYsUaqpwlO9qbQ+MT8+LSpD3TM5ra3w7Lav6zAx2u4tN9HITka8p6/j rqbXLjTbVCsuU0stO7e2aEW4quxFva95JydDaTgvRb6+zta/tN5Gvr43NuDbOzP6s6/J yKqtyHnb0z4tNPY9LFuxse1WvbfM27a4PDBFcTwqQspWOUu2rb1U6LrFRTY+SkM4QMbK U7+ruN7KutQ4M0jdPTNT4F1CV8K8XU25yDkxQ9FPN0ZpQDbcs8hZ3rO6SFnDyEAtNGPl QkXJs7G3vbu67WK/3zY+5V48QNS+z1bFttRQT2tKMzBIbj5LvLbFbdS8yl7cvvY6RePw OzrZ2U9ZwLG52v3Fu9NKS1teT0p95U1WxcZcT+bdPjM8V0U0PFz3UU3Tv9ZQ4spTPkrT zVNJb+5Tb7y4y9u+uNBr1sXcQj5Z1+xXccPAzc3U2XdQcOg/N0hZTEJgyMleW8PQTUpW aUw7QON3VMq7vnlTzMN9V83OVk1i6F5N+tljTezCyvRQ5sjmRj5KUElKetv6a8/Ga1l2 6V9CQPDeRU/Wz+Zj4MjNTfm730tPbs3/SmnWW2bGxdl9yrvdW/nwZUM7UNroXnnL0N7g 3+JXUGlvUE9p6N5OaL/NTU/P1FdQV1ZPSk3d7Urmw9ZUS17cWUPezlFT/+BbVNfm/W/T xs18SnrgW0pTb3T9+s7K/VvQ13bjX3FPQl30WU1w095m4s3O205b1mtNWdTUYmPXxuPa xc3l79bsQk/tX05RdNvb+mB012VRVF3gTU1xaVNLW2ZsdO7P6VHj22xXVuNlUF7byuJi 1tPxd1/U2WZz62tUfetvX+zZ91/u0c92UVptbU1MWWDpY2POcXPeXWleUGhpS1fOynT8 0+Dt5dPXzdtg/HZo5u35eWLm1Plj7m9v/GVpW3Hc7FtZaevjbU1R5XBmXU7oYlzKXFDc WXD/VNnWZllg3WJTbXZob21l3tTX82hx7/H5/WjXytFt/3Fx3uZbV2/b13xbUE1WdFxR YGnT22LUXlHgTU3lTV7wS3nDytPr69t5ZutXbdNvV9vT6ePoX3f65u5Tffdi3WNIW9DU ZVlo9NDsUF93625ueVZfXEXm5k16W0/X7uvLZk/e7PNvbNveY2hpW+vXa1/m49vN5mtj esvgTHlrXtB8RVTg0+BbTVdpcF5WcPPMz2/U5U3uW07Q5WDN6VnK10r/5lvzevTP093W X1Hg+l7uVk3m2dpxUWjW5mVoT2nPW1FdUf3uX1ZW/GBz5Uh880vQZkbjVkrwZnHU4lvp 11tRaOvo7mzrz+XM01rrbV7N11dv39vW7FZX7X1zYFDozGtacFxw7eN06e5ey+NO1FlU zFNwylD60Uplxm1fz9/e2u3o0+Be4vFx3FdUaUlK6+ZjVl5reXdNTlZp3kxIZm39X1Z8 ZdnZZtZRWXdN7mtN3Ppext5oyuVK7W1M49Ti3dZ338v64ula1NZZ2ehMWnBiY/BZZsrt 7O1Wzcp3d+ji4utrTN7TZdBgdNBTWexc4/BR0elMa29Jc+JPadHra85fTelNWnlMVN72 bNvpZndbUOteSnBu5eVOV+3lXlB2XVTZTUjrY+L9fdlw4OBe4NlX4tZi499Qb9/ocOng Xt3gVHBta9/e3tvl69/rW/D/TeDUZtplZsjXcWX812b/2l3XzOv3etnm99Zo9sZ3Xc5v Uc/8WdbwaF5oSkzjS0ZaTVdlV1lOXtz0X199XlTZXklmbeJiUE9KXmVZ62390ezi4+nR b2zp7ubgY3Pb3evQ29/ZW+vW2Whtdk7/30xT5mjg1/pgY2vw7FBj3Vnl0dn6S+bWdn1R VHRU8+hZ3tb85vBf7ddfdt9g/9dja2xUSM/FeXZe3e9P02hL0+tR3+tfYmhuTmvcaeDW 61zWyvPTa0ll7U5QW2n5Y/3zafbU7WjX+mni9+3iXFHZ3k3530BZ09ncd+J3cdboUejb W21zSEpZW0NDX+Dv3MvpfHzd2+VdVN7ZYnncbd5xXdl6XuPZ9vPW3mja32JfYlBbyOhK Sl7b/GD5X/DeU1vR7VvZ4lvf2VNd62Bfa+Bt22lT8fff2vPUxdfQ12jtfVtlcGnt/+bt 8VxTfehU+uM/W83uXk1U7GZUUfzcaUta099e5u1Q389UTVdwbGBGbsvuW2Ds1u5f7XB3 5m9fWVf29FTbzW1b29NfSFdwWs/WVFHtzcrLxsW+ylBJVkw+WfMnK7rUL9OtybOtzrGk a0a2WzZINixGWTYoO9FaUbuzuqyurau7TtDcLjY5Kiw/NNs+IM2vMEKescOfqr6uQy2q LhdZ9xot1zZRRVSurV6joMiqpNY/RjjaJB1ANCA/31n8ObGkaG2asUWhqjvFXCaxNxlD 4h0q6Dw4UK2pyvGao86pqfDOSyfXNBokSCYnztYvs5zbWZ2dvaqoxcrIKjDXHRg4Lhw+ uTQ+na1MoKfDoKZrtLg0LlQ7HBo0QhwusDM/m8hNlLFMlZ5FrbcmNL0qGCs7Ix5W2S6x oTaqlzuslMDtpj8kzsocHTMoISRFPUOquT6ZnTudl97JpjcjyMoXJm4bHjstLLOtN7SU xsyUpHyqsCw2tCsXXTAYLjQmPa3QPZybO6GVu8aozShWyR0g1hwdRigh5rA6xZStP5Wb 3aioSj3OLh06MRcqMSQ3/MXjsJ+2t5qjuquxX0XgMSQ0JBstKCZMSnmzt7Sjqaeepri0 wj1CNC4nHSYuIyviPVakvk+YoEqcnE6writDyyMhMCEfKSY50zS7oTyqlMmtmdfIpy83 uB0h3hodXiEorU43nadGoJizr6a7xUhQ2xskvxcZuSEko/k7pqqzqqSfsMiqwzBCuykc +SwVMUUk1rtGo61TlZ40nKQmrq8cQ6wfINwpHS9MRUO+p9O4mL9Nmrcpp9sduz4jwych ViAtui1LoLw5o5zWxqOzMVfCKis/KjkuI8o/J6/AK6GhKqeZS62dMECqICbTISovNrkq P5w8O5dWM57K3KPCvbM+Q1MoI0gwHzrIPD6qsdeoq8W2yruxSsq3MTi3KxxzOhw6WSe8 pDutm2nDnLYvwKs3KrZOIPFPJE43IUJePNy7uLSss6ynsb+9vjEtWSohTUwzPENRRvTo PO+zxsOuraqxs7FCTs0qLE4kH8L5INShNDaj60KhUSykqjx5tMw2RmVFVjQ0yOsn/a8z TLBN/bfduLnGrNY0xT4nSDQqaNtIzayturG2z8zALSa63iBrpjtFrTk3qugfNP8xRb/t wq69qqbF1LS8ODdJKig/OC8+WUhI3MzCtrC2v7a+SMy5OzRRPlnXQ0basdEt1LYkLLc2 O61CNKOmTbqzN1DKKjM9IUW3MUWt07Shvb2vYL67Nv3sLD88JDlGMODCVvq7sbe+v8q/ vVM0TrbQN7evNNm2L1GwKya9Pim71DSzzUanvy66tDHa0SpIxk7C2Tu/1jN2VjC9ujrG wju9rWJR4kbr3TMzSFBOMypAVjfIsfOuoLatn7b2tlQrPi0jOi4mZeIusapKpqDGp6tZ ttEzaT4jLy0dMEMqxrQ7saG3p6bPtrBNOzcuPzMoUTsm3c47u8I26au+xqm5wqe7375I Mdo7HSstITxINMW4t6mwuaqsu7bMO21IJz47IzhLM8a866ykrqjAVrQwOawzNrguRqdN M+86Ntw+KUhCOL7PNMiovbGuXMa4SVs/LE5TMEBDOMu30baqt7euy2jXPDhCJykrJuW9 N76tQrGjPsqtKju+LT66PkO8Xu+2SDa82jNwSkCxtNazs7GnvFnFzVfzOy0/NygzOTFd 2lazqlllr7er3iq+ulTNLS2/NihIRjxDQkDDtNnDtrzDxfFixd/XuddZwL/TUDM6TDcw O03CsLm3q7nUyEg2QC4nNEowISbAtjuxpqyaplatbSExIxw3NzS2rqycp8KqujQ3LSM0 Pz68s7ihobO3yVloMyctMC40Pk5a28rOtrDaYL+nryo+ORr5ZhrAnlaqoOmvwx4zPRsq SyvIqb6jnbSqpzk6RiQtOylUusarrcOts1ReV0BFP0NGPj43O+VzMSnUqT+7nTROoDEw zxw4pCRCl7jlnb5dtCQhQhwfxi43n62tmrC0oT4w6ygu5i9GsdvAr9rIwEVQ90M+N0Oz wyhUySBNsSZppze3nSwsrSYfwEo4Q8OcqcWepFG9tyckKh4oMCrFucijpsOnrj5cUzBF RTrZ1lnFyNC7VC3utjforDNGrTAvvickqNcto6k0tsZMux8fvyghqcU2mqM/mqgjqLQX TcMaPsIkyq82trEvubEvw6tA1rPgsbEx7sokW70odq03vKMrMKwpJLRDRcI9p6MuvKMo LbkhH74qJKl0L56m3KGnvmk41y8gzusmyK02fa9gWdc2Sr9Jxa9IwqpGba4xMKjNMaqw NM3rSOUjK7cpKKrLPKOrNq6xI1DWGilDITZTZqpU6Z5WMaHGKayxN1E+yMopbbMkSaAx M5/tLaG7Ici6KFOz6brJuZ2+P6PCI9ddHUW7I12kOcqf4PSuSko8JGY6Hs3KIOKtLE2x S7rsLqu/KqeuJLCnKMq+I829Lri0OLC5K62xHdymITufPj6dyi2nwia97SNj6DHX99as P1CmPi2rVie63ClpNzS3Ly6uLympRier4Cukyyenxiepti2nuy+hxSiq1iO+YCazuSqv qjGvpzS5sDDI4ie/0Se3sCy/qjBxrkbRejS7XS2z5Se7xifIcyO5vye4uynGzCnCWiax vSqopzSppCu/pCc6qigorD4tr8hOttBovGZOwl88y9k+RlnIWTy9yTe5szbRsznPsC1D uSs6ujRDtDdQqzM0qzMntzYmt14otrY2vKpt07DZX3R57VT332vazdHD1GC+wjfusDpF rUY2r+A2s+8urbszr7cxwNEry94mw7goyq0xz60zQLQ0Lss8LWhXOHDW5fRpy3BMzHxK 0etQwO06tL4zsa0zv6wtS7EtQ7AsOrAzQ6tDXqpD66k6Tak4NrA4M7BJM7PXO7zDPu3a P0VDTU5AeWlD5eZM7WM/1tc23r03aLY+a63s2612a63rT7NpO8pAMdM+Nrh5Pa64Wa20 Rby4Ol7DPkDOUEL5XExFSVQ/RnNISWxNSnlGPsh9Or7CO8a/N05xM1DIPtuzVtex18qz 3/C8ST7KQDbuRTjTzlG9sL63rrnDvsv2XGNmRk1bQEhZQkJKPjxRPTZ6UTfd3DzQwFDF yTh32zTju0L0vUBfvkndt1D0uVBbvk1Fzk1C1+9vw7/Cu76+vczCwt7LzlNoYENLSzpF Xzs/3EU+4EU4Vj4/wlc+u2M4u8VIur9KvcZCvsk70eA2bNs688hJ4MVl2cXezcvdw8rW v8zpyulRaE1DZk08a2I+ee1C+tlJ7/E6TWU3Tdk9TdBIX8Jl3bnx7bxrVMxMQNdRQNbo YMbGzb/FysDT08bXz81z8fpLUVY/TvNIUNdQTtxKQmNFSchcQsJsO8LLSMPGSdPQQ9vb PWBrO1fwQHPKW+LI69nI2tDIzsXKzsLO3szoWWlPSFxKQ3BOP2ZXP19zTeLmS9PQRs3G Qv3KSunDWde+W9y/XvTNRkjuQ0BtTErmc2vT19DIz8nI2dDRdv36VlZXSlRoTlz6SU92 SEhbRkrjVE3KcUXP7ELc3krNxWbGv3bLw3zTyl1901ZZ6FdPa19f6d7W0M3K0drZ/2Nj W1pfVk1cWkpjd0pc6E1T5VNc0F9jyHBUz21R0ehZztZoztFm2dF32s3g3dPrfPFfU1ZU U1Zoa2Lr4m/9+V5eZllZcV1QWlFDTFFGSlZTXfdb/NFjZs59XtHodMzZ8MvXd87XbtbX c9/Z+u3d6e/l6e96fPF58+b59PNtbW9obfZved3m9NbsXu/8XvPuYuL5UHZlQ1BeRVT9 U2bZa3bU/HndfXze6+/j6fF8c3x3YHbxaXN8bnd2cHlvcHpoa+1zWV5jUVt3XnPZ3tbL 2tfM9mXgX090XlH9/Vv5fFFdW09eW1rm73Dj9mxpXFtcW15jaeni997c7+vl+uxZd91F 0ehGzWBbz3Hp1OXX1Ovez+jrzN7py93p0N593f9g61NczUJWvj5rxjtZYj1lUEjbVlna XlZ2ZlteaXPoW97fTdT0Xtxr6eXo1Gzm2159aVTg7VTO01nP5mvOT2PJWnDJ4Nvs3utN 3l1G+kpC1kZGzz/t30jfYlneYmX0X95bUNZRVNlR4NlQwstCz81O2cn668jRaNnDUVPI XO1Od8NF6btaWsZlaWDt20xi0NBI385Ca3BT/F1P3V5X11lX5XxoZdBjTbxGO69LMLxm QOL8xXlCvso/aM5lPem/SlnQ2WZG2d07SsBAOcDgQubdbGVCY+JDY+ls1v/Qy23K2Vr8 1OlTVly+bzG9vzvexm3TU/y7V0rvwN4+s006rUtFudBJT7rjN8i8Q0rF9EZzT1bZSlvI VOy95mvI00zx001fXkX0wzw5s+wwv7YzKba5KjyuzzDLtms/7rE9MNlILzNRSDbTxdy2 tLuttNO3vT5N2jY2TTk8/19WxcLgwL/KwspM46wpGq29Gi2dqh/emMoqvq06KkU+KjRI Ocm3cLmordS/rV4632k4SPFFybbiu63Iz7nfP08+LT5FPl8jKqO+I1aVnifOm8MaL6sj GkU2Ley8yauftM+uvSsoMCwqM867rZ+hpKa3UF4+JCkzKjBDPla3saesJjee1COwpCg3 pC0SbbEYHqCqIHOYuzuruTQzMyMsxVs+rJydoKOquEssHh8nJi67rbmrprOvqq65IRdI zR0dpJ4wvq8pXq4jG6efIzebriNZqiQd+kMo7aanoZ2jr67eIRwfHiE+raSfnKOuvD0t PDwjGR1dxixUl5W3t6QoGuUkFbmkMemc7iDASxcjsdkqq5ejrqanViYeGiA0Os+dl52k qrk2IyMjLUg3JzyoqrGgmp22zl4bESQnGkiZpMmeqi0wLxgds803ppijwK23IR0nIyfp pqCen6vAUCkdICowWqq3MMWdprOqprNQKhwVGCkzQKSVmquqrSkaJBwb/ayxoZeqab4w GB87NE+gmqavsNsmHyMmPc2xn7Mzv6OzUFmvp1YfHR4dKlO0npmaq8rTJhcaHR43oJyk mpq+LScdGi9b6KGXocnGeSAcKjlKvJ2nLEOwymY+PaeeNxsqMyAp16qdnJ+wYy4cGRoh NMadlZqenbQfGSMcHeymn5qcyUNmIxgqw9O4mrEkQMlQQDy3nKgxKjcrIStjq6Sno602 ISAcHC3ZqpuZnKGtQx0VHCEovpqao5+pNCMhGiC7t76eriktcEktSqijuz5NPyQpScWw sbOntyggJyYkPK6empqdqGwnHBcaKUC7nZedpqw4GxwkIS+toaShrSgjVjAsqqpC1q1O Jys2va2/sKpxKikqKywztp2doJ6pSigfGxwqX66gm5qjwEgnGhwoK06jnauusUYoIyQp zKfFV67rLcmxO0KttuZDKC07LTuwqq6mpKu/LiEoKCdXq6mkoKz0NiceHSZRva2fnq3N XCgbJDEvbq2uq63rKjDXQEW30zvrtz8tSNqwr7qtrWUwMTEtLki3oaStqro2LCkhKWu6 q6Ofp8g7LCMfKjZPuKSqtrfMQDEvLT63tk/UyjpCxmU5xqy+30A0TDs65bO8u7q9cTYq Kjc3V7OtqqavazMtJiQsXr2zqqSz6Ns7JjA+O9y0tLC35jYtRUA5xsJKbbHUN0jfy7vU 1shQMzM8OEXxt6uotLnCOjE0Ki1OvrOup63ASDstKTBC5sCsrL6+1z00MC5Cw7PCz759 Q/TlO0jAxn1WO0hPQPPAxcvCw8hGODY+PkbCu7mxvVNFNjAtMVO+trGrttNUPi0tRkZc wra6t8pGN0VpS+DC6E/OzT9CfN7CydG7zUxASj9GTc+4trvIz0I2NjQzU8/At6+zz0U6 NC4+Ue3Ft7DQ3GtANzw+VMW2wNnD3kle5UVF5crmZVdP3Vn8xb3O1s70STs3O05Nz72+ u7vcSEA9OThK0L68t8J6WUI7M0JMWf3IyMrKWT9N2XHXwMv538xXSlfozsXbys1uT01j TV7TwsC/zt9ePUNCQFnPyr/AyN9CODo3NE180cO9vt/tS0M9Q0hWzb3W4tljUVR8SUzX 12NmVm3ZXt7IwtTm6FtLSEpT2d3CvcPCzlZGSUM/SeXGxczD015USEZDZfrd0c3O2+tW SGPcZtvabU1efFBR49fNy9/eY1NCRlRMadPRz8/28FpJTU1Z6dHZ1NDUWkVFSkpNeePM yMXO4vRlW1BTUV/a11T/6WLz2dpz695zVlxRdHdc4uLdcGPu+WxvaezT39befe1pV1Bd ZWNo2srP3NfgbmxWV09gbWt8d+357/NdVON3bX1fVmDe72jr2eXT6P99Xl5a/3N63tnf 4G1eYE5TU1R319fd087cXlBTUU1aY/DZz9Hj3vdrWlxcZenR6ebefX18d1tcc/dod3p8 9mNsYmNXVGZjXl9la+136+l86XpeW2BfXWDr19rt4+toXFRaU2Z5/ezc1Nfb3vnT1k1K W9xtV2lfV/nX6d7tdmNra1dt5dbT09TZ8eLeWVNi7ube19TX1t5jV1lXTFPX1t7N1uje cVdTWldb+vBbbfxzc15XWmhoW1nxXlvd6WJmaV70+Wvl219ra2DLQ1rGW+PZX1xlV33b 7nDm0+JZXE725VxtYmj6c19bU2VxZW1ga/3u3mlNzPlixtNN3sxK/Mpx2ctj787z3nFe yVRX3tO+eWvmSV5eTl9vVtba0MpTXV9lbV5ZevH0Zn3xWk9lWVRda9R6Wc5UTtvZRfze TePTSWvbXNvp4vFfytlizUntzVPexVtI6dzNZVdNXuBQQ1feTHZlV9vQ4FbgZVdMTkvz W97MSG/N23bR2+3T3mvW4NvrSHZp491M0M/UzetdyGtWWmXIV0ZN3tN6UWL60+xJ4kzF X01X7uVD3Ozb7txt7dll+n1PXVfmXWjN2fTp0ENt+VdpWdnT39dO6HFFdtxeU1Nvyuzj SF5fTm5pUPF301dvyV5bXtdZWl1UfOvQbfTNeeXi6Ff53k5s3OhmzN5l9ndwVnT3/8pt 4s1cUWjU0eZU5evUbVprX1Ht7uBty99G+XdlRm/c39Po4nnf709tXFlb5u9gzddpbuJW XmZcZlx3Y2vvTXbzUfHj7V1ZYNHm7Vpr819fdFZdZeVcZsh2XlngYE5fXOXg2elv2Wll bP9ibNZo/Nzfad7d8OL53+nc617ia1N9VExQdOzeW2b61tlr7+9x9HZiYPTWT3He2/zr 0OPb6fRveeJebWtbY3HvbdHT5enfYlZiW2NbbfTz229m9lZt7eN29/TU3vdeUFZMTVZT VGJpaFPebVRW+nZWZVlu9/ptXuj/7dbb4u7T4+3e4nnr42tta/lt9+Lu1Nd93W1bXHf8 9F9w6+XgaXBuaWvt/+3vzfFm7+x5Xe56d2tdXlliW1d9dujb1Nba0eN693pZbnFw8f/l 5ex2VFxXT1tXU01PVGtZV09aa2BlbG9wfOnoc9bsd/rm5nPp7t/W19nt3tfe2d7i5tff a2leVlNZU1lgeubb09fb13z3/1lXXnf09mz5/OxraHNoXF5eaWb9bVl99HpZXG5292tp afnrcOnf4ODc1NvT23d8fGJmdvri5tvd8XFXVldNUFNXWmNt7fRrZWh9bWVgX11paVxO Y2xmaXntfeXj3dve5nD69mJbVlleb21u39fZ1tPZ19vU1tvb4ubmcfZ2Xl5t8+nx7N7f 4mtz7e3v93d8YGhZU1laXmPp3+h2Y15XWVROU1lieezv9ujv7ejpbm1mYmNZV1RXW1lo eW3e1NbX1tnU2+P8cXZrdHn54t7b2+zZ2d7saV1mfW9uXlteVlldXWZuffnrcVtUUU5N TU1WV2Jxd3xwd+3l19rg4N7j/WVfX2X/febb3dnT1t7x72hibWVmbvDj19TR0Nna3OLm 7d/a3ff33uJzV01LU1NZXWj25t7f6/xjYm1pWlFPU1ROTk1UW2J2/G1zaVxTVllXXXDo 3tTR09PT09rl8Pz8cW1lX2JlcPl6d/D28/bv4NbN0ePp49vmWlBZa/Pr697Xz83Q2ebs 5u1jU1NUVF5p6d7a1tfeaVFLS0tISE1cbWtiYG9mV1RbXmZrfO/w3tfa3+vi29vifW1p ZmVfV1du2dxdTln8fVNLT1//dPDe1s/IyNDg7uLtXVFa7dvb2dHP2etzXFBQW3z/bfPc 2e9maXp6XlRcY2BiXllbaPF2XlleZmVdWVlo9t3W2t3b0cjJ71BUZmVOSE9j7dvT19vW ztlcSlBtYFRZ68vGy87OzdHa7mZj/ODma2nw4OhfVFdcWVBNTFd6cW1wcPR8XVFPU1tZ Vltt/2lgXlpUTk5c4Nb2XPfX2n1bYvne1t3l08jI2m193uhiVm3d1NPd6NvX8VZLTFZp /Xl33c/WdlpjdGheY/fm3dzj/GlfV09NUVldYnB6ffd8aG36c2Jm4svMfVz381pNRkpe 1srO29bXZUpMYt7d+fze1Nfodt7Kytn2/HliVE5RaNnQ29bL2WBWWVZKSlpeU1bpz9Te d1NIRUVNWejF20I5QuC/uLe7001IPjc2OVe+ucxNRenI09fN2lZJTlxXUHzJwsbIz+9l bet3XWXi1trazcjK3nHb0VA3ND7bt62uzzovMz1Xwra4w9fuTTYzSMO5y1lFRVRrWUA6 PU3t3ldDa7++ys3UVEVNW1RO+c3aev/v+XleYM6+yEYxOmzFtq63fDwxLy83T+PJt7S/ aGDJvsPQ6F5NVu7tW01Z0bu+UUP22WZz1+tJSGhdTfzNzNDZYEpIQDpGxre90+tWQ1fW xb7DzeVdTz84OD9r2ndUVvHb5uXf5uPNwstjTVbdy31GPzw/TF5sT2/I9j9IW2Xu1MW/ vsZjQlHZ29fCy21fWl1bb8/DvLa0wF5FQkA/PT1JWWBra3Piyru0ucPRzcPDyu5KOzQ3 PTc8Vl5dVENDSU1R4Lmxvko4Pz088bu3vMjU+lZFODg9Rk1LTmDszcDAw8nDure5vMbR z9doSkBASHnX1Nbr1NNWTvz5WUY8RVZ6fVz6v7z0U11AMzE3Ozw+SPPAu7q7wsjKxsDA y9njZUY7PEVW18C+v726trPDPi0tLztL47mwvPZNXO5TOzExNDAqLmDAva+oqa2zvsjZ PyomKC06Wc27trGuqaatxVY+OT5GRlHf/DwvLTbXtLrpPzQwLS9Gu6inra6vt8VoQD9G MScsMzdC+sCvqa23sKurrbTG9043KiQjISMqMz5KTEprvauhnp+kq8stIyQqLzhN81Q7 NEPAuMDIwrOnpKenp7DiQzs2MCceHSAjJy4+1q6gnZ2eprbTUzkvLS0vOzktJyguOkXW qZqXmqGx4z4zNDtALx8dJzvowMDDvcpKV76zsbO4u7S2w91KMCkrNFO+s7GwtMpbfM92 Pi8qLUW+q6SmrMstHRofK027raiptkYrLTlD/cC8tq2ttLe5zU0uHxweJC1GwrOrqq2z t7/X3c7AsLBGHxwqxaajt0UuJB4n16mhp8JMSkY8PUVDSs28xcx8PD7At2I6Ly3Wo52h p622y004LyQdHSZNu7O0trjXPUqtoK08KS5FQzb5o5qarSkgPM3oOScgICY2zLe+zcCt p7s4N8OqqnYjHiYoKVuhmqOwqaSkqk8dFBcjPci3w1v2ua2tvl7LuzQdHiMgNJ+Upka/ o6OgqTcZFSPLuzghLaqZpC0aLqqenZ27JBgSH6SfNB5DoJeVpDMeIzjZ1D0u36aqPh4h v6GhnaM9HBEcpJw/HSqtmZejaSAZOKaxJhxZnZrGIB8kJkOhkpo0FSegm7krHiu3oKFW GB24sTQ7vrCwtr49IRsdMLOZmugkLMOdlbEkNrHNOy4jICZZnp0vHGukq8DDvjQaGjS7 zTst352Xmp+rMR0tNx4aLaadsVtKPVmwpqexTyYZFzmkyiYurZqSms0sNGs+JChAzqOa vB4pQCQnu5iXaRQknKc4MSM+nKBP3tkxKihGt8q4rVbttioXHT2kmt4kua4nxp7X27Mq Hs+sLhceqpqwLyFUmKEhNqfILBsVs5L2HVOjmpStHCyraBsVaZu8TONZpK4dMKCgvC0U F6ekHjupyp+aUMibvxUVxptTGjGnnKwbGbe0Nto3MJumFyOcnbtGHDCaoCEVPZquHC2p qLc3LLOzKigkHaiO0Rm0nreqPiStvBcVwJp2GjianzAhOKee60M3GDqkJyCckkImtqSb qxcSzaBXGy2dpjc9Sb+r+T0rK6akJBjAkbwqqbm+rSYhqqMrGUybuB4rs6asWR0dTszm 4j2mlzEnnZ5GJhgcp5ssG8Kcth8wsL+vwBwvsS03dCiujq4dqZ07ayobt7kaI6ee+h8/ n52+HSGnv0OkQxfGnC8pnZ0uI2Cup8YfG1ufvB0rnZ8kL7AoRpjeI7GhsDEaS5tWJL/O /LAtI6qnJCOqqC45PiemlS4grEUunK8cu50jHqapOCoeJ6usNDZLt6EzGqmXNGWgJCaf uR4sqp9OJ8u3S0AsKb+xOy7bobQeXptXw6gdNpi+MbwtKqfDIc2fPB05vLO8Qyw0rLMs QK2mvilUsEbDqjgk1qpKGi6j0yzK3E6uyDdc1sg5I7CfJjSmP7aZMCGtRi6pOR2xuR5F o846PCzOp/b55jG0qiQnn6orsbEh96FGKP+uqkUny74tOUIt8b/Wz0mppyHZmjtKqiE2 m/AurEUqqcIjv6onJ+tczcMtMb7KvMYzuKE2Jr79L7e3N1utrFEqea1DLls+Rcg2M846 /b4qrZ0jPao3ya0pK7POTa3IPqy0LMumYC07Nka7Ri5T7LbOJ7uhOEmuODuvvjE7rK5F SNPO2l8+Q7/bTL88bqwhLaAzMLcjRqBKQ7NCSq3TOLe2Lzzm2bN3MGLf+rZUKrqtJi+0 PUitcE3AxrdIKcm3MD7TPsqxP/awSr65LLCsHUazK7u2I06wPMuuOEqvRS+4uUNZPDi2 vkB5V0qv2Se5qjPxsTRTtE1FSVa0by3swEbb0zjItkLWzTu6WSitszG64zOvtDp86TFe yjA+uEUxzc3NtF07ytdW0zs8r1wqw8U6u7g/38LT2ThCuPc70+tRueA4y2U6zTtArT0x sVlWrkA0vOVGveA+vsI71rNtV3Q+27pWT9tTxrw4cKxiRbtNO8prQkxWv8o+aMZd79NC dL9GV9NAxukvubc4xt40xckzRWU2TshFW7dtQsjQ7MVNPd7xY91ASrtWN8jPRcnQQvTW 4uVCaLz5Xcn5/L9gQs10Tc1GX7c9Prpe7LtDQMhiSspxRcjLSM28aGl2RuDDYlzmX8zN O2i7SUnLRkPOXklcXszPTd7FfN/TSl/KU2DQV8/bPsW/Qt32Ps3OPlPvQ2nKU3G+b07N 6GzXSED5a1vtTF7AUz/N/UjO90nb3fFzTPPTU2DeU27WSE3bTFv5TcjRQ83OWcxvQt7P W9fIfNvGZmjI9k9dT2XRZlnf7NTLTWi/Y0jlUEjeaVbm1sbLfNfNc3nvUffRVl7iXNpp Q8zQTdtoTNDlRl7sVHnUXmnQVkNeWlvjVk7Z1+vZaGbJZj/w5k3o/Un923n5Xn3P717t aW3Tb1bX5XrbXeDLSk/bT2beSFDaYlvbdlvceU76+U5XU0zf1Gjo1OPP5Urizk5e2mLf yun0397T9Ffr4mnxaFHf11zl3PTRX1PM9FHeW1PZ9E5l8Wjg2Wnp0XFp4n3l2lpe2/N0 /Flw11dR3m1c3mhX3u5jaFRc81tTbHTr2XBp325pblTj3E1p3l7xfU5f6WZr/V1t3GJR /HlbbmBe2+BbYnd35V5X1ule1+Je5uNfdOvm32tb8ejt3O3uz9f37mVgek5W3Gxr3F9e 2m1PYGJm2+Ve8dpzdOb03tb57u1w2t1cZt5238p2XtPjbd90W2NbXv9lXWxjfN5gV2lX V15OXPdXa93/6OBeY+lrXndmXfftYmh6YGt9aPDe+ubxWfPfZfDlWffO5vzlX17uemVg W2n0bXn6YGh6W1xjW25lXt/mfeD/bN/pZnbzcO/f8O3b4/br7O3e4Obb4NvN2/He7nnZ 6F3x4vDe7V1cWVdpYlv88W33a1RZWlFbXV/l+WvraFxrV1RzbFpv/V9pemJl8XNmfGtl emZt6Glz2dze2flj4952931m9u9zb11b9ujs3N7373BZXl1ZZWZ33OXu6G9o9nRm8+Pt 3tvr6OV2a3pzef9jaPpoduhpaO18+t7vZm1paXliWl5baetwYHxwYGhcU15pY21x+uDo 69/l4+L/bfbt+e/r6Nzb5ejf6H1xcevd5ube9P/2YGBsW172d272bmNxcHrtcGnp7XBp W158Zlxodu3za3RvXF9iW2j6+v99d3b6b19ja2NcW1tobmBs7/z68WZdYllWYF9iffHt 4+l8eXF919DW3Ovv9GZld2hlefDc1t3e5XR8/2JfdOjZ09rd2t7p7vFzdG1g8dzvfPRp aPl6Y2NbXPn/aPTl6eXtcGliW2BpZmtpbuz6ZmtjXF9dXnnv7fliX2tocPb3+ube5e3w a1xgbffm7nb8dGNlWlBUWlpiZlxcW1liZltWWWNpaW9xaGh3bGvl3ubc197e2d/m4uDj 6ebd1M7N0NDQ1Nvd3+Db3nPt3Xp603c79sY+W8ZFT8hQReVZPmBmQl/oUXTdb3Dg6Gz6 +nre3nF93W5Z6exXadZWSPDrXnN6be1bY9tQSMviRtbdRVbDTTPJyj7TvWbovtlW4uVN YN75XmbPel7N2VPlxXBlyNpR189b+dlib+np2fpRWuhXS3HeQzm+wzRpyj9K60o+a833 PjrNvubKxenv3XBf61lCys0+0L5IVLhzPrvDQM27S0zFbD5o10hN1t5x7+vj4mj3xu49 0clJZvpOUelrSG7KucNKRkVs4E1z4lbm399vSdHbPl2+WUW5uk0/xbk7SrZjN8a/PFzD RTtuTDhFVkhD3LvWzbvKxs1rY1FOTTsxPubm9+LX1MvCyd3cUEhWNjvZUzvNvlPpwLy8 Udu7SszRIGajLTedqE6vqko/QC0nJik5W9++p6Oop63AzdY3KywtPE1du7e9rbT0VEY/ NC88XkpI2/FCOD35Rj7CXzOqsx5Tpysrp1sbsJpLyp2ov7dDKCccGixAPbegoKCgqsg3 LCoqOu/Irqept+lbPSonOenGsKiqzTpDLSNDUCbCoTAuq+Ymt502HU9AITuttjf/nZim vrOxPh4ZHCctQKiamqGzzT4nIShWr6qno6bJMCcjJC/FqaqoqjYnUSQdsaZgw7AjF9qn SM2htzAqOFEnGi22dEWmmJWaLhRTpycaO6imtkUt67FKLULJ0OXNxbGnrUY7yUYsZc07 sacxN7B3LbOnJx5NOSy9rsBfSq2dtjNtcyEZGSCqlcwjtpqqNz/QwMU/SCkaNp+aprRf LiomITSumpuz1+UnI1lO36OfPiezuS5lvm7DvM5TIxgsyGu+oZ2griQPJqe7KS0+OE7T 7bG336zOHRk4rqemqru/aCYZH7GkKCijmJ23Ix2voyQdw6Omrj4nNsWmo7y7uDYdGR48 oJe2Pr+0dEJgUUU/MEtAIDajncIqJjM/Ni5Up5qgNyC/pzEaH8adnEIksKFMIyRAraSp uzYbHeuknpugveYnEhvIp6q4PCM5y1fAtK6hwx0XK7anrb23tFcjGCC7nbop0aGnRh8h wqY5IFaoo64+Li875aaZrSgdHSRZsK2cmsMkIS3UpqZKN81UHBU0n5KZRRkpvjQeQKaZ m00XHa+rLyzZqqdDHTifoG0vLT/Cvs7FbSQqt6mtrbpUTzQkLtC6uLfRO0bRaUPRnZ42 Fxc6n5ixNMOxMx0aLqGVsSAxsb1AaNErLFu9pKDWLEjRLSZCrZypLRofN83Fu6mnziok L82pretGUG0mGlCblKQrFyC7wjvAoZ2rKhcjqqDCNzhPOmumtDAjKc6jp0BQr9QpIDem mp/DNDk3KjfDraCoIxU4n5mmKiyp2xoVMKSVnS0cNP1CNluqn7ggHkOxqrvPMB07qqGp YCcqcT0q46ahuCcdJ9Gz1LejrTchIS+nlbQeGi+prD7pn5vCIBkmraTAWWjF3jYw3qat v1AaG9eclKMkEiOtp9RGvKTKHRcrp5ieTSQ4NyEttqCdrx4UP56dviczvkUdH8qemaos Jjdd4z5TrqfcIypUxp6ePBoZPp2Uni4eOt5AMV2gmaspGSDbpqy7sbc8JDTWTr63c83A OyEqsZ2jTR4fRcNKQ8KwsNEtITmrqsLQLB1Mo5ywJxomr6TGQ26+xi4hN62fp2MtNjct Q6+mrkAz2dA7MT+6n6Q0HCq7pKPUNOLaNy8zd6qhuysuPkinoUUuJBpInZqnTB8cOb7g t63ZPS0jLcqtoKDWIR43s7Tu07a0eSkeO6CZqTcgJFfGU82trLpFKCnbprD9SSowtrHT rcMfHC3CoJuwNjc7NnO6vLO4STAmJmCnobc3NlZLOzxpr5+wHBIsppebNxUmv0ssOMWj nkYbJNOknLMjIzs02Z+erVchHC+3q6mwSTAzMEO7q6OsPiQqzq7D3L631y8jK66Uni4Y HdSbnl8v175KLydCo6DWKh0qraCwwEYjITfPqqGovCMUJq2bm78dHUxILVSwpKY2HCRN tq25zMVUHB62m5quIRgqu7G+vbu2vi0kTa6goz8eJzZip52tQCYfLmW/m5s/Gxw2pJmt N2bNNy0tT6ejvzgsME3i16ie4x4bKrCdn7MfFC+nnac+IzHQMR84q5+jYx4ZKbGenrM4 Pi4dPaGboFsdGj2ut7uxucA+Ji/Iqae3UT40JC2tnKHbIR4wRauatiQgMLegqT4+sMgt JypToJqxLB4kS7C9sKDZHhwrtJ2etiEUJK2epOsmKuA7IzHFrKGtLRoh1qOdrlNTIx3F np6xLB0qub5ctKmstjceJ7yenrMzKi4kN6ecpE0dHTTGoJraHyA4sJ6sPGC2/zYtKGaf nsonHyfbvr6jrS0gKeanprrZKhcnraOrwD4+QyMbMKygpLcqGiTRp56n2jcdHcadnLAt HS2900XNsaqsQB4jyqOgsTs3NCEvrJ2mSiEgPuC4mqQrIS1UrarGu6zvJyYrT6GbrzEj IzfLsJ+nMx4mTq2ms7k0FSaqqMrxacnfIxcqraGktjEgJj65pKCuXScZL6Odrdw3Mz4x MMCfoK5WJCA8sKenukktISzIqKGvOSYqMGCdnzAmQk18w8uwobMoHiMxsJ6nXSojJDjM pJixIB0u0bC2yKa7FxjasbepsOk3HhcqrZ6csy0pLC3gpJ6hyRsdt6jT07q7zS4gOKeg p7Y+Ki1OuKqsxk0tIUKwrK3AOC47LSynl78rNi83vrezo6o0HRsssKOntE4pICM7oJrN JzNIQEhTvKCkIxEqs7axsMVTKBgey6Sdrjs3NikzuKikozwcQLZZxq7FVjwqMbqppq1b NzlGy6+tuHokINOqu8O/3Es2JyevlKomJztNxrqxpKozHB09r6+0sdAxKCYxpp3xN1cz LkPitqSvHRdirsK7r7ZFIBkmuaCuU9C/Py03zrGqrDAjxqq+03FASk87Y62kqWUvOUhW wrCurs8jIFnWdK+u30YzKC2xmrEpN/NJQ9uupK0tGyzD20/DsbxJLSgxrqZPNk1L68pd c7u2JxU0pLPbubRXKh8jeaqzzbC3My1fv7+5sUYn6aexzO9RQDQtQ6ecrWLW0TkuPcav rL4vNs1FSL5pQsbNPDe6n9seLsDaTcOuq7cqHj7XNE2ts1s6NjdGs6tKLT1r4NzRvqpQ FyivXkqxrL1MKCQrLdCstLa0zs/LOzzGvzMptJ2zS+jQPS8wSq2kuMOuyTE6buPZyNE8 Pr2321NFPkJFNladoSovxT4tQ8Osp7tTNy40O1bL6Ga+yzY0vKg7Hz+61mjIrLQgJsgv Lcazs8BZNjsqJNCzQEmwsLzGxc7tTyEnqqvPtK2+SjQsM1q7rK6wtNZ56T0xUMxNL12o qdA+XVowJ02gvTGxrjsuVsnIwsm2byg9wDwtTs3ebWjgqKosKls7M1rLr6owQLEkIc3o QNTb9sM3LMi4NzjOz7e0xr6zPiFewzfer6221FFURTfGrtp5s7HD7F5jbj4nNre7xb67 xkUuLMbGL7ynbkXGy0tMS9e+Oi7At0VDRTpAPjm+pvw+vmIwNj5mtDcxoWwcyq0uM8pK Tkg2267fO8ZbRbvCybCq7zq+WitFy8nUxraz0UbGtE0xbcDIv8LAvlctOFdKUXy3vFtC RbRAJLCtLUuqu1DK1H1gKirKWT64zkbjUzBUtFZltMpKQkJZ2igtodYhwqlGPs45NDsx T7fZz69eZcJCSre3N9GjQCy5xTM7083L08WqrUlN0Tk+1ubZub4/Wd07QFvl0W9Nyqs4 KqrAJlGxfM+wv8DcLjlNLULNSNe/TT+xzSu9rzk+yV1K2ic4piohprAwt605O0MrM1k+ 0bPUt7PszLFrLbOsKj6scDRbY03m5ruqtMWxy0BdSDlP2UVKvPNIz9NrUFNNbrtCO63M LOa9PFS0xs29U0VXMzZLO0jXVFOuvi/Frzc00FZfdCjWrx8tqTosqr42wNMtRWUqUMBD wrTLs67gP7O2KEqrRji90z1oz9O5trett8nGVD9TRSxDu0VDsbTjz9dUtkwqrbgm3rAu P69sYK/0U7c9MXkzLkY3Mb+wNtmgbS6+wzQnX7kqL7tDKtu7OVO7Vj5c10gvVsJNRbuu v7jGyK5DL7t5K/m9PlC6692xxr6sv8q84FvcPihIwy04rcVQvrq3VjO5wi7prUA7sd89 xsZDQ8vbP0Bj7jszSFrfQ0uuwFS6P0C7LzO0SyfCuylLuzc/0z9IysZNXrjRT9vAu3FN rLgzyLgxOb5GOMbO8L62uMLDur5UStRtQDc/0Twxxds8rr4vtLcs460zPqxiQrjPVsNo Nl3XND3MTEvfVsnNOba8J7ysJ0WqLSytQynObjFOQjd3OjbZX3S+xrevvrvLT75pMNnT LEa3Nzy33k28vc2xsNHDt1tG+lBKRUXJZjS0sSrNpjNAplwzq7c9xr5U2VdAzVA5U2ZC Sm5UT8q4Qy26wiRaqzM2quIwym4wPzcpRT0s38ZAwrbltrZet7svyK8oP60uLa5XLb3A RsO+2rbNfbbGaMPIVnH0SDtM0+A4cLM9Q63MPrOxY8C888jcOu9WLk3iPu/MW7/O3sI2 SLc2L7PQML+2RkJgSjguNFE2NtRiScbI39DOvL5IU7DeMLe+LFe7NzvNUV7QW82328Cu z/m97UZrRkprN8q0Lt2qOTes1za6ueXDwszARkDKPjPeXDrt20/t3j/NyTTKwDfcvTdI vjc3zzoz2zw43EBDw2JQt8j5u8PC1zy4xS3rsTc2tuA+0dZT2XrRu3TZs89PwtxFbV4+ T2lAYu3ovtPXt8JZvbxNXM5bVmVP6GVDVvNFSP/r3kBfrkg7tOsz08wxT9Q8Q+xCS0w3 a/M3XrtKVrnZV8LT4rfeV8NUSPM8PclLPcLGc7/A0cDe1r70VsXbUFtLa/8zUco8Zrhv +a2+Yru8TWveZndDSs1NNGL9OUneT9fFVsW9X1duWVdCO+V0PUzoUUpIUHlFQPbtWeVo 69FR0cBJ0bhRULtZPcxtPnbQbt3t1LzQ/LvAZsnFXu3WS+nWRVva8/lRVsLNWsa7xcPI yshlTfFNPldXQ1ZNTNlCScZIRcDdP8LKQPzTQENZS15DN0tGMUBjP1HF3t2+b/zNS0pO Xdv8Tc29ZV3X8e1vV8bD3r24yL67zM/oW8xfRs7uQNbRP+vMTGzJ7e3XbNDbVs/PSFTP V1HxUFffSU35eWtbWdDPYObgW2lQS11IQ2lUQFNmTllaV95XVs5TTsrjTM3NUN/USVBr W2b9a8jKWdHDefzI5d7Nfe3N43dietloUN3Nd/ba6d5sWeBpU+PXcODN7+58Vt5eU+NO PmBxP1nebfbK4ujdaGhmRlnfS0t8YlBoV1HmYlv24+D/aNTQXu3OZmJvV/NlXtrU7+jP 427tbXxpVN75Ys7Ibs/GfXrWfFRsbGBlXPnRXX3I4N7IeV3XW095W2b//Pf2WVbiVkxo Y2BjT+bpUW1mW0xcV0hUTFFrU+XdX+3MUU5vVElda2jr6dnP7uDI9lbb7F7e8HPN3vnF 6Ela29PW/GLFu9Rt2sLMUFNiU2xTSmXW2/HW1MXNY+jO/FfoVFfxYE1gY2xuVlTrWUb9 c1vvZlDebUpsXktl4O9XTlfb4EpJc9/bT0rKvmkzNM6+eU13z7/DOj3KYj1cWUjI0UjZ t83izM/PzGVZ5ltWY2nUxtvQwNHe31lMWtTX3uPi09leSk13bVFMW720UDRettYtLEm3 tuVju7C+TjM2Pz0zNELmy83Fu76/wv1XYko+SExT3s3Fv8blQjs9Ozo9UN7O1m1r5d9U N0a+vlw9XK2max8nwLzw1tGrnKo+StBQPi0kN77PZr+zrq/Ab9HJWzo7TnTa0ci2umlF Tkw+ODlGfVA6PE/WeTg3X8ZoMTnKyj9F7tfCwuXau8VNP0Y9QllfzbS6v7S3w9FlSm7N 3N+/tri+xenrz3FNWVtLTUxFUfx5dE9AU+1NMzbexddIJibKtExQwLGprE4tRXEuJCg3 6LnC6LSotFtGRk5mRTvcrbHMv7TCY0ZDWW5GPuzC4ElO0b3aPj/cxkAtPtuzpD4aOajJ PE7jq528JzS+6DQtNNStwD3erbZaPk7At89Ic7O0SjrZv+5NV9nGaTQ82vY+O2zAxU82 RsJZNj0mQpqxGiqotMbZNLucsyEnUz43LifNoLNCy7G77S8q+rPUSM6rp7dFQHpaNzNT ubdjSMq8YjY3YL7aMzvMdL2wJiCjmUgdJkqutCoxoZmtQzxI01EdG96vSD/NsKOtLy29 vDstPbuquk/evmM0M06+yUhZvLxiNjTlvkxCSDS6oTsbQKOjtywfyKFLI0aqoKffN76t PSEqPUpCMz6wprrovrbGRjQ8cV9K17e73Ulaxtw6OmjIzUA0W9rgvjskzaHOJCY3vadt JmamvDYwN9mv0zbKqrlgW13czTsqPdZRQF7Ju77i2b7OSkvavr75U8a63UA+67vMTk0+ fKzZIzCvq8I7KECtvi02u662aDFDvN03QODNwttfva67ellNPTEsLz5CP/S6tr7f3729 W0XtxsDbRmLG08V6LEKtzSopO82w2y5Tr8I8NDhsuMo9W7zFVkVT3tdOQF7GwsnFu77d TUxZSzk3RfDbb+W/usLW5cq9yuvsT962aS5LtrjxOC5NvlAvQ8W+y045T8ZePlnb23FR Xsy/zW9v12JCTvP8Yltb3tZWQ0pRSD5I4sC+zcy+wMPAUz7CtFk3QuW8uk43b8ZNNzhN yr73StPGa0pN89RiQjxG29Rrw7TDzcXe69tLP1tlQ0ZXW2hXP0Lj1PrW3m27tFtGwLS6 0EI93stDN07WznxFQ/3WUEVUd2JIRWbZzdFRSuZIMU3QT+K+18q23UjJy0VIWU3020ND 4mhd01FOtLDdfcm/tLZzTsnJUUZKaMrKXlvicExFRlddRkVKVNncXM+/Y0veZkhUTUZ5 31Be1NTZ7l7m12BXXkVFfUo2RtnU2f9U1rm+3s2+vcPjUGbT3lZNbnpsTEre1tZpSFx5 Pz7xdEzf2e3DzVHxxUg0Q0lfvshU073Ivsg8PtxONz5AQtfKZte/0/fIydPK1mjOv8ru dHTXylBFWfTZ713d1FFNYlNOV0NG5W1I7L7R9MZKJyg+zq2pvN+6vlk4JB4xxcXO22i9 qcYwM0jGrrlGSLu702M5XrOwvtTUUz07O0jcytvo2XBMRkZDPkhrXVe0qbgxGxw7ppum YkyurD0cFSOtna42NLiovCofO6merjw3zK28Ni1ItrDD6PfW00g3RdbXYldUa9bwSUVu 4zYsN9Okn7ssGRUuoJytyM+sqi0UFzejmrYqNLOwPiEmwpyd1yw5uq3UMTfOs7n/Tc65 ykU7RWjvTz5P0NtDU7m51y4dKc+omqE+JyQaIcCno5uhzzcmGR7ttK2juz5IMycx16+n re43Q3390dbrxb7T4NnTzddURlFmW+LDUDM3SrGnwjggGjemqaqfuy0qGxUuqJuYoUAr QCoaKL2mmqEtIzE6X9fDrqm7My5W0cDNTs64y1lQ883USDBDu7vNOyo64rChsTAtLSA0 rLOtmqcxHRIbt5qdvsmxbicXF0+dmKQ3Jz9ZNCzto5+vRi1FyEg4ebiwykJIu6zbMDFN tLNoOyswwLS/qqo8KzMfHtajl5lFFRhbprc/RbGdtBsSIL+bozM0t7suHS22oKNKM8XT OzdKtKrKLS67qrk+KzrRs63iO1EzKPywu6mg1iwdGL6SvR9OqaapShoqnaA0JiM6qrM2 NrOsRS8zSK+xTErT1Eg6TcKsuTMnNsKvvFwvLe+0vbOvQy08KSTeqpyaWhobMcy72c6m maQoFSB6qr4tT6aqPCAqzbC8Nj+qqto8PM3DUDpirbBXMC1A1Lau0EU9LTTAtMqzrE0q Hh6rlVodYqq/zskx15yvKykjJEq7vr2qreU/LSg6wL3Fu7u7z0lN6M5KN3S3t/Y7NjnT ucW3tz4sNjQtXbSmoNwfFyqktCdLpJ2fNhkxtM8qJu6stFE+vrbeTT5CUG/MtLO+vcZX Q1fFw082TcK+yFpFVEI717rR1sBTNiorrbw9qlcgyKTZOEq2o7weGD68NzDQo57KN1fe SDM708Nty7G838vCSjQ/z8NQO0BlyMrNvu84O0g3Ocuzqr8bJK1FO6u4zaezRkMmJLSu JinFrro8TaanYDRQ9E0+W6++bbuz7z7Xwl0vM2zTYlR93lBC08BfSO1pOyots65CW/o/ ybS/9NuwrvwuIypePy5frq22xua6sVc4T2tmRWbCv9rNu9Zg5sX2NzA8bU9Wv7tOPVdP QEzRuMIvKlHsZe3g1LerwlfpUNmzPyQ4YEY4Nsyqs86/s7vPXtbTPD1QT07Zv7vPVs3L Xj4zNjo3VL/NbNbpQjcxV66+fEM56GBDSlC5rb66xUDMuz40Q1DrTTFNt8j3vbCuvMi2 vPZdUTw4P3bXTUvzzeVTb95MO01rS0lX8eI0L0hLt7xDzcxbWjQ40eK8sOPbsb5bWk32 ykA4fWNIUVPZ2VbbwMjLvL3KW07pbEU+RU1JSOnM+mbiY0Y/QM7TT143VL5o6c3mu8ZC 61pCurhQ273Gv95FyLxRVttmZUpDY1ZDUP9g5sW5u8vTy8vvXmhcRkBKSD9GVl5NNz9L UMBeQONw7ew8VslW1MNP27fRbOJazcJJUcZ5T2hbbGNMX95j+c3X7/Tp3ddoZtv9es7J 3Hfz81Q+PmbXUWVIQsz2TWtX18NUY99NzbrsbcPFyc9U7b7pUOnza1dFTldFRltUVt7F v8rRzcjXZXPpW0hPVEpMVl5pSD9iXtvPS1nwXlxCPvpcZb7PXsK/3Nf8Y8jfP1nsTVpm XdvuV+bU5dDO299zd+PuXGj2a3bj1tn09HRQSEhWfU9ZVErZbUlfUGDKXl/KXmW+0GLI y/TWV0nN4EVefU9bV1vNzvrKyvHOyczL1vbZ4lReZU5MTVBbVFFt4GlFSmJveVvuztPZ dk5w8F/Ky1p02mBPTkr51k1bztbRzdTKzOLeztfWzeNgVE9QVFRWZmNdYF1KRUlAP09R U9nUb25bYGBJSVZXdnBc91lX0dDr1snN0eJ9xsLZzcbMztvo1tlr8dt26dtoWmNKRmle V+ZuTvbaUFFgRktZP0n2a2ZjZd3O1NPNyMbNw8Xi89zmdHH80cbZ3sXPW192UVFoV1t6 UEpeWUxcTkNPQjhCTUhicEv06UvfztTDyNx3cXBLSk1N98LTReLAzcbG17qx4F/bTvpj LTf9OC9CTXbNfM2wvd3I19TF8+m9ylxWRkbpw1sqL9/WV/y+p56xUMbOOC4nJkJbNlm9 w8roRkJQSWXFzr+tsMrK20Zcy9YwHi+3w/S3qp+jSC5dPycmKT7MSNGhqj09QC4vIySx q++6rLCucCzIvCEcSLGwp6qmmq0rLS4kKCYnraHNwKmepCoaMT8pJzerna18t6m6LBUb SC8tsKGbl61a2SwdISAwrK+0pLhoqq4kHSstO0A2rpudnakgHfc7K77D9rmttG1ANj5G LixrtM9FPkC3nbQ2xtMqLCcwnqkgJ62fobQmPqOzMR4aKqmvRbmmoK0tHyckJLejxr6+ OrOZsx0aSqyovSpZo6wzKS82wEgePrNdwqzKwMYgK6GnLh0upqYuIN2flZS7I0/CKBsV HrScoaSqOTbcKyZPLyB6mp1pPzcmNFZtqZmetrvbW1shFSFev7bIaa6xKiFgrrs4L6qh NiEgHDmgnqahoZ6oLhoXFySwn6SmrdO7rzMVFTO7sJ2kNyEeHTCjob2+tKOg0R8VHd6n t/m7scg7M0hAJzCqmJWoJxcjvLczJ9GgmpurLhUaP7m67isttJ2qKx0gKcars76+0c2t sd4wJD6ro7QvHzOtq0IpNsatud29cC0mHyuxo62ooaGfxh8XHCbepLfGrbG+u18fFye3 qq2oVyMmJyfPo7C4qq6nry0aHTexqNc9w7DNOzQ7PDjCq66sdyEqt7lGMSvKnZurTCMa Qq3bQzwuSKeevikvOSQ0vsOrnapjv980Nyko6bPLc/fiuM0tKV62u8W0vzEnJii+mp25 u7axrjYYFR87p527acxNWb9DHya3qkg7aDNIrbtmtLPltLDc4jghLMWzttYxPbu7TUDW 2S0nS8itnrQzXr5IQz40vqe8790uML19NElCOL+gpjwgKiorsJ6op6k7LV4wKTEqN62p w8jwRu1AKje5p7M+SE4pLVTDp5qmTXf0T2wtGyRL36qhyk/sOz3LUDM71rc+MO7iwKmm u73FLTFeTlRpNDG7sb7KPzduxkZCzr1eLDZDW6ymr62kuzEoIS+7s9PXTzHXtN5jTTM7 v620Uzg9KilAyKqdnam3XiMdIClTrbZe3s2+tuYtKjtFQsakrT0tJiA2r6Sem6GvSh0V HjBOr7HXuK22tsYrHR8uxq+ko9AuJyMjTqadmp2qXycaHC1P08PAsaemtE0xKR8fV6qg mqQ/JCEeIEinmpeaql8mGiE0N0vLxbGkpK1XKiQeI2KroJ2kZiMdHR8xs52Zm6e+RS0m IR8jN8CwrKSjwDcoHibNqaagqUokHRsfMemrnZ6hpKzPOyMZGSA/s6SdpMoxJiY3u6qm qLo+Jh4dKvezp6mur66zy1NFNiYnTMCup70zKCYmTqefnZ2sOyMdHSs+abOko6Sktjom IyYxvKajpLBDJB0dITbIp5+gqbx3NCcjICQtaLCmnZ2myjAhHipQvqmnukotJiv6uq6s vltDOzE2OzpNzbe3xchaPUNfy7etq63AOSYfHyExuqGcnaGqt0skHBsdIzuxn5mapHkn HRsn2aednKbCOCQhKi45Y9bGt62srq+xvdlTMyQfHyErOdSonpydoLA4IxwdJjTtsaSk qrTITjAsKCYuP8atpKOruEYqKSotN1nawq2ts75QNCwtMTRGzbOqpqewvkstKicrNkPj vrCvt77Nv7GwtsxILSMgJjbGpJ+ktkAnISY5wqimqq2/RjAqJiYuQMCqpqass849LSQk JixDtJ+dnqOz3zAjHSAtPcrNW13Rs6yop629OyQbHCY+saCdo7FZLCorLT/NsaifpLxG JyAjNr6up63XSzs9PW5sNz42N/++sLOz1DY3N+Cvq7BPLycjK02wpJ2gtlMuJiY09rGk tPxGMTvzu89PZTs7RUxKN1ZUaLOwscNXMSYzRbqkpKpxLiYmT7iqrdo9M1fDt6yuwzwo ICE3sKm95jYt87Ckn7A4Ix0eQKymo6/ZVkpKMyckIy7FoZyeqj8mISQ5xq2nqbBRMSov 17evvkg0Ki0/saCu9y8mQ6ieo7gqGRgjxqafoK1DKSohJzQ5v6adnaOuNiYfJjnFpKam r1QxJyov3rCwrt83LzZe2rCn2SkfH1SgmqBPHRcjxqGdo740KiopJzfbsZ+dpLY8Ixwj KkutpJ+nuEInKS1Qv7CqtrdjLy0sPNq8vLrTJxwnt5qVoS4XG+6gnawqGRw0vq+9RsWr qq1cJx8mO7+no6evuUwtJio9v6aqtNBIQjtAOUjDubPLU81DIB/wnZekLRUhr5ujMxUV M6OXn0seIXSxaSssRq2dnbBCLSQpNjNJs6Sgp8MvJC1C0MXCyMm7czctQ7BFHSunmqs4 Hy2rnLAgFSGvmJnWGhUmrpykPi67p6rgJBwpyaqmq7e9s8ozJCY3w6eoumU7OjtFQDhW tKRvGiCtnbtIO0CsqCwXIcCcmt8aFzefl6QzGyiqpFQmJ1mknKo7LjhAb0AtP7iqqbZW Li09V8rA0VNWvbQzGCGjl7QzLzC5ozcaOKOhyiMZOZ2ZwB4YKqeVoCwg26akxSQeQK6t ucvZyLbPOjQ2P9u3s7/pPjQ71LgzGyigkrcfLb2npDcVJ6OnLyAqtJqtHxc2oZejLRgr qaRKJjG+oaHQLzE8QE9ZT863ubzKTzQuN0jOrb8hHsOXnCcY25qhOxoduZrCGyarob4n HD+dmsAfHTqomq0sLb6psVQnK8mxvdbZ0MbGTDc8Pj9lyL6zOxsnwKGcxRohn5o3GijN p59CGjaqtjcqMLSaqSoeN6acqjQgM66mvDc35rSu4jg5TvxjU0NNzMDZ084mHU7Gtp6r LCBAr6FfFCGmo2AqIC2jnzQmxaq34ywnvp6oRikr06OjXSs6wK7KPDNNv7/LaGnpaMN3 ISa+9D+fnc4+IyHApPEkKD2koS4eN8awp0sfWaGuNy9bsKbRKDDAp6a0NiQ+s7F0N0a+ scBMPl3eKSu9SS69nqdUVj4kKTu/p80jI8mkvS0jVqqxXD44RamjQyjXqbhJLz2rps46 MTN2q7E/MEW/vNs3I02zPz3FqbM7cbEzHUzAW7e+RkYnHs2gxSw7uKGwLDHDvruvcypN rLY9MW6vr1AvULu3vtM3LlNKYMIxMb2uquUxxboqI9m8P/2tu0M3Ki1GScanrz0/r6a8 MS7Cq8w/SkJGtrM+NMquuUwxS7O7Ri8sQMC20FHD6EPF9C4qSbfQQ82svjc5QikkP+6/ rrvCw0hDs6n5LkO2rmYtPNbd1MhIO8W09zc+3sjzNjbRt7G3UDFG3j1Rxkv8t7PKNjtu OScz6+Xusae512tJ4MbDs7BUMG22zTcvVLnDW2NdUcW9QjRM2dBKPW2+vH08OUbivtk+ em069/EzMEjJz03UrrpT+dFDNmbCubTA0elCO86x9DNAy8BdOkLa1G3cTjvOvlxKUOW9 ykhP18rGYDg3RnNRX85bdrq20Ex6zV8+fLzFyra33VdAPk9NVtl3NzTjyk08Pdy903zi 9nTN8z1N19HXVE3t0F8/OThK08xt88jbz77eT27AvMvOu7trSFdGN0jt6czfVm5NPGXA eUBey8DKTUZtXVniXkr2zW5MSVHl/0lFXs7Dye9UdMjO1r/Jzry6yk5IWUg5RdveedHL WkI+PkxXVu3KXj/aw1lMTlfIxmv3d0108UBGef3xUUZr2d75XWPPv73CzcLI3snWTUhc 3vdW+tFdRk9aSk3s19Ti/XFlXFrRxlFNzs3XfUpR5mVr5VZg1G1UVk7t02Nd3tDIyNrl 3tDO6NncWXDbcElDSkxCQ2zjXlvzWkhGRU1aZvzZ401dzXlISk3rytvezd3m31BKZWh9 4mX0zM3b6/3ezMrP29DN6NzXYE5d3tz54s/mU1RZTE1ga3luYGVeVlF021ZK6dHX12xj 1Nng0N/oy9Zpc2Bm4nBaa+3a2nBfZv/c6+jT72/e4mNRVGVfVGbjfVdXTUJAQEVOVl5z 71dMfOVZV2D60NPs3d3x29xu4NDX09t3693ocF5p19bs9nN5evrd5vPc0M3P3d7bbFZX V09QVllcV1piYl5d6eVTT296dmtXbdvc297s3tn9Znr23tre3eDb0d1eXG9tYGJvaV5u 63NZV15lW1dsbWJr/W1eXF9la/1v+etXV29eVk9Z5dDU8MzNXdRwSOXx89li3dRv3eNR bcri6c3U4MvZdtBbS9RbVNNTcetGVFtUa3bg4950XtlOTe1PU1tozO1u2U7v7El0Vlpr W1tcYNzpcN1reeb3T13mXMj338Vb1PZp5UjtdFfTadfKW1/ZTV7eT97bafDrYFbN9N3T S7zaWcNKYm5GY3xj3ctr2l/W40rQT1flYN1N21Nj10PITUjDS99CRb5GRl7pZVTp3s9X 5c1x3U/e1j5rdEjT/UbZ2U/LzWLOvlvevF7RwO9T3lFAzkg811NO22VF1vc8zs48cdpf yEgsw7YvQrDPPL/DfblUUbTrNs/FO0pL9s1X6d6+z+23w77Cw7zKd1zMRT5ZPEVTTVZm a1TQUE3zS0ZI40lDvi84rzYxu80/wrxTs8A6ycI3OelANO5LN8BtSK+027etwL+328bO Q0J6PDFcST1uaOjK4k7PdjtTTUJb3iYpqMsm/are7cBrsLsrS7A6JkVwPkVI4K2zTaue ytSxt9ReXcrFN0K7zz5gvuVvYu/AUTlUzUBC38k4Hsa9NqpQLaGnJD6oMCdFLUDmJC2k vijApsC+wEqwuyZMq0o4u7bAvlzQsz0qadExP9do3k9Nv7nrXicntz9ar0DXvMrFST1g 7Csvxl82OMusvj1eqLA7Rr63vlzgp6xCW7daKyw8/1A9u6a2WcbCVFtQxesdIMJRN6fI VKTCUOy0PCRJMChG2TNIs7u0vjnWo74pUKi0dNvOuv8jKsxaL96pp7Te3sM6JDfT0D4f JL3KPKef66+qIyfiLys7MSa4oD9Kqr9Ktvos2b7euLpbt6C/KjxlNjE+vqOtXr6vQyMn PsvA6DAqWrnN26ypwrjJGhneLSmxUECnqGj9rTwn01At1q/WsZ2pubtRP1YuIDysr72v rrlOJyvzST6zxS893Gzr08K2vkUrHSFKQD6qp1e3ticwYi8sTdlZqZ63saO2PlA6JC9J Tcmzu6+mzC07TDg+cbOqTCdC6S1DtM5X11AxMzk/17GnvEh8Nh4sQydeqrernqa2rbwp LkgqLcu+v6iqxtpQNzc7LTexrcjCu9Q+JyrKzS9cwzNAtsPbtrHJ20UpIStTTtekpLin rTpGXDEzTlRNsKa9vrHMOz43LDRPXM/Dyb2zzjA0SD47Svy5zTA3w0s5vcU9RlA2M0ZP 17CnrtrdXistTTc5s7a+qqu8ysNCLTtMN0m5u7uttszpWT5CPjRAvrnTzsbwUzc24Mo+ Ub4+QsXNXs3A+VpWNCo03M7UrarAubc7NkszMEBbRcOtv9m7xUtNUTlIa+nNws3NvcBG OkpXTUpxwr5PN2jXQtzATUhpTTtDVl7KsbTaW+Y5LEVCOcq41Lm2zfDWUTNDa0JWvrzC uL7Pa0g+RUw/TMK8xc3W61k9PtnFYl7Dd03N0WPf0GlTUT4xPebKzrev2dHLPDRJPjxa 5mbLscLdxdFJRVA8QF701s/e1sLQQ0NeW1FUa8/NTD9p2k3by1Za3mxNcdfRxbfAb1RZ PjZXU0jGvM7Au8vZ1GU7P1lGSPDN28nI9GhTRkhORUPs0fx0/WlQRUJezttZz81b5dlv btvwWmJlSknaxcrIvMvbyO5O+nlPeeP/+cXC7NvWaE9bV1D2fenc92Nx6UxCS1RcbPzR yd9ZXeBeXtNsTFZWRkZTa/rMvuZb72tCSmtMY8zb5cjWXWJcSkNXbV7Wys3c0etOTEVI T0xN68nO2dPZ93BXbc7R4vfWXU16eXP51N3g2eBvd8vN283KZWLsTUhjYlbm0+jizNtg d3NUXmleW3fwd+9mY+XrWVlu83zwffrgW01WZVZd6GNPXmZlcd7b1MvKfFFbTkBMYFTr ys7UytR0b3NNSmBoX93Z29nX7F9gVlZdV1vg097p631iWUtUfXBbce9r6NPj6N/pa3B0 XVb/2ujj09tp6fFZXv1iZv9vYPDb8WjsfHP/9/bp2+Lr82V09GBTVltdXWhm9PFmbeXg 7t7beXn6aGX/7PTp2d1tc/xeV3xrZuXm+uvvX1RbU01Xa2n23tfb3vBeXVxbaWh25dPQ 2d7a3uDzc+Pb7Hb0ZllmY1dicW9x9PljXPZ9YGVoVldiVlNgXVp393Nt4OD04u556evs 7fZ3X2ltZn3u6eju7evl6PPpeWv56Pbw4/F86fZ57+bven39WU9RUU1c6+vW0N7b0e5U TlRWW25jcNbX4/prXGJ2Y11r+dvX4OXoellUUU1WY2395uno3eJ3evZtbfn29+7Z1tnU 0N3m3OLo3vpda+jta3Bpbd78V1debmNbVFFdcXFlWV9mX1tTWmlub2hmfe1wYmNeX2li XXrg3ujl3N/l8GlecHNu9vZr/+t9W1RcafnpfO3U1N39aWh58H1ibO3FxUhJ8MXD7D47 Y8nJ+klM2crX72lDU8i+wug+SsxiYl1KZsj9U31m383Za/Fo+tnmUU9v611PX/fc7V5e YGzW1EpW1l5Q4NbQ9E5GSVvX3VNWXs7F/VBl27+/Rj1JVNbtRlPQzsbQdldwevdvTU/o 1vNmbuhoYmZ81tHZ01tD0d1IV+ZPV17uzcO+UDEvT8PF1M/Fwr3CRTE7P0VGTOjP3Mm+ zdPZfE5e6d7NztfXzsv/TVZz39vraV1P49NGT+BZSObx88ZgLycxuKyxwvNgStTbQzE3 Pz3/xsPP91ffycjI9GB9zMW7vuBNTV/908rF32VPSk9cY1tWQFl6RkJKRkj8vr9ISEg6 NsiqqrfPv1xFXj0kJDdQ2b6xw9nXvcDQyGBFUMzFxch8TXrGwNZgUEZPYvN2a2Xe/FDv 901PXva+WS4qLdSoo63mPkhNUGU0KTRTz7u7zT4+6cDAy91DRsC0trzvQkvGu8LXUUVK /NxpXFdm719xY0I+S1D8tnwoK0i2r7vNPj7Qt7jsLicwQ8K74jw52rCtuX0+Pc6wtNZC N0u8rrpoSE3pxcZcPkJlz85bRjs7Ud3b27tGIy1guba8vkLtr6/mJx8nW7etzS80zaio xTcsP7Omr0UvPMasr3AwN820ttk7NkrNyWA+OEBNbdfzfNE/JCi7pqu+PDf8raxAICNZ rKxeKSQ/qqO+MSxiqJ+tOyg0uqixVC43ybC0UzY4V8PD9Ds3P1fid3lj1EsnKlahnWsj J8ymp8ggHuOnrDkeIdGhoLwqJ+2jpMoxK1Crqb9FNknCs75NNzrUub7jOjE/39N5TldJ KTDfyqahzSYkxaiuPiEuTbOsNyArwKemvTEtXq6oujgtV7asrNc0Qsa7vOg6O+K8t8g+ NDtK3t5PNCct6Mq7prlWSigtyq3ALio3vrZPOCozt6e3QDlesKSqzTo80a2tfTk3Qr+x yUpFTde+1j4zNErP1E06LzBKz73KRUk2NL6+uKvdLSxTw8w+KjvivrF6ND+4p6e3TUrK r6q0WT1wv7vDUzY97c3OdkZK27+/UTY3Nz7o0GBTQzvNvMiuxTM0KCdPud88RmO0rdRP Qk28sdE5PFe+rbDNW1niu8JMPj5A48ZfSFNQXs7/OzY7U9rgX01DRd6/vstKQzAtZvzN sdQ5PdC7vnk7aMC6scxId7avtspIRuvDwt4+NkNg9uNXRWvR083bXVvx19RWP0tZbsvJ X0M+P/HZ3sNQO0Y4Rb6xvdbOxra45U09RtzXRjc+X8W+1kk+QmLN7khFSlvT21ZUUUtX bVBAQlfXztHmUEha3NDWSjxAO2i+wLa01EnKu8LAXkbavs1621HXu7/CTTxF69HW9zE3 xtFmzWVauMVKxcNATm1DUUUuOeNzfMv9ZszczrG0a1RfPEpa5cpCOlbGydleSMDCa9Ra Tk/ms1spP/EwT698XLr9yq1DKs1QJjY+LlNROrSn6+Kvw8y+aV3eNC/NzVm2ttfNd9S8 0EZXb1bAY17ALD6qXirPu7+syG23NCfITyY7STTU2T/AvFa/tlzIvjhRsHxDy2vwvNzJ rW8230YwRl5TTtRMM762MT+nzTCnqic8rkAsLCdASS2+qD9Cp7FDYOxiTTtQy1r2s7a8 qrNN5cxDOz04PTo7xbe5vlO7uDBOrUpIujo7tDQsuTQqqrcr06/T0W4+TjovesU/Rbav travrrjP3W89MzAtM0ZGSO3Fvry9trdZTU0xXEwqSso0OMC6zc23rc1lrdMoRtotLTAw W/xTr6rLvqexa2NWQjk0PlBQ7sLCv7nWUd3/RkpGQEtDRdDT3sJZY79XQ8jGTz5N4kkz 9+Au/K1bSLS6v71XS18xL2lZNEvAvr68t7fF08zeUU1IPlfjU1vW0M3GycPIVk1KPnBT O3fWQ0vQxuNQ48BORrxOLVfbOUBQUcnFzrS2Xmu+8zs/RkVCSGnZ3sy+wsO9z2Dtc05O Tk5eV2LIy9TMTk/fRT/i5klCU+9KO/PrONmwz/G5vsbJTUNRNzRm+j9awL/Cvr6+xd7s 9kxDRT9IaWho3dPTzdTX11RLVEZt90jryltbzcPQfOnKZUDfWzFC3UxKb3zLwNPGvOZU 0NRKSFdRSU1ZY/ne1tzbzuhUXGBXWVteZl5e29vu111Z0PBZ19tXT1t9WUV610jluNRu vsPW0V5LVEM+WWhLY8vKz8zIz+ZzaFtQVFRMY976893e29fe2d5XU1dOY1NIdvpQbNPT 6Wvi2k5Zz04/6eBQX2hz0OBxys1abtB8Vmltbm1lbe39fN7g3tHefOjpa19dWVZPVnFo bW5Tfdxc+c3deunj6F9Q+WBK2slr7cnU3uhUWmZKTd/rW9/M3e3i91xZUF5UO87NN8+7 RVbGV0jlbElca1dX+sbO8My+ekLIw0pe3FFO6OVcdH3gzmNoytxm09NsfPrv5uBfTmVe Wfz0ZVvTyUDZvjtTxkZF+VNNXV7t/HPWZUrR10hoxmY+VH1TYtl3UdfF29Di6c1l/U00 echU3sbO2s/A7Ff8VE1WWXFu8VxXwOM+1s1T799Tb+hWUVdtzN1U18JgSM7WW+/pW1ne 21pWeeXQa2zKZtm7TTzR6U1e2ulGTtb6RmDK62PUy8NjQtnoNkNZPVDWWenG091tTF7p UFDNz27X3vbw83RM09QqRq4+LbetOzyusTtUvT8tPUo4O1frzL27s660w8O53kDxXDlO XDtK1mBry8PCxdHa11ZATltLW7s5H8CpJDCasCaunTMmtt0dJmszMc23vbm3ubr/QF1R OTzsyGPRr7bXu79PaN5JRnxlT0tISk5MVs7Z380qIOKkVCGwmjwmpqogKapvHT6wRjjN v8jU7dC+22i7tM/Gs7TK2c0/Lzk7OWbGxbSzwt1uVFFWTVZJSEsjIbCfUSvInKofQ54z FE6tIB6zsDjjra23Wly5wjk7xds+6brUPk7U3M64ubi78U9NNi9CXWl6U0Y/ecgqI6uX Qx66maseKaC/FCSgVxpznsVAtq637zPssEUqca/Gbbyxw2LGtMpIPj8/MS9RyN7FtMJU PjpAS87KHSSbthdPla4kUaauJB2/0xwrqslAqanQtr9I1lAtTbjj27S2urvI1lA4PEpZ 4NnOxdRbWUs/S2VWT0lK6S4tuz9Gnb8hsJ03H8qzLB0xsdor2aGu5bi74mw5NPzrO9Sq r7GsuOXiYz08Pjc3RUxrzdPQvcBbQDw6OzxP2zArs80h2Z3CM7qozSo7uTsdKrjbL9an qK20vLG5PTFTUTtK2b6vrbS+v/k+Pk1GSUtDS0o5OFba4PRt91o0V7cwMK1IIMqoPDGx qVc2vKfZKUi0Vi8+/b+93sitr9TPwuhQQjc7d9brwrfJZm9KQk0/Q938QEZNSk1MWs46 N7RtLbasMDC3zC02t7c6Nran1D68r7/lUHbIdjtJ03BObtfAt77X1tdKPEZNSE9TYNx6 UOPF0O1vUUo+OdPeMda2NDivvDtrs8U8QMC+OzHrw0w+W9fIzf/WvMNpaPFlWUhAV87R 3MjC60VPSEBRTW2/1lnR82PbcG/OSFS4/T69tjg9v3kxPb7NPkq9tnlIxbvmW1dZXk09 ReNoaM3JvsLT61pNQj5IaVlR2trx7VttymjxvkY0V//JzT/ittBaxtE6WrhxL0y0zT5T xsL3SFzKylxjycbeYGhfUU0+RWZiXP3zfGBIS11PTXDRvs0wLUj5vLDNScaquzY3RkJC Qjk6erStwGu0pro8P9vfVkJIyLjG5cvF5mtWTvB0S0pRUEg/RVpeW2v9ZlFDSbezMSAp QsmruT62na07NDQrPk8qJummqbbCt6SmUy1C6Eo7QuW3s8rxz8paPENQX3ZMRl9aPj5K UFt69ndbNC+7pkYdK922o7wq0Z6sMSosLcKwMSm2nafJQkC6rVAnO7S3ysrGuq/IOUrN VDs+RU1tT0Z5yt1ZWk0/O0XeeiwmuJ1eHSNQqJqsKlSjqUgjGx/aq0Aqy52ap08uRbrN KyZKsa62vcO2uUYzPltTSlB51tZzW+vQ1vNbQi8sVLRKIDmdnkYcHEKgmsYoYKehtiYX H8itRiY3p5qfyjM+wrtIKzDit7a3t7vKaT86P0hJY9fW5fpZRkVM48NfKyu+rTEdQp2d 3x4aNKOauyMrs5+kPhwdU6zGLCj6p6Grylbev9o+OkNDTcizr7O92WtWQzs9SFrm131G NzrUtF4qTaSqLhstp529Ixotp5utLiu+oaPOJydgu2ItKj7Dt77UzLezvMvRXD45O0Vz 1M/Ny9F0TUA+QFnMz0IwTLG/LS24oa8tHSqzo7kqIDasobsxLeKrrV4wQL+2xkg7Rm5j PztN5dfGure7xu5NRkJAQkp50cvK11tZxbC/OTu7sz4hKr+msTMkNrCkszcqT7Ct2zEv Y7zPPztZwLe8ysm9v3lFQj47Oz5I8c7MycjM211GQkhe1tFOPPm0xTk9u6vKLCQ+r6nI Ly7zrrNILDH6u8ZKQOu+xVs+QE1cT0ZW1MvOysLAws1uU05IRU1e69HO2mZOW8rAWz3e s8A6Md+trHwtMdOsrdQ4P8a2yD8xO/rM90xU18jUaVlg/GhMSFFQSENGVt7R1NPU42BP Sk1e4s3RWUrcv/M7RcO47Tc2dLa3fTs95rq89kpczL/J/F3u1+VdTU1OS0hLW+zc29TT 2e5WRkBCRkpRY+bX2ehlV2Dl6VNO3sjeS1HJt7roRlfFu8hRP1bKwtZaVuPL0W9ZadvX 4/Hr4O9ZTVFWVlZWW/rpbV5dXltWUU9WbePtVEVT1/FGS8291khCdr272UlGd8XF71N0 xr3D3Xrp3vZZTVBjdHPw2dHZ7m9oX1dPSktPUVRZbejf431USlTp+UhFbtdbPkbXwtdG PlHNwtZRSnDNznlPVt/P2vn339TT2d3Uzs/W29re8WNbX3bo5eLe4On9ZmBs8eLiZlBe 3fZMS+7N5UtDXc3MbUZGZs/Obk9W69PbY1dr7XRcUE9ZX2No8Nvb393d5n1lV1pldO7m 3t3meltOTVRx3npZ9MzPYE5t1NFsSEhm1ttmUFbezdZxV1/o5Whbaevc3ebp6/dtYF5b VFNbYGb66Ojg3Nzj7fF8cXn/bV5i38zQ7uLKyN5UT3TT03dTWuzW3mlXW/zg+VdQXWxl X19o/ezs7u90XlRUVFRUWWBp/e3s6On6b2ZdW11fduj5aPHW13pacdPN3mNm2sjG1Hxr 7OL6WU1QY/xpXmh59PN9d3ZzbWJgXlNPVFteX2Vtbm1mXFpZV1toefTv8ebc7F5d99// Wl7gysrT4t7NxsrZ83rt4OxpZfri5ezv6ejo5uvz9HxxeXRmXl5iX19iX15dXFxaV1ZX W2n5bmJu/WJOSlZ0/WJXY9vNz9vo4NPP1+10fOvod2lt/+vt8+zwem1rbGtoaW/58ff9 /21fWlNPTk1QV1teYF9rc19UVl5iVE5X89HN1N7b1Nbb6P3p2tfe4t7W0Nbd5eXe3uPe 3Nve4t/e2tbZ3ej5dmheVE9PUVZaXml0cWhbXGVdVlNZY2ZbUVNedG5bT09ZaHz39OPW 0dTb3dvc3+bm4+Lj5uXi4vBuaGVt+vRxX1pXVldbY21zbWNZVFtQSk9PV11d6dDNy9Pp bX3e7XNoaHfgz7u030k+NDfZtLawvFw/TWtZ30gtJyw4VravtsPDzHTlRjo8ZdnDucjX UcqvfTAtKCu/nZqboMgmICgtPkYzLkytoZ+m3igdHSdRtq2uvlBAQ96opEMgHBoup5mX nsokIDvXRTorLsWjnbE6Ky1Rs8oxKCo2xaajpKCtKxwaHluhnK3eP2O2q9YhGx/Wnpqs LxsZOaGanbYnGRottJqUqigXGlGdl6gqHSzNpLckIU2qnZ7IJBsfOlS5oKSw7TMjNqGd 0ycaH76bl6QwFxvFnZ2wJBcmzbanprxdNBsYPaGdqi4ZMKan3z5Os5ydwycXFy+up6St t603Gx43wKatJxorqpmdbCQdHEKgl5W2HRxApqHTIxsk5aensafGIyQvS6SkLSjcvUYt ISDDnZeVoy8gLy8rJ1Shmp5pHyDKo64oFRxeppuawyQaFy6jl6RFJjyqo8omJC/K0VG4 qqu4NB4/ulY+v6muxSoeHSbWo5uhqrFbKRwdLrOmp30mLrCfrUUjHiY9rZqarTEcIL6j pr8mIFaut8zoNDlNPFG3tkozSr1KIx4tqpiUpjQsJ0M+ICysmpqoKh1Gr6/oHhkzqpmf QB4fJ1O0qp6frkAjIWCquzgpLVeop7v6OypLqd4jH0KdkqAvFxVxna9jOrufpysUGz+k n3chKr6cozQdGSqmmqa5bVffLR0qwKeh4CEtvq+zzycourZCNy4stJmavh4aOqCZnj4f On3MMR4tq5qkYC86VEo3My3fo52dtiYcISdTr6yjoLM3ISFJs9FKUTEqU7y5ra2/ubY4 Gxk7oJirIRkqq6dpNjSxnbApGh1Tn6C+zbmvqT4aGiS+nJ2prukrJBwdWaOfuikfQ6qt ram+ymUmHy4/2amfn8YeGTGppK03Jy4990k/1KOaoMUnHSY0TmlPr5+fqjEbHzRLztfQ rKjAMypap6HIJx8jMMO3t6mks/ctHBspsZ2mSiY0w6quu77GvmYvHR03saOjqrn6QD0m HR8quJ2gqrP5Xm0xKjfWttEzNr6oqa2+OS8zKSYuP7+jnqZRJyreqK3uMTFFXcnUzbyt qL42IyAqNkbbZragoapoJyc0QNm+wLSttPc0Nt/QPioqLjNwvL6vp7HFVi0pL9aqrOIu N923u95ROT0+OC0pRbaqp67C20peQywtPbump7G7ZkA8LSs3fbvfNkDLr6qwu3E9RTcw SuW3qKqxSi032b3wNy07P1PF5c+3rq7RNC0tNk7bvr6xqq6+OSQoND3s0V/Ku+xMQ1a2 wEZAOT1iyLS0sbHLbTsqKjbbuMU7M03ow9Hpz/nZyF4+Sduzr7O51FlFPjAqLT6/sMDZ VztIcHPow7O300hNwLu+v/ZFOzgxMEVXzra80UYzQL+7zWJN5u3ays7Qxra+VjMtMTtT 3svMvrvCYjEtOlbUvri+u7rWT0Z0w9FIOz1CV9/Nz9DNTkhANED6va+23U/zzcjT3NR6 c25LOjtM3cbP3l9CQkw9PEZOv6+3vsXjW/f2WW3U0XZCPVD67vBZTEA+Rj5Uys63tMXP T0PrydDjU1NjTmb5Yl7r1HZOPjpAUPm/wMW3v83ePD1TZsrAyNbj5lFCQkpgW0ZGVFTp z9HKzMjWbHlMVNDIvcBdSlNd7ltPW09PW1ZKUHPRxsrR3+xe7v1O/+XNucDT21ZJSk5O TmBoU0VDWdzb7+L8Xl1ZTU3jzsW8yvNcSFHra15UVHRcVmBfXvfeaFNMTl7j3NHN48/W a/9JRfDb08jO3u98VklNad3gXE5ZY3na09fWzt/3+VZt0crCylpXVkLGyEDJv0P/zT1F z19rxXFUzWNT+UpQ2cvGyNNodmxNX29P7eVRWmld2dtLVFFASVBGU+Pjy8bcd1lTfN5m +d9DVMpMUcBPRspZPvdWQNTUcMvQ5tDUXVd0cNTF09PQZWJlQkleUWN3V2nb5d7ec/nX 2tvjeebXyMvtXWNXWcPiP/noO1N9PkbPyt7Z91f6yNnr0U3eutfL6DxbWUjlXE7iaVxe V19d0M1ISj87ys/Lt2bNu9m87ztROkbKOkjNRmPDa0NUzdpDTTs9wsq+u27LvcK7005K TVxlXk9CWWVQ/E1Nxc9ORj5ev7m513zbyri+4ks5P0pNVz5p0Uje0ThWu1tDPzvavbe7 XPbc0bbMZV43SmVAa0s9fFtR/UzivdlTOjnQxru7S+nDxa26eVQxO1BDa0o/01BbwFPj sMs+Ozv3xr7CYtm/vrS+V0Y3OEpGT1pGW/RUV1PmucZKP0DpytHI6Nu7vr3CWUw/O0I9 QE1J69xaz3Bct8g5SExD7ujLwsW7w8nC72lMNzw7PlxU789o+u7eu89DXktN2fG9vNC+ 4N680c9wNzYzOVNPcfFZy93ts8JD00otU2nIsc7G0226yt/oNjg7O2hZb9FTdN1Wyr1x 1/wwP1d0tsnFvO25vt3LPjc3M0lKVNNu0cplyMLiz+UxNlQ+07/NtL2/uujaVDg6MDRA Q/3i783e+szFxc1UPktGRt7UwL7KwtDLxnpUOTE2OU59/9bi2czZvr9cVlk9PXfLu7e/ xc3KwtZ9Rjc7O0huedHT48/Xz77T79lAO0pPz8bUv8vIuMzUbTo7NDRAPk72dszW8MDQ WdlIMEpNTcXUw7fFusLs1kpAPzQ7PUBdW/TQ99nD0NflPkVZQ+DPz7nFw7/ZyNRcUTs3 OTtNYObNz8bAwsLWS0NIO0vNyru7w8LNztRtVj87Oz1JUWPr8+DQysPN63FPQENU4sbC vr7Gws35ekI4NzE6QEju287Cz8jC/2ZtPDtRTty+vrS3v8DlZlk/Pjg0PD5N9+vLyt7N zN7UbUJNS0rbzb+3v8LN6NxeTUI3Nzo/XenNydDU4tzXbU9KQDxO17+3ub7K19ttYkw8 Ozg9TV3bztPN09bIzdTNTTtCSNy8vbm+z8rX3OlGOzQ2SP3Kv8bK4Ftd987ZVjs0O0nJ r6+3wPdb8G1OPi0qMUW/sba840hFQEbGvkpCNitA07OmrrvAXNvKTDgrJCo/xayrsb5v RkM9Os2+TUUzLFDJsaOvu7be1MY6Ly0mM1PXrq+2tPBCQjEwv7s/Qy0mRt+zoa+0sNDU 9C8qKic3+casqrC3XjdANy+7sE1vNinbw7ekusau09TJLiovKkPNza6uu7xGMEs+K8mv PVk+J967wqa01K242c8tJDEvQMjmtqq2t08oOGAv2qpISEUkSr3XqbPjq7HNwjMkLSwz XnS2qq6xUyc4bS5jrEg7QidAuL+qrduxr8rIOSMqLTFi7b6qrK3NKTHZOk6qzz1NKS3I xbCpxbiquMVZKicvLzdO5bCmprMxKEpDN72vV0U3JjfNvquuxq+rt75KKCkuLjdD4q+j pMwtN0w6YK+0TjgqJ0u7s6u3wqqtvdYtIS4xLjs94Kefrz4tLjM62au0QjEkJvy2s6/C v6msuNorIzAvLTc2xp2esNYzKC86xai0PyskLcWsr7q7tKemtFYuJiwvJyY8qp6jrdcz KjB6sKm2MSQkL8Otu7ywraapykk2Ki4nHCm9qaOmvFsvJi3Lq6euOCMqMD7I8eCrp6qq vkXdVCcdGyfPraektD8vKS22pq+7Oyc7TzlDOz6xqK+wws+suyshISdevLOrtjwsLTe7 pq/D3DtM4zo3Rj52u9zar6ipuDstMC4+w7q2tzkqN0q7qbbPwtPM1jMsOT/l0TZOraen rNk+Myov47y9wjsoMUZevspaw77Uy142SFExKi5Ks6iqq7dUOS0t5bfI1kAwSt5UW0tP u7TJy2Net9stKyw2xrGqpq1wPDpFva6+110+ZfA9PkY/5cj6yrOwuVMwLzQ7aMC6ts0z MUBft7PMzcbPzE8vMDc+WkI9w7C2u+s5NDE397e3v1kvMEVTxb7avrbGxvA4O0g3Mz70 tK2ztMVNPTc5zrbF3kw2QPxi+ujWuLC6xeJQ13M2NDxA17y7tLn/QEhRzbjIXFY+QG1N Svll277P8MjAzGA+Oz9CU9/bzctKPFb0zb7gS05LT007OUpg3NdQaL+8wstZQj8+P/PC xtBeRVbb3czfVuLbWXpZRf3pSklW2r6+wsbtS0U+SMi/zdNjTfnvXWZl1r+/ytDd18h6 Pjo+SNq+uri9cT9CTenM4GZeTWbeWVrvYnnZbfzGyNxROzo8P1vNyMXNTUhl69DNa1RR S1BKQEt65dDdYNG/xtRfPjs+SHbDvcboSkBMX+nU8X3Z6G39XFNrXEhKX9PDyNDoUEpb /NC9wtplS0lbce/l4s3DxcrP7X1wSDw/S2LOxsrQ7kxKXvHX32ZsY13j8VlpaFNrfWbX yM/gYk9TU1t88215W05u183Iz/p3b11bT0hNaN7Q4/zQy9biW0ZIU1z0zM3f71xNVFtv 911p7e7a2XR0c1FKTVRs29PT1uZz6N3W03xUTUZKXnri08/Q1O9cTUZFRUhMZWvPucXI 5nBCRVRc49nL1NzQ2V1xZUpK3/p3zcva6+liT0tl9/bf4n3XxsrM1m1ZU01WY2jgzc3R 0+B5Wk1ITFNDUWXf0NDQVlBMVl1p72hwzt5aXldGSV5UXfPTy8jIz3dKSU1NV15Z+tnZ zc3Rztt0ZllNTU9Z/dfJyM3W7M3mV05CTVrRzMXI1t9fT0tCQ1peYt7Q8NTTb1dQTk1R YtzNzdPlcHluYl9WU1xgdNnT1Nb9ZWZPTE9QcNPL1+vQ4uV2XExKU1HbzMXCxc3aXEtL SkJM+XTdxsLL091rTkhGSlvp2tvZ293e/1xRTVBcXF7z5uPX33FpYFRRdl5RX2D2bO1s bu1aUU5Waffz5d3c3tdoTlNQSkpZZuzNwsPJ0/1bV1RQW23p0czLyc3X3XBWXmVi5tfW zcbQduhlXmNmWVf28dTLz976a1xTUVRfY+vL0d3a5llQTkpGTV7829Pb7ulrSnQ3QrMx RbA3PrdjXMVmTUXgPTi7Qzu8TEzDXmXCyUbZaSq7uzC0yFa9J2KqLXa2Lcm0NMq7Pr++ OMrwPr7jfcW9W0ytVkCwZjfNPEPF0cLKt/pDulY5v0NAvkJIxtlpt8Yx69xAw2O/tCxR uTbTvzHRwC/f2TDFzTfAYzvA1jm/uS3Kuy1gvzdNvjo52W02vr03071F/btG3rxNS9k0 PbhIdsU/xVs/q8U+u1Q9u19AuOBNt1A+vE1KxUhKvFQ/tFQ/sd8+w2tAzMtKZsM7SMJD UcJaYMlOZclo77lNQ8NG68tJt08vylZCvmNCwt9CvtY/w/Y/2lNI1vdOu9w/vFk2zWs7 3uhFX8NWTbZbRsVNSspXVMxJRtlFO8L8Tr9Q680+u71Dyt5FxtBG08xF29lA3dNzzNr9 zdBNz81A1MNGaMpMa7/cSsjwNtHtOejsQ9bbTdDQV8rNPWhtQtZNT8s2QNs9XtBG5sJl 1r5o1MNb5dxT2tRF5tM03MA23LNgyrZcT9RGNlk/M05KRtfX2bzJ17/ZTr/MYMZedLtD MMXOLXqva9GtveLc3TstPzYqPUo95rbJtq3Pu7ZNXt48StNMfLYrKqo5JqS3LaukXM65 YDsrLjYhLdM0S6OnWbOhRTG2Qip61kjuszQkrmkjq6otuaNX0LRiQj4+NCowOzowt5rA b5q0JrfCIz6+UV62VjC2vyzCqkNit7y4a9uwOy7KLR87OyNDoatWpJ09SKgzJsVWNtPW Jy+wOy2nuE+7XrmwPretLUPAIx85KyTppr5znaM0vqo5LU7DSjPfKSe0NjCmsOjIt6jU SKfUI810GiY7Iy2tpv+0mrY8sbBpM1u5MC6uKhyoYB6opjHgoKdbyKFQI9FUHSE8MSmm nTGvlU0xoawtN65GHuWtKR3IsyM/nT4onKYxq6FTMEVlIxo6Px2/mi9NlcIunp4sN6NJ GmatJyqrOR67wh1cm0tLmqRIzK9MHy9eHB3rSjhWtqTGqpfWTKFDIExcNi1jrUZCtyAk qDMqna1FqKG6UMW0KyE8LR0/qjM+lKoonJ0ja6Y8KFq+Niq3vCs5wL0oJqs8HaOqJKia Sk+tzSgn8zAfqKsbyp0gM5rZJ62kOzituzFwrTEevW4XSqErI6OhJ+yVwCafnyNOoE8t V8a+Iy2sJiCuPSGuocOun6nN0L4dG8whGbveJLyevMabtCaw0R3XrDlcpqZbSL5mLyEt PhwmsTQqo6lNsKqt2SqzzRnKqB04nzwmtLQzWaaza52ZMC+fPRe0rRcwnDQnmsAdpqoV LbAcGrbMKMihoa2tnawzubgcJE0jKkVcqsDDmq89pK4qYrQ3NNkqKUwpIEhWY6S6z53I MKHJHbNIFcW8HL2cOd2Zwim90y0qLGY6Jq+qOKybzcWq21A3LFAnI79AKrGzPdStxkaw rTrGoz8tzU0tPr7aLvGvLD2nLCevNyC+vyq/nbu0nqSqvMy2MyRCKB07SDfWuKqswqev NObFJytrOClG7zRDvz00uLfGyci2TDS3ZibCyCS+pza+ndZGqNEjNzwnKS9UbTuvo8at nbbTtNk/My0+KyfmTDC9sfDArbfFtLj91LpDMTYzPC84vkI0rtQzqr4rubcpVq80N6y8 Tbi6yNdK1GksPlcrNtFUb722rbu/rNk+xVYtRew8POhXPXfbOle8xsDLyb5GSrs+M7hJ L7HFNLawN/qxNy/XQjdMWc3X5q+z27a2Tln3Qjk0QkwzXL5L7bDFb76/VP/NQjzbRjFF SFZ2W73GQ7+/Ns69L02+NDy2ZT6xsem+uMjeTF5PLjpNMT3O6ezCvbzTzr5OQNtINlZ9 Qk/MbFTCzkzDu9TO1s3tQtrWN+7FNt6zTeCu90C+/C9IYDtAXtnUdL+77c27+VPXekxF S1w8P9dRRcnKaNDF4m7W7U191khFUE1USWjQTVu/VlS6XUK+6T3KwEjou/Zfz972V1Px SD/xVj/cynHZxsbUfc3rQlv9Qk7Za1na4lFv4kpTz+LZ0OLNeU/WYEPQdkDJyknPw0JR y0I+4F1Kfd3Z39rF0e7M3FBdYE5JSWNWRt7QWdnD4vzL11f55kxU21RLbfrlfPDMfVnM bEvI40vL00rXxlRrxutg3eLxXVroVkZ6bEvlzfDezdHgZu10SFFpSU32Y1NrfVdl4l1b 2ePo5mXoZkpxbkjx21HXyGvdyldP6U9CZXdZ7dzUzdrW2m3o5lFRaV5WV2l2U2vTemjQ 0e3a0+/x2v9l3uZecW1mbl3w31vx0WPpy2Jmz2hU2vZR69pjc+Pp9mNpb09Z9FBXz9b3 2tTbelttX05edlde63NbaF5NVm1UVuDe3eJ64HpTcWZKbfdN/NpbedtbXeNbVt7vb9fb 4Nfo7u9ga21WWXb5+fne2Xzv2vB04PFs5utdXvb0dvDi3dv29+tgZWVNZdtb6c30z9BM VMrXSErl0+NaVNfNa05d09NiZtPR+mNx4N5WTmvm7dnpOkDKyO1RS+nQX0tWaevfUUZT dN5sS23R7eZ3WdTPTEJe5u9gVunK01tb5t5gT+/aW1br3PBUVPH6T1Hmze90yu9GTmPj 3l1i4N3j9nNx2cniSlzIzXRxb9/MWkX0yOVRX9rN1GVe3tZwUFne6FnozNHb8PbQ7FF3 0OBRbs9jcNpjUE1DSl9o/HNs/OljTE7g001GXWN2Wz9T12NLVtbL1txo081rUW56U1nm dl534tD0Ymzd3lxUbNvbZu1zVHFvW+De7Xds2c3U5fPg3lFFadP25eluzc5UV9HRb1Z0 49ndW15rbEto12VjzM15YGj86GZNXubfXV7ZdmjWdmvbdFtoX/xpT1tu92lOXc53Smjo YnZeSlzwW0hW3tP/fePI1GBc7fpTYNv9Y+nm1/9mZXHxc3Dw0d7t1O1OZWlW6O362XDl 199obetpWVFj6/dtd3fR22Xo4Nf5Xl50415IV/RfTm3ZdOzP2d7vZm99X1BbYnr3bevz euPeYmZ8VHx0aeBrXGtwWU5b4P9ccPbm3uJl5tbaeV3b1OtrY93wXmht7W7r3ujz7PPa dFpe3O9l4Obg73Hob1Fo7Vl8fGnbevnx6GhOXl5NUGnl7e3s49nsW2xdbF1NZWhvW1B5 42tc6+Js/fBgbl5PYG1rUWh83eLj12x32nRdWWtt/P/w3Obxc97cbO3a3fxt3uPmeV7m 7WtzaN7aee/gz+VeZm1xY3nt49vvdtliZXx57dng7ehgZelXSl7/c/ZeZehscXn9a15e WlZ39+nwYHHjY1NfYl7pVk/i8GZZb97j5uVl+dP8Wu3vUel3TWDraH3gc9baVGnlYmVg XunO4HRlTUhe82nWwsnNzvFeWUhFWmJX7vTcy9rp1sjL19fZ73r2Tk3o9FvfXt6+OSQ3 wruxuErlrcYxLSspP2AzOLutrbDNSF1aQkrdysC6vtHX6FBM6+LszeBUUVBLU/fTzdTL 1El57yQeOc+tmqY5PNE/LCQbKqyksbC0u7N8Ix0qSsa2r6aeqFM0Pk1bW1navtY3OGDK u7zG0PA/LzE8TrtLHSe7nJemMR0mysYrIV+knZ/tHypFLCcrUKSVmK3I+S4nHx9snpyp yz4vNzk+t6m3Sy0qNEn3yLvC22DIujEkLy8zvKeqpKPiKCMkJzA7SLOnra+2yuhTOy0u PkbQqqSps9F5QzMtPr6wul4vOdzNu7a+3D4sKjtbT01mrbMnJt2to6svJGazSycqSKqd tDAmIy5LQtqpnZym3iceIzjQs6ukpr4tIzHPra/0QEg3Mz7btrDDSF3FxUYjTaDIHxgk sJeUsyY6wEAgGCavmpWnNigwQjAgLbCcmaNLIylMXD1fr6e4Piw2vrT9QE7W10I0PN/J Qi83vKZUIzyjnb0nGRhFn5eeVEOzyScYFSisl5ezMUV5SjQmM66do8orKTxo0Lext8ow KjvryNdXb25aT1HFt8Y4J0+swiggPqmXmtwkGxgxrKOepKqqViAaGCmwnpyoSzc0LDFQ v6ejq780Hh0rzqShtlQ3PEI+V9TTfDcvSbapzi9Frq5iKx0jvqGbm8MoHxocN62al56z OSEeGyHvp5uatCodHC3KuaqfoK07Gxckz6ajrb5MNjA5w7C7QC5TvksrOL+knKouHhom tKijmqRIJxsYLa2bl6C8RiwjGx09qpqXpzwkHR4u/ayenql8Jx8fLM+sp63uOz953j07 w7DQNiMfPqignaovJCEcMLinmJi3Kx4YGzqsnZqdrD4jGhcjWq2cmaHMKBobK86poaGm wDgmIDBru7S+s63xLS1Gt6SwMSQjMLSrqqGzQy0cGjytn5efSCQfHRwvrJyYmKc8JhoV IDy7nZmguzQfGyNLs6ekultbQjcvLFGtqbNNLkC+sbB6LzYzMc+3rZ2mQCofGi20o5+d oGYgHRwaLa2empeh+icaFyReva2gpr5RLSQzUezMvrfFPjA727CqwkA5NlC+wrewdjct IS29rKafrT4mIB4gVqaenJ2tMB0cGh07qJyZmq1DLSEcJkLct6+94+PpRkXKtr7lSDZI vbu8wlBISztTvbOpq1ArJyEqzamhoaOzMCAdHCTQpJ+dn7cwHRscJG+so5+kt1YzLCwv PUrju8VLStzCt75LOj9K07/KwsZWRjYuXbGtqqzwLicoKjS5pqOgptMnHx0eLcaknZ2k xS8kHyEuV7uvr7S/0OtDPFneYk0+O2PFw8LTVltQSuXKwrbFQjYvM+C0qKatr3wpJCQk P62ko6Cr+isfHiM6vKynqbHcPjMwNjtATt3K3k5N1MzNy0ZAVEje1O3MXklGOD/Mtra4 xUM5PD1CaLOqrau4MyQnJy1xrqOgo7BPNCsoLz/ZurO6yNP9T0JDT11bSEVo38nJ/F5C Pj8+fNvNvmw/PTxN4Ly40c3CWT9NQjvGqq6ur1suJyYrPLutq6atvuZCNzc+Rk3fyNl5 ZW3OzOtQQEVKUW9PXOlMTkk+ds3Lw/1JPzxgc0jKuGP8u1k7ytBKva2zt7hfLCouLz7A sbGsrb3M00s3QFlRYl5LXtDI2vxpQkNIP0xQWeZRSUxDVtzb3VdQeUo8a9Bg3mA7T8C3 ub3Nbcy+0Nv9RTg3PT9ew8C8t7fA0dHv/M/oWlFPUFTe2dvL7V1bSFRaUF9PSk1JXlpD U+hLQt5f1K1pKS44aK2hrV7O7DhKZk08UOk/Zr3Oz726zdbGZVrU3Hff0Gxe6Vtr1M/Q ZVFKPD9GQkhIV9vsXe7tRlNILmunuTw0Kinbo6e4scZAQFA8Lj5GPdCzuMC6ucvIyU1A TlZez8XNzc7pU1H8ZmnZc1lt931TTVlcVG3tUM++PCpXtMXUaC4q8bTDvbfUTWvtOzY9 NjNOxcLAu8XWw7/XdltGQlbe19nO11xlZlFo3uZrZfR5XFFPSUVmTz7Mscg8PmLewrpW MD3jysW+xldo0Nvg3GhDPlPs1s7Z+fnUyMXDxtNlW1tNWWZca3lv6d3T3XTp619UX1BM 3Fs2Psy7zOZUQla9vllAP0JMzsPb9GBRX9HG3VdOTVNla1pKSllt4s7LztFuW2Jbae39 /e3d1N/0+mhbeWBFcL7URUNWbdTL+kNUzsXGz+1KTXfi1NHoTUhW/dzX433s2czN4GNT SEpQUGl3fd7e6ODa2el0fXRsfOP85cpxQ1/K0XdaRkVry95bVmvdzsPN815MTWLg4GJP TVFbcO39XVtm7+Ld6W5oUVNZV1xeXF9p7+hraHd3et7tWdnD21BRaX3b119Kbs3FyMva Xm3zc/ZzVk1Xdt7X425eX3fj3ullV1RTUVNjaHfr+Xrw4+b5aGZpZWtzZXrR5Vrwzc7X 3W1r3czWbVtj8N7M0O59bFtu3vFeV1NWcOv6aFtZYPbe3u16ZVRUU05TWVtbW2h3bHnx dm759GLoyt1WV2Jg6NxuVmvaz9v27F9e8e7r2u1daPTp5e5sX2Z8/P1jWVdXYnNw5t7z /XFmZmhmXlNWYGj33+Pp2dxgZdvU6flwYO3Ozdn2ae3m897rdvd0aOPX5vD9aWNraGBd Xmh29O3zbm10ZWNmX15dWVlWXXR59u56cfp6ZnTrdlto3t7j4+1seejp/F5iZVtmdvTb 22VUXm38721eduDe+nR5ffdvXllgb2ZrbW/zdl5cXGZ6c3Dr293e4G1l8+htZenc19DR 3vFoZWJaZWtt8N7c08nM3mhQS1BZXVpo29PW3Olt//lPSE9OW9/6XubZ/XB2aencbVz3 2druXWDe5V5m9Hnx6fzv6PdrfPdtZWZmW1RZ/9nd9HN28O1eUFRZU1lXUF7x9vTpbWbj 6F1ebWZtbF1x19Z3Zfz36PRj8NTf6d3m/HRiW3fo/eDW3NfN09z5T01bWmDp69zJy9zi b1FTTENNZWnf0el35e9tX1Ze9vpiY+DN1npmaO3sW1z0bmnw9Hb3aF7x8W7p42xpev3f 32xmbFtjcV1g93pv9Gti+W1bcG9f5tbzbnZeX2BUVGPt+WJeZdbPXlvibGBgS2jeVuPC z9DFz9PWaP/6SEteWfnX3tbW6dvwVFpeWmZibtzm7tv/XVtUW/9rYubjevZ68e9USExl +mzbzdHDy1Hp0zs+20xJ1Ovm01Nv0ExIdFBU4v3l1/3f0fde+dnldt7U3tnX7+D8S1pw RVDuac3NX8a6YOPoNE3rOk3M1snNyb9aQmNGO0xibO/cysLN1tRzYGJadlxP5tpWSGD0 UO2/Pzu730i8xWjDcEVaNDR5ODe/2detyWC3ZjRTSjtO6c/IzcrNbVZdTkNQu88vxatM 2q7T185FW003Tlo+Vnm+ukj3vj5A0FfXv9C+zkjQWzRWPDCxyiHDpjbepr/NzE/bNypb SDDQu+1Pya1DKXRgM13IwrfKyLhvQtZ6QDomO7dD46OsubHKUzcsNjQ2X8i0uUa9pi4m wjEm3dDNt8Cxt0bTv0UsKNdILaugvq2ry2YrKkAqLMXKYLyxvazIKkhIJjnXXrqwu7O3 y3EmIEY2PcW8np/AqrAqLzEhLjM+t9vNq7Ot0zpXKiA4PkC5rKSf2yjCSh1NukK/xrSj /UqvPic7Lyw7SsO9vqOecD7WQCchPM5FsK87r7Azv7s6v8tDTipDyDTPr1te+UA+LS7Q q+86r7svbLO7vEUmfdMo1KvAra+7tEAwMB0t6D1NuaiqycLLLXPKITrCMMmut6NNyJ05 L7o0PPBNsb9NrLkmLL8+Kde9Uzxcxbu0RUDMMy/cxkMxsaS3p6e9zT44Kh0qNzfFTUuh tj+wzy02JDdgID+rdrGpOuy2S8q/1qOnO829KCg0QkY2PEO7uOatrVtQ5bpFIDBCODE6 rqmuoJ6jr0jCyB0mPyMzXVGtyWujt0PIPS7X2TM4UVA2JjSss9mhmqS+aONeOyMjPC0r 6Lm3Xsikt+3a3ro5IzEvJy07t7booJy3rLc0PykrXiQutlfTrWA7zdRNQE+qqjMuUTMr MEm5t7Stp6G2xrdlMSs0OyMnPkVUQ8CmrrOqrr43KjknIz89dKispqbDqqlJX1ArOk4v Lz5OTCgmv63NsaOs3DEwMTM2Ns2207mtra+/tLDXVkNGOyQmKyMmMPSwtqiftLzGLS82 MMpvPrGvt6q3dsrLUUA+xbE6JjEtISlLuLq6sLazxVDG2zk7SuBPSsm/v+Pit7/Qwspp MygwKiY7PlG0u7Suz7SuZmVfPVfdWV3ezdc4NMa33tO4wkgvMDc6Oz3Wu8m5ra2wvru5 8FRKTEozNDwzMT7Rs763qs3cyC8xSjb93j7As7+xt+LPzVBGQ2PCQCgwOi8vSsW9u7/G t8BU4HA+SFHrcErRxdbt6cXLYGnzZT0tNDQsRVtItKu0r8XFsNNO8UlX0GJPa9vXPC1Z sdZAzMVXOjdF69ZW876+wMK9u8vN115MQ0I9MT7UOC7ez8zI162xTdPORk9DV79QPsjD 0NtCV8s9S+Y8yMgqOcJK2rfDq6ppc9NISjgzSkM9aUZKysZWPMvAQ0jKrrZdzbxNNDw+ St3uzb3IzfxXfFYrK8JrLNGz8Mi8wLC04NdXOFBDLt+xU03O4MIzNK40LaxTML2uwEjJ rVAqTXA/cNa7tMjfzkksRU8rXb9CyK6ruU2wuytbay3rPS+9zUa0uzHRtyMttDw6wL2q ys6oTTu3RSs/290/Za2zMD6/LSZNNzm0vq+nwLS7QGlGMy5FtEVFqrQ0Wbg3Ntc5M81z 6LTFtrFMStbwMS6zYi6ssSRtpiottz0x8E2+rNnCqM1F10UwM3xaOLSzLb2qL0rNNkXw PNerTT+q3jauzjDlyTkzv8YsxcAws3Qwtv8xrrMq0KY2MavKMH3uP0jdTTGzwzCmwCqq xiewtiFNqjQ2quA6tFRGttk4Pso8MK5cM6S/KqytKW26N0W7WkjXX9DZYElK1C04qEIx pMIxqL4pu2YtvtM6yNs/v8U+O3b3LUqvOzmuYD6jyDCqaTG2SDe3Sje+vlQ339EpWa4q OqZFQKHKV6xAPrc3NM08Tczdwjo/ty02rTQvqd09pMVIrEg5r0I2yTdFzFG/TTquOi2p Viq0yzuqv1CxS1uxOErAOEpoVrxpLbTNKrbKKs3CO7O/S7ZXSK5LO7s6Sds9070tQrAw PrA9NLdjXcLrv15Ats44vkY8zUhZ0Eg3ztE0d64xOLBwSMK+5d66tE3jyjtJXU0+WeU2 1q4v4qorPqd5OrS3V22wuzbduzA3uUMrwtckuLEjwrAs2al2QLOuNmumUyuzvibltiot s1Ejt7ckZqo7Oqa3KqqoLcCnNC208yjtuSwus+Mg3KwjOqNAL56/K6G0MLO+L028PC27 ZSdUtkUty7cxXqdKN6TFLaesK7epJz2mKy2wMS3AUz3MVjvxysxIQKu2LbChMe2hLDyk KS+vLjOxRS+6tjBAtFA708562r67UfyxTju2PiazyiO/rSRprSpati87zUhNuLlPab2x dzexxSvFsTDbqixKrTA+uzE4uG42y7ZcXLrFWszAdEvCwEDRvTpcrzgvtEonutoows4u xbhL1MJDQMLCW0bOtkNcrVQ4tEors04pv1swvco34rhUPtDXQ1PWaWjWxmJOwGtAwN40 wrQ48K09RbA/PrtDOtZdVMC+bVzbxtM+17s6U7FXSq1OOq9iO75XOM3XOkrMVj5g4ktP 5vpKdL5aVrptQrbTL8u+L1y2Nk23Qle68FvMYj5W0V1CRdDiPM++P129Okq2PUO6UFe2 1kvFw0hI6U5AUFxZZeLQVl/KVlTCdka4vUi/tEPduEJUyEBC6VNR09NRVODUY0bR0T/j vk/vuEhPu09IyFBAzdxAXMpXSeLrVubZ+m/Zy2N6yl1PxXY8y8053cU5Y8g+XsVXY81c TN3bXFZc0fFNydBF5dw769Q6Y9FG/chUV8jeTejWYGjl9v322+ZQ7uZIYtpDVsBZTLzr Q8LsQ83rSN/Wc9TK6F/64u1OacxXXsPoU8NtP899SNnoTO3WUE/f/VF32fbt1+N2ZvBp T2tlTG/aTVrJaVDD4kzN5U7a3lnx41Rb3fFmXXTXXF7M/VHUfEjT9kXm41Tb0GD6zv1R efZZX+t3+t/gaFn3W03s/1DQxl3jxlZZzlda02Ne2vxj3u1TW21zcVnw3lv002bszVRi 01tZ+lZU82lUdOlibu16fPZ092t56F5r32Jg215W12lK9GhK9P9X2tTx3NluYPZtW152 3vz60Nn961RL6WJN5t501Nt52eJl8eVmXfnpXmXo+VdZ3uBe7uN62dTt08xbbcz69NdZ adRjX91vW1lIV/ROVu1fa+Zb4uZKW+1w/eh9fNn6Yu1WUfHb6F9ea+twXXFRUODe22tT ztxNfd5TU2bt1uDr6HBrWV3U909ed9fWZXzUZlli/F5o0fb91tbu89bf69v/UExw3nfo 913s3utiV3D5y8tdYGhLadBpZVZJ08jr6V5RYlts09pbX+brXv3e9FdJY09L6+1bZu5t Wl9ZXPTg9lFTeV5daVti4tDuXEtpwttZ1/BKX9/Rw9lX/fz64HDo2ezp19n9aeDmW1l3 21td3nZ91NRoYtzZ5W9aVmbZ0N7j4Oji81tCPEDmubu+u9FRWUg6NzE3T1ld/1tu4ujU xsLCvr/ZV19oW1Fa5fDTvMI/Kigvzammrb/XYz83NjQxLSw22bOzu9td5W9pyMjt1MbD xls/Slv8z823rukrICPwn5ih0Uzj3D4uLSojHiyvnaNcJzC9q7tmW2br1+1dRTMsMUXe tKqmptkmHSTDnJqwTt68vuY4Jx0YH8KZmc8dHW6dnfYsSL67w87NSCYdI2anoKrFtrg8 Jh4ns5qbrbu0s7hLIxoVGUWdmL4eHeOcmLMpJzd0uK28LxoaSp2ZsyovsKOzQCojHie2 mpSdzTk7Q04uHR0uu6a7KSFMqaGpzVnX3N5TKh0eRaCasSQeX6GftzcrKiQnzp2ZqnrQ rbQ2Ji4uJzHDrXQjHTOnmpymvehbNigkJ02onqxMMDdwzVtCODe8n6o0HSS2mpWmNCQt 9rfRMSAcHSfKoaCutqemw0AvIR0gTaCXoT4kJzNMSlS9t76/zTkkIDinmpykrnEwNDcg GCrC0TMnSJ6Xn63JLyQrSbu01F5TSOt3MCtD1LmqqK5OJCZeu8/OsKaho7Y0ISdATU9L LyMfLbejpqutu8izyiQbLq2fvicpPkP8ubbbMSpCyMasnq43Lj3Qr6uzSSk/rLMvISEf HyQ6rJ2amqdRNjEtN+DUQzxdwNQ9OTQ0yKaqYCs0r5ubsSwcHT2pnZ2tTjosJCssJCAh L7GclJW6KkvAQDRGPy0nMV/2yrCzwMPfPDvZuL/ds52mPicfI9GjnZ/tIR4hQro9JyYj QKGXl523QjArNk4sHB0qxp2VoEMtPD40Ua6pub2wra5QIx0hQ6yjpq5gIxoqwNEzLSgg PaCXl57FKiEwv7Y3HBokTaebo9FDOUOzoKG2NCEqvaCqMCMmJjutnqd0MS5QsdknIR4f Pqebl5y7PDs8zbY2HBkbLLGalJ/eLC++o6fXMSstWq2ktDAeHCTDnpmjRSYuzLlXLSQd IVqjmp2xTkh3u7suGxwdIVCgmJ2uPTDFpJ+vMR4bKMakn74nHSA0t6CftjovXKyo2SQa GB1doJuhsMXpyrPmIxsdIDavoaSvu66ko6OsORsZJmutqMgtHyZNu6egrU053K+ruTgg Ghwqy6aqzde3sKmmxSYbHCQ35sC9tqednqGodCcfJz99PCckKTS+oKO+bGXuu6uosz4m IB8nO/ZZMzbFpp6dnq84JCMvRUI6LS7FnZiaoK/iOTE0KyEfICnIpqSqy0bDqKSnsEoh HSk6QEI0Kic6s6SgoKrMPUXdTS8nJicwyaadobHCxsCzwywdHB8u1rawtsK2qKSntzck JCo6RjMrLTrXrKGnvczU0bemnZyUjIqNjIiHiIuMi4yOkp9OHRQSEhESFBktuKakrd8t HxwaGhoVFxon78bRVykfHxsYEgsHBwsPFBscHB0jOl9XQiofHBofJCAdHyEpZqyjoaew sKyqsVErJyxMsaCbnaGnpqOjqt0uKy8/291KPkjiu6utz0A3NDxMUDEgGxwgKT6/sbaz qaemo6ewu76wo5uamp2dl5KRlJ2tzm3NurS85UxavrO4yk0zLzMzKyQeGhsjLTM0MCkm LT9RTkg3LCYnLzg3Njk/YL6uqqy0vr27uL5QMC029K6jo6itu7+5u943KywxQnR9U1Ht xrivtNRRSEZT3NNRNzQ3PV6/sa+2ube3u8PmPzEuM0Vt9nZaY8Kxr7bzNioqMT5UWU1Q 77uvsbnG4N/Kw8rmUT8/bsbCu7jN8MO9tLC2vM/izbu+vsBrTFM/QF4+MTY0NlbMaUlN V8ivqqyzu83r5dluSkNATdnDwL++urSxr7HA8F5QTmjrd1lUY9nCu7Sxu8XFxs3Zb0w/ PkJU7et3Y2XTvba61Eo8OT5NY3leWfrLvb7K3VtQWV1RRj87PE7i0M3aYlBa2sXDyNdc RT5DTFBUWnTZysPD0V9IRUpUXU0/Oz9jyb6/zHZTUF32419GRU1b49TtXlxt7dTL3k9I RUNOcG5TRkJDTmvj1t9eVFpbVlFNRkJDSVBQSkNCTvHTz3NDOzs8Q1ZmVE9g8NnO21pJ RklKUVtOSUpOWv/idldaY2Lu095eV1ZISF79a+/U0dPP0+1iU0lIUVxTTlFc38O+xs7X b1d05llPX1pX28jXaPr0YOjGyN59bVRNY+tmaObl9NnLztTP13pgaWhaVldWU1ZdXV1w +t3DzkZG8FQ/+chKQsO74sy51Ez230hFV0U+V/xZ48XJvrO4ysPD5dnG3FBNSkBFVGjm 0MnGyuVlecW8RikwzchJ07lIObiq1Dvw0ElO6EkwNOa+21fQvb22sb/u3cW+2UNIfWB6 w9s+Wr2/ysLMW1Nc4+IwIDCxvjtNvrCordtDMC3d0yAaMVlIubFowKOhrus3OE5FNC8v Rru3vby+t627aFlLPUpFLjd0Mx4up65IwLCtoKgwITQ+LR8aJ327o6tItpugWTY0KC85 Kygxtp6kraekrbfKNicsMS0rLzvNsHwqYJ6n18a8raHcGR43KyYbGs+fqaqqsKSgWiAe Hys2JCbWo5uZnqiqrcI3HRojLSwzYMCtnZnQHVecySZCa7ag9Bcf20UjGiufm6mprqyf vRsYJiguLSq3mJWZobGrqD4cGxwhOD0/vaiemp2nLhdLqCgaL8CbmyMXvrAuHh3NmJ2z ubGkuxsUHyQtLi2wlZSbpq2rtikXFR02SS9loZudnaaw0BsVOzQaKL2fj6AdNp7GIBck oZq30LSkrCgVGikvKi+ul5WdpKqtzSAVGSY4ODa5nZuep8DKzykYFyYuJEunmZKtL7bD IxUVVpqqWrujo0AZGSk3KSyumZWds7SrUBwUHDBKQEqqmp2qwM2/TSAbHiQhM7SuoJia p667JhcXGjS+sKOem6cmHCYkISNmn5mcpqyuSh4XFyZp18immpqwSELR2ycaHS3ccSlK nJeeo6GrPB4YFSE0L66bm5qsPiofHRohtJufpqGh1CAaGiMxT62dmZqxNzBFOh4eRsXQ 0LGtTc2ep1awpzQcHBwbLbijnJqes3QmGh0cJ7aenJ2bozcdHB4gKrqdmpihykAxIxka PK2syN+omq4cG7SoLzSvXictJCHFnp2goKRfIBoaHChop5qanKHKJx0cHSHXnpqcn6fL KRoVHTu2qqqknKdtLRcaydEqzpqa4h4pOjywpq+npEIbGhsaJL+gm5mbs0spGxodMK6d nJ6fqjcaFx4oOLujmpmmVjMnHRokxrCtnpyxNCsnHy20qa2ouyYfKCAkuJ6enJ23LB8d GyPZqqCcnaPGJxsdJCc9qJiaprdiKh0YHOarraqhmqkjGSchJsCqpJukOiAjJiZGpJ2k pK8tHR8cIMihnpybqUYqHhoeLMagm56mrUMcFB9Q1rann5egJxkqMSAg45uXqLPALiQg Giqrnqq2rmghICcvyaOgpqGtLyAjHx9PqKOdmacoHCovMEVmrJiXvCYtMTQkGTubma/X r604GBcza22xqaegri0hMD464Kmkrr1oLSQqJy6nm1A7oaFtMyYgMcOxyFB9wL/NLBo4 o6vOa86jriAZLnQ7Lmufl6jz4Ek3MCcrv6atvbfAQzcjGzaooamqqbwoIzcpHjTDr52f RizX/zYzKzannM4nMUNdSCQ9nZuuwrewWR0ZLXP9rqDDM8O2PztDQraqTEKouyQcIC1t wK2jrK2n6SoxJhw9q75cy8axqkMdNqiqyEtaqqc4JCAdN8nLp5ykrsMrHiZCazMxu6ex xUBFujchz56muc08My0tNDRLr6qupqg+MNrPyeUeHamcPy3tr6Q/Gj6mw7y4NDYzHSe/ z7uhpMNIRVdXLyo7vLZc3qi3KyQzXb6soa0uSa1ZLTk3Y6zFOVlQLOmjdh0ru7HLLTug oTcqLze+xUuto9lASjQvQ9Db3cCqszY7zb7NT9qko9xFSCodH1q2Ni29p6y7Pv2qvjrT XB0zp787SEO0syQnr62wqU0oQDss8LOvoaPNTO02KSMg3LAzLL6zay0sv63Ct6GqMyzj zT4qKluzzDhUw9toyms2SL+wrLnJrqtNKicmM+W/3mJRSDg2N/yqr8i4rbBLKTy0vjM7 s6nbLztWOSc/q7ZmzLCnrWg+ycVDQEwvNOJMOD00P8VNN8Kts6y3RTQ2QGBd+r271zQ2 8+4+Nu2tt0NGtrFDLvaxwtnCsMAuLUhDLyoz3shUV8PIya67V82+y8V2QsjINi45NkPM trS+0b/CZmXGs8ZbbdnNRi071FwvN8a+SDdIZUs+y6uwxr+2tMo/PltLOUVMN0jUYk9T VMC67tO0tr29dj43MTdIQj9u20M0RuZtYOi+rbRlervDODFZcUtQ28N6OT5oYkxG4La6 ysW/1/bG/UhXTEhXPDRKTTY3Q0rUuLCusbi9zltM5stQQFfrXj43V8PXSP20t9nZxsPj TOK9xk1KZlY7LTM/PD9TVkjfv8rAvsq5vWt30+le8Ug4Oz5KbfrWycNuS9C+v8/Uu7je PlDrQjE0RUNCRlPRW0Jfys7507uzvtDM/UlabkNGaFNj5k7bu8p23dnZv7y9vs7tVD89 PlNIOz5CTU0+RtHKUE3JvM/2zM7fYE3z1ldDWdTpS0rez+bUytHPw8veytb3zls/SlZG RVNFP0lLa/f23N/aU1TT2tfo68nNXUr56ElCTuzg2c3Au8rdycDG33fJwHFKUUk8PUI7 QFFTaPBf7Nd0Xl9WYNfR0MbZZXNNQ0Zfdlfp1szF5XnCu9TbvLzFzeNz3kYzVEYxRkY5 Xtk8Wb1gbr/RXs3ZUG1UXGxASu9QSddmSOlwTdDC1sO6wtfNw8/Nz/zp4k07UFc6Q0ZU 1Ehv0fFXRchpSsLPYsa7Q07PQkVoaEl819/lU8rJW+LIbfa3yOC7xld03klN3F5GW11M WVZOZs3WQ83CP81RPs0+SFdbU0PRVl7R/FfZyEzg2VZo/e9e6Gba6U3e5l7tzVlfymZs 0NTp1s1u8NH/Y/FuXGJtPz7OQzfTVFTUWc/N3tPPxdnJ0VnQzU5C7E4+93lUbs7c/Ojb zenZyt7cv8XoxcZjdH1MRllTQ0pXSUxbS15taPNAztNCykje2z/NWWJWaPdI3WNPac1e V81eaX3i6P/W09/23+nt6NRuYM1zaNTgeeD6T1deW1NUZVRZW05XSd5aQMZf39lXvWNm yM/X377U4svoS0tmSEhWWW5r7M3g2sXU0NDNzdnC09zTaF1ZTkhRSkVZSU9lTltl9Fz3 6TfA3THCSVr3Pb9ZTc3R/GK/7lPU2lpM5fBObe/pX17UXVl83tZtv8LfvcLNzc3bcXpW VE5JU0pCTk9ASGNA4tYwt8w0s17wxk3DdlzWyF1au2lN2vNPSPRsTWvr11nowuXTzr/G 37TDbb/UTldgQkNMRUZDSVBFSlNUSmLaQ9n9Rr0+Xb4228hJ78nv7cZd0MhN5dtNT3ZU Sf9eXtpxzM3XwsLF2cK+YtTIUE7lTj9UTUJGRUNFRkVMV0a5SjGjSTaoa2NXvb48xb/U Rc++OEjgUT1G0VdK6MbgTb3C6ca7vfm7uVzK0VFXXEZGTT5FSD5MTkhDYmVr0C3ppiw8 p+YuTqdKKa+zNj2w2TB53E07QNb2Rly3xU27tsnRu7TLxcPKykZa2zs4aE82TXlKTVRU V1/GRi3RrFcjrqMjPqa4Jz6hTSq+uDcx3Ek+OzfI4DvZr8BOrq3QvrS55c3cW/E6RUo0 O0Y/P3xmT9fo1LtFMMbFV307XqpKKK6sLS2rriM+qFMpWrxAPf3gy9fXvbi7wLS3yL6/ 1FDp/T5GQ0w+PWxNS2ZdXHTGzTQ80Epf2UY7XbPaK8ukNyi3sDEmv7kuN9fdWVdxwrzj vq6+vq654sK9TUZQTUY+QkhbSErcUFTcyMw6Rs1KTsB0N3fQTGK7Tjit1iPPqS8gw6ou LbO+YL/G0K+01Le027q3SE3FUzZIST5KTVBgcFbW1Nz0PVRmRdvDO0LNPkPX3UPpxTZi xi0/sy8hva0xKa2pSsKtvbetyNe53mDJRjjibTRD80NP7Vpg2s3CYz1oZVHD3jf6bUPQ 3kpov2w/Y0Y+00043EA4s7Y0O6SmRsOnvsWz5krQVz7xRTflXjx51D9QzG/PyEhOekrP v0NCSj7w0VFNXXrwX0A6Tf1OVz4+12PTtms+s6G9QLaq2evCTT5oSjtaSj/e9EvQzUri wNRgVkhIyn1uSi1Db93Q/T5U1+bdSUhN3lZASEBfyNnmvXrGqbZG66q7QOPIS1PiQ0Vr VFTL8GnF11vQ10JafVDd20JAWkXMxj9AQ1fbxutfY+nOZk1CXvzp3E9v1unRvFZDwLN2 O8a9WVnPX1PM7Vnmek3r80ZZZkBJ405IVEpP09Zi6z9G2dzWfVRT29HO71vez8rza15b 09xe7W1Dz71ZPtSx3U3Jw+PRymbtzev3z2JP71NDWVc+TWZZ691PTW5W0ddLT0xe2c35 evrfzOVeT/zr6d9XX+ti/8pNQs2/XkLMwuvpz+z/ze9d9mVMaWNFUWBKT+lgWXZbWdvt U1A+SG786XBgedTR0O1t5dfXYGleZdvo89rzacLDYFu/vGJuydHv1+BXaXdUVFxLTl5Q UXxxYOPd2dTwVFlaVuVdTE5T+tnec3NdaHZdT1D37d3d9+Xi7NvaT1vNz1dZys527+Br belbUWNZT2ZeV/bxaObX+Xd6Xm3gbWZpTGvX1tbmfHfo6e1eWWnp5mj08OLR2+3gdlzW 31BZ0dFWXOVuWmlfVnDza3ntZnH0XltrXldtbGn3eV5pd/3P3mhuafrueVtcV173emJs 19rX0d7g4PPs6VFPfe5UUN3XdnDreWvtbV5ubV9tZVdiaFZcd2Jg/W1r4N/o6V5019re 5nFib2Vpa2V63tHc29vj3eV5bmNX+uJlYN/Ub1/x5nprZlpdZl5ea2Z94/p38fxla2xg bHFcXnBl5uBlbPnp5eL5bWJfenlvcOnf39xzXmJeW2VbVPrZ427r23pfZmJecH1reuLp 5dng6OX5bXFlW15fX3rl6N7p9Nvb4vprY2tz/PBtcPnr/G1rYmtrX1xgXnfg+XDp23db X1tTV11aaOjl5tzd6e1vX19eWmBtaG79aWn28Nvc7Ont5eLm8Pr89Ojtem38/Hd9a2v8 7+Xd7Pfp7WlcaGVbWV1eYHNvdOng6/R6ZmNeWWBzbPDc3N7Z3vZ2W1xoZWVfYF9rc3p5 duvg4PN5bWVpZWJreXzm6W5r8Oxra+/o7uPjffHsd2tza2BpaG7w9v3g2t3a2u15+nZw XldbXWl6+nx9+vfs/Wtw7e30/2ZgZmlobWlv7uz/bHp8aGBob3Tt6//07mleX1tcX15m 9/f87fN69/dtW11zQtzWOr63Ll6xP1S9TVDJU07UYFvG31/T0dlRcMnv5sxJUMNKTcpL Y8ZQYs1TZtBeY9b0ce/uaHF3V1/9aF/T6Uq+6Di2tzRsyDtP00ZU0WNly1tezmNUWeJp Pl5oRsrMQ8zMSc7jRdT2Rd7oSt/fYNTb8+L5a15ga1dX11douVbwsT87s2I/xXNG1uNX 4t5p/M12bs3UX1zN/VDTXkDG6ULNa0XNYEjO8E/X207pYkprWVdpZltbcXpT49pKztZA yb49Tc1aTsvacMvac9f9VPz0TV3N61PQ11HK0D7U2T3gcD7iekPo6VDp02Pb12P9bVtb ZWVXaOhO19BNw9A7zcZQ6+ViZvB9duX0duLda23N7U3Rzkt23z1c0z/0yk/OxV/Nxe/P yN/l1mlpd1pbX1tbeejWzjgvttAnyKk3SK7TPlt6QjQ3Pjo2Rvz91r6zs7u3uePzyj44 6z873GVfw83RwM/czVbQvSMtqjghrqo23afOQLFcJjwwHzQ/Ns2zr6enrK637UY9Lyov PD9Gw7S3raq2tLT0Ym43OcYwHMiwIziguzfKq6stJrs+Fyi/LSits8agprGpxT5RLyMs Ly9Qxr6spKerq7PPbEw0LCs+Nx04qDwznp9XvqmqPh4+Qhgc0GUhUJih1KSd1C7QPhwh Kic4Yrmjo6Gep7e45jMtKCcxICG0xi2nl6+xnbczsUYVJzYaJ7zGWbadnbi8qMofJ2sn GDO7NjehnLGroLHOyV4zLS4dHdRFI7Sct66dp1n0rjAXJjAcIdrMvqGtsJy3MLbKHCFN PCcxtLdPvJ+kdsifti2+RRcvzR4wocNIo6nNym2t0xgvsCEdr7cxr6BKbaPQLuJmLT1C Lr6xKm+gTTakrFnIMSe+Vye2qjG7oywptycjo08bqqMnw5rNRrG6Nx85sC0kqqox26hX QqnKLcW9Q8YvHa+mJHaUrTSnqiQgLiAjRjEtvLbbpKbOqqY+XsUaIa0tHqq2JtCny/mv oLZIcywozldIpqCtu7y+PCEmJiPMxh/rnTEnn7cosKTp2bswPLE+J+NDI3TQLfSz2rRu LK2kVq+apru7djYdFCkwH6ydOMCdWSjU+i49wL69sdY3va0pKqnLJ72tLTA7HjOnQzma l6qeoFtNPhoeKxp9nTExnL4fQuA2fLSmocjDuSAk0Csvqq/ZsbotHCZGLUaepKiXqjrD NhUmTSnLmt4to74bKjsj9qvIpJzItMYYLqwtOJ6ku7woGigtJtuhmpejqrMqGR8mITyf mK29rTggIxwsrb2zmaM7Pi4VJ7Y22Zebqs8dIDkeH6ukq5WdTF40FRokJsCamqepsTAZ Gis2d6Sboa/QOR0VJlZmpJeewDQvLSEhVqagpJ2jNyctGxcnTaOYsbegPxwvISaqo6yd n2I7KhcXLeK7n5+zrLAuJzc22ba/qp1eIDcnGi3Oo53Dy6o7HCg4LHSdoK+qr2w0GhvM vCcsr6Ooz1+3xistvddWuK5bLz4xN7ZtJve0RnrN0a9oK7SrM9moWzk2TVsgKKan4Kec rTc0PSogI0imq1a7oapIHxszSDS6nZ+vvUomIS1Aa6qmLyarrS5prLC3XdCxLR40Lyjt qqOut6PAGhouJCawnJ6hp7G9LRgtySsaKaucpKqgofAdIzMkKriryru018qxwC8hKj00 PLetw8Kwu9m+wj0dFzlXJ7SXm56fty4dGBwqM/OjmaTFuaO7GhIpMyd6ppqfvr+3VCcZ GUy+LU2kmpqwdLFGGh9XST3Qt7PORqaaQCnALBspKjeqoaSZmjEbPi0aMbCw0NCjnNMo NjMoKDa/rLvdwKOeLx63uCMcKM24r53AJk68OkXUt6DLFSatKCCtpqiqYzhCJBgpn6E+ tp7ONtbUvmkaHba2Tq6uqZ3eLMMxFCNvQM2sppukQ0YjGrarJD6rZVu+TqydQ06hQBor PkW7u7eeniwXP1seLLCtuc9Iy6S+ICQ2PrY8IK+bt6SdSuuwJh0kHjbARaSfKTuj8UKz XD4+Iy3MLCmjl7otU7e2TyM2mpk8Nrw0JzovTLBFLLemt7DRLrStJyYxIDOvTtednqOh 1zQzHCe9NCi9yEm7s7Cr5kK02x0aP7BrLz60obYfKqe2V62uXs1OK+29LSpTOs6oPkCh q76kwyr8Qh0jJyfWubadrze3rTtKzzw4My1b1jFpoJ/KONCzxjYmOqSuKjrIOzvKWdqx Uz6wrdvDVCzQyicvTS1xqsu9o663szcvLx00uzszuLxsvr7Ct2M+v+snJlC32T5Lvq2+ Ki6utvq6uF1tVDBNwDkvWV/XsWs/rq/es74xQlQqKjcx2624pqhM0LNDNFZFNzs6UcVJ VK6qyzdPxsVFLDiurTs7aUJKytDNtuY+zb9LTkwzbL84N+Y6RbPJ3qyqxs9ILjsuNMj9 Wba03u3jzcVPOOnNNC0/y+1AQ+musTo6rrtIz8pO3M04TrP5O+JrS7/eONG8Ws3FMzds NCxF6MCzu6ywO0m+WUjGZkLUY1e+6TfLsMlDPG/IzjkqX7NlMGu/TNGxRTPWaUizr0b5 r8LF6C4vSjw6V2jGq6zbQDtANCZFvlO6sy0pxbfFrtQxr5/ZMUVCO1Y0JlC07L6mwkW+ wisvxeW7vCQdV6q5udBFqpqpSDMuNEgrGyPAo6iwrds7fDEfRqOoSSMdNqetTU27o52k XCw5RTkzJB5lnaG7ub5ATDAfY52hQB4gRqqwOytUppyk4jluvkshGh0vrZ2swK3DLSo2 xqOnNhoePcbK2krro5ukwDcwcE0fGiE2t52jtKxKHSZPtqSqOh8kWbHlPsq7sKSpyM/L PjAmHCEx6KOan7A0HSfCqq/FTT4tKVvROd6orbSsrLC5UywjHiMrLcWbmqlUJyRTsLHe LkO6OCE+vFq9pMo+t6apyD0uIRwjL+uknal8NjhUTeyrwC1zszAdLbzO/Kqms62jqdNF JxUXJnepo7dlzbuuySc4p7QtNnY2LTpCQmarnqSppqy9Px0UGjTAuMO9ykO8pMItTq6+ NDBFSD43KyY3r6OdmJ23QiskLS8mKC/dpLA0UKqsu75oO0plQy4tRVQxKTawmpWasDMq NjtPxTQcK7nPNlSzr7e0t8C3s0MgISYgM7Sut7azqJ+ktzcgLMbPOjMtKDNzzMa8rqq2 yLSu7CYaGSBbpJ2kvjYrxZ2g5kP9Pi43SEZCNyckRa6rqKG0OjZLTDgoICdWp52p32Jg Wr6srr32QjYqLVPiOzbpq6CgtzMnLUPetrgwHyzdybuopKq7TDNAv7ZQLCwoJju7r62t r6yvbCsdGy3Gv8bFSjNA1rquq6mqttPpRSsgHSQ+t6entM9LWrCkszgrJyEkMV+8sL4+ Nteuqqamuko6NC0oIyY9t6Ogsf3l5vzDucP2QDErKSo2QEzDqZ+frWAzMUD3yLr/KCZI wsi+tLvfSDg+xq63STQxLjzPvsLNz7yxvkguJy/OtLm3vlA/V9vFura+VDY2OjcwMEW+ rauz0VFAOWi3zTQtNDpCdsm+trteP3m8u7u78zs7Q0Y7Li1Gu6mkr95ZT0JP0c3iVj40 LzNI/ePItququVM7PU7s39bpOS9OvLnD200+P0lgyra20UpFPkDjyN5ZTWXDvmA5LzBP wL2+vdRNUG3WwLu4vvBNSz4wKys5y6+srra+22XAtMxCOTYzNjk6QFprXP2/sK+xueBA PUBAOzAvQNm6sb5OPUBJ2rOttL7WSjg3Q2N2aHHc4EUxMDpjv7m2tM1DSu/rc2ZRTVRR Rk3bv8LsTkhZvq6us7a7vtNJODAuNENMRj43OGW4rKqqrrhsODMwLS00W8C8yPRa+c3C vMVrUG7NurCzwGU+Ojo3Nz5DQDcsLD7Ds7G2urvAzuVLNzQ/Ys/G4kpDSFvOtq25VDg/ z7Gsrrz2PTQ3OjMrKzAzN1e7r66vs7jG3utcPTc8U8a7zUg7Rsy0s7m+wuU7Kyo72rSn pK7NS0A2JiErNjAzb7qzrKmsuN5KRkY7P9vK/0o7ND7ZurS3y1RJRVm90S0hMbakn56r PCgtMzxMOCcfJtaqqqaq11C3rM0uLErvUFdFMDe+qqu4Vz1QV1m+r6ikzR8dNM2rna0x LjYwZb43Hh42uKujocU77fw4T8jWbT8xMzrOrcY0Pc2+xtTNwrqvrbdNIRcgzqecmrwk JigxrrAnHS1KuJ6k5lZwQki8sNo+QjAjLdS2ur3FRka3ra2utshFNO2r3hwYLMihlaYs KDlOsLomFx4vzZyZts3OKSu+yEjWWyotRUjIrcM+QMCqrK2qvU5aX0ZvruYcGi3Nnpmz MygmXaGzIx8zTqSXtjMxJC6urXffSiMmQDjMob5FvLu6qavKZWU7Pr+3uU4dGCBCnZWu PUk/O6yoJyE2KGioxb67Kii8rci+Qxwk/c6oqDcwyr6toKjGwtwsO8t60SwYHUmklZzC MzNNSvRtPkItJDrNvammPh07sbqt3SEpSMqmpE03wsPGqbZCSTcut57IIRwdSZqd3Mjo N+wqHb6fzDMjHcybnrNIHiHCwL6zNzHLPi+0ob5fTCY2qq60zDbIvi0hNreordNWvrNK HRc9n5yuJhpGqqeoRS3WUS1NxsKqsywmM2akmsU0MSzGqbCotiQcO6qfocMnKD5MPiQd 6J2jPyEpwKCuMC27oK4mFx+4mqgzJCfKrddovsxlvdAqM8WvoKkzQr/LtDcYGiA0nZfF JCAnsJy26MrCpKQoFSTApLAuJlutti4fVJqYviEc35uXpEMxyr8uHx0kdqazNyoqy56z NzM+rZ2jrkgZG9Gpq7cqIU3bWk4mI76fpK7LvqOmyTotUMoqFxk/oJ1OHR04qaS/+beq r9EvHibKqqe+Kja3sMsqHCE2tJeVti82S62k8zQ6PruqOB0hLU3JQ0m2razCSL2mrTMc H86hobs2N3xUMCowXq+msVc7Qremvjo0SLGnuzsfFR7MrLHNMTm+v99PLD2ooavCQD5Z Pi4vSLu8Py/ppJ2wLCM2t6q+Ud6+v3cxJCdKvbO/O0W0r7dIJi3sr6ChxSwtOFTISjp6 wK2ndCoxPk1iPkXNu79POuW2wzMjKr2mq982Pt/vOjRF67esxUI8Psq2VjY7VK+pxUUp IDG/s75iO1a+v9BXN3asq7jPYNbRTD40PstzOTzIqKC0Ni49yLnmSFTby20+MC1Dxb7F UEDKusVdMTTbua+qvTMvPELR0FHoycO21jE3TFPgV0be1t9mNjzPzUYxLmiqqrdpPFRo SVFLYr64vMtTRVvKzllMaL6wu3M5LC08yr/sXUpa0d5mSkDWtr/X903icz5GRlbF3krd t6+wbzZCac/PS0rmdmxtRUNr2c/RWkjxzcvePztWzby7xk8zO13ixs933dPNyE83RVBN 6F1Uz9d8aUlZ0XZCQ1TAsLxrRUJZTz5FSmjAu8bP7F3Xxu1WWWLFvNRcPDZCer++fFZX es3PZk1K9sDG29xe9+BIQktMcXlKZb65vOs+RuXb5k9J39HU1FRCWuPb0GZDX9nb5kU/ a9bAvttOQEjrz9HsaP3Xy9NQPkVQXtPb7MzP6XFOUej3S0lO68jaT0ZIV1dITVpizsPZ 92xX9s/vX2hozcLtWkpAWdnLyvlWW/fb2/1XWdvGzOn5WWPpT0lUadPM+XrFvbzFXVD2 3txzU/noa/FbQ01tcdzcVl7Z2dPuSVT0/NTgTUNFWdvU5WBl8drO31lZbWl6eUxTa01K SUNW61dKU13Tw9tfbHbW215lcHPWzfBjbV/l0XZi/fnLxd7/X1Bm4t90UEpNY3xmXFdg 08jN1t9u795cW/Pp0M7s7czM0+BPTfzm4u9l6+h5+WBNTlZf7ltGTV5l8GZQd9PMxtFr VFfv19beee7f5u1bSU1ic9vX/9veW1ZJQ1FXSUpTXeDiW09Wa+Li3tfR1tDZ9O1eXtfc /Nzj2s3mZVdJVOjj3tlxW2L8eXNiTHTp8O5pa3bb62vp4NDL097OxcrU61lm5XNjV05t fWVwVk9gWV5iTU5saWNpTU1m9OzvXVdud/DX23FbXF7zdF7letfD1nrtemtPRUtTYG5l Ym7Z1Oj9XWXo4ulg99vm2en07Vv85ltr3OvWz/du/W1s3t/06G1fXnxpVk1NXlbp1mPg zd7md17o8V7u49rga15NZf9r7Xbi3tvX+vBiX/xiXmlZcNt8aentfd/Xc3ZmVmb63uPl XlNbb19R3ungytPt729pX1NPaGtUXvx94sn2TfpgaP1eXll85eZ3evNcceZeT2NgXVxi YGbi39bI2m9dZXFeVk9NYt3szuDjytdt9G1Z5nZi6OLZ61RdSlrzSlBZaOzeztve2eJ8 Xul6V/fjbfN0ae3bzdvP2WnW19TWXm1vYNt2adle4+hKU1dRVGBx3uNgX21X+dp9UU3u X2vx7u/w19lpXn32T13dV1B06FtUc11NV1ts7ltuaF7b33NvXuVjX9NZadNaVnrb1N7Z 0drTem5bSE/M4FHO1+3Q0NDiV3frTVDZ5m/TyOD25fZlduP/Xldp3vBg7fFp+vltU3Rs VOtUW9dseltJaeNbXltTTnneQ0jX19TlzdNj+ltmW1b5WVZiVuBsX89rStbW+dbb2+jt aF1zX/T/VHbiT+vNfcrKb9Hc5c/xYl1ocV13T0PZ30jo8c/jX85taF5bV07u+dzKW/D3 RvbPUFNwYtfcfdfRb2LWYF3OXlbTaU5KPlziWeDMdvfUye1RY2/o2kZzylPlVnzTT11b VGh93mBr5W3N21ziZUBi91vtVk/X3Vfp1F/r0VDlzVFm3ffUaEv9ee7c1NdKZetZU0pX w8t9xs3MdF59VOtdSFTzfGjM3lHf2l/oxX1dYlva4F9sZVNeWUhR115R09Zpa+bL0d7T 9OXpW9lWSlRj20Y+2etsyN7N0/nfVGDZZll9/E1ea01RW1NFbMzR3t3ffXre4mzr3GVI eflLXvb9XU5j6XHW0NvjaeV5ZVlF3shMYNRr93b97eXmZll61unaynZz2X1TbN5tV1bf 5lTx7FNu1mv8w8pl3dlWXm1eXmBrc1lw3t50XPBs7M9QXtBl2t5m7FRGSmbpaGNeUUVI d9nIw83s7ejla0tUTT5GTU1TXvFf78rUzsXX6e3l3tvL20M6Pt69u7/U6dBiUNtlTUY2 Nk1wV2DNvry7vcj5STs7SOPbefDTu7npPjZA1Lu2vMXK4u7ma1tDMystPUtP1sC/wr69 vr/bQklmSk1TSmzO1004NDlUv7a+w727u73DbEM3LSwxPEnwzuXtxrmwsMB8XmNWSEhN VnRePjArMWKxq7G9vrexuc5zOismJy9CUeLDvbi0s7Cxzz00O0BQXmLWvbnZNyoqQLer scjOt66ttNc9LSYnNE5PUci2tri9u7jDTzc9TUNFXObFv2kwJic3xq6z0/a4qqityDop JictMzM54raxucLCt7C+XkM7OEBexrq+/TgqJi76s7Ta+bSmoKS3UTQqKCotLDD/sKu0 0/2+rbRRLyswT72xs73RUTAmKUO9t9BZxaqkp7H9OS8pKC0vNtqsp7RaQ8utsVQsJzN2 vbS60O9sOScmMG64uNbPr6ajp7dQLSQkKiwqPbmtul1Ru6iq1zQtM0rWyMbjYtlPKiEn SrOwb0y4pJ6grl8vJik0MCg0uaq3XkXGqqrKOy8zUL60t9ZL1N8qHSNNrq7/SbOhn6Ct Vi0kKDo5KTaxpLNGL0+vrcw9LS5NwrS24j1evkgjHizQr71K3qujoKGzOyYkMU0vJ2Kq sF4zO7uqunNIOUPMvbrJPjlxbS8hITu3tNbZsaSgoafCLyMqODYpMLqt0zs3VLu+ZldJ RcqwrbPbPllTLCgtL1DNTuitqKemq7DKNDNFNC5FzLxuLStC4s7ZT1fGuK2qsNNCSmwx ICvoczw+Rcuqpqetyt/NZXlNKjPKYjg0Ki5OQD5cUM2vsKunt/HXVi4jITTR4zczWb6t oaS2z9e/s7tpSmbjNyYwUDcvMTFA0bGnp6mosLa7NyYsLzhGMzzIWVS999evy82rtL+w tLfiKiMpOEwwJy0tPLSprK+3sau3Y0ZUQCkmNkVP28PdPk7rTb6vyLOot8bNQEBQLSY0 Ny9GQDfPxt+xsc3Qxq+ntFYuLUhrZuU7KzvRzMDAfLSks762w/dINzk5L0DNSU7bMzd0 Nj65vbSqvrurwFRsNjBCMzNWSkXDsLtZPjvjqq3DzUU9zrq+bDo7PTw2Ki1CPD3bvrOt ray24NFvQHlXNEVPNDk+N0z6TWW8vsixsbqtu1rWVjM0UNdcQCogM01atr9O172vqq2x ure38ExUNyopKC48RsKzuaqqyLi+Rc271L3LP0hFNjg3MTMxMTtW18vDuLfoc728sK1e Pz8rNms+ODY0SODL0Mq3uLqtrba3bUNNMDRJLzRpPk+33kjZQ0PIaG+90d7GyL+3vOJe STk3PuvbTEg5Pr63s6q848DDxsDWQz0/LSw3NzxGTPHDw8CzvM+85j1lQzTt1HbDej5c TT5OSkJGSE/Ut7Ctqq245m3b38jbNzEtKjY7Njc2RfC8q66rp73RwuDi1EU6NikrNi07 2U3Rs97dvNq/scjFu8/FuLy+wl07NzAwNz95fU1QQ2a2uLe0X1TL17q9Ylc3NDozSVk9 PTs7TWjZvbvAusV0ys1mvrrRyus/S0U5RkZATFNjzru7vb7K7UY/VF7z4j0xNjE8a0pN 9mW+ra2sr7bGUFFNRUg6NDQuM0lZzbGxsa251srgbcp6RlZISOXbz8jfVklCQEJNfd5j UUxK27/Ixc1NXt5p6WhMSkhQTE7T4mLjXnfN39rOV01WPUBxYNe2u8C92XfK3vnWWklM Q0rszsbG0etWRk1mfN5rPjo5NkNXRktRXc3FysnP4+9r19bby+784lFd133zzlpN+kxD XltpxsrQwMbFuLu+vtxTRj07P0he6GZlaV/XyNPW4kpJVEpNTkBASU1RZuLtd9TU38XF 0MXQ/elRTmhed83Q9GxLQEhDQ1NTT1ZQcM/Gvry9vsjUzs3b22NAPz48TF1PX3p0187d +fRjTU5eU1RrVk9aT1RzZdnK1MbKd9bL0b64yM7MZVfdc+/bSj49NztKXNvKzc7KxsC+ w8nWa2Z2YllPSkhKTU1e/1185mLx419paU5TTUNPTk3e2V99XEVZ5vPRxtrj0eztysrU ytFeSkpNSnz/UVxRSFF2dOPO0c3I1t3R6Hns4OLm2+tz8F5UW01U+WV05k9IXFRb0+Be b15OXndcYFdKQ0VPV+jKwsjFxtHFwsrDyWlTXkhGXVlPZXFW5svWyMLW18zb39B5WlpG Sl5d3MroYlpFSGNtbt70Xv1xX2v6X1FPRkBFVFFZY0hKV1Boy8jNxsbX09Tl5dni/9nm 787R4mU7PVRfxb7QzMXKy8liTXpWUE06O17Z3dZoTeXWc2JWXNvQ61xf79PWX01FRVNP P0JOV2D3aXzDyNDAzdzJ3tTCY0xNP1vJ09rQ7tPDaU/3YN/Gb01jbt/AQzu/4+DD7+XA 00NUPzA6OzpeaEPew+PW3UrzzUNF4FP0yFZtzFluyM3LzktF7VxLXFfiw8rQzMrJy9H6 eUrRvkBGTUVjeUVct8bFudTp6EA+c0U+8XfrvuD/r80uxb8628Bz0Mo3Rds4Puk7NF5I Q3dGRrzAStbKTXHcSkbNz8ixy+PD00Y9PjhQbPm7tsjKvuBZUzxA/D0x27lXXMLXXFfz 3L3IesPJW97IS0rb62/IzOm9zFPiXELdyiwrvlw2u7dNvrxeaDctMS0nOmNI2bG0sa3F ua85MMhGNF3Zbc7vTMLRQ+7NOV23UWjAV1DFTzdIRjtCXk/ltKyxuLi7yk1AQjs8S+LJ +ci361zKZjpDw8pG1rHFRXPlPTNAQ/pTPra+SLuuWui+Q0BTMS9FNzfzUFO7vtnedL3D /M7KYlbcZjtCSDNAZVnIuL6xq7rFvt1GODM7PTdK4PfKWdatSlat2zi/vj3lzjtIdC03 aDRLu9rGq62us83o9jYvNzAxWm3vub7WuLo60bstP8M0MW1COzs3Q1ZA/LewvLqnsevF vD4zSzoxV2xdt7bMrqriu7BJPj0xNC8uQDtDzMDNuLC8vbfNWclfMElKMzluVEXZvcbb tLbbv1tG6DAsQC4qQ05Gv7u/ray8tLRxcNw4NEM7PDk0U18728Ljs7C7uLlpRUowIS0z JkC+5rekpqanrrO+UUY/PDAwSko6aLrtTLat+ryx//NXOz0tKjktLUU+W7C3tKanrbG2 0Eg6MCsoKTE+Qve9tqywrbPFw1NGPigqMyYoSFFAv62ur6amsLTZSkwrJDAoJEjlP8Wj qK+ksci/Pjo2Ji02KDnTS9Cqs7ekp7OusdlIQjQqKCosNkBLu6e2sKGtyr/KNCcsJiEt LDTw/LuqramjqbC420VGLSMsJyQ3P+22s62oq7O0s2gzQC4gKi8oNvTtuaeprKipxe2/ Pic2NCAp3k1Kr7e8r7+2uErKxi87YC472Thar8a2pLC2rbvR40g3LC0xLDxNUM/FwrrI 181LUGM/TUg6UFM927tmwKrO0LHd71o3cDcrbDopa9074MNf2sJt07z278pKRmtIRVtt Qvmz28u0yuDG1EtOSjc6PjY0SlFG2b7Fwq6qt7Cpus3IZUA3Pkg5Q9bI1sKxvMrJS0VA KzE2KzdJPXzFzLy0ra+7sbs/WdQqMfMqMLpGTaq+X7rLQDtDNys7RjNMxs/Iu7C0wK+z Wt7MODlbLC6/NDOuzTuztErdyD42SDsvTfpL0be9v62twreuzOW5VjHPXi180TZM10NG ZWtFPGhNNvPPQ9O20Ne2wE/OxjY+wjEzrWIzrLc4yLs4PVYwLkNDPWnQ3r6xu7itt8C4 0UtZSTg3UUo71Mbm49e/RjjWOShuSizUv0DFsO6/qr7WscA+69kvOb5DN7TFUbe32dPc S0I5NDc3Oj5W29+/sba3s7fG095LOT1KNyxoUC3QvD3GtEzUvkNI4DkzUUs55rfNwK22 0bu7TVnZQz5dQ0JQQFDzSF7bSOvWQvHZPN+9RtGxzM60vVN6uDszuT4ttO00sb8+usU5 0cM+UcpLPt7ZS+2929691+vQbGVwTXZsPlNlRVvfSmB6PE5zPknXXk7vzNnit8VXuslD yGs06Uo32lQ/1NZc28rQXWjgS0VNQkA5O2VJ47O+uam0w7PFQltMLTZfMzrAZVm5v9nI wsrt1N9D1nAw28Y+va/bvrbZ3+xAQD82QkhFX1zdzlbU0FduTn1aPGNXNFDTUNO0v8Ow vuC/Yj9fOy9OUTdZ0fPXw8rmz+hGXl43Q144TOhbvch8t8BouMhK0PQ9TVdCSdBKQ7fu PrbINtDFP3fIVu690dm3wPrFyV/p201GW009WVFG13BI18xWXdtNTW4+Zt49ZspNaM7Z 4NbWXsjUP8vdO93mPmXpQ1nfP1PMUUvO4F3l2/D8cF9Rcfw97b09Y7dWbrfZ67jtZrto QttIQF9DU9tb28LMw8DGzb/QTdviOnfUP/noWdPL/97C3VbbXkNFRjg9T1Fl9sXCcMLD SnzePkNrOjtlPE3gU8nQzbfN1LvTSeZMQk5LSUPWd0q8ylDI9Er8XkVQ1kg61kUx1Fc7 u8hRsLfQuMLO7WDXTUP6dkjN0Fa9wnG+yWzK7F7WbFzoXVBMS0hafU731k33zGve13zg 3etg7MpLRdlCO/FPPc7pQtPRRUrQTj7obUP33kvty1Raymxe0N/dyG/t0VPuZVTlVE3/ bUb60ED9xUPTvU7Xvmj5yN1mfd5xWd7eWenL9uLLzfTjv9xswulZyOxG6WY+cFZCXVZF WWxTY/Nl7t5cad9PV9tIRdZIQNlgStPPWc67+W++90rQ40LazUJs3Vtr2+1OY+VZXNZg VOj3TWVcRVd6UOnLWfDTYMzGVla+4kK/ykXJyU72elTZxlTOyUPZw1RCRsLRT7TGTsLZ T2lTSVdNRUNZTUPfW0nU4k3pzE1PyPBlytBKX8pTXs5PXs5OV8PocNtTV+ZaSlntV2zj T0rc1+vN3ebCyFZbeU/c5VBQaNPoUczwV85NU8VUQ2xmXsVa4tbAUUixN+BzS2n9y0zX 0HbZY/3GWdPP6bzuWVdPbWPv10ZCU1RdVF/oSPDGb+Xg68rbXUlJT05WXkLlyz5N0FZP zUxJwldLv3pFwtlivulm6dTjz9lu9tfK2dzxZdnQV/PrSWL6RWjzbV1040poxV5ZxltO w3dKy9tN3NNN6co+VM1FWspe4r/Uds/bV+NZUGhfZk5MVE9UVk1UU0pz033oZlHsaVf2 1/pM9NZZXOZbXs1NWb/NW8a/8Mh5SMtwQ+P3Q2bfVO3dfdTr69njduL0be757XpLZeBj Xm351/Rtztlb6Nf0ysroycxW18pN0GtFZUDx1D/dylFIQ2Xd21vFPlawNGa3PVstN7NA MbaxPC6/zOA6Q6xFUL400L7KSjy471BJT7E4KbfjMTTAtGjKTE2vPlqtJlGtMdnKPe7P 07u7Q96+SNG+TNTKzMM+aLfUxTlAtzrRtDBOu2vFwE3p2dHg9jxMwmNbXjRNz9NIP8ve YMbbUPngvtc9Rl7N2U1FO9HzO/FPRtTvTdF8Sl9gS01TTlbi1GxWZehra01eU2bA9HnF 1NbF12/M00953lPX7F/Gd0Dmw8/K1FvXzFzb3FT8ZVlZaF58bV5tz2BG0WnZXNnCfNl9 V/zX3U3/3Ejd101m1GB31k1M1Nxt02lGU0tQw00+2VvWQ0VMU9dOYnRR5l3zyuDR81fP 1m5mUXbcc8ve0c1RW/3W7EBN3mBW02ltxmBIeuBFTexQ49NMXNPe4MjPadzXfNZua9dl 3tZl4tnW1/DXY1ve+vPv8+nt29f6XE5XTDvb7T7GTUPvTNRASrdaQ3nfT1Diyno2vKo7 OcJoStnI2e/Z+ndTaFnDyz69aEXxOk7pV0/uyOJJXuBIV9PmSFPGUNG300Y+xb0+Ta+7 O0xwzrQv6axX+sZfQF7KadfQTFzOyjhPyE/uODq9vlYrebs+zt9oYjjFv0U8Q8vfVOVg 97/0aNFj8GJZ6NtRcM/N4Gvb41noY0xwemNzWU1ba+PeXlTl9lreW1bXaFv/XO3RaeDb 9trj7eNsYPz3//zl1NHic+vN1jhIqnBD6D6+1FDgPrvCV0ZDcEWz2TttPLbZJsi7OGy4 80rIQ9S7Q75aOuUz5ro+V95TXM399G3CYD3NzDh9uytIqz7IzS3RXEtx/bfjQjnpxmXC TsI84qswObFbOcq3SEisPDusRU+zbFFfw8lDUeLN3mbA3z7ZWz5e1EJGz2jWz+LJUVvM XkhT18/3+uxdbszPb9zTSkLWyk9W6HlKdsXzVFdWSEhL4uLuVF30YG1cdGVRYl5KVlpc 6Gtb29r01NvW5Vt2+mhf+dnezcrTzf3XyO5i92/p11T80OL3TlnT2VNKSUxWdOb/W1Ze z9NmZVBQWWLwY/zTbGnoadTI6N/mdu1g/ONreujmXv3Xd2JQVuleUGZv+dPmWl5TV2Nj YF5gW2vrWVbrfejO7OjDVkrI0Onf3N501t5ia3beX3fR229taNviXllWaPb5Yl5fTktd bG9faO3l1+1m8Whe4Hbx3mblzX1mdk9efFde615NVmBXW+nbbW3vV27mY1ZNU2lf79Te 3tna3dvX39TL4Gjo2/pl6dTrXmBPU9f8Q1fp+tvx9M7WUEpiU01KSO3K3NnZ0cjN7dDI 4PPe72NWWWJp7VRWws5LYNr6WkpD3t09SVpLVFFI/c/o2cvLzM/Tztf9dFxMRkNIV1k9 Rr7O8MLO2tNlSvFRN01MQFZFXr7leb69wLvJ18DOXllQSElOV047UcB5cMXLw8BZZcVL PlNAQ0Y3VsDXzbi7t7rJvsLxWUY9ODtDTD9AwsjtvcPa0X1N7UU2SD45Q0BNy9feu7nA vL3L2ltOTT47Q0U/PkbLyl7Ctr/Fzl/L9DE8QDM7Pk/O2cqzsLO2tr3L61Q+ODo5OT49 Tb7F1rexu8PK5dw/NkA3MDk/VNPayLGvtrS3wNBrRj4+NjY3PzRCrVG/treuxrlQVzs4 Nys0MTRba8a6t6yus7bGSkZKODQ0MTMwOcq727yxsbbCXtddKjk+LzEzPu29sa2xtqy3 w77a30UuPj4tNDFAysjQuq+ztLfN4mMxMTgtLjY7Y97DsbCtqrC7ynZtOy80MDQ3NE7T u7e7r625yc1xSTMwLyovOEPayLuur7SztLrF7VQ7NDQvMzs7SGvKvL6xq7PG22tGMC0w Li45QF3Xv66qra6vt9NUUDctMzEzOz/lxc+zs7uttNHJ4kA2LS8xLTNIWc2+t6yxrrPC tP0+WzcxNDYxN/fa28qtu7enW7u6K1k3KlQrK1dTPtuqra2/qqdJu1ks2SsjPjc7xU1R rcM5rapcfNTRRTY3Kj46LNROVqnFzqSr3rG8cdAxMDsvSzw7xt7Gu0+4rEPAt0jGPzNF NC5JYkDLyde0s6+9WbbMRtw5NFdDRUBKz9dmzNHDXc67SEhiTVdLP0hW30rw1unNyMXI 0ObP405MTkpm82lpcNHR2shcU9lWU2JMTE1NWtbeY83Gvsn2015aSEzdU+hdU9nTbmvD +fDFYmjT/01GVGVuU2lo9MzgaHz/48XbVmZrTFtKSFlTb21gadbU+s++1kxbQ11wPD/p /Vfpxr7e1sjdVllNSODoTVDp7XPrTePcW97r3uVZbm36W0tP0MpzTXzC1F3g5XDs0d3P 3k1QTOjXVu7fee92etHLV0Xl00n9XUXPyfrT5mvIa1vMZUNIZmld42lr1tTe3uBtc032 w0tNRjfTU17LQL3JP9nXYm1b3sU6TrRNP9pZU1FlzHfPxfxpzV5U00DLzzvmYEDfwlzg vc7a3npiTuPWQz75SuXGTdpJVrA/Sq7LTu1NU80t6L4trrAnzcZMuV/X1EPevjlKvnfN QDfO2s87TsL95srIWTdzyP07NOjZTexKV7fjU8LlZtnpaV5GQuZgXFdO1uDW02LXzeb0 b1RFV9Rta/9r82hp62jl193l7dbQ5uLxVk7maElt/3DiaejNd97bZXPRV1lPUb/xzzk2 qsguuMrXt08/0VQ4zUnK1Cyxvie3tCzJsTNtwi/Isz1oV2i7NlTIN9HaO7m/Ospa7b5D XfFIZsVGO7N8YrwwzsUzvm/TsTY227s+22bIxS2uySzIzDFgvdlAv9Y4vtQ3xshMRVHN Xkhayb9T+spfb1BdVn3ZSN7madxr5VdKbWBXU3Pb21bjyWBPzc1a3s5fT17gcEJf6Uja w8rUevBzTPfLUU1p1GhAZsDORk3DfFfGzl594lvp/VTaUM3dRcXtUVz8y9nT31lWd9n9 TU/o6OPtTU7cfVbd1m3p6OLbTT9tcGL86OPX11pU7WJPZu/ocfPt6V9f5mNs+ktGZt7Z WkLNfEnGTMxKU+1r1FP3ScW9S07K32ZKv94+ZWDUUFBiQM6+2sbKdk1QbONxaVRw2nDW V+nXaOncTFfbY8zObs9eY9HIzffLeUr9aWJdfOXf3nNaV2Bv3+1xX0tO7d7T+k9W6F1c WllQTVZTXVP0zNZrbHpPTdPbT3D/c8rNfM/Kd3TtV0peaGjmTVNWaGxN/NTc419p9Gvv eW9l7+t59OhdWdn8Vndgd9bp39DU39bOXlnt6OvtbHHj2c784M35aehca3bt22xt92Vd XmlZV1Fm7XBw7N7u7HZbXE1LWlpOTWJrWnrZ7W3c3mtlW2BsZnzp9uDj3t/l4t10WVxo Ymh5XmPm6W5u93n2Zl7lV23KZtHeQM3wPcvtTr7cQGnKXnxz2kpbtDxZtEBXT0XF+UW+ u14zycLrSz6wSEOzMOuwPkNpuVrOY0OpTimwxjc807NFSO02u9suuT47qj42rbc4VNpI vVBIuENNyTzxzFbTWVqz/Uq8QkPDP1nAP0O7T17IPVrQTdxKQ7bQYmhO18r3aUj00Etb 11pa68rRbl5g0NNlT0hjXEnT3kl24FTp6N7I8UBKVltvd97M4mvM2fHwTj5ZznRaaGNx 3mtN3/xJyNM/1MNg+b5Z3stQ0+tcQEzNV0pWW/HRzcvWXevUbWVjbfb52cPabMnK/crb YNBobVxTYG9cS1ZNQl5RPlZQd9dFV8bU3c7G2UJGaVNgZWVt7Nbe0NPRytTZ6ejKblPX 1mtWSVtoU0hIcG5NT2tUX9RQWcp8VFtscE901Ghf4/Z219nXyu3s19nfXnpxVkxPXkhN 7eJ2Vlbzy9Zg4tlt0dbv1OVfa2haXn1W4sVfw9NFu87bwFC3yT3c81NPUFvWNECzVzhN 3/dUc93v0N9oXk9I+c4+uus2vEs5vsI8yrppfVxeeU5j104+V1neT0reMUqvP0mtvkNP XMu+L7nFJKuxILTCLa/TSs5Kb7lG1r5svjZIt0teRjpeXU/a7mhCXMLMSki8yEn5TU++ fVfi7dTa+uzG3lfFy33Z+c3Na9f2Y/FuVmNFO1Z2W23mYGjoc+hZ+uNbbVlgzu5W4/Nw 1/px1H18bmjU6GDc5mbe6UtsW0PUytcsMavuJrhlSq08O8hCSL70xTsvrNktuLc7xrZF 3to3wrpRzT3CvTDb0DpQSUjTbEpecMPrPcnGS8/NNmOwS8ZgPK9NRrt8ubw+PsvfSLw8 y103q0Uqu8g3Y7vbOM5ePbtcPL7UQzz/u973X8zGXL/ePMXCUU3KxUJRa/n9TeDibdz6 VEJC5utDT+JLPvZ2VO3RyV9e01tX6Hpb2s3dzdPv095teWhiW1H93lFp7Upg0Fxf2m33 b1RabHN2Y1Zx6GB65Xbl4u/e2dTJ0Nbe29HZZmNTdmgzUEXN4lvGSs3OfGhobOlc/Wvr fFZp+cpcPVdWS9bIv8rbydbZzN7tSz5TPkJWU+3eS9nKQ9RON7fsTL47WrlObr3fVD5W Ysn5O7633tDTu7nXRUXePDjTQ0NuTczKUFnpzk1DRlDIfFTFeXbFTVTzSHnQU1fGw87N v8jb+VBPS0ZFU3br63ZudmZQXltP/GVd1u/rzmti2WVDSmDs3tvdyMbKw83p9uZeSlBe Xvbb09lcXWBTSz5AWeDW49TIyNNiUE1DRV5WV9zKvru/wsvmc05NUFRdY9fJ0+1rW0Y9 Pj9CTejQycLAxd9RQkI+OD9RXuDDu8DK09l8WVpUTlF3183Iz/HtTz8+RUZCW9fNxsXD w99USkNDQEZ22dDJwr7Fzc76WWZiVFvj2dDN4+ZrSj8+TFdRVs/K1MPNydlDXjs/0DdF rm19s8pdcdZt21Pi5ne8TshwP7YtJrg9Kbi8VD6/uMZAO6w6Pcopv9lAtkJWscY3xaxC MbG9WVnKs+NUSDjlMzm7KDymMVmg/0K4PGmwKzu+LVq7NFG4wvFmRt+720L8vum3t03X 4zs/9z4xNmK7zlnL1OnMzclFQ9tIPuLNVlO+21vd0MLNS1bFzdHLc8rD829FRkY0POjx VuDO4NRuXO1NXFtPVEZK399WXszD6ejD08vt3cZoZXfN4GPwQjs6Q1dCXL7Uc8va8OlP VF9NSltvXOvU5uPW2t3TzcnO0VBdt1BeuztpSDbGPk22ykBCw1vUbWjdPL/vLcjIMMi3 SLhZ9MM7utvvq2g/T8DPT0I/wCp9ryM7qj88tLZD6L4zfLc798lGQkq+v05N0cLb0cZT dtFWW/n9THFlPlBsTVDry+9OWXfoYExbfFZ80+hXY+Vm4MrPc9fA0enZ1PxuXkpdU0rO T07GQE3tUNlO18ZJXOBfXFNiwlkzw7RARcbbWcnIer7FTlri20b0S17bPNRZMM3GP+LC c2bzSlHO12L6YunURtm80TtDsNk9u7ZxQFtWfTtu3DO3win5yg== ¥enddata{mailobj,539461880} ¥view{mailobjv,539461880,30,0,0} Bob ¥typewriter{¥smaller{ --- Bob Oesterlin IBM Application Business Systems, Dept 53Z, Rochester MN 55901 IBM IPNET: oester@rchland.ibm.com Internet:oester@vnet.ibm.com Phone: (507)-253-4528 (tie) 553-4528 }}¥enddata{text,538724776} ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.29.msg ================================================ Path: flop.mcom.com!usenet From: Jamie Zawinski Newsgroups: mcom.test Subject: Re: attach this, spanky Date: 26 Apr 1995 08:50:20 GMT Organization: Netscape Communications Corporation, Mozilla Division Lines: 103 Message-ID: <3nl1gc$lkb@flop.mcom.com> References: <3na39m$3lf@flop.mcom.com> <3nkvv6$kmf@flop.mcom.com> <3nl02e$kmf@flop.mcom.com> <3nl0gd$l55@flop.mcom.com> NNTP-Posting-Host: lr1-port2.mcom.com Mime-Version: 1.0 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 1.1 (X11; U; Linux 1.1.47 i586) X-URL: news:3nl0gd$l55@flop.mcom.com Path: flop.mcom.com!usenet From: Jamie Zawinski Newsgroups: mcom.test Subject: Re: attach this, spanky Date: 26 Apr 1995 08:33:17 GMT Organization: Netscape Communications Corporation, Mozilla Division Lines: 86 Message-ID: <3nl0gd$l55@flop.mcom.com> References: <3na39m$3lf@flop.mcom.com> <3nkvv6$kmf@flop.mcom.com> <3nl02e$kmf@flop.mcom.com> NNTP-Posting-Host: lr1-port2.mcom.com Mime-Version: 1.0 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 1.1 (X11; U; Linux 1.1.47 i586) X-URL: news:3nl02e$kmf@flop.mcom.com Path: flop.mcom.com!usenet From: Jamie Zawinski Newsgroups: mcom.test Subject: Re: attach this, spanky Date: 26 Apr 1995 08:25:50 GMT Organization: Netscape Communications Corporation, Mozilla Division Lines: 69 Message-ID: <3nl02e$kmf@flop.mcom.com> References: <3na39m$3lf@flop.mcom.com> <3nkvv6$kmf@flop.mcom.com> NNTP-Posting-Host: lr1-port2.mcom.com Mime-Version: 1.0 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 1.1 (X11; U; Linux 1.1.47 i586) X-URL: news:3nkvv6$kmf@flop.mcom.com Path: flop.mcom.com!usenet From: Jamie Zawinski Newsgroups: mcom.test Subject: attach this, spanky Date: 26 Apr 1995 08:24:06 GMT Organization: Netscape Communications Corporation, Mozilla Division Lines: 52 Message-ID: <3nkvv6$kmf@flop.mcom.com> References: <3na39m$3lf@flop.mcom.com> NNTP-Posting-Host: lr1-port2.mcom.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="---------------------------2082357617733318156662372089" X-Mailer: Mozilla 1.1 (X11; U; Linux 1.1.47 i586) X-URL: news:3na39m$3lf@flop.mcom.com This is a multi-part message in MIME format. -----------------------------2082357617733318156662372089 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Here comes an attachment of type message/rfc822: -----------------------------2082357617733318156662372089 Content-Transfer-Encoding: 7bit Content-Type: message/rfc822 Path: flop.mcom.com!usenet From: Sharon Iimura Newsgroups: mcom.test Subject: Test for Bug 4498 Date: 22 Apr 1995 05:13:26 GMT Organization: Netscape Communications Corporations Lines: 22 Message-ID: <3na39m$3lf@flop.mcom.com> NNTP-Posting-Host: diva.mcom.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="-------------------------------12402385823900" X-Mailer: Mozilla 1.1 (X11; U; SunOS 5.4 sun4m) To: sharoni X-URL: http://home.netscape.com/eng/mozilla/1.1/unix-1.1.html This is a multi-part message in MIME format. ---------------------------------12402385823900 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii http://islay.mcom.com:8008/regression/test1.1b3/bug4498/ -- Sharon Iimura Netscape Communications Corporation ---------------------------------12402385823900 Content-Transfer-Encoding: quoted-printable Content-Type: text/html Not Found

Not Found

The requested object does not ex= ist on this server. The link you followed is either outdated, inaccurate, o= r the server has been instructed not to let you have it. ---------------------------------12402385823900-- -----------------------------2082357617733318156662372089-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.3.msg ================================================ X-Andrew-Authenticated-As: 4099;greenbush.galaxy;Nathaniel Borenstein Received: from Messages.8.5.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 via MS.5.6.greenbush.galaxy.sun4_41; Fri, 12 Jun 1992 13:29:05 -0400 (EDT) Message-ID: Date: Fri, 12 Jun 1992 13:29:05 -0400 (EDT) From: Nathaniel Borenstein X-Andrew-Message-Size: 152+1 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="Interpart.Boundary.IeCBvV20M2YtEoUA0A" To: Ned Freed , ysato@etl.go.jp (Yutaka Sato =?ISO-2022-JP?B?GyRAOjRGI0stGyhK?= ) Subject: MIME & int'l mail > THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME. > Please read the first section, which is plain text, and ignore the rest. --Interpart.Boundary.IeCBvV20M2YtEoUA0A Content-type: text/plain; charset=US-ASCII In honor of the Communications Week error about MIME's ability to handle international character sets. a screen dump: [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] Just for fun.... -- Nathaniel --Interpart.Boundary.IeCBvV20M2YtEoUA0A Content-Type: multipart/mixed; boundary="Alternative.Boundary.IeCBvV20M2Yt4oU=wd" --Alternative.Boundary.IeCBvV20M2Yt4oU=wd Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable In honor of the Communications Week error about MIME's abilit= y to handle international character sets. a screen dump: --Alternative.Boundary.IeCBvV20M2Yt4oU=wd Content-type: image/gif Content-Description: Some international characters Content-Transfer-Encoding: base64 R0lGODdhEgLiAKEAAAAAAP///wAA////4CwAAAAAEgLiAAAC/oSPqcvtD6OctNqLs968 +w+G4kiW5omm6sq27gvHX0DX9o3n+s73/g8MCofEovGITCqXzKbzCY1CEdKq9YrNarfc rvcLllLDQUDAjD6r0+y1uw1/y+P0ub2Ov+vz/L2/D/gnGEg4aFiIeKiYyLiodjR25kDW WOloiXmpmcm56dkJ+ikaSqqn81ATaXbKmlX6OhoLOytbS3trm4sbmLP6uOqrKmmT1ovj 27Sru6zczPzsHA09ndj6SxN8kIoNjG29PUUtLk0+bl6Ofq7eZux9zW0APtzdDqwN7x0/ z5Pev/7vLyDAgQKL9RpDT5K+RwzdHWuILNgwOzsKErxoMSPG/o0aqz28kVDYGokHQRKj gkwOq44cW7J86TJmuW/usi2kpy/ltojETPY0aAymUJlEhxotquigAofCIgLtybCbxJTs giI9ivWq1qwwaUJVSLLdx6g2HTLltzUtV7Vs184cO1bVpDBu29qti/euqFNzwZIpozev 4MCEB8eBdO+v4sWMGzt+DDmy5IqJJ1u+jDmz5s2ct8j4DDq06NGkS5s+jTq16tWsW7t+ DfvCgNm0a9u+jTu37t28e/v+DTy48OHEixs/jjy58uXMmzt/Dv05gujUq1u/jj279u3c u3v/Hn06+PHky5s/jz69+vXSD7B/Dz++/Pn068cXbz+//v38/vv7r4/ffwIOSGCBBh7Y W4AILshggw4+CJ6CEE5IYYUWXphbgAJsuCF0AtD2YW8hNtdhbhyOaB+Kuqk4AIcmcsfi bSXONmN5MeJ2I305brfjcj0up6F1Jd6I4o848rZjiEYS9+OStS2p4ohKPgmjb1Gm1+R/ Tla3pXFdEhdkcjkO+SKIHu425ZnOOXkljW6ayaOVtn0pJJJamkfncHkGF6aZM7rY4odS 1kiloDQOCaigg075Z5E1JvlmooGCSGajSgIa6KB+jlnoooeSOemJboLaYqifeloqoZRa SmWrn646Kqo4smqqqzLKd6KmmXZoKJSXqjrrqYaGKiqlwe35/puGiTLqZ6pwHjksnI6+ uSm1Uj6bJKmKjlqts5G6eu2h1No6qbfm9lpquuKe62y07pYb47Xhqmtts7FyOy626qLb 5q24jssiv8D1a+ec7X5LbsHU9ZmvvOaiuW6xRUrr4ryL/gkxu1GKGu6jTxa777MG61tu yOjS6zC3J6fKscKKYtpvzPTuGu/IB09cZnxp5nvzwDYr3OywO/Oc8cLuiTyzw9FmzKu0 4JpM8sxEO50y0vOGjHS9U2ONcr3bAmxvz1Vv7fWRTz9NsNn6rtwjstgN3WbFPif8285p s3kdw0kHzbW/7Kb7btUWR2124DYbjvC7WkvdquBQj4x4071K/orv4WFfzTXiUQ+uNOAi /ts1ycDmTPaKhBOKt3V6B6ztq2r/qmvHckdKa6YmwkwqrFhjWjLudtspO+yrxk6xxjLm 7jrIvutue/LHy7r845/DB3Lf1U+fq3COVuw7lNhJKCaG4hd9rHpuj68n+reBr377ProP /9zwsx9//edhbrnp59vPv3D09w/AKvEsVwS0FAEDiMD2GCCBDOwO/s4GOc81cILG+R8F L4iclx2weSsT1vUwCELdKIt38qPTl0ionP3Nik0qlJMLs4Mzg8mKaltrYQgtJKE9PZBx WXMZ6eSXPtNNLWDP4RTQruOxW2mQdwUcXelu2L8cHlGGQvzh/vTIV7fjQGqIfoPhFKmz tHhhbH82hCKEpMg8FNpLXtGz2+hYJzzXqW13tFIeqBAVR7JF73an+pkf3za8MTZxiU2s ohkZiMbM+RBhSmQckVQFtx7KDHORVNnfiJgzxZWJklZEotMKZck5bRCLhwxgInf4uk8O r2R9ZBrlFvcz2X0sd51b4gCrqMnCicyIceqb7SR3tyuWEoGn7GEmVQm1wUGsYxD026Ua h0ylDe2Wx0SlBH3ZRUDG8F4cnOUH/zjMKB4Ngtak47dS9jtn7q5yWzSV4zw3tnX6cnua xKTyhPm2YG5raYTrZDjtl8jmCXSOTVvXruj4RgMaS46GBJxC/g3aPYbWDoW/0l2a0tbQ OtFMUjiD3SDn+E8AWhCkDypnL7EpuifiCXi6CqlL1zdOBKrxfk48njFfitMFjTSnPO2p T2uz058KdajhDCpRj4rUCxo1qUxtKv8UNNMyWqmmuLIhVZ2KVQL1qWYkzSg+wanFbAbR S2DNqlkHpDexjvWmelxTEd161rgaaHWbehT08DhDdeLVovDq3V4N2s3a8bBWAkWdXA+L 1ph2k53QZKzU2rbQSrKMm3FTJ2XzB629NQyxnO0P+zTX0ZaVFZfRFK3oXrk5hKLyZPek W2dfC5/PSq+jfzxhSq1mOWZiFrQ3FRgsBwvb4KJnqw61XtkS/sdWRcIzbMeVoDKN91tQ 1nO0wq3ueKDaKJbdMY12Zd7zFlfH/NmRu+mU2BsphkfvWne95Fmqv5AlVfbKd6jutel8 74vf4tQ3v/ztL5gU698ACxg5+x2wgQ9c4AMr2L8JXrCD79vgB0vYuhGesIVfW+ELa1iu Gd6wh7Ha4Q+LGKkhHrGJf1riE6sYpylesYuLCuAXy9ipLZ6xjTFY4xvrGJEx3rGPc5rj Hws5fkEespHRV+QjKxmHPV6ykymY5CdLWadNnrKVn1rlK2vZfVHespf10+Uvi3k+YR6z mdlT5jOr+TxpXrObI5TlN8v5P7Jta1vjO+c826bOjx1k97Kn/udAN4fP7eSq0ASNaOWA j5DLYtbGCpjoSFcwxtu8HCTxhWdJnzmHlVbZKDc6U02LGjdQDZ0o4znqVE96gc4EtHYh 7edQq1rUi0amtzrowTFx7Juz3jSlf8u9yZIr073Wcq0r/TXUQrrYzB7AovXpzlQ2m9m1 BjWzPhnrq047z9XWX0u3DW6Ysjrc5IZOm8ut6nOje9TqXrem2+3uSMM73oieN70Dbe97 czvO+u43bfLtbzcDPOBqHjjBzWzwg4s54Qr3MsMbbmx+Q3zdD5/4lCtu8SdjPONL3jjH j0xcYr+woibjNZO8V5xnWkjbA9teuUNOnueiOoWuVekxy+fV/rBS96va2y25YT4eXlls n2+tOXAX+T4SFZ05z902zAV7ar7Sjkh/6xmSwpvQ82L9Yrt0oiBbGVhGoWq8fBWsrveV XbqJfMtBmpxjMcvYB7KNb7zmJPLYirxkKxel1roo2sS+2ceubZqrfdg81UrtmPq26qL0 pjlvrkjInjqXRg8eb/seamXSk5+Wp+Zswc4pocHMj2t3uOIP9nZdYrrT4F3bEd+J+OZe nu8+N3XgL2lZ6NJ+8Zw0eq+VRVjKy15cwt/7zNF2uU2m0nEy7+1tNTf8a3Iu+TVE/eHv DXSH6prrjTvv1L1Wd4WulupTV5x58zpL8I5dvLgjr9bOf3P4/ksU3Wk26ceN3GZZ31/J Ht//j/vvfzsGgAF4YwNIgDNmgAf4YgmogCvGgA14Yg8IgSMmgRP4YRVogRuGgRl4YRvI gRPmgR/4YCEoggtGgiWIYBKHgvimgiu4b+Pmgql2gjHIYC0IbqXHc1I2gyqGg1+kgza4 bT1IShcHhJHmani1eFcHdmjiUcXlaqzkgEVoZdnzhKp3S7iGRSgnXc61cxoohYkmWXQH REeXNb5FeAj4hYgWhtpHhrjFJMDWhRq2gxIWhrKURb4HedOCh14Ig+FWPVdjcoUTiAS1 aw+1gGlocUL4f4g4cYroY3NIHwtAg+oDiWS2Z5OIZIwYQpKI/oniU4nywYmdeCFF1iVu YyQY1VjJEYqiWCGk2HM6x4SglFkqtIqsOCGuiHNktUz9xFwEpgC2yGR9yFF3BXgHhVDc pERjJ2tNF3vDUYvA6CAhd20aM428dXd9BXu5x0uK9ovQeIunVznCQjOfZ4coVY6FF102 BxzP6I1UBoPxFExxt0vpCIjp2HqZBSTd2I7RqFimNXzMR3zUl1sC2UX8xDfcmAD7+CCy BUdS92rGQnJyh15L6E3o2ELsqJAFQlw8hZEZmVjCyHJQ1JEeSWeaSJKPaJInqWOfqJJZ xZItSWMpCZMy9pIzmVQ1aZNHhZM5SV8yyZMR6JM/SYFBKZQXgEiURcmHAICUV7aTS8li R+mUIAiVUTmCU0mVJmiVV5mCfaiVQtaUXVlKXwmWZiSWY3lDZWmWIISWaalUWcmW+bWW b9lAcSmXCUSXdWlKbomX7HWXe4llXOmXQAmYgTmUg0mYRmmYh5mUscGYjemYjwmZkSmZ k0mZlWmZl4mZqVEAADs= --Alternative.Boundary.IeCBvV20M2Yt4oU=wd Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Just for fun.... -- Nathaniel --Alternative.Boundary.IeCBvV20M2Yt4oU=wd-- --Interpart.Boundary.IeCBvV20M2YtEoUA0A-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.30.msg ================================================ Return-Path: Received: from thumper.bellcore.com (thumper.ARPA) by greenbush.bellcore.com (4.12/4.7) id for nsb; Wed, 15 May 91 15:24:32 edt Received: from sleepy.bellcore.com by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Wed, 15 May 91 15:20:34 EDT Received: by sleepy.bellcore.com (4.1/1.34) id AA01548; Wed, 15 May 91 15:20:25 EDT Date: Wed, 15 May 91 15:20:25 EDT From: sau@sleepy.bellcore.com (Stephen A Uhler) Message-Id: <9105151920.AA01548@sleepy.bellcore.com> To: nsb@sleepy.bellcore.com Subject: A Multi-media test Cc: sau@sleepy.bellcore.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="mail.sleepy.sau.135.1476" --mail.sleepy.sau.135.1476 Here are some icons, aren't they pretty? --mail.sleepy.sau.135.1476 Content-type: image/pbm Content-Transfer-encoding: base64 Subject: Image wrapped by /usr/sau/bin/fetch_image Date: Wed May 15 15:17:30 EDT 1991 UDQKOTYwIDQ4MAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAYAAAAHAAAAADgA4AAAAAcAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAA AAwAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAkAAAAIwAAAAMQBGAAAABiAAABwAAAD/AAAAA+AAAAD//4AAAAAAAAAAAwAAAB//gAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAABCAAAAQIAAAAQICBAAAACBAAfCPAAAEAgAAAHBAAAAP/4AAAAAAADgAAAwAAAH//4AAAAAAAD////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAACBAAAAgEAAAAgEEAgHjwEAgAg+AgAP///wAAICAgAAf+AAAAAAAAEQAH//+AAP4H8AAAAAAACAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAA AAAAAAAAAEAgAAAgCAAABAEEAQIUIIAgA+B8gAQAAAIAAQENQAA/4AAAAAAAAIQAIAABAAfAA+AAAAAAACAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDgAAAAAAAAAAAIAQAABACAAABACIAQTJkIAQ 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 AAB5AAAAAAAAAA8gAAAAAAAAAeQAAAAAAAAAPIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAYAAAAAAAAAAMAAAAAA AAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAP//////////////////////////////////wAAAAH/4AAAAADwB4AAAPAHgAAA8AeAAAAAAAAAAAAAAAAA AAAAAAAB/wAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/8AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAA4AHAAAAAP8H+AAA/wc4AADnB/gAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAH/+AAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//+AAn//////////////////////////////////sAAAHATg4AAAAf+P/AABvY88AAHnjewAAAi97zj3vAAAARe95x73gABGQAEXvece94AAAf//gAAHwAAAAB+AAAAD8AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD///AAu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u0AAAYA0wGAAAA//f/gADGN/+AAP/2MYAAA2hCEUUIAAAAbQhCKKEAABGQAG0IQiihAAAA/gfwAAIIAAAACBAAAAECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///AAt3d3d3d3d3d3d3d3d3 d3d3d3d3d3d3d3d3d8AABgBwwBgAAA//f/gADvd/+AAP/3e4AAAqhCEUEIAAAAVQhCKCEAABAQAFUIQighAAAB8AD4AAQEAAAAEAgAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///AAru7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u70AACAAxgAQAAA// f/gAD/9PyAAJ+X/4AAAi57303PAAAARc976bngABAQAEXPe+m54AADwAA8AAQCAAAAEAgAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////AAvd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3cAANCAzABMAAA//f/gAD/9PyAAJ+X/4AAAigIUUUBAAAARQ EKKKAgABAQAEUBCiigIAAHgAB+AAQPwAAAMAwAAAcDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+AAu///////////////u///////////u/////u0AATGB2QDCAAA//f/gADvd/+AAP/3e4AAAigIUUUBAAAARQEKKKAgACAgAEUBCiigIAAPAAD/AAQQoA AAUAoAAAiEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAt4AAAAAAAAAAAAADdAAAAAAAAAABdgAAAA98AAnOD7wHBAAI//f/gAjGN/+ACP/2MYAAAi970TnvAAAARe96Jz3gAD/gAEXveic94AAOAAH3AAQ/4AAAoAUAAB/P4AAAAAAAAAAAAAAAAAAAAA AAAAAAAP///4AArz/////////////56f/////////97P///+b0ABDGH8ADAgAIf+P/AAhvY88ACHnjewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAPngAQjoAAAoAUAABNLIAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///wAAvUAAAAAAAAAAAAAH2g AAAAAAAAAC3QAAAB3cACDGH8ADAQAMP8H+AAw/wc4ADDnB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAfDgAQjkAAAwAMAABNLIAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////8Au0AAAAAAAAAAAAAFugAAAAAAAfgDvQAAABe0AEDHH8ADAIAPjw B4AA+PAHgAD48AeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdxn+bgAQRCAAAQAIAAAiEQAAAAAAAAAAAAAAAAAAAAAAAAAAAB////4Dwt0AAAAAAAAAAAAAHegAAAAAABp4C9QAAAB98AIHvj4AHgEAP///+AA////4AD////gAH/////////+D/// ///////AAA//////////w9KR+nwAQOBAAAgAEAABcDoAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4EIr0AAAAAAAAAAAAAF6gAAAAAAH5eD7QAAABb0AQAf38AAACAP6qqrAA/qqqsAD+qqqwAH/////////+D//////////AAA//////////w5KT6hwAQAAg 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 AAAAAAAAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAru7u7u7u7u7u7u7u6gAAAAAAAAAD7QFAUBb0AAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvf/////////////92gAAAAAAAAAC3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu4AAAAAAAAAAAAADugAAAAAAAAADvQFAUBe0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtz/////////////5ef/////////+9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAr0AAAAAAAAAAAAAH7VVVVVVVVVVV7QFAUBb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAAAAAAAAF3/ //////////3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu0AAAAAAAAOAAAAHu7u7u7u7u7u7vQFAUBe0AAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAAAAAARgAAAFd3d3d3d3d3d3dQFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr0AAAAAAAAgQAAAH7u7u7u7u7u7u7QFAUBb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAABBQAAAF3d3d3d3d3d3d3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAu0AAAAAAACCgAAAHu///////////vQFAUBe0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAAAAACEAAAAFdA AAAAAAAAABdQFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr0AAAAAAAMEAAAAH6f/////////97QFAUBb0AAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAeAwIAAAAF2gAAAAAAAAAC3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu0AAAAAhjAEAAAAHugAAAAAAAAADvQFAUBe0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAABAUACAAAAFegAAAA+AAAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 3d3d3d3d3d3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu0FTAABtUAgAAeiHu7u7u7u7u7u7vQFAUBe0AAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0F/AABq0AgAAOiFd3d3d3d3d3d3dQFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr0FXAABtUAgBAPCH7//////////+7QFAUBb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUFrAAB60AgBAHCF3AAAAAAAAAAB3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAu0FXAAB1UAgghHkHuf/////////9vQFAUBe0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0FrAABq0AQghDkFeg AAAAAAAAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr0FXAAB1UAQggh0H6vgAAAAAAAD77QFAUBb0AAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUFrAABq0AQgQg0F2v8AAA+AAAf63QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0H/////8D8AA+AFev/gCkESgD/69QAAAB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr0B8AAAHwAAAAAAH6v8AD///gAf77QAAABb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAAAAAAAAF2vgAAAAAAAD63QAAAB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAu0AAAAAAAAAAAAAHugAAAAAAAAADvQAAABe0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtz/////////////9ef /////////+9P////98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArqqqqqqqqqqqqqqq7VVVVVVVVVVV7lVVVV70AAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvf/////////////93///////////3f////3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAru7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u70AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvd3d3d3d3d3d3d3d3d 3d3d3d3d3d3d3d3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn//////////////////////////////////0AAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAADwB8AAAAAAAB4AAAAAAAAAAAAAAAAAAAAAKqqqqqqqqqqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAAAAAAA BEAAAAAAAAAAAAAAAAAAAAAVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAAAAAAAAACCAAAAAAAAAAAAAAAAAAAAAOrq6urq6u rqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAKqqqqqqqqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAKqqqqqqqqqqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVVVwNVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq qqqqq5+qoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXV1dXV81XUAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqqqu6qoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVVVX1VUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqqqr6qoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAccAAAAAAAAADzwAAP///wAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAIIAAAAAAAAAMMMAAwAAAMAAAAf/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALoAAAAfwAAAQACA BAAAACAAAB//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoLAAADgOAAAg/BACAAAABAAAD///AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEQwAAMABgABAAAgCIr6PBAAAP///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICgIAAQAAQABAzAgCIqCIhAAAf///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAEAAgAAIACJMkQCFKCIhAAB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAgAACABAAAEACVAqQBCLiIiAAD///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAKoBACAAFSAClMpQ BCKCIiAAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAVUBACAAKqACk/JQAiKCIkAAP///4AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAqqAgE44VVACkAJQASL7vIAAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBX1AQEQQr7AClAJQAQAAAIAA/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECvagQEQRXtAClfJQAIAAAQAB////4DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAIhftCIEQQv3AClgJQAEAAAgAD////4EIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCv6hIEQRX9AClAJQ AEAAAgAH/w//8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBf9BIEQQv/ACUAKQACAABAAP8A//8PAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiv6iQEIhX9AEMAMIABAACAAPAA//+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRX1EgEFAr7AIKAUEABAACAAcAA///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQqqEgCCAVWAIJMkEAAgAEAAwAA//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABIVUJACAAKqAERSiIAAQAIAAgAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEKoQgBAAFUADhShw AAQAIAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAQgAgAAIAABSgAAAIAQAAAAAf/gAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAQgAQAAQAABSgAAAEAgAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAPAAMABgAACSQAAAEAgAAAAB/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDhwAACAOAAAChQAAACBAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAkSAAABDwAAAChQAAABCAAAAAH/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkSAAAAkgAAAChQA AAA8AAAAAP++AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkSAAAAkgAAAChQAAAAAAAAAAf88AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkSAAAAn2AAA8hPAAAAAAAAAA/48AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABChAAAAoNgADChQwAAAAAAAAB/w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAgAABACQAMASAMAAAAAAAAD/gHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAB+/AAAD/+wAP/z/8AAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAwGCDMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4OHDMAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8eHDMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA++NjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA32NjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzmfzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAxGfzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwG4bP4AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGwbP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAA= --mail.sleepy.sau.135.1476 Here is a snippett of audio: --mail.sleepy.sau.135.1476 Content-type: audio/basic Content-Transfer-encoding: base64 Subject: Image wrapped by /usr/sau/bin/fetch_audio Date: Wed May 15 15:18:08 EDT 1991 +v9yfv99e3h9fft7YV1ob+nefGZzdv96eff38/j+f/n18/17+Pn7+f96ff74/XV6/v5+eHF5/356bnZ+fv94c3h/f35zeP99/np4dXn+/nl0fv/9/Xdz/3/+dXP//vz+fXZ8fn95dHx6/Xx7d3v6/P94/vrm2+j3a2zvc//n+Pz6fXR1+fxzbnF3bPR7efT+ +X1zfPru+n53evb79/n/8/n3/Hf+/fL6/fbt+Hb9+/36+Pj+evv37+78dfv59H7+8vnzb2dlZHFzdnP7+vX1/vn58und3+Xk7e32ePvz+nhtdXn++m9v/W9eYHbw8Pry/vj4+vn5d3z1+/l7e3z47fD+/vz6/Hp2eH/69fj6efnueHR++vb4+fd8c/j2f337 +PV/dnV69/389Hn/8/lzfmpfa2hwdv/6fn758/Py+v308/P6fPf28vl9en77+3938/12fnN2c3l+fXR2fnz9e3J2fX9+cnn9f/x9dnj//f91dXt5+314en37/nx2/fz7/nd0fvz/dXf8//t9dXN7/v54cX1+/396eX/8+fx4fvj0+Xl2ff78e3X+/v3+eHR3 f/x9dH3+/ft8eX38/Pt7efn9/X90ev7+/nV6+/v6fnh6/fn8eHz7//p+enl8/ft9d/z8/Pt4d378/HZz+fv5+vd8efh9fHJ///7/enl9+vr9ePz6+fh8d3z6+n51/fv7/Hl2ef79fXR6/v79fXt++fj6e3359/f/enz8+/51ffz9+nx2eH78/Hd9+n76/nt7 +Pv9/nb++/v+d3j+/ft6ePv7+Px7ef/6+X15/fz5/Xx6e31/+nh/+/v5fHd8/fl9dv38+vp9eH37+/51e/3+/Xx6fPz5+3t++fj3/Xl6+/n4dXz7//p6dnd+/P13d/7/+/58ffz5+H96+vj3+3t6/fr9enx//fp9eHd9/Pp9d/39+vt9fH/6+Pt5ffz8+3p2 fv/7fnX++/n6fHV59fn7evn8//l8e3l++vx4e/v8+v93evz9/Hh8+/r4/nh8+vn7d3j9/vt/e3v++vn+e/v6+Pp6eH/5+nZ5+fv6/3d0fP38fHR+/vz7fHz++ff3en73593m6vD0fHZ+//l++29ucXhycPx68nlhYmZsdXv5ev/09PT3+Pbv7/D89vHx8Pf9 /vf19318+/r5/np4e/78e3Z//fv8eXV+/v16d/z8+fn6eX37/3tyfn3+/3p5fPv6/Xj9+vn5fXZ8+vt9ev76+/15dHr/+v5xev7+/X16fvr5+nt8+Pn5/Xp8/Pz+dX37/fp9eHh+/Px4eHz/9v9+fvD4fv5y/v77/nd4f/38enb8+/n8enh/+fl/ef79+vx9 eXv9+v15fvr7+312e/z8f3jo3ufo8Pn18X9+cXr7eHtxdm95+vhudu7z7vV9/fjydmp4f/rx8fv69vH0fn/59Pb5/f58Yl9nZnh7+/j++vLu7/r27O7s8Pn7+PLy+335+vf5f3x8/fp+dnn//v94c3p+fXpze//9/nl3ev37/nX3/Hr8d3d1e/7/eHf///x+ dXf//v52evz7+H13ev77/Hh2fv/+fnp6/f37fXb7/Pr8eXd++/15eP39+353dXv++3tyff/9/Xt7fn33+Hr9+O73d3d5/P99df/9/P15dXn++/51fP39+f97e/v5+nt6+/36/3Z6/v39d3v8+/l/eHn6+fl6dvv8+/97env7+X14/v37+3l2/v38fHf8/Pn9 f3z//ft8c37//f98en37+fx5//n5+P94ffv7fnf9/fz7eXB8+f38dXr+/Px+fXz7+Ph8e/r69vx4e/z8/nh7/P77fXZ3fvr6eXr7/Pn8fXv5+fr/df79+/14eP/9/Hp3/Pz5/Hx6f/n4fnb9/Pn8fHx7/Pr+eHz7+/l/eXv9/H92//r6+Xx6ffn7/Xh8/P77 fXx8/fj6fH35+vz6e3n9+ufi6e/06vt2b/72fXVqcPx+/29s+n167H3zcWNtZ252//l7//Tz8PL7+/fy7/L69fP09/55fPn7+3l8+Pj1/Xr++/p9dHz//f56dnr++v136t7l5u92bfj2+Xx3eXd6dGV4+H7zYF1paXRzdXn69vX7fvnw7/L2+PTw7/f89PPz 9f57/fr7fHj8/ft/d3V6//56cnp///57en37+vt5fPnu+Xh3dvz9e3V+/f38eXV4fvr+dnz9/fl/enn7+vl+eP3++v52evz8/Xd6+vv3/nd8f/r8eHr7/fv9eXl8+/p+d//8+/p5dn78fnd7/Pr4+vR8efp+fXF9/v/+ent8+/n8eX/5+fh+eXv9+v93/vz7 /Hl2ev38/nV4//78fHp++/j4fXv7+ff8e3r8+/56fPv8+X53en37+3p4/fz6/Xp8+vr6fnV++/j+eXj//ft8d/z7+fx6ef/5+X53/fz7+3x7dn3z/Hx++vn4/3Z9/fv+d3/7+/p+eX37+/11efz9/H17e/z5+nt6+fr4/Hl6/vnveXT7fvp8dnd//Px4df3+ /P58fP35+P15/ff4+Ht5/vz7e3n7/fr9eHh6/vp8dv76+/t8eH77+ft4fPv8/H52fvv7/nV++/v7eHb9/Pf9e/r8f/x6enl8+vt8efv7+v53eP78/Hl7+/z6/nl6/fr7enb+f/v/fHz/+vr+efv5+Pl8d376+3t3/f37/nd2ff37fXR8/fz+fH1/+fj5enz3 9fh8eHv8+352+/r8+Xl4eH76/Xd8/Pz6fnx8/fj9fnn76d3h7Ozv8/T5f/b+/nlyc3Z+enBzfHx+fXl5fPr5f3N5fGlfZWh0ffv8/fDv7Ozr8vLs7/L+9fTy9fr8/Pb2+Xz/+vn4fnV5fvx8dHz//v95dHd++310d31//3x6e/76+X14/fz7f3Z5f/7+dXr7 /vt8d3d8/f14cv/6+v15fPT4fX5yff79/HZ3/v78enb+/Pr+enp9/fp+dn/9/P55env++/t4e/r++X11ff78fnb+/v37e3h9/Pv+dnn9/v5+fHv9+vt7e/r69/13eH756uLo5/B/eP57/vz6dW11eGx9/nf0amBoZHB5f/x7fvnz9/f48O/v8Pv7+PXy+n35 +fj7/n3/+/v8eHv9+/t5dH79/n90ffz7+3x5e/38/Xj4+nn9eHh3ff38enn7/Pr9d3n9/Pt5e/78+n54ef38/Hl2//78fXx8f/n5fnn8+fj5fHd8+/l7df3++v94d338/H12fv3+/Hx7efn2/Xx+9+33dXl3/P5+dX78/Pp5eHt++vx4e/v9/H18e/z5+n55 +/36/nd8/Pv7eHv7+vj/enz++/t8eP3++/97e3z7+/55/vr6+np4/vz7fHf8/vn6fXt8+/x+dH79/Px8fX/3+Px8f/n5+H53ff37/3V+/Pv9dHp8//n8eHr7/fv/fH35+Ph8evr69/15fP37/Hd8+vv6fnl6fvr6fHr8+/v+fnr7+f3/dn38+/x6df37/H52 /Pr6+Xt6//v5/Xj/+/v8fHt7/fr7e337+vf/eHv9/P54e/r6+n15ffj8/Xd4/P77fX19/Pf5fXv7f/X5eHr+9+vzbP55/nt0d3z8/Ht1/fz7/Xx8+/j4/Hr8+fj5fHh/+/t9efv6+f16eHz9+f93/vz7/X17fPr6/Ht6/Pz6fnh++/v9eXz6+vv/enr9+Pp5 /v1++3t6eH76+/96+/v3+nh9f/36enr++/r+fHr//Pt3cPv9+/19fX73+Px6+/j4+Hp4/vv7/Xf7+fb6e318+fv+dnz9//16e3z7+f54evr2+Ht3e/38/3Z++/v4e3h7//n8eX36/fj7fn/++Pn/ef36+ft4evz8/Xp5/fz6f3l4fP76e3b+f/z+f3t5+vv9 e/75+vh9eP////14//v5+e7n7Od5ZmhqdXR4dnZ4/vr7fH739/T+eH36+v13fvr7+n93ev76+nZ4/f36f358+/j5/3r7/Pr+eHh+/fx3efv8+n54eH39+Xt3+/37/Xx6697i6Plx+/L3fnd8fXd3aXDw/vBuXGJpb3Ftef77+Pr//u/u7vX37vDw83/99vj4 fHz6+vp+d3n++v12d/3+/H58ev75+n56+/v4/3h3ffzxeHD9evt7dnZ7/v17dfnv5ODr6u/r9fr8+fn5/3VwdXp8dG56fP58dnZ6/fn+fnx6enVhX2ltfX9+f/Lu7PD48O7t7vf17vDx+Pf++fH3fvH1dP12d3Z4/v97dn7+/f51d3///XZ1/f79fXd1fP7+ eHN8//5/fXh++/v8ef75+vh7dHv//Xp0ff/9fnl1ef79fnR6/v77fnp++/n6e3r79/p8d3h//n93fP38/Ht4eHv6/Hl6/Pz7fnp5f/v8fXZ6/vf8e3r++vp8ePz69/x7eH35+np2fv/6/3p6eP36fnl9+/v6e3d//Pr+dXz7/Pn+dnr8/H5zfPz++318e/r6 +n18+Pj3fnh4/vz+d3z9/fx9eHd//fx4d/3+/P7/fv74+v94//r5+3l4//v8eXj6+fr+enh8+/h4dfv++f59ef39/v11ev379O7y7+z0/nB46uHq5+3x735sYmFgYmJfY2RrdHp4d/779ff69e3q6+7s6Orr7vL39PP3+v94/ft7eHN4fX12c3///H54dHv+ 7OXm4u3v+nll+N/m3eLd3OTtemxqaGdgXV5hZGllZGJhZmhiaWptb254/vPr6eri4eDf5ebm5ubo7/Pw8vP5en7++ft2d3x5eHRtbHB1eHN9/3v8en11eHt8enR++/v+eXh+/ft2bnd2fXdubnZ8enlxe379/H96//j393z+9vb3+np8+fh+dn78/f16dnj8 +v16e/79+313f/f69n9+9+/2e3l3/fz9d375+vn+env++fp4en3++f57eXz7+P53fP75+Xp6+/z6/X34/Pn5fnt9+Pn+eH79/P98fHr5+/t8fPn6+Xx3e/n8fnn/+Pn56+Lo6O3+bX33+/p+dXR3+3Bz9P7vdF9hZW13e3Z1+Pb69Pn68O7u9fzz8fH2+/34 8/X6fPz4+Pl6dnz9/Hd3/P78/Hx4fPz3/nn8/vv7e3z4+nt/cnh+/vp4eP79+H11/fn393t7//v0+nr+/v73fnZ3ef79e3j++/n9eHn/+vt1ev35+n55ePr6/Hx6/v34+/9+/Pbzf3d++vj5fHV9+ufh6+Tu9fl3cnr8fXpyeH159vx6fH58/XN5+/P4fHl8 +f58cX77/fbx+f31+n74++3z7e/8+3b47/5v8Orv8n5xYmlva3B++Pb3/f307+/57vF+9f79e3z6+/56fPv6+np3/vv8e3n+/Pr+eXV++f54dv79/ft8eXz9/Px6ffv8+312eHt+fG96fn7+eXV39+ru+fPv7u/2+3z6+Pn/dP74/n91cnh2d21udXB1b25t c33+enj7+PX3/v/69vb7fP749vb9/ffy8fp+9vT1+Xx5e/z+enJ8fv79enp4/vr9eHj+fvx5cnd7/Hx2fv/8+/Pt5ebp6n5+9Pf7+ndv//56f29venR5dHr/6+/0+e9+9fd4ffz3+H97+/f49/76+fHz+Hz6//L2/P718vD6/fTy/G9sb3P36e/+9e/t7vn7 efHs+Ph99PLz+XlyXl5lYm94/fn8+/nv7e739u/w7/r+9P319P96//37/3R0e359c3F7e314cXF5fHx0cXp7fnt4dnv9+/54//z9/Xl0eH7q7mh5c3l6cnFyfH16cHh9ff57e376+f55e/38/Ht1ev/8fnN9/f79eXV2fPv+dnd/fvt+enl++vx9dX/9/v90 eP7+/Xh4+f77+X98f/n5ffv8evp7e3Z5fn9+dXz+/vt5dv77/X53/vn7+3p3ffv6f3J8/vz6/319+fj5fX76+vh9dXn+/X51evv+/nl1eH78fnR3fn/8f3x6+/f6/nv45t3j6/H4eX98ePn+/HFxbnZwffp18XJhZWZqc3z+/nd+8PTu+P3z8e/2/PPv7/L7 fvv5+P52fX/+/Xp4eH75+Xt8+/34f3h7f/37eHr9/fr2enT7fv11dv//+357ev76+X55+vr1+3p4fvn+eHj//ft8dnV6+/p8d/77+fp9e/z4+f15fPv4+X14ffv5fnj7+/v8enh7/vz+fP76+PR9fvP6fvxzdn3//nx2ev79/Xd++fr5/X19+/j7eXz7//v/ fHp9+fj9efz5+Pp5ef/9/Hp3/vv6/Xp3/fr7e3T9/fv7fnz9+fj6ev74+Ph9d3v99n1zfn/7/3l0efv5/XZ9/fr6/nt99vj5enn7+Pl+eHX+9/96//n2+H56ef75+nl9+/z5/3p3fv38fnd/+/n8enr7+fl8evr7+Pt7ev34+H5/+v78fXp7eP77/np/+vz3 fnl+/Pj/eH78+ft7eXz7+/51ev38+v99fPj3+H7/+Pf1fnp7//x/dnz8/Pt8d3j/+/14eP78+3t8/fn19vt79/H6/nl4//38eHn9+/n/eXh9+fh7ePz8+ft8eH38/Pt3efv9+n54/Pz5/nf8+vj4fnh9+/j8dXz8+/t9enn++vl9evr79vx4ff76+nl7/Pv5 +3h3/f38dnj+/vv/fHv7+Pf9evv59/p8eX37/Xp6/nz4/Xh5fPn7fHf8/vz6fHv8+Pf5eX37+/l+eX78+X53/P34+nt5evr6/3l8/Pv7fnv//Pr4eXn8/Pn+dnv8+/t3fvr5+f17ev75+nd5/P36fnx7fvj7/3n9+vj6e3l++fp8ef37+fx7eP76+Xx1/v39 /X17f/j4/Hb89Pb1fnt7+fJ8d/98+X97dnj8+352fP38+35+//j49318+vr5/nt8+/v8eH77/Pl9eHl++/t5fP3++v57e/76+P54//j5/Hp8593j6O7v8uzq+v5+/X51aGVtbm5rZnL++vf//ff28Xd57PHo6fDt7O/w+Pz+9fv1enx6cnx9bl1mbXR0dfT3 7/X59vHt7/j17u7u9fz++PX3fXv8/Pv+ent//fx8c37y/Xl4cn1/fnZ1/n7+fXd2ev78fXZ9f/3+e3h7/fv8eHz8/ft6d3z9+311f/n9/H13ev38fnR6/378fHl3fvr7fHj7+vj/cnb5+fx5e/v9+vF7b/5/+nJ2fn/8fn17/fn3/nf8+Pn7eXh9+/t5ePv9 +/93dXz7+351ff36/H18//n6+3l9+Pn5fnl+/Pt+eP76+vp6eHz8+f55fPv8/n16fv39/Xp4/vv7/nd7+/n6d3z8+fb9e3j9+ft4ePz9f3v9e375+fx5/fr493x4fvf7end9/Pv8e3d++/p8c379/v1+e3759vt6/fj59312ev72fnR+fvr9fHZ5/vr9dnv9 /ft9fX769vh9efr59/x5evz5/Xd8+vv4fnl3fPr6enr+/fv+e3n++fv9d3/5+/t6eP75+X54fn7z+n15fvr5fn3+ffv+fnp++/v5eX34+fd+dXv7+/12fP37+f54e/r6+3d6/v77/n59+vf4fXz5+vj9eXj++f14e/v8+X94eH/6+nt4/v37/H57/vn4/nf+ 9fr9fHb/+vl7ePr79/t8en77+v14//38+316e/z5fnh9/Pj4fXd++/v8eP/7+Pf+e33++f11fP39+n57e3/5+X97/Pr4+3h4/Pr8eXn8/Pr3eHf9+/p4dv/++/5+ev/49/x8+vn4+nt4fP38enf8/Pr9e3h9+fh/dn79+/t+en76+fh6e/r5+P95evz4/3f/ +vv6fnh4evv3eH79+/n/fP7+/Pd+ef/5+vp9eP76/Xp6+/v3/Hl3//v6enf+/vn+enl9+ff7eP759/p6e3/7+Xx4//77/Xx4fvr5fnR+/Pr7fXt9+vj7e376+fh+dnr96eHq5+33d35/evf8fG9veW1693r5ZmFqZ2x1fvz8d/3w8e/59e/v7vP5+/n08/59 +fn5+X14f/v6/Xd8/fr6eXh+/fx6dX78+vt6dnv9+33+/3n7fXx3ef/5+np8+/r5fnV7/fz9dnz+/fl8d3r9+v12evz9/P96fPz5+n17+/v5/Xd3ffv+dnn+/Pr/eHb/+/t7d3//fP3+evv5+f13/u33fH1yfv38enb+/fn6d3d5/Pp+eH3+/vx9eXr7+/p7 evn9+/94ffr6/Xh8+/j4fnh5/fr8d3v9/vt9fXl++fh+efv7+P53ev/7/Hh3/fz5+Hl2/Pv4e3b//vn7fXv9+Pj+e/35+ft7eHz8+3x2e/n3/Xt2fPv5/3h9/vz6fnt9+ebd6Ojp7vDy+v/6/XpweHx8e3NzcHv8fXV4/P39/nVve35mX2dtff/5/vru7uz1 9ezs7O/2+fLw7/t+9vj3+n56fPv6/Xh++/v9eXV5//55dH5+/f15dX37/H50fP78+358ff38/nx9/Pr6fHV3/u3+bn55/f56dHZ//Px3efr+/v15fP37+Xx3/Pz5+3p5/vn7env4+vj9eXl9+fp7dv/+/P56eH36+P14fPr6+nx5/fj5f3f++vr7e3V8/fr/ en3//P9+eXn8+fl9ffn59395e/37/Xd7/Pv5fnh4fvf5d3v7+/r8fnz6+Pn+evr5+ft4d378/Ht7+//6/3h4fvv5fHj+f/r8fnr/+fj+eP70+Px+d336+nx4/Pz2+Xx4efv4f3d9/vz8fXt7+/r5enn6+/j+eH75+fx3fvr6+X54d/35/Hh5/fv7/356//j4 /3n4+fh+dHz+/P14ef/9+PZ5dPz8+Ht3/fz7/f18/fj3+H79+fj7end7/fp6d/39+/55dnr9+/54/v78/Xt5efz593x8+Pj3/Ht8+vf7ev76+Pb8e377+v52d338+v9+7d/k6vZud/L19Hx7d3t9b2j78/LwYlxland0dvj49/P9/vbt6u359O/w9X51fvX6 fXV/+/n+cXP/fvv8b33z/Xz9+frv7/j8+nt1/nJz+/nq7nV+eXp1eHJtcXZ2d/79//v49/z/enl8fPP08/d7e399+37+9+/u8/Zvbv3/cXp8d+/zdW1xcX70dHJ99O7u+v97eHZ0+vDv8n52e3z+fv5zevT+/XZsePT1+fz9++/+bnp9f/N+c/z1fPj2b/7v fHz5fn33+f35+Pz09H70+Xdsampy+PP8/X97fnl1ePv49vl89vP3+v59/PX1/X318e/0fnd9f356dHz89vt6d3V7f3Ztb3F3+/1+/f96+vp8+Pv7+3707/X4e/z07vH1+vnv6ev6+fTw7vHx+/nu8/b++39+eWpraGhmYF9gYWBfXFxfYWZjZGxwffv69u7o 4N7e2tnZ2NnX087LysjHyMrN0dbX2dztaVVIPzo2MzEzNztEU33c1dXb3eLveWzv49jMy8nHxsfIzNDS09fY1dXW1NXY1tLQ0NDV0s3Kx8O/xV02KiAfIikyQ+rMvbW0tr7YSTw6PE7dw7y5uLq7wM9oSkJCT/PPx8bL1Nzb2trf7Xp67N7V0c7MyMS/vLm0 tOAxJxwaHyQxSMu+va2xr7PKTzExLjhn0Lu4tLm8u8vRaU5GTHLexcXIztTZ3NLb3e5tZG/e0MW+u7eyrq66TSseGBcbIjJew7ewrKysr8FWNSwqMUbcurGwtLi8w8ndV0ZAQk/mzcPAxs7V29zX2+r58O3Yyb+5s6+sq67EPScbFRYZHy5Mxbesq6morbTS SjIrLjFH1Ly0srG4ur/L12dTSklOX9jMxcfHzs7R2Nfb3Obe1ce8ta6rqq2/PigbFhYXHig64L+uramoqqu4x0IzLiw2Pv3IvLa4trq6vcTN+2tQV11y3dTMz83T0c/QysnHxcG9urOurrhlMCEYFhYZHytH4ri0sKmqp6uvvV1CLy8wOE7ywsC5ubm4vL3I zvlbVlJq/dfW0dDSzs3JxsC+vry7ta+vuV8yIRgWFBgeKkLlt7Kuqammqau220wwLi0zP1fLxbq5ubm7usPH32ZVUFtm3d3Qzs/MzcbEvry8uriyr6+6XzMgGBUUFx0pP+22sqyoqKWoqbTOTjAtLDQ+TtDIvLq5ubm5v8LbalZPVFvq4tLOzszKw7+7ubi1 sq6tsMhBKhsWExQZIC9Gx7SwqaikpaeswPc4LSwtOEHozcK7vLm5trq+yPNcTlBVdt/XzMzJxb+7t7Oyr62srLdjMh8XFBIVGyY3XLq2q6ekoqWnt9ZALiwsNT5mz8m+vbq5tri8w99aTU5RdN7UzMnHxb+7trGvraupqrVbLx0VExEWGyc2Wrq3qaWhoKWp xVo0KysuPEbZzcq/vbi1sbi9y2RMRk1U49XQysXBvbi3s6+tq6inq843IRQRERMaJDZBv7WtoqCfp63mNC0nLDVU88q8wrq2srS1v3pPQD9Ibe3RxsfBvLi2sK+uramnpaW5NiIVDhASGSAxP3Svq6CdnqnETykoKi4+ZsbNtrCuq6233lk7OUJKW+XS2MW9 u7e2u8C+vLOppKKfpNIsHhEPExQaIC85vaSim56myEkyJC4tMz5yxbmlpqesvVQ8PzVDT09f1cW/sbS4uru8tayqpKGgoLEzHxUNEBIXHitJ3qSfnZ2pwTMwJCcvL0Jvs62jnqev1EgvNTk5Tlfrz7e2tbO9vr24t6+rp6KfnaVPIxgNDhIVHSU9T6qcnZqm vDQsKCIvLzpYuaqknKSuy0AwMDw3R1Rvy7ixtrO8w7y4s66opaKenac/IBYMDhIVHidEX6acnZuqyi4qJyI0MD7utKijnKe04jwxNEE7T2rlxrezuLS9xLy4sa2npKKena0wHhILEBMYHyxO2Z+dnZ2ueisqIyQzMUTcr6ihnqq6XjwzOkhCXnzWxbaxt7W8 v7iwrKiiop+eqjsfFwwOExUeKE73qZyfnanGMCkpIi82PnW2qaefp7fYRjk2SUhP/N3NvbK3t7i+urKsqKOgn56oPyAXDQ4SFRwlRfisnJ6dpr03KisjKzM6Ub2qp6Glsc5cPzpHTUpX5dO/tLW4uLm4sKqmop+fn64yHhUNDxIWHSlP06WcnZ2pxTMsKiUr MDhOuaumo6i3z+9GSU9LR0/p4763ubm5t7Osp6Shn56hxCccEA0RExkeLlO/npydoK5mMC8qKCsvNmSxqaWkq77M5UtOSEM/YdTHuLi7vrm2sKuppqOfnqLVJBsPDhIUGBwrQ7uem5yjrvY5PS0pJyowUbGrqKiuurzC3VdKPDta5Mi/vL66rqyopqSjoZ6g uCkcEw4SFBcZIjnaopydoqy6TVc6KSUmLTy+rq+srrGztL9hS0A8Tm7f3Mi/u6+tq6qnpKKenqdEIRsSEhUUFRkqP7Ofn6CoqbbH2S8nIykwRcbJvrKurK2wx+n0VFdTUE1oy8O4sq6sqKOhnp6gui0iGRMVFBMVHS5Lq6Sko6Okr7XvLyspLS88SkbOt6+r rK+7u73P4F1LT23b08e8tq6opqShoqjiLCYbGBsYFxwjMV22r7StrLO1umg/Pj1AT15PWs/BvLW2vr68wcbJ1+fc1NPMxsTAvbu4uLi7ZDUyLigpKyYlLDM4Sufh2sK7vbq4v8rKzdPS22tZW2T13t/f2M/LyMrO0tjb3N/l5t/d2M7IxcTI8khDQTs5OTUy Njs/Slxgb9zQysPCyc7P0c/R42xiXF1senL139zUz8/R09jd29rf3t3f1s7KxL/Cz1xHRUA9PDo2NDk+SVtlYfXY0cnDx87S1djY2uZyYlpccO/o4OHb0s7Nz9bf4N7g3tja2tbSzcW/wdJWRkhDPjw7NjY7PktWXGbt3+TNwsjM0+fj3tjg/mRcYXvq597b 39/PzNvVzeD62Nbm3dTY1cnCwMPOW0VGQjw8Ozg2OT5MXmZrfObdzcXIzdHW3t3Y3ep8Ylpn7ebj3+Li1s/P1d3p7+rr+3759eTY0MrEv8HUWExLRD48Ozg3Oj9MWl1r6eLaysPGzc/V3NbW5v1pWl5vfvTq3uPg1M/U19vo6uLk6ero39bOzMfBwc1qS0hD Pj06NjY4PEdWWWDv29rMwsXKzNDc19Lb63VdW2/ufv7m5eHW0tna2+Ps5+n28fX+5dfSzcjDurTLRkxCND0+Li0xMTlh3nrUxsS+t7nH2vJeWnxtT0tLTFve1eLYzMvIw83k5e5xfftpbOnb1crAvry4tbGtrLdLKiglIiknIigxPuu6u8K/urm9vtpGQkxb 79Hb9drIwMDE13vdztThbldadOjo59/XzcfFxcC9u7m1sK6tsNwsIyMeISciJS0+/L+2vczCusDM3Ek8R/PSzcbIzcS7vsrR4n3c0OFvcHZu8d7m7drT1c/O0M7FwL66tbCtqqzJLCAfHR4kISArRNG6tLjHxLa70l9IO0LlyszPyse/t7rL/urc1M/aaVzo 19XU3evfz83U3dXPy8bFxb62r6upq8oqHx4cHB4hHypTxLa0tcLDtrzUSEI/R9TFyubLvbm1ucTi0srP5m5lYd/V3nV65N/Y19ve0MvMzMrGxL65s66qqLkvHx0aGhweHiRJv7CurbfBtbrRRD09P/vX2PvIt7Szu8LRysnZaFdme9nZ4uTUy8vLz83Lx8rO zszJytlWVtrXamfgSzMvKycoLC0tOEZU68fKz8TAytDP3vrq4Xz81M3Jw8LGxcTL0NLU2NHP19fOzc/Nzc7Mys3T1NTa4eXt+fb3/Hl3/njv4/xHNy4rKSgpKSwyO0Za2cnBv7/Jzs7V1NPSz8nCvbu4uLi4ur3CxMjKyszNz9TX2d3j7vJ1XlZPSkhFRURD REREREZISkxOUVRYYWJaUEtKSUZGR0pSXGJ06NrZ1tPRzMrMzsnGxsXCxcPBwsTEyMvOzs/Z3Hdqa2ZdUk9KR0hJRklLSU5TVFhfZGRdXmJncmpscfn38fP17ejm6unq5uHm9e/r7u35+f/07u7x7t7n7OTm49zb293d3N3d4+rr6Orr+nZ7eXRsZ2drbm9r Z2hubmlqamxyb3B2/fr47O7v6uXj5+vo6Ojp6enw6+fs7e7x9/L7/Pn+enRsc29wdWpqbG92dG1we3l9fnl2eHt+e3Z+9/d//Xp+9fR/9+/27/l9fP76/XZye3z//nl7+vr5/HX59PX1/f787+/7/fn7/HxwbXBvcGpkbWxrbm1vefn49vH59Ovz/Ht7enJ1 bWpvdnVvcXN6+395fvfy8fj6+vr08Pl++vrz+n7++/T1/H379/T8dXR8+/l8eHt1fXxxcf35+vp3/vv5fnBvcfb2bXJ2fvz+e3j79fr+fn379fZ8/Pfy7+z5++/4/H1xc/95enZ2e3p2cW5xen5+eHf78vX8+n738/t8dv55enlvb3d9d3B2dnr5+3l78vLv 7vj36+/v7H/58PT2d3j7e3Vva3F1b29ueHR9fXZzevj4/3V5+vT/dnB4/Pr6f3v+9/P9eX31+3n8/vXx9Pv4+fT6fP92e/h9eHl88/f983z58n58eHF0enhqb3hufXZ0eXX683t0+vP57u988+7y7n797/j7cXV6bXN6cnF2+vl9cX7w/nR4ff/6/Pt6/PX6 9nx8/vnv8Pn98e/t/Xf39PN4bXr793hsbnF5dW1vcHF3eHj98PDx7+np6Ovq6Ph7/f1zaWhpYWRlXmFlZ2ptamv8fnv/ffXu6Obs6ePoe1tkfnd3e/r2dGVlYWFfX2BkbnN97+rp7ujn4N7n6OXj6/p9/nt+e2hlbXJoZGRpbWRjZ2NgZm9vcGtpdXZsb/n6 cn19//zu7v5y8unt/n7y6n7q3Orm7vH2ePpzcWpoZ2h1fXt3evr1cG5q9+nw4u595PDk9vL28vd8cnBxb2traG50c3R3/vPw6Ong4NzY09LNyMXEwcTCwL++v8C/v8DNXUE2LysoJygsMzxHXc/AvsTO1uJeUVFb/tzOxr66ubq6u77CyM3O09PPyMK+u7i2 s7Cvr62t2y0oJx4YGBsfLDpA2K2nrK+zvtRZNy4zQEFJ1Lu1sbK4uLrNX1xeVVFVatbHyMzFwMfT6Hdybl5c6MzGv7mzr6upqb4uKCseFhYaHik7RsqnoKiurbXTSjIsMkJDScGsqautsrzHXTc1Pj89Se3LwL/Gxb/JcVlmXVFRVnDTy8e8tbOxraqoq20l KCwaFBceJDFRYLSfoK+3r8BGNi0tPFxP766kqK2uuM1VNi0zPTtB3768vL3AwMhtTVliUU1a+tnPzsm9ubq4sq6srL4tJC4jFxgfKC9NbcqppbbUv8NIOjk7WsfGy7GnrLi+xftJPDM6TldP5cLByc7W3Nj7Wmjl+G/x4d7d2NbLwsG/ubOvrKu+LSUuIhca Iy44dc/AqajAXdfZPTY7QuC+vsKvqLC/w8pgRT07RVhRU9HAy9bOztfmZFp65HJn6Nng4t7b0s7MxLy3tK6qrG0kJi8eGB4rOlHIz7mosV5I22M5PEdwwbvDwa2tv87JzV9MQEBYaE1Yy8XU3tjc6HJWWevgcO/W1+Xw8OLb39vKv7y4sq6rsTsfKi8cGiU4 S+HC3birxj5LyV89T27Qvb7Rxa6zztDEzVpLQ0Vo7U5TyMbuauXscmNTXdvZaPnT3WpofN/T1tTDurq6sq2stUAjJjQhHCY5Vl/ad8ywxkJIzNRGS17jxMTUy7GvwMzKy+NRQ0Vv5FVezsznamFp9nxdbdjW92zz73pr/trP0M3Evbm3s62twTAgKzEeHys+ YmzeVMKz3kJPyu5IT0/cwMPPw66xws/Z3mNOQ03azvVd4NHmXFdn4t5xZujW71xm7+Xt7d7QzMzIvri3s62uxDMgKTIgISs9dHbZTc+200hH0N5RWE7uwr3HyLKxvdD08mlhT03rzN1b/Nvnbl9f9dTpXGrf7V5eafjr7v3g0M3Lxby4t7Wwr8U2IyY0JyMr Off63k9kusdZRHXRZmhRX8m7vcu8s7rLbmJdYFxOXdbL6Wvu4/hhX2je1u9kfeD3Z2R74dnc4tHFv727uLKusdMuHygzJCMsP+bp1Ex9uchRQPvVY2ZSase4usm7tLrOXVlWdvhYZdLM+llefv5pX2fe0uxcbuLodGl65Nne7trFv7+8ubWvrr05ICQ5KSEp NvPl1U9Hur1pP1TMbv9XTtO6tcnEtLfDb1hTYtpbTvbLz+/66N7je1/80ttfWn7rfmFeft3c+u7PxcG/vbmzr7PMNSElMyYjKzvwfdlZX7rBc0Zsy21vVmDMu7jJvrW5ymJbU2fzU1ncydxq+ujl/Wlf7tX+WGHyfmJgZ/jd4fDWxL6/vbm1r6+/QygkMCoh KDJYaXrxWL299UpTzG1SVFbPwbzFwbO3xm1ncVxaTV/WzuBs39jiYmD33NtyYvfieFtf9OPk49vNxMG/u7eyr7XgLiMuLh8jLUFWVdtbv7XRWlPI/EZQTt/Lw8nEsLTF3NfSYlVKWdzeamPT0eZue+De5Wps5edkW279eXTu2MzIx8K9uLe2tLxbLCcyKB8m Lj5DWvfotrvf9s7HT0xVWdXOy8q4sL3Lz83iVUtQ8P5haNzS5/zs29vuderd/V5fdnZfXm/f09fQxb+9vLq2tb7+Nis0Kx8nLTY6P3r4ubvXyL+/YVb4We1ua9vBusrIvcHN5OTr3+5gduLlZnri4ef05tnb+3H07mpdYWn18PTr3Njc2tXT0dTtUz8+PjUy NjU7P0VNWNbPzsbDwcTDxsrJzdTZ2drm5eTm3+Dm4tzb4evxf355Z19kZWJgXV5jaGRhYmhrcXV79Ozm4N3b19XX2+5oX1JMSkVISUhKTlpgb+3i3dnT0c/O0dXX297p6/v573l2/Ovn5uvt6uns9fN/dXRtZmRqaWhpZ2t3fvXx6uPf3Nva19TU1+pvYFNO SEZHRUZKTlNaafvq4N3X0c7O0tPV2Nvk7vLx+Xdz+e3t6uzt6+rr7vj/fHRyZ2RkbGplZ2t2fvHu7eff3dzd2tbU1dzyaVxRTEdGR0ZHSk5UXW/06uDZ08/Oz9LT1djf6urw9ntye/Pt6unu6+nr6/L/f3t1a2NnaWpoZmdte/fm2tnZ2tvb2tnW1dnmemVV TUhDRkVFSEtTWGX88ure2NDNzs7P0NjZ3+Ln7e36///y5urw6OLk5fJ+Y2VoZGJfZ2ZqaGlye/Lv7Obf3tva3NTR0sTNYdVuQUVAPj48PkdKUlzsz9TQycbGzM3O1Nh8Z2dhVlJkY2H63NnZ1dbU1+T97vppZmRgY2ZkaWxrb/Lr7+rf2tjY087LxsjN2GpO UTwxOjc0ODtFR1zd38XCxr6+v8zKyN/m/mVdWGtWWeZv7NPW29HP293ifm15YVpiYV5re2hy8f337f7u393c2NDNx8K/wcrYT0pLLS06LS4zPUdC09HIuMC7ub3H2cXiVWhfX09f+F/j1tXOzc3PzdXv8X5eW15bXGZue/Dz8Obm9nru6+fg19TOxsG9u7y/ zU88Qi4kLS0pLDROSenAxLO0u7y+vvV13lZOUmNf+Nn5ycDNzMXE1drabmtgU1heXWXd1eDe2eDi6mpjb/R37c/Oyb27t7O3w2M4OTEfIyknLC1DW+O3wLeutr3axdVMXU9W/uTY2b6+zcPAyNLZ3nDzak9cbWddbOfj2dvr5+H7X1haXnvk3c7Evrq1s7Gz wE4tKywfHyUkLz3j09SutLe3ystp8VI8WmD6zcO7v7q3wszdfVdNWE1RaGfv5N/o59Xd39zv73JlXFpiZ+fPyL+8ubaxrq+13S4jJiAeJiQqO9+4xba3ybnH40w/VEVvz+XGvLOyt7nN6ORVSEBFT13R1d7W3dzf4uts7eTu/nNlXWxy6NTLw726uLSwr6+9 PyMeHh0nKy07RsC4sq/W5lZO7U9oTEzVzLWzt7W/vsXS30lDPj9d8s7N3Nfn3d17/V1k8+za63pqWmhz5NDNxsS/ubaxrq+7QCQeHB0oMUVbWcrIu7PB0Ug9Q0HfzcrE1MXBu7G2u81bT0VLU09gY+/V1MzV7G5WXW7p1dvg92Ruanfs5tTOyMK/urWvrLDe LiAbGyAtTcrGwtbcysvD02VLO0BP3L26uL7My8rAvb/Jb0c/Pkdc387T3Hpham/z7vHm7Ofm7+58a2x538/HwcC/vbixrrpMLSAbHSMz5ruyvc/sTF3o0s/7ZUlDVefAuLW5xM3d6djR0+RcST8/TGvUycvX/l1XXH3bz8/Z9mJdYX3f08nEwsC+u7SwwE4y IR4fIzRuurG4vHVKUE3p19DZWldITtzHura3vs/hYlxqZ2xeUkxLWX3YzM/X6WlfYn7f08/Z8Wlia+fRyMG9vLq3t8hXNyYhISQvSca5trfNflBKWnHV3O92T1Ng3sa8trm+zW9TS0xPVWZv+Oz05N3c3eXr9u3l4d/e3unx+Pff0cnCvry5u81UNiomJSkx R9O/ur3L5GFeYffh4OVpV1Rb7c2/u7u+y+9TSERJVW3k2NPW2+T2+erf2tja2dvf6e7t5tnOysa/vb7OWzotKScqMEF8yr7By9z9bHTo3dbc/lxRVGTbx7+8vcXZX0tFSlFp4NTO1Nzybm7339fV1tfe7X1vd+jZz8nFv7u6w+0/LyomJyw6W869vsTS9Gdi /d/T0uJnU09UfM/Evb3E1l5KRkta6dDJyc7cdV9gdOPW0c/Q2OD0eP3i0snEv72+zlg6LSopKzJDeM/IzN9uX2fs183KzdxuVlFb7c7Dv7/I22NOS1Bl4tTPz9bldmZldOLX09HT2OP7aWNr+ePb29rd6O93Z1tQSEI/P0JITldeaXN6dW1y+vHq5uXj4OHh 5enj4N7e4eHe3dzd29fY19nd3t7e3+bp6Ojr7vV8eXVxa2ZsbnFuaWRlZWReWVdSUE1LTE9YX2dse/r4+X378ufc1+Dl7Ozo6N3Z1NLR19fW2tzd2t7k3uTk5u3o7vZ/eX94e2dmZGRhX15gZ2trZWZoaGdpZ2tqcW5lY2hpbW1sbPx3bnZoc/Px8Ovj29na 293a2tjX2tra4/nz+O7s7Ort7vHx8v5ubW9vbmtnaGpoZV9iZ2hpaGZqcXBtZ2hrand0cXv9+P10bnh6ff98/Ojq/P939vfv7/Pw6ufp7O/s6+rr7u/u7O/5eHl9d3lvbXJzcmtobGxubm1scXp9dG5vc3Fwbmxvc3p6bnN7fv5+d3/5+35xev778/f79u7s 8P778+/u7/Ly9O/yfnr7/fz+d3p//3xubHp7/n1yc379/nd0fHz+fnt5/vv5fHJ5ff5+e3V9/vx4c3/8+fl+eX/7+351ffr39Pt++/j3+X379ff0/Ht7/f96cnr7+/x8dXV8/31xdHx9+v18fvv593x0fv36/Hp5/f1+dXN+//r+enz59PV+fP5/+f1+fP34 +fR5fvj9/Xd0ef9+enN++/P3dXh7+/18c3r+//x9enz59/h7ffn39/16fPj4+nn++Pn6fnd5+vr6enr7+/j7fv/28/P7e/f4+Ph5ev37/Hh5/f39fXd2ffv3fXn7+vn5+n7+9fT3eX76+Ph8eP76+/54fvr5+XxzevT2/Hj+9/r4/3x++fX4en36+vh+eHz7 +vt5fPr59fx3fvn3/HZ6/f76fnl7/vn3fXr6+Pb8fXzr53V3dH77/v53dn77+3x1/v36+n18+fb1+Hv69/f2/nn9+Pp9eP77+vx6d3v7+P93fvz6+v18ffj19Ht5+/p/ent6+vv9dnz6+vb/d3n7+PN6df3//H56eHz7+nlyff79fnd3/Pn4fnv39vD2///2 8fX+evr6+Pp7en/6+f91e/38/nl0ev37enT//fz+eHN6/ft/c3v+/fp+eX759/Z9/fj69P17fvf5/Xv/+fj4/nl7/PX5dnp8/vf+fnv89vb+ev36+vt5efz8/Xl3+/r4+3h3/vj3fHf9+/j6fXp7+/X7d377+fp8eH77+P52/vjz9Xh3f/j4/nZ8/vz5fnt9 +vf4e3v6+vr9enz7+fh3/vj6+P94evv5+3h4/f75/Xt9/Pr5fXj7+vn5eXf6+Px1ePX79v54dn38+314/fv6+vd9fvP293r++fz+eXd9/Pt+dn79/P54c3v69vt3fPz9+/1+fvr09H17+/z7/3d5/f78dnz5+vh+d3n+/Xxyc3z++f59f/jv8fl8+/f5/nZ2 /fv8fHn5+/p+dW96+vt5cnx/+/h+ffp/+Pd1/vv39Pt++PL1fnX9+vr+dnF0fvx9cXr8+ff/eXZ++vh+evn39/x4e/38+3h6+vjy+H1++PX17uXo6er5/fz39vd8c3z/fX1ycnh7/nh69vPz8Xp5eXF4Z1tnam94dHz57uzt9e/q6ujr7uvq6u348e/y9H1x eH5+e21tcXB0b2tudHV3b378c/t6enz08PL69+7v7/P59+/u7vv++vz9fXZyfP79d21yd3h6cnF8fn11c/79+fx2cXj9/nl0/vv7+n17ffv4/3Z++vn5fHv9+PX5ePz49fp4eXz5+391ev379vx+f/n6+nh5+/1/+3p0//7/dnp//v18dnj7+fl9efv9+Pl8 fP79/H52//z8+3l3//v8dnV+fvz+eXj/+PP+efv7+Pb2fnz4+Ph5fvf5+X13ff39eHF8+/j5e3R5/fr+c3d8/Pn9fHp/9/d6efv5/H54ev38/Hd7+Pf0+3h8+PX3e3d89/L4fHn9+Pf/eP79+/16e/X5enRteXp//np2/vj6/3Z9/fn7fn399fT2e339/fl9 fPz3+H93/vr7+f17fP37/nZ++/35fnh2fv37enf8+vj+d3v6+vp5evn69Px2ePz39Ht1+v78/3h6f/j1/Hn++fv9dXN8/v12ev368/j/e/z2+f96/fv6/P9+/Pf0+Xz79fj5f3h7/Px9c3x9fX53cHZ8/3xyePv7+P19/vn2933/+Pv1/Ht8+Pj9eHv6+vp+ eXn/+Ph9ef39/P59e/v49f51fvz4+X16/Pr5f3f7+vT5d3V8+Ph+eH/7+/58dXR+8/p4//X3/X52fP39fnJ+/fT5enl5+vz7d336+vb+e3z58/V9fPr6+fx7evz5+Hp8/vz6/Xl4/vz7eXX7+vb5fHv9+Pf7ef339vd6dXz8/Xt3/Pv8/Xdze/n4f3Z++/r6 /Ht9+Pf5c3r6/vl/eP/7/P91/fX08nx2+/j1+nj99/z5fnl4//f4/3n7/v7+dHd//fl6e/n79/x4d/38/Hh0fX75+319/fXz/3j++fb3/Xz4+Pp+d/z8+vx7dn739vt4ffr5+X56ffv5/HZ4+/37fXV9+vp+dv76+/l9eHz9+Pp4fP36+vx6evr49n54/X/7 +Hh8+/v5e/76+fb+eHj9+PZ5dP1//f96d3r79311//r7/Xp1/vz6fXT9+/n7fXj++Pl/dv79+fl+en76+fl3fvf5+X53efz4/3R9/f38e3V4/vv8d3r+/Pn+fHz6+PV9fvr89/56ePz5+nl8+fn2/Xh4f/n5fHF++v39eXd++vf5eHv5/vx5dv77+nx2+/n3 +Hx5/PX1/nj++/v7/3t8+fX2e/72+vj+ef/6+f53ffz29nt3d/z8fnZ3/vz3/nt7/fj2fXr4+fj7enn9+fl5fPr++n92d/z5+Xx2/v36+n18+vb2+3f/9vb1/3r9/H57fefd4eLv8+/w7vp2enx8em5teHr6fHR2///8fXX//3p3bV9kb3J4dv3z7/D28+3t 7e/09fDt7fX78/Py+Xx9/fj6eHr8/fz+dXb//f14c3x+/f95eP76+f92/vr5+nx47eL9bW1yent7dHF5/f59c3v+/ft9eXn38fl9evn4+P52fPv4fHN9fv78fHV5/fv5eHv7+/n+fHz89/Z9d/38+ft2efz7/Hh5/Pv3/Xh4/vj4e3T+ff5+eXh7+/j/dn/6 /Px8dn75+n53//v6+Hx3//r7fnV8+/77fXp++fb4eH73+ff+eXv/+f52ff38/Xd2e/76/Hd3/Pz6/nt/9/b4fn74/Pj+eXj9+vt4evv7+f15eH769314/Pr6+nt5/fr0/Xd++vv5fXf9+vp+ef359/h9dn35+n51ffz9+n55ev33+np9+Pn3/3h9+vn8dn35 9/d9dnn6+/13d/79+n57fPr19v57+/71+Xl3f/n6enb+//t8dXf//vt8df79+ft9ffv08/l5//j493x4fvv9enV+/vz9eXV4/Pp9c339+/v/enj7+ft3eP7++n11ffr7/Xp99/j3/nd8+vf8eHr9/fz+eXl++fh9ePr7+/16ef76+np5/P32/Hh4//r8d3D9 +/v7e3v++fX7ev75+Pz/evv1fXtyfv/+/HZ3evv5f3Z8+/v3f3t+9/b5eXv6+/d/dnn8+352ffv69355ev34+Xh8+/n4f3p6/fj3fXb//fz+dnj+/vx4efv69f16evv39H51/f79/3p3fPn2/Hj++fv5fnb//n/6efv5+vh6d377+310fP77+v98fPf2+Hp7 9/n3/Hh4/Pn+dXv+/v16c3Z/+/x5ePv8+Px8f/ny8vx9+fr3+nl3/Pv9eHf+/fv9eHd9/Pl4c33+/P3/eHz8/H1zev39+X14/Pj4/nr59O/x/H369Pb4fvn19vX4/33x8fP+/vX3+Xx0dHl6eGxvcnZ4bGdpb29vamtvcHZ0dXn88/T4+e3t6+ru7unk4+jp 5eTg39/d29rb3uPf3uDp+nBoXVBIRERGTVJVVlhZWVtcYW386uLd29rZ29zX0tHQ0tfa2NjW1tXT0tHU1NDNzMvNzthsTD42Ly80O0h25+9vVUxLVF552s/JxcfO2+To3dLOzczR2+xpXF1p/u3j5vpvZmBme/Dm4+vs7/l0bm/97+jl5+Po7vl0amhoZmFd Xl1dWlVQTk5OT1FXYmp3fHz06eLe3dfU09LT1NLPzs7Q0tPW19fY2djZ297s+nZ1aV1dXFdUTUdAOzo7PkdVY3N1aXJ98/Lx+fXh0szLys3Pz8/OzMzP09XW1dXX3Nza2dnc4N3b19HQz8/OzeBBLiQiKTRywcDKY0tLT2RbXvbVvrm8xupWWODDvL3G51FJ SE5q2c3JytVvVk1U8tHKzNTta2tzeezh2dHPz8/X4vV9e+jq8V0+MzExOlHy1dl2WFRfZnTu8d3QzcvP4mJPTFRv28nGy9Lf7+TVz83O09nd6P7t49jS0dfY1tXPzMa/urW13i4gGx0qRsG6yWE+RE9ZcFNV68W4ucL/SlTYvLK1wOtRT1r1d19cWXzf7WNP SlbnzcrQ62Rfcffv7PPu3tPR0c/Qz9HS0dPX18/OUTAsKCk/ZNvLaU1HWe1o23Zc2MzExMzmX+PPx8HSW0tIUeLKycrO3untb2d78eTX193ucWVs9O3p6uvi08vGwcC/u7e/NyEfHCbmxbe7WD89Zn571UlQz8S5vM5STNXDtbPJVD06QmvKyMnP7XprX1pn /tvLy9TvX1df7+Pf5Ovk2tPPysbDvry4t1wmHx0fScG7tW0/OUvZb8xfROHQv7vG+knyyruvvOhDOD1XzsfK0vhwbmtnanLs1c7P23ZbWGzl2trqe/7fz8rJyMXCvbe27igfHh4/wb209T44Rs/nyPZBbt3Cu8TcSnjMvq+52Uc4O03Pw8fTcV5gent59vDa 0tTc+GJbZfzl3+f4+9/Ty8fJyMS/ubTDMSEfHS3NwrTGRTk74+HNzURR6sy7v8xUV9PGs7THWTs5QPLHxsnfZWVxdm5//d/Q0NjtaVtj/evc3u/78N7PycjIxL64s7w3IB8cKc2/tL1IOjds3dfFSErq0ru9yFhL18i1scRiOzk/Y8PBxtRfVl92bvPv7dXQ 1uxrXFv55ODf7H3239LKx8fFwbu2t1AkHx0hXb65tlk9NkrV6MJuRHzlv7zE6Uf1zbuvu99COD1PzcHEz3NZWfnqee7/39TT3XhfWGns4t/m7vDh1M7KycnFv7m1yi4hHx00xr60zUM4PODry81HW/bNu7/KUlbXx7O0yVA6OkDqwsPG21xTXHR64OTp2NTY 5m5ZXvXk3d/yc/fe1MzKysjDvbe2WScgHSBRv7i1YT02SdPqwvpEcuzBvMDZSXDTvrC62UE4O0nMwcPK9VpXZGl75Ove1dLc8GpZZ+rh3OP49d7Py8jHxL24tLo8IR8cJd6/srlPPDVc3eHDTUrw1ru+w21I38+4sL7sPDg9VcbCxtNvXF53YG/t69TP0+Vs XVht6N7d6nt539DLx8nHwLq0tOEoHx0eO8K6s9pANkDZ7sriQmHdwLrA1Uhb08CxtstKOjo+5MTGxtpoWmlgXe3l18vM2/5qVmDv6t3b4u/n1s/KxsS9t7C0TSQeHB9Kwba18UE3S+Z8y1pFbde8ur/tRWzTu6+50EU6O0XYxcTJ1+lsfmVhdu3RycrVflpQ W/nt5OPu793VzsjFv7u1r7g9IB0aIU7BtLbwRDtc4/HNT0d3z7q5ve5Jati6sLjSRTs7SNnLyMzd+21sWlphcdnLyNDnXE9bbe3g3+Dd0c3Lx8O9t7GvxC8fHRsoYsezvWlCQ+Zp4vA+SmfKurm9bF/f1Lezu9hHPDpP3s7J1u90fWtdWVto3c/LzuxdVFZc e+fj4NbNysXEwr23sq++NSUeGyY+abu+11dT0PXW6D1AR3nDu7nO3d/twbu8yl5GPUpk9NXS1c/N1PhiWFFk8N3O09vldGJWXGJt49bMxcG+vLm0tNI1KR8eKS499fHa3cO9v7jPWUo+SVnX0NrL1cq9vLvD1F1JSkZMVldh79XMyc3Z5Oj9935vcG1uam98 /Orf3trRzMrHxcPD1V1GOTc3NTg4Nzo+Sln209LNzc7Jx8XIzNDZ1dXV1d3j5ebn6OPl7/dxbG92fHhsam50dvl6bH13e3Btenv7+3p/9PP29/Lo4uLua2Fpa2NeW1dSU1ZbX2VqbW1t79/b2tze3tvY2dvb4ufr9fz08nxvaGtye355en/27u/7+fT6+3tu d3VqcGpz//rz9Ozl3tze8Xb9/HBlX1hSU1VXWV1cXmFhdOri3uHh3djV1dfb3+Di6e/u+3duZ2ZscXJzbnn7+PL9/fby9P50fH7//Hl1fffx8/nr5uLi7XhvfndpXllVU1ZXWl1eX2VkdOri3+Ll4tvY2Nvd3+Ph5ezv8/p/cm99/f7+e3j68vR8eX12fXVr aWtwdG9vffrv6+rn4d7d5v56fG5kXFVSU1VXWF1dYGhrfOrg3t3f29jV1tne5OPj6PX/fXN0cG1zeXl9dn3x7+/6enr9/nVramxtcm9uc37x6+zs5ODf5ft2/3FnXVlXV1lYWVtdYWhrc+3m4+Dg3trX2Nri4eLl5/D6fH7/eXP+/v78e3b99/p+cHJ3dXJt amxxdnpzdvn07e7x6+fj5e98enlsYVxaWFlbWVxiYml0c/3q5OHi497c3N3j5+jo6vX58fbw9X/+9fLy+X349vj+dm9udHBrZmhsbXBtbnn79PP37Onm5ery/X10cGJfYF1dXF1fZmptbnfy6+fn5+Lf39/o5uXo6O31+O/v8fv89fbz9/1/+/f5dWxxcG9t aGhtcXRvcP/69PX5+/Tu7fX8+Pr/eG1oaWppZ2Fkamxwbm99+PLw9Ozp5+ft7+3q6O767+7t7O/y8uzr7PT78vf4e25teXVvaWpvb3Nua213eXxxcH18+395ef35+3p0/n7+fnV0ev78eHb+/Pb6fH368O/5/fbx7+7z9fDu7fD2+fXy9v53fv39e3F7fH18 c/Pk6efyeHn5+f12bnR4enZub3h8/nx3fff29v778vT3/m9gaHBxc3P7/Pf7+Pr17u70+vHu7/L6+/Ty8vr+9Orsfv12+/j6f3T9/fv9enp8+vr+dHn9fH53cHh9fXdveX19f3Zydv/7fnR5/fz4f3x9+fb3fHj8+vn9eHv9+/t1fPv79354ev3593l3//37 +nt1fvv4fHZ9/Pv8eXb9/Px8d33+8v57eH74+nxzf/79/Xp7e/j3+3d8+fv6fHZ8+/x9dHz++vp6dnr7+/92e/v7+P99/fn49np7+/v4/Xj17nR+bnB6eP54dXZ//ft6evr7+P1+fPv2+f54/vj3+nl5/vv5e3f7/Pf7fHh8+Pd+dP/+/v16eXz8+Xx1/vz5 +n13fvv7f3b/+fb4e3V8+vH+b3l8fv59eHj99vd9evb5+Px6f/v5+3h7+vn3f3l4ffp9d3V//fn9e3379fX9efv5+/l6eH77+3h1fv7+/3d2ffz5fnj/+/f2/X758vHy+Pr29/h+dHl+fnlveH19fXd0dnn6+XV/+Pf19/z78Ozr7/Lt7e7yf/77fnxub3l3 eG5ram91cGtpcXV6eXd5f/Py+f/48u/v9Pvx7+/0/O7l3OHl/mx+dXdvf/v7+Xl9/fn2+nt++vf3/P/+9O3x9u7t7e72fP/7/nhtcHl7/3t3eX15cWlnbW5vbmhsfP74fP719vP6fn738fH7/e/u7uzyf/Lv7/Z8+vX19n9++fT0/H739vb6eHV3d3tzbG9v ef91b3R9+39wdH55d29tc3d7e3J8+fr7enV9/Pr8cXh9//V/d3v79Pd+/vL7+X9xd3b+5Ov17/Xr93Vxff38cm5+/fr4+nj8fHdwanJ7d3p0c/5/+3t7+vj4/Ht9/Pjw+nv48vP1/H7+8/L1fHz7+vb8dnz6+v10fPr3/HZyd/v1fG58/f39/n1++vj2/nj8 +vr9eHl+/f9ydnp+/nlzdXx+/3Z0ff35/Xx9+/Pz/Xj9+vj6enZ7/fx6c3v79Pt8efz29fp7f/v4+f19ff76/H18e/37fXZ8/H99cn77/392dn3y8/x2fPv+/ndydP309nt3+vn6/3d4//39dnr69+/6fH349fd6ePz7+3t4dn73+P52/vn9+3l4/P78fXj5 9vl9eHR9/Px+dnp++/f9fv729vl+fvj29f15ev37fXN4f/79eXN6f/v7eHj//vd/en739vd9dv779Pp6fvn09nt++Pr5fHd5/fX5fHv2/Pn3e3h++vv7eX38/vx5eP/9/nlz/v34+3l6/vj4/nb/+/r8enh4/ff7eX34+fj+eH36+ft4e/37+X13ef30+Xl9 9vTw9Pz+9/P1fXn9+/r/dPrj6Ozv+PP08fx4eH78/3Ry/Xp7/nZ4/vzqc2h1d+/59+vx6fT39/Pv8PH4/vnz8fl7/Pr3+f3+fvP78fj/7vHw+nz78/X7bWx6+vvx8/Tx9PT39/L08/f6/ftrXWJjb3h+/Xf48u7u9/jw7/H3/3/4+vp8evX09Pt9fvj09nx0 fv79/3dydHp8cW12eHp7dnJ1e316c3p8fv95dXv++vjx4uPk6/V8aGBjZmNtb3Z9d3h8/vj5eXz7+vX+fH77+fh8d3779/x4ef39/Hp4+/v7fXh2fH7/eHf+ev75fHp5/vn+ef38/fp9eHv9+n53fu/vdHlvd35+e3F8/vj4fHl8+fX5eHn8/Pt9dHj9+35y ev78+3x4fPn09Xd6+Pv4f3p6+vj7fHT++/r+dXZ9/n5wc359/X94ev3x8Pt9+fz49H56//z6e3R6/fv5enh//v55b3z2+/x6dn76+X92/vn5+X9+fvr3+Hx7+fr6/Xd8/f7+c3n+//16dnr++/11efz59P58//jz8Pt8+ff1+nr9/f35cXZ//vx9d3Z7/vt6 dXz/+vx8e/z5+v11e/z9+3x2fPr3fnj59PDz/3p+9fH8dn/8+/p9eHb+/vz/dvr89/l4/fj5+3j/+fn7fXV3/vj9bnN8fP17eHd+9PX9e/n39ff+fvv693t3f378f3d3/vr5fHj9/fn/eXv89/n8ePz1+Pl9d3v9+3ly//v6+Xp1ffr6/3R5/vv6/Ht8+fn2 79/g5ursfXb/e3txdn3//nlsbXB++W9+8P70evx6+/5iYmRten76fPzy7u74+O3t7e/8+/fy8v59+fr7fnt8//Xz+nd++n39eHZ9/fx9dHzv9Hh4b3l8/n5weH39/nh3ef739319+/n6/3p5/vj/cnZ+//x6c3r8/H1xcn/48/h9ffnz9X12/Pr7fHN3fP7+ e3f7/vt/dHl++fR6eP7/+/X/cH1++3pyefz6+np0fv36/nb8+PT3fXZ8//z+dXz+/Pj8fnz69vp8ef5//P5+fH76/Xh8+/r5fHV4/397cXP9+fP3/v348vP/d/37+vp5+O13+XR1fXd+d3NyfP7+e3b8/PXx/X779/f7eH37+/l9ef/5/Htz//j3+314fvf4 f3R7//v4end7+vj6eHf59/j+eHn9+P12fPv6+H53ePv1+nN2///9/X12/vf3/nf+/vj4fXv++fb9fPr4+Px3d/7++3t0ff77/Xp5/vj2/HR5+/r4fnV8+fl+cX35+/d8eH38+fp5fvn5+3x8fvj2+Px8/vn6fXV3/fj7dXr8+/j/enp/+Pt3efz9+395e/v3 9352/Pj4+nl3/Pz6fXn7+fT2enr9/Pt2cXt7fn59fX/z493q5+bx7u7y9fT7d25xcnx7bW5xen15b3b7+/p+c3j8amJnaX/99Pj79e/r7fTv7e3t8vv68+/x/H359/X5fn769vZ9dXx9+/13dnv+/nl3//78fnZ1e/z6fHf+/fz0fnB8/fn9dHX+/fx5cnv8 /f11fvr79396f/n3+Xh++/z6enZ1ffv9d3d+fvj5fnz5+Pt7fPv6+3xxcfv9/3ZyfX79fXp6+/P0/Xj++vz8ev38fPh5efn7+P53dnv9/Xx1ff35+X17/vj2+3h5/f38e3f/9vb9efn39vZ8eHv8+H51fPr6/H15evz6/Xhz///+fXV5/v3+dXj9/Pf+eXz5 8/l1eH/8+fv+/ffx8vx4+/j8/355fvr7fHb8+/n9d3V+/n53b3Z9+/57eXr8+f53fvb393xzevz4fnb9+fb3/3v/+vn9dXd+fv19evv19v15dH349/9yd/v193t7/H77fXh3fvz7enr6fv1+en38+ft8c337+ft5ef35+Xl0fv35+np4/vr6fnf+ffn/eXl6 /P38fPr1+/x7eH749/92//L3/Xtyev37/nd6/v39fHv+9vP2fHv39/f7env8+39ydX59/XpydHz6+H17+vf3+35/9/Pz/nl8/vt/d3X/+/16e/X28/p7e/73+Xlye379+npyePz4/HZ6+v35fnj79/X9d/b38/L+fP75+nxxeP36+H55dv74+Xt3/X7+enF4 +/b7dnn59fL8d3r8+vl4c3t9/f7/ff339ft9+Pj29338+3z/dXP+/Pp+dXJ7/vv9eH739vZ+e/z49/t5e/v8+Xx3ff37/3d//f36fHl9+fn9d3r9/Pr/enz++PN8efz69/13e/z7/Hl8+//7/37++PP6dnz8/Pt+fXt8/nt2dPv5/n11ePf093p2+/by93p3 f/z7/3d+//z7fnt++/X3en74+fh+en/49f5x//z+/nVydv/7f3R3/vn5fnx5/fj2+3t+/fn4e3z8+vx4fvr5+H5yevn5+nh2/fv6/nt8/fX3/nd9+/n6eXf++/p8dXz+9v16d376+Xx1//z5+317evv4+3x++f76f3p+/Pt+dXz2+P17dX349/t3efr59/98 ffr0+nd2/P35/nh4ffz+dXr7+/n/d3f++/p7efz69/19fvr29v14/vr//X53/fv6e3j7/Pn7e3Z8/Ph/dn7+/Pd+dXz++ft5efv6+X12fvn4+3n++fj5fHZ8/fv+dnv9/ft+e3v99vh8efr7+fx5efz6+nl5+/v3f3d4+vr9fHb9/Pn9e3399fX9ePz5+vl7 e31+/Hd0fv34+nt5//v3/nR4+/X7/Hz++Pj7eHz8+/l8dnz8+/92/vv6+H15ffr39+vf4uPr8PH49PP6d3F5eHt3bnR5fH10eP769Xx4cHb7bF1ibHH//v378+zr7vXu7O3s8/Xw7+/3//b08vl9ef78+31ze/78/Xx5fPn4/HZ9+vv7fHd4//12c37/+vp7 dnn+/X51ePv7+317fvv4+vh9ePv+fnR2/vz8d3n7+/f/eXl9+vl7d/3++396eX73+P54fvv7+3p2/vz8fHb9+/n5enh/+/l9dH39/P19/3v69f15evr9+n52ffn7/XV6+Pn8fHV7/fz+dXj8/Pr+fnz+8vN9e/f5+Pt5ef75+3l5/Pz6/nh4fv39d3J8//z+ fHz89vl+dX/6+Ph6eP/4+H14/fv4+nt6fvr3/Xn8+/v2/3h++vf7eHj8+/t9dX39/P11fPz39/53ePr6/Xd6/Pv4fn1+/vX4f3j7+/v8eHj++vx4eP35939zffv593p4/fr5/X16/vf2/nb7+/r6efXtdn51cH59+v54dnz8+v51ffv6+318ffr2/Hp6+/j4 /nh++vn8eH76+vl9eXr/+Pl2e/7++355efz4+X13//z3+3Z7/fr7eXr7+fb9d3j+9fl3dn39/Px9eH739v14/fx+9nx4/vv6fHV++vj7e3d9+vl9dn78+ft+fH759fl5fPr7+H52ef36/3Z9/Pv5fXh6+/n7enn+/fv9e3v7+Pn9d336+vt4ef78+3p5+vz4 /3h4ffv7fXb+/fj9fHt/9vj7dn38+/p7eP76+n13/vr1+3t2fPz6fm94+vv8fnx8+fX5fHv4+/j9d3n8+v92efb4/n10fP36/HV4/fr6/3x9+/X4fXv6+vn8eXl++vx4eP78+X52ef77+Xx2/vr6/317/ff4/Hd++vn5e3f++vt8d/34+f18eHz9+P51fv39 +H53fPv4+3l4/fv5f3d9/H9/e3z59/b+eHr8+ft2ev78+v97ev/39354+/v5/Hh5/fr6eXf++/f8enf9+/l6dv/89/1/e/329f13/vr6+Xx7fP76eXV+/vn8e3Z8+fn8dnz6+/t+fH759/l5e/n99vXv7XF4dm56fPv8fXd6/vn4eXv7/Pn+e3X+8vj9d/z5 +ft7e/z5+nt3+/f1/Hl4/vX3d3Z+f/39fHp9+Pb7ef/5+fl8d376+351fvn5+Xt1fvv6/nZ8/fr4/nz/+fT6enz6+/n+d3n++f51e/z7+X13efv4+nt7/vv6/nx7+vf5/Hr++vr6eHn++/t6efr59n16/3709X95/Pv6+316fPn4/nd6/fv7enZ//Px+d377 9vl8d337+f10ffv9+318e/r1+Xt9+Pv4/nd8+vr9d3r29/t/dXv9+vx3ePz8+vx8fPv293x5/fv5/nl3fvv6fHno3ePk8Pjt7/H+dXl9fHdvdXZz/3luff7semtvde377uzw6fDt//T49fD3ffr693d5/Pny8PP6f/b48/5+9vT39/n98e/we2xqfH338/Lz 8u3w9Pn07fD1fmpcZGdnbXj8+31+8fDt7/f58e/v+H739fP5/n399/j7dHt/fv53/X5xfnBudnp8fHVwdnz/e253/X3+end5/vl+dnR+/v18dHd+/n11ef/++3t2d3r7/nV1fX3+e3d2ffn9fHV7/fv+d3b+/P57dP77+f93dXv4/HVzen3+fXp3e/j7/HV8 +/z7eXZ8/fx8cnr+/Pt6dHz7+X10ev36/H57ffn2/Hp7/P37f3V2fXv9eHj9/fh8d3j/+vx4d/39+/x6e/z7+vt5evv7/Hd3/vv7eXf8/Pb+e3l8+/l9dv9+/P57eXv5+ft2e/n8+Ht3fvz5/XR99/j5fHV7+/t+dHr9/fp9e3v89Pp8evr6+P52fPr8/nV4 +fr7fXZ4/fv7eXf8+/n+e3b48/j9efv8+ft4d3z7/Hl2/fv5/nh3ffn7fnh++/z7fnn++fv9d3r8+fl9eH77+v91/vr5+n15efv3/XZ8/v/4/3Z6/Pj7e3f/+/n9eH36/Pp4evr39394ef77+3h3/v37/nt8/fn3f3n++/n7enl/+/17dP/7/Hx7eH/4+350 //r6+357/fT1+3l++vv5fHt8fPp7c33//Pt7dnv7+Pt3e/z7+P58e/r4+3p2/fv5/nd5/fv8d3z6+vd/ent++Pl4eP3++/55eP74+X92fvz6+nl5/vv6fXj9+fX9e3h89/l4c33+/v57eXv49/t5ev/293x5fPv5f3R9+/r6fHl6/Pv9dXn9+/p+fP/59vl+ efv7+H53eX36/XZ6/f35fXh5/vn6e3j9/Pn8e3v9+Pn9eHv7+f15eH76+3t3/Pv2+3x5fPn3fnZ9f/3+enl9+fn8eXr7+Pj8d3z4+/13ffn3+3x3ev37fXF//vz3fXx7+/b3fnv6+vn9enn9+/53dvf5/v51eP77+nh3/Pz5+359/Pb3/nj8+/r7eXd6+f17 df/7+vx6dnz6+P51fv37+H17fvj5/Hh7/Pr3fHd8+vn+d3/59/l+eXr+9vt1en7/9f5zeH/5/Hx2//v5/Hh7fv72eXv29fX9eXj/+fp2dn7++358eH/39/t4/fn5+3p5fvr7fHL/+/v8eHZ9+/x+dHz6+vp/fP/2+Pp8ffn8+X316H5zdmx4e/7+eXV4/Pr7 eHv7/Pf8fH359/l8eP379/54ev35/Hl7+/f1fXp4fvb6e3d+/vt/dnT69/j9d378+fl8eP38+n51/ff2+3t3fvb3eHN6//78fHl8+vf5eX345t3p6uzx7+9/ffP2+3ZydX18em5xe3t6c3V6/fh8cnVwX2hra3R89PP89+3t6u7y8+/s7fX78/Pv9fv/+PT3 9Xp1+n3+dXN6//x3dH7+f/59d3v89351fX//f3p2ePv7/HZ2/vv8fXd7/Pr+dHv6+Pl8dHn+/P5zeX5//Xt5ef74+Xx4/Pz4/3V5//r9d3X6+v5+dXh+/Pt5dn78+/18e/349v54/fv6+3p2e/77e3R+/fr9eHV7/Pl+dv78/ft9e376+Pt2cvz3+X53fPz5 f3Z++vn5f3l6/ff9d3n9/vP7cXl8+Pt5dn39+v15e/z6+Xl5+fb2/Xh5f/v6eHX9fv38e3l9+Pj9eP/6+vt8eX/8+3x0f/v6/Xt0ffr5fXR9/fr6/nx+9ff5fHz7+vl9/X55+3p2e378/Ht1ef76fHl8/vr4/Hp9+vb5fHj++fn9e3n++/x5efz6+P56eH73 +nt2//77/nl4fvn5/nV8+/r8fHh9+vp+d/r5+Pp7d372+nt1ef79/X14e/n3+nt7+fv4fnl7/Pr/dXn7+/p8dnr9+v52ef76+v18fPn19v14/vz6/nd1d/n6eHn++fz/eXb/+fh7dvz8+vt7evz4+fh5ePz8+nd2fPz7e3b9+vj5fHh8+fb/dn39/ft8d3v5 +/t5dvz8+X54fPv5/Hd99/b4fnl6/Pn+dnn+/vt+e3n+9/h+ePv6+P56ev35/Xl3+fj9/Hd1/vz4e3P/+/v+eH/59vX7ev75+fl8eHz7+nx0fv37+3p2evv6/nd7/Pn5fnt++vf7eHv7+vh+d3v8+/92ffv49356ePz3+nh4/P72/Xh5//j6fXb+/Pn9eHv7 +vp5efn49/15d/76+np1fn/8f3x5f/b3+3n9+vn7eXl++fp7dX79//l8dX78+v90fPz5+/58//f393p9+fv5fv59e/p6dXn+/Px7dnn9+Pt5ef78+P57fPv3+n55/vr5/Hh3/Pv7enn7+fn8end++Ph8dv5/+/x6eHz4+v12evv7+Xx5f/v6fnX++Pb6e3h+ 9/d7dXv//v58eX34+fl4dfb8+f14fPv6/3V7+vn5fHd5/Pr9d3j8+vn/fH359/h+efv7+f56d376/Hh3/fv6f3l4f/j6fXd+/Pr8fHv9+Pr4eHn6+/t6d337+nt3/Pn4+315fPv2/nd9/vz7fHl7+vn7eXj8/fd+eH37+P53fvj3+H94ff7/fnl5/v38f3t7 +/f4fnn7+/j+eHr++/x4dfj3/v52d/78/Xl2f/v5/n19/Pf4+3r9+Pr6eXZ8+/l6df/9+/16d3v7+f92ff37+318fvn5+nl5/fn6fHZ6/fv+dn36+vd9d3v7+Pp4ev7+9+ji5+Tr6u399/j5eHNzev97b2t6fHt6cXZ7/PtvbXhqXmZobnf58vT58Ozs7PLz 7+3u8/308e/0/n3++fn9dn37/Pp8en36+v14eP7//Xl9e3X9d3B2fn/+eHN2fP3/dXV8/v16d3Z8/312cHp//3hsaGpoaWlw8ufe3d7e397g5uvp6u77dGxmZWJfXV5hYV9cW1xeX19faXB4end3/ern6ePd19TR0dLS0tHS1djZ3eP0c2ljX1tWVVRST0tJ R0ZGRkZITVRea/vo3tnW1dPPzs3NzczJxcTDwcC/vr69uri3usPpSDYsKCUlJyksLjI4RGfJuK+sq6ywucLXblJFPjs6Oz5Lbs2/urm7vsPHx8TAv76+v766tLGzveNBLiYiICIkJykqLjRG17isqKaorLG5vcbWXjwwKykqMEB1x726uri1s7K1vMnndPnW v7ewrqyrrK+8ejkoHxwbGxweISYvP9W2qaOioqWprra/7kU0KyclKS88W9S/ubKurq2wt8HU92B/1se8tq+rp6Sjp7ZgMiMcGhkZGBkbHyxMu6yloKGhoaOnsMFOMSsoKCcqLTJE2rmvrKqtr7K2vMfWYE5Y5sS5sKuopKCgqMFDLB8bGRgVFBcbIjbWtK2m n56dnaCrv+dENS4pJCAkLDpkw7i0r6qoqay0wdnd2N/s5tfGtqumpKKltP4/LyQcGRYTFRsfJi9UvK2inZyen6GnscJfNSkmJSMkKjE+d7ywrqupqqyus73KzczS2c3AuK+qp6iw0lpBLiQcGhgXGx0fJTByvK6nop+enp+nsr/jPi4pJiQmLDI6Tsu3sK2q qqysrrK6vsHGyMW9ubWvrbhaSFQ4Jx4dHhwcHiAlLUnkzbupoaOlpKOnr7vVTTw2LysqLzg7QXPFuraxrq6urrC2u7y+xs/Mx8nP5Eg6RD4uJykuLCcnLTo5OEJvzMzGvbeztba3t7i8wMnKzNXj5+bp9HZ0cm5pZ2psZ2Rnb3NpanH17fPy7m5ZYGBRTk5V VkxLTlhaTk9bbW1jbe7b3ePd1M/U1dPR0dXb0NLm197c3PXq7+7weHF2enZ0b23//HVoY21lXltVVVVTU1FSVFVYWl5fY2/97fPr3NvY2dnV09TW19bX19nd4ebm6u99b3BvbGhlZmprbGhqd3h7dnVxbGxrYWBjX19dXFxeYmRjZGpyfvn78ufl4eHk39ze 3tvm39rq3u7n5u/qfHd5e3pvaW1vb3BtbnV99/p2dv3/dG9nZ2plYF5fYmNlYWBnbnFzcXr27urp5+bg3t/i4N/f3+Xq6+js7n5++f1+d29tc3V1bWtzeHl5fH76+PT7cXd4b2tmYmRmZWJhZ2ltbm314eHg5+nk4+Hj5ero5OTrd/jx9fX7eHpz/fp4/fj3 /nhwem/87/749enr9vny7+/48XFmbGhvZ2h8dH5rbnT8+v98f/jw6+/z6ern6Onq5+Tn7e7x5+3t9Pn39vh8c29nb2xlaHb87vn++/3s6+7yefntd373eft7c2lu+v54bXR+/Ht1dHr2fHp4d3xkc3V79/Dr7e7y7Ozr7/j69fL3fXv7+vp+dXNvavJ0aO1u 7PNs+3f4fHhubXdubmllbW5wa2pzdnx8c3b9+Pb4fPXy7/D49/fx7vT++/f0+fp8d/Z4Xl93ZPL1b+128un8+vP28fH7fP/8eXpwZm5samttaGZvamlsc3b9fHh/9O3s+PDs9ubv9ev17Of99Pb77vV7cvl+d/5ud/14/nZwdPv4eXd7e3t6d3RrendqbGlp dnJscG/9f2/0d/zm+PTu+unp7fv76fnt8fnoc+frZ+RydOtr/Gl9+WbwYnvvav36cnHn/3jucn7vcXZxaHZ3ZGpwZnd2aHl9avDsZ+3lcN7rbtzz7undae3WW+PYVO3VVfvdV/bcU+b7Zej+c2ngbn7hWvvnU+B5TuRpWHRqXWDkYmbeX/Peaerl99lu1vV7 yVPU6l3JTdvVTdv7YN1f5utPzV5Xyk76zk7y01Xq51n9YXBiTuxXUOJYVH5m+nBr3GLh5W/X7+Xo6td579Nk1fFZzGzz6nLOTNHYSM/iX9jzdtvyc878Wd5oXV5RXElZWUJ1UkjpV2JmbtX34dXsz9vl1uPW+unUce/259xe491p3tZe3M9b09tey/HaztvJ fu/NWlNWT0w/QEQ+P0BBTUpMeXTs2tvEydXDydDM2NXd59t59+Re7d5q3eHV3PfE0+zFyuLKwczMweVTxVk1UEwzLzY/Li4+OjtCS3Lvz8fAt7u+uLbCz7/HX/voWlJUZV9ZfHndzNTQxMbMxL7Ewra6wdvZvEYyTT0uJy02JSc0MTU1TO/3vr+4rbGwsa+z xsPJ/ldES0g9QEVNWVzszsXBv7m3tbOwrayxz8OvRiw9OikdJC0eHyktMjFW8syutrCppqm3rKzH3u/1QDY+OTs+PUle0dTLtbS2r62srKmmr9u/sjgoLy0iGh8jHCIlKjRGyvW2pampp6Cmsay30f5LPjE2Ny44QUZM57++uK+vrKqpqaejreLHtzYmJycf GR0dGyQmKTFztsyxo6OjpqKprqzHVUxFOSsxNTE9Q1L0wre6sKusq6mnpqWoyXa6SCgjISEaHB0ZIiosL0eytq6kpaGjoaq5sMNNOzU0LDAzL0BY9Ni/srGtq6ypqKanp6vX68w2KCIfHRoeHBslLDU74LS2p6KlpKWjrrq8XUI4NC8sNjQ4TWfRxbeysKus rKqqqKinsmLeZTAqIx8cHSIdHygtPEy+ubWlpaanqKu7u85CPDQwLjE4NURg4sW8tbSvra+urq6sqqm68t1GNjIqJB8jJiQsLzNBbsDGubK4s7a4xuXxRT9AOz0/T1vkwb+7ubq7u7i7u7i4tK+tssfcTzk4MCwoJygnLTY4Q01718i7vby8wsfS22tWVElL Umvb0snJxb+/v8HDwsPCxMTDwb2+zF5EPTs4NDU0MzQ4PD5KU1xseuTVzMnLycrOz9XZ3d7g6u3q4tvZ2drZ1dPPzs/NzczMy8rJ1GpVVEtDQ0E7ODk8PUFHS1FaXX/b0MzJyM7Pz9LU2uLr7O3069vT1dPZ5tjU0M/RzszKx8jWYFtdTENEQjs5Ojs+RUpN U1le59PQzMnJzs7Q19Xb5+/3fvzk5eng3dnU0NDPzc3LysnGxtZcWVxLRUZAOTk6PD9ER0xXWV7j1tHLyczOzdDV1OLt5+v09evu5tzd2tTR0M7Oz8zJyMbH2lpbX0xFRUE6OTo7QEVHTVRWX9/W1s3Ly8zN0dbT3efp9/Ps5+7q4uLX09XSz8/Oy8vKxsXU XFZfT0hHQzs5Ojs/QkRNVVhc69nVzczNzMzO0dPf7Obp7fLt7+zf4drV0s/O0NHMycjGxdVdWmNPSEhFPDk6OkBEREtQVVzp2djPzMvMzdDS0dvm6fHv6+rx9OPf2NTV0s/PzszLyMTE1VxZYVFKSkQ7Ojo7P0FES1NUWOza1c3Nzc3MztDT3uTl7O/w7+7q 4eLc1NLPz9HOy8jHxcXZWmBeTklKRDs5ODs/QkVLUFNd5tvXzczMzM3Qz8/b5Onr7evt+fHn4dnX1tHPz83LycfCxeJXX11OTEtBOzo5Oz9BR01SUVzp29LMzs3Lzc7O0dzg4ez08/Ly6uvm29bSz9DPzMnHxMLLb1tnVExNSz87OTg9P0JITU9Vb+Dc0M3N y83Pzs3R2uHs8+zu/Pvv693Z2NPPzs3LysfCwdNfXV5STk1HPjs5Oj4+QktPT1d74NbNzs3Mzc3Mztba4evu9H/38Pju4NnRz8/PzcnGwsDJ+l9lVk5OTUM9OTc8Pj9GTE9PYuzf0s7Ny83Pzs3O09zn6+zx9vr889/b1dHQzcvJx8XAwtpeXVhPTk9GPjo3 Ojw8QUpNVGDq2c3Jy8vN0c/R2+dvZWt47fvr3t/a2M/HxcO/vrm0s7t5SUI6OTM2ODM3NTg/QU1k9NTLv7u8u8DJznNXTUJAPT1CS3DUxry9u7m8uru8ubeyrqytvlwxJiMeICcoMj1Mz8rBu727wcbMW1NEPENBS+/nz8/Pxsi/vsXC09/ccdXGvrSxrqup pam7TSccGxgdKjJoy8rDzc/Nx8LY5VE4ODQ7bc68t7vE3G5Zac3GwL/P2NrTv7iwrauqqaes2jggGBoaIDxNycPf5GfgzcO97U07LjU+Z765uL3NelNi786+wMXM4tzOwrmzr6+vrqyos0wtGxccHTLnz8L3TUdZyL63xEE1LS5H1bmzuctbUk10x8S/w9be 3NPHvbi3tba3sKynq/AvHhccIC/VzdhOPkFfvLW4xzstLjJXwra3x/xIVeLNv8XY7vnbyr++v77Avri1r6uoqs0yIxkdJSxb41xDPk7mubbD7DsvNED1w77I7Xhm2cLI029TXtS/vL3H2tXIvLOvr7CvrbhGLh8bIyg64+1SQU5eyLjB2Us1Mz5az8LF4fnq 38fH22dXWuLCvb/I3uDLvraxsra0rqzGOSgbHigwYtpeP0FX2rm6zlM5MTpb0cfK+Fzo1MXE3VhNXti/ub/M5vTMu7OxtLq6r6u9PSkcHikzYtxaOz1X1be40Uo3Mj36zMzVaFjbxsPI70pIZ869uMLZeu/Ht7G0ub66r6m5OykcHSw4bt1PNjpkyLS45z41 NUXTydxtVV3KvL7NWD9BeMG2tsd1XeC/tLG4vr+5rKa0OiYbHS4/6vJEMTfkvbG6Wjc1PFbKy19KT/C/t73gRjxGz7i2v+VWWM+6s7O6wryvqKbDLiEbIztVe0k4LkjAtrXRPjE5U9/MeUNF/cW3uNRGPkN6vrnB3Flez7q0trzDv7Sqpaw/Jh4dL01eSDkx N8q1tspHNTlX5dxhQD5mwbi3zEg9Q27CusPeZXPPvrm7vcS/tq6pqL8tIx8kPEtFOTc3Vrm3xlc+O07efE9EPk7Ft7rKWEBF8crDx9r03cnCvr/Dv7q1r6ypsDsmIiAwSEQ6ODtEwrjGXEY/SuP9SkFCTcy5u8xfR0dvzcjL097Vx8TEwcC9uLSxrqqtRiYj IC1KRjk1PkTJtsZRREZN4OlFO0Jbx7a721VMTu/O1ePd0svDxc7Kv7q2srOxq6rdJyQgKUdNOjE9R9a3wE8+S1bu40Y2PnrIu7veTVl4+Nzd99nEw8nLz8q8tbW2s6+qqGcjISEsTU01LT9fyLjKPzpe3ONePTNDyry+yW5M+c/qXmPqzby+0uLPv7eytrm0 rKarNh4hJDlWPi0tVsy8wFc3QsvIXD00N/a5u9puaPPKzlFDZce9vMt/6L+1tri6t66no7kkHSUsREAwKDnBvcdmPzvlut44MjpXw7vdTerHxtZPPk7DuL/S5ta/tLa9vLOtqKSuLBwnLjc3Lyszv7niRUhO7b7VNS9E3tHQ21d8vb5tQkZcyrq/3uLBu7u6 u7qxq6inqzscJC8xLiwvNcu300BJ2c7R+joxR8/ZT1Xhxr/HaUFL3MrO08vFv72/v7ixr6yppqdPHSIvMCwpLjfMuN49RdDF4Uw7OE/U40RNzL/Cz3RLWtDM3NXFv76/vbm0r66tqaWpNBsoMywkJi4/v8FOOXW8x1I8PUv47Ek+Ybu62Wr+6eHd7XrJur3J xrizs7Ovq6eksyQdMzMmHik6ab5fPEy8u1M6PlZ6Tz89XcW/3FjSwtNUU9vGv8fOxLawt7qxq6inp9IfKD4oHh8xPv/zP1LBt+4+RmJzSDo+VdnU527Mvc5kadLMzcvMwLq3uLexrauqp6k8Hzw3HhwmOzhZQ0fAttI/X9FfQTg/X/FKTc/FxNj+0sTMbdnA vsPCuLOwsK+rp6SuKiXeKRodLTYzRznZsr9IXLziQDs9U1w/O9vD2ejSwsTJ4tW+w87FtbO3tK6qqaenbiNePBkcKC8pOzlPtcFS47bYQklCSEs8N+vMSeS+xc3Dx8m7ytK8tLi5sq6rqqmmuidBdRwbJCwlMTU+ucVZ07LUS2JLSUg8NWvWPmG9wc/FwMG7 ycy8uLu5sq+trKmlrDEzvSEaIykjKjExv8tRy6/HVtdXUE08OFJTP1TczMrHvru7wr+8vby6t7Kur6unpt8vvjYbISckIywqfs5G16+75cXmamM9N0pLNUvhb9DGw7i4wb23wb25vLixsa2pp689dcohHyYlISclNdxFTrm1zL/E2dNOOkVMNzdPVGXUzLy2 urq0ubm1t7mys7Otq637P780ISYnJCcmKEtJPOC4xsO/zMTOSUxnQDdGRElxfM67vLy0tbm0tbm1tbm0sq+v7UXIOSgpKSUqKCc6QjtSyMvEv8zBvdpi4WtMTEJGW1lhz8XAurm6t7i7u7u/wL+/vL19UelFNjMuLTMwLTU+P0hWZNjK1dTGyM7Q1t3c/l5s 7+3m2tXMycrJyMjJyc3Pz9DS0NPd7/heUEpCP0A/PD0+QEdMTVRlfO3h4djOzdHV2tze7XZ96+nj3t3Vzs7NzM7NzdLV1NXT1OL1bVxUSkVDQ0A/P0JGTE9UXWr+6eLb09DQ0tbZ3uP0+/Tu7Onh2tLP0NDQ0NHX2tra2trc5Pd+ZFhPSkVHRkJCREdMUVJa av7k3d3Y0s/Q1Nrf3+b4eXzu4+Dl3NjU0dPX19jY2uDl4t/b3PBxaWBaTklHR0dFREVITlZcZHXs2tXW1dLQz9Xd5uzw8/l2/uje3dvb2dXV2dze3t/k6ufo497j+25gXVhNSUdHRkdHSEtQWmn27uDa1tHR1NXW2tzi8/z4/vLq7OXf3dnb3d3d3d3k6u7q 5ujn6+rtf2tdV1RQTElHR0lMTlBUXXbq4t/d2dLR09nb1NDX3Or47uTl6evn4d7f4eTj4+jo8PDv7+3v7ufqe2ZcUk5OS0lISUxOUFJYY/3m393Y1NLP0tLU2Nrd4+br9vx98+zt6+7v6uTl6e3s5+Dj8uzu5uDf4Ox7Y1tWUU1KR0ZGSU1RV1tk/ODY1dbX 0tDP0dfd5uzy/GxoZmdtbnJ6cl9i9e/239nd2M3NzsrJyMbI1OxjVExHQTs5OTs9QklJVWvn1s3JycnLzc/V4P5hXF5fZWlv+ufc1tfX0tHQ0dPV1dHPzcnDx9PhYFFNSUE8OTg6PUFGTFhq4NDLx8bIysvO0t13WU5NTE9SVV1s7d3X1M7NzcvLy8vKysjF wb7AzNxeTUhCPTk3NTY6PkRNWWfm18vDwMDDx83Q2vJfT0pJS01UXWz14tzTy8nJyczLycjIx8bBvsLO3lhJQz86NjUyMzY6QExYcN3Sxb68u73AxsrT5mdTS0hHSU9ZZ/rr39bNysjKzMvLy8rJxsG/ydf1TEVAOzg2MzA0NjtFT1/i1Mu+u7m4u7/Cytfo YU9JRUNITlhq9+3azsvHx8nKysvLy8vHw8LN3mpJRD86NzYzMjU2PEdSZN7Wyb27ubm8v8LL1+xdTklDQkZMVmn459XNysfHyMnKysvNy8nFv8DO2mFFQjs3NjQvMDI0PUdTbtvPwru6t7i7vsLO1+taTEY/QUdNWmz73dDLx8bIyMnKy83LycnGwMPR2VhC Pzk3NTIuMDI2QEtY8NHMvrq5t7i8v8bR2HxTSkI/Q0ZLVF732M/LxcfHxsjKycrKyMfDvb7Oy/46PTkyMS4pKy80SmnpzL++s6+0tb3S3+dRTUI3Oj5CXe7wzcjGvr/HxszUycvLxMbEvLiwrb5mSS4tLigkJSUpPkjsw8C8r6+0s8f8bVNHUkY8SU5ozMnP x8rKwszq+F9e4uTp0cvFu7m5tbOvrLZLPS0jKiUhIykrSMnMtrW4tK/Bz3o8PklHR2VP78C/vb3N2s3qdWlMTG915NHZzL68u7i6ubOwra9MMS8hJyggICw0TrK9ubKzuLTPOz82OUhVROLAvbC1wczPX2JOPUNTYdnO3MvAv7y7v725ubWwrrk5MiwhKiUf JDZAzbHEt7OzwcRDMz87QExjXbmytrS/1troQkA+Plzb5tfHysC+ycrBv726vLeuqsAxNSkjLCIfJ0VOurPJtK+11eYyNEU+P0/nz6yut7vG935VMzc+R+rM48y8wcDF28++wMC8urKqqfQtOCclKh4eLfVdtbrDrqy+T00uOkg7OWTFuqmxvbu+cE89LTlK TWfP0b62w83M0cu/ysq6tq+pqkstRScjJx4fN9dLt7m6rK3WQFgwOz81N8+6uquyuba3UT8+LzxKRVjCwr65ytTHydjJyMa3s6+orjM1RSEkJB8hSVpMsbm0ra9PTlgxOjs5Pry9uqywubi+P0M+MzpFRmq+x8G7xMvCzeLFxsO4sq+oui0/PSIkIyEpZkJa r7C1s7ZP5E0vMj0+Q8TLuaytvb/ISUs8MTdMTW3Iyr66v83DyM/HxcC4sK2sWS5dMSMiIiU0WTfTsa61tsR+y0AxMkNAUNvStK6yw7zLb0w6OD9MRmHZx76+x8e+xcnJw762sq6wPjVnLSMjJSc7SDfKsLC6tMfWykAzOEk7T/PSurG5xLnI71FCPEZKQljZ zcfAxsG8v8fAvby2sK/PMklEJiMkKCxDOkK7r7m7tMXK3j81QUU5SuLOv7e9vrrFf1tPRUVJR1jb1M/Ev7+9vb+9ubi1r7k7NmIuIiUnKTU+N3+wtL+2tsDH6zs8UD44S+viyL3Ev7jD7OD0TU1OSFjn9eLGv8G8uru2srOxt0M3Wy8kJSgoLjszTbu1v7iw urrFWkRdSjk9Sk5cz+LVvL7LyMba2t5dX+fudNXNzsXAw765urzdR19KNjEvLy42NDU/VGh9zczDvL3Dw8DIzNPnaHRpT01VVFVjZm7e0dPQzc3Mys3Uz87SzszKyuRc+1pHQDw6OT46OT5GS1V0dNnHx8nEwsTCxc7Y0eBjXlZPT1BLTl9ufuXa08zKzs3I ytDM0c/Hw89dbfhLRj44OD48NjxCSFBxa+vGw8jEv8PBwc3WztdqWE5PT0tIS1ttd+/ezsnLz87JyszPzsnEv8R4UNhcPjw4Nzk9MjRETE1b6uHCvcbIvbzFxM7f2dtTSU9MSUpLT3Htft7Ny8zMzcvFzNLKx8XBvrzOUtxyOTc0MS81Li5CTElVysi+t76+ t7jOzs7rXlNHP05HP01qZfLU1crCy8/Ew8zLyMjCvr+7tL9I5dE0Li8uKS0sKj9NQU67ur6ztre1t93ayVo+Q0s9QkJBX9p73L7AysLDx8PF1se+x8S4tbbHTsrcLywwLyYpKi07PT9ttr3AsK60u7nIy+ZFPkhEMztMTlTt0se+w8K7vsvGv8jKxL+8uLa6 fPTBOywzMyckLSsvNzxOyr/Osq20u7O2zs9uTkVAOTpEPUNu2d7Lvb+9vb+/vcTFvb/Cu7S311G/XywxOSwiLC4rLzdIbczWuq23urGvx8vD5Ug/Rzw6PEBMVWzVxMbDu7q+vbu+vby/vbm4v1zoyDMtPTIkKDUrLDhESm7Mx7e6vbS0xNG+2U1PU0Q+SExT XPbOx8rHvsHGv8LJwr/Fv7u7v/HexjcvQjYmKzwtLUFRRmbFyMLCwr7D09zMZEpcXUFEaF5V3cvOyb+/xMK/wMfBvcDEvbu9xnvS1zI0Qy8mMjoqL01KPvXE1cq/wMnKyMzZbG9pT0xUVlh+09TNxMHCwb7Bw8W/w8fFvr+/zGrNZzI9Qy0qPDcrNk4+P9nL +s29xM7FwtLd5l5NTFFXUVnw2tvKw8XGv77ExMLCyMXBwsjBzWrWXTc9QjEsOjktNk1APfzOYuXCx9nHwNjh0+VdXGFbWW3369vPy8rJyMbJycjJy8rJyMnHzOrdd0A9QzsxNzs0NEBIQEzo7n7Wy8/Nx8vX19v7dXBjXm78+uPY08/KyszLyMrMy8jMzMvJ yNPp+1xJPz06OTk4ODxARUtVZ3jj19PQzMvN0Nrh6O9xaWt3+OXa2NHNzMzLy8zLyszP0NDR0dHb9GFSTEI/Pz48Oz0/QkhOUlhr/Ojb08/NzM7V2tvg6ez8evTm4t/a1tXT0tTSzs7Oz9DQz87N0eNrXVNHQEA/PDw9PkFHTVBWY3Pr2tTRzszP19vd5Ovt fHz059/b2tnV0tDRz87Nzc7Q0M7NzNTuY1pORUA/Pjs8Pj9BSU5TWGD+49bQz83N0NXa3uPp7vn+9Oje2tna1dLR0c7Ozs3Nz9LPzczU9F9XTUVAPz47PD4/QUhOUllh/OLWz87NzdDV2N7o6+7w9vTm3trY2dbRz87Ozs7Ozs/Rz83N2P5eVUxDQT89Ozw/ QUNIT1RcaPrf1M7Nzc/R1tje7e3v9Pjw59/a19bY1M/Pzc7Pzs7P0NHOztfuX1VNRkJBPTw8Pj9BR01TW2h86dfQzs3P0tXX2ufs6/P08evg29jX2NbRz87Nzs7Ozs/R0M7R42tYT0lDQT88Oz0/QERKT1Zfbfbd087NzM7R1Nbd5+zv9PXz7OHc2tra1dLP zs7Pz87P0NPPztPkaFlRSURDPjw7PT9AREtRVl9s7tzTzs7NztHU1t3p6/L6/vbq4Nza2dnV0s/Ozs/Ozs/S0s/O0uJoWFJLREE/PTs9P0BES1FWXmvw3dTOzs7Oz9PW2+Dq7/l+/e3k3dvc2NXT0c/Ozs7Pz9PTz8/R3XNcVk5FQT8+PDw+P0JJT1RYZfXh 1s/Ozc3O0dba3ubt9H3+6uHe3tzY1dLS0M/Ozs7R1NPR0NHZ9GJYUUhBQD88PD0/QUdNUlZh/+Xa08/NzM3Q19ja4+31fX3u5N/f3djX1NPTz87OztLS0dLQ0dXgdF1US0RCQD47PD5AREpPU1ts7t7X0c3MzM/U09fc6fZ7ef7v7Onk393c19HOzczKycjF xMK/wNN96lM9OTk1MDMzMjlDRUjz0dzNv7/Hv73J1tLoV1pWSElVVFfr2tfLw8fHvr/DwL/Fx8TGx8XBymve4zk3PzcrLzguLjtCPEzf5tzJwL+9vMTFyNfv61tMW1dSYe7m2cjIyMTAwcC/xcPEx8rLy8rD42bQQzVBPCwtOi8tOEA7RPLl4M/DwMLBwMHO 1Nb2WFRgVU9k+e/cycnKw8DBwr/EwsPGxsfJx8HQWtBfM0BBLSs5MCs0PDo+Wnjm3Mq/w8e/vc7TyelTYm5PTWx7aN/MzM/EwcPGv8HFwsLJysTIx8TvbMw+N0s2KzM5LC86PDtKX37n2MPCysO8xtbI0mJkfFpOV3RrftfM0MvBxMjDv8bEwcjMx8bJxsxn 1e42QUUvLjoxLDU8Oz5RYOnpzcLJyL6+z8zK62f4ZlFWZG1s5NTOz8bDyMe/w8fCxcvJxMrJxd//zEE5TDgtNDgtMDo8O0ha+erbxcbKwrzGzsrWam12U1Vca2d+3M/PzMTHx8O/x8XDx8nGx8vF0m3QVjdGQC8vOzAuOD46QVZu6OXLxcfIvsDQzszfYWpp WVBq+WXsz8vUyMTFyMDDyMXFyczKzMfNeeviPDxJOC42Oy8yPT89TWjt7tjKxcbJwsXP1c/lZGz9Zl735dzVy8vLzMrLzM7Sz9PX3Nvc2tfeampcR0dFPz0/Pj5AREhNWF5ja+7h2tbTzs3O0dXZ297k8vn18+zk4+Xd29va2NbT0dLU19bW1dTX2+Z1YlZL SUZEPz4/QUVITE9XXmr75NrUzs3O0tPV2dzm8/Py8e3p4eDc3N3c19TT09bV1NbV1dXU2edzX1RMSEdDPz5AQ0VITVNaYGv44NjTzs/R0NTX2+Ho7/L19/bp4t7d393Z1tXU1dPU1NbZ2NbS2OptYVlNSEZDPz9BQ0RJTVJbXmP33tnU0c7P0NPZ3eDl7fZ6 +urn49/e3tvY1tbV1NTU1tra19bV2ul9Z1tOSEdFQD8/QUZJTFFZXWn14NvWz87Pz9Ta297k8nn58Ovo6eTf3drb3NfT1NTW2NjY19bX1933bV5QSklGQj8/QkVJS05WXWV67t7W0M/Pz9DU19vj7vH3+fL27uTi3+De2tjW1tjX1tfY3NzY1dbf/GpfVEtI RkNAQENFSExPWFxffOfc1dPQ0M/Q1tvc4ent+X706+ni5ePc29rb2dfW1tnd2tnb2NfY3vNvYVNLSEdEQEBCRkpNTlRdZnnr4drQz8/S09PX2uPs8/b79/f05+Pi397c2tfV19nY2NjZ3NvW1drubGZZTUhGREFAQkRHS09VXGFv7d/Z0s/Pz8/T19vg5+31 e/z38ero6urf3Nvc2tjY2Nrc29rZ19fY3O51ZFZLSEhFQEBDRUpNT1RcZ37q4trTzs7R09TW2N/u8/T7+Pt+8ubi5uXe3NjW29vX19nY2trOwst42N9MVUg6P0Y8OkBFRVpmVOzK2tbEzc/H0HLi5k5OX0lLaVJcztPbxMLMxcPPysHP08TJy769vrW2ZkDZ PikvKicyLik1cF5VxL+9r7fPv7rrVl9LTWRMP2vWauzS0cbA1NfDy+fk5+PLzNTFurq6t7WyrrFkM0s3ICMgICwuKzLSv865t7ixundk1VY/RUdN3txgz77DxsjNysTaXe7qcXJq+8q+wb+3tLOytLSvsU8pNi4eIh4fLTo3Ob+4vbC+yL3BUT5PQkhnUmDD u8K9vcbAx/hdcl9ZYVNc3Njbzca/urq9ure4t7W0tFsqMSwgJiAhLkNIQMbDvLHE2evNW0hOPVXbz9LFu7+4wN3f7mxRWE1V4/Tv3dHMxMHAu7q7uLm4tbOxuEMpLSYiJiAjL09cb8PPu7fD6k9lSlxVRVjdvr+5u8G+xc9YT0lIZFxn99bOzMjTz87Mx8bE xL+9ura0r6/sLCwnISkjIytB+d671Mi9vsdYXj9R915yY8nGtrXEyNzVdmpNQFJf2tba3tvJzczW5dbLxMXEw763s6+utT0qKyAmKSMoL17bvLrjx8/B2V5OOmBo1dbdycmzuLvRVmhPbE9HTFXPzcjU3tfVydHX2tjKxr/Avrq0rquzOSgnHigrJisvZdKy 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 JzZvva+sqqmrqqutrrfHZT4yLCssMj5az7+7ubu+xMzR19znc2FXVFZbfNTGvLezsa+urq+1veU8LCEcGRgaHiUxUsCyq6enpqeqrK+2v9VSPDQuLC0vNkRdz7+7t7e5vcPO2ultZF9eb+jZzsa+urazsK6wtb9mOyshHRsaHB8oM1DJtayqqKepqquusrnC 21Y/NS8tLC4xOUhxzb66t7e5vMHM2uR5bnFv7NrQyMO+urazs7S8zWI6LCUfHR0fIyo2Tsy4sKyqqqusr7G1u8HM7FVEOjQwLy8yNz9U38e8uLa3ub3Ez9zrdXj959TLxMC+u7q5u7/N9Ek4LigjISEjJiw1SNq+tK6sq6utr7S4vcTN2/dbTEM8OTc2Nzk+ TW/Qwr26urzAydXf7PTv5tvRzcrJxsPBw8bN32tKPTQtKykoKSsuNkNuyruzr62ur7K3vMHL1d3pfGpbUExIQ0A+P0VLWf/c0czLy8zMzM7O0trb29vc3tvX08/Q0dTb6mJMQjs2MS8uLjA1PEhkzb64tLO0tbi8v8bL0Nrk8HBpYl1UTk1LSklKTlRfdu7m 29PQzs/T09bZ3efp6+70+vvw7uvs+31yYllQS0ZDQD8+PkJHT2Lq0MjCwMDBwMLEyM3R193nfWxqYl5bWFZWVldYWF5mbn778ubg3+Lk4eTm7Pp6eXd1bmpwdnz+//727/d9bmhqZ19cWVpbXF5gbvvr4+De3NrY2NvZ29zd4+js7fT7cGlrZ2ViXl5iZGZk a+/i5uTt8erk5/Hv7u/x9vv//ff3+3r49Pb1f338fnRqZ21cWFxaXmNpbm9z++/q5uXj393c3N/e3d/f6O3x8/l3a2xsamlkY2VqbWxrdn749fL07+vr6/L27vDx9X7+9/b7fn3+f3t0bGpqa2liYGtsYmdnanT+9PLw6eXi3+Tk4eLj6e3r7fH8cmtsbGpk X2RlZ2lqa257+vf89ezr6evt6+rr7vby8PP2/3V5fn16bnN5eHlzb29ydHNsanFxfHprb3T8+Hz27uzq7O/u6+rr8/jy9vP7enl8f/56bnp9fv53d3z9/Hp4+fr3+Hx6/vn3/Xf+/fz9e3Z4e3p4bW1zb3RvbHJ7fv1+9O3r6ezs6+rp6/X08PX2fnh0dnl2 bWtzc3h2cXX/+/l9/fP08PZ/fvf193x4/Pz6/nR9+/v3fHR//n5/dXF2e3xzcHl8f354eP308fh+9fHv8PX49O3v+Hx9+Pv5fXZ6/v98dX38/ft8eHr/+/x3e/v7+H59ffz5+npxfH18eW9veHh5cnR+/vn9fP/28fD4+e/v7u/z9vfw8fl5/fr9/nZzeXt9 eXV6fXj7e3P//Pl9dv37+fj+fvz2+Pp4e/v+/HlzdH59dm51fXx+dXR4/fn7fH719PH1+Pbw7+/5/PTy8/d8e/7+/XR3/33+e3N2ev39d3b6+/39fnz9+vp+df78/Pt6eHz+fndyenx9enRweP/7fXT7+fXy9/f38O/w/33x9fb9en39/n10e/7+/Ht1efz4 +nj/9/fx9/n18PLy/Hz5+/f/bW9wc3BrbHNwdHRucXz8+X598fDv7/Pz7u3t8fr39PT4fXh8fn51b318fHxzcnR9fXhze/77+fr/+e/v7vf5+Pfze3V3d3Vxa29vcnZubnV6fH19fu/v7+/x8u/s6/D77/H09Hx6/359cHR6dndxbW5wdXJqa3X/+vX17Ojk 4uPr6+vu93ZubGppZF9nZmdpaGxv/vv5+O/n6OTn6enn5+75+vL4/nhudnt6enN+9/Py9PTy8e7w/vTr7e3y8PDq6fH7dG5oZl5aWltdXFxfZ2t3f/rx6ODf4d/a2dra297i4+z9cW1ua2pfWVhWVVlecuHY1NbX2Nvg5ubc1s7Kx8bHy9d8UkU+Ojk5Oz5G TVZaXl9dXmjnzsC5tra4vMTO3ftoX1pUTEdDPz4/QUhXf9vQzMnIxsXFw8PDxMfJxsPAwcTL8E49My0sLC0vMjY8QktZ7Mm9t7GvsLK1ur/Iztz9Wkk+OTY1OD1HXOPSzs3My8jEwsDAxczT2dbLv7q1sLC4w+1ANS4rKScnJiYpLTNB9ci7s6+urKqqrK62 w9dhSkE9OTMxMTU8TGrizcjEv728vb2/ys3My8a/vr24sq+1w95BMy4qKCQjIiIoLjlO2r+7r6inpqirsrm+11xEOzEuLzA0O0BLaM3CvLm6vb29vsLGzM3JwL67tbCussXsTzoxKyYfHiAgJSwyP2a7sKynp6epqq27ymtIPjo2Li80O0RW6t7Hu7m6vb7F xMTP4N7NyL+6t7Cts83sXTwvKSQfHyQkJiw7WNG1sK2ppqetsLjJ608/MjI0MjU6RVHix8O+ure7vr/Iys3P1dPFvbezr7jX091ALikoJCMlJSgwRVP/u6+trKqssbO60VdNRzg1Njc6P05a38fBvr26vcHDx8rOzc3Kvri0tcLey+Y5LS4uJiUoKi43Rk/W uLS0sKyvuLrB2FdOQzs9Ozs/TldY2cfFxL6+xMTGy9DPz9LKwr25uM5/w3Y2MTkzJyovLzA5SlHNvr+6sa+8u7nD52BvSkFCPj5KUEVaz9Hay77FyMPGycrL0MvJzcm/wXJgz1I6OkA2LjQ3NzpASl3S086+ur7CvL/N19n6WVdOSEpSSUhifGd50c/Sy8vK x8XHxcHDwLy+0unQYz48PDYvMTM1ODtCWOvlzr68vr27vsPJ0N77XFJUUUxNV1xfbHbn3Nza19bb29vg6+bm4+Tp6uDf5e7t6vV+ZFxfWlFSUk5OUVNVV1pean/99+be3dzd3tzd3d/n5+bo6ezv7+rp7u/z6+vp6/Lu6+rt/nv7/m9mZGNgYWBcXmBgZWZo aXF+f3999O/s6+/w6urq7e3q6ufr8vHt7u/4fvX3+fz/fnj+/Httb3RydmtpcG9zc3B0ePz3/3358fD2//Tx8PT4+fz29fl6fPr8+P16e/r4/Xh++v35fXl7f/79dnJ8c//+bX59//h5ffv18PL2+vHw7n1+6njr+3n6dvR9fXD+fnh8dHh3/v58cXV/ff94 dHz8/H95+vb19Pt9+/X0+Hv69vb1+vv89vT4d376/fd9dnh+/31yeH99/Hxzef38/Ht5/fr6/n7/+vf3/Xn59e/wdnv/9vd4e/r6+vt4ef77+nx1fv79/3t6ff37fXR8/fv4fXn/+Pd/evj49/Z+fH/89vt3f/z8+f9/fvn3+Ht2+v36/nZ7/v7+eH35+ff+ fnx6/vl4evr8+v78fv349v13/Pr7/Hl5/f39eXj7+/j7e3j8+Pl8eP39+fx+ff73+f15fPn5+X96fvn5f3f7+vr6fHh6+/r+d3v7/Pp/fP/39f55ePv7+f16fPz6/nJkdOBn9Pt17vry/f789vX7f//89vV9c/n7/f5zcf1//nl8/v71/Xt1+/n7/nP8+ff8 /npk9etw7/v47u369vbyfVxrb1x+dnP/8e7j8Pji9O3u5Nzq3fXp8Xz283h7dmn9eHht+nN0/XFze3D/+HlldPtnXWtle+968+7x9+Du7+d/3/Hv73bfeev5cup59PRn5nn9+3TpZ+Z0fPtl5nV58nR3+elp6nzz8+74d/Hq/u33Z+R8b/p4bXL+d2J7bWv4 eWPub3n7bPZm5nT9927q7G/pbnxaaf9q7erk6OP42+7r6vJsb95U2lzz7GfbXNln+d5n6GfoYt1tX9lk4nPtfuV1/N9b5XXxef/3YN1tZXz9YXv4VOhoXf7tX2rkZvX4/W3p5V3eaXLsbPtv9/j37Hzo32rbZ+7kZuZs7Xt9Z+PyXd906Hjv+vzo6f3j+e3g Z+xQZ+lW9W/leXB+5m5peW9g+VVo/fNce+Ju7uv/7vHz92nzX3TvW/d8X+du7PFy1fbw2nTh6XnkaO18XtpZce5gbm5vVn3ycGnr7fDYYNvo7Pfo5u1y9+v7e13qbPtiZu78ZXXeWPT9Xe1ual/uXX7/Wt//eelv6tp24Pff5G/Z/vL3fOHmWXzTfmV12PB7 bO7ZXF/r415jdmB9ZlFw9m1X7P5d82t6YOhg4/Zv4u3jeNvt6efl3+vuat35bGJjflhie2Zuavndbu/50eZn2t7fdN7p93LhbG/fTd7uWf1r3ll15F7jc2ro+HRl5Xlub13kYFX2+mBa6u1jdXH12XZs09j65tzW2u3l2fdjf3dobmlWd3NaaPpjbd94aNvd ec7ha9v6bOfcXHrXcFbe6VnwY2Vf+lhY1FppdvfaWXd+5Gtl333c6ebc1udky/Va7vJgcmxg7eNbV8lcVNRx+Gh+aPnVRuXPUmHu323kbHbUanD6zWRq02beZfnqZdpY8dlgYurYaGDi+v3vVnvfXFnw+lJoaVV1XVJ97Fpe9/1v8vlr2t5k1tfy3OLb5+vc 6+3pbuV+bd5x83lp/e93Zvfd/Wz15X/s8VziflX+c2Vh/ulo7/hd4/JZ/X3rbWrYfO70+uBybXb5+WZm/f7xbHXj/fZrbftzaW/o7Pvv3uDc8uvp//Vlffxrf3F5eGh5dXBnaXj8bmH79HN98fP67+/t6OTs5Nnm8ePm7fX7e2/4cVtt/2FiaGhjYnNxZ3Nt bOr6bXzs8W7+fXN8b3j1/f3/4t3t39jX2tjg5t3h93R/c2BcW1hVVVVSUVJPT1RRTlFYXF5jeevd2NbQzMrJx8XExMXEw8fJyMjKzM7OzcvO1VlBTEEwLS4uLS0vNDxNV3zIu7m6uLe7wcrbdFhPS01YWmjp0MnGw7++vr/ExsbKz9HS0M3Lx8hbQGBNMC0u Ly0rLzA2SlJb1by2ubiztbq/y+BfVkg+QUlLTmHay8rIw8K+vsPHyMfJz9LOy8jGw72/YUz9RjIuLi8sLC8vN0lVX9q+tbi4tLa5vcjeW1VOPTo/Rk5Ze9nMw7/CwL6/wcfLzMzNz9HOyMPAvsdWTWdENC4uLy0uMC82Rlpw58e6ubi3uru9wM5uW1dLRUNH Tlp+5tvNxsXGyMfIy8zS2dfU1tnW0c3Kxcf8S1JOPTYxMS8wNTU0PU1r69jEvry4uLu9vr/J331eU05MTE1Xe+be2dLNzc/R19TQ2eLn3t3j5uXf2NTPzdxaUlZIPjo4NjU4Ozs9R1n03MvDwL27u73AwsbP2u1hWVRXV1Vfb3fs4t/d39rZ3dze4uPp6u71 7e7z6ube2dPhWlNVTEdAPTs6PkFARE5o4dTKxcTAvr/Dx8jL093sbmFeX1tYYWRpdXr79u7o5url5efn7/jv6u/39e/q497a1+RiXFpPSkZDQD1ARUdMU2vk1srIycfFxMfKzM/W3OX+a2RoY2BhZGtueHZz+/P38/jv5/Ts7O/x8Orv9+7o6uHc3fdeXVtQ TEpHQ0JIS05VYP3f0s3NzMvKyszOz9fb4Oj7b2xpZGdoYWVtenlzfe3w8u397unq7Pfz8O7x7e/y6uLd3e5hXV1WT0tKR0dMTk9WYvjo3dPR0c/OztDR0tne4ent/nVyb29vbWp1eP98fXT57/f5/u/v7vP19ffq7fP17enj3+R4YWBcVk9NTEpLT09VXW35 69zX19TS09TR0tjf39/o8/36dHN5dm1rd3v9fnj+/O7v/v7v7uvyde/r8/X69+3q5+Tub2FgXVVPT05NT1NVW2Z1+uvd29rW2NjV19jb5N/i5+76/fn1/nxucvn6/Ht/9/PveX3w9PT4+X3++vL3efrv8+zs8HdiY2FYVFJSUFFVWFxkbX/v497c29vY19na 3+Dh5eLr7/rz7vr/eHz99X59/Hzv9nh7+/r2931yePr0+3n1++/u8e18aWZlWldVVVNSWFleZG119ujg4N/d2trc3N/i4OLl6u/v7u3u+H307fD3e3z3+/t1evh9fHVuc3N9/XB/9vnx7uzu6nhmaWBeWllYVFhdXWBkb/nx5+jl4N7a3N7k4d/f5err6urt 8nn79/f+e3Z5937+c//4+fH7/vvs7317fPr0+X76+PLyb15iZF5cWVZWW19eXmdw+u3s7OXe3dvh4N/g3uHl7ebm7e1/+fDx8n17/Pf1eXZ7fvZ+dnt6+/L9fvz98/H+dfr69u5yZ2hsZl1ZWFlbXlxdZG5+//7y6OPf4uDf4N/f4+bo6OPs8e737e79/vL3 9Px//fzw/3Z1//Z9eHf9fH13dm91/X5+fPP0bmprZGFhXlpbYmBhZmpv+/Py6+ni39/f4uTf4eXm6efp6uz0/vXk3eDq8Ojr931zdHh1b2xtcXlwbHB6d3V8c3Pu9PPm+Gdsbm9pZHhtc2xpaHT+/v757Ovp4eXl6eXf4evn5+To7fnn6ejs9u3p7e78cWt9 fnf+7vf8+XtpW15lZ2ZufPDf+Xry8fR2dnZzbWxpZWdra2trbnh79vPz7unq6uvr5ubl6+/u6+7x8vPv8/B+fnh9/Xh1cXZtdG5vcnR8d395e3n593Zzef5+eHV8bm5tZWJgYWRiXWZoaW9ven777uvv7+rm5Ojr6OTm5+jo5+no9fPx/vH5cnJ1dHx0c3h9 +P98eP38fXxxcHl+eHFye3f7em5sbnJuZGRnZ2lmZWhxenV3d/nu6+zv7Onn5e3q4+fp5+zy7uvt8f768fH4+Ht69H9+d3V7eX1+bnb//3Rtd3d3eHNydnx8dm5xb29xbWtoa29wa210df3+//v17urw8+vt5+jt7+zo5/L27erq8fDw7/b493d1fHl1d3R2 dvp5bnV5eXxxbnZ8/X1zen18d25ub3RvbWttcHF3bmx3/fr3+fDs6Ons6+3r6Ov39e3t8fPt+e3s9fT1+PTz/Xd1dnh7bG95fH56dXT8fnp8d3x+/X5zb21wcGpna21ubmtsb3d+en308u/s7u7n4uDh5Obi3+Xs7Ozv9H1uc3Zycmtra21wbmlsbW9zdHN6 9e3s9fHr5+ju8vnz9v5ybG9ubWpnaG1ta2pzffn6//789vX2dnj8/fDu6uni4N/i7evt9v55dH72+Ht5/n96dW9pZ2ppaGlxeHz9+/769O/u//nu8/X6eHR3dG9rcHZ1eHJscXz8fnR8+/Pw9fXw7uzt9PPt7err6+3s5+r29/D3+3dtbW5tbGdkaGtvbm92 e/bv9fft7ezs8vX29f5zb3NzdXNtbXF4fXh1//7+/P39+vHu7vbw6uro7PHu7O/3fv78/Pj9fvv07/X/+/36/Xp5c3l8fW9tdHJybmpqb3N6eHj19e/z/Pv28/h6d/98/X56ff749v159/Ly8vb48+7t9Pfv7u/2fHv+/vx4cXh4fHp3fv338/h8fvv9f3Ju cXR3c255/vv3+vv59fH1ffv2e/96eHZ4ent1b3l7fHl0dv/6+vz37uvo6+/t6+vr8/Xw+Pb7fHp8eXpza3N1eHVvb3N5eXRyfv79/Hhxffr5/nr59fXz+fr6+fj6dXp/+t/j7O307/p0cHb8/H53fv78fnt1f+ru6u3tfGh0bXT9+vn+e3v9/X91dX59/nlz dnv9/Hp4/v35+/3++vT2+X738/Pz/P/39PtlX29scfvu29vh5eXm4efp9Xvyfn1ybG9rcfh7dF9bZmZrZ214en54d3349/d9ffL18vL59nz94t7n3+Ll6evr7On0+vn2fHh0aGltbW1obHB0dWxsaXJ9aGBncvv18fPw6ujp6u7r6Ors8vj59/h7efj6+PT6 fnt+fntxcHN2eG9sbnZ4d291e//8fXz99+/zfvn49/j+/Xz6+Pl9d/19+355e/36+vj89PTy9X17fn3+c2xxdHFubG92/fv/eP328/T+///7+Hp39vn4+X13e319enN6//75fnr79O3t+O/q7e/1/f76+31ye3t3dnJvcvzy93/59377/Xx+f3z/em55fX9+ eHz9+X9zdX57//93ffr39fz8+fbw9Pb9++7w+Hj89Pb3+vz37+/w+PTu7u59ZF/3c19y/nd+e/Xr8/7x6ntz/fV9bGlna25nYmtvbHZ4dH349Pf9/vv38vb27Ojn4+d4e97p9t/h6OTp6+Tq++ruamp2fHFuamtsaWFhYl1cXl5ZW19hZWVkbnz8e/zs6+jl 6eXj393d397c2tvb3N7d3t/l6ujr6/T78+/s6u/yfvxxWlZRTEpIRENFRkhMT1Zm++Pc1M3LyMjJyMnMztTc3+f1dm9laG1saWx3d/Px8+7h4t3a3dnU1tXS083LyuJ913JHSkk8ODg5NzY3O0NESGff3c/Bv7+9vLu8wcTG0Ob2Z1VSUk5OUVhn/v3i0tHP ysnLycnJyszHwsK/wdDYz2c/Qj4xLy8tLC0uMjc3QGZ/2sG6ubWxsbK0t7e8y9jpWkhBPz48PkRIS1zj2M/GwL++vb2+v7++v769v83jz145QTwuLS0sLCstMjc2SuJ+zLq2tLGurq+ztLXD0NNpQz49NzU3OTo9Rlps7MzAv7u5ubm4uLq7u7q7vs7ozUs2 RDUrLCwqKiotNDU4XPh+v7e0sq6sra+xr7fHxtVPRD87ODM1OTc8Sk9Y28rFv7u5uLm3uLu6t7q8wN/U1zk8QSwsLSoqKSswNDND81zMuri0sK2srrCvsr/Bx2dORD46MzQ6NThDR0t51MzFvrm4ube2urq3uLy8w+DOfDdDOysvKyorKS0xMTVNXV/Fvbiy sK2tr6+vtr++0GJWQj06NDc5NTpERVD13c3Evrq7u7e4urm5uru8wd3R4jpEPi0vLCssKS0xMTVJWVXKv7m1tK2ur66vtr68ym5fRz88Njc4NTpBQUtq68/GwLy7ube4uri4ubm7wuDN6TlFOy0vKywsKC4xMDZJVFzIv7m2s6yurq2utb69zWxWS0E4Nzk2 NTs+P0tn6djLv769ubi6uri5urq7vtTXyz49Sy8vLisuKSwyLzJAV07bwry3tq6usq6us7y8v99pWEY7OTo4NDk+PkRYb+rPw7++u7i6uri6urq6u8njx1g5TzYtMCsuKyo0MzI7U05sxL+5uLCtsq+usrq7vNN2X01AOTo5NDc9PT9PZfHWx7/AvLi5u7i4 uri5u7/XzM47RkktMi4rLSkuMS4zSE9Ny8C8t7Str7Gtr7W6usPiel1FOjw7NTY7PDxHV2T5zcTDvrm6u7i3u7y6u7zF18VeOlQ0LDErLSsqMS8wO05IZcPBurevrbKurbG5ubvO8GxNPzs7ODQ4PTw+TFll3MrHxL26u7u5ury5uby/z9PHQD9SLjAwKy0p LTIuMj9MR9nEwrq2rq+yra6zurjC2fpeTTs7PDU1Ozo7Q1JebtXHxcC6u7y5uLq6uLq8v9XL2DpOQy0yLSwsKS4vLzZKSU3JxL23s66xr62vt7m6y9p8TUU7Ozk0Njs6PkpPY+HNxcS+uru7ubq7urm6vMLZx+I5Uz4tNC0sKykvLy82TElTxcS9uLGusa+u sLi5utPddEpEOzk5NTc8Oz5MVmzczcS/vbq7u7m5u7q5u7zG3MRVOVw2LTEsLCorLy8vOlJGdsDBubWvrrCurrK6ub7Y5VlLPTk8NjM5PDtET1t808fDwbu5vLq5vL26ury9yt3EVTlfNS00LCwqKzAyMDlRRXbAxLu1r66xrq+yuri95O13Rzs+OjU3Ojs7 Q1JeddDIx7+6vLy5uru7u7q8vMbhyWA5UjktMSwsKysuMDE5VUpiwL+6ta+ur6+vsLq7vdn1XUk9Ozs2NTk8PENPXHvTx8TBvLu8u7q8vby6vL7C28vbOkpCLTEvLCsrLjAxNUxPUcW/vbevrrCvr6+4vLvQ+WlOPzo7ODU4PDw/Tl5x3MnEwby7vLy6u72+ u7y9vtDeyUU8VTEtMS0rKy0vMjM+XUrivb25sq6vr6+vs727wexiWEU6Ozo0Njs9PkhabeTMxMS/u7u9vb2/v7++vr/A0NzKRTxVNC0xLisrLi8zND1jUe2+u7qzrrCvr7Czvb7D6FtXQjk8ODU4OjxES1jr2s3Av7+7u728vcDAwL++wMPU5ctHOEw1LC8u KyouLzQ2O2h65r62uLStrrCvsrS8xszZUURLOjQ6OjY7P0RPYuLNysW8vL68vMDAv8XIw8HBwc59zfU4Q0ItLTEtKi0vMjk4St7pz7izubCsrq+ws7i/0e9jQz4/OTU3Ojs+RE9s8tPEw8O9vL6/wMTGyMnJycfCv89vz+s6PkMwLS8vLC0vMzw7Rd3Qz7ux tbOur7C0ubq+0PTrTT1DPDc6OjpCSEpw293JwMXCvsLFxM7OzNXWz9DNxcTWdNHjPj9ENS8wMS8vMDVAP0Toy8u/tbW0sbKytLy/v81mXldEPj48Ozw/R09SbdbPzsnFxcTIy8vS29fV3+Ha087My9nrzd5HR0g8Njc1NDc1OENHSGvNy8W7ube2ubq5vcnL 0W9WTUlEQT9CSEhNXnzu2tHNzNDLy83W09Ha3eHg3uTf2eDa1s7RfGjeXERIQzw6OTg6PDk+TlJY5s3Iwb/AvLzAw8LI09jhb2NWTlVUTVNfX2v4/eDX4NrV2t3Y2dzf7Obf63b38/z5/Hn18fbi9ltYYVBGRkZDRENDSk9PW/ju6dnSzszPz8vLz9HV2Nrg 7/TteX72/Pl+8+rm8e/k4uTn5+nm7fz09Xf0fHpqaWdmaF9eZGRiZWRmcm5ual9kZvt5aGpgZGdiYXT++u/q4t/e3uHf3uDf3eHl4N7f6err6uLn6+/z8evn7+jt4+7vdm/vfWZsc29nYWZTVFpeX15ha3VxcHR5enX/cnhv+n33//367fp89vDu5+vk8uXj 7N3z5OLp5fL99Pv1cm3xbvt1b31we3j9dH7+8vz7cHL2anBpbn1w+XN9c3f4cHZ0eW9wamVpbmxta2f8efl/8e/q6+7r7+7q5+v16/Hq8PF9+fl+dmtqcmxoZ2pybXd9+3v+7PXwd+/s7vB69fny+P30+vR/8nZ9fPN9fHV0/3J7c2xy//12cf128nX09Xvz 7+xv6/Xv7/l39/1+eHB3d/9+dfpt9XP8b23+bP5sd3Bt8Pnx8+rp7O768fPp/fL//fP+9Xd2fXv9a3B1//9y8Hf28fTwf+746/x++HH27nh2eP3ydnl8+X56/H93fP7y+Xn68fPycPn58/17+3zyd/Vr83Xye/V4+Pzs8m30b+tsfnNt+GLta3lv/v92dmnu /Pd76fHn7ufo7e7q629v/nJ+bHdnbnlne2r2/fl59W9x9n35Zf/4de5r9Ph99PX7eef75+388Ovr5vbw7v7uZHZpZm9hb3Fsam93Ymhp+f1rfvvo8uvt4erg5+3o7fP5fXV2dP1qcWh6avFsfGpw8mxpbnN4cPl6e/X06ez05+nn33bo++ftfvd39W9v+Gb6 b/3/ae9n6HH382zha+Bh5GjndPvyX99d2l7ne/PoZuhi2mHsYHptbHJhflz1W/xtY+xj4nN4ffvmd3B7+3z2/u/sfOTz6X/s7XV+917rZnb4ZeR83ejn23jb4efq8Nrp4OLx5+33eHJqa2tkZF5kYWFkXWFiZWVjYmNpbW1rcnj+9vX28Ovp6O3q5ePj5Ofo 4+Pl6+vo6eru9/j38vV+evz6+vx9ff35+3t2fP5+fHFudHd1b252eXx5dnF2d3x+dP59/f9+e373+Pp5fPv5+n14ffj7+nv89vT0/H7+9/f3ev77/Pj9f3n/+vt5dv7++/13efv7+n17+Pf0+Xx8+/j5fHn8+/n7/3z8+Pn7eP7y4t3m7Ozu8vf8+vn7fHNw dXt6dnF6ev7+fHv98fb7dnN+cGNjZG3+/vt/8+7s7O/x8ezr7vjz7/Dv9fj79vP2fnn9/Pt+dXZ+/v94evz9+vX3b3t/fnZ2/378fn14fPv5e3R+//z9enZ9/fx9d//8+ft6eH78/H1zfv78+/58fvj5/Hd8+/v4f3h6/Pp+dn79+/t7d3n9+/54efz7/33+ //X6+np4/fv3/Xd4/vz/d3r8+/n/fHt++Pp7ePz8+vr/fP72+n52fPz8+3d3/vz7fnn8+fj4fXr++/p+d/7++/z+e3v7+Px3e/37+n54fv34+Hd9/Pf5fnx5+/v+eHr9/Pr+fn35+Pp7e/v59vt5evz5+3h5fPn5fHp2/vr7e3j+/Pr8f3379vn9e/75+fl7 d377/Ht3/vv5+3x6fPz4fnz6fvr+/Xx9+fn7d3v++/p9dnv9/f14f/n39/17ffv3+3h7/Pz6/Hx7//n7enj+/fn+eXj8+fl8fPv59f54eP/6+3t2fv37/H97/fj5enr39vL7fnp++vx6dv78+/15dnv8+392fP37+v59/vf3+3x9+vn3f3h8/ft+dX/6+fl+ enr9+Px4fPv9+fl+fPz5+Xx3/vz5/nd6/vz7fHr6+Pb4fnj++ft6eH/9+/z/en36+P52fvz6+Xx4//r5/Xj7+Pf5end7fvn9eP5++vv/e335+ft5ffr49/16fPv6/nZ++/v6fHd5/Pv9eHj9/Pn9ffz0+vp9ef769/55ef38/nl7/Pv5/Xp5fvn5e3n9+vr7 /nv++/n9dnr9+/l5dH/8+395/Pn19357fPf3/nd+/v36/Xt7/Pn7dnr++/l8c3769/R6e/v5+X93efz7/Xh5+/36/Hx7+vn5fXn7+PX7fXr++fp4efz79/56dn76+3x1//z6+357+/f5/Xp++fj5fXf+/Pt8dv38+Pp9eXz6+P97/H36+v18fPr6+nh5/Pv6 fnZ8+/z7eX769/X9enr99/t4ev5+fvd+fP359Hp1/fz6/Xx4/fr6fXj7+ff7eXh/+vl8df79+/v/ev/5+f13/vDj/WxvbXpzcG5xcXZybmtsdHdya3B4ef37/PXz9Oz7/Pb793t3c375dWtxenBranN1/u/w/O/5b356bG1udXJsbW52c3L4aW38fm5w9XJv cm1iamdmZWNzbWZyfnZra/pvbXFy+nJubXh6bnd+fHZ6/W1qam7p9WdvdW9v7vzq5HJlZmxsYGJwY13/4O7t49rd3NbRzt3bz9Xo39Lf29793N/u8+d4Zf5bV15fVFtnS1BXUVJUV1ZhVV7vaWfu12pr1d3c1tHMy8/ExNHKx8/X3t/oYGTnal7e4V1u7Gpo a/Ph7uno7vH+dWpdX1xcWXh2beLf3eni6+fp397l42/f8XPx9Gtea1tpfH582ejq2u7l6Njp3M/a2ubu7/Z8du/m+33sXlvyZmzreujbdPDgaFr/X1r95tbU193e1trS0tPRzs/P0tHd6OFtXGZfVlhOUE9IS0dGTEtPVVNPbFxh/mDu8X7g2PDb0uTe4+je 19jMzMnExcfIyNPN0+nn7G12allkXltVUU1KRkJFP0FDRUdKR1FTT3xi/tTa3MjQ1sfL0NHa3N9odupkfdzr6u7pfWRnZ2VeaVxiWFdfVVNWUVNmWGj7ZfDr93l/c3D+d37x5tnW1s3IzcjI0s/K1NjS7uLxZmxaT1tXTFpPTVRUUFRTUltRV1pVY/5jZO7t +vfv9/Xx7eL56tnf1M/YzM7MzdPSztLVz9vd5OR2a2RcV1NNS0xJTVRQVmlp/vn44ePh29rb2dDY6ulmW1xLTU1HSEtKT1Ra6tzgz8zKycnIyMrGyc3Mz9DY2fJuYVpPTUtGRkdERkVHTk5SYmhy2dje09PX0tbZ0NvVy9LTztXb4HtvYV1cUU5PTk9VT1da XHRtZfD77+Hz793d3tLX1tPX1t7+63pcXVVSWVpiX2Jy/Xn16X748Ovv8+jo6Orq9Ovj4Ofl3OXp63xsZGFjWldeVFhcV1poa//j6OHa29vY6eHf7fL5enf7bWxkXmVjY2NscPzj4uLW1drS2N3c3eTs/HVubmRiX1ZbWVFRT05PTk1PUFJcW2F2d+vb29nP zszMzcvLy8nMz87Q1tbc6OTr8vVqamxjZGJeZGdwfm5eXmVOSUlBPz8+PT4/QklLTWnu4M3HxsC+vb2+vr7BwsTKy8rO1dbY2trb3d/e2dvg3d7d2l9JbEAzPjMsLi4sLi4zOjtO6ePHubi0sLGys7a5wMnN3H7+Ylpmbnvs3tTOy8jIycjKztHZ3eHl4+zf 2U9H2jkvSi8rMS0tLi43Ozlc3u3CuLizr6+vs7W3wczOdVVZS0ZKS05ZZPPc0sjFxMHAwcLFyMvNzM7Pzs1dSc48Lk8wKjAsKywtNDc0TeVlyLi5tK+ur7Kys73IyuZTT0w/PkRGRk1fbujOyMfCvb6/v8DFxsbJzcvIylpRyjcwVy0qMSwsLC01NzZW41/G t7i0r66vsbGyvsfIaVJPPz0+PT9BRldk787Kx768vLy8vr/Bw8bKyMfIbEvLPS5WLygwLCssLDM3NEviW8u3uLWvra6wsLG7xcffTkxEOzs9PD1DTFlu2cvHv7u8vLu7vr/AxMjGxcXTS9nlLEJAJy4uKisrLzY0Ofpudbu2ubKtra+xsbTDy8daRE4/OD09 O0BKV2P3zcXGvbq9vLm8wMC+wMLBw8VkVME5LlkuKC8sKSssMjczR9tjzbW3t66tr7K1trzL1eBLQ0c9OT4/QEpYcd7Pw76+u7i8u7q/w8DFycjKyexJ1EotQjkoLS8qKy4wNzk/69rbu7O4sa2wsrO3vcndf09DRD87P0VGTmfu08rEv769u73AwMfNztTe 3dzc21RM7j41RDcsMjQtMDU2PUFM4NbQu7e6tbO4ubvCytd7aFdJS05MU2Rn7tbPysfHxMXJys7e4t97dfZ37N/X32Jt90hARjw2OTg1Nzk8Q0VP9N7Uw7/Cvr2/wsbN0Nvr9W9lbn5v9ODf1tLP0dLOztXZ09/b5N/g7u/s5Hzy+XBfXk5KSUM/Pjw6PT0+ QkZMVmBw8eDV1NLOzs/MyszOy8vJzM7JysvLzM7V2Nje6nX96fFk+HlbXmBRUVJTXVpUWllRWl1WW1pYW09PWFJMVVBPWF5oaXrt29rXz87Mx8jLzM/Oys3P0c/X5v715W/893NtcGlpYE1SVlZZVlZiXl9peF9uY1tpW2JlZH/6Ytrf9/Lj7u3z3+ppbePn 9+7i2+Ht+N9tcvPk9Pn32eFs7dfi7fDgbm5o+/Ra/vXu9GHl3vl17vlkZlv6XVdsa/ZjZ2fs/2l77v3ydO7deHvf331o++lsXGjuZGVv4Hdo5+HrbXvg43/06/X58PHjeuX86vDv5eng2Orl2N/W7fXte2xvamFtVlpdV1RZXWNlY2vqbvt0+vLx/e3eauHk 7/Tt7P3u/Pxv7/fudO3f7OTm8PL2/Xv8dnVu93tvZXXwX3Zs6WXpcv7rfufdcubw+3vvbP/3Zudu+G3p7/Vrb+53am3rafv16vp9fvR9bWz9e3hxXnVibGx0dXbo6erl6PPy4Oht7eXtb+z3e3r0eXpp6v/2aO97cP187WZ3ed/1bHbtcnZk6u15e35uYPhs 6XB2bnfv/fpt6e7rcu907vb78//kc+D08vFp6/Js+G3rd2tvX/tadl11XGhxc+ds3/X0/GXse+z6bObr6ebg2+3j7t7553zme3pqY3Vub2JrdG5r+HT2bnf9cmxp6Wx+bH76+3v9cXj3cuvr6eb63u/x8m/mbWtrfWx9cPH8+u53+2J9b//3dOrt3v3p7P16 Z+1lamHubndfaXVia3pw7e356Ovx5ubde+7+4nx8d/B/8fh38vDv6Oh39WTqdvt7fex4fWFha2ljdHdr8295anFpaXVkcG746Xj28+vr6OHr5N3l5Ojv6W/v/m5hb2n5YGH8bP529Pbuc3t2bWzz9+Tu2+bd6+hsfXr3+11uYmFpYWvqfXnr7Xts8+/tdHTf 5ON45Ob06WXudWPvaPtscGdv7VxrX/t6Xv715Hbs6n3r7Nrb9OVs3v3tennj9e1s8vj3eHP3+Pxx7fD6eG97cVpcXmNqYXFt53DwfOHh5t/k3PHg9ebu+eno4OP93frjf/Jn7OZ2fW/s/m9m/fhidHJla2Bl/nptePPv4edr7Oj6+vHz4Pd97O9u+XFvamhh bfphZWtvcvR37O7o3d3q9d7i8fhxde1+b3j9dHdsaPtvbHL+bHT99+Dw7f307vZtaXhtdm9k/e77d3p5e3J8+vdvc2xvfG1v/OXs6/Lu4uj9/vjycG5penx2c3d0bGdnY15aXl1rbW1t9Ozo8Hz16e58++zo7+vi5urm5ODf6Onm6u1+cene4eXb3Njb4+bl 7nFqWllXT05RTUxNT1FRT1JYWFdZWl9uev3o3NbQz87MysrFw8XDwcK/wcPCwMTHyszL1lBDQzcvLSoqKyorMTk+TunHubW1sK+0usLN32BLRklMTl3z0cjCvbm4uLm6u73EysfHyMXBwXtLWT0uLCglJiMhKC4vOUvkvbOzrqmqrK2yuL/7RUM7MzQ2O0pT Ysm8u7i2tbK1vLy8wMbJysO+vrq+WWFuNS0qJCMkHx8oKiw7SuK6srGqpqmqq6+yuuFORjs0MDA2PkJO3si+uri2srW5uLu/v8XGwMHCu7a2207jQC4qJCEjHx0iKioyP2K9srKspaWoqa2vs8lYTkA2Mi4wOjw+W9TJvru4s7S6uLi8wcTHwsHGwLq2s75Q +HcwKiYhISAcHicpKzpOzbSvr6aip6ipra+57k9POzAvLzI6OkDszsu9ureyuLy3ucDEx8jBxsy/urizt+1h1DorKSIgIR4cIykoM0Z6u6+vqaKlp6errrLHX1hCMTAvLjU5OVLY08K6urS0urm4v8PFzcvJ0cu/vry2s79i7VIwLCYgIR8dHiYoLDpMzLSv raaipaaorK632lpOOzIvLzE4OT9r1szAu7ezuLy5u8HHztLMztrPx8S/u7e6bWXrOi0qIyIjHx0kKSs0QXi7sK+qo6SmpqqtsMB8XEU2MS8vNjg6TOPQw726tLS6u7u/xs3Z2Nn579fQzMS+ubjfVt1ELywmIyUhHiMqKjE+Vsa0sa2lpKamqaytuNX7VT02 Mi81OTlBYN7MwL25trq8vL/Hz+b77Xhdet3Wz8rHvbjCXHLxPDEsJygnIiEoLC03QnO+trWsp6eoqaytr77b71E+OjU1PD0+T+vTxsG/u7zBwsfW2+RiaX5gV/d33tbZy8K/wMhVaHQ9MS8sLCsnJy0xMzxM7sG5t6+rq6ysr7C2xNvsWkY/PT9JSk1z2dLP z8vHy9LX1OnnbG1saWNh6e/s6d7d0tbXzcrcWl1TQjs3MTEwLi4zNztDUufGvru0r6+vsbS4vMja6G9ZUlFTYF9edO3q3ujZ2d7i6d7sa2txdPlkbHdhZmN2b97i4t3Y19PaW2FbSEA/Ozo6ODg/REZR89PHwsC8ubu+v8HGytjc3flpem/r7vZree9w4+zj 8Op+/u97a2j9cHdpaGdoZ2NkY2NxbW18c+zo3+d1aHteU05KSUhIRUlNT1lq/uLW0c7Ozs7Oz9HS29nY2t3i3+TW5t3g2+3e+/h7fG5ubl9jY2VeXllmY2RdZWFoZW5gcmd5c/t8+vFqbmpfW1xdWVdWV11gX2fv6+Dc3dvY1drX2tzb3d3f4uLb4Nr13+Xq 5nH1e/1mbl1qX3Ngdl5yX21mXGRmZnxpb/Zz6m7vc+zr/Oj27/z4/25iZmFlXVZdYGFnX3V++fXr6eTs297d5dzb2tvi3d/c4eTm3+vp9XR+aPZi/1/0cmNlX2NhaWRpZ2f9a/xva/px/Wr6b/fy6/Xt7vrteGppbGphZWJicWn8dPz+6+rr6OXe39vj3tvb 3tzq5Pfk8fR493T7ZGVtYm1pdV95Y29qal9rd2Rvdf/09fT4/u785/b47eju6/J693t3amZmZWdgZF9nZ217Znzy9ef+5PHh6OLn4d/e2uXe5d7r3fDv6+h4+Gx9Zv9lYnxcc2PxWW5/ZPJc8mj0ZXnyYO174njzfPXtaH5jel9qX2RnXnVpb2Dx8ffu7uTd 59zb3unc1P7g4OPv4ef36/fn/G5v5W1j6WB5a+pk+HRh3V58Z+9e+P1m8G3s+O5i9nBfXWFTVllVWlRfXP9vdOPn3djb29Tc2NrY8drd7t746+/ldOnsX9xy+e1t7nrwZe/5X+b+aev2btx07O3eftvaYe3udU1iT0pNSEdGSUVSU09h5+3Zzs7Lx8fKx8zP 0dTt9f1qbGZjXX9raOxj7/X53Xfecdjy69t12+7f7N7e29Lb1NvTbOF+TFBMRTw/Ozs8PD5BR0tk/efPxsK/vLy8vb2+xc/O3HZgVVRMTU1OTk9ka3X239zX09nU1Nrc0+Xy1uDj2trd0Mzk/drqR1JdPj49Ojg2Nzk9PUNbX3LOw8K9ube1tri4usjQ0Ppb VE9HQUNERUdLVVtn5dbW1cvKz8rL0czO0tbQ2dLIzsnPftTVQUVXOjQ3NjAvNTQ4Oj9bY2TUv72+tLK2s7KyuL/BxNlWZFU5O0A6OD5FRE1de9zVy8TDx8K+xcnHyc7PzMvNycTRcNHtPUZKNS8zMy0tMjA0OTxPW3vOvbm7sq6vr6+wuLu8y+RjTkY9Ozk6 OjtBRUpa7tnQyMTCv7/BwsbIx8rOy8bFwsPc5MpaPERBLywxLikrLy8xOD9RfdPEt7O0rqutr66utr7C03FOPj09NjQ7Ozc9T1dj1cnHwLy7vL2+v7/GzMfHycS/wdp/z2s3Nj0vKSsuKSgtLzI4Q1zaw763ra2urKqssa+0vszaYUQ/NzI2MzE1PT9CZd/a yL28vLq6vLy+xMfFyszFw8K+x+3a2UA2PDcqJywrJiouLzQ+UWzJvLmxrKytrKqvtLa6yetoTDw4NzMzNTc6QkxT+87IxL27vLu8vcHEx8rKy8zJw76/1/LNdjs5OzIqKS0pKCwuMjlGT+q+ubixq6uurKywtbi+0nxbRDw5NzQ0ODo9RE9m4s3Iw768vL2+ wMPGys7Rz83Jx8PB0OnU+EE7OzYtKy0rKy0vMjlIUWrIvLq2r62vrq6wtLi/zdt6TD89PDk3Ojw+Rk9b9NXMx8C+v7+/wcbKztPU1Nnc1M3Kze9r41xBPDw4MTAxLzAzNjpAT1r9y7+9u7Wys7Kztri7wM3Y7lpLRkM+Pj9CRUpSXvPY083Ix8fJzNDV2eJ9 bm5paWVka3f+8n1jYWdaT0tKSEVFRURIS05SW2/u3tDMysfEw8TExsjKzdDb5+v5bF5bWVhaWVZbYmdoa251+vp+ff78fH93bm5xdHFubXh9/Px5//Pv7vP07Ozv+3ZwcG1qYl9jYmZmZWhuef37++nc5Ojn6+Pi4Obp5ebn6u/4+vf5fG5zcnFxbGpscHFv a212eHt2b3f+/n53/vf18/19fvr1/Xh+/v77/np5/vv7fHf7+fX3fXv57/H8/PLx7vR6e/v6+3d1fHz/fHZ0d///eHF7/vz8fHn++Pb7e/fz8ff9ffv29/12/fv8/X94ef9+enF2fX/7fnZ6/Pr9evz19PP6fvz19fd8fPr7/H98e3x9fHVvfX7+fXR4/fv5 fP329/H3/3z69vh+efz7+H94fX/6/H5ye/3+/Xh1f/36fXj7+fX5fnr99vf+eP37+Pf/fHz6+P9zefx//nlzeffj5u/wa25zb3Bzfv37eHz49vL6ff759vp6d/38+/12d379+3d7+vn2+358+vX0/3r6+Pf6fnv8+fn+d337/Pt7dX38/Xp4/Pr69v58/vr4 +vx8/vz1/Hz9+vbt9HhraP1xXlldaWxq9uLnY2/d3uTp3Nzf7/Dk5Pt0fPP6ZFZfeHlmYXLx+HJx+u76e3v3+31/9PR+d1lVevJ6b+3d3e7t4t/o/Hf29f9xbn7+/Hx2ef9/fnZ6/XZ5/v1ybnh+/mxu+vPydnP99fppT01eXVJIWNrU4tzLxMza1tHV5+ff 2+1tcf78a2Zmb25nV1JiXlVVX2x2bnN0aGlmcl1KVfvwb2Fa39Lf5tjLz9bc19Pb7Orc6m996urs/GBQVGtrUldkcXJcZHnhfWn4fflod37u5+rc1+N87OHo7H7s8+t7Xlpp9/pqYers+nR19WtodPn9bGn+7Pf9/N7b6vne0uLo5+79dXpdX2lZVXnwX2l4 6/5cZOna9Wt72ntUa/n1YW7m3eti+d3pXV746v1YYebna2L76P5yc/58fu965uTx6+7d3fHn1Nhu/eZqZFtdWVlZV3JnXFZdZl9kVmHz8G1j49/Z7n3W2ed+39n0bPje52ds+Oh4Wl/7e2Fp+uXv8+ze3ePd5O326+dpcnNxbmtpXWBsbmFhZWhqX2l+eOzi 2tzp3Nfe8OPb5Pb57P9qaW9samNjefn0dO/p7uf4/evc4vLk2+1kef1iWV1qbmthduLn8nZy6+bsfuvb3N/n5utuZGVsaWBaYnlmXWdobe7v/Ojd3+Xf3Obn3eTl2tfc39jY3Nza3eno7OxwaGZfXVhUU1VbWlpdYWhpfXBjbHJlX1lSU1RUUE9TVVlfYGh9 7eDa1c/LyMfGxcPCwcLEw8PDxMjHxcjLzc/O0dvn735rZ1tTQDQzMCwpKCorLTE0PVB93MzCv8bNycXP08zIw8C/v7u2uLm3tri6vL/EyM3V19fX1dTPzs3KydHW0NhbNCstKCAfHyMmKi4zR9vOxbiysrO1uLu/yuHu63tu7tjLxMC/vry8wMbHy9Td6O/p 4eTi2tLQ0M3Nzc3Nz9HW2dlVNS82LSUmKiksMDI5U+njz764uru6ury+w83U0M/f6dXKycnIxsTFys/V2N3tdmpnYl5aWFdZWFpbW11gaXj28ezj3+ZdSUpUSj49REdEREZLWmls+N7Uz8zMzMnIzNDS2tzd5/Hs4+rv6uLf5Ojr4+Ht9/Xy83ZoaW1taWNl b/3y9e7e2tnY2uByX2NbSkVHR0ZCQURNV1dZa+vc1dXUzcnKztTV1Nbd7e7m5e/09+vh6e3r6OXn7PL59HxtbmxpZWhrdXh/8ejf29va1tLX+F5iXk5GREVHRUNDSlVZYf3o29DR0dXVz9TW2NnY3eXs7u/t7vHs6evs6ebm6urv8/Z4a2prbGtlZ27+8+/t 5t7Z19nX0tTjaF5bT0lGRERFRUVJTldcZG7029PSz83MzM/S1Nbb3+ft8ff39vT0+PTs7Onq8fr6+Xxva2tpaGlsbHr47urr4N3a19fW09Tga15dUUpHRUNERkZITFNcZ3H23tXRzs3Nzs3P09bb3t/l9/728/Dx9vry7Ozs+H75/nluaGZnaGdlaHT97+vp 5N7a2NfW0tDS4WpeXFJLRkNDREZGSExTXmty/N/V0M7Ozs7Oz9LW2N7j6fF9fPf38/3/9fDt8/j8/v93amdraGhlYmp3/fXw5d7b2dnX1NPS1N14X1tYTkhEQ0RGRkdLT2Hu7ujd1tDOzczMztDV2Njc4+/+/H78+359+fby+/30/vf2/m5scP1pXWZne/X3 59va1djX1s/Qz9HT3HxbVlBMSEZDREVISk5TW2bu59vW0s/My8vP1NrZ29/h+mJpbHB2+fHu6+/u6urq8vz4fv7p8Hz5cnVub/ft5eLe3NnW1tba19be/VtWUUtHQj9BQ0ZJTU9baXvy39bPzsvLzM3T09Xc5t/h6/t8bGJvcXL+8O/v8fn6+/56a2loaGho a3Ju/u/t6uDb2dfY1tPU1Nnkc1xZUElEQkFCREVITVNdav/p29TR0M3LzM7S2Nrd4+x+enh+/H1++O/t7vrz7/H0e29sbGllX19laW90evbm393d2tXT0dPW1959XlZQS0ZDQUFDRUhMUFho++bc2dPOy8rMzs/S1dvk7e/8eXFvfPn28/Hz7+zr7vp+fXRu ZV9hYmRlZG/87+nm4t3Z1NHR09LU2/lfWlVMR0JAQkRFRklPWWj97d/V0c3Ly8vMzc/V29/m7f5ta3F7/nx87+3u7/T39fb8cGlqZ2hmYGFocf719OXe3NfV09DPz9Pd9mddWUxFQUBCQ0NFSU9YY3Tt3dbRz8vIysvNz9HW3ubuf3dvdXhyefXs7fr77uzs 93hxcm1pYmJlZGludv3v493b29XQzs3P1N5wXltVTURAQEFCQkNITlhq+eXb1s/MyMjKy8vMz9fi6ujueWxnbX7+/ft99+3r7v5+/v52aGFhY2NiYGVz/e3m493Y09DPzcvLz+lbVVhPRT4+QUNBQEVNVV9v7t/Vz8zIycrJyMrP19zf5PFqYmhudG5sffDs 7O7v7uvt8XRsa2lmXltfZm1yde3g29jX1dHPzsvK1H9fX09BPT4/Pjw8Q01PUF3o1tLPy8XDxcTDxszP1NrrbWRfXlpaX2Zz8ujo4+Pf3ut+e35uYFxeYF9fY2397eLc2tTQzcvKx8bN6nxxUD46PDw3NDg/RkJIatfV1su/vb/Avr3CycrM2nlrbl1OTVlb Vltx7enk2NXb3t7d8mVgZGBZWF5nan/l3dzXz8zLy8fCxNJ28PpFOTs8NS8zOjs5PVTp+ebGvb29u7m5vcDAxtHffmpcTkhNV09NXvvz7uHV0dfZ09z4e3BjXFhYYmps/ODb1s3MzMbCw8LO7eluRTk6OTEuMTU0Nj1NXW7Ww727uri2t7q9v8TP4vltVUhK UU1HTmJub+3X0dXSztTf6+59ZFhaYmBibO3d3tTKysnBvb7H2tfeSTs7OS8tLzAvMThETFjfxr27ubWztbi4u8HL0dxhT09LRUdLSk9bbPrl2tbRz9PZ2d3r+W9iY2x4dPPc08/Lx8O+u7vM2s9ePjw8NS0uLy0tMjtBSWHSw767tLK0tbS2vcTHzedfVEtH SD4+TkRH//tj583R2M3M19bS3+n4/Onk6uTTz87GwsG+vMfWy38/Pz0yLC0vLC0xNjtBVd3Mxby1tLa0srW7vL/J2v5pV0lDR0lCQ09WUGTj6u3Wztbc1NLc4uPo8u7f2trUzMbDv7zAz8nNT0JFOy8uLy0sLjM3OUFc5dfKu7i4tbKzt7i4vcfP2HxbUEdH RkFGSUhNW2tt8NnX1dHR1dfV193l3tva1c/MyMO+vs3OxnhGS0I0MDMwLS4yNjc6SV5u2cG9vbmzs7a3tbm/w8bZb2hZRkNEQUBDRklOWm/16tvSz87Oz9DQ0NPW1dDOzcjGwcDL0sn8Rk1HNjI1Mi4vMjU2OkdYWefFv766tLS2tbS4vr/B0O56WElGQz8+ P0RGSU9ebPDZ1dLNysrMzM3Oz87Oz8vGxMHC1M/IWEVSPjQ1NDAtLzU1NjtMVlnTxMK/uLO3t7S1ur6+xNTteVtIQEREOj5GQkVWZl3y08/Py8fJy8jIzs/KyszIxMLBytbK5ERTTDU0NTIuLjIzNDhEU03vx8TAu7S2t7O0uL68v9Ti8FtJRkU+PD5DREVQ Xmbr1NHQycbIycnJzMzLzMzIwsC/y9fG4EJSSDQ0NDEtLTIyNDdDUE3fxcO/uLG1tbKzt7y8wtfo8VtBQkU7O0BAPkhXXGnh0c/MxcTJx8TJzczMzsvGxcK/zdTAYj9pQTM0MzAsLjIxMzdMTE7TxsK+tLK3s7Gyub27xdzx9Uw+R0A5O0BAP01aXm3Vy87K wb/IxsTNzcrKzsrEwb7G28XTP1RSMjI0MSwsMTAyNUNPR+HDwb+3sLW0sLK3vLrA3P51Uj1BRDc6QEE+Sl5f/tPJzci/wcbGxMrNycvPysPAvcnjwdM9WU4wMjQxKywxLzI0RU9I2MG/v7WutbOwsbe9ucTnb2xOPD4/ODhAQj5Lamzvz8jJxL6/xcTBx8rI yMnFv77F3cvHQkJaNC8yLywpLzAvMz1XS/e/vr23rrC0r6+1vLu/52djTTs7Pzc3PkA+SWVu6M/HxsO9vsLBv8TIxsXFwr2+zOHE3DlOSC4vMC4pKjAvMTVIV0zLvb27sK2zsa+xuL67zWNeVkE3PTs1OkE/QVh8/NfHxMS+vL/Dv8DHx8TFxb68w+fLwz5A XzEuMC8rKC8vLzI+XUnhvby8taywsq6vtb68xXtdT0c6OTw3OD1DQk375tjJwsK/vb7CwsHGycjGxcG8v+3Ovj1A9jAuMC8rKC8uMDE9XkXmvry8tqyxsq6vtL67w2xfV0A7PDg3OTxBRE1s5NrJwsO/vb3AwcHFxsXFw767xe7CyTtWXS4vMi8pKS8tMDJG VUbOvby7sKyzr66wuL68z1tPRzs4Ozg3Oz9ES13u2c3CvsC9u76/v8LFxMLBwLu/38fBPEFuMC0vLyooLy4vMT5fSN29u7uzq7Kxra+2v73KbVZMQTc6Ozc4PkVGWejb08a+wb+9vsLBwMjJw8C/vL/ryL46Q/8uLjEvKSgwLS8yP19G1Ly7u7KrsrGusLe/ vc5hT0tANjk5Nzk/Rkdb39HOxL2/vru9wb++wcK/vLu+282/PDz5LysvLiknLy0vMz90Sta5uLmyqrCyrbC4xL7LU0hIPzE5PTM3RUtGbtXTy7+8v767vMHAv8TDvry7v+LJvTk89y4rLy4nJi8tLzE/+EzPuba5samvsq6vuMbF11VAQEIxND07N0VbTm7M xsrBu72/vr3FyMLDyMO8ur7iyrs5O+UuKS4vJyUvLS8yP+RS0biwtrKorrGvr7jNy9xRPDs/MjI8PThFe2P3ysDDvrq8v8C+wsvIw8XDu7jE977DMUJXKyktLSQnLi0zMUrV9ce0rbWup62xsrG81eBcSzk2PTUvO0c9SOTZ2MS8vr69u77IxsTNz8bDxLy3 wn68yTBGTCooLCwkKCwtNzVNzs/Fs6qxr6issLW1v9tvTEM5NTM4NzVETU50ysrGvby7vb/Aw8vNy9DPxb+9uLzsxbs3N1cuJyotJSUsLDc5P9TAwLuqq7Gqq6+3ub7SekJBQjQxOjs1QFlWa9LGwb/BvLzEx8XO4dnU2tfLw724udPPuEszTTcpKCwpJSsr ND88X8C5vq+prq2srbO6wdPTTz1AOjU3Nzo/RU/s2NjFvb/Bvr7FyMzS197e0tDPx767v+LYxUY3QDYsKiwrKy4tOUpIV8i5vbavr6+xs7a5wdjR5E5DRUM9PT5BS0xV79zbzsfFyMnKysza4dzk9+rg6NzTzsjI2mzV50I/Qjw1NDQzOTg4Q1NYZM7DxL27 ure4vb68ws3Q1+1qW05MSkZFSUtKUV9z6+Pd1M7S19TX3d7l7/Tt+O3k7eTWz8zM4OnR80tJSUE8Ozk5Pjw9RlRXY9TLx8G/vbq6v8C+xMzU3e9uWklMTUJCSUpIT1lm6ejn08zS1NDS2dvf7ejzdubh6t/TzcjAv8nnzM5EP0I7NC8wLzY4NEFcdvbFubu1 tbSytbzDvsttXlVNRUQ+PkpEQlJfWm3b2NTP1M7J0t3U1+vs63vx6uvb0tHMwr27t7bK/MVcLjIyKiYnKSo0NDfnxMO7rKuuq66wtL7fbfNDOD0+Oz1IS1jd4NbExc/JxNXn53FnZFJTbmhe7tze1MzKx8LCvri2t7jHZm5MLSgrJyIjJysyP0rUtLGwq6er r6+2wNRQQUE/NzhFUFhr0cHCyMfCy3lpbVdJRUpSVlFd5Nva0sjFycnIxsbIw7q3trjC6FlRMiYqJyIiJiwvQFfbta6urKipsLW8zW5IPTo/PDpJe9rWxLu9vcDN1OpOQ0dDPD9LUl372cvExsvHyNLd3ePn3NHIvri1srbFZ1NDKiUmIiAhKC03WO27raqq qqartL3PcUg9NTY9PUJaz8e/uLi6vsjX7VZAPD8+PUJOXu7Uy8bCxcrJzuJ6+PPv3NDFu7WxsbfBZkk+KSIkISAhKC476c24q6ipq6muusXxUT87ODlHTFfawLu9vLu/zvRUSEA8Oz9ESVbpzsnGxMHDy9jl72pgZf7dzcO8t7GvtLzdQTsvIiEjIiMoMz/t v7quqauvs7TH9k9CPz5AQlzPysC5tLi8vcncXUU+PT06PEhTZt/QysXGy87U7mVeWFFXYvPTycK8t7OysrfEaj40LiQjJigrLj1bzru8ta+0u8jL6FVMRElPXHnQvr27urq8xdV6W09DPj9DRktWbt3Sz83Nz9rp/GJVUlRbYWzhzsa/vbq4tra5weFKNzMt JicqLTE3SnvIvb+5uLzF0dhpWlJNW2/p2ci9vb/AwMPN7WBiUUZGRkpPVV353NrZ0tXg629lYVlSVmJ28eHRyMK/vry6urzC2l4/NDMsKSwtMjc/Vu/GwMG8vb/J0N5vbl1Zaeze08fDxcTHycnY/W1eVk5KS1FZXGT04t3b3N7h6W9qZ15bX3Lv5dnNyMLB v76+vsfnVUA4Ni4sLi81OkFQ/8zGw769wMbL0+Lpc2Zv8Off0c3MzMrKztLY73JsWlVVU1deaG996ubk4e34+XxvaWJibHv78eXf2dXW09XU0dr+YE9FRD87PD0/RElOW/Pb1tDMy8rJy87OztLW2t3e3t/m7+3u8fF+dHZ6eG5qcXJwa2lmZWpqZ19laGpu bnB1/Pjv9fHn4+Dg4t/c29vh5+9zZVpSTk1OTUxOU1lgaW/86uDc2dnW1NTW293d4ef0/fn8+/59ffnz7vT57/Dy+Xpzb21raGFkZ2hta25+8+/t6+Te3dzd3dva2t/zemhcV09MS0xNTk5TWmR4/u/m3dnW19bV1dfb3+Pm6u96dX17/Pv9+/Xv7vL59Pf6 em1rbGppZGNpa29vcHj77efn6+He3Nvd3dza3eZ5aV5YUk1KS0xNTlFYYW/57+nf2dbU1tXW19nd4Oru8fp4dXx8+Pf79/Du8fj39Pt6b2lnaGhlXmNrbXV3e/vr6eTk4tvd2trc3Nzc4f5oX1lUTktKS01PUVVcavzq5d/c2NTT1tbY2tzg6e30+n55+v37 cl9edPh4bnfp5/J4cnFsa2r+8vzo5eDf3trX0c/U0czN0dDS0tp0T0ZBPjs6OTk9Qk1ZcOXRysTDxMfJzc/Y4+79cWdlbmz45t/d1tXV2N3x+3ptaGtpZ2lsbm9z/ff4/fLt7ejn5d3Z1dbi2dDNycjL32BJPjo3Nzc4OT1EUv7YzsfDwsDDx8zT3e1vaWxq bG5vfuXb1tTW1tnd5vpxamRfXV1kam5vbW11e/16efLt5N/c2dHOy8rJx8bK2WJIPTg0NDM1ODs/SVrmzsfDw8PDxcnO2OT2cWxqbfzx6eLc19DP0dfc4u79aV9eXV5fXmJsdXt5dXJ8+fHv7eDb1tHQzcrIxsbK1G5KPTczMzQ2ODo/SlzizsbAv8DDyMvO 1uD6aWZobnj75dvY1NHT0tTa4P5wZ2FfXVxdZGtxcnr3+Ph9dHr36uHd18/MycfFw8LH2FlCOjQyMjM2OT1FT2/Ux7++v8LGy9Db6PVtZF9hbPjf2NfU0dDP09vi7XdmXlpaX2RqbnP+8u/3ev58enl3/und1s/Mx8K/vb7I6U08NC8vMDQ3Oj9KZtjGvry8 v8XN2eL0b19WVl1y4dXOzczN0Nfc4e5yX1dTVVlhanXt5N7d3t/j6vttZm1+697Xz8nBvbq4vt1OOi8uLi8zNTk9S/HOv7q6vcLL2ODncllRTU1e5c/IxMLHy8/b5O9mU0pJSU1ZY3Dv49zX1NDS1t/3b2167uDb2M7Iwr25ucpdQjEuLy8zNDc7QHbNwru7 v8nN0d3wdVVJS1Fz2MnFx8TBxMnR5V5OSkdHTFBTWWP23dHNz9TX2tzc4enl4tzVz8vIx8nTb1NHPjo5ODk7P0ZPcdzTz87O0dXZ7WdjYGFr/+fc08zKycfL0+B5XFNUU09QWWJz7OLe3Nna297e3+Li4uDZ0c/OzcvLzeJURT07Ozs7PUBKXPTZ0tDS1Nfd 5n1lW1pieuzi3dfQzs7T3u99ZlhUV1tifOrl3dXS09LPyszNy8zIwr69xN5RPjk2MTAvMjlDV+rUzMbGw8fP5mZaWFlYXF97287JyMjGx8rN2vBsZF9aVVddZn7x6ufi3+HucWleWVZSUlRRT1Rfam/27efi4+js8O3l5+fk3tvY1NPS08/R1Nfd4ubq92VS TU5MSEZGSU1UWVtlfunl6uvr6+73bm95fvby7ubd2djY1dPU09PW1NLS1djY2Nrc3+TwcFZNTUpFQ0VGR0pPU1hfcvbt4+Hg3tvb29zc2tva293e3d3e4ejo6evv/Xh7enZuaW1ubm1oZmhrbGhmbG1zdnNzd/37+Xz98/Lv+P/57/T4e372+vh+dXr8+/11 ev79+n55ef79+3dw+fj5+np5/fn5eHn5+/j9eXf++vf87d7j4+n08+vt8fludX16dW5tdHd7d3F6/Pl8eHt3cn1yXmBscX17/vju7ezz8ezt6/D28+7u8vz38vLx+3d7/Pv/c3d+/vt+eXh//P16df39+/50d/79/HZ1/f/8fXV1ff59end9/Pn9e3t++vp+ ePj9+vx4d3v9+Xlx/v37fnh0ef37fnN7/f35fnl+/Pr7d3r6+vl9dnz8+/92fvr6+H54en/8/HR4/vz7fnl5/fz5fXX9/Pv9dnv8+fl7e/r28392dn7+/Hhz/f74/Xx6ffv6/nV++/n5enV59/d+eP75+ft7d336+n51fvz7+n57f/b5/Ht7+Pn3fnd5/vv/ dXz+/vt7dnf++vx4ePz7+/j6ef76+nt1/n5kZ99ya+L3evby9O9uXPzucu79fvH69PD+ff339395d/76+3ZxdP/t/3X18fP3fnV9+/t5cv57+39ven39evd1eP/9+Xf/d/b7fHv6fPjudH96fPp4bG51bmxufXn65uTv6uPu4+B99vT16HN27Xb56mZt63ho fG9oc3J0aWb2b236fW386X118/P+futq9edy+Pr6/Gvo7GnrbOvpauJreuj6d3Fx7uZpaup0d+Jhf+Zu++5ybXr+6GNg4f1se2vxdnXtZPffaHzl9HJw6O1k++ty7Pnt/W7p+Pb4eGv733BkdO1wY/5/Wu/6XW949/ZxaOX4bePtcG3h6nr59nv76/Fq+Oh5 7vpp//n8bnP2bXLn83R66ul0cXx86vFoZ2rg7V38fm7yfmhh++/wcmjr5v7//Hf8+fD8/u3z/PPl7np78/xvbW5xa25rdWRm6v1ka/j0dm13+u3u9vLk5ebpefnp6/dzb/95fX5gYGx+d2hmaXL68Gxu7eP7dn/+7Xl5amj3eGlx+Hx79fxxZmFrenJ3b3bk 3+137u3e3+7q7uPzbmVlfPD3/PJ+b+7f5vj++fh5dHVoYGFgZW/+cGNpeHzt53hy9+/z7+zw+vn+duvf6/Z3/uDS1eN7++/s8W5vbvP7dW9r9O7+6PL7aWB0aW12cv37b2prcHRyefPu7Or7/+fl5efv7ezl5+zy/vx6d/zy8Xd59/Tr4ur9eu7m6en2b2xt dfppZWRhYmRsampscvv39e/u9P13e3V3cHbv7Oz4/nd3+vz++u/r7///9uri5/xueP7w7Ph6eX57dn7v9HZva2577+9+e39+//v9+PH8dW5venb9eG1sbX7z9f/2/Xz7+v757/P3/3vy7fZ/dnF4cXFsbHZ69/Z9ef737/zx7fLv8/r7+fn6cXB6/vp6dXF6 /fPw+vPw7+/09ezm6ers7OrsfG9udnlzbmtzcm5ubGZnaGhlX2Roam1oZGdscXZz+OPb3+Pr7Obi5O3p6ufh4N7c2trZ2tjU1NXb4ufl5u38+2lbX11haHN7aFdLRD89Pj9CSU9YX2nu3tXQ0NTY29/m5NvY19bY19PPzs7Pz9DT1dfX1tXU1djW0tHPzs7L ycrfSzswLCstMDlASUxRYu7Sx8TGzdr3ZGFt7dzU09PV19bW1tTV2d3rfHX+9/j69evl39zZ2NTS09XU0M7MysfFwsDPTTkuKisuMz5HTU9UZunOw8LK2mtWT1Vm69bPzs3LycXJzdjo63t3dG1kZ3BgXG7r39jX2dvd3d3e2NDMyMXEv7y7wl06LykqLTE9 RkpLTWjcyr2+yd5cT01UbOjY0tTPy8fFyM7e/XNscvz+fW1pZWnr2tXS1dzf4+bl4dXW083Mx8G8ubfFSTIqJikuNkRIRkVO28i9usTfWkxNVXHj6+Pg2ca8ur3L+1ZPXvrp53JaVFhz28/M0dvf39rX2+Lj3tbNx8G+u7q4vWg3LSgoLS43PTw+S9vBvrzE 5l9WWmBrbV1i5c6+t7i+zN7+du39YllRT1Zj9+Xd3N3Y1NPX4Hpr+uHVzMnIw767uLW1xj8tKCYrMDI2ODtI3727wMjjX2ducFxPS0/kxLu4usLM0dLa62RPTFFaafTxf/ff1M7N1eX99+PZ09TUzcfBvbu5t7nHSC4pKCkuLy82O0rewrzEzNPo6uhjTkdK Xs29u7u9v8LAyu9XTUpQWVhbWV123tLQ0dPc39vg6/X14tDIw8G/vLm1s7j5NCooKCwuLC41Q/nEvcfRzs3O219FP0pm18jGxL65uL3H2W5jZVRPUE9Xa+rj3tnW1dXa7XhpZG/u5drPysO9u7i1srPIPiwpKiosKSoyQXnLw8nLwb7H4VNGRk9daejSxbu3 uL7Izdfqa09JTFBXXGJs6tXMzdHX3d7i6/r05dLLx8K+u7aysr9NMy0tKiknKC48TmjczMS7ucLadF5aVU9OW97JwL28vL2/yNP6W1VPTEtMT1t759zTz8/Q09vk6/Dn3NXPysS/u7e1tb5eOTEvKyknKC43QEx5z8K7u8DM0d3/XU5NWfnbzsfBv76+xMvT 4fdoV09PUlhdbPrj29jV1dnc3OLj3tvY0MvGwL25uL3ZSDo3MCwqKS0yODxJZtLDvsDDwcPJ1fRobXv7++fXzcvMy8vLzdLb6PlvZWFeXml3+Ozn29bV1NbX19bY2t7c19TR2PlUR0I+Ojc3OTs+P0ZPXfzk29TPzMrKy8vLzc/U1NXW2N3f3+Dj6Ovt8ff8 eXV4eXtuaW1ucHBubnf78/Lv6OPe2tjW1dnncGJZTkpJRkRFR0lMT1ZeZ27549vVz87S0NDS1NbY3N3h5+z39vbn4e/r6uzt8Pv0+HJubmdseWxrbX3t4+Pc1tPPztDg6f5pVkxJSUdGRkdKT1NaXGNx5dzZ187NzM7Q0tHS1NnjfvHv9/t49/P4+n707O3u /HN7/P7+d37z7unq7ujx/uTk29XX3/FzXlRPTElISElLTU9TWl9ocfPg29TQ0NDQ0NHT2Nrb3uHs+fr/eW9qbnP4cm1vbnl3cmpudH19e/v/7enn6OPe3NnZ297p+W1ZUE5MSkdGSEpNT1FXXml88end1tDPz9DPz8/T2Nzd4en6cXx5cm5pa3B5f3x5+Pb3 /Xt0dnd2cG50//fx8/Pq5ePi49/l7f1qXFdVUU5MTE5PUlNWXGRtffjr3djT0tLPzs7P1NXW2t3n8ft+fHJoaWlbZW1idnL9fG9qcnBubGhteHn9ffnr6ubo7Onm4OHt+/V4bGFaVlVST1BPVFldZGx68ebf3t3Y19bW19ra2dre4+bo6+5/d3Z1dm5oZ2pr a2lmaG1xamtucHZ8bm9wfP72enfu+Orx7vTr6uns7+zv8/p1a2xnZV5dX19iYmBla3n6ffbt5eLk4uXf4eDm6+np7e37f/7//XpydP18fnRucfz5enV4+X9+fHN2fHp6ef51e/t3dHZ89X59/vXw8/j8fvv3/nJsdm1vamhnbW5xb23//fX38fjp6+nq7+fr 5ezy8vDr7v34/fL0ffpyf319/XB4eP50eWx+efdvdPt69vlu93Dve/l2du157/13fv59+m12cHx3ZXRtb3ZxcG97/P189m/q8+70/eXr7uX76+l/3nvt9e7v8fhs9PNwfHhp7HH8a/Z3ad5i62jjcv3Z/tn25HXvWmRrZmZkbGZzYm1ib25sbWlsd/p3dvXv 7ub45e/q4ejs7ubz3/b96vvmfO72eeF++fv8df3oYvN8cu5q7mp+51/ga2rgdXr+7nLu7278fPlnfmhWal5aWlxcXGVmZG/8eubi7t/d293d39/d39715uvv9339avN+cXlvfWz0dm/9eu57fPn/8Xbmbf7m/ufy5u3e3+nh5+/76V1aXlBSTUxKS09NUFVc ZX7k5trSz83Pzs3Mz9LV4d3n73Bna11tXWJiYXFlfGhv73Xr+vfs7ePu8ejx4ebv6ebb49ra29LY5P3oYk1ST0JCQj8/QENFTlRa+9vVzcXDxMLAwcPHzM/T5W1rXE9PUU1LT1VYXmFu7eTg29bX1tHX2t3e3+Pl7+rd4N3Z1dHPzuPu3VpJTEY7OTs6Nzk8 PkZLUnPZz8i+vL27uLm8vr/EytPmcV9OR0xDPUZHRUZRXV74493U0M7MzNHSztHc3t7i6ePj6dzZ18/OzNFy49RFQU5AODM7ODM7Oj9HTGTnxcXDuLe5u7i3vr/CytTi/mBPSURCRz8+R05MT2f7fd7T0c/MzMzN1t3U1+Dj3t/i29zc1NDPycbN9ffOTz5H QToxNzoyNztASEx06cnAxLy4tbq8uLzEx8nVe2ZUS0lDQ0NHSURMXFxf89vd2c7Nz9DR0tTX5eTe5e7s5OTj2dXV1NDNzMvSb2nfTTw+PzowNTo1OD1GS1jf2se+vr26trm/vb7H0tnjYlhVT0xIRUdMTklOZmpqfODc3NfY19ja2tva4+be3N/j29fZ1dDR z87MyszrWetiPjs8PTMwOTY4O0JOUOXWzL68u724t73AwcTP5OdrV1RQT01OTEtZW09Yd+5w/eHk4d7f4t/d5uDd4ujf2d7i39za2dnb19TV2NfU2HVYblQ/Pj8/NzU8PD0/SVZf3tLLxL69vry8v8PDx9Tr7n5dUE5OS0xMTVBTW19+9+7h2tba2tnW2Nzg 4t7n6urt6uTf3tza19TRzs7P3GzrbkZAQEI5NDo7OztBTE9f49LNx7++vbu9v8DAxdHZ2+5kXFpRTU5QTk1RV1xfZnrz5N/g39za2tve3d7e4OTp6+rr6vL58/Pz+nZud3FtaGdoXVpcVE5OUVJMTlZYWl5u//Lg2dfX0s/P0NLT09bY3OLi5Ojw/nd3dnNt Zmlqa2hkZGRlaWpkaW5xdW9vcnz7/3v78+/v+vr68e70/3/29vX7fn759vl9e/v79/53d35+e3B0fHx9dm9vdn78b3J6//r7/3j59vL3fvj08fP+fvf09v58+vf3+Xt2fPz6fHN++/v7f3t6fvv/dXf//v17dXr6+v53fvf39350/PP29Xt89/f3/Xx6/fn7 fH58/vp8eHZ+/f16evn59v55e/74+Xt2/fv5/Xx6f/j6fnb/+/r4e3j/+/p9ePr49fl4eHv9+X50fP36/H58fPz4+np8/Pz4fnZ/+Pr8eH728vl9dXr9+v11e/z5+Pt9ev74+3l3/f5+/Hl3+/n5eXv5+/f9eXv79/h8d/v5+fl8e/77+X53//r5+nt3e/v6 fHb7+vn9end8+fl+d378+vj5eHz5+fl4fPn2+nx5fPv7fnR8+/j5fXl5/vn6eHz49/b9fX769vd+d/79+v93eH///nh6+fv4/nl5fvv7eHV98/L5/Hx/+vh/d338+fl7efn8+Xt3/fv4+3t4fvj5fnf/+vn6fXp8/fv+eHr7+/l/eX379/x4//n2+nx5evv4 /Xd5+Pz7/nh++/j5fHr7+Pb8e339/Px5evz7+Ht4fnn483Z1/Pr6+357/Pf4/XVaSujpTO7P+nTO4XTb13v64vxw6vNn++9ze/dxb354cm5vb3R3bW1v/Hl8ffzu5ulrSVHLZl3S22/Wz1xl2WJd4vZd59z56d307N3o/uvtcP14Z1pRSup6TtrgY+PYcenc 6P/u9HXsfFhN52lR3HlX09tM1d5X39la49lf6Gxg6fd42tx/497y9d5vc+h8c3j/bul8aHtsZWdPeHtO8Oxm+9536ON3a/3qYvNxXmPqa1/84HXs1HXm2+Ho2t1m9+lYWW9obNzf5Nrbftneb9nn7HzsbmB2WVlfZF1ofFNfZFZVTlliWl37a2ff5O3c1+fU 2N7a3tna2N/a4N3b5u3p8e7q92x5emh0Yl5tYVxxXlheUVdgV1zrcGvecfzh8e304Ork4O7o6ur65PZ47XpobGlhZ11dX11lbGtjaP5zb+95furs5+Xc5trV3NPY1NfW4+nfefjub2bt/2fn7frf4e9rXlJKRz89PTw8Pj8/RktQWnbq2szJx8O/wL+/wsPF xMjNzNXW0+Dl6/R4d19cXFZaWFFQU1NPUlRUWVlYWVdUXF5bXGNoaWhmcGlrffH89NvY2tXO0M7Mz9Da29fhefH1a3pxaWptZ256Z2bx82555Pdm+PN6bPPpd/33d37pf33g6eTY3OPX1t7a3O/r6GpudVxbY1xTWWVfaG939nrzfnl7bHB3amNrcfp+bvPo +ObY3N3Uz9He4Nvj+/j0Zmb7Z1dZW1RSU1BOVl9dYvn4fuLg7ufa4N/a5efj3OHk4trX3tXX4NrY5e39/m9tb19mZGthampaYW9mUl1rWFtvaGB4dWtzbmZ3639p9Ox+b/T+benm5+Td5OTZ4+3m2+Ht5uTw/Ov1em9/9nNqa/9tbXRubGxvbm1mendtf/f9 897l7NvZ7OXefWv79Gp0+2157nxhanxydHZ1+H5udnpeX3NpZW718fnr8nx7/Pj7//zl4+3s7fD15OT25tjm8drebfrZ8WLu4H57729se3FhZG9bWnJjVV1vXmBuY2RoZV5hbGNnfv556t7f39nY29bU2tzY1tXT0tPQz9LV1tnf2dXl6t/g7PTn53BPPz87 MzM3OTg9R01Va+rf0M7P0+Dh3fD43djXzMjKysfHysrLzs3N1t3a3OTd2t/e1tfc3Nna2tfX19bU7zszPTEpLTc0MT9PUlzn1M3IzdDLzdrcz9PWzsjJzdjVzuLs3tjh49rqfX739vTz9eTe4+fh4Obi3d7c2dTPzszFwL++zjg0Uy4jLTszLkdgWPHQycnE 1ezV3VtT597m0MbHyMPJ08/V4+Xb6W/z6/5zf/Hr4eTp6Ony+fF//+rd2djPzMzGv8C/u79ELUY7Iic5Oy455nLu08rJxstfbN5hTFzX3NjFvsLPzcDUX97T+Gfe5G7v6vPo3u/w2N9teOb6bvTr7NzNycnCv768urrHOS1NMx8oPDstO9f73czIysfNWGvm V0heztLWwLzBys/J0nXm3eP3+97m4e/r3tni8ODe+Hz5/HJ56t/c1s3Iw8C+u7m4yjEuXiweKz85LEjM6NTKxcjE10te5FpFXc/c1cS8v8TGzt3obl5+421j5tvr8d7b3uDi7fp5Zml9cXzl2NHOysW/vby6t7tDKj9AHyE1RzAx4dDXz83PzshXQl/rT0bd w8rHvbi8ws5eZNhPQGfQeFTaz+jt3drf2/Vq7vNdWurd/OnPycnHwb27ube5SCc8SSEfL082MO7PzMzM0NnEYD5P411Bdb+/x7+4vMXO6Hb1Y09X7vJcctnf/ufZ3en0fP/4bV1n5uDn2s3IxcC8u7m0ssorKV0uHSVBWTA/z8rF0dfuys0/PF7UUEbOu7zB vbq9wtJlSlzcR0Hs0GxT2M7k4t7c2ttmWO/hYVbnz9fVysTAvbu5tLC7NCNBPR8fMu08NnnOvsjcX+LAWDhC291Lb7+5u769v8LOX1Jx61NMb9vzXnvc2dzy++Ddclhi9Hdlft7Z19LKxMG+urazsLo0Ijw+IR8v6Uc8X+W/wNlNW8NxOz36017txLu4ur/K x8lwT1rq8Vtcdez1bmT/2dn3bu/qcl5ide7q6d/VzcnFv7y5trOwujkjMT0mIStSWkdZXcm+zVBK0uJDPlLc49THv7m3vM3UytxUS2HlbV1m7dzgcmze0951cfH6amJlfuDd3NPKxcK/u7i2s7PNLSQ0MyUlMVRYW19eyb/VSk7abUZEWePTxcPAure909/a 7GFXXvjo9mFdduXzbP7f2uN9Z23x7/3s2M7Oy8fEvry5trSzxDUkKzUqJixCbGppUOrByFpEXvNWSkxl1sC9w764ucbi593a3l1FWs3vTk9t3+PwXm7R1GtZfOLr7ujZzcXFxL66uLazsLs0ISw1KiYrPlvg6kdswsNlRFdbVlZOT+2+usHBu7rD1fhcb+Z7 ZG/l5O/0ev/o4ftu8/dnXV9pb/nu6NnOy8nDvbq4tbKvvjAiLTQqKCw+X9DhR3jDxl9IVE9ZZlFP6b26wb+9vsXRblN33m5ed+zt6/xieNze+X/q8G9qYmb35u7q1czHw7+8t7Kvr74yIy0yKCgsPF3Q4kfwvsdfS1NNWGVKSeK8vMG+vb7Bz2hY+99+X3fu 7up1Xmni4H3+6vB3al9feOrr7dzPycO+vLizr623NyMuMykoKjdWzNhC777FfE1PRl77R0T5vr2/vb++vstkWOnrc3Br++fmZ1p16efx9urt821fbHx7/u7e08zJxb64s6+utzokNTQoKys5TcvWPtG+yHFRXURvcUFG9r/Gw73Cu7rIamzXfWtwbe3d41pX /O15aXD44t9jXvbl4+vo3s/Izc7Fvbq4t+8uND8uLi02RXLMSHPDxNNZfExg6EpHUszMy8PJwL7D5mjd7WlgaWJ03PZhc/B7c/N2cej0ZWvz+Pvh2tPMycjFwL/DxtdENzw5NTY6P0z9Zl3f0ttvbltZYVlPU+fX1M3LyMbH1OjudmdfXVZf8PH+8OTe3eLr 5tvc5d/Wz8zJxr+4tLviRT05NC4tMTxLT1Nn0MnM3H7x73RQS1Bl6N/a0cXAxMzU1dbd8m936OLzffvs5OXu8u7q8mldWVhTUE1JTFRcannq4d3f7vP48/n77efi3dnW0M7Q0NHT19zm9fb+bVhNTE1LSkhKT1hbV15s/fx8bmh6+WpgbPzv6OTi3NXU1dXS zszJyMjGw8LDxMPIekhHPzs4Nzk8S0tPW+vd3Nfz9PrvYltdYW/55enYz8zNzc7R0tfd6u37dnJua214e3t6/X79cW1pZWNeXmBiYWBobG5zd3r47uvs8Ovq6uvu8vLu7vL9fPf29/11dnz+em90e33/eHJzfPv/dnj++vZ5dX3+9/t9dX76+vx4e/jz8/77 7evt7/P07Ors8vfu7e/y+v96eHZtZ2dnZGRiX2RqbG5ue/749vt++/P1+Xz68u7t7u3r5d/f4d/c3Nze4uTm7PxsaGNeXFlXVllbXF1fa29//3328Orq7fDs6+vu+Pjw7e308Orq6Oft7ezr7PV++/p/dG1qamxqaWNnbG1vbW12fv3+fPXv7ezz9e/r6Ort 6OTg4OLk6u3w/mtjY2BfXFtdX2JmZmx2ffX3+PTs6uvx9u7v7vH19vDt7O7v6ujo6e7y7+zvfnv+fHhtaGVoa2ppZWpvc3Z1dX759PZ8+Ozv7vX9+PLz+X749PL1f3p9+fN+dnz7+v1+eHh9/n5zcHl9fntzePr7+nr+8/Ty+f7/+fX3fXr3+vn/eXVzc3Fs Z25wd317//Hq6Ors5+fm6vH28fDz/nV8fnt6c3FyeXt3c293c3JtaWxuc25qc3h+/nl7++/v7e3u6Obk5urq6Ojr7/j09Pj+dHN3enJqb29wb2pnZWhpaWNla21wc3Z4+e7s7O7p5OLh5eXh4OHm6eTl6e73fvz7/nJscG9ubGdlZWZnZF9gY2RlY2Job3J1 cX747+3u7+ni4eHk4N7f3+Pl5uXl6O727vL4fm9tcnZtaWlsbG1oZmdsbm1raHBwdHVtb3Z9fXd0/vjz9Pr58ezs7+7q6ejr7/Hw7O3x9/Hv8vL5/vz5+X1yc3l5eXBscnh2cWx0e3x5c290e398dXr7+fv+fn359vb9ffb19vn++vby8vv99vP1+3p7/Pf7 eeze4+Pz7+/z6/h7bXJ3dnRsbnJ6eXJxf/35+393d/x9Y19scv//+/ny7e3t9/Ls7u71/Pjz9Px7+vb1+X16e/frfXR5f/19fHp8/vn9eXR8fn96cXX//nx1evn29v93d/37/Xlzfv7+fnx5evv2/3T/+/n9e3z59ff9efv+8vh6eH78fnlveHx9e3Z1d//7 /H17+ff3/Xp9+vp9cnt+f/92cnf//f90d/39+357fvj29/18+Pbz+n19+vn9d3n6+vl+enl++fl8efv39vl9fPv49/15/vr7/Ht3/fr7e3f79vt+eHN4/f12cXz+/P56d3Z7fXdtdn19/Ht3fvXz9v7x7ezr8Pbz7vH2fX36+/59end++/t7ePr19/x/fPr3 /Xp6/37+d29vdnl3b2xzd3t7bm52fP19evry7u/1+vHt7fP27e3r7vb7+PT2/Xh9/v57dG9ud3l1bm93eHp0b3R9eHNwdf77+Px7+fTz7fnz7Ozs8PT6+vP4eHV8fX15cnd5fXlucXp6fnl2ePv29Pr98e/v8vj5+PP2/nd8/nx8c25yeXhyb3p9/P53d//z 9Pd+9/Pz8vr9//v7+3l8+/3+fHN4//7+efv18/X+fX759H5zdv77+f5+/ff38/96+/z6/nFw+v//dXb9/Pf+dnb++fl8evn08/b4/Pz19vx5/fn+fnVvdXx6dnN7/vv6e3v48/H0//Xw8fP4/f73+PfueHZ9dHpvc33+e3J8/v37fXh7+fb3fn/2+Pb7//35 9PT/ffb19fp8fPv4+X3/9vTx+v7+/fX3fXZ++3t4fHF2e3h1bXJ1dnZvb3h8eXdy//b6+X1++fHv9v3y7u7v9PX38u/y+/7z9vf+dnv8/npwdHt5enNuc37//3Z5+ffz9vv89vHz+/71+Pn9d3V3fXhvb3p8fXhwdP/7+315+/bx8v79+vPx+H389PX3/nt+ +f18eH7+9f54dXd+fXpveH5/fnp4evn18fn37u7t7/fz7vL4fP/6+v50bnF5enZtb3p7e3l2dHn9/Xl2/fz5+H76+vj6e3739/T5f3739fV9ePr5+354dXr/fXdweX7+/Hh2fvf2/H739O/z+X7+9fb5d/75+/n+eH35/Xdyen76+n15ffj3/Hv89/T1/v9+ +/h5b3T7+fx9dnd+/f52b3v9+Ph+fvn6+3x99vX1+397+/f5fHf69/j+fHp8+/p9cnz8/vt5dn/5/X15/Pj39n59+vP3+3x/9/j7fnl6/P38enX9/fl+dXh+/Xxzev379Xt3fH3493h8+vr5/H19+fT2/Xv39PP1/v728/Z+ffn4+f92dHd8fHFue39/fnp5 fvb2+nv+9vf4fXr59vn+evbh3OLm8vHs8PNxcv1wc3Rscn7zcWRqc/R+8+716fLuevHz7+/6fv308/l+fff29vp++/r3+fn89Ozv9X5+8fX7Z216/urq8vzx7Ovy/vfz8f/5+/ny9XdbW2docm1wevn4+n/z7u7u9fj27ezv/PXv7/D3f//39/l6d35+/npx dn59eXB1e3t9d29xen57cXX+/Pp/e3l9+/p8dn79+v5+/nr+/3Z1/v3+fHR0fv7/d3H+f3j+fHh9/ft9dHr7+vx7dnn7+n15/vr4+314ffr7fnJ5/v7/enV6/Pz+dnb9+/n/dnn7+/54f/n59/57e/jtfnd6/Pr9/3l4fvv+enJ7ffx9cnN9f354c/z8/P52 dnz8/Xd0/fn29vr8//n3/Hr89/j5/np/9/n9en749vl9dX37/X9zefv5+X14fPj3+PZyfPv9/Hd4fvx+c3n+/v15dHn+/f15ePr5+fx/ffn2+f54+vT1+H56+/n7e3n7+vn9eHd9+/18df36+/x8en35+fx4ffr6+X56/PX4/Xn59fr4e3Z7+vl/c3z4+fp9 enh++35/eP/8/P53ev38/nZ6/Pv7fXd4+/v7env5+fj7/3369fh+fPb09Pd+e/z3+H16+/n4/Xh2fvz6fHJ7/vv6dXd6/Px+eHz6+vl9eH74+X95+vb19358fvr5+3d++fr4/nt7+vj6enf+/Pt/d3z5/P15fPv7+X13dHv4+3h2+vr5/Hx7fvj4/nn8+Pf5 /ube4+Xv+ff7dXF1dH7+/nZtenx1cvh6+PH2bV1lbHJ7d3V98/L1+/Lv7e7z+fXu7/P++vL09vt/f/n5+3h3/f37f3V3/f5+dnz6+fl+eHr54d/v//j28fF+dWz7+Xtwan14b/x++G9hZ2d0fPz9e3768fH3/PLu7/H2+fny8fZ+/PX49353f/n9fHR9/f38 eXR6/Pz/d3z6+/x+e3v8+vjydHv9e3txdnv8fnR5/fv7fnl4/vv6enj8+/t+e3r9+/18dv/6+f15ePz5+3t5+fn2+3t6fPr3fnh///73fXt/9vr+eXr7/f16dv75/X53/ff7/HhyeP/9fHJ7/Pv7f3x6/vj6fHn5+vn9d335+fx6evv4+f54e/r4/Hp4+vn6 /n18/Pb6fHj9+fj8end9+/t6ePv59vp7evz3+P15/Pj49Xx4fvv8fnV5+/37e3Z9/P18cv/1+Ph/fP79+fx1fPv7+317fPv4+n15/Pr5/Hl9+Pf5fH739vf/eHn/+/52d/z8+398eX36+nx2/vv6/Hn//P38enf9/Pn8enj9+Pp+ePv3+Pv/fv34+ft4fvj6 +3x2evz8fXb++/v6e3d8+vn7eHz4+/j+e375/v1/dvn55t7p5+vv8/Pw8+/7/25vcXV5b3L/fP98e3v+9fj+c3Z+dl9gaHH9/Pz97+3r7fP07+zt8/rw7u/z+Pv+9vT6fH74+fp+dnz7/X10fP/+/nl0e/3+f3N7+vv7fnx++vn36Ptv/nZ7cXJ8/35zd/79 /Hx1c/73/Hx4+/36/X55/vn7fXb/+vr9eHZ/+/x6evz5+f97d3r7+3t1fvz8/Xx5fPr8/nd5/vz6e3f++fv+ePvx/P95cnn+/H11fPr7+359e/73+3x5+/n6fnh6+/v+d3j8/Pp+dnj7+/x5ePn5+Px+fv75+f94/fn7fHp6ffj9enf9+vn7enR/+/r+dv/7 +Pd7eXz5+/53e/n7+Xx3ffv6/3n89/X4fXh9+/n+dnz8+/x+e3r7+fx9d/z7+v14fff6+nh9+Pn4f3h3/fr7eHj6+/n8fXx++fj+ef35/Pz96+Po62llb256dHFwe/39fHf+//T0/Pz99fX4ff329fZ8eHz8+n52fvv5+3t5fPn4+3l6+fv5/nt7+vn8fHf8 +/r+eHr7+/x5fff39/55evvx/XZ2f/39/3p4fvn6f3Z++/r6enr5+Pl8evn49vt7eH76+310/fr7+358e/v4+3l++fv7/nh9+ft9cP76+/l6d3z6+vx3e/b2+/1+fPv3+P14+vv6/Hd3f/v+eHr7+/n/eXr8+Pl8eP75+fx9e/35+352fvr6+3l1fvv8fXj6 9/b6enp9+/h9dv76+/19enz6+vt5efz6+Hx4/fj6/nj99Pn6fHZ4/vx+dHr7/Pr/fHt9/vd/efn79/x5e/r6/Hh4+f38f3V4/vr7enj7+fn8f33/+Pn+eX/4+vt5dnlpX2tte/fx7/T48u7u8H769fbze3h7f/98c3N+//17c3n8+/94/vj19X57fvz1+H3/ 9/f2+3x7/Pr9fHR7/395cHN9en1zc3x+/nhxb377+X159vPz9fn9/vXz+fz39/H+/Pv88Ph9efd8/fd2cH78+nt2+3369v96fvf4+nR4/n7+dHF1dn59df389vP9fPr58/Z5evr4/P53fPv+/3pxev7+/Ht9+/x3X2X5+P3s5uvk4ent6vJwfvZ1c//8+fp4 evv3+fxrXWhvZGN3fvz1e2xq7vZzdXt9+vVvanTr6+/q4tza297h397l7vj3+f99cm51eHJtaGhqaGRjYF9lZ2p4bGlycf9++O3m4+Xi3t7c3N3f3tzc3t/c2NLOzs7MzM3Oz9LbflRBNS4tLCssMDpIeMzCvLm4vcjT9lpMSkpS99LKw728vb/FzNHW3+ru 3tnc2NfVzsrHxcXAvr26t7rlOCghIB4cHSMwTcu7tK2rr730S0Q/Pz9N07mvra2ur7XFRjM1NjQ3SN/Du77GyMfdT01Z/uvf2s7EwcfLwbu8vLq2r6ysySgdIyAZGR4rSrqut6+nqss7NTU2P0lRwqmiqK6vtsdXOS4uMzlDVs28ub7J1XRXSUhPddTMx8LA xsvNy8bGxMC7s62rqbE1HB0iGRYbKEa+qq21q6vLMCovMjxW1bemnqKutr59Oy4tMEPr4ty/tL3mWFdSTk5OaMzE0OLPytPq5dDGwsXFvbeyraiouywZHSIZGR81zLSquMm2vz0oKj1Q1r23rKWks/5671Q/P1vOusVHSOPdST9d0crbYVTx1WtY5sTF1N/a z8zOzb+1sq+rpqi+KBYcJhsbJEm2sa7VSsffNigw2ca9ur+1rq/NStK/yvpd5NjP6kxP4MrlXWvtb1JPV+/S0djWz99cVGfZysW/urWzsq2pq70tFxstHx0nSre9uXo429E/LjjAvsnH1MG4tchdwLXA+1fz/fxsUHTLx/hSavddT1znzszb6uPdbk9d1sfD wr64tbGtqau4MhcbLyAcJ0e5x7/uOc/KRS85vcTt3OG/uLXA57mxxFZL/fDvaFjhxcNuT2vsZ09Z8tPR6nD2421VYtvKx8S/vLezrquprm4eFyosGyAyxr/TyjxYvGo2MdS8aGh5y7q2uda/r7piQmvhYXx/3MfEckdb8FpLZdTQztbq4drxVFnYyszLwbq2 sa6rqrBAGRozJRskPrvSztk9zMBMMTm9zExc5L27uL3NtLDGSkfR7FNY8szHymRX4+JWSnjV33xv9O38Xlf51dTSyL69vbawrKutvC8aHzUfHCpcwFrV/0y91D41V7tYQWvKu8C8wL6vt9xObs5tVWDYy9p2Wmr7XE5Y39x8au/e/V1de9zb3c7BvLy6ta6r q67PJBouLxseM8niRsxX0LxQOTrDyjlH3L7Eyru+srDHfvbGfERhzsfZ5P5ZX1ZJSu/TcF/m229aXW3t3uLfzcTEwLm1sa6rrLY3GyVAHhsqa8s95OD8uX49Otq+OTvlwsf7vrq1sMLX1r/VP0/UyH1Z2drqU0xScOxYXt7Vb1Zu92hf/tzSz87Fvbq5tq+s rbVGHyVKIRooUNg3VcXdvOxER9zDODnRxdlXwLW4tsTGwsHkQGzL2ltdz9ldTVV0a1xa69b8WF/salBZ693q7dnKxcTBu7a0sq+xyTIjNjYcIDZeQzXNzM3HUWH9ylg2aMzlUui2u729vrrBz1xi0HBNXNbgWl5nd2RdYvvgcV5z815RYPD0deTRzcvHwby5 uLOvs8U/KTY4HiA0RjsvzcHazG3P2N1WO+/bUU3cucXJubW2w8rQ19pWVl/rfFFhbmVRXPJramvqdl1aWmJhXmXi09nVzsjJxL26t7Wxt9Y2MU8qHi48OS5Iv2/Y0snD4OlKadpJSWXGzeu/u73Bw77JzuHs2VpJbm1LUvFmVn7ebmLu9mFlYlpcZ2Z45dva z8rKzMbAvry4uL/rQkNIKSc5NjAwWthM3c3CydzQ7dxmTGvuflR6yM7Nxb+/y8nO2d9oZV1TTVJdWFpo6+/15eX0aW5uYVpfdPrx59rT0M7Lyca/vLzHYlbnOSs5OzAuPl8+TNjKzuLKytTrZej2W1v23Pzoy8fKzsXDzNPg2u5WV11SSFFkWlRp5fp76OX+ dvz8cmr16+vr5d7b2dXT0s3Kzmb62T49T0U5OFVNPU3v32Lny9Tl38/R7O7c2u5u5tvj6tnQ29/V0Nrv6OV0YmNnW1lcXVpaX2NoZ2lv//n5/vXt6+zt6unk397e3dnZ2NzqeWhhWlBOT1BPT1RaX2Z3/Hr47OXo7eri4+zq6+rp5N/j5d7a3eHj4er4fG5k YGRiXlpeZWVnam5zfvXu9fHn5eXm5t/c29jY09LY5HdiW1FNTUxLTFFcXF5t8vP97+fm6+Pe6vzt6O3/8+Li4+Dc3d3b2t/r6enxdmxpYVxbXFZXWl9kYGZ1+ff38uvq6Ors6uff4ePm4+Hh4eXp6enu+m1mZV9dWldZWlxcXGFnbHFwcHn27O3w7Ono6+7y 8+7s6uvt5uPh4ebl4+bq8vXu+ft7b21yeHRucX7++fj5+vjv8nlnZGBcWVdWWVteYmVy+uzp6+vj4eLl6ebm6ent8u/p5+fr6efl5Ovx+fX6d2ttbWxqZGBhZGZmY2ZtdHt2dX339O/3++/t6+3w7unq7fDw7Ozu9P97fv57cW90dHRzbmxxd3dybXJ4eHt1 df/6+vt/9PLw7/n++PHw9f7z8PLz9/x+9/f7eHh/fn56dnV+fXtzeP3+/X11e/z6/HN79fn2/X57+/j6fnf5+fj8end/+vx5efz5+X13eP/8/Hp1/v78/nt7+/v7/nf/9/f4fnn++Pt9efz5+ft6dn33/nxzfPz9+3x7fPr5+Xt4/Pn5fXZ++vv9d3z7+fl/ dnr7+vt4ffn7+P18e335+nt2/f/8/nZ6f335fHj4+vf8e3r8+Pj/ePn6+ft8env7+/tzffr7+nt4fvn6f3f7+vn8e3x++/n/dXr8/v19eXz5+vp5e/r69/16ffv6+3j++fr7enV4/vv+d334+vn+fXz7+fn9eP79+vx4ef3+/Xl69/37/Xd3fvv6e3n6+vf7 fHf99/j5dv/8/P17eH76+/92/vr7+np3fvn5f3b/+fr5fnp7+/z8eHr5+/j8eXf+/nx1ffb5+n96ffr7/3V0f/v3e3h5fv90W09Zc+3v/fXg08/a3tvc2uD7ePbr9m5lb3Jvb2ZkZWhscvrm43tgXWhaTlRWW2Jte+je3t7c2Nnc4+7+7+jq7uzj3+nu6uzp 8fZvaGBeWltdXWtgZ3ny+33s5+v17O358+vweOfo/ffo4Pv96fL8dW74enZlbGdrc2x3am72eWpt+fF/b2539XNjd/T9/3n+9OfqfHvr5Hlv6+Xp7vLj5+zu8O54fPP9bWb+7ndjavJ+bGRp7+5kZ3l09Htsbu/qcmx96Hho+/F+c3x58/h19/J+7/Xz+vTo +vLs/X/k7PL4efnj/F1ofPvrcmD/cHlmYu94e3xv8/b7dmzz+3Ly9Xn173D163hve/v1em367/Dy+/v+7ut57/189HxqcO/v9//9ePb3bm99b//+aXt7bXj7dHntevh1++9r+Xn6f//7//fx5W9/4/j7dm7s8m5ueP5/d3H9fHv2bW/z8fv5cnd8+/tqf3j4 +/bz8u7o8XX/fn72+m/+9X13eXD7+nZ9/X17/H5ybnR79Hx5fG/v+e55fOl9/Hl8dffpcHz87fb1eXV49vxwev31fO98bX98/fp0efbx/XJ17/l++3r8/H79enxzdvh1cn317vP09v7y/H7/cXr8bvn+c/f89Hn/dO76dX525W7w+3X0/v587Xp++PN1a/1u eGx1aHb6fvN17f328v/+ffPv9Pr16Pv3fn59+v/8cP3ufe1zcmr5d3B5bv5/+2ly/Xf5cXx+7vLx7v727fJ++nr8e/t8bvr+/fB77PH+7v/3dvj2fvV0931+eWxsa3Bwb2t6f3r7ePb38/f/+fju/Pj8/vD0fu1/+Pt+7vT/c+/u9Ht4fXP+dG1ud/VtdXNy dvx4bfv/eu77fuz27fR/8X3v+f369f35dWx3e/n6eXZ77/9+c3L9+vhwbfb2+fb2/vTuf/9udPv89m35ePt+b/P76/p5fHL4+Pbz9fH4cftwc/129Pz++X3+93h6fv7++2l783n383b3/Pb9cu70/vZ+/nr6eH38cXZ89/36/Hd86G18+H76+Xlv8P769nz3 9+/0fHbv/PHxafZ1/n1pfXX6+Xh0+Pp87m17fvzxe353ff1+cn129/R9d/rvf+/7cfj2+3t1/PL/7Xv8+fPu+nxx+3t7dXz8/u52/vf4d/NxdX9reGv8dHnzdO10fXZ67nj99er+7O547PLx9256eHX+d2t683x2/n/27XX1b3j1fXV4e/z0efr7+v30+257 evt5/W919n72eX3t8fP4dfjxffp89v7693p+e375e3ptenZ8d3v8bfL9cPx27fX7+Xr+8v99c/zwfvZ7/vv7+vh3fPtzenZxfXn5f/7+/vn1fnn6+PP4fPz1+f58d3R//uLj6eDu4u188Hvvfmn3b3Xybnh7fnx+d3f0eO92bG9nX19jZ3F/7Pv3fPfd9uft 9OPq9vr98+ru+vl97f57d3Fv8/pve3r28Hr9c+z19nh57XrqcnV+e/X+fGf0eX51cXH/9nZ9ff5073b+e2r0f3xzbvh1+Ptu+/z27W7w/nzpfvd9fPD1/W5573x9emz/+Xpu+3X37Hd+b3Fx/G9t/P3n+f5ubO34+3N/63/s+mzu9PP7b3jx/Pt4avx9f310 cvj0df5p9v31621t7Pt3/GH+6374fn717v3+dH3zdntreX33+3v4+f74+nP//ft6dfl1/vj5fPr7/fL2eXb/731x/m97+Xl/bu347/r7dPfybPZub33+/219/O77/Hp+/vL9c/h97vXye33u8vxucW76e3J0d/t7/3d59e/5+H148m/3fHP77/T38/73+e58 a/z39XX1f3v6/3psff75eGx9fXn5d27yee/3evj38frzev578ft1fX75efl1dnz4e357c/3/9XN+ff70+Xhw8fLrdHnu+u/5fHj48fd5+3338nx5b337+nN2/f5+fHN2fXV+cXN8+/14fHx+fvZ5+vn37vP7d/347/t+9Pr5/np6eXr+/nf9+n77/nr68f17 fvT3+/x4fXz4/n18/vV+/P58dn79+3V2fXj+eX16/ff8/X/+8/L5eP/8/fZ3//b17/j79/Dz9Pr58/Lz9nt+8Pf5/fzz+vf8dW95eXVtbXZ6fHN1dXj+fH50/fX+8/V6+vL6+3r3/vr4eXh7ffr9cn5+fv96eXZ8/vt5ef1+/H18/PX2+n379ff1/HR7+/j5 c3X++/p9d3N2eX96cHh9fXt2cv/8e3h5/Pn8d3V6/Pj8e3P6+vr6eHd5/vt+b3z++fp7ePz29vt99PL19vt89fLy+Hl++Pv/f/9++fz5dnT7/fp/dnv6+n54//b09fp+/fP3+H5/+fr6e3l1fPz/enP/+vv7dXv8+vp5d/359vp4d/77+Xp4+ff4+fx8f/n1 /Hv8+fn2fn759PV+dnz9/npyb3h8/310ffr7+v1//PXw4+tx/Ht+eG9yd3t2bnN1fPp4dnt++fh9fvj18/j8+vTy9Pv/9vb2+Xd4/P99cnF7fH14c3F4fv55d/n69/j9f/j08/R99/Hy8fj68/Hx+P3t8/j3e3l9+/16b3l8eXhzcW93eXlxc/9++/58/Pb0 9n399fT3/H389/f6fH75+ft+eHZ8f3xvcv7++n95efv5+n1+9vfy+H1++PX2/Hv79/T9fHp+/P1+c3v8f35zb3h7eXVve317fHRzd338fnT++Pj2/H3/9vj3/376+/t9d377/f15//f39n15ffz4/Hro3OLh7PDx9Pf6fHZxdHpuand3b/D6anFxffh09O7w 7Pt++e749//9/fX2/Hz48/Hv9/ry8O/2evHs7u/3/Pny8fp/d29wd3l77O7y8/r47/T0+n769vb8a1xfaWxycPzq8vfy9+vr6+3x8O7u7/l6/f3+fW9yeXh3b296e3t3cHN4fn1zdP5//n54dnd//n1zev5//Xhx/fn8/nf9/P37d3Z6f/96b3l/fH53eHV9 +fR0c/19/Hx2d379fnR6/v7+enV3//7+dnf9/ft/e3z7+fp9dP78/f50dv7++3d2/P39fHd2e/78e3b7+vj5/3779vn6eHz6/Px5d/7//X14+vz6/nl2evz+fnX//H17f3t4/vv7eXn6/fl+eH77+Pp6ffn7+/93fPv7+nh8+fv7/3x7/fv8e3f8/Pr+d3Z9 /f52dP5+/H53eH/5+X55/Pbz/X58/fX0/Xn+9/j6fXd+/Pt9df36+fx7eXr++/x2fvr9/n18e/z9/Hd1/v77fXZ++/r9enn88/b8e3v6+vx6e/v9/P96eHz8/Hx3f/z8/H14/vr8fXn8+fb+env9+/l7d/v7+f1/e/75+fx4/vf39395fvr8fXR+/P79eXZ9 +/x/dXn7/fz/en75+ft7fvv6+X13ef77fnd9+Pr6fnd8+vz8enr3+/z9e3r9+/54eX37+/56evr7+317+vj3+nx6/Pv6f3n7/Pz9fHh6/fv+dH39/vt7eH78+f54/vv5+nt3fP37fnV8+vr5/3t8+vXxeHr5+/X/eHv7/fx3evr9+312eP78/Hp4+/v5/Ht9 +vX3fnn6+Pf5enj/+/x7evr5+ft7eHh+9n15+/n6/H55fvv7/nV3//78e3V9/Pz/evr6+Pl+ev/9+f13/fr5+/57eP76/Hl3/P36/3h8+/n5fHn5+fj9d3z9+/55efz8/f99fX76+nx4/fr4+Xl3fvv6eXf++/v+eXd+/Pp9df/59/18e/34+/14ffr5+Xd0 /v75f3f9+vn5fHh8/Pr7ef/6+/v/fX38+ft5dX/9/n50e/38/Hl9+fj2/Hl6+/j6env5+/v+fHh8+/t9dn78+vn+ef76/P54/fr6+nx3fv3+e3R//vz+fHp9+fr7ePz4+Pd9e3z7+v52//v7/Hh2fP77+3Z7+n38+Xv++ff6fHr7+fr+d3r9/v93fPr6+n95 evn6+nt7+fv4/H95/fj7/nV7/P79eXj++/19efv59/t7d336+X14+/r6+v56evz6/Xh+/vr2f3j/+/r8d376+vp8d338+v11e/r7+/98e/v49Xx3+fv4/Xt5/P37eHP7+Pp/d3n9+vp9ePz6+Pt8ffz59/54/fv6+np2f/z9fHj65t3l5+/27enwf/n+/P14 cnR6entubHZ3fHZ1+/t5c3hwYmhubnJ79fLw+PDs6+vv8PXv7u/3+/L18vV9fvf4+Xx4+/v7fXV6ff79eHX+/v1/end9+3x+ev/4+/t7d37+/nh1//78fnh2ef36fXR++Pf9fHd++/36eH37/Pp+dnv9/v50fvj7+Xx3eP75/Xl8/fz6fnt8/P37fHX//fz+ eHv8+/t6e/f19/15ePz5+Xp6+/v7/n53fPz7fnR9/Pz6fXb+/P18eP77+/x6c3f89313f/r7+357fvn5+3n/9vn5/nl8/Pt/dnz8/ft7dXz9/Px2efv++f57fv36+H14+/v6/nZ5//3/d3r7/Pp/eXn2/v16dvz9+f19ef77+f13//3++3h5/vz7f3f7+PX5 enl++fj+d/z7/Pr/e3v9+vt3e/3+/Xh8/vv4/Xp++Pj6fnh9+/r7eHz6+/r+e3v89ef7bvl5+f94eH78/nh3+/z5fnh5fvn6fHb8+vn6fn38+ff8ef/4+/t7d//8/H15+vn6/Xx4fPv5/nj8+/n7fXp7+/r9eHn9/ft+d378/P57+vz4+Ht2fP36/XZ8/nz5 /Xx8fvn7fHf9/vz8eXv7+/x7efv8+f53ev78+3x4+/z8/Ht6//v5/3n9+vr4fHd+/ft6dX/7+/16eH39+n51ffn1+3x6fPb6+Xl6+f36f3V8+/v7e3z6+fp9eHr++vp4e/n7+v97ev36+3x3//36/nZ7/fv7eHb29/X7e3v++fp9ePr7+v19env7+v92fv38 +f12/vr9/nd++vr7fHh++/r9d/77/Pl+e3z6+fp7fPn59v15ef38/nZ8+/z5fnd7/fr6eHn7/Pn8fnz79/Z+d/z7+P14eP/7/Hl6+/r4/Xp4+/v6fHb6/fn8fXh+/f74dXz6/Pp7eX/8+v95+/j2+Xt5fPr5f3f++/v6/3x4/fr7eHn8/fn/eX77+ft7fPn6 +X53fPz4/Hh7+vr6/Xx5/PfzfHj8/vf9enh9+/x5ePz7+f56eP74+Ht2f/z7+Xx5/fn5/Xh++fn5fXn//Pt9efr59/t9dHf2+P12/vr9+X15e/z6+nt3/vz6f3h9+/v7fPz6+fr/eHj+/Pt2e/r9+v18eX/5+X12/fz6/Xt7/Pv6fnf7+/v+eHl++/t6d/v7 /Pt9eP37+Pt4f/n4+X14fvr9fHZ//fv9eHh9/Pr+dn369vp9eX35+vl6evr5/X57e/r7+3n/9/r5f3l6/vr8enz7/fv+eXn++vt9dn38+/17e/z6+356+fj6+nt5f/v6fHj7+/v7/3p8+vn7d378+vf7eHr8/P11fvr9+313evj7/nh++fr6/nz++/v6eXr8 +eXe6uft6+z9+vn8/3VxdHp4e29veXr7ent8+/j/dW57ZmBqZ297+Pb79+3s6+zw8Oru7/T98fLz9fv//fn4/Hd5/P78e3V8/vx8dX79/ft5dHp+/X10fP7+/X15ef/9/Hl5/P76fnh7/vz9eHn9/Pt8eXt+/P53ePz9/P57ef737Hpv/Xv5fHh2ev7/cnX6 /vn/eXh/+vn/dv77+/18e/75+fx5fPv7+nt3ffz8fnb8+fn6e3h8/vv+eH38/Pz/eHr8+vx5d//9/H14fv37+3z5+f75fnh5/fv+eXr7/Pr+fHp+/Pl/d/79/Pp7dv39+3x2/Pv7/Xh4//v7fXf7/Pn6f3p+//j5dfz5+Pp8eHr7/f91fvv8/Ht4fPv6/Xh8 +ff9fHp8+vv6eXf8/Pn/d3r8/Px4fvj69/96e//8+np6+v37/3t5//r6f3V+/Pz7env8+/p+efv59/t5en37+3t4/fz6+H15fPz5/nh++/v3+3h8+/z8dX36+/p5cn/5+vt3/vn7+v56ffr5+Xl8+fr3/3d6//v8eHr7+vl+enr++fp8efv7+v59ffv5+f53 /vr5+3p5/vv5fnj5+fj7en7n3uPo+fH5/3RveHn9//1tc3p7b3b6fe70fmRga295cXR7+vP3/fTv7+7x9ffy7/D6/PT3+fd+fvj6+Xl5/fz7fXd4/vv7eHn7/fv/e3r/9eLi7vP59PP3eHxufH1ye257emv4+vx3XmRqcHd8e3v79fP0/fnw8e/3/vfz9PZ9 +PT39fx7fP/5/XZ8/v77fHh5/vz7e3T9/X5/dXr+/Pt++P3++3x2dH7+/nd2fPv5/v94ffr6/nf++/r6eHr9/fx7dX/+/P52d378+n52/fv6+358//n6+3p++vv6fHd6//1+dX77/Pt8eHz8+f15fPbv/Xp4eP3+/Hl2/fz6/nh5/fv7en74+ff7enp++vl5 evl//P56en76+f11fvz7+3p7/Pz9e337+Pf8end9/Pt8eP77+v1+enr9+vt4e/n7+vt4ff39/nR8/P37e3d8//v9eH36+/n9e3v4+Pt8e/r6+f54eP/9/Xh5+/37fnd6/vr6e3n5/Pr8fHz9+vr+d3/7+fp5d//8+3x7+Pr3/X58/v37fnT+/f38fHl5/vf8 eXr8+/p9eP37+Pt4/Pn5+X12ev37/nf/+/v7/Xx7/fr5e3r7+/f+eXz9+vx5ePv8+v54ev36+np5+vv5+n18+/bo92z9eft+d3V6/fx7df37+vx6en75+P15f/v7+Xx6fvv6+Xp3+f36fHZ8/Pr+eP339/d6dv36+Px5fvz9+/95evz8+312//v7/nl9+/r5 fP75+vn/d3d+/Px5evv++/vq4Oji6fL67/D3+Hp1eXZ1eWtvfHt8fnjwc25zbvH77ebx7frs7+/7+O/19P17/vv0/nr79fn0fnx49PLufPv1/vLwfPJ+d29xcv/t6u78+fLx8Pz58PDx9n5pXWRpaW56fvn2/fr07+7y/Pbx8fL5+/f29f55+fr7/XdyeH19 eHF6fH19eXR0ff5+dXd/ffvp6vHn8v1oX2lobmxsbnd8enR6/Pz5/H58+vf3f3r6+/r+eXd9+v50d/7+/X13d379+3pxfPz9/Hl5//37fHV7/f3+eXV8/fx8d/v6+vt5ePv//ntyfH5+fnp3ev78/nd2/v78fXh9/Pv+d376+vl8dXj//H93e/z8+/56eX77 +Xt4/P77/nl6f/37eHX+/vx/d3j//Pp6ePr8+/x8e/z4+P92f/37/nd2en97enh/+vv7fHd++vn8d378/Pt9eX78/P13ePz8+3x3fP37/nj/+Pn4fnh8/vr8eHz9/vx9eHn++/x8dP79/P55fPv7+//9+vv5/3Z3fv38eXj8/fv8fnp8+/n9eP/7+/p8ef77 +350fvv7/Hl4//76/3X++/v6fnl4+vT8fH36+/h9d3n/+391ffv8+n53e/z5+Xl4+vj8/3l8/fz7fHb++/v9eXn9/Px6fPf6+Px7en76+Xt3/f39/Xt4//z7/HV7+/v8fXn9+vt/efz4+fl7dnz8+3x2f/37+n56e/36+nt8+/33+Xx5/vz+dXn9/P12eXz9 +Pt6fPn7+Px9ff349313/Pv5/Hl4ff38eHj7/fr+eHr/+fl7d/v7+/18ev/7+/52ffv6+Xt3fvv7fnr79/j6fHv7/v1+dX/+/ft9eHz9+v16d//8+355fvv7+np++fr5fnd5/vr9eXv6/Pv7fHd++vl9ef979fl6fP/6+nx3/fz7/nl5fvz7fHj8+/r6fXr9 9ebta3l5fv93dXd//Xx0//z7+3x5fff4/Xn/+vv4fnp++vr5eXj7+/l+d3r9+/14fvf6+X96ef/6/Hd8/f37/np6/fv6fXR//Pv8e3z9+/h+/vv89/x2dX39+3lz+/r7+355fPv4+3d9+vv6fXl8/ft/dn78+/p5d3z8+v14f/r7+P54ffr5+np7+/r4fnl5 /vv+dnv7/Pl9d3v8+fp6efn1/X56d/v8+312/v36/Xl4//r6fHv3+Pf8e3p++/l8dv7+/Px8eHz7/Px2evr6+3x7fv3/+Xn99/r6fHd7+/p+d379/Pl/enr++fh7ev37+Pl3evz+/Hd5+/v7fnd5/vr7eXv6+vf8enz9+fl9d/z7+/p6eXz7+3l3/Pz6/Xl5 /vr6fXf+/fv8e3r++/n7dnz6/Pl8d377+n93+fn593196N7l5fH08O7xfnZ0fn17cm55ent4c3h+/fx4fPj3+3RvdmZhamhx//z09Pf18Ozq7/ju7e7v9/n18/P9ffj6+Pp6d378/Hl2f/78/Xh3e/rp/Wt7eP9+eHN4fv57dH59+vx5eHv9/P12e/3+/X15 e/37+3h3/vz7/3Z5/vz8eP/3//56enh++/x5ev5/+357eH/8+350fP37/Hp4/vz7fnz+/Pn+enV+/fx+dv39+v19e3v8+ft1fPv9+nx4fvv8f3R9+vz6end8/Pv+eHz7+v1/e338/Pt4evv7+X55ef/7/Xh7+/v4f3h6/fr8e3n7+f19e3r++/t+enl/9vt5 eP75+3x8+fz3/Hp3fP37fHf+/vv7fXl9+/v8dnr7/Pl+eX36+f54//n5+nt3e/37/nh+/Pz6fnl7f/n5eHr8/fn5d3j9//x3d/z8+v53ev36+np6+/r5/nx7/Pr4/3j++/n8end++/x6d/z9+v16eH79+nx1/P77+3x5fvv6/Hh8+vr6fHd9/Pz/eP36+fl8 fOje5Ob59PtlYmVlanB2eXNwfv35+3v+9fX1//zz9PT6e3z6+Pd8fvv69/59eX77+X52/f77/Xp4fvz8fHX9/fr7eXj++vt+d/z7+/t+e3/45fBqe3f9fnl0dnv6+3H9/fr7fXl9+/v6eHz7/Pt+e337+fp7d/z6+P14ev37/Hl8+Pn3/nh5fPv9eXn9/fv/ fHv++fr/c339/Pp5eP75+v/+//z5/np1//z8fXr+/fr8fXp8+/r9d3z7/Pt8eX38+v52fvv9+nx3fPz6/Xl9+fv8fnV+9/j5eHz7+/n+enn/+/t1e/r9+X54eX/5+3t3/fj9fnl6/fv5fnf9+Pr7enj++vt9evv5+Pp5d3z9+nx3/v36/nx6fvn6+3h6+vz5 enj+/fr+dv76+vl7dnz9+v15//z7+v98e/76+nl5+/75+3Z6/v38eHr7/H/+eXz4+/x7evn++fp8fP/7+X52/Pv5+nl6fvz5e3b7/Pv9eXl8+vp/dn/7/vx7ev77+fp5fPr6+X55fPv7/nf++vn4e3r9ff7+eHz+/Pt+enz8+vl7d/77+n55ffz8/Hl7+vv5 fnl7/vn8env6+/r9fnp+/Pn9dHr7+/57ev39+3p2/fz7/Hp5/vr7f3n7+v37fXp++/b+dXz9+/p8eHz++/93/vr7+n54evv6/nd5/v38fXl9/fn5fHf8+vn8d3z8+vt6fPn6+f94eX37/Hp5/fz7/nt7/vv6/nV++/z9e3v++/r/6d7j5fD+fH7//294+/75 eHZwb3x6fnP8+/75fHB4/n729vry9H97+vTu8fD9+Pl18vZ3eOzu7/v+bWJua21zfebd6OTl6urt7vny9fh8dn1zfX93en39/X51/fr5/Hp0c356XV9rbXx5env68+/z+O/u7u/z9/bw8PP//vn3+Xx6eHz6fnV7/fz9e3J2e359dHt+/v59enh6//x3dX1+ /fhzcn58fnR1fn/9fHZ4fvz8enf+//1+eXl9/vx9dn7+/f54dnz9/Xp1/vz6/XZ3ff38fXZ6//7+e3h7/fv+dnz7/fp9d337+311/vv8+3t2fnz+/XV7/v79enT//vr6fXf9+/v8d3o= --mail.sleepy.sau.135.1476 Here is a new type, I don't expect you will be able to read it at the moment, but it shouldn't mess up anything else. I'm working on the X viewer for it Now. --mail.sleepy.sau.135.1476 Content-Type:application/x-annotate Subject: Wrapped by /usr/sau/mgr/demo/misc/annotate eXovICdAISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAA AAAAAAYAAAAHAAAAADgA4AAAAAcAAAAAAAAAAAAAAAAAAAAAP-AAAAAAAAAAAAwA AAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAkAAAAIwAAAAMQBGAAAABiAAABw AAAD-AAAAA+AAAAD--4AAAAAAAAAAAwAAAB--gAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP-AAAAAAA AAAAABCAAAAQIAAAAQICBAAAACBAAfCPAAAEAgAAAHBAAAAP-4AAAAAAADgAAAwA AAH--4AAAAAAAD----wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAf-gAAAAAAAAAAACBAAAAgEAAAAgEEAgHjwEAgAg+A gAP---wAAICAgAAf+AAAAAAAAEQAH--+AAP4H8AAAAAAACAAAAQAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP-gAAAAAA AAAAAEAgAAAgCAAABAEEAQIUIIAgA+B8gAQAAAIAAQENQAA-4AAAAAAAAIQAIAAB AAfAA+AAAAAAACAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAGDgAAAAAAAAAAAIAQAABACAAABACIAQTJkIAQAB8D 4AQAAAIAAQISQAB-4AAAAAAAAIQAIAABAA8AAPAAAAAAACfvvwQAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAChgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDgAAAAAA AAAAAQAIAABABB48CACIAIWrUQAQH--4HAf---4AAgIIgAD-wAAAAAAAAQgAIwwx AB4AAfgAAAAAACAAAAQAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAACgQAAAAAAAAAAA AAAAAAAAAAAAAAP4AAAAfwAADg-gAAAAAAAAAgAEAABAAiFCEACIAEXr0gAQEAAH wgIAAAQAAokEYAH-wAAAAAAAARAAJJJJADwAA-wAAAAAAC---8QAAABAAAAAAAAA AAAAAAAAAAAAAAAAAAChgAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAgIAADhAQAAAA AMAAA8A+AABAAkyZEACIAFzJkgAQEkkkvAJJJJQBBFEEEAH-wAAAAAAAARAAJJJJ ADgAB9wAAAAAACgAAGQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAACmAAAAAAAAAAAA AAAAAAAAAAAAAAgCAAABAEAADiAIAA3-3+AAAcA-AABAAVq1IACIAGIULAAQEkkk oAJJJJQCpNkE4AH-wAAAAB---ggAJJJJAHgAD54AAAAAACgAAHQA---8AAAAAAAA AAAAAAAAAAAAAAAAAAC4AAAAAAAAAAAAAAAAAAAAAAAD----wH----gP7sAHAP2q 3-AAAMA-AABAB969IACIAIHjwgAQEkkkoAJJJJQCVAEJAAH-wAAAACAAAQgAJI5J AHAAHw4P----wCn8AFwAQAEIAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAA AAAAAAAAAAAEAAAAIIUAAUQQDgAAgfv-v-AAAEA4AABAGEyZ4ACIAwAAAQAQEkkk oAJJJJQBFAESAAH-4AAAACAAAAfAJJFJAHAAPg4IAAAAQOgAAEwAP--wAAAAAAAA AAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAEAAAAIIiAAiQQAAAAgH1V f+AAAEA4AAAg4CFCH4EEHAAAAPAgEkkkoAJJJJQDInDiABP-8AAAAB---AAAJJFJ gPAAfA8KwAAFQKn2AEYAEAQgAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAA AAAAAAAAAAAEAAAAIIUAAUQ----4gH---+AAAEA4AAAhAB48AGEEIB--+AwgEkkk oAJJJJQEEjCCAD--+AAAAAAgAgAAJKJKQOAA+AcIAAAPwagAAEMACBxAAAAAAAAA AAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAEAAAAIIKgCoRAAAAEgH-- -gAAAEA4AAAmEAAACBEE0P---xIgEkkkoAJJJJQDiQAEAH---AAAAAAgAwAAJKJM QOAB8AcLQAAHQ6gAAH8ABDqAAAAAP-----gAAAAH-----wAAAAD-----4AAAAB-- ---8AAAAAAAEAAAAIIBQFARAAAAEgP--8AADgH-4DAAoIAAABAkFH-----EgEkkk oAJJJJQARoAEAP-D8gAAAAAf-MAAcyI4QOAD4AcIAAAPwqnvvwEAAj8AAAAAQAAA AAwAAAAIAAAAAYAAAAGAAAAAMAAAACAAAAAGAAAAAAAEcAAAIICIIgRAAAAEgP9E AAAFgD-4CgAocAAACgkFH-4IP-EgEkkkoAJJJJQAIEAIAH+B4QAAAAAIBAAAiEIQ gOAHwAcIAW0FQqgAAAEAAT4AAAAAvAAAAAQAAAATgAAAAIAAAANwAAAAEAAAAE4A AAACAAAAAAAEiAAAIIBQFARAAAAEgNdEAAAJgB-4CQAoT-AAMgkFD-wAH+EgEkkk oAJJJJQAEAAIAD+AwIAAAAAIBAAAiEQhAOAPgAcIAAAAQqn79-EAAJwAAAAA1gAA AAIAAAAWwAAAAEAAAAL4AAAACAAAAFEAAAABAAAAAAAEiAAAIIAoKARAAAAEgask AAAR-gAH+IAYAA--wAoDB-8Af8FAEkkkoAJJJJQADgAIAB-AQEAAAAAH+AAAiERC AOAfAAcIAdcAQqgAAAEAAEgAAAA4qjjgAAIAAAAdRxwAAEAAAAf444AACAAAAGCc cAABAAAAAAAFj---oIAHwARAAAAEgdcIAAAgAwAEAEAXAAAAADIC4D--+AZAEkkk oAJJJJQAAQAIAA+AICAAAAAEEA-BEISFgPA+AA8IAAAAQqm-feEAADAAAAAk1RjB AAMAAAAaoxggAGAAA--8YwQADAAAAECMYIABgAAAAAAEiAAfIIAGwAQgAAACgavw AABAA4AEACAQ-AAAAMICH4AAABhAEkkkoAJJJJQAAQAEEAcAEBAAAAAEEDABEIUJ QHB8AA4IABoAQqgAAAEAADAAAAAiqxVCjkEAAAAdYqhRyCAAAgAEVQo5BAAAAECK oUcggAAAAAAEiAANIIAEQAQgAAACg1YAAACAA4AEABAIA4AAAwQBAHAAAGCAEkkk oAJJJJQAAIAECAIACAgAAAAD4cABEQYSQHD4AA4IAAAAQqn79-EAADAAAAAj1RJE REEAAAAaokiIiCAAAmQcSRERBAAAAHiJIiIggAAAAAAEcAANIIAEQAQgAAACg64A AAEAA4AEAAgEAGAAPAgAgAwAB4EAEkkkoAJJJJQAAIADCAAABAQAAAAAHgABEQAk QHnwAB4IAAAAQrgAAAEAADAAAAARqxJEREEAAAAdYkiIiCAAAgq0SRERBAAAAHiJ IiIggAAAAAAEAAAdoIAP4AQgAAACg1YAAAEAA4AEAAwCBB--wBAAQIP-+AIAEkkk oAJJJJQAAEAA2AAAAgIAAAAAAAABDgBIgDvgABwIAAAAQonf-eEAADAAAAAQ1RBH xEEAAAAaogj4iCAAAQHMQR8RBAAAAciII+IggAAAAAAEAAAAIIAP4AQgAAAChqwA AACAA4AEABwBBAAAGCAAIIAAAwQAEkkkoAJJJJQAAEAAKAAAAQEAAAAAAAAAgAAx AD-AADwP----wogAAAEAADAAAAAOaxBEREkAAAAdYgiIiSAAAT4MQRERJAAAAciI IiIkgAAAAAAEAAAAIIAP4AQgAAACh1wAAABAA4AEADwB4gQIEeAAPECBAjwAEkkk oAJJJJQAACAACAAAAICAAAAAAAAAgAADAB+AAHgAAAAAAom-f3EAADAAAAAfVRBE RHEAAAAaogiIjiAAB8AUQRERxAAAAEiIIiI4gAAAAAAEAAAAIIAO4AQQAAABh-wA AAAgA4AEAHgGHgQIHhgAw8CBA8MAEkkkoAJJJJQAABAAEAAAAEBAAAAAAAAAgAAF AA8AAPAAAAAAAogAAAEAADAAAAAVSxBETgEAAAAdYgiJwCAABgAkQRE4BAAAAEiI IicAgAAAAAAEAAAAIIAO4AQQAAABg-gAAAAR-4AH+PAYAwQIEAYDAGCBAgDAEkkk oAJJJJQAAAwAIAAAACAgAAAAAAAAQAAJAAfAA+AAAAAAAogAAAEAADAAAAAUNRBE 4AcAAAAaogicAOAAB--EQROAHAAAAEiIInADgAAAAAAEAAAAIIAMYAQQAAABgAAA AAAJ-4AD+eAlIoQIESkEpFCBAiUgEkkkoAJJJJQAAAMAQAAAABAQAAAAAAAAQAAR AAP4H8AAAAAAAo----8AADAAAAASKxBOADwAAAAdYgnAB4AABAAEQTgA8AAAAEiI JwAeAAAAAAAEAAAAIIAP4AQQAAABgAAAAAAF-4AB+8BJJIf4OSSJJJD-BySQHDDD IAOGGGQAAADhgAAAAAgIAAAAAAAAIAAlAAH--4AAAAAAAoAAABAAAMwAAAAKNRDg AcAAAAAaohwAOAAABgAEQ4AHAAAAAGCIcADgAAAAAAAEAAAAIIAAAAQQAAABgAAA AAADwH-gD4A22EEgRtsG2wgkCNtgEAAAIAIAAAQAAAAeAAAAAAQEAAAAAAAAIABA AAB--gAAAAAAAoAAABAAAwMAAAAJGzgAHgAAAAANZwADwAAAAgA84AB4AAAAADCc AA8AAAAAAAAH----4P----wf----gAAAAAABwEAwDwAAAIkkQAAAABEkiAAAD--- wAH---gAAAAAAAAAAAICAAAAAAAAEACAAAAP8AAAAAAAAoAAABAAD--AAAABFQAB 4AAAAAAmoAA8AAAAAgDkAAeAAAAAABiAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAwEA4DgAAASYZIAAAACTDJAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAA AAAAAAAAAAAAAv----AAAAAAAAAAkwA-AAAAAABzYAfgAAAAAg9kAPwAAAAAAAyA H4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA4DAAAANgGwAAAABsA2AAAAAAA AAAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAgAAAEAAAAAAAAAAzQHh AAAAAABZoDwgAAAAAng0B4QAAAAAAAaA8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAEA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAA AAAAAAAAAAAAA----8AAAAAAAAAAawcRAAAAAADM4OIgAAAAA4AcHEQAAAAAAAOD iIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA4AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPRiR AAAAAACGQxIgAAAAAAAMYkQAAAAAAAEMSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAEA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAH+CRAAAAAAGDPBIgAAAAAAAHgkQAAAAAAADw SIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8A-gAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR AAAAAAEBgBIgAAAAAAAAAkQAAAAAAAAASIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAgAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAAAAAMAwBIgAAAAAAAAAkQAAAAAAAAA SIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAPAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR AAAAAAIAwBIgAAAAAAAAAkQAAAAAAAAASIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAIAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAAAAAYAwBIgAAAAAAAAAkQAAAAAAAAA SIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA8AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR AAAAAAQAgBIgAAAAAAAAAkQAAAAAAAAASIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAAAAAQBgBIgAAAAAAAAAkQAAAAAAAAA SIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDwAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKaR AAAAAAYBFNIgAAAAAAACmkQAAAAAAABTSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGSRAAAAAAIDDJIgAAAAAAABkkQAAAAAAAAy SIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALSR AAAAAAMGFpIgAAAAAAAC0kQAAAAAAABaSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAdyRAAAAAAGcO5IgAAAAAAAHckQAAAAAAADu SIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyR DAAAAADwB5IhgAAAAAAA8kQwAAAAAAAeSIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAABaReAAAAAAAAtIvAAAAAAAAWkXgAAAAAAAL SLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPuR swAAAAAAH3I2YAAAAAAD7kbMAAAAAAB9yNmAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOGTwQAAAAAAHDJ4IAAAAAADhk8EAAAAAABw yeCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGT QAAAAAAAEDJoAAAAAAACBk0AAAAAAABAyaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXgAAAAAAAABLwAAAAAAAAAl4AAAAAAAAA S8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACW AAAAAAAAABLAAAAAAAAAAlgAAAAAAAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVAAAAAAAAABqgAAAAAAAAA1QAAAAAAAAA aoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5 AAAAAAAAAA8gAAAAAAAAAeQAAAAAAAAAPIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAYAAAAAAAAAAMAAAAAAAAAA GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB-gAAP--------------------- -------------wAAAAH-4AAAAADwB4AAAPAHgAAA8AeAAAAAAAAAAAAAAAAAAAAA AAAB-wAAAAAAAAAAAAA-wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAf-8AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAA4AHAAAAAP8H+AA A-wc4AADnB-gAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAH-+AAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB--+AAn--------------------- -------------sAAAHATg4AAAAf+P-AABvY88AAHnjewAAAi97zj3vAAAARe95x7 3gABGQAEXvece94AAAf--gAAHwAAAAB+AAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAA AAAAD---AAu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u0AAAYA0wGAAAA--f-gA DGN-+AAP-2MYAAA2hCEUUIAAAAbQhCKKEAABGQAG0IQiihAAAA-gfwAAIIAAAACB AAAAECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP---AAt3d3d3d3d3d3d3d3d3d3d3 d3d3d3d3d3d3d8AABgBwwBgAAA--f-gADvd-+AAP-3e4AAAqhCEUEIAAAAVQhCKC EAABAQAFUIQighAAAB8AD4AAQEAAAAEAgAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAf---AAru7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u70AACAAxgAQAAA--f-gA D-9PyAAJ+X-4AAAi57303PAAAARc976bngABAQAEXPe+m54AADwAA8AAQCAAAAEA gAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB----AAvd3d3d3d3d3d3d3d3d3d3d 3d3d3d3d3d3d3cAANCAzABMAAA--f-gAD-9PyAAJ+X-4AAAigIUUUBAAAARQEKKK AgABAQAEUBCiigIAAHgAB+AAQPwAAAMAwAAAcDgAAAAAAAAAAAAAAAAAAAAAAAAA AAAD---+AAu---------------u-----------u-----u0AATGB2QDCAAA--f-gA Dvd-+AAP-3e4AAAigIUUUBAAAARQEKKKAgACAgAEUBCiigIAAPAAD-AAQQoAAAUA oAAAiEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAH---8AAt4AAAAAAAAAAAAADdAAAAA AAAAABdgAAAA98AAnOD7wHBAAI--f-gAjGN-+ACP-2MYAAAi970TnvAAAARe96Jz 3gAD-gAEXveic94AAOAAH3AAQ-4AAAoAUAAB-P4AAAAAAAAAAAAAAAAAAAAAAAAA AAAP---4AArz-------------56f---------97P---+b0ABDGH8ADAgAIf+P-AA hvY88ACHnjewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAPngAQjoAAAoA UAABNLIAAAAAAAAAAAAAAAAAAAAAAAAAAAAf---wAAvUAAAAAAAAAAAAAH2gAAAA AAAAAC3QAAAB3cACDGH8ADAQAMP8H+AAw-wc4ADDnB-gAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAcAAfDgAQjkAAAwAMAABNLIAAAAAAAAAAAAAAAAAAAAAAAAA AAA-----8Au0AAAAAAAAAAAAAFugAAAAAAAfgDvQAAABe0AEDHH8ADAIAPjwB4AA +PAHgAD48AeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdxn+bgAQRCAAAQA IAAAiEQAAAAAAAAAAAAAAAAAAAAAAAAAAAB----4Dwt0AAAAAAAAAAAAAHegAAAA AABp4C9QAAAB98AIHvj4AHgEAP---+AA----4AD----gAH---------+D------- ---AAA----------w9KR+nwAQOBAAAgAEAABcDoAAAAAAAAAAAAAAAAAAAAAAAAA AAD----4EIr0AAAAAAAAAAAAAF6gAAAAAAH5eD7QAAABb0AQAf38AAACAP6qqrAA -qqqsAD+qqqwAH---------+D----------AAA----------w5KT6hwAQAAgAAgA EAABAAIAAAAAAAH-----wAAAAD-----4AAH-w--8AwvUAAAAAAAAAAAAAH2gAAAA AAKprC3QAAQB3cAQAf--AAACAMVVVVAYxVVVUBjFVVVQGGAAAAAAAAAGDAAAAAAA AADAAAwAAAAAAAAAw5KXyRwATAAQABAACAACAAEAAAAAAAMAAAAAYAAAAEAAAAAM AAP8A--8PAu0AAAAAAAAAAAAAFugAAAAD-3Z3jvQAAIBe0AgAf--gAABAIaqqrA4 hqqqsDiGqqqwOGAAAAAAAAAGDAAABAAAAADAAAwAAABAAAAAw5yfyJwAUAAQABAA CAACgAUAAAAAAAbgAAAAIAAAAJwAAAAEAAPAA--+wAt0AAAAAAAAAAAAAHegAAD- 8A6pqi9QABEB98BI4P+EgAA4gIVVVV-4hVfVX-iFV9Vf+GAAAAAAAAAGDAPOBAAA AADAAAwAAABA4AAAw5KfSFwAIAAIACAABAAEAACAAAAAAAXwAAAAEAAAALYAAAAC AAcAA---AAr0AAAAAAAAAAAAAF6gAf8AAA95dz7QAQkBb0BZMHczQABMgAaqqr-4 Bvq+v-gG+r6-+GAAAAAAAAAGDAwzggAAAADAAAwAAACDh4AAw5K+SFwAIAAIACAA BAAFAAKAAAAAAA-xxwAAEAAAAOo44AACAAwAA--+AAvUAAAAAAAAAAAAAH2gVQAA AA6pqy3QAySB3cC5MA9MwAAMQAVVVV-4BVdVX-gFV1Vf+GAAAAAAAAAGDBAMwAAA AADAAAwAAAAGGf8Aw5L8SlwAQAAIAEAAAgAIAABAAAAAB--4xggAGAAAANUYwQAD AAAAAf-4AAu0AAAAAAAAAAAAAFug-wAAAA3Z3bvQHRSBe0CZMA9dwAAYQAaqqr-4 Buq+v-gG6r6-+GAAAAAAAAAGDAACIwAAAADAAAwAAAGIYSEAw9z-MbwAQAAIAEAA AgAIAABAAAAABAAIqhRyCAAAAOsVQo5BAAAAAP-wAAt0AAAAAAAAAAAAAHevVQAA AA6pqq9QFVSB98EZMA9d4AAwIAVVVVA4BVfVUDgFV9VQOGAAAAAAAAAGDAADEQAA AADAAAwAAAEQgRkAwcHwADgAQAAIAIAAAQASAAEgAAAABMg4kiIiCAAAANUSRERB AAAAAf-gAAr0AAAAAAAAAAAAAF6vVQAAAA95d77QFVSBb0EZMA8zOABkIAaqqrAY Bvq6sBgG+rqwGGAAAAAAAAAGDAAAiQAAAADAAAwAAAEhgRkAwcPgADgAQAAQAIAA AQAQAAAgAAAABBVokiIiCAAAAOsSRERBAAAAA--AAAvUAAAAAAAAAAAAAH2vVQAA AA6pqq3QFVSB3cE84AaIOAB8IAVVVVAABVVXUAAFVVdQAGAAAAAAAAAGDAAASQAA AADAAAwAAAEiAQEAwefAAHgAQAAQAIAAAQARAAAgAAAAAgOYgj4iCAAAANUQR8RB AAAAB-+AAAu0AAAAAAAAAAAAAFuvVQAAAA3Z3bvQHRSBe0IAAAYQOAAAEAaqqrAA BqqqsAAGqqqwAGAAAAAAAAAGDAAAaQAAAADAAAwAP+EkAQEAwO+AAHAAI4AgAIAA AQAQgAQgAAAAAnwYgiIiSAAAAOsQRERJAAAAD-+AAAt0AAAAAAAAAAAAAHeg-wAA AA6pqq9QAySB98IAAAIoEAAAEAf---AAB---8AAH---wAGAAAAAAAAAGDAAAKQAA AADAAAwAICEoAQEAwP8AAPAAHuDAAH88-gAPYBvAAAAAD4AogiIjiAAAANUQRERx AAAAH-+AAAr0AAAAAAAAAAAAAF6gVQAAAA95dz7QAQkBb0IAAAEOYAAAEAABwAAA AAHAAAAAAcAAAGAAAAAAAAAGDAAAP+AAAADAAAwAIz-oAgIAwH4AAeAABJ8AAAJC QAAAX+gAAAAADABIgiJwCAAAAOsQRE4BAAAAP++AAAvUAAAAAAAAAAAAAH2gAf8A AA6pqy3QABEB3cQACADPgAAACAAD4AAAAAPgAAAAA+AAAGAAAAAAAAAGDAAA8DgA AADAAAwAI-I4A-4AwDwAA8AABJAAAAJCQAAASEgAAAAAD-+IgicAOAAAANUQROAH AAAAf88AAAu0AAAAAAAAAAAAAFugAAD-8A3Z3jvQAAIBe0QABAB-AAAACAAGMAAA AAYwAAAABjAAAGAAAAAAAAAGDAABAAwAAADAAAwAIwBMAAAAwB8AD4AABJAAAAJC QAAASEgAAAAACAAIgnAB4AAAAOsQTgA8AAAA-48AAAt0AAAAAAAAAAAAAHegAAAA D-6pqi9QAAQB98QABADqgAAACAAMGAAAAAwYAAAADBgAAGAAAAAAAAAGDAAGAAIA AADAAAwAJgACAAAAwA-gfwAABH2AAB5CeAADyE8AAAAADAAIhwAOAAAAANUQ4AHA AAAB-w0AAAr0eDwAAAGAAAecAF6gAAAAAAN5dD7QAAABb0TgCAH-wAAByAAYDAAA ABgMAAAAGAwAAGAAAAAAAAAGDAAIAAEAAADAAAwAKAABAAAAwAf--gAACINgAGQk JgAMJJDAAAAABAB5wADwAAAAAGs4AB4AAAAD-gHwAAvUODgAAAOAAAOcAH2gAAAA AAGpuC3QAAAB3cUwEAH-wAACaAAwBgAAADAGAAAAMAYAAGAAAAAAAAAGDAAQAeCA AADAAAwAUAAAgAAAwAH-+AAAEACQAIAYAQAQAwAgAAAABAHIAA8AAAAAATUAAeAA AAAAAAP4AAu0OHgAAAOAAAMAAFugAAAAAAB54DvQB-wBe0UwEAP-4AAAaABgAwAA AGADAAAAYAMAAGAAAAAAAAAGDDgxgjDAAADAAAw4cAACwAAAwAA-wAAAH--wAP-- -wAf---gAAAABB7IAfgAAAAAA5sAPwAAAAAAAAAIAAt0fPH32AXDnB94PHegAAAA AAAfgC9QCAIB98TwIAP-4AAByADAAYAAAMABgAAAwAGAAGAAAAAAAAAGDEQjwhhD 8ADAAAxEIAAAw-AAwAAAAAAAAAAAAAAAAAAAAAAAAAAABPBoDwgAAAAAAs0B4QAA AAAAAAAAAAr0XXO5+AnHnGc47l6gAAAAAAAAAD7QE-kBb0QwIAP-4AAAaAGAAMAA AYAAwAABgADAAGAAAAAAAAAGDIZiYsgkCADAAAyGYAAAJAgAwAAAAAAAAAAAAAAA AAAAAAAAAAAABwA4OIgAAAAABmcHEQAAAAA-----4AvUXnM5wAnDnOY5zn2f---- -----+3QFAcB3cUwIAP-4AACaAMAAGAAAwAAYAADAABgAGAAAAAAAAAGDQJkIsgk BADAAA0CcAAAJAQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYxIgAAAAABDIYkQAA AAA-----4Au0XmMxgB-jGc4xzlvVVVVVVVVVVVvQFAUBe0TgMAX-0AAByAYAADAA BgAAMAAGAAAwAGAAAAAAAAAGDQFE4QgUBgDAAA0BQAAAFAIAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAPBIgAAAAADBngkQAAAAA-----4At0jOHjgCDnOc5xznd----- ------dQFAcB98QAHBw8EAAACAwAABgADAAAGAAMAAAYAGAAAAAAAAAGDQHE0QgY AgDAAA0AwAAAGAIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIgAAAAACAwAkQAA AAAAAAAAAAr0iOGDgGDned993F7u7u7u7u7u7u7QFAUBb0QAD-wAkAAACBgAAAwA GAAADAAYAAAMAGAAAAAAAAAGDQHCFNAIAgDAAA0AwAAACAIAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAABIgAAAAAGAYAkQAAAAAwGCDMAAvVyfHDgPPzvOZw8H3d3d3d 3d3d3d3QFAcB3cIAA-QJUAAAEHAAAAcAcAAABwBwAAAHAGAAAAAAAAAGDQCDNHAJ ggDAAA0AgAAAKAIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIgAAAAAEAYAkQAA ABA4OHDMAgu0AAbgAAAAAAAAAFu7u7u7u7u7u7vQFAUBe0IAAAQVUAAAEGAAAAMA YAAAAwBgAAADAGAAAAAAAAAGDR6B5gAFQgDAAA0AgAAAFAIAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAABIgAAAAAMAYAkQAAABA8eHDMAgt0AAxwAAAAAAAAAHd3d3d3 d3d3d3dQFAcB98IAAAJUoAAAEAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDTMAAgAC YgDAAA0AgAAADAIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIgAAAAAIAQAkQAA AHw++NjMD4r0AA5wAAAAAAAAAF7----------+7QFAUBb0EHAALoIAAEIAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDTGEAgABIgDAAA0AgAAADAIAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAABIgAAAAAIAwAkQAAADg32NjMBwvUAAfgAAAAAAAAAH3AAAAA AAAAAB3QFAcB3cEMgAHgwAAMIAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDQ2CAQED IgDAAA0AgAAABAIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNIgAAAAAMAimkQAA ACgzmfzMBQu0AAAAAAAAAAAAAFuf---------9vQFAUBe0EOgAD-wAAcIAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDYPCAYMBYgDAAA2AwAAABAIAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAADJIgAAAAAEBhkkQAAAEQxGfzMCIt0AAAAAAAAAAAAAHegAAAA AAAAAC9QFAcB98CHAADhwAAsQAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDIBBAIIA ggDAAAyAQAAABAIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpIgAAAAAGDC0kQAA AAAwG4bP4Ar0AAAAAAAAAAAAAF6gAAAAAAAAAD7QFAUBb0CLgADhwABMQAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDIBBgIICAgDAAAyAQAAAAgIAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAO5IgAAAAADOHckQAAAAAwGwbP4AvUAAAAAAAAAAAAAH2gAAAA AAAAAC3QFAcB3cBJgADhwAB+gAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDIDAhwYC BgDAAAyAwAAABgIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5IhgAAAAB4A8kQwA AAAAAAAAAAu0AAAAAAAAAAAAAFugAAAAAAAAADvQFAUBe0BHAADhwAAMgAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDECgwAQCBADAAAxAoAAABgQAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAtIvAAAAAAAAWkXgAAAAAAAAAAAt0AAAAAAAAAAAAAHegAAAA AAAAAC9QFAcB98AgAADh-AABAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDEGgYAwF DADAAAxBoAAABQQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH3I2YAAAAAAD7kbMA AAA-----4Ar0AAAAAAAAAAAAAF6gAAAAAAAAAD7QFAUBb0AQAAH90gACAAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDGIQMBgE+ADAAAxiEAAABPgAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAHDJ4IAAAAAADhk8EAAAA-----4AvUAAAAAAAAAAAAAH2gOqv4 AAAAAC3QFAcB3cAQD4LqoXwCAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDDwYHHAI AADAAAw8GAAACAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDJoAAAAAAACBk0AA AAA-----4Au0AAAAAAAAAAAAAFugRVQIAAAAADvQFAUBe0AIDYJRAWAEAAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDAAMB8AQAADAAAwADAAAF-gAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAABLwAAAAAAAAAl4AAAAAAAAAAAAt0AAAAAAAAAAAAAHeghVQP ---wwC9QFAcB98AEAYIBAXgIAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDAAGAAAg AADAAAwABgAAKAgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAAAAAAAAlgAA AAAAAAAAAAr0AAAAAAAAAAAAAF6ghVQIAADLID7QFAUBb0ACAwEBggwQAAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDAABgADAAADAAAwAAYAAyMgAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAABqgAAAAAAAAA1QAAAAAAAAAAAAvUAAAAAAAAAAAAAH2hBVQI AADEEC3QFAcB3cABBgCCfAwgAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDAAAYAMA AADAAAwAAGADCMgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8gAAAAAAAAAeQAA AAAAAAAAAAu0AAAAAAAAAAAAAFuhjVUYAADACDvQFAUBe0AAhgB+AExAAAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDAAAGBwAAADAAAwAABgcCAgAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAYAAAAAAAAAAMAAAAAAAAAAAAAt0AAAAAAAAAAAAAHehBVQI AADeKC9QFAcB98AARgAZADiAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDAAAF+wA AADAAAwAABfsCAgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0AAAAAAAAAAAAAF6hVVav---k0D7QFAUBb0AAMAAYAAMAAAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDAAAEAQAAADAAAwAABAECAgAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAAAAAAAAH2ghVQI AADLIC3QFAcB3cAACAAeAAQAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDAAAEAQA AADAAAwAABAEEBAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAuz-------------9ugrVVf---wwDvQFAUBe0AABgAbABgAAAAAAAAA AAAAAAAAAAAAAGAAAAAAAAAGDAAAIAIAAADAAAwAACACH-AAwAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt6qqqqqqqqqqqqqregVVao AAAAAC9QFAcB98AAAYAbAGAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAGDAAAIAMA AADAAAwAACADAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAArv-------------+6gOqv4AAAAAD7QFAUBb0AAAHAOA4AAAAAAAAAA AAAAAAAAAAAAAH---------+D----------AAA----------wAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvd3d3d3d3d3d3d3d2gAAAA AAAAAC3QFAcB3cAAAA4AHAAAAAAAAAAAAAAAAAAAAAAAAH---------+D------- ---AAA----------wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu7u7u7u7u7u7u7u7ugAAAAAAAAADvQFAUBe0AAAAH-4AAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt3d3d3d3d3d3d3d3egAAAA AAAAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAru7u7u7u7u7u7u7u6gAAAAAAAAAD7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvf-------------92gAAAA AAAAAC3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu4AAAAAAAAAAAAADugAAAAAAAAADvQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtz-------------5ef---- -----+9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0AAAAAAAAAAAAAH7VVVVVVVVVVV7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAAAAAAAAF3----- ------3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0AAAAAAAAOAAAAHu7u7u7u7u7u7vQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAAAAAARgAAAFd3d3d3 d3d3d3dQFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0AAAAAAAAgQAAAH7u7u7u7u7u7u7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAABBQAAAF3d3d3d 3d3d3d3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0AAAAAAACCgAAAHu-----------vQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAAAAACEAAAAFdAAAAA AAAAABdQFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0AAAAAAAMEAAAAH6f---------97QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAeAwIAAAAF2gAAAA AAAAAC3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0AAAAAhjAEAAAAHugAAAAAAAAADvQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAABAUACAAAAFegAAAA +AAAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0AAAABAcBhAAAAH6gAAAD-gAAAD7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAACcABhAAAAF2gAAAP -4AAAC3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0AAAACiAAAgAAAHuv---------7vQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAADBgAAQAAAFetSAgA QACAla9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0AAAAAAQwAQAAAH6qoiIQAQIiKr7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAQwAIAAAF2v---- -----63QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0AAAAAAIAAIAAAHuhwAAAAAAADDvQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAAAAIAGEAAAFegMP4H -wP4cC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0AAAAAAIAPEAADH6gDn+P-4-zgD7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAEAPEAAEl2gAY-P -5+MAC3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0AAAAAACAHIAAEnugAHPH-x5wADvQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0AAAAAABgAyAAElegAAxj -jGAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0AAAAAAAeAhgAEn6gAAOB-A4AAD7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAABxAQAIl2gAABp JLAAAC3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0AAAAAAAAOAIAInugAAD---gAADvQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0D-----4CAAEAJFegAACk gSgAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0EAAAAAECAACAJH6gAADQAFgAAD7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUF-----0CAADARF2gAACk ESgAAC3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0FVVVVVUBAABgRHugAAD---gAADvQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0F--v-60BAABgRFegAAAA AAAAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0FQBUANUBAABwRH6gAAAAAAAAAD7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUFwBsAK0BAABwRF2f---- -----+3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0FQBUANUBAAAwRHvVVVVVVVVVVVvQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0Fz---q0BAAA4SFd----- ------dQFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0FT---tUBAAA8iH7u7u7u7u7u7u7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUFzAABq0AgAAciF3d3d3d 3d3d3d3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0FTAABtUAgAAeiHu7u7u7u7u7u7vQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0F-AABq0AgAAOiFd3d3d3 d3d3d3dQFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0FXAABtUAgBAPCH7----------+7QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUFrAAB60AgBAHCF3AAAAA AAAAAB3QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0FXAAB1UAgghHkHuf---------9vQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0FrAABq0AQghDkFegAAAA AAAAAC9QFAcB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0FXAAB1UAQggh0H6vgAAAAAAAD77QFAUBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUFrAABq0AQgQg0F2v8AAA +AAAf63QFAcB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0FXAAB1UAQgQgUHuv-gAD-gAD-7vQFAUBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0FrAABq0AQwQgIFev-8AP -4Af-69QE-sB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0FXAAB1UAQwQQIH6j--j---j--j7QCVYBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUFr---q0AQoIQIF2sf-8A QAf-8a3QB-wB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0FX---1UARIIQIHuqj--gAD--irvQAAABe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0Fqqqqq0AREIQEFev8f-8 cf-8f69QAAAB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0F-----0ARCEQEH6hwD--j--gDD7QAAABb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUEAAAAAEARCEIEF2gMMf- --8YcC3QAAAB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0D-----4ARBEIEHugDnj---jzgDvQAQgBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0ACAAAIAARBEIEFegAYj- --iMAC9QAyQB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0ABAAAQAARCCIEH6gAEf---8QAD7QHRQBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUH-----8AhEGEEF2gAD-- j--gAC3QFVQB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0EAAAAAEAhIKEIHugAf-8cf-8ADvQFVQBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0EgggggkBBQRCwFegD--h JD--gC9QFVQB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0EAAAAAECCVRBAH6gf-8f-8f-8D7QHRQBb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUEEEEEEEECPhBAF2j--ik gSj--i3QAyQB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0EAAAAAEFKABVAHuv-8DQAFgf-7vQAQgBe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt0H-----8D8AA+AFev-gCk ESgD-69QAAAB98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAr0B8AAAHwAAAAAAH6v8AD---gAf77QAAABb0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvUAAAAAAAAAAAAAF2vgAAA AAAAD63QAAAB3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu0AAAAAAAAAAAAAHugAAAAAAAAADvQAAABe0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtz-------------9ef---- -----+9P----98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAArqqqqqqqqqqqqqqq7VVVVVVVVVVV7lVVVV70AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvf-------------93----- ------3f----3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt3d3d3d3d3d3d3d3d3d3d3 d3d3d3d3d3d3d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAru7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u70AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvd3d3d3d3d3d3d3d3d3d3d 3d3d3d3d3d3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAn----------------------------------0AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAP----------------------------------wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAHAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH---wK6urq6urq6uA8 AHgA8AHgD-gAAGAAAADAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAgOcBAB+APiABA AAAAAAAAAAAAD--AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAMAABQVVVVVVVVVVUD-Af4D-Ac4EAQAAZgAAAC+AAAA-8AAAAA- 8AAAB9AAP---------+gRiBAD-AQVAGwAAAAAAAAAAAAP--wAAPgAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAABwKqqqqqqqqqqH5 gnkGfg88IAIABgYAAAEB8AAAgD-wAP-AEAAA+AgAQAAAAAAAAABAhhDgH-gTJ-4M AAAAAAAAAAAAfwP4AAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAB----AA8AABQVVVVVVVVVVUJ5xnmOeR-+IiIAGAGAAAIAD4AAgAAwAMAA EAAfAAQAQAAAAAAAAABj+f1QP-wQBAAEAAAAAAAAAAAA+AB8AAMwAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB----ABUAABwOrr+urq6urqJ- x-+P+R-+JVIAYABgAAQAAGAAgAAwAMAAEABgAAIAQAAAAAAAAABAhhJIf-4TJ-4M AAAAAAAAAAAB4EAeAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABgAADAD8AABQVVWDVVVVVVUP-x-+P-xPyJVIBgAAYAAQAAGABAAAwAMAA CABgAAEAQAAAAAAAAABgRiJI0bMYdgGwAAAAAAAAAAADwKA-AAIwAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEI3YABoRuzADgAABwKqsBuqqqqqqP- x-+P-xPyJVIGAAAGAAgAAOABAABQAOAACABQAAEAQAAAAAAAAABAOcJIu1UP7ABA AAAAAAAAAAAHgBB-gAIwAAYAAAAAAAAAAAAAAAAAAAAAAAAB-4AAAAAAAAA-8AAA AAEVEUABoqIrACuqlJQVVUAxVVVVVUP+R-+J-x-+JVIYAAABgBAAAaABAABQAKAA CAB4AACAQAAAAAAAAABgAAGwu1UAAAAAAAAAAAAAAAAHAED7g--------------- -----AAAAAAAAAAeqvgAAAAAAAPVXwAAAAEcmYABo5MzADkq1RwK+oAg6urq6uOe RnmJ5x-+JVIeAAAGgCAAAyABAABwAOAACAB0AABAQHVX8AAAAABAAAGw21MAAAAA AAAAAAAAAAAPAhHzwAJwAAXAAAAAAYAAAAAAbAAAAAAAAABwEBYAAAAAAA4CAsAA AAEUUUABooorACk6thQVZ4AA1VVVVUGfgnkH5g88JVIbgAAdgEAAAqACAABQAOAA BAB+AAAgQIqoEAAAAABgAAJI21cAAAAAAAAAAAAAAAAOCSPhwAPgAAQ4AAAEAYAA AAAAbAAAAAAAAAGqqquAAAAAADVVVXAAAAHVnUABurOrADkqlRwKgYAA6qqqqqD- Af4D-Ac4JVIf4ABqgMAABGACAACQAPAABAB+AAAwQQqoH---4YBAAAJIu7cAAAAA AAAAAAAAAAAOEgfBwAPgAAQHAAAEAYAAAAAAbAAAAAAAAAZERERgAAAAAMiIiIwA AAAAAAABgAADACkqlJQVAQAAFVVVVUA8AHgA8AHgIRIe+AHVgL4ACqACAADQALAA BABtAAfQQQqoEAABlkBgAAJIf-4AAAAAAAAAAAAAAAAeKA+B4APAAAQA4AAEAYAA AAAAbAAAAAAAAAqqqqqwAAAAAVVVVVYAAAAAAAAB----ADgAABwPAQAADqqurqAA AAAAAAAAIAYf-gaqgN3wESAH-gCwANAH-gB-gPuwQgqoEAABiCBAAAFQP-wAAAAA AAAAAAAAAAAcAB8A4AfAAAQAIAAEAYAAAAAAbAAAAAAAABAQEBAYAAAAAgICAgMA AAAAAAAAAAAAACgLuBQWAAAABVVVVUAAAAAAAAAAGAwbu51VgKqvqqAG7-+QAP-7 qgB-31VwQxqqMAABgBBgAADgH-gAAAAAAAAAAAAAAAAcV--44--------------- -----AAAAAAAACqqqqqsAAAABVVVVVWAAB---+AD---8ADgKEBwKAAAABr6r6qAA AAAAAAAACBgf-+qqgP--ZGAFVVWQAPVVVgBberqwQgqoEAABvFBAAABAD-AAAAAA AAAAAAAAAAAcLHwI4D8AAAQAIAAEAYAAAAAAbAAAAAAAAERERERGAAAACIiIiIjA ABAAACACAAAEACgLEBQWAAABBcNcHUAAAAAAAAAABDAe7tVVgKqqqqAHu7vQAL7u 7gB-1VVQQqqtX---yaBgAABAB+AAAAAAAAAAAAAAAAAcVPgI4H8AAAQAIAAEAYAA AAAAbAAAAAAAAKqqqqqrAAAAFVVVVVVgABAAACACAAAEADgqEBwMAAABCwCwBuAA AAAAAAAABDAf-+qqgN3d8SAFVVWwANVVVgB-66uwQQqoEAABlkBAAAAAAAAAAAAA AAAAAAAAAAAcLfAI4PkAAAQAIAAEAYAAAAAAbAAAAAAAARAQEBAQgAAAIgICAgIQ ABAAACACAAEkACgTkBQUAAAD9gBgA0AAAAAAAAAABDAbu9VVgKqqqqAG7u6QAPq6 ugB21VVwQVqqv---4YBgAAAAAAAAAAAAAAAAAAAAAAAcV--44eEAAAQAIAAEAYAA AAAAbAAAAAAAAaqqqqqqgAAANVVVVVVQABAABiACAADEADgAABwMCBACqgAgAqAA AAAAAAAACBgf-+qqgP--5GAFVVWgAHVVVgB-+rqwQKqtUAAAAABAAAAAAAAAAAAA AAAAAAAAAAAeB8AB4cHAAAQAIAAEAYAAAAAAbAAAAAAAAkREREREQAAASIiIiIiI ABfwBiDC-gDEGCgAABQWMBAFVBBAAUAAAAAAAAAAGAwe7tVVgKqqqqAHu7vgAH7u 7gB-1VVQQHVX8AAAAABgAAAAAAAAAAAAAAAAAAAAAAAOD4ABw--------------- -----AAAAAAAAqqqqqqqwAAAVVVVVVVYABAAACOCAAEkcP----8L0BgLqBAAAaAA AAAAAAAAD-gf-+qqgN3d8SAFVVWgAFVVVgBt66uwQAAAAAAAAABAAAAAAAAAAAAA AAAAAAAAAAAOHwABw4-4AHwAIAAEAYAAAAAAbAAAAAAABBAQEBAQIAAAggICAgIE ABfwAC4C-gAFwKAAAAUVUBR1+BAAAUAAAAAAAAAAAiAbu9VVgKqqqsAG7u6gAHur qgA-1VVwQAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAPPgADwx-4APwAIAAEAYAA AAAAbAAAAAAABqqqqqqqoAAA1VVVVVVUADAAADgGAAAHAK3uwAUKqCurCCgAAKAA AAAAAAAAAiAf-+qqgP--5IAFVVWgAHVVVgAberqwQAAAAAAAAABAAAAAAAAAAAAA AAAAAAAAAAAHfAADgxycAfwAIAAEAYAAAAAAbAAAAAAADEREREREUAABiIiIiIiK ADfwACAG-gAEAKHgAAUVVFVUCCgAAMAAAAAAAAAAAiAe7tVVgKqqqwAHu7vAAD7u 7gAP1VVQQAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAH+AAHgxiMAfgAIAB8AYAA AAAAbAAAAAAACqqqqqqqsAABVVVVVVVWABAAACACAAAEAKAAAAUOq66oBEQAAOAA AAAAAAAAAiAH-+quAN3d8gAFVVXAADVVVgAH66uwQAAAAAAAAABAAAAAAAAAAAAA AAAAAAAAAAAD8AAPAxiMAPAAIADMAYAAAAAAbAAAAAAACBAQEBAQGAABAgICAgIC AB---+AD---8AKAAAAUVVVVYAEQAAMAAAAAAAAAAAiABu9VYAOqqqgAG7u7AADq6 ugAG1VVwQAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAB4AAeA--------------- -----AAAAAAACqqqqqqqqfABVVVVVVVWAAQAAIAAgAAQAL----0Kqq-4AIIAAKAA AAAAAAAAAiAAf+rgAD--5AAFVVXAADVVVgAD+r-AP----------AAAAAAAAAAAAA AAAAAAAAAAAA+AB8AxiMAAAD4AGYAYAAAAAAbAAAAAAAFERERERETgACiIiIiIiJ AAQAAIAAgAAQAIAAAAEVVVgIAIoAAMAAAAAAAAAAAiAAHtWAAAH6qAAH-7uAAB7v -gAB1fgAKqqqqqqqqqqgAAAAAAAAAAAAAAAAAAAAAAAAfwP4AYyMAAAH4ADwAYAA AAAAbAAAAAAAGqqqqqqqqAADVVVVVVVVAAf--4AA---wAIAAAAEK6vAEAIoABqAA AAAAAAAAAiAAB+4AAAAP8AAAAf+AAB-4AAAA-wAAf----------gAAAAAAAAAAAA AAAAAAAAAAAAP--wAYSYAAAP4AAAAYAAAAAAbAAAAAAAEBAQEBA8EAACAgICAgID AAAAAAAAAAAAAH----4VVWACAJIAAUAAAAAAAAAAAiAAAdgAAAAAYAAAAAAAAAAA AAAAYAAAd3d3d3d3d3dgAAAAAAAAAAAAAAAAAAAAAAAAD--AAMCYAAAPwAAAAYAA AAAAbAAAAAAAGqqqqqrDoAADVVVVVVVVAAAAAAAAAAAAADAAAAwKqsAAAEQCAKAA AAAAAAAAAiAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAbu7u7u7u7u7gAAAAAAAAAAAA AAAAAAAAAAAAAf4AAHDwAAAHgAAAAYAAAAAAbAAAAAAAFERERESAoAACiIiIiIiJ AAAAAAAAAAAAAAAAAAAVVUAAADgCAMAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAXd3d3d3d3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--------------- -----AAAAAAAGqqqqvkAQAADVVVVVVVVAAAAAAAAAAAAAAAAAAAO-sAAAAACAGAA AAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO7u7u7u7u7ugAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAD+BAQEQcAIAB-AgICAgID AAAAAAAAAAAAAAAAAAAVgeAQAAAFAEAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAf----------gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAA AAAAAAAAAAAEDqqqqgIAIACB1VVVVVVVAAAAAAAAAAAAAAAAAAAOABgQAAAFAGAA AAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA AAAAAAAAAAAAAAAAADhAAAAAAAAAAAAH8AAAAAAAAAAIAkRERgQAIAEASIiIiIiJ AAAAAAAAAAAAAAAAAAAUAAAQAAAJAEAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAP---------+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHxAAAAAAAAAAAAM eAAAAAAAAAAAASqqrAgAAAAAJVVVVVVWAAAAAAAAAAAAAAAAAAAMAAAoAAAIgGAA AAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAHxAAAAAAAAAAAAcPAAAAAAAAAAAALwQFAgAAAAAF4ICAgIC AAAAAAAAAAAAAAAAAAAYAAAoAAAIgEAAAAAAAAAABBAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHxAAAAAAAAAAAB- -wAAAAAAAAAAAMOqrAgAAAAAGHVVVVVWAAAAAAAAAAAAAAAAAAAIAABIAAAUQGAA AAAAAAAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAfAAAABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAADiAAAAAAAAAAAAeHAAAAAAAAAAAAIDERAgAAAAAEBiIiIiK AAAAAAAAAAAAAAAAAAAYAACIAEAUQEAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQAAAB-wAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAP +AAAAAAAAAAAAAA6rAAAAAAAAAdVVVVWAAAAAAAAAAAAAAAAAAAQAACIAEASQGAA AAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAH-8AAABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEgAAAAAAAAECAgIE AAAAAAAAAAAAAAAAAAAQAAEEAEAIgEAAAAAAAAAAEAQAAAAAAAAAAAAAAAAAAAAA AAAAAAAAX---------9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAGqgAAAAAAAADVVVVUAAAAAAAAAAAAAAAAAAAQAAFEAKAHAGAA AAAAAAAAEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWpAQAIABAStAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQQAAAAAAAABIiIiI AAAAAAAAAAAAAAAAAAAQAAJCAKAAAEAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAA AAAAAAAAVUREIAIERFVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAACqoAAAAAAAABVVVVYAAAAAAAAAAAAAAAAAAAIAAKCASAAEKAA AAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX---------9AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAiAgIQ AAAAAAAAAAAAAAAAAAAYAAKCARAAEMAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQ4AAAAAAABhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABrAAAAAAAAAA1VVVQAAAAAAAAAAAAAAAAAAAMgAJiARAAEaAA AAAAAAAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGH8D-4H8OBAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSAAAAQAAAAAoiIig AAAAAAAAAAAAAAAAAAAXAAEEAigAC0AAAAAAAAAABBAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQBz-H-8f5wBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAD6AAAAIAAAAB9VVVAAAAAAAAAAAAAAAAAAAALAAD4AigADuAA AAAAAAAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAMfn-8-GABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGAAAAIAAAACDAgKA AAAAAAAAAAAAAAAAAAAVAAAAAkgADUAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQADnj-484ABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAACAAAAIAAAAAB1VUAAAAAAAAAAAAAAAAAAAALAAgAARAACqAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAYx-xjAABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAIAAAAAAyIoA AAAAAAAAAAAAAAAAAAAVgAgAAOBADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQAAHA-gcAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAgAAAIAAAAAAVVwAAAAAAAAAAAAAAAAAAAAOgAgAAABADqAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAA0klgAABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAIjAA AAAAAAAAAAAAAAAAAAAVQAgAIAGADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQAAB---wAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAIAAAQAAAAAAFcAAAAAAAAAAAAAAAAAAAAAKsDwAcAaAGqAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAABSQJQAABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAgAAAAAADwAA AAAAAAAAAAAAAAAAAAAVXFQB3j1gFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQAABoACwAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAK7+sC6+rwKuAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAABSCJQAABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCAAAAAAABAAA AAAAAAAAAAAAAAAAAAAVVVX9VVVf1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQAAB---wAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAADwB8AAAAAAAB4AAAAAAAAAAAAAAAAAAAAAKqqqqqqqqqqAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAAAAAAABEAA AAAAAAAAAAAAAAAAAAAVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAQAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAEEAAAAAAAAACCAAAAAAAAAAAAAAAAAAAAAOrq6urq6urqAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP----------AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAACAA AAAAAAAAAAAAAAAAAAAVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAKqqqqqqqqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAEAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAKqqqqqqqqqqAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAACAA AAAAAAAAAAAAAAAAAAAVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD58AAAAAAAAAAAAAA AAAAAAAAAA---1VV---8AB-+AAV1dXV1dXV1cAADAAAAAAAAAAAAAAHwAAAAA-wA AAf-----+AAAAACAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAfAAGPGAAAAAAAAAAAAAAAAAAAAAAAA---+7u---8ACABAAqqqqqq qqqqoAADAAAAAAAAAAAAAAP4AAAAHAOAAAgAAAAABAAAAACAAAAAAACgAAAAAAAA AAAAAAAAAAAAAAAAA-wAAAAAAhgAAAAAAAAAAAAD4AABgwAMGDA---4AB---wAD- --gAH---AA--3VVVX--8AF-+gAVVVVVVVVVVUAADAAAAAAAAAAAAAAI8AAAAYABg AAv-----9AAAAA-4AAAAAAFQAAAAAAAAAB-AAAAAAAAAAAAAHAOAAAAABSRAAAAA AAAfAAAMGAACAIAYmRhAAAEACAAAIAEAAAQAIAAAgA----qqv--8AL--QAqqqqqq qqqqoAADAAAAAAAAAAAAAAUcAAAAgAAQABf-----+gAAAH--AAAAAAKoAAAAAAAA AOA4AAAAAAAAAAAAZDBgAAAABUmAAAD4AABgwAAQBAAEAEAZAhhAAAEACAAAIAEA AAQAIAAAgA--VVVVVX-8AX--oAdXX9dXV1dXUAADAAAAAAAAAAAAAAQcAAABAAAI ABf-----+gAAAf--wAAAAAVUAAAAAAAAAwAGAAAAAAAAAAABikiYAAAAFIoAAAMG AACAIAAgAgAIVCAZgxhOHDkACcOHIAE4cOQAJw4cgA--7qiIrv-8Av--0AqqsGqq qqqqoAf--4AAAAAAAAAAAAIOAAACAAAEABYAAAAAGgAAA---4AAAAA-+AAAAAAAA BAABAAAAAAAAAAACCpMEAAAACoDgAAQBAAEAEABCoQA4qjgYABhRIkUAC+RIoAFE +RQAKJE+gA-9VVVVVV-8Bf--6AVVYDdVVVVVUAgAAEAAAAAAAAAAAAEFgAAEAAAC ABYAAAAAGgAAB---8AAAAAAAAAAAAAAACAAAgAAAAAAAAAAEKRQCAAAANQCAAAgA gAIVCABFUQBBcQQYABhRIkUAC+RIoAFE+RQAKJE+gA--6qAAAr-8C---9AqqoBiq qqqqoAgAAEAAAAAH-gAAAAPgQAAEAAACABZE7gAAGgAAD---+AAAAAP-AAAAAAAA EAAAQAAAAAAAAAAIFQHBAAAAGv-AABCoQAIqiAGLiMBc8mQMgjBRIkUAC+RIoAFE +RQAKJE+gA-1VVVVVVf8F---+gV9QBB1dXV1cAjDDEAAAAB6q+AAAASgIAAI+GPh AC5tKQAAHQAAD---+AAVUD1V8AAAAAAAIBVAIAAAAAAAAAAQagEAgAAAH--AABFU QARcRAIHkCBJfSQMRDBRIkUAC+RIoAFE+RQAKJE+gA-+6IAAAK-8L----QqzwABq qqqqoAkkkkAAAAHAQFgAAASikAAIzGMxACxtKUAADQAAH----AAaoOAgLDVAAAAA ICqgIAAAAAAAAAAgNf+AQAAAMszAACLiIAg8ggIL6CBI-iQGOGBRIkUAC+RIoAFE +RQAKJE+gA-VVVVERVX8XGDGHoVAwAB1VVVVUAkkkkAAAAaqqq4AAAJSSAAIzGMx ACxVDwAADQAAH----AAVQ1VVVxqAAAAAQFVQEAAAAAAAAABAP-+AIAAAEP-AACHk IBBfQQLH8aBxfRwDAMBRIkUAC+RIoAFE+RQAKJE+gA--qgAAACv8W7u67oqAgAAK qqqqoAkkkkAAABkRERGAAAExDAAQ+GPggCxVbgAADQAAGOHDjAAajIiIiM1AAAAH gK+oCAAAAAAAAABAZZmAIAAAEvnAAEL6EBI-iQLL6aCIqiIBgYBRIkUAC+RIoAFE +RQAKJE+gA91VVUQFVV8W-u67oeAgAAHVVdXUAkkkkAAACqqqqrAAACXigAQzGMA gCxFKkAADQAAEECBBAAVFVVVVWaAAAAIAV7UCAAAAAAAAACAIf+AEAAADAEAAFH8 UBZfTQLFUaCIVCIAwwBRIkUAC+RIoAFE+RQAKJE+gA-+qAAAAAr8W-u67osAAAAC qqqqoAkkkkAAAEBAQEBgAAD8CQAQzGMAgFxFKwAADoAAAACAAAAaICAgIDNAA4B4 AL9oRAAAAAAAAACAJfOAEAAAAgaAAJL6SBYqjQRCoRB0AFwARgBRIkUAC+RIoAFE +RQAKJE+gA-VVUREBFV8Xfu67oUAAAADX1X1UAkkkkAAAKqqqqqwAAEAEQAQzWsQ gFhF6QAABoAAAACAAAAUVVVVVVmAA4B44V-UJAAAAAAAAAEAGAIACAAAAkCAAJFU SBYVDQRgAxACAIAAZABRIkUAC+RIoAFE+RQAKJE+gA-7oAAAAAL8Xvu6HosAAACC 4a4OoAkkkkAAAREREREYAAEf4QAQAAAAgFgAAAAABoAAAACAAAAYiIiIiIzAA4B0 gL-oJAAAAAAAAAEABA0ACAAADz0AALCoaCMAGIOQBOABOQAALABRIkUAC+RIoAFE +RQAKJE+gA9VVVAAAFVcX3u6-oYAAACFgFgDcAkkkkAAAqqqqqqsAADgAQAQAAAA gFgAAAAABoAAAACAAAARVVVVVVZAA4B0gV-USAAAAAAAAAEB-IEACAAAEf4AQKgA qCKAKIAJyAByRJwAOABRIkUAC+RIoAFE+RQAKJE+gA-uiAAAAAD8X7u6-ooAAAH7 ADABoAjDDEAABEBAQEBCAACAAgAQP--AgFgAAAAABoAAAACAAAACICAgICEAAcDi QK+okAAAAAAAAAICJnoYBAAAMwF+gRQBRBxkxwASJAAsgmgAMABRIkUAC+RIoAFE +RQAKJE+gA-VVUQAAEVcX7u6-oYECAFVABABUAgAAEAABqqqqqqqAAEAHYAQAAAA gFgAAAAABoAAAACAAAADVVVVVVUAAcDiQFVQkAAAAAAAAAICC-w4BAAANIL-4RMm RAAqgAAKKAARARAAIABOHDkACcOHIAE4cOQAJw4cgA-+oAAAAAC8X7u6-osYCAKq ACAAoAgAAEAACRERERERAAEM6uAQP--AgFgAAAAABoAAAACAAAAEiIiIiIiAAcDk ICqhIAAAAAAAAAIElgJwBAAAMn7+gOFUOAAqgAAZTAAKAKAAAABAAAEACAAAIAEA AAQAIAAAgA9VVVAAABVcW7u6-oXoDAXUAAAA0A1rWsAACqqqqqqrAACDVVAQAAAA gFgAAAAABoAAAACAAAAFVVVVVVWAAOHEIBVCEAAAAAAAAAIEGQXgBAAAPQAUQAZT AADKYABggwAGAMAAAABAAAEACAAAIAEAAAQAIAAAgA-+iAAAAACsXHvG-oqoCjr8 AAAAoAgAAEAAEEBAQEBAgABBqrgQP--AgFgAAAAABoAAAACAAAAIICAgICBAAOHE MAACEAAAAAAAAAIGNP3QBAAAPvhkABggwAMEGAD-f4AAAAAAAABAAAEACAAAIAEA AAQAIAAAgA-VVEQAAEVcL----QVUFdWEAAAAUAgAAEAAGqqqqqqqgADxVVgQAAAA gFgAAAAABoAAAACAAAANVVVVVVVAAOHDyAACEAAAAAAD8AIEEgA4BAAAAgRYAD-f 4Af7-AAAAAAAAAAAAABAAAEACAAAIAEAAAQAIAAAgA-6oAAAAAA8F---+gqqKqoE AAAAYAgAAEAAMRERERERQAGoqqwQAAAAgFgAAAAABoAAAACAAAAYiIiIiIigAHOA BgAB4AAAAAABDwIEl-DcBAAAAgPAAAAAAAAAAAAAAAAAAAAAAABAAAEACAAAIAEA AAQAIAAAgA9VVVAAACqsC---9AdV11QCAAAAcAgAAEAAKqqqqqqqwANUVVQQAAAA gFgAAAAABoAAAACAAAAVVVVVVVVgAHOAAYcOAAAAAAAAgP-------AAAAh-AAAAA AAAAAAAAAAAAAAAAAABAAAEACAAAIAEAAAQAIAAAgA-uiAAAAAFcBf--6AqqqqwA AAAAYAgAAEAAIEBAQEBAQAKrCqwQAAAAgFwAAAAADoAAAACAAAAQICAgICAgAHOA AEiQAAAAAAAAh8AAAAAAA+AAA-MAAAAAAAAAAAAAAAAAAAAAAABAAAEACAAAIAEA AAQAIAAAgA-VVUQAAIqsAv--0AVVV-wAAAAAUAgjVkAAKqqqqqqqwANVhVYQAAAA gCwAAAAADQAAAAHAAAAVVVVVVVVmAD8AAEf4AAAAAAAAuAAQfEAAABwAAh8AAAAA AAAAAAAAAAAAAAAAAABADVkACAGrIAEANWQAIAasgA-+oAAAAABcAX--oAqqrAQA AAAAYAhWVUAAURERERERIAKrOqoQAAAAgCwAAAAADQAAAAHIAACoiIiIiIiVAD8A ACAIAAAAAAAAwAAGxoAQAAMAAgEAAAAAAAAAAAAAAAAAAAAAAABACVUACAEqoAEA JVQAIASqgA9VVVQAACqsAL--QAV1eAIAAAgDUAgjVUAAaqqqqqqqoANWVVYQAAAA gCwAAAAADQAAAAHcAAE1VVVVVVVWgD8AACAIAAAAAAADAAAAfAAAAADAAQIAAAAA AAAAAAAAAAAAAAAAAABAGNUACAMaoAEAY1QAIAxqgA-+qAAAAAFcAF-+gAqqsAEA AAgAoAgGNUAAQEBAQEBAYAKrqqwQAAAAgC4AAAAADQAAAAH8AAKgICAgICA1QB4A AB+MAAAAAAAH-----------gARIAAAAAAAAAAAAAAAAAAAAAAABAAAEACAAAIAEA AAQAIAAAgA-VVVRAAIqsACABAAVVYAAAABgAUAgAAEAAaqqqqqqqoANVVXgQAAAA gC4AAAAAHQeAAAH8AAU1VVVVVVVWoB4AAAJKAAAAAAAA1VVVVVVVVVcAAhIAAAAA AAAAAAAAAAAAAAAAAAA---4AB---wAD---gAH---AA--qoAAAABcAB-+AAqqoAAA ADAAYAf--4AAURERERERIAH--8Af----gBYAAAAAGhjAAAD4ABqoiIiIiIiVYB4A AAH0AAAAAAAAPqqqqqqqqvwADCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA-1VVUAACqsAAAAAAd-YAAAIDAAMAAAAAAAaqqqqqqqoAAAAAAAAAAA ABYAAAAAGmBAAAAAAA01VVVVVVVWwAAAAAAAAAAAAAAAAf9VVVVVf4AAEkgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-+6IAAAAFcAAAAAArA8AAA GPACIAAAAAAAQEBAQEBAYAAAAAAAAAAAABYAAAAAGoBAAAAAAAagICAgICA1gAAA AAAAAAAAAAAAAAH-----gAAAEbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA-dVVRIiKqsAAAAAAcADAAAFzACMAAAAAAAaqqqqqqqoAAAAAAAAAAA ABf-----+oBAAAAAAAM1VVVVVVVXAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--oAAAAAF8AAAAAAoAAAEA IBgCIAAAAAAAURERERERIAAAAAAAAAAAABf-----+wBAAAAAAAGoiIiIiIiWAAAA AAAAAAAAAAAAAAAAAAAAAAAADCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA-1VVUUAqqsAAAAAAYAAADDwBgEMAAAAAAAaqqqqqqqwAAAAAAAAAAA AAv-----9ABAAAAAAAC1VVVVVVVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--7IgAABH8AAAAAAwAAAA+ ABgIIAAAAAAAYEBAQEBAQAAAAAAAAAAAAAgAAAAABACAAAAAAAAwICAgICAgAAAA AAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA-9VVVUSqq8AAAAAAQAAAADAAwwMAAAAAAAKqqqqqqqwAAAAAAAAAAA AA-------ACAAAAAAAAVVVVVVVVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--+qIAAAVcAAAAAAwAAAAB gA3AIAAAAAAAMRERERERQAAAAAAAAAAAAAHAAAAA4AEAAAAAAAAYiIiIiIigAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA--VVVVSqq8AAAAAAgAAAAAwAwAMAAAAAAAKqqqqqqqwAAAAAAAAAAA AAHAAAAA4AEAAAAAAAAVVVVVVVVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--7uiICJJ8AAAAAAgAAAAA 4AYAIAAAAAAAMEBAQEBAgAAAAAAAAAAAAA-------AEAAAAAAAAYICAgICBAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA-91VVVVVVcAAAAAAgAAAHDMAYAMAAAAAAAGqqqqqqqgAAAAAAAAAAA ABAAAAAAAgEAAAAAAAANVVVVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA---6ogiK-8AAAAAAgAAAA8 GAYAIAAAAAAAGRERERERAAAAAAAAAAAAABAAAAAH8gIAAAAAAAAMiIiIiIiAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA--dVVVVVV8AAAAAAQAAAAADAMAUAAAAAAACqqqqqqrAAAAAAAAAAAA ACTMzMzFUQIAAAAAAAAFVVVVVVWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA---u6oiK78AAAAAAwAAAAA BgMAYAAAAAAADEBAQEBCAAAAAAAAAAAAACAAAAASqQQAAAAAAAAGICAgICEAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA--3VVVVVX8AAAAAAZAAAAAAwMA0AAAAAAABqqqqqqqAAAAAAAAAAAA AEmZmZmyqPgAAAAAAAADVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA----qqqr-8AAAAAAuAAAAA AYGBoAAAAAAAAxEREREUAAAAAAAAAAAAAEAAAAABVIAAAAAAAAARiIiIiIoAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA--9VVVVVX8AAAAAAWAAAAAf8GBcAAAAAAAAaqqqqqoAAAAAAAAAAAA AJnMzMzB-EAAAAAAAAAo1VVVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA----7u7v-8AAAAAAqAAAAA MAGeoAAAAAAAAMBAQEBQAAAAAAAAAAAAAIAAAAAAAEAAAAAAAAA0YCAgICiAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA---dVVVV38AAAAAAWABAAAGADNUAAAAAAAAGqqqqqgAAAAAAAAAAAA AP-------8AAAAAAAAAqNVVVVVEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA---------8AAAAAArABAAA DADaoAAAAAAAADERERFAAAAAAAAAAAAAAQAAAAAAACAAAAAAAAA1GIiIiKKAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA---3VVVX-8AAAAAAdABAAABh-1UAAAAAAAABqqqquAAAAAAAAAAAAA AQAAAAAAACAAAAAAAAAqjVVVVcUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA---------8AAAAAAqgBAAQ AwyqoAAAAAAAAA5AQEYAAAAAAAAAAAAAAP-------8AAAAAAAAA1RyAgIwqAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA----3d3f-8AAAAAAVYHgA4MY1VUAAAAAAAAAOqqrgAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAqodVVXBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA---------8AAAAAAquKgDs aMaqoAAAAAAAAAD5EeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1UHyI8GqAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA-----3---8AAAAAAV39YF33+Z1cAAAAAAAAAA--gAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAA-4B--AP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA---------8AAAAAAqqqv6q vgOqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVVVwNVUAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqq q5+qoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaoAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAdXV1dXV81XUAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqq qu6qoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVVVX1VUAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqq qr6qoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAccAAAAAAAAADzwAAP-- -wAAAAB-gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAIIAAAAAAAAAMMMAAwAAAMAAAAf-8AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALoAAAAfwAAAQACABAAA ACAAAB--+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAABoLAAADgOAAAg-BACAAAABAAAD---AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEQwAAMABgABAAAgCIr6 PBAAAP---AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAICgIAAQAAQABAzAgCIqCIhAAAf---AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAEAAgAAIACJMkQCFKC IhAAB----AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAgAACABAAAEACVAqQBCLiIiAAD---+AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAKoBACAAFSAClMpQBCKC IiAAH---8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABAVUBACAAKqACk-JQAiKCIkAAP---4AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAqqAgE44VVACkAJQASL7 vIAAf---wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAEBX1AQEQQr7AClAJQAQAAAIAA-----8AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECvagQEQRXtAClfJQAIAA AQAB----4DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAIhftCIEQQv3AClgJQAEAAAgAD----4EIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCv6hIEQRX9AClAJQAEAA AgAH-w--8AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAJBf9BIEQQv-ACUAKQACAABAAP8A--8PAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiv6iQEIhX9AEMAMIABAA CAAPAA--+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAACRX1EgEFAr7AIKAUEABAACAAcAA---AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQqqEgCCAVWAIJMkEAAgA EAAwAA--+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABIVUJACAAKqAERSiIAAQAIAAgAAf-4AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEKoQgBAAFUADhShwAAQA IAAAAAP-wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAACEAAQgAgAAIAABSgAAAIAQAAAAAf-gAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAQgAQAAQAABSgAAAEA gAAAAA--AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAB4AAPAAMABgAACSQAAAEAgAAAAB-+AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDhwAACAOAAAChQAAACB AAAAAD-+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAkSAAABDwAAAChQAAABCAAAAAH-+AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkSAAAAkgAAAChQAAAA8 AAAAAP++AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAkSAAAAkgAAAChQAAAAAAAAAAf88AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkSAAAAn2AAA8hPAAAAA AAAAA-48AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAABChAAAAoNgADChQwAAAAAAAAB-w0AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAgAABACQAMASAMAAAA AAAAD-gHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAB+-AAAD-+wAP-z-8AAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA-----4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-----4AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA-----4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAwGCDMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4OHDMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA8eHDMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA++NjMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA32NjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzmfzMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAxGfzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwG4bP4AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAwGwbP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-----4AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA-----4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-----4AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA. _>:LCpA1BCnA3CCxA9BC5BDBC-BLBDLBTCDRBZBDZBhBDpBnBD tBtCD-B3BEJB7BERCBBEPCHCEbCLBEpCXBEzCdBE5CjCFHClBFLCrBFdCzBFpC5C FxC9BFxDBBGBDJBGPDNCGVDTBGZDVBGZDXBGZDXCGZDXBGZDXXCr DLBCvDLCC3DHBDHCzCDRCnBDfCXBDtCNCD7CDBEBB7BELBzBEdBjCEpBdBE5BZBF JBVBFRBRCFhBNBFhBNBFtBJBFxBHCF5BFBF-BDBGBBDBGHBD:MA vDBBAvDBBA1C-CA9C9BBFC7BBHC7CBHC7BBHC7BBHC9BBHC9CBHDBBBHDBBBHDBB BHDBCBHDBBBRDBBBlDBBBxDBCB-DBBCHDFBCHDJBCPDPCCTDVBCXDbBCfDlCCnDz BCrD5BCvD9BCtEFCCtEJBChERBCbEVCCPEZBCNEdBBvEfBBnEhCBnEhBBnEfBBnE dBBPEZCBHEVBBDERBA1ENCAtEHBAlEDBAhEBBAbD7CAVD3BALDtBAHDnCAHDhBAH DbBAHDRBAHDPCAHDNBANDLBAPDHBAVDBCAVC9BAfC5CArC3BA3C1BA3C1BA3C1CA 3Cz1FvG3BFvG3CFvG1BFzGzBF7GxCGRGnBGbGhBGfGdBGpGXCG3G RBHJGBBHPF7CHPF1BHNFxBHRFnBHTFhCHTFbBHVFZBHTFVBHRFTCHPFRBHNFRBHH FRBHHFRCHHFRBHHFVBHDFhBHBFnCHBFtBHBFzBG-F7BG-GLCG-GRBG-GZBG9GhCG 9GtBG7GzBG5G7BG7HBCG5HBBG5HBBG5HBBG7G7CG9GxBG-GlBG-GhBHBGdCHBGZB HDGVBHHGRCHLGNBHPGLBHbGJCHhGJBHlGNBHnGPCHlGTBHnGXBHnGdBHnGhCHlGl BHlGpBHlGvCHlG3BHnG5BHrG5BHvG5CHvG5BHzG3BH3GzBH-GrCIDGnBIHGhBIJG dCINGZBIPGPBIRGPBIRGPCIRGPBIRGPZIXFtBIXFtBIRFpCINFpB IPFrBIPFtBINFxCINF1BILF5BINF7BIPF9CITF9BIXF7BIbF5BIdF3CIdF3BIdFx BIbFvCIbFvBIbFvBIbFvkIrGRCIvGPBJBF9BJJF3BJLFxCJNFtBJ RFnBJTFhCJTFhBJTFhBJRFlBJLFrCJBF5BI-F-BI7GDBI5GJCIzGVBIxGbBItGhC IrGpBIpGxBIrG1CItG5BIrG7BIxG7CJFGzBJPGtBJRGpBJbGjCJtGTBJ3GJBJ9GB CKDF5BKJFnBKJFfBKJFbCKHFZBKHFZBKFFZBKBFfCJ9FlBJ3F1BJ1F9CJzGFBJxG LBJrGTBJnGhCJlGnBJjGrBJhGxCJhG1BJhG5BJfG5BJfG5CJhGzBJjGtBJlGlBJn GhCJtGXBJxGTBJ3GNCJ7GLBKFGLBKJGNBKLGPCKLGRBKLGVBKJGZBKDGnCKDGtBK DGzBKBG9CKDG-BKBHBBKDG-BKHG7CKPG1BKZGpBKhGjCKlGdBKpGZBKtGNBKrGJC KnGJBKjGJBKfGJBKbGNCKTGVBKTGZBKTGfCKTGlBKTGtBKZGxBKdGzCKjG3BKjG5 BKtG1BK7GtCK-GnBLJGhCLLGVBLRGPBLTGJBLTGFCLTGFBLTGFBLTGFBLRGJCLNG RBLNGVBLNGZBLNGZCLNGZBLNGZBLRGbBLTGdCLbGdBLjGdBLrGdCLpGfBLrGfBLr GfCLrGfBLpGhBLlGjBLjGnCLjGpBLhGrBLdGxBLfG1CLhG3BLjG5BLjG5CL1G5BL -G3BMDGzCMLGxBMTGtBMbGnBMbGjCMZGfBMZGZBMVGXBMPGVCMLGZBMHGdBMDGhC MBGnBL-GxBMBG5BMFG9CMLG-BMLHBBMPHBCMjG5BMxGzBM7GpBM9GhCNJGNBNJGL BNJGLBNJGLCNJGLBNHGDhIrFpBItFrBIzFtBI7FxCI7FzBJBF1BJ HF3CJNF5BJLF7BJJF9CJLF9BJNF9BJRF-BJTF-CJXGBBJZGBBJbGBCJbGBBJbGBB JbGBBJbGBCJbGBBJbGBBJbGBBJbGBCJbGB Subject: what's the use Content-Type: TEXT/PLAIN; charset=ISO-2022-JP Message-ID: Sender: news@u.washington.edu (USENET News System) Organization: University of Washington Mime-Version: 1.0 Date: Sun, 3 May 1992 23:07:57 GMT Once again, Scott Turner drops another clueless and mendacious tirade. It's obvious he hasn't made more than a cursory glimpse of the MIME document. It's equally obvious he knows nothing about the specifications of Internet mail as described in RFC-821 and RFC-822 [those *are* standards, even NeXT uses them]. However, it doesn't stop him from making any number of absurd, false, and downright foolish statements. He's just as clueless about the meaning of the Japanese word `gaijin', yet that too doesn't stop him from making a racist assumption of its meaning and proceeding on that. この糞っ垂れ When challenged to put his code where his big mouth is, all he does is go on about how he is `too busy making $$$' and `does not have enough time' to do so. In other words, the standard retreat of the nasty little net.geek who probably is in Programming I. It's not worth it. If anyone believes what Turner has to say, then PT Barnum was right about what was born every minute. ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.32.msg ================================================ X-Andrew-Authenticated-As: 0;bambam.galaxy;The Root of All Evil Return-Path: Received: from greenbush.bellcore.com by bambam.bellcore.com (4.1/4.7) id for andrew; Wed, 3 Jun 92 13:20:09 EDT Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for andrew@bambam; Wed, 3 Jun 92 13:20:07 EDT Received: from savage.bellcore.com by thumper.bellcore.com (4.1/4.7) id for andrew@greenbush; Wed, 3 Jun 92 13:19:59 EDT Received: by savage.bellcore.com (4.1/4.7) id for localmsgs@thumper; Wed, 3 Jun 92 13:20:02 EDT Received: from Messages.8.5.N.CUILIB.3.45.SNAP.NOT.LINKED.savage.galaxy.sun4.41 via MS.5.6.savage.galaxy.sun4_41; Wed, 3 Jun 1992 13:20:01 -0400 (EDT) Message-Id: <8e=Dx1S0M26IE17rlY@thumper.bellcore.com> Date: Wed, 3 Jun 1992 13:20:01 -0400 (EDT) From: Tom Brinck X-Andrew-Message-Size: 323+1 Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="Interpart.Boundary.ge=Dx0m0M26IQ17rd0" To: msgs Subject: misdirected chinese mail > THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME. > Please read the first section, which is plain text, and ignore the rest. --Interpart.Boundary.ge=Dx0m0M26IQ17rd0 Content-type: text/plain; charset=US-ASCII I received a magazine in Chinese in the mail (I think from Taiwan). Here is a picture of the characters that I believe represent the name of the recipient. If this is your name, come and get it in room 2A219. [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] -- Tom ---------------------------------------------- Tom Brinck Bellcore (201) 829-5238 hammer@bellcore.com --Interpart.Boundary.ge=Dx0m0M26IQ17rd0 Content-Type: multipart/mixed; boundary="Alternative.Boundary.ge=Dx0m0M26II17rZy" --Alternative.Boundary.ge=Dx0m0M26II17rZy Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable I received a magazine in Chinese in the mail (I think from Taiwan). Here is a picture of the characters that I believe represent the name of the r= ecipient. If this is your name, come and get it in room 2A219. --Alternative.Boundary.ge=Dx0m0M26II17rZy Content-type: image/x-xbm Content-Description: Push here to see your name Content-Transfer-Encoding: quoted-printable #define chinese-name_width 80 #define chinese-name_height 20 static char chinese-name_bits[] =3D { 0x00, 0x10, 0xa0, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xdf, 0x1f= , 0xac, 0xb8, 0x00, 0x08, 0x08, 0x20, 0x00, 0x00, 0x50, 0x00, 0xf8, 0x70= , 0x00, 0x08, 0x48, 0x20, 0x00, 0x00, 0x50, 0x08, 0xe0, 0x78, 0x00, 0x48= , 0x7f, 0x20, 0x20, 0x00, 0xd1, 0x0f, 0x18, 0x8b, 0x00, 0x7f, 0x14, 0xfe= , 0x3f, 0x00, 0x5f, 0x00, 0xf8, 0xff, 0x01, 0x08, 0x72, 0x10, 0x00, 0x00= , 0x41, 0x08, 0x04, 0x82, 0x00, 0x08, 0x41, 0x10, 0x00, 0x00, 0xc1, 0x0f= , 0x00, 0x02, 0x00, 0x1c, 0x60, 0xf0, 0x0f, 0x00, 0x51, 0x20, 0xfc, 0xff= , 0x01, 0x1c, 0x62, 0x28, 0x08, 0x00, 0xdf, 0x3f, 0x00, 0x07, 0x00, 0x2a= , 0x22, 0x48, 0x08, 0x00, 0x51, 0x00, 0x00, 0x07, 0x00, 0x2a, 0x32, 0x48= , 0x04, 0x00, 0x50, 0x11, 0x80, 0x0b, 0x00, 0x0b, 0x14, 0xc8, 0x02, 0x00= , 0x50, 0x1a, 0xc0, 0x0a, 0x00, 0x09, 0x0c, 0x84, 0x01, 0x00, 0x50, 0x0e= , 0x40, 0x12, 0x00, 0x09, 0x1c, 0x84, 0x01, 0x00, 0x50, 0x06, 0x20, 0x32= , 0x00, 0x08, 0x36, 0x46, 0x02, 0x00, 0x58, 0x19, 0x18, 0xc2, 0x00, 0x08= , 0x73, 0x73, 0x0c, 0x00, 0xce, 0x18, 0x00, 0x02, 0x00, 0x88, 0x00, 0x00= , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00= , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00= , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; --Alternative.Boundary.ge=Dx0m0M26II17rZy Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable -- Tom ---------------------------------------------- Tom Brinck Bellcore (201) 829-5238 hammer@bellcore.com --Alternative.Boundary.ge=Dx0m0M26II17rZy-- --Interpart.Boundary.ge=Dx0m0M26IQ17rd0-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.33.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Thu, 4 Feb 93 17:27:17 EST Received: from joyce.cs.su.OZ.AU by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Thu, 4 Feb 93 17:27:12 EST Date: Thu, 4 Feb 93 17:27:10 EST From: bob@sarad.cs.su.oz.au Message-Id: <9302042227.AA17392@thumper.bellcore.com> Received: from sarad.cs.su.oz.au (for thumper.bellcore.com) with MHSnet; Fri, 05 Feb 1993 09:27:08 +1100 To: ggm@cc.uq.oz.au, nsb@thumper.bellcore.com Cc: bob Subject: sending files via email Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="qwertyuiop123" --qwertyuiop123 Content-type: text/plain This sums up my feeling about using (non-MIME) email to carry files! Bob. --qwertyuiop123 Content-type: image/gif Content-Transfer-Encoding: base64 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 dlIIb0zUJir4dkJIaomnbA2Ye16YdGvoVC43hpM3XiwoeqOHedUEhr7AU1ZIhmkYhzOYU5hG hftmiPKne4WYeFzYhWWIOIwIb1rHfFKHhJaIhX44hUF4eqckXCn/+IlvSGmSOImNyIebmIUR WIqQeIqtt4N7GFZheIU8x4bQh4momIpwuIp/qFi1yIpFyGGyOIuYaIZ0eGfDSIxMZozHuFd5 qEbM2IyLxYv9RouuqHM5CHfAeIskdo1fp4qZOI6cSI2AB47PCE6vmIyal4VuOIivE47YiIxK OEftGIpbNlbzSI/RyIEIJmzqiIbVmH/+NWjmCI9Qhojk2G3bo3jvh2MLaWQ50FXCaITimH0T 2T92Y5GLp5DOh49WJTa35nXBJZEdCVcj2URx6H8n+ZAN2TlnFgwQaVhlh5I6YD8ySYp3iF0g qYcQlJPfRIJ+xVg+kD1EUzTdaIs9WVkF/1QdkqSRGVlRbfCSHjkikCaCGlht2uiOvRGSCVlb 2vdxF1kjXAmWWimGuRWFBJWVaMmIX+mNbDmUbll673KW/9SWdCkjcNl2n8GPeumInUVhcziX gHmTgKWM9SSQhmmW0ZSN1PGXjAmFlCh0MCiZCPmYR0h1nciYw8eZ95Q7NGmY1nSPeXaIrueT GTSZgwmaDOmLfumSRbWarJlNp3kl9XhE77iU6xiaNwiZuIlSs/mI66iFn6krmRmcurmbqGmZ AKSIuamc+SiKckmWeHGOLiec13lX1GmVihmX8padz4mS3CmarKINOmOKtHmT5OmbDIKcG5ee w1mVqZlI3UmYsf/JLrAon4dpkyHWnOyJnvH5nSlonXkJGvgJNj+ZmA+TUIV5nKPoUgpKmb+I oP5ZnZvyVDUloexoQBPloPMBbXwVmK8onShzoTEohyu5oVwljQexmO4JnOAyonbZlSZqn+zW l01DkGF0hvV3o4mYokA4o9nVoxh4oigqRBmZmpj3n0XZpOghgxX6k425nD5anppZPRJEn03F n0XagT+KoxQipWlpoPr4oUi6oHxVbM5Zpr8pni4lCg71pJuSpgtnlAc6p3Q6oW1YLxwKYVdq fO8ZnRLzd3J6pNInqPMJlInKf3lqIXs6qM8piN/VoGd6m+WoqH6Kf/aIqWbqqDD6mgvK2KkF WKVO+qn3GaQ/9ouACKgAeagyFaqiCjXj0aivGqY5mp0U2gOzZauXOqbmuJMwaaq9WnGuCnAX 5EeWqoEW90H1Caad2XdbOqQ1eplUaoDTqKwQ6JSJZaHE+nPECUI4KUVt2pOTGlnB+qLh2aLN gaqQWpeXJJbeqoD7qZ8UuYzySoD3dkUB54DPSpcuklK62qzc2KqjmWoCK3J4eKpfpaXkE1js 2Z7VKrGYSYgTa7F8WaoXK0PRurBsyrEfC7IhK7IjS7IlSwgFAAA7 --qwertyuiop123-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.34.msg ================================================ Path: flop.mcom.com!news.Stanford.EDU!agate!howland.reston.ans.net!news.sprintlink.net!wn.aksi.net!news From: ohm@aksi.net (Ohm) Newsgroups: alt.sex.fetish.feet Subject: nylon feet by request - ind_111.jpg [1/1] Date: 25 Apr 1995 23:25:47 GMT Organization: Ohm LTD. Lines: 186 Message-ID: <3nk0dr$adp@wn.aksi.net> NNTP-Posting-Host: d137.aksi.net Mime-Version: 1.0 Content-Type: Image/JPEG Content-Transfer-Encoding: x-uue X-Newsreader: WinVN 0.93.14 begin 755 ind_111.jpg M_]C_X``02D9)1@`!`0$`2`!(``#__@"45E0M0V]M<')E*R8M+2HF*BDP-D4Z,#-!,RDJ/%$¥04=) M34Y-+CE46E1+6D5+34H!#`T-$@¥2(Q,3(THQ*C%*2DI*2DI*2DI*2DI*2DI* M2DI*2DI*2DI*2DI*2DI*2DI*2DI*2DI*2DI*2DI*2DI*2O_``!$(`4,`D@,! M(0`"$0$#$0'_Q`&B```!!0$!`0$!`0```````````0(#!`4&!P@)"@L0``(! M`P,"!`,%!00$```!?0$"`P`$$042(3%!!A-180'EZ@X2%AH>(B8J2DY25EI>8F9JBHZ2EIJ>HJ:JRL[2UMK>X MN;K"P¥3%QL?(R;GZ.GJ¥?+S]/7V]_CY^@$``P$! M`0$!`0$!`0````````$"`P0%!@<("0H+$0`"`0($!`,$!P4$!``!`G<``0(# M$00%(3$&$D%1!V%Q$R(R@0@40I&AL<$)(S-2¥!5B7J"@X2% MAH>(B8J2DY25EI>8F9JBHZ2EIJ>HJ:JRL[2UMK>XN;K"P¥3%QL?(RKR¥_3U]O?X^?K_W0`$``#_V@`,`P$``A$#$0`_`.:( MY'%(RJ0<@4SF14D0QN-H^4_I2D`^O/&,4AHQY+0.:4(?+¥P]SBAFB5Q`=K9!Y'I3QME8;OD8_Q8./QJ=BXZJPIADSM12X]5!P M:E2RN&QA0/K0V+DU)TTN5¥!I$3W;./T%6$¥-W+¥QS0L#T()_PJ>8KD&2^'+] M,¥1L/]DG_"J+19YH8U/[L`9;OS4.1U0CH MR[;^'(P,N"_UZ5H0:-$GW8U'T&*SZ8A4N%_"BY-BIIMHL M=_O`YVX!Q76V(XQ4MZE)61Y7¥1RI¥87`!!(1`<'I¥HKF*ZX[(X9;L[$GY<#- M(1¥N*9RB`$$<5$!ME)LY/¥`2F(7:,=*8V.PQ2`KRRF/Z&JTER1Z8^E4AD1N%//¥ M51Q7OD3JX^[T(]J!,T;95>^D=3D%5P:V8EQ'D#%2#/(/B*P;Q?<8()"(#[?+ M7,UV1V1P2W9V!X/'-(#D?XUH<@AXK4¥.*'NFR.*!E!B58J>U1,QX[^]6@.A¥.9EC)/;BM^4!8_Z5!+/&?B`ZOXKG*D$A%!Q MVXKG*[8[(X7NSKR,_P#ZJ,8%4<@UN36GH)V7!8>M8U=CMPGQ,[_3F$B*3T(X MJ¥8P0:Y3O*LJ;"350OAL9H)%60$XIQ.3_6@H1ADY%1MP/¥*9)&X&W//-9MT@ MCDSV-`T4+I>/,'7H:IALD#/%4@.M¥-0[+16ZEB35[49UCB8],>M20SQKQC)Y MNOR-G)V+^'I^F*Q*[8[(XGNSL"!0?UJD0 MI-;.>3QQ7,>@R*;!7-9-UP210B49JWF+H+U/>KJ2G(+=:DHE$H(XYIID!..E M,3(V('%5+S!B/L:8+[. MP[#B@GY:KH]=`"&7H:YCT&1 MR#CI67=)@GBA","9DM[_`,R3`&#CZU(FHQD;G<*!ZFDT6A3JEOG`D4GV-"WZ M.0%(/TH$R7[2`N2>?K56YGW*!GD_RIB1G2398(@))Z`#)-6=#T^¥FU7?<6TD M$2#($@Y8^M-`SN3MBM_I7)W¥RO>2S$¥#Y%/MWIK<>)YTN-7:2-@PV@<= ML$UDUUK8Y'N=AC@=O2D8¥`8_2J1RB8S¥M:6@)B>0_P"T/Y"L:NQTX7XSK;8X M=<5NVIR!7*>BR9D]JSKM.#Q30C`OK2*>9!(N12)IMJ@SY*_D*;*0R;3[5UP8 ME_[Y%8U_ICVZF2RU)>WEF5 M?NA"HQ]2:;HVK:IK4K,D<=K!_"#DD_4¥?I6J6A'4WRODK^]E+M[¥"LS5MQ MTX7XSJ;;@CI6]8=!P:Y'N>B:17(!QBL^^4X-.VA,3G[SJ..])#"TS@=JEFJ- M..R7R¥50U&W,0W`<4T+J8=_9BY418^^0/UK83[-I-E@D1@+TX``'OZ5I'56, MY-(YO4=>EF8II[%!_%<-U/¥`NC^M8P1`2S,6+'+,3DDUM&)YU6=V.+(O3%'F M@`8`]ZT,$86MN'O%(()"`'V.36?0=$=CL3G;3,<=*#G%`YQ6EHH_?-QW'¥JS MGL=.&^,Z>VX9:WK'G':N9[GHFJ!¥HJA?#*'_``ILB)SUX/WJCMFIK/[WRC`/ MI6;-T;,$>(¥]JS=78-"15(1ASMY,2S!YZ)M`#RQ5"]`P?TILSAN<_/&9+I5'KDUHVMNJ@+CDUGU.A;%[`2("LG4,$& MJL(Q+X;;=QZ*:X4V¥C')?'T%=%+8¥[%;H46H]6-/6UC'45J<;)5@0`84`U*L M2XQ@4!Q]O"@YVH`?;DUG4SHC¥*.P`^7N:3&/7VH,`(S]*U-"4>-N#S7*STC<0@Q"J5VHVDXJF9PW,2-0;UB1T%:,)!? MI4=3H6P^9L*:SYUW@DTQ,Y_7&$5G,W0!":Y/J!QQ732V/,Q7Q("O3C/UI<8X MS6C.0=MYXS3@.#G^5`6.=UX@Z@`"#A`#STZUG4SIA¥*.P`^7IUHQQP#08"X` M%:NA8,[?7^E9U-C?"_&=7C$8(Y^M7['D#UKE>YZ:-N$9AZ5!=#]V:IF2W.?' M_'^0!VS6O;H%4''-0;]!)D#>HJC.NT$4".2¥5RE+/RQUE<)_C7.CGGI7727N MGF8GXQWH,4H''"&J>QE'XC`MP3?2'Z"M=5(&*@W8K+U)JC=X"Y'^%%B3B/%#[[JWC]"S M_EQ_6L;`8QTIPQ3.=CQC&*0_7O5`<[KQ!U#`(X0`CTK.H. MF.QU2ME1QQ3L@#IQ08]1._XU:TMS'JL)`^5LKG¥/_K5$UH:T/C1W<)W0XK0T MX8QV%.:;V,H?$S&TM-UQ(V.K5M,HXQ4&TMR)@-N,5G7 MF=IXH$<#KS[]8()!"1@#/N2?¥*H$¥>M=L5H>55UFQ1GL.:,@]1^%-(Q8X'D# ML*<`"O/¥Z8TE9]!T1V1U2BEP".G%!B,)QT&![4Z.0QR)( M<_(ZG¥,C-*:T+I:31Z#8G=$.>W:MBP7I7&SU3=@`¥HU1OP/+--[&4/B9FZ*A MP6]6)_6M4U!J]R*7&*RK[[K?2FMP.!U3/XV/& M`HP!4>,-Z"@S$![>OI4J_=QBF"W.=U¥@ZC@$<(,X[5FT'1'9'5(I"XZ"ESQB M@Q&A1G^E(Z@JR¥8(Q2>PXZ-';^&Y_M.FP2=25&<>O?¥`6NGL5.0*XV>LC;@' M[HU1U+B%B>PJGL94_C*6BKB!>.2.:O/ZUF:OJ@_K6>AXKM6QY-3XF2%@H[<"F;@S`#BJ,QDI"G'>GQ¥X."!]:3!&!KQ!U'Y M2.$&?:LZF=$=D=8!F,9HQ@=*1BQ`,¥B@)C¥:8D=!X/G*QRP'_ED_`]CR/ZUW M>F_,0:Y);GK1=XIFY&,0UEZR^RSD(Z[<`4F32^(;I:!8U'H*LR*2>*DM_$1. MO!X_&LV[&`?¥*2*.!¥3C&HKCIL_J:RL547OL5FP.3FE!`QVQ3,VB M&0EFP/7TJ2%F!`ICL8FN,#?¥$'"#/ZUGT&¥=CK-I1BIZ@X-+BD8,;P!B@$9& M:8D:&@S&'6-A^[*GZC_ZU>F:*-T8.*YIK4].E_#1N'A!6%KSCRDC_ON!_7^E M9R'16I;TY?D'TJPP&:13^(BD%9MV,@D4BNAY_P")H;N;5`+6`2`(,DN!SDUG M+I>J-]Y+>,>IDS^@%=BV//G'WF3#1+]O]9=(HHW=W.`.!DFMB/0[Y@&DFA@_V<&0C¥<@4"4`&FSV-W:W)N/.4 M2A2!"$P#QZFO4]`0?95)'O6$_B.ZG_#->3A:YS6&)O[=>V2:QD50-2PZ?A4K M#K04_B(I?NFLVZ/RD4%(Y[RDENI6(R00#_G¥:D%J@)PF,<]JZH[')):L?Y2G M!``'O3A$,```$^E`AWEX!X(QTIRQ''')ZF@#S;X@LI¥1*JL"5@4,,_=.2<'T MX(/XUS56B6>R&$@DABJGT/6LB^¥,Z?>3F:1'21N69&QG¥.E-%6)=,¥.:?8R^ M9%$[2C@22')_#TK5$&,<_A2%8CN;421XX&""./>NQT=!'9(/:L)_$:Q^`NR' MH*Y[6AMO(&]R*R9K1-33¥;>/Y5.PY-'0)?$5Y0-OK67?,`I-26C&L2K+-)R0 M9&Z'TX_I5@A-P+QQDBH#G`SGUI0I/&,<¥4D`C`9&!DYYI^Q1C@TP/ M,OB*R'Q&BHP)2W4,!_"W,`2>":;LR`%`..2<4EL6&"1 M@C@>AJ0)@C$P8#:,@;LC^==59#;"JXQ6,_B-5¥))(3G(KGM>?,D([AJS9 MK21IZ87D5BZHVV)CZ5*6H]D9^G1[+*/*¥L-V,^O/¥`6K07 MY^,>U=9R#D7(/)]Z>H(PN@GH`4&9!MY+`YKI;9@L0)/)K"?Q&¥5[HDTNU23VKG]88,Z'W%9LV@K& MGIK<#%:##/K03/1D$@P#7/ZX287`ZD$"G'X@?PLDAC"QJG]T`5(!CGJ#V%=) MR"$$G"C'J*18SN)!:@&/VX]!_*FJH+9Z#WI`>8?$MT;Q,BJZL4MU5@#DJ=S' M!_`@_B*Y2M$2]SW-F;)'('IBA0&)P/KQ4F@T@@D!#@>E'S#"C/'3/:@D0MLF MC.22W-2:0-G2V!5?I6OCB MA$SW()!P:P-54M)&H&6?$UU;Q.BJREDMU5P#RIW,<'T."#^(KDJM; M$L]Z,9W$!O]*Z>R MB(ARW6L&O>.C:`]T`P:YS6(<2G`[¥5)4"SI39C4UNC[@J4%3E+@#"],?G2`0IDY)/ MTS3EP>0>1[T`>5?$YT;Q/&JNK,ELH<*<[3N8X/H<$'¥17(UHMB6>^'E0,`+^ M=`4LAQG/LM2:$;`<`'=GT%,5`,@XR>*(U5E+);*&"G.T[F.#[X(/XBN1K1;$O<]]<8Q¥H--;&3E<9[#I4%C63Y@ M1P2>@H=BK;2VW/M0(K,O^EQK_DUUD)P@&*P>YT/X4#$9Z8J"50R$&H'$P;4F M+5)HN@W;ABNBMVR`,YH1=0BOE_=GM7/V2[[Z>3'*@*/¥_E5T]S*?PFBH920Y M&![8%`P0&V¥5N8H>`",`#'IC%(J[0,84]L4A#L#&&/7D4I11C.!3&>2_%-T; MQ3&J.K%+9%8*<[3N8X/H<$'¥:X^K6Q#W/H!D`QU&3^-(V`<#&?6H-$'RJ"S+ MCCBHMIZX&.^31U)*L`:35-K'H173,Y3`Z5S/_%7;Z["748/"CG.:Y7N=L5H2BY#AR.,#C!YJ& MWNXVBM*QD+N/¥:!R-"4X4COBLBU#.9-V M,;SQ6M/M:F(O!SE^G0=J>F%`+'D_CBD(5B MFWCEO4=Z:AZ,2=XE^23L1GBJ=J M!YDJJ2#NS@>__P"JM*>YE4^$LA`6)QC]:"AQM)&.X`K4YP;@Y0D>WK2¥GAL? M44"`HQ(`S@>AYI=IR5;@BA#/)?BRZ-XKA1'5FCM$5P#DJ=S'!]#@@_B*XNM% ML2SZ1:,"(9W$CN2`:@D5¥;0&/<8']:@L@;[Q9L$]!QTI2I&05*Y]>,TD!@ZU M:ZBLZW.FQ13/C:¥+N%R/4'_/6L5]<,]:VFH=FXUA+ZGC*9XX[_P#UZJGN15^$ MT450CD'GKC%(6.S[I8CL!6QS=1_/`QD_3%#H!¥RX-(+"H%!X'UIWE[FZ?G3` M¥@^+CQOXNC6-U8I:H'`;.T[F.".W!!Q[Y[UQ-:+8EGTNVUQ@D;A_GI4$B*'X MW'CO699`(LG;D''K37C*D*,`DYRHXH0#)8/DP05#<9IHB=%VQLZC''./SI6$ MF-6,HV%Y//,BX5B2![=JW+&,@@=!7/+%`X![_P#ZJJ&Y-3X34)V`!%X'IWI1SW'KCI6QS#V[,<[C M0RECQT'?M2`1D(.X$_4"GL,!-F,]S3$>/?%MT;Q7`B2*[16B*P4@[3N7Y!SU]:EZ%P5V M,TVV¥N)>/O5N0(%0>IK!G4-G.W(-4].&VZN&P0"%[?6K@15^$T<`¥@@8/84J M`;B>_IWK8YB159EW8P>O-!&%Y.?44@$(&M,#QWXO/&WBZ%( MY%=H[1%<*<[3NO'7VH4%254@^HS698TX96 M`(/J<=*B,7R¥]/3-,!&4!`QY)]!^5,"EHR`B[>QQS2%U*LJ*'RPP!VQ6*76_ MNS,B8C7Y8QCKZFLY&M):FQ%"$=$'¥(J['P.E9=3=E:]+;<9R/6FQ¥LE)`.R2>.@I^-KX5@ M0:8'C?Q@D1_%T*HZEH[1%=002AW.<'T."#]"*X>M%L2SZ>=2QP#DX[4S&^,C M&/J>?TK,H?L`0X(S[4T*`N-V>/3BF!$Q&YF`RH'E//R$#`7CMWI@>.?&&1'¥7PJCJ6CLT5U!R4.YS@^AP M0?H17#5HMA,^HCCR¥%L9ZD@5"PS@#^$<5F6*-R`9;-#`XR./QH0B-).JD$9[ MXS3)`VT@(>>]`&/J-M(L0EMQEP>F>M4(M0¥JQ>W9"K,,9Z5E):G52>EBVE_% M)''%%&5QU.:>UU^_50IPO)]ZS-4B&YNI"3M8K[5KZ3&8;',HR¥C;C[5I!:&- M;L6RP*GY1GH*(3A2"I'IWK0YA<#/."*>6/`Z<=:!,4(,E^2!ZTJ@-R@!QZT` M>-?&.2-_&$*1R*[1V:*X5L[3N M:P-;TQG`GMS¥P'3UJ&M#2#LS&MY-O+$JW<5:A,[$NI7'J.]96.Q,FA_TBYBC MV¥EN:ZJ-49N%_,9K6"LCFK/WA!M8E2#@=:$8!=K8'?@59@."[BV1M]#BG<;> M[-ZT@&C)4DD¥#&!4D0V],C-"$>-?&22-_&,*)(K-%9HKA3DJ=SG!]#@@_0BN M$K5;"9]0N=Q(7(.<4X¥`¥$8K,LB09YW#O@8P:%+ECD<#VH1(-E3GAN.@IJL! M'N=0I^M#&(X+L#U4=JA:)6&",+S@=:0&5>Z+%.3(&V,3T[&J¥&@3QY5KZ),] M`BECC¥34..IT*=C4L-+AM9#¥[R.5Y=B.?H*O%C&GRCIZ¥U:T,9.['J3AMR@^ ME1XW,68M@?P]0*9(]9,MGG/;L3^%(XZ_A2$.5&7/>E*L1D'!QP.E M'4#QKXPRQR>+;=4D5WCLT60*1E6WN<'T."#]"*X:M5L)GT¥78,<''(%.!R,$ M]>OYUF6-3MR>?>G,2(¥CKZT(3(>H;/:COCMZ4`*_&,<9J/`&<"@!-H¥]AC@# MBFQ_._S¥_(#^-(8]/NGD¥5&K,P.X]S38NI(Q*+E202/Z5):.V,9ZTF!.0-@X M[U',`$0CC).:`',,!<=Z9-V';;_C0(¥9^+LL Reply-To: Internet-Drafts@CNRI.Reston.VA.US NNTP-Posting-Host: ux1.cso.uiuc.edu Mime-Version: 1.0 Content-Type: Multipart/Mixed; Boundary="NextPart" Originator: daemon@ux1.cso.uiuc.edu --NextPart here are a couple of external bodies: --NextPart Content-Type: Multipart/MIXED; Boundary="OtherAccess" --OtherAccess Content-Type: Message/External-body; access-type="mail-server"; server="mailserv@ds.internic.net" Content-Type: text/plain Content-ID: <19950424144009.I-D@CNRI.Reston.VA.US> Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948541830.21002.5@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 ENCODING mime FILE /internet-drafts/draft-smith-ipatm-bcast-00.txt --OtherAccess Content-Type: Message/External-body; name="draft-smith-ipatm-bcast-00.txt"; site="ds.internic.net"; access-type="anon-ftp"; directory="internet-drafts" Content-Type: text/plain Content-ID: <19950424144009.I-D@CNRI.Reston.VA.US> Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948543400.21002.6@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 --OtherAccess Content-Type: message/external-body; access-type="URL"; url="http://home.netscape.com/ people/ jwz/ index.html" Content-Type: TEXT/HTML Content-ID: Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948549480.21002.7@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 --OtherAccess Content-Type: message/external-body; access-type="local-file"; name="/some/directory/loser.gif" Content-Type: image/gif Content-ID: Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948550940.21002.8@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 --OtherAccess Content-Type: message/external-body; access-type="afs"; name="/afs/directory/loser.gif" Content-Type: image/gif Content-ID: Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948552090.21002.9@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 --OtherAccess-- --NextPart-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.36.msg ================================================ Path: flop.mcom.com!news.Stanford.EDU!agate!tcsi.tcs.com!uunet!vixen.cso.uiuc.edu!gateway From: Internet-Drafts@CNRI.Reston.VA.US Newsgroups: info.ietf Subject: I-D ACTION:draft-smith-ipatm-bcast-00.txt Date: 25 Apr 95 15:09:13 GMT Organization: University of Illinois at Urbana Lines: 96 Approved: Usenet@ux1.cso.uiuc.edu Message-ID: <9504251109.aa04587@IETF.CNRI.Reston.VA.US> Reply-To: Internet-Drafts@CNRI.Reston.VA.US NNTP-Posting-Host: ux1.cso.uiuc.edu Mime-Version: 1.0 Content-Type: Multipart/Mixed; Boundary="NextPart" Originator: daemon@ux1.cso.uiuc.edu --NextPart A New Internet-Draft is available from the on-line Internet-Drafts directories. Title : IP Broadcast over ATM Networks. Author(s) : T. Smith, G. Armitage Filename : draft-smith-ipatm-bcast-00.txt Pages : 7 Date : 04/24/1995 This memo describes how the IP multicast service being developed by the IP over ATM working group may be used to support IP broadcast transmission. The solution revolves around treating the broadcast problem as a special case of multicast, where every host in the subnet or cluster is a member of the group. An understanding of the services provided by draft-ietf-ipatm-ipmc-04.txt is assumed. Internet-Drafts are available by anonymous FTP. Login with the username "anonymous" and a password of your e-mail address. After logging in, type "cd internet-drafts" and then "get draft-smith-ipatm-bcast-00.txt". A URL for the Internet-Draft is: ftp://ds.internic.net/internet-drafts/draft-smith-ipatm-bcast-00.txt Internet-Drafts directories are located at: o Africa Address: ftp.is.co.za (196.4.160.2) o Europe Address: nic.nordu.net (192.36.148.17) Address: ftp.nis.garr.it (192.12.192.10) cd mirrors/internet-drafts o Pacific Rim Address: munnari.oz.au (128.250.1.21) o US East Coast Address: ds.internic.net (198.49.45.10) o US West Coast Address: ftp.isi.edu (128.9.0.32) Internet-Drafts are also available by mail. Send a message to: mailserv@ds.internic.net. In the body type: "FILE /internet-drafts/draft-smith-ipatm-bcast-00.txt". NOTE: The mail server at ds.internic.net can return the document in MIME-encoded form by using the "mpack" utility. To use this feature, insert the command "ENCODING mime" before the "FILE" command. To decode the response(s), you will need "munpack" or a MIME-compliant mail reader. Different MIME-compliant mail readers exhibit different behavior, especially when dealing with "multipart" MIME messages (i.e., documents which have been split up into multiple messages), so check your local documentation on how to manipulate these messages. For questions, please mail to Internet-Drafts@cnri.reston.va.us. Below is the data which will enable a MIME compliant mail reader implementation to automatically retrieve the ASCII version of the Internet-Draft. --NextPart Content-Type: Multipart/Alternative; Boundary="OtherAccess" --OtherAccess Content-Type: Message/External-body; access-type="mail-server"; server="mailserv@ds.internic.net" Content-Type: text/plain Content-ID: <19950424144009.I-D@CNRI.Reston.VA.US> Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948568940.21002.10@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 ENCODING mime FILE /internet-drafts/draft-smith-ipatm-bcast-00.txt --OtherAccess Content-Type: Message/External-body; name="draft-smith-ipatm-bcast-00.txt"; site="ds.internic.net"; access-type="anon-ftp"; directory="internet-drafts" Content-Type: text/plain Content-ID: <19950424144009.I-D@CNRI.Reston.VA.US> Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948570390.21002.11@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 --OtherAccess-- --NextPart-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.37.msg ================================================ Message-ID: <31C105ED.41C62@netscape.com> Date: Thu, 13 Jun 1996 23:25:49 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: attached image cache test (test 2: inline disposition) Content-Type: multipart/mixed; boundary="------------167E2781446B" X-Mozilla-Status: 0001 Content-Length: 3748 This is a multi-part message in MIME format. --------------167E2781446B Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-Description: a message with a text/plain body Message-ID: <31C10324.41C62@netscape.com> Date: Thu, 13 Jun 1996 23:13:56 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: test message one (a message with a text/plain body) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit This is the first attached message. --------------167E2781446B Content-Type: image/gif; name="one.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif" R0lGODdhpAAoAPAAAP///wAAACwAAAAApAAoAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3nuhP0frCT/HpBkK8I+RmUyM2xyXgipFALtbq8AphYirb63RK73nF2zOUe hgt2W52Ar6VMuTgsux7ZQ7P4HEfkdgf4BtRAtTdIyHijRwd52Bg5J/lXqIDXeCeZ2OlX82jp +VlaeYq5iRrlR7qqOiM61do6a4rpmgkaOEp7m0oj+/o1SHnWZ/mq28tciYwjnJo73Rxhx2mb DawTvWmsugiLuAucKw4Naj5ppm6bPL4LZ35t0z2P9m3YyRPfX328Joc9X876HFv07EEdYgQL kouR0I3ENOxKJXQ2waC+M0Ph6JFxguzdx5EVHpE8eaEfypUZkz1kCZOXx5g0a9q8iTOnzp08 e/r8CTSo0KFEix4oAAA7 --------------167E2781446B Content-Type: image/gif; name="two.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.gif" R0lGODdhmgAwAPAAAP///wAAACwAAAAAmgAwAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3n+s73/g8MCoeBojFAPCqVQ4axCXgapNEiVEEVWg/Z7ZXr1Say0S+CDESe w2XzNHx8e+Njeh0tZzfwy+rTnqfWQvYXtyRYJXfnN7eFh6WXByYIVxhpQkhlp9lI2bk2GfHo F/q25omYkonY9an4Sgob6zDKSXm6uLKKWzrFO2v7u3cJ7MjKNjqy2zt76lp8mLqQLGV4nJos sizbqtZtyjxBbYX0lxt+st0cLMuITUwLz8R43p6OXHnd+z2d3S99x5u6ZijU8Yu1SZ4mUfCg /UN3752+fdEEHnLmzx4kRlCQyGX0cNFdoJGwOoWcBDDgvH4c/zV0gxEQTJiZZtpMVOfmTHw6 bZ7sCTSo0KFEixo9ijSp0qVMmzp9CjWq1KlUq1qNUAAAOw== --------------167E2781446B Content-Type: image/gif; name="three.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="three.gif" R0lGODdhqAAzAPAAAP///wAAACwAAAAAqAAzAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3n+s73/g8MCofEovGIrASWzMCwCY0CoEkHs3g1ZKfLw7aq+Aa7XrLWeUaD w2ahOp1Qi9dw4pt7l7fp9TS6WbaHJzh4F0i4MBfohwAI2PgIqUgidkUV9UZW2UVVNxmHWNjJ iOdplvUZsnm61cqqBwu5CPEZ+YWKO8ule7Iq+dvnGttX+lDbdstKbIkcCuLLewtcTJ1syHa9 3HxtTe1dAq3Nbft6KGUc2s1rfonp/BHurT6f+c5wXJ+fiJhqEq9ebc8oYhPwTftGcN2Kf9t0 AQRlD1uDh4oiScrWS2BDZoeahFlpFcFgNH4gSU1RwVCfn3Pu8ln8iJEiyYGYUtQstDJnMFg3 D9FyB7Ejrpc+sWFc05KP0okalzoFxeap1F2ypkrtaTWr1q1cu3r9Cjas2LFky5o9izat2rVs 27p9Czeu3K4FAAA7 --------------167E2781446B Content-Type: image/gif; name="four.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="four.gif" R0lGODdhmgA5APAAAP///wAAACwAAAAAmgA5AAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3n+s73/g8MCofEovGITAIDzGZg6IxGlYbm0ZrAKrVE7oFJBXiF42q4vAQj nuKzuop1fsdTRd0ub3jZ+L02L2YFOOL3NCXFFwiXGGgIGPfWt8bY6BjJhQlJ+VHI9/j2Byqa OKpXmnW6OEmqNhhSuBqrOts453kZuSqFyhjK+jtnAmsra0ZM61vMe8yMjAusMkxb25fqi8iQ uVycCZ0iTT2tKfs8sbfN3K18Aq7u3OuKtnC+ntwsL9Je/r5uuzmfSxK3fdPY5XLHr1Kzal9M /RvobRC+VwcJhkOkaZc/UXwTFUo8ZM9gnZF57oTaeGfRQ4wPUvp719EIxodhoFSsSSVgQJxd 4PHMqfGn0KFEixo9ijSp0qVMmzp9CjWq1KlUq1q9ijWr1q1cu3r9CtZpAQA7 --------------167E2781446B Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-Description: a message with a text/plain body Message-ID: <31C10333.167E2@netscape.com> Date: Thu, 13 Jun 1996 23:14:11 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: test message two (a message with a text/plain body) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit This is the second attached message. --------------167E2781446B Content-Type: message/rfc822 Content-Disposition: inline Content-Description: a message which contains a message (which contains a message, which has a text/plain body) Message-ID: <31C106F6.59E22@netscape.com> Date: Thu, 13 Jun 1996 23:30:14 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: a message which contains a message (which contains a message, which has a text/plain body) Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-Description: a message which contains a message (which has a text/plain body) Message-ID: <31C106E3.15FB2@netscape.com> Date: Thu, 13 Jun 1996 23:29:55 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: a message which contains a message (which has a text/plain body) Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-Description: a message with a text/plain body Message-ID: <31C106D2.794B2@netscape.com> Date: Thu, 13 Jun 1996 23:29:38 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: a message with a text/plain body Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Foo! --------------167E2781446B Content-Type: text/html Content-Disposition: inline And this is some HTML --------------167E2781446B-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.38.msg ================================================ Message-ID: <31C105ED.41C6@netscape.com> Date: Thu, 13 Jun 1996 23:25:49 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: attached image cache test (test 1: attachment disposition) Content-Type: multipart/mixed; boundary="------------167E2781446B" X-Mozilla-Status: 0001 Content-Length: 3748 This is a multi-part message in MIME format. --------------167E2781446B Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: attachment Content-Description: a message with a text/plain body Message-ID: <31C10324.41C6@netscape.com> Date: Thu, 13 Jun 1996 23:13:56 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: test message one (a message with a text/plain body) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit This is the first attached message. --------------167E2781446B Content-Type: image/gif; name="one.gif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="one.gif" R0lGODdhpAAoAPAAAP///wAAACwAAAAApAAoAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3nuhP0frCT/HpBkK8I+RmUyM2xyXgipFALtbq8AphYirb63RK73nF2zOUe hgt2W52Ar6VMuTgsux7ZQ7P4HEfkdgf4BtRAtTdIyHijRwd52Bg5J/lXqIDXeCeZ2OlX82jp +VlaeYq5iRrlR7qqOiM61do6a4rpmgkaOEp7m0oj+/o1SHnWZ/mq28tciYwjnJo73Rxhx2mb DawTvWmsugiLuAucKw4Naj5ppm6bPL4LZ35t0z2P9m3YyRPfX328Joc9X876HFv07EEdYgQL kouR0I3ENOxKJXQ2waC+M0Ph6JFxguzdx5EVHpE8eaEfypUZkz1kCZOXx5g0a9q8iTOnzp08 e/r8CTSo0KFEix4oAAA7 --------------167E2781446B Content-Type: image/gif; name="two.gif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="two.gif" R0lGODdhmgAwAPAAAP///wAAACwAAAAAmgAwAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3n+s73/g8MCoeBojFAPCqVQ4axCXgapNEiVEEVWg/Z7ZXr1Say0S+CDESe w2XzNHx8e+Njeh0tZzfwy+rTnqfWQvYXtyRYJXfnN7eFh6WXByYIVxhpQkhlp9lI2bk2GfHo F/q25omYkonY9an4Sgob6zDKSXm6uLKKWzrFO2v7u3cJ7MjKNjqy2zt76lp8mLqQLGV4nJos sizbqtZtyjxBbYX0lxt+st0cLMuITUwLz8R43p6OXHnd+z2d3S99x5u6ZijU8Yu1SZ4mUfCg /UN3752+fdEEHnLmzx4kRlCQyGX0cNFdoJGwOoWcBDDgvH4c/zV0gxEQTJiZZtpMVOfmTHw6 bZ7sCTSo0KFEixo9ijSp0qVMmzp9CjWq1KlUq1qNUAAAOw== --------------167E2781446B Content-Type: image/gif; name="three.gif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="three.gif" R0lGODdhqAAzAPAAAP///wAAACwAAAAAqAAzAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3n+s73/g8MCofEovGIrASWzMCwCY0CoEkHs3g1ZKfLw7aq+Aa7XrLWeUaD w2ahOp1Qi9dw4pt7l7fp9TS6WbaHJzh4F0i4MBfohwAI2PgIqUgidkUV9UZW2UVVNxmHWNjJ iOdplvUZsnm61cqqBwu5CPEZ+YWKO8ule7Iq+dvnGttX+lDbdstKbIkcCuLLewtcTJ1syHa9 3HxtTe1dAq3Nbft6KGUc2s1rfonp/BHurT6f+c5wXJ+fiJhqEq9ebc8oYhPwTftGcN2Kf9t0 AQRlD1uDh4oiScrWS2BDZoeahFlpFcFgNH4gSU1RwVCfn3Pu8ln8iJEiyYGYUtQstDJnMFg3 D9FyB7Ejrpc+sWFc05KP0okalzoFxeap1F2ypkrtaTWr1q1cu3r9Cjas2LFky5o9izat2rVs 27p9Czeu3K4FAAA7 --------------167E2781446B Content-Type: image/gif; name="four.gif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="four.gif" R0lGODdhmgA5APAAAP///wAAACwAAAAAmgA5AAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3n+s73/g8MCofEovGITAIDzGZg6IxGlYbm0ZrAKrVE7oFJBXiF42q4vAQj nuKzuop1fsdTRd0ub3jZ+L02L2YFOOL3NCXFFwiXGGgIGPfWt8bY6BjJhQlJ+VHI9/j2Byqa OKpXmnW6OEmqNhhSuBqrOts453kZuSqFyhjK+jtnAmsra0ZM61vMe8yMjAusMkxb25fqi8iQ uVycCZ0iTT2tKfs8sbfN3K18Aq7u3OuKtnC+ntwsL9Je/r5uuzmfSxK3fdPY5XLHr1Kzal9M /RvobRC+VwcJhkOkaZc/UXwTFUo8ZM9gnZF57oTaeGfRQ4wPUvp719EIxodhoFSsSSVgQJxd 4PHMqfGn0KFEixo9ijSp0qVMmzp9CjWq1KlUq1q9ijWr1q1cu3r9CtZpAQA7 --------------167E2781446B Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: attachment Content-Description: a message with a text/plain body Message-ID: <31C10333.167E@netscape.com> Date: Thu, 13 Jun 1996 23:14:11 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: test message two (a message with a text/plain body) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit This is the second attached message. --------------167E2781446B Content-Type: message/rfc822 Content-Disposition: attachment Content-Description: a message which contains a message (which contains a message, which has a text/plain body) Message-ID: <31C106F6.59E2@netscape.com> Date: Thu, 13 Jun 1996 23:30:14 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: a message which contains a message (which contains a message, which has a text/plain body) Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: attachment Content-Description: a message which contains a message (which has a text/plain body) Message-ID: <31C106E3.15FB@netscape.com> Date: Thu, 13 Jun 1996 23:29:55 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: a message which contains a message (which has a text/plain body) Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: attachment Content-Description: a message with a text/plain body Message-ID: <31C106D2.794B@netscape.com> Date: Thu, 13 Jun 1996 23:29:38 -0700 From: Jamie Zawinski Organization: Netscape Communications Corporation, Mozilla Division X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) MIME-Version: 1.0 To: Jamie Zawinski Subject: a message with a text/plain body Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Foo! --------------167E2781446B Content-Type: text/html Content-Disposition: attachment And this is some HTML --------------167E2781446B-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.39.msg ================================================ From: "Jamie Zawinski, with suffix & ampersand" Newsgroups: netscape.general Subject: posting HTML (was Re: Public News Server) Date: 5 Apr 1995 06:31:22 GMT Organization: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=ONE Message-ID: <3ltdfq$j50@secnews.netscape.com> References: <3lmtu0$dv1@secnews.netscape.com> <3lpjth$g97@secnews.netscape.com> <3lrbuf$gvp@secnews.netscape.com> <3lst13$iur@secnews.netscape.com> X-URL: http://home.netscape.com Stupid-Commentary: this is a test. this is only a test. this is a test of the emergency URL locator system. this is only a test. Random-header: >beginning with a greater-than If you can read this, you're too close. --ONE Content-Type: text/richtext This is richtext. as defined in RFC 1341 Isn't it cool? (it's obsolete!) unknown tag: bar greater-thans: >> ampersand: & foo (<>) This is a less-than: This is NOT a less-than: << these words should all be on one line. --ONE Content-Type: text/enriched Content-Transfer-Encoding: quoted-printable Hello. This is enriched text. as defined in RFC 1523 Isn't it cool? (it supercedes text/richtext.) unknown tag: bar greater-thans: >> (and equal-sign: =3d) ampersand: & foo (<>) This is NOT a less-than: This is a less-than: << And so are these (3): <<<<<< (3 I say) these words should all be on one line. But these words should be on the next line. and these words should be in the next paragraph. and this should be two blank lines away. --ONE This is plain text --ONE So is this. --ONE Content-Type: message/rfc822 From: Jamie Zawinski Subject: it's not my damn planet, monkey-boy Date: Sun Apr 23 02:25:07 1995 Organization: blargh Content-Type: multipart/mixed; boundary=TWO Message-ID: MIME-Version: 1.0 --TWO Content-Type: text/html Here's some HTML --TWO Content-Type: image/unknown Content-Name: not really an image (1) Content-Description: this isn't an image at all, but it is marked as such so that xv will be invoked on it hello, this isn't really an image (1) --TWO-- --ONE Content-Type: image/x-xbitmap Content-Description: this is an xbm of a shark #define sharky_width 171 #define sharky_height 68 static char sharky_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xfd, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x49, 0x92, 0x54, 0x55, 0x45, 0xeb, 0x07, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x41, 0x55, 0x84, 0x44, 0x85, 0xa2, 0x50, 0x94, 0x0f, 0x00, 0x00, 0x06, 0x00, 0xfc, 0x17, 0x00, 0x40, 0x12, 0x12, 0x42, 0x00, 0x01, 0x04, 0x04, 0x51, 0x75, 0x75, 0xd5, 0xae, 0x55, 0x10, 0x00, 0x80, 0x0f, 0x00, 0xfe, 0x1f, 0x00, 0x5c, 0x54, 0x45, 0x89, 0x04, 0x10, 0x00, 0x80, 0x08, 0x55, 0xd5, 0x5e, 0x55, 0xa5, 0x25, 0x15, 0xa0, 0x1f, 0x00, 0xfe, 0x1f, 0x00, 0xde, 0x55, 0xb5, 0x76, 0x65, 0x25, 0x52, 0x22, 0xd0, 0x56, 0x7b, 0xd5, 0xff, 0x5d, 0xb5, 0xa2, 0xd7, 0x1f, 0x00, 0xff, 0x0d, 0x00, 0x17, 0x41, 0x40, 0x00, 0x7a, 0x95, 0x00, 0x91, 0x0a, 0xd9, 0xed, 0x7f, 0xd5, 0x73, 0x5b, 0x55, 0x54, 0x7f, 0x80, 0xde, 0x07, 0x00, 0xab, 0x54, 0x14, 0x49, 0xa8, 0x6e, 0x55, 0x0c, 0x64, 0x75, 0xff, 0xff, 0xbf, 0xde, 0x57, 0xd5, 0x95, 0xfa, 0x43, 0x7f, 0x07, 0x00, 0x17, 0x00, 0x09, 0x00, 0x74, 0xd1, 0x5b, 0xb5, 0xa9, 0xdd, 0xd5, 0xf7, 0xfd, 0x5f, 0x5e, 0x55, 0x52, 0x95, 0xdd, 0xfd, 0x05, 0x00, 0x76, 0x55, 0x52, 0x25, 0xf9, 0x15, 0x76, 0x6f, 0xb6, 0xf7, 0xff, 0xff, 0xff, 0xfb, 0xd7, 0xf7, 0xaa, 0x75, 0xf7, 0xf7, 0x03, 0x00, 0xd8, 0x15, 0x50, 0x00, 0xf8, 0x60, 0xe8, 0xdd, 0x5d, 0x7f, 0xff, 0xff, 0xef, 0xff, 0xfd, 0x5e, 0x5b, 0xff, 0xbf, 0xad, 0x03, 0x00, 0x70, 0x27, 0x05, 0x49, 0xf9, 0x0a, 0x12, 0xb6, 0xf5, 0xfd, 0x7f, 0xdf, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xbd, 0x6d, 0xd6, 0x07, 0x00, 0xe0, 0x5b, 0x75, 0x04, 0x7c, 0x01, 0x40, 0xa8, 0xee, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xbf, 0xff, 0xeb, 0xd7, 0xd5, 0xbd, 0x05, 0x00, 0x80, 0x7f, 0x05, 0x51, 0xb1, 0x44, 0x95, 0x46, 0x75, 0xe7, 0xff, 0xff, 0xff, 0xde, 0xfb, 0xfb, 0x7e, 0x7d, 0x75, 0xef, 0x07, 0x00, 0x00, 0x7e, 0x5b, 0x12, 0x00, 0x10, 0x00, 0x18, 0x4a, 0x9d, 0xfd, 0xdf, 0xf6, 0xfb, 0xff, 0xdf, 0xd7, 0xa5, 0x4d, 0xd5, 0x06, 0x00, 0x00, 0xf8, 0xd7, 0xad, 0x0a, 0x02, 0x44, 0x82, 0x52, 0x77, 0xef, 0xfd, 0xbf, 0xdf, 0xd6, 0xf6, 0x7e, 0x5f, 0x03, 0xf7, 0x0f, 0x00, 0x00, 0xe0, 0x5f, 0xb6, 0x44, 0x08, 0x11, 0x51, 0x54, 0x4a, 0xbb, 0xf7, 0xed, 0x7a, 0xdf, 0xdd, 0xd5, 0x75, 0x00, 0x5e, 0x1d, 0x00, 0x00, 0x00, 0x3f, 0x93, 0x5d, 0x43, 0x44, 0x08, 0x11, 0x69, 0xd5, 0x5e, 0x7f, 0xdf, 0x7b, 0x77, 0x75, 0x3b, 0x00, 0xf0, 0x2b, 0x00, 0x00, 0x00, 0xfc, 0x5d, 0x67, 0x11, 0x00, 0x21, 0x44, 0x55, 0x7b, 0x75, 0xd5, 0x6b, 0xd5, 0x6d, 0x5f, 0x07, 0x00, 0x50, 0x37, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x9d, 0x84, 0x48, 0x48, 0x89, 0x50, 0xb6, 0xd6, 0xbd, 0x5a, 0x77, 0xdb, 0xd6, 0x3d, 0x00, 0xc0, 0x76, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x57, 0x40, 0x02, 0x45, 0x44, 0xd7, 0x55, 0x55, 0xd5, 0x54, 0x55, 0x35, 0x33, 0x00, 0x80, 0xdf, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x15, 0x50, 0x50, 0xd1, 0x7f, 0x54, 0xb5, 0x56, 0xdd, 0xf6, 0x1d, 0x5c, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x40, 0x45, 0x09, 0x41, 0xe4, 0x5f, 0x95, 0x52, 0x55, 0x25, 0x55, 0x07, 0x74, 0x00, 0x00, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x80, 0x54, 0x12, 0x32, 0x11, 0x15, 0xf1, 0xff, 0x52, 0x15, 0x53, 0xa9, 0xdd, 0x1f, 0x10, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0x00, 0x40, 0x05, 0xc9, 0x44, 0x49, 0x55, 0xf4, 0xf7, 0x12, 0x45, 0x11, 0x55, 0xd5, 0x1f, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x56, 0x5b, 0xb5, 0xa4, 0xea, 0x5f, 0x4f, 0x51, 0xcc, 0xd6, 0x3f, 0x74, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x56, 0x5b, 0xf5, 0xff, 0x50, 0x55, 0xdb, 0xff, 0x1f, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xbf, 0xff, 0x55, 0xff, 0xff, 0xaf, 0xd6, 0xff, 0xc1, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xef, 0xfe, 0xf7, 0xff, 0xdf, 0xff, 0x05, 0xe0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x1e, 0x00, 0x40, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x1f, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x02, 0x00, 0x3c, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; --ONE Content-Type: image/unknown Content-Name: not really an image (2) Content-Description: this isn't an image at all, but it is marked as such so that xv will be invoked on it hello, this isn't really an image (2) --ONE Content-Type: image/x-xbitmap Content-Transfer-Encoding: quoted-printable Content-Description: this is the same shark xbm, but in quoted-printable #define=20sharky_width=20171 #define=20sharky_height=2068 static=20char=20sharky_bits[]=3D{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,= 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,= 0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,= 0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x80,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x80,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x7f,= 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xdf,0x00,0x00,= 0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xfd,0x00,0x00,0x00,0x00,= 0x00,0x80,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0xe0,0xef,0x00,0x00,0x00,0x00,0x00,0xc0,= 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0xd0,0xff,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x54,0xfd,0x03,0x00,0x00,0x00,0x00,0xf0,0x3f,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x10,0x00,0x49,0x92,0x54,0x55,0x45,0xeb,= 0x07,0x00,0x00,0x00,0x00,0xf8,0x3f,0x00,0x00,0x00,0x00,0x00,= 0x00,0x10,0x41,0x55,0x84,0x44,0x85,0xa2,0x50,0x94,0x0f,0x00,= 0x00,0x06,0x00,0xfc,0x17,0x00,0x40,0x12,0x12,0x42,0x00,0x01,= 0x04,0x04,0x51,0x75,0x75,0xd5,0xae,0x55,0x10,0x00,0x80,0x0f,= 0x00,0xfe,0x1f,0x00,0x5c,0x54,0x45,0x89,0x04,0x10,0x00,0x80,= 0x08,0x55,0xd5,0x5e,0x55,0xa5,0x25,0x15,0xa0,0x1f,0x00,0xfe,= 0x1f,0x00,0xde,0x55,0xb5,0x76,0x65,0x25,0x52,0x22,0xd0,0x56,= 0x7b,0xd5,0xff,0x5d,0xb5,0xa2,0xd7,0x1f,0x00,0xff,0x0d,0x00,= 0x17,0x41,0x40,0x00,0x7a,0x95,0x00,0x91,0x0a,0xd9,0xed,0x7f,= 0xd5,0x73,0x5b,0x55,0x54,0x7f,0x80,0xde,0x07,0x00,0xab,0x54,= 0x14,0x49,0xa8,0x6e,0x55,0x0c,0x64,0x75,0xff,0xff,0xbf,0xde,= 0x57,0xd5,0x95,0xfa,0x43,0x7f,0x07,0x00,0x17,0x00,0x09,0x00,= 0x74,0xd1,0x5b,0xb5,0xa9,0xdd,0xd5,0xf7,0xfd,0x5f,0x5e,0x55,= 0x52,0x95,0xdd,0xfd,0x05,0x00,0x76,0x55,0x52,0x25,0xf9,0x15,= 0x76,0x6f,0xb6,0xf7,0xff,0xff,0xff,0xfb,0xd7,0xf7,0xaa,0x75,= 0xf7,0xf7,0x03,0x00,0xd8,0x15,0x50,0x00,0xf8,0x60,0xe8,0xdd,= 0x5d,0x7f,0xff,0xff,0xef,0xff,0xfd,0x5e,0x5b,0xff,0xbf,0xad,= 0x03,0x00,0x70,0x27,0x05,0x49,0xf9,0x0a,0x12,0xb6,0xf5,0xfd,= 0x7f,0xdf,0xfd,0xff,0xff,0xdf,0xff,0xbd,0x6d,0xd6,0x07,0x00,= 0xe0,0x5b,0x75,0x04,0x7c,0x01,0x40,0xa8,0xee,0xff,0xff,0xff,= 0xdf,0xff,0xbf,0xff,0xeb,0xd7,0xd5,0xbd,0x05,0x00,0x80,0x7f,= 0x05,0x51,0xb1,0x44,0x95,0x46,0x75,0xe7,0xff,0xff,0xff,0xde,= 0xfb,0xfb,0x7e,0x7d,0x75,0xef,0x07,0x00,0x00,0x7e,0x5b,0x12,= 0x00,0x10,0x00,0x18,0x4a,0x9d,0xfd,0xdf,0xf6,0xfb,0xff,0xdf,= 0xd7,0xa5,0x4d,0xd5,0x06,0x00,0x00,0xf8,0xd7,0xad,0x0a,0x02,= 0x44,0x82,0x52,0x77,0xef,0xfd,0xbf,0xdf,0xd6,0xf6,0x7e,0x5f,= 0x03,0xf7,0x0f,0x00,0x00,0xe0,0x5f,0xb6,0x44,0x08,0x11,0x51,= 0x54,0x4a,0xbb,0xf7,0xed,0x7a,0xdf,0xdd,0xd5,0x75,0x00,0x5e,= 0x1d,0x00,0x00,0x00,0x3f,0x93,0x5d,0x43,0x44,0x08,0x11,0x69,= 0xd5,0x5e,0x7f,0xdf,0x7b,0x77,0x75,0x3b,0x00,0xf0,0x2b,0x00,= 0x00,0x00,0xfc,0x5d,0x67,0x11,0x00,0x21,0x44,0x55,0x7b,0x75,= 0xd5,0x6b,0xd5,0x6d,0x5f,0x07,0x00,0x50,0x37,0x00,0x00,0x00,= 0xf0,0xff,0x9d,0x84,0x48,0x48,0x89,0x50,0xb6,0xd6,0xbd,0x5a,= 0x77,0xdb,0xd6,0x3d,0x00,0xc0,0x76,0x00,0x00,0x00,0x80,0xff,= 0xff,0x57,0x40,0x02,0x45,0x44,0xd7,0x55,0x55,0xd5,0x54,0x55,= 0x35,0x33,0x00,0x80,0xdf,0x00,0x00,0x00,0x00,0xfc,0xff,0x3f,= 0x15,0x50,0x50,0xd1,0x7f,0x54,0xb5,0x56,0xdd,0xf6,0x1d,0x5c,= 0x00,0x00,0xf5,0x00,0x00,0x00,0x00,0xe0,0x03,0x40,0x45,0x09,= 0x41,0xe4,0x5f,0x95,0x52,0x55,0x25,0x55,0x07,0x74,0x00,0x00,= 0xbc,0x01,0x00,0x00,0x00,0x80,0x54,0x12,0x32,0x11,0x15,0xf1,= 0xff,0x52,0x15,0x53,0xa9,0xdd,0x1f,0x10,0x00,0x00,0xe8,0x02,= 0x00,0x00,0x00,0x40,0x05,0xc9,0x44,0x49,0x55,0xf4,0xf7,0x12,= 0x45,0x11,0x55,0xd5,0x1f,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,= 0x00,0xc0,0xff,0x56,0x5b,0xb5,0xa4,0xea,0x5f,0x4f,0x51,0xcc,= 0xd6,0x3f,0x74,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,= 0xff,0xff,0xf5,0x56,0x5b,0xf5,0xff,0x50,0x55,0xdb,0xff,0x1f,= 0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,= 0xbf,0xff,0x55,0xff,0xff,0xaf,0xd6,0xff,0xc1,0x17,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xef,= 0xfe,0xf7,0xff,0xdf,0xff,0x05,0xe0,0x0b,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xff,0xff,0xdf,0xff,= 0xff,0xff,0x1e,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xaf,= 0x1f,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x02,0x00,0x3c,0x00,= 0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0xfc,0xff,0x1f,0x00,0x00,0xe0,0x00,0x80,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0xfe,0xff,0x07,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,= 0xff,0x03,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x03,= 0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x01,0x00,0x00,= 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x00,0x00,0x00,0x00,0xc0,= 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0xfe,0xff,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0xfe,0x7f,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,= 0x7f,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x7f,0x00,= 0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x3f,0x00,0x00,0x00,= 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,= 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x70,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,= 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1f,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x0f,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0xda,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0xf4,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,= 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x03,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,= 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; --ONE Content-type: multipart/digest; boundary="DIG IT!" --DIG IT! From: jwz Subject: msg 1 Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948611520.21002.12@Jeffreys-MacBook-Air.local> msg 1 --DIG IT! From: jwz Subject: msg 2 Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948613620.21002.13@Jeffreys-MacBook-Air.local> msg 2 --DIG IT! From: jwz Subject: msg 3 Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948615610.21002.14@Jeffreys-MacBook-Air.local> msg 3 --DIG IT! Content-Type: text/html We now interrupt this digest to say BITE ME.
Thank you, and good night. --DIG IT! From: jwz Subject: msg 5 Content-Type: text/richtext Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948617610.21002.15@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 msg 5 in richtext --DIG IT! From: jwz Subject: msg 6 Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948619600.21002.16@Jeffreys-MacBook-Air.local> msg 6 --DIG IT!-- --ONE-- If you can read this, you're too close. ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.4.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Fri, 28 Aug 92 15:13:14 EDT Received: from flash.bellcore.com by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Fri, 28 Aug 92 15:13:12 EDT Received: from COSMOS.VLSI.CS.CMU.EDU by flash.bellcore.com (5.65/1.34) id AA24840; Fri, 28 Aug 92 15:13:07 -0400 Message-Id: <9208281913.AA24840@flash.bellcore.com> Mime-Version: 1.0 To: nsb@flash.bellcore.com Subject: mew-law encoding? Content-Type: multipart/mixed; boundary="PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2" Date: Fri, 28 Aug 92 15:12:35 EDT From: beatty@COSMOS.VLSI.CS.CMU.EDU Sender: beatty@COSMOS.VLSI.CS.CMU.EDU > THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME. > Some parts of this will be readable as plain text. > To see the rest, you will need to upgrade your mail reader. --PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2 Content-type: text/richtext Content-Transfer-Encoding: quoted-printable I recently got hold of a filter that davecb@nexus.yorku.ca wrote, and whi= le it's not perfect, at least I've been able to take the "No NeXTmail!" slog= an out of my .signature. And now that I just thought of such a terrible pun= , as is in the Subject: above, I couldn't resist inflicting it on someone, and you seem to be the most appropriate victim. Anyhow, I guess this is = a "fan letter:" thanks for MIME. --PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2 Content-type: message/rfc822 Received: from po3.andrew.cmu.edu by COSMOS.VLSI.CS.CMU.EDU id aa13358; 26 Aug 92 22:14:26 EDT Received: from sqhilton.pc.cs.cmu.edu by po3.andrew.cmu.edu (5.54/3.15) id for beatty@cosmos.vlsi.cs.cmu.edu; Wed, 26 Aug 92 22:14:07 EDT Received: by sqhilton.pc.cs.cmu.edu (NeXT-1.0 (From Sendmail 5.52)/NeXT-2.0) id AA21178; Wed, 26 Aug 92 22:13:24 EDT Date: Wed, 26 Aug 92 22:13:24 EDT From: beatty@sqhilton.pc.cs.cmu.edu (Derek Beatty) Message-Id: <9208270213.AA21178@sqhilton.pc.cs.cmu.edu> Received: by NeXT Mailer (1.63) To: dragel@sqhilton.pc.cs.cmu.edu, beatty@sqhilton.pc.cs.cmu.edu Subject: mail from Wacky X-Next-Attachment: .tar.192.mail_from_Wacky.attach, 23976, 1/1, 33000, 0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=n2m-MIME-boundary---------- The following is NeXT mail translated to MIME format with n2m. This always starts with a file called index.rtf, which is the actual mail message in Microsoft's proprietary rtf, containing references of the form "\attachment " referring to the other components. --n2m-MIME-boundary---------- Content-Type: text/plain; type=microsoft-rtf; name=index.rtf Content-Transfer-Encoding: 7bit {\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} \margl120 \margr120 {{\attachment0 VoiceMail_beatty0.vox } } --n2m-MIME-boundary---------- Content-Type: audio/basic; name=VoiceMail_beatty0.vox Content-Transfer-Encoding: base64 LnNuZAAAAJgAADsAAAAAAQAAH0wAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+cW9ze/Lg09XT 09/d7W/56e30+HH29/vybf/x5eP6dm11b2FeW1dXV1xjZXR5b23+dmBaXmRoa2psb/9wcXLy 6OTZ3ev+WFNYW3zk3dPNzs7N2uj0aWxqXmNjWlxfcOrk2tjW0djqfWFUTkpKSktOV2NgW198 /Pfp4Nfb3+Hz+2piYFpt/Pbr9f1uZ3P23tTY09HT2PF0bGJmbXLv4Nza3+j8b2pfW1po+vDk 82plY15ZXFxeXFpoaGRsXVVXXGFibO7f1NTc7Gx4fGrw39rX3dnd83dtcv/m3t7h9vrn72ln YWFdXW57cmhpY2VkaftybW9lbnBoYldYYWf67f9nX19lfHJ89fD6cG59++Xe4d7b2tvc5OPi 3+Ht5OPo7Pzx9PnzeG5xa2FhW1haXV9YWllYXV9tfXJraGllZWFt9+XZ19bb2d/veGRfWltl c+ji6/b9b2hoaP3c19fY4Pj15+Pd09HU0tjlbF9ZS0lJS1VhZmZhY2RdX2ReZV9ibG3+d2df XWVte/r983z7eWZmX2d+7tvV087O0c/P0trj/3ZtaXNx6+z68Pv6d3b28e/m7HphU05LTE5R XGd0697W1+Hn7/ZsXFZST0xOUVZcc+3k29fX2Njd4up8bv3s4t/d3tnZ3Nvg4vn8+WpxfmJc VlVYWWlv69zb2+NsXF1eX1RRWltfWVhdVlFTWGrs3tbW3N7i5u18/Hb/7Oze2d3j4O94eHR6 ++vv8erv5+ni5e/s7//w3uXv/2deWVhYWVVYYWRiZWNr+nFxY15jVVlfW11kX1/939na39rT 0NLX2+TpfmNud/vxd/Tq2s/S1tnjemlgV1FQU1pjbHJ18vDq6v50ZFxVVVdQUFBNU1lXYXXk 2NjZ2t77YF1iaW9w+ODe2dTR0dzh7fx79urm3d/r5fL09m/0/XdybGxqYl1nbfTp5t3c3eV5 XVdNS0xLUldcb3j5/+7n7HlkaWddX2xyem53/3NzduPW0M7P2+t3fv1tfvzs39rZ2d3v7vdv Z11ganL4+3JlW1tfX1tebG5sZ1xQSk1QV2br3NrZ1tTj7u9oX19j++rh4fv07Ore2tva2tve aVlZVVdcavnp2tLO1eh7YlhVVVZaXF5eYm/89Hx1en7s4t7n6PNpYl5XVFxu/PXi3ur1/Xxv ZGVmXV1lbu3a1trY0dHV2dnf9vbu83FlYVtlfHL07uvnfXNkVVBMTU9SYWlxbWZqZl1XUFBb Z+ve9Oze3dXZ4eXj3NPW3uh9/2x37u3h4ufp6+z2dWxgbHhpb373+fHve3FpZWxscfbvfW9f Uk1NUVNbbmtpfHh+7eng63vv8Xt7a2Ztbe/h4N3e2t3f3N7o6vbq6vz07e3yeP3qdm/57/T3 /n309nZtZlhWWFdYXGRjW1ZbXlhSUFRdeefh2tTU197d2uXufW9tZF1YXmd99nfw8ebf7e/s 6ejr8vH9+urp5N3W1+Dt83dsXVlfXl5hXFZVTk9QU2VvbnJy/ezr6Ojl5ffv7/Dq+OXl3tri 6O7x7+rm3dLT5X5lX15cbXZ3/v7s7HJfWFZVX37r5vrv3ud5aGFjX15dWFdWU1NRVlpbYWFs /e7l7vdybXBqaf3n29LS0c3O1t/Z1dbZ2NjY229mZmBpZGNdX2tiYmNbW1xgaGVqZGFgX2Jt fWttaGl0eW1pZ2jq39nceGRZVVhbY3zx5N7b2Nzi7eXe2dLP0tfe4/X79XH6/Ovi5OLl43dc V1lYTUpLT1FPUlBTXWVqbnbt5O14cWtmX1NUXvjb0s/OzdDW5/94ZGBlcvZ2dHl57OTf3+je 5Ozs9fZ89H1tal9lZ3Dx/25nbHt4evxybGtqbmNfXVlZXF5fY1tTXHrr6Orf3uXn6ur3aXN7 /d7d1s/RzdLV1+Dk5uHl9v/9bmVfW1ZTV1VTVVJQWFRPWGJ95t/h4eXu+v31/v96cG5jXl5o Z2p19ev8cmplZmhsdfTr5Nvc2dbU0dve4+no8/j2+Ozk3N/vbmdlW2JfVlZWVFRUUlZcY299 bHrudW5iXGNeX2NvbXrk29HR0tbb5ubk693Z19Xj6OL4e2tfWFZbXWZ5bGZjXV9ocfTr4dbe 49/5a19j+ent7n3s/V5ZTUtMSk5UXmJhdO7g4ejf6ezg5t3Z4ud8/+3n4u/p593c6eLm4Oh4 dl9rfHrweXBsY19scmxtXFhZVVVOTVFTX23y4d3e7fTr4t/f5/jy7vZrWl1u9NnV0dDZ3fho XmV6d3RjdOl7dGtkX1xnfuzWz9HV3+XzamJcW2FXVVtcZmlmaGBibfHp9HhiXV5ZVFNZZ23h 1NPP0Nj0Z11kePTq3tna3u93bXN77Onq5efubWFiaWxpamdvemtlXF1eYGBhYlxoaWRsa3j9 fW937Ojm7+7l5+v07+7/ff979vju7H5vanv9dfLi3+X77+De4fbt4er/efr/fPjk4eDe3up5 YFFLR0ZISkxPVmP96+jn3dzd5u36cP78fPvud29+9vHt4+ne19rlbFpQVVlbaXfq7unV0tzh 9XTx+vdyXl9XWGBeWl9zdPbm5OpybnppbGlnY2d3fOrj5ezz+HtlX2Zpam997+zl3NbV3OXv eG5tb+/s6dva19fV3PL/eG5iU01LSEhIT1pqevjc1NfW1dvqeGJsaF5gXFpcX2FgXV1p69fS z9fn9Wty/P3u7N7X3ePq8HhpbmlhZ25++HFhV09NT1VaX2d0ePvq3+Dk6ufo6ubf3+95cWZZ VFVXWlxYW2Fo89vV2NTPztXg7vbl5O/q39ve5Obp63z97f95//11bmJaVlBYYmZ78fHm4fNj WVhcX19eW1tbV1RUV1haZWv04eDm+/jq5ePj29jQzMvN0d7u6ndfW1xic/1uZ3F2aGpva/Pt 5N3l7mNbVFNeXWRsfd/j82NXVFBOUVVZWlx1ePvw/ejo29DMzM7R2d7vcl9bZvfh3OD1dGl0 ZV5jYn7z7eXt5+Pr4uf7+XhtY19kYGFbXWtwdPj9fvrx82NSTExLTVpefeLh3tzZ3NbP2t/e 625nb3d6fvv16+Hf4ux1aGZjZ2pzc3Pq7Pf7dnD9+XxwZGNhVVRUUFVaX2Rrb25rbW5oZWV5 7N/Y2dzl5efc19zi7OTs+nj68fDv6OLn7u/1fu37bGJUXmds7u/l5np+8fp5/P7792tcX11W T05UWFtncnVxbG13/3vq5+/s7+zxdG58/Hv/9e3r4d7Y2dvX3+rtfmtsbHXt3t3f3+Df7Hpn X2FbWVVPV09OVVNUWl1jXVNXV11oX2Vlb93U0M/OzdDNz9PX3eZ5dm9kXFtZXWhraGVy+uzf 3+Xk6OTu9nx0/Wxufu33ePT073t093txZ19dWVlYXmBZXWBrfv/+/Xr+831++nX+7PD7fOvf 2dPY3ub16tzb3eLn5nppaGBlW1xdVVhUT1JPUVlbYmh9/m95a2xrfOvg2tvj5+n9/3Jo+319 +Pzu/Xj/efj+aHHu6ert3t3f3dzb3uTs7OXi3+ri3+fr/mdfXVtdXWFeXFxdX2BeXFZRUFRX UVZdYWhv8ebh397d1dDY2Nbe5/dtaW3t4t/d4+Dg8/T15+vf2flkXltYWVxfX2dob+7p421Y V1FTUlRbYG1v//T+bGVoZWht8+Pr9v9pXmRofOjf1NLb3N7zev57fPHu6eTp5ezp397l4ebq 5OLi4Nzna15YVVxaWF5lY1hYWVBRV1lcbPLp5uLf6PHv5enq93ZgV1ZVWF5gft7b1tfc4N/l 8+jo4dXV1dTU2On2+2dfXFpXV1dPTlFbX1laYHB0c3dtZ1tdZGJk9e/46eLj7HpqZmZibe/k 297t9XR99/7p4dnRz9Lf6+13ZGR373FfYV9eanF97u/b0tTb7+7+X1hTU1peY37/9GpdXVdX WFtkdX53ZGFcWFxhanH139nU1dvW1tzY0s/U1tLT19zo/3tdUltaXWJkdX11ZFpaWltdW11l YV5aWV9aW19p+nj/7/t0eO75anRvefFoZnVmaGdr+fLp5+TWz87P09TT1ePr93lmXWRdXmx3 79/d3+fz8356fmddXWNdWFlXXmFdXVpZWVpjc/Xo8fLw9+Pe19DQ0dvsbV1gYV5cXW/t7Ovg 3epzdfvm3+vs7v59fWRfZXb/9/NvdP13bGNcWFZYYGhsa2dhX19ZVllbXlxpenH97+fd2dTU 3e3/5Nzt9vj44tjV1tna3uXtaWjz83doZ19ZVlNXZXNoaHbr3ehybG1u/ejyfHhqXFdcW1tq cujd5uzv7/X8a2NjX2VrZG91b+3j2M/Nzs/P3ev1amJz+//u9HR5dWxrZltYVltibfVyYmNe VlRUW3VsX2JZU1hUU1dbeeng3eLc297h4tnY0s7R1Nvne19fXVtq//Pt7OPj5uPv7+n9//dz e3dvbWVgZGV47OXf6u52X2BhXlxbWlxfZFxaWFleZ3p5/unu/HhlYmp149rW2N3Uz9XZ3Xxv fe7h4enzdfnp7+7r393l7HZWU01JSkdKTk5RW2N1/f3u7u7n5Ofq6PNvbGpjaXD74t7d2NDS 2ufue2ZwaV9eXGRuYmb66Orn393e2tzg5ern821iXWNnaGNqbXP9bntzX1tVVVhXXW567eLb 2ujzamVvZHHz/vfs5t/g93VsbOrn7/VoYmz23dvb2dzb3Nvb2NvtcmRcVU9NTExPWmdrYFdV U1xeW2Vrcmxq9XRlY2P88+vZzsvKy87Q1OF3ZFtVVFNYYm70397p6PN98fTv5une2+Hp7/j4 9GxdaGNhblhRUk9OT1ZfaGv67uro7uzh5O7x9+/t6u5+fv729n3p5ufr6u58ZVxXU2Pu593Q ysbIz9Tf5exrc2hlXlNRT1ZcYV5XV1xfW11fXV9aWGJjau34bPt7b3doX1hYXGfx7uTY19vn 9uzm8/rt69na2drk3dva1tznfWlfYVhWW1xgWV1zamt17eHi4+n89vRuYmN3Z19nZWxfXGhg W11ibnl7dnf1+fbi2tDQzczSz87S2Oh5al9eXWRtcHBpamNfXGJfXG3+/29kZV1aWFRUWWBp bXN0eHz+em1dV1lYXGp2b/T+/Ofk3djUzs/U2d/5//NveGpibnvy7eLX1tfa6vd7/f1vemNc YlhYWFpcXWBkbmNlZFlgaXJqWl1XVldVXHjl18zGxMXH0e59altWVFVcaHL15dza2dfX1tLa 3dzv/2NcXV5z6t7q6u96clxXVllXU1dVU1RRT05PUl1cXHL87n59eX3x/vXr39rY3Obt/nty bnrk2tfc3Nnt6tzd3tvb2tvkdF1VT1RXVl1cWltbZG1lZW1+6eHb19ra2uHmb1lST1NWVlJV WXHm5dzX1dTX1tnf5X1yZ19gW1tv7NvV0M/T2Nnfffx+aGReV1RPWGBaW1xneHd6eGxsZ2Nm XVpaXWNubGRaVVZYavHe1tLR1t3e3O365t7c4fHs6uzw7/J2dGtufGxtcW1xdHNpX11gYnLn 5PRvZV9cWFhm/+Ti5fFweW9sZWlkX2JqdW747vDd3d3T2+vs4NjX3uXub3Vlb/N88O94cv9y bPj8+Hhsc37p/19bW1pgXFpZVVpYX29m++ji3eLj4fRtXVZRU11ZX296fvrn6N/c3Nne6u3p 6PHx6N7c3eLo5+7i2+Lj83Ryb2Nea2RhXF1eVE5PVFhga3JsbGVrbV5pb2lubG729Px78d7e 6Onf3tjT0Nvo5e7t+ntvaPr05eDs7u7i4+31fPtxYmhcXF1ZWVteaXn+/Xz8bWFbU1BSWVxg aXjv+21rdnF0c//+5trf29na3eba2Nne7/R2/WVeY1xcY3rs5+Hc3uv6dmZgX19pbmRteG9o Z2djbHhwYV1cWVlTV1team156dzi39/i2+Dv7urh39XX3d7e3Nzh7vL092xobnv/eurl4t3h 5uxxa2NaWFZaWFhZV1pfXlxXWWVw7urreGRrffv88+v8/WZkamRkYG748ere3d/p5PdldVxk a151eXT97t3W1dDS09DY5WtlZGVqZF9hamhobG1pXFdcV1NZXmZiYmJfWl1qb3n94NvV1tnY 393z8eLs4d3b3/Hf6O/1ZGZ3bfzu9uLk/GhcX15p7Ovl73NtYV1gZGJufHF89X399fPlbV9p cndfZFZQVVBba354YV5gYWn86d7Sy8rLztze6nZlZXdsdff4fX11bfbn5/D7dmRZVE5MTktM V2f593pkZG17/nTu3NPO22xdbO7o7N3Pzc7X1dTa7Whu/+19aW1cWmdeWFNRYmlk/fTf1t3m 6+Pe5Hrm3uTkam5nWllQTE1NTmdrYmlu5etzaGFjZ2Nq7m/x52/s9ffc0srL1d7f/HV2bvJ7 9ebe3+Lrb/5hXFlaaFJOWVlaW01XcltmX2DseG/t5ej7Z/fb5d/v7t5xeenn5+j95t996295 c1Zlef3/+OvT1eHeam/vaHTv5eHpdOPvYnJd+/Jd9e/5bF9cWFVQaXDq3XnscGNnXltjWk9h XmplTllYX3lv6M7MzMbP0tTm1dfa09vse2tbXk9PVk1bY2zs93T193Xva2piWWpwYV1eW2xl YO324d/s2+ns61xOVU9PWlj24+/Ry8rKzc/N2vR8XWdmWmZqZmds+eJ+/e3t5HdmYmJeXVxf b1xx6+jg5dnX321na2x+WV9tamhRUFlbWVtd/OJ05vJ2dV9kcuHV0trR1e7Z3dbc+frv3vP7 bX1eVFtYal9cafXd7uv++F5TW1RcVE9cbn1lZmpyV1t0b9zf29HQ2vTm93leaPz82+Lc6HBp Vltq/mbr3O3Z3tjT2N3u3+znbnV5aHVTXW9sYllsYWJcZm5o6WRk+m9yanZcU1BUW1v8+ezm 49zt2Oj06vvb6t3gdP1x7ufb2tnb39vs6XJXV1lgZHFpbfh0+11mYVZkZf1pffxtZlNVT15l XX545vLvfHJ5ZeP14Odl697Y6un3ce5z8Xju39/b29Ti3t/p6fbg9u5vWl1ZXU5SW2dvXfr2 fHJfW2BgWG7v6W5q7WFnYllt9+D/7edxW1p9+uTm4dPKyNna5fxta3JfbGR14NTP5+f2enhv 7Ork4fdyYllNTExMS1d7YXduWldRTElf83n34dff4eTt/nh+bdra/HZod15jbF9ndN7ZzcbO 0tTT6O7b7uTf3+975l5OU1pZYuH1fvH7YFFeUFlmaW9k7GFXV1RYUmdcYOfs91xuYFp1b31r 29TWzNDU5djZ3tHa2OzZ319uaPV27OHy2el9X2BuW19dWlpZYFVST05SXm9fa3n7aV9pZnJh Xm357OnudfDvb3Tw4dzd393m4O5gdW136dfLztTf2djV1e78Zl9TTFlZV1lZbunf6X5vam9u 9n5bYWFfaWVmVVJVWFtd+m9ka2l8/+Xd2tXa2eTm3eLl6N/2/uPe2ebq/nXe4PNsZn1u893h eWzyZmR5ZVlbW1ZUXlZNTlFYUVxpW2dqZ3bq2vDz3dvd6t7xbXhncejY3+ni9+bs6Ofs3/b+ 6eHj49/m6ubr9O3feF5jaWRmbG5eXl5UYHF6Zl1eXGV3c19fZldfbH5+eftsavbm93n5c2v6 4dnc5nV66+v493pr6t/b1tXY4vTs397Uz915bnBdW19VU1VUW1tnXlFWVl5obW9eZGZdXFlg WVJYYurj4+Hj1dXTzs/L1+Dd4N/r7uxuaG7u59/f825kYF1kbGhaUVJYW2dnYGx+6/7v2ufs 9XJ+ZHBfVVdXXVvr1+jk39zxdup1aGNzZGff5v3w3N3o29Hd9PVqa/3sfmVvem923djee3dz dvVqV09XXVpodmhbWWVqaXBoVFReXlxbbnxfYP3te/n7W2fu6+/XyMrOz8zQ1c/c6Ozs8nPb 23NdXGVXU2FfTk9UUlpjZllRX2ll79nZ4N7d3/jt/Vdd8+lwZnZrYWViXF/5cmBj/uV49OZu af/t9uPP1uLi0MzXz8vV7Pd0XX3id15h/2FYanNdVFlaWGRtXFFNV1JQanx0Yl9vY/n6W1dd 5e1y3uFwfN/Z3tbT2+rr3+vp39vm/u/0fN/Z6nt+9l5Zef9dWWVlbOnyfX11b2dq+PNdWGZm Xm/+Zl1cYFtm/WVVV3NgauHc3+7f2dzb2dv7at/e49nk+Pnx9e3l2tfscndcW3Roa2Vo5tfe 4+RvXGlrY/NqXV9MSElLVVROTFhfYevv+unt3dXf3tve7+bZ3NLX7G9h8eHm4t/ucf5pWm1u ZXho++J49+94bP35dt/h7HpaX2VicmheXGZqX+zm+HFXXGZfZ21dWmpnZ+ff4/9p9eze3uL4 59bf6dvX5vjx5Nba2tnm397vYmhvXV5UWF9ZVlxZV2psaeLsd/9cXW5kXWFSTVJPTV9taHl2 6dzd5djW6dnU39TW5v9faur+au7s9+jh9N3fdvZmY/DufOzj6e/yYnjuX2xWVW9qanJra2Vi W334XV5WVGNmWltdY27r8d3Z79/rcefe9+ff293b3dnX9OfwX/bq7OPs8WX+9nF6XP7tVnzc bGpobV9dZW75X2ZfSk1RSU9aZ2v42dXW693fW2zfbnHx6f128P31aWn8XXzT4Ord2+Xm09LO 29nO6PzlWU1OUE5KVV/3eHHoWVnrY1pud29eY19eXFdkWF3Ny9nR0eJ0+n3v/2n0a1/Y21tk bGNccOHb2tTL3Xva4F//3Oxpeuf5/29yV0ZSZVRab3ds6Nfe6vjyWEdXZE5RX1RPWmV5++/Y 1uPVyt7p1uVra/n/e/Pq6WBj1uX70dji5t3e7vxwYU5W9V9UbnhqePPq3+jo4mtZcFNET05O UllfZH3s5WBb5uZm4Nnm493V0NXRz+T22NZu+21dYGZya/n68G1d5etZ5+B0+3Zvd+Pe331W ae5bdvBgXVxbVltVWlhQcfJo3dPu9vX99uzu7GpX+uVp+upmXF1h7dfc3Opq39R689746NjT 1NTf4nZXZWtOUlxPUVlSTVVRUlFNb+5n7tPa4t3j8+3z4uB63tlxd9t+ZvL/b+7w6vxYZvdZ Ydvd2tDP2Nvf4vldat92etTd7Ox3XWNfZmRQUlxTUmtaU11jZPvo5eVoXnFfVuvqcPbxbn3/ ZV5XY+PffNPY8fP55t7Y2Nro9tbUeuTpZGJaW2BoX1xVUV12W3fsXm348/9samthXXjfaWjn b3b2dfbt9nddV27hXlb0/e3j4eDf2tvpbnPf6fPT5vXd4OXf4drl/O7t/GTpemNr/3N4d11X TVBcU09naGNmc3r17GZmWVRfbmD37m1seG1o7G/959zQz9ve3+t5evt33+Lj6X3/cVZWYGd3 /PTv3P5eVk5NUVlh5NzS1d777OxfWE9QXHH02d7b2Ptj8+Zzcv1wbv1teWdrdmZq39LU1NTa 8/xt/2peZVlY/9jmevX3bPDq5ubu5fJreN7vX15ZUVZYTU5XZGhYZ9rd/H1rVlZpbGNy5t7v 69jb6t3X4PXZ0+7q2uJqW/niamNrZFdu8l9eeXZPU2f8emvo8Wbj1Hd43u9XTFn0aVljcWNs 3Hxe99/scOvZ3ujm9WFm4WxZ7tjrdOXW1+fg6FtPbu1l79rnc+jb1+Px625n5uVbWV9XTFBd ZmRicVxSXX5jaOfoamtreOn09Whn7tba4dTY6fz8fevvZVxYV2JmZu3q/nrh1dDP1N7/Y2Zq WFdXVlp29t7b7WtXUU1TW2z2fnt4X1/x9XNpfO7j2NjS3Ph3b3Lk3vlveOji6O53ZWFeXWTl z9fua19XW2Fo7t7d3+fUzd9dT1BQX3zv3uPvb1FPY1pMTmFvb9vd3tvs+l9c/fldWGlfV2n0 6ufXysrNxb/M3uHxW11nXFpfZ11XdedgVVVZT01cVFJaXlNLVvPq6+DU1drW3+Z7YmBRXNva e19mYVltb2L83dXU0snH2fr+bFpkcGv8/O1tX3ni72ru43ru2uLq6/ViWXbc52tZUVNPXWtm cW5hVlZw83BiYHp0c3loaX78aWjj0d3q593T0MzN09TY5mxo5vBeU1VZTE1SVl1s6/z32Nbe ZGZlT01NTE5QWV5h6N7e5ObU2t7W19/o7GlVUmJcTk1bZ17z0tPX1Njd3trQ1ejl3t/s4995 ev3u39vT1O9kX1NQW15RT11cV1pbW09LUVNPXuXf3tfY4Xt09nBYXWtlceXh6t7a2dTS1dHV 2dLW7OrZ7fDqcGFZVVlVUFVYWFxvZlZTU1FefeTlZFpWU1Rn+vXk3trd4t7Y521fXFhp/Ftd YWN0c//o4eTb0Nba0+rv7/na1tHLyszS2+1eZ15XWFBaX15faGJYU1hXYuDh72hvXk1LTk1M TFRdadrb1dva09TR1dLS2uLn7drc4fNj8ufv+e7n5m5tZ11pXlxVU1pgbW7/9WlfYWby7nRq bu/e33F3bV1OTE9RY1xaX11ucmRrbvX9Z+zc09Dh39vOytLY3dTN49zT3Nh7WVdPXGBaan7k blpxa/36dfhiZ3dgXVpdUk1YX219Z15fddvZ7mx+/FtbZmro5fvf2tTP2d3b2Od4aF5eXVZe 7NzN0ePd1tjkfndqbGBPUFBf+2dne3j7bWh4ZnxiTU5LTVVTXnPs53Fvbnf6YWTy4t7ydvbk 2NbUzszN1tXP1NHW6O1sWVRRV1575nr67vtrWV5gZWxpaml1/WVaZlxUV1FVXnj/Xmvm29ns 7npzeWddWV9gXF12593a3dXW083b59jS3XV2/HF3YWbj3dfX7+vk5vtlevr/aVFSTk1TTUpN VVVLTVlr5eHc4/Xm7mdv8uxdT2Fw6t/+/3P63d/n3dDP4uLc4NnsZWxu8OP3/e3j73Ll4dnS 73Z3YWVQS1RYXVxea2/r5Pp5aWZkWVZZXmJi/erc1d/n5eXk9W1ye3L5d2R36+tya/5v7eXW ysrM0tfe3vNqYWB4cW5la19YVUxMS0xIR0tXaW57evV5fXJfWVlaZOno2+d9e+jY3NPO1dHV 9Pr1bv5jbOTg3eTP0+Te3/BrZXxnWnv4fW5kZ1xdZF9hc3D0al979+hmWF1ZWFpSW+7h33f6 3+fobmZrfu33bXPvfmFXbN3PztLPzs3L1ODi7PlZTllYZ3Fr8Xls//r363xkVE9YYWBZX1tc ZFtkbWFcVFFid/D6YWhoZFleanL9/drd1tDRzM7R29/zbXrs7Pbv/+TtbnZqeunvev/+6ejo 9OrcfXBcXVtOUlhtb25gWllZX2RlZ3ZqaWVvbnL2bPbo5urt/XHu5fLo2trS0s7P5NjW3e9w 7nBdY2Zz+mZiYVpnXlVMSFhiZ/Pn4+94bGRcXmVuZWR5bmRoaV7+cHz7fd3f3G905Pf0/GJf 9m5lXmbe29LV1dHSzNba2Nng/llSXFpcVF5la+rv7Ozj+2pWUltaV05WWWNsdHHr2up7XGP1 allQW3Vpde3r2NDOzM/My9Pna2deV1NNTvXUztHY0tXV8G5sZmpdWV72c1xSWPbm71xlb2FX T0xIUUxITljy7ODq3c3R2vNl99vs+3X64utwX/3f2s/OzM3T/ldMTlhgZHPcz8/X5Pve3Gxd UlhcWE9IT1NYXWJv39ffenrc1tnxXWjzeV9SVODX6vls3+T4bE9WbGlkY/PKyNDS2crJ1elZ b/V0W0tMXf1ZU1/j0M/W6d3fZU0+P01RS05a69bY5mjy83dfXPvl8F5RWPTZ1ujqy8jR53Lu 5/1WUFv02tfZ3NLT9Wtabtr8XVhdbmZeU05q9mZfZPDfelpNT2p5/W5w2NTdcltv5edZVGXs 23xZW/71bW51zsPGyc/Oy9f+Wk1cd1xcW2bk3OPu2tLf9VVRb2tdVU9QXGNkaW7b2uX2WWtp VVBGR1RobWlf8t96Z1nu23ttXmTt1M/T1czHz99v5dLT3F9VbHjvaV5fYnpvYH3V2HhbWXfo a1xPWmxnZmZs+mlUTEtf69nkeeTV1OxjXejxb2lPcdPO2fve2tnsZGXq71ZRT2nU0dt4dODY 5Xxr5djn/Vln4udwVVhga2tsb+fcYUxERlNoY1FWZeff+m753nRhWl3fzs/zXG/j5OXu3M/X 2e372M/SbVpk69HY9evedVdLR1N832RQVmzpZFdQYXZbUlH5zcvbZ2H37PxlXe3kdlhMV+vf Z1Nc38zL1dvNydVuU1rj1ulPSllu/mRt69bXfmFf0sjTfVntzthvXWvZ5k5DQ1d5YU1HVfrl bV9lfPtNQkRZ3dvsa+bMzNLe2c7L41hZd87N3Wxz6vZmVVlp6vVXVF7bztxtW+rZ3fBtZmdc RkBEWd3jd2Bq4NHY2NHUz+1cYmXp6mBXT1/oe3Hr3tniZl1aY+ttXF1cZWNr6NzR0N3m4M7J zdfk/Ojkfm9iX2BYTUpOUlNTTk9PWWVo8dra5Xpz+eHS1tzta3tuY3FiW2VqX2Vn+dfX1dvp 3eTo3ubr9GpkV1hxe3RoWGX9593saFxiWlJPWPz6a1lUZ+3h3eXx3u39bm/k3e1gWGrb1+R4 XGv8Z2Vq7dXRz9vkzszO32VrdGJbWGHb2eHrZWx7cV9WW3L6/15QXmNVTUlP6dHW6Hd9aFpN UmLv2+1zaXH3aFdXYvXa5fTk2tHc5/bq29bf7+/h1eH2fW5vY1xmev10ZVxWXWzw9WRtbGpm Wl5aVFRUVmB37+Hx5+f79nBuef766uXV0d3e73XtcPXd3NLb6fNdbuvz63v+fWhdWV1eZ3Lz 19LMys/V6GxbTEtOTU5NSk1TV19oa3B0+ur4+Pfx72hcXGh+29bb1tbb6Off19HT3PD58N7g +GtpY1ZNTFVUWVtVVVRde+v47NvY2uTm5ejk/1lcXGnu8Orr7N/tbmpbXmZbW19i8+Tk4t3m 8Wxr6trO2GhaWlple2Z05NrQ1tXQ0tt+WFNabvb+693b6l5PS01UU01JT118/FxXWWJmVlr9 2NDW6/zs7Ozr8trMycze6tza4WRXXmzs29jj4/NeUUxPXXZtXFxn7ODkem/m3+J7av7792JW V1dnc3X7/nljXlhVX292X1ZWZfHu5d7Xz9DY5+ff1tr9bHDs7ndsdujf3vP629LR4GNdXWFm ZmRtd35xV1FYWllNS05TYGBdcOLV1uZ67t3c5vZsYfjf3N3o3dPY5X15dPP4W1RVYGhteW74 6ud89+bl4vhoa3X4//vuePxrYmNbX21zYV9mZfzvenfv5P1dUk5YeGxsenJ+eHFtcH7u29nk 4tvW2eDa29ze39/i5/N9ZFxbZvfm3OHi33JcUkpKTFFVV1dbYFpZWmD05dvZ1NHc6W1fXF1f au/c08/b5eT48eTh19ne6/v2b2ZfXWNp/+Xf6X1vYFhYWW3x8Ojg5fhyYGFfWlZQVlRUXV1j bGxqbGpu/nVrYmFlZGZgZ+vc087PztHW09rj7unr6+76evvu9f9u+Ojm7nd2fXvt5+316u/x eV1dW1pWTUpISVBWX2VrfW1sc/De3dne4u3t5//0fP/17vR649vQ0dzf7fLu6un87v5tbGhj YGT5eV5eX2luYldWWFtgXl5namJXTk5Xc+nj2tnf4OTc0dXZ4u5vXFxZWWBkaWt46tnPzszQ 3ODn/vDi+W5gW2FiY3zj5OV4aWdf+nT9emj9Y1dXWmt4bGZrb3V2Zl9eYWFiYmVw7+t2aVxZ X+/h4dXN0M7NzM3S1ON2aWd18XpsamhkXVVSX3Rsb21kYV5eYl1dY15bXm703+Dtbl1fWl1s Yl5ibfVzdfJ6fHl27uve3eLj4t7r8vD16eHo7Pz47Ovf4efl4NvRz8/P0Nn1W09JSEtPUFFY W1tbWlxrdG1dW15haHJ98ez9fe7u6NTS1+5qZFxu/e/e2tfY2dbc29nsbFpYY2BmX11sa37i 3NbZ2upqXFhYVFRRTUxNUltu/vXl9nJrdd7d6uz7fnpdXGj14NnZ4ujydejh7dve7/h6fnNq dm535ujf2NXc3+v9aVpbV1pfaG5sbXBnbnzzfnnn7nBlXVtWTUtMV2ppa//t6nRhdPj07fLv 6t3Szs/Oz9fe4dzf6Oj4+X1jXV9ibfz/93Zud2lkX2dvZl1gbW7x+W17b15WUFFVWF9oV1RZ WV5fd+Te293j3tnf397Wzs7P1NnucW1gXllcZXjr3d/k7Wpqanvn6eTZ3+328nBgXVZWV1pW W1tbaWVhV1Nda29tZ15YVldq6uff3NfS2NjY3t/qffro2drh5vF8YmhsbuTd2N7e3+7sbG1r bu7p7G9cWV9dWVFLTFBQUldZWVdbYmX73tLS1tzl3eHc2t/o6uvz6vRvaVtVVVxtfuTn7OF8 a2pfbOXW09ba6PP07u50bmlma3ZnU09OTU5VY3zj2M/O2t/vcnP+5+t+bnL+cWdnbXdnZmth Z11eaGJx9uTa19TV09XX2u54bHjs6/h3bmRkZF1jYl5hXVdWW1ldXV1eWmV97+fh4/dmVlNP V3r74t7f3ePi5t7e3tra0dTa3ObifGxsaOvo393v9V5VU01NTVFUWWlvbXj69vprb2hq+eXT 0NnffXnu7vPz/2tnXlxcXF5aYWpu7O/o4d3Y1trf3+jq7+/u+H1rcvt67drZ3OHx+W5582ld ZGJbXlxbYGFrb15ZUU5XWlZXWE5NUFv23NXNyc7X3uz18uv9aV1TUGDn3NTS09bk5t/f3d/v Z11daXBz6+Xh2t7q731udGJZVk5NUF1rc3dyeG1mZmxtfO7tb19fbXZx9/91Z11kcPzv9Pn1 9unn6eTe18/Nz9PV1tnmfGlfZWx74uDv4eh5ZlhWT01NSkpMUllgZVxfbv7n6OXme25oZFpb aXjv29XS09bb5+/zbl9kePPn39/u+vD/8eT18u3r7nX5+W9kXV9od/Ts6/jt9XprWldUU19m Y2dxdmdoXl9iZWtmeOzs3drg4/Z7d3Xo4t/rdG9obWp95OTb1NPW4eHX2dvpeWlZW1hYXlZn +X3t8PV1dmVZVk1JSUtSXGhx/+745ut7fGRreWn/8vHm7+Ln7OTv3dPTz8zN0NLe+2pdYmVh +/n77v7yZV5hWVZPU1dYU1NaXP3s5dvb2dTd6vpnWlNRWGNieHdy8nr15uPc3+Z6ZXNkX2Nm ffbm1c3P19/k3+To3d7g7XL373f9c25wWltVT1dfb2xmXlhbZnj+4fNsbVZYUUtUWGhvYnRo b3313tfQ19TO2uJ8Y25v8OLk2tPS2N3ubGVaXmdmZltdbX19bO/rdndoZG9lYn7i4N/hbWVf W1pWWVNOSkxZXG/l7u3o39rm39nd09Xa2d/l/3N5cnN479/d1s/P1NrY2u99/mxmYFtVT1ZZ XndsbXx3cnpkWVROTkpKSklRXWnz4evc19zZ5eLj9+Ph3tnc0tPY2Off5+/9Z2ldW19jbvnz fHp1bmRfcur7d3tmYFVRWGD79OTc3eL7ZlxeWVBVW11jYWZna3Xt2Nvm7ujc5vDy++jm4N3m 3dnc2+Hi4/T+cGt1e3rzfO7f5d/b4vtnWVlZXFlbZWvybF1dU01MTE5PUlVWV1xreO3f39fQ y8nP2OL7dXzu5+715NzS0NTX1tz9bmFaUU1PT1RTT1NbcuLZ19rg9Hl5ZWRjYF9ibWhdW19b W2NebHhvfe3g3eZ8/fzr4uXk4tnY3uTy+uvi1M7Pz8/S1+dvbWZWVFZka19fWl9lZmz98fxl VU9UU0xQVmBobfl+bXX4+O/n4X15+Ph4ae3v69TQzM/g43BaTUZJSE5j+9DP1dbn5+Le3t/f 3t7e4nxlX1xjbG5nZF9dX1xZTk5NS1ZgdPji2Nna2dXT1dnq5PtjXE5LSE1hcurU0M3JyMvU 2vlud2dvdXB0Xmjc2d7l29joe/ZsUlBSS0xMTlVNWGD89O/c6Xd25ebq8/ns9PxqdGxjcm18 /Pvj8+x9Yfp96d3j3u/s//7f6PNsaG1+7/R2d2RgbWFYXWFgXnjb4elzamhZXlZVYWz/ZGz9 bnl5durd1NPT1Nvl+v/+/vL99+Xl7uvxdHhmW2N0amnp3Nzd1tfd3t7deGRhU05OSkhHSk9X W3jm4+Xs6+5mZ2dfbX3k3NvW2NXX3+H+bGNcZmVmW1lqZGjz+O/2/N/X0NPd2tfY2vRvaFxY YGppcH70b11ZU0xHSE1XX1lYZ/zs39/q8era1tfe2dno/XJjXV9dbt/Z2eT86NfN0NXd8ubs 9fVydv72fm1lXVJQUU9YW2JjXGpjZGdx73f59Pbp6d3pfXJmcnBkYF5q9ufg631cV1tcZ2/x 3dTR09PY2uHk3tvd6vJnYlxUWFNZW2F8ampiXl9ZY2Rr/mx2+X1uZ2tqdPB4fuv4e2NaV1Vf euvo6ens6ejx6+ns2NXSz9XZ3+Pb2Nzg5u/7+fJ+b2FVTUpMTE5ZZHTu6ubd3+Xc2+l3aWNm XlhRTE1TX3Tl19vd4/VzZWRsc3X0/216em9z39fSztHY5/R1amFgXV9mYGh+/u349+3n4/dz aV9lX1diZWJueX5xbV9XVlVVWVtndfvf4d3a9HZ2+PJ54dnY197h6mpqaf/p4N7e3+bpenvv 5Nzb29/9YlxcXV1eaGtsfOvqc213ZFxXUlZcXm3z7un8cG1candpYmnv7vj/Z2JeaHlw5t3a 09PV2eTvffl99+Td2Nvn9/9iWltWW3P5c2ZbWllQWFpUWF5laHN0Y21yamdhZ21+4t7b2uLv +Pn0597Z2t3e4Nze4ebn3t3Z2uV7aVxeX15dXWNqbGdkZF5cWl5x8fl+9+/t7u/v83z86vxq YmBeWlVSUE5adera1t3a29/c5ejk393mfm1qbXr+5uPb29fT3epsXFJOTlFUWFlaXV5kdXp+ 6uTh6P3zalRMS09WVlxo9+Tl3dnd2dfc2Nzxfmlsc3f2eGxvePrl29bV1dPS0dLb7np3b2lj WlRYWFhWV1xoen3n6OnrcXBfWlZZXl5nYmBsdmRfZWr86ePf7Ovl6uXo7nJreHb49n11eevs 6Ob06unl3ejk3Nfb7N/k8vZpX1lVVVRWWVpcWVNXXmJaWFxca2Znc2767+Pe4eHh3d/p8/p7 b29qZ29xcufd1s7Q2uf7/Ht79Hf7e2dyc2tyc3fr5+vn7Pb59ff/Z19gXV1cYl9gamZeXGBk b/v/b2pnaWdy+vny9+rh4dra3Nvb2Nvd8H54ffJ4bmNs+vN9/urs9v94bWxhWVxbVVJPTU1P UlpbYPnp5ebw4t/t8ezo7P1uYF9z6uTg3dnc3u/6c2FjYXD6+O3j4+/u7OPj6ejp4tzb3u18 eGpuZGny+vn9aVxUTUpKUF1z7OPj8u/ybm9laf1t+vhoalhSVFZldt3Py8rLys/g9f57aXXt +uh+aWteaO/c1+De2t3feWRaVlJMS0xPV11ibmZfXV1cZvjo5+vwd2ZaWFlj/uzr9vPn5+zq 3dva2t3f4+nr5evj3Nnb5e53Yl1fXVldX2/yYFxt/fHv9Ozq7+/9amZdWFNPVV1jfOnt9fn7 bnzo5uXj5uPf3+To93JxbWxr8urf19/r+nRmY2R23t3c3+zu/nhqZm5yaGBeVE1MTExOVlte Z2xtcWtvcWJoZWl19un+897l+f91++Pe1s/S0dXZ297lbmt2aH56bf3v49/h3N7m6O3p4uD0 aF1XXF5mcWxwbl9TTk1OTVFXXWtmXVdaX11gZ/7d19XQ09bb4eLs4tva1tXV1t3pbWhjYGFl +vH4fXFsfOjs8e94fPR4bmNZV05NT1ZeW2n75Nje7XxmXFdXWVJPVVpcX2j36+zq4t7d3NvZ 1NbZ1trd3+rx//97d+rf6vp9dnx4/Ph77+no9nFiW1tTTk5TVlZi7d/h42xfZ3h8+PP+6uPx a2VcXvnu7dzS0Nnh7G9paVli+//p6fHu7en9Z238//rq7eTc5+fi6XRleOzp/mVfXFFOTktH SExPVF1iYGFhbO/l5d3V1tbT2eDo8e3t39ze2eLp6Px7cG1fXmNp9fbg3NnV2dne3+9ybF5Z UE1QTlFYV2x98N/f4e1vYFtnePnp7f1mX2RdXF1da/ng3d7m7OP1ZXv++uTu7Ovn3+7x49PN zMrP09Tie2BWUExNTktNUlZbWl9hXGJ76tzh6+v7dmVYUFBSXXF2/u3n6ez2+Pd989/X2N/u 7t3a3Ovv5eHd6nFkXltbYv/l29vr5t/me1tXXFxbWFlgXWL98/x19O77dGRhYGFdW15fZf3h 4Off39/c3ud3Z2hga2dw7+7j5tzZ0c/T1tba9P5mXF9cZmFZXWdYU1lXZ2dgdm1naVxYVFll cvXu72lcXVteee7i2NzY2dvX4Ont6flvbmpvdPLt6dvf4uXo5/ZzZmtzbnH56vT5cmRpaGJt cWZcXmNaYHRsaWxsYV5jfe3r4ux+9nlqZWpwbG92/fHo7e7s7+/69vXq3uTj4+nl4u3r3eHb 1t3ieWZeU01NU1tt9d/X2d/v/m5ZWVdYXWNlX1xbV1FUXGh38u7q9l9VUFJcaHbj1s7Oz9Pb 2t/f2dvk9/rr5e7i5Pj39fT7+/tuY2JiX1lZXVpkbXPv+nFrZWVcUlNUUFZea/rj2NbW2Njc 7mhdV1li/+Pd2Njb1dHPz9bd8fv4dmdiXVZQT1pmb+vi3N3v+fh+8fh9eGptaGBdXFxaW19f ZmRfaGRrbGltcv3x8X3/9u/f1dvg8n74dm1sa2RdX2p98Ozp39ze4u34eXby6vh07O9+/2lk aGFZVVRST05PUldXZnzk1c7O1dTZ3t7m4+bc3t7a5+jm82Zhal5aXGZtb25q/ebb197k6Orf 4t7a4+f2ZWBcV1RQVFheZGdfXVtYX2lnXlpgX2FqZW5zae3s8Ot6bm3x7/ry8+vp5tjX2Nfa 3d/q593d5ezycnn0/nlta29dVllaWVRTVVZbX2JeXWptbG1cWl5s4tbX087S2Nzf3ufu9X1v Yl9dWVlice3i29LU2t7f4vd2d3RpX2htem9y7d7W1dje6flxYFZPS0VESExPWGn9++ne4O9y X19qaV9j/uHl3dzs7Pft7O/g4t7c2tjj73x0dvjv3trk6W9hYlxmb2pv++//d3RzXlRNSE5W XGNp6uf1/mxw8OXf3dXS3OL4aGNaWVRTYHvv7W9kbW5t8N7V0tXW1dfY193c19nd3NzoeGBV UlRWWVdTWGJeWV9rdnJsbV9hZl5aW19jd+3m5Ofs7/Xu8W9fYWRdWV5rcevh4OPg6N3Y2tze 2tfhfPnvfWplcPjq5/l7Yl1dW2lhW11aW2lsbG9sbGx1bmReXWBueXd8fXP+8u3q8+vf2dPU 1tru/HZ28HlybnBzYV9jdP7+3Nfc4Ojo+mpkZXP89/pzfuvp3+l5bmlrZGdfVlFTVFhfcfbx 6+x8bWdeWFhbYnz36uvr297Z09jZ7HF5Z3J5bnl8dvt4bGtud/La1dzl6/9mV1JYXF5pc3fx /nJeVFRPU19hcu7g2t/ecmN9fvHa0dHR09rrZ1xbWV/45t7V3O30fXRjZ37v3NbX2OdqW1hX TlJSaGhobWloYlpZW19t++fc5flzZ2x0ZHN3e+7d397f5+5qYl9dYl1j/OXc19vj5Onb29jR 1d/zYWNgWltYYV9dYGVdW19dZWR68XRwbWdkYmRpeOni3e79dGJXU1Zn++Prfu/u6Ol4fO35 6+Hd1dPY3N7c2+Tw6u7s6+nkd2NYT09RWWd489/d5PpvX1hdXmF393luZ1xRWVtTWl1kXmV5 6+bu+P/z5+jg3trT2t3la2VfYmpo79/c19fSz9bueG1iYl5bWVlo7OHj9mhkbW98eHNiWFta T0pFRUpOXmx+49bPz9LX7ff++uvl2Nre3+Df/2549OTf3eT0cF9l/+Lc2tTR19zral1YWFZO T1FXZm1raW92bGZnXVJUXHv2cG974tvc2tzk8P7ydGBbXnD67uf//O357O32+PH+++rb2tnP 2Njb7vxnX1pSUU9RUU9QWWJq5dzY2PVoW1BOTk9UV2Jy9N3d3t/p29rX1t/d3+/6Z1tjePDk 5+Xj4Of6cWhtX2x4/HX2/2966edybmRyefvf5trZ3uF+aV9VXGVrXVdbVl5hXWJcWV9pc3rq 3uXd3tja73b3493d29zh3N/i82x17evz9GtfW2FfYGprYF1fXFxeXmRfW1xcW1ZVXl9q9nvj 4e7i6vPq5+12am1xeHvp5+zy7Nzb3dfY393zZg== --n2m-MIME-boundary---------- --n2m-MIME-boundary------------ --PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2 Content-type: text/richtext Content-Transfer-Encoding: quoted-printable Derek_Beatty@cmu.edu ABD Comp Sci, CMU, 5000 Forbes, Pgh, = PA 15213 USA = --PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.40.msg ================================================ Return-Path: Received: from thumper.bellcore.com (thumper.ARPA) by greenbush.bellcore.com (4.12/4.7) id for nsb; Fri, 7 Jun 91 09:13:07 edt Received: from sleepy.bellcore.com by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Fri, 7 Jun 91 09:09:08 EDT Received: by sleepy.bellcore.com (4.1/1.34) id AA00574; Fri, 7 Jun 91 09:09:05 EDT Date: Fri, 7 Jun 91 09:09:05 EDT From: sau@sleepy.bellcore.com (Stephen A Uhler) Message-Id: <9106071309.AA00574@sleepy.bellcore.com> To: nsb@sleepy.bellcore.com Subject: meta-mail MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="mail.sleepy.sau.158.532" --mail.sleepy.sau.158.532 2 Questions: 1) MM_QUIET doesn't seem to work in the 212 version of metamail. 2) I've been pondering how I am going to send you this 40mb mail message. I was going to split it up using the "parts" mechanism, but then it occurred to me. My software has no business worrying about message size. Its up to the mail delivery agent to do that form me. I should be able to compose a very long message, and pass it off to sendmail (well, a pre-processor to sendmail). if the message is too long, based upon the src/dst etc, then sendmail should break it into multiple parts for me, and send it as multiple messages. As the user (sender) I should be unaware this is happening. Similarly, on the receiving end, the separate parts should be assembled as they arrive; I shouldn't have do deal with them at all as multiple messages. I guess what I am proposing are two utility programs: msplit that takes 1 mail message and splits it into N messages and mcombine mcombine that any mail system can call to achieve a uniform mechanism of splitting and recombining messages, Kind of like: --mail.sleepy.sau.158.532 Content-type: image/pbm Content-Transfer-encoding: base64 Subject: Image wrapped by /usr/sau/bin/fetch_image Date: Fri Jun 7 09:08:57 EDT 1991 UDQKNzk4IDUzMgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAB////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////wAAAD////gAAAAAAAAAAAAAAAAAAAAAAAAAEAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///gAAAAAAH///gAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wAAAAAAAAA///AAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAf//AAAAAAAAAAA AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAA AAAAf/4AAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AP/gAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAfAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAABwAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAA AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAeAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAHgC4AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAABcAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAA/4 AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAXATgHgdB0DwDwB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAF4E4GMIwjBGB HxjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAABOCODBmEYQwwwwwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAA AAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAATwjggZgGAMMMMIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA AAAAEcQ4f+eB4ADDDH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAABHkOGAD4PgHwwxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAQ6DhgAPA8HMGIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAjAAAAAAA AAAAAAAAAAAAAAAAAAAAEPg4YAA4DjDA8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAABBwOHAUGQZgwQBwEAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAQcDg4JBkGYMMAOCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAA AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAECA4P8YRhHPz/j/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAHwg/g8F4Xg+Yf8PAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAA/wAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAABgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAEAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+ AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAQEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAfwAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAwBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAHQRwME/v4HgJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAACM9/DPDAwGMe8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAIkAAAAAAAAAAAA AAAAAAAAAAAAAABhDgwwwwMDBhyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAYAwOMMMDAgYYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAHgMBjDDAwf+GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAA AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAA+DAYwwwMGABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAADwwGMMMDBgAYAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAOMBjDDAwYAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAPwAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABBjAwwwwMHARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAQYwMMMMDA4IY AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAGEOGDDDIyP8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAABeDeD/8cHA8H4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAjAAAAAAA AAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwA AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAD8AAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAARQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAIkAAAAAAAAA////////////4AAAAAD////////////gAAAAAB////////////wAAAAAAAAAAAAAAB+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAjAAAAAAAAAf////////////AAAAAB////////////8AAAAAA////////////+AAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAEAA AAAAAAAH////////////wAAAAAf////////////AAAAAAP////////////gAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAEUAAAAAAAAB////////////8AAAAAH////////////wAAAAAD////////////4 AAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAPwAAAAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAA AADwAAAAAAAAAAB4AAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAB8AAAAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAH gAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAA+AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAIkAAAAAAAAB4AA AAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAA AAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAA AAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAA AAAAeAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAfgAAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAA A8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAQAAAAAAAAAeAAAAAAAAAAAPA AAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAA+AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAjAAAAAAA AAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAA AAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHwAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAA AAAAAAAAAHgAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAB8AAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAA AAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAARQAAAAAAAAHgAAAAAAA AAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAfAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAEAA AAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4 AAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA8AAAAIwAAAAAAAAHgAAAAAAAAAADwADwAAeAAAAAAAAAAAPAAB4AAPAAAAAAAAAAAHgAAAAAAeAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAABAAAAAAAAAB4AAAAAAAAAAA8AB/AAHgAAAAAAAAAADwAA/ gADwAAAAAAAAAAB4AAAAAAP4AAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAABFAAAAAAAAAeAAAAAAAAAAAPAAf+AB4AAAAAAAAAAA8AAP/AA8AAAAAAAAAAAeAAAAAAD/wAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAfAAAAiQAAAAAAAAHgAAAAAAAAAADwAH/4AeAAAAAAAAAAAPAAD/8APAAAAAAAAAAAHgAAAAAA//AAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAACMAAAAAAAAB4AAAAAAAAAAA8AA//wH gAAAAAAAAAADwAAf/4DwAAAAAAAAAAB4AAAAAAH/+AHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAQAAAAAAAAAeAAAAAAAAAAAPAAD//B4AAAAAAAAAAA8AAB//g8AAAAAAAAAAAeAAAAAAAf/4B4AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAARQAAAAAAAAHgAAAAAAAAAADwAAP/+eAAAAAAAAAAAPAAAH//PAAAAAAAAAAAHgAAAAAAB//w+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAIkAAAAAAAAB4AA AAAAAAAAA8AAAf//gAAAAAAAAAADwAAAP//wAAAAAAAAAAB4AAAAAAAD//PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAjAAAAAAAAAeAAAAAAAAAAAP//////4AAAAAAAAAAA///////8AAAAAAAAAAAf/////////// wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAEAAAAAAAAAHgAAAAAAAAAAD//////+AAAAAAAAAAAP///////AAAAAAAAAAAH///////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeA AAEUAAAAAAAAB4AAAAAAAAAAA///////gAAAAAAAAAAD///////wAAAAAAAAAAB///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAACJAAAAAAAAAeAAAAAAAAAAAP//////4AAAAAAAAAAA///////8AAAAAAA AAAAf///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAIwAAAAAAAAHgAAAAAAAAAADwAAA//+AAAAAAAAAAAPAAAAf//AAAAAAAAAAAHgAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAPAAABAAAAAAAAAB4AAAAAAAAAAA8AAB///gAAAAAAAAAADwAAA///wAAAAAAAAAAB4AAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AABFAAAAAAAAAeAAAAAAAAAAAPAAD//x4AAAAAAAAAA A8AAB//48AAAAAAAAAAAeAAAAAAAf/+eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAiQAAAAAAAAHgAAAAAAAAAADwAD//geAAAAAAAAAAAPAAB//wPAAAAAAAAAAAHgAAAAAAf/8HgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAACMAAAAAAAAB4AAAAAAAAAAA8AB//gHgAAAAAAAAAADwAA//wDwAAAAAAAAAAB4AAAAAAP/8D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAQAAAAAAAAAeAAAAAAAAAAAPA Af/AB4AAAAAAAAAAA8AAP/gA8AAAAAAAAAAAeAAAAAAD/4A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAARQAAAAAAAAHgAAAAAAAAAADwAH+AAeAAAAAAAAAAAPAAD/AAPAAAAAAAAAAAHgAAAAAA/wAPAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAIkAAAAAAAAB4AAAAAAAAAAA8AA8AAHgAAAAAAAAAADwAAeAADwAAAAAAAAAAB4AAAAAAHgAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAjAAAAAAA AAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAA AAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAPAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAA AAAAAAAAAHgAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAHgABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAA AAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AARQAAAAAAAAHgAAAAAAA AAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAB8AAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAEAA AAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4 AAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8ACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAPAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAA AADwAAAAAAAAAAB4AAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+ABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAHgAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4ACMAAAAAAAAB4AAAAAAAAAAA8AAAAAH gAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAD4AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AIkAAAAAAAAB4AA AAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAADwA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgCJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAA AAAAeAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAeABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgBFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAA A8AAAAAA8AAAAAAAAAAAeAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAQAAAAAAAAAeAAAAAAAAAAAPA AAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ARQAAAAAAAAH////////////wAAAAAf////////////AAAAAAP////////////gAAAAAAAHwAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgIkAAAAAAAAB////////////8AAAAAH////////////wAAAAAD////////////4AAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AjAAAAAAA AAf////////////AAAAAB////////////8AAAAAA////////////+AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAEAAAAAAAAAD////////////gAAAAAP///////////+AAAAAAH////////////AAAAAA AAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAB4CJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA8BFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwCMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPARQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4IkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAwQAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEAA AAA/gfAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkAAAAADwAAAAAM8AAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EUAAAADgBAAAAAAAACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAOHAAAAAAMAAAAAA DAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeCJAAAAA4AQAAAAAAABwAAAAAAAEAAAAAAAAAAAAAAAAAAAADAwAAAAADAAAAAAAwAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAHgIwAAAAOAEAAAAAAAAcAAAAAAADAAAAAAAAAAAAAAAAAAAABwEAAAAAAwAAAAAAMAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BAAAAADgBAAAAAAAALgAAAAAABwAAAAAAAAAAAAAAAAAAA AcBAAAAAAMAAAAAADAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeBFAAAAA4AQOgPATAAC4APAHgTw/gAAAAAAAAAAAAAAAAAAAHgAHgTwB7BOHAPAQwAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAHwiQAAAAOAEEYMY94ABHAEfGM9+DAAAAAAAAAAAAAAAAAAAAA+AGM9+Bhz334EY8MAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8CMAAAADgBDCGDDkAARwDDDBjhwwAAA AAAAAAAAAAAAAAAAAH4DBjhwwMOPHDDDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAQAAAAA4AQwBAwwAAIOAwwgYwMMAAAAAAAAAAAAAAAAAAAAAfggYwMMDDBgwwwwwAAAAADwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwRQAAAAOAEPA/8MAACDgMMf+MDDAAAAAAAAAAAAAAAAAAAAAB8f+MDGAwwYMAMMMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IkAAAADgBB8MAD AAB/8DDGADAwwAAAAAAAAAAAAAAAAAAAAAHmADAxgMMGDAfDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAjAAAAA4AQHjAAwAAQHAYhgAwMMAAAAAAAAAAAAAAAAAAAAAA5gAwMYDDBgwcwwwAAAAADwAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwEAAAAAOAMAcwAMAAIA4DwYAMDDAAAAAAAAAAAAAAAAAAAABAOYAMDGAwwYMMMMMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A8EUAAAABwCCDOAjAACAOBAHATAwwAAAAAAAAAAAAAAAAAAAAYDnATAxwMMGDGDDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPCJAAAAAcBggxwQwABABwwA4IwMMAAAAAAAAAAAAAAAAAAAAGAw4IwMMHD BgxgwwwAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwIwAAAADxwMIf4MAAQAcP+P8MDDIAAAAAAAAAAAAAAAAAAAA4cP8MDD+8wYMc/MMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAA8BAAAAAAPwC8B4PwAfAfx/w8Pz4cAAAAAAAAAAAAAAAAAAAAL8A8Pz4PI/fvj5v/wAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhFAAAAAAAAAAAAAAAAAAwMAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAGAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAABwwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAHiJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAHhFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAB/gA/wAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAH4ADwAA AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAA/AAYAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAH4AGAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAA AAAAAAAAAB/ABgAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAfwAYAAAAQAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAB4EAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAG+AGAAAAEAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAeEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAeAAAAAAAAAAAAAAAAABnwBgAAADAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAHiJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAY+AYAAABwAAAAAAAAAADgAAAAAAAAAAAA AAAAAAAAAAAB4IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGHwGAD4A8AAAAAB+ABjg4AAAAAAAAAAAAAAAAAAAAAAAAeBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABh8BgDjg/9+P4fhx4H58OH8AAAAAAAAAAAAAAAAAAAAAAHhFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAYPgYBgcBwPB4Bw4HA OnDgcAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGB8GAYDAcBwOAYcB4Dxg4MAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABgPhgMA4HAeDwEHAOA8AOGAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAY B8YDAOBwDgcDDgDwOADjAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGAfGB//gcA4HAg4AcDgA5gAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABgD5gcAAHAPD4YOAHA4AOwAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAA AAAAAAAAAAAAAAAYAfYHAABwBwuEDgBwOAD8AAAAAAAAAAAAAAAAAAAAAAAD4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAD+BwAAcAcbjA4AcDgA/gAAAAAAAAAAAAAAAAAAAAAA A8EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAABgAfgcAAHAHk8gOAHA4AO8AAAAAAAAAAAAAAAAAAAAAAAPCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAADwAAAAAAAAAAAAAAAAAYAH4HAABwA7HYDgBwOADngAAAAAAAAAAAAAAAAAAAAAADwIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAA+B4AgcAOh0A8AcDgA48AAAAAA AAAAAAAAAAAAAAAAA8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAABgAHgOAIHAD4fAHAOA4AOHgAAAAAAAAAAAAAAAAAAAAAAPBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAYAA4DwEBwgcDgB4DgOADg8AAAAAAAAAAAAAAAAAAAAAADwiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAAGAfHAeIHA 4AOBwDgA4HgAAAAAAAAAAAAAAAAAAAAAA8CMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAADwABgD/gD8BgMAB44B8AfA8AAAAAAAAAAAAAAAAAAAAAAPAQAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAD/AAIAPgAeAIBAAH4B/wf8/wAAAAAAAAAAAAAAAAAAAAADwRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAjAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAeCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAeBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4CMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPARQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAEAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4CJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAeAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAeAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgCMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAIkAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA eAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA+ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAQAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAjAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA8ACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAB4ABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AARQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAEAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAADwAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAPgAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAIkAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAeAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAQAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAIkAAAAAAAAA//////////////////8AAAAAAAAAP//////////////////AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAjAAAAAAA AAf//////////////////gAAAAAAAAH//////////////////4AAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAEAAAAAAAAAH//////////////////4AAAAAAAAB//////////////////+AAAAAAAAA AAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAEUAAAAAAAAB//////////////////+AAAAAAAAAf//////////////////gAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AADwAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA AAAAAAeAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAHgAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAA AAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAARQAAAAAAAAHgAAAAAAA AAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAH4AAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAEAA AAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAA AAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAB8AAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAA AAAAAAAAAAAHgAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAD4AAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe AAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAB8AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAIkAAAAAAAAB4AA AAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAA AAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAA AAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAA B4AAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAB+AAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHg AAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAQAAAAAAAAAeAAAAAAAAAAAAA AAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAH4AAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAjAAAAAAA AAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAA AAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/ AAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA AAAAAAeAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAHgAAAAAeAAAAAAAAAAAAAAAAAHgAADwAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAD8AAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAH8AAAAAHgAAAAAAAAAAAAAAAAB4AAD+AAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AP/AA AAAB4AAAAAAAAAAAAAAAAAeAAH/gAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAP/wAAAAAeAAAAAAAAAAAAAAAAAHgAH/4AAAAAAAAAAAAAAfAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgf/4AAAAAHgAAAAAAAAAAAAAAAAB4AP/8AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAARQAAAAAAAAHgAAAAAAA AAAAAAAAAB4f/4AAAAAB4AAAAAAAAAAAAAAAAAeAP/8AAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAe//4AAAAAAeAAAAAAAAAAAAAAAAAHgf/8AAAAAAAAAAAAAAAH 4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAH//wAAAAAAHgAAAAAAAAAAAAAAAAB4f/4AAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAEAA AAAAAAAHgAAAAAAAAAAAAAAAAB//////////4AAAAAAAAAAAAAAAAAf////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAf/////////+AAAAAAAAAAAAAAAAAH//// ////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAH//////////gAAAAAAAAAAAAAAAAB/////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD8AAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB//////////4AAAAAAAAAAAAAAAAAf///////////////////9+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAf/8AAAAAAAeAAAAAA AAAAAAAAAAAHn/+AAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAH//wAAAAAAHgAAAAAAAAAAAAAAAAB4f/4AAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAfgAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB7//gAAAAAB4AAAAAAAAAAAAAAAAAeB//wAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe H/+AAAAAAeAAAAAAAAAAAAAAAAAHgD//AAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgf/4AAAAAHgAAAAAAAAAAAAAAAAB4AP/8AAAAAAAAAAAAAAAAPwAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4A//AAAAAB4AAAAAAAAAAAAAAAAAeAAf/gAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAIkAAAAAAAAB4AA AAAAAAAAAAAAAAAeAD/wAAAAAeAAAAAAAAAAAAAAAAAHgAB/4AAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAH8AAAAAHgAAAAAAAAAAAAAAAAB4AAD+AAAAAAAAAA AAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAeAAAAAB4AAAAAAAAAAAAAAAAAeAAAPAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAA AAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAA B4AAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAB+AAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHg AAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAA AAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAB+A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAjAAAAAAA AAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAA AAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAA AAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA AAAAAAeAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAD+AAAAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAA AAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAARQAAAAAAAAHgAAAAAAA AAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAA AAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAA AAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAA AAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAA AAAAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAA AAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAA AAAAAAAAAAD/gAAAAAAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe AAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAD/g AAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAARQAAAAAAAAH//////////////////4AAAAAAAAB//////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAIkAAAAAAAAB/// ///////////////+AAAAAAAAAf//////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAjAAAAAAAAAf//////////////////gAAAAAAAAH//////////////////4AAAAAAAAAAAAAA AAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAEAAAAAAAAAD//////////////////wAAAAAAAAA//////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAA AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAB/4A AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAA AAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAH/4AAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAB//8AAAAAAAAAAAAAAAA AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAAAAAAAAP//wAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///gAAAAAAH///gAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////AAAAP///+AA AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4APAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAPADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAP///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAALgJwDwOg6B4B4A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAD+B8AAAAAAAAgAAAAAAAAAAAAAAAAAAAC8CcDGEYRgjAj4xgAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAOAEAAAAAAAAIAAAAAAABAAAAAAAAAAAAnBHBgzCMIYYYYYMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA AAAAAADgBAAAAAAAAHAAAAAAAAQAAAAAAAAAAAJ4RwQMwDAGGGGEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAA4AQAAAAAAABwAAAAAAAMAAAAAAAAAAACOIcP/PA8ABhhj/wAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAOAEAAAAAAAAuAAAAAAAHAAAAAAAAAAAAjyHDAB8HwD4YYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAIwAAAAAAADgBA6A8BMAALgA8AeBPD+AAAAAAAAAAAIdBwwAHgeDmDEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAA4AQRgxj3gAEcAR8Yz34MAAAAAAAAAAACHwcM AAcBxhgeDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAOAEMIYMOQABHAMMMGOHDAAAAAAAAAAAAg4HDgKDIMwYIA4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAADgBDAEDDAAAg4DDCBjAwwAAAAAAAAAAAIOBwcEgyDMGGAHBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAA4AQ8D/wwAAIOAwx/4wMM AAAAAAAAAAACBAcH+MIwjn5/x/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAOAEHwwAMAAH/wMMYAMDDAAAAAAAAAAAD4QfweC8LwfMP+HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAADgBAeMADAABAcBiGADAwwAAAAAAAAAAAAAAAAAAAAAAGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAA4AwB zAAwAAgDgPBgAwMMAAAAAAAAAAAAAAAAAAAAAADAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAHAIIM4CMAAIA4EAcBMDDAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABwGCDHBDAAEAHDADgjAwwAAAAAAAAAAAAAAAAAAAAAAOGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAEUAAAAAAAAPHAwh/gwABABw/4/wwMMgAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAA/ALwHg/AB8B/H/Dw/PhwAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAABgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAYCAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAHDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAABDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAfwPgAAAAAAADwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAgAAAAAAAAMAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIAAAAAAAADABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACAAAAAAAAAwAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAgAAAAAAAAMAcHAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIE8AAB0EcDBP7+B4CYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACPfgAAjPfwzwwMBjHvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAg4cAAYQ4MM MMDAwYcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIMDAAGAMDjDDAwIGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACDAwAB4DAYwwwMH/hgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAABwAgwMf+PgwGMMMDBgAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIMDH/g8MBjDDAwYAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAGDAwAADjAYwwwMGABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA4BAwMAAQYwMMMMDBwEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAwMDAAEGMDDDDAwOCGAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB44DAwABhDhgwwyMj/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4D8+AAXg3g//HBwPB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM --mail.sleepy.sau.158.532 --mail.sleepy.sau.158.532-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.41.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Wed, 28 Oct 92 11:48:41 EST Received: from thialfi.cs.cornell.edu by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Wed, 28 Oct 92 11:47:46 EST Received: from CLOYD.CS.CORNELL.EDU by thialfi.cs.cornell.edu (5.67/I-1.99C) id AA28892; Wed, 28 Oct 92 11:47:35 -0500 Received: from FREYR.CS.CORNELL.EDU by cloyd.cs.cornell.edu (5.67/I-1.99D) id AA24797; Wed, 28 Oct 92 11:47:08 -0500 From: raman@cs.cornell.edu (T. V. Raman) Date: Wed, 28 Oct 92 11:46:54 -0500 Message-Id: <9210281646.AA23424@freyr.cs.cornell.edu> Received: by freyr.cs.cornell.edu (5.67/N-0.13) id AA23424; Wed, 28 Oct 92 11:46:54 -0500 To: nsb@thumper.bellcore.com Cc: raman@cs.cornell.edu Subject: Thanks! (part 1 of several) Mime-Version: 1.0 Content-Type: message/partial; id=703.23422.720290813.freyr; number=1 MIME-Version: 1.0 To: nsb@thumper.bellcore.com Subject: Thanks! Cc: raman Content-type: multipart/mixed; boundary="PART.BOUNDARY.703.23396.freyr.720290812.1" > THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME. > Some parts of this will be readable as plain text. > To see the rest, you will need to upgrade your mail reader. --PART.BOUNDARY.703.23396.freyr.720290812.1 Content-type: text/richtext Content-Transfer-Encoding: quoted-printable Hi! Thanks for helping me get metamail working. = Here is my first attempt at multimedia email: --PART.BOUNDARY.703.23396.freyr.720290812.1 Content-type: audio/basic Content-Transfer-Encoding: base64 WWx++GPlcmTt4N16+P7o7trV2vXezdrqXlxiWk9Mc97sdfv+5ejh29/kZGZfW1JLaOvs9Ot7 bunY09jW3d3f4Nvnb11LWF9mYVv6XFlWUVhdYvBrYW7qzs/T0c/N19HOzMni6F1Ya1XvXUtJ SUtLTEpOS11YWOLEztjG09/PyM3pfFxy6f59b3J6XFxdcOPqfNz+6Onx0c/uWF1P0lpJ+1JU S9l497/O1n1r5v/g2NZtU11UWlV48eh9Y25ZXlJQWktGU97Z4v3MvL7B4Mm/y+9yXUBCRllM TVxR9ebP3ePWy2Jc9d/T3trr2Mhc/e/g2VJOTEJEPUhKVGRd18zU29PX1NPPzt34bmteZmxh 9V5OYvlhYHnjXVpjV+THwsnT6s7Ree/ZW0hGSFpd7uZsZ1lTVu3fTlnffNz62enVy+Le39Hb XWxbT0haWVFIWl9c28u+xs3Dy3df2PHzztn36PhaUVJMP0FUbF9U/tJoVuna7l/23ena7+fK wcbg3uViSlhsVFLh3Gdd/Plh2W1YTGzydNx25+3pXF9vZHnnV014YVzP5frm2ebMz1/Wv95p 22px31pNZ1lbbE1demjay81+5eRNUGRZWddtVeHN9tzaT1c+SV5nVnjLzMO7wczI2Hnde1RB Wl5JSF5ZT2xuatleWdrP4+rV7WrL5Oze2vVbyMXi783OTG1WTEvtVUbwbD9591lGX2VX1mF+ 48z6d+NefczC6NTD0dfS3HZvbFhdTGtrZGNN60xDRFJFcVpCUtHbbsTnTtrAX8LI3Ma7zFjn z8zU6UFBvN5dxNZIXX1OTedNOdZtPHTbUUzNTkLV9DzP30bRy2vnxlDby9nGur9kvsrJyd5c 6mpMPTIqT1YyXsdH+L7tab+6wrnAXNi15zzPRTVm0L/MVtvL6VXsSXRPc9dJSsS8TsZvMVCw vEw0QfJJX+c6TLvKQ9W3bFfCvjd4ym/LxNlXzs7lYvo9OLxeMEddVkZdzWnOxLrAfM/ExtTY e/49VfVFPENfYEs/Qu/Mv8Jh0MdPdcBLN8G/SFdfalfHtULStEtc1T45285BU/X7/MrGQFzS W/1U51lK3sbPP83Rc8BjPT1STV/cUEbTTUfiflHPyXXBzdzNwsnqz/7P0VnTRkdIST1E0k5O 6/RIXL7rZLzDWlNXYE/s0mBz00xSyGtmzc9MZ9hfUExJScvV79P3UUxz3/XwzsdO7dHozNzq fElezMx4V9fqXev4Sm5gTkRx71Bm09nl7W9n0NzQ3M/LbGvS2+ZLc/A/SPtrSObrWf7a3f7Y 3drL48zH9/jbcPrmX0pP7U1AXmNo63jv63Lq1OV/3MnN2dXhztfl5vpo+NnYW0tJS1JMRlp+ Zu547974eNzH2vjVyM7R3X9sWVZYTkRHTl5cXNzcz8rS2W7k2tjPy9frZmblfk9OUFFQQ0hP U1BVW2jn39LN7dnN0dDVz9LX2t79alpdeFhTT1paT1Jg+PDU0tR6eHppZ09SXWvn5dvU7H1s UVVYaX7t3ubY793Z0s3X3d1sXk5DVmdqWkxRUU5TZW7l3MvK3tnOztfPz9PmZPFkW1pd925T RUdMT11YVWFr1s3RycvJ2Of+adXT0dXzam5gY2x0WVFOTlNbbvrx5NXP2dPY9O5wfmxVXk9K V2L36tnN1NfK1N/q7dna6Nh3eOxi7V1Sbl9aXVZPU09TUlBVXt7g1c/Oz9THydTS2ez7XXJ6 WmRfTU5ZWm1VaOXtdtnNy8vOyuLgfHd1XHtdVE9NVFBHSUxUb3z8cmJ+ysXLycnM09XbZ1tf XGpXU2FRVlFYbWndzuV77dbMzvdja2Hr7V1RT19YVltp8VNOZVpt58zHztLTzuHl7e58XGxu XlVOaGtw+nXgeWdfX2lncmjz59zh6eV63dvq5tn+ZlxccmZaaF1Se/3e4Wn859XY6Nze5dt6 72Bf72VYTldQV1dPWV9yZmX32dLY2nljav3T2eTa29bn9NLg3dTb1M3k52xTSkpQVFxTTk9W +enh2Nbb5+D47+7a2u7h5XNiWVv/ZVVlfOLnYvH6XWBiYGF75mV1bWro08nQ19bUzdHe793p 5udte1tcYWJMTVxvbU9NRlht/XFk3Nja1tXLyMnGzN79ZHPc4+XjXVNXSk9dXWZWT1Jc6d7o 39XP0N3W/X595d9eWV9kVGvw3tPr3dXldWVh9n7u5WxbZ+vxaubsV1ZPUEpPcmPv9enO0tjf z97r39/vfeLsb+TW3O7f/VlOUVlbVF9paF996+fi6vptdvbjYF9tXFlRVm9la+zj9mz43G1l +3pnaeLb93vv7F1OUFxRU09WW/TKxMzLyMrN59fW4OPsYVROTE9bWFBWVFNXXFdef+zdX2js 4ebY1+nVzNXc6e/r7l5SWlJSTFRkd+7e2ePv6ODd7NjQ5vPa19/revNub2RXWmV26ORm5XHu 1OXr6Ofk7XLs2+liUVJYV19kTk5RXdnQ4m7o7tbM1eZle+re19rX/Fp253BdYW1dV/nP397X 2eLZ6tzgXGJTTl5ORk1RUFpm+/P1/n757+nfy9LvaF7o2e3N09bP1Njf3Obk2ONnVFR7ZlBN Y2JO+GJpT2Th5/pezs/Pz+5oSk1NPUZFXWnXz9LP18zdfvtr7c5c9/hFUNbOX2fo2u9patXK 48/N4+zUXU5ga87z8nT2Zf7ZfXt461VLW2JZSFZQZnBvYXHlUlH7zufc6mlgY+P33NLT19zN 6H7f9eHYzdHQZlDfbVVs31xcYFJHUVZp1WBVY11ma1lUTVto0NF+bsjLacC4w8K4v9HQ21lI VkVAR0k9Q0g8S1pRS174Umbh5Ovuy8nYzcXWzMHG2Xjf29rV+Hb58Nzt1u1fWmVJQmBwXlRY WklLSVlNP0pdaUlc08jByMPGxcW/wNnNz93j1dxhZ/tLP0RHS09KRD5W+fPd4N1jXHZhXmBT UWRhYtvOz8nKxsnMy8nT0NHt397kZ0xPVEtBR09HSU5QS23/TNbTcs26vbu/vsvQzNXvZWtP UVtARFJWSkdVQkhnQEl5f2jx2OLq4NDP0PLNwMjPz9TZ2ePo9uDvWkdNR0zgWV3s2lhk1mru 29fP1m5yztVP6+B4b9h3WGRLTUdDUVBY5W9jWuzc2eFj287UeHfcfVxT7m/f1eluXNrSztPX xN9c1OZOWvb9UltSS+pZS1fwTWXSWVvW4kfrzVpmxtRkysbn0M/c81dXVkxMU1c+SebWYsW+ T27F21dg8Pvh3kM8VlxF1c/e0M7J/e3c4OLSyOFdz8bOYkhaWVdNVlVLUk5hbGdp8d3ZbHzo 13lvztLLdu/VYuXOWkj9/t1cZnlUTVnYXPjX3911fN/qRkrV40pTzkRVxMjr3b/L2efTXdzd WOXdWkpvSzlCaGDkzdZjXNpkTN/NX+e/2+jF0kvVy2JZzddZX1ZcVFfseklRXmlOWcp4YszI 3mbRaXlWTuH11OTLyHtRXd9GTGrta2fE32LLwN1q3NzJ3tfW8mdVYlv7VV9LQ0VMYExv7Wpp 7/Np5tXY6tfXfmHm2N1eZ/JX7uJq0NPY2+TL1X79dFBaXFBpZ1ZZXmtPR/p+a+hlV/Dj3tLY 5v3g09xo73nr0OpTXGBNZ3xmYPXsVGfq+e/X5HX15+nb5ubOc3hcXl9v3+VrWXlaY2NaXW3p 9exWWd/cY3/c2t/w3mNZaE9JXlZP3eza6NrN3cfBzM/P3ubX0XdUQk9UTFhKXGZa43lT9Onm 2P5XVtzKbFB63+rgWVNZVnBZWsnS+s7ScWTe08q/yWHs5c91cmVAUE1GWFda3s7Q5snI1MjO wMx8195NU1RFP0RxS0/bTkTv1vDfxcLS4trPxsju0dhN5Oli0ddmXtxtRkVFQFVaU0xMYWfK 2uPHx8rn7+vt32FSRkFRZt7byczPvb3B5tXN2ntMZ2fT5X1TTlpNTj09O0JBPUxaWNzExMDA 2MvCyd9reM+8xfvP0VFLVk9ZZk1Z6/RSU9fP51xi0tnZ8XxRSk1PW05y5vRNVHN86efT4XFq 5M3T7Wb43NPO9uPu+vbc3mTl3Pbx91/9zMtORGf3S0l2ZFdSYN9hR0tTXlpuZNDO7N3W3lnd xNLOzsvPde9v819PTlxlXE1q1vRr4/RfU3vHztTMysrVy/F+6U9LRk5QTk5IS2Xob2lcU3t5 X3Lh2+jV293se+hnXftpa+Xu7ufMyMHf5tTu1N39UfbrZ+lcTk5d/XTp4PdmYn5pXWVQW19R UVFYUVJQcnPwysnezcLEy8/obGRZ7/VRT2BnXE1YU13R3OfY2+XZ3O3j3OXp2+5iXfBmTEtO U1ROX9l8dtDM91p62c7W0dpyfHHm7mJh6F1KSVVfUFRv7N3V587J2tvud/d27W5OU2lpYmvY zt3p2+H8dXpYVk5LTlJ07Hbr2fBfY3Xqde/b3NXPzM3T0tHe93ZVTlFQW2RWU2X+WEhZ4OH8 3tjb3u/329ng19jW3nR25+fqXVVaWWZ6YVdRWPBuWE1PS0lTeebf0MjN183Mz9HNzdfl2dPf bVZQVFhWVEpGTFlaTWbe497Py9bRzdd9YX3scl5hX3Po8/92eOTedm776+Pn29xsZ/b3X1dN TE1MXGju6PPp3uHr29XT2+hcWN3Y7e3a/1VaZlVb9uLa2OPm89bO3+/61uH4a2ldVmFhUUxS XXZoWPPoc+zfbVRf5uHo59/U2NrKzOJofGxQS1dgW/tsXE5TdnJZbdnk6dLO1/Lc2d7a39TP y+dyV09TXVtKUW1nVFpmbm3j1t/7XnHt9l/u8Wt76uH6Xe/V2tXP0dnb5uxvbHpcTkdGS1hQ WFp06d/n187dztHa13Vh+NTqdGP6+FdPVGVdaGJiXl912Nl+beDW4Hz32+Tc0tTh8X9iX19R VlpmalxeVWlv3Nrd39Xb0/nu2N/q5XtiWF/d3XVQXG1WVVJYX25wfHpZbdT2cNTe6+/s2NHe ++9+WW3Z7+/a2OlqbmnvW01SXmtldl5t39jY3uhmY15tcfnfztjjdONZW25WT05yYvl+/X7m ytLk2th2YO/n8G136WNeWOx6+PHl31v1bN14X/b2d1tPWujn4OPrZnFu3eVibNrwau5lU2z6 UlX+6u/9dnXo4mBo3N/vau7p7O3g1s3Mys/P2+rrX1RbUUxVaVpLW1BXV29ZWnptZFlY7mHm 1NXoz8XP2dTSxsbN3d3qYF1PVlNcVUpARElOTmpad+fn3Obs2M7O0tbL09XM0+nj7tvo82lO TU9UTVdRTVlaVGFod+vl8OfP6OfxcuTr/ezU1uDg2fn8cm5cUFNaWU9cVFBd/u1xbfDa3d7U 1+Dl9udtXv/va2JiXW7p5ePT1uLrb1RRZH9ifdjn92rrbeTU1+r+a1xvZGhWXFleV1bt4vvk 0NTY5+V0cGZXce51Y2JlZFnuburj2+NocHjo6HdkZG91VF7q2NDX0NXHze7a7VdZbNreZmdt +f1PSlV8VEpJQUhJTlVqeuvked3Ixr69xMfS3NjU2F5VWlFaWWVhUFZb8XFs5dzgZXbtdPzP 1fRUYO1iWFlrY+vj6nzv4W136HFp8/fuf3b079/cViungwoApICeACmfjzDL0bw5wrWhMCCo K62cIBnEn8AlLT20qGgjN6+qQS5K1bS6OjXNttNARlR+2VZDU8bB39vR4MrH3vrY32VdWlNT TllqZO9rbuHR5fHZ19zc7XRabGtMTVRRVfne6vza1M7O2s7R0Nnhb19jWGRqVEpQZF5PWV5S WP9/befZ2dz32O/WycnQ3NPn2+L2TkhPUlpnbNbo9MPWWvXO5fT/VlTj7eFxXFZnX1ZQXGZd 8F9eXu/b8Vhe8n3s2v5w+OPd1eDXz8rK1tJpbHJ8VlBaXVxhUl705vF06O72bvF3a/XczNXX 2d19Xu9WW3ZeW19eW01XWlP4993b6enfZUVTb93g0u1l3Mvd4c7n3M9rUmX3z9tfX1lq6+JW WVpeUWJtWvnR3mhu59fo8uhpcnnjXv/zW1hxU1RN3Mzf3fdu18ja19PrY/hiXXrpXk9tTltg 7eht7EpWYe3j+tvoa3vT3dXl2N/gfU9nW2zuW2Hw3NvY0eTY1dhiWFRgY1hOTkhVXtt8WVxc zejX5trK2npub97P0dtfXPVt7WNoeev3+GfvXlbvW1te6nL6a/J5+N/Xy9Z63lxT0+ZURllJ UHjv2m7N2eLNzs3b+2NPT1lWc1hNSnhra8/V28/Q3WxSzdPd9PtRXWd2YVvcZ3Zi7Fvj/dZi WO7t1c3Na+lt5GRfXlROUklFRFPVe1nfyNTadV+PuAYyoo3PFBSdqcmtMjXKpPNtNXYzzKo1 IUnBvv0xLdSrwjY547G2Tz9Xu7BXOWS/2NJkRFrZ/EY8W+nu69nZ3NrLyc7a3f5LVEzp3dfE cOht+NxsVEheTDxHS1r9091by87abmZeT1xlX/vm1s7kcmbddtXPzMXO0NRWTlrvfWfpzeBq 6+/wY3n290xET0tJeOf+V/73ZF1ed9DKzmrz09vgatTfz+bhT0Vyx1Zl2W7Z8VldZejdfFpL 3+Xna2fwamZQxNzo21tg39PmfORQXlnfcmbe/drje3Fw7u3R+uVoU1/l1GNkalpPak7T21zk V1pmc2Xp59TT28vN1lZoZElLS0hTXV1U38Xbxs3Iw9Pv48xuWGnlYU9eU1hzZUtVakflZU3j 72vf0N/r5OXVzNrZ0+f+ZE1QXEpRUFRoWfxaU13rzM/V+tDK09/tXG/9+lpNSUFDSUJIXGfk zc3VzL7GyMjJztzU0M3czsXN0NrsfntVTFhNSEZGSUZDR0tFT1VtdGBaZ/fb69zk3t7e0MrV 0dZc4fhv4mzm4HXva1hn5/Dv3tnMzNzY3ePea1ZgS1VMUXVtXml57P13bvl+39np6mfldfPw 5OHz7/jxc2ZhV1JaT2zo4fpfYml0ZV1OU1dqdOrezsXKztnj3djleGpc/ffxeOPeY2BmX1NN TlpNR0lNVvzm1dfc3NjNzNLT09XZ32/64dbV92fPW8mm2R0RpIwcDb+mwKo1J+miV1m/b0O0 tFZBUF7ozXE4RMPAU1Bc3b3AWERo0OlbTVRp72lJTtvP5G703s7XX1773/ZbYl964O9sWfLd 5vJiZXdvaf7q4/budV9WWXrtfGri6NPJzdrYztnwYFRPUUtNSVh+2NHPzM7Dy9psWVJMVFRL UWhsYOlfXnBjbPfm4vl+3Wzi0+zq3t3h3tja6c/fdOVqbWNbTUlmWlNVWmtge2Re6+DWzc7J zMfFzM/W3/xvXU9HRk5FREZHT1NYUWXv39PN1ezS1dDVztrb1uR0/uFjbWNfWlheWGT5WV7q 3ex/Zu3d4t/b187ScXbq+Xln71lbWltZW/pXYFBRWFZbW+vOzdPm7et4499ZZWVaXH/h7s7M zsrLy9DR2WBVWFlRS0dCTVdhY1NfU2br19XSz9HX19lvcl9s7VtqXFxf7udy3+jf6Ot1dPJs 935v8NjY5c/b19PZYldbU1FNTkhGTFdTVVb20t3X0MrHy9jOz9TU0OVXYlpeY1tXU1JQVVdT UV9/a2hnZd7QzczR0dTpbVVXXlJTVWFkZvTb2s7Ny8rSzOT6a2p6c2lTTlphYG9pXuv3aWXr 8fni6O/7+Ofs9V1PTldXVVZd89jV3Ofi0czQ3PJxdH5yYXHf2Ot+c2R14dze9Whral9XUFJh anlpfNve3efo7Pfh5f5ZSU5YXPXf8O70emrz7+zu5OLl19rY2dzj6e7T3XrubeV/7/ZnZVxV Uk1JSlRZTk1OWmt5YXvs2tLOy8vHxMbM0uN0Z2ViWltp7eP5WV9xeXNnWFZfXVFPV1xlcv1/ fu7e3t7c1NLPyMnO2Ov78WJYTkxOTU5LTU5WZv766dvd08nIxcnP1n1cWl9cWllQVGFrcP1w dN/a2OJ2/fLxaVlaY2l66O5t/d7k9Pnm4O55YmFhbPl/+Orc3fNvaV9icurefXj08d/vbmRf Z2Zvb3V5/d7a5npvYFVVWFts59ja7mhe+N/h3OPd09frc+7h3udqXmVt/XhcV1hZVVBOTVhv 7OPe2dfU1Nvg497S1fF89Obe4ebtaVtWVlNTWGVsW05PWFlbYmzu1cvHxsfO2+Hj3uXz/HRo W1dSXej0ZF5band7dXDi293s8O92Z1tRUlZp597m/fnl2Nrj8O31/W9hbu7v83NdaXD782ps fu7g7fxfW2l18evn5eDY3d7e2tPT2/5cVlhdXGF4Y1RUWVZXX2hiZ2py7eLU0NPY1tHPztfc 3/5mYlhTVlhWTktX8NfP2+jo29HY4fDufWZnYl1jYVZNSEpWX3B97t7SzMzN0tzY2+3+d2pv 7+h+e3x1a3JkUlJTWF1aXWPw7frx5dPP0NPa5fLs7vxoW1picHVuX11cXV9qannf29rr6Nvb 42lfY3h/YVZXa+3te3Pn7Ph9cW5u7uPo+Xjl4+1+ZF5qd3xnY3Ps39jb7N/Z09fm9mRfWlVV VllnaV9bXWlpa3fw+XDq3ed+c3Pu3tXW2trV1NpxZWVob2tqZ2vv7GlaX2t2Z1pZWnzo6uh1 b3v9+2RbY/faz9nUzszO3uzl39nnZkxGSUhISEtbf+fc3NjOzMvR2PNaT09VW3Tt493o6/v3 6Oj3ZmH43tra6eHn/Ph4amJUVlpYcPbs++7j9fns3uZzZl9lXVFcbF5l5dLkUnHO0nrtztT2 ZWN4W1Ds0uNnc+rzZmB3bGpyeG7+6NfN1OPg29Xb6WdhWFBQWGFaUFRaUk9Z8NvmbHD56tnR 19zW0M7Q2ejo28/ZYl9zZ1hMSlRMTuHpT01272ln3MnP29LTalvb1Xtdbt7pXGr5XWfn3u9t 6tbga3N2ZHLo/1VIRk1PXO3f2tnOz93f3Nn3bffl5era0+9daW9fX2xZTFj8YVpg9dbr387a 69zmXF5hXFNRV1dSWeXa/ejV0tDedXFhYXz17d/j7tvpXn7a3vPp4uHrdutsWWhiZm5VU117 7/v37ftmaHNoduDa2eLk29/r/uDlaWhqZldOVmJdX3RsXWrd33nk2NLOyM3o69rmYF5sf3di a/9iV2NeT05Xcend2+Pp5+5oX2dfb/9zc/LXzcvM2Or4c/xeUFVUWGVeWVhfYVdUWvjRy8zT 3dHM09nb7v99aV1ZVlpdWlhYX2ReYWRdYPPb1dLS2ufp7O369dnQ7V9YU2FubXdkYv5sYmBe WV/y7HN19ODa3f1o4s7M1+vtempxbnt2eW5aUEtQYnvq9/bf4t3b2u5tfe3q3974bGtpZ2F1 eXV5/fbr9m5mY2doXVZTWuPU0dPS2uzs7HBfWl/9cG5lW3Dr5X5mfPLh3ul6+9bQ4XddW1pc YFhVXGz28u7f187O2dvq/GpWTEtPWGV3fm1tbebZ3+Xqd2NbWmzi08rGyNns4Obj5HdXSEdN VFlSUlJcbWdifubo0c3OztXg39vb0tLd49rc2+VaTkpLV2hlWlFOVFxaZ25w7et2anfc3N7n 5d3c2eX7+NrQ0tnc4e7p7WpaUUtOXGzl7G5cVVll5tbW71pt3t3uY1hj3c3Kz+BoV1x6cWZo d/b3Z1RVXGJ9/G9sfPdrWlx1euXb2tbT3XpiZune2dvqffXh3+Z4WFllYl5daXBbTktU6s/J z+xwW2Tp3Nj+bmtt8+/6aWFx2s3O2uno+WpqVlZn/ufuaU5HTFh05OXt9P7p1M3O0N9/bW5w WEtPX/Lb1NHT1NbY61pUXFtcWVZcZ+zl8l1a8d3a4ejmemhz6exvdur4dvLzZ1leZnX16+Hg 1M7M0vxpXWR8bmRXWGrf2uliVF1n9t/u/m3q09X6X2R9bFNMSU9bbOPt69vNzub69PVxZWt5 3t5mW+/a5HP729vq7+PzYlrzz9N7Ulhn8HlbUlZp7nhbU05QXefVz83P0tzmdl9cXl5ZYfXq 3NXPyczV3+77Wk9RVVdfbW/o3+xeUVv7bE1MUl5aV1ZY6czDwsjU597Tz918aGrf3elmXPLp cFdKS1pdWlNY59XV2dzd3t3nal1eXmJ/dm3v3M/T5vNsaG1tXlFPWGdhXWjf2NzZ0NTi39HQ 3/D9/3JdU1ZTXv3v+WptdfdqWVtl5NzqaVlq9Ov/d/Xq3uhoVktOZ3X169vQ1upp7s3Jx8vZ b1loblxdd+z7XVdf79/ta1lNTWLqfXP55uxuX15dXl9havL6ftbP2Nve3dj7fd5vWHrd2djb 5GxTTFJm+9/k/vNyXFtTTE9Va+3n1c3JyMnO2tz2YmJcVlRX9upicnRpYF1eX273bV9o7Nre 7uPY2eLc3HNdbWtYTlNw/+rq5Nrf3dvm8+x6X2htYlVSXGVrbHhgUltiZXvd0s3O09X0a+/j 4Obx5tP2Xml09GdZUk5NXvtpaGvv2dTY4+ri5Pb2amD95OVuaHFrWFBNSFDs4dTP08rIzc7b 7drfZ1pPSURJVmVfWG/8dHLy7uLUzszU2c3Q29vd5upuXVxYW370blhLTVVTT0tMV3blz83V 1Nzi3+Pd3dra3NrneG1wZ1dibV9qbWdtbuHcf/vzb3J6ZVNTWmVka+Xf5+bY4O/sd3hu9eTb 7V5UVnF+8eDtZ2r04urw4Ob35uFvV1Vofnl3/N/X3e5lWVxfYmdldOHT0+H889/Y9lhVX2hk X1RPXXHo6e7s5tjac158295rU09ab9/Y297l29PU2ODc4u/q6+ppXWJSS0dDSU5YW1pl69XS zsnHycrO2ez4629cVE1RXnZ3Xlhcd+78ZnvY0t9uctXHyc7abVhWW1BFQ0lXYFFSbd/g7dvO 1szDwsrp+ejjd1teW1tZXWRnam3m9FlPXf1qW1py3tjY0OBkbW98bmp1/t3b3/Nz7uLe6eLh 8n3f0eZgW3P/SUFf4FxGUu7+WV7ieVRgzMHN08/N02lffmRYae/taWfo0dtqa+neY1FUWlpO VG91W17z4enm3NLMy8zU3N34cn5hUE9XWlhWbt7ZfFFs2+Vya9/mS0f23FBH88fL7d/Jy/lm 5+FYVeHN2l9d8HdVT1x1WVZbaGZm4OhoUk951tfj4tLLzNfZ3PVtZ2RaT05TU1FXZOjX1+bl 3u/m2MzR+Fln2VxGS2XT8mXa0ltM385fS1Tg0V1N89hqU2Lc297Wys5sZ/7lWUNIS0ZHZ83F zMS/xsrhdeLQ11NW9GdZWU9KS0lJX3pTTUlEPU3aytBxx7iwq6+7r7rYWUJHNTQ8PDU7QT8/ R1xPWWlo48vAwb+9vsLEytHd2NfceXj5XV1OR01TUUhJTEdOcez2zbu+x726yn3a0Hnpcu5Z WVtASj47Nzw6OVRbWuTLz9HDwMnJ29Xa4MTV1sTKz/Hf1szW7NZ6XtvmV0xFQUpTXnJYXHdY QUBGXFxm39XUz9Xc4N7Y3eRo6drW2tlqW/75+F9bT05g2theaOXU2NLVfvfp0+5XW+PnYFtL U3vf3NrW5tvQ22dXWVlZW1xZc93P3WlrXmJuX1FPX/z+6tjU09t8YFZd7uPc4Ozp1MzN1t3f 6HhuXlZed/5bXFZTX+rbbWtufVlLVltcXm/8ZO3V1t/q5u393t3t7erwdPbu5uDe2ud6aGFl XmZ4YVZXen5dY1hZ+9TY08/PztXvX270aVNQX3Tc4nZ75uXf4F9NT2R1aGVXWF9gbWZe7tTP 1NDR1NjkcllcaF5WU15jceHX71NU79DeY1ri3Wdv6tfW7d3Q7PrTzNh2XGTxaFpr6/hfX2dW T1NpcF5obGdkafXc3ej6ZW58dt/R3O/i3eH0bWRhXlhaWV5YTlZs283NysbM6PjW32Jk49ph SVrT70RJ4edPSWLabFDjydT37t3fXl7k1+Zoaed4W2zt7lhPYfFiVHna3uDVy8TD0ePe+ldM UVxNRklTWGH9727w2NDQ3N7Vz87cYVbi705KWt5jSl7uZFvgwc9ZVdvJ/lDfytZvZ25VS0/s 6VVV7tTcbv7h0tnm42JTWGFjW1pq08fYcenc5OxsWFdWTlNZ9dza1Nrld3FoaWFl+eXfbX/O 2l1d4M58S1zab01rxsbsWn/fT0Jb2/tbXW7tXlz/8+934t7qafrOyd992s/b9u7pZGFnZWBd VU5QTk1OWX7r7evu3NDMzNv7XlRa6+Jw283R3N/i6+jkbVVNSkxWV05ece3q497Z29/Y2+l9 8OX3Z2/l2tXge2tqXGReUVt47/lsb+jm5eluXFRqc2Fh793mcV/67eTc2utjXe/U7mNx4tXY 7fpydn18cG9ueer+XFpcav9t+fNxZXDl3Od95tr2X1hqe3nf3ObyZmp5W05KVOzq9Ovl3+nh 3uLe39/d82z63Nbkd1xWaXJqbmxw5ux7cl9nbXZdUVZu+evl+mhz5NfpauxuU01RbuXa0s3J z97b3OF+aWpv/2xsbv/4cWpuXV5pXFdZb3F95fHs79jT3Xde7eXg62VYUltmcXJp7Nnd7njk 3dvb5Hly595qVlVVXlxbXlxdY19vefzZzsvMx8jQ2OVlT0lISkxKTlt25OV9/t/Z2dvW09TR z83S19LV4flxZ15XU05JR0hNTk5ISk9aXVpt3szFw8LCwsTI1mtXT1tjaG1tfuvsblpXWl59 d2l34t7n9vr9a11XXGNsc3Pv/Wv6/vbp4Njc6O/09njg3OHieWh//nliY2RiXlZWYmVj89rX +Gln/fTt2M7P197qYVhQWWdcT1JdZ2xiY/PrdHn569jOy8vQ1tDO3F9WU1NTS0dNXnnx7X7/ 39bN0tzU0NHf5Obp625aUEtNWHBpVUtLUVdedufg29Xa7/Th19TW09zc19vi925leu10Zl5c WltdY/3obVpgbHj74dznbFtr8G9fXfbf29DZ4Nra1dTZ4PZ2aFNIRUlNUVROTldm9dzS0NDP zdbm4t7m6972avng5WRe9ut+b3ZqZW7v1tb4X2JaTk5MSlNXXl9XWO3T2djSy8rLz9vr58/N 42lmaHB5ZFlbYmVXTU5fe/fm7Ovb1tn3Y2Vv915WV1zr2Nba293Wz9rv9uTd4XpfW1lZWlxZ W1VLTlNbXmzx/eTUz9PPx8TS7t7dbU9PXX7m29ba1M7Y919OSUlLT1BOT1/86t3Z2dPa63P3 3tzha2Foc/X07ePp287Q2m5dV1daW1dZZmRaV2l66d/X2uTj3Nrv9tnV4e34dV1Sa+BfRkJV b2JcauTTzcvN0tPZ3dzqdWL+6WNOSU1YW1dXXHjf29vk8e3ue19hauzQzNxw9+XodF1dXmrv 8Gx43Nfn9+z1+en4X1VQVvd+V1lr4Otw5tjZ3tnZblpv1tV7ZHXz9PF1aftlVVtUSkVPau77 /NzUz9HV1N3dz8/gbmtxdWZbXWBq+mRQWfbv9u91X15uaWRcYf/s3+LqaWBsZmp4d/nczdfm 39TT6ubZ7V1ZXV1abN/U32Vq7nxhaXRaUlx27mtVUGvt+ffz/urZ1d7k2NnzZllXbuTe/XPc 2e5iZHnt3t7ofHl9c11VUE9XX2xkbuTa1t7o3tzd5XVmc+TW22xWVFlcUU5RauXe3N/c19HS 2+Xz6uTf6GZbanxtXVlbYGxsZl5y4Nzm6+rq6O//b2txcn16XVlSWnTr9/3p39nc3ubq2M7X 73Vx9n9iW2zp0tf8W1VbXV5aUlRdZmhkdODOy83U3+nk/WRZXF1gX15pX2rx9npdX+zd4tzc 6djNx8nT3OxxYlZOS0xTTkhIT2Hm293ncuvX1dx4aOvY1tzi3drX4WRbX1pRTU5SW+ri8eXd 0tPk7+Xa2uLucmFt+GxeX2FcXm5eU1hrdvVoa/D/ee7p39TT1Nz2bW/3dm1v/P9qd2345v51 +uv77t3c2d/l6/ju43tZSkxPS09XWV5z5NLP2NfY3t/f5fz66u53XlxbWFlZZO/g53Zq2cvM 0d/k5fX692lmWVJRUl5v5eHudnJzdG5gZH1qdubb1dvh8m5taFxcYGdmY2x0+ujh4+Xn3dnZ 29ra1tzzemRTTUlGRkpW+fprYGP95NXPzszJy9H9aXri2dXZ2N7tcVJKR0tMSkhFUm/p2c/I xMLG1W9bU1FWW2FSVG/s283Izdl5WVFOUV5gW23mz9HV1trd3Njeb1lRU15pZ2/v4dzoaWZj X15mZF5bau7f3uXa2t7raWBqcmlcW2rcz8/d/25w7nxXUl1o6evn09fd82JUT1NadXzr3dvd 3tjj5d97bWJaW195ZldQVmfm3d7q7t3X3X1p7djTz9bZ2+VsVElER0xRT09b7tPO2ODc4+X5 Wk5Se93a5uPSxsLL6HX9eGNWS0lTbGpifeLOzN1sVVFUVlRQUV7m2djPy8zS3PZtXVheav7u 6N3b2N3za19cWldRU1/26d/m7eDc3WxNSlNp/O3f3dff39XV0tPdbFJLSk5UXml47vf939PM y9DiW05SXn738uLa2eZvYFxTWFlSVmfn4On+e+Xd3+Dub2lwferc2tDP1NjrbWBbYWhjU09T XWhdX2fm1NrX2eftZE9GSVvn2trSzMjI0ehmWlpfW05MV/HW3OPb2NLXbFhbYW9tWlBZ6NPP 2N/m39zqbVhdaGhjaPPb1NThbV5XV11WUU9SYWNheezUycXH2e/7/H1dUlhj8OLv7m5ua11a W19icfTy+u/ZzszO1dnb5nJXVVZXVlJWVmXu7nNyb/Hh4t3e29LMy9DfdmtkWE1KSkdGTFNb 7NXX4uvf1czEw8fN2d71Y1lOSkdGRUVKWmXx4+Xb29LO0tDOzMnHxcjXZ1FMREFDR05PSktc /ePb3dvRyMnW6eXf3dfee2hrYF9cXXL38fliXP/d5H5mVVBu0Mzdf3hkVVJr4fRgX15WVmvi 7nT95uff2dXU1d3rZFlm+Ojl/l1ZXXftbV1dXmJxZ1pe++DYzcvKz9rb62daX2haUFNdaPt9 ZmNx/OX5ee/g2e776tzb7W9jZ/3rem1pZWBfanBycurY2OXz8drW7GxsbWRy9G9dU1dr/WVV VV506Nng3dDMy9fl2tvg6ndrX1tTTlZga3F4a1lWXPnra1xRW/nk4fvi0M/Pzc7OzcrP6ltR T1NaVlVg7+bq62FWWFdUUVNc79zkfHzu3930ZWLz3NfW1tXhdGBWUF1raWp72s/LytXef2V8 8mleW1lVWV9vYF728GNUWF952tHV3+jo4N7k5N3V1drnfXltW09PVWL172dXXW1pX2b55+Db 3+Lh3dLS6mNeWlVTW2d6fd/Wz8/U4OPldmlcWlVTVVdv+m9ufHR55NPV4PV0bWlobG9x/Pn7 dX7p7Px4bG16fV5KT/be52/z29/j0tp1Z2/m8mJr3tftX11mY2N+73Bz7NTN3G775GZXY1ZJ UXxoaO7rzMTUUkla8vvy5PXq7tzV4dzb3dzlaWL+6G9pYU9NU15WWGFr4szK2/97aFNSYvHt zcHH2+7V1epWT1FaVWRkVFxt0MrU19bdcGNeUE5QXm5ZU1tiZ3Dv3djU197r59HX2Nvl5+js a25iXVlOTk1KTFJaXmZ65uD0+fPv3s7Hyc3MztjmZ2BYTVRuVEJJXWZVVGr16eXR0uPcz8nT 9W3valBOUVdc+dva7uPV1vFSVVRQUFBddezXz9Xd4t/Z5Hvs2+j74tjX29HR6GlaWlVPTUxN TlJSUk5NdtTU1tbO0djMwM5UVuv0WE9eeF9f4tXo+OLc4/7nzs51bHBVTl13ZFhc3tvt49bY 4n1gUlFYaWNdb/Hd4v9kaF5fbnBfXv3Y09Xc7trNz9Ld5+bl3931W1pdU0pISklJU3X97d3Z 329dauvk2M/R1tHLzdPkfO5qU09OVV5wZlZUW/nt5Ppn6dna5Oze2t/fcVdZdNTbe2hofWxo W09UX2VeX33o1tHc3vZsZWl+cfHZysrP29nd82piWFNhX15ZWVteW1xbVF177fb47+rk7uHa 2c7Iydno5uHzYlZQS0tPUFJTVF/x2M/MyczP0tnl8+3wZFtVXGp09m5YVF5rc25y3tnd7XVk W1hbWk1OYOHXzcrLztff7O30enx+ZF5q/+jscF5VV1ZWVlVdXFxc7dLMxsnQz8/Nzc7V/V1T T1VRSk1WXF9iX1teXm18dN3Q1d3w8d3c/mxdZPfk3N7e6uLc5WtWWlxocGNm7dvb+WNu6+zr fFpd/+TobV9WY35qY2Z479jR4OPk5Odxbfrw/P/7XltbX11XXWFs6uLh3NjNzNHjbGpyb2Zc VltaWFdVW2l9eW/5f37v4Nva1dTRzdXpbWtuYV1cXF9lbmJaYmxpY1tdZnTr4NnZ4t/a1tXc 79zS1uB6b2ZhWFBLTFBQVVJXe9/i3Nri4tfPztLa3uXm425bXGZvaWJbW2P0f3RcWnX3bGBu +Of3Z3rx8PR+anvi29HU1tjd3O1oXmZv9Ptwb37f3W5davdvXVdbZXZqZ3NpbvP27O3u8fDq 6G9aWXBvWk5UZ+TR0dLVztLU6l5gZV9mYF5fc9/a62x95eN4WVBZbn73++nY2dnT4G5z5uT/ X1tdaWdqdmRgduns8O7l3PJdW3Xg6PfpcV9dWldfZF9ZZ/z4/fzf0tHW2dPS2tnfb1leZFVL TVNde+Xj4djR2X1gZGFee+3q39bP19ve4+XneVJISU1RTUtKUHrUzdTU0M7KzeVvb+fj7nr7 9e3h7npubmtOS0xLTVdgbnbo2dXW0tfj5tzV2d7n9nlkVVBVWGdgWF1l5tnV2tXS3tnW43z0 7V9PTU9bZ2Nfc+zZ09zxYPrz+/F8a+zb5XNfX2BfXl5r+N/c7eve2dfd63lu+t/Y4+xuZGz3 fWdaWlhXWGJ4bGdkYF1k/enl/Wz48+rg2tHZ5ODb3+Do8er3fGZn9+NuU01Va3bx+X3m2M/O 2e18aVtPSklXZVtYUk9bbu7t4tfUys1c6cLJyfbcz+FkXvFxTEtVbWJST2JrXVhf8nJfW3Td 29HIxMnX39HT6nlZT0xLTFRn8OTf7HJjZ25aUVBd/vfw69za3NfR2+/f193q9efb4OnpZ2Hw 3f9bWV1fWFBKTFdx7F5PUlt793r76NDMyMTGxMfN1nljWV9XUlRHSUhMU1do+9fW3uLs3d3Z 3dbidOvl7mRaZGjy7+tvXF585ndqa+bqenpm+uPn715WZ/P76HBe4+jtW1NYWm/k2ebXz83T 5HxnXmFkWVNWb9fa6NjTzthvbFdLUlpdVU1bbWxtf9rV3drZ3e/08/ZrWX3i5+3e1dr9cd/l 7eLS2mNVWV1XTk9JSVhjcGBv3fPo6Orb0M/R833i3954YGRVX3B7d1pt5Pp3+OHid2FoXWl3 1M7a3ePY2u/n7H1uVWZPTVhPW1RXXlv+3c7R2dTSys3aeFlicHxqWFx9cN3qcuHi2eZjXlVi ZV/4X23p8djrYuZ3/GJNWVR0e1z09dnKy8fP5dzu4mRSb196dVhaXVhjWVx/dd3c4tfl19La 1O1672r/XlpdUmzp5OL09tp9YVhPbVtWV1FcVWzp7eXfzcnQ3uz04v3s8lVeduTZ6N7c4Xhg Zl9zbVleTU5pavP77NvXz9Xa2n3y9FtYV1ldUE5WatjR1ej8cnXf3N7b1dneeWhqXGRlWFxe bvnd3dHW09Hc6mlbXlpea1RbW/p2bmZVfnJlXFRcWmplbWf50MfJ1/3m3d/f6/Ps2c7eam9m //VkVl16d/L25+zy3d3oaGltZlRUW2B1WVNPVl9te1lcX2zs2s3Lz8vHy9j54t3e6HfrZVxf VUxEQ1RWYPP31dvTysvL2OVqTEpHSWZ+b/lr4s3M0t3e5O38XVBQV21cT1J03+vf6OTb5N/j 91ZayWZZ7trD3fnWfVZP89h5W9/mXFFeWExNYXBTWd3P2ubT0tTe2dZeWO/U1Nfe1+Vz/ndX Tk9QTEhRU0xZdHzsdtzKztPPztbV2N3hd/XnX15bW2VdW1tbbPfn19/04uXsZlZYWfDa6Pnt 19Xh7Ofo5u9vX1BZVltSSE5bbv3r/unV1tza5ej0bvDrbvrp/utubX5u5t/6aFpZbP5pb/t+ 8Xjv39zV0uN3cP786OlpWVlgWlVaX2FlYW9928vP3utuXVxrZFpdWmv789bMyMjKztXW3Obs aVhVVFlcUk1NUVBOS0tXXFthft7Py8nM1OXs4Nvp+una1Nne3/P9eWhSS0tNaP1sXGH33tnd 6uze393sbnX+b21lat/Y2+L0enJybVpaV09PVV7x1NDV2eN8Ymnr9Wdi9tzk9GdbYF9kdmVj 6+Xf4Nva3efv5OlwcPV+YWBhbvtvaW/639bge21kbu37alVUYvjh4Onc0dng6nZtWl9dWFpd +uPd4+DXztpqYV9ieW1dX1985v5iX27t2d/cztn+bGJk493k/11TSEdGSlJm4tXS1Nna29vQ zc/a4d/wZmv67/vt6m1aT1NYXFxkZmJ+eGRr89jY4ujw8eDsX1pf793kW0pRa+3r4ufs2M7T 4uXe3dzzXV9sX1ZQXv3h3Onz+Pp3amZXT09UXGhz5NPMy8rJys7X61tJRkZFTE9XY2b54djY 4+vi5mxeb+bQydDd4dnT1+RrZV9hYVlYXnvvcVtbZ1tZWFNTYP9wbW913NrV09PKxsXK1eF4 YV1STlBZXVxofvDk4urzX1VaZ2Z77Ovt3+FxbW9/3+FyZ3BrZ37g6u/YzMrY9vvh8WFTS09U VVNNT15+8/rp1c/Mzdfrdex/ZV9ZVVhpYFZTYubQz9Ta6eXi4W5p+uNxaXt+3efod2RgYXV7 aGRvZ2Jk8GJd/ut7bGJZaPxjZHx87ujVzNLZ3uB2XldfZmNodejh0tHV3mRr+OpnX3Flbflo aefWz9/9/GZkZV5VTlplZV1QVWvv7HVncHru4N7v6M7Jys7N0djL2mpt63RYXVZVWVRRTU5Q V2FdV2lfZvLt39fR1dXR09Xb2OVva2JYWl9WTlFdZO7Z5erOycrbemJgfG9TTmNt5Nja3eDe eVVdYlhUXGdbXnDm3Nff4NrV2v31eeXrdGpeVFVjY2t5YHDe2tnvbmzu2vRhW19r5+vsfezW 42lr5eDf3mpbXHlwY15XZ37e6vN8aubhfmJ25tXR2+ls3uRfX2V27nhaZ3D65d3iaVJZVlRZ Vlde4tnpcH7l693Y2uHW1NvwfN7f3+TwZV9x+/5iW2R1X1FMSk5remdja+Tn/9rS0t/p1uLn 39bb629ubV12dndbavnu7ef9XFxUTk907uPnc27e4urc4O9YWGtsa2Pq4fT1fHbm5vVr7+bv 4f1dUFhr//Pu7Xj8+tzR2+Db1Nbh6dzT3fhnVExZZ1tNSUhQaWtbXH/ZycrQ3dvPx838V05O VFdcXFhrd/V2c93a3+Pf0c/N2OX5Zvr0aFxfZWdqZ2VcW1tZT1Fee+ja09rc2ubf4dvOzttn XGr1/W9lWF94emhoXFFYZXdkX27n3+b67uXq3+F3WFxr9fF79//l3+Xe6/rq329XX2ri1912 auDT225jWVJRW2tUTVzt8mRkdune3uDt4t7Z6+Ld3OPh8VpVWnfwa2Z83M7Hy+Rs5dfh+lpU TEdLS01LTmru6GRu8vPc6N3cztXd43Tv5eHez9v1/fN8+m9VYXBkV1Re6OBvduXf321r7uzq +2JTX+bxXXPg7V1j09FxW13o7mxe8uTzbPL+Y1pccnloZ93mYuro19B88una8H3w+8TRY17a 01pHWG5USk9+3tnhZF9Z5ehq7FhZT1Rf1c7O5fHI0PBvyr/QZU5l21hPbtpsTVZp0V1ITVls RUh+ychu0crYaFXh1llS2OpRUGPOzP1V6s9iYmTW1/h8+9LL0XxyfVJmYU5qalNNXEQ+2m9I ZdzE2uts3tdjwr/U0cfGZkpNbmY9Tk5c5lTv397W5PXg/WNT0tdfWOvW4nXq4txYYtnG70hr 7m5QX9za90x74jxO7Mvq4/Pf2VlR3v7/z09Md8fJ9MbL4s5q1N/n+U5dQuVQMjlCckY+c762 zd/Iycxgwr3QdFzTz+LwcOZWSU9VW09JVlVOTVjr7nlM1sTQ+VZnZnh8eOR03dDMy9vf08fG 7kjt00tAU9BUQVbMyU5Vw8RIOXbH2j8+ys4/PVa/70BI7b9XOEnIwM/CsbW+2OXHy8jHwca/ v879W0I9V15FOz05LCQnLy0tOl3rRztIWN7rxrWxr7arpZ+bmpqdpbXgPjlAXe/LxflCKx8b GhoZGh4jIx8kLi8xOU3PvbO0r6m2qIuAgImcqc0fCwwcOseumZCb1B4XFhAVHC7MVUIsHxgS FBYcLjz5zdmqpLDOuo6AgISWnJwlBwUP0q2ok4+Tqx0SEBMQFSxJPy8lKCIXERIXHSI2zbOk paapnIOAgIidoa4YAwQT0K+mk42RrxoPEg8NESnI3zkzRDMYDxIYGhstuq2ppqOnm4GAgIuY nqUVAwQTRVS5lIuNpBwTFA8LDR9b2nvQrcYiFRESEBQgRL6vopqgupeAgICOkpieFwMEDiIp VZqKiJNXIRwPCAYNGy1UvKeoPRsTEA8PFSi8o5yXkY+GgICLlJiXrygXFRsaHBoePcu+zm7R y3EwIR4dHiIhJCksLy8vPG54duNq20osNc6cjY6Mi4OBiZO6tzYZDAUIDQ8VFi2rnJeampWX qEchHRcOCwoNEhcfM8uvsa61ya2YjImKi4SBh4yxsjkaDwQHDA0UFR+5pJycopuZorw2KSQZ Eg8PFBUUHCZyvMW9v77CoZKJiIuIg4OJl8jnJRcKBAgMEhgZLLSelpqal5qlwzIpIBUQDA0P DhATHj7jyMWtqJ2PiYSHiYSCh423xz0dFQYHDQ8WFBg8wKmlqJuXl5+7TzMhEQsICQwNEhwz s62opqKfmo2KhoqJiIWJkq9PPh0VCAYKDRAQFCy5n56fm5eXoLlENCkYEAsLDQ4SGSfrua2k qp+YjoiHioeJg4uUsDcvFQ4GBgsOFRcaPMCoqa2fm5ecrLjQ3RoODgsPDQ0aJzvIt6ylo5CH g4WOjIqDjqchFx4PCAEGEik9ON6XjIuVn6aqaRkNDRETEBEcKC4rJCYpIB8aHCycgICAgICD ipwBAAAABgUXl4CAhYeaxB4CAAAOP7Ohi4OInRYIBwAABAscnpqcm5++J5mAgICAi5WKHAAA ABE2K8OKgYSOLgYNCQUBE5iEhY2UmskNAAAFDQ4ZfZuQoi4cExcf3YCAgICAhI8OAAAAAcWP jYCFiJAXAAAABAk1iICAhIjPEggAAAMbvqqhnZ+/GQoNFBowgoCAgICFmRIAAAAAMoCCgIOM jSoAAAAAGbmMgICDiLYGBAQBBRWskpWt6TMcDAkQFh6ngICAgICWFQkAAAAFmYCAgoWNlwsA AAACsYiEgISIjxkAAAEMEimskpOoKxsPDQ4QHCKTgICAgIJCCwoAAAALjYCAgYaUPw0AAAAG l4KAhIiLrw8AAAERLMrMqau9JxMODg8VHSidgICAgICnCRcDAgADvYCAgoWmIRQJAAAALouA gIyXsDkQAgAIG7itfjYoLyQXDw0PFx80i4CAgICAVQoMAgUAC2+AgICElBkJCAAABB2bg4CE iaMcDQUDBAsfwqKm2jUoHxkPDBMbKY2AgICAgKQKAgAAAAUjhYCAgIeqBgMAAQcRu4qAgIaL rQoCAAAEDi6klJmuLBgVEA0PGCGWgICAgICRCQAAAAMHGZmAgICEjg8AAAELE0eYhoCEipcO AAAABhEynY6NlsYaDgwLDREgn4KAgICAhC8AAAAGCRMwj4CAgIaRDQAAARErrZ6PiIaOug4A AAEPKK+cmZmfvyUXERIPEyWhiYCAgICCoAkAAAAGESmdh4CAhYm8AgAABhYusZeMh4mYKQoC AgoXQayclpeasTMZDAcKE8CLgICAgIGUDQAAAAIOO5ODgICEiawGAAABES2plYyKjp8oDgYF CxhdqJ2anKLVJBMKBw0Xp4eAgICAgp8IAAAABhW8joKAgIaMNwEAAAEQMKKQioiNnDUSCgkM GTivn5ydrTgaDggIDhqbgoCAgICEwQUAAAAMJZ+LgoCEipIZAAAAAhFOmI2JiY6fKw4GBQoY PqOWkpWlQRwOCAoQLY+CgICAgIgwAQAAAg0jp42EgIOKmw8AAAAHG7aWjYuNl70aCgUHDiO1 mpKSm7srGA4KCxqwjICAgICBjhgCAAADDjSaioSCho89CwAAAAsjrZOMjJOnMhYNCg0ZR6GV kpel0CsYDQsPIaaLgICAgIfTCgAAAw0mrpKKhoaOtBYHAAEIGM6Zj5CYqz8dEQ0OFiu2npiX nq5uKhkTEx3DkYSAgICJvhEFAQQLHEmdj4uKkKQoDgYECRhxnZOSmKbYJxYPDRIdPaydmZqe p9YmFxIXNpyJgICAiq8ZCAQGCxgvqZaNio2XTxQIBQoWPKeamJypzS8cEg0OFyvBopmVlJmp RicmLlusmo6JiY6eUBsSEBMbJlG8qqSlrfctHRkbIjJN9tfNyMpfNiEZFxwtbqqdmZmdp8Q+ KCIrqouEhpO6Kx8rLT4nGxodR7aforXNNzYpJR4aHB4sR7+zxUwuKCgrNfeun5ycnaCrzzYl ICuukYqLlqtKNTUvKh4bHjK4pZ6ovT8qIxwaFxgbJkrHvOg/My80PFXErqWfnJ6jqbRnKx8u qpKMjpm0Pi8wPDUsJCY0Xrq+00Y2LykmHx4dHyUrNkDSvbe5xM/bw7muqaSgoKKqyDMkIic9 v6WdnqOqrLnSRzEsKjE+XtzPzexTOC8qKyolIyAnNcquq7DMYVhaS0vvvK2npKu7ejw6O1a9 saysq6uyvnZBNS4rKThbvcHQ0vBaOj5BSEM9QEJHTvDHv85WOTQ4Sc+9trW+v8fsVj84OFTI s6ysrLPHbDkvMTlv4srGurK7zzgvKyosMkT0u7q6vtDS4mpLT+fQwbm0ssRMPjQ6My04RcWw qaeuzzcvL0I+QEFKvLCmrsFELCssSmzJz1howK2tt1lCODE+Usq6ucHB5lc/Nj01P0fcua6o sb9JOTMzQkPc1cK2uLbAbTowKS8+6ry/vlvXf8/PSkI1SOK9trOzu8tbRzk+P0JO2LOxt8HO STgrKzxDyM28vsi9WE85Mz1B4L+2usvM3NJfPj1H2b/Dz72zuMk+MS8yQkhjybuxt7/TW0cy Li0xUsu1utJp28raSjI7a7m0vMbPy9PnSjo1PN67sLrL0urtW0g9PTxGaNG9vL7Hye5bPTQ3 Qmbn13fU/m1daXBmWVFdTdfIxs76Uk9MY8/EvsDFw7u4u89JODlBUf9bVFfdwMPLV0g/Q0Q8 OTxdzNZNTP2/xN9QSWXm2+fuas7Lzv5Ybcu4tbTCuLW74T8+PkA3Okb21+9VRkdDP0U9QUZM X2rEvb7L0c/HyNB4afdkeGd+aWFNSk/Wwru4u73KY0dBSU1BRl+7vbvF9Us1PkBVRTk5S3Fr 8t/NyeZOXs65w0w/aL+9117sw8bddd26vcN0TFZW913qYUtCP0FJYHPoXlrf1d1VPj1CU1dd c9fL1+PKvMFWR0rmx9vo17/BytPOv77LX09NUfbcWkdDSlRHRF/J0l9b/uBePTtCT1xl99XD zPZaXtXEyNXcxb7HZVvs3+VmXlhWTk7m1fpYXO33YExM/dnOxb+/z9fX4VxBSFtySj9UbH1J P07u1VxMVm7P2dfPz8bP1uDMwNdZ5cjJV0dm6WtHR933XdLSyN9YUlpcP0ZVZm1LXNDNenXc 0t5RV+Pcdltb8OFaTvHKyNFz8snMcO73bGdcY0xISGnl6t3Z187Kz/pndnxjQjEhHyw6V82u pqalqq+uuLjHyeNOO3LfNDA2+ldGO13tZUM5SV5VSj/t1M7f1dbMz0/j0s/fRlNhyM1baWpi 7N7T1vXT1+RNP1pcWWz3xL/Cw8fHa05v0NN4duJrXVpRT0tOT0dDXMnF2f7lzsbXV1RoY1dP ec/WW0pUST04PFtcTFJj2ORe+djEwtfiwrCsr66vtMZEOTxCSU7Xu7a4w+JNOzAoJSYnKCgr Mzk8R1RcU8ixv87GrqOel5WZps5TPDUvN+mxrbe7sc8xIR4pLioqLjo2LCosMy8uPuvCxlhB 5cvdY8y5tLS3p5iRlJedqbxVLyoyWFtLx7S0QiYhICQiKzjLu7hHNTMoISVDNzw/NkNXOE/K vTtSr6iuNDd9qpqNipiYqrMiFxwszE+5pJ2nTSQpJiIdML+/PjhBPyohJzAsIi08TUtL4b7c x7KstL6uvU45n4uJlaKdqS4QEx89NlWjmahCKi0kGxsvzsj6zbPNMR4dHRocKU9bbr2xuElA xLLE1aiqy2eOgIWnvZqfEQgRrFkbvJSPtyEtQiQNFGC4ZC/OrToVER0cGRo4qK9mu6a8My++ ocI3e6aYgICMlJyaKQsHHj8ZSJmPm75DOCYNDB0qOTrdvXkhFxsYFhknV8CrqaisrrS9fdq3 1k/BiYCDm5aPrgwCDT8RGqSNkpyp/kESCxIXHivf17pZJiEZFRMZHznCrqqrnZ+8V7OxLSym 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 SEhHPUdjzLSwq6Wfnp6jsa+10O/J4lJHQ0xtY088NCsuLS45Ojw1OjQ4ODY3NTY3W+C4qquv tq6yvrK7r6+srrSvsrjB0u5aTkhGQTo7OzkyLSknJSIjJS49SFXMwMezuc7OysLFuK+vqKWk p6iqr7e96FhPQkM8QDs4OTEzLi0sMDQ3QEVwYuhUQEU+PUA/QEnfycC0sK2qq62srrKxtbi1 tbG2v+1SOjc1ODcxMiwyMzoyMjMuMTc2OURHXfjq0sm/wL/EvrSwr6+tqqmoq66wuLq+wdxO RTk2Ly0qKy8vLi8uMy84ODg+OTw7RlXXvbe5r6yqqqiprKuxrquksM9HzsZKLzI+Lyw0Py0u U85OMC5Ot8EvJB4cHBkjJ3K4qqWYlJaVl5SdpKO5y3c7Qzg2MDM9LS81NTRDPjw0LighHRwb Gx0eJCw5T62elIyLi4yNjpah4DUhGxYVFxwqO9u+ta6tsuo/LycgHRoaHh8gISsyNzRNr56W jIqKiYqLk6A1IhQPCwsOFi3rqZ6YlJef0y8eFhEODxIYHCEtQ+vvVdWomo6FhYWGh4qVthwT CwkGCAwc6KealpCQmK4vHA8MCgsPGSo6TnK/r78yJ0+nlYWCg4GCgoueHBIKBQEBBxNLq5mR joyPoi0ZDwsJCAsTJj7Qu6+ntj4nKVCfjICAgICBg42oEAsEAQAABhq8nZGOi4uSryQSDAoI CA4bL9iyr6ijr0UrKS0yso2AgICDhISPzQ4HAwQBAgodrZaNjIuMlLgeDwkHBwcKFSpgt62h nKO6T0lRXWauioCAgoiIiZEwDAUEBgUGDCyjkI2PkJOfMRMJBgcIChAm2qiempiZoa/CUT9O UjxukoSEh46Qj5hbGQ0LDg4PFyy5npugp65nJRUNDREVGR0vvqekqKipseFNRUJPRzrBjIOC hYuMjJXpHA0JCgoKDx49qZ2enqLCLRoSEhUTFiA6vainpqKnrLjI+ejEvLe+zMSvnZSTl5eU lqDEMCMeGhYWGR4oMD1gx8bUVzQpIR4dHyYxQuvFuLCxr6+usLSysrW3sK+qqKOenqKst8Hj OiomJiwwN0Jk2M7Jp44SAA4TnDqPrfGfkJmdr9KtqaWu30qvraq23/26vTguJC4+QjlLvK2u tsjI03w4MTU9S+/Rx7K0r6yurrO3u8PKvb67y9PN0d/oy+LOxsiwrK+urq24v8nWzc1gUlTh u8XNwr++zOZeUfNt7OPmvtPq4tHC0U1IPz5WT8y4ub68vL7Jek89N0JN3svDvLmyr662vMdC PD9W1PzLxb680c9dSWE/OkE7b95+z8jXwszt7UFGPT88366vtc5cx62v3WpE+EcsP0hN3ce+ tq61v8P01WE0Njg+0E86RVLeUV/P4NxDS0pFcMvGx8i0r7G4vsN5VUtEQzw3QlPZaVHBw8jX P2tWOj46PFTOxr+6vb64vc94S0o6Nj5b5WnLur+83s7iOlA1MkE8y9/qzMmut8zhb15GODRA RVPT1cq5xcTI1s5lSEZEPD9JXnfWvbm63lze1FpLQkz8c1xLRl3O1+lu29HV3rarrq2zrq20 srS819plW9xmVGJI7vdJVT08RUM+ODxBT0pETk9ERz0yLCwnICYhHyEfLz06872opKKfnpub mpiamZmanqSps7vbSUVFOzo6NzIyMSwqJSUiHh8gIygpLjdManvLxL61sK6qraytrrK0sre2 u7i8xrq3vs34Vk85MCwmJR4cHR8kJCQsMkdlyLqvrauppqamp6+trKyzxczMxs72z83cb0dO VE1WUW//Xd3S1WdIQj05ND05Nj5CSlBGXv1gW1jzaPNfSN/Kx8za1/tIUE9nWlt8YWfbzPJQ S1bS5mlv0728z+3N0HVVTl3zc/HUw7m+ytrO22ZgSkhBQj5JT/hpTlFPTFLp2GVJXc/Fvrq4 uLy+v+XqZFlSTVnNxsTDyMzY+eBPP0pFPTs7QEpGRUdHSVNw3uXj7NrL3fZv387T1Nf4ffJe XGrt4Nvr2uHT1M+/zNvV6tjY7FxNVl1QQElo5WN93drZ2dd2TlNf7fdUV13nzNF9S0RFQUdN X93MxMTLycfI3f1kbOvR1ftr5vNoX+TYYXhaYVtcYmBUTlJOVFRr09zxb/pwZU5o3tj0Xd/T z9zc2/RaRUde3Nbm5s3FvsXNz3FTPzU0PFHh3dnUxsDF1mhaXWlrZk9q287f+G7mbl5JQkJD TU5bX/fQwb68wMPDw832Z/DxbFROXfjZa2dVU1BNS0dLTl1+7mXl1s3P3PJsWlFdT1ZqcuPY 1t7z3tvd7Wzt2tbR0dTSy7++ydfu4NpuUUM9PURKSUha5NPV1ODwX1RLSUI+REZAPUxgbO3Y yszXzcvNzsK7trKvrKqqq621vt1QPTQwLC0wNDk6OTczMTExLiwuNT9FQ2HtzMTExL24uLy8 sqWdmZaXmJqfq/0tHhoZGhwgLEu9s7bD2EwzJx8eHyIoLDNAX9nJxL/AubKwsLq8wMG1pZqU lJaZnJ+vTiIZFBUYGx8qVK6hoam20j4rHhoaHSUuNDlK1b/B1uvGvbu8vMHFzuhZxKOXj5SV mpqdrzkaFBEVGB0kNcOjnJyeqbs/JxoWFRgfKztg08jCy91cTklYcG7h38fDz/tcqpWLjJGW mpil7x0RDhAXGh4p26WampykuzsiGRQUFx4sP9++uLzTWEE+R0xYY9q+vLvGYkvKnI6KjpOa m6DFJxEODhcdJzfIoZiUmKCzWSgZEQ8SGSQuPVDTxuk9NTM3UM/KzGG+rq6/Q0y8koiFi5KX l5x7GQsLDRYcJDHEnpeZp8o+LR8XEhMbJz7txbqxsss8LSsxQmTKy8jNv77PUzIvtYyCg4yV mZulLQ0GBw8cKTb6o5SPlqw+KR8ZExATGy7YvLq5tL9JLiYnL0bLs72+y8O/zkMpNZuDgISP l5ifuxMGAgkXKEZ+q5aOkqM1HhkWEw8THDiypqmutsBFKB0cIzFruayqsbfCxcs3Kj2PgICG lZufrDELAgIMIk++spyPj5tlGhISFRUWH0WmnJ6qu94/JhkVGChTt6mlpK68xk0qGyKriYCA iZOam+MYBQAHFT/Fqp6RjpO5HRAOEBIXHl+imJikv0MuHxcSFh9ZrqiloZyh0yUeIiQmu42A gIONqLAyEgYABhO3nJaUkY+XyhYLCQ4TIDurlpKVqEggGhUQEBcpwKSfn6Cjvi8cGh0mPKSH gICAi6ZPIwsEAAkcppSRkZOXryILBgcPHTK2mYuNmcErHBQUFBgkxKKdq7WwuEslHBwoS8zu t4+AgIGaPikuGAsEDC2bj5edoZ2wIwwHCxoy2q2blJeuLRwaGxweJTu7rK6/Ys3FdiceMPux 4UFvj4CAh6VP9OgfDAYQOp6eq66hnLIgDw0XJiw0z52WnlwfGyAhHBkjaKyqwUpQvq/MMSdb q7FMJ+KJgICNwjy1PhcDAxW6lZ6rsZyb6xMJCxgtLDW9mJCb5iIlKiQdHCy7qbE/M0ja3jIj K9OjrdI7L5WAgIiybrK7IgcDD+uXnbGznZa7FgkKFicrJ1CajpXKHx4sJh0aLbKjrUQ9yq6/ LyIvtaa4WjM9SpqDgImgsK3ZGQoGFkKepK+hmppoFQoLFiEiLciXj5WzKSMkIx0dLL+rrsHP ycxoMiwtTrmtrcDuRqWLgIefuXysHQ4FDS6vnrqjmZStHQsLEh8kKb6bjZKmNCUnIBcUHT6x rq+1tMxhPTg6Oka+nJu0W8SViIKVtjy17RILBx5JpsDOn5mfKxAMEhwnKNubj4+fRSMjJxsW Hlijn6a4w8dCKiMpND7Ap5yhtl/KnYuKorvFnc0aDg0oPMQuX6GaqCkXFx8iHyTDnpup/Dc0 LyMbH0utpK6vqqW1Pi8+0tHe66+fqjsxtpiPma69pqsfDgsWHyorOKOTl683KikiHBkrtZ6g rrK8zS0dHStY2cq9qaGnv087PkZCMkOvrb1KsqCZlqK1u7RGGxUWHCQqPsefnKS640oxJiEn YLa/y8W9VjQoJCw9V0vSsKips8jSyHEzPty/vc7QrZ6coaqpqsM0HxobHB0hPM6rpZ+jrtQ3 LCstLCw83MfO+/FTTE49Ojw7V8G3uLi2s6681Dg4O0m/rp+cnJ6hsestJBgVEx0sQcyvnpye rL9LMiwiIio6RFBpysfmTU1SQzY81d/atK7FxLPNLi49YdzKr6ScmZumpKzONx8jHx0ubci3 pKKpr70uLCEdHBskLD08X7W01c4/MVM4NS/FsLW5qqWqr6+ysaytyLenrcG4utQ+JiIgGyMo Le5wvaSpuK2yfkE8KCtBNyUzRf3vv7zEqMDkPF49Sd/9b7+xuq+1tcC+Y+W/287QxNJ8QC4r KiwrNUNP7r7Eur/H6F5NQElMREBPec7Mz8e+v8TYWVJgZFxi17+0sbW5vsXdVUpFPj1AQUlb U0I9PURPX2fqzsjLzt9veuXT0eNqXVpaWHD3aXDYzMrXbF3271dPbca7ur/L0c/cWUtLS0xM RkhUW01ITlBTXHvs6ODe3u3t4Ojh08bFzNTT1tzb6mv+zMXVXk1ZW0Y/RVDmz85dRk1VSjs6 Q0hNXtzKxby7yt/VwcLO38/M72Xi5WBTWv7f3OFtUEVJVVROTlllaHRdW2xYX+jPzcrBvcDJ 3VhJQj8+QlPgz9HX0sbL415NUHjX125iY2vtfO3SytRpT0tVe930YGz77fVeWlNZcGNb7s2/ v8rd63hNREJDTGLc3e3c09jsW11k5dfZ2NbJx8nP187N61VIQUBBQkhSXu7Y0dJ8WEpKT1zp zsXDvr6/ws9fSEFCSUxu3NLHytn7aXhgTkhCT319cXBv7NvuW01XfeluV13tz8bCxMzV2u5j V2Dx3Nje5efn3WREOjpBUWfq6/bv4NXUzs3Jy8vI1OHv6uR4UUxJSU5GQj4+R1Jlc9jNzM3a 2tXO0d/o08jAwsrLzOVWS0ZISkxRXlpZX/Dpfm50avzd5GFQXW/h43dvcl93a1543t3b2+nv 6Ofk2H5iXn3f18vM2OTs+WRbT0xPS05cWVldavZ75djU1XJWX3Xq83rayc/fcWteX1xNVWfh 1NPWz8vO4V5YUExWXWzf287PzeBXV1xy+mhVTmbi3tro4tDP2mtURUVFSUhQ/dnQ1t3q393a 4/ni09Td3dff8njxbWvhzcxtVfbR3m72cVRPYW5RTlReWGRaTlBbXV9JU2zW3NDGwsTEyM3J 2mFp5dZq59LS3XNQQT48Pz9JXurQytbZzNHra1hcXNzL49/n4+d2X/HZydBILiw/yLjIZU1p vLO62VNYeuJnT0tQZuNmaOPl8fDh5dvY1+DcYlBNTkxRXlZi6NfP099uXU9IRk1bX1p5187Q 1c3DxsfM2OTd1fpYVFvW0fpSSk5Zam5QSE5k7X3vUkpXdfDh9Hrk083N2NnS0Nnd2u1taHfb 5mVkU0lJSkZWXGvhelxZbvpo7O3Ux8bK3vj00sjGz3Fc2MvmPDA0T8fMUUjuvbrL6O79cU9G OTI+ZPLW4tjEvrnNdmz47EhNUeHNzMzc1drX5m1NTlHvXmNQSePE8kFFX8zWUfLM2tDLZtDK TFZKVXbf/GFg43hYbuRvX1ZUbUlp5D/oy77B3Fq5ws/QTsfBajxPxuBWQltWSUZNfj9MzMDF 1tfDT/1qP0xVYdPUT+7c2b/QSWHnzMw1Scfc1Ejiv77Y68ffylReVj91Q0BiRFNWW05I08fY ycbGvz/Tv+FNOjXFvEniXd7Ga0pU7V+9Ujjccse/3EjcxcNXPmy6uF44TdVKPTzdzs1WTvPP yl9S0llkXUdv9Gl5y9jf5MW7wENHevjXTEJEzbtbUNrBzkZBSnFMT9LWXGjBdV7oSO3dS9dZ 1m7BuuvK7FDI0UtbyvVXXUNYXFFKSWtSOVF731vUwLjQcMnM2W9bXF5eZ27mxMxlT3r7WjzR y+hXOcRySFh9wdlmw8Pa1lj2U/VgO0M91chhx7zn7N1P1thI5c5P2fjN0k1oWt49QG1V7crU PnftztD361lbSdzqeOfJ3MvLy095WVdhYuDX7FfVuOPgbfNpSUtEVFbPTmHKz1xjwWrYS0z9 UUJk2VlkdM/LyGb2wfZhPGfbUefWz2Tdc83OTT/P+VNXd8rhzsBrzVlqVkU0Xs9XZepX4srP zt7MV+pY12pS+cPRR014t+I3LGC3sttLyO3HSEfiTPhWdsTS52NoYFxGPlHVW85n5E41aNZA 1cT0wVtIecHG2tXD0LzY11vP4FN208vG3TQ69U5ia2vKy9xM1s/W6zUuOT0+Qdrg48vow8df 4L/AXFTZyO3S+1rv0dZSyL65y09LznU5SjlLUFZi51f9y1JE5cZ082dpx+rlVu7CvvxBSH6/ 7kQ9385c0lrT2nS3dNnFU17dRkdSU0g9Q9m8xsXVc8rKXdxUUt7Ty+89QVdeREXryL/2YFnk ydxMQEPf0VlLX7/EzuNZvn1k9Vjhx9LY79pjU97t8kZH/0pCY2BrSt/MQ1ZNw8tOWGC8zNrh 47/DwN3UVu7T+j85TUxuSlJNVNJ86ujc3tJY+sPR31Fs8djSU37f38jZUlfnRExwTmVqbFZN U2XDz25k077NznzV2ODI4Fhh0ONVW1bz+l5JTN1XUkpCSkddTV5qath/2cHCzM3Bzd3i3sfO yN9Z4uxqTE5PTVI/Tl7tUEttb2lYWt/HzcrJzdvs1vbe6GrhS2bw3XNdW2BSTV1YY2tvTVzc 2c7z3NDbe3b939t4cnbm3fVLU+TfUk9b0831/snF+WHMyc5eXutXR1JUVERIaNJrUuTZ12px y9R/9NbeXVHmzNBfTn3RY0pldWdXT3zU7+3WzvNRW+nS3uXo/WJs02PtcGxv4lxaXlzR0Nrq 1MfcV+3r8ltE529RSlpPRz5L9fb28M/N0dO/yMnF0tPbXlxhaVZaWF5jVVBeX3tmZ+3v82p3 4/Hq4dry6uZzWVFm+9rmZHLTz8zp929v5NRXR0ZWYlpeVNTR3FZh1d/4dE9qZFfh1uTl0dPd ztLu3uxl91pgUVdiWV9ZT1tu9lxf3s7U1vrTzOXsVFdPX1p+YWPp0c3a7PHQ9fxjXvX9YH/w 2PxvcGRYU2L1bdteTVtPeOzq0N7Sy7AlBoqAHQgcmLCnKyxIvdHdtjw7Urndv0EswK/MOkDZ zclJMz/Y1E49WMbHyt7Wu7zdVnZ7UkdJVGHq3F9Z49ve4m3l0crtX19Z8vjlW23dbenp5XNd VVJYTVxUXuLr7+7p4dLd9HrO1W93/tfTzdXpYVZra1lXWlFTbmhYVFN90dxtXe3YycnP4d/U 1+teTVJhTEhFSFbh0Nbs2NTQz9XW6u9cVFZVWlxye3Dw29vd815actXZ1t/oef1nX1BbZWJn U1hv3dXc5vLt1eB6ZG3w79zeZlf73NzZ2ezh13hQQz5BQ0pPW3bYysnBw8LEy9LqcV9lXVNU VVZSVVhYTVhxbnxq39bb0s3LyMvS09jX7V5RWXprXFhcY2j892RTUUxMSkhc/3h33M7IztDM 2+Th19nS0dfacWJw/vx1Zl9adndLR0lSUFBNU+vVycrR2dza5fv9ZV5+5d/OzsnIy9hdTVFR QkhKT09YWmf47PtedHNn39rkzcC/v7/G1OdZSUhYbXX17+NqV09EP0A+SVVi6MnCw8rpW2J7 XE5S4MvBvsfXz8fYWENGSWJXWm3Y3uHa82RNR0pVXGne1c3OyM/c9t56T09RWGb47mv+5VgZ LoyfGx+4qLbXPFtF6nzMPUZbY93M6UBiv9JncN9bbf1JT9/UX1le3t99WFrax8/v/+Lf9llK Uu/k49969+be1udz4uZ0WldReuHe6Ozf3uVuXl5ZXWNgX1lwdWB+7fvj3tvtbV1ZYWl18/To 1svO1NXe6vtdWV/selxhYmRhXWxeXWh2/mls+N/X1Nzm9eDc2OHg9Gn44+ZuXGN4bVpSTFFa VlJbaOnTz9Xb2d9t79/b0NLW1OfrdmhdVlpSVFpkemlZWWB66+n44Nfb2Nnf3N3vamBeV19n X/TYz83W8XNeWFVaU01VaXVlZWtt4NDO2NvZ1NXtYmDp6WteUk9dYVlSXfHPzdnv+Pd57mho bW75dFxTa97U0dPY4t3f/lhOTlRQV2jj1ubs6/Dt6dra5mx+aWH77Nvg/nlrX1pYXWVuc/D7 735vdW12fund3ed8a2x6eGvg1tPU7nvr2tTX4HtmYG9cT1z86Nz4ZFhPUE5NTVJj69bS2t7V 09n0dt/e63r3bW317NrV7O/lemZmcHnh1OFoW15hfnVaU2l87WRYaO3a3vVnY+/sZ1pfYW/z 8Wr75O1ncm9x8ujyY17r39fR3ezj1dXn+uLd3dzjb1thX15cVE5QXlxZYOfX1NzwZnHk5vz5 a3niJx+dkT0efLfGTlpENzpfzVZLz97OycVwaMLF8tXP1d/UWEti6FBHSU5LTkxKV9nQ5eTQ ztnb4eXf0NXm8e9rXW3l4Oz37V9NvEoySb+8OTVSst1U2ctfXby/4DU/2MNBNUbTw3xRZcrH zNDbee3YytxRT/nM21dKaOJ0S075t7lcNipQwLlSNk7FsnI8PtS73zs8W9DI5WniyMbWSjxl y85eLTCkm3ou0rztU+vOXD82Oz9H50pR1bi+Szs/zbbBSTzSsLS+V0ZO5u1JQD7VwNo9Pm6+ vlhLVMm+20M7SX3S2fLH09jFxslNSkreaEdPdsDA01xv5NFdPUBPev1icuPh3G5eWFt9XF1Y 3tHKxcrL3t/oX11e4cHIz0VERkdLP1ZJT1FMcsu9y0RB1q2uaUN9rqvHQThwvrxhOT3mvts4 M0vAv2IzMkX75TszPF96W+3GwFs9Rsa1w1ZE3rGzTDqsnqy5uc7+zMjcTUlZ0cxMNy0xNzIr KS42OTU1O2bE2U5awK+vv3Livqytt8POsKyqu9K1pZ6tRSstQlk1KCtOtb1JLiw8QS8gHig/ TTkvMEFOSURQybi7xuTTuaaZkI2LlKc8JiwgJh0u2q2mwEMtJh8gHSY4vKqzxVVCOysoKTXP vr5kPUZHTj8yPvLDwN/EvqaakIuPndEqMSsnICBOu6Wu+DouKiYfIi5WrqyqtNpXMikkJDVY 2GIzLC89V0E3PmfAuclSR7idjoaKlckqWDQzGxs5rpqjyy8qJygbHCRapqizTzUyJx4cHTHl ucBBOTtSWT9LuaurucHJ2dKtm4+JjZnkKTIpKhwdLsKjrWIuKiYmHR4oSq6tq6/K1zgtHSHA uDorMzM7RVs3LT3js7PF6jdBqZWEgYqdIzZINykQHTqgm7AwJyUwJRcYHMOho69qT1kuJBwf QMu7XTEwO/zmOz1cuqqrrrdcP8OejIaJl8c5VTorGBYl8KWyUispKScbFhkrsqemtLy1vcwv Jio6zGczKy9P10cvK0Kzq6u6TTNDrYyDiZQwRM/mzhUbHrydpN4rJDA+HxkRIHGoobbHv71t LR0kNsDBOy4sTcTZPC5DuKmsv+NuV0LSopKIiZKsMzsvLh0XHzetpK5eMygmHRgVGCy+m5OY pmk3OS4pHyQ/079WNTpDS0MyMj7Eqqy3WD3voYqCip0sL+PLPxYUHcednrgzKjU9IBUOFi6z nZmZn68+JhoYHCpYe2JGYszHUDQrMO61qaq6+Uyzm4+JjZi3Rco/MBoWHjerpa71PS8uIBcS FCJIqJuXm6jbNywhIB4nMkbVzr69zkQ5NTZNybW/ytncrJeIho6qKzhJaSoXFx3NoZ6uRy8w MSAXEBUj0aGbmJ2mvTwnGhcaJkDv1MO0rbDfNCcrQtK5v+zHq5aLiI6gTzni1kUeGRssuq2s y089Oy4hGRUZID+0pKGoqbDJOCEaGiE1UmTUuayrsc5CRdW7uMlIaq+ajouPnLW5uFcvGBMS GjXduL/MVlFALiMcGh0uxK2mqaurrr89KiQmKy0zQcCurq2vt7rL60s2MjnEoZSRl52mpKu7 OR8bFhwoNFZb4lnMzN9UMygfJy09VeTPx7ayvtE8Nzc0P0NW4Lqwrq60r7rEcj85PeOvpKCl rK+lqLNHLScmKyo4SkA9UcC8w0EtJSMnLjk2PUXZu7GytrampQ0blSeyU1W4raiopVzVRVyv 3M+xqb2pr8WnzVdKJC1LwCt0KS81Nz4oIx4fIywyMjA/4LStr6uvtaypqK+3r620srbe4XpB My01OFq/zN1V0rKoq7fecU9zw7zPRD49QDo3NCwrKTA7Pzk5P0xszsbL3/jVvL67xM3BwMLv ZE9GOzw9Q9rEr66zwcWzq6msr7a9uLnE10c4Mzc6NjsxLCouMTc/QT9HX/BtXE9O6crBv7u6 uMHI30dHPj06OUZoy721uszVvauopquyt7qyucVdRzs3Pz43NzEtLC8xMjo3NzU+TExCVk/v vbe2urrPzNfaZEVLWVVl/2hgdcK/xMK4qKiprK6vurnH3mlAPzc3NDIxLy8yMzFAQjkvMzo9 UHllYmbJt6+3urm9vtFdQEVHUkE7P0jhvbS+uraooqesrbO/usHJ3mtLPDM0MzArKSsrMDM8 NDE4QExS9eXMyb23vczNys7V329mXeVROz9kXN61s7e3raWlqa28y8fP1uJlSz88Nzw9OS8u Liw5ODs4MjxP9tzR1NzIvbzN3ehZU1RYSERJTk08PU7SvLCyt7atpaKmrLe0u7vDzl9JPTY3 Pz45My8tKy4sLCoxNzpZTlVZ18K3s7/O2dDIvLvLx8HG3E9HTVhW28TNyMy9sK+utLW7wsbF zvVkTkdGSUY9Mi0yMDE1My4tMzdDYfrm9NzNyL+3ubq5vMPIy9vlWEpFRUtcz8vLy8a0qqmr srfI3Njc0G1LRT9KREQ/NTEuLzQ4OzgyMjo/TUxXcNHBuLW5vLm4uLrAy+/p4V9DODY7VsXG 2e/KsKyprrjDzcrF0OxNSURISk1HOzk0NDY3NDAuMjlCVG/e2sq7tLO3usK+wL7LY0xEPzs5 MjE1QOq/v7u3r6qloqWqs7vIzOJfPzk6Ojs6Ni4sKisvMjIxMjhR8sG8u8HBtLKxt7/GyMLQ 6UNCQT87NTcsLTZRx7y8uK6jnp+jqbG7vsLM3HhDOTg5NjAtKicnKi0xNT0+Q1rJv7u9vraw tLu5x8rF2eI9Pzs0OT04My4zTr+vta6xp5+hoqqxusDKzsxXSD8wMDg5NCwpJystLzEyMz5M 0cDHwb24tK6uu8S6vsppV0Q6NTs7NTMvN0jFsbK3xq+ln56jprOzvszNZEA2LjItLSwpKioq LjM0OTdEWNjSvL3KvLm2t7rOzNTY3vJcRERJQT89OkFZta+1uLOqpqGmqa6650pIST41Ni8t MTcyMC4vLy81PjpIfNjKxL69xsm/v8HU5vDodkxGVldSUEZDPUhvxLevrKqppqGjpK7EWkQ7 OkI5Mi4uListLSsuMDc5P1xf9M/CvMrCvLa9wMfDwuDsXXdKPzo+PTtES0E7T9GtpKm1t6qf naSxyfRSU0Q/ODEvLCsrLS8uLCkuP0dEY8fDurKzucPIxby8z/Fq0uVtUUU+Pjk4R1lURV7Z zcGuqKqvr6unpqu631ZKPTMuLCwsLS8vMTI5QEVMRVBlZtvP0crFv8G9u7vAxsrmZmbqY0w9 QUxPTFNc+NPJuruyrK2vs7O6v8dmTTo2MS4vMjo5PD0+Pj9OYmrW2N3c1NLa2OHo49vb+WB5 49x9Zk1Pd93e3tTOz8rBwcTBu7u+v8TP7HRfS0lIPz49Qj49SE1SX23o19nV6t/Uz+VmWGFl T09NSEJAQ09dU0tNYezY0c7Fw76+uri2tbm5u7y7w9JjUEtFPzgzMjAyMTQ8SXR68NfHwsXB v8PFxMjN1tTY5mVPRkBDPz9ARktHSVF52czIwb68ubazs7vG2eDmXUk+Ojc5PT9BRElLVnLz 697WysbIyszJyc3T2N3s6WxUT1FRSEVESEVKV2X75dfKvLq8wcjGzcnO7VRHREhMUVFHRj9D S1ZbX2JefdjP0c/Sz8rFytLP0dPZ3Nze8lNMSUpKSEpUXmbt3tfPysvNys3d9efm6PdbXE5K R0RFRUtLVmFs5dfc1tzsz9La4ebi3dvQ1vFt6OTc31xb3s/U+lFQbmJw7N/T0dXQ0NjWZ1pP RElDQkZKTl9seNrZ2uTu/XFdXWns3NXOz9ba1c/R2t94bHp8+FxNTVZXc/rjztp2bFtZ/ubf 3NTLwr7Ezt7gYU1CPTs5Oz5DQkVP9NHN29bMxcnPzNzYzdbX1N/R0N/c33FmaFxUR0BOXlxc XV5w7dzi0MnOy87Ox87e3+1nUUlCQkNCSEhUXmpm+9zLy9vZ2NDIzMvV7uP1b2BNR0pFR0lN V3h+7+rZx8jMx8nDvr3Bzs/c8WpcR0BFQ0BAREhRUFlkX2JebPvq2NPPyc3W3OHg5+704318 5drb3XNaZFpRTVV0dOvl/Ojd2N3u6Nne6GdkXXrdeGZkenHmc21xZnzlfmdmaGFoc2BZW1lO SkhhZHB6+vXo0tDSzc7Wzc7MzNPT1+1t8fTobFpSS0dJTVpnUlFXXeXp7OXu8dzX2c3Mys7e fF/y4u5rXlVWbl1NSUpcX1JPT1n61df2/tzRytLv39/f197d1dzRztDa08/X4G1STkhFREZE Rkxi6efd29vc4t/X09DQ9ftoWFpKRUVNVWbq2dLW2dTMzNTXzcrP1O3+e3N0X0tBRktLS09p 3eFtXW3d18/N097g1Nbf7unv9XVqbF5oXV9VU2dfT0xPWHri3Obh4tjPz9zazcfGzNbleGpp W01MTEpMTU9OT1dlZvnf2Nfd2eDm293g3t3z7t7V2N71+nV99mRZXl9o/WVy+v/vbVldbe/+ XlpfcXJbWGXw49/6Xmvm2tfa2NbLxMzfdGTt9G5aVVlVTlNeaW9rbXx2dX7t7Xr+4NfW09vs evHm/l9PSU1RUlVcZn70dezW0MrLy8/7fn1oXkxOXerj9G7/6t3X73B859ri9OvZz87Y+GBZ XFhSTk5fdXdjavXq53RbUlVk82hccP7h3Ofqfmx0avvZ1NjX0NDTz8zN1N7t+2dYXFhNS01O S0lHS1Z5+fLU3d/QysPby8nA1epbVVVYYE1GRktMTk5ZWvbe3tvZ18/Ky8vJys/n+Hn//+Tw XFNXWlFOTE1RWGJvfPPc3ePn3+Ph2uLo3dPW3OX3YVZRT05NS0pNWWRx9+HZzcjFw8LFys7b +GVrb15NRkhKSUdHSU9k6+/r387ExMnO0dvl9ldQTlNVWmNbbfL09u3r2NTe43vm0dbtaGtq //1kVlFYV1VaWVVTXura3NnMy9Xf6uvf0szP2utxaGRgV1RXX2NfXl9h9d/7XVp/9HvycGd5 9fllVE9cenxtbfnc2dvb08vNz9zxe/Pi6ez29ez5aVxRVGVyZGluZWBn9e3b0dzzbFtXWmT6 cG/u6X1hX3z06OPl72VTV15249XV09Hc5H397+fe3d7t/vDn9nFsbWRaVlZs89zZ2NXe3epc T0dIVl9cWVp19HZx/NzS1dr3ZWh2ef9sZfHby8bHy8vK0flWS0dDQD9BSVh839rPzdHQ2eTm 5Ona1d3l6t3k9GReYV1XTkpJTlBbXFts7tnb2s3Jyc7e7nBken5ocmRaYXl/YVxeYGZvaOrO ys7V1tvX2+L/UFJdWVhXW1JLTFJh5dvY1NDV393Xz9rw9vXnemJZUVt37u/w7O3o7XxsV09U WmJfYnHt39PMyszO3WVRUmJmXE5LVWri2OL879nT2drY3NnW29va2uVxX1lUV1hPR0RKT1Nd ZV9x9+rj5tzVzszN1dvW2d/qe2JUVVpaXFlndnV97tvT1eHu6fxpZGdlXl5heOnl5d/b3+tr YXnv8P5fWWdtYVlYa+3r5+d1ZW19amp0f3n4e2Js69jZ2tnXz8nI0e1qXllZVE1LUltWVG/Y 1Nfc293n5PtmVE9VX3r6fnfl2djT1eV2aV5VUE9SXGx75dDLzM7Q09XW1t1sVE1UXl9WSkpP Y2xZXmtvfOPU1dHO0NPp/evc2+xmW1pbX1tcZHjtemJcZfLo7PHd19PR3XliaHBmWFdXXmh6 7f7x9fDd0dn06+TrZGnv9u/1Z2JfX2ViZl5naG/1Y1dWXPjl2dLX1tLV5fjv7/leTk5UX2Re XnLn5uXy7NzTzc7Lzdja2+9XTlJYWk9OWGx6bF9aXFpZXV18183Lzc7T08nIztPm82xhaWFU Sk1PTExMT1BXXGzz39XW2Nzo28/MzM/Z3N7qZFFPUFhfW19q/eXl6/3r3d/fbVleaXpjX2r2 393q793U1NLZ5fFtXlRKSE1TVk5NU2Lz59zZz87OzdDX3dvl6fDq9/bqemhgXWpnX2FVU1ZZ YVpm5tPQ2+LuZV984+Pp6vD0amZmZP7h7Wlla21aUlhfe9TO1tnVz8vMz9TZ5PV3YVhST1NX UlRTTU1WXmjz393ybXno4+HW2dzW193p8OHe3/leW1xWaOfY0M/O1+ZvaV5bWE9KQ0RTb/Bu ZPXe2t7h4OTl3eXu/X3+cGhgZ3br6f5yZGP98uPY2NPV32xh7tfX5XZkX2Zr9nFy3tvnd15V Tk1KSlBe/OLf5urv7Xx64vPt2c/O19TY1eB2X1dXVV1eUEdKWXry6Ojr39fVzsbDw8nW/HNw WkxMUldjbWpbVVVaYGBs+Ovh811Zat/a2Nzu8+Le2cvIzNPiXmFzcFxUXVpaWWB7XlZcZHfq 725cbfDv7ebc19fT0Nfb2+TsaV9eXmdcV1RNV11mcWp58eTr+W5x3dHU19jWztTd/WdhXF9S TE1Ze3JjZP3q3/hpZl5ufPrk4eTs83lmb/zp2t9dVWl4/2Jrbl9fb+19cvbq7HZz6NPN2uzs 4+xvf3VmZn9tbPzm3ut0WlNUdt9rT0xKUmDw3d3Y3/B94+LYzc7Z+nn56PxnXVxgcu3p/m15 ++v1dXn19G5dV2jp3Nno5OV4XF9iY2JkaF9bXmNt7uTb2dzQ0NXY4et9XlNPT1Zi8fN+4tfT 2up0cWhqZ1pjdfrl6PVzbPLqfnBiYl5cXFhn9+fQzuR05N3rb2166utpVU9UYW98/efUz9Tj d2Ro4Nba4uzp6nVbWmlgWl1VUVJdaGP96drZ2dzg5+7k6uHtaVtfaHXf2dbX2N7tdmJt+P1v aWVcXlhPVF396+rZ2trS2exmWFJQU1lffN7b4t/YzcnL1e1cb/5iV1hob3FvaWjk09ni5+7/ a2NhWlZZWF5ze2ht/ev2d2ldW2bn3+Pc1MKvxkJJTM/8RFd+++3vb+/a5/LqeFpdYWlxwrFr RjpI6EpLWPh+XfzNxMt2X2B89lRXv6qu0EA8TUE6PkdlV+bR2r7CybOrxkMvKS0nJz1m4b6v qqertr7OWzw2OD9NaefQx8LE2VtPS0VOe1hhePpmRzw9Q0VHUOPJ3/7Nwr/HxLu2uL/Fv8HO XEZGTEhDTu/Y1eppcmlLPjk3MCwqKzM0Mz1NZGVgctq/tayimo+Mj5mmuUgiFxIXIS5NtJ+Y nrBLKh4UDw8SGR4lOMmxu3ZCNi8sNKeNgICDiI6SuBMHBAsVHDmhjYeLmbMvGg0HCA4cLUa7 r7dFIBcWGRsaI1yon5CAgICKnKOsIAcBCyuvqaaUio2xGxEVGBMSH76jrFoxKB0TDQ8YIjfu s6anru5NlYCAhJmclJsZBQYc09U0s4+JmScWHB4WDhdwo6nbRD8nFg0OFx0kO66enai8WylL i4CAjpqYkTkGAQ1ByznPlImRLRMaHxsQGL+an8lDPCESDQ8eJiQ9rJ+rXzktIy2RgICJl52S WgMADciq2LCOiJAhDRYcFQwUqJGaw2HOIw0JDh4jH0OimaXJVjseF66AgIWepI2cBgAMq6Ex NZaJkh0KGS0fDRSejJllRq8tDAgSLywfO6ifvC8mHBgXpYCAgJqVkp8EAA+upDHMjoaXIQ4j LxgMGJ2Oo0/NrSQJCRYkGhY6qatHLjsqGhyTgICJn4+OpwAHJJq+ILKMjNcSEkEfDgwyk5jL yKeuFAgQIB4SHq2lyS45OxoSP4SAgKCQjI0LABm3nhnTjoekHxZbKw8NH5qe6s2orhMIDxsY Dhq7pu4tV7I9HquIgIOfjZKSEwslRMobt5ORyTc1tisVGDetNCI/tDkQDyIiEQ0c4UkgLL9+ tomAgJeTi5YpAzgy1xbGjYyrROHaHgwWH9woM9rFOx8eJBcQEiQrHyQ40V6lioSAjJONqL0L OyRILdGPmKu9rEUdECIZJR0+xjcuISAdGhsWHCItOC4/dpeIgoCTi5CmIA/LHTgdnJSbpqCr MhwjJBYWHDQhHyszJhcYFhQZHx8dOqWKhYCAiYadqBInHRwqSpGgnJ+cZiMbIBARFCwuKUFW MBoXGRQTFxocJ6aKiYCAhIedphkpFB0lSZ2klpqbzDwxHRIUGiEdJjtAKB0eGRQTFBESJp+R ioCAgYqPriUoGSQaraOcm5eeXz0mFhARGBgfL0hBKB8cFhYWFRMhsJyPgYWChYqmR84jHRet ra6ikpi5xksbEA4QDRIeLDMuNycdGhsYEBrtpZGGhIGDh5uqxzQcGjw+vZ+Um6WkvScYEA0L DhMZHiYqKiolIR8iJz6ulI2MhoWLmZmndio5NitNqaKmnpusPigbDwsMDg8VHB4gJyglJyo0 0qGQjouJiI6WmKhOLT8uLGmop6yin7U+LSAVERMSERYaGhsfIR4hKTRTqJiRjYuKj5GYoL/m 5kI40KWnqaCer0MpGg8NDQ0OFBkcHykrJygzXr+il5GOjI2RlJqkvLzHUDlmsa6uqqWu4C8d Ew8NCwwQFhsgLD1EOjRTuqWdlY6LjpOVm6e9v8pXRtS0raqkpa/UOx8WEQ4NDA4SFxwgKDZB PE+5pJ2YkIyNk5SUmaWvvF86NkjswLOurr1YLR8ZEg4OEBQXHCcxO0JDPzhMuKGcmZCMjpSV lp20y8K+ydK+trnORzMnHRYTEhISExccIyw64sXTeE85PrSfnJiOioqOkpWcuDQsLjg7Q8Wu uzsnHxoTDg4SFxgbJUDV0c7Mz3pa+nzNr6GblI+Mi42RmaKzWC8pKSspJyoxNiogHBoXFBMV HCQtP929tLKzt7q5tK2inJqZl5eanqWuu9lKPTg0NTg2NDEuKygmIyAhJCcoKi0xPEdm0sO5 saqoqqeloZ+fpaqrrbreSD89R1VdWlRKPzgrIiAlLS4rKS0+TkBI1sLAvbyxqaajpaq8fMeq pbk/Pcy2vEoxMDRK9U88MC83NDQuIiEtSV46N9q6tb7Graagn6qspqmpu/LKbltES309RD46 NSsrKy8zMi8pND45OTxKxb+3urWrr7KxsbWztrO6xr+utPdY389XPjc8Pz06KywtKS8yLDE3 Tcrfvb7Wy7evt7m4rqyvwbWvyMpqWMfnV1hHTVM5N0JJMS00Ozk+ND1kQUxd2rrBycO7usK3 vriytru8wtXQ/2XlXO/fR0r3PjYvKzk7OjE0WPxsRFK6uvRUw62rtsC/v73L587L+1zf2UpB SsPWOU1kXUU1Pj07MzlQRlfl+s/s2srMvr+5sK+uuba2vt1MdmxLNzY/T11f9Ec5NjI3MTQ2 RlJhY827wMvDw7q3uLzIxcC/vbu+vNbaakk/QEZHTFHuTU5JPzc2Mzc4Pz9K4r/O2sbMw8fK wcjBvbS8y8G8u8DSceze22RLXV9ENz4/OTE4Nj44Nj1P2e7ewL3Mycq9wW/Nxb67vcC8ubrQ 18veXEtj3HtFTkA7MDc2NDIvPmVOXMnTx8zb29XHub3ezL++uLe5u7vI0E9OTk9ESDg6TvRq SUNJSU0vNklcUj5Pyr6+xb7O5+Xc1s+9tbi81NPXZOZbaNDjX1FMU09EQDxKTkU/Q1v6VWZp 1Mp95crFxNtMbHnjxMnGuMbczs36Xk1MV2lRUllP7mhMUWFMTkpHW1BfU2XTcde9vd5ZXrq/ /VBhydZea2Pf1N5STuL4ycTR09Rs5UY6P0pAREpJUlRp3MTEe0z0zMfL1NW/vcHS3tjcVEVF TExNSkRaZODudOLiaVNP/elZWV5d69dfV9/f2+/5zMLJycO+vMzd3nxPPjg8S2nV09Rva25l SDo8Pz8+RFz72HLPxMjj6Me2t8DOx8PBwMa+xM71UEhSXkxDT0tQRTowLC0tLjA1Okb91su6 uLe4sK6ppqKgpa23ubu8v7/BxOtBLiUgHhsaGRkcIyopJysvLykoN+ujjIGAgIiYq78mGQ4W KbafnJyhtDwbEA0NDxASFh0rNzkqHyAgHxweu4CAgICSl5S3EQAADqmRjoyKjJRFBwEGDA8N Dxs4SCUZHiUfFQ4VID6fgICAgIuYnioKAAEWm4+MiIeOlTQCAQcLDQ4aMGgyGxMXGxoTEBci PFiUgICAgJuZniwFAAdOjI6Oi4iRmxQABg0ODA8nv8IfDw4ZHRUOECLPv/TEiICAgIqtjKAa AAEam5KckYmNmCwBBw0MCQwdRz0cEhUbHRkaGiRAvkhR25SAgICAl46iGAAAEDyloI2IjJVD CAoIBQYOIzwvICMmHxoUGR0fKTvU86+tkYCAgICakrkQAAIWXJyajImOmiEHCQMGDBsuOjE1 RR4QEBgdGRUdw6m7raSfgICAgKmTlikFABrumKeol4uUVQwJCgwPDRMfMi8mGRcfHhMSHTW/ q6uil52tgICAgqePkcgHABAYOSFCmIiPzyEaDQoHCxUeGybGzi4fGR0rJR41q6Soq6uuhICA gJiYkjQGAA0SLjPHkIiPrj4iCwkHCxYaHD+nwysoJSsjFho9t7ann6aqo4CAgIWslpcfAQAO FC4xwJCKjqQ4Gg4NCAoUHkC5rK+5cyAXFRspLTq4m5eepq6NgICLzrWUPgkADSbeZimni43K FxofIBEOJWbYysPG5S0ZGh8dKD/KraKdqbwmJJSAgJDHnYnMBgAPJzwkJZuFip1EQj4iDwsa MTU0R6+vSSUgIh0aHS/o4sW+xs0z2oWAhJzEj5skBQkiOj8zro2Jkrg71ykSDA8dJjZssall KBsaGhQUHDbvw62wvz4quIOAiJmWhZFHDhMlJB8bPZiOla3FvEkfExQeJCIhJSolHRkZHR0e KU7FwLu2rq23xZSBgoqQiomUuxoWEhAODx3boJueoqe1RR4SDg8SEhUcNMzCxsfSzvM5L0u5 xb+32dWijYiIjoyIjZsvFhERDwsMFzG5s7SunpmmzkYwIhQNDREYHy1Ot6Siqa2uuFI5MS8z L6SMioiMh4aNniQXEA4LBwoSKrSupJyVj5q2PCwkGBAOFB4mKjR8q6asrrjEXjwvIiAj24+K iYuOh4uU+SAXERALCRAeWq2pn5eQkqHANygcDw0OGSIlLkezpqy3vMjVRTYvKi0uXZeNi46R iouPtyceHBsSDREdNFt2uKWYmKGwweEtGg8OERYYHS7frq62ta6ptWo+PVBFWKKWkZCVj4+O mr42Ih8ZEA8UHjVAXLadmJ2x0081JBYQExgaGSA13by4raSen6u2ytxMOMCclpWblo+Ql7RF KSQfGBMUGB8kKTfBoqCjqq6w1SwdGxwcHB8oQGdp4sG0ra6trq219VmynZ+prZuVl56+eTw+ JRgVGic1PDZIx6quxmFexFZEMy4vLCkfHiIsOUz+v6uqqKurq62pr66utsb5xLi7v9rCu8fV /HR9c1JEPzw1Mi8tMDk9PUVKQzo3NDIzNT1N18vVyr2ys7u8uLGyuMbLw726ur6/u7u7vL/C vcnm9lxANi8rKisuMjg4ODo8ODIwNTs+RE5d1723sKqlpKWprrC71Pr02M3Bxdbc1szlSjk3 PDwzLC40Ojs5O0h/5l5cXufV701ESVrPxcG4ramqrK61v9tMPz0+Pj9EQ0I/QE776Hn83M3I 1mpUYm9VV+XX4lVIPzo7PlPNw8fEvbu6u7+8vddNSlJRQzs8Q0pBRld/7v3Sv7i2usPM1etX TlBPS0tVT01OTklKTEte19jY0dHKw8LHxcXP7FVDPUFISVht6s3Fxs/rZvbX2l5ZbPf+XVFR W1pYU09LSVFbetbNxLy5usDN0M3N4k89P0tPSUNLZOTjdO7e1Nrm3t3Y0dluVExHQz9ESEZD SVZ31cW/vru6u7/FysrWel1UT0M7O0RTVm7Pv7zB0vhwZVJMS05TYGr97nR0eFx55npRQkVL TEdDTdu8sa6yuLrA2lhIT+7a4PLt3OtPPz5CRURERT8+Rl7ZzMvIxcPAws58YV1PT1JXftrM xMXIw8j2TU1dVVRORUdOTVJs7Xz/3tLO1eDe19v7X1hp5OLrcOvW2PpWT2Le2e/x3NLP3llH RU1VWVtcWVddWFJWZ3Hw6t7Ow8bV2NnWy8TDyNHhcWhZUFFYaH9tYe7a41lLSUZHR0VLU1tZ Ul1y+3Hx7N7X2dnQycvLy8O/v8TNz9/9d2pdUVBZdN3X3fbq3eN4UUhAQTs4NTg/Td7X1M++ w9XTZF9TWVNNe+bHxL68vbq5xM7N32RNUlNJRUdPX2ZW987KzNV6V05AOz0/PkFTW2ZfWnHq +E5KSUZPXN/Jwbi4sru2rq21wsG8tsRnRExbRzg8R3/ecdjH1jwuKykjHh0jKi0yP9PMzLqv xVjJvKynnJGNkZaZn7suHx8lHig9sKuqrcpQJRsWFRQTFxsjLDRBTtvzPk9J+s63nZGKiIyK j5W+MSgcHhUzYbCvo6Gsxi4hHRMRExgcIi00TDkzLzIvLSkuTsK5vpqLiI6PiZGfMWYuIhci zMS1rZ6juUg2KRkQFRYYGikyOzo0MS4sKSwwPtvnrq6bjYyPj4mXounFLh4cKUA3u6ikra69 TS0dFxcUFxshKDs8ODowKissKzNaf7eupJOLkY6JkZ+ptjQnHSUqLGWvsLCjsORhLR4aFxUZ GyAtMzk5Ny8yMywyPEI8XsSdj5KNh4yVlp/PPjQlIiA0PULersVZyUooIh8bGh8hJikyMzMx NDU0RU0/UF949a+cmpWLjZORmaq8yjYpIyosLDTd9/rFdTg0KiAhIh8iKS4uMTk3NTs6ODs/ PklhbrmknZSOkpWUmqWyvHs+MzEsLjxQTu7Gaz4+OzArKickJCQjJCcpLzo4OURAOjw8ODtv r5yVkY+Oj5Sboam9VDYtKi87SEpZd1tVRjQsKSQhHh0dHiInKy8wMTdBRD48PTw+yaGVj46N jY+WnKKuzz4uJyoxOD5ITktFPTUsKCUiHx4eICUoKywuMDY+SE1bY2RdT8WhlpGPjo+Sl52k rcJMNSooKy0zNzg1NDozMC8sJiEgISMlKi8xMzc8QFBuYVpYSkHjp5iUkY+PkZadpqzAPi0n JSk3Pj8/P0JCOjMvLCclIiAiKCwxNTE1PUZKTD88Pj44OsSelZGPjpCUmqCquV03LiktOUNL XVRBPzszLiokIiIhIicqLjMyLzI3PEVJTElBQEVwq5iSkZCQlZmfrLbFTjkwLDRMXF94TT88 Ny0oJyUjIyEjKS4wMzEwMzc8P0E8PkpMV9epmJGQj5CUmJ2lqrR2OzArLTQ6OTo1MTU2Mi0r KCUjIiUqLS8uLjI3Oj9IT05dUU1a+LOck5KSkJKWm6GkrMNKNisrMTU0NTIuMTMuKysoJycj IiYqLC0rKzA8SlhVTFXvXGvYvqSWk5OSkJOWm5+otu85KiYoLS8yNjMyNzczMC4qJSAeHyIl KCwuLzY7Q19l6MzL0czIu6GWk5KRj5OXnKKtzTwsJScsMzg9OzIvMzcwLiskHx4eIScpLC4z ODxKc+bRz9nt48zKvqWZlZOSkJSZnaauwk03LCsrLzEyOTg1ODYuLSwqJiMgHyUoLC8uMTU8 RVjn7dTM32pW3quZk5KSkJKXmp2lrshNLigpKy8yMS0tMTUxLCglIiAfHyIlJycnKzA7VH7+ 2MS+v7++vaaXko+Pj5CVmZ6mrdo4KSAiIyksLC0rLS8uKygmJiIfISUpLS4vLzM9TPTVyMfR 0svJvJ+UkI6Pj5Kam6Sz1y0oJiMnJzIzNTw9STkwLicmHx4hIyorLS8sLi83NDRCRGNdVb/G n4yUj4SMj5KWpUw8LSkbGD8mJ8XBRe29LjAlHB0ZGiAfHzE7LEM3LDwyL0IzPtRcu7CbjpSH hI+LkpumQDQsGBgnHR9OPlTP61QxKSsfGCIbHCgrNDo+UzsySjcuc0RSy1fGtJ6RmIqGkIyU m6g9OCoXGyMcKk5L7dfSWzAxLB4bHxsdKC01O01gOTpNMTRDNEdL8MHKnJOXi4ePjJScozk4 LBgcIxsoPkbiysXcNTctIB4eHR4nLjQ+Z1BDPTo2MjY/PE1X27+pl5mRiY+PkJ2ev0Y/Hxwj HSQ6PVzYdedGNDEoJSYhHyQoLjtFREA/PDYyNzw+XtnNvq6ampSOj5KRmJ+wRDwnHiAfHy44 QOnW29JfXTwsKyYkJycqLTNEPjk4NjEzNjA/PUnm46mgnI+Pjo+QmJ2txUcoJCEfJSwxO05e 299IQjMtKSckIyQnKy81OTw5PD0/UFp9bH7cvKmlm5STkJKVm6KvxD0sJSAgJy02P1vn09pY SDcuLCYhIiMpMTU3Ozs9RUFDT01F7V9Oy7qvnZeWkZKTmZ6quPs/LiUjJSguPE9mz8voUjsz LiopJyUnKSsvNjY0Nz4/RU1ITFjv38KwqJ2amJaXmZqfqLDEZUMyLC0wNj0/P0dLUEg9NjAu LConJiUmJiUmKi4yO0ZV6czFw7u4s6mgnJiWlpeZnJ+lrb7vRTgyLy0tLi4uLi0tLzAuLSsp JyYlIyQmJysxOlPNurW1sK2trK2tpqGenZycnZ6gpqyzwmg/NC0sKysrKissLS8uLy8xNDEq JyUjJigqLztP0r+2r62sq6yus7KuqaWhn5+enqCkqq+8zlI5Ly0qKSkmJyotMzIvLi4sKSUj IiMpLTM/Zcq9tK6tqqioq6+1urizr6qmop+foKKmq7O+30M0KyYjICAiJSgsLi0uLS4xNDQ0 NDg7Qlbz1sS8t7a3sbCys7i7vLq6ubavq6qopqWlp6qyxl08LysnIiMkJScnKSwuMDM2Njo9 SVlZb+Xf0snFvbm3t7e4uba2uLi5vb25urq4ubWxtLm/xdZZRDsyLispKCgpLC83PEBOYOvV ztXm29vuZ1xfbu3c0c3Cu7m8vr+/vry+xMjL0drX2eDVycrfelpLTEk9OTo9P0BJTFBbWFRU TUxQU1VOT1Rjc3v15u7f5PbbzMnGwLy7u7u6v8vSz9b6aV1YWmR15eTk7mNMQ0A+PD4/QUJK 8e66qXnORyxKJyhPRS2zRMijWqer2LG/WLXnR7xK3cDn1unHr7zOwmfnTDo6Oi81OzVGPUZt XeXIv8HD+/xLODY+MzFJOebrVMDTTb7J1LG+r6StoJ6koqq9yEAtKyIiKScnN0DWvL60t8e+ 4zw4LiknJCMlJzRAWuS/t7uwvLvOuaqrnKWclJ2an7C4PyUnGBcZHB0uN8mxqaSiqqqy5UMs Ih4dHSEiKC88SO+8xsO9aM1ePWm/tpqWmoyPkZafvXIaGRYODhYaI2u5n5ual5mrtuQpHxoY GBseLzg80r2+w8TNZzw2Ny0sNFWlnI+UiouNlpy2MxkPEAsNEiMtuaCWkpSVmqo/Lh0UERIX HCU6xcO9srbpQUhMMy4xQUw78ayYl46PioyTnq8+GxUNDw0THT/HpJeVk5mfsz0gGxUQExki MVa6qKy1ss04LC4vLCw2TeFex7Sal4+Pj4yWnbfNHBoOExMXHz+1q5uZmJ6rzTUeFhYTFhwp QtW2qam5zNQ6Kyw5OCw5wbnX1c6klpSWlY6Unb+9OhoQFxkWHTGzp6KclZutvUoiGBQVFxkf Of7LtK+2xvlHNS0uNDM0P8rI4dWtlo+SlYyNlaq86ikSDxcWFhw4uquto5uftvg+LB4YGBwe IC5jxMO7s66ywdDJym5OTu3qVum+u720q6mutLGusLa6vsbU4NpjPzU1OjYxMjg7Oz1DR0pb 6ehbVmVTSD47Ojg3Njc3PEpx0sG5r6ysrbK5vsPBv725s6+ur7K3vtN6U0E4NDc6Ojo5PT9A Pz46OT0+PDY2Ojk4Nzk+TGrQwLy7tbOwtLi6u7y7u7i3t7O1uLy+wcrcXUc8Ojk7PD1BRklI Qz4+PDo6OTo8P0RCQUdSZujazcfEw8C/w8bFwsC+vbu4tbO3ury8wc7gYVBMS0tHRExKQzs3 NjQyNDI0OUFNVlpj3czEv8DEwb2+w9rh2drmb19z3c7CwL69vb6+wMjS3uVWSUE/Pz49PT8/ QUdOVE9VW11cZ3Fs8tzS0tnRyM7jcldPTktPUG/Sx7+8vbu4ub3Fz+HzXVJJSUtOWFxcXFlZ WE9RUEtJRUBCRFT55NnLvrm5vcXbYEpCQT09R17bxb+vmswquS51JTOnZSw3qb08eK+55Tji r0s2YbtPMkFzbT89vbBd2a+9V0pNVUEtPOJCRcjM3tztyM9OTftTU9zP2Htzxcdmz73O6fns 0EdE/nxKV+e9v8m3r7zTx9BSOD9fUj5Vy99PRj40KSYpJCAoMDZE3721trKqqKzMubbufrab mKKWj5istL8vFxceGRQhRT1ZtKvAPzcuHBggIR0mRuR6xq+uy8KxzmnLuba7v6+qnJSTl4+T n6rIOh4XFxsVHzVP97e4yGo+LyAbHR4bIzI+7Ly0uM3a5UJjxti7tKuqra6svKebo56Tmp+j tNwtICYfGSMrJzjkTk5nSjgsJSIfICsvOVzOyby/3WtZZuf8xMjCsrK6r7Oon56dl5mfnay/ WDQpKSAkKCkwQDc9Uz02NSskIyMnKy48R1Hj3nnmanHJx8G0tK+rrrS1t7Cnp6CcoKGdqbW/ TDEsJSUlJS05OD1MSEhBNSwqJyYoKSouOD9b2s7Iwbq3vLu9w7zCysHIybmupZ6dnJufp626 2F0/NC8tLi8uLTAzMjEtKispJicnJiguNzxJY9zMwbeysrKysbi+wcPGv66kn52cnJ6kq7G/ dz4zLisrLC0uMjo8ODIuLSwpJiQlKS0vNTs+RFZt0cG6sKytsbK1uL66rKGenJqbnJ+nrr9P Ni0oKCosLS0yNzc2MCsoJiUmJykuNjk9QkRVbt/Gvbi1tbm7v8TEyL+topyZmJmanqewxEYy KykrLzI1Oj4/PDMtKCQjIB8hJCkvNj1IUl/jzcvDvLi7wMC8urmysrClnJmXmJqcoay21D4x KyYmJycqLCwsLS4tLSspKSosLzI1OD1KX+nTysS8trfAy87Lv72+wbmonZuZmZqbn6u20Ug7 LigpKiotLi0vLS0uLCkoKCgpKi01PUpefX3h0NHLxMXFyMO9vru6u7irn5yampyeoay1xF9D NSsqLC0xMzM0ODUvLCgmJSQlJykuOEBPXu7Jv8PEyMzR3dHU08W+trawop2amJmbnKWttvM7 MismJygrLzE1PTs1MCwpJyYlJyw0QU56z8rFx9btZ1dWUlVe8sK5trS2raGdm5qcnp+nr7xb PTYsKisrLjg8P0I+PDYvKicmKCstMDg/SVJZVFBWWVJXW/TQyLy5u7q6vrOknp2ampqcoaiv y004LCkqKiswMDM6ODIsJyUlJScqLTQ+TWBnb+3yb2NZUVhocnrOx8G7u7uqnpqYl5iZm6Co sdlEOCwoJyYoKywuMTMxMS0sLSsqKSgrLS83PEFITWTfzb+7u72+vby7vsK+qpyZmJeYmZui qrPjQTcsJycjJCcnKi80NjUuKigmJCYoKzE6RE1RUmfZyL/Gys3NyMfIzM3Buaeal5aVmJqd oqmwxkY3KiQmJSYtMDM3NzAtKiYkIyAhIyUqLzY+TWfSv7++ur7CwMHExcPBvLejl5WWmJqb nZ6iqbdLNSceHyEjJykpKisqKyooJycmJykrLjU9TGvcy767u73J2dXJwb+/vby6qJqXl5iZ m52fpKm1TjEoHyEkJikpKSouMTIwLispJyYmJiksLi41RfnEu7q2tLe6vLu7u7zBxrCdmJiZ m5qbnJ6irvEzKiEhJiUmJiUkJiwuLy0pJycnKCgpKi01RGPTwbu3tbW5vr67ubvAx8u9o5mY mpybmpqcn6S2RiohHiAhISEgICMrLzAwLCopKywvMC8uMzhD3ci/v7+4tbW4urm+wcnX3Lyh mZmcnpubmZqep8o5KCIgJCYlJSMkJSovMC4pJSUoKy4uLCstNUV/z8G/vbm2ubu1sre6ubm5 q5mUl5uempuanaKtWC8jHh0fIR8eHR4iKC8vLywqKywyNzs3Nzo+XtfCu7+/ubS0uMPGytXn aO6umZOVm5yZmZebna43IRgZHSs8Mi0oKjM/SS4dExAWHzdGPz5H2M7sOCorPb6spqaqqqas vT83noCAgJUeKi2pNhQNC76ZjZwmGRUhHxUNDya2qMsmGydQzjQfHzqvqsRB5K+iq9c4Lrmk n8A1OeyQgICFaBHHwqEZCxMij5uxHhYrMCMOChTCoK4oHSk5eiohKdiqtUMvT66lyT0yxKy9 u+O75E5InYCAgtURvMOnEwwc6IycWR0iPi0SCQwfp6nmJSdKLiEaJMKruDww6K+txjA5v6uu NU+uqKsvKNKCgIChDGqfpx0GHcCMlzIeMbVGEwgOJqrCLR8sYywcFiy8p1slLV6sv046xKms vkLFqqOxMixMh4CAkhQ2lrUiAxS2lpshH0+uNw8HDyXFXiZOrqQqEhMwrrk8KGO8s2lMyt28 vbqwz7qv2GUkLK6AgIeoEZ2bLBAGvKGVziO+n7QXCQwnNkEgI93NOxYTJlm6SicyXbS5dM7F sq/CurytqMBdO/LUjoCAjShKljYbBx6xsL8g4qW6GgwMHCIiKD2hosUfGys8LiouS+JDdMWu uFvRtq7GV7autj811YyAg5UlqI0cEgXzoVo0G6KbXxENFy8aFyTQod8vJyo8IyNIv7E2NcKq qGg96Lm2VDqwrbY3Lr6MgIiZ4ZiPGA4Nq7ofJz+UoSUVHCseDRU6rs8t4uJWHhsqVtg0MUqz r7nNyc/P60rCtrdXZM68joCLlq6TlBcWFKIsGy3eldQlIjAoEw8cNU4lKN/pOB0lWchbN1ff fGTAqLJKQs+xumRTtb8/v4eAj5ueibASEz6uEh02m6slL2lPEg0WJCYcNq3CUC9TSCorQsYv LkG0qcDfyq3nLcm6tkQ4rI2AkZSSjZgZHilaDhzjrbIqsa/2GRgfGhYZN/gnLe3ANiIqRF4p Mjpvw7OkrrG8tr7NvWr1SJaFj5SPjpo1JTksDh9EdUldrbw+Iy8fFhQZIiYtOV7MzUkvMDw7 LCc/b7exq6e1s9m5tXJf05SLlJGLj5/HXn0bFCgtIynCsfEwS1YkHBsaGBwtNSs+yV8/PEIw LDZWSOCxpqi5rLVrw8lhqZWSlI6Nkqi6rzsZHiomHy/OzztEZTAsKh8bGR8oJSzX1kH+Y0Mt LTc6L1fMsLC2qrKyub+tl5iWj4+Tpauw1iElJCUlNUNDPlNmLy4zKCEgISIeJC47RuTmWk5K ODs3TFHfub+4v7Cv1ruZmpyRkZCgp6m/KzUyKyk9bUQ9ZPsvLC8rICkoJCAjJyYrPUc6QmZG MjNFPkm/y86zr6u0vJqZnI+Sjpador4vNS4hIyk4OzxOZDg1NyskLSgoJicsKyw8OzlXSUA9 PUA+OFfnSsu4uLa3ppuek5GSk5iYob49OConJigsMThPSTwvLywrJiwqKS4sLzQyNT85PD88 PEJERl1IWs3rt7GunZqYk5CSmJieqNM6NCofIicrL0NJVU1AOC8qJScjJyssLTdKS0A/PD9D QEBFPz1JZ+3cvK2im5mWlJSVmp6krLltOi0oJSEmKzE2P1hGNzErKCYnJykuNDtHV1VGRVdr Zl925OZobnHxz72vqKWgnZ2cnZ6hpquxwGw+OC4sKywyPD8+OjQvLi0rKCcpLS4sLC80OT1I We7Tzs7d1srIxL+3q6Sdm5qZmpueo6m0wf5AMisoJygsLzAzMzUyMDAuLCsvLy0tMDQ0Njs8 QU9m4u7c1ci+ube0qaGdnJuamJmbnqWtt/c5LCckIyEjJiktLi8xMTU1MC8wMzM0Njk7PT5E Umn93c3Kw8K/vr+9tKukn56cmpqdoqeqs8xDMisrKysoKi4yMjExMTY4MC4sKywtLi8vMTdB Umfexr64ubm2tre9yL6yrKahnJqbnJ6kqrTOQjArKikoKCswNDMyMzUzMC4uLSwsLC0tLzhC S1Zyy7u3uru5uLzCxMnJtaqloZ6Zl5mepauxzUAxKikqKissLjA1My0rLC0sKykoKSoqKy0y PE7jwruzr66ura+yt76+v722r6qkoJ+en6GlrbbKTTsxLSkqKCgvNDIwNDMyMSsoJyYoJykr LDxSSODLv7Wur66qrbCvraytrq2jn6Kfn6GlqK+vt+47LywnJiAfJCUkJSkqLDAtLC4zNTM2 NDlKSmXo3L62ubKtqKupqaqrrKqtrrGzsrm5urq5xMpmRj81MjEvLS0uLzQ2NTo8OTEzNjg8 Oz1CWXXe3dfMys/JysjBvbq4uLm1trm6v8HGxsvAzels9U9TRklQTUtKSUpPTEtAQkU/QT9D SD5BR01RTX3xfXlr7tHLx8HK38vPvcjOxr+6vry8tLW9wtrl40/nX3lJSUNYT0ZGPT86NTQ0 Nzs+RUlB6s7Edc/10uzbxci8xrzBvsi+z8G/zcnUxMC8ydtdTOnrWUJUWktDPF9cRkBBRzg9 N0FXR0U+V9R84VrPvc7L1sK+vsvVy7/IeeTT59fd2MTP49zd0993T+PXVNDH21VCUmZNOURN PTM5OVNFPk1TWHvt39Pr49HK2dvRzce/xMm9vsDCycG+zMe/z9x4V2nmaFVSRkhuXEQ+Nzw/ NzI3SEE+O0fuZ2tdz7/Exs3Iu7u7ubnAx9TPwszHzs3+Zd/i6XBfXkRCTk5WU1RtW1thUFRO PUJEPD4+TGJPZvX919fJv8PL1M/Iw8XI1tLO/Vb73ePX09rr2drOz87Ez+7d1GlZUG1fSjk6 PTc0Nzc7Q0FVX01f9cvK3uTBvb24ury9wL2/tsBlbkZ+XULWwdbP2M3F3FNJSD03Nzc7RDdF Q0ZPS/hPbW1t7fXj3sTM2sS7u8C/vb2908/X6/V63HBeWFH7+2HzXmnga1tZeO5kU0xOVVxa TlpPRk5PTllMRVNJVEVFXfW/zczDwbfDxsPGyc7Pz8/a3M7my8zr2WVnfFlHYO59Wz7vyV9M R0JKQD1CQkk+UUNPVUTny/vjYNPFz7+7wMzUv7rN8tO9t9xZ39TN7VJVTV9+39hFVfJbcltB RUQ+PUVPS+pGUNpR2Mfo11lPZF7X6dXe6tvNzsm3z87wV8rJ1P3Xx83bzNXE2FJOV149TlRH Vj48PUA7Pk9JU05GavZ65d3Bxu7O58C5wLazvtHEyGl8S0RYzmxI4G/Pc0rp51tW7UlMTk5b Sz1AQltnTVVo2N7nb+rh03Reae7K0ezNwL++x8XAy996VnxjXu9bec/qXlP73nhuUUREO0lP QlpnSmpqSltMZN9eVnHQv73LzczLzdZve9tsz9/T1nDIysliTHRhW2tJcW7s32Vna1dKPj1H Um7g2tPb+VZM/1tGRU3i3eXYysHO6d3UfXhe/trTyry2vc/l0snNY0lNS01JUVROQkBKT0E/ RE1jXVVr9+Xd79DMz8/GxsrNzsrfVkld4d3r7dLJ0t3PyM3X8uPqYFNXf1tJQD9OT0lJWl1U XFh08m9XVGtz6t3dy7690+D11thuW/TPzNnt4+HR6npuV27q+v7p7/vrfGZbXWtfT1NOWV5l a1jr5d9eT1v309552dnlaGVl/2tO5N1STVby7udPV/Zd39rd3O3Vxr7HyLq1sMDp7916PDo8 Q0I4StTAwsG7wtBLODEvLSgnLDU/SGLavr7WfePBxc/kzsXL4N2tnpucm5eZqU0sJx8bGiAy 5b6wrK69PywhHRsaHiUrM0zCuc9Y6vlQTVi7sbO7ta/IpY2Hi5SWl6wiDw8SEBMdWaObmpqf vikbFRASFiJB0sS2rrtILCUnJSpDr6Sinp6lvjstOJ+MjZCSjpK5HRASDgsPHcifnZiTl7Er HRcUERYnVO7rvLPeMCIhJiQoSa+fnZ2dn69HLCbWjYmRlJCMpiIPERQLDRprnZqXlpiwJyIb EhEUJlPCv7Oq8C0kHR4eITmwop6bmqGoyyseHM+KiZGQi4mrHA4QEggMH7GYl5GPlrggGhoS DRIj2M7PsanIIhscHBocPKWcnJqWlqpFIx8cMoyFjYuMhpsfDQwOBAYVTpmSko6PpSoXFxEQ ER+/rK6qpLUvHBYYGRkjxqShm5qYn9UvIB8tkoiPjYqGkT4ZERMIBg8lrp6clJGZwCslGxgV FicxSvi8stVJLSYnHx8s6riuo6SiqLxMMEyckZqflo6UrzsrLR8aGyVCXGVe2tdaRTszLjE2 Ozg7S2taSj5DSkVMZszAv8XHx2k+PkxZXvHGtK2usrnBy87LxLqyrqusr7jLX0c8My4vNDs9 OTk6OTc1MjM6RFFWZdTN6lhXSDgyOEb1w7OqpquwusXN5Vp+wbGsqKWprr9wQTEsLTI3OkJW d/lPQjozLi80PEd2zcn0TktEPDg3QVPWua6qrLC4x91kWX3Tw7mzsK+wucnwTT49PkVV+d7T 21VBOzQxMjQ3P1nn9VVDR0Y6Nzk/Uf7PurCxtLSzuL/Nzr+2tba3ur7QX0o+Ojk8RU1aXVZN Rj48PD9LUlFSa9va5VpPU0tHSGPXxby5t77R8m1sXlT0yby2t7vE115JQEBFUGrr1s7S3XZN Pjs5Pk551svCwMTdT0M/PDw/UdG/uLe92VVLPzg2PE7hx7y3tba82F9cXWjgysfAvMHPb0Y4 MzU+TnrYyL/E2lZCOzs6OT9azru1uLrC21JCPTk5QFvNwsK+vcDTZEtCRU5s3cjAxczZ3nJQ UWPj0MjAvcHWUEE9PkA+P0lY9N3Z2v5aS0NBP0ZV6s3Gv8G+vcjhZmd5/H3dxK+nLUVOUJ1s PzAtVuDaTdZDPUZg5O3f0s/E1+DX+9rVr7sqLCosOildvb/Jva6wvtxUV/FQUmB52NrPxsm5 urm3vrrG6ks8QDo4NTRBUl9ncOh2W1BDREdMUE0/PExMRD48YNjRzca4trm9v8LGwKufmZ2l pKquPCQaGx4cHy7QpZuYnrJYKxkPDQ0QFh4tw6qnpqesxTkjP6WGg46KjoSYSQ8KEw4ODyaf jY+Snp7UJhILDA8THCzJp52drOQvIh0bGyNLs6WcmZqiYk+vm4+cnZuXllQjEhgcGRsnx5yc oK+9wDQjHBgeJTbfvay0yD0kHxkXHSU5vaijq6Kkyi8lrY2CjpWZkpgiDgUSGh8k5puLj53v LicaEg4WOryqoKCdrkEcFxcVFh4vvKiinqGwRD4/KSElqI+Cg46PoKMfDAYJHSy5o5WNjJ9B FxMQDxAYQaGZlpyozScYDxIXHzq9p52cnq3FNh8hJiwwQp+KgIGPn23BFAkBCyy2nJyUjY+0 HQ0PEBkbLK2Wkpen4jMhGRMYIT2+uLKttL1LMikkKU26utS0nIuCi5/cXL4iEwoWWquktaue ntMfEhUaKCsuy6iamaK/OjUsJSUlPsi6zVlXU0QuJis5Q8Kxxew2ZKOIhZOcv5/BJg0LID6r u7WjlZ7rGRIQFx4bMb2el5efuOI1HxsaHzFuzL+ztLbHOy0sOztNu7/ASNmqj4WPncLErykY ChcxrqGsoJqYsyIPDhIeIi3Ko5eXoNsqJh4bGh0zvqinqa686jolICY/v6aen6S9/rORipev RMG2NBoMFym1ttu8qp+xLhUSFyIpMUavnZudrMo8OiwoJzNrtq65yOnoSDEnK0/YWOnGsMIv O6yJiJKi2Z/FSw4KEyWpu6yynpusKhIPEx0eJjWpmZecrslCOiYfIS/Iq6mtr7K5fTQkJjll 083Ltso2McmPi5Cex6zaXxgNDhRCe66upJmbpDYcFhgbHR8usJeQlJ2x3zgoGxYcLcmupqSh oq5LJB4eICIqSsbFxaiRiY6d1VHXWC8WExcwuK6psqqlpbYuHRYZHiQpL3CuoZ2hrbi9xU82 LjBE37/Ly8i+vNJbNCwqKisrKy5LqZeSlZuen6a3MBwVGSEsOUTqtqinr9BBNC4rKCcrM0+7 rKirtbq+wcvhaWDv22pJPDw/QT87PUNb3uF9W1bfxLKrq6qtrbC2vslpOjE5P0Y/NC8wNTc8 PkJOf8/Bury+vr/G41dNWt7PyMfS+VtENCwqKy86RHXTTpSJEAyrj6MtUkK9r6OuvMS6tr9u OyofPtAtKTxLXr7KPV3DX0NPZk1azru6tbhoSFA9LiwuLztWU1bkxMLEwb69vLzBw728wL65 u8DFyeZbSTw9Q0tQX11MRkdMV1xOS1V429h7UEdBP0pNRkJHTU9SXnbi3c/Du7SzsLCztrzH zcvN5V1QTVZWSjw3O0NMSD8/SFpbUkxMU97L0N3jy8TG0m1ZY+Dmemdt6XVmefDr18C5trfA 193h7VRHQk5w/P588HpcSj45ODk7PT5Ia9bLxMHHytHY3N3PysLDw8HFzOJrZ1ZPSUhJT0xL Tlhx3tDJxcXJ1ud86vJ+7/zm4ONlTUZEQz07PUJJV1tcc9rNzdXd3NTNzcjCvr/DydXc3t3k X1VeYlhJSExTa97MysvT2d9fSD8+PT9ERkld2svN1uh2Z19YWWzZysrQ0MvJycvO0Nzb5XJh U0hHTU9ZYuzj2txtVlpsd2tfXVd208zY3tnW0tfd39/c9FRISE5cYFNHS1lvaVZXX2Xu4OXd 1s3KxcXJyc7Q2XddU1dXUE9WWlz76fTn39Td5uZ++fvt3NrX19PjWElCQENIS0xZ7NvZ3+Dr 7uTe39/Xy8PFz938Z1xOREVMUVxfWW3Qwcfd+W3o7ufd0szMzdfb3XZnXV5RR0NCREVFRU1b /urY0NLVz9LW0c/LyMzk+d/V1n5NSEZKTElKTVht+PhfX+rTzNHZ29LOzs7OzcrN0OlfVU5G QEJKVF1rbuXPztfa08vFzd5tTk1KRkI/QEdXY/fe29DS1dtxbOHMzdDV5OvefP/v6dfLzNTe emtfYFxXVWB+6ntebdzT23NgW2rf32xWTk5XU0hHS1diYFtZdOPl6efZyMPH0dPM1tf0ZHHj zsrP3/H6fmVYTExOTVdVV2Px6O90bXPv525jX3Pvffff6ePc3+b8eHxLR0tOcV342NjaeHr+ 3dTc3tLIwMDEydh4X01DQUlKS0tIWfPW1NXW7vTc4eTf28jMwMhZX0pYTD5BPl9aWFZR3Pbc 9V3u7tPX29bPx9R63+Pg38PE5WtOS1tLPj8/S0FBRG3L2uLQs62/vbavuL+9zbS7zExGbUIs JzI9Oi8yPExOQz9lbmjlxcTM1c/Y/fxf1cPO2epqz8nNyMDJzMnR6l9OP01tZ+1uY8O/wNdV Qz5FRjs/TmTWXnnQurvZy8jZTT5W4/hMX9DH7lU+PUE+RE7VwczY7llTaMPAxsfM1FxiVtbM ytHa2NfUZFZZTEpPTEdHSEL928zDyuBbX1VeXmpg19Le73hPP0lQaOjq2cfHyL/E12Jje9TO yMTFv8rLyPtOQkg6PUI8P0RCXtfs2+TS9WlXce7H3WzTzN7c7W/OzU9O2c/N2un521dYVEhW T0JDVN3d4NW+x3Rk99LM9lDXz3xOTvPO9k362OtWffRTW0NMaV5cSftjW1Paw8TKV8m5uurI v8vTSU/tUDg2RWVWPknh3lRk8eT7ce3L0c7MxN78WN2+1kVKXt7xTd3n31pYVFzq+9ps4fv7 bOP4aVxXb2FqYl1RY/rb5cnJzs3V1VFPdcntRkzyam1VUPh9Q03hztLKyM3lf21mVEdj7FBc zt3eTUxU005O2+r1XtzKynfNvMreXWRc3VBa2ctoR0JNZkJC7c35fsjJ1GxH91VCSlL8zefS tr7XzsPRz9vI0HxSY3VPSD9RS0ZGTVxlUktdcEhAWGJR/dy8xePNu8vrbXPs51PNz+XTzsO+ yNzAwuhSVlRjXt29tby/ydZDLyssLionKTE5RV7ueu7daNjE0NzKv8LLw66kn5udp6i/XCsp JCwpNH6+t72zvlozLCwnJiYyO0Tr0MTp61VvPjxnzcrGtLa8zL/E91JJPk1MyK2lo5ycp7Jb PSkfHiw6Xbyzqam1z1EsIh8gJi00Wsq9vsr3QzQsLTA9X76trK6trMdfV0EvLv+fl5mYlZev PiQhGRUZLWC7raGdpr46MSYdGx8qPGm6q67CaUk0KCImNk5du6qorq6ttkk0Pjw3Kfedkpea lJWoNCUmGxQXLezGtaObo8A2MiIYFh4xPF6wn6W+VEQzIBwhLTlXtKKfqa2psE4tNDIqJ16a kZSXj4+kOyMnGRAPIT1fuJ+YnKxpRSUTEBcjLVGsnJuoss03HxwcHiQyvqWfn6KeqMXuOSIc ISjIl46Qj4yQpDAfGhALDh0sX6uZlZmozkIgFhQaIjHTq56dobHkKhwYFxofNs+qnpyanJ+2 PzUnHRgrm42Vl4qIk/crKhcKBxAfKDWnkZGdr7VVHQ8QJDkfOaSWpL+3sUEXFRokHSB0n52i m5SbtVZKKxsfqpKZpJOKjqw3PSkWCgwWJCQtsZqap66wyicYGDBFJi+0nrPVyrFnJh4fLSwr N7qqpqWfo7TUPisnx5ibqaKQjZmyZk8uHA8OFyQpJj6vpKazvcrXRy8yMysoLjs3QE9wPjxO WvpV3Ma9t7m6ra3fOz1Vr52ao6WYk5muzD80JBkSERokKSxJuauqr7zExd7C2TErOdNAJiUx Sj8xMl+8u+j3w7a7x8W+x1g5L8yZlaWsm4+Sosc/RzwiEg8ZJyQfJkO3q6zH0bm2r8cyLT/i MR8lMjkwMEfHs7G/u7CyuLy5u8pPOTU8yKGdp6aakZeoxF9FMB0UEhgfHyEtTLyvr7rDuK2q s0Q1Rko3KSgtNERGOkjVuLe+t66ur7zgeEkwJCa+m6G3pZSOlaW5cEE0Gw8SHSonJDXMsKy7 VXW/t7rlODZMZz4pKTQ3Njo6ULqur7Gvqqq5y+1NNCspKkOkmaWrmY+TosfiUC4fFhIZKCkk LH62vtndzb2xsd5J2sdZLycrMDM3SU/Sr6y0sq64vVJBOy4vLS5L0bqjnqSlnJedrb+6yDsp JiUjJignKTI/PDU+6r+7vMLe3+tDMTFCSUE+cLrEs7e4qsfMTEZGMzs6NjU+Qua0qqaoop2c nqSqsMpMNi0qJSAfJCksLS4+ctfJy83deVNJR0BFaVlCYq/C0bDFT/+9US1f5z8zNlg8S6um ta+dmZ2goqWruUktKSsnHR0mLi0vOkne0ltkz85MOkhNTUs+z9kzv9k7uUVOsUi2xTa4zzVH ND6uq62uopeXnailqL03Ix8iHhscICs0O0/Asa+1ta605T41MisjJCkyOz1K3LPEvq+3q9Hq ekBKKzipm5+om5KSmq63r1UgGBkcGhgcKE9nY76on6m7t7XaLyUoKB4bHio0OVS6q6ywrau4 xtJEMy8rvZOWp5iNjJetd784FQsPGBcXHEuroqygl5uuz09DLRkVHSQfHyxF/k9LwK+6z7ux utJq2Fc0S5uMlZyRi4+nRD4/GAoKExkaHUyel5ydlZetRCwkHBMPGCMkJ0i6tr/bvr1ALj7g SEjAqKnAz56Ji5yZjo+lNiIuHAwJEhwcHzanmp6pnZquPSkqJh4YHjY9Nviyt9BQY3M3KC0+ PDlRvrG+/aeOjZmZj46ZyTRCLhUOERocHSXfpaWsqJ6lzTYrKiMbGiQuNULDsbO+yLy+Vzs9 Rj04PEpIP1+nl5abl5CQmqy+yEEeFhYbHBsdLdW4uraqpazOQzguJR4eJS0uPeW8tbKura+8 0ubvW1FZYOr3bb2srbS2q6inq6+0vNBNPDIuLS4vNTQ0P0s/PD8+P0I/RlZe38rGx8rFwsx2 TEhLRUVd39LOx8fCzG/g2t506Mm6srOysbS6vcLMYkM+P0JBQURGR0E7Nzk6O0A/PkRTbfDp 4tvS7Wfjz9Pa0s3DxN3XwcPX39fMydLbzsXHz9fn9XZXV2Jec9HM4+zyXlJENzU2Ly4xOT5J atzMxMO+ub3IztPOxsbNxr3Ay8/X1M/d6959VFlcVExDPDw/QUZTduDNyMTBzO3tYEg9Oz1I WFJPY3fx2dTe39vdfGx50r24t7m7u7u/0OZ9WE9LSkZFQz4+QUBCSE9cWVZne/vk19XP0uHz 5eTe2ODk5+tgTlNaW2JidN3QzMjCwsnO19jY39nW1NLV3O1yUkxNRT06OTg5PktRW/TXzczK wby9v8ba72lPRkVKSkxNW/Z+W3DNxsbHwry7vsLIzdXZ52FbWFNUS0VCPDs4Nzc3PUlY+M7D vbSysrW6vsnkT0M+PT9Rwy1UZyrKMefNTsLCvLu1tri7vsvSz9tiR0VJSVdVRj06PUdE+L4/ QL+hrU9IOTkjIj9UPkS9qqixvra38EBIZ0tHQXW8yc/Bt7jBy8rIfUU+S1BMRVJeTjw8S0Q+ PkpMQ1fj4tzPz8vL0b/G19jDvc3Z2svG3Pr52+VrW2RrW1ptaV9wXVlKQ0lJTUpVXFVY9+Jj Vk9W6nhPU01c7GBR9tTKzNfi2N72w7azr6upqrC8v9NeRkNFT2f52txUOi0oJB8dHSAmLDZM 7eDIuLO+ysu50UNtxKaTk5ePj5aobzMsGRMbKCk0xqeeqrm4biUbGBgZGiE0R0zYws9NOTlD QErWt6qmqKyrrZ2RmqSanKdiND81GhotNSw9u6uvY9S+PyUqKiYiJj1nP07FWDIyOTMqLErO 6c2srbSxvMvQppyfn5SWobfBxC0eIS4mJznDwfXhvt4xLTcuJS09UVDyv81BPD0tJScuMjZW ubi4rK2+Xzz0pqKqmZCYnaSovC8mPSwgL31YT+bKbS8vNiceJiwsMk7bcFrLzzovNzQwPWbM u7avrbLIX0NNs6WpnpOan6CqxDkvOywgMlY/RMzZWktOPComKigkLDg4RdrbTD9AOTM5Rkz2 v7/BtLC9xNG4qqujmZienp+txFFCNSssNC8zT1Q/SE08LiwsKCUoKysxQEpZ4+JcU+1dRmDM zd3OxcfOxsvGraajmpicn5+ruNRNOC8tLi0wQ0tBU1k+NzUuKyoqKy4zNjhEXVRQa1ZHSF1f 7Oxuz9fCvcbBtqmlnpuanZ6gqrfPUT83Ly0vMTc5Ozw8PDw6MC0rKiksLzU9SU5RVU5SX1tb Wfnb8M7GwLm1tK+tq6KfoKGgoqessL9iPjMtKSorLS4zOjo9QjgyLissLS0vOUJKWmnjzdLd 1M7NzNff2dzcy8rTx7mtpqKhn56fpKivwF5BNi4tLzM1NTY2Nzo6NjQyMC4tKiouMzc7PkJN aNrJwr6+v8PHx8fJxsK5raOem5qbnaGmrLbaPy8rKCYoKCktMDEzNTM2Oz04NC8tLi8xOD9L bdnVxru3usHJ0M3Mx8TFwL+5q6Shn52en6OorrrSSDMrJyUlJyouNDY4NjIwMjAtLCsrLTM7 Se/RzMK+wMPDwMTJzMzHv7u7vsPHuaumo5+dnqGkrLnLcD4uKikoKCotLzAxMjAuLC0tLi8v LjE5PklXaODO09LKwsG8uLm6u7ewsrm6tqyinZ2cnJ+lrbvQTzYsJiEhIiIlKCwwNTc2MzQ0 MDAzNDU4PkdUavDRwby6t7m8wMTCwcG9urSztLKuqKKgn5+ipKixzEg1KyUgHh0fIiYsMjpB SEdBPDs8Ozg0NDhBUvLPw767u7/ExcXHysfBvriysbO0t7Wuqaelo6Snq7PAcTwuJyIfHh8i JiouNzxBSkhEPzk1MS8xNz9Q68/Bt6+traytra+wsrm9vsLJzszLz8/Gvri0r66xuMDXX0Mz KygnJicqLTY/S09OTEhHRD01MjM1PfK9vuZW0rCprLnJy7uxsrnCxb29yOZ07dS+tbKwsLCy t7/vPi8qKCcnKCsvOUJPXEw/Pj03MC4vNTxGYt/Muq6rrK6urayssbe7vb7G221ZUE1HSU9l zr66ur3AxdlWPjMtKyoqLC83R/fU1tzfZ0o+Oj0/SFZ+6d/HwcG/vbizra+0t7y9xszqTkVA QUJFRkxq3c3IyMXDwMPK2mpVRD07Nzk7Ozo9RU9qX135Y2T3cnXgedjGw8LDvsDE3HPr2M/s Y1NSUm3sW09TaGZk69fSzsfCv769v8jSWUhHR0Y9O0FKUldWTmD4ZGf63eHTy8znWmffdFhb Zu7O4GpiWVlRQT5FZGn5X03eyr2+x8i/u7u+xsnJzM7a5/NZT1FSTVJIQkdASkZKS0lFV+l7 9XzVzdxh+9zaZ2RfT1Bf9ld2+N7L19LMzMXAzsnOz+T24Vfbz9rT1dxx0uxVRktTT0xAOz48 TmpSX2Phy8pa2M3i0Otby8bP20xOWVVddGBTYtfEzuBxy7zP0c/Lwdfr01xXZGfdWUVXREdN RWJhR09TPlZNT25Z3dLUzcnD1OxcZefe1vzYx8vt4dfZ/H7W23FWVsXF1HDqxdRgT1pLZ01S UEXlTFtCWk1ITT9hTEx8zt7ZxstscFDNxWxn1sLJv93NvL/F6U5Z5s/qYWdm3dtxTUNI+VJI R0xPVW/gUVjm2u5IP05+3mBCQ+jGzVRo0r/CztbJvb3F315o1cbP+FlWdlpPT13q8nXmZGto ZGpgUkZLVvHseN/9+HpZT0hMU1tTTURLedhlWO/Eu8bLysC4ub/Iw8fK2n1XW0tESUpCQ05Y VU1NTkxTZ996Yd7Oy9fl59zU3OlSVVVRTEA7P1zk2NbTysjJx8PJyMfLztnO6vn38mlfTF5z eWdNR0ZOTU5HTFNfalp61M7b4e7y4GlZWGFZUU9ZfdXQ29DUw7u+v8C/v8THydLhXE9QRj49 Q0xJRUBBSFJdTURHS0NCQkpcVU5g4tLDvr+7vb7Cv77EytDRzLyzraywt73B2ks5MjAzNDY3 NztAQz04MzQ0MS8uLzlIWGRryr28vru4tK+wuL26rqKem5qeoKau2DQjHRoZHB8oM2C8r66v utdKMyomIyQnLDI9S19v7M/Tz8O/v8PCvba4ur7R18ernpmYm52fn6vmKx0ZGRwdHyU03rav sra8ykctJCAhJSgtNUj6zMfKxMW/wb/ExcjBt8D9SEFMvp+Xl5mbmpuftzIfGRkaGxsfL9yu qKqtrrXaMSEcHiAlKC07VNHR417jz83K3dfJvLm8xtttVL2flJCTlpqborgtGhQUGBodIzi8 pqCmrrzFXy8eFxccJi45Tsi5tshPR1hhWFRX28S1r7C2wv9zqpKMjpednZ2oLxUNDhUbHh8v uJ2an7lMOzcwJh8eJTrVvsPCyc5FKyMlLDI8ZLuxrqywtr/+Sl+fjIiMlZydod0ZCwoOGiYu PLSblJmvNR8eHRseIS5mt62xtn1ILSIcHCIrRMGnnp6lprDN8jcqJ6CFg4iWnJ2lSgwFAw4f MFXcm4+OnD0aExcZFhknxaCepLe64DIeFRYcL0zMrJuWnLJ9Qjo7KiM0kICAhZWhqLoaBgAF Eza+rZ+TjpjaGQ4NDxMcvZqTlp+sai8YEhAXJDFp3a6inJ+wOCQrO0cuLlyNgICAl1O0TRcA AAUgopyen5CNmygMBwoVHCA+mY2RoUEpJiAYFBko3bi4t6+nprY6HyZDv8BmQ66FgICMvc20 SA8AAQ5uoam7pZKVwhUJCxQfICyjjoyY3CgkIRgTFR9Hxr6/r6KepUsqKThiNjxosJmCgICR tLnsHgcABhfKqayklI+cNxMNDxUbIEKil5mtPC0tJBsZHCU0SsCqoqCfp94wLDtJYNTHxpWA gIWkZb09EQIACy+usa2YjZCvGw0NDxMYKrCXlZ67RjQlGxgZHCU6y6qenJ2irstDNjYzNULD koCAh52ppjgOAAIMHzI6r5SLkq8lGBUQDhIlvZycoqyx0CwcGBscHydLqpyanJ+uzj81Nysr L8OOgICMmZeaLwoABQ8bGh+uj4yZtj0xHw8NEh9OtaqmoKK4NSIhIB0bHz2uoqGcmqC/Pj9F LR8m44yAg4+Ti5IsCQYMDg0LGa2Sl6Cfn6wpExEXGhskRqmeoKiyxzsjHBweJTfIo52dpKmr s+o0Ky/amYiLk5GKkMIcFhUPCgkQJ1vjuJ+cpcNXST8lGh8tNS8/0cFRODdITjctPb+sra+s paessK2283a4pJqfpJ6ZnsE+OjQhGBccHh0eJzhLXsu5uMHIyfw9NTYvKCQrR9PZ57+ro6Wo q7C80PfoaU9XxLKztrSvr7zuQjs8Ozs+SO/HxfFIPTs2LisuO05m68e5tcFROjk+OzMyN07K u7Wxs7zDwcbTdOS9r66wsK6yvvU5KykrLTI+W8u8vctlRDo2NTU5QGHHtq+vuc5mTkY9Oz5F Xc28trO0u8bZUT9AT/fQxr25t7zUUj4yKyotNUFb0r22uMhnRD8/Pj9Wy7u2s6+xv+5LPzw2 MzU+YsW9vb+9vMPbZVhRaNXIv7y5vMh7RTYuLC83Oz5SzrzE701EREQ9O03Tvbmyr7K6ymRN R0RJWnPtxry/xMbO03RLPz5DSmTTv7zDy9thPzMyNz5ARl7Rwr/NeExHRkVLXdnFurSzu8LZ TDw4Oz4/SH7Atre5ury/zF1EQD9ATXLTxr68uLzdSjs3NDAzO0piaXdfUE5PTEpV3cm/uri4 t7nJ/GVp9N5US1/UxMPHxc5tVUxBPD5DS0hO98rAwcXbWVNPQz9Fdd996fZnZ/7PrU4uazZu ejzMuX/Ft862tsPTXubnXEhMVF/YxMMxR8s6Rz80c9JEvcdQyVlH5X9Y2+xf2Vvvz0944OLN yrfH1svW/lJIXsbef9FH6PxNaUtHQFNUUWhaycjPzurQ2s7ZWU9jellpW1pQU15HRUdYX1Zq 08K9tL28v8nKcFhKXlxaZlbW0fj832Bk5E5HSkdSVv7P1+3EzV1nRD5FVVppWXJ6X9lcTVnx Ze/Iw7+/x77YZXlYS1VcRkpFT+PPw7e5t7S9ubfO1cfRWkVFOz44NDU4OzdESFxhcGvaRGPl OfvvVtPVxcLFzMbJyczZ6uXe2fLQ3/fZ+NLLz+rQ1MHeUcPP9V9HP05OOjo9Z0k/UUhDRVxF PkVO3M27wsbIubzIvM3XvL7NwsLP2sDI4nNo9FE/Rk1LT0c8Tkg1Ly4xLS02OTlI9dFxyrbM 0sjFucTLu7eopqSenZ6fp7nMSDc1LCsvNztANUguJCkgHx8hHicwOD9Vx76+xr6908i5vLSn oJqXkZKam56u5TorKCUnLDE/SVhnPS8tJx0aGx0gJS49QFnk3s/HydO+xb+1uLm8s7Son6GX l5+dobC/QzEuKCcvLTNaW9rPXUo9LiYjHyEkKC4yOVhRPVNSSFtKZujLvb6+u6uhnpiUl5ue n6zNQjgvLC0qLT4cno8VERuU5RM1IxzIux8luzYl0sgmMe9vQbm/SM2vr8ennJuXlZufnqXJ XUo4KywuKTRITDxETDgvMC0qKiwuMDxBQ0BJRjo6O0lObsbCwbqws7+7rKWgn5yfoaivtsfz RDYuMUUwKDJX0Us5MS8tMi0pLDE1OEdPVGLo+UZJX1lFT9/ZzcC5uLKooJ+fn5+lq62zvNdg RjcsLzU2PT0/Pzw0LzAsKikiJCgtND5HTsu3tr/H2763y1XqycrHs6afnZydoaKpsLz/RzUr Ki81ODA0OTo1NDgyMjozLTE0LjxHPz5XXO7nyu1vz+nV2OLuycC5rp+enZydnqGrtc5YRzos JjA4OzY5P0E7Ni8sLygoKystNj5GSU1Z3M/pZ8q3uLi3vLy7w2nUtq2no52doqSqr8hbSTUr KCUsMz01P1de3j00Li0oJyYlLD9BZcjJ0c7Fv7+zv9nIv7/i4c26t7Gro6KjoJ+msbva5Dou KykoLTM8PTxLQEE4MSYpKyYsKjE+WGDZ1MjHv8TLwrK6y766vLi1uMC+rKuprqWoqKmwv9NL MDwrJCUtNi8uNTQ/PjIuKzArKiw0Lzrn58q7tbWqq6uyuK66xbmxsb21tbu8vbi5vW5kyutf XUg/NCktLy4tKDZTVUp01F3x8Do3S1o+S29eyM3oYsWywtmyw72wxsK1s8fG399iU9G81MLf /bvOP07bSTgvNT1UTD07y7nTPktMPtZiPOnJPFxOSlbO0s7T18+5wdjA1l7S4UpWSXVCUdRu xba2tbfsT133aUA6QUhcSkL0u7HHzcvA0MpATNvGbj9USEA/LC42OD8+PFLXxuLMu7+9zc3J ubnKvb24vdbJXURMP2DfXHzr0Nj3/N7OWklNPTM9PkNgW+jN2ltUY9bSUl9srM8fxLqhNFFa x8Xa8/O//0Vw0OZQe8fhzNa+0+v8QWNWSTk/+E5GP0NHQkFBTNpoWVi+ve64ubvDzdXLz9fP /l+/3FJlfOJxXOzt3tjm7dzrSO5NOlVPSUZWOTlXWG9TzmnK0eXHYt1uUd/jTFnNWWHG13je zdX32dnZ1sa/zcS4vtfJzetJSUdJPT89PVtGO0JASvxUU+fX5Wrqycfm79XbXvfe48bo2sDd zMjAxsjSz9b1U03i11/V19vtRUxNVD88OVFfRGpi4XNO49BbZtlwc1xOTE1dWkxPX1RN1MfK yr60tb27trTMzdPMwcn6T2F6Z0VDOjw1OkZBPU9HTPf5T0lfVOdfT0xK+tfWzs7R0MjOyczT 2Mi+xNHN2cnO3NXN0cjP91pt3lpaRUM/NkM9MzpBT1M+U0dKylRNcMG2vr7JvbjJv+J33nzl ddhP5M/MzNrRaVBOb/9rzVpLSn/4VnNVT0Z5Yll6T05LQlRWTFZL173O23LuzsHKdkrTx+ps XGTWydTyasy7zl7tzdTcSUXd1Mjd885aW+NqQkA5PTtFREQ/TM3Q2czDw73Fw0RUW+LqXWfa y8q93EnY3/d4V0lWatTI/VH0zL/OTVlc6upeSUtvXeBMQExIXedSRU5R3cJw1cnFvb65yf7O vu1OPU1CQXtXy8xZZOvBv9NRYdPwSDw+XmFMO0hk61hH8WDP6evm5szjyNrzxcvCysi/y2Bz XGbYPjw9XsvXWUnd7+ddXeLuxs1vT2Pj/0fo605qUu9j3N/UPU/pWdpETGpU1kJx39rH1L/L 4N/UzWnhxlloTdixvLe5urtMKSQrKC1BP9ytvLm8x7zH01xuy/j5SkBk51c8UmPrX01jYchv 0tPCwctdWeff1eJVeON230f00mnO0Xf/TkxKaGpNTmDoYF1Oc1zk7OvsXmHJ0tTGx9BNedTP 7D7uWfPNZMzV+t7ox99s7E9oeWtU18PXZUfqxNtHRE5vRj8/Qj1PTU1XRuu+yMfY58rJ0snG yL7FvcHhW0/o1eTN0nNoTkxZTUdPS0hZS0U9S01dbWHj2uLl9djNY9Z92vtRzuzT5VBPVs/C wc/IvsHLZOHi0M9idUtc4WBEOkJNVVJPSkk/X3RsZE7Zxs/TaNnZxrfBts/T1e9tSe1q29Ra 6MzbXz84PURqS0AzNjg8PEHsxMTdYkhL5t7cY82uqayzr6ifnJ+uzFVKQjIpL1HEw0cuKCYj IR4eJC4yLzEyNz9PXOjMyL21uLm3rZyIgIOUOyovOCAVFSCunZ/IPUtLMxoRFCVx3TYnKjQ2 JhweLd/E1OHSt6mhq750UmrOmoGAhJ8fJC89HREWLZuZoVEuLCklGxUaMb2+OysmNSwlHyE0 T8tQccavqLT+bMi3uM7Dn4GAg6wRHzTUHg4WNpKUpSwfLi8nFhYsrqC5KR8jMi0eHCRY0Uow NcGrr9BV06+prmpB2ZGAgI0mGD2/ShMQIKeSn1wnNkQnFQ4azp6kQSYpPjohHCNfvNAwLGm3 vTwnOrSkrWpNRNTMlICAjT0n78U/FhcrpJan4DI8OR4RDhr4ra7Uxs83JxwhJjpKRD825szR Wj1s2lV31Ke3ZytNi4CAlyIks7gsDRVHmJS8RjDXNhYMDSK9qq+orvEkGRkfPzzkSVXZ68FO OzBAtqy82sqvsz0jM4yAgJkXJKu7IQkYv5GXSTI8tjESDRRMqK5V2bbXKxYdKrCzVDMoYE9b Njbova3NP+jFskYoLqqHgIOjIy6vTBkOHqaYnz491c4qFRQeUby/ur/LNyciIi4xQzk5RV/Z Wk47PEdfzlt/uaulvD4s0YeAhLQWW561GgopqZetJTe/ricODRc44TNYtpugLRsWXL3LNiVd TMc+Mjk8e9zcxritrelHNDW9hYCIsBupolcQCjazm0Eow6ewGw0SIko0JWuhlKsgHCurzCod KddKOy/gvHFaUtO628HNwsxCLiWlgICLOx+fqy0KD8mooSlBpZ5bEA0UJSseKKmXmaQ9KScq Nh4uLsPDQ8rcuUMvQFrMP0TKs7F4Qju1g4CM5B2XnzwMDaysox4voJ/yDw8ZKSUcJ6+anU0s OsRZIyI4vt4zK1K01Tg2zbrIPla7ur3Byjs9rIaAjrMxnLAcDA+308YjxJufbhcYGyEbGjiq nZquQSsuQisvJjMxMl3PrGtAQfnbOTlJvq+sprF9Sq6FgJdAPZOrHgwfqUUtGq2cryMXJiIa Ex7CoqCyXNNpTyslLTU/LknHusFYTPvlNjE4xqmvsa2zSj6lgYelzZ+OTBQM4j8dGCyWodsd NzgcDg8uzXhEopStLx9tTyEcOq99NzmkqE4tdLDSQkawr8m5tMVNxIiDnruqklwSDlvRGhkv l6tFKL1yGQ8XTjssQ6mj7S8+xzghJ0RjLzLGoa9ou6SmSjdpq7HGusLQ9j2nhpDDqJyeIhMs whcSIKyoPEOppSUYGSkjGiLLn65QvKi6JSNCTCQl36at37CepUFCy7q/dsKswVn97pyJn6+e pb4dHDYhDh4/vkFKrZ9CHiw3JRskSrtmpZ6xrb1iMyEjNSw176+trrC0v+5ORjVBW0lCUfu2 joynoJeebyAvQxgZQsFMPbCfwig5Oh4XHiwxJT6qqbu6uM06MTg1LUm5ubesoqrKdN07Jilf 5j5EttWwlZygmp+mzT1WLx8sPzQzWrezytBIJh0jJiEjNszKT8+vwU5ISjsyOm/KurGuv8G9 +ld/e2ds4zk1SquYo5yRm6m210goIiooJ0PAwcPF0jsrJyUgISlDUDvBs8DP6NFQNzMyOT9f dOm1r7fDwbZPS+MuN1PZoJqdlJGaoKe8RykjIx8eJTA6XNbYaEI7NCkoLSwxPkvxx8G5v91e Pzg3LzhZwr7BsLi2sb7d4ls+WtSlnKWXlqChpblGLywlHR4oKzFN9VhPSj86LCkqKTE+PU/L t7O/0dNZXXNHP2fOxMLhy7vU7mjkPzPRwaumn5eanp2outROMCwqKicpMTw/Rkk6NzksJSgp LC8778i/uL2/v9Ja8VhO6mDt0eTJvbjExr9GPlbNqcGemKWdnqu24+8/KCYqIi1EP01c/Uw+ OS4kJyomLDtMysPJxMLCb0psTkr22srHw7Ozr7O2x+7pQGS7vaynqKSlp6u4zkstKiglKi83 QEZYUEhNPi0uLCgtLztX2bO5y8fO0dNt99/8dmPWx8a3ur3M1Gxo8cOvvqajpqGnp6/E4z0s KigoLSwzNDo9NzQ1Myw2Ly9DQP3h0rvAtLC8vb7Ev3pp2Flp1dLJyu5MSTw5SWu9tamioqCi pqu401c6Mi4pKS44Oj1BRUA6MSsvKis1NkVr1L+9t6+zvb/L3O5qfWVp0Mrh18zV2NNgVs7D vq+qqaqpp628y109NC4uMDE0NDk9NjI4Ni4wLzM9RFZ5yrm6vLW0ur3EzGtO3dhp2+zLy+XR SkJCPkjcx7CqrKKnrq+5wWpAODk0NTs5OTk6PUM7NzEyOzY2QFRVbsm/ubm5uL7K19727v76 5tbR1dtfTUlJSERN88/AurWxsLOyuL7CztThaFJLRkZKQT05OTw6OT1DREZPUFRqcf1pWFxc XPbh4+TtalhXU1ZRTVBPXfPLvLKuraqnpqeorK+0u+JIPjo3NTMwMDAxMS8wMC8vNDg9TF3z 1cnJysjEv8XP1tXZ3nZWUk9RXv7w3tHHxL+7t7CsrK6urq+yvNVbRjw8OzY0NTc0MTIxMTAv Mjg+T/3c0dvYzMbJzMjEx9Hf3u5jWlVSSktXWWRr/Na/s62ppaOkp62yusnnUkE3MS8uLi4t LSssLjI1Oj9LXfjm2szDvsHL1MvIzcvXe2pj9+xUTF779PLv3My/urWwsK+trq+zur/L5lJF Pzs0LywrKysrLS82Pktv0MvLysnO19/dzs/Q1NLOzNHkZVhUXE9KUWXv6M/Ev7u3sbG1tba2 t7q+yN9hTz85MzEvLi8yNzxESkdMW3z4/e5qXF1VTlRjal5fYGz039zUz83Kw8K/u7u6vLu2 tbS1urq7xtLl7mtLPDQwLy4tLzU6PEBMV15bWXn5Xk9LUFplb/PdzsrGx8zMx8XM2u/r5tfW 2c7KxsC8ubi4uLq9wc/Z31hBOTY0MzI1Nzk9Pz4+P0NKT09MV2ZvbO3SysjLxsjLx8nKzNfY zszIwcHExcPExcTFxcXHyMzLy+BlT0I7NjExMzMxMTU4PEVQbOrq4drl49fOysfGw729vsDF wMLRZVNSWm1hXnHez83W39DKztfX09PY393jYk5MRj88Nzc4OTo+S13/2tjV1tDKx8fEwMPH xs7d7O3saV1bWl9oYFhVW2FsfW5y79/Uz9Lb2tbU0Nt88dbV5HRWTUhEPz5ARk1ZXFxdc9rU 1tfU0Nnj/eHOycrP1tzo5Nzf/VxcXl5WU1teXFz43M3Nzs3Z6eDnenJgc21OSUtTTUpKUF9e a3zg1dnX2d3c5dXa7e526uJ9ZGXt6OJ5cGRdZnt2dePW1dna3uTaztDUzs3L0/RdUUY/Pzw9 QU5eVk9dfvlvaXrp3tvYzMfMy8nM2fr57N/1XVVUUVJf+u3q3dbT1+jj3Nnj+OnP0Nvd7HNh VlVPR0dJQz89P0tRW3zd0svIwsLJz8/Pysvd3dnb519RVV5bXFpYanJpaW1sbfl4evXt5uTa 0trg297f/m5tbG1cV1tdX1hNTU5QTVJq3tTX0s/Kzd7n1uBz6trbcVlbWWNqaXLn7HXt6fR8 dG5249bZ6+ve3tvtenlnXFBNS0hMWmRhX/ve3djX29rf6uzx9OTh8fd5Y/Pv8XlzbmllX1xc Zmh55urr5NrT3t/d3tzg8n1iWllgY1106O32a2Fx7NzS6mVqa2zy621jaXn+bnNzfvPo7Gpb aHRYTUxPUlVUWmRq3c3MzcrBvLq7vbu8vsPM7m1gTUU/PTw7Ojo8P0VKTFJdbe/Yys3T4nf+ /HZnXFtfbOfh3M/MxcLGyMnJzs/Y3NbOys7daFxUS0hDQEhRVlhWW3JuYFVZdu97dnF57eff +Hr+8Pzu7P7r5+9sXFldXm1oaWJk9Ofh4NbJxcTRWmG7qc4+4LxmPT5jQTg5Y2BCS2ZQTW9a Sl3M2urT3PnPvsfJxs3e4ONsWXbj8HZmWlx65eT35OD2aGhaTlZWVVdZWlVfblxe993P0918 /9/X1uHf39XO1dz1bGNXT1VeX3Xv6fFz7tnc6Orl3+/4XlJVWV1eWltt7Of1/fT73tzwb2Jo YlhgYVhj8dzT2drU1Nja2tXPzM3efHz992pYUE1TV01IS1Zm9ef28uLf4+Hm3tva3GpeV1pf ZHz+59XS2/f75vbwdF5iZ352beza1NHPzdTe71xPS0lQXVtQUHDNa0FV1OZj6MvJ293Mxs7e 3HFUXl9PSldfbuDtamVyaVhWXV//5vdsfenq3NPUz8vM0eTvcVxYXV9sdGZjZnFsanh8ZVdP U3bd2N7i73/x5uR1Xl956ufo7trU3Otra1tldWBdWFxkYmR269/g9PTo5NfOzdPX2djqaVdT YnFuZWvz7e5vVU1NWXx7bmBeZVxbV1v04+58fuPY1dPW2NbO0tvd4OXl3NfV4XltbmZZUEtO V1peW1pXV1dOUvje29rY2+Li3uTx4uvu5eLd29bhZlpcXWFeXV1dX/bd3Nzc2+VtbWZZXV5d X2R1697Xz83Q3d70Z15WV1lbXGLw3Nra3N/v3tPc+FpPTk9OT13728zIzdLW3Od3XlBOVF1Y V2bj1tbZ5/b7XlhTTk9Xb/d87uTYzdDY29PS09Hf6fZraltRVGbg2t/0bGRdVFZdVlRWWFhX aujf3OXh2tbffmJe/efh3uzo8Xb39fnd2tji6/5rY2FnX1pYZXteWFxy7fB4Z23o2NDW6PP2 cl9WUVhcW2N849bOzc7O2+r7bWJZYGn9e1xaW2F27/Pt19XY2+9pY3XwfW90enxmbPLy/25r ZXRsWVFSaHzw3NPY43p2/e7c0M/V3v3s5+n47eH5ZE5LTE9YW1dbbdzQ0M/Y19nZ3Pbs7+1s UVNZY25fV1FacuPa7npu9d37YXbc1tXQ1NbRzM/nZWZmXVlWU1dqdmtaVldVRjHcpdg2b7fM YG3gZk1RXG1WT2rm7c/J/WzR0d7U1N3Wy93u52pPR0lNTk9ZX1xlW1Fi6NrSz+V55OLucXXb 33ZuY2by0s3S3OTl+GVdVlFUW37t7+zo53xydP/i3N/b6uztfXdpV0xLSktPUVti8NTPzczK zdrodXHx3+1gVVdjb/Lj3+DdzsvP3u70aFpVUVpubWtRS1Z66vD67+Xn8GxmaOjY4ubp6+jk 4O1ybGFaVlhZVltjaWBx6d3V3Obq2M7Oz9LX4fDp7G5rcV1UUU5NSlNdVFNdc+HPysrNzdnu /nn37vVpYlxi8ftxY1tmbmFfZ3H++vN5Znbz7Ovu9+3p6Otqa+7f6m/u2dnY3fRrXmFdZnBw /ejh8X7ueXP76ujp5+5iWE9VWmZ5eHdpe+fg3Nrd6evqdWlaWWPx7XJ57e78ZWB8+ebh4eHh 29vsc37o8fp7XVtm7O9nU1Vaae36/urf3uFsYP/n2tvk3dba4vVnXV1bY1lPV1xfZfLs6Nbb 6PdaUVZeZWtqbP7b087S1M7Q5Xd7evn5dmpibvt6ZmRcYW38elVUYm5vd3Pp1crK09vj5uj8 ZVhUU1xaUVjx29Ta6X1lYWNrZGd56N7Y1Nvi3O5sYFxtbWFldGtpe+Li3tzj2dXc3eXr7WhZ UVlbWmVVWHDu4etmXWluee1+/uPj39fX3+Ti4XReaOXd5ujs5dze6nhv+vDu8nF4/XJmUEU/ Q0pMTU5h7d7a0M/TzszP1tTUz8/c/l5k/t99Zm1lbXzucWhpXlxUWGRfX/19bXLjzcza+Gpd ZHl5cWluZ1NQU1f63N5uX/Td2Nrr5dbZ2+x+d2lhX3By3dPV2en0/evk/VpPUVphY2v34+v7 cHZkZf1mWVNfdHn3/35mYvvk2dTS0dPd7fjf2NXS2eR+cmlbTUtMUGX7fWZt9HJtYl12ce3s +Hv84uHqbGdtb2tv+O3c3eXg3tzTzNTnZFldbuzu+mlu6fhbU1FPUVhTWWpuefDw39TS3eX+ benl3+hpXmnt4t/s5tnP1+9rXnRoXFhWY/7c3Nvc4uL5/F9STU1NTlJk2M3KzdrmbXloW1hl a3Zua9/TzM3Q2f1xbnNqY253al9iY/3h3ejn5nxqXl5UU1BXaGtvXWd67tzZ0NTi3OR6dWN4 39Xc6tze4e3n7vl3YmBSUFdYXGJ4+ufP0OJrZ/ne2+Tt7HtwYFBKTV5p//797eHb3u7/29Xa 6HNw/+Xs8X1bZH1+ZU5VcOfpb2Be9+nd3ere2tnh+ltYX15ma/ff3dzb7G546uPsfV5n7eff 7Oji2d/2XVFaXV9bVlZOTk9QWGb89Ovq19DOy87O0dLMz9fo7ubX1/J5WU9PS0tKVl5vck9O Wl9ofezg3dTPzMvNzNHWbVNPTU9TXHz/efr/fXX28ODZ3+Hp3tzc5HZpZHF6Y15fY2xsYml4 b2ZdYGRk/NfT2dvc3ujt5ubi4eXzZmz6dWZUTlZx39bS3eXm5/1hZV5ZVU5OS01befLu6fLe 239ufPLVy8nM09bU0t3k5eLuYFFMS05OT1RWX29+4+Df1c7Ly9jy7ulzYV5dW2V4WUtKUl1a Vlpj5dPR2djPx8fL0+Lxe3xvYVhVVltYYvvw9mRiX3ji2+Rrbfbz5u929+vv/n5lYV9dZ3bp 29zleF9neP3t3tLX7HNrbXhtbG9pa2hbW2B26ez0dvLf2txyXGL46nxx8urg6vZxZGZxcF5a XWz273r56Orf3+Ll2NDW33p0ePH7WE5LTU5NVWV46Nrb2NXO0tXe39vi3djY7mJfXVxaVFte V1BOTlZgc+54Z3nl2M/MzM7R19va5Xf6/WxdYGR4fltVV1U3O9jo0Ezfwbu8znNf6M/oYlVa 5+XN3VZQX2pdT1Rt7eF8amFl8v1+Zl916efs8uvb1Nnq9Xp44+zy6nd/+HFjW2l5fm1safvm emRYa+jg9V5gb+/1c+3Zz87d7fXp6m9bVl1o+XxmXV/p7X9u/NPO0uhmWVtoal5dXWL19Xvz 4tfY6XJkW1ttb2Bh7NvX0NHS1uDoaltkX11dY3bn2N/e7F9TWWl+c2ddW3F5dGny29zj5+vq 4ud9W2L98Oh+6e9x7N7b2+PucmFeWF5w49vkYFpncWRga375ZmVu+9zW1NLY2+5mXWprWVFT XW5iXmR739nT1N7j3+//7fr+fHbl5Xh6enlsWlRVYGlr6tvk+2phc+3d+l1i/N7f+X7z9Org 8WdYVmXi3vjw493jeF1ecvXe5e7j5OT47+RvYFhOTUxTbeDY393b2NvyX3Dg19Pi9Onj8XBg e/tjW1hcUlzo3d359eP6YldaXFhjYmz6+t7S0NHb5dzV2vdp6eTb51xVVXhwXmbt9nFhWmJP VO/Z7Ftf5uLl+tnQ9HLsd2BOWfP85+XQyNvi+vfhX2plbVlGTVheXVxt4Pz5z83ZYGjd5WBP d9HO2eXUyN1fZ+9qVFh+8WBVWH3yb1/n1etZS1ZaVl1ja+vc0+7o09zV1dfeX+rUfnL9fmVb 5OhxX3fN1HNZWG1fS1JbYlpk/3L67snE0vp0+ttcTF7t22l0ztn+a9zPXUtX7uF48NriZlxw 2F9Tcdv+S03jy9dcXtTgc2Xdzeh19uv3Xlje3HlaV2NeTVdjdPxW3M7m29HEx1tS79rcXl7u 7FtZ3czOXFd4/k49SN/7X3rdzOJfZmtbT2bj8+ly3Nzl2tnMzeTZ1NTvSlDxb1RU7u7wWVnr +33+YFFRWWt0bfna1td1+dfQ1+Xf2e9KWdbcXkxj3GhNTlHf4/7N4+Xa08n9TlZa7N5v8u/m 9Fh7VFBfXdR5/9rw1vXW2HZlaVljZu/S3M7+Zc/d01xMWk1jV1F4XNvnT9zr8eZry9NXXtDL +Uh22ORQSuzzVmTb23FZ0cvafHdv4HFnd1ricU5Xft1iTvje+FlV1thjXN7CzuXg5W1LR25g VlNX6vHOycvI3eLZ4elZ6dFiQkBXZExN5XFW9Gfbc3zK0eri1MraX97T2F5H+H1QSURr11JW UL7EZtj5ydNa1OZqXlfM0VV16d1UR1pUT09s6ndf4fNeaubNzWXEv9bg5MXWSlt440k7VVJE QV/LyXpZ2c/Qa1XLydD0bWV829peVOLaelJG4nZT6E92TkrTa9t0Tb3SfnLhxfdK38PMQUbN 31hGzcdnYV9rX1Jx6+z8Z31n3u/r1s7O0d/rX2p1Vmb7XF1i30tObVdeSVLSaOvqzMxX39Dd aE12ztngUGXG2Vrx5+NZW8T8Rlv112JQzMvTfXZpRltPXdhb69vV19zU+uzmdE3q1GxrW+zg SkdV/HBeZOBi7s3Y927ZzlNga3fwdM7s78LY3U7s2UtMYsxhT271W19X6V/xxOlf2uDR2PPP 3fP7+khJXWvdWGNXU/dlXNnPytZkztJ2dODZ3k3yY0JOVGVeXMzPaG3U3UdC9GdyRczF5svL u/FczNp+Q1fMTUTa2mVGcsdYSfvJyFHe1uNQRNHsXVNPZ2DoU2Nk1tNeWtDlaOxnyNtpz2Tb 63XeWuTY60r419xvUtJ4VNfm7Fhj1vP16HptT09eeV1OTevQR23f2dJa0slRau3J61bW9uHc z9pIZM1ZU1nW1mbOzdxY4s9rWEtSTFJj5XVa3d7rT1HV7FZxTFB7eb/z+L7Nu+Vlz1HOUT1M Q+LgP2pY2ctp48/q3nDe4E5mW37YXVvPXG/O9dR76dFe2fR46HP6U1VeTV5+zdxP391T58hU SmLY8EhWwWVRW99cVNXN91fAzt997MrtXk3wdVZhUt1qSu5zx81U3u/I/1HW5dFVVOLxT01/ 3ndV/cZ8Z1zK80JUVNLQ7lVu3dfXVczUd9lP51Xu73nsTe9PXfFv9HH73vjWy8nLU8zqWl9F fElI/u5YStvsYvLaz+fpv29dWeReS9Da21jTwGNnduJqTPfsUU7da1ZRatRPT9hZYVjg1lbN zd7r7MlXatXa1kPO2E77W+BPY9Xf91hV9M3ba97aXkta3lxFWsnRVW3R0lBX7F1eZ9Hj4t3Y 0e3HymBV6WRHSU5LVWlbzufNzXXCy1n+1dtEQ25dWFTIvfnPwcvlRPZ7TPRMTEtTxGN6/1/C TM7KO2Zt7lY+zm1k99DCROjdatLmxtfTvL/qVtreOz5HfFxLydhZYk9lZVVjSVlQXedO2GzM w9zZz73JVtvJ8tfV2FxB1Fk9T2TgVkvRdUhh5NtbTM1QTmpOzubUze7laGJ73cjNY8vM+N5f WmJ1235NeO9qUk7gT2Da6N14atJp3tPwWXPZc1/0a9fYV9ZVbs9d4FJHZ9v332VnfF1w9FBc 0Hhyas7TTOXY4nVpztLjyuH0ft/mWVx+WVVR8FBJ0NhUa93Q7/jE32XY6t5+bWxfS2lSTldN 31VaYUzz0+/acc/I2cnQ4M7Z0fdKWVpcbW5qX1H3ZHVeW9FbdOnq23TZxuzSfEhXcFVYS25o SfvlVG/V2M3eyuRf1nthX3jP1dPb3dBf33hoeEhWVEJRUWLi52ppz875bd1sX9nLcV3f4Vdu ymBbzNRyTfd2SUbP0krexdDtY9fpZe7YXVdUXm1R2N5r5t7sU1t61mlX8nVfXWB403Lq7tzm TVPU1Gns2edg09bY1c/B53bNdllKXng/RVT4UE/+XFh80+1PTfHtZmHifMvN1tlkz9vf3WXl 5ePZWVhmW/zu2u5u3ezjcWBgV1BOU13w6N9U/OXj7GDnbGvd7OHPeOTe1+Bd3djYa9nUYF3f 3mRhX19SUedZRVBsbUZs0eDs7cTXXdvZzexg5lvl3X7oUt/jTWFnWmlWzND1zM7D1VnjX0tX WGtPS93sZ1xv7WZl7PRbaO137/TZ0M/Iz+pZW19WT3zvanp+zNl43O73X1FkWFjl6PX3cODm X2xpdeVe7nZe2tHx7FZo/lPqaFzk4exsWeLO0djh7+zk3lVMUl1qZ2RvU1PrfWZndM/L2ddr 38rg3HVvdVXtfVVf/9/rX/jl59vL32X+3d9dZWFNR09iUU5YbFxy2dfpzs7S3PnY4e7c6mRT VehXUXlm/Vbk2Vlf5s3bbePPy8fGzNpqaPVRSU1WV0tJV2Pg3eTuWFFcW2378ed02tHee2jc 1uLc3uHt6+JvW/TncGhw6X963ep1XGR3ZW1lXm/f2uX6b2z8fV1YYPPa29nT2ODtbl5s49t4 XVpdX3PvXU1NZnhRT2t76Ovk52jhxsDS1dHU1tnO6VheXU1HSFFQS1FdWGTk1NTh0cfLy8zS 325oWldcWVheWmZxX29qZmhWVlhZf9zY1dTNzdTb6NjW4HhaWl9fX1xcXl5o9m1kfOLfdm7u 4dzc5+rw4dvtY1hbY/Hc2PNafezsYFzo72v3+mRVV2prXFlk+O/y5+N66NTa3tzQzdrf497Y 2tTqVExOVFBJSlRn6+H7c2pvcXVlZXzdzs7Pz83Mz9v+WVNaV0xOVltiYlZOTVtxb25v7tjP zdDSzc3O2u3z6vLz7vHs5u5sWFBPUFFSWlpbZHF5eXNv8eDh5Ork3djU1+Th3N/oaVhaW1dY U1Nl8eDk63Vw2Nbh4uTr593e9W1wful6X1xYW2n19+jX0d/3e37zaVtVUFtv//R3/vDo6PLp 5OTxb2Zhamxw9/Hr4+T8a3P/f+ry7PZ87enY1dTZ4OxpWE9NTk9UWVFTXurb7frv4dfT19zZ 2drgemZm9O50XFlp6uz+eXVu9eRvW15r+XtoWVFaaHhwdvDf4evu4eH+fHNv+eDZ3trY187N 0ud9Z15ZUk9PWGd99GpaXWB2eG1tbvL06+r77NzV0dba4e92YVlabPr3Z11UUF/w6eXd0M/a 5PD1cvrucFtbYWVpZP3h1M3a/Hh3fW5xbGFnYV5cW15r8vP16uTez8nO33FfWVZVWV9u8u7o c2x4aWpzcHbr3d7s8vf15d/t7ODr5nhfXFt1+mBTVVVg++ng3NHV3e1y7eLq7ujs69va7VtS WFZPSk1RWGv86drW1s7X4+ru3NfW5fF8a3X5f2FpfPLe3NrS0truW1RZYV1RTUpMT1pgbn52 6vrc1NTKx8nP2N3d3etuZ1tWWl1eWFRVU1RWZ//c0dLU29rX0tl8V1JVXGppbHf7bWpoZvTv eP7t5+La1Nrm597a3OdyYFtVUU9MTldl8PV/6u3/dHH339zi4uPe0tXd39/c9WRbUEdLWWRl WWjd19vZ1t35+ePr/t3Qz9l1WU9UXl9fW1pXX/jm3dXW2+bu8PVnXltOTFni0Nnl5NvW3ufv 53hlWFJdYvDb7vB2bPTq2OFuevltWU5UbPne0c3O39/f3OJuX2FjWlhaY3RsdeHjfO/9Z2NZ Ym15ZV1lXmXd2/rs0cPK3d3g91haYVtfaHBmWVxoam7p/2977ep5fuvg2tzkX1/9dWNgc2tt Z+/c3vf15/Zlae7vX15nauPV0NLoYV9sfXj4aWR49n1fW231W1ZfeHNl9tvb5NjN1O127+Zo XVtlanrya2Vqa+jO2fVs0snZXVhsblhTXexwWGXd2/no3eRkaXfe5+ZwXWBgTUdUWmVl+9nT 5fzQxs/a3tXT1NTK2mpOS1lPTE5ZaHZdfdnPy9tgYl5RVk9PXF955NXMz9jPy9ZyaXd9XFRR XFZPTFT55nbs5Pvz687S5OTT4OTxYfD8X+rbde7n3txc5crpTPXc9VNKX2hVVVBBSExJTENC QEf3xL/FvLy+0NjGv767s7O/wb3RTz1VytJ00b/aOyooJR4aHiotLk29v/DcubDAbMqqo56b ko+fvlNeLSIfS8C9xri42jYsMCgkIigtOz81Mz1BNjA4VltN8tVJSsKutMfosaejmJOQlaCw XikbHSQzONe1qLpMMC4pICYuTlps38BRNzIwNjcyMz4/PzQ86NVAN7qsyUSrmJebjoqYsjxL HxgXPt++vKenuzckLiUhJEdbTUhPUTUuKCwsOTAvMTxQTkRKvbrZ06qitlymlpOMi5ifwzQX EhAjKjm5nZ2qvT5AHhcbMjQ43a6sYTItLx8fJywuLj9owLGuYETPQt2vqa6Zj4iCkqWtWxYO Dhk1L7mdk6e0OC0ZFRYfLjHOrKd2RTMuJB0fKS8tSs6usdNG89rFPTXGqpiOgICNmZ+0EgcH Fx0f7pSMmaTeQRQMCxYdJ9mem67SPjEcFRYfKio/rJucqr++1DEzRWdenYmBgIyPmMINBgYM ERfelYuVl6bMGAwKERgcZZqRnKi5Th4SEBYaGyu6oJ2ana9NJCUsKCe6jYOAgImLmiQJBgUJ Cx6ujo6OjpfjFQwJCwsVQZ6Yl5edwiIVEA8OEyVyrJqSkpzPLSwsGhcnm4eBgIKCi6IbDQcF BAoby5uVjIySsDAYDggHDBzvt5+WlJ66OCcaDw8XIza7oZOTnrm8zjEbGrKNh4mKgYOPOhwU DQIBCRosTaKPipCdtGQdDAkMFRog35yWm6CkrTgbFRgYGSa8oKaom5WjRiY8m46WpI6GiZ/T +zwVBwYOFxcezZeSmaGgqDUVEBYcGRgstaq0sKWpWyYmLyoiKNWrsL2sn64zJjegjpKdjoSG lrPgTx0KBAoTFRgprpuapqqmtzAfICkqHR44v94/TMzJQS48zctly62msvxszVItLDnNnZGV mI+Mj5+8RzUgEg4TGx4hLtGsrLu/t71ELy82MCkpMj86MjVMakg+eMK9xb61usXewb9iODRD vKGbnJqSjpGcrcRLJBYRFBoeIi5Zxb/K0/RFNDhwyftO5dBYNSooKSgnLkrjy7Gnp6277vdY PTcwN8yfl5WZlJCTnrlkSjQfGRkeIyMjLURoaGXBs7bMfk4yJh8eHh4gJzNauqypp6aots5k TlN5UFdsw6CUkpmalpactko+OSIXExcbHB0mQcS7uq6mp7PcQjEnHx0fIigtO0/hxby2tLfB xcrd2MjUXe+qlI2SmZOOlK8zKCgbDwwQGyEoQ62dnqmsrMMuHx4gHRseLEFBQ+2/wvtNUVxs am/ew7Gyv8+0l4mKk5GMjJ8vHBoUCwcLGS9fvKCVlaLGWjgfExAXHyQrWaukq8HeSSwfHyg5 TNa+rqKeq9ytkYqMlZCLjaknGxwVCwkPJj9Vx6GZn9stKiQWDhIgOkvLo5mdsNlNLR0YHSs9 Z7alo6OouEqymY2Ol5KOj6kwHx8ZDw4XNdK8uamktjAfHx0UERgrV8+5pqGs4jw4KyEgLXW8 vbuwqrD2M22dkIiOj42Ony4cFRkREhtrqKShoqbZIxUUFhISGzLJsq6opL0xJScmIyg9taOj o6m0uGUgHM6Yi4iNiomRRBcPEA8MFD2bmZiZm68nEg4QDw4WLr6uq6KerTMiIiIfJUS0pp6d oLBXOiYaKaqOgoiLiYynGAwLEA0QJZ2PkpacpTQUDA4QDxQstaqyr6izLx0cICMlPq2dnJ6j qzojISQ1r5OEgYmLkZ8eDQgOExgtpo+QlKOyNhcNDRMWHC+4pqy5vtcnGRgfKjLsqp2ep6y+ Lx0iJjKqj4KCiYyQohwNChEXHDudjo+XqMEqEwwOFhgeOa+nud1YPyEYGB8sOs+rn56mruEs HyAky5mIgIWIjZNJEQsMFBAfx5GPk5yq+BoNCxAXHCjDoKSvv8Y8HRcaIigyZ62gorHkOjEo IB61j4OAiYiNmB8ODA8SDyiqj5OWnaY/Fg8PFhcbN6ugr7a71ikYGB8mJDW+p6Stt2M2KSQd JK+QhYCIhouWKBENDhAOLa2QlpSdpUMXDw8WExkutaeyr6+3LBwcHyEfLHuuqqqvvj0mJB4d a5WGgIiFiY5TFxAQFgweUpWamZ6htx0TDxYSFR9Lq7OysKphJB4iJx8kNrmpq7e6ajUsJyFI mYmDjIqLjasdGRIdDxskqZ2kpbmrPikZGhsaHiI9VdbM0NFGOTEwNDVDdcG6vcxCOkVRPDev lo2OlpOUlq80IiQ2LS4pScK59zMyPU9CLiw1RDsqJSQqKistOfXFu7i4u8DiQS8oKCw5Trad k5Kam52dqshNSb63uMnOyM1PLyYmKzM0NzxMXEIvJSAgISIoNVTPvrvD1008NC4uMTpqqpqV lpiVlpiksMC3rrLHYWVzRC4iHR4gJSouNkv+SjUrKCgrKi05S9jAvL/NVkA3Li4yQeWun5qa m5iXmaCps7Gsrr9uT1NJOCghJCcpLS0vN0A4LSclJiksMj5Z1726wM5dQzgzMTk/WLeim52e m5mZnqasq6mtv1FAPjkvKSYnKSwxNTpAVEo4KyQkJigsMTtIbtPqYE5LSkU/RlnbtaCanJ6c mpmep62sqq6/Tjw6Ny0nIyQoLDQ3Oj9EQjsxKysuMjU8SV3YzmxLQEE6NzY5SF/TsaOfoqGd mpqgpqqnqK/HVUNJPjAsLC0uMjg0MC8vNDErKS46QUpJUVxeTDo0ODw8OTdHberCqZ2cpKGd mpqjqKyorLlWOzw/PDUyMC8vMTk4Mi4vLy4vLC45Tl9r5+V/SDw5PT83MDA4VEQ8vp6VmZ6a l5aftOXrz3M5LjJLw8faad/UfT8sJigqKCIkLDlFPTs/PjQrKC03R0hGPkrPfkqykouOmZOP j6E/KzA1HhofTq+w0NC5vDYfHSMfGh0oSW7ewLKz0TsvKyUhIz3Gwu1zwrFYLTiajo2XlYqQ nyg5NCUTFDPOv0K0pKs1ISs2JxkcPdNEOcCqvTQwPy4eHS5i9t+8tmk0VT4nIKmNiZKUho6d HjUsHw0T1L2vR5ubqiciNSUaESVZTj3Npq9eLDo0IRsfODxCy6iryC04OikesJCLiZaDjpcj Lx8XDw+7PKdplJyrKyQ7GxsSKTlGQb2mwd01RCwdHCM5L1C4prTFPXUyICGskIyLkYOQnCY6 HxcNFNc3uMyUn7MqNS8ZGRgtNUF8rqe4xzxHKh8dIy8xV8SvvGtHPisgMJ6NjI6MhJKmJT4Z EgsfOkXLqJSnyypKIhsYHSwuQsaqsLbDekIjISMnKkTCsL6+1e4yHh7CmYyTkYWNmC12Jh0K GS5ETL+Vm6cwyyweFBgeJCc/r7a1wL3eMiQlJiEsba+xusO62ioh7JqUj5mIjZbI1DocDw4p IDw4nZ+h89PvKx8aICApK9i4t7i8wEEuJyspKjzPu8Ppu783LMGdl5ebjJCXv7w9KRUWJSc0 O6Wko8/AUjAfHR8iJCU667/Qz8XUQi8wNjM0/bq8zbevyDfQo52fpJSUmK+wyUYfGyElJiFB zLHMztXZOiopLTIwOE3ZWUtV29tMRFXa5ubVvsXcXks5NTxMyLaqoZ2cnqCmrsZRPDkyMThI T04/PT06ODc7PUNLYFFBNS8vMS4uN0to5c3Gw9ZvSU1P672soZyZmZibn6q8WzYuKCkuPUpO Qjs3Ly0tMDMxMjg7Ojc5PDo7Nz1GdM2+t7S4xdlpeeTEsqScmZiam6CpvWw5LiglJSowNjo8 OjEtLC0sLC42PklKTl3h3mddcdvJwb65u8ngYEVJaMGxpZ6bmpudpKzHVTgtKCcpLTI2OTs8 NS4tLCwtMz5OU1RLS0Y+OjxIWd7Euba5vL3J6t6+s6qfnJudnqCms9JTOi0nJicsLjE2Ojcw LzAyMDE0QU1MREZCPDY0O0de2by2srW0uMPk2ryuqJ+bm5udn6eyz0w5KSQlJyktMTc/PDc0 NTIvLS4zNDMvLy8vMjZG3MKzrKqqrKussLe9u7GsqKGdnp6jrLpsOjYvKSYmKSosKy80MC0v MjM0OEZLQzk6Pz5BSWzPvrqyra2vsLW6vcO9t7e3rqqqqqmstcPY3/hKOzw2Ly4uMDEvLi8y Ly0uMTMxLzE0NztFXcq5sq6sqqmpqq62trKzt7m5uby+v8PSYl54VkE/PTs2Ly4yNjY5Pj8/ RU5XT0lNXVtLVmve0tPEvrzBwL++xsvLyMTKxsbTybyzPDxDR7472ltYxlzHTU9iQU0+Pj9A TUxYVlnf183Kz8nP4Nvp3m50zc9mYH7RzevNztViYWpUU1RNXFRNVG5nTElWYe5eW9lfbO9m zdS4naEu3zYwwSK8bzKxbbjB0bRP3XFD5jdCTz1jTEPbQV/iTnb7WczaR8xC5FxGyD282Eer U/CpcaO5Lqg05rUkrDUspSKvUCukJ93gObk1yj1GOWruQ70wtV5Wvl3IQLna7E++1jOsP7p1 86hqs74oOa80rTfyykfTzVc/tTCvMk23KbAsYrEl3kFxYztGv9M3sS7HvTzDRrTeTM+vyMW0 QKU5v8TJrjO1NsxFQtdEdinHzCa6SiycG7jZGJUTo94fmxmeWTavLbbRL6lP37IvmynJqS2a MT+cGps+OJkur04aWj8fqSO9wCKfN7FOPrgeriPNvi25NsPT20mzSHG8K6baP57Jp90ktFyw Qy6nTjuzO8a6KLY2wiXR0TKgHacwRsElriHETMRLRKgmnCHKtj+5LLNLujy8P6RGUqEmny/s xTKjIqXXPKwrqy7ZQDizKcIvz8omtDNYxianP+StKqAwzb8mqyvuuy62OG7CdNHFWq1meKw0 oju2wlasJr1DQ9A30Err9ltHU0NBNUJLVVnu8d+/TdfSb9o8wVpqvz653ry/VrBTxcdnvEO8 T8zGPshUxzhSVEHOLW5KWUg1ulFX6lDKxWLe42TtP9FQSck9w1hO0F+zSsbP0rLuucLBuF+9 w0rVNUphONw8TdhDVjs+PkhDTFJJYEbOU1rV1LtlyNXRwNm5wLq/2cPq0tpr0P7Uz8zJ0sHK XlxJPDQuLCwxMDM1PktD+ujY437U0MrOtra0rK2prauss7TAyczHz+dbUU46MSorKSkrKSoo Ki0tMzA4OEFEStzPqqKjnZyalZmeoqmuzEs4Ly8xMDxr2sreT0MuJhsZHB0hISYyPk/hy9jR 2eTZ1ciun56ZlZaXnKGsuMVsRzYxMTc2P1BPalVJOC8nHiEjIyQlKCsuLzU8P0hST118xqee nJqal5ianaKkqbfJ/kVCNjEzNzozNTU2MywmJSkoJiMjIyYnKi43RlDg3eDDtqCbnJ6blpeY n6CkqrXoQzs2NC0uMTw/Ojc0MywnKCgnJyUlKCosLjU+TnF+fenStqSipJ6cmJebnp+mqbfL bkA9PDM3Nz5CPjgyLysrKyknJCgnKSgpKy42PkNCTW3Mvq2lpJ6cmJaWmZufpK3A/D0zMCko KzM9QD89Ozc1LywqKSkoJiYrLjE1OT8+QURQab+sqaKfm5aWlpqeo6ewvV1FPDQvLi83Nzk3 ODk1Ly0rLSooJSYqLC8tMDs/S0lMXd20qaehn5mUlJacoaeqtNRANzQwLy8zQkFANTAuKign JykqLSstMDM1NztDT11NTlfnuqWioZ6clpiZoaesr7j0PjQ2ODMzOf/S6U5EPy8pHxweIScq KiwuNTY5PkRISUVBRmmmlI+Oko6PkaV2PSw5HiAeN9fFv8yztMNAKyYgHBkaHiYxN0VORDgu Ljc9MjI70L6xpY+IhoyPjpejIBwSHBQWHD6mo6KtqK9rJhsZGBgaITfZu7GvtFQsIyEfIyo2 0720r6ufjoiKlpWWnFIbFRogGR8trJ+gra+s0y0eGxwbHCA63cvFwcdDJBwdHx8pQcyyr6+s raKPiIuVlJSaUBoWHSAWHC+ooaKuqanLLR8cHBkbHzI/TdfC2DUhHB0eICtJw6+orKmmoJGI iJKWlZm4HhYbJBsdKralpbW+vlAoHhobGxwfN9zUzs/hOyYcHiEnLmS6sKinpqutmouIj5mV mKgkGBkhGhgha6emrrOquTcgISEfHSAydnXlv8dJKR4cHx4fL+jEyK2ppK+vlouKlJeTlqgk Hh0qGhojzKWqs7arvTokISIbGRwpNjlGz75bLyIiJiIiL+zGua+moaqllYuLkpiUmKcoHhsj GBkdQbivsbGsvlIvKSUfHR0mLzxezLvAbS8lIiAhJzVm3LWrq66vopOOj5mVlpi2NCMnJRwc I0fSvse1rbLKQy4lHhoZHSUvP/fHydw+MzEvND5Xb9O+tri1uq+dmZedm5mbosvjPUMuJyYn MDRCQ01sZ29COTAyNTQ1OklOQDg3OTczNDtFWmFm7ODr+Ozky7yzrKiinpuanJ+hpau45U1A NS4sLCwrKikrMTU1NjQwLSsoJygsMDg7P1TOwL28urW1vcS5rqmmop2ampyeoaewv1g8Lyso JiYnKSwyNTU6OjYyLzAvLiwtMjo+QklVcOXazcC/v77CwLasqqiinpubnqKnq7LFVjwzMC4s LC4vMC8uLzExLy8uLS0tLzU5Oz5DS2jUzcTAv72/xtHgy7mvqaGdmpucoKSqscNpPjMuLCwt LjA0NDIxMC8tLSwtLi8xNTpCRUhMWuzRy8fL0M3qUVnJsKiinpuZmp2gpKu210s6NC4uMDI1 NzYzLy0qKissLC4wMjQ3Oz49Qk1Y+tza2dTQzd3nyLSqpaGdm5qcnqSprbbhPzY0MzQyMjAw Ly4sLjI1NTU3ODYyLS0uLjE0N0Ba0srU1ca9ws/Dsqmln5yZl5qeo6asuOk/NDEtKyorLC4u Li8wNDo5NjEuLCwuLzE1OD9MX+PLxsnHxcjV6Mq0qqWfmpiYmp2jqK/CSDEqKikqLDA1Ozs6 OTg1MzEtLCooKCsuMzQ5P01q0sC6urzBwcC/uKykop+dmpian6mzxOFGMispKSotMjIyMTU1 My8tLjAwLy4vMTU5QlFt2dDKwb29v8DD0OHFrqakp6KdnJ2hrLjG02g/Ly0tLi4vLy8wNDU3 NDExMjIyMTEyNjxFXtHAvL28usDN5XRhYuzCr6mlpqKfnZ6mrrrOZ0Y1Ly4uLi8zMjAxMjQ2 ODc0MjQ2OTw/R17WxMPGy8vFw9RXSk9LSE3PsaimpqGfnqGptL/K4VA8NjM0MzU3NTQvLzAz ODUyNDpKTk5PVefNyc7f7dbL11o+Oj4+Qk7Rsqqqqqein6Klrba8yuhKOzU1OTw/Ozc1Njg5 NC8xOEFBPz9DTV139mRVWWnoZUM8Oj9FVM6zqKSnqaWgnqKnsr7NY0s9NDA0OT1GRUY/Ozc1 NTY7PT0/TPvka1pTTEpBOjc5OzYyLCwzO9emmJCUmZufn7RuLCkvOuxhzr+wrLXfMykkJykr LC82Q93X7EY/OzQsJyotOjxXyb/aRkxNTj+ylYqJlJqgnK8lFhIoN+s+WqmgokUjHiUpIyUz yK21dFZd4TorJCk5P0c8VF/O/kc4JyozXD7blomDjpykqq0aFhE2vr+2v5qfqygcHiEhHCrC qrRWNlVDLyImM0dbPE7yz046UllGKy9APkw8npCHip2btJ0sGxcjq12qc52gsi4bIB8eGinL sd5QSNM2KCY1VUQ/P87qSDlE3upxODJLysUyVZiJhpmno6G4ExccsPU7WKqXsT0gMzIiGSFt qrpkTc7XLCYmRks6NU3LQDAuQ+k7LCxK0N8/V5WNiJGdlqOoGh8iWtotuLSbxjgmKyocGiA6 w73Tynz9NC4sMTY4R1p8UD1BS2lMNTpLvdVHQLqSjIuenZui0BUkI8soO8ano0lAMkglGxwu TuXUtrvJSTdAMzQtPEU/NDdqT0dO9FcuOWZaNC2ljYmWpZaYnxwdJ9o1Is2ml7jqVrw6HBgj Ny4sTb/ZOjlnQi4oMTs+Lzfk+0xLwL86Lj/IOiZAlomLnJiQmHwVJixgGzGxmp3QtsDDHhcZ JCUfMr22bkHdzTslJy45Ly1FydhLyL7LNipC6zkiyo+HjZ6TkZgrGic7OBxOrJiu1Mq4TBkV GysnJC3DtNNA/MpCKSY0Oi8uRcnxUfzD3iwzflcrKaOMiZOcjpGeICEuOCMaZKycubqvr0Ib Gx8mHx8t285BOHrVPiknNjMsKkbF1HLWrrkzM9zQOjCvj4mPm5KQlzgeJDUtGSjkordle7u6 KRsaIyYgHy7Uw+T8w8VqMi0vMy0sOmTGv7vC1Mu5dTEuxZmQk52ZkZSmOi4xOykfIDLewtHU vrzKOCciHx4dICc4W9LIxL3XUjs5P05r4cjCu73F0ndTQ0fOr6OipqKhnp+otMXG4UEuKy9C Z3tq/nlHNSwoKCgpLTI5PUlQSEZJR0A8PkxVVld56uprYmB2zbapo6Gem5eYm6GorblmMSkp LTA4QUU+NC8rJyQnLDEvLzM9Pjw8P0xTSU1339Tazs3VdGV1UHC9q6ajnZqWmJyjqa24eDQt LTE1Ojw9PDMvLCYkJScpKy81PD5BRUtUUk1KTVheZOzTzNTNw8bJuqukpaSfm5mcn6ettchO ODE0Oj09OTUvLi0oJiUoKiorLTU5ODY3Oj5JUF1r5s7Fvbu9vbu8xLqtp6anoZ2Zm56kqa69 XzkwLS4vLy4tLSsrKSkoKSkrLTQ5Nzg+SVJqY19qbOf36NXKxs3HxMS/sKmkpKSfnJqcn6mv tcJeNy8vMjMxLConJSYlJCIjJSowNzo7SPjOx8XGx8jM1tnbzcjL0tPLxca9saysqZ+cm52g p621yU84Ly0tLS0tLCsrKysqKSgpLC4uMTpJbc7DwcnQ2Nvd5t/e0tHV0c/Z0Lmrp6mknpua nKCqrrO9ZzcsKSoqKCUlJykqKiknKSsvMDEzO1vHvL2+v7/Dys/Z2tzq+G7c1tjMva6oqKSh nZyfoqqstL9eNy0qKSgqKicmJissKykqLC81O0RX0r+/xMzV2t7X1+D26NHX1dbX4Ni3q6es qqGdnaGlrK6xvl80LCoqKignJikrLSwrKy4vMThCUGrZx729v8rT3WhgT1Fm/G5q5tjm5ruq o6Woo52bnaGrsbfHUTMqJyktLy4rKSoqKSclJCYrMz1IUNS6s7S7vr++v8voZPrbz+heUF5x 1rapqKynn5ydn6avucR6NiklJScqLSwrKyssLCsrLDE+UHnu3MS5t7zH0c/Q7Uo8ODc6ODs/ P06nkoyPmpiYl7YvGx4wLSsjTqyhrDgrKCkbEhQeNUpEa66osEU5ODosJC1Avruwq6m37X5c SSY5lYaHlZSPkb8TEhkrGBouo5mtXjpPIRAMFCozJ0CooL47Xr9nJydLyFxGvKWouMnOXDYu MTg3o4yFipmSnqcUExUmKh7brJSrwjk+IxMPFidLOPCuq24qLi8vIShFvsPNuqurttbzSDUx VFA0XJCDh5ialJ0kDRYoPx04qZKdzT1ULxUMEic3Kiq7rvIlKz45JynbtMtMvaWvZvm16y83 2t4qPpOEhpqckpkzDBYhSRsuq5KawHXLSxgOEyg7KiTKr9wgJzM3IiJNut4+16is2Ga2u1A+ Uf40c5CEhpaXkp4sDBYcLhkvrJSbt9nOOxgOFCUuJibJsNMpMExDJyM/xmQ80K62z8iy0TUv zsctYI+ChpeWkZomDRUfKxYos5WdvGnFQhsQFik2Jiu/qdwqLlE5Hhss7z4uR7Kz0MKwuWRA 4s5L45KEg4+TkJk7DxMaJRcf6Zqcrt/QRB0PER0rKyZJsbJXO+ZPMR4kLTEuQbqzsKyuvdrZ VDwzRZOGhZCPjZZLFBQaHRMbU52dp7KtwSgTEhsiHRwytK5gZsjQKh0eJCclM7+noqSlqKrA 7EQzLrKLh46UjYykJhMaGxUPG8Kioq6sqMMmGR0iHRcbNuNNNHHITiggJiwoJ0Wto6GioaOl rss+N0KcipSdmYuUwyUfMB4WESXfuNbfr6m9MyktJBwYHiYsLTt17j4yMTUuKzTft62sq6mh pKu4ydJfSrOQjZKZkpGe7yAeHRcPEyE6SknTranCOjErIBkXHCYsL0y4r7jMXE9OSVTgwq+p pKGgn6Osucfa82nZwrStra+vr79NNzMsJB8lMEZb2sXF1FM9MyslJCYtNEJHVWP5Y1dpXm/L urSwr6mlpqyyr7C8xb+3ucvNwsh9TEhJPTEtKi41OT9IU1tXSEI8OTpDTnbez9XY2fReb1hY 7s/Gyrq8vcTAtbnI3c3n2ejbzdDJ3s/UdExESUZJTVze41hZUkM7MzA2M0Zf2t7O2d/X2c3d 6eLdxMzHxLy4t8LU32ZidPxT28e+v8XJeUxBNDo9QUhs+dfod/hjRDs8PD4+Rm3Pz9Xazcvr 6elr6OXPycW+ubq+y8rael5Yd2HV19HNzeJLPTw/P0ZKXlvd2d7ZUF5UUU9NTkto/vBTTVNY /lFq6NPZ48jMw8PIytHJ13fg1MzDy7+9yM7tXVpRTlRPTExFQDs6QT9BQlJLUHFx+Pjm08zM x8jEzcTHzd5zzd3b70lddFFWXXTk3M7e4tTLyczS1PFz/uHpWUhIW09GSF5YSk1SWE9VVFBN SWJp6dji2u/n3NfY0svBvb6+xsLCz9JvUEpIS0xfYu3e09V4ZEpJQ0VCPkRQW2P7cfhvcuXe 1svN0ePfvsjjZW1ZP0ZW3fxt1cXF19Tq52Jl3+jmztDGycO92HdRQj85Nz5GQVBNSHtpUkZS 6GdPZezEwb+/ysTR/eVvZM9o38O/vMbGwctoUnRdUWtWT1J17nZNTlVIPzxAREtGUF1PYE5f T0zd09POv7m7v8DQfGDnzt3b0+HL28vL3s/iZWjOwsxQR+Xfbj5G6ks6NTNBRDlLYdv02eZf fepTed3jfs/Avce+xL7cyrzC6Epjw3FT+OfW2Wnews1tc0FJPzdASVBKO0NRVHno4tzZx89x XlLS+EdW+93oztHSZOvMwsfew8HHylZOXeZ6bWHxbfx25vFWS1bfW1xq3flNVPP1YfjR9F7s 2NfvWF7YydHtZfTc51hn2czNxs7FvcbP0cTG4/5dbnhLQUBLSUpNTU9WUElMS0BGS0lS5tTM yczp1crEv76+vb3Fx8nCvL/MzcHH6G7j505FUntzWlxefV5ITkY+Oz1APjw6PUlcVlFlfPph Z3NtalZQSUQ6PT8/P0Z63se+tK2rq6yqqrG9xLq5vcvLvcDhREE+OS8pJyYmJSUmJyoxNTU3 P01pX1NZ7szDuLa0r66urq2utb7Yyr+9z9nU9kMvKiooIyIkKDA5P1LbxsXOalNXTM2sm5SU lpeWn8otIB4ZFhkq27Sspp+hrkMqHxoUFRkfKDRpubCzvcLOTjw9bcxoQMmflY+RlJOWn2ws Hx4ZFhoqx6yjoJ2eqM86KB8ZGBwoNE/Arq673FhFOiwuP+m+rK/Jxq2bmpegnZyivysnHSAY GyFAy72spqiu1UY1LCAcIC1Q58GvqK/MVz4uKiozRO/KsqairLW/01y/nZeiop2Xp0soJSsZ FRYrRdvJq5+erdRSPScdHig4O0y9r7d5RDkwKSIpNkJcvqqnqrC83DwsW5yVop6Uj5rNNS8v FhEVLD9L5qqbnbPq7UMiGBojLS9Ksqm23lhJLiIiLTM0Psiuq6yrqrpaPSwqt5ScpZePj6xZ LUUeDw8bLSw7yZ6ap8vN2SwYFx4qKTK9oqOwuLfcLyAiKi0rPbqqp6ypprU7LCgeLaWXo5qQ jJa4PC4uEw8SJjVSuaCWmqzA1jUcFRchLSpOp5ygqq63Qx8YHSMiKVqrp6WhoqasbCUmJSMv nZWcmI+Ml7k3LSIPDREfLUO7oJidrbzGPSEbHCMpJzqzoaissbDSMScoKigtQsTAwLOprrm/ X083KCi8mqOpmY+Qpr9SaSEREhomISxLqaGqr6yvbywmJSonIzPBrbSuqqzBPDAvLScqMz5E Xr64srGy13M+LzqqnKqil4+VpLC/xiMZFx4fHyMvxrzS1Le27DsxLi0rLjzuy762r7G+W0M/ PDk6P0zcwby8u7q5wWlRSEP+v6+3rqOhn6uvy9BELispLSswMj5EPTg2OTg2OT9RdM3Gw8PF ydHb0Mq/vLu5u77CzPlMQjw6ODg7QEpYcN7VzszPzsm+uLKxr7Gztr/PaE5EOzQwLzE0Njk5 OTo/Slli38y/u77Ev73Dys3Kx8/e2tj8WU1PTklCPkFAPEBU28zKycK+v8bEwsXMy87Jx9jo 291dTExFPTw9QUBBTXja0NDe0c7fXE9camphat/la2jvaEpDRElMTVnt0c3Jy9DNz+RlZPjY xLu7vLy8vcLYa2tcTU5b8d7mefZoSj04NTIyNTtLe9bS1dvna1dRUVr70MrHvrq5ur/K7VdM QD09Pktm49LKwcDIztfu3NDKwry5ubq7wdXtX09EOjQxMTQ2NDM2PT49Pz9FS1Nh28W8trS0 s7K0t7e3usDHyM7d725cTkZFP0FDRUtQT09adOjuZ1poeF5aX1tRSUdLSUdKUVNQU1Vg3NPV zcS9u7u8urm8wMbN2NLU5OxtWFdfZFlOSUZAQD9AR0xMSkhOVFx3b2VXWmXy6Ovo39nT2dnP yc/Yzc7KxsnLztPZ29fh+Oj9befg7efo7nZXS0pNVllMR0ZKSUtNQ0FGSklGSlzYz83LxL+/ wMG/wcG/wcbHy93r/2BZZXt1/Hht20sz3UBKaTPHO1NoPdpG42x20O3X7drcd+zh715aV/ng aXX+7+Zye9zZ0srBwcXDwcHK22tfW1ROTVJRVVRRUkxMVFFORUlPTVdMTlRY7urk3dTNx8rN zMvBwMvL1NbQ1eZdVFROVEtHTUdSWF1pYvvs1uq+rEk81ku3TP68ZNjlztxPT0xES0JOSVtp TfHxaFd8/dLK5dLZ3NXk39DRz8fP7V9VZ318vGpfySnlLTXXPL/tzb66yry/z8/a7dlSaEhB PUE9V0piz0W+YMrL8tRnUVT0W8VN1cxNz+FzZ9lWwz2+VWC9QcDXPa842borrDXKvS2zMt/Q QdDINrrfPKsntkNHtjG7Pr/cfMRL0Mk7vmU2tTbJvC21P2TFPNbNScBRwG9ari2lHqtBKqUd oihLpB6eKrixKqdIyW/HyOXKMLE8zslEzFLbbkTTT0FGN7UryzrKvyqlJ7TBIZsfq8wpnyip VU28QrtQRK1Ay8Y2rzXCzzy/Oj63PvjrOqwvrDk+piWlKK0+TbYqpy3AT05G1ki+TvO/K64u uFRqxiqtIbZBU71Drei60K1FsnG/bz21KbxHQrU18bsuvjk3rimzM8faXLsvpi3N0D62QEtq W03DPLt0KqImrUgzpCGoLqxfWrFGoi23zcnOPNDOLbwku7cgpx6vyiitKqlJyjm8sh+cHKJw KJ8fpS2vLrq2IqMorOAqrTW+YiyoPc97OqUlqEdjt0i6K7w5zls4qDW9yDuvQP097jdZ4u1l wimxyjWhI6oxvVtb3/S3Mqksqkm7XV7OO7c1xE5PwjK/SEDaNr9sPslAvTrPPGysMrI4rPc9 xVGxL68519RAtzOnMa4/9LAvrTbkYS7BPj79T+TeRb1LyULkzFa9Lq44vk4vrDS7fUyvMKM5 ydhSuTnmXMRb5jPVPMNDVNFBuzGtOLBb7so0rCuvO7Ne+lNJ7z/EUN9JxEDU7U3LR7xFyTGv OsncRq0urym5Nb0+zktdyk22Ys/ou1K2P7pVT79ByUvLRtM/TVQ3yku/QGjXR75FyFXR197d W9NKzk7OWt/X2c1P3U70TlFOTnBW827X0cbMus681Oe/Ud9KPVpGTFc78UZ87FbWW+FV3ODy 41vVa9xm2tvW5NjY7dxZ6U/a3ePOYcZM1VjsZ3L6WOJZX0tlTVtXXlpPZGNa4+vf0szOw8jF w8jNd+plWUlJR0pLVmxXXlpdZWzs4PDu2dfM1M3OzMvW3e3l3l9MTk1QTUdJR0hUa11ffO7S y7/GwL6/xNndXXdlUE1HTkZNS1V6Z9ff+mNuefDm4u/o4d7t9vT86W1cdGFSUlFKVXHn0c7J zM3Rz87Q1fb5aPntbHXoc1tPSEVHWldXSlBte9nY09vf4+zyaXLu6ufZ39jR1dLq9mv7bVpo cu5na1ZhdXPscmVren5x+n58b25n6eTm6vji6ORm9+Pd4fzuaPbt/mJd8uzW4m1cZPRvX1ZN VFhp+G7k6uvo8+n9zNXX6W3e18v1aVdZYl9eU2rn29rZe+Df5e5UWlNjW2ZfWeHd1dbW3Nzt /2JYeXb4X1pcT1FdVlBUXF/83NnU0crIyMXR3PXy5WX+bGP1eV9iZW1+Znh8bul+63v76vz5 WFBKT2Fr62dha17u/Gzx/dzk7uj+8O35a2vq3tnn6trc0s7Ozt3p2dvqb1pbVU5JSEpIUFNK Ulx1+Ozb2NXQzcvMztLd7XtoWlpjdWxcYHnh5PljVl136mxv693nePN49+Hv+GFibOXc8PNo WltgYVxq4dXZ7mtv4tvRzuX2dHjyYXRral1PUlN08fhpYv7ez87a2vLh421iYG/+7Oni4t/j bldVTktOTlRbX2rrz8zJxsbIz93v7fz2fmpmW1xZXWdhXFhYXFhaW1ZfY29tcdnR1O/r187H zNXo5+Tk919eZ19eYl1qZHZ8YWZaWmRpb2Vnfuri3ujY0dDOva3NxTItOTZDPENsu63F705U TTo4S+zJvs29s7K21FhWZ1tMPz9NbuJOTFfMz+FUUvdn/G3v8drP3lhd72FXUFdf9dfPzNjU xcLM4l9oTEpKTl5tV17abfJo6O7UcldcYVxhaV/s3+z39uTw68/b2dzMzdrhWnjf591lXmde 62ll63tpW1BRWF1pefXx7O91XW3p/GZcYuPne2tmX3fu1NfSyc3b8e3l3c/Pfur33mdgTFln Y2RUXmBoWE9KTE5WYP3o7GTs835cb9rS5PDezMK9wc/d3dLWytDy/2JdW1BNTVRn3dzb2tna 61Y/NzY2Ly4yO0dc5czAu7u+v8rZ5ePUzb6toqCnr7W0v00uJCQqLzU7Tc22srjOUD02LScl KC83Q1XVxLy7wM/pYn3X09PNubCrqKOfoaWuuNVNOCwnJCYoLzhDWPLa1sfL5VBCPzs6ODk/ Tmf46NPFwMC/vb3Bx8vfaF1WTEZGSEdKccy+u7iwra2vtLvJ7lRCODQzNDc8Q0xX9OtyX1de Zl5UTUlLVFlSTlBVavrqfWdiZ+jf5+vn2dXb0cW8tbK2urq4t7i9zetpXE5BPj9CQT8+Pz9B QD0+P0ZMTlFk7ufg2tbT1+Ptc2x+emhbX/zf1tPU2trRxsTIx8G8urm7vb/Cx9HgYFBLR0I9 Ozs9QERITE5UVU9JQUJFSUtIR0lNWn7r62x62M3Gwby6ubq7vr69v8LJzMzOz83P2N9+a1dN SEVDQUNFQkNJRkNFQkJEQ0dKTE9OTk1QW3ja2dLPy8jCv7+8vr+/w8PDv76+xNXh6PZ+ZGBf WVpRTktGRkZCPz0+QUZOVV5laW1samVnbW1yb/Ld0czQ08/S1c7Oy8bGxc3X2d7lfmVaXu3g 5XhrbmlcT09PVlhYWFxpfO79b2VaVVBYWE1NUGHo6eDUz83Lzs/Q087P0s7Qzc3O0uj19F9V TERBPz9DR01dderZ2tzb1NLk/GtnbnD24uzu8ffy/m14cFxUTlJg+N7X0s7OzsnLycrU4vH5 +WpqemNSS0lJSUhKTE1d8+jbzs3R2OHq+ePb3/VpXV1hZWFRT1hp7+fx6dnf625j2MfGzuLf 39fW5+np+P53aV1jZWBWT05PU15nafDl29zrdGr9/mNWT1JcdW5ob/vd3d/Z3uPc1s/Mzdnl 6ePe497b5mBQWF1jYlpVU19p8HRebP348up++vrq5vRpaPX+cl9ZWVxubWhlb+5tbevay8TC yM7O19zg/mZSVWJbVVFaa2FcV1ZTT09aXWjn4N3W197l/e3q39nl49fU2+ng1s7V/l1ia2ta UFJXXmVlZVtfZGFnYnR069/m7f3k1+X+c2h2+/dwaePPytjq//X4b1tVW3b+a2Rh++Lf5uPm 19Pa4WthZvjkdFlLS09UWlxieH1wXV3g19DI4fvr7dN2Z+5ocXrv5ub5b/t41ba1STI7XcxR QOBz48/Gvbu13k5PWlJMWnxFMjtIU23g3FFZ2cfJ2dVzXOfeZWl+03ZZ7NLP19xl9se/xdla aM/V5k5FU2JXREVY7/BeX0pwyddhTN7HxMDPzuvXv0ssLUble+5cP1/AtcrLqcYjPMNPP1i8 1VrFrb3fpJ7MLCglIyQoLTy9r7C+t6W2WfpIPXxKQUDRvMrAy7u+e8JpO9/XR1lIVFpLXVs9 SHJaY21oT/Fb/8lNd3Zew9rjzs3Kw9zbyd7Jy9bO085wWEpa400/UetdS0FGUUtq/lp1ZFph Qz1SPkRJPU/excrfxbOusLS5t6unrLK7yszRTTMqLTUyMjc6YcPE2Uc1LSomIyQmMkZMS0fH r6+3vMfEu7mmm5aRkZSbpLZLJRoVExcdJzq+pZ2dp70+KB0XExMXHis8WcyzrrnSSkVSad7K vL2wmYiAgoyetMk0FggEBxAsr6GclY6OmfwcFBEPDg8ZL76qq71UPDQnHBgdOa+hm5qcnqOX hoKKn1A+Qi8WCgoQLaeanKijnag6FQ4PGik8es62qKnkIhgXGx0gKtWinJqdoKjLOyEfsIaA g5Owu18qDAIDDDyajI6YmJulKAwHCx5QrJ+kpau/KBINDRgmMD+7nJaYptg4LzItK/KLgICC nioYFQ8GBQszkoWDjqlDKRkMBggZrJCLjZnFJxcNCgsTKcCrp6GenqtJHxwrXcRLS5KAgICP Gw8UEg8JDSqUhISPTRoVFA8KDBi6k4yNjJVuEAMGCyRNtaeunquxOSMmLUe/vl9KPqyLgICF uw8VEBgOCw9HjISGnSkTERUTDxAlooyLj57YJxgVDxMeea22zUZJQ0Y9LSczvKOlsU8qL5KA gITWEBAUKh8WEjeQh4meIA4OGR0WFB+9lY+RoXYlHB0bHB8+vLnnNTQ+585ZP0e8pq9NIxzK hYCAhjYMFBIgEQwOv4qEiKMcDRAdGxQTHsSTi5ClPy0jKB8ZGynDxu85Ki5Avsxu17Cjpbku Gx+VgICBmw8ODyEdDwsYnYuFj0oRDx0hHRYZK5+LiY6oNx0aGhQRFy/DuLxtQErHvj4qLmm1 0i0faoqAgICSDw0NFxsODhubiYOKrBsPEhMRDhAdr46IipWzJhkXERATIk2xpKi21G85KSMm OWHK1VSxjYCAgZsfEg4WGhAOE+CWiomVuSchHRcRDhAbxJmOjI6ayigWDw0PFRor5KifnqO4 WENELR8bHUCUgICAi5urSzEdDQUEDh/BnJiYm5qfuDYcEQ4RHTHIqJ6iqrbPOSQeHB8sQ8q7 tLe+v8XWPy4uQ7CbkpKYnaClrsVKMS8zPEFDUU5EMygiIictMzpOz7mus+Y0KzFF/un8W/rE uLnbPTE0PU1RREBhva6qq7C6y87GvrWqop6eo6y64ko6LysrLjU5ODczLy0qJiAfIi1EdOh0 YNe4r7XPU01f2snGyLmrpKSorLK4wNHy372uq7HA3F1oYUc2Li80Oz87NTE2RVZKNy4uNTw8 NjA0Q9C5u8p3XnPZzcvQy7quq6mqrLG2uLzAvrq3t7e8v8nZWzwwKykqLC4wNkX531k8MS4v MjMzNj9cxrm7w93rcGVo7s2/ta+urq6xuL3BwMjFv7myr66wuMPzQzMsKisuNjw/REhHOzEs KiosLzU9R1Xfx77AyM96c9zEubSvrKmoqq+6v8TNa1Z31r+4tLW6vs1ONS0sLTE4PkhUYlhF OS8tLS4uMDc/S2ve7evb3WVMTfzEt66rqqimpaissrq/w8HCw762srjHWjkrIx8eHyMqM0T6 z9LdZUU6ODxEUVlZZtjAvcbuT01f+vZv8c7Evbauqqmoqa2wsrSysbK3vcbXTDMoIh8hJisu Mzo/RkpEPTg7RU1VTDw5Pkvuz8fJyb+3srO5vr+4rqmnpaSmqK21wc3T31xIPzkwKygmJiov MzMyNz0/SEc9Oj1MXF5ORUNHZdfb6fXVx726u7izrailop+enqCmrbfK8VtJPjYvKicnJiQi IycsLzI2NztGSkZAPkRJVmNNS2jMurKxtrq1rqmoqKiloJ6foaWprrrdRDYyMC0oJSQlKCop JycqLzQ3Nzc5OTo6Ozw9QEz7zsTCvbmzraehnp2cmpmXl5yntr/EUiodHSQlHx4hLz45LSw1 PjouKisxNjMvLTA7RktU6MrDvru4tamclZecmpOSmae2tcHhOCgfICksKScrOT46LSsuNTMn Hx8nLS4tLzlM7eXf18i8vb3CvKqcmJybmJOTmaKzt8DZNCQfIysrLCkrOEJINS8xOTkuKScs LysmJSs2Q0pLXc69tbe8uqqenJ2em5eVmqCsrK61RyojJi0uLSorNk1nOi4tMDAqJCIkJysr LDI6QDw6PVrMvrm4rp+ZmJuamJOXm6evr8HHNiwmLTMxLSgrLzYuKCgsSrdDISgeLyMdJSM2 OExRbd3Qw9i2nY+MjpCSj5OfZycnJy0fHh88v7K9cOnPvz0iGxsfIB4fKkTu5T80Mzo5List PnfSzLSejoeIjpOUkpzNHhgaHx8aHCfFq6i8zcS/biccGyEqJyQnOu7aPy4uMjMqJik1S/bD s6aZjIeKjpKRk59THhsaHxwbHTDIsrfb9l9YLh4bHCEkJCc31rzNQjg4OzYvLC47aMi7sqSU i4mNkpWTmKk8IiAgIBkYHC5ZyehtyLq/QyoiJCUhHx8mLzY2NTtKVUxCPU3jxb+7s6majouN kpWUl6DVLSQkIx0bHCY3WlxY/c7YRi0jISEhHx8lLjg9Ojo/SUpHS13Sy8fDv7Kej4yOkZCN jpmzRi8uJhwUFR0oNzk/Xr+/7zImIB8cGBgcIysvOU/RvbrBysO+xdXLvramlI2OkJCNjZWq aDYvKh0VExsmMzAxPOfK7zYoJCQfGxocIiosLjdVzb7Axb6zr7e/xruunY+OkZKPjpGcvj8x LiIaFRgfLDMxOFq8v08sJCUlHxsbHSQsLSwwP/3JzMu+sq+1tbe3r5+Sj5KUkI6Qma7YST0p HRYYHyksKi092t1BLCgmIx4aGh0lKCgqMU3Kur3Gvq+tsLa0r66tnpSSk5OQkZOcrctPNikd FxkcISQoLTtDPjcvKSclHx0cHSInKzJK1ruzs7Gura6vr7Czt7aimJeYmJORkpyrvuhCLx8Z GR0iJSgrM0FNPC0mIyEeHBscISguNUvPubWwr62rra6vr7a5uaucl5aXlJOSl6Gx0UUvJBsa Gh0fIiYsOUE8LSYhIB4bGhwiLTY6S926raurqqakpaqusLG7wK+fmZiZmJaVm6a6cjsrIBkX GR0iJictPUs9LSYjIyIfHyQrMzs/Wcy0q6iqrKmoq7C+w77C1cGnnZqamJaUlp6szUcwJhwZ GBseIiQoLC8yLykmJScoKCkuNz1J/tO7sK2srKyrqq20u7y4u8K6pZ2bm5uamZ2ovFs+LyUb GBgaHiEkKDA9RDovLCstKysqLTlO6tXEuK2rra6vra6yuLm3trWwtrSooaGkpaOgo63KRTIq JB0aGx4jKi0uNTo8OTAsLTIzNjY8TfjQw767s7GutLi6sK+zsrOytLa7ureuq6qsra+vs73p QzUrJiEgISUrLjE1ODo7OTQxNDY7SlZRT2nKwr2+v7u4tbGwr66urbK5v8vMzs7Lxbu2srG3 ur/cSTovKykoKCktMDY6OkRNTktY0d1PNzk6TlVLXPjNx72ysLKxt7vGxb69w8jMzMbEvbmw r7G6v896UUE5MS0sKy41OEtZSkFGS0I5P0ZBSkZVVl1SUU1p+9DLys3Vvrawubu3tLS6wMPA u7q1ube+yM/naldQR0hMP0A5ODcvLi8wMjEyNDc/RVR5YF5FSnbW613tw73Kybuxr66vsbOy r6+2wb25vMDDxsXF2WtMQTw3MC4tKy0wNTAvMj1AOTg/VlRpTl1fxsDCzt7CxsfRzL+6tLe6 t7OutL64sbS4wsLI2t7mXUM/Rj88NTQ0MjEyMC8xMDZARk5NbHza1dlnUm51bF1hz8y8trq3 squts7OvrrO8vMLHx9BqS0NTSEU8PDw7Ozg3Njo5NDEyP0dOS1Zc6/RPTVvU3VhV1MDO2tu9 urq1vbq2sbCws7u7vL7J8UdFUUlIR1BWS0Y+PTg4NDU3Ojw/UE9f+tp47/dudk5OWk1MSVH/ xsfFy8O7ubm4uLi4vMHJzMjKxcXEura4w9RXTEU+OC8tLC8xMzY3OD1ISD8+TmNaR0FPfdvf 3M7CuLi4ur23tre+xc3Cwb29vq+qp6uwvcrbSDMoJSUmJyctMz9NS01ES0dSST85PE5LU0VJ WNnEyMm9sq2utri3u7y/uq2joJ+gpKm31jkpHx0eHyEnLT/aytHq815MOy0qLjE2Oz5EUlVV 6NrZyby3srWura6yusjgYdCmmpianqGkqcktHRgZGx4eICtGvrG23FlSXEs0LCovODk3Nz5e 3dl5a9K9tLC4vbu3s7fOW2qulpCSmZ6eoaw3GhERGBscHilNtaanssLgSS8nHyAmLTQ6QU7b 0d5aSlXdvsjMx7y1uLzK08urkIuMj5mbnaY4FwwLDhUaGyU+s6SfqbfC8DEjGxofKjM7SOG+ u8l3T1HbzMDKvbK0rri+1me4l4qLj5ugoadPFwsIDRUfJS/0p5uYnrN3RTQgGRQZJThXevLO vsJYNzM4R1rmzL+4sq2susvNmoeFiZWgoaO8GgsFChMlLS5KrpqXn+YsJikjGRMWJW60ts/n x7tkKyElNO23t7e3rqSkrv5EoIWChpOoq6m1HAkDBxMtRTpgrJmUnUEfHiIgGhIVKbynrMJq y8g8IR4nSb+6u7WuqaauzlBDsouBhIybpKq0IQsDBhAncna+ppeVoTgaGBseHBgbN62gqs9D SEwtHBceO7uvsK2lo6iwv0w3QJSAgIWWpKatLAkBAA4ptsO9oZSQnyoPDhMaGxog/p6Zo802 ODooGhUcSaulqaqopqq7OyknNqOBgIKLoJ+3NwsAAQwss6SqmJCQpCMMCQ0QEh7Xm5CbqmI9 JRwVEhciVq6jop2fp8k9ODw7OLaFgICHnrn9Lg0AAAkroZqdmZKRoiILBwwYHR8rr5WTpEAm JSYeFRQfcKijqamip8czJTbiYE+kgICAirFnPCcLAAAOzpeWnpyWl78WBwcOGh4vpJOMlN4h Gx0ZFhMbO7Goq6ylp8MsHCtzwMvGj4CAgJdBRTMbBQAGKJmPl6Ccl6ElCwQKHDcxM7+bkp0v GBkiKB4XGjuqoKu3vLK3Pic30bvAr4yAgIWfSEMxGgUBCjebk5ulnZmsHgsGDSE7Ly/AnJam LBsfLCseGB79o6K1xLuuvC8kMc2+zaiGgICKqVA/MBIFAw/clpKcop2cuBsKCA8nOzU1yqCd uCUbHisqHRgh26Oitcmvqbg6JzHdtryghYCAi6dROysRBgUQ3pmVnqegn78cCwkPHS1Gq56e n+ApGxkaHR8iK024qqSlrM4+LTta+9fLpISAgIutTkQtEgMCDl6Yk5yjnZiuIAwHDB00MTfO pZ2sMRwbISUmISVIqaCnrrjA0U4zOE/jwcicgICAj71LNywRBQYRV5yYoqyhnLAoDgkMGiIj PZ6Okq4kGBwfHRgWIs6ioa6ysKy2UzQ0T8q/vJaAgIKQtVAyKxEGBg4upZqcop2cpkwXDA0Y HiMkKl+wrsc3KSgrKyMjMdGtn56nq6upsL/vQjo4YZ+HgIWNnKe+Sx0MBwkPH0a0qqCcoLIw GxMTGBwfJzTRrqe1TzIuNDk5N0q5pZ2epauqqrnXRT5Lvq2rpqKYkpWeu0YtKCUeGx4mND0/ NjExLTA2PDg3PURiW0I3LzU9OTY94L6urK2traqsr8rqx7itraupp6Wv30BDTlFiW07yy8pi NSslIyQlJy01Qf/KvcB5PDk9TVtPbm7ewLq5wsK6u72/2Me6vLu8t7W+vepVPj07RuPbv+3N 18xALjAvPzFERkPM0rvFVGNK9l1GPzdGXbvDub/Mt87hVktQ2ca/vbm0rrvT2VH5RUQ/QO9W YUc+RDgzNDRMSVROfsfHzWu9zfJfRmfp2NHMzcrCt8VmbsfpystG7c+4ttPOyb/Kbl9IP0JG ZVI1MjdAREs+T0tdbE3bY8/Lydxd2d/eTEfv5MrPcL/BxLrF0+rRxNLYzsLBv9PSvMDmOjg1 NjovPTc7TErf2/Ze81tORUJf4c7Rvrq2ynlRfMlZPz3Hw7e4ydX9vHlGRzrOW1jPv6uvv8rg e1w4LjIxNTtBVPf0aGxGRUM/S0rawrKtsbXC021HP0NEZ37m39S6vLlrSEZautZe/k68wsTF Tby2VC8qPUxART1ZTlRVTFQ+TT1D1tvIv7a2vdS/ub7G+E/g7N94QkR69M3mYlVtvtpdVP3F 28fG1k5BXTstKjtMT0t1z9vD1dRWS+r3zcvIuMi8ucddSunVXVd2Zk17xcVdzLtpSOjBXzI1 x+dESMS3O1k2yUEuZk/KPWHJalVn79VOPNfOvcnCtsPIu+1sYb/NS8XOYcfHvEI6/9hMOU1U t2JySzRp6MY+MEDW1lpGOcNezs1B8FDdWHXFu8tRz7qwUThMwb5FVc7DV8p50cdSvb+9vkVL 2MBOPD1RbzxJSj5DRuZMQD7qyk9PSsxZ6clrWui5vOPMv9Hayr7fTfFax8Byy1nJxlFfw+05 TDxORzteycn300HI+0bYOGs9OVxB1l0+0cC+YEy+v8jP3sW+1Fjq5r5SPtS/701uzth0X7/P Xcg4amk2STzevz5BybppT1XtTD7KVUVAy85P2HrFU83C883NXsrP0dzIu+BkTM49P11V3krN zfE8TL9cYENp1t1oxt/90T3Cvzc9zt1IMs3FOE3Avi05v7TFRrC3w9P6tk9J9r+3Lzq52dBE bVk0VuA+NUHL2ExaSM68VdFibnlKw3M0cbvAU13HyVfevj5Yxf7ERNy+UL10ScvMxUZJS3nN +bxWWsW9RytcTTk8OOhJSrxsUs7ezOTpzVTavtLOxMxS5M5tcdfEVW61xkvMwlJB38c3NWPe WUnK60DJwFpWXE5GSlVLPe201V/ffFdc6U87Pm3Gx9DDzu/Kzldb68DB27/E3czJzs7+TEVN TEFOaWJdXlJOSUx3UD9ATOXVee/Zy9J+Wu3Vz8/c3tXO1eR+bVv81crM2tfk3c9zSkxYe1ZJ XWVST2d1W2lOSFVX2c3S2dLP4e5QTV3azlVJe9/W3UhE+c/HzXjW29W7wP5r48/OamZqT2/l cGZTTmFdTktMZ2heb15fYEtHTkpGTE5NS3O+t7jF5+tl1NVf3se9ta6ur7PB1V5QQT5KSkti 39HN0001LCspKSonKjdJST9C5cO6s8DGu7WvsbbF833DsqWWjY+fdSgkJSMeHi3Eop6n6C8q Ih0YGR8vWl1ENzI0NDExOlHcvbKsq6iiqsZLRr+YioiPocQ9NCQaFhszvKantc9ONigfGxwl M1T3bk5BPDErJiYrNlJbwrSyt821ra2/dsbKopKKiZSrNicoHx8cKu2tnqm7OyooJisoKDBC Tz8vKSsuNDAtLDVrxcLZ2PHCtLOutrLC++fOmoyHjqlJIzQuKyAeOr+hp747KCspLCouNFjG 2j8qKSctListMEdb3eDX1Me1sq29yc3Nwlvvy5uJhYyuKR0pOS8jITytnqf6JR0gJiwuPNfG zUQxKSQpKzI0OVJc097g5FddzL63srm82tvT3ca6lomGjrgpHSo1LyYiO7eiq2gmHSAoLywu P8m01jciHyxH0ks5MjxeZF5CRH67sbO5xLu+urtdP0qki4SImzEeJDc7Jx8hTKmirjkhHyUr LCkrP7mqvjQeHitF4EE0MD7ZzuQ9MUS3p6q9z8a3r7XbMjueh4CHpB8YIEpIKRwdQ6icqy8b GR8qLSgnM7ajq10hIC5yyTkqKDrJu7tPOk63pqrYOj3OsbPXOjyniICEmx8VGkjLPyMbNa6b ozkaExonOTw5RNa3uloqICQ0dWxANDdeyr/XTEX+trbXTfGupJ+pxzg6oIuEi6keFiNKvjYg HCu3oqg8HRYbJzk/OD/GrLFaJiEqX73lOSkzWLq10EE6z66pvFFHzbG11DU/rI6EhpQ2GBoq 0VwtICT+qKC2LBkUGSQuMThXsp6YpToXEx81vVE+MEqvqqtBKzBis7TE2/m1q6+9Y6aRiYmZ eB0dK0V5MyUhLsessUQfFxceNfDF4tbFwNY6Ly02PkRHPj5BcsjIZUpvxby9vK6rrbjQzr+g j4mKlt4hGx8nJiIdITDEp6rPKBkWGidGzdRU1qykrEcfHSA+ysfpPHm+q63MW0nix7u4v8vP w8S7opGKjJlzIRsfKzY3KykvabKtwC8cFxonSMrWSkpqyt9JNi0vNEttbfXUt7Cyvr+/ysnO vcS9vc3ZbaWQiouZdh8ZHigwLSMfJk2upqxPJBoZHzNY72Fj1MG9yW9FNzQ0NjpIxrCsr7S7 zvNOX3zTyuz05KiWjoyTo0IkHx8oJiQgJTfEqaaudisdHCEtQEdLXc+7uLvMUzkuLCwwPmTK vbaxr7S+yM/WU0VJUcGomI+Ok6DDPC0oJyIfHR8rTrasrsRBLCMhJCcrNmOxqKitvMtHOiwm Jig4WsG0raqprLjLTDgvLTJCtZ2UkZefr77MYz8tIx4eJzvbvcDYVERBRkE4Ly0tMD1ayLzA 3UY5OT5MetnNyr+6u8hWQ01cWEtEbbWjnZ6msLu8ube3yVY4MjZF+ufsVUQ9Oz07NTIwMC8z OEVfX1NGPT9JZtzPz9TLxsXRbVNXXVdt8M28r6yrrrGwramnqKy2z09FS1lpXUI0Ly0tLCop KSw1Ojg4PUdOTkpDRlDz0cTCys/OwsLJ1u779NjNvK+srbK1tq6npKOpr770SUJEPzovKygn JygpKi0yOUdYSkRHX9zNys/Kz9Hffmxu7ujd61lITv7g5c25r62wtbOtpKGipq260VlJSElH PjYvLSsoJicoKy4zPkpPUVtlbn7219TUzcrIxsfO6F5bUk5NUW3ly7qvqqqtra2opqaqsb7f T0BAPjo1MCwqKi0vMjQ1NTlASERAP0VPbNjS0NbU0snHz+1caHrVys7rbOzWvravr7Szsaqn qayvtshxUFJSST81LisrLCwtLi8wMDM6Pjw9QU532czLzszGwsTN2ObUy87U2Nfk6dLFtq+s r6+xsK6urK63zFhGRklGPzcvLi8vLzAxMTAuLjI2OT5JV+zU0MzKw76/xMnMzcfI0vJfZ+Xb 6dvFubKztrWvqKWkqrC93FpJQzw3MzEuLCopKCksLi4vO0lLRE7sxbm3u8TP0crCw8jT8W1c T0xKTFBcbsy4rauxtbKsp6eqrrjJb0lFR0lKQzswLCsrLC0tLC0vNj0+Qk/y0cjHx8rMzM3O zMrGyMzT0tjrZFpjZ9S8srC4t7OqpqSnrrnSW0I8PT47NTAuLCorLS8zNTQ2PERHT3fOx8bI x8TFx8fL09706WpWU1hdVVdzyrqzsbi6uq+qqKessb/cWlZeXE0/OTUyLy4sKywsKyotND5H VXbUxsG/vb6+vr7I2XBcYVxVRkNIVF12y7uxr7Cvrqmopqess8HpTUVCPjo4NTIxMC8tLS8v LS0vO0lSX2Trz8XDxMK+vL7G3GVxf/tbSkhNWFRe58Czrq6vsKympKarsr3bWElDPzs6ODUy LywrKywtLS0uNkFMYfjczMnKxsC6tbe8xdLc1tpyS0NIRUQ/T8+8tLe3sKqko6WorLXC8lxW T0c7MCspKSkpKi0tLS0uND5VaWpf883Au7e1tbW2usHM1+ZgTUdDPj4+SN7BtLOzsK2oqKer r7rJ/lZVU0tCOTMvLi0tLC0tLS0tMDpNcfl73Me+vLu5ubm7xONYXF9ZUUdITk5SWNq8sa+0 s6+qpqWpr7i/1G5RRz85NzYxLSsqKystLSwtLzhGU3/XzMW8uLa1t7e7xdDb4vVcT0xKTE5M Un7Ivbq8uLWtqaiprLC4xuBeS0Q9OjUwLi4vLy4sKyssLjM8RExb6NXIvrexsLe8vr/H1t5x W1BKTVDbwLm5vLizrauqrK+1wdb9UUU8ODQyMC4uLzEyLy0uMDM3Oj9HVffOv7q1srK0tbm+ v8HUWUM8P0BDSWjQwsDCvLGsqaipra+2vs9sTkc9OTUzMjMyLy4uLS4vLzA0OkBHT/7VysO8 uLOzt7m6ur7EzmBSTk5NUOXIwMC8trCrqqqutbzPY0s/Pz47OTY3Nzg6ODIvLi8wMDM6PUNL XPrYxL69vLi0s7O3u8bYZUlBRUtQXNTAvLu3rqqpqqqss8F/Sz87NzU3NzU2ODg1NDY2NjMz NDc7PkVGT3PVxsK/vLe0uL6+vsDCyuhfV0tHRmXMw8C/v7qvq6imqq+6ytxxV0o9ODEuLCsq KioqKy0wNTk7P0/pysG/v726uLW3u8HFw830T0xMSkhGTGfGt7K0trGtqKWlqa+5zGFBPDs3 MS4sKissLi4tLS8zOT0+P0pk2MjDw8C/v8HFyce+v8rdeXN3/XpuYvLMua+trK2ura2ur7XC 4Eo+Ojc1NDIvLi0uLy4vMDE0OUFKTVVl5tjOw8LExsG/xsvLx8nX3eLoeHDc3O5858S2r62y trOura2vucxvSjw0MjQzMS4sKywuLi4xOz9GTE5ZfuDTzs7PzMG+wcTCv8PK0s7KyczmY1Zu 3M/Kwby5trOvra2utL3H70w9NjUyMS8tKysrLC4zPlFOTlFu1MnJz9/i2tDJy8zNzMrHzdXZ 5XxcTlP/183HvLSvsLSyrquqq7C/6kw/ODQvLCoqKikqLC80NTg8QUVOYHfhzsW9vcG+urq6 vsHJ0dLT+FtRTVVi89bBt66sra6vrq+yusTdU0A5NjMxLy4tKysrLjAxMjU4PElWXWji0szF wLu2tbW2urq6vL7EztbX5eLm0MG6ubu5uLWys7jG8Uw9ODUxMDIxLy4uLi4uLzA0OTxET2nc 0szIx8XBvbWxsra6uLa3u8XP1t3e0Me/v8DBwL+8urzD21RCPj48OTUwLy4uLi4uMTQ0NDU6 RU1YaunOyL+6ube0s7Gxs7W5vLy9vsfNzMTDx83RzMnHy87Y/l5PREFBRUlEPjo4OTo4ODc1 My4tLS4zOT9KVHLPv7izr62tra2us7S1tbi9u7e2usDBwb28w9RkRjo1MjI0OT5DQTw5Ojs5 ODc3OTYxMjQ6QktOTE1X6ci/u7Swrq2tra2usLKxr6+yt7u/xsLFzOJNPDQvLi4vLzI2ODw9 PD9PXlVNRDw6Ojo8Pj9DR1Rt38zBu7m5u7q3tra3uby7t7Kys7W0tLS2usLXWj84MzI0MzEy NTc4Ojk6PEBFSUVAP0JHRD8+QkpNUl/p1snDvLi1tbSws7W0r6yur7O0tLKytrrD2FQ5MCwq KSkqKy40ODo5Oj9Lbel5YF5w4OJ4W1FSTktKU3bbyMTGwb28v8C8uK6srq+yr6+tr7W+3GJA NTAuLi4tLSwuMjU5PUBJUWro4Oru6X96dV5YVFj+9mxXWP9vX3vc0cfCvLevq6mqr6+uqqmr tMf8RjowLCwsLSwrKy0zOj49PEBMXG9qX15leuve3NbR3u/t2crN1N/l29fMxbqura6zs6+u q6yuttNWQTs2NDQyMTE0NTY1NDQ0NDY7Qk5kZV1x6dvV3+Ln8/bl3NfV08/LzMvHwrqvq6ut sbOzr7Cwt8l7SDw5OTo2MS4uLi4vMTU5PUZOZ+v1Y1NKSFBRVV1jeWdg99bQ0MvBvsHCxcK4 rKmttLizr6ytrrTC30o7NjQzMC4sLC40ODYzMzY6P0pab2V3aWjz4NHZ4+rUy8/P0c3KycbP 52te/tG4tbi9ua6ppaanrbvSTD89PjsxLSspKi0uLi0uND9RZO73ZGRbaX5sZ2Pu183Ky8jC xcjLzNTp2dfMua6vuMC7sqypqqu1ynFKRD4+Ni4rKiosMDQ1ODs+P0NIVmxvWU9LVP3f3Wzp zsrR2MrJ3WltbFhNXb+qoJ+kqaiop6ist2k2KiYpLjc8PDk9T8vCbDMhHh8oMDtWaM/Hyu9E Ni41WM3FvbKurrTE0VI9NzW0j4OCjbwfFx4uLCMYHTymlZq6IBQVHjPpzu9sb9DlPi0nLkPe 2Ug8R925t9s8NEnRx9hf0bOrwF9NqomBhZ4ZFBzRuyobFDGjmaIrFRUiODgpLtipobNIJyYv TtVKMzA/V1g9OU/vy8nS2FHOraquQio2noCAhdcLFimoSxQUG5+Umz4XGi7xKhoZSJ2XqCsg LnNBKCMtaMFOKicw07f+PFqto7DQXbytvT0ymYCAiCoKGTquHg4UQZOVtR0ZLHsyFhEkoJKb RBwnUsgtHinUq88qHyrouV0sNLifrFEx5auwPSmygoCAnAkT4cIsCBFYj4/IHRgxSSMPDyak l6hhQPLMLyAlSKu6QycqRkA5MTj4vbbUO/auobcxJMuHgIChDx6wWhwIGaySmDoqM8o2Fg4X Pq2xVFWrpUAXFC22vTwu1rfaMChLvb5UOEm6r7zCP004youAgJkcKK03FwgdqJaeLjvPvigP EB5Cyne/tKvPKiEjOz44Ok7YQzMvOcm/53bexHzYt7PVMDethoCEpyWvpRkLCWyep0czqK0w Ew8bKiUnyZ2cszYqNCojIzDs1VMyP1BgX167wG01R62irk82SqOEgI2x7ZnXDggUrbjzNaeb 0B4WHiIZFyuorObSuL8rHSQ+PysvXLvsNULFs77SUEM/0KimsTnVkICHoK+Xnh4MEzYuIS6k ndUjKTMhFBUsu8w6u56pLyI5/SogLsjlMy5A4D9Gwrs+ME6wprTLXJ2Igo+blZNLFRUnHhUh tKHUOt7FIhMWJzUuKNGkrVNMvmsnICszLzNJS05Vwq6+Pz1XTs++qrPMkIKKmpWPqB0YMyAP GMOl+zytqigUGB0dHCDZveHEra/GSzosIiYvNzU8Xse8usDGzsHbSlm0rZ2HiJGPj503IDEd DhcuWjpoqawuIC0eFRYeLjVXs6+8tbbCNSgoKCIrUNnXsqzQvLG2z/5b0M2cjI6QjI2dwE9F GBAdJBskz6rIOWplJBsaFxofO+n8wa24zWNGNSknMztIz7Sqsc67rLPmUtqzmJWUjYyUnqit LxQbHxkXJUHYdcfDQCopHhcXHCg5fMaxtLm2wz0rKzAqK1q3uMasp62zwLu+qJWelo2PmaWl rSkcJyAZHyoqKznGXDc2LB8cHB4gLEPdx7qxuN5JQzYyLSxAd7u1rKeoq6mtn5ifmJSWm6Kk sjktLR4cIyspKCw3Mzo9MykoIyEfJi0zQsmztba/1k1KOzQvPWZLvq2kprqpn5memJWXmp+f sD8uNyciISsrKyoyLC0vLykrLSciJzM3PU/sZ72wwVJERTgvPkZAX7ivrKuoopaYlpSUl6Kg ps0rLSwkHSMpKyYyOSwpLSsmKS8vKCo2OjdX3XTUyN9NT2ZbREb008i3ra2yqJmYnpmWmKCo pqxFMDctIiMvLiknODwxLjQtJiUpLisrLjg+RktV08vR62jv18zI0tC8trKvramgm52eoZ+k rrS4vedNPjUvLCcpKiorKy8yLy4uNjY5ODxETEI5QU/l2tvPxr3I62xZS1FX78m8urCnp6Sh n5+foKWnp626/kI5LyspJigoKCclIyUsMy8tLzg6MS0uND9MUmnKvbu7vLy+vLm3sq6qpKGf nZydnqGmrLPGez8xLCcmJyclISMkJicnKzE3PD8/P0ZAQk1NUVhu79PBwsTHxru4vbyyrqqr q6Odmpyfo6itu9VFODIrKSwrKSYmKCopJygsMjU4PTw5Nzs9O0JOX+rby8G3srW2uLq9wL+z qaSin5+dnqGjp6/HWj40LCoqKiopKCYoKikpKCovNDxGRD8+S0pJRkvh3N7czcXJxr66xMrH w6+mo6OgnJqcn6OmqrPePS8qKCsrKCgpJyMiICUpKiwxODw+RE9ccO94d+7b0cbGw77Ix7y3 uby+uaynpKCfnJyfo6mtudhHLigoKCcmKCcnJCQlJSgsMDxBR0xNVGfj8PXn5+XazcjEwcG/ u7m9xMi7rauqpZ6bm56mq666zUs1LS0uLCkmIyEiIyEhJSs2Nzc9T3tqVlXmy8vY39vKwb/D zca/usHLxreqpKKgnZucn6Wut8d6Pi4oJygnJSIhISMmKCYpLS42Rldicca+u73JwsnHxdL5 6M/P6Fpa0M7oxa+noaKinpydpa/DxctcPSwnLDA0LyonKCw3NygjJjM/MjM5TmtKOjM9VVxK Q9+zr85fv6mpwrmUhoaRpKCZnjwVDxs6SikgMbapUxwRFR4gGxsoxKamtMu3rb0zIyczQ0VP y62jpLc0KDXW1js2p4mAhZitrqHJHA0PJ7Sq6D1Sr7grEQwQHTI3N0q0pKa/NSwzSDwuKzjK r7DDwrW4TzU2UcncxKCLhIaWsU3R/SwZFCTQn6nPLi43KxoODxg2t7DBfdrIzDsoJzfVxtZh asy9vm1HTktASd26ub2vkoaEj7YvM29LKhoeSaOcqzceHiMiGhMUH9iorWUrJTLmwlw9VLms s+Q5M0TYwM5KMDq/qarZYp2JgoulJiJEztceHSK0m5y/HxkbJiUbFRgss6StPyQjN87CXkNK zbe66Dw8TbqusmI7ULmqt+Krj4WHmFwcJC/uLh8fNqWeozocFhsmKSAdKN2qp7UvICE6w73Q OT5kwdk7MjfasK7MQ9W7snFBpoyAhZM+HCIxySseGzGnm6E2GRMaJSohHSbapJ+0Lx4fNMK5 yUI1V9jKSjM9U7OzvVpZ0u1cQp+IgISXSBwhNU4tHh8+p5ymNRkTGSUsJR4o86imuyobHS7B tbpzSG/Pxlo7O3uzrrve78DZU8abiYSLoS0dJy46HyIttp2ftSUYGB4pKSUoSK6mskkiHCQ+ ube1v9LiSz0uLDFXvL7yeO95RzWrjoKElMweLjzQMSAtv5qYpi8YFx4lIhscL7OjuS0dGiAw T9vOta2x7i4qMuO5s7vMt66txTlJmoaAj98aHj1ONhkeaJyTpDsaGiYsJx0eM6yfrjMfHiAq LTZbs6avUyooN823vtFYxq2tyzDIkIGBmDcZMFlBIBQtqZKa2SMcKSwgGBo2rZ+n5y0mIhsZ Hj2uoqziQTk8OC0x9quoucDM8NmijYaKnsY75jYeGh6+oJuwRj46LxkQEyTOtbfAyX83IxgZ KMWtssrY12M8LCtAvK2yvsLT3cecjoiLosU42iUYGB+2pZyvzrW6RBsUGChXYtK9s8I2IRob IzhNS2LMxGs+ODpBbsjDua2vzdGfjYqNnq2xsDoZFRpEybzOwKmjsyobHSMmIykxScnGPiYn NTotKzvUxc3Mtqmlp663vbu8z0M2Qriqq6+wq6mpt9tMSEY6MC0yPUtfftjLw8hcOS8rLDA3 Oj5NVE5FPzg0ODxEU9vFv7u8wMrO1+zVvbCvsq2loKGkqrO4uLrMTj88Ozc2NDAvLCkoKSos M0BPa21MPTMxNDg7PkZkwLGtrrCxsra9wMS/vbqzr6+xr6+urbC3u7/VUzwzMTI0Mi0sLCwr KiwyQGjpUkM9P0dCOz1L2L+6vsa9uLa5wMW+uLO0vcfT3eHYzMS6tba4v8XFyMjGydxZQjgv KyosLzQ3ODg1NDQzMS4uOVDXzM7Mwrq5uLexrqysrbC3urm8vb28u8XbXU1LUVlYVl1eTD4w KykrMDc8PkVRWFhKRElTeN/VyLy2t73Gx8a/xs7Jwr/I71hvyLu4vcvqWEhFR0tNVvTZ6k88 NDEyOEJKWuLPzdjvXllWWFn/18i+vsHDxcfO1Nzn3NLhW0lP3cm/wsGstzFBMrmwKzI9RUoq OU5D2q3OVULStbSq6S0rKUZJ0Ly90863srr8PzVVREI/TV15zb2usLzQ2l7lcFf1xcXSytZn QDw6OTw9PUBXa2NL2NBtTl3FbW/Yw7rG2+LdbeFjTepie+bgR+POwsbofca92NjUzs5pRl1F QEg+PUpGT01RVUlPSuZSSmDV1ubevK6yWHq/vVNA7bO66sq+TTA89MdXSr3A+Tw9XMnvTEp4 bkk+18DU+E7e21Q7QGva6Un73m5Ix8DIb+fAyVbmy9pF4sS8U0jPyE5Az13XWHLLzk5P5s3b R0hPYT8+1dbAXlxITUBc3P3dSFVJ4ObG3Odpvb3Ovru7xVRIVV9M19vAzM5V+upMT0tKRFRA ZU9HR1lLTlZL7XPzz3k9yLnJx8nByWFDxcRt0sy/zT9AtbxNQuvlaDZIzGhLTtzEzT5b8E5P /M2+6UNS+U1KSFp3V+G+2U1hzcjL/92+zj1P3eDwVHi6vHF6TUxSQ0nl2mbu5fnoYM7CyNjX 2v1NZ0dFTFPZXWdoZ2BQ4N5YP07Yz9BaX9t4ZvDNvMPHzN7PT0RFfvJPeEteTjk+ZcbfxcHG 1lple0hR7cS+wri1sc5tPz5FS0VT2dS7ubKvwD0tLCkoJSk5Rz49SU5bZGbiy8LIvL2+ucLa 1822pZqVl52rukMrIh4lKjE9x7m7xFY/PTkkIyYrLi86STopKy86SEnYybqvr6m2t9XS1LuO g4qXpZ3CGwwPJB0kOKOZoMRCRCwbGB82PTfntbw7JSMjIB0n1L2+rqijtNnArsU5Vfi9rYyE jJuuokoXDBElJixaoJqo1j44JRcWIUR2vKimsEUqJyIdHCY5y7uzp6Op3UhURT4wV+3HrYqE j5yonTcVDBkuIy3AlpShxVk4HBEUHi835Kyir0QtKicdGSE52s2zo6GhsLW7Oi432D02Q6CE hpaempkoEg0hKBgk0ZmhuNzIXB4TFyAvK02onqjM4lg1HhofJi48b6+mpamrtr5GOz1LQD/G mISLlJyUniwVDyEZFhc8qKu1wKyuOx4bHx4aLbuorMWxsdEoHiQlJidGuqyrpZ6ouL3CUDQt LT2gjI+YmZOZyCYbIhkUFCFWxq+vpKKtRCYiHxsiMT1nybOvrvM5LyYiHyYuVsG5qqSipqy4 fEwzLkyajpiZlo+auiwjJBoTEx864du+rKe1QCglIiMsLDFOu7jEzl1DMCsqLzpF37qtp6uy s66/Ojo8TLebmJuamJmm3C4sKR8aHCg5THTIs6/DTTw2LC4vLDE6PkhZX1JJOjU4PD9BWMi3 tbq4tL5nSX7c/K+Zl5ucmJiizTMvLB8aHCUzOUnPs7LTRUhFLycmKjQ3Mzth5VVQSDo1N07Z zcm8uLe1u8fc03R2zqeWmJuZlZqyTzk0KBwaHy00MkfOvM5EOTkxKjQ9ODg6RkVFQj5APDpE WuvXwcbIvb+8urrJyrq5s52Um6GenaXOP0ZDLh8fKSsnJjrs11xN09k5LTI4KiMmLz05N0vb bU7szdvs58C4vcmyrLC1tK61p5mepp+cob7L2EMqHyAkIR8nQkZKd8i+XUE9NisqLS4qLz5L RT9H99Xz+MjK6cW/vba2tbO1ubmomZ2kmZefs7a0PCIhJiMcIC40LzbXz049OzksLDAuLzdJ RjhI9mZHWNN20cnMv+LRwby9x66stKOXm56Vl6KusOYsKCkjHx8oKiwzQ04+Sj8zLy8vLjI0 LzI7PkBASU9e9Mi/wb62sruvtbe6s7C+o5+fmZicpKq4bjctKSMhJCMmLTQ7RFRFPDcxMC4t MDM1ODc7QT0/W3Rlyb27s7K5srG2t7y0sK2op52cnZ+kqbrcRTYqJyMlJicoLTE0NDM3Ni0s MTM1Oz9BS1Zl4MvK0Me+vbi4ubm9wsG9vcTJubGro5+en6Kor71dNy8pJCEjJiovOD5AOzY5 OzM1Okc3Ojk1Tr82PbVNzz66zrnUqcO3sbaxv7KtqqWinZ6io6u69EIxKB8fIiMmKy41P0hJ RTw8PDo4NjpFQ0lYZ01MTWBd9tHEvL+/v7m3tLy/tqukoZ6dnZ+iqbPWQS8lHx0dHyQoLC83 P0RBQj49PDo9RUhLW/Lhe27t9c7azcvNwL+8ubi3uby2rKimop+fpKmuvd9HNCojICAhJysu NT5FREA9QENBPT5BQ0ROUU1Tavh67uHUyMLCvry6t7a5vLevqKWioKChpaqzyE02LCUhHyAl KCsvNjo9Q0I8Pj0+Qj89OzxASVZh7c7Cvr69vLq2tbW6vLm4urmyq6ikoqOmqK651EIyKyck IR8hJiouLzM6PkREQT0+P0JFQD9IX9fKxLm1trm6vLy6ur3AwMC8u7u3sa2rqaiprLK960M3 LiglJSUnKS0yO0BDSExVTEVDPzw7Ojw/SVLuzcfFvrazsbKzub/DwL7Cw767uLSwrq2usLnE z/tNPjUuKissKywwOT5DR0ZGQjs2MjAxMTU9SV72zb62sbCurKytr66trKyytbe8vsHG0dTa 9WtYQjw5Mi0qKikrLjA1OkBOZ9/b7XFoalhPUV/z3t/Nxbq3tri+vry5uL2/vsDFzcvKycrO 31xUT05HPz49PDo3MzM3OkNMT1df4tPS29vd3Nnz6HB/3NzNy8zLy8fHxMfNy83Nx8PExMvO 1nhZUk9KPzs7Ozw9P0RKSElPTExOVPfc0cvFwL7DyszR1tjg+OLS2uvl79vLys/X19PZ5enp 2NV+XlNMQz89Pj9ES0xMSUZISlVucnJ+3M/KysfCwL6/x9ri2M/P2NnOztXd7O/1ZGBaS0ZI U2JncPdwbmdeTUpNWFpPUE9SX2tv6dbP0dje5dvRztXg3M/S4fZcV1lWWFVbb3Lw39bT087R 1tbb2tLIy9r9ZltNRkRDQkNITU1OT09cb37k5erq5dzTzcXByc/W43j+dFlYatnMzNLZ3OT8 W1NVWltpaGP6ffdxWk5PXmRbVVdh7urscmXw3t59Zm9/39DKz9bZ5ebr5ujx9vr0Ylppdnz6 ePx79H9+dm776ef/Y1hdWlJRVWH58HJu+OXZ1c/Z3ejqdVRPW//l5Hp+4s3Cr64qYEkvtDBv cj7GvE2+u0u36k+3v0dyQypKODg6Qy/0QnOouae81r1PTy9FLt9UUcU+uL2our63VsRUTz5P N/s1c+s+veO/aO3Q0dNx619QXelPSUx5eElbWD9XVXrZO8353NfhzcDM08NR09352GL/ZM/v wsXax17lW15qVVpKSUteZeXZc2FPXVpdYFNsdmf65dpe6ObU7nT7+ult73Fobc/Y7fBg2Ojf ydjM0dHNZ9nh0d/t6UG8WzU+ZdI1PlvWzTVdxnZePdnHTUFYZ3VKT8jHadrDw8zgxrK97dXJ zt5p4cxNUf5c+U1PX0xGTF9MTlx9elxYX0xZX0pKQ0V9SkPY+N/cf76+y7WwtLOzsbC1wsHO TFpJOTg1MjQzOT31TExFOEcwMSw0MjU5QtC8ubKwsqutsamkn52gpp+ozEw4LSUeHiQpLUXv zby+0FU2KiQcGh0gJi5BxrWvqqKor7C0rJ6bmpial5qny0MoHRcUFxwjN8+ypqCgqLtKNCke GRoeIygvRNnO3tTQy9BPXcW5usK/o5OPl5eWlZ/SLCkcFhIUGiY4vqqln52itUsvKR4XFx4n LS9Dv7zL0ubN4T4+Uee9v8S0pZCNkZuamZ5GHhwbGBIUHTrHtayfm52r9z0tIxwaHSYsLzZI 28XbX2Bfcu3fysC4ta+3u7ypnJuhq6ago747LC8vJiAiLkBPRU7avsHbTT9DPTYvLjM2Njk+ SFBpyG1VvtG4u+bD3XLNTEZkv6qkqaefnpuis8ffTDspHyAoLS4vNmHFv8za6+FkPC0mJScp JicvRd3KxLSsqamwtLvBxuJquamgoaahnZynxj88MysgHB0hJiouNV28sbS8x8XNRjErLi8u KiowQFv728CxrKy1wcHCx2xOzK2io6mnn5yfq8tXPzsqIBwfJy4uMDrkv7/K2tnOYzsuKyws KSgpMUFR7M66r62vtLG4uu9N4K2jnqWgn5qbordqSj0uHxwbIScrKSw/z7/J1tHI1UUxKSss LCkqLz5q0srCs66us7q5vbzLxrKln5+kn56dpbN5SDYzJyEdHiMmKCoyTdrOzcfDwvJGNS8u Li0qKS44QF3PuK2qqayus7XHzb2soqOmpaKdoKjEaD05KR8aHB8nKi04TszEydfZzulEMS0r KyooKi89VtrEtq2qqKyvsLW8xb+xqaWopaWeoqi+Xzw3LicgHyMoLC4yPEpbYFtf6dvXXEQ8 OTgzLi0sLTI7Us64rauqqqqsrrCsqKapqqmkpq2+clROQzEoJSgqKigpMD9RVEpL+s3Ne09N ST0yKykrLzU7S9q6rqytr6+vtL7Bu7Otr66rp6Wnsb3NzedENSwrLC0rKiswODk3OkZk+VdH RERBPTg3PEBGTGDWwLWps927ucBvYMnGuK+uq6Ken6Oss7zFWjgrKCcnJSUmLDc/QD5HZt/n WUdEQz45NTY6Q1lsa8+/urm7urm5u7u+v765uLq1r6uqq66yusTRZkA0Ly4tLi8wMzc5NjM3 QEtLRUVJRkBAQUNJXN/RztHKy8nFxsS+vMXPzcC6uLezr62rq6yusLbB3089NTEuLSwtLy8y MjI0Nzw+PkJJTUhIS09h+9zQzMrIyMvEwMHBxsXExcG+vLu7uLOvrq6wtLi/zPFPRD88NjEx MTIzMS8wN9SyOSglLT8yND9LYvn7zse/wr+9wb69uLW3urSuq6mrra2srK21vtVoTTwvKCgo KCgoLDE9SElFTFphUEJERUxOTU9WU+6vrdlVOUNANUppyrevsbGvqJ6bnaOioKCqyzotKCEc GRsfKTA4QGa8r6682vNhQC4nKS0yNTU2O05p8tbRvLO1uLq7ubq+zNaznZaTl5iZmaLFKRwX FBEPEhoqS8W1q6emqL9PMiokIB8kLjtV5Mi9u8LecV/r71xX3ru4tbu/q5SMjJKZmpmnNhkQ DxIREBYl2Kuoqqqpr84xIB4fIiQoN8mvrrO9z1s3KiUqOFzZ07+wq62vvbGXjIuPlpmXn0wa EA8SExAVIuaopaqtrLJ8KxwbHyYoKjfIrKy7bUtANCgjJjvCu7m0rKenrL28mo2LkJqdmZ7d HRERFhkVFiLMpKKrubzFTCcYFhskKy02xqimsuZEPDYtKCg01bSurqqlpKi9aK2Ri46XnZuY qCwVEBMZFxMYLrajqLzEvcg8HxgaIywtLDy8qa7WQz09OTAsNc+sqrCxraamrNROrpOMj5qe nJelOxgQERUVDxMf3qilrrivrb82HhoeKConLluyrr7o5tPsTjo5UL62vLy0rq2xwl1XrZiU lpucmZeh6SIXFRUTERMbLdu7vbqyrLPTNSkrLzAvOEjay8rX3+t9VlnryLy3sri2ur/K4FNF XqyZl5menpyfsDQfGRcZGBcZIzvJv8fJtKquwz81O0g7LCs3WO5lRz9M0snR4sa4tba7x9LM vulPTOisnZqcoKKhoa9VLSMfHh4bHCQyRFh6/sG2u8Z3TkpCPTczNjlBQT1KY9jPxr+/ubrK 7NrFxcfM2t3b07qloKClpaKjqcBRNComIh0cHiMrMzpJ376xsbnHa1k8My8uND1LU2fs48u+ vLe5vs3O6lbd3c7kTj860KmgnqKlop+hrco+NC0mHx0fKDA8P0L4urXORDY1OTYsLDM/Uk9V 6MXBw7+/u7i5w8q8vb3Kak9GYU9D1qyioaOloqCouVI3LislICIoMDlFR0NSd1Y7Njg8Pz8+ QU7x6H1tXPnNycrLyL23ury9xNrd1lA6Oj1Mt6SjpKShnqGuz04/Ny4mISYuMC4vNEJfZkE4 OD1ORjs6Su3jY1XmyMO6ur++trfC0l9XSktGRD04Nz7Hpp+eoKCenqOwxPBOOSwjISUpLCos N0hOQDk2O0ZEPT5PcGZWRmLQvbW5uru3sbrPUUZJTlM+PT5ITdSto6Kgnpybn6m42EkvJh0e IyYmJis4bNhXP0NLUEQ2MTpUZGT8zL28wb7E2uHH0mlhYvtp6XpPV1VWz6mhn56cmZuiss5O OCkeGhofKS42ROW/vNhEOTg0KiYpMDlEV9rFvry/vL++vsLCz9rPz83k82Rldc6on5ycm5ud qMlLNCsdGRcbJC47ULyqpqu9ZTwsIRwdISktOErfv8LFwLa6xMjFusb7ysO5wsbpzq6cmJuc m5eetDcqIRwXFRghMkPOrqKgprDBTSwdFxUYGx8rRMy7s7m9vcfncXXGwr/JubKvr7O2uZuP lp2dmpuuKyAkGxQQGCVCSsOknp6qwlM7IBgYGRwcITJuztq9xNNINjM4PlHHr6mknp6fqK+2 nYyVnp6YmLQkHSkWEA0ZKEEw7aOkqMDW4TUbGB4eIB8qzLXY373NSS0pNj41SbyvoKCdnqWr tbKVjp2cmJGbyCAsIRMOEB0oLC27qKu7WlpVLhwfJScnJTq8uGPMxNM8JSk8PztpzrKpqqOi qbe7rI6QnZuVjpzTKuonGQ8THCAfIE/UxU9E+lssHygqLSgqTMG6urSyrsHKvbq9wMLNzG3r 709JSUpd49jDuK+ooJ+hpKmprcD9QzUyLi4wMTIzLiwuMTY7PUBCPDY5OTEtLS4zOD9T/8i6 sK+uq620t7a4s6unpJ+foaGlq6+73U86LiopKCosLComJCUoKiwzRE9OS2Z5UkU+REY/P1Pc wbi0tK6wub/Bu73Etqyqpp+fpKivsbnNX0c4ODgyLy4sKCkmJiQnLTQ/TGRTWWBHOzc8SEM+ RnHMubO0sK+0tre8v87Eta+uqaSlpayzr7S9wvZJPzcwLy0pJycoJyUjKjE4PEROUU5GQ0JB QEhP+dK+sK6usbGyt7zEys22q6uppKOnqq6vtMn9U0I8NS4rLCwsKigqKygrMTY9Q0ZJTEI9 Q0BEUEtP582/t7S1srC3uLi3sq2qp6amo6OorLC5zVxAOS8sJycqKywtLzIwKyktNz5IS01f Wk9CPj5ARU/Xxb65ury9vby8vL+/tqyppaCenp+mrrjNUEA3LCsqKS4wLSsrLi4tKy89REpN UVxeU0U9PDs9P1dvcNLEt7S3t7Kvr66vraqjn6Cip6yyuMlWPjAqKSYoLC4vMzEuLjEzNDY9 Slzs815QQz5BP0E/R13yzcG7s7CurrO3ure0squloaCiqa20wfdHOzIuKigmJicoKistLzA1 PE5e/O3t3PBTSEde4/J249XWyr25u8vLyMLCvrayq6emp6utr7a9zHhORz82LiwsLi8uLS4v LS4vOkFJV2PgalZgXvnu8+vVw8jIv72+v8PJx8jGv7+8tK6tra+zt7e1vMv6YEg2LywsKysq KywuMDc/SV1428/QaVJWTE9q6tvPxcLAxL++vr/DwcO/vr2/wsTBwsDCycK/v8LOdk1DPjo4 Nzc2MjIxND1BR0pUdutmV1FWVl378Ozl1s3Oy8nKxcTDwcbFwb67u7u6vsTMy8zT5F9VTEE6 OkFHRERCQ0dOW9Cn8B/eIM03I70qzT3DnqE6PS/8zyTXPbdBycGrqq+ps6Srqry5tb3ITzw2 MzMqKis4Wk9e7MPMb1DcTi0kHiAcGyErMD3mta66uKyqu8aYjYeNkI2NkncjExoODAkRK3a1 sp6Ym6VKKRwXEhEVHC9Lv6ymp8VJNy8qIiQvz8CqoKCWiYSFj5Wdnk4VDQwUExgbYZ6Wl52e pMQtGBEPEBYaKD69rKy0aDQiHhwcKEm9vauclpiemIyGipqhraQ5FwsOFxoeIdCckJSeqrHN NBgQERcaHSY8ta7EOy0lHhgVGi3LsKuemZOam42GhI6cpqGoIw8IDxYeGyO7mJGZqr3bSSYT DxEdJCs1u6CkuTclHhwXFh89xbappZmWm5WKhIqVpLClTRsLDBAdJCNAo5GSnLj5TD8cEA4W Ii48R7Ckp9MsHh0cGRghRLiupp+bnaaVioWNm6CmnV4eDRAXHyEfPKiUlp++ck9GHhEOFiEr Lze6paW9Nx8eHx8dIjrctKymoZ+bj4mIkJifoaszGQ0QEhobIT+plZSYoaqrsjEZEhYdIyIh M8+48TAlKC0qJyw/1Lqwr62ppJKNjJSYmp2eyDMZGBgZGhggN7OqqKqtp6e4NiUhJCMeHB4t QVNGSPi+tr7Lyru+wtHV20o94LenpaWen5aanavJfTEsHhscHigtNkDKrquvvt5DOi4mIiMs LzlEWM29u7m4ur/GyephRzgzLz3VtaupoZ+cnKGmtrvNcU42MC4zOz86Njg6OjIsKy81MTVA Z9XgXUNJT1NOUlry/mFQS1t74ui3pp+fpqakn6GpsLu7ydlWPz49OjIsKignJyorLTE9as/I 6l1GP0A7Ojo+TVBQRUFETFnizb+vqKKgoKCfoKCkqbK3ubzBfkI0MTItJyIiJSstMDZAVnBR PTk7PDcxMDA3Ozw9Rmxt7sy8tbOupp+en56dnJyhrLGytsRONCsrKygmJSgrLzQ5Pj47OUFI RDs4ODc2NjExNj9JUVBZ18fAwbqupqKlpqCcmpyfpaits79uOSwqKiosKyoqKy4vLjAzNTxA SURAPTo7ODQyMzY+V+3pybu1tLe1raimqKainpyepautrLPMRTIvMTEuKigoKCcnKCwyQUpK VO/eZllAPTs5Njc9PUZWaNfZ3WFuuKyqr66hmpaZnqWmqa27YT01OTY3NC0pJykqKyosNj1D QD07Ojk4MzM1OUBNft/e2OHi3XxOQVeypqitppqWlZmgp6iqtmg3LTI6OjkxLCkqKysqKCcu PDYuLzY+RUI8P0FMZtnedvl2d1tNSEhaxaifpKmkmpaXnqqsrq207TwvNDw9Oy8sLS0sKygk JS45PDczPUVPRj8+OT48PT09SVRYST1DSlG3mI2OlZ2blpmjXi4sM0o9NS5AwrW+Si4qLC4u Jh4fJzpMPDY6WWU8KiAkLDY/QV/NurXQycC50zjalIKEjJ+ckpu5ExIYMc0tNUOknrEpGBUZ GhobHz3LtLrWz+1PLiEhJC06S7+xqavAXjxJ2OdPNzqtioCEjaqblrsfCRkky0Yoy6mdvh8T FhkbGCI0zrzl0EBFOC4sJy0tNk/es7a+utDkODjYv69sUceOgICLsaeUuyEIGDHPSR/Ln55P FxIZGRUSKMiy+jJXzEApIzBCOjI4yL/F2+Wur8g7ObGrqkw8vaOGgIiTt5qgLBQNMDE9KC+k osYgFxsbExAc8cJeNkaz5C8oL146Ly1awN7Nz7GruF48xK6u1kHJupGAg4usrZpAHAkdO0c/ KqacrCgVGBsTDRI5sr0/YqmoQCcqWU8sKj61v93Msqy5bDxHccrJ7V5xr4qAhpO+naAvEg41 REkrUZ6gVRwYHBgPDRzGs8rPqZ/bJB4uPSklLr+zvb68tL3ZPCg83qivxMGuioCEk7ifmioR CzNBLSIsn6JKGxcfGxAOHqujtES0or8jHTfNOiEo2rdfTsqtvUhB99xfvbWwa2yVgICNqKiR aBUIHlIqHh2nnMMfGSMfEQwTVK+0zKmZpi8fKUUtHiRrsb6/sKOq6zQvPVdc2L+wzZ2CgIih t5m5GAkVSjcpHq+bsyIWHiIVDBFGrqzYyJ+qRiAtWE8pIkPG21/Dp6fHOTXgysnrzK6vooiA hpSvna0fDA4qKygdUKKyLRocHxkPDy6vqr/Qn524KSpNVywcKdbFXnqon6paNWT7yUbvuLOa h4GJl6SevBsLEh8nISDGoq8wHyAgGA4SKMGpu7Gfm6w9LjdNKx8pTNFSXLCgq+0sOGFlPjXH uZ6KgoeSnpupKg8RHCElHkappcsrJichFRAbLGRVVaydn8s+Okk2ICErR2hosKOdqthb67PX TT7yq5aLjZGamZ/MIBcYGh0bHy9U11A6Mi8tJCAhLDtNya6mqa6xr7DBWEQ+PTs/XPBZQDk3 OTtDXNG+uLaqn56ip6eop6+6tK+4ykkxLSooJCQmKy4uMjM6T29XPTQ5SlZKUWzZ3NvLxMXd 6eXf2+HVxri3xM25p6OuurGsrbfBtbCxxloxLC4tKiosNTw7NjlCW045MjU/TEtDSm/f0srJ wsvW6vN88N7Wxrq8w83PysbNWGu+q6emqqalqr1SMi4tLSsuOElPQ0FLUj0wLS81NTI1QnjR x8nO411XbmhcVejFvcTJv7u9zk1K3MfBtKijoKOpqay6/jwvNDg6Oz9AR0Q2KygpKy4uMj5K WfLYy8bQ3XhaUFhJTXfLwMPLz8XGc0o8Pd27uLCmnp2epqmqr8NUOjY8QTk5PUI9LyckJigq LTE6SmVtcu/qeE1DS3XfzsO9ubm7vMDM6U9APTtD2bWwrKWioqatsLC2yNtYW2tdQj88NS4q JicqLCssNDxDRUZAREdUW1Va4Ma+vr23sbO93WJfVUZLdcOvrrSvqKSnrbayr7TI2unm4Es0 MDIvKyYlKCsrKjVJRzw3RWrYU01o52ZIV9m/tKyzvM1kTToyPUTdoZaYnJuXm6lDPTosIB0l M09E8LivuUAtLComHiItTVx2u66sxWU/OSkfJC5DR1u9r6qztra720xDN9+aj5SYlY+YtSsu KhsTFSQ4TFW1pq3VNTAsIhwcJS04RsCtscdeSy8kIio4OUy+q6uxqqOjuNH5fq+dl5iWlJWd xTsrHxQRFR4qLky0qa7AfUEvJiYpKSw68r22sbC5XTYrJSMjKDFJ3bqtqqywsbbVSEi1mZOY lpGPm7c9PSoXEhcfJSg4vKy1xetRMyckKCwrMkrFusjVzWs2KycmJSg12bq5tKikqK6yudDB p5qbnJmUl6XJYkAkGBYbISElNdfK72rhcT0yMjgwLzZR+vjwz8NnQjs8OjY3SOzez8+8t7q4 uLnHvqmen6KdmJqltLzUMSAeHx8fIi9LW0xV5HFJPT0/OTg4Pj4/RlJYS0pOWFFNb8i8vLm7 vcPM0NP9WGrFrainop2cn6mwuNM6LSonJCUoLjU4PEdLQ0dSalU9Ojs5NjxGTEBDYs/GxL65 trvG0dHmX19EQT4+RFG+sKyoop6en6SnrbzpSDo0LyopKiorLS8zODo5Oz5CUV9sYVtNWu/h 3vzqz8/V2c/GytPrYGls/FhQTlffxbqvqKGgoKOnrLTKeko8NC4tLCwrKywsLy8xOD5GU97Q y9TnbF1hXXzbw7q5vb++x9JnS0I+Pj09P0RR0L23r6ynpKKlpqerssDiRTgtKCcmJSUoKzA3 PlVlalNQS1VdXfvh1MnGv7u7uMnM32RcSk5IS0hLT1RYX2nQyr+wqqalo6Smrbe/8Es4Lykn KSktLzg/Qz89P0NKT05UdO3Pw7/GxMbM2GdZQlJE1ktu1kzBUtVeStVAzOC+tLWnqKOnqKqw u+tTOzIuLS0uLzI4PUA6Nj0+SklJ837P3tDN6+n0Xd77ZXBI209M3knT/uvI3cvFz7fDta+z q7CtsLW2x9d3TEM7MzAvMC8sLjQ/Qz9QVl3a2svJy+DR2XhtWUJVWT9eO9VTSb06yHL4xma5 3bu4wbK7srK0rbatuLe56Fs9Oy4sLy0zLjFDT1ZJV0pCVkFLXkPaaWzfUMxSy7dBv0p+wDmw NcbAQrI/vsTtteuyr7Kkrqiqs67KZ0ItLSYkJiYvLjE2QFp01s/GwsvqwuplalFXTuRIT9xf 0eJNx3FdTEzPP0TYe8LOyb+3qK+qo6Ofqqm0vd4vMicfHhwfJSgtN3u8t6+vsrfH7UxEQTc/ Q0RPPF9aXdxBXN85ZGlAxk23vVyvca2yy52kn5yfm6asvDs3IhsZFxobHyQuWci4rKanrbjK 2EoyLzU4NzdAS3Bh5cbRytfd8k1uWVVyTlPpzszEq5yamZeYmJ+vfDEkGhUUFBkdIzJvuK+t qquuvlU/OTQvLzdIbudmXGdhZ1xZWHBySVjh2cnOxsHX6OKxm5aYnJqYna1HLiYcFREVHCUt Psuuqq+9zcfIPCorMD08RWq9sr/O2dFqPTg2ODxGUuXP19XMvMhcSNyklJOampWUnr8vJCEa Eg8WIy0+XrupqLZjQkZIMSgrOe3cx7mtqblqPT07Li0uMkV10MvKvre/bEhJXM2ilpaYl5aY o8cvIh4ZFBQbKkHmzbusrcBGLScqNi8sOM2urrG1srPYPC4uLCstM0vPxczTvbC2Xk5aYs2s l5GUlZeYnrkxHBoXFBMXIz7Gu7qytMY8KCMoLiwyTbqpo6GmqrPoOComJSgqL0Xavry7v7av TjM1SN94oY+Pj5SXmKPPHxUUFBQUGSZZsK+xtbjWOCghJisuNVawqaOhpqy+Wy8oKSorLDlO x7W6uK6rvT07O0fYpJWYl5aXmqlzIxkYFBQUHCpgtbKvrrLDQysjKjE1R8elnqCjqrDMNyQf ISQnLDjev77AysvhenY7NDlbp5SPlZaUlZqyMh0aGhcVGSRDw7i/vrvMQigfIiouOVm/p56f pau6/ToqIyIoMj1Mzbqys8Xs0cV5OC9E0LKgmJeXlpier0MlGxcWFhkeLEjDtbSytsVaOC4w ODpI06+hoqywttA+KiEgJysvOEXjw73B297Lx9xGPWy4pZmXmpuYm6O5NyYiHhwZGh8rOUll 3MW/2kw6NTtGTFDNrqKeoKu6x08sIiImLz08PFbVx81XQkx8zG1Nz7Snnp2fn5+iqbtLMSon JCEgJCsyPEtr0L+6u7++vcDF2VlJSkM8Ozs8QUZBQEdMT0lBRlhPUeTYwrW2xryurqyioKSl pKivuvE3LCciICAhJCo1RVncxr28vr2+y+Vv79biTDxAUU9HPz1HXlhJRERFRlJZW+XEu7nA xL61p6Olpaanqaq3YzsyLCcjISInLjc+Su7Ivbm7vcjeZ0Y/SU4+OD5FSU5NS1b17vd5bdzU z8K/yci5uM7s28u4rrCyrayrrLhfPDYtJyUiJCw5TX/Pw7u2ucLUZEpAOzhBxqyyYU7fWTky Kys9W0lCVsu0sL/FvMbNe0E7Tbyrp6eloqOosfo1LSklIiIlL0vRvre1tLbFZUdDPjkzMDtU aHD5aF9XQTk6PUpy3tDBu7/BwcvSx8xkYHV5xKmipKWmqay6PikjICQnJys517WurrW5v+JF OTQvMDM7XsXBxMHZTDwtKSwuMkvQwLavrq2ts73ITz9GRMOhnaCgo6mtxi0eGhodIic1zqui o6muv1s1JSMpLjtT+bioqrfLQzEtJiImLkTWvreyrauzzM7HY0U1L02olpOYnqWntDccFBUb JC8+v6WdoLRJLSchHBskSrKio6Sfn61NKSAiJSQrP8exrbLHW0E2LzRRv77Lu7utmI+VoLHB zEIiGBkjPdDAu6+lq2soHBsfIyQuxaSbnbDUz8o6JiInSPdiWdezssFHLy88REfZurKttF1E w5qOl6a/u69FIRUZLua2y7+sqa80HBgbIycrQK+hn6nJUkdgPS8wP8G9y3v3wMxILSgvQUtD 1a+qtOpFPKmRj5esrrC8NRgWHT2/vr66qa5SIRcZHyouObyhnKHAMiswP0lLWMSzu2M+RnXL YzcvNWNbX8m1rtBHMTynkI6Uo620dyoWFR5BtrS0say4OB0WGCExPFavnZ2qTicnMUxLT821 rr5JPERsZDguL1zN/ne7qq/5LyxYmo6Rma6rxEAeExomwbS0sLGuYicZFx0rO0y9o5uiwTAl LDpfX2zKubxfOTU+WVc+O1rKzdS9rLRaMzE/r5OOkJ2vvEUsGRceO62sr8DF5S8eFhggOPfN uaSfq98oKTXSv82/v6/AVjcvRu5eOC4+4NFkVOPaZEE505uNjZSqut1HJRgbKbmnqrnxdTcj GBQaLH3Buaujp7I7KSg9vbu7zb69bjgqL0XoXjw3TcrS7tC4vNo+NNmej5GZsb3JPyoZHy22 pK29Sk0xIxkXHjTJurKroqnCLyIpP7S0s72+wkEuJSw9Tk44RN/IXUjBr7hZND+sko2Snre7 8TcfGB88rKi02FNFLR4XGCNJvLWxqqesvTQmJ0q2srjQxc1RLyYqO2dRPjxJXU5Z3rqvvj02 2JaKi5S7yEpXKhcbJbOmqsc6OS8mGRYbLsOvrq6stME/KSc8tqqtx2lWTD4zLzVK5/tNZu3s 6Mq9xVA1MdmYjYyavlRBTSgcHC6snqK9PzEtJRoXGy+9qqqrrrvSOikkNcOrp6++XT8xKigo NEFbWFVec8SzrbDKR0DCl4uMlrZdNTAjGBkhy6emuzotKiYdGhwr2aufnqW0zDsrJTDlsau4 ykI5ODIzMT9OS0hOfNm9vLXAUTg2xJuMjJWr5EI3KBoaIFmro6jSPC0nHhobIj63op6msdc9 LSkyPNnEwcdaUz5ESEVLQzw7Xcq2trrAz8dbVe6lkI2PnsE5KiQbGBghRbGmrcg6LCQgHyIu 36ifnaGstWA4KCYrLDtJ/dXhaEpPRDo4OUnqva6moqezzmRoz72sm5SXo9YtISAhHx4iLl+7 uM5HOjo+QkVO5r+6vdZORkNGPjs6PVjOwszr39bf8/FbXsu5uby+xsvLzsjIvbe0sri2u8v9 TD86NDU3Nzg1OkJX4NrgY1lVYlA+Pj0+PDs7QXvMvr7Bw8nGy+Hbzbqytrm9vr7M3nDfysHD y87pYkc5MS4yO0dOT09GRT4+RUlk0sjDvbvAxsna5uj7YWdXTfviycjfXEZEPj9M58a/ubW+ 0fP66OjY1O/99e9IOjo+S0pRZNzW2OVVT1Rk69vfysLEx9d5dOTG6FtGRldW62F2711RTVRO b8rCyszKv8TL8/DydW5f6lNLQEBCQT8/T07sb3hYV+THvtLTy7a4v8VzdcrJbVxqWlpLRm/m 795QRUA8SVXZx8HKxcnU3NnPcXTh3t1XSFRKP0NER1BARHVk29jMx8rM38jHx8HWxs9Z6U5k WkpQUt15aOz6zHxdSD7r78q8wbnd3OpX4UVWV0lORV5MVVVCUExFU09d4uvKwLvAwM/aY/h0 5+tL39fK5FPhfWxTSvlhVeBv3utvwc3IzFrZXlvS0GdeW1hvTU8+R1pQRURV9F/i3cvN2N5p xtTcymXNzXJ9avbcX1dtZVrccPW7z8tfWsxhTTtM2XzP1u/NU/PuP0vmVW/bT11ORMroU8Zd yXXn8V3Sz8rVUtjqbMpiU/Ja8OZAUlA+U9Jf7cvkVkjDRXHxxbVSwby/2te7zU1DX3JRXkk8 RkllWz5M+Fbj3lpIarXNYmTmyd1fX9VY3t3a1WDxZ2tXVMvY+WD4zdL3ecXGzOho7NpyTlbq 2lxObmtPUFJJTFFa4tzZ3n7j3m9v1c7N4G367t3i22tMSk5RSUdNZuTc4trWzcrKzNTJxMnR 4eltXVVNSkpebF1YV15i4ftYVVlzavbf2NXh6/Hl1d1uWVVYZd/W3OF3VVZeZWr169rY4OZv Y19kc+zc2+H0fnFdXWPx49vd6Of07ndu7Nfbe1xVZenp7d//6vldW1NRTlVeX2/3/Hv6altk 99vc3dTLx83U19na6Pv882pfeGdo/mBZT0lGT2JbcN7a09rc3ehuX/jTzM7b2N5oWFZbXFtc XmReUk9j3tTd4tTKzexcbPvq4H5uW15hVFFSYvLi2NnT2N3P3XBv+uTv+W1kafPc8/Hc2eRp T0RCR1Fha1593+z73Njb2/nr29vefm/z4uTm4OnxY1poZ1tgaWttcmts7+Tc2Nbc5/NWV/HZ 1N3Z2eT7X2hlXFZYW2z+Z2VjWl5+7/doaX7j3+7rz8rN33FpYl1bZmJgb+bf5vRcX/Pc3t/N wrisWB1BqrrQOyVFvmJeT3zMWciwNSt2Tz1L899jw7jIt7KytkEvPfxtPje9wS7FwWi/SFdG Wsoz57kzu7Q+unq+vklbr1hSvzXKN05ILsA14H40vUvvv1bIxfXhuslSXrw9a7cut2E2tDjJ 0kXF0U5ByTJexDTHw0a/YUiwNMC8K65bUK44wLhA1so5y282v0FKtke/vj+6dznMTE3RSvHw OtFRQM0/R80/3LxOxdVfuEt6uT7Kx1fDZ+zLbdvvSHZNT2E8SGb21ePVWtPKfsxOzMrau0zj 1UrbPkJQRH1Pc8LyUudm2t5H39fFy0zt7uHdWl5OSmvf+Vdp1MTK31xV7uXXZ1TUzsnNc/Ty e/RNSU9Tf0pKZlvgatrI2sbhds/e3Ffm71VXT1Z52/Xl59/01M1fTlNwa2FpZftoXV3s81PT ycrS2cvUzOdOUlDd70k6Pf/aWERI9dLqXEzv7fbVfszIvry8t7u5wt9hSUU/P0VnvrGvr7XK STMpIB4eISktO2Ppx726u8zGy8bFzrzFxLqup6CYlp2qveU/JhwWGiMpOE7FrKSkttVXNCgf HSEuR+rBuL3G30cyLS46edDawaefprG5vtFKN0itlZaepKqjxi0ZERobICY1sKCbpbe42T4n Hh8lMDpE+r+vs9c9NDIvLCo3zLGusaynqLhYST4wLkCsl42Smp+lrjEdEhIZHCcuv6Kdnq7H TjUoHBoeLl/BtaqkqLY7JyEhIR8qPrqnpaetqKWtxzIoKjA85aGRi4+YoK/PIBQNDhggOtKm mpieuz8qIB4bGx85sqWfoaCkvDkfGxocJCtHu6KdpK2+ydtYRCoqNlm5r5qOjJCfrss6HxMP Eh010q2hnZ6q/iseGhofISlLuKKdnqazzTcmHRofKku+tKylo6vEPT1XZEkyO0zKsaOVkJKc q75FKRoUFR0tTbyro6OqxTQjHBkbJjdOuKmgm5um0TsqIx4dHyznsq2urauvyjsvPk1IMDFa uaCXlJWcoa3ONR8aGh4mMW22qKWtyzspHxwbHS3YtauqrKuoqsJALi4xMTU9yK+utcfX9Es1 LzZJW0NE9sGvoJuYm6Ssxk4sHx0eKDZgx7ywsLtXMCgkJSYzab2rrK+vsK+7VjMuMTg/R3TO ys1lYE1HRDY2QNzFw9PpvK+onpebqK7Bei4fGxwmLjlPv66ts2Y7NC8sKS1FvK2rrK+vsLPS Oi0qMDc7Ss67ushKPT4/NywtSMS9xce4rayrraOdq8RPQkg6LSUsQN7oUOLUvsxBMy82ODlB 8Li1ucPO08bCYD05Ql1dU1zfz/JQSjw4QklAVM3FurvCvr6+uqufqcDFz9tUNSYoMz1APFHO uLLNWFZdT0A4OWHQxb/Cwb/DeT45ODs8Pj5EYN3V1dxiW29eS1Fta+7Nz866sauhnaq8xeNP NyohJzVIW+W+tq+030c/OzY0NkTx1Mi/vsDJ8D8xLSwuMTpK1rmxr7nJ0NBuQj9O6sjAcly8 tLOroqi1vPxMPTImJS01T9bEvLavvuRQPTUwLzE+TWHOx8e/x1ZFRT8+QE7fwbi0tLrTVlFB Nj5IWcvJ+XHIvLm4sqmtt77iUj8yKi0vPPzgy763tL3fSzowMTY4REddysbEwMxcTENCTlf7 2si9v87Z4exnQzpL3W1BQVTu09zbt6KhrrK1u8FQKyYqMD5GSuS5r7bMXEk+PDgwNkNm1+jr vrK501RNX1pJQ0dc1NlXTGbcbkVHYntrXkhEUV/pvaygn6asrrPBSy0oKy42ODxWxbe2wNPf YFJANDE0OUBsyb69wtDtUD86Oj9HS13Xy8HA1fnc1OdjTEpTUFFh1rWmn6GqsLG5z0gtJiku MjQ4Rc+7ur7O3PhoRTQtL0HbxsK/uri+5kI7PT45NjtEYOXf4+HPxtZx5dfP0lVLWVratKah paipq7C/SC4qKSkqKi5B383Jyu5r7Vk9NTjprbDpXc3GzEssLEdnUEc9R9HF0NPY9tDB1WJn 59bV4GFsz8bFvbqzq6uzv8/lfVY/NDE2PEBJR0hq293l7+nKykk1NjY5Qj8+UXtmYWV31czO ycvHxsS6vcG8ws3L3FlVY2XfyMjKxcPKeUhBPz0+Pz9EU+HU3tHHx8ttRD9CQ0hWXHLf9Wxm Ukv86unF7Vxh9+Fn1szKxcnSx8PZ19Jfdc5wUU9KS2rjY11abNDR91JVZmftY1/n39PMxtJX cOBQSk1HTV/wX2jpVNDOaG1qakts22HdzPj51OJu13Bg0mVLaXZncevpzb7H3XDn5F7lf0/S yHd061145lxLSElOe9/f3OTdz+NgdW5k+1ZRfm97ztxbXnTv9HthTlf8aF3n3WHY7mfY5dTT 5fJsVUxZV/bQ4Ojh6frn1uvXztzvU0zq5t3JdlTe2udzW0pY2F5FUmpdWVBPYNrV69TXYeHb WElUflhkzc3Zz8nM09Pq7+1fYGp3/G7d5nTze3ZlTklfYF/02XxqycTL0HRm+3ZfSkJFVWJm WFLey9nT4FRYaX57T0pl0s/ZzsjJzs7OeVrV0G9OR0to7F1PV21xfeZeXdbOyszi3sjD1Nrg UFdYQ0c/PUZNU0pKbdjNyc3RzMfLy+Vdbu7t3vRQU3jk72JbUlZzZVBg+OHO3fLkz8vM1XBj 2s/d29hp3c1kSEVg7mFhU1JpaVFXfWZ4b2B25dvpb2x6dGzh6lZVXXbvX1Vn4NfXzMza0cXD xdXW3XjqX0hMVFvq5uDa6vP0ZE9NSU5eTk9gYe7P2vhrU2Db52p3YGF29Gv96N/M2//8eOPd 1txvYn/r3d3a0MzO611ZXvNhSEpb8mxYdNjOz+ZeXmJhZ2dge2xSafdoXFtv6fxy4NHYcWze 1s3X8PRvfNfa/mVjXmlgUFLs19ptT1bd0Ohu7Ojw3+n37+tkfONpWV9x4vhrW1jmclBW+NvW zczKzellZ11ZW05OY+54UkxPYHnm1M7O6/nt7dDHytJ8W+ziZ2p4fmRNSFN9ce7jZ+Td/Wno zcrpU1f51Nv3W3bV3F1BOkJMTFpr1sfLz9T4btHO4Glla87Hz99ecPJZX2p3YUxN+NzU0NZz T2ro4/xaWVL46uf07NZ/af3Z7Ec/S9/SbEFG1bzC4nfYvbzRY+vYXExGe8bcUUxP79NeU0lW b2JLSHlw8uts5dXMzMjYfGFeaFhNVPnK5FZZU+DX3enX7GZlW9XH5mXn08TOVVBe2c13U1ff 0fxKR1Jh509RVe/je1FNVnvX4MzMxMrla/nOx99YYtP6cG5cXEpPXF9JR/TWbVFHWObv333j 0cbI2XFz0M7f3s3K03JLUN/pXk9YZWrZ4d9OR/fde1Fu6N7sbuHKytva5lhKWFrc3k5EQ1Zd 7Gfw9OTgaN/m19vVz9B6R0znyc5XUGXdyeNx1cp8fmB6ytZdSlRlXPHWzMbYXEBFTF9KR+rX 20hN8NFKR27Pxe5f1r7h/lLu485aT/PbzFh7ac33TW3Y0HhlY9fd3e/qZ05aZ9nke+jMz+rd 31pKS2b5W2Tm03dMS/XS205W3szMVFvc1FU/S3vMU0jYvbrbVPrVbUJDYMXJTUJP2cxyZOPN 7GXdy8Z059/YaFzu8OBj5/rmfnBZT1Rc4nxMTk1efkZES+rQ1tz70e1abNS8v95c48rfYmnV 1v181s3i31he1951T2JaVExFTk7ua1hRTt3aXE7d3trf7tfCxFhV5cnLbEhn3uNPVODPzE5J YcnMYl/fx+pa6s7V329j3M/dWlx7Xl9GTFpKREBFRklFQlr3X2jEvsHt+c3GyMu7w8nIvri9 y9DGvtdKQk7nblRL8fRbVmJjT0Q6ODQvLC4xMzhATmF098rFz9nLvbWvtL7Lt6umpKOfnqls MC81LysqOmbP9lNNTz0rKzM4O0FYZ0Y4NTo6NzU9b8bLyravvL+5t8T3b2m8rp+amZyqxD4u KiUqMFzEvsDhTjctJygvP1jYy81TOC8uMDY9Pk1ZX+Xf0dXV1uXVvbOzusS9uK+pn5ubpr1O PC0lKTH60MTEy+NCMycnMTtHTk3v3kkvKzE2NzQ3TN3xUG3Du8HPybS4ym3qubmtn5eWnae3 9DUiICc5b9fJxslmOC0qKi43XszP2fdLMikuODw8QWdoSEjax2RIUty/tK64wb/AwcuvmpSU oLHERy0cHCM3TlrCsrLEPCwpJygqO9m9sbr7QTk7MC4tMT9IT/y6tuF2z+J177m6wcLCxVy7 nY+Rn7G7vy4cGSE2PUHQq6SwTCwpKSMlLlLLv7i920Q8MConKjQ7Req5tbi+u7phRsmxuVpa vq+xsZ2SkZ660f8uHBYZJjA8YbKmq9A6LyokJC9JybKst8zbUjIjICcvOD39uK2wvLzA+UZP zLvC1uO8s6yel5Seq7jJPyIcGyUsMUq7qam4UjIoJB8jKjrUurjDuLXSNSorLCwtPMmurbSz rK7UOz7Mvko6TLiuppyYl56ntdY9Ix4cHyYuT8OvrK7DSzQsJSIiKDZJ9MGtrLldQDwvLCkw RtC/urCtr7nDxcLHakJT3cy6o5mXmqCnrr8zHxkZHB0gKUy3qqqyucN6Oy0pKCouN1HJvLq+ 0kg6NTU8W82+tK+urrG6ym9PRTk4PU6/o5uboqWhpbw1KCMkIB4gLFrGvb68ucFaMy0qKiw0 XL62u7/E0005NThDUln5yb29xMHBw8pzTD9KRke5n5qdoJ6epbw6KiYlHhseLVHfz8G2t89B MCwrKikvVrWxu7mwtXc+OkE/OTpNzr69wL7AyVVCRlREOEq3oZ6foJycorpIOC4mHRwfKzlB a7yvtNJORDguLDFMy9vVvbO+Y0hKRDYuLjpFQU/Hube5ub9fSUhKUrafm5ycmpukvE00KB0Z GyApME+/sLTA23xGLCMnLzXutrStq6y+8Ek0LCkmJy88Zcm+v7Ktv0hUTjhFpJminZKPm6yv uDweGRwfGhwuzNzdtKzAQDg4KyYmKj1Nc76wu8fB0z01NzYzPVzRuKyoq7u2t1w5Psyrsa2c m6OvqKzZMC4sHxwhLTM827S6zNbeOSgqLjQsOsbbSfrEWD5GUT47SWxLWb+7vLi1usjiwsnD pKKknpueqKmxxzcsKCIeIysrL0nXZVddUjgyMy4sMT9DRGTh9f3KxtVz7WthX+zOw8HIv8fR z8psxKOrppudoaSot887PDAlIiopKTdCQEFKQjowNDQtPV48fuBVXttWWlxOUEtY9df0y8/G urzNwcf6ybWxqZ+gn6Gmqa+7wvc6MS0qKzAvLjA1MywpKi0vLzg7Rk5TX2VjcfXx1djOx7y8 u7m4ur/DxNBbWe7St7iqp6mnqK2yuM73SDw1MjI5NzU9Qz03My0rLC4yNDc6O0BKTFJ61cq/ ubWysLK2vsbL3HtbWU1GUs6+tqynpqioq62zvdBdQDk2NTc4NzQ0Mi4sKystMjtCSU5PXmdS UlVS6s3Hwb67vLu8v8TFzfdORkZeyruyramlpqmsrrG5yl9JRD47OTYyMi4rKScnKi00Oz9I Tl/t3eby9ev5eN7Hvbu7urq/ytrf5vRratvHt66rqKenqqywu85ePzcwLi4uLy8xMTIxMDM1 NDpEWPbPwsDL6HVrYGFv6tnNzM/Q0dflY1NRVVzv07+1rqupqKmqq6yyvdBMPTo1MC8vMTEv LSwuLjE5QE1bf+LwdmVmau/n5+XczsS6trrDyc3bZVhQS0tNeMS4r6upqqqrrbG71FhFPTk3 NTY4ODg1Ly4vMDI2O0JHSE1RVVthbWd/1dDPyL++vry8vcPFytPd/mxke8/AubOwsK6trrC0 vdFfRTw5NzY1Nzc3NDMzNTc5Ojs6NzQ1OD1GTVb1z8O8uLOzs7KztrvBzdzuY1Nb58zEu7ax rq6vsre9zF5BNzQ2NzUzNTc3NzY2Nzk9P0FERElQUlBaetfLxMC9vLq5urzA13pmUk1MVVtt 28m9tK+sqqutr7C1wtxYQjc3Mi0sLS4tLzA0OD5KSkNCREpHQkdVW1T2y8O7s7CzuLq9xs/c 7/Pe52JZ3sPBu66pq62rrLO+zGhHOzIuLSspKy8wMDQ5PUjAvzw3Uu5CMjx6XEZyvLzIu6+1 3H3M3ExMZ2laadXNx7erqKaioKGkqa+750AxKiUiIiQlJiktMjpGVGVeZ2xiXVho8Obgz8nJ xcC8uru7v8PHztfzVUpHR0hJT1po8c3BvLawr7Cys7W9xdHyTj44My8uLzAwMTY4Oj9HTlFr 3dXNycS+vL3G0dnrXU5KTFRia19e/+Hj5fx95t7d1c3Gvrezr62tr7C0ucl2STwwLCoqKiwu MTY7RFFv3tnPyMK/v8LHy9bt8fpfUE1NSUlKTFNeYW3vz8nIyMXBwr23tLSzs7O1u8LR6mBL PTczLy8vMTM3Oz9ESlBl39HJxsK/ws3nbFxWVU9JRT8+QENOcejUycPExL68vcHCv729vby7 vb+/wcfV71lHPjw3NTU4Oz07Oz9DSVdv7e/r8ejs+uxsXVBPWVpZUllcYebUxMC/vb6+vby9 v727wMnEwMPK2nRaUUxEPTo2NDQ2PUpr1tHLv8K+vLmqvTLxSjYiHCoqIR4rV01IvqmuwLmr rcLDqZ+lp5yYnaOhorZJOC8iGhgaGRgcJisvTb63s6mlqK2xuu0+OTUrJCcsLC4+/d3QuKyy wriyzebL2s+poauimZygnZ6sw1w0JBsXGBYWGyMlKknKuqyop6eorbjSSzcsJiQkJyovO0zL ubmtqK+5tb3+XMSyua6fm5ybmJylrLw/KSEcFxQVGBoeKTM6d7Stramnqq+40Eg0LiokJCkt MkPNu7Oqqa+ssMnIZT3NxsyqpJ6bmZqcoa24Uy0mHhkYGBgcHyMrNEbHt7Ctq7C5vM9LPTIr KiosLzhNzbizrKisrbDA2FNgw73Cq6eknp2dn6Oqt1k0KyEcHBsaHR8jKS49ctC8trOvsbm+ z007MS4tKysxO0zKurGsr7CwuMDT4ri5u6iqpJ+en6CnrbhbNysgHh4cGx4gKC0yQF5uwri/ trjP31g3LywqLCwvQlzJrq6ppKirqrDLzMbA2b60s6mqoqarrbZnPjMmIiEhISQnLDA5VNTJ w7q5wMPPUkc5Ly0qKissND5KzLKtq6irrKu3v7++xbystKimp6CmrbDJRjsqIiEeHiEjJS0z QezNw7y3uLq+zd1dPjEsKCYnKjM/acO3rqqnpqqrrr3Pvr/Is7mrra6oq7a7y0Q3LickICAk Jio4Plq+vLuutby3xVU+MSsoIiAjJS09TcWvqqWfoKSoqrTJ8GrOctu+tLKup6mttL53PC8p Ih8gJCctPVvXvrCvtbK1ymZGMSkkICAfISgtOHu+sqiin5+go6exw85XSte+1bSoraqlpqu1 zVYyJSMhHR0jJSo++dm7rq2vs7jFSDYvJh4fIh8jLz5yva+opKCdnqSnqLTOzfg7Nz9APFXB ubOsqamsra/AVEAzKSYnJiYqLjI2QlFMSk1KOzU1NTEwNDk+S9y6rqmjnp6kpKKnsbW8Zzw6 Ozc0OUtfU+bAw8q8vc35VE9FNS0vLSsvOT49P2/O1snJ3933Z1FNTGbkU9e8uru4sq611bmy zvDYW0c7NTxGSEHsek3T2Mm/xt/Qxmjv5Hp+UEZbdUhMX09DR0lLRkj5yl5S98nOcNPAvs/Z xdPx6dltSkr92VxS3OBTVvDRz1RQ30hLfW3Y4e5ed81M2ltYxP1Y2svq3W/NxslYfcteQUh0 WVFP7Mt0P1twXWV22cjWaGZ32Ghx3W10Uf7h335a3d5iTVX42eDQysxeUN7E1lZO1upGReTB /mXX39j6dNDfVlT42NVjbORZVUFZXmJfeM/vXlfn3k9T3Mza3NXL0enOyr/S69piW09ITEBI PjxHRGTRz8vM4c3X3NTRydnl5F1WZNvKz+To0uFXXu5uSEVQWWRMRF/T+WRv7cTGXOa/3WNW aNLuT0hN909Vb1/SU0p/2cvb4+F5zNnf5+PJ1MrQ4NRfZltYb1FVUdlaQUE+XupeXvzNz+/e zcjWe+LI7G/V3cjbTXDfTD1GTkxXVkpmXX5lafjiws/Mx8vCwLrFytJvfXdhUEo+P0RHTHBj T2b76PXcxcju3eNSX1dodVxg3tTa28/O6dFPSmNJSlFaYlpSYt/S4nHZys7K397N5XZiYPFs ZXZxes7Z2sjc4t7d72VbUkxLUU9nWVVaaE5SWFdp1fFkXm/zZ2h12+Xn0NXO3tzP2NHVduPR 7nZufGtPfWhR017mx+/r1OjQ2dXb2d9fV05AQEpKUE1EU0xOUk3+z9fr3e7e093Iy9bEw8LE ysPeblRQSklXSlZrdtnP0OfX8P3hXmVrT29oc/NjYW9vau1URVZYR1BdTm/Y0+DV3s3U1unU z37Q2erz299jX1tPW2Jf3dBcbdPS2W9k7/r/T0JcZ/jvWWXV11f01d7obnHr3OlkVe/PTExa XuBJRmrO3HjTx8HF3Xbt6P5sZnDj4HNg4tt8YllLU2JTU1dkYfj08s3N39zU0M7lXFfv9GRq YnzqYFNe72BeaOXLx+pi59HnXUpNX2ZYXeLP1tvV0NPmW1ZjY1FPXvLnWk1d09Ju+9vP2WxY eOh0eN/W5Vhc3MfK1erk7mtoX2f4aVVJSE9faVFNSEFASHXXd2zawsDDzcm/vcHO08e8wcvO z9lfT0dCQz47PUFM5svCv8fXZks/NzAsKy02Qk1T7MS5t7q2srjOffve07+sn56lqaiquT8n ICAfHiArTrWpqKemqr1BKyIeHRsdJCs3S9q3ra62tbO6201KZ820nZeXmZqcn64/Jh4bGBcZ HzXqvK+oo6KrxUY3LiglJiw3QEVQ69fcX0M9QD86PlTVubC0tK+ur6ugnZ6jrK+zyToqJiQi IyQsPvzOxLu4ucNuRTs1MTIzOT5GTFRcVEhAQkto6W/wz763vMS+wczNuqigoqalo6evz0g4 LycgHyIoLjhNz7u0tLzM81tGNy8tLi8wNTxJVujOxsrNxb+/xsO8uL3D1d/Oxr64sa6ura2v uMbgTzwwKyoqLTI2O0JLTldhZXHm4ef0Y1NXWl1kV1BSWF5jburWzczW1s/PztPd4eDa2tPK w726ube0s7W7x9f0WEQ8OTQxMzg6PT5DSk5NTldkY1tTVVZPWVpZbtzMy8rM1uby2tff5uze zs7O0M/GwcbKxL67ubq9xs3X7mhPRkRAPj09PD09PDo3Nzk8Q0hReNfLycrKycrP1dba297b 2NPY29vh4O9wY19peN3Nwby6uLe2t7vDy+JURkJAPj0+PT09PTs6Oz4/PT1ASVd/2Mm+ubq7 vsfN23peUlFSW3v95tzWycjO09POztXT0MrBvbu9wMTM22pOQjw7ODMyNjo+QEZMVWTp2dve 29bX1M7IxMTGy9PpZlZMRUVGRk1Ybnnm2tXY7+bQycG7uLWztLe7xdD/TkI9Ozs6OTc2Nzk9 QEdRW2/e0MjAu7e1u8PO335cTUVFRURCQkRISUVJV3jaysG/wMLDw7++vb7GzdHNysrR4W9i YFhNSEVDRURERUdLU1ZWTU1VYVtZaezne2dfZfztaVVk4trd5+vn3dLOzs3LyMnKycjCv7/D xsbJz9fnWUhFQj89PDs8PUFFR0ZMVV767dXEvru7wMrQ2HRQRDw6Ojg5PEFMZt/UycXAvr/D xcTGw8TIxcG/v7/GycjHytRtTkU9OTc2NjY6PkJLUV5qbXxm/N3U2fPy5Nfedv3l6HZeWVNa aePPzM3JycvIycrKyszPzMnHyNHefFlLSUpLTE1RWWtmW1BPWltdWE5OT1pUT01LSUZJTlr8 3d3p4tTJwL/BxsjIy8W/wL6/wsfN1dfP1PhYTElCPDs7Ozw8PUFLV2r+9ubd2NTV53t0X11c W2lta3h38NzTzc/OzNHT2NHLy8zOztfY0s7P4H5rU0pIS1FMR0lMUVZWT01OT1ddY2JlbXXw 8OXSzs/S0M3N1trc4eLf09Ld4d/e3efvfW/9bl5fYGZnb3dlWVJUVE9OSkNCRktRX/bb0c/R z8zFxczS2dra09TY6OXpc/F2cG9+8nRfbf7i3W1jaXnz+3pxcvX2YlZST1RUTk94q64yOStI 7z1MTFZvyby7vb/Fwb+9ucPX72HsyrxONSswOjE5St/b0s/DusC/zup/auDhT+HMraxHKyY0 R7tk0rRidzo0Y9VHRU5W1sLD0c/PxcZiSG7T0NXayb++yvh+5t1oTEZMZ1pqbWfy625tfmpP Rj1AS0k/QUhNWG/lzr/CwMXM1czXb23p6mpaWM66s7e6vr27vdBZTWvBvMz2WlZCLiUhIyMj IygzTdfMzL64usHKxr+9yu7nuaGXlZicnqCqZiUaFxkbHB8t9q+oqa2vs8s6KSIkJyksPcmy r7rVc09AOTI4RmTXy8K1qqast8ZeTlbOu62mo6WprbjJSi8pJSQlJygtPFfh1M/U1s3V71lN WGFiZ3L37/xjWGPi2tTV2d3d6W5bTk5MTFBVZ9/SysW+vL2/wcHBv8DBwcDBx8zYfVdGQUE9 OTc0Mzg9Q0pLT1lpefx5XF/e19jc3tnb3/hufunY4flvXnbb09rs2szJxMPEx8jIyMjHxsbO 5V5STkhDPTs8PD8+P0dd/Xrm28/X335SSUpUYGr85N7f4tbPzszHwsTKzdLRzcvQ5OPX3PhZ S0hGRUhJTVhdYmR6/m5v+3NoXFpeXl5bWWfp3uTo2s/P1dfTzcvP1tnf1c/PzM3P099wZWNf W1JIQD09P0hNSUpSaH5p//fz5d3Wz8zJys3V19rY2d7Z29vr49bc6mtUS0lITFFWYnnv7uLX zsjM1et6fG9iYWBbXWh3bl1YUk5KS1VXUE9PUl/q187Lwr28vsPKz83I0l5WYPvj53doXU5J RkRHRkpRWV1oet3Rz8/X2+DpfmllW1127eDP0NLZ72heaGdrYFleX2p3b3358Xd1cO7c1tnc 2tjUysbN1elwV0lDPj9GV+3d2MzHyM7b3dzrfGVaW1dORD9CSU1OTlNfY9/Py8nCvry+w8rQ 19XW297yaGRaUUpHR0dJSUtIS05TWWrk2M3Ev8LGycjJzNPd3e5iTktNSklKRUVKVl9r6Ojs fffr6N/h4eXr29PXz8/R1PZu7t/ndHRrcPtqb3tz7N3i4Ojy9mdPSEhJTUxLVvbXz87Jx8rN 1eJnXWn62dbe3tjY3XpZS0M+QUVIS1JYYXffy8C9wMjKzNTf7nbxbmBdWWJveu19amhr+O7+ X2BfXHbp3+Xs8GxYTkxZcW1fXV5kb3vn19LPzdPb72loanh4dHlvcW168eTg2dXW2+jweWhp Xmnv+npfXl5gef1nYmfu5vphWlxeXlxZWGZ2/fx8eWzr4eHcz8rP297b3d7e4d7sbvd5X1RR V15bZvft7efW3OLh4fZhWlVQUFlaVVJYZW7v4tvV2NXU2+Dv8ev08+3z7/VrZl1f9+Dj8PTi 1djt69vb3uh2bmVhX1VRUF1fWFFPT1Vo6+Dj2dHNy87V2NPR1uDe4P9yYVpUVmBaV1NLTExN VFlh5M/Fw8bL1Nfa3dHP3+N+eNrXTVJHR0tAbF1FS1HDvepi7cvIz97J1b6/VUUtLjZEW3b/ ctbHws158uXSyd3k1sO6vcfUzM1ZQT1JTUQ/O0pU+eff2t7O3ltOTU9NT0hEV/fIxthv9MzA vOg+P8+3t8HVy723u8tkRkZZ09RrUE7TuK+35zkqJyMfHyIpOVFYYFnrzcnfYNK/rq22rpyO iY2dRx4dHh8aGyXNnZiduEMuKiYeHB4pZLOxzkg/ST8tIh8mRbisrK6vr66+YDoxP8ufko2N lqdMKBwWFhkpz6Kbn61OLCAbGyZ2r6WpuVk4Mi0nICApOVzrZFHmvcR9Pj/Ps8JKOsaThISO tSAfKiwdGB7Mlo+aXx8bHiAZFyOslZSkNCEkLy4nHiM/zMdDMDvOsrj8Q2WyrLRXLTuri4OI miwcHickGiFBmo+XuB8ZGR8fHCH0mZGbYx4bJDMvKy1ftsM5Jy3tsLdNMTreraa3Rywts46B hZU0FRsfKR0iW5yNl7kcExkkLicrYZ+Tm8AeFx46z0k3L0pYOCYhMNyzx0VBz62jqts5Lz2w joOGkzsZHCUzJS5PopajRRYSGSg0Ki08rp6ozS0oO7+vw+1U0N4tHhws0bh8Li1DuqiqxUg6 PlKmjIWKnCkZHiw4Lz/InZyqMxkaJD89LSg2r6i4OCIusp6wLRkcP8xJJyQ8r6rYMC/bpZ+4 LSYuSaiNgoeTMRgdITgtTNufmqxBFxcdLDYqKjK1oarmLCvcpao0HBkvub07JS7VrdkvKjW5 o6XDPUtqxKiPhIqZJRQdLNM5SE2mnLQzFBUfPE8uKjO2qbVCJirPkYuxFQYPxJqnKiYrq7Yr ICPApKHVMTTfrK6biYePuxUYJvHfUEnNnKOyKhshMkknHR01rqWxOigvvKrFLCEtyb08JShm s7w5KTS+qrLbXMSuwDsxs4mAibYQEC+zzSIhPpaSqx8PGjjKKhodY5qavh8YI++kkps3FA8j vqjNYl3TuTwpJjq5pKO0vGA9OzS1jYaPrB4fRtgzHyVMmpyxLR4pPEEgHSm9n6w8Hx8y2bWb mL0kERk7rrG/bkm+SjMuQ7eqrsbQT1g/LC63i4KLqhoZK0stHii/kpSsJhgeKy8cHCm8oKw8 K026smI6QsCvxDotP/rG301PWEo3O3a4sL/IbEE4KSg8pYuFjakjHCUvKSc9rZiarjEhIigm HR4s17C9+GvdyVE1Lz3Uu73bxbm8cjo5Ss3TTDtHvbblQEBdXzklMKmMiJK/HyZAWyskN6qY nsYpJi4xIhgaLbeotPVxxbtaKSY8r6Kkrra/bDcpKDb97UY7RtTIZ0U8OT89Nz63mIuMmsst LS4pIy/Cn5ypVC0rKiIbHChstbfFvK6tyTMoOLyop7LNak82KCUvTN9ONzM7SFNMRFnT0u9H XrGZjIyYxC8uNSwjKVOqnqTINikjHhobJ++uq6ysq67KOy0xPmbe4czAxWo1JiIlKC89fbyv tsXV3dXW+c+3raKblZObuDkqKzIwLjZTxMJkNS4uLywnJi/graSntczyTDMqKzlwzuNaSVVk SzoyOEV9x7Wvsra7ydPW0M75WO+3n5eZqMloV0UsHx0mRsjG/1jv8EItKDN1w8xcVeLGz085 NT5OT0hIUXj6fOHLx8HGzMTAw8fJw7u0sbK2vc7wTj08SvPT3GRkalpGNzI3S9vU32JWXFxJ Pj1KdvNlT1zYxsfSd1NNS0pHTV/Xw7u4vc7b3M3Jw7y2srW4y1hDP0NGSUxKRT49ODY4Oj5J YNPMy8fHw7/BytbX2ndYXPTZ2uRcS0xOVlJadd7Mwb3E0N/q6ufc3NPUz87dVkE8PEJHSEpE QEVHTWD+7+Lb0cjExMbFwsLEzNrteGxocW7n8F9PRERMdsq+ubzH4l5hWmJq+uX8Y01HQ0NB PDk6PUZSX2hneNnMxsjKxb+9vb2+v8LGyttqWV3+cWxfVk0/Ozo8SGXg3trZysTGzNbY19Xi aFZdZ2lPQj5ASE9SVFt20Mza4+nt6N3Y5Ojb0MnFwL6/x9tmWE1HRk9aWVpXX15WW2H45Nvc 8/jYzc/Y3XRaV1VaVFRo+GBVTVBo6+Lf6Hji0c7S2NXLxsznamhobGNeXFZZWFBQSkdLTl35 1MjFxsrOz9HU19bRz9nn7nhlUkpITFpYUE5TUFVYT1ps3tDY19bPy8vLzdZhTUlIT1pYUFVs 19Xd7/ft79rX1tPKx8rR3eTq6d7qb2FYUk9MUF1ZS0dHREVPad/Mw72+z3z59Gxqf/D98Or+ X1FQUlNOTFZ63tXW3d7a09XSzcvKy8zV4ubr9HteVlFOT1RbUktFSE9QUlh55dnPz9bUzszV eFlWVVlZUVNk5tbXzcrIyt1vW2jt1uJ9a2l58e7/cO/se2pea2xZUU9SWuvV1uDj5unf29ja 7HVrV1tfZXr072ZZUFZeZ/r97OPU0+Z8c/Li3eDi7+vr8nL+3djge11VXHBpZmh55+NxXVVd 697c3dTPzc7Z8mJdWllNSUxVV01KT1ty49/a2tTMz9nY0s/MztvtdnVlWlZbYV9eXWNeW2n9 4+LvbGFeXGjo2Nrg6P9mbOTc2t7xeP3f2NxuWFVVVlJXXFpdZ/n458/KzNLe3Nvo2tHcwq5l NzM3b0s/TlFNWdzOz9HMycvOz9DhcWzz2+lfT0xSWEtJV2rtdm/n3tp899rb3dzZ5ePU1ur+ 7ufb+Nvs6Xdb7VVQS05aXul0YVd+XWZ/3tTV79xdV+zg5V5a5Mi6ts3eT0RIVuXScUM+REtW bdLNzvVbW09NVG7i3Nvd2NrWzMbM22BcYmJhXvzZztfZ4PJnY2ZMR0pVVl5oeOvaz8vM0t3o bWdXYvLr1tjp9urqcldOUU9RV2JebvHl9Wjq2NzZ2ubm6eXa2OLZz9LT4XptYFZaZV9cXFdw 8nv+au/U1N/sbWv88HRiWl1yX1JNVF1v933q2OFtY3DayMjKytp8cfDe92dzeO58Z2FcUFJT U2rr19Ta4+jX2t/i+nxsV09RTVttemtXT13g7nZzeefi5enq6/7u39/o2M7S43xz7t7e8mVX W15dUlZhcuXd19jd5X5rYVtYU1Vu9/Lm3d3c8OvX1NLW5V5VYH19aF5XUlxiWVBWZPrz79zQ 09bf3NbRzMzvWFdhZF5fXFljfXpkZX7z7+vj5eff4Ot0b/zf5PXzemxr/W9cVFBUV2b87eX3 +fj26fLo535fW1995+7s7ePU09/wePzk3+Xp5OzzfV5XXnFyYVdXXlxob23q39ztaWpj89jQ 1Nl4YWptamRsdmZdWVtnfOrl8eLUz9Ld6PPt4tryY19q+Hlu6+Ds4+Z0XFBba2dhZ2t95vtn ZXd8ZV9qfebc2dvc293W1ur/7uvo+f5qXF1XVVFXY2ZlWlJYZO3e3+ru3uLm4drT19na2d3o 3Nrf4u/zb2BaU1JOUFlddX9oVVpu5Ofw5dvd2dbf5+jyX1NPU19kamls4tnd3+bl3tvj5d7b 1tnmdmZ55OlrVlNdYVlaXXLe5/ty/N7f62tdWmF/6vDo19PR2u5lZmNhX1595fp7b19pamb3 6XljaPfq8O/f2NXX5un37+Xo6fN7+vl9bWVtZmVra25mW+FnX1FUaXXt4OPd3uPg3dfc1+bs 7NvU0dDYcVpWUEpMUlVXWFdecO3X0t7m6d7a2d3p4t/taV787nJoa3Ftbfb373f7e2hwcWpq efbp3+L9bfXp6fL0//Lc2ul09d/Z4m5cXmheXVtWVVdaYmv74dzo7urg2tbkZFVZdev6aube 1tbe7Hzs7HxfU2L23dvp69/g6eHj7ujrd2JdYGRiYWVhZV9r6uxpXVhSVlhaV11s9NnUz8rJ ytDc3+H1d3ViYmNveunqb2FeWl5eXGVxfvX38NLM0Nvq4OHj/VtbX1lWV1JZW15lYmJtbWNb etjb2+jf2OH359nV3O39/O99cWBva3Tm6fFzaXNsWWBoandeXGNbXnR3+Gv93N3b4tzLyc7g 8PXo6f9qbHPu4N/2WllVUE1LUllaYVxWYOXV3N7i29fc3d3x7OTe2+r5ZWBnYu7h183N1/Nu cG5pVE1MTV9ubWN63tjd29bW2et5b1xdam7z7l9PXOvedVVl6vZ+b2Fec+bpbmvn0NHv9tzc 6VVZfevm/fDucGL61Mva921jal9q+npuUk5fYuPlemNOVXP//V5j7OP6ZfDMw83U19HY9mhV VmNsYUxOWHro7OTY411iYPvd79bMz9z54+lmb232eUxITlV1Zd3a6+R05eVr49bR2OrQ1vNe TE9dfexhWWR93u9zffrk1fPp7OTX9urn8mtOSk9R9+xw71p33+3b2srTZV5Z39ht+uLe32Za Z97W/WxQedd962hY8/fp4Vz97lp28ung/mt2U1v538bJ0Mrd6XxX81hXVE5OTGRcZmBg93vu 4Hbc735xdOrg3mrt6fxsWd7G5+/fy7zoeGhd5EZGUll3Uk9g3+x+dt3M1Gje33ZhS2vpfux1 1c7ndGJp+3hZclt08194bnvb3dnY/ulo2NHi2+XS0WlXU2z+SkdSc1dMU1zu19TK1Vzsb+Du aNbJ3vdi2dZiUuzO9E9L0d7ZVk7d6OpMT9bJ21BP6dxr8eXYY03k2eRkWedgTVVaytdlZlrN y8zS32JdXVleTFhxX3fPztpeSWxtXlxb3eL9X82/x97ZytZfRmDje1ZPUO3efE1RT/3dWtHv 08rg6U5VfW1kUm3XTOPc3NLnxNp2Ruvcb/dLXnf20cZq2Fnq5Ub2SXllP2VeTU9az8jcy8i7 2dzfxsXtXmFj7VhG33F8S0Rf6dPoU+tt3t5lWUVaXV7pR1LDxN5N1L7J0ePqaWtcU0ll5OBK T8zeVPHWwNg/SOHQ3V9V2Mx8UvHP3M5N0tlezeHV+z9eXmRROmR0V29l12FI7dTG7lbN3M19 9brVznduzk/M2lrcO0ZMO+1KRuhP2d7cyMvVZt/B4djL2MTu38g+PD5GUDtO5dRSUMi8y87c 6ftHVMvVevvjzNB8519220NLUVS+/fR1VMjP3XpHUdrb7EZ66czcSv3fT3xyVM9Y4dTNwnZz Xc98f0ti309ZP0bLzsn7eGxNa+JpZu7gztzEvPrGclhFN0j4bFjQ3sj+7MbvSk9F2987atPE vlTFtMpiPlBoP1dN61FOv+jcaczDbkJI/k82SkLe1mO8yNy+yrrCZchH1exYxj9DTjdaQEy7 Rz036L909te/xV7Ot7rE78m9505Q6dw3PVNMST5f2c3e/NLpRNhd7dtE6lrMw9rz32NuR9Xt QkpSwdh1zcrO2kruzWFbcWfXYvvF21Be3s/jQVNNcFpa2tlgdde9y2hl99tLQ1VmzGVZx8N1 QnDZTD/nv3g8U7zAPT++vno2WL92UFp+1fLT2P9WVcfmvm3Ov9rHSGbYaE45Ot5eXnxS3kdR 3GXZVUPRyk1WYbe8fcTExnXzw1ptWEthP+3oUnNXzsldzuHsdkxDQeJTUklPx8VDSsu+vz9V vcpaeMO1Q1zI0XhEZXFMQ77TUEBTuFA4RFtPS0zwwc7Ow768xszQ9U7CYl1BQMjZYEhIXXU/ S01e20VV0dZT6t/Kfc67yszSvtpKcbtYVULbyDBObGP3PdLtR1paxGY4yLu5yErT3lxwUlxU W3tt18LacGrZSD9hxss7OMDJyNRZr+bSYFPPTXZCTHVWV0RLVM/zz1r3tFVISeu79TlqwMJP XcTB6FRiTklOQl3k48vhw8DSTF7h9kxMwrt9St+7t1hOVfdLMUBLSUlE4b1E0c1+xE3Iv3P0 Vb7KTtHPvEo439N8N0FVeU5ft7r3WOC/zTxd/FxIPtjDeljPvmY+VtNsQkTf11fEvr/C3M77 7VZTQ0dDTMfgTtXP1uo7xNc+T2153uljwMvow+TH10FNTFtYMU/w0ulOzLnYdePQzT/R2fPh PMLFVc13aNM9f1c12dDK4D7Ky1d0ZM9fXcHMTF1NzGo9T9lxfllI1s9+eNLBwN9IycXny2z9 623oTGZMS1NG30JsTUXfQsvpY9/GvrrBwMnV7jvOSkc/P8P1PmrCsVg013feNjRoSsrM09m7 rL5o/bzJSUZKS1tvUuNOUupR0154U3TNe9pDUWPwzlHR4/HH1M3mYtJnTM3NwkhOxGBTRMbw SlNATUZW4mB9vPTL1dLG3lW+3l1dT8nlYEhLXPhdXkR72mLIb9/qeNrOT1RIbMRYVNazvUr5 zsRKNWbZRkZO2r1K5+pB2kRleEm/01fb2rvMN9284m1M4s9CTOjey8fN935O2mRF3kNjUj9V UNLT2tJjy9hn6EfvXVq9xs/JzMjLVH5pQ/FIcj5LUOpoa7/S6VbRz1Jc0cvcPEHaRd9xWsNP b8rz1N9XzlpGUnG/b9B8ysji19vYTtFeT0hcbVBQTsthQnNc5dD25t94yd/t9FzbztTkbNTM XuZ2TFVDVk5CREnY2GTa1s/A9f25bU9oSr5ZUMTr0NVOzWZC8UdRdG/Cb0jjz9lNTOf2W+Rh z2Rdy3PFYt7IVV1Q721HUFjo7XbDyfnJ2NPuW9XYTUdCQ2Je3etO1s9eSdnVyn5QftLdfM3B 621348xXQ8/nVE1IXetqU1dDSnXW1Mzdvs/21Ne/1lTfzOhHP1Hn+jxmx/tRSl/8REbRzez+ 07/g4s3R51z30FY6c9TYUlLF3FheYddkQn7sfuxtzc/cyMn82NhyVEFHW0FI7PTjam3R+U/+ 3s7/WU3R18/YXMnM6nBd39FOb3Zt61TYzHVtaufZV1R6/HFkW3hnVPjb6nxWXe17WlZU++ls 3c/c3OXczeHlz/LiZWrjVlV96ltFTtjjV3ngzNTrz31Y7N7S2m/hfWF7f/lXVV5MSUxi7GF1 19zZzdbZ9/7T18/259Haz9bwX1tjU0NISVFv8W9ZVm/hftfV6mtg4dDa5O3f2Oz10M/mVltf SUNd33ZWWczK3urPxtt68ftZSFvt3HtdaPnr+VxSVVd8ZVBq3MvQbuHN0eFfYG5eYV7j2O18 fOXn62tr3WxXW1Bs6d/V4vDk2ezw7eLtWVxvXVZVX2laUmLt49fW0tXd29TU2/Xmc25hUlZ9 92FQSVddXmzt8u7mzMrZ29bN1O10ZGNs/GVefHZpXFBPTVNo/+366fPs7d/T09PQysfR2dTZ /FhOU1FJRUJMXPr0bWBv4fv9dWt89+bZ3dbTzdDU1d7V2uduWlto6tvf/nh963JVS0lNUU5L TVt549XX5evUy9Pidmx1593n19PO1G1dWVhiXFBMTU9TXHnYzMzM0NTW2Nfr+vt47OZ2bGNa U05OTUxUXGpod9/Y2tTO19/zbG9sXWzv4d3Z2/T84+Df8PXqb2pnbF9bY1tTUWFo79zi5PH3 5/NdXG3v49/l/Pvm3uhqYGvt4uR8cGlrau7f8eHc2N/X2c7O5WNVV1BJTVpORkpf39v5/O7d 3Op05Njc5uzl2uro1M/X7/vi2eHt4tjdXEtLWWBfV0tT/t7qaltgbvp0UE5h3cnGxMjdeHRe VE9c7PNtdvFUTElGSk5v1M7Mx76/wMLGy9DT9XdtVk5IS01KSklUTFdh79XQ3lpcTUdDUPTZ ycO/wMHK1uLd23dgeu3v4urraVxhWl9m+u/e22loX09JREJBRkxYa+PMzs3J0s3Jy9lnWVBX ZOTb/Pj44tfT22/h3tPbY2dz3flbb9zV7WFbTlBZZuftZl5ub+Th6HNjaWxlSlR4cvnZ3M7I zM/V19XjbFJNT1FcVk9MT3n0+Pfi2NbLy9HUcPvg/Ghed/VWTEhP7czL0vlsYlRiVFBj7+DR ysrdc2jq5t3aY93c7t16clFYaGhfW2hPTlVd8Xrf6v55bNtgVFZb59jez8/Z0dbP23vg2Fxe Y/fYftvmcWFcZu7eXVxZYlVOWuHpYXXt7uNg5NHSbWPnbl5TZ3Ps7nPXz9lmVX5dTuLP0N1n eN7c3NXP2f7k6WROR15mT0ZdVll8Y9fn3MrKzNfKzsvOWk9LTU5KZl5aYW3R9mJh4dRSUlt6 xNPe+HXqek1KVn7Yz9LOzNx+5OFh8Pnd/eXTbFlMTlplZl7Z4n3oTfrUTU9XYc585MDq3sbN 3/pP9lVBRFx4aFNZxcjfWE/vUEJT0M25v+dvUl9Q08XMUkzXyWRJ6tBXWu7Q2M3CUkZE3HxM SP1uQE12ztZs+9hyWmVV9dvP7GNizs58eePO215VYFhGWunI3ejdzcHYdk9S0OFbXurfUFJ5 XshyRFNa9u1GR+r0auBu7dh1XdPi0MLqacjC01xKXG1VS2Ta4eLS70lGUF1WT23i32X6z+bi 7W/q3mzz3Vv83/nnTktsz/1YatLK3Vl2z9ru82RlX2RbYGN42ula7fRzdGvm4N3s3tzT62N2 51hYTUdWWk5MT3j8eX7lZF752Of4387DwcnLyb7E1dvQy9hw8MzSdlNUZE4/Ni4rJSQoKigq NO+/vb61rbC7uKujn5uYko+UnKa5/TglHh0cHBscHh8cGBUXGBcUEhgeIyl1qI6AgICAhYqN Ug4CBg0RHjiVhYKJk6pfGQcAAggMDhcuzvI1Li8gFREWI1iqioCAgICAhY03BQAACAwXQ42E iY6ToB8HAAAABgwQHnywv1A0IBUXIixlh4CAgICAhI8PAAMDAwYoiYCGjI+Yni0BAAQBBAot sLZUTksjDwYKERgk9YCAgICAgYa2AAAGAgUKm4CAgoeLkzoAAAAAAAMcpaG6yq5LFw4VHSQy T4KAgICAg4a6AAANAAADl4CChYyPmEQAAAcAAAU1lrBGu6kkCgcNFBsmPYCAgICAgoW5AAAc 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 gICHqdC6HwUFHBkPKZiTmaSWmU4aJRsPDhciKyzHoKzT/zodFhIXFxQaNkNGnYaAhISAgIql rUsOAAMLCwodqJeblIuMnuxKJQ8ICw8QFCi0qrOsp8UxKSoqIihFz7+nk42KjIyNk6HoNCgj GhokNjI6Ybm/SjlnUy0jKzYwLDZURzo5ODIuMjpL+8m9tK+2u769vMjOv7u4r6mlpaiqrLPF 1OxPRU9fST04PjgtKy4tKiw1Ni8zPUI8QEpIPENa8vK+raqqqq23v8b1QD5O3cC3rqqoqams uc3wUzsvLi4xNz9HU2FVTkQ5LywsKykrMz5U3si+vri5vsC+02Jryr69s6ikqKuqrLvadEw6 N0VQRlfVzlxCSUI0LC4xMTA7UEpH6PZEQUlFPjtE6dPEsKqpqaipssrPzlpMaOzh0cK4u8fL ymE6MDExLi46PkBb0NLoW0dAOjtGRkRd1MrEtK+ys6+vutXd90tETUc9R05OVN/N2Pvk5kxB R0k+Qf+/ureztb/K5k07Nzo/Pj1HdszJvrm+x8rRTjo5Ozo6QFTszcG8wc/SzOBYUWrr3MG3 uLm3tbzbS0I8ODMzPVDCSzVDQtVXc8bsVnjY8Hhf8djd29TLzMnVyMO8rEQtVkhSOuu13U29 rtFJU1NBOFSmqk04LzYrJTo2KTLYvrizp6CqtLW2urbJ7DErLCwyPmPJyre1vMLObE9IODc3 Nj1KTVZYV2FYTPjS2se1sLWur6y72+5VOz5YXkdIT01MQ0ZYTEBJT1P208a7wsm9vdZaTURA NTc/PDQ5QUlf7M/Jvru6uLaurKusq66zus5oS0JCREI/RE5MOzAvKSUjJCMjKTU4LTFMR0B5 u6ecm4+Lj4+RmaTaKCMaFxogK3y9r6mrvGg1JB0YFhYYGyEqM0rm6FlpUz4+t5mbjomJhoyP m8MfHxANDxgeScmkmp+prOYpHhcWFRYcJys/62dadGE7Lio1NNuZl46JioeMk525Hh0SDg8W H03Jp5eeqKzaJhwUFBQVHzQzVra5ycraQi0nLCs6nZySiouIjZKcth4eFA8QGB9A6aeZnaSj ui4hGBUSFB4pLG23ub63ukozNiwfJ66kn42MiI2PlaMyKRwPEBQZJkivmpybnKpSMR0VEhMY HSU5UGbNxWw8OSkoJiLGn56Mi4aHi4+Wxy0lExAUGh81bKelpaWtQC8fFhMUFxwiLD1U5eZs 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 BggRKcGuopyVk5vKHRANDxMZHzLIrKm4SisiHx8kME7DrKWmrKiRg4CEjqGx1DYWCQUJFzqt opybmJmmNhQNDRQcJS5krKCkzygcGhocIC5cuaiiqK+fiYCAh5atvlUkDAQEDy+ro6Kdl5Wh RRYNDRMaHy3rqJ+l1ycaFxkaGyNFrqOgpa+qkICAgI2hsOwqDgQCCyPGpqqfmJOeOBQMDhYe ICvfo5mg1icfHhsUEhtJqKChpKemloSAgIyhvdgmEAMCCSPKp6ObkZGcLxQNERkdITC1oZ6s fSseGhQREx1Krqelo6Kon4mAgIaXtb0sFQQABRnLqqGdkZCbORUOEBkdJDmsnqG2PyogGxMP Ex9StauknZ+yuY+AgIWVra1TGQYABRRJv6ecjo2W2BsVFRkYHC2yoqzNPDUnGxEOFSNBvq6o nqCtxqCHgICLm6WoKAwAAAgdLu6lkYqOnjglHBgTFB5Pqau50uFDIxgTFhwoPcWtpp+oxk2e g4CEkp2Zqh0HAAYQICXNmomJj6dWLhoQDRIgb8TNzsC8SiUXFBccIS/psKWmqLS1joCAkJuT kU0PBAkPGRUfp42Kk56tvCYQDBEdKC0157e8RislIB0aGyZUvLWspazAxI2AgZGXjJA7DQcN Dw8MH6OOkpSUmKsoGBYbGBgdME5PRUpoNB4ZGR8mKjLbrq3GQtCHgISWjYCLJg0TGAwFBimn orCRi5G9MTMtFQsPHSQdJO2uwi0nLy8hITXLwcuyqazNZ4+Aip2Qg4w3GywrDQgNIjM84ZiR nLu9xy8WDxETExcjNT85ZLnEOUO/s7e/r6eiqKqioLS3mpCfsJ6YqUFEeTojICktJiAuaE0y NT0wJiEiIR4eKDQ4OEq9rKeop6ajp7Csp6uvraWuy/na40Y8Ss7P2+DG0l9GQ0pMOi0sOjw1 O0E/ODk2MS49atDEvb7Bwr3B4tC7uby0sLfOz8pQOD/Sym7nv77M92D3WkU9O1T8YlpfYE47 PTo8S9i7wcrE29/eU09ITU5evba2yca97EY/TmZJV9nO2nbqzeRIMy9TZPFoxbzKfFZkSs70 xMrcx2bO0W1HPXBa4c7X9tPZ/2zyzNG/yN7ebm4/WFo/PjdAQU/gz37S8UFNS3jPyby9uLS1 wsK4skEwx0FDWTVEPCtRUUq7vm/Ivd3dWUdWQzVNTVvFy73B3UPg5UV9P8vCwbqwt7e1bdNe Q1c/VlJNPT9OPVZLSG5V5t5Z799b8+g4QltSYtzm09tgteNPy/jSuvDXycy5x/O4w1/MYVhn SD5KPFzYT+bTWM/iSE5KTk9AMEBAPlc/UX/LwLi6vK+3r7TS7tnqTld4eO36S08/WFU+TkpE VtzuycK/ye/Fy37ZUD5MOTtCOktLSPX+1sXBt7m8yMzP7NN239LeyNjZ41dPTD46OThGSezL z8bCxMTFTEE9Q1FCWV3iy7rAz73H5fHY8mVr6Pdd21BP8N1hT1VTTEdUS0FV/mXez+3SvsbC 0/RrTnNMTlZf3dLMzr+/v9B0XEJDT0w+XeNnZ8/RXuvQ0tnVSElUWf/vysHEzsndTkxDPUZG NzpETmPpwsK8sr7Pv85dzt9OXXHkd3j56Ezcy1BPYkU7Rjw6V9jRz8e9wcm/71JvWk5e233v xb7JzMzN2+TUT09sRT9ORj0+Pjs5OklFTNpv9tfUzMO+x3zQxrm6uK+xrrW6vMTT7ultalVa ZFRDPTYxLykmKCUoLCs0O0FTT09TSmW0q6qclpaWlpierbfNPTk5N0BUW0Y8PCwiHx0cHR0e ISUnLTxHR2ll9cnLurOim5qOjpKOlJ+o2D4xKS0uLUBHNT9CKiUhHBwbGRwgKC4zOkld2MPF zMbGwrKypJ2djpGUj5qfpr0+NSgrLCcyNjVHQC4sJx8dHBwfIycuNT0+PUVOX23n0b+3r6uh nZyPkpSRm5+ovE9HLS4tKi4wMT1BMSsnIyAeHR4hJyorMjk+Unz/3cTCvra4tK2hn5iRl5OX nKKt5EQ3LS0qKy85O0I+MC0qIiAfHyIoLS82OkRb9WVYWFz82tPLwbqrp5yUlpSWmZ6nt8lV OTEqKCwvMzs8NTYyKiclICAlJygsMjpGU1Vi4c7N0Ol+zcbCsKecl5WUlpmcoa2+WTktKCks LzY9QD05MSkmJSIhIyYoLDA5QUNETVRiaF5/9/v93bihmJKQkJCUmqGswkgzKSMlKjA7SU9F PDEpJCAdHBweIikuN0NOV3bcy8XJztXi3NvAqJuTj4+PkpefqrxMMScgHyMnKzA8RUM8Lygl IR4eHyIpMTtCTVlx2NHTzc3Kv72/wrqmmZOQkZSWnKexzD4uKCEfIiYtNz1CPzYvKSMfHR0f JSguOk7hysfBvLy9vsHIy8a+u6+dlpOQk5aZo669Ry0nHx0fIyYtNDg6NjAtKicmJygrMDtP bX7VzMvGx9Xv63l+z8G4ubakm5qXlpian6u0zEAyKyIhJCcuNzk7OzUwLCcoKCYmKS04SVzl zczMxsjW2tHNyszLw8bAqJ2bl5aYmJymr8FFMSskIiUmKS41PkU/OzMrJyUjIyUoLjhEac/N zMvLzcrIxL6+xcXKzrOgm5eUlZaXn6u1eTMqIBwdIiYuNjY7PjgxKyUjJCUmKi86Tm7p08a+ u7i6vLu/wsjLzNPVxa2inZmYmZqdqLLGRzUtJyUmKCswNjY3MzAwLSkpKCcmKSw0Qk1tzsW/ vL7Cv767t7vDv7/Kx7GlnpqYmZqcoau20EMuJiEfHyInLDI3ODUxLyonJSQiJSkuOk/Tvrm2 s7Cvr6+1ubi6u7i6wL2vqqSfnZ6foKi3zk82LCkoJiUqMzs8PTw3MCw7MhcUHisfHDa2zVms oKu5qaa1yrersr+2rbO4ppyio5mXnqiosT8pJyMbGRwjJSc0XVw+Pz0uJCAgHx4kM03PtKqn qausr7S5ubu9urvAvbq7x+TTtaapqJ2anaqvuEwpIB8cGBccJzE8Vr63vM1WOiwlISMoLj30 vbe1s7O5wMXN39fOwrq5uri1uc5fvJ+dop+al52s0josHxoWFhoeKTRJ1r68z1lCNSwnJCUq MUBlzr6zsLGvr6yurKuvsLW4wt9pTUQ9OTxcwLauq6ilpKi2+TwxLCcjICQsN0FPX2V8+mVQ RD09QEdEQ1xrZvFe69rmwsjCv8bCzsrP0s7wXFLqua2pqKSfnp+lse1DOS0kHx4fJy4vNUJd 5VZDQURIPz9OTEr3X0d8X9128MnNvb7Av8PBvsjJd1Lo4rmsrKuln56gpa6/bDUlHh0cHSIn Kzrqv7u/y8vbSzYvMjAuLzQ+UWTXzL+2tLK4tre4ydrYYP9KSsyonqOgm5eZoLLcSC8eFxca Gx4lM26+tLKzvVY5LyomJCguODMw6s3Jw9m2trqtsKuvs7O8vmVFTa+bnKKckZCbrtBWKhYO DhMVFBkvva+vqZ+frz4tKyAXFRwpMDbpraitr7Gzuv9fzsnVx7Wtt76nioWamoyInCYoLhsI BAkSExAatpmgqp+WoEwhJCQWDhUrOjNKqZ+purKtyEZCTEtu3bCrs7uqiICTnYeHjygZSREA AAgTDA4pm5WlnJGRvSgmJxMMDxwsJ1ShmKGtpKXOLy5AOScr3q+8UM6YgIC8iYOHsBfaNgAA CBYOCCeYjbWei4zaHC8qDwYPHSYeRZyVn6qfpV0qKCgtLCw2w6mt7biqloCLpYeFiykvsBcA BREQBxK7n6a5kI6gK0VDFgoPIhsaPZ+dqJ6Ynu1F2DIdIjowKk+vxFzMwpmAjayIg44huKgY AAwWDQgdsLO0pY2Wt0qvNhAPGxoTHears6qZma9VzeIlGyU5KiJLoK4+vKm7kYGbm4eEqTOp 6g8FFBMNCy25s7aakaO/x+MbFBobFRw93LionKCzysE9Hx8qJyY52q+yrqCoVcaMhamehYi/ QpvsDAcdFAcLQeQsxpSUt7SjyBwdKR4VIPxSXK2fpre5xzIhKCggLFttzbSlp7rF252PmJ2O iJmmqKceEBIWCgoaLy1HnJihqqO/KyEjHBccL0dCsZ+pvK22LiYuKiMz9lZYu6mxvb/MnI6V n46Im7CppxgOExcJCx85L8qYmKCrob8lHigbFCI8PDuunKexqrIuIigmHSA8VzvEq6y/uKmT kpaUio6hoqfmExYVEQoVJiwyqpqhpqCnNyYjHxUXKDAzdaifrbKt0CkoKiAgMEtWyq2mrbK+ rZiUm5uLkaCooVEYGRwUDBotMjGon6u0rL4oHB4dFhoxQ0K0nZykrLDfLygjICQuPfq9sain sMXSpZycn4+OnqGjrh4dGxoOFicyL7uerLessy8iJR8XGipJSLmgoKmrtU4pJCQhIC1Sdbep rKust9S4n5qcnI6RnaKi0B4cGBMMFyArLLWmr7WsyywoKCEdKkLz4qmfp66rvTsmJSMgIzNh XrutqLXEt8a/n5iaoo2Rna2j5xsYGRYNGSQ1MqyiqLKsvy4iIyMeJDfNyrKmpaqzzzovKyIj MDlA3a+zv8G2ujLmpZuZnoyOmqahvRoXFxgNGSZIO6mdpba7wikeHSEbHzHQv7Ofn6qy0jos KCIjKTJR0rCorK6uqso6rZ+gnZyOnKGurSkZGRYSDyEqSnKgpKuwrNEsKiomICw/xrWxq6q2 3kYuKCUkJy87VsCwsrKsuNJvv6SklJuRkZqlxtwbGQ8YERkjdsu5oKOpy7tPKh4kJB8pR7y7 r6qstNVQOi8pKTE8Sc61sLC0srR3RLGsqZ2ol5yisrtCHh4YHRcoMLvKqaSmrr3FOiweIiAl JzdY1cu+tsT+5F03MzpKSPm3sbeyqrDPVamhtqGfnqGuq3c+HyYbHBsjLT/Bu6iurLrCQDgt JiUpLzBE9MC5vMDF1V1PSDg9St/Tx8PGwMnVtq6unJqqnZ+qTU08IRsYJR4nLbm4sa2lrNJR Sz0mIicvLjZSzM3Rvb3fbN5rPjk/Q1Bl1sLE0byqqaWYmqKapKo+TScfGBsfHiYvyte4u6qv t/1uWTgtKzc1NTrdx8/Qv7nE1fHmWkRAYk5CTNbGwrq1qKKmrqmpssjdcz4vLC4sKywyPU1h YHLJxM/q2/1cWllMPT1DSEdNb9be3s/W2+XX2X9h99fJwr67uri6vMLK1djW0+lkWktRaVdH SVZQTEZOS1FaXl1VWElCOzcyMzo+P0lf2ci/u7u/wr++vru5ta6tsLa1ucLbWkxFPTk5ODo+ SUlKSklDRkA/Q0ZOXfliXFROQ0BDSlRaedTAvbu4uLu/v769vbq1sbCxtLe93E5GOzMtLS0u LzY5Oj9JTUxNTEhPYebmz8K6u7y/xsXEzu1u8+De2NXf2c7a4O/bzMjDydbV0OZmWlE/PT47 Nzc7PEpX59vXz8/a+PLg2s3KysnDxcbIzdV0WE5OSkpSVltRXGB95ujv69rLxsTGzuVjWUg9 PEBASU1Xd9nKxsnR1dTW7+1t+fnt4dnXzsfFz2lbUU1GR0dGTFFbY/bk1+XYy8XHycbJys3V 7WRPSUdHQ0VIT1trX1tpcGlfbuPb73Jy3dfJxcnLzM3rWlZbW2nj7O9vcndrYmVrc23q42Nl 39HY93f0ZFRZ/Wp+5/dwdH7y5+nu7Xx9cVhgX2Rmc2ldUVlm/W9kcN7Q0dza2dbY0tjp29TO z9ba3dnecFhORz8+SE5TVWnf/vHo2tXd8mdlcVtQVlli69fS3+ff2t7o9N/Z19Tg8fvu6+xo Zfna2uLvb1xYV1FPUlVm9Glkct3k4dTO2PD+3vx4cWFbV1xaX3Ry8Ofa19bP0dt2W25t69rr Y1Nc++nr7d/ief74cGNubV5XUk9UT1dr7d7U2N3X2dzl5O1qYubW2+jk4e92XlNPV3h+Y23m 4ODh6mRf59fd2s/W4+jk625fVlBFPUNHS1ViXl/szcjHy83KzM7X293Z3t7nbWNiX1VMSVNU VmZeZG/cztHTzsrLzNTf/WRgWktHSU9RT1JXaPb/cWH23NfZ3t7z5Nff5+re19XL0d7nf2de XWBnbe7o4NTNxbJgIcjJLss/S75AULhOPs5CQdREQuBQbMbTyr/QxL7SydFp3HVv/mnf1WNd VUNUXlFz9U9zxFHOvkK+zFDDSWvOUV39T0J2UExiRVlVTWHa49O/1d3R2eziettS5cpY18je w9lJzc1J3fFhtUsrVT9TxUjAyEfBWk7BRE/YP2BSOblsSmNdwmzBWca+SL7eObNhMqsz2LMq qsIvqThavjHPSkbcTMpaa6wzra46rSMySBvRTTe8Ts2kOcmsOLNIPrVOy95M1bvcxjdPfT+4 MlO5SsNfa7s9yGlNvX5Mw+zPwzbLzk63LVa/LO08S70txV1QuEZputm7uzSv8kOtQ9nOOthM P1zDL7bMOKwstbsyuS/A4DG9O73ANa4yvb86uTjSzEB6yjjYQjiyQ9DOR7NEwsBkwjvNVFNl Zls/0drJT8fOZbxFxtI4uS7HSz22LLc+7rdDrkj35X1yZ0pKxUu8O83KV8M+u9ne2lbURFo+ 2tpCTknE2z3YVtjJS8jR0chNx9RT2T3i6ErTW+dPVV1JZeHLv+Dtzj/XXsq6TcnTx+xJUlPU SkBI2MtH/FnSwWfnbWNsTvZX8tPz3mns3VZZTmzod+Zc7UzOx0/YXdvOSO7Wwtpb3051UkRf 8drP1NLaZ8xO+MrQzkxUTldLZOD4XEzs7Mj439XYyk9GT+pWXWp3fP/8R3nT48jgblzqxd12 Xe/M815cTk/uv9RJXdXB2k1Txr5aUXDTz0FAa+Z0QEdT9GBM4s3J7lFy//Tyx8bj4uvfe1jh 197rUklk59XaXfPbWjk92sjZS9e9ytxX3s3nR01d79LKznpVUllq5Vo/S9rZ40r2y8vhS8TC 3VA98tD3TEz40WBG1rnGTkz9xr3fSXrc20I7W21STmNlWFvoxOlR28fMV0P4vsL2Usy5wFtJ Wv9IPFvJwM5tZ+LIXUFFX+dt7VZeWU9OQkZN28bS8lfxzsfS3svAydbl1HFLS3rT2HV349xr Tklm1VRVVuhpT0xa23laXtHO6FNM79XH4FLYyNJYWGxtcFlq2OBz2n5USmPCwddhW+HdcmNb WvHqX0xf7tp+Tmnr0djS1Nn74+P+amhw1tXf3lZLVV1QS0ZMfN3w2tvy/mJe7tLY0se+xeRz bOldPkBRWFtl/NV5WVnX3GNp4ce/zd7Dxs7jXE5cWkpBPUzg4k5LT3F4ZmHizMa+yNz5aXZf XuHd2eZbXfxWTVBmXefPycXT29fS4XRaTFlrSj5GTlhX58q8ympi883fbF52fWVfYOnbeWB8 0MXOaVnk6GNRTFZvdVxVVtvT71Vc1snM2N7YzNHnWVdr7exYS01ZXU9Z5NTg4+r4dWF48+nk 725z935wVWFlXl93zr67wc3b5W9RSEhKT2Bv8d3vdl1XV1lUXtrO1WljbOfkZGTgy83ebmx9 cGrt0tX9f9/acP7u6nJbYmJtV1lcXVJTWOPc5drf1MrO/Ftp7fJsWE9SWGJtX27l1M3Y4d7g 5+XZ19jU1+xZUVFUU05PU09PWFxf5dDP0NPS0dTW3dja4Ptp8e59a11PTkxNX1lZdM7XXVD9 0+Bhbc3CxuleXWNYT1V07vv1Zltb6tbU1NfW3Nnb1dXb7fxpXVlPUVZZWEtMXWpoUVH819To 2cPE1W5u5+F43c3N19HL8E5CRUZGSmrR0eZe/d3V2/Rq9+djTUVPW15bVXLXzdf679DDwc/o 49XrOUyxtMZOwbrOLiw7T0s0PXu17z084spbO0PBtrnFvLS58kpe4OleSlnb1l1JZu5eQ0Zq 3lpKTlROTW3n0s7c/N/Iw8jP0tHM19XQ18vWTkZIR1JLSE1XWVVd+u1sauHQ2X9cZ9fO6mji z83tX9vHythzYNnJbmBHTFNMW03y7M75TGvQx3RJTHTWy9l87d5tTW3DwtVdXfb6VFRk9OBj XU9RX2puZVPpxcxYSVva9FrTzM5ue2xi5tHG1svHyPlXUFNPTmnhzNdtQz9CREhBTFjfxdNn S/u8vNBK78K9Xj5hvrjr9NC91EpBV+NIPT332lw/SNfHfEL0wcBvQk/kwcNaQ+6/zGpH4L/C 90LuvbvQV0xESj09PFLoeMjBv1VZX8hcPELTvOBOY8XqWFzDw9BMzNleVH7Hflg84+/Pdl7x 1MJKQDvky047Q8jB3U9D38i/c2/DsNg7R8S511BIyWRrR2NGTllpxuTz8v5SWWhaUVL7vdRN PezFzDs5xMRNOs2yslY+1LTEST1Fx85TP9W+x0xLyNXiTHRgamFUVEf1+2FCStvRVT71xXM9 RMLBU0jJtb/33beuu+z5z8j2TWfb1G9IQV3lfUUzMTg2LCouOT5BRVXYWP/IyrO/sp+Zmaas nqLrISRCUUErzLemujQ2MUYnIiY9zEhJPUs8Jx8eKS89TMy1tbO3qK1ILl+fjoyMlaizNDMV HSDnubypvak/KR8eHx8vTPdoPFg/MS4tPzQ3PEZFOl7Pt7/Ms7XCv7XM3qqRioqkv9BbMxEZ I6e3v729pjUjGh4kJjhF19pb60E+OTM7OU5ANi484WreQNvZx8O/qvFnvo+Fh5xiv7tCERMf qrLM0refXiYYHicuRUm+usFrLysqKikqMT87KSo6zrbP/Lyqtr3CtLZKsZSEg5rSN7c8ERIb n62vVcylPiMQGSY5QjDNs7FOJiYnKyswVOlILzXiv8Q8O7qrumnAqKjBtZSFgpZDLc3AFRMX qqm6OjCuPiEPFzDk8DTrra9MIyYvOC8sRWdPLStOvrf8O0S4qb2+T8yrrpKGgJHmKFDDFxEY qqOmREOt2yUPFCbeRio8uK5hIyAqNTErOFRoODLwuLbOMUG5qLU9u66jrpeEg48wKUK8HBEa r5usVzC3dyMPESjtzi47t61sHx4oODArPF3NTDhA0bpJNEqws1a/qJun4ZqIgI8zJTyjHhUY t5evWyW7ySUQDibVyjMswrHIJR0oOEItL0nXRS40+brdKyy7o6xNxaWWlaeTiYeaJiFFqikc IsWhvScfMDEfExgsx9s6S9OyWConNXw/NjhlTC8tO8fHWzlD2q+tqrPHvJ6JhYmp81zKPBYd Kai+ej1JszMeExsvYGc6Zr2+ZS8qLS8uKzA9PTMsMmbDv1k+SeqhoKTT4biZiImKqrXgyDEW HyKu7+5N3a8zHhMaKT5ENkzBtss8LTAvLikqOkU9LjVfva/rTnlSw7Kip8jCnoaFjcEwybo7 ExgrqqzYVsOvORwPFyru5UFsvazLNygpLi4sLTtRQTIvRtLM5UH4waaquMtavKWMg4eaQe+2 WxcOGsuktUjYr8YkEBIdSNtJSsqkqc0lHiYtMyIqOU1BOEhhYkQ/zbi0p6qv3724mYaDjLg3 tK02ERMrqp9cNUbBcBwREydoYjsyvKq/KhsjOD4oJC9GYj8+b73CR1LCr6uxr6+rrJ6Mhoqi Qfi8WRsVHuOowDcwQn4uGhQdUMHQN0u2vEghIi9OPCgrMkM/OE1q6GBR1na5q6Wt39+0i4CG mSrrn6wnDBo+nKspMD6naRwPFDHvTiQlxKO0KhkjRkwmGyQ+vOVC+buvW1j2tZ+lqOe8t5uI hYqmSsCszhoPFzSv4jE2661bIBQWJjlHLjuyqK05JCgyNyMeHjDn7d9mvrxSX166q66qs62o kYaIja61rbdPGBkcT8ZUWDbfazYdExMaKTk4Q8e2rns2LCwwJygnOeLDvtnGw93cyMPAUvK1 p52SiYeLmbC9wzkeFRckSbm+xd5jRScaEhMaJjdDY8e2sLxWLiMiJSwuLzzar6istMbDuLm6 7t28qZqPiYuSn6mrxS4aFRggLTtERkhIPSwgGxseJiwuOFq4q6y+TTg4OzUuLTfbsKiqr7W0 r7LA7VTCrZ+Zl5ecnaKotGQyJCEjJickIyUoLC4uKyotLzEzOD9c4tfQ0cnAv81kXefHvL/E 0NXh39907drAsKikpKaloqCjqa22vMxeRDMrJiUkIyMhICElKi81Njk/TnPr6vJcTFns1tjX xr29y9LJvbm3tq6mn5+go6SjpKmvu8rsSzsuKCQiIiQnJycoKSwyOD5LU2NgXltNQDs7Pkhm 0cO/wMbGura2t7StqaOgoKKmpKOlrLO/zu1INCsoJyYjIiMkJiQkKS42PENV3MvO1/BdTUpY +tPOzsrL0ObdzcfBv7mxqKKfoaaioJ6lrbfJbT8zKygnJiUlJycmJicrMjg+SWXU2vpbVU9T WWnc3dXUzc/h6dnOzsO8s7Cup6KhpquppqWrt83+RzkwLSspJyYmJignJykwRF5lZeXPythp XVV/3uV2Zvvl2+3y7dXNysHCu7axrKilqKilpKSrt8l6Qjo1LionJycnJygqKy02QUxWWWfr 3Odqc2zr3evy69fNzM7Mzdbe0MS+vby3r6ekqa+uq6qwxv5vX00+NC4rKikpKissLS8zO0RN V2/39Gd+4tnO2dfU0NHMysW/wc7m28vHy9nWvrCtrrSzr62vusTS9Es/Ni8tLC0vNDg2MzZD XmlSSEZMWVZbZ3XteHd6/uHW1NTY4tvc2tXSzsu+tq6qq66vsK+yt7zMa0pCOjQvLS8zMy8w ND5Ubl1MRkhMSEpKR0lMXmdx5NzOzd7y/dLHxsjKycO6sK2rra6tq6qvtsDaW0s+NS4sLS0u LS81Oj5ES01MS1VPSklIRUJARFFpaV7iy8fFys/KvsG+uLaxrKiprK6trK2yv9ByUkI3Liso KCosLjI5Qk9QTU9KREJBQ0VDREZPU1Ve+tHJxL2/wL24tLK1uLSwr6+ytLKvr7O1vuBMOi8t LCsqKi82PD47PUBFRUFCQ0JHSUJARENJV1RdfNTIu7e4tbCura6wrq2usbOzs7a/ycvR60w9 ODUyMCwrLC4vMzlBR0xPWFtQS0xZWE9PT1RdYGRub/bczMa/vbm0sq+vr7W5ubi4uLm6v8/g 7E88NDAwMC8xMjc6Oz5JXF5hb+7u5/lxcnl6bFxOTllj/tzf8OnUxsDBxb23t7u9vL67u77B zNXT31pKQT9HQjo7Ozo5OT1FSkhOWVFb/uvm6Wdg5Nbt/fp85OBydtrRy8PAy8vCxMvEw8i/ vr/DzdPP+VBKSEBART48PD5GSk1LWlt9evd0YVpmYVhzWE5YW1Jb7ePOxsLAvsDFw8G/v8DI 0trc3NroZFRPT01LQkZHR01HSEBBREdKTVBq0c3R2d7Yy9Hj7Wz409Xm7NrOxcXNztHR0crM 1NXT1N78aldPVFBFQkREQEFDSU5NUFlUWPfd08zM0dPU1MjGydXf4N5gV1ZaYvHs8tXMzc7Q 28/ecm5XT1NsbGZWU15oY0tSWl3q4ft07dzd6WNlbXZoYlZObd/f3unsdm9mZvjY1trNyNXP zszO1Nbq8OpnXVVXVE9OUVRRVVRWUllfdOv05t3f1NLubWlaY3lr6t3c0t9qZmVfb9z/b27v 09naz8zZ19bj7eXuZ3RhbtzeX1BUVE9QU1BPTlZs/v7Zzc7nbGZq+tjX33RufPH8dW9t8mxe X2jt9+Xy5tbS0s/N3d/X1NfY3ntaX1tNTEtNZFxNSUpQYfvu5e5sZGFtcf/q3tjb3NHKyczU ysjMyttnVlxt7XJvbGRZWFZNVfXgfVhRUVRWY1xOS05edHri2dbW1tDNz8/N1dTrfH7l3vD9 cvnzcGx773xz+vdzf93U5fd8Z2JYTUdGSklLUmvu5tje7t7a3OTs8OjUy83Oz9Xe4+x2YltZ XlFKS1py8nBu5tzW19/f1NLZ4N/f5XFjZmJfWU5NS0hKTVhldu7h4u/p4N7a3eDk3NLQ0c/Y 1djr7nb77unn/2BeZGhcWGl5e1xSau3l/V9VYHn7eWVxaWltXl1m7PZubnvb0czUf2VkYF1d aP7h0dHc4tnX0dLf7fjv59/g3Obm7W5iWFNNSk1QT09VUEtOUVNacdvWz8/OzMzS3NrU0tj4 9XBufG7x6urf2Nz0d3968unr9nRjVlNSaPBwYltaXW5rXE9OUFljXmrt1tHV19XM09rc9f9w YmB43dfP1uHb3dvY3+VwV09ZW19lXldXc+PpcXtyZ1xbWFRbZnh2aXL67+Pm39POztjY59rP 0NLe3NvuZFlNSEtXXlhUYOjYztHVz9PccFZPUVtUTk1UXmJlXWr58Ozh39vX2djSz8zMzsnO 3djr+m9gWU1JTFRaWmr0bV9bWVhc/N3c7mt+39jS1+Hk625PSUlTYm/u9n7z5drU3dfOzM/Y 2+jz7+Xuem9oaVtWWF1ufmJeWl5ranJ08+rl29zl5+Te7HRkZmZbWlZSYV9iaF1ecePQzcjF ysrMztzn6u92X1BNUVxfU1VXW11jYlvtz8nIztjk8H5eV1VUUVBaWVds3+Duf/Pv5t/n3+Pb 2NfnePzr5+378OPj6GZZVlxnY2Rkfezd0dHW5ndqYV1PTk9Ycvp4bmR56uvp8O3s7nxs7d/V z9np8ezf42dacH30Z1tWV2by3uHs49jb5H5wfm9dT09ZX2ZiWFNo4NPV2NXl7tvNzM7T22BO T09QV2Xy4d7a2Nve8vn2bWdkam1+9/d5bG9tZmxwYVpcZGhueXdwX11oYWzf2NjW0tLO0N79 bXDp5vLm3uHub1tXYHnrdnP08uTd4XJbV1NRT01PT1ddYnvt2tDR2d/b1tfb5/r06NrW1t3v 8enc4u36bG9uY11aVlpXT05OT1hsf/1zc3507NzSzMnO09be5O1qU05afeHj6Pf87eHg4OHq +2ReWF95b3VwaGFseXJwc/Tf2dzpfe/n3extbWZuc2RiaWddXmzw/2Vtd3bt7Ojk6/j/4tLP z9HZ73VrXVtbX19maV1abuLa2d7e4uzq9XR8b2ZsaVxVXGFfVFNl5NjY2d/f1NDX4n5xcl1S T1lve/58eH/r29XZ3dzi4Ox+e3118+59f/V7aVlVYXTv8mRbU1dkeXlqcnBwYV5pdu7v7vPe 1NPR1drd2NTS2/tqX19saFldavXoaFxba+/i6mVYX3T9dHLq5/ZeVlx34tzc29rY19XV3OZ3 bXRoYlxbXmJaW2BubV9bU11e/eno6N7V3NbS0c7Q1dre92hZT09RU1hdYm5lXlhf693e3NrX 2+pqa3b99HFzcePX1Nne1dXS1epuYFhUT1RYWFxlaVhUW2nk4vTx5On+b2hp7uHi8PXYz9Ta 3NXQz9x5X1BRW2VoYmFdXVlVWFhk6+duXWjg1dXb2M/R1NTZ3ent63BaVFJPVVVWWmzi3tne +/7s5O/8/Ovc2N7f4N3d5uLk5/D3aFRNS05LSk5OV3Pa2Nvf5tvc4PJrZ11mbmprbO3f29je 3Nrb39zW1NLT2u18f/hyb3NoZ19dVVRWVFlfW11ZWltUXGVdY2Z37uLPycnJzM/KydHZbF1i VlhaX/rr+HtlbOXV2fteW1ZRT1ZWWl1m7uTc19ba3eLw7OjwY1hcXWhnYF5pbn3w7NzU1Nfb 2tPU19frbmV3b19hYF1aW11iXFZWa+PkcGFnamltaGfy3NHN097z9/d+/vrg3+Pvbm993fRW UVNcZG9yaml74tjU09nZ1tfc3/xiXlpPSkxTXFpcaXPe2dbU0M3P0t/reXjy7uhqWE9LUFhY V1NZaXPn2NPY4+7j09DN0/Dz3dPfffVtamFaVlhdZV9aWFddWVRa8+HV0c3M2tbN0955XmVp YlFKVuTZ7v529/tfYWXw6/RlXeHZ7l9dc9/2X1xo6Nvc4tvRzNT9bOrd4u3k3O5zeHZOPTlC V05FRGbOyc7Vvr7O4NS9vNxKVtvZW0NR7X9OPkNb7k5DRuXE3E9O0sTK09DAxdnZzM35Vlb3 7VA/PkJx32tyYd/Z2nNk28/L287PaF1U22w6MkPI1nhTzLG/XTxdyL5aNlbJwE49XsjXPzZF zr9pV8iutFtNwrRcNDfKtNg+RMHBRTVE3vpKStbC6E5aXtd2TUXfx+rS7r7I2F5LYU3gTFnQ 3utivM5YVlbd91dFT9HP12TkxXJbVPDTWld2zc1VSm/DbztL0cBSSMvF1E3o0MxvUdTcTkFf x89SSvbiUEhCV19XYPnb6s7P3tfGvsjV3cfD7UtczM9AMULoRzExSdxtREHLtrjFxLizt8jT wLvA9UxtzddFNj9yUzYtNEY/MjI+W+1UQk/Sy3Lk37m9wcG9rrq1vbGuuL/iuLGzzFLr1GM8 PFVqTjYuLCkoJSAfIiswOUNARlDZdNjS3u9UqpWJho+WmpijKxwVIyQrOT6urafANiUdHRkX GB0qOTo4PEQ/NCkinq0936yYoaysrK2bjo+epqCjqbk8HCAsJyMhIil8ve89ODItLCUhISw2 Okt9VFrq3H5a+fLSyMXHzMG/saSgpKafnJudoKmzu8VbNyspKS0wLzAuLi8vLysoJyYnJyYn KCouNT1MeOLBt66tsKadmJmZlpOUmJuhqbfMSzEpJSEgIiUmJSYoLC4sJiMlJiYlJSUoLzpB UWntxbSur7KomZOUlpWQkZWaoq271UQsIyEgIiMlJSMmKiwtLS4uLSwpIyEgISQnLjc+Vsq1 rKurp5qRkZSVkY+SlpuksMpDLSAeHhweHyMjIiYqLjEuLSoqLCgmJSQoLDI9Q1PXwri1ta6g lZKTlJKPkJWaoay35zwpHyEgICEiJCMkKCopKCUnJycmIiEhJSowPElpx7Ssq6mknpiSk5OU kpGWnaWvv9s/KyQeHyEgISQhJCUoLC0sLiwqKCYjIyMnLS81QV7MvbK2r5+WkpCPjo2Ok5ic qbxcLiYjIB4eHiAlIiAjJyouKycoKSUjIiAgIycxP0/Pu7OvrquemJaQjY2Oj5KVmaO64jAh HRwbHh8dHSAfISQoLjcuKigrKSUjJSkrKy8+T+fIwbenm5iUjoyNjY+TlZynt+kzJiAfHyEe HR8jIiMjJSsqJSEfHx8eHiAkKS89bM29tq6km5aSjYqJi42PlJqmvGgyJR4cGhwcGx0jIiAg IyYpJyMjIR8eHR8kLDZbvbOsqqmknJiVj42MjY6Slpumt+o4KB8cGx0eHBweISIjJSgrKSYm JycgHR4kLjtWyrm2tbWpnZeUkY6Ojo+RlZulu/I8LCMeHB0fHyAjJSYlJicoJyQfHx8fICIp MjtL1riurKynnZiWk4+Ojo+VmZ2lt1IyKycgHB0iJCAfISosJSInLCcfHiImJCQpN1Ve0LOq q66on52dmpOPkZSVmJyjsM9HMSkkHh4fIB8gJSgoJycnKSglIyQlKCstOExt0b6wq6qnpqKf npuXlZaWmJuepbHUPS4pIh0cHiAhIiYoLS8tLC0sKi0uLzY7O0BS6cu+tK+tr7Gvq6imo56c nJ2fpKeru/VDNy8sKCgrLS4uLy8uLSooKikoKiwwNTU4Pl3cyb27sbGwr6+tqaWlpKOgoaOm q663zGVMPjc1MTEzMi8tLCwqKCcnJyosLC0vND5JVu3Pwbm0sK6tr66sq6ypqKakpqqtsLfF 7lRKQD48OjY4ODUvKysrLSwrLS0vLzM2Nz1FT3zSw7myr6+urrKxs7a4srCwrKyvsLG0u8DM 3dpfUT84MC8rJSYnJykrLC4yNTc9R07s39LHvrm5tbKyub28u727t7WzsK2vr6+zu8HM3e5f Rz47NC4sLC0uLCwsLS0vNjo/QElU7tvKvLu2s7a2r66vsbGvrKyfmbCflybPSSyeFhxIEBoW GE0gKVdSuElBbE9IHxwdHCYlK12ZiYCAg4CAhI7GGRIKAwACDRwvxJeMi4+ewigQBgAAAQQJ DxxasaOemomAgICBgICFjysFDgYAAAAVt5+ah4aJj5S1FwoAAAAAAQcQIs62sK6nn4mAgICA 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 JCctO7ypoqCgo6Wlq7jPb8izubavsa2z3Ug0JygjIiUqMUM7RE9QPzEvPUFcxLOjn56gpaWr tMtJOT1LVPpozsDMTTouLSkmKywuOjg/9N/VTkVN6s69ra+sqKWpsbS4w8rX7N9V5tHTurvx PC8yMCQeICgqLS8ySlhJ3tjGtrGno6imp6qmq6669VhdSz5EQlxzTEtEMC8wKishIy00P0Fa 1L66tLyztriysKqvrKyrqK+00EA5LycrLjlOPExf3cbfQzIqLSwrKzhw9L+8r6yztLa+r6qr qq2urrbG3EQ0KSAiLDI3Ru7RvsXhSTs4MzU2O1BB67+ypbvIw965wL+vvL26r7TeN0RLNDcw O+ta2bKxs8tUOjgtKyYkJzBQyb+1ra+xvubDz7a94N3Gta+3ur1cSzQvOS5LRezMv7//TFJA Ny8wPTVDyMbAu8W9zWbdybzFvsG1ssHfUkk+RUQ5Ol3PvrrLutPW13U8PDMuQDNN0mvJwMvL vuvEzOZ2auz+yNy8vFxM9W1LODh2usfRy7+/7EQ6QDM1Wj8/We7MwE/y0r21y09QeVl3Q01W TWF9yLq8xbmxvtpBPj47TNHOYVVc4dzVfsniaFk5PWF4VlJqz73OYcO8yr/U3m5D3tfaSuXy 411LQuHQzMnayrrExreytMNwYt1NPjY/aFA/PD84NSkrKSEjLS8qKypWbX/Bt7CzwrmtuLK6 uLO1tK2oraqsqq21uLC10tvTYD0vKisqJCAjJicoLC9LQ0RHPUQ/TEtIPU3tys/GubGuvbCs qqurra6ytrjoSjxKPTY4OkQ5RzU3Ly4vLzEuPjVCLzk/bs9cxci2w7e0rKeurLe2vL/N699k 2NLZavZw8tXr7cfM1My/w8nJ7M/g3t3tTkhPSWVJa05MQT1JPl9IPjtHTvZGR15NXD9bTFVY WsvUzt3Hxr68ybu8v8XYwsK8zs250MPL6t9NTVxK4ln6yXHLT0tWOkM9O0RMRktOcc/bzsTR 3Nf6WczKwbPOub2/sd1TTE1JY0NXX1a9SlHr0lg7vjo++NvxWN3h1dKs31XSy7I1ULzn0UG9 Uy6+2zlEwbwySrZ1OGKvTi692T8717ZKSmOv3F6/VbXGfa/YwcK/t01bRd9LNt1ORj5gy0VN yMtHXsrkNVCzUD5ay8o5wcs5Tk/KWj/MaPlZzbk9S8DVPUXOYkpZvc41urRGUc7gNDfISytA tGs1xL9aQb+uQFiywElquMBKTsVmP1LPVy1+1EFMSN1NOVZKMT9LRNm/yX68ts+9ranYSLG5 aknUvT47w9QzMu1ULz/Tbj9Vs8szY7ZPMPrXUDpatOJPv7G+27+6xVRN/kA9P9rgP2HLz1fz yOBZWNf3TEva2XF9+WtFSM/RRD3Nu2jqwcpjz7d8P+/JWlXB1VHTx+tOZWU9Q2ZEPFffTktt 39to289g6+lTzMTKuMLPzPhOWu5tZGR0c1FTfk1bz+z532NPXHj9ZU9RVVVTTURM49HIy/vU vr/FyM7GxsnJ3HLl6m5wV0xQVfFYP0pkVU5FNzo2Lzg7Oj5FTE9bbsu2ramnop+XnDXFpa5O T7vLfrO4PCkuJBoaHBgYIComKSghIiouLzqvjICAgJHJLCk5YzQoL8eZjI2aPxYPDxAUFhoh KiskHRkcIiYkHx8iMEmphICAgJEjJBvOxywmILmUiIiZPgwJCw0ZGx4pLi4fGRIUHCU1LiUk L86vrpaAgICA3iEVLLHqOxtMso2JmboPCgsOGyEoKS43Jx4VExsfLTw0MjrjycFbUY2AgICJ LBQS9G9cKBrRq4uOoTMMDBEbKiQfIyg4NSIcFxseJjUtN0TYr7rDUkyMgICAiy4TF8tFvx8W K0mQlJ0+Dw0NFyk6MS8rPOE/LBsZGh4rNWe6r6ervmAtJGOJgICAnkcaHz0jLRAXJL+PkZG0 HRQOFh4iICEt4bO0dygfHR8kJS012a+rpaiy+C0/k4SBhp2s4r2lUzcVDhYetKalrjQtKCo2 Jh4dHSgzPU1NVe3Pvsz1523iRjQ2ODoxLlCajIuRqKuppaLGXSokMDTOvsDGST87Rl5CPDUv MC4sLDAvLSspKicoLTY/SUpEU/nAtbSompmepaabmJSXnqS460QxOS8tLCcrL0BiPi8mJCco KiciIiYrLCwsLzlL89DAtqyno6avqZ6jqKmhmJaWm6KpvOo+KicfICUmLDE1Ozg2LSsnIyYl JyosLjM6R1RffdvAtrGvs73DwK+cl5yho56YmZ+sx3NbcT8wJx4dHyEnKiktM0JWWEJETk9F Oi4qKjBL/d/o07y3vMlVSUNFzamlqqWfmZaaoay7wsfKY2U/Ojw5MzArKCszOjIsJywwNDEq JiUoMDtBOzk9Sdm9trKxu7uon6anoZqUk5ifqa+xsNRGMCYlJigqKSgsLzk6Oi0qKCYlIiEk KzY+QUVJXN2/vr23sa6tqKClqKCalJKYn6ersLttLyojJCgpKSYlJys2OzkwLCwtLCspKS4y PT9FWte8tLjGyb21sK2oqa+sn5mWmJ6mrrjC6zktKioxNzAtKikpLjAzODlFTUQ1LCgoKy4y PEFNeNTExMbHx8zRvKympKGem5manqSpqq23ZzgrJistLCsoKSosLCsqKi43PkRHQjkzMDA4 PlLmx7/EwsPBvsrJurKvqp+ZlZabo6qtsrp+Ny0pKi0tLCooKCkqKy0tLzI3Nzo9Pj4+Pj5E Ue7KwL2+v8HI3WLevK+rpp+bmJibn6atuMxMODEvLyskHx4fJikqKy86TGBhSj07Oz5DQ0hO X/LW1NHMzcOst3Rux6uqsKWem5qfpquzvNRCMC4tLCwpJyorLS4vMTg9Q0pWZV1WTUI8PUNC SlVc5N/Z1NTQzdLPxL20rqminp2fpqipq7bOTDw8OjEqJioxOjoyMTAzXnYoKydLLCAgJTQ5 Tv/Jua6zwcPb8dOrmpSVlJKPkpu3OikjHxgUFiE7z8m9r6itzjUlHh0aGRokOmns1cS9wNpT S1VOQTtRzc/HnomGipGYkpjJFA4NFxsWGjeimJistK26NhgRFiIiHidPq6WsymY3JR8dJTFK 8rmwqqauu6SIhIyYoJWYSA8MEBweEx68lpaexsauTR4SEhsmICP+qqCv3X3eKhkYHDJW3ruo oaCls2VboIeJlZuXjp4fCw8UGBAPL5+Wn6KroLEkFRUbHR0cOaystruxzy0bGiElLtyso6Gm pKTDLDebhYuZmY+LqxYKKy8AACufp7SnnaKarxsTGx4WFh7OtN+on6/GNh0mKh4jzaapo6We pMsuK5qCjp2YjoqxEQ0aEA0GD3CdrK6ZlpV9HR0nFw8TI8HdRLacnro/MV01ICxesKqvpqKv x0AqOouHopOejJYiDRkVDAwIJ6yk2JmTkJs/PG4nDxIZJSoiPqSft7/DylAqLG7bPEfFvsE7 Mjgr4YGHnYyViJQcEywUDgkLKbVkyJOUkpzSXEEUDA8RFhcbPqiqrqeho7VI0MA9UNPHxvD0 u8RZQESShJmnlpWS5RYtMRcPDhs+NCLInqKv6eGxPhcWHB0bHjC5sLmqnp6ow8rFXjk4WMO+ uayrqa3SU89iMzrgsKyto52est9jOSkbFx4oLDvrt6+81dhLKyMkLTU0PNazwcbGvLdFOj7O t+7GrqansL65vWk4RdzHyFy1r9TF8kxUMy9PSjtKW05qSkNe4Uzez/63y+/KzFdcajE3PS1O aUTKwOztWl/M/jw+xs9fvcm3uGRjyMRq03zLutZf+czE+1dXvUU8qZcaC6CWPRlpcD5Vsjw4 u2NksGA1zz1HtnIlsLcvqlk+uFM9tUpAuXzNuT5VqE5QbG6su9XPXsnoMEQ+TTpCP9+8Pq3Q P+ZwTTU8Nl94LtGxUL7MzbpN07vmVc+7stHWys2vLzC+RL44wNPPtCOt1iPFO0JD09hDqtxo ozIuzyjdLiLLOqxJNZ06xcIlqOdLyr+nzLfbvqM027ZA0j9Oujg+Yji9MSG+Rie4O9WvP9q9 vzjeZkxONPcvqrclqWhFoSgznx7HpSeezUifPLmvOD6yzFdVRk7RWS5L2T8qujLqth6nrCr3 vb1H7D8tuD8y9jyqbianaja8yda6wjfDqT/2t8jft/1NqcY3uPgyzjxmwT1dtzpesy1FTiTU 6itDLc6/MvTXe9zP+2qu1ea6LqqhI6euMK+1LtWrMXatO2+/PL9SJ75T3jkytUtSQco6sFIj pTkxwS5IrCpepC69uzPIvzYxq0vCsVGkZOa18La/Ndq4Vjj1uztdPFe0MVzVNM3sLWO3QnMy Ob49MMjCKtCuLkKtW0bETs7B2Ks/qavupl3PskfozzxCqDInoCHgzTGwHzSuVyNfsCw+4dNO K7SqLy+o+j3EvD233UalMbqoKrynOrqtKsSqLW+xMr63HrDPIKw1O64oYLkr41jZey2nOi+g NjnFyGs2Xcm8MEemOiun2TGrwyutqz6vVM/G6v7uxUTHNbtYO7hL6DqwVSzHzzUt0eUpVqs7 MbDOTkK/vySztS02otspo65UXbi2L8CwPEE/uz4kqWkvsmVBQa6vIt2saTPXsUpN3r4u6KxC L9m1Kky+RzRKv68rX58n2sRseDam8ivHyEbnzcQ23asvrqZEtnVEYc3bMkC/7zAzq2Qor05p tSeuPTC4KDuxJ8m5Nqk+WaZMVKti5dW6N1GrKMCzKqzOKp/pMqY+vbgiv7wgQq8qPbgvs0ku qTQ5qiRDrFAqe7IorEQ9nVFftbu3vDxNqj1SvTCwyzm2Sk63Ryq4+ySuYDTALLXZV8Yzv8I8 Plm+SEbK6Uq5Ly6jK1OxZrgwrt9NsEzF1KwuNZ89NKk4yrwsws7MOj3M2j0uszuyLi2gLb8v P6YsUu5nwkNtPL3KN8TIscZEv6tvPsxouj9P0z2+VUbT0LY6d7ZC9VVRdllFXFM0x2Y9sz7L UUPEKehOPr84ssttrNe/u9XNRc9qOLpN07RF0l1MwT5VzDXce0K/UNxVMtNNSsHSyGi5vfny 37RYR2420Ek3vVHYW0a3X0LrRe3KRmPSwL9qXMdyVkBl9k1KSM/H0td8yL5P99VE5fdIaktd /UZ56//resjhWsDYccpST09X70pzx9XGwcfeeFNo3E5IcGplZknkyupr2L3oW+VaVUtX2+LZ 21LVy95XUHg/QD4+Szw5OUFLTElY49vsx7u+trOrqaikp6akqbvM1UIvLCssNDk8Pj41Kicj HhwcHiMpLj13ybuys7fAzZSChI2Oi4ugHxQXEgwMF0yloJyXmKsuHBYOCwsPGiUvZ66osts+ KiopKzxIvpyAgICWkIC2FAAAFgADFFePjoaNiI24GAsaDgMOPrK4tqCiviAYHRcODiG9tsWb gICAjJqNoA8AARgODBiciIuRmo6bIQoLFQ8NFciZn7myrS0UDhMaFh3om5ibnJuDgIWgoZea FQMHOBkPGK+Nk6a9mqscDQ8fGxUerZu8Sca5JxAPGR4bJc6em6Cmrq2KgIqgno6VGwoNOxUO FreOmquokqceEBQgFw8erJ/4V6+3Hw4QHB0XJK+fpKGdp8mTgIGcn4+MLgsLLRwNEk6Qmba8 mqkeFBUlHxclq6DOSb3HKBUVGxkcL7a2rqaksysuioCHm5CIjxkHDSMLBhWjjpmhlY61GBYc HhMVT5+vRMCqahcOGBgOEDSvvcWlnbYjP4CAhpuMgo8RAw0mCQUclYubo5KPOQ0RGBgOF8aj wkKnpTkSEBoUDRTKorCzn5e4IiqHgISejIKLEgEMJwcBHZeJmZ2OjDsJEB0QDBG0nLw6o5sp Ew8aFAsRyZivtJaTqyAdmoCAn46FhjsEBx8PAA+ujZSfk4ukDQ0bGxEMNZ6lNbmdvx0PGxoQ Di6do7nCnqcmFyeAgIeVioKOCgAOHgAEJY6Im5iIiB4KFxYbDxiolK1ym6dOFg8XDwkParK9 Pa2RsBoZj4CAnpWFhx8ABTYNABqYhZCfkIa7CA8bGQwM45OqNZ2W6xUNGBoKCjafpLiulJk0 Fh2SgICljYaEJwAHQAoAGaeHk6SXiNoLEhYXDQw1l6o3mpi2GxMbGgsJLK26T7WXmDsbK5qA gJWOwoOJBQAbLwAek5ygj5aPlhoKDTkUCyqgu/eZrU8vExIeDgohsKGvv5ua+iUsXoCAj5mL hJAKABwtAAgcmo+nsoqJHxUXJyEND7GaNk+so9IZFiMXCRIu28JmrpeePz+7iYCFqIyHih0D D84FARa6lafCk4ZvFx0sLxAKIqIzJrygoTMcJCsPDRw2Sy5vnZmpuKuUgICXl42KrgsLNBcE DiGhn8evjZ4pJStWHQ0Rx0geMKuXrCcn1CEPERsxKyPEl563t6CIgIujjoyPJxAcTg4KFjCs vl6nj6hsRNlOHA4UMiIaJ62evDdMziISEyMrISuymZulpZmOjJGdmpWTq1g6TiscFhklKygl XbOr1t3QxE4lJS01LC890GgyLjAuJCIpc8NIZrq8t87YnpSRmJiPjY+jq8dOIBkUGhkYHSQ1 PGpgurS5wsbL0207OSwjHRwaGiIzO0y8t7O1uqymqJuVj46SkJGVptIrJBoUDRAVHyYoV7Oi oqOkpK+zciwrHRYUExUXGSU6U7uopqeqvLS2uqSaj5CPjo6OnLExKRoUDQ8SHyIpTq2dnp+o p7HoKR8cGBQSFxwhJjy+rKmrp6u2U1rZ0tOpl42Oj46Nj6pVKSMWDgkPFR4iN7edmZuanqG7 OiMcFRESFBogLkS9qqKmrrWxyj8zOUVIu5+PjY+Oj42bvCgkGBMLDBMhLUyun5aZm5+oxTEe FRMPDxIbJEe0pp6foKi260cqJSIkMdaklIuMiouNkKFEHBcODQoPGjvir5+Yk5mcqb4tGhMO Dg4UHDXcrKGcm6Cr1T4rJiAfJS5Mu56VjIuMio6UqFoeGRIRDxEbL8KwoZ2Xmqe+RSsZEQ8P ExkgO7qpn56fp71MMSoqJyYqO13JppiOi46Nj5adujYfGBQVFRwlRL+qpaKepbw8KiEaExIU GiEtXbKlo6apq7tbMSwsJigqO+K6rZ2TjYyOjpSXqVwnHBYUExYdKF6/r66mp7ddLCcfGRYZ HygvS7mmnqCmqrPZOyonKC4sMDzouKqelo6NjpCXnLI0HxkWFhYZIC7Tt66tqq/GRiogHBoZ Gh8vWL2tpp+gp6y3ykgtKCstLy0/0bSjm5SPkJKVnKjZKiEZFBQYHCc2fLqqp6uxyUkuJCEf HyIqO1XGsqejpKqvvW43KSYoKyw5Vby0rKGclZaXm6Cnsz0nHh4fHx4pPM+/w768v205LSsl JCUoNEvFtKmnpamvvNpIOy4rKi83OT9I08W0rJ+cmpqdn6O4SS8lIx4eHyo39sOzrauyxGE+ Oi8tKSwwPUtg2s68u7zG41A/PjAyMDk8O0Q/98qwop2ampabnK7IPisoICIfLDFnzLu4t7PD 0U9BNCwoJywxR1rN08fHy+FUSzozKistLzY1VknPuKabmZaYlpucqrx+NDAkIiAqN0xxxbe3 vvpOPjkvJiQlKy01PFvqycbKzXtWRDgwMjg/REtq58u2rp6WlpqYmZquNjgqNSQkLnWxrrK2 t9ozIx4fHyElLzZBVWpiWUI6RTpDRVzk3mpcysHGy8FQN+ufkI6TmpebtS8dIiguJnywoqnE Wz0rGRcbIjQ9T82+QDMxMTIvOtmwu7u6v2w1JihNWV7HqqOtv6OSlJqfn52tNyouNS8vOLi9 dD06LiYcGiQqLT/Yv8ZOND9FPz087bu98sbObkM4RNS7xbirqck0QaWdn5+Xl5q7SkIvIxwl Mtg5Ts7BPSUeJSsiJ0XCwPVa2tk+MTxewsjJtq20yfE/ODg9TXzNtb/ea6yclJWcn5+vOiEe JiYjLNbDvmRSUDMgHSEuOD/Ktq7ITUdINzNC57rN0LqvyEA7O0dCW7e7tKqx0dOuopqpoaGi wzgrKC4dJS1XTmvpytwqIyMqLy1Wu6y4vsXEZTVCRl9Pbdi5vehzQz46OENH6rq2zVGvnZui n5ydp0VMMi8hICZEXkHFw8A/LicqKCkvR8zbx8/I7kUwOUpSbVnIt7rAvMhsaFHy9FDNvcHS uqehn6CfpKnURy0kJiIlLkNJzc/XZ0EvLy8vNT1S2dRe3dX0U0pc1XROyLi93vfW00c1WdrZ wb641ea4o5+mpqiftVwtLy4iHx84Q95tvre9XDc5ODIsLTdTT3nKt8PRcu5bOzhI43TOvLS0 t7O4vcvpRTc/2ri2sKqnpa/BZkc5LCgoLi85QX7OyMrOzflQQj8+Ozc2O0BNWG3d1MfAwsi/ uru9zdzyYlVJRD9BRFpkddjGvbq2sK+vrq+3xdr05ubweuxvV0E8OjYxLSsrLC0uNT9HRUdP dt7WzcG9v7+6ury9v81mSlDnzb22tK2pq66zurnB12FQTVJMPzk6ODEvLS0uLi8zOj9LU131 7mRk8crDxsfDvb7Bw7/BxdZtV1FacvLOycG5t7m+v7+6vMbMz+HvX0lFRj03NTM0NzU5PkFA Pj9GTU5KTmLj0MvKxL6+xM/e5uzj7FtMU9/RyMC6sa6uraytrLG7x29HPjs5ODo5NTEvMDMz NTxMTkpLTldUREZJWHLg0Me/wsXFyNZ8W1xVSlvRw7y3s6yqrKyrrq+zvMvpTz85NTU4NDAw MDE1NTY/UWBaRUNJSkRBQE1Wau/q2+Pfz9Tb2tnKytjTy8W6tK+sqKamqKuutcZ3Tj87OTY5 OzcwMS8uLy8vMjg6Oz9GTlROTE5ZcNzRxcHCyMnJy9LY2+l+4svHwLmvqaSkpaaprbbJX0tD OjQxNDc0MCwrKysrKy01PkdJS1ltbPTj2M3M0tbSycTCytDb6u7n4dLCuLSyraikpaeqq6+5 z049NzEuLC0vLy0sLC4xMTA0PENJTlBk2M7Jxr/Cx8zR2Nvq3+fk6+zi2dfMwbq5taylo6ap ra+4ylo9NjQyLy4vNDcyLy4zNDMyN0dNVr+puN5KOlYrKi0uNTfzvq23z8i/yMWml4+WmZmX neIpHCUdHBgiVbqxzcbqSCkaGhsqNzveq52kssbDzC8lJTJAPkjTrK283elCR+c6NShNlYiK lJqboTgODxYpJi/OnJWsXS4sHRMRHFyuqaihorksHyUrKSlatK7H9MjMPys63V89XKGmTSZK joaMqqOZoygMFy93Iy25nKEwICssGxMaPq2qta6szy8hKDNSUtGvtMs4PEc9LT+6uspruKqw NSdCmoiKmp+bpy8PESJAKDu4np9XJiUmGRUcOLivtq6nuyoiK089NuuqsT00Q/E7L06xsD1H q6K9LCjCj4eMoaCirRoNFi5XK8apmKsuIiMeFBMfTrXLqJylaCYxNT4tRbazukxiXl4xLuTn VD+znbsuJjnLkomLm6GttRoPGipaNresmKoyJyMeFBUg9a26rZ6bsiQeLzsmIuGlrDszx78z JDvDzzp2paa6MSmqi4aYr6GdyQ8PJOsuJb6fm04kLTMdERkxvMfJo5uqLyQuQjAqR6upczhL 1T0sNr67Sj5ssKzEKSVhjYWNpZ+WtBwLHjIyHkmfnLUnLzgeEBUuyt1Prpqbti0pNjMhJUup tlxev94tKi9NOy14qaGt00K0jomPpqqctCAPIjEzIz2kn7UuREAiFBYpU0perJ2jUSksNSof Lvix00z2wuIvMV/NREjIqKKqs0A4noaLorafmTMPFEEwGh/cnq0sMMREFxMeSlwtS6eiqqTT RzQpKCE2+qw/d7bWcjEvP8JeX7ipujgzjYCRz8uVnxgLHqYpGSmiks8lNq8nDhEouj83rJih OC5D1ikdKsa2REbKsU8qNtf8NDK7q63JR9idioqXqJye1xgXKi4fGkyuqEs63FMhFBsqNy9D qJydoL7XTiwiHSg49jRBzOXoPklBOD/8yMzTsZeIhpOfnJ/jFBUjLx0cSa6iRDRFUCQVGSdH RtKonaK33uE+KiQoNTM3PODTX1VcQDc0SMbF1c6smIuJkp6aocMdGSIvJhwvzqvTP0ZUMRwY HCUxPd6qnp+zwM9qMCAkLTIrOc25u8vf6Ek9Pv9dSNqai4qRnJWarCMaHiYjGyM+t8X2XtPg MiEbHiYvMD3EqKSxwcTASCskJyouOvO3r7C4v8XoWtfP/LackpWfoJ2esDkpKS0tJR4iLkBG P0Nf304yKy46Pzo8Wd/S1drc2vTs3W/uzsjJ4mFPUU1KU9jFzr+uqau0urGtrrW2sq+vvF5A NjUzLi8vLzAvMDM2OTg3PEpdS05t1+VXVvzIvcTeVE5dVD47Q9XCx7uupqiwrqqkp62urrC2 zUY2LS8tLC4uNDo7Ozo9PTw5NDc6PURHS1tr3szBwt/q9W128V9c2724u7Osqay1trCtrre5 tbq+3j84MC8vLzE2PDw8PUFKST89PD9LSUdER0hLVF1o6+bm/k5ITGTnzby4tq+srKyxrKmp q7O1sLG3zUA0LispKi81Ozs2Nj5IQDY1NjY4OTg5PD9O7drm0MO8xs/Mxb++vLq4s6yqqq+u qqussrq2uL/rOzIsKCUlJyswOTg6RE1ZSj9FRz9ARlZaTUlR8OPr8d/x//lu1sW+u7qxraqn p6Wmqauutri+0mY/Ny8qKCkqLC4vMTZBTElCPz0/Pz8/SlxdUlBZ99rs69bMytHmzcbJwbWs p6GfoKCmqq24v9VZRTUuLiopKikqKy4wMzdCQU1YUlFTUkxWTF9aWv9u6t3Tybq9zt/Ry9Xm zr2uqKWlpaeorba/0v5IOzQvLi8uLSwoLTs7OD1CT11eWVlc/vBz+OxdWmDf4Vf73tXV/U9R VffSvq6oo5+hoqSorbfF6Eo6NDEuLzAtLC0vMC4wLzZEPT1HUWLm7eLfev7OvtLwztPe5uvz V1hvw7y7rqihoKCjqamttsv6STk5MS4rLS8rJygqKi4vNzk7Pj1HRUtb2s3Iw8fBxtjfzdLe 09Dazbi1tK2opKOjpKSor7a+/kMzLCwpKionKyksLC4uLjY6Ojk7PEJVUdjKw8K+yMzCwMXC yczD0MC+vbCup6SjpqWoq665u89KPi8pKikqKSwoKSsqLS8vNDk8PktNVlrh8d3Vyc3Eu7q9 zMXAvMfMzdO3sKyrpaimpaqsrLPEzkw0KSwvJyYmIiYnKykuMzNDU1lm3F7Fuc7BurrCx83M WdFWTPVqbmG/t7WmpqaqoqStorW3z1FJKygeGxkbHB4gKDYpMrStn5KOjJSUmayin6+hySo5 JiUWExUPDxEYGi4ququclZeZm5mXkqnAR+rEM0Yx1KcCDxkfMx7DJjldt1vnRGhT8q63r6Sj o6Kuu7e3xd1LUubWcPhY1sO5t7q2tba/z8fEbUM3LiopJyMgHyAhHhop7TMqN251Xvzi4M/K 0Mu/vLm2sq+vvLuzt7q6ubW0r6+trauvs7W+1V9IODMxLy8tKystLS4vLzE1OTs9PkVU7MzD urm4tbm5tLK1tbi8v8C9vsXAvLm2tLK0tbW7xt1cT0pEOzU1ODk5ODUzNTk5NjU3OkA+PD5I Vm/n3tnPxLy2treyr7G3u7e1ubm3tbOztrjD2+1vTkM7NjMvMC8wMzQ0MjIzOT9GTVVefPvg 18/S4t3W197o187JxMfCvr+8urq7t7a3ur2+w8fLztluW1FFPDk2NTY0LiwtLS8yNjk+R09R Vmna0ce9u7u5trOys7a4ubm5ub3DxsfIz9bZ7mlaS0pNTUpCOzUzNDg2Njk8Q0VFRk5d+dXL ycO6usDAxMnHxMbO3d7Y4nVo687GxsjIzc/M0fdpXWloXFZPXVpOQjw+SEk/Pj5CQUBDR1Zi 7tjMxcO9u7q8vr/GwMLU53duZWNqYF1gbG9lX15ra3To92/y4Hl1a2lgYEhPy+g9O1VZSk5P TkxPXmvq6/fl2M/KxcHAw8TGys/f5PNpem595N/b3eDnam10YmplTUpSSklWX19XYGZVXVNN SkpSX2Ji8+Xz39XU1M7R287L0tp/9dvR4tTJ3ufY4Wz+3trl41xSY+/rYFVNQz80Li84OjxF UmLUzM1q9NbMz8a+vbS1s7mxtby6vsDY225LWE1ATzw+XjtHS0FLamdsZXBTVExMS05kXW1R Tk1ITk5QXfnc1s7KxMG+vcG+vb7AyMrOz8nJ0+J7amRYVVddeHx4Z2NeV1RNSENDR0pOT1Jc aXp4b37o3dTS0dHSzs3V6Obj3dbX1d/f19PTz9DecVxWTktRV1paXWh/4N7l+GRUU1FMSktN U15cV13y7Gtq9eXj18zO0s/IwsLIztDV3mpWW+Hgcl1TVlhjX1pdW15eU09Vav50Xlp829HW 6erwa2dfWFRdavr1c2J74+Lc29bY2NTZ2Nrb4eXp4+Xj3evwemxjXl9aU1FWY2FUXH7p829e YltOUFVYVll3+W/02s3JxcTLycvP0t7p825lW01JTmJ9c2pt/tnecWBvbHX15tnf7f18WU1O Wm1+Z19fYPXd3OLxcGrp3OHs8P1jW1/02cvI0ung3N7V7F5eanRkXFFd6dzf3+Hk4npkTUhP WVVPTlNf+flrcvfdzs/d8PLj2Nvb2dTPzdXb5/V0//9kZm/r8/Tj2NPO2l5UVmBoVUxHQUJD SU5WZ3/9duPQy8TFy8/W0MzN1dnu4+h3b11r9u3+YGJtfvP4bmZw59/nfHD7ZV1STE9bXFte VFBfbO/u5dPR2+/r5ObZ1tnu6uLZ0+Dw++veee7rbvlsf+Xf3trVztx56uj+aVdPTEE/PTs8 QUpZ+mtm/fDdz8LCwcDEv8jRz9DOztppWlRSTUxNT1h973zk29Tb7/jx4H9fT05TW21laH1z 7n1eVlh5eH3v7t7X09TY4fXf2sTJXvt4XWVFRE1LVfP09+jf49np6tTU3dvm69vT0Odk72dU U0xMTE9fZV5kZXTc2eje1s/U1eTm6+nf5eZ6eF5rcnnm3e7f52T15NryXlRTZk5KWVZQTFV6 X1VUcGln29HNzs/MzMvW+tHP2+Ha1tzM0Orj7/hxbFlXWU5JSkxNW2VnVmrT3dXfVXJh/vZq YltuYllbX15x1tfZ0+jO1N3ua+ny2N372tbL1ejhZnLrWGLh/n59XuZecvxkTEldTk5jXmx8 +Fhgc19tfmh4alFdaWfo8t7LzsrHyMjHzs/U3dbd0ejtbmvra19aTElPSkpGSE5YXUtVUkxi VmV+Y97S0NrW1NLPzNR5ZOTq1OP7287Iys/n2MvmbFtnaldRR1JeWFlaVVxcTl1uc/TX2uXQ 6HHza/tt5HFdU1JnW1thc//k5dTPxcXGzPRyVGDiaFpRTl95ZujbzM/oZn3f187a2Odp0thi WUpFTVFQTl9/ddvf287Ex83uevhdW1lZ6fDffHpr/NXiZ01WU1dbU9RMQkJF5OXuXkk9QmdP UeDN4NHEv760x73Dw8bRusrFvsTA2cbV6mk1MS8xNTM7Oklp7fBQ2sdo2F5GUeZxUN3t7dbI zd3d1d7HZVZeYs/TyMnSucXPw8/28O9KUtnNR0pOP1pVTj06PjxF02TPv9PJetrFzN1X8k9P 3fZs18rJzeXGvMO3vMbMzd1OalZTWftHP0hLXt9WbmpEPzs8QD1BWU1r4OrpysvBw93Kx8Jp TM3l6tZn1cXS79BxWcHnaWpiXvdRTl9NXfn58/Pg4fvw1eLNz09izGtsU27hytBWW3tPUUhD OURMSF9ecGV+0t/Mzs3Dv73PuLxoye1MQ0Y+OExQQlj/22/f297BxdXx39Hk8HlSYmthVl/i 2eze7/1PWFZWZ+Ro9drh283Y8tfP19DbYeba/lRZREtUTUj66/PM0nhm+XVmTVJsalFPUl/T 2chewEm7+mm9NrY/b9texF3C69Pg387+115RUlZVYnlFXf/qXldha//u+1NrXW1i+O7u0Ozc 3Oh2+Ptv+21z7+nf1M/c19b66PP5+t5y73n5ZVhRT1taUFBbZlvq28y6vdfIY9tPPDxLQ0RN SGXW3s3MyMrO3u3ubPPkaVld999u7nVa6+7k03bPzdvP4vbLzM9vUUdJPDxKY0HrYvHNy7m8 32tPTkNKUGHJ2sC1vLja9FRVykfPRkM/NE5LS0FUWO7zXd2/4NPF5fbw0HrV4/7MzeHGxNDC yt5mWUlfPVJCQj8/RERgV9fMy8q/zsrk0H5eVVvZfk5pWd1YX9Xd/vDX+M3O4trKd3v1ZGN5 Uk1TT0xW7FtRa/nMzd5cz+/fytPN19LT5/dreVFiZHxRW+ry4/Xf8ltSQjs9OTYzLzREPE39 ztjBtbizr6aloZ6dp6isrslCKykrISctOEBPSj4/KSEfHBoaGRwkLDVLsqCZlYyFgoyNk5W6 JxMVFg0SFkKuo6Sdl5/TMB0XDw0OFSAvz7Kop7VTLiwiHh4gNbqekIqEgIGIkKHJGg0FCgsO HDeclJCWlp7zIRQNDQ8TGze3p5yfsFwoHBgVGh0mSa2akomFgICMksqxFw4FBxQPMkSckI6X prc/HBQNDxkgNsWjnaStPiweEhIVHynKt7amnZWMjYeGkpG+thYUDAocFkTZm5WPmKxFPRwY FBMjL0zFq6q94S4eGBQVFyJFwKqqraetmY6HgJKNnKLBExABExIYK7SZjpOdxn7pIB0THjRY x/q7uUQqGRcUFBkfPrqtpa2suNadiIKCkY+fmjcMCQYUFCcwqY6LlJ/nKiIYFRQiOkOxtLxs MikaFhYZHy7YrrGroaSzQbCGgIOPpJmZPg0BCA8kNT6ejouTqU0iHBQNDxgoOkTgU1s7KSIf HyIxzqadmpSYnq/FPyWtjomPo6CYnFQYEhAWGxokyaSfoKrPUUQvIhwYGyIkJSw7R0FNREJa 2LOsra2qo6arrsbgs5mRk5ylo6POJBoYHB4eJUW2tb/VYEYxJR8fHh8kKzVZyMK8vLjA1s/S v7Sqop+fpK26zL/Byd2+sLG40E43LSknJyUsR8G0uL7L010xJyMjKS41QFXJurfMycbEu8/E vbW5vbi8tLW5u8TFx83vXW1RRD88Qj1AV9vI7kIyNz09NjhZvra+yM3K8DsuMTo9SF/YvLe8 sq+3vsLH1PxPUORk7My/2E5ffdzv1fFYRDtESDs9Xu7U0szDwPVLQ0RFQDtJ/cHTfvflcOne 0sDVycjtyM7NVGTtysrUxbu3TEM/QUNCPWTo4eq/z+FLUD5JVi9aUc9nzXfD3mt0zdpwxcG+ v81M904/OjhW5cTEyrfNxs/VQ0FFR/Prvdrcb8x8W1JPV0g/Sj9c3Ti/Ss/KPLrVtbVZuTu+ QHtMSFU7vEGvQ7FOtVhZ3j/jOcg0vTi+V7xFv1JdYUVUXFU+XGnUvU/Kv+S72OZv50vyWkdI WjnGPk+/Ranksc25zN3JSXlTQEzbR0f4NNo6Qz4vSj3EWLzFt7O9re3LV3N4OuIyuk/ovjuv T0y4NLFlZbREtj7ZXzLDLUpYN75KW9Q+1UpE4E3TxMu5uby54s9ZXUNOTD3gVufOXtm8WF++ PfjBTLzg4blb4ltJ1jRDPzdaO3I+Q8Bmv8FRs77UveXlz2hmTkNHU1Z44ebHvbfM2dVL6WhD UHNZ7+dx085PaH88RUg8Pj1Gbn3NxLm61dPQ0H1UaPNtU2ndS1Pjx85o0sbCytHca+1UR15d ZNxc3s1odkdKTktMPEZ4xsZ768rN1FlGP01ZTkxd0MHVy727vLzBxMbVztpXRkdHRUVJSUBF SERLbG19TEzKxeLf3sjJxcXY1N/bSURbc2ZeZW1ke/x3Zn7h4NvNv8HN08/X7OBdWNhMSzw6 YWNROUZsafJc7sjU3eFebunYzs/Q3W1mUVlsVEtbYmh3Xsy+xcbDu7vJz8/j+UxXWVpXTUpW WU9XSVE+QlZIQ0dbycty4Mm7utNjVHje9UVHYte+yuzQvr3LXE/nz9LMz39y7cHN7Us4bE87 My8+SD06U37MwsrIx8PM0vZY2+3Kz2vh18bV+OHP0NzZ2n7J7FrZ5VxbTlbUWEFEamhUQEZw RUZXXNS9uttFMT9PS0lY6m3Zvra2u8C6x87W3m528GtccfBdXtx3SHlMauxdUGBJV1o/Wkt+ /drcSd3obHBNXuRr2HnPw8S+x8vMxeNe0uHgbUvc5UpHQDpHTE9lX2756d3y38nXxsXWyOXu 3lJWVkZMUlhJTfnc1mf959rVzMXTzMy/xtDHydNWTUxAPD9IS0BDZthucnbWxdbh1OXf4mj+ ZUtPXmPz4s7Excng3uZbaHLjXk9e2s1bUGLn3P9bU2NnUktBQ01d79HV7dfPz8nFxMjO3tXt Ukpl1GdtW2F04eJbVF5xek1JVFBxVGr7dtHY299p1djU3trP6dvp3uNl2+V7XktMTVV7cv56 8N7z62Rje2JTR0phfPxt/dzYz8W+wszO1tjNzMzT5HpbZGtlW1FGPjxBRDk0MjpATfJia3Xb 09bb3NzezMCzqaOfnp6gqLXPQSwlIyUpLjg/T29kQzMrKCcmJycnLDI8R07pz8/f06qWi4eK kJyorsk/JBgVGCNPuK+ws7W9Yy8fFxUXHCEnLjtzx9ZVPDo8PEf60cvAvLiijYKAiJezSTEr IRYPER1in5ibrk4uJyclIBwaITBb5FpBNDAtKSUiKD24p6qtra2v1kWih4CDlUgjHyszHxUR IayVj5peHxkcHh0bHkWkmaROHxofJiwmHyY7sqWosOFOPzs5LSxJjoCAgJ8ODxYsORsVHaiL iI9PDgsPGx8eHzWejoyaJQ4LEykwNSw4xrCq1S4sLkM/PE/t1MGMgICDTgkOHMG8Jx4snYqM nxsJChQnMignO6mWjo9iDQYLJ8254zdR57e9MiooM0szLzRQeKiDgICOHAwc3apwHyHPkouU VA8KER4oIR8tsZiUoyYODRgtRDw6RMu+0VhHPj5S6O9Is6k1S1mQgICENQQPPqy7HxknmIiP uxEHDiA9MiAlTqKbn6NJHBMPIWG2tGZNPU/YNy42OUJDP2boPzGhgICAqAsNSaOnKRQjoYuN qRsLEScwJRkd5p2Zuh4SGTuxuDssRLu8QysrN1/aRi0mKEvLVzErmoCAgKoKGLGh0xYQKpeJ ktMXDyJBJRMNF0mlpda8qrkuEQ8d+6q1VC81zMjvOCUqM0K2q7dDxomAgI8ZDzGfrCEPGLeQ j6kmFhsuKhYPFUCdm68tIS7z2zIfJ86oui4kM8C03jIqLz9ZxGwrI06KgICRJhuumb4VCA/v kI+lOSMxuTgUCw0c8KqoqqamuDYdGh8sNSopPLuoqr1GMjIuLzo5Ly6jgICBnio8n6YiDAsa qpCXr19Ht7UnDwsPH0TYw725rq7cKhwdJiojJDq4oqGsuMlWQEVAMCYk0YuAhpezrJieNRMO FC6utE1Lba2huiocGh8xeioXJ62mykA9MjZANi4yUMW8wdlpQkLV9y4jK7KPjJmtrJyWnLJF Mka/v0MqJi3OrblTNi4vLygdHiwzNjU96MDkPz1BQkY0LjY9Ql7m3lQ8OVmmmZ2opZmQkZqn sbOvtEonHyEw3stLMzI1MysfGh4mLDdGXuLcbFFBMi4zN0zoWVTtyMliOTi/oZ+nqp+Uj5KZ oaaqscovHx0oRV1JOTY4OjIjGxsgL0JJOjM/X/RPNCwrMD9aTT1Ab8S6xOTEqZ+foZ+YkZCV nKGhpLVFJh4eJCkoJCQoLS8pIB4lM0ZZTkVJ7cXYSzg0PVbsWj44PVrgX0RQu6egoqOelpKU m6GlparAOScjJy0uKykrMTk6LSUlLDg6LyoqLjY4NjIzOklkY15QS/XFu7y7r6Oen5+bmJeY naCjoqa0TC4oJyYlISAkKy8tKCMlLDIxLSosMzg2NjtKaeLIwL/D0el94s69rainpZ+alZaa n6Slp63KPS8sLColICAmKy4uLC0wNzo4MS4uLiomKC46TufLvrm5vcna8efLt62ppJyXlJWZ nqOnrLXPSDo3NTItKiorLCklIiIkJSYmJygqKyoqLzhDUnfLu7Ctq6yusa+sp6akn5uZmp2h qKuz00o3MjAwLywqKiwtLi8vMDEuKygnKCoqKSkqLjhHbOLUw7qxrKuurailoqCfnZqZm5+l rbXE/D0wLSwpJiUlJystLjE1Ojk4MiwpJyouNjo6Pkz508vOyr+1r7C1tq2npaWlop+en6Sq r7a7x000KikpKisqLC81OTY2ODY0NC0nJiouMzg6Q13cyMTEw7myra2usq+rqaqqq6ijo6is r7nF70s5MC8vMDEwMTIyMDAwMDQ4OjguLCwsMDQ6PUrgxry6ubaxr6+xsa+urq2qqKenqa6x uMT0TEM+Ozk5NjMzNTg5NjEvMTY7Ozo1NDU3PkZV2b0/JkjKzs1lt6mvraSnqqSpqqSpr6+3 y3xIPDs3MzU0NTY7Ozg7P0E+Pjs7RFQ8PkRDSVVrR0U8OykoNUzW6K+enJqZmpqaoLLMT0ZK OzAwMTU4NTI1SFFBQTUxPjUwNTcsKi8vNjU779zLxb/D28qtnZaUmpqZmp63LR4cHB8jKzZL xby6wNpSQTw1MjUyLzVASVlHPT89cs8xNEVLwlBDxMWsmZaYmpydnKlLKx4dHx4fK127r7K2 srLJPy8pKS0tLTA4RkplXy4xQkVoPD+4rcLQxbCak5ecn6CepWsnHRwfHxwcLta1s7y7rq3J QjEvLy4sKzNHS1pBPENKX/nh38e2u+b0vqaampucnJuctDcgGhsbGBkgO8K2ubGqqLV3OTIz KyYpMkJqTTk4OktgTUFQ07+9xL2/rpqTkpeamJefwyobGBgVERQdOb69u6yfnq5HLCkpJR4f LU7ZW0dTZ2BZQ1XAzdnb6L6vnpCNkJWTlJqyKxoXFRAPEBowvq+vqaCfrT4nJiMeGRkkQs/l X9/H9D85RcvMbdO5sq2ekIqKjo+PlaguFhIPDQsMFS2/raujm5moPyMhIhoUFyVIwc9TzLxs NS8zPDstOb2vrJ2NgoSMjo2PoSUREA8MCw0bbLCtpJyXneYiHh0YDw4ZLD5BYrav4TExOjMq K0O5rbOqjoCAi46HiJofDhMUCQQLIsG6vp6PlKj4OSgYDQsSHB0jbKmrzUtTOiQdICgrNsKp qJuGgIGMiYWPaxYWGgwFDSjU2LOYjZe9yr0lDwwQFBMVJ765QUHFWh8XHCkgHDSon6yliYCA j4mAi2QdLigKAxI9KB+tkJavv6CrGw0aHA0NIk4zMMep2CUkLyEYHikqMMmrqpyIgIiMgoWd 6c5BEgkSKR0aw5mmtJ+e0CIdIhkPFigmIlCy8jRIRSMbHyUdHDXLR1ilj4iLi4OElZ6dwxoV HBwVG2yvza+dq+DBQhwbHBgWHSo5T9O6zzYwLiAeJSMfLUE/Z62Uj46LhoqWk5rEKS0nHRwm ND/2srK/u70vJC0hGBwoJSk6Rzo+Sj0sKy8pIio/MTPFr6SXkI+Mi5CTm6zTWS8jHyMoKy5G z2tb1FI0NCsiJSslJjE8PlBHOjk4NzEyMzU2PWBduZ+bl5GOkpWYn6zFSi8qJCIjKzhGTOW/ yVddQS4qKicmKCcoNTs2PEE9Ojs8Oz9GTGLJt6igmJOQk5SVnKa3zTspIB4fHyUzQE/1x8rn TD06MiolKS4tLj5ORTo4PD03ODs8RnjYzrKkm5eUkpSXnKCru2M4KyYmKi4zOE3c6kxJRjMr KSckJCkuNTw8PkA8NzM1PUZPV2XPvLGmnZeVk5OVm6GrueQ/LSckJScuO0NBR09ANC8vLiwr LTI1NDU4NzY1NTk7PERr1tTEu7qypZyYlpaXmJugqrTTPzIqIyUsLi82Nzk7NzMvLSwvMzAu MTQ0NDAwMjQ7SVdizrq4ta6srKSdm5uampuepayzykc1LCgnKy8xMjY7PDUvNjYwLisqKisr LTM3Nzo/SFTbyce+t7Gvrq2ro52cm5qbnaGpr7xyOy8pJykrLzY3NTo9PDkzLiwrKCYkIyUp LjY+RmfOycG2s7KvsLe5t6+lnpybmpucn6WtvHA+MSsoKiorLC0vMzMwLy0qKSgmJSUmKi89 WtnMvrWztre5vMLLfWLSt6eempeWlZicoaq6ejopIR8gIyUmKS0wMi4tLCkpKScpLDE8SnvO v7i3tri9wsjP4ej56sy9raGbmJeXmp2irb9TOzAqJygqKysuMDQxLSglIyImKSkrN03kz8rG zNHBub3aPjc+WG/wzrqil5CPkJOWnanFRy8pJSMkJy40OD5BPDQtJR8fHyQoKy46TGPt2M7O 0t/t1tHPy8K+v7+/urGglJKUlZWVnataLiYgIB4gIyYuN0hAOzo1LCUiHyAkKjRL+tS/t7a6 xsze89nOzt7339rW2MWpl5CTlpiWm6tzKyEfICAfJC0/6dpqPT07MCcfHB0kKjE8Vse4tLrF yc3Kzd3cw8LYz8vS0uu+n5KQl5qcnKXXKx0cHyUiICtMvrfKWD9NSC8iHB4mLCwyWcCwsr/K zcbTWUxS5szSXnHb4GJNtpeOk5qcm5yxMR0cHiIfHirdsauyytrcUisfGx0hJigv366qrrW4 u81ALi04UE9LSt28vd1LRa2UjpadmZeb3yYdIyMfHCZNt7O+v77ERSshHx8fIy1BybCsrK61 cTEpJiUpLT/Yw8u5rrTOUUewlo+VnZWUmNkoHiQfGRkky6+wvqutvDQnJiUfHCE3d9XEsq2w 0zotLCgiJSxCz8rqy6+59D47vZSLkpiQjZPJIR4qGRETKb+sv7uen7wtKismGhUePllBzqqp sFw0LzEhHCMyRlzXxrCvxFlhSjytkYuPk5COmFkeHSEXFRYvvaiuo5yftjkrIxsTEhsmLTXO s624UjYuJx4fJjZdyraqn6OwvrjV956Oj5aXkpCfOyQqHhcRFyrLx8apn6W9QCwoHhUUGyAl NG67rbHJXkgwJyUlLUJSbrWmpqyvtbuhkY6Ul5OPlrI3LiodFRAYJzg69rGnqr9IOSwdFxca HiQuSMS0try+yWE9MS83RExgyLeurrG/s52UlZqZlJGZqtPxPCUYFRoiJykvSMXAb0I9Nysj Hh4jKi81Pk3exLu3tbm/vrm4vLq5uby+1FtQ4L62sK2jnZyfpKu0y0k1LS4tLS0uLS41ODUx Ly8zNDI3Oz45ODg9S1FSTmbYxry2s7Cvs7S4uru/v7mvq6inpKKjqK+9zmRAMSooKCsqKSkr LCwrKy4zO0RMUlz6fujuXFBQZ3vmyry1sLCztbvAw8fX39C9sK2urailqK+1u73YQC8rKicm IyQnKisuNj9PWFFb7eBnTkxJRklMZM+/u7e3tLC2vL7CwcbMysvHycW/u7u3r6usr7jFz186 LSokIiIhJCo0QWTJwcTNz83uPi8uNTtBTXXNvri4ubS5vLq+wMvGvr7UY9i6sq+xrqikp6+6 01w0Jh0bGxsdICs97cO2rKipsL9uSDMqJyo0Qlf30MHH0djYzs/U2s7NzsHDy76spJ+dnZyc nqq9PyweGBMTFRgeJzzIraejnp6ku0s1MCgfISg1Q13OurrI70xCPTc0O0BB1rSypJSPi46R lJapNx4UEQ0MDBgmSLuonJiap7jyMyEXFhkhJTDoq6OlqbS7TisjIikvO+7FuKadnp6TjouP mp2ftCMXDhEODg4dNsauqp+dpMk8OC0mGhsjSW3WtaWhrL9NPi0fHSM9U13Pr6ioq7irlI+O k5eWmK0pHhUXDg4OHzjbt6qen6pKMS4kHRccJUxbyqygoK28YUctIR8oNkfAxcGuqKu+qpeO i5GUlZatKxgSFQ0NDyRDtrGqnZ+vOiogHhsUGils1q2inJ2pv2NBJh4dJjtYxsCppaSru7CY kY6Wl5eXrCsaFBgODg8hOMu+q56gsjksKCQeFh0r3sixppuaprdaPisfHB8vPPHKtqenqrit m5KMl5mal6kzGhUaDw4OHjK/vbCfn6lOLiUkIxoeLNHCr6edmqW3ZkYpHxscJjNszLS6sKiq r6GakY+YmpudxywXFhQRDxUkPL2xo56erWE3KSYfGx0uWM2xqJ6fqsNmOiYfHiItSdi9vL6t p7ixnpaPlZmal6ZTHxcXEg4OGijmuKufm562YzIpJR0aHzh2va+jm56rzl01Jh0aHis7R2Ta t6qzvqealI+XlpaXrGIgHBkTDxIeLdm9qJ6cpLpTLikhGhgfLkDHt6ifn6q33TgpHxweJjJE UWy4rK+yopmQj5eXl5eoaCEfHBYQEhsrTtSxop6hrucxKyUcFxsiMkzfsKGfp6y01zsoHyIp LDY+TryxucSmnZWTl5aTk5yrPyogGBAPFRomLU20paWrr8HZQy4hICYpLjBDy7KxsrnF12xG OT9LSlBOUmhxS1PGrqSdm5eTlJidqsZGKBwYGBgbHiU0T35w+W577VA8PENEVk5Pzr7H3N/s 1NLJw72/wb7D0GBMR1NSTVnfv7e1trWztbW3vcLN2WpPR0E9Ojg6PD1BQURFSlJPV1tXRjw5 PEFEQ0pa687HxcfHx8rJyczBvLe0tLW7w87qUUlFRktUZtbGx8rV335iUUQ+QUtba3j63Ota RTs5ODg6PEBDS1Fc497c0MjEwry5tbGvtbi8wsvZX0hAPkJNZX719t7W3m1VU1VUWVteb/71 alFLQz89Ojg4PkVQburPx7+9ure0s7GxtLrCyM32TUhEPjk0Njs/SExUcNrdel5dceDNxcPC yMvV5mtMQT8+P0FDR1Ru3szJxcLAv8S/v769vb3AydR0Sjw1MjE0Njc5PkxjfeXXzMrHw8HE wL6+wszc8/ZbTERAREdKTlJaYGhu/tjJwb+/wr+7urzBx8/qT0RBPjw5ODk5ODk8QkhOW/fX x727t7Gys7e/zfhdT0o/PT0+RU5cX/jUy8bK09vb3tnd29Tg/ltNSU1bdfh8/2r9cU9IR0dM UlFe/dDGxsfIwMLK03tOS0hJT1j+1c3Ix8jFytPY+11dXlxNSUdFSU5RSk9SV1xaXW7o6+bj 4dbKxcPFyMjHysbH0N3vdldIPT4/QkVFTVvpzcjK1enf3N9u79LR0+VkcXVgWlVPS1RbX2Vq 49bV0NPW6Gx+c1dTU1r55eLm5OTg6OTWzszOz9XdelZNSkhHSlVZXn7t59/V1/JgWmv4e2Nc eebh3s+yvzPdR87WO9JrUVNnf+rcXVZyYnnc18/Jya6tOj49c8k2Pl1X89nW29LpX/xYT1RY XU9DUmr73t332s3TxsvLyNXQ1/lbTEpUWFxaZ15q6u3UzNHWfXTa0cjL0+br52lp82JJQUBC RT5AS1Vg627ZztfO0c3M0tDZeWrnemhYTWvf1dbT6NHExsnSeHxcWlhKSVNTTlBf1tvQ3t/N 12ZJUU9KUEzQsK/ZWDI6NSYpO+K1sK2hoarLIByvnasuIzvjPEjBy0dcPPm+x7Kx3Uo1Pzw4 MTjez9U+97ewvlfVxb/Nbk9SzWjA11dCTXRN3ODJcuTRy+R1101OP11LSTdW4MnPy926x9rP X/loafG/zlxIN0JKVVLwW01N69vR58a4xMde5OVc1evY6ODcVW1Jz2haQ15PS2U/YV/jcs/H 7X5PbcLKzN3PatvWeWTsbOjlZubV6FXPVlvdTXVfTlVLU1zl0uPNze3MZGBQTVpFWDtNS9vb 28b6wObQz9rF7Xlk29V3f13C5mbnXsX5YFb45lzlQEbu4WVXY8zN+npo5W9ZXlVdaGlr9WzY 7tduWtJQ9mNU80/24s7I09Hk4OBf//VXWVp73Nl8bevm1dbqX1lcU09bcd7b7HL19WdhWmBk aXfn4fFrZ/Lbz9r4curuZWXv6+rvZ37dztJxWGD6d1lNT1tlWVJZbOjp6OLb2Nrh3tfc3ufq dmNhZFxYaXtqYGf46u5mYnvc0tDU3Nvd4PNz6uz27XxdWF579HxueWxfa25WX+3u3dn9cf16 /1lgbd7mallVb9vU0Nfu8mtcXmzt3uTp3NXP0c/eXVpbZW9icVtOU2tvbmh8ePt5Zmp66/jx W1Zq9t3Z53FgYXvf4t3OzdDa5Off1N30XU1bYFxYT15o7+t32c/LzN5jV2BdW05ISVFc/nvb 09ri8HRp6OLe4uBsa3Nlb3Xn39rZ6HRr3dHe5nhw9WRWUFx0ePDf3+f0/25XXO3Y3vT3e3/v 5d/pdV5TUllu+nzy7dvZ2918bGpvX1VT+utzd9/O1fhbXWt45N/8avrp6WVVVlv86uN+cXzh 19HPy8zO2nhsXF5YUlFOT1VnaVtbWm7x5OZ05NfNy9Lc6O7d41ZWWVNeT1JeX+Tb19fWztTj 3uxz++Hf+mlneuf1WE9WYW/9d/bpb97beGl05dzzXl1ebGhOTk9o6+LZ1dTNz95sX2no2d95 au3m39DKztHfd2RdTU5YW8PjT1RI1k1KTEpZ98/V81Pu7951fdLk6/Hw2M/Jx87b4NvMzOTS fFBKQU5bbUREQfbLVE5d1chTSV1jWG3awr3mT3DLw8PieWZmcvj9SURO8M3Ozc3b4+vvZE1K TU9OSk5b6eLs2+n6+uzq6tzieFpXVVl7bV1PREpszs3S1uzx2MjAuLS2usnsXV9yXlBOWNq8 sa2xykEoHhwcHyQpLTpnxLi5xFpHXczG0Nu8nY2Ih46mKhMQERsnNV/srqKcmqfoHxUTFyIt P0xZfMq4ud03KSMnL2Cxp6GmrLTLTi0t2JyMiouXxh8TFRcfKDJTzKaem6DFKRcUFyRE08Zu TkrtydlMLyYkLUy8qqWlscdyRjgyX6ySiYqOqCwSDRAVKju+rqebnaDCJxYPFiLEnpmdruE4 LispJyUpNmvGxOFUSU5tV0pNZHfMrp6RioyTriYWDxkgT7itoq2msNAyGxQPGTSumZmfwy4i HiQoLj5vt6ypr+Y6LjdPbU05NDhksp6RioyTqycYERohQr2ypqunsn0rGBIRHDevm5mcqvUu ICAlME3OuravsrtnMygmLz1KRT9PwLGrn5GNj5n7HxMWIjiysam1ubhxTiYdGBsrY6uin6m8 SisoKDNQu7K5zFVIR0k/OzQyNjo9OD7ouLGtnZCOj5xLHxMbH1S0r6q8q7i9TyIaFBwp7q2p pKy4XS0nIitIt6Wnsk0wLzhQXl9PRj9CSkY9Ojz3t5mNjI2oPRgUGyHS5qqroZyotScYDxEd Nq2hnZ2otEMkGhceNLKgn6tdOzc9RUJBPEJFR0A/cb+0r62dkY6PoDsaEBcdRdyzra2lrb8s GxMWI3mnnp6fqrhFJBoWHjernZqdsGIrIyAkKTBPv6+yzUszMTlLyq6WjYqOpj4ZGBkfKC3v uZ6cnLgtGBMYIkeyp6Oiqbg7JR0fKT3Cr6yuu9tAMCkrNFjP2c/Ltra/70M65KKUj5WfaS8l KCUiJCrerZ2frE8rIiIkJy1Fwamhpr42JygvODYxNUjGubzcUEVO8sm/v766t8BaNy81QLGU jY2WrEIqIR0dHCI1wKmjqbzjPCslHx8pPFLNwb7J4j8tJiMoNdKxpqGhoaeuyktGWvvcz8a8 u7/KUT4/SVdrZ+XJw8LFytfeXkE/QEVOVUdCQURRTj41MTQ7Pzc1P2TGurq4t7SzsbC1vsnG xL7F0WxLPUVVXuViV+vOWz87NT5Z4u7mesu8w9xSQDg+RklLPEJH59HBv8G8vMbN1tzIwb+/ 09NJTVdNWGpodFI9REJDSE1OatvJw8e5v9hLPj9GUUlPc/bO0cu9y9P/3c/Fv7zGwq65tLXa VUZPODxHPUtHTUA+Ni8wLS48VWrLyb3FvMDM0MrJyMLL1MbL/eXi7NLc+1hNSWVtYtPIv8bK 72zNx37w+efN32JMWk9HSD06OT5FQTtCUm/v3szEv8nKyLy8vMPabmFjaWdNQ0xdTVJWXmbY zb3D7Nl1YUlFSk/8aWlefeHyVU5WX8/RzsnV719UUE5RbOTQyce/33ZZTEhR7tjR0s3a4tXH zfBnWnXv9d9jV0pHRUc+Smnm1NDT/OtkZO3Lv7zC09B4X00+Q0tOWWni8fbZ29ble87S0dp5 +Nnd3eb9XVdOPU5MTfrsys1u6dXV9FJJUXJxaOpm8NT34u3yd/lt2dLMzdZ4Xfbe2ezY+eNt WtXY6Otr53RZTUtIR0xU7XjeyMzbXUxc6mxtYFtLXOfGxtnUzPhrW1NTVfPM1s/Z8WZVUl1p 4+3bZll93NTX1NPLytlocV/ZfFZPTUpVWv9TWE5ZXFdOWVl8ydHP2szM0G5d9nbf7upv+vdP TE5XYOZva+PQx8bJxcXKz9TX3c/66mhRRT0+QkVBREROTV9b9c++ydDV7ejU2NbR0Pjbc1ZV VvdeV0xY5t3gxr/H0dXTy87mb2RwZmtlc2JYS0NHP0NF+uXN6mpw3tXuW1Fq28/LzdHP0Opc UU1Y+OFs1dnZe2Nm6ujr4u/f2/9rZ/Xk2OBdT0tWZWFub2NUU2razc3X193c4vdWUFRMTFZp +erT1Nvcbuz5/Xh268rAwMnV3H3zWVlUZeTpYlRkWU1EPz9GP0FJSklKadO/xM7RysTGyc/a 08rCv767uLe8w91cT05UddvP0/BgRjkvLjAxLy4vMTE2PEVMR01c2cW/w8a7r6efnZydn6Op s85GOTQuKyotNj9NUEk+OTc1Mi4tLjI2NTtCSGNfYnDtx7q0trzDxruyq6inqKmpqqmttshY PjkxLSstLzI1Oj5DRkdGQ0NCPz4+PDw8PT09QUdNWevNw727urizrKusrq+urausrrO7yN1b TUM+NzIxMzMyMzQ1Nzw+Ozk8RUpHQT9ESEtPVF1w2M3KyMO8tbCura6urKqpq6+2v8fN0t9k TD02MTEwMTAvLzAzNjg6PD1AQz88Oz0/QUNOZ9S9s7G2uLexraytrq2ppqaorbO6xNlOQjw3 Mi0rLC0tLSwtLjI5PT9FT1dZTkdFSlBZXm3x3MvCv8DAvbavrq2sqqempqertMLZbFNFPDcz MTAuLSwrKy4zOTw+P0dSZHFTSERFTVhYXHbcyb+9vLy+vbq3tbSxrquqq6yus7vJ1O9bRjs2 NDQzLywqKSwxOkBESU5ZWVldVkxHQ0ZMTU5W9dTOx8TFycW+ubOwsLCrpqOjqK22vcPK7Es3 LiwsLi4tLCwsLjA1OT5FS1ppampZT01a8OxwWl7h0tbb1MzKv7u4uLexrKilpKaqr7a7v8no SjkxLi8uLCkmJiktMDM3P1Fu39nafV1cXmRnXnTp3dfV09XPzsvQ0MS6tLKyrqmlpaessbm+ xdlbQzoyLiwqKSkqKy0wNTg+Qk7x09XvXu1dQ1Ja1Eg6PUVrWlf919HMuqedm52hpKakpqy/ SzYyMi4rJiUnLDY/SkzfsqenuE42MDAqIR0eJS44O0BWyrzBxc76Zk9KRjx+nIqHjJOYlpmm NxQMDRQdISUyvZ6Xm6xXN0A/KBkUGitOYEhhvbC8QywpLzAvM0bCtLGxvNZcRL+ShYaQn5+a oj8WDAwYKjEwSKuZl6JPIx0hJR0YGy6+r79f+cbQNCEfKT5HPkjEqqeuaDg8PzMrsYuAhY+X lZSoJA0JDhwoJy/BnJWdxCogHhsWFx4tRM65sbS4wlIuJyYqMDU/2rWsrbW4wOpaRTTLlIiK l5+alJ9IHBQYHh8bHS7Bqq7EUk5MOy0jICQrMD1GWM7Dw83Y3+hhU0k+ScjGS1nH0+PDWUBf t6Sdnp+Zl5SYoLvvRC0lHBobISMlJycwQvP8eGfhvb3OUkc/PjgsKCguOk7vyb26tK+zwtLz /Hbft6ObnZyamJadqcd1Oi4iHBseIiAhHyg3SFVbyritt9ROSk06LSUkJiotO1jMurWvr62w uL29vM3HrZ+eoKOem5ujsMveRzYkHhwdHhwcHigzQ0/qw7u2xdl4ZF5ENy0tMDhBTWLWvrav ra+0s7Kyuc/uxKyoqriupZydqrrkzU03IB0cHx8eHh8rNkZO78e8tre0usHmUUE4Ojg3ND1T 28jCvbu3u7y+wby8v7yvrK6zrKmjqK+6xMtJNyYkIiQhHx8jKy87QmbWwr28u77B2OdtX1tN SUNJTFZu4szAuLKurbCzu8zI0vLJ+967tq2utsvMWD0vKSgnKSkvOEx86tXa0exqYmdqXVlc 59l+UEk/QUdFVdrFuq+ttrKwvLXOT21KX/ddz8C+vsLH0NXfUkdCQExPTklHTEM9Ozg5Ojs6 ODxCN1qtzMm7vb3exsPHzsvJysS+u76+yfZvVUNFSklLV2lvysXNzMrP4v5mZW1pYFtiXF9v WE9EP0U8PD89PUlET25KX2J81M67sK6rqrW6usrD0FBda1nd6lHvdElFPDc+PTxJX3nXy9fL 2k1NUda/NUPjN78oKfrJtymswyyny9yswKuo0ces1kO39zXMTzBJPjlXTUZeVlhWXf5zX1pa S2vX589rY+9OUUIzUa+6M8+uMEm/Rr/gQqy4RqusTr7CSMpsOe58Qn5QPk1ERU08P0lATFjf 3GXZxcXby8VTqKMotbYvqz0nsTQorS4jodEsvNXiukVKq988q7c/wN9H2T8zTT876EQ6alpR 0dTwvsPGvdbJzV3NyV9u71Vs831m0+VO3VJVbzxOyz88w0E1pqw3s9pKu0RHxWg5z98w5to8 0948281Efcvx3srL3ube2dXa3u/cyNTZwM1SzNlF1kc4ZUs+TkdC9XZQ3V5Iatxb4sLS0c33 X9bV0szk4tTw9nlUdtxp6PBO39xf197+5e7O8WPT1d5VSmBNO0xtSkFm1ff/79rT7kpU1HNJ UnbS3k7Ju83awLx9Yd/k4/tvcOrsXktT9GVWXGrs7dnH4FZzbGhmQkjjST9daHlzeM/QZurI 3PLkbHXc3+vKzmPez/f6ZVra2V3vWE/nX2DuU0pg1G1U32p60OHgz9/Wz01X0G/91GdeWUpW 5VlDW11Vbl5b18jS09jax8/21M7Yclzx6HL86VlJSD9EWE5M/uvfysW/wcXEy9XfZXZ1XE9K X9ZINE3TUz5AX8j5TOrY187S3MfF6M3G49XFzNTdXE1TTEA/Qj9CSll24N3NwMbZ1sTAxczO zs/Z1uxRTUxHRkVER1NdYWRm3M+8qzwqxDIzqK8toKsbrkYhnicdny8kn0Y4nkpGoUlKpznX rCKqTiygMUSnJG2uHqvMJaQtPK8k8c04vuffx9rVtq0/sVwruCJA3im8W1W93r260MXMVtVd Wcd2wcjdxVPl7ELtR0BZSE1UVVtkTFhPTlpNaEVF7GTncVzXw7fMyLu8r7G4vL/B3fN+SlJV Q0dObMK8yddQOi4pJSEgJCwzNz9fu7C0s7q+wc7Nxa6fmJabn6auvEEkHBoeJzJSv6ympKq6 TCkfHBsbHCI48Lq5z+1MRUI7P0BewLWqp6qtqqOblJafpre6zzEfGRkeKjtX1LSqp67QOSoq JR8eICtM7tS7uLq/bjQrKys1TOm+u66nqa/RZrSckJObqLGrxDUbExYfNWlv0reooq7hLiYp KiYgJC9VxLq8wsLbPisjIyg1Vsi3raqoq7tLOzq2l46Ql5+kqLkvGBARHTLOyLyxpJ+r5ycd HR8fHiMvWr6wrrrN4044LSwtPM+4r660ubS+SjErTKGOjY+bqKmz7R8UDhYndrS3sq+lqr8t HBgaISYrMlbArKarv040LConJy9Sv62rrK6rqrlQLixKno2Lj5uqrrs/HBAMEB5Du7Otq6Wn ui8cGRshKS49+L6ooKOxZjQrKSoqLTvptK2utr+8x+g4Iyq2kIiKkaSwvcouGA4NGDarpqar rKevUh4SERklND1Lza6horFIKyUqLiwsMvOuoqKqvsa2w04tISi6komIj56vwegxGQ4MEie6 pKOoq6q1XiQVERUfMFjJu6+mpq3ULyUkKC89QuOzqaOotdRSWdpVNDBgn46JjJeu7TwtHxQO Dxo6qZ2eqLXA7zskGBQbLc6ooaKkpau+OCEZGR4qNjpVyrCprr5NPUly019HYKWPiIiPocND OiwdFRAWKMGinqe43UQ2KB0WFRwqXbKppKasufM5Jx8hLEXJt7Suq6yxwmFGQkxTZWTmrZqQ kJSgwUEtKyEdGRkeNLinoq7IT0VBMyYdHB8u3q+mpaarttg7LCckKTM/csq7sayuucz3WE9A MysyuZmOjZCdrMtNNycbFRUaMbukoKaxxvk7Kx4YFRYeNcGqoqOmq7PJRS8pKjFOwbKtq6mn q7jaOy4nJSYyuJyTkpaeqsBPLyIbFhceM8OooqSwzmE/NCceGx0nRbeppKastsVfPDErLDFB 0L2yrq6xvtxOOzMvLSw3upuSj5WertJaQjQkHBkcJ0m0qay9Xjo2LysoIiMoOd22rqysra2u tb7YTD86O0hZeGxvcnzc7Fs8My0tRbqgmZiboaqxu9g8KB4bHilAzLm1vc5eSzouKiYmKTFM uqmgnqGnr7/hRjAoIyQqN1fMu77UUjw4OTkzL0KznpWSk5ieqrtUMiYeHR4iLlK7ra68ez0w LCwtLi4yO2C8raqrsLvLa01DOjc5P1BeX1JIQDo9RURCRVHJraGcmZian6rDSjozLispKzVF 599iRzo0MjEvNjpGXlZh4ce/wcXV5eDb71dXTT8+Pz9FUFVaY2fhycLDv7qwqKGfn6Kpr8Du UEQ4MSwpJyktNj1LT0xJQUA+P0xcWVBPWfXLubS6wtPR1NnqT0k/PDxETlJhaePbzMK8uLq+ v7qwqqiorLXA11E+NjEtKigoKy89Ue7T09zv4tnedFJFPj9P3czBv8THxsXI1l9FPD0+R09l 1c/MycnIxcfEwb+7trS0uMDLbElAODYzMzY1OD1S0cO/yNPZe3P9WktGRkxdd+bf4XhQQ0dL TVphYnrXzMfHx8nQ1tLNysbBvLq5tLS6yO1bRT8+OjYzNj1IYnxrZ3Te0NPeeltNTU1LT1ps cmtrXFVUUVFPXm733tHLycLBv7+/vb+/vbm5ur3K7U5FPTkyLzE0PU5pd+TMwL68wcnbXUxE QT08P0dMT1tpcHRcTlZm4+Lb0MrEvb6/vb68u7q4ubu+yuBrST06NTEvMzk+UeXUzs7X8m1g S0FDRkhPZuXZz9Pf625raFtPTFfgysW/uba2tri5uLm5vcXV6/lVSz86NzMzNDY6QUlQVE5M R0A/Pj4/SF/lz8K3sbCvsLS6wsfP2d5qUk1PUFBVXnlvcu7YzMXFy8/U2upZSUdIR0I+PD9J XfrodWNx7m5ZWFlXV11u7d/b9l9TTlx03dLKwry8vLu2trvE4XZze+rtXE5OUlRUVElGQD48 OTw/Pj9ESV3Xxr/ByMbFxMDCzuRsW2Fqblpr6OXg73Nzeezh7XJle+Htcnnj09Do+19f4NTM zc3V2/lXUEdCQUA/Q0hOT1rw3NTOztrj7HFs/ePl2c3P0M/P3t7m8X96dGljYF9bZXBx6ex5 8+fc0svJzM7O2eprVVNLRj89P0RLSkVKUHDe19LW0c3Nz8zHw8HEz+Pe5fNoUkpISUtLTU5W X3ncz8rIxsTGxcbFx871V0pCQD4+Pj4/Q0hMVmz24dPU08nJyMTGxcTHzdfvZ1dRVE9PTk9W XHbw29DR0dnz/n3u5v5nW1tfV0tIUGfr4fp15tPR19fQ1N/tYk9MT1pz+/H659fX3dzW2t3Z 4npeW1xTWGDq0tzsbV5eXWRZT05QU1Vj8u7t3dTU2tvRy87V2uL+fuDnZFdh9u1waO3e0M3T 1tvtc2RVTUdIT1FUW25ybXh54NvreGFdXl1tXlVm7dnMzNbd1szJysvLy87O0uzi3m9US0dH SkhJSEdMUVddYVhdY2X15eDc09DU1t3Wy8rKzNjff3x8fe98/H5sal9cV2Z8ffHt7W9lZ2D1 2tbl+eDW2v1ZUVBOU1pSVldWXnbw6uDc7GR67/vd3OpsaH12efXqzsbEwsfMycjN1eNdTUlH RUlKTlZYWlVPT1JUVFpide3e1NDNysvP6m195NzX2/Lq18vQfGNlbWlhX19s+PDwXVJXYFxS V2X7ZWbv5dXN0N5rYGh28O3j3tnk/21sY2b5+XVsXFplbvL57drW1OB6bGFYU118+/3t29XV 1NHSztl8XFRVWlVPU1JPWVxhbvbc1Njn5dPQ33VmeXhrZmZeYfzn7Xv6+u/t/eDPx8nM1+5g UlVUU0xGR0lQU19v9t7f19DOzNLc5d7Xz9rtfGX43tri6HRcTk1TTVX+8GtZXlpeX21++Onf zsvLzM3S19vv4+15/2FPT1psbWhaTktLUVpcbHd492ru2dLW3NjSzs7Q3nz99Nzg7/Pt7WZb U1x87+/6cf548ebm8W5zaVdPTk9ee2VeXWvo8e7p4+XZ0c/W6mxv+PHh3Nva6F9SV2Ht2OLy X1ZdWVxfaH18fOvk3dnX1OF8aO/f6HlTU1Bc8+53a3b+7uXV1NnX6/5ZTVZab25rdHLm4t36 b+zy3uPqdWH3+OHW29TV6/RXTlNYdfT372hcW1dZZWzreV5r/+Dh5+TY19jS2uvo39vc6fL7 5N3ocGh0eXpOQktaa11OUFtifmtZZvba0M7Lzc7Lyc/Z3u3kfmNdWV1UU1lbXFFeW0xRV/Tc 0sjKzNDP0dfNz+PoZVhPSUpLRUdITE9TZd3OzsO/wsjO3N95Y3Jde+buY1hj6uHmemX4b2pn /PD5fvZjVmFkblpOVGPr5/p4cuPu4N7w2/vl4evievDa5l9jXPn0W2lt+nzu6e7v/uve5erx 49TOytXn+3fvYE1HRFNVT01NbeDc2Nvq82p25G5q//Lg6fPb2Nv4X2d03N/sZmLz3uTo4+Xi 2Nnd3d7pfGljVFJORUZGSFpa9NfWzNHU1+Dc7Hh+/M7O2fZm929rZFZnV1plXXZ0y8DHz+fh 62BcWmxfU1FHTVRXYV5j7nvk5O/a92j4z8nN3tzNzM7c1M/hZlZPUkxDTFVmXlV0+eHs1c/M 19vscm/409jfXl5v+V5PUV7uX1BUbtbPb2NdWGf079r6btrjz9jy4tjT3WJ239jP1vNbWuXZ aFFQY21lTU5YZV5bTlV0aGlebtvS6d7MyMbT2c/V5m9dflVSUFJZVF7r3s7SbXVV3u74dFPo 3tHMzfFpTVn5VlpfYHxyXuHjbORx6uxSV+jW4GhY5+bf5dPj42Rdc2Xj+l9qdd7UaHBmX+9e 6N1mXPDSzeZleebmbOZmY33n4G1g7NDYVkNNWltPTnZnXVvqztbeeG3Tzs3Y69nP4+xiaN7j ZGBYV3Vc3M/P2ltqae1SPkdc3O9OZdLJz1ja5et3SF9ebtnd29LUzM7d++n83e9da2h4Y+lk T0lEWlJLUvT7cvnSw8nY3NLS/XT61/dTavfc/u9sUE1OZmhd72F78d7Nzc/I0MzS3thcXlt3 aVFT9F9WP0d4V0xKUNTm+MXBxM/CxcXeWdtmblFJXURIR0ZkW3BmUGzexMXW0e3N2FTb8n3y Yujs3HhXedr1b1Nv0Fpj7NjPaVJfVGJbYNN+W1ZU0M355Vfl21rU09rZV+nNXvt7Wm1WWu5d 5+XN0VLX7snPTubybWJBZW1n/ljd/W9LedfY/kpaydHeY1bW7/BSQvfe19FQ0cHT1lhkynRg SVbXYU9ZddNiTFvhy+5j0MfE1v706l7pZlJMUXJpaknu2tveUljvUuhy4d5qfe/X3Nrb625v 6eRXcPPMyVzL1MjIRmNXVlxDTVNITkNcbW3qY2r8ftDOysfOyNH57uzn3WN2Y9tnXWda5F1T bf7OztrpSUxWe95u+3ZwXElS3t5YU+TQ6trEuNxUaN3SbUtvWVNbTH9EUNTOdU1PysBy787K w+Xu1GJYVk98Z1pcUHpcXPBl3OVtVkN34uxOT9rW1WJbzc7aynTTyGfqWmbg7NPabt1ldFpK c+hh9t/ixGfx5khtT1zuSVpN6utP29LP00xlbkdgUvh3UMnZW9N8zcVK4dj52nPkxdrT0uLP e97aZtZfVW1Tb08+UEJJT0tlYmHj7FhaatDQ08rSwd3dx769zHtPdlA+TUpSYWF57vX5d8zy +E1VxPHdXtq+Z97SW9RSU05LXEtNcs1qVlVw/kNNXtXSaubAv83hyMLJ6GjKfl9CRObo8UVI ZOPpVU5v1dpY8Vx+3Ezu4eTH4+nF7FhFcc9bXk3k2mjpysfD2uje+ONTV1VLYUpWYFDdac7n VmblYU5XbsTdee53yNBPW1l4ckl758/o38nOzfBl5ttlflfe9G1YWN5iblbd635uXGtTT133 +e732FdXW+/ZVti/vczy59bRWWJGUOJKT3dm0fvpxGRiZl3QX1HPXM/u6tPf3lX8al9kXt3j Vv1ZWFhgc1VLTE/W/uG70sfteNV4Xt/uUVTbcljTz7/cXt3U2UxdzPNUSEJT1kdX5PLMXVXR 6VDvzMZaS2zV1UhLW978VsrUwdTtxdDge2RnXT8+UF1mbF7q4Oa+0s1u88FLSmNh6lNd9P9n a3Fr/c5gW1F/1fBK88DL53DSytv+315dW2DmWF56ct5RSdnde1Jw+G9ZT8px3ej2z9jTZlzP 3M10WM9PR35O51lJ2elYQ2HZ1G1czNHf1OHBztz4Zmjr/U5TVF1JTO57dFJZ1t7V2vbv4efq R03r7NRd0uli19LC7WPF8U5NYMjMTV/ncNtHYVtJdVLQzuPc2vVR8+Jv60bdzF1uVXrua9PZ 235O6dlUV11azVRgzuba12tYbE3u+NpvV+rM1dH63dJ96ebPWGxe4WJPSmPpYOB5cNpOXNXZ 2UZsyfRJV/dlRnHN0lv4x85kVM3K3mx86mNBT+PN21P++Wtfa95fZFda3OjLz+bV4P5dU2RN VOHby2rex9/QfUZaQ/36Tnjj7PtP+uJj92nvYlXYvt5q4NHYUVvcVUfyzdJR/dnGV1DoTV9y dNXUyr7Va/TWXl9vbUtCSHt1Tu5sbWBfz8vlXevL3vls1+dZV17rXVrl2tdjedbWzF956ebY 6V5ef+T6e0tP5FBWTmzcTvrdZGdS0MZZ29zLyOzV51drb1ZbUtbQcWn0XVJOT1p3UnHq0r/I xcfX6N57ZllEVdpZV1dd1fToy9/nWldlTvrU3XdZ+utlVFdbWlNdc1/s4uDNyM7p6nDP1Upe 2czP7dzMyX5RTlVOSkpUTVlQ7Mzu28rL2Wju6e/rUdTbX9hxZexceelrbmjua1pQV/no2ere zNvxVk9uW01YZ01L88rZbefHzvL73cLHysjQ1Hxc7llLUE9MS0hTTUxn4v5pbv7f7mTT2c/J 3s/V5F5X+956bPdrT0tv52NZe+50WVrwf2V928rFxs3a3ebv5On4XvtrW11naPT+WEhCS1JU UUxs29PM3s/M3n3dz/5539TaT1n5VFzq19pYVnpXeOrWytjd3dvY2Ojs/l9iWGj1YkpETG9U VFFceFdecNXKycjL0drV2NdoYV9lbFtvc+L5c35ad+pw431b7tfM2WNz4mpbTEhVWFp26tvU 3dHJ3fB4ZnVPVmFp3+D36m5o6O1nYWLg2+7g2dTh6d/x6WJPTU9oWF5oYl9YZfB57ujufHHi 2eXq7Pvb0tfU3uPd5dnfdXr44d/2dO9rZV1bWE5OT1FPVl/r5GZZZNvQ4OjZ3tzX1N7ueuTb dmf449jq735YW2Btf2NaXF5s6np659zX29bS0NTT3PlqXWZcSkFARk5OWHH24Nva2NrQysfH 0+nxd2VbVlZabuz9ZXvX0t3m7P51cm5fW1tfe/Rwb35qWVxv+NXY2Oln4tje5HdibHx083D3 6Oj5a1xcdHhzZGZ+fOzazc7a3dv0Vk5cXFhXVVZYWmr5dmJf5NPO1+fn4NXOzc/QzdLgemRm bm5dUlJWT1ZTTkxSdPD17N/ZzszP2+Pd3vhgWVpnbHz3+/H3bWdoa2teWllTV1/61dTV0s7O zs/X5Wtibvp6YF1cYVxYX3l2aFtTVF555ub27/Hqe3Xd19HP2ejz5dXZb1laZm93Z1ZTVlpm bnT47OLmcWF33tfc6+na29/a3unu9WtZYGhr7uT2amNbXl1cbffv6d7a7nZ57O9uZV9haGVd Z2547Nvb5fP37Ozq5+Hsf/N6YVtidWVcaOTj7vTn2tbKytLg5Nrcbk9UX/x+VElJUF9uXVhY X/3p/3Ti08nM0tPU4eje3/Bpa3dqWlNYYnF+a25zamBbWVlicXNvfHN18eba29HOzc7U2+Di 6uVvUEhISEpLTlz40tHa3uDa1tLa49va2eLsdnHz53tmZ3NpW1dYXF5fXVVXb+Le5m9sfu/d 3N3m4dTW2NLT3uTreG1dWFBNUU9OT1vx5e3o3NfUz9Ha4O3373Zu+uDfelZUWFFUVlZjcfnf 4e7m1dHL0Ot569vy59zb0eh2aVdoXFRRTl9vcfFqZuX+6+xZV2Fu4vly3+7s8m/z2NDO0djp fFhOVldXWmHx6GVbbefT0uVrX2X/f33dz8fKzdDkd1pNSk1JSVRXanzx3dzX42hx2t7i32Vl aHbf9l/i39jO3+Lp7vFZVFro7vl8bODeem12fGdTVFpeYuTf3+Ds/ub0e2Vgfdrb0MzM13/z blRKR09NRkhNU2zm79rU0c3NxMDHzsvOemRLTVFJXFtQVmdv8nVn6O/t+OpuaN3c09zi3tbe blNPWe50W1VY4+hsXlze8GPl3d/86eHT1dv3/eZtbFpbcufU32/q/GxeVmN95F9dUkxi++nd 5WXiz9TW62To2+PzX/fj4Oxt2+fv4G1VXFNeaFBefXhvWFtmaPrV0c7V5tLO4eBoad9mb35g /WZfb2LncuNyU/RXbvHb0OVXXuVXX3jt1mBo2ehfcuvq4nPv3+p+YXVr5u5n82/z6G1mV3fq 59Zt+H5n2+Rj5WdmfmjzW27429xvXWBo69twZP7P0ubh0tfdX19vWlNPVV9WS1j/29fn9djq 8uvt3N3v5ed8ePx3c1951uNq1Nfm02VXYFNycFFfVFJlWmvs3/BiX9zHzt790MbNcVLkfFr+ WmhdX9X+YG5kZFJQXU9o7urc4NHM5M3P4+946fvkX3Da8urwet/uYE9dZNzZTk5PXWBMUmNn /tLQ0tTZ0sbLwMpvX+zqV0VJTVRIUO9fbnVsfNvsz/jty3Jc1GVk607bz8/Gz8xb5VlX01pW 52VRTklY7ef68NjOxMZqbVJOW+/NxVFASWLy/d3a00xJ4ebY5l/TWeLC2+JWbN9ST9vT2+hQ eUtH1NvQ5ljafEtrzcTfV1Np0OZVW0xy5W74X1jZz+njWezLy9NL7WBTU0nE5UhVZM/O087W x071Ze7AWVVj6FFBcV7NyGNfR0lcSD/XzN1pV8y/3lhc027L10f+V2LI8urKXklRYN64wM/K U9DtSDxa2E1PTNHUS0vQwMjWW0xdUW1tRdPUceZR5sFdTlhd38vdzOFgR1tLev5W0MK+12Vt 6N/fV0lbVtReTb7eUV8+XUo3TenP+9vS4tFa0tVpZW5fW2Hk2OxeW01SXk9PTNbBz+DRwcnz Xl5/SjxH7s9fPlDLw8Xu1L7VV1jh2X3wy7reOTtt71I4SsXKc1TLt7nIwrS1vsjMv77Z08nM 8j8vLiwkHhwbGxscJSktOFPAtrq4rKisu7ilnp2Vi4aHj5eZozwYEBUaHSd8qqOrw0EnGQ8N DA0OEhkkPFdMPD02JyYtPdSwkoCAgIGFhZATAAoLCQsWtIaKmJaUnykIBA8OCQ0nrafiWK5h Gg4QGiEbLKObmpicl4CAgY6aj5EfAg8hGBUasYuOPEy7aB4LCRwjFRxArLQqJmEtFRIXISwn QqCeqa+utbyHgICMkYeJLwAOJQ4NFKuKjymvnzoQChVMHw42oqslGT3IGgwZJyYZIbOj/TG3 sGAjyICAiY2JgI0JADMfCQs2jIamKJSuEwUHGzcUHpuarygp5ioNDyQkHhxcn7Q0t7I6Hxzk h4CAh4OFhSAADCkDCRyYipDLkZEeDAgPHBUSppWgrlG95xEMGRUTGCKwpT7lnq0sGB1rioCD iYSEhCkFHVwCDSWXkJ5sjJQWDQ0ZFwwVnaRmw7yvHwwVJA8OGz+tz0SfnNI3JjE+j4CAiYOD gTMFJNMACBmfl7lDjJIVDg4hFggRmZ/fvaWYNg8eORMPFS3NOe2epz9gPi0fIYyAg5GAgIMt B0k9AAQhm502uImSEhMcHw0HHpvHQ56WnSgXLCAKDBgoNUCnmaf1uzgaFUyAgJeGgICMERqj CgARQ6gtVo6EXhYtMxUFC1e6IraZlbcmPlUSCREZHhw7qKc/a887JSGRgISVgoCC9RLBtgQE JK+0Ka2JkBsdMCoNBha0QCaul5o3HS8rDQoVJSgicp+pXb6zuWs7mYCJloeHhKgfT6cPDBQ3 2iomo5g9LCk/JxgRKTMuLC/UZyokMSsrL0S+tL67rrWyuMPe07ejp66fnJyeoqKercPvQS8u KCpCU0o5NEF6Oi40PjcrJCUoJCAjLTAvND5HXGRK2rzO1ayhnJyYk5OVmJiYoK/GSjYuJik2 PzMsKCwuKigrLi4mISMjHx0fKjM0Nklt3+V/1bu2qZ+cmZORkZaYmZieq7v9MyolJicmKSsp JyksMDMvLS8qIyEjIyAkKzQ/U9HG3GXcys28p5yXlZOSlpudnqOrtMVXOC0qKyooJyYlJys2 P0BHTDYpIyEfHyIqLzI9ddXbRzE1RuK0oZiQjo6Pk5mdo7XPVUk6NC05QjQrKyknISIvPTk7 QjswJyIkHx8kKS05Re/VWExK37SnnZSOjIyOkZieqsFKNykkIiQqMC0pKCooJCcwQEhVT0I5 LywqIh4jKC03PE7Y3E9cv6uempKOjY6QlZeerug+KyIfHyQqLCwtLi0qKS4yNzlDTTw0MC0q KCIjJygsNTxETu62qJ+alI+Njo6PlJujsdU2Ix4eHyIlKTA3MCsrLjQvKyssLzI0MC8uKyUj KCgqMDpVybKknJWQjo6Pj5OYnaKtv04tIB4cHR4fJS0vMz9CRj80LSwqKi0rKiwsKysrLS4s LjdftqOalI+NjI6RlpmfqbjQSzMqIyEgHx8jKCwuMj1DQDw4MiwoKiwnJSosLS0uMzo5PX+1 ppyWj42Nj5GXnaOsvdRJMysoJiYlIyMmKSsvMj1VSz08OC4pIyMmIyIlKjE5OUXZv62hmpWQ jo6PlJmeprHDYTsvLSspJyUmJyotLzI5REZEQToxLSkkIiMlJSQmKzU8RNq3qJ6YlI+PkJCT mJ2lsshDMSsmJCcnJicpLTI1Nj1KRT07OzguKSglIB4gKCopMEjZv6+hmZaUkpGRlpqdoKq4 3EI1LiopJiMkJywuLzU6Ojs7OjczMzQuKistLCwsMzk8Sdi3raWem5iXl5eZnaClrLz9RDYv LCoqKywtLzEyNzo5NTIzNTEtLjI1NDI2Ozc1PEtne8CtpqOhnJmanJ6foqessL1nQT49Mioq LzAsKSosKysqKiorLjM3OUFNU0dASFJk3cG0q6WfnZ2dnJ2fpZuZysYnLy4ZHyQvL0tN88Bh MC8oHx8bGh0bFhofHB9jno+FgICAhZacJwsAAgYRLLuRhYKMltAbEAgDCBQf356XkZa5JRoO CQcMGTW7o46DgICAgJHOGBAIBwEiP5qWj5SWrRcPDQ4WL8+mlZmfqTgdGxkVHB0cHyosOjYl L6iMgoCAgInbLQoDAAUkvZOTio+PIQoFCA4f+ZaLh5KfPxwODQ8WKjMzOTcrKiQVDyCZg4CA gICNPg8CAAAXN5GNh4yPuAwDAAQR25qIgomeRBUKCg0WMrayxF0nHRoXEQ4cmoCAgICAkiIN AAAAFrmJhoSLmjwJAAACDrONgYCGnSgPBwcLGWagnrFDHxUUDgoOFkeBgICAgIcyDgAAAAAl iICAgZKqFAIAAAMpjoGAgYu8FwgCBw8qtqew/i4aFBAPDQ8cnICAgICAkRUJAAAACquDgICE mywMAAAACbWIgICGli4TBQIGEzuupb09JRkYFhMOEyaPgICAgICeDgkAAAAMq4GAgYSaHQoA AAAItYiAgIecLBMHBQcUNqukxy8hHx4YFA4QI5KAgICAgJsQCQIBAApKhYCAg5clDQQAAAUt joCAiJ09Gw0ICBEosqTEKx0fKCYaEBIhm4CAgICAjxcLAwAAByWPgICCj1oTCQAAAxaehoGH k7EqEggFCxc1vtw/NEzW2ywVEBRLiICAgICG4BYKBAAACjqHgoCNmkoZCgABCTOViYmOl6s4 FQsKDxsoJyEhNsKwOhsVFSmRgICAgICYJxEKAAADEpmJgIiNnTcUBAICEUuckpKUna4rFA0N EBcaGh8+tKOr1i8mKqOEgICAgIy9Jw8DAAAELJyLio2Nok8OCAMKGjG2pZaTlKQ5HhYTEhEP Eh/foZymv11Kp4qAgICGlK3vEwoAAAMespKMjYuXqBoMBgkTH0K4mpKPmtojFxQRDg0OGjqt oqOrt82ujoaAgIWOoqofEQEBBRXjoZCQi5OdKg8JCBAUIDSqmJKXsj8jHBUOCwsVKrSioqGh pZyNiYCAiY+ltyETBwUKFDexmJWOkp1THBANDw8WH0urmpukt1Y0GhELCxUfSMyuoZ2SioSE gYaPmbkyFw4KDBEeN7qnm5ecqzofGBcWExYePa+ioaWqtUIgFQ4PFRsgMr2nm4uCgICDjpeh 8ykVDQ4TFyYuRrupqK2+QzIqIh0bHiU1Tkxhz72po6nYRW5CMjA0P9ywp6WmrcFl4NjNw7y6 tauqrr7sOzAvMTZIy7q4wP5BNzEwMzE4SebbaD8vKiUjIiUrQ7inn5+jqa6yvs7e0MG0qqmr r7jWTT8/TVnizMxySTszMDEzNTlFXGtPPjMtKicnKCw7zK+op6qwtra6vMbFvrStr6+ytrzD 50xOVOrf608/Ozk2MzAvNj5Nc9vqUkc+Ni4sLTdpvbGwsbGvr7W+zeRmX+bZwLy8xdJ8VGJ/ zc7XXlJMR0RBPT9NeMzDwM1eSD82LywrMlDJuba5urm3vcxsUE9Tcmt96NXP1Olca9fEw9NZ Tlhdc11Z5ci6trrIdktBPTUuLS85Vcq9u7u7v8TJz9fmW0dHP0VPU0pGRkld7NXRzdPZ1MzG wr29vLq1ub/VXFRMPzcxLjE7TmpdVV/XxMHG0XRWUlRLTl/ueWx1+tLGxszSzMnMz9ju8eLZ yMTK0WtHPj5APz09Q05c3s7OysC4rK3XMy03ODI1P0lEWs6+u7u8urm9xtLf3ON07tjJycTL ZUI8QUlHOzY2Pktc391w38rCwcvOys7ceGxWTlZPUFny293c7t7b0MzR2uHt2cnKwczndUdE REA9NzY4Q2Tt9uHZy77AvczcYFh9a2Vf2NDLyc7V3PH93t/m6PJsbF9c6NnLz/ZcWV1SSD49 PEJNTFBg4szHxsXI4mhTU09GSFfdz8HCx8/Xz9bMxsPGydLk5NXIydHlbFVGPDc2NTU2OUFM YWv76NLAv8HO2W1paVVadtrOxcTCwsLBy8/a19DQ1nBdX/7qb0w/Ozw9PT0/REpe4d7g293k 58/N0+X6aFxTTl7xzsfAv7y4ub/U+3bn4elaS1FdZF9YUU5JSklEQUNISktOWW57Zmzbx8TI 0NDO0txfUk1a68/Jy8e9vb7GzcW/xdpqeNzV8lBAOjk4NzQ1OkVPXH3d2ehubW7s3tPKw8HD zuxgTUpRXvXSxb25ur3GzdHjYFdoee/7c2JWTkpCPkVPVVt6eG5XRTw4Oj1FSlLiwLy/zNnh 387Nx762r66wucDHxsvlZH/h2epSQTgxLSopJyksLzI1O0BMWldVV9q5rKWgn6GmqKenqKyx vc7Z2udnVkAxKystMjU2NC4rKCYjIiIkJyouOUrty8m/sqacmZqamZaWlpmeqspCLScpKy8v KygoKywsLCwuND9NUEY9PDo4NTU6RU5c2MjG1e/+fsq3qZ+foKGin6ChqLDIQjYxNDs8OzQu LC0zOT09PkFESUI8NjMzNjk5Oz1ESEpMUWj36+zlwK2jnZ+lqq2mpKGlq7LRckVBSD09MSws LzxBQzwzLy4vLy4tLC0vNz5IVGZ8+Hlr6Nzc6Fda0q6cj4uNkqG/Si4vJiQfHzXJop2isjYn Hh0dGx0hNN61rLK/WDsvLC0yQmXLvrm7zt9WRzguMDRYrJmLhomSySUcHDEwWT/+qqSbsDca DxQZKj7szF9PNjArKis38rutr7bYVEk/Pz93vLS7095mXKyYjYqSoTIgIiI+K0lDv6OtsSoe Gx0rLkVXxbvJPSgiJzZGzL6trbPBSDYuNj1Oa1tIUc7UPytGnYuEi54xGyst+SwvWK6Xo7wf Gh8pPC0uRrav2CgeHy1HRFfor6y3QSQjKktZQU/Er7e+zlU7Tp6PiouarTo5KiYmJG+3oazY MikrKyckKkm2wz4iISozOS4+yKmq0zgsPk5FOTNssKa2QzhXye24l4uGjaE9Hy8mKBwm0aeb rlArLDQmHh0sxbTMLyszQjUnKUe1sc47NENXRTQzcru7zMu9wMtIdKeRi4uWpLvePSAbGCzp rbG8vL7KNB8bHictLSw558RhNi01Q0A4N1S/trnLW1f5ZEE5T8K2vL+1n5SPkZqepqbFOR8c HyQrKjdKvrW/XjkxKSIeHiIsNz9RzLm5yVRMVVpJOjc8ar21ur63ra68WtapmpWan56dnbBE IB8fJCIiKz+8tr3ZZlo5KB4dICYpKjdpvbjC3eLfZT4vLzZH18W6t62qrbWxn5eUmZubm562 PyUjHx4cHik8WV5TTFFHMicjJikqKi06XdLZd27e0vBMPjxK8dnSv7Kur6+uqp2amZyenJ6j vUotKyYiISg1QElETUtFOC4qJykoKSotNz9KT17159v0Wk5XbWhuyrO5tbq8qqeenZ2enJuf pbvMTzsoIyYrNDQxND07OzYuLCswPCcoNCg5OTJ+YlrExNu+z0/b0d7Av7uwrrCrpKGenZ2b nJ+ouH4/MSoqKCkpKy0tLzI1OTozLisoJSUlKC9BQ0rOx77Gw7vCyruyr66urrGtrq2rq6el op+ip620v/0/LyglIiIhIiYqLjAwLSoqKiopKi04RF7ev7S3sq6zsK+uqKurp6ytsbG0vbq4 srKytLfEzt9MOTEuKygnJycmKSsvMTEzNzg1Nz5P1cnAv7q0srS7t7O2tbWztba3ubi6ubzD zNXV2+J8U0dCRUdJR0M/ODMvLSwwOkVKUU9SUElLT1nq0MrHwL+9vLq4u72+wcbP3tnPzcjH ztLP09rie29lX2FOS01MRT04NTExNDtHTmt3aXFu+/zl39bQxb69vL29wMLEysrM0uFrUExT ZX303+Hp5ODa+FtaX3NqcOzxZE5EPTo6PkhNUVRUWVxjXmDnyr67vL/Fwr/Ezt/0YltRS0ZK +dPP1dvSzMvO3fXh0tB+UElRXFRMREhQWlhNTmLp3uR6X2989/jv8O3e6nRjYWNpefXez8vO 1d7h7eHc5+v45t/m1s/OycXFyNHe53twaFNIQUFFQTw7PD9APz49RVR+2sSyb7Chzz46RKvj NJnPLckvo0QrvLTaOLi4wNdLzb5EP1XIO0JGRWU1LTxBMzJiXVtS7rvH0NzHyF3vvbi/ubLF u8bQyF7bbsxW3rhX/uR1SVM/PlQ+RVo/PEpTUEtDRf5aTOf8XcfBzuBXXMjO38Lp59faT21R XtLS5tnNzr69ydfI1szLWVPe/lpqc1tNS09RPzhHWENBTVtqcllsWUpLTFJU8MvKxcC7wM/M xs9XSGbO5N7X3OHIz8bKZ+XPzeDX+NDP5c/aXFJOTEVESFdnbF1SWU0/NzExMDAuMzs8T9PI vcC8tbnMzszM1/DMrqWel5mWl5+ovjgoHhkbHB0pOT7ux9ncTTMtJR4cHB0iLT7ZuK6opqyu r7m6wM7RzMChlJmWjo+WnanKKxkXGxQSHC02TruxssVNPSgaGBsbGyMvPHm7ra+0rqqzy7+5 wWvZtr2umJablo+TpLew4h8YHiEbHSpE3MvEv7vNNiklHxsZHCQtNEHbvr7H0N/X086/vL26 tLCzrp+am56enaCorsJbPDc0LiwrLDA0OTs7OzYzMjAvLy4sLCwsLS80Okpq1L+8ube0tLi4 u7y5rqagnp6dnp6gpay++D4xLy0qKSoqKisuLi4tLSomJyoqKSotLzlDWtHAta+ur7Cws7vC wLOqop+dm5qcnZ+ms85IMSomJSYlJygpKiwsLzEuLCstLCssLTA2PljXxb23tLW3tbe6ucG+ r6ignp2cnJ2fp67AYkAvKykpKiosLi8xNDU3MzAvLiwqKisvODxCSk/oyLy2tbW6vb7GzNrN tqmhnp+dnZ6fpKq11EgyKygoKSksLS4wNDc2ODkzMC4sLCsvNTk/RUtj08G9u7u9v8bP4mTZ saOdnZybmpueoqm54z0sJyYpKy0vLzAyMC8sKioqKicnKCwzPkVd08C5trm5trvI0dfV29O7 q6GdnJucnqOmqrLFUjUsKywuLi4uLCsrKiorLS8vLzE0Nz1ETFr82cnHxce+ubzF1eXa7Hzf u6qjn5+en6Kkpaq1z0s3LywsLTE3NTEuLS0uLi4uLy8vLzM3OD5JUWHg08/Lys7S0tjb09fW uaeem5qZmp2gpamzzUkxKicmJykyPT87My8uLi8vJyMlJi0yPEZKSVnTxL2+xc3Rz9LW1OHd r52YmpqVk5ihsMbdPywgHyUrLi43TtjQUj02LyghIiQmJys2Rl9ueNfP42N44fZXetPK2OjK vKmcn52SkZmfm5/rO0AvHB0wKyo51+Zn2l02KCkmHh4kKSgxQUlZzczg7k9Re09SfvfjzLzY frymnKeWjpuVlpypwlcvLBsjKx4rWUM1vtc3SDQmIyQeICQmLzVF79zWxclf6tRnTdzgeb7I xb/HqZmkmI2bkZifoEU4NiAYJCEcMDE/TsO5zURAMCEnIR4fIysxP1rLybq50vjuWUxXSElT bdnGyqOWpY6Omo2fl59B0ywdHB8dHiM0PDe+2G5ETTAnJiIhHyUnLj31zb21vcDS01xHOj5J P2JZ9saomKiQjpiLn5OgRLYyJB0eHx4jPDpAucrTRUMqJCIfHR0iJi06YnTIub/P6dtWTEJL QU3v2te4m5yfi5KOjpuPtMvNJh4aHR0bJTcrS9HWZUJHKSUmIB4fIikuQFlhyL6/zs3WXF9B Sj9E7F3MrpyflYySjJKSla6z+ykfHR0aGSUnKT9LXEhTPisrKCEgHh8jJzRCV8m/vLa5v8r4 YlNPWVjYzqmbpZGQko2XkJmyrXYtIxwdGBklISc6SF9XbEAtLikgHx0dHiQtMULVurWxrbC2 ubvB6dHd6NOxoqqYkZWPlpKXqKq/MSghHBkYHR4fLDM2Oz09Mi8xKiYmJicoLDE4Wr+4sqmp ra6wucXIw9Br1a+trZuZmZaXlZuoq7s0KiYdGhsdHR4jKysuNjEuMjUwLi0vMTJATubCtq6t q6uur7CxuLy6vczRztTcybewrqulpairsbvD3Eo8NC4tLCwqKSgoJyYqLS40Ojk5O0FLUmbz 2svFvr28u7WxsbK1s7S2ubq7urGsrKuqqqyttMV9TD81LiwqKispKSgqLS4wMzU4PD0+QUNN WF5eYOPWzcK9u7eysbCur6+urq+vr7G0tra4urq+ydbmWkQ6MC4tKikpKy0uMC8xNjs9PD5D T1dUV1pu8OnVzcO5tbWysrOxr7G1tbS3urvBx765vMPHytLvX0w/Ojc1Ly4vMDIzNTAwNTY3 OTs/REdPU1/d0c7Iw7++ure3s7Kzs7KwsrKys7S4uLu+vMDXWktCPjw3Ly4uLi4tLy8xODs6 PENIVFdQU2Dh6+jd0MW/vcDBvLa0tLa3p6q7p9u+wF3C3EfNwFz21FJDQjA0LigtLCcsNS83 PUro376+wMK9u8S6wcjPXspCS1Y1QTkz3U5iuM7EsrespKqgnKCeoKusvUw9Jh4eGRsdHCMm Kz1BSM/J0Mjg+2pKTUQ8Pj4/Rkruy76xsq2tr6ixrqKgpJ+Xlpqcn6dOLSgbEhEUExQaJC81 47e9uq+2yVxAOi0sNy8xQVLfycW4tbivtLi4xb++0aqcn5mQlZKcoKFFJCMXEBARFxccN07t t6utt8DZOSYjIx8fKjc/37ivsLCrrb7Cyl1WXk1Bq5Sal4uMjZeemj8XGxULDA8XHB5fqbao n6m6STMqGBgeGx0tRMa7raGrta616Uc8Ojw/TmHLmY2UjIeMjp6lqhwOFQ8KDhcoMjqnnK2r qWsrHRoaERYoKjS4qqepraq7P0ZCNTs8Xbq6urGoloyVkomSlarcyx4NGBoQGClVueK1odYz QygYFRMbGhk4veesnqOvzMC+NSpu1UnTrqyztq62o5CYl4+RlKw5uzURFiIaGiNFtvRHq7gs KyodGRcdKCIwsq60qKezbDpLPSgv6s5ryLCssm7EopWZmI+MkqK1r0oYFyIfGSRDwHJTvbst IicfGBccJicuwau4t62y2jo6TTk03rXIza+qss7HvqCTlZaPkJepUt0rExQjHh8uW7i7UdDO KR8fGxobHS1Hb7Knra6wxk4wLD07NW68zMOur7d51a+clZiWkZOcuUJRJxgaKScqOuK6zDhE YCodHR0hJClLv7y0q6+9/z83KyctNT9JzcO9t7W303e5mZOWmJGQnLP5xzMcGygxLCtGvMcy L0QyHhoeJiclNsa4xMW6vk0wLS8uLjvrvLvAtKurs7+9t52WmJqalJqsTT08KR4fJzMzMj1r fjo1MC0nHx4iKS4xRNfFvr7H22dy39bb38W8vsnMvcPY2mZeuKOdnqCcm56ou3ZAODErKScr Mjg/R0Y7ODUvLSwqLC4yOD1ES/3f597se+N0VVVfbnvv0srHxb2tpJ+enZqYmJqfqbXQTjMq JSIiJywuKyknJSYnKSgnKSwyNTxMYdzHvLu6vr68vL/My8PAvr/Bvq2hnZ6fnZyepKy+Xj81 LSglKCwvNDIvLCsqKiknJicsNDk/TGzMv729wcfFyM7LxcnMysbFxczLuKumpaOenJ2epK/B f0kzKykoKSwtLi0tLCopKisqKy0yPERa6eDWy8jK03Bm4M7Gx8K9vr++xdDKs6afn5+cm5yh rb5mPjEqJyYpKi4zMzMwLiwqKysrLC81PkdYce7c3t3QysfIyMXDyc3O4OzPz+TLrKCdnpya mpyhqrxiOy4qJSIkJysuLy4rKCgpKissMDU9SFvg2M/NzsvIw8LGyczFvsjk9NHBvLqzqaGe np+foaWsuNFKOi8sKigmJyosLi4rKSkqLzY5OTg9Q0lWZGnp3MvAu7q8vb/L43zayb+7wL+w pqCfn52dnaCps89GMiokICAhIyQkJisrKiktNTw/Pz5EVtTGyMjIwb2+xM/Z1c7KzMzIxL2/ xbiso5+hn5+fn6WuykMyKCUjIiMiJSgqLS8vLi80Njk+Q0tOZdfVz8XFyMvLxsfHy8vMzdLU z8vFva+nn52dnJ2gpay8Vy8mIR8gIiQmKC0wNjc2Njg6PUNKTlBUVFl25dLS3NzOy8nFys7N z9HQysjMuKignZ2dnZ+lqrbXPzApIiEjJCcpKioqLzQ2Njg/SVBmfvPu1s7aaWX172ZSS05a dN7ez8G4sra0qqKenZ2dn6Glrb9PMSQeHiAlJyktNEtfQTMsLjIwLiotSc3G19LEwuM+PEpX cVr8w7qytbe6tZyTlpqZkpmv3F1EIhodICQhKEJmPis1RisgIicqKTVoxb63q6q0v9ZhPzk3 OD1Rzt/LycO52te/spudm5OTlqSirD8qHyEcGSQoMDFb1UNCNS4qIiUoJytD3ty6r6+yu9RO PDg9Sj9pz9PDw7DA2Liumpyej5GYn6CzPCggIBgVIykoM+dBPGo6KigiJiomM1tkvqutr7G6 0WJCOz06YMVY1bu0xs+32s6hn5yZlpSfo6/HJh4kGxgiKi0vbW9dUUY9LSQoKiIyVVW/sK+r rrjORDM2Myw63UpfubvLzsDNuZ2gmJGSkp6jrWkjISIXGScoLTh/WFlQOi0kICQlJTxu87Wr ra2zx+1FNTY5OEbiT9m3v76/wl69np6blJOWnKSvZyIlIxgaKSotSdZjU0Q9LiUgISAkOEnt tKysqrC+4EE5OjY0PUxWx8jHucXT3b2dnpySkpWboa/aKSQfGBsnIytQ21VWTEAtJSUmJCg5 SdaxrbGvttpFLy8tKjE+R8/Fuqq6tblVvJyXpJORl5SrrL4lHyMYGSslKV3R4D5ETS4eHiMe IS87Wr6uqKyss9NFPTctMzxRZMuuuruwydDqppmjmZGTmZ6quzIiIBoXISYiM93fXWl7Pykj JSIeKDlBz66ys7K40TgwMjIvOerNxbSttba60LqZlZ+UkpOVr7TBJhoeGBYhISZNT/ZhYGdD Jh0lIyMtP/q7rqmorrvNRTMvLSw0S15ws7W4r8axppqampaUlJ+4vEskHB0dHyIkNVZPTmxJ Oy8nIyckJS9I3L63tK2vxt9eQj1DRFraXMe1uMDTzsiroqOenZeYna65wT0nHyEfHh4mOEI+ S87NSDAvOjEqLD1NT2PFtbe/zM/zRT1CVU9IW9vAxsS/v7uupqSkop2cnquxu806KicpKCMm Mjo0MDtJQjUvNTw6MzM8REhX7N50T05z3eXkzcXAxc3KxcfFysGrop6enZmZnKuwvVwoHh4j Ih8hKzQ1MTM3PD43OktWQz9FSD8+QU5mYfHOvbq4tre4tri9xs7Lxsm/pp+jpaSfo6/7S0Ev Ih4hKCsnJzJOSz4/THX6TEhXZEw9PEZKSvxtTlNJRUFG4Li7TOe8ura/vL6+qpeXm5aXmJyt Py0mGhIPFBoeJDvLta6vv8XLPigpKyQlKzBA59rMurrExMO7tL7Curm4ube6vMi3mpScnJ2Z ma41JyYcFRERGR4hL2e/t665xcRgMywtKiouMz/6zc2/vLy5ubu5uL/Avb64vMPGyry4rZya n6GknqV2MikkHRgYGR8nKjNhyMLHy9xeSTk0LywxNzQ4StjIzsO2ra2ur66sr66ytLG8urm9 v868vs3M19VtTlpGNS40MismKj06MjlS7VBM1tlZUk1YUDxCQDw+WdTowbWzsbGsqrO5s7nA wbvC2cW+zU5A99ZMOT1NRzs9Pj86P1I/MzZP7kY3WMrI2vvFzdPGU1b758987cjPxsbJxMDP 0ry+0Na5u8Zv7883OlBOPS00U2lHN1jOUVxRTvdf7WRI17XB6OPI0ub50s9NYc+8aduxxeBn +LtJO/3Hxl9b3dpRTUhDPDgzPDtJbVLh9sDJzsrl0sS+V9zBz8pFP9BpV0BkyFn81su7zdPL 0sZnWFFQ1HbR4dDI709NTFJXW04zLD1CLkDUyc/YwcG7yurDTdDKytZI2cq43GfBasH5RcjQ a2tIVtdDQ0NEUfvTRee5zr/RUuzSzEE7SPtMSVpAVVfdS0LOzc3DvcVht83jcUy1Wk7LS25f 48xSQzy/yT3nSki2V8nQNru/aU1Q1N3w8j5GZE3KPU7Sc1HV4UHRU2K6TWS3fMnMR1jO7kXo 3O7ZZMTSPN6+12Ff8sbQzH1+00TJTDTRWEfVLz/MMEe/Oji/2bnYarHTs7rPek23wEo80L1K 78hCT+083Gcsvlw1usxC1rfmO9xXz8Y8u248UcDHOVpD2EM/v03rfLWtO17NvlVGdUP0Zl1N bf25tV3ZvczCu+9QblTtYC47wlM5V95bcmfK/jhJ9UQ4eHbu2nTN7966x0X8vLfJUr630tZX VFBHx08/z2pJX/1c5m1g3FdPy21Sv+dg3GBMU01KfmRS4m5F3+xj2ldhXWnaxMbj0MjPyb/b dtH4Zn1WSVn9V0BK6Mx4Umpc1cXOd//azMvNdlpSa+pSS0g9RVJPZVZV6u37ztph68nGzXLu vL3hXnnRzW9LV+Z3XklCUGNUQkdkz9RqVWnDus78zszCusNxUF1v4ftRTmPf22pl1OFWUkdF XmJGPDg1NDc8RlBsx7y8yWzmw7/O297TwLizsK+qoqOnrr/iTzgqJis1RlBKSEY3LCMfICQn KzZKaNPK0efZxcb6edHR06qOhIiWoaq0QBkPEx1FsK2lnaGxPh4YFhcbHSM64dl7PTQ3LCUp L02vpaSjo6Wr2S8owYyFkqWtpp7lFw8UJMbRWbKkoK4vGxodIR4fLE69vFY9PzovKiYvSdGx qaalqbLPNyk9mIiNnKqqnrAhExQfacP9w6yfos8mHB0jIRwfLN+1zEhHT0YwJiMrTcvIu6mg o7VUO09UzZuNjpmen6G8KxsVGik5T8mxp6OuSichHxwbHSM05sLCxMtlOiwmKDA/Xceuop+j qrxdOSxCpZeXm5uamqPILR0cHyUrNFS+sLHBTDkvKCAeHyYxPk7x1c3aSzk4Qlvez8W2ra24 2nzvTTo9u56Zm5+joKCovjspKC84NjExN0hfSDo2O0E+OTU0NTU2OUBKVlxp1s3R509NYXZx XWLRwsXP2bqnoaatrKWipKevwNN9VTwwKygsNDw9Q0M8OTYzLiwsMT1IRz8/PkVd4c3MzcvL ztDa9ubMwMXe1rClqK2vpp+en6m5z95+RS8qKywvMC8tLjEyNjo1LzA1Oj5MYuPSz9Pbek0/ P0df08C6vL27u8teS9KtqaurpJuanKGvx1g/NSkjJSgwOj48NDEuLCwqKi8/XuxeUF/e21hG SF3Zxb7CwLy5v+J+e/J7W+i5pKGqr6yfn6ayy21cVT0tKi80OTo3ODIyMzY8PDg1Nz1EREVK Xu92bFtbZ/Hk6Gdc7NHLzc3R3d/QuKKbo6uuoJyhq75aRDwyLSguOkVSQzwzLy4pKCgmKS9F 5u/b1cG8zNhzXl9i3c3OzMfGz2hNREZjc09ypJWbpKuknKfEPjY/Sj80LD3YzWo0MTExLiUh JSw5QXnO1cLGyepERkhAOjtmysHHz7ivu21GVVY5LS2+k5CcnpqQl8QqKDApHxsjba+8y87B 1C8eGR4kJiUsXbOyyc3E0T8tKzA3O03Ar6mrrq62v9tbNi4zto+Ol5iWj501HSckFxQXMr7H TLqqtj8gHiIiHh8tbLzDv7OyzzsyNDYtMEbNubexqqm1u7ayvU48SaSPl5ydlpOwJB4rGxUR Hj3TRtOnqboxKCooHh0mPGNc2a+ruV5PSDoqKT11w7qtpqi0wbq72zUsNUmrl5mYmJSWqi8q Lh0YFSA34E/Dra6/PS0oIx4dISw7Q+e7r7XHblVJOz9KbMi0q6eqsLe1ustEODxCvaOipqSc nKlaOjYpHxwfKTxCXca2usxjRzkuKiksMDQ7StjFw87m1c3Hy8vDu7i7yNDP13lrTENBQl/J v8i9rKaor7m1sL/kX0lRXEdARD4/Pzo2NjMzNjY3OzxBTVRPUVZ1z8/d3+Xi9Wxxed/3ZXLn 3eZn6721uq+no5+jqqmqs8RWOz8/MCstMz08LywxNjMyLzY8PUBHVf3n19PZ29fTycnP39zM 1GdRWE9IQjxF2L2+tKegnqCmpqSru9ViW1k+LzM3MCwpKCssKiwuNT1DSElQUU9y0cTGy8e/ vL7Fzc3Q+1FMTEVKT0dM17+5rKSgn6Snpaq2vtdNQTw4ODYwMTArKCosLS0uMzk7Oj9MbNTI wsO9ubi5u73Ez974Z1hTTU5TRzxD4cTBtauloqKmp6mvtcLrWEQ2Li8vLSwsLS8uLTA4ODUy MTpIX+rPxLu4uLi4u8bQ5HFfXmlq9fFmT0hHUerYxK+noZ+ho6Knsb/mST04ListLi8sLSwu LCorKy85RUv9ycHCv7+9ucLRzcrJxcrS1Nh3TkhGPz87Nz1wv7WrpJ+dnp+gpq+90VI/NzAs LConJiQiIyUlKCw1RnvVxbi0srK1uru9vb3EzM3W3+9wX09FQT49PUNJTF/Ov7mspKCho6Wn q7XC4E0/Ny0pKCcnKSkoKzA0ODs8Rl59dePJvru7vLy7uru9w83V2dbuWVdiX09DQEdPYHvh 08C1r62rqaiprLK+1Fk/NzAsKSkoKSoqKy42RWPayr67u8DK1+3+em1rbu7W0c/ncunt7uzr 087NxcG9ure2tLa6vcPM2uhsU0pDPDcyLy4tLzQ5PUde49HHv7u8wcnO087KzNno5HtcUk1G Q0NNVlZce9rIwr++ura2usDM2uJtWE1KTU5GPTc3OTk5OkBNaNHIy87MxLy9v662T76zwkEx Qc5FNkdhUUtRSVVgTk9o7NTHwL6+wL++wtF75vlQRkFISz89Pj48QUhITFHhysrMxMS+vbu+ w8DCwcvee11dWlVSTEZGRklLRUFERlJd3s7LxsS9v8O/w8PK5O5fV1VHPzY0ODs9PkBOd+Da z8LAvbq7vb29wMTKys/e9F9cTUVGQD49PEJPXVl628/P0MfHwsPFxsbpWU9KRUk/PEBDTUlI S1rs/9ra3tXU09HMzMK/wL/L1cbGye9bXV1YTlVMXU9PW1lOT2Za6XRd09rZ123h0rvI7lQ5 Ozo/QkBOXm3848vGwNfl2P/a3dvKx8XQ2dna1v7VtLxGMy5GZUBBaOLczce+xdbOsa7PPTcw PTczREdIV8/Gxc9RP0pJPenKxtXTu7jMcb+120zTzbit7kVGSEMtLTrvTUzMysjWzsnJxMrV 8O/NyMHrTk9LRz5CQGRDQUdIWVntb+fX4uXTyMG5t7tr4uTUwWxrSz5DSEl33k5HTUxOfsnI 39rGwcHOz8rXzMHc02bf0mE8NkNEOz0/Vk1KQUDT7sC9btPFz7/GvcLM1FFcTVX0WkZGVn5r zN9Mf1Diaf/qzNDFu7m3vcpLOUJIQTo6brrVT0dOw9RBQVBcV1HHvb7Mxb3F9URRTD0+Qkrt /1XJxMXvTl351fnov87Wz8XM3thvaGg/SfpLT+HazV5Q7cVzPkFRXm/0b8vT+9PT3HBfdF5P RE5o+/jW1NnL0WpbZV9d/ti+u9XWxcXZUEJDUWFQR0RHXWVZU1db3crS18vGvMHYbuHf8lJM XXLl5XhgTkZKSk1LS1l6cWP35t7c2c/V1c/J09vf39PHzW1PS1BgTk1Vafjd2ennzc/q7d7w aVBq0MLF1NbY+FVLSEQ+P0RHRD8+R0lGTFdUXtvMycfHvr/K7s/J6HTfxr7HvaykoKOnrrfI OigmLDU9Q0RKOi0oJiQkJCYtND5J5cW+vcrX4tXj9u5cecqznIuGiZKcqMElEQ8RGiQ1VKyc m6G4OCQdGBQWHChJzsvCu+E8LSopLTnYrqWgoaWv2EEuJ/GMg4qUnpijMwsKDRMcIz+mkZWf tjkmIBkVGzBps663ubw6Ih8fHycsTq2jpKOlsbxoRi8oKDXqmYGCi5miqDEPBA0SHzO9nY+O o9IsGhMQEhxNtqmdn67POR4cGxslQsuxpKShpL9NQj0vMTI6Uj/+i4CHla6fqiIHBR4ZJyqv l4yW18Y0Gw8PFSnO7recnq5mOSgpHhcfLz7vsq2rrM9gXk5YUMXEvjxYj4CDmKScmiEIAxsY FB3Ako6Wx67lGQsLEiM+yJuQmKzIQCMZFRkfLTfHo56lsK7MOCgqNjp5477Jp4SAjJyemLAR BAsoDRQxmpGTpa2cLQ0MExkkN8GYk6i9vzgdGBYcKCc1raKnpaSy2S4nPDw26rjOqoqAiJeY lqIVCAwkDg4pn5Wep6aaNQ8OFhUWJM6dnKajn7guHhsbHB0qzaqlpKGjvjcvMz48OOzOwqOI gJKXk5TLEQsaGgUOTKGrn5ePmiYbJRcKDyVDuqmfk5i/TzkcGBkXHzbqrpufoajPPy8mJDcu NdOgh4OQjYmRwBkVHg0DEEE2QJyRj57lvVYRChMaFRvtmpaknpisKyEhGhIYM9bRrJqcqrC1 1DMrJykj1YyKkoqFi5wuKSUKAg4ZER+mlJKZmZWyGhcaDw0SIjzxrZyapau5NR4cHh8iO62h pJ+eoLe+TCgiKJ6RnpOJjJWp32QZCQ4VDBE6tqmfmZWfVEE3GREYHRso266npJ6i5C0xKBwg LDNtuKqlqqinskItOqeTppuLjpWfr7glDhUaCw4qNj2zn5uiyb3GIBsjHxsdM2lPu6Wnt8rW VDMqNjk6Ycq7tqutrrpcRa+XoaOOj5ifr7I5EhQcDgweKyvVpJygs6+rPyUnIx4eJjM8+rGu trTA/U43NUU/VtL1xbnFzc1NTfmck6aQjJSaq77YHA8cFwsWLCg+r6GeqbWpzCcpKx8fJiw9 SM20w8mzy0hfT0ViXXH4bsXPT2rUOz65m5ufkY6Unaeu7h0YHRUOGCYmM9GuqK+vp7k6PUAr Iys/TknvusJd3MxONjpORTxS4lVYVlLeXlljabmanaOWkZihqqm8KCEtHxYdKScnNN+/fm+9 1jU9Xj46Suz0X2bzUj0+RkdOyLKur7CwtMbS3kw9NTk4NzdAcNHLxbasqqqrq62wtbrDysju S0I6LyspKScmKSwwOlTm48/FyM3GvsXLwLy/w8TM115LRz88REpBP01sW1Xhys/Nwbezsq2p qqutr7Cwu+lIPjgxLisrKystLCstMzg8RljfxLq2tLK1tbS91HhaS0pGPT5NWVRTU2NtXl3u ak/pwbmzraijpa2ytb7P71I+ODUyMjExMi4uMjQ1Okdi0r23t7m5vcvrUEVDQD09QkVIWO7a 3t7OyuTwxbq4t7i4ub/Hx9djZHNq6dvYzsbL32ZRW1VIR0hDQUtPR0RISkRAREhLT1daZnNT T19qVEdOev5q18vJv7m2sbfExMPVXU9c6NLSz8jIw8HCxcjO3+1wVEpXWUlBQD47Ozk7Pj1E Vl5OTVZweE1BR1NPX93QyMS/vL3GzcnK0+PXxMXV2MzUY1dt4trRwby+wsfFxdL5Yk0/Pj4/ P0RITFBLQz8/RkI8PUZNVfPhfHfo1NTr8PX22MjCwr+/wsHCyMzJxsfDwb25vMTT3HNLQUI8 OEXVTS81Q1ZKQFf5VPbXZVxZWUzxb0FJU05HSEPu2krFvdLCz8O5ys3Hv7i7trCvr7W1srvn S0c9LiopKSsuMDU+Sl/gzsnP0snK3m1bWFhXTExSXm756XzozsXEztbVycPP18/a3s3Gx87H vrq7v729yuBcST46OTk4ODc7P0VKSlP7a1ZUWFtUUV91ZF9d/3Nm4NHc3c3Lyb/K0svLyMXH ysjGzcvGvru8vMHL8VRMRD89Ojc1OkBKT0xSbFxVWlBYVlNNS0tITVNqbV126djTz8zXxsHE xcS8v8THzNLOyM7Qv7q/yMXBz1hGQzs3NTdBV2VlcO1sXl1KPjk4PT07P0tSVGNq7+DTy8vS 1srBvsC/wL69yNpxbmNo1dDYx7KssLi6vMh3TkA6NjIzMzc8QEtNR0FERUhMTFNf/ODh2dfr 5eHs5uhvcHbj1+vu6ejZ3NvQ087Ozr+5uLSvrbK3t7rIZ0tDPTgyMTI1Nzg5PT9BRkhQXmj9 6Ox8YGNkX1pQTFl0aGjf1s3NzsfMzMbI0dje28O4uruyrq2vrq+3x2tLQTkxLi8xMC8wMTM2 Oj0/SEtWZmL049LK0NPRzsvN1+1u7+Xg297e5uPMy9XPy8m9vMG3raiqrq6xt89JPjYyLCsr KiwvMTU5RFBfaGVobX5zaF5ZXFxqf3V95dPl/uLdz8zHu7m/v8TR3nTRydG9r6emqairs8tP PjArJyUnKCwxOj8/Tl5ZVlVbY2RWSkhPWFtfaGJq6NzYzMfMxb++w8rF5G1ZXcO9vbGpoaSh oKaux+xALCciIh8gJSgtND1RW/LrztTk2HNhSURKR0hHT1BQ89DN0b67uLjMxMtqSVy7ycCm op6fm5qhqLbQOyglHRsZGyAgKjZDW9LH0sfO1sd+Qzg1MjM8OT9LXdXGuLq2tru7w87b10/O sMminp+YnJmfoa7XWyYmHhoaGhwcJSoxPFHZ78LFyM7c8UM+NjMzOD9Je9W4sbKut8Oy0/7a SEhBvNWoo6KTnpaaoKW53i8sHh4bGh8dJSgzMkNUTM5a229gXT87NDUvMTdK88i8ubCvrriv tse+aTtsxNSqqaSXn5WaoKO02jcpHhwZHR4cJCYvOEtzadDPyt9tTT46MC8sLDA3QmHNtq6s qLGsr82xU0/AzbWqo5+an5aepabPaiwlHxsaHh0dJyYxNU3f+73HycljTz0yLywsLy84R3zB sLatqr2twcy8XNnAsryfoZuXnZaioq7uPiYhHRsZHBsgKS8+R9DJv7zBzeVJPzYuLSsrKSoy PW29ua+qsKqvs7XNw86tt6ieoZifmZ6lq85OLCQdGhgcHB8lKzo/1ce7tbi8wn0+Ny4sKSgp Ky87TNS9u7Gvua/BwbZeyLCzqZyelJqYl6KhvnwyIx8ZFxkaHCMnNjNK+HrAxc3afUhAOjg2 MDIwMzpK4sO6uLW6vsTG0s/StKmvmpyWlJmUoqOy7jciHRgXFxoZICQuNjzvZcC6vr/OY1dH OjgyNTY4QkhP4MzKvbrJw8z1zFfCqq6empeVlpWcn63GPyogGxkYGxsfISozO1RPXHNbWm5K SUtAPzo5PkdMbnLjx9q6xO68Ymu+UsCprZ6Xl5CWlJifqOE4IxoYFhYZGx8qLj4/U/d62nhO VldGTEA7PUNTSkRUUV3Y/F7iaMj0075Vvaurn5qWkJaRmJ+pzkslHRoWFxocICoxTU1tT0A/ PDc5PDY7PkZJWXxteOXTVs7N3M5e2VH1yevDt6OjmJKTk5WXnqbOPCUdGhcYGR4hLDI8P0ZI PT82OTY7QD9aUu7M083n4NFs1vNO0z9u5DzQ8+GvoaSXkpOQlZafrOA1IxsZFxkaISUuQVD0 aVlDOTY0LzE4O0lVZ3Tv3lZJUj4/XUh8dmXB1bu6vaqfnZWSj5STmKKvRzAeGRcWFhsjKDlC V0hMPjEyLzI1OExh8rzA0sdtWk49PDhGP01238PcuLPSnqCfkZiPlZiZp79JLB0bFxkZHScl NURLQD86Li4vLTQ+Wb+9s7C+vclKOjUvMUY2QmvSw7m2wrGunJ6XlJKUmZisvjosHxkbGh0h Ly87R0U8MS4nJSYoMEP2uq6vrbrHyD84My0tND9YwcW1srKut7+ln6WTmJGWm5us2DMlGhkZ GhweLS03Qkg3Ly0pJScuRdS6raqopq29/jkuKyksNj1dzcy3uby7wearoJ+UlI+UmJ6rYyoi GxcXHB8lO0hNP0Q1Jh8fHyEv3ryvnZ+jpbK+SjEuIiMtLkpdv73Mq8PNyTe7nqaWkZKPmaCj 3SUkHBYXHCYsN+rYSFBIKSAfIiAoOdG7rqChq668WDYuKSosL83GzLG8sLzGulM2qpyilZSP lqassyUYHRoUGic6QduuuUY/OyYeIy0rNM2ssLGmpcBQSDQlISowLUyusK+wsrLJ1s86QKGU m5iPlJy7yModER0eFx4+vsbYtbwtJywiGyIuPle/pKWyrKvmOTEvKiUv6lvPrq2y097AVThs ZuGfl5WSlZWdwzY8GhIXISQuTbOsyr/JOSEhHx8eLNzRu6enudLO7zUjLDQtN7+2saysru5s tnYyVljCnJmYkpeZojssMxkSHiUqPtatqdHo3C4fHx8oLy7ju727s8faQjA4LisxXti1sqml t87Dvew8RW56rZqVlJyXn7UnKSQYFhoyL2ncpa7OUkg0Hh8gLC9Ys7atsrjeWTcxMCk6Pk/b tq+uusDYTURMXjc9u5SSl5uUmLIvJDQaExk9R0bgqaLPNjo8IRwfMVE4562rzWzA3D8pOT8z L0vFzby0r8FVXsVNQUhQcK2Xl5adl526KSgwGxweTV7e3qml3zo0NSAcHzhbNfKur3lL2d1I KzhCNjZevb3B1r7KRk5UxsxOPsuZlJabmJarPyI+JRoZLOJDReGhr0EwQDUfHiVHRze/p7Jx XcbQNyc4PS00TsfK8v22tF5Fwq/ONja7mZacm5eWqU0qPCoZGitMOUPKpqpZNDovIB0hLkBE ULGktOHOwVcvKC89Ly9UubvUx7a3XkjGzTw2TKuVl5yblZqvOC9DJxsdL05cZcetskYpJygf Gh0pO03Oraersba+ZTkvLzU6RfHDvbu4ucDSyt1BOTU5xp+boaWemqHHOzg3MSkmLU/P1erW ydg+KyUlJiYpLz/1v72/wsXIzOhZd8e7wcrEyNjselJFRD87OzxEc72xsrGqoqCnrq6vtsPd TT89P0E+Ny8vLysnJysuLzQ8SenO1N3Nura5u7+/vch9SkpSTEU/P0NMUE9HVb6xtLaso6Gn q66vr7fKT0BITT00Mzc3NDAuLCwtLi0tMVDc8+TArq63u7zBydpTPDtMT0VCSVZRSklDSOm6 sbKuqaGgpKapqq652Us7Ojo3MS8wMC8tKSYmJykqLkfWxsC3q6itsbi/0GpLP0JISENBRkpJ SEU+P0PruraxqJ+bnaGlp6q03UU2MTI0Ly0tMDEsKSYnKissLz7NwL+1ramrtr7G0OVTTFZV emlMQkBCOzc6OztD1bevraSenJ+mp6uyvtxOQ0JEPDAtLiwlIB8kKS82PFDXv7q4tri7vcTJ ycXGyNPwUUdFPzs5Ojo9QUhLYbytrKyqo56gqaqttb3OUz87NTIvKSgrLS4tLC0vNT1FTfnU zcG8vLu5t7rG09nmdnRlUUZBQD8+QUBBRk5yx7y2rqiloqSlpKavvszeVjwxMDEuLC0sKSos LCwuNDxM9M3Dvbq4ucDHzd9oeflgTlJdWk5ITF5lYFdP672xq6Wfn5+ipaqxwfM/My4tKiks KiknKSosLzE3P1zWzMS6t7m8wb/Cx83O2Plla3FfTUVERUdLR0ZN7s/KvLKrpaKipKeqrrG7 40k6MS0pJSUnJyYoLDA5QlX+2NbSyszIxcrMyMnLycjL1PJbVVNi8HhYTlh72NfPw724s6+s qaeoq6+6xeNJNCsoJycmJykrLjQ6P0pQatnEvby4tLW5wMvVak9ISUpKSEpRWe7TzMvS0s/L ysfDvbmzsLCusLW6wc5yTT0zLi0tLCwvNDk8PT5IXOHQy8S/v8PJy9bmZUo/P0taafbn3dDK yMvN0tnU0c3Lwby7ubq5uLu+xc97UUg8NjMxMzI1OTxCTVphbubX1tfV3vBeVVxcWlxr7NfX 0dTc3+Dh/HP42c3Dw8C9u7m7vcDDxcnXfFtPSkI6NDEwMDExMjZATmjZz8a9uru9vLm7vsXK 0NfY3PRwU0xMPzk+PEBjbN1xYtHDvr29vby7xMzV0850Rzk6QEE4MzU7QENLXNzOzM3MxL/D yMXDw8jOzMrR9GBVVk9JR0RLTFJhWm3dzcXFys7Lx8jN09/9VUhEQj89Pz4+P0NJT1tg9tTN yMnHxMK/vbu9wcXM1m5RS0tMTE1NTE9YbPNqX15fa/HVzsrGx8rM1uL5aE5CPj9GREJGU2j4 5t/b2tbSz9Lf4t/d6G1y5trc4+r5evPl5Ozn29Pd4tXb4HtiVUtLTVZt7ubd1tPY3t/rblVL S0xLTlFUW1pYW29nYfrczcjJy8zLx8nR4fDp6P9qWlROUFJVVVNZX2lr7dLJx8nKy9PW1dvw amVXTkxJRUNJSklLTU9PV2ffysTCx8nOz9HT1+f2bV9fX3Xo4t3V3m9US05UUExW6s7FxMjL 0NLV5W5zd25mYlxgYmRgU0xJSEhJTlZc9NDQ29/RyMva6+3w9fHvcWJoe29dW3Hq+XZz7tjO y87Z29fZ1+dwX2BpZ2JgZmdnXFRRUVljZ2h38u/l1c7OwKnFWpsSOUsUkx+r3TnFLJ0hrcIp +kttVLTzra2pnzZZIz3AG9o1PtAyp76uuzu82lc/3TbWfj3g/8hbwsP4vuZqvszefllQOzlA RVY+Z0hyWPvN0dXSwU7N8sDL3cNavN1ay0PIT0r3NOY+W1RAy02/6MzF58b31+FPTWvo6WF3 6NDHdmpQVlJIRlHp5lhVTnTi2HLrvs/F0M7D08Vu4dN52VBkXWNPP1xUY09KUF7s09p352P4 4m3d2e7pU1lIRmRbe2b63mVW711lTVvGyb3EtrKyrrm7y+5bRj06PT5ATX7t6Pfu3Fc7NC4u LCcrM0h+07+4r7G1tMB0XONpYXHMrJyXnqKlpq86HxkbHB4hLGKsoJ6fpa/PNCEbGBgbHyk4 4bixrq+vtcV+Qk3fyMxW3bidj5GYnJ2drjwbFRUWFhYeOq+hoKGioqzgLCIiJCYmLlC6sLjE zm48LSYlKjVK78C0ramoqrbgeOG1n5qdoqWgpcctHRwdHRwfLuOuqayws7TCQS4sLDA2Nz71 wMxoQjs4Mi4sMUB7wbm8u7GvtsPdSUJWr5eUmp6fm6G+JxoYGh0bHS3Bp6SptrzMRi0jHyEs PmjHs6ustcpFMywnJyoySdq9tK+usK65bEQwOdepmJWXm52dqmIiGBYYGx0jO7qmoaexw2s4 JyIiJC9Qvq6sqq+85DgrJicpLTplvLSvsbS0u8VhPzc7R3qumZKVnKSlrmYoGRUYICoyTb6p pKm6SDAqJSQiJTDurqioq6+57TktKS00Okbtwrq3ucXZW01RRzw+S96znJGSmaWqr9I0HRcY IDBAZsWzq6vFLh4bHCIsMT7IpZubobLKaUMyKCYtP37Jw8bFw9tBNDA2PUJPYOrApZSPlJ6u tsB8LhwYHC7dt7a9vbi8SSYbGBsnO09uv6een6vURD9GPzIvNU3Atr3ZYFxSTEQ/Qklq2tDS 0rCblZeguc1860AnHRwq/LGuvmZLUU4zJR0dKla9uby3rqutv0w6Okr+6GNLc8nG10o7NDg/ Q0hGT+PJzNrWrpqVl6G30/vlQy0iHylIvLC79TwyMC0qJSYuUbirqKuyub3IbT0yMjlMaGZa T1RRTU5KQUBJZtvPyMPHxr2tnZeYoLhnQj05LygjJzRfvLbITjUvLy8xNj/6vrCtsre+zHtE Ozo5ODo9SFRXTUVDQkNFSlzZwru4t7W5ubGpnpmcpr9JOzs9MyolJS0/7M/7Sz89QVnZ3PVo Uk9d6tnyTz87QVr7XkhAQEhOV2ZiY/rMvby5t7S1ur7M597Brqajpq684Uk7MS4sKyssM0vU xMfN32NaTj80MTE1PUthbHbh2eZdU1RSXv/56tW/tLCxtru9w8TEwry6t7zJ51BHQ0hKSU1M SUpOU1tpdnRsZVVOTEdFSUZFRUlNRkQ/OzxGbtLN0+Xg1sm9v724s7O5vLy5ub2/yNHefGhS SkY9Ozk3NzY6P0RGRUpX+MrExcrOz8vEwczlXE9Udtzib1RKRkZMUlJcaN/LwL/Dxs3Pzs7P 3fF64c3Jy9hfSUE9P0A/PkBLW//1X1FT6s3MzsrIyMPCx87qX09RTU5UTlFh5dLU1NPTzMbJ ztXqX1ZhW09NS1Ff4tlkT01QS0JAREdQadzMy8/W0M/Y0crGyc7S2N/e2u9aUVhr7PZt8dPL 1fVZVWbs62dbW3ja2/BhXVpUUUxMT1ZRRT9ET+zTz8/NxcPGyc/Ozs/U8W/x8mdaVFlmc2hk cW9bX3ZzXVhf8N7b1dHSz8jEyM/faFxTT09MS0tHQ0RKUV9vfn7m09TZ3tvTzs/X1dDY5mhd Z3vl529bVmH9+O3v/Xrz6fdx9t7TztHNy8vM1Nh8VUY8ODc6QUtTWGTi2NHKxMPO0tjobXfn 1dLd4v98bWlhWVRQWPDu6/F+5uXi7erhz8zael9v3NHU3vNyYVVJRUxMUFBbanHz4drub/3o 29/+ZGT77/nt3tjT235n/ubX0dzx+21hbHF4+vNoWVdle+fb4eDq5tfgY1ZZZXnv5npsaHL1 /fzi1Nze/ldSUV5iWFVVWF1gXWtub/Lq4d7W1tXd3dvg6vLq/nfw493e2c/My9dzXmNzbFxM TlpcXlZXVlFYZfrc0M3T5fPn4+PjcFhTVVZVWFpQTFBZYGr54NLIxcrT0czJz9nZ29XT1+Zh WVtnbllMT1hu8fPo5ef/YE9JTl9rbnJhX2JsYV1tbXRr5dzo6O/x/fXWzMvP1dvb1dDMz9fo aF1PS0xQVFdVT05Xa3vo3uDc4+50bnNlZnHv18nHwsbO3PFwal5SSkZHSUlIS05PVWj//dTH w8bIxMLEzNrtbG5rW1lZXF5eYGJveW9kY1lWV179+uLW09Dk+vLk3O9oWVhjb/n6+u/h3O7o 8+zmbGxw8+79b2lrWV1p/vBiW2P66NvV1NXY0dHa82RaVlRUVWnh3drh8eXf29nuWk9PVlZP T1Vr6+9hXunQztHU1dXb6vP2cWVkbWFd893jemZbWV54/l9gaW7969jNy8zQ3Ox56trjbGRd XmJcWU1LUmB77PJ/793Z7ezt6tbefVlUYG7d1Nrw+u95X1RWUk9QUl/84NrX2dPGvsDJ1eF6 Z1taZGthW1FNWGxqZGN4+vTj3uPez83c+nrucFhQUFhXY3tsX1VSTktOXn/65+Po6dXMysvM y8za283Kzd/7/et6X1VOTlBXVUtMUFxubmRaVWTg1tvh3NbV2un49/xtXFpfZ2lhW1553NTY 4OHa2tze7vlzfu3q39jP3G9ZUU9MT01LUF3p1dDPz9be2t16XVhlal5caefRysrT19LT3W1T Tk9LSEVDSVVkZ2Nr4NTT1NXU09DS3OXn4dHP7m13ZFlNTl5w39LT0M3Lys3ed2ZsX05GP0BA QEFHUWTk1s/Pz8zLx8PJ1/N4+2Njev1ycGFaVk9VYWJia/fq3tzl/XBx4M/NzcrHxs3b5Pp7 cVhKQkBHTlZdbvzs+GlicW1eY2JmcHV27tvn4dPOztjd29fb6vhy+u3j/mNkeG1eX15ZWmZ3 fHt1/O3s53R93tDMz9roYVxZUFRZd+F4XmVz9N/f7Xr65+Tf7mdv7fdoZGFqaGZkcubf3+Rk UlJdX1paduHYzc3Nz9TW1s3M0tPc9mFRTUtISUlLVFdTVl/829bT2d7b3eHm3+lqbu/h3tre 6fNz+X1hXmBkW1BUX3L+b3Hv49bY1M7U2dnd4OHi3/hfT05WWF1PTUtNV1xgaXbj09LPysnL z9LV4/xtZGNkV1VSVFNUW1tfYm7p3dfPxsXL3Ojk4ux3YlxSSk5RUVZk+N7f3d7g4HBiZ+3X 0N3v/fXtemdna2xrXldVYebY4Hplb3xsYldg7er4du3i3dne5uLd29PT1tvn3Nvh92xdUE1P VFFRU1heYWR+3Nfc3ufj1svN4nlqXWVpY2JcXWZnYmR1497i5vJucP1yZmRo9OLn+enc5+/q 49fNytPk5uf4a3p9ZllYV1JQUFVOTlJbanza3OTaz9La1tPa4/pqbl5dau7o7OdsV1pgaWVk fePVz9rp7OPd5O75bm1lW1NY6dXb5/xp9unteFtaZWxdUk9Y/NzS3t/Vy8fab19XU05RU1pr 6ujo3dbT2OPzc+7e3eNvd+jV2OLxYllVVE9NW2NjYWl6+ODW1tjd2trb4tza/m1fXl5VX2Jf X1FPVFln49zb28/N09ne/nvu+v9vdP95YVlq+3NdXlpdcufX3O3v497e63t3++Lf9PXp8nJt aV5VUE5SX3P17ODc4t7X2Nrn/e3r39zgdVpdWlteZfp5eXl1c2hvdH509/Hk2tra5eLc09jx XlxqXVZYW2f4fl9TVVxtY1hfaN7N0dzd2NLP2+Hf4fJxVUxY+eX2aGD31tHV43toamddV1de dfj8cW51ZV9qfOHf4N/e6efq8ePy6OxvXltdVE9QX/HxeHJldt3Y2NPNys7f+vp1ceDsb3b2 8mJVUVpbV1hWXn3m5fjf4uXd+m1neOXWzs/V3ufuZVhNSUxWYWl+7ODZ19XT1N/rZ1hbYF9i 8u/se+/ne2Zo/Orf2djh39/t/O92aWBbW1xmbffofWdiX1tbbG795Ot8XmL73dre3tfT1NHW 3OPf3PJ2X1daXFtia3BwXlhYUGHl9WpufO7p3tfY0MvP2Ojz6uVuWFVYUU9UV1tZX3Rx/uvq 5uPs6OLq39zRy8/f59/icV5cU1VYV2du59LP0uH3/2pyaVFNU19wbmBhePrv+vjc7OPwde/h 0uJ7bG/33OTy5/hrbW9vX2n9fPXvcnft5eVvafbrfPtfWlhZaW7v7+3g5ODe4/ft5fNsa2hz 69/b4un49nleZmx2bFpRXHDm7efj49zY529kXGx/bmj33tTS3XlnZmNeXVJYbGFjbG5+69nV 3+Td4efl5Nze3Nfrb21ibnL33ud8/nlcUlNYa2xlXFxgfeTsZlZUX3167unq59DKyMTEyNb7 XVJXW19RSkVKWWJ87N7h5OLu597XzdHc63x7cl9VV2d17e5xae/g7/zs3dfX1u12W1peVlRP Tk1MT1Zs/urh3+Hl3tbV4Ozr5tvOzdvw/uzm5d7m7PT1dmNrauvn9fJ2fvHvbl9qbP/XbklO SkpBPTw9Q0pTWHfXy8fFwb6/wb6+vb6/v8fX4dra3/JjUU5QU1NQTlBOS0xRWFZTVF1aXWx3 dHJqaHDr739vbGdsa11k+97Z6P7p1s7MxcTGy83R3OLt4+bo9l5fYl1fVlVSS0lKTFFbYfjl 6N/UzM/d6Onj2NXh+GBZXnb85ftoc/f0Zmxycv3vel5aV2hmXF1kZmRYUlRh8dnZ19rX09zp 7+Da2uh8Y2RwaX5nZu3m2dvh3d3f62hZWFthXVJKTmH03+V+dOrsdmlfcfD2d/jj5OTo5+Lj 6+fk4ev5/3Jv//Hq4d3k/15dZWtubF1XXHXe6nz7fXby6eDn7ex9bGVrbm91bGNdZ3x98Xx7 3+/6+PHl731+8+Pa2dvqbm1mY3f07fL07OTj3+nxdFlTUlFXXHPt29HOzdPh92xcWmJrb2xl 93Zmafjf5evo/W1qZGNf++nr9XH7durZ3OHn29fd63FiZ3b1alVNVGVhZGL639nV2Nvc2+70 e2776t/4ZVxkZ2VqYGnw2trnfHD26+Xlb3r6+3VmZ2dfYHtrZ/t3YWJo+N3Tz9jg3uDX09fa 335wb1VNSUVFSExPV2zf1dLPysnL1Nzc4uDs+vn17e56XlxXWVteaWJiZ3n8Zl1faf3s3tHM ys7U6GtiXVVPTlZaX3fm3N3V0dLW6Ojwb2VjXVtaWFtUXFxk7tXR3dzc19bZ2uz66uFvT0pM VFtmbfXl2tvd3uHd2t13Wk9a+ujq6+fh2OT3enx1bXNiXGn1emZqd+Xf729nZ+7vaVdaW2Fg WWB46N/T0Nrq8t7V3NvS3PJpaXju4dzZ7vn2bWpsbWJXUk9PT1JVU09YXGd7493d2tLHyMfI ys3b7O1tW1lZWVNTU1ZkfndtYF9sZnLn7Xx67d/k3dzf7fd89uLi2dzs7OZ9amNjbXRvdWhl ZmhiXFZdb273/eXxX21vbGtmbHTq4ufs6OPb183Mzc3W2+fw/Op9Wk9KSlBVUU5RWF5ocufb 1tfe7+bUz9LuYlxdbPn77/nv3t75ZXrg3utubnXt3uZ5XFpXW2JjYFxaXmj34NjLydr8b/Lb 3dzf9/d+9+f3bfXj7mdUV1hWV1JRV1z85nJgZfrvfn/q3NXR0tzdzsnJzNPd/G9mXVlSWFlO S09TVFZZZ31+d3fr39/h2tfS0M/Q1dXY4n5fV09OT09e9eLZ6HN0bObifl5UWV9uaGFs79/f 4d/a2dPW0tXSz9nuX1NOT1NOS1FTV15559XLxMjQ1d3pemVefWtZUk1NUVppa2N58/vv5NzZ 3drU19zl3dbmd3ZlX3Buenl5fXb+cW57a21mXmRree/q4N/v6OXnbF1e/d3fZVNaZnnd3eff 5ufpbmVtemVcX2T34H5ZVFrg2dbO1NXY5XNkb3Xo5nBdWWNjW15qbGdw/ung09Lf3N7g5eru dGZXUVRdZmFfWlNWaHZfa+3e1dHPzcjHx8vP2XlibW5VS0xLS0xOU2T4cPnv4c7IydDb6+5o XFdZW19sWk9SW2b08ejYz9PTz8/Nz9n0YV1eX19YUlxcWVxh9nhwdPzo7d3OxsbO3vd0bG5g WF5fXVlOS05WYVxdaHbg1tHQ2NTMys7W7nnz9HtkaWh0/2hfYXfy5utoaF1aV1VSWWny3NrY 297ra1tWWmZaT1n83c/MycjQ1dDV421va1xYWVpfYmlpVVVfbvjxf3Z2Z3J4dGp63NXW5HJn 7NbQ093u/2x0dFdXam5xbF1o7t/d5ePa1tnh5/h59GRPS0xPXV5SXW/e0NnX1tnU2ePt+354 eP55aGhmamBYVFhnZ2Rn+v354NrY2dXQ1uDe49zY3+xta1pOS0xUa+fm53v9cl9gX2t3/tnR 1trg7unxbWz76uvr6e3l3+peTlRXVVdPWHbi2+Dp597f7Gpw4tPKz+t8Znn9XllZV1FRUm70 49vb5m586ODn3ePsa2FoYV5WW2N62tbUz8vO3uv53dPU1N3i5fF2aWleV1dZV1FaZndqWVNU Z/5uZWVhXFpjZGRjZmhpXl9y69nRysjJy87OztPY2uLh5+5zX2NfWFJaaWdZVFhZW2hla252 5NbT2drm5Ozq92t0bHhwYVxz7XhZUVv1729cYe7q39/m73H029zj39nX2u3+fvvmbFNSXHZn Xltef/J4fHf99Pl4eXvm1dfl+/tvX2fv4OP+feXa7mZp5dr1ZW9iZFxZaG/g3Oj36ODo6+jo elVNTlliX2Vncund7271383IycjKztjifGJeVk9NTkxTZm1eWWnu+lxQV+3SytDS1d7Y5HZj VmBnWmh43dtqb+3zem9t9mpq5dzc4OXo6v737/p7XG18fX5ZWmdlXVdZ9+fj2drUz9vfdm75 7t7nZVdZcHxfXGB55n1eXV9p9/Lm4drW19XSz9PP19xnTU5PTk1RV2VZamZc8/nd3ub07eDW 3dfabXx88NxsbX5xe2V4dXFnXFpmddvT09Lv6e7i6vxvamZv13tVUlRyWVlm/NbP3XxrZW5Y Xd3Oy9vd2eft3+zt4nNaTVFbYV9p6drabVxq8P5sWl5lYuvx+29fePRrXm363dbb39zMydfT 1Nrme/VeSkVDTFVTV1Nm0czR4HPa09TV5+DVz9jiY1pfWlNLT09cWlJsaGBZZ97d39bNys5+ 79LIzOXm2uJjTVJTXFdNT1tsTlj50dbu09LcbG7c3mjp5uT0dNra1/dtWkxXW1Zrdt/W39Xt 3t3hek5YY+5sTFpv3eZVWFb58VNbYevf5NDM08jO1MjWzdLv2+tkU154W0xKV1VMSElJXGjr 7WXT9N3fdsvf2OXc0eZeXGBjelbz6GxdVmTxf9rPz8rI1dz328f34Gnc40xERU1LT0pcVtbe XGhg6vDfzc3d1NjTaF5bfvVWUkhoZHFvb8vOwt/z4e/IW/vc++dWWWdObGJOY/3U01fe737q Tt7g8ttT3cnTdehncEFFUk51Rvftzr7Ixc3VztVpaFXa6mFfY9PyTUdJXFtOV11rXFrcal/j 08ty3MLU0+Dd1F96y35bTGjYYlpnz85Tb9339j5TU1BYW+rcZtvUz8r3w9FbYm/pX2Lh61VX b/NZU2TnX0pzXNfl2MbPyuFu2fNWXEn3d1TyWntdbeDpWufg19VS4Mntb0bOyXlwWN9PQfzT Y0lL0Mju/m/M2FFPWM7lbNrEzVR+4OJXRljeXVfd5uJT/M5SeGxkZkdp2mHq3svLY8vd8+NF WvXy2Gl33N3uWe3S2nvu3NVOV1BeXlZa+FVc2dfbZ1LQ3VxVa8TzXVnbvsrp6ODOW2DVStXv ZWNTVkpHPUhGaVNJ1MnLy9C5x9XpxMjf0ti7z19b10JCOmlIOE9Yx0dR5l7nb+fdXVXaytth 2MPZ0lng4Fju71vNW81688np7M7rv9lqw1nKY0FXa9BMOz12VD46WMblYU3v1N915MTZSMva WVXY1dRLfMxe1m/UT9/I21dby73L2cvNvOfvX+/NQD9MPEVJSXhIUdlTV8tm7krO3NzLT1vR T3PoUdBcUM9zSLzJT2Fbz/Y16LDMwV69r03W3tFaP13bTkNOTP1FS/U/dNo+YelvzGROynXI eFHD4unYvs3BP+q4aMo5dsdRSFTpTDpBQj3/28/L3rqx+9m+y+M92rlwL0K2xDlIR8NPONU6 z19m12nOx1J5x1vqR82+YlPHyL5K3sZbT2Zj7D4/101WS+6/TEm9zs1dacDZ1+pY2WdPZlNk bkBc08pQ7ebLTFtlxuJVaF23Xfzc4dJEX8Xd5+Pq0+DkU0hw3tTPP2hQSEBGxzvq7FX1QPvZ PNe+2OvLucDcfr7M1XzadF9CSr0/Q9y+vUhnyMlSPuC52kdG1Oo4PFRuPzddakRbsmf4ys+9 3G685FvD5+RmYVTXSf5JRUBR39PRScXC0XbttsjkX9Lbaz5RdD1GREfTaEvZacTNTXe/s1Pu aOXcRWjRTeJNas9kWGfVYUdBz1pDbsbL1vTAv0VfzNzXPNnJUFY+ybrYPlfc0G47Vs3aSV26 u/ZHzvteQVzBQT/fTufTUcZEws5XUVXpXDzobV7dZ7fB4r3FwL5I1cpIzmdxblVtXmw3VdhM OV1YwU9KyMlVTd/cyUrgeenXZdVRdstfb+ha5z5Tz1HNZmbF2enIT0m6SGt3Uss+W8j3Y+i6 yNvXveJe21zlRlPcWDlqN11oaWY+YdvFSdzN1dx05Mlt5t5XxtTIeG7j12Rc/V1SRNzUZf/q ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.42.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Fri, 5 Jun 92 17:21:58 EDT Received: from etlpost.etl.go.jp by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Fri, 5 Jun 92 17:21:39 EDT Received: from etlpom.etl.go.jp by etlpost.etl.go.jp (5.67+1.6W/2.7W) id AA11685; Sat, 6 Jun 92 06:21:42 JST Received: by etlpom.etl.go.jp (4.1/6.4J.6-ETLpom.MASTER) id AA13505; Sat, 6 Jun 92 06:21:25 JST Received: by etlibs.etl.go.jp (4.1/6.4J.6-ETL.SLAVE) id AA02633; Sat, 6 Jun 92 06:21:22 JST Date: Sat, 6 Jun 92 06:21:22 JST From: ysato@etl.go.jp (Yutaka Sato =?ISO-2022-JP?B?GyRAOjRGI0stGyhK?=) Return-Path: Message-Id: <9206052121.AA02633@etlibs.etl.go.jp> Mime-Version: 1.0 To: nsb@thumper.bellcore.com Subject: MIME example in VIN Content-Type: multipart/mixed; boundary="PART.BOUNDARY.8715.2229.etlibs.707775096.1" > THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME. > Some parts of this will be readable as plain text. > To see the rest, you will need to upgrade your mail reader. --PART.BOUNDARY.8715.2229.etlibs.707775096.1 Content-type: text/richtext Content-Transfer-Encoding: quoted-printable I will show you how the Metamail and MMS is used in my news&mail reader (VIN) First, this is an example of default display image of vin for MIME. Currently I call this view as the expanded view where text type parts are processed and merged into a text window, while non-text type parts are embedded into the text as a hyper-text like link label as [section>]. --PART.BOUNDARY.8715.2229.etlibs.707775096.1 Content-type: image/gif Content-Transfer-Encoding: base64 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 --PART.BOUNDARY.8715.2229.etlibs.707775096.1 Content-type: text/richtext Content-Transfer-Encoding: quoted-printable You can view the section by selecting a [section>] label. Selection can be done using either keyborad cursor or mouse pointer. There is another view called the holophrastic view where sections are listed in one line per section. You can switch these views by selecting the links labeled [shrink>] and [expand>]. The following is an exaple of holophrastic view. --PART.BOUNDARY.8715.2229.etlibs.707775096.1 Content-type: image/gif Content-Transfer-Encoding: base64 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 --PART.BOUNDARY.8715.2229.etlibs.707775096.1 Content-type: text/richtext Content-Transfer-Encoding: quoted-printable Other labels [metamail>] and [mms-view>] are shown in the above image. You can escape to metamail, or raw message viewer by selecting these labels. In the display of vin, a content of non-text parts can be shown by selecting a [viewpart>] label, like this: --PART.BOUNDARY.8715.2229.etlibs.707775096.1 Content-type: image/gif Content-Transfer-Encoding: base64 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 keq66y5x6L4774eSrlEAADs= --PART.BOUNDARY.8715.2229.etlibs.707775096.1 Content-type: text/richtext Content-Transfer-Encoding: quoted-printable I feel the holophrastic view is yet useful for a message which does not include any non-text part, that is, large text message can be read efficiently by representing it as a multipart MIME message, then read it randomly selecting sections in the holophrastic view. I should say that VIN's view image could be easily defined or customized by end users. Verbose explanation like This is a message in MIME format will be cut first when a user become familier to MIME. -- ysato@etl.go.jp (Yutaka Sato) Information Base Section ELECTROTECHNICAL LABORATORY 1-1-4 Umezono, Tsukuba, Ibaraki, 305 Japan --PART.BOUNDARY.8715.2229.etlibs.707775096.1-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.43.msg ================================================ Path: flop.mcom.com!news.Stanford.EDU!bloom-beacon.mit.edu!hookup!news.umbc.edu!haven.umd.edu!purdue!lerc.nasa.gov!magnus.acs.ohio-state.edu!math.ohio-state.edu!howland.reston.ans.net!news.cac.psu.edu!news.tc.cornell.edu!travelers.mail.cornell.edu!newsstand.cit.cornell.edu!usenet From: bst1@cornell.edu (B Sudesh Tiwari) Newsgroups: rec.autos.marketplace,cornell.marketplace,ny.forsale Subject: Car for Sale, 1994 626 LX (NY) - 626lx.jpg [1/1] Date: Tue, 25 Apr 95 15:09:57 est Organization: Cornell University Lines: 789 Sender: bst1@cornell.edu (Verified) Message-ID: <3njhl5$f8e@newsstand.cit.cornell.edu> NNTP-Posting-Host: 132 Mime-Version: 1.0 Content-Type: multipart/mixed; Boundary="*-*-*- Next Section -*-*-*" X-Newsreader: WinVN 0.93.02 Xref: flop.mcom.com rec.autos.marketplace:13933 ny.forsale:13859 --*-*-*- Next Section -*-*-* 1994 Mazda 626 LX 5-speed with overdrive Color-Ruby mica with beige interior 23000 mls Full Warranty up 50000 miles Fully loaded - a/c, cruise, dual airbags, power W&L, tilt steering, great stereo with coded alarm Luxury pkg includes power moonroof with map reading lights, performance alloy wheels with locks, anti-theft alarm, heated outside mirrors, floor mats, rear color mudguard, etc. Added bonuses - 4 original alloy wheels with snow tires, Bridgestone Blizzak, 3 Mazda oil filter, 1 Mazda air filter, a fitted hood protector. Price $15000 (Neg) Contact Sudesh at (607) 255-8844, (607) 732-0343 after 6.30 pm, E-mail bst1@cornell.edu --*-*-*- Next Section -*-*-* Content-Type: Image/JPEG Content-Transfer-Encoding: Base64 /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/ 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEGAhYDASIAAhEBAxEB/8QA HAAAAAcBAQAAAAAAAAAAAAAAAQIDBAUGBwAI/8QATxAAAQIEBAMFBgUBAwgJ AwUBAQIRAAMEIQUSMUFRYfAGE3GBkSIyobHB0QcUQuHxIxVSchYkMzRTVGKS CENzgpOissLSF2PiJTU3g7PD/8QAGgEAAwEBAQEAAAAAAAAAAAAAAAECAwQF Bv/EADMRAAICAQQABAMIAgMAAwAAAAABAhEDBBIhMQUTQVEiYfAUMkJxgZGh sdHhI8HxFTND/9oADAMBAAIRAxEAPwC2Yv2twXD8RVST66RImS3KkqJub6+n Tw/wrF6bHMKl1EiYlcuZnIKS4ZJZ+fG+8Y32x7LYpivaWoqZVHNmImKUpLJI DevQjTOwOG/2b2ek0tTIlyZkoETEg219HNuWsOSqqMU0yg9qcb7Zye01VS0F VUIpZChLCaYswPIbuYX7E4j2xrcZTMrqivXQGWoKM4lsxsGJ3dtIsPa6UcEm zu0WGy5K6lKkzZiZjHUC7bsW8Gheh/Er+0qegkVEim7ypUEqTKTlKSxdxtfT wjlzZJKMlR3YMblJNMy/F5/biXXGQmtrppL5UpnFWg8baiHtBgfafEKOXNqK +umS1ozpQmapRBD68NI0ntL2swn8jMApUqqZKgglJDi9hydozSn7V4zS4mEU YqF0qsp7ouQpNiRo37RM8stvDFLHKMqkHxXDJ8ySJaZKUplSwLEEnmXu/wBT FdKAhxWFSFLSMvs2axDeF/IxJ472qM3PKluh3zWykPs3LSIBHaFZKEqSkoQg JRZ7D9vnGcIZNop7VLslZ8iWmgIORaFEpzpUpTjZ+DkcLwTBcSqKSgShIUoI LEJvxHpz3hCUioqZJnomhMkLzd3mLseWrWe8KYeaMU1NJVPnU1ZNnEklylSS xTYa6lzd4NtquylW1snpWM1FDlnTJfeUi5QKkgszuAx83bhFVxDHRWVylJQM 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 +8RlF/8AtsvwT8jCkUscWjojdH//2Q== --*-*-*- Next Section -*-*-*-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.44.msg ================================================ X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil] [nil nil nil nil nil nil nil nil nil nil nil nil "^Date:" nil nil nil nil nil nil nil] nil) Received: from gunwale.mcom.com (gunwale.mcom.com [198.95.250.11]) by abattoir.netscape.com (8.6.10/8.6.9) with ESMTP id DAA18866 for ; Sun, 30 Apr 1995 03:04:30 -0700 Received: (from jwz@localhost) by gunwale.mcom.com (8.6.9/8.6.9) id DAA08377 for jwz; Sun, 30 Apr 1995 03:00:19 -0700 Message-Id: <199504301000.DAA08377@gunwale.mcom.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="bODY.pART.bOUNDARY.2" Apparently-To: jwz@gunwale.mcom.com Date: Sun, 30 Apr 1995 03:00:19 -0700 From: support@halsoft.com (Hal Software Systems) Subject: Welcome to Ishmail ************************************************************************* * This message has been encoded using the Multipurpose Internet Mail * Extensions (MIME) format. The mail reader you are using does not * support MIME. To display the non-text portions of this message you * will need a MIME-capable mail reader such as Ishmail (support@halsoft.com). ************************************************************************* --bODY.pART.bOUNDARY.2 Content-Type: text/enriched Content-Transfer-Encoding: quoted-printable Thank you for using Ishmail from H= AL S= oftware Systems. Getting Started This message contains a few quick tips for getting started with = Ishmail. If at any time you have questions, = feedback (positive or negative) or bugs to report, please use the = Comment function in the File = menu to communicate with HA= L. If you wish to be added to the ishmail-talk = mailing list for discussions and announcements about the product, = send a message to majordomo@hal.com= with the following message body: subscribe ishmail-talk Mail Folders Mail folders will show up as icons along the top of the main window. The= messages in the active folder will show up in a list below that. The Folder menu contains commands that allow = you to create and open folders and to switch between (activate) them. Mo= st of the commands expect you to first select one or more folder icons. = An icon can be selected with a single click. Several icons can be select= ed by dragging the pointer or by holding down the Shift or Control keys w= hile clicking. You can also activate a folder by double-clicking on its = icon, or by holding down the right mouse button and using the popup menu. Reading Messages The Message menu contains commands that allow= you to compose, read, save, print and reply to messages. Like the = Folder menu, most of the commands expect you to fi= rst select one or more messages. For example, to read a message you can: Double-click on the summary line for that message. -or- Single-click on the summary line for that message to select it, t= hen use the Read command in the = Message menu. -or- Hold down the right mouse button over the message summary line to= display a popup menu for that message. Use the Read= command in the popup menu. Composing Messages When you are composing a new message, you are= typing into a Motif text widget. The ed= iting commands used by this widget can be found in the = Ishmail User's Guide. If= you wish to use your own editor, check out the Editor function under the Message menu in = the composition window. Customization Ishmail is highly customizable to your ow= n tastes and habits. The Options menu in the = main window contains commands that let you specify custom beeps and icons= , pick the fonts for your display, add buttons to your interface, and con= trol the appearance of your message list among other things. Multimedia Capabilities This section describes and demonstrates Ishmail's = MIME (Multipur= pose Internet Mail Extensions) capabilities. Enriched Text This entire message demonstrates Ishmail'= s ability to display and send MIME enriched text= . Text can be: Bold Italic Underlined Bold-Italic Bold-Underlined Italic-Underlined Bold-Italic-Underlined= Bigger and Bigger Smaller and Smaller Right Justified
Centered
In addition, text can be indented as in the a= bove list. To add enriched text markup to your outgoing mail messages, use the = Edit menu in the Ishmail= composition window. Pictures and Sounds This section shows how graphics and = sounds can be included in a message. The disp= lay of these components is through external commands that you choose. Is= hmail comes with a mailcap file containing li= nes of the form: image/gif; xv -perfect %s This line tells Ishmail to use the = xv command to display GIF components. If you do no= t have the xv command, or you wish to use a d= ifferent command, create a file in your $HOME= directory called .mailcap. Add a line like = the above one for image/gif and change th= e command to one of your choosing. Add the %s= token where the name of the file would normally go. Here is a sample GIF image:= --bODY.pART.bOUNDARY.2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Description: Our company logo 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 r3znS9/62ve++GVFAgAAOw== --bODY.pART.bOUNDARY.2 Content-Type: text/enriched Content-Transfer-Encoding: quoted-printable To view this image, click once on the icon using the left mouse button or= use the popup menu available with the right mouse button. To hide it, e= xit from the viewer application, shift-click the icon with the left mouse= button or again use the popup menu. Messages can also include sound-bites in the U-LAW= (Sun .au) format. If your system supports this sound format, they = can be played using the showaudio command pro= vided with Ishmail. Here is an example:= --bODY.pART.bOUNDARY.2 Content-Type: audio/basic Content-Transfer-Encoding: base64 Content-Description: A famous personality speaks out LnNuZAAAACgAAEJ5AAAAAQAAH0AAAAABbXVjaGJldHRlci5hdQAAAH5ueW/+fGrva/Fr+Pp4 6md7dGTu+Xbj6ejw6+f89ft+/n71dXRtd/5x/m919HD1bvJ3+fP1eW7raulv9fl7fvv89nn2 7271fGzye/719n3s7nXsb//xbPBsbXxg9m1w8Px65Xn3evJz+vZ+7nLu//vqZux0fHt2d3L0 ePhu+/91+fV09fV47Wrtd3zqavh+dXtu/m1x/Hr0+eb77e367nz89nX//W9s9XD3de96+/dt 7nf+cPVxfHp4dv3xdHpw/nR0937yeOhu73r07XDhauN89/Dv+P9v8X1weHZ5fGn5bnJ+dvn6 9nvv+X797353+3jw/Pr98Xf6eXj7bvpxfHhufXp0d/r3ae5o9Ptx73jxfXfseX7y/n7zd+36 8/P54HLne37vaPRudHxr/nJu9nF492bucXnrZ+Zsd/v9+Hn6/Xxzfv/59v/u8+z85vd78m34 fn3vee538nl8bfhn+25peWl+cm3xb/B28H5/+Xrr//r98n3te/T5+e/+/u9t6XTvb+98+P1r +HB4fXV2dHp2cnl6bf55b/j78G/xcvzs/u3y6+3v7P7tc/v9fWv8cHh9cX5u+W79fm9zeHr/ eP16fn37/3rza+Rs7+x15Xv06v7w7+r4+HLtbPJt8e5+8WjqX/11bH9rbvdo+H37/Xz183Ps afb0a/to83h89XX8+mztdH/uee3u/Ox27G/ubvr7evL6bfl6eu9y73L47XPscvp9b+pu7fJ3 7vZz9/pp93R9bXr1Ze5refdl+GbuXu14efH28Xnlbu18/fN55n326HTq/P/+9Hnye/Jwfepy 5nr6+3z7fGt7aG5vbf5w+3zwefR2+/R27Hb9f3R7evp563D1b/p9ev34d3H+dvR8bv9zfnl2 73ftfv74+Pjr8uz48e96+/7+fflxdnr38/V/cO1ha2xudvhp+XN0+PjmcHlrc/32++728+v1 7nz3/+7teu989fB66/x19GP4aXp2bHlv9HDvfv12+210em96/f/5+/N97P7wdPV49fNs7f/6 63nrfnLtdvn8c+/7fXhu8G7tbXb5//xs+mxz7f317XX2/nx8bvRn9ndp73n7+f72cX52d/z2 aex39+x5527s+/vu+/b1+nr7bH1ycGV2bnR8+fN56Hvs8/7w+/N37fz4+PZ+8/bs6v7yeHhw YHlib11yY25lbHf0/e/98fH+6O717/Hleux27fR253nxffT3d/zvfXptbn1p+2X4cmT/Z+9r +X/8ff949Hj7+PXz/fvw9vB/73j3e3L0cXr79u/45vzlf/R8bnpj8GxnfGt3+219fWnqb+Zn /vtu5nPpfvHqfuRy7+x77n76+3t6/mn5YvhtZfBn9HX6ff5/cvZy/X358/bt8/vj8+vr/+p7 8Xn893B3enNucXtkfHB0emv+aHV9dXn1aO9n+/Nq33vr/e7x6vTr4vvp7ffqee3493fzaelw /P5kcWRnZGVmaW5wamlteXPz+Pjr7+jl6Obm5N/x4Orv4vHq7vn8fPpsZ2deZGVgYWJbXGtu aPb9eu328eXy5uze4t7q6On36/fu/W/zdGFvX294Z/96eXhzemV093j07/H88Pj99/bu3fHh evDyavdqc3lfaGhfbGRrdXB/efHy6+Xp3e3l5+Tk9O36ePfte3pmX2hhY2NxaX1/+fT07f7v 7+7m6e/5dHdv+v/veHN5anFt+Xrtdnx6+PPo8O7pffJzbm9jfXx3/XF6b2/+fW3q+Ojs9u74 5nnx+XjxYvxndG5oeXN0b35nemt77e3t9nNz7ufh3/jm8v7jbPBz8Hxxd/xra/hseHB4dH1k ZGVifHb87f7w8+9v5u/r3/Xm++/0eel39HZrav5r93D+/2/la3lvYHBpevX6bm34+ub05evs 7n1q727t5/rsfHFza3xge2r6/n1rWmtt8+Ht6Pnv7ujf7un2/+/6b2xebGb7fWt4b3Ts+u33 +d/3325ic2p9dnLx9+1vePtsamlqcm5vZ19y9PbrfuTh2dzh5ujs5uvy6n77+X/5ZmtqZWVm bmdwXmRgZW7u7+d57ehy8Pd/4PTt/Hnx9f3odvv6a/Nx7296ZXF+c/14dW5z7ejr7Hdse37j 9+7t8+35bWBeX/bl6eRrYltkcPLu8ubw5ezc4fHi7uPq43n0/1taUlldd2ReW2Jqe21p+uve 2dbe7ujt4d3v4N7d2/D3ZGtpdXxyYFhrXGNta3Nf/fTmfOhremdg/Gri7fpxfHj53uP3dfXp 1drW8/Pzf991bV5pX2FZXWd173lsY2hz6/DzcWn0/P3ravrg4O7rdfT69PPq6uTo4OHta3Rk al5aaXL3dlxaWFr2fN/e6OPs62R3497P2dz5aH334+Noclpf7GpmV1hfaXVtb3z6cOXY1dLi 9fj0euh+Z29Zfm3r92lodfdx9HhhamX57nBtbP3d3Oh3YWvr//xjaODg5uhu7d7b1+hraHD6 5nXvX29xc3R5XGRram9gYF1hZ2736vh3+vXk2Pzz3frm7u717tTc2vl6cPZv/fdvcXRVU2Vn ZXv97PVvbl1j8frqdXPo69bs7GF13tvW6O/tb2JhXfnv5txiW2x16GJfYe/je2NXV19r7t/q 4WNy++Tc3uXqa/R46Ofw0uHa8V1qZPr9bVpcb3VraGtaYXzi5+x1YHpk7N/g19zc7Xhpavbp +P9fdlj1aGvpd/1t8OT3/n9zdmxdcmtsXVtoVfdu1tLR3PLT1tDY6uHsc3VbXWZfXmVqfGJj ZGhqeHR0am16/XBm9eXZ8vDt4dvX5OXu+OVpZHBhe2dbXGns7mJpdv74X2lneGbm8PnsYOfd 1+fk2drjY15v7edubfbv+m5manPw5OrvcXR6dF9ectrkZF1PW2jv7nx6ceHd2+dnYm7r+P74 6+nudmzw/+Xx6OV74PHl8XFqbHx7bmpyXVZn/W9gYObg6/Vq/t7n6evm3+nk8230e9/1Y2Bk ZWtgWvhd/Hr6fmr4bm/g9efZ3uZnYeje1vJrYFpmYvN1Zm3z3uf23efl/W9pZ2dfe+LreW9r 4WJhYXVpYnVU/+Xe1+rd+NjLztTj+/r4Y11PZHh9bFZfVmliXV9j9X7ocHPu+f/d2tbuXflw 5u/vfPxn8Orc33D65Or5el/pYO9+aP5oaHLwZnp+3O37Wk9XceLi3uN76mZ549bO1dr/WVRl dl9bX21eZlJe/tjV1dDye17o6OX3df/zbmhkcWh0e/p+ZllUWvp859vd0eVsbeDV1e/rf2tl ZWx3YHdy8O917N3oaFtS8uHp827d+O1tX/3+6nhhT1Ro52prWH3j/+x23t/h1+nd39rd7G9z bu9uXVJYbWr1Y1pnX+He19je1fVwc1doXmXc5OxnXuZ83e9j+OHV4PdOS1Zl4vxrYll5ZHBy 9+Xf5d/f3Nnf8OnX2tvc8u5r72Vk71ddWmBfW2xcYfBTb11jbVvsfGZ9Xtra1tPe7eTXxs7P eGb2bHheWE9TXE9bZG7t8+Nr+eLa18vk7v/6cP7wem1eWF9jX09dXmnu8OR2bnvm2MvW6t/o cnRy7Oj0/X9tbltvWP55ZmlW/d/d7f5lY37waW94bfHy4fHt7+fd3tvx6+rjbmFSVmHw6Xhf cv/xZ/Lp49zc7OzvbGluZXzs8G5wV1lYYmDlz+PsZEpO2LzQaUNMycvWX0lqZltgV8e+v81G R0ha5uzX6tnG1GNMQ0lOamLoxcXNemdTW1hL2r7CaUFQ28njQ0duzs7ldVxaV1Ps3u9gUtbE 2kk/Vs3CyeNueeD0X15Z3MrL6EtCSd7Ldllo49XdXFnh2G5s8fZeT2zn8v3w3dzkWFheZl/8 yMt1REp4b8jNWGVN38fiZklQ39TGzN3SVkdPXlB6wLq+TzM4UsvcUnHOxcpvRz5Qdc/O0XHy bvZMTFHuyMLJ3thdX2J+339rbPjY6lRLbNXWan1n2c3bWz9IYNvE1nj7XVBV2vVcST/BrrpE JyxYxbtebrWutlg0NETVydHc4MnM809CS37Jvb3E0PNfST9ARlFMTVFXWlZa8tzo58zExNLr fffX1/Te0tDvTEZRadPO3+1bTEdGTk9OWWzazM9sVOrZzdHPyMnJ2eHfb1dOW977al9Wd1RO Znnr63VlUlJTXeJaO82tuEsnLsmuuD00yKuu3zUySs7MelrgxcPNaElNXtTKy83c3ehdTkhb T0FESG3X9l5S8+dmWWDb09XraNvS3XVi3c3Re1/y0s/rY2dsYk9MZPLb7lpe495oVfrIyu86 PruvulIvNFHSyunKuLbBXDgyPUxT+NnMzfJcSkVNatfDvb7H3GVRSkRHT1thfN/Z9FxY8dfX 4drGwM92XP/W2Ozq295tT0xaeOtvW2ZfWU9TWFhRVPPY4VtOa8vE8VLexMlQPtC1tcU9NDhD 58e4t7zJfj8xMztX0sjMztL1Sj5GV9/AurrC0mVQQz9ASXHp9fza3XdYVeHTz8/Hv8l+TlvX 1vxr6NTqTUNKbfNbUVp1WUhJVWBPVdPD3UVJzru/Z1nFv1ZFxbG03Dw4QUhM87itttBSPDU1 Nz74v77PaWFMPz1G/r+4vMXM4VVBQEtPW2J74NTf/e/t4NnazsjJzuX+7v9navbd3W9VTUtL V3d9bV5ZU0xNUl7u3e313tHrbODRx8jUSkHDsL1aRmTeTDw/xbK73traSzc3PEv+6trW0HtJ SVNY5s7CwszT5GBKRk9ZWmR83dfq9XPt2trVy87d/e7t8Pn23NzoY1dWWVdWWW9rX1xaV1dP UVzp4XXmzdRn6snI2/jaX97Cydz231pDP0dsysnWzb3OSj5CQz1EW+HV097s7XpZYtvNztHP 2HZaUU9OS0xY7uDo7tnL1tfR09Hh3d3t92zo2vxybGljT09UUmJdUFVablxRVmF96Hfm0dj6 dsvMzuTeaHXCxNBg9uZuSURQ1+Ts4cfMcVBOT0BDRk5a6tza6+To29na0c/P32tYVU5QSkt3 dXB+6NjT2dzOxs/b39vZeftvePfx9nVhZldUVVFaX1dVT1xcWVtv8W7p4OLr3dLLztrP2mnI xtRy+tPhZD4/bOZqYdjE4fxcWE9GSkhRZWFiXWx96tLMxsfH0NjkYFFQTEpGT15dfPXWz8zM y8fJ1dnm52lq/WpnZW51aWJiXFlZVE5NUE9UWV1k7vXn3P7jz83VzNDY2Hjrxc/249jmb1xO VV1bbd/q9ez9XVRUVFdSU2FeXWprefjo1tTMy8nU63lfWVRQV1NUXWJndOPQzsrKztja39/l e11icHVmYeltbHZqXldZWVlVWlBOXmxbafHd1Nvc1c/O0NjV0Ndt6nb10n5XVlpnbFxd697t dG1ZZlxiZlzo9HRtWFhgYl/l3u/g4ujb3Xzn2eBmaX1vc/thbvTe3u3o4t3e3XXx5uLsdmVe YWNjWFVcZH5pcnRgYXN8dezf6u5z/eT68vV15+jp2ur/bv3s+HHzders39/l6P39cGN0eGpp YWxkXWNrc1lWa/1kaGZ98uPh59/p5+3wd+763+Pp5HFn8+Hh+2/08/Xm73pr+eDk5V5bbF9Y Xm79bGNfZW7t49rk7u3e4frx//78d/Prb1dcX2tnbe7g3+fh8enx+/J6WmRlZHfz+nlvb2Va cHV9aPDi5XRp5uva7u3j29h/d3tnYW70+WteYmT5+eL/cvH13Nv+8Gr+5N73+Ot5b2pqa2Nj WmNyaF9e/uT2au/z2+TY1OTna2P19d7p5n5aXHV1X2Bkel5dYGdwYn1y4Nnf8errX/Hi29rv 7O3f6P1tZGBg++72dFls52t3+XZ2bHfx+O314+vn+Xfn3uRza2Zv9u/s7GdVYmxudmZpWmtw d+x26/T+9W/f2d3vaO7k29r4bXd96uZvXVJfXFzuePXe7mBf8vji3uDuXP3b1NpgW19lZXlm Zmtx+dvV4Pp23N3bfmb1bW5id9zobV9y4/1WblhXX1fs3tzvcXxve/Dc5fF5V1zzcG/9bnTg 8N/b2+t3bd7V3O7n4XlcU1JbfX1kUl/e6vD7a+3t39ja51pfdOnsb3P6aW5nX+1qZnB0bOjm 7W/ycN3V6f9t3+Rz8+Pi5GZOVF5pYGVkevB/dPDo4eff2Nzk7Xjv7V9w7nj3YGn5fV9fYG/f 2uPxYWhs9+t3bPjr8mJabGlmV11k++jo4dp9cuzd1Nfz6Or872p78GZd+ezh3vTtZv3uY27i cH5XYnVjZ1dh39/ob1dcbO3o6PX+4Xt/49v/Z9zU6G1YXXtzePvq6Xrm4OxqUm3e5HtkVlH5 7Olqb+rh3d7s3t/6+9/kcF9qXVpbWGT3fH5hWV743dz189/f3fh87/F553vv+OBqYGti4Pnq 7nJg/PJpX2D+2tt1fmpy6uv14t5rW1NZVV5ha3Lc3Ovb3+PT6d7lde3d7+B4X19TV2lmbVtv 7vzve+fqeWT6/Orm5u7/ZmRheu57bXDr3+pfamjk9ufR2tDwcWdu42VfXnRmc2peVllg59P7 92Fi7vd76t/w3+Lb3uHY/Gly9XBcW2dvbGFb+W/5Zm7tfXB47mlYXtfXaNXL49xx78zmVGPr ZnNcZuVtVO/gflti2fplcl1eXlz1XvBnXNzZ69nv49ze4mh72NzV7mLvXXJgft90SXHVUltc dPdjadHhaWXj29Vxcdxy3tvZamtsWFZqYFVNZNvt69pQeOVdxspxfE1rWkzI4FTm9M/SUvPb Ze7T1uVnYmzaT2D0V9TMT2fjVF/MZ2HrUFtuYl9WXfTm3dLRZ1/x4t/b9e7k6uvwaWrNfF3Z 2V1f415XVlf/4nJjdfJbXk9Y7f7Uylhx1+fr3ezn2HTl101O29j53dZz1ndWbl5IZ3lPae1N TuH6z+ta2t75zdJ04Gxha2VydeXT7NXX5+XtXldZXfpaXlpaW1z4Y+bsx8tU7NhgaNzga19c 4c5YX2Re2dT92u5L+NVWW29W+95cZ+1cc8t7Tt7u59nue9FWVcfOcvvz785oWeZhX+9KatdN WGxWWHLM5WjK41vtalh77Gr/a/jXXXbTZWPa11lZcVr7dvfWet7Q62bKzG7Y31v9WVBWSEtZ ZV/c40370ffIw/hvzONe/tpYV05MTmTt397bztjNztRdcHdXTU9GPkJNTlTq0NjBtb29t77I yd1YTEU8OTc3OTg/TVVe2MzHu7e6ubm+vMLK7FVZRUNDPztCSz1F+UXcyU9vy1Tyz+nNx9TE wMy/xtPe72B+YlNFPkE9QldXW93MxcLHwM3n2XFJTD83Oj47P0RKZdvJv7y4s7e3tbm9xM/S 5l1MQEJFPT9APz9GU0JJ2Et4xlJnzUx50OLMwcvDwMq/y/TY3l5wVEBDPz5FQUtZaNrFw8fB vMbHy/FeVk09PTw4O0NJWfDSysO6vbi2uLq7ws7R7WJPRkdBPkI9PUtAOEhlQuHaROvMTdrP 7M3IxsO/zMHL09DvWGRUT09IR0NITmvZzsS/v76/xtXb9VBKRTo4OTg4PEZNa9fKwr67t7W0 tbrCw8zw32BMST8/RT08Pj48RPs+cNQ/Z8pKaMvf4cHF0b6/vsTJzuBb41lLSkY/Q05SXPvO zsK+vcTIyd1vVkM7Pzo3OjxDSl911Mm/ubq3t7q6u8TN2GBbWUpHR0A/RT9BUEs9TvdG1W1K 3dhN7dvdyL3LwL3JxcvT4uxbW0lFREQ/R0pU59jGwLy9u7/IzuxVRz85NDY2NztDU/PPxr+6 s7SztLe8xcnibFRHPj8/PURFQ0ZWTVT2VEHi39vlVG7kZWzz48jAw8i8wcnK0X9pVk5CQEFD QUNPVH/OwL65ubu/xdD5WEc9ODIxNDg8QVTrx7+6tbSys7e4vsnVXU9HQ0I/Pz9FTlBaX11f al5fSUT33s5QTWvic/nnzb+9v7q6wsvd8GFORz86Oz5FRkte383Duba4ur3Dzn5NQTs0MTEy OD1KZtrKv7eztLO0t77L2vBcSEBBQUNFSlpga3zn7mxeXk5MTkJBXOPKb1XtzsvO38K4usbJ w8fkTUZLRT88PURLUVj+1MfBvLu5vMHN42RMPTk2NDQ3OkNTfdDBura0tba6v8jZ8ldLRkVH RUxQZfHl3ubp9WRPSEhHSEhHQlvZv77Z7dXFwtL60r6/y3ljdWlPRkJETkxJUGrn19fOxb68 v8TK1fJUQj06ODY1OUFPY9rFu7e3uLq7v8ffYlRVTklISFNcbfvy4uboZ1hOS0hISUpIUGf7 a9vGtbLDYlH9ys5dTmbJvsV2T1FfYE5BP0hVamdXaN/LwsC+vrzCzfVNQjw4NDQ3PUle3cnA vLi5ur3Bydl5V1JNTEpMVXXs3+Lt8XJmVE9MSUlDR0xUb3bXztjJw7u2v+1ERFDk0t7m2cvC zedPQUJGTkxIQk1f28vOzMq/ubi/1WVTS0A5MjM2Pk1f4NbKwbu5u77GzNHkcVtTUVZfbfrt c3N4+vxcTklIS01MR0pVc9bT1tvx1sO9uMJfRD1Ge9HNzM3LwsTPdUk+QEVLUUtKUmnXycjH w8O+wM14Sz86Ojs6PUNKX+LPxcLAvr29wMjd/2NgX2ViYW15/O/3cWRWVFFNTktJSUlPXW7v 4uLX2XXMxsW802BZS1XbzsbCyszM1e5cSj9BRERNT1BXWHPXxsC/v8LIz/1XSD09PTxBQUpa +tXLxMG/vsHFy9bjc2tnZGRvaGRlXmNdV1haWlBOS0hOVFpfc+3Rz+bWyMS9v+JiT0lm2s3I ydnW3fFrW0tGQ0NHUlhebG/fzMe+vcLG0+5cTUU/PDs8QUhPbefVysS+vb/Ey8/Z7HpkX2Jm dGxtdHRzYFxcV1ZSSElITVxlYW751dXbysjEv87wYExPbdjPxszY2ndtZFRKR0hNUFtaX2v4 0M3Ev8HAyNRxU0lER0E+Pj5EUWjsz8vEwMDExc3U4/n2d3ZsbHFueHt5eGVcVlBNSUxKTE1M Vmn+19LXzsfEv8LU6V1SXPjazc3a5XxqXlhVTU5LTVZaZ27y3NbMxsDAw8/nXE9IREVCQ0FC RVBi59DMxsLEyMrNz9Xg7v52du/4eF1bW2RnWVlQUVFNTE9PWV1s8d/Wz9PLx8bFy91sXExT aevX0Nrk/mplY3RoZltYW1lZX2t14tzPysfN1u9jVVFHRFVVS0U/SGrqy8bNxsfPys3c29bf 1t37ZVpeXGR0X2VhWFFNTUhNTlFfZWvr3dXNzc3Rz83P0NjffF5WV2fz3N3f3+Hs6+9pal1b UE9NTlVcanbr5tnV1NTT29nj9XJeXVZUT1BPWF5m8Prf4dzc39bV1Nfb693e3OHndmhfWFNV VFRSU05OWltfZ2r0597Z5NXRy8vM1dfb2NjZ0tvkemdjX1lYWWBcUkxKSk9XYX1++uvY0s7O z9TY2/Xxc11US0tLTlFVWV5p9+fYzsnGxcjJzs7P0dx4YlZWTk1MSk5NS09NWmJicn1z+3zg 2tLP1NPc3uHWzMrJzNrpdXFra2piWVBIRENHUVp183rv5NTQz87Q0tjd9GxYTktJSUpOUVZi fubUz8zEw8PFysvO09Xf8GJVT01PT1dNTUhHSEtUWF1aW1Jl7NnOys3TzszJwr+/wsrZ7vh7 a2VcTUZCPj5DSk5o+X/n7NzMyMjLztXl/WpaW09HRkdNU11s/uTh0c7Kx8jJx8zP2dvd4eR6 XlhOUlJSTUxIR0pGSExPWGBf8dvNysrO1M/LxsDAwM3V5nbxe+zoeFVHQT9BSE9Ya2T69Xze 1cfK0tfg5vZtW05PSUZHS09db+3i1M7MxsXCw8jIzdLU2+j1ZF1WUk5LSEREQkFCREhNU11l Z/7Wxr+/wszOy8vCvr/E0OJvX2VjaGpWTUI/PkBJTltjYvfr2dLMyM3O0Nra6WtjU01GRUtO UVZec+LVz8rHxcPExsnOz9Te9mVaVk9LTEpHRUNHRUZKS1RaWGxy7s3Ew8HEzMzLxsC9v8rd fl5XXF1jaVdMQkBARU5XZW7+bevfz8zNy8/W2ef8alhPRkhHSElPT1r23NHKysTDwsDDwsbN 1Ob2Z1tPS0pMSkhEQEJDSklPTkpSUVzey8XCwcnIycO+u7vCy+ZyYXR2b2dUSkI+PURIT1hb cGnq3s/KysnSz9fe5WRbT0VHRUZHRkxWbuPWysnFxMG9v73Fy83m6PxhW05NS0dIQD9AQEVF S0ZLVVhl3czGwMHIxsTGwL29v8rZfnJ3a2tdVk1CPz0/QkpOWHD87NvMycTHx8zR3O95WE9G QEI/Q0ZKV2bo0s7EwcC9vry/w8fW3fByXlJPSUhHQ0E/P0VGS0lJT0xNfs/KxsbMzMfGwLy7 vcTO2Ozw6np/Zk5FQT1AQ0xSXVxr+OHUzsvKzNDd6HNeWk1JRERFR0hMUmzm18rEwMG/wL+/ xsvX0tjd8GNTTUpFQj4+Pj9EQ0lGP0Xzyr29yv5QVWvEs6uqrbXNUz02ODtHVGZuZlRPTU9c 68a+ubzG6UU8OTtASFfv2991VkpNW+TGv7/C0OV5/tvYz8fFyNxxWWFtXFhYVkk+OTxGZm9V PVjLubPISzU2QNCuqKu21m1HRkA7RVTTwsXbTzs/R3jVysC9usHrSDk5QEhcZu53YldSX3vu 4uTOxMjM6P7p5dnb1NTb8G/9a2xnbnZbRz1AU3jZaDs/fMCwv0oxL0HHrq23xd7P3lJBNz1n xLvEbEc/SFV54dDFvrzE9Uc7PEtYWFRQZunmaU5MVtzHyMvb59vb2Nbf4+3f2Nfjb2Vu5/5P TEpUY2VPN0TqwLPZPC4yXrqttcfN2cf1QDs4T8m6us9UREZeX2Zq2Lu3vNJJPj9IVlZPTWXY 1fNJQlDuzMzW2dbQ1+X96dPU2uzu3+B9ZfjkbVJJTWzrRzlP3rnASC8tQciztcnHxcbRQzo5 Sc28vc7vWk5MSElo0b65u8htSUNJUk9OT/bU4FZGSl/h6e/ez8zS/W7e1NXf9drRz/lZXe7W +1hPYf4/SPbPwGc3LjpoyLzFxrvAz0o5PErizcTGy81rSUJEWuDKwLy9z2VJREpHR1Lw3fRY T1VnXmjt0cvX397R1fb44M3N9mn+5uBwXGT14V0/U83K4EU2Ok5bcdK+trvOVkJBSE9T4sTD yuhnVk5NTPDEvL/M3fJrUkBAS2r4XVJWcW1ZWHDYzs/Y3Nfg7dvTzc/k5dbmX19o/uVzVlPZ yW5NQT5IR0RQ1r2+yM7aeE1FS1je0dfR1eRfTVRg7NPPx8vX52RcUUtLUVtXWFhWYWxpb9/Y 2N/q39na2tbRy9rZ1+Ln+PTf+mpeYHx+V0pRV1hQTFT94un/4tPabV147Obre+TX5nNeau/w en3f3e5kXW3veV1ZXWdhZXH28nZz/Onq7Ofg4N/q8Ozr7ufj3dzf5Orr9/Vvc2p+eXRsbGth XVxcXmZx9P34dmxvbW9y9vTz+O/4fHpuZm17/vX+c2ZqcnP5/P7s6ubm7+7u7Oz37f3t6+Hn 7Pludfrw5ez49X3w8HZ1aXR89ez57n56bGtobXl7dvxvbWdmYV9gYGJsbXdya29x9/Dt+vf8 8fp3+fTo3+Po6ufk5Obr8uzm4d3teW52fezqe/1ue3n292lpY2RpcGpramhxbnNrbGNrcXF/ cHr+9/53+PDs5eXt7Pj07np+bHP67+95cV9lbvvu7ezv7OPk/Xd0/+/v6vby+v/6ePz9/PHz fW5vb/x2dGhoffT8+G5reW/6/nZ+efx5cP538Hl9cXZy+fDs6/d6cX/77Pp4fHTvd35uc/13 /PLu8/bu9vd/e/f06uXp7P98+W3+bXJxc/huc2ljaWJue/Pp7e///nL/9/Ts7uzw/PP5+P5v fPtz9m9sZmhrbGxvbnN99/rt7ezj8ert8ur18ebq6XZxa2Vxcf/h6vF3eGVpaGZud/Dj4HNz bHP5/Ort5+tybHRqVWJz+Nrobmd07O7tfPLu7/B9bXNtd373+nLt8379dGpud/z2+/X/9/X2 6/R3/O7r3uPn9n1ubGdoZ2xf9ml2bGV5/Pvl9PrvdHl8emzkfnXcaPXv/ep96O/f//TrYm9d Y29n72Ll3mXgeOznbe135nf+bnb++W7odPflbGrwbn51ZONb7GL9bXboX+d17+lj5P5v4HV+ b/VvXd/+bd956+1d++N4cNpz6OVw4Gn973Bd62v74udibf14+1/mWl/nb13eaGlt119hzGhm zWNe3Fxd4Vf/7lXP9VvQXlfOemTQ/FrU6Vfc20jN0k3NY/zPSeflVd5vZ3DiVFvVbW3s7Hbi bm7qVtlpVd5uaNVfS9R3XH7pYdtw4vBz1F3U5VXe60/IV07EV1DGWkq/ZEfD+UXJZk7CU0/D VFjNSPzGP+DFRd/RRM/0SthsfOvuZerZTtzMScrqVdda3G9Lz1hezWraZ1Lc1k3743vdXuhe /dNOXs1T6NxFztk8w9E7vexDyNhF1M1I1spGz9pEztpG389H68lMTsteTspjT8hkS8VfT8lP dMhOY8hQcdRO1uVK3M9N+clC9cFUT9zh5+BQWc/XTmjfS8VrS8ha7NVM5OJbbfdd4dlJ09xP zvZPzntb0m9m3Gn4bWTRVGTb8eV+WODMVWzgTuzKRVHN2lR7Y+bs+/ZLz85Bz9M/zNJOX81g YNle7/f0+3Xb9V7g4mdlcu56X3Pg8W5X3NtH1cxHa9DicFpl2+ZfXm/P1VZf0dxR9uBoYt/Z TFvU21Vc9O7l8E59xFhK6dbOV0TSx15JfNJ5cG95/dvfYOzcWnTPX1Tc5HZkYNncZF1y4+55 XFTcy1pO9PXlclDmxvdL4MnrTFLQyWRBWsPMT0Rzx9BRSOPJ3llL9c3qVU7jyntIU9HNZlFZ 2M16XWfa3fxv+Prs+vDw+Otpfmf/bGn4bH/7dHR7Z2t5bfT+/Pl6//1++Xr38f3offTt8Oz2 7vLu9vV4fHd6cHl7evl2b3xpc3N7eW73bvp5dfL+b+t9+u1v7vv75vL07vl99Pp37nj5c/xq d2lpc3V78v14+vl0fPl2/nF+/3x//vl/7e/4/vbz/vJ06v/47nbwenH9+mV8/Pl9cupx8G95 /mr9aXz7bfV1/v15/fJ7/vrz+3/tdOhkfvts8vr/7e106/X47vn7efD97/Rs8nN3cvdva3hn +2z6fHLz83xy83dtd31u7nxy9f7/eO1v+X57fPf+/Pn8+ez6/Xx+83z7+/z993L0dG/+bvJx +O7/8vP4f/f0/vV2/PR79/Zt7HVwfWT4ZW7+Y3htfnVufm94//l89ezyf+z96/h/5vH16fTs 9Pl+cPN8fPv/9v7wfnH6dnxwb2pmbmt6fG/3cn7v9fj3633783nt7vn29O16fnl29Gf+9Gr/ e3B9a+1ma39r/nB36Hfu+vrxdPFt8v186vzue/Tt8vru7fT67vby9nLvd3Z4cHlybP5tfW12 dWr4Yvhv9nzw8/R6fn5v83T0+/5+7el77Hx+52fp/37s9ex3fu7+7W9o/nF4/XX6b331dOht 8W32+W3paf/taPNsd/Bq7nZ29W5x8m/vavD77u136ft35nHiefftcfl5dXlu/v91+G129m72 c/v4eu907Hr09XT2aHlxbXhsdP/98n589Xf38/rv8/rtefFwfXpweXnx/fbt6e748O357/nw 8v56fGlsaGdiZF5zbXB+afF17vr28ezl5e/q7e/nfOXt6u/77ml3ZmtucG5seGh9Zm5ubnb7 7XTt+vnvdutz5X/57vf6eu9x+P5+7u9+c3b97/Ts833vePz9fXprb298a3ZnbHlm93Pv6vfx 8utvfnnseOxpbvhv6Xfv8fnlfe79/vp2cWx2b375e29+dPXt8+v26O3v9Wz0bH/3b+t5a3ti Z2xrcPzubfZu8Hr4de/v4P73+nn8e3v4+O3y3+9yemP9cXp0YXhyb/piaWRufv3s7GdhxNBP TlvLw3BTZ83I/ltdbff89WRYWGzo8W5pY3vrauh0a+1rZF5fbm/iffDs6OT139bf6HNp6vB+ 9u7nfWls/GxfYVr3eOfrd+/m53xhZf34XG1kXGf+2ubxY/3j23tvZXbf7Ol76tbT22dZ+PZt YlZXfmtdZXXtfGTy3OXsedvR2uJn5+dvUVFXcXNbVWPx7vns7Ord3/Hk2/DqcPXs5vppfPfq X1/f1epfZfHc5FBMZ3Z2VUrzy8ffYDs5vK29WT9IXkY1OtCussK+usdSNC41QUM/S826v87E vbm8xsrP30hAPjo3OEJTXl154tLe7NHCvsnMzszWZVZa5uddTO3IzVU9RF5cT1BDOlW6qcQw KjrT2UVvqp+qyl7lezQpLk3K117Mt7fPU2XR0m5aeORjSEVIST89P0xZX2nZxb/Ax8zKz+xm Yeve4vbd0NHoaW7je1FNXWRWTk9YbFxQaFBI27yvxT04Tdl8SumxqrbsTF1NMSw1XcvV78i5 vvpGVtfTf+7MydtZTkxHPT1IUVhk28XDzM/Mztpq+ODpbXHYzdDj5uPpY1VVXFpWWWFYU1r1 WD5Xx7S/QTE97N1S/raqr85MTlE8LzVRxsDOy7/E50lFYtfV2MzEy+9NRURAPkJOaerf0szM 1d/k3eLg6+3s497f3Nvd8XRuXk9TXGttXVpcYGZFP3nBts49N0rU1V3Ys6u2e0NHSjozPP++ vc3PytFaQUV7z8vNycbPXEU+Q0dDR1Xeztjs6Nna6nHp0tDc59zT0dzk4uP4YFxXXGNcXmln WWNHR+PMw9pBOURd6evLt6+21kpAQj06Q37CvsfO1+JaSEtm1cnHxcfSYEdBQUJBR1n93up7 593b4eLWz9Ll5d3Y1t/aztDfcl9iWlZQWW5hZ1tDTdrT5FY/P01OVta8tba+z25KPz9FVeLP yszO2mtVUVn/3s3KzNx6XVVKR0RKVFlsduzf3tvZ19fP0dvb6ep9b/HZ1eVyde7/WE1SY2lm aFpZ2uDq/UpHWU9TatzDvcbS61tOSUdMcOHZ2NDQ1+5o6M/P2dzOzu5bT1ZRRT5HU1pPT2zW 0t3d2NHX6vHVz9Tc29jW6Whm6eFuXVxuZGFUVFpe595eV11bZVtSZNPM2uze099+W1lu5vNq bfjt/F9h59rj4NjYzeBxZV1dVFBQYGJYX29sc93a2uPl1uvc5Ofa2elr7uB2ZWFl6mrxZFti aXN7euvr8Ht6cnJkYmJjcWdnZ3Zv8PDw4t/d5u36fmtoZGZ8cP7u6+zw5efn7PtzdPx3d3f8 6uV3+fTr6u7r9vR6bm1rb3r49f78dG5483xsd/nt5fBo+mRpaF5o/ODo9n939nttZ2BfZ2Fk Ym7u+uf29evp6fBu9X70+/bq5uHf2d7e63/reWz07+je5/l2bGheY2ZebG5kbHr77Pr18Ozm 9f5mYVpiXV5nYWphZ3Pu7eLv6Of19O3k5Ofz6uLw3+B17HhnbnVue+j28m91/OLyd35+/Xtr e/BsanPqe3L0/evxa/78c2BsZmVkdvPt6OxmcvDvefJvW2DUyENHSG+97drP2cxQW1/591TO 1MroXM1dTk57319ZSdjMZWX929lkTnhrVW3t3tH24dncaVX46Wtdbm/v1W9d0m1k+Vdse130 1+Ze32191Fpd3f/g8X/973FZ4W5VZ/vvfuv50dVkWubc8etHZdvrcmFtz9XuWnfuXl5LXW9d Vfzf5v3X38/NW/DN323dztpqU1n9805LfXpRSPLSYlBxzsxcRuzD0llY58jdW13q/Vpv2Nte dc7S+lxW3uRQSmToV09X3tHnadrCzFxa3t7iTE3jznlLV+njX1Zv2thlW+DsYl9o7vV/4tfN blvw3/pd/PrZ0nhf8tnd7eJ6XV9LSVFaZmBg5t3qa/re2eF66tfN7V/+7fduYV/u4uZ55tzb 9mNUVWBeZl1p/vtoYnXm5drc2/FcZvZ89vTZzs7pXerYf1ZQ7Nr5VE9p6GlPXN3fX1do3fxY YevX3u3n19BvV+vd/VRo39neYvDPzuZY+c/uT0hPYV5MSmrb71xY7t3ubmDJwcPyVP/z/vJo b9vR12Zm/3x1T0pZ6WZUYf3Ye2Vc9M3U28zJytpZTl1iSkVJTlJUWvzSztXKys3g+np73m5Y aH1oZVxq19NzT9nO2mtOaXPnTUhg1NdbZNLF1GtYaftbSU12+1tT58nGwb/AwMx3T1xdRj89 QkI9QEdeaXTez8fJzc3IzNfTz8/Z7Hno295oaWheX3xZXdniW0xIR09VWFjZyM3Q0MjLzeNk aXRSREVMU0la4drcycPDz9HP1PhIQD9HQj1CWmVTZ9bIxc7X08jHztbNys/Y5+vi3OVydlZX Z+9aSElDWtPcU1FcX05ESVjV0NzRwL7OXd/fcVdTWlpiUE1Q+O/gx7y/xtDed1JHQEJFQkFL VHV8b9jIw8jMyc3M0OTaz9rZ1+bnYmloWlpOVllvX0pJVF5VVNnM32Rr19xNQk3Xyd7myr7O WE9dbltITlz+Wk5d5M3NzMzDxsbT7WpMSEI/Q0xOW2js8+Td2MvMzc/JzNHY7d7+dXnU2N9k WFFOT0pdZGdPUVdWTExe2V5Nz8LHclRq3v9VUc29w87Kw9hdS0lOTEZGSVdeW2zp0cS/vry7 wdH3Tk5HPjs/UFhOTFl23ebc0sbI09jaztbfedra2GT30druTlho91NOSlVPTEtJVVZb/tzf 8+lnyb7IaFTzbU9GVd3Dx9vMw8p5Vmr7WU9TXF9nWGLu19LNwsTKzd32VkpPRUJAQEpaVV95 595v29fMyNHd2s/M39x19d793vjm/HhcSldbXF1PTVpJQklRdG1q9s/L1tLL3sO8yM3T1u5f TEZv1e9Y6NPZW0lUS01FTmPh29/i53Fl48vAytTc2NprSkdITk5UX19gdPlzZV/dz9Ti4c/R 2vJ+2dDNzs/uZGlgVU5LT0pGTktOSUlZcH186M/IzNDWzdDIyda9vc/oa1ZPTUZP6Nri9N3b Y1NSSkxNTVRTXWt9cP3Z0c7LztLP1d7wXVVLTkVFTk5fZHTt3NjdzsfFxb2/xtltX3RuVllj cWNPT0pLTUZOU05RVlpXV23bztHXzs3Ixs3IzNDPZWDNxst3VVFmTkFJZs/vVVRYWUhPX+Xd U05daHVr487G0vDcy8nM1cnbeU1AR0VJRklLWGHs283LzMrPzsvIyc3Y4u3wdWVxblJOTk9K UVhRVlldWlpjX2hrcOPi4tXm1NTh0tXO19Xe39zT4OreaGhnY1n532ZfV2psVW1tWVpNSkZK TllzeODV5d3X18rHyMnP3O1mW1laV1xbXFRNXXXz3s/Pz87Sz9DT29vwbVZdV1ZbVm1ualpP T0VJTU1YWF9lX+nc1MrMxL7Bw8vMzc7Y8vPm311XW0tLSURNU1RSW214ZWZ0YXbj69ny+/hq fWvyc+PT08zn3t7R1OX+Yl9XXVVQSUpNXu7q2tfW0M7OzczSz8/U2u/yblVPV239Zl5LRUBC VVRXVExOTFNW7dPJxsrHzcrHyL/Exs3S1N3ic3RZVUdESU5PUk9mXVtOWF1nW1tYYVpXbG3e 5tnNxMLBxs/X7N/zbfpbUVFRTlpvdN/c2dzW2+7i7dnNytLsZVBMT0xMUV9PTVFNXnP57O5l XllUWF3+3NHJyczLzMrGysfT2P5iXFBt19fr4GBKSEpSZmdWUlJTTlRUYWNbVlZed3rr7uTW 09PLvru8v7/J2v5pYVdJQkRFPz8/S2rk2s/R1tHYz87c29/f2/z0ZmdwZmlXVU5PT1JZYGFj Z2x29O7f5OPf0tbe3dnP0tLP1c7S9Vxe/19dWFlZUk9VZX9YT1L97WNdYGJgbGR26Ozc5OTc eebiy8C/vsbK0WVhWllTSEY8PT5DVG/T0M3Lz83T0szRz9bo32pfYFxiVWhZWFhNT0tMTEpW VlxcavnbzcfLx8vJxMbFytjb7Nvy7mF83mZXT09OR0BGRn1uV1BTb1xXXfXN2/5qY97Z1tvR x83R1M/Fys3h5PlPUGpYSkFFXWVHRFPc0GB8y7/IfFvQxNBqbNTN/U5Y3dZsTk5eU0c/Q05Q TVFlYH38fs/Pw7/NxMjN4djEu8lu7+3TyN9PREdFRTw5Q9rMaFFpdFM/Pl7OyuTl2NRbTU31 yMK8vbzF2mxcWUpLYf3tfFBj2O1HSuTGyF1S38nZS0rZxs5eUnTlZ1BZ+X1TSklcWkhKUlxq ZePRzczUzs3Q08fEyOh5xsbuW19efcPVUDs9Q0lAPFC/tNBSbsdlOjND1MN9TWzL3EdHbMK9 wMG7t8D8Sk1dTklSWv33WVVBQE1q1NnTy8DIaGBq0s/dc+PKyvBJSlJTRkJIYXJQSkZSW2Ln 1M3e3uLOyczSysHX3cbTXmLfxb/sOzjJu/A8NktvVDI22bm6Ykdq0N5HP1bLv9hceeTeX1Zf 2cG/wMbPd1NOSUZOZOnb52dr1eVWSlvLv8VhV9rM9kRCYsvMZ1Z7z91ORk3+aExJXN/uUUhT 6dLW5trMytPu7tTJydRu5MPM5EI8VszDYjg8xrbHPDBC18hFP865u3VARF1pSUJlyMDXWFlu 7e3228W7vsjZdl9TT1Bh7WhhVk9U/OdXU1zTxcv1T+rS3l1PctPab1Rd7u5wVVllZXZ2W1NV ZW1ea2fcz9jf69jLzM7P09DXeujffl9LWeHdZEhASd/D1Es6Q2frU0Fnv7e/8lhbbV5UXXzX 2N/obVFITuTIwcTPzc3bd1tfX1dYZW1cT0hc1m5ZSmfKyMxwctXr91ls2NnjZ2nn81RGSl9z a1hRY/tuVVb73M/QzsvP1+bcz9fg7d/W/V9aUfFzW2du6ktN083PTTk/atpnWdTDv9tNR0tY UU1Y4c3M2+dpavbp0MjDw8jO82FbV11VWF5qXltaVmhaU2jezNbwX/fZ3WBSZdrN8FlTddrl XVln4OBqXlpnXlFVW/rc2Nfe4PPr4d3Xzc7b19ff/1tWbHFfZ2pZTP7Jz+lDQ1BZWk3bwcTc V1VcXEJCT9O+z+tXaOr67XnVwr6+xs3oWVROT09LT1hoZFhPWWJo29vV2+XV1df+Wmjl5+p+ Z/P46fFfX1ZYaXr4Y1NVXnBdVmDYydZ0XufNzdLf4MzFyWlWYPPSc1FSWV3hyN5TOj5MYOtN YtLJvtB+Sz9DTGnXysrmc/Zpa2dz18W9vsLNfVdPTVBOUl9v/1tcU1RlZ+LsfdvPyc5vXFNf cX7x+mxr7d7fXUxS7s7QeElMYevhdmRb/tXN0ndUVOXNzdh82c7T3F1W3tvO5lJPQ36/3ms5 NlBP6U9RxcbB2ldcSkxNWuHO0tbi6GtVc9/EwMbFycnVaE1LUVhbWV1TblRP5F1bTVTLyMxw Tt3bc1VJct3Zak9h7tfuaXV82Nff+F9jd2/k6vV/a/P54etucXvazdDabWTx62dr6m5rUV7Y cU1mec3XSEE9VHJjzsO/xXtNSVBVXXPcztjZ7mVfVnfkzcLCwMzefFZPTlJVXF1pVlBOSmfo 8XVf2sbH209Le87P3VdZfeDffGp3bmlzZ/hhUE1U9uLyXWHr1dPf4vLZ1t7d4t3e7mnz/eXW /GZUWWvjZVfm6878Q0I7RmftwMbM22BeVE9UXunOzNZuVFRheOPVysG+ydd7XXplZFlWYF1a TlBTZXF232lvfXz4YFxo787O6XJcednV1vB/9fDsZFlcYGliXGj54d9wYl76183P42ZaaN3T 4VpY9dXU5FNMX+bk18vv5k5GS0FYUnnJzMrWa1pLSUxc3srIz9fyZlhUetnIwsbP4fhtYFNO UV//X3RbUlVJUHnax+x/ZmLi7+7669fb3uDl2vdhXX7a43BVXHhuTUBEYtnP4V1ebt/XzszQ 2NjZ29LfatzkX/zs5XpQS0pP69rZ6Ec+Pk19bWpv2si+wPdNRUxu187d5OLg4XNdWPjPxMDI z+xuaHVpUkxMWFlcTkZOVeve3tvv5+vl2Nvl6N/V2vRmXP56Y19d8entbVFTVl5t/fHp7eDf 4PZ4+/3a2trr2tDZ2nhWYNrP1XxRS21z3NtcTz5JYGFjP0X/xbnC/0xLYm7s6Wj47djO2nVO V+PIvsLP4fDl3ltORUxn4N50S0hOa+h5ev/o1dzoel9natvS2uReWm9+6mtrd37sYVNbW19l XvPi1dru9Hvf29vQ0tPcfPPv0N3u6W53YVxcUFhaUFl3/v1cTEhFT2bXxsPM23Ntb27x5vpv 6d3X23pTUmfazc3T19rW721aV2hzY15PSk1UamVeX3zc0tz7Xl/z3trf1djU3PxqaO3r3Ot+ XVlUUVVYWVVWZO/Y2ehydvDa0s/O09rm6n7999za3eNwdVdOTk5l+t3tWEpGUVtWVF7Vx8HP 62JbXm197d7Z2d7sZV1eZuHPzcvX1+vt62dgVllpZ2tZUU9LXmnh3G1rXW/g7N5yeOfq3eZ6 6u/l3uPoentkZWlZXmFubVxYWfPPztPvXmzr1M/T2XVsY3fd2+JseG13d2ZpXVhgX2haVGxo dF1PT1Lt2s7M2eb6++Pa3OFx6/PX1OtlU1Ru49bS2t7o9XH5cWdVTlRi/XRZVlZu3+DwYVlc /uLX1973b/9+8el/3tvX2O5jV1pgZ2dvX15sbux6cnP95dDM09nza2V+49vg7H3v2uj/UUpN Vuze2/9RSE1l4NnnaFldc/fe2tHS2vdcVV5/4tve6PF6aWhwf97Z19Pb2e50eGRwcmpqYWpj V09LUVxu73v7+n758dzb1NLk3+rv9HB9Znl4fOrud2ZaXWZz6/jvcWBjaHvi8vtdcvva0NTZ 7G5kbOja1uXo8er8XVJRUGf5+HBbVFVr7OnzeW1+7tzc53hfY2j59fvd3tnrbnJ+1tDU3PX8 b3t4YV9fZXNodWBdYl/v+HxzcPvm39z29WRjbf31+XVhXnB+duf66eb07Ovf8vp3YGlrde7n 73Jv/fzo7/jz7vjm497g/GpZX2Tx19zsZ1JXZnnr/npydWtpYlxhanPt7/Lu7efr6fZp6+LY 0N7xZF9id+f+7WlyYWBmY2/0393f6fxseHfp6uz4bGd0ZHxibmn8cXd9a/Ry7PPr6u55/29s cWltc+/j3996cWln+vDe2dzgfntcYW3t29xvfWJkZWFfWmRmZWhy+fj/cm7n7evq7dzl8urs 4ufocnF69+fn8H53c276fWpmXl5mdfr8b2pncXX9++zn+en06eP06Ply+nJ7e2xybHlycm5x bWz8bHzu7OH273zr6d/u6vHy4eTk7nddbWDrfvzzX2VmXl1dYXfu7el/8m5oevj96nr54ufi c2dhbObk3ez9bGlpaf5tdujo39/u73X7+vHs9Xh3cnj5ampnaWr1bOtyeXlx+nx49fv06nh8 bml3dnV9cnzvdu3s+drw5ODn6u/k+OJybGliemt6ZFhgXXp+eWhtauvr6OXs5Prrd3bu8eLt 5u5vcGB39fn0eXL+cv11b29reX32fHB2bX74/vz2/vfteP16fHr0cPhz8e7u9W9++3V082x1 cmv6fPF1c3R57+3sdHXs6uTn6/D86nv8dnL4/m5kZmBm/vV+8nNt8Xzm8Ob49+9v+nNo93d1 +XX5+nbq/Pn08+bv8n17/nNzc/hvdvhqcGxndW1pcW53cPLz7vHx+Ofs7ez5/Pj+/O/68v7x eHpvcXPt/vR++2pwZGzx9u3sc3Rpcn396e7z8/7n9/V2bn1s7Hz78mVwZ2NtcfP88fp7+fd8 5Pzv7+/p/el07XdubP1/dPV593BubG56Z31sd3x+8Pt9cPlx8/7p8f7lferu5+Xp6fTq73ty bGdua3F5a2pcaGFjeG5t+XPz+/P+8en14O/u+uXvcvZqb/n87+j562pt+nPpfOvt//dzfm91 +Pr4fG//dXx9e+xx9ftq9mRxbW9yfnt5enx9/fL96/3x9u74/e/t7+33c3lz/G1xZmh2fH3y dvv2/Xx+9uzw8+vv5/zsdXv5e+37+nx3bGtua2tuc29/dnt48n/y8e3t7u7v/O/+/fdw+29u cWx1a3L8b/D3d/Nz9H327evx6+r67/px9HJ/dntydml4bW38afJyb3h1dfr18+r99fF/63Pq c/N8c/Xt+u/u9/Z89H37fHp3f3L8d/pv93l/+nx1/m//bX9vf/x6+Prv/fzxfu968nF9dXV0 b/5x62vueff7/PT07P738/n9evZz+21yem17bnj8ae9uffR69/Z8fu9o5Wvsd/b3dfFt7nB+ 8f7s+Pv6/vz79O/w++5r+ndy93rtdvj9cfRt/HX8fP7tfPf8f3H6Z3BpbGprfXf6fvt373j1 6evw6v3ufO397vl9+Ht8cmxseXR1dnD0cv7+be1s7f1373bye/J6+XP1dnj0bO537fPw7vHp +PPq+uv38/hwem17b3FpfmZsf2H8a259aPRq/vj77+zu+Oz+5vXx7/bu7+vs8v199Wz3Z/hx d319d292bnFuc216dWn8bHv7evR77Xju8X937XXv6Pry8//59fT6/vf2be9ze/Rw+Xh2dnxt a3f8//H2dvRp+HZy72rs9WfoZfvzbuZw7nx7+3ts8HD99Gzpb+t2+O509Hv5/nfwcP75ae97 d+9v83Jw9XN79HHq++739O948PF383n3fvx8c/ludW5vbHZtdW9/dP75/u3w7ur05vPt7Xrz +XX1b/V6dnxofXBx+nv9d3tzbX9ofnJrfml7bHjwd+/v+en/8fTy7Pzs63T4bu4= --bODY.pART.bOUNDARY.2 Content-Type: text/enriched Content-Transfer-Encoding: quoted-printable Listen to this sound the same way you viewed the GIF image: by clicking o= n it or using the popup menu. Including vs. Attaching The above files are actually included as part= of this message. You can also send pointers to files rather than the fi= les themselves by using attachments. This wi= ll greatly reduce the size of your messages, but be aware that the recipi= ent must have access to the original file in order to read it. Here is a= n attachment of the /etc/passwd file on your = machine:= --bODY.pART.bOUNDARY.2 Content-Type: message/external-body; access-type="local-file"; name="/etc/passwd" Content-Type: text/plain Content-ID: <770050009.26123.3@halsoft.com> Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948676130.21002.17@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 --bODY.pART.bOUNDARY.2 Content-Type: text/enriched Content-Transfer-Encoding: quoted-printable Files can also be attached as ftp files o= r mail server files. In other words, the= y don't have to be directly accessible to the recipient, but can be made = available through ftp or a mail server. Here is a file attached through = ftp:= --bODY.pART.bOUNDARY.2 Content-Type: message/external-body; access-type="anon-ftp"; name="README.ftp"; site="199.35.253.5"; directory="halsoft/info"; mode="ascii" Content-Type: text/plain Content-ID: <770050009.26123.4@halsoft.com> Date: Sun, 26 Jan 2014 12:26:34 -0500 Message-Id: <635263359948677500.21002.18@Jeffreys-MacBook-Air.local> MIME-Version: 1.0 --bODY.pART.bOUNDARY.2 Content-Type: text/enriched Content-Transfer-Encoding: quoted-printable If you have ftp (or anonymous ftp) access to the internet from your machi= ne, click on this icon and ishmail will retrieve an informative message a= bout using the HAL ftp site. If you wish to modify the commands used to retrieve attachments, look in = the file: getmextern in the Is= hmail bin directory. Other Types Other types of files can be included or attached, like PostScript, JPEG i= mages and MPEG videos. Look at the Include a= nd Attach functions under the Me= ssage menu in the composition window to see what other typ= es are supported. Once again, thanks for trying Ishmail, an= d don't hesitate to send us your comments or questions.
__ = HA= L = S= oftware = S= ystems __=
= --bODY.pART.bOUNDARY.2-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.45.msg ================================================ Date: Fri, 29 Nov 91 07:13:36 EST MIME-Version: 1.0 From: nsb Subject: A multipart with quoted-printable test Content-type: Multipart/mixed; boundary=horsespit Message-Id: <635263359948682730.21002.19@Jeffreys-MacBook-Air.local> --horsespit Content-type: image/gif Content-Transfer-Encoding: quoted-printable GIF87a@=01=C8=00=D7=00=00=00=00=00=00=00=AA=00=AA=00=00=AA=AA=AA=00=00=AA= =00=AA=AAU=00=AA=AA=AAUUUUU=FFU=FFUU=FF=FF=FFUU=FFU=FF=FF=FFU=FF=FF=FF=00= =00=00=14=14=14 ,,,888EEEQQQaaaqqq=82=82=82=92=92=92=A2=A2=A2=B6=B6=B6=CB= =CB=CB=E3=E3=E3=FF=FF=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=FF=FF=00=BE= =FF=00}=FF=00A=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=BE=FF=00}=FF=00A=FF= =00=00=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=BE=FF=00}=FF=00A=FF}}=FF=9E= }=FF=BE}=FF=DF}=FF=FF}=FF=FF}=DF=FF}=BE=FF}=9E=FF}}=FF=9E}=FF=BE}=FF=DF}=FF= =FF}=DF=FF}=BE=FF}=9E=FF}}=FF}}=FF=9E}=FF=BE}=FF=DF}=FF=FF}=DF=FF}=BE=FF}= =9E=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6= =C7=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6=C7=FF=B6= =B6=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6=C7=FF=00= =00q=1C=00q8=00qU=00qq=00qq=00Uq=008q=00=1Cq=00=00q=1C=00q8=00qU=00qq=00U= q=008q=00=1Cq=00=00q=00=00q=1C=00q8=00qU=00qq=00Uq=008q=00=1Cq88qE8qU8qa8= qq8qq8aq8Uq8Eq88qE8qU8qa8qq8aq8Uq8Eq88q88qE8qU8qa8qq8aq8Uq8EqQQqYQqaQqiQq= qQqqQiqQaqQYqQQqYQqaQqiQqqQiqQaqQYqQQqQQqYQqaQqiQqqQiqQaqQYq=00=00A=10=00= A =00A0=00AA=00AA=000A=00 A=00=10A=00=00A=10=00A =00A0=00AA=000A=00 A=00=10= A=00=00A=00=00A=10=00A =00A0=00AA=000A=00 A=00=10A A( A0 A8 AA AA 8A 0A = (A A( A0 A8 AA 8A 0A (A A A( A0 A8 AA 8A 0A (A,,A0,A4,A<,AA,AA,=05=E1Sf/(=B1=C6=126=A0H=C3=86= ;=F1=A9C=12KH=C1=85=12A=E8=90=03=0FL=A5TDJ/=BC=FB=17=0C?=909=E5Z+=FC=80CN= 3=04=11=DD=BE=9Ai=E6=F0_cr:=14=0F=99=8A=8C=A8[*=EC=D4=E2‾.=B5=FB=9D=AA=AA= =C2=80=E6=87,=D4¥=EB=AD+ ZB=CD=99=AD #=8D=C2=AAF=AC=B1=B0=3D=E4=91=92=D7=DA`=82=14%=8CY=C3 =1E=E1P= =02 /I-=DC =3D=B4 F=CA=13B=0D=E5H-=04w-I)=94tB <=A4@]=0C=06=F30=C4=13FlQ=05=9FY=FB=14=E1UKN=01=16=83=0F-=F4=10C=0C7=0CqC= =0Di=D6=94=93=11E=08a=C3=0D9=FC=F0D=12Z=0CQ=84=C1b=8C=1A=C3=0C+=CC=90=B7O= c=12EC=12=1F=13=A5=02=19^%=06=C3=0C8=C8=DA=82 7|=EC=12=0C=9Br=8AB=11=12=9B|r *=E0=00=03=0E=95=8A=0E=AB=0D=17=A2yb=CD+=D2 Z .=D0=C0=C2=0D=0E=B5=B9B 3=A8=F0s=D07=E6H=F4A=0B=C5=D0PD2/=D9=C2 .=A0=C9=BC= =AA-=BC=B0=03I=8A=B9=80=14 =15=C9pto0=E4=FB=92=11:`=1B=D1=B2=CF=02=C7-I(=D8=B0=14=18)=B1=98=0E=82=90= =848x=81`9=08=82XJ=17=9EA=8D)=05+=E8=C1=0E¥=90=12>-=0Cf=14=D4I=10=D2=85=83= %=FC=00 J=F0=C1=0Et=B0=83=190=E5=07=A5=DA=DCO|B=83=14=A0K=05=14=FA=C9=0C=14=C40=8C= =A9=8A =FB< U=0D=9Cb=AB=16@G)=B6[K[J&2 =A5@,=1F{B=11R4=84=94=CC=80Q=AF P=0BR=C7$&=99=E47$=18=08DF=E0=B3=D5=91=00h=C2=1A=DA=F5x=A4=10=17=94=00x=FD= YL=9BzP=03=D0=D0=E0=06*=A8=D9K¥=10=83f=A9=EF=06R=01=9F=D7L=80=03=FE=A5@ 3= =B8=C2w=F4w4=AF=8D=E4=04,=08JIJ=82<6=F1=E0C9=E8L=E3=CC@=06'=0C=C1 =06=A3=82= =1Bb =03=1Exl-;=C8=CC=0C=80=A0=AE=0Fy=05+7=80=99N8=A9=B8=C0 =A1=07<=E0=C1= =0E=A0=D0=03=13=C6*U=1E=E3=E1=A0¥=08=86=17=C8 =08=83=8AA=85L=A8=83&x=07=83= =95I=C9=DFT =98=1E=BC=003=B5=93=90Oz0(=DB=9D=E5'*=08Q=EDP=90=03=EF=E4=E0'= =3D=C0=81=13¥=A0=02#=B8` l=11=82O=94=B5=02=16d=FCqF2=FA=99=08‾=06=83=11=D8H=8Cc<=16EV=D7=03=FEP=ED= =08.@=91=10=02=AA=02=1E=F4@y,h=CE=0D=0C%=83|=C9Q]=DCb=0B rr=83%=04=E1=06U=D0_qre=BF=A3=99`Q.=08J=0E=D4"=03=1F=C4`U=BB=BB=01=0E=8E0= =05,X=81 #,!S =A4=92=CD=A8=E0=05I=D8I=0D=3D=94=18U=FA=12=07D=00=C2=E2l=B0=84=AC=CC=84=07= b=91A=1B[dS=17H=C1cLJ=89=A0=9C=92J=9BV=C5=A7=AB=FA=10=0C=94=E0=18=01Ie=88= D=EC=D4=104=17M=93=FDE0=99RJ =CE=90=17=14=A8=8A$< gD=DA=B8=83=1F=B1=A0=05=F2=9C=11=18=A9=C7=1A=10=CCs=8C= =181J=0EX =91=88=F0=A6=04f4N=0B=8A=D0=02"=9C=88=99MXB=11=DA=D8=CE=18=B4=C0= 3=DE=01=0E=13f =85=F05=87=075=F0A[M=90=1C=16=FB=88-I=FC=F3=C1A=81=90=D0=B3= 93'=DF=81A=0Ev`=03=1C=E0=A0=07=B0=8Ce=12vP=83=A9<=92=05=1E=C3=8C=B8=E6=93= =18=D8b=D0=94r=E1=13=1E=A1=D3=19)H=86*=C9=E3=9B=AD|=90=99=1B,=C7%=A8=C3J=A9= 0=13=03O‾=06gs=FC[q_=80=84=1B=FC@=08B=80A=16=1C=16D=14=80&be-=E2O=80=00!=A1= =00=A5=7F}$=ADF*2!"`=E4{f]=0B=10`=F8.k"=EA=C5}1-=B7=B4=F5=11=86=BC` =03=9E= Q=81k=E4=D7=03=EB=88=045P=88k=16=9C=ACD=CE=C0=04=1A=19s=CEXP=95"T=14=06=F2= =E2=81=11z=85=A6@=DDU =DEy=C1=10p;=04=B4=ECOJ) =B1=0D=1Ac=E2!=E4=80=C8=98= =06-s=7F=E0=9C=0C%=90*R^Aoe=C0=84=83=1D=C6=B8=C7=3D=E6*=CBU=DB=1EH! Sp=C1= =12Nd<=E5=D1=C0 1x=02=0F=B0=13m=DB=E6=C0=87k=A2=F6=DF=A6R=15&D=C7=07@=C0A=E9`=80=84=180=95= Bq=A6=1A=0D=EA=02g;=9B)-=A7=EE(C=0C=12=E8`=0Dz5z=CD=E7kvS=02=A8=F17=C4'=8A= =1E=AE|`=85"tHspy=C1=F0=88w=D7=98=9D=CBP=1A=8D=F7=84=FB83K=1E=CC=A0f=1E.=F2= =EE=0C =99=C8H& 4=D8=C1gjUY$d=88=07QHW=0C=9C=00=84c=C2=CC=06=C7=DD]=11=C2=A9=03#= =13A=E16k'=0Bt=80=14=A6=FC-%=A02=02O=17=9AdN"a=D5=B1=D4=13=97n=B0=EE$=CB@= =06)=8CaX=F12=AF=C3=98=18=86=E8v=F7]=E2-=EF=85=D0=BB=DE=F7=AE=D1=80=F5=BD= o=1FQ=846=C6=81O=0Bb=00*=19=E4=C0 =3D=90=8A'W=80=03=86=13Ox-=08=83=0B=80=08= =1CE=9A=0D=D2=13=97m=13=1E=E5a4=C1=ECQ=82=B3=81=0F=AA=12=97=1DL=81p=C63=9E= =0B=8C@=95=1B=E8=C0=06=04=8BA=10¥Ed=0C=02np=DD=0C5hi@=84=BB=EBX2=0Bt=BA2=C3= `:=1C=90p=869=B0=83=0F=8A=B0=F9#X=FB=06;PfRT=98=F5N=B9E=C7X=8F=A1=D6=E1=BD= ?=19=14=E7=06G=9B=FC=F7=0C=04Ro=02=DF{=ECd_4=BF?*=CC=1D=00%=05/=F0Bt=A82r= Z=DDu=82=C2+|=9Av=B2=96=17D¥=98=13*=CA=87=FC=B4=04_=86=DF=05@=E8=C1=0F^0=AA= =92j=DA=06IxA=0Dr=D0.=E3=BDd=07G=00=06=91=01=1D=81=E3r=9D=A7*q=F5!z0=03=E4= =F3=12=0B=F7P[=10rC`=04M@=1DI=B6!Z=C5.=1B=94=03K=F06N=90=04"=92.‾=93=12:0= =04=E5=F3I=C2=C7=17=14b=03¥=B0(.&uSg;=DC=B2=02%=E1+=FD&H=18aF=05q`z=15v=AA= =11h=D1'}=B7=E1=02N=00=05=D2=02in=C5'=00h=03X=D0}=C4=E3=02=05=F3=12d=80L=91= a‾=1A=15=14=CE=C4&:=F0=1D=C0=D3Y=85=A7*=DDTd=C9=D3=03cp=03/=D0.}=93s=15vR= A0=03C`=034=00=06=87q=80=07=B88=FCP=81w=0B=D7=02VP0=8F=E1=03A=10I=C45^N'=03= H=80=03C=A0=03Z=F2=04U=90=04hP'>G8=BDu=03=FD=14:=96=92‾1tD^=D1=03=82=02=83= =C3=A7=17!u6L=10R(=A0=03=CCc=02=89=94E=C7r,=D2=13hAco?=08}A=88=3D=0F=D1Q=19= =01=03O`x=C3c<5=A3p-0=169Q=03=00=B5=85/=00=05=F5=91)(=A0<=F8=A2J0=83=87=EA= =93q.=80G7=E0=03=1E=C6p=BA(GQ=81=04=DD=11K=D9=B1=8C=EFGd=D0=E1=1Dxh=8DG=B0= ¥vX=88=A5S¥r=C2=03=81=83=05*=15=04@=00)D =04<=A0=03>@=8C=DB=06¥=FF=C1{0=08= =836=C0]K`r=94=18_Z=87=02K =1EH0=07=82=04=13w=F5=02b $$=10=16=FA=97W=CDG=1A= *=E0|=A7=01=8B=B1h=10Hr=1BG=98=13=FCrtq=C6=03=04N =19L=86=15v=97=93=E5C[0=93=12=0D=18=93=9DW=13=A9=F4=93=E1= =F7=02?=F0=86=E1=D6!=E7h:=08C*=06=A3R=15e.=B2=14=7F&t9?=80=19=9B=B1=8F=FC= =882'iY=B7=12=901=18!+=A0=16* T> =03=E0=88=93ibn.`|=99=81=8A3R=91z=B50=7F= f=91=17=99o=19=89=3D@b4=D22!=ED=B4p=91=C7=02(=E4q=8F=B18L0=7F=18=93 =DB=D1= =86o=F4!=06(‾=E1=87w[=E8=026=01s=0F=C8p}=B3=04<=95qw=18=933y=80=9E=F9=12F= =C1=03=AE=E77=E3=A5=13=D5![=1Ch=877=80=04;p.:=F6t=ED"=03Y=E0b=FA=B8B=FB=A8= =1Dkq&=14t:N=80=03)=F0=03=A13|04%=FC2PT5=D0=80v=D7N=86=A8"xE=10' =1070=02= a=90^=AE(v=18=99=97=B1=C1o=FD=96&9=14‾+=12G!G=155=00+9=10=1D=A2=C201=B0=05= 5P=16B=F4=04=0BU¥'=05=99=A193Q=D1+K@=999yW=9EI=9F=A1=C9=8D=A1) 0=A0=05:aR= 5p=9A=82=C8I=9Da=03=1A=E3%U=96!h=F0j,=B2=19=FA=F8=041=D4=13n=91=03=99=C1F= =E1D*Q=C7=89=EE=E6^g=A5L_1=9F9=A7/=93=A3=3D$=80=02#=A0=02$p=03 =9194=F0N|=05=84=DA=A9=91=DC=C9=145=D3=99/=10=04=F5q+&=94=03=E7bP?=A0=06¥= =F2=03=B9=07=03P=D0=1F=BE=B1=16B4=1F=0B=E3L=00Z=9F=0E=88&O=A0=7F=97iwU=DA= =022C=A5^ =941SdH=80=81=08 =034=90@F=90.L=D6dqwW=FC=D1=93K=14=AAK14=03=80=01=1Ag=06=05A`=05=BFt=9B=BD= =17g1=F0=03J=F0)H=E0=98=97c=03r=B1$=B4=82=03=99=C3=1C=BA=D3=02=10Q<=C0=E3= =A2=D3C=3D6z=A3=DB=89$%=A0=02=A3=C2a0`=12=8B=F3!>=80;m9=03M@BG`=04F=F0=03= a=80=0390=04t!=16=18Z=14=10=E3=157=C0r?=D0*D`=03=82=F3=A5=91=99=A5:=C9=AB= =C0 =A6=AA=E4!=9D=87=8E;a[=B8g=13<=C0=048=B0=03P=11=04=94e+=BAD=A1?@M=97h=1Fo= qf=FD=F2]|=DAnq=F6bM=E4=06Z=A0;;=E1=04;@=03M=D0=8F=91Gr=15F=12=FFQ=04=A1=18= =14=82F=A9xi=A9=97zX=F6=F3=02=D2=82=02=94=06:>!=03=A32=039=D0=04B=D0=04X=90= =04H =87@=B5.1=11=1E=BB=C9L=7FccW=B08zB=9F=FCZ=1A=93=FB=99=B1=C1=BA=B1=DD= =F8*t=98U:A=04QP=05kv.=DF=A1=03=CCFr=99Ai<=C4=1F=CB=C1{N=F1=03L=A5=024@=19= =1C=F2t=B8=03=96=02=E9{g=C2=13O7=1F=9C=D4P¥=C2"=B6=823,P=04=E4=05=B0) 3yU= =A3=F5j=AF=02=B1`?=E2=114=F8QC=D1e|=B2=07=04d=05W =04=92`=18=E7=C1IC=00=A7= *=D0=02=D5:=159=A0=04=85=D9=03=E2=97=B1n=FB=B6r=C4=B1=1B=FB=B1=C5=8A=9A=9F= c:3=90=9ChB<=B42=1D=EDD=03D=AB=AC=B6=B9KN=01=B0+=C2&/A{=CA$=16q=84;=BD=D3= =A7=11rVX=F9t=F1=B3m6=C9=7FD=DB3=ED=A4@P=90=03nx+=B91`=AD=F8=B4P+=B5=B4=01= =12R=E2=1B=E6=03=9F>=F0AF@=04H=A0=05:@=04;=C0=14Sp=94H=E01=AC=13&TA=15=FC= 4=E0=06M=F0K=D3=08=B7=C4=FB=ABr=0B=ACt[=B7=1FR=93=8F9=8D'=C2=04_1=04H=B5=12= =C6s=18=A1d=9BU=90=B3=00"8=EBF=88<=B0=04=B6=F5=15=06=F5-:=BB=B3=D7dD=9A=A1= k =14=039=E0X=99=9B=19J=C0=02=D2=EB=92B`=04=E1=84+=C4#=BA=F86O=A4k=AF=A6{=BA= =1E=95=A68=F1!=D01@=B8=15K;@k;VR;=80=95R=F6=A71=11=1D=AF=19"=AF=E6=AB=C5=FB= =B6=C7=8B=BC=C9=AB=BC=8Ag=80=C2cY=BE=94 T=D1P=87aB4=F0=03=A3=02¥q=8A9=91=B1= 0=9C=F4/K`01=B0=04=E7=A6=95=DE=AA=1F0=88;=08c=A8_A=B9E[=B4=A0A*=E79=1D*=10= =9D=12=D9|_dh=AFQ=02=D1=F7=BF=00<6=13=82=18=D5=1A=1DH=00)=3D=A0=03=07e=03= ;=96=B7=99=DB25=10=04'9=054ax=EDr=C1=FCf=CC=9F=19=EC=A5=1BL=87=E88=9F=BC=D8= =02C=E0=02=B1=1B=19=0B|=1EP=B7=03K`q=C0%=AD=10=14=16=F3=F1=05=CE=AA=03G=80= =04=A9bb=DDj=C3=E7=BB=8Fj=B3c.A+?=FA=C3=B7=A2=03E`=81/=C0=03=BA=C1|=13y`3= =A0=C4E#=11=80=E5=C4S+=03G`qR=F0=14=3DI=045@k=B4V=03B =19OW=04?0<=AB=A3=B9= =A9=C4=021Q=C1w%3g|=C1=FD)=AC=9DW=9Fk=1C=CC=9D=D7=1CG@=13I=90=03R=E0s1=90= =04=02;=13=01=B7=A8=3D=A3c=3Dp=18=B2=95=C0=9EQ+Yi=C3=DA=AC=95=B8=93=04=16=01h=A2Qo$A=04=7FU,=DB=83=8A;"=1B=DCYH10"=86=F7=02= YA=13U=E1¥=CFE=15:=80=05=86=11=9E=B9=D6N.=90=05_=81=99=BB=0C=B7T=FA=8C=FC= =DB(=CC=10=1D=D1=B0=06=8D=B7J=04M=B9m=E2=B6=13U@=88>=903.=B1=03s=A1=13=C7= =94/)t=C8N=BA=CD1dn4=B0=04=C0=17=A7=C8=E3=D2-=DBB=83=02=03=A3b=1B=02Q=02G= =90W?3=02=0D=03X%0=A3^=87=10R;5Or=84=0C=F4=12=AF=85{=1E=F7=CF5[d=98C=B4=81= i=04Yj=C1=0B=8D=BC=80( =12=0D3=F3=99=D5=18d=86=BE=E4=AC*5[=CA=1Cd=FB=C2If= =DD=04b=96=06=0D=07=B20=00=04=16=D7=CA=83=9B=C3=DC=AC=CD-=0B=D3v=3D=ADo=A1= T,=90=039`=02p=F1N=07=E63=C7b=02.=90O=10Q=04{ =CA=B4=01>=15=81-0P=1C=E4=02= =8E3id=B2=B6=05P78N=90=8B=EB=EA}=0BM=BCi=FC=1200=04=8Fa¥=CD=9B=BC=C0=C6=D5= =1F=E2z2a=03B@=04=82,d=17=B8=13A=F6t=19=82=8D=FB=BE=F4=02M=A0a=072 =94=F2= =D2.=DD06¥=BEFt=D7=C4=CDC=EA=BA<=8F=03=04=F2,=10=F5=C1=13=94=A6o=10A=83.=A0= =D8=1C=B9w$=C6?=DD=11=14'=B9e3i=03=3D`=06=BA=DA=15=97=14+j=E8}=9B]=8D=9D=FD= =D9=9Fi>=8B=E3![=ED=027=B9=C6=8A=D1SY=9D=13R=90=12P0=17A=16=DB=CA=F47=9E;= CUAcW=CC=05=17=18=03G=C0=14=C6=A3=02=00=91B=C5@=18-P=1CD=98P=E1B=86 S<=84=18Qb=C4=81=03W=D0=D8=D1"=C5=08=8E#=9C=8C =F1=02=87=8A=157:=9ED=99=92= # =12=3D¥=98@=C1r=05K=9A4]=D4=C4Y=A2=C4 =1B-t=ACp=D1=C2E=91=87Bd=B4`=D1Bi= =0B=186t=B8x:=03=C7=0E)6¥=B0X=91U=EBV=AEYY|=05=1BV=EC=D7=A5e=CD=9EE[=D6=85= =8B=170=8E=FC=D0=F0=11=E3=C5=DA=19k=ED=DE=C5=BB=F6E=0F=B9/=FC=FA=CD=1BX/=0C= =BF0f=EC=D0=01=03F=0C=C5=8Dc<=9E!c=06=93%:v=F0=E8=11% =8E=1B7b=C8P=1C=83=87=0E=1E/b$=81=E1=E3G=0C#)=1A.t=FDZ=B6=8A=89=B5!V=B4H=BB= =C5=0B=12%:=D6=CDZQ=E5p=944=93=E4hQ=C2D =9C4=997g=A9=13=C5 =185n=F8=B4=91= #=86W=B0J](=B9=BE=D4=C5=10=1A=87_=88=9D=D1U=FDX=F6I=CB=BEHk=96F|=EFk=89=DC= =A8=91C=86_=1Fs=EF=FA=17=AC-=1B=14=FB=EB/=C1=F0*=10=06+=1AcP=B1=19=BC=C0A= =88=1CvX"=87=1CtHb=08.=98=F8!=07=1C=8C(B=06=D0b=B8=81=88!vXL=86=AC=1E=92=CD= =A1=16e=B3M =DCp=CB=017=16=82=92=AB7=96=90=C2=8A6=E2‾=04)=BA=CEZ=B8=E1=B9= =16=FBrz=AE9=9D=94;!(=16j0B=88=1A=E6=13K)=1A=9Ct=8F=06=CE=80=A8!=06$Z=F0=01= )=F5=BAj/=AC=A0=C4=13=CA;=B5=CC:3>=BB=FC=CA=A1=08=A9t=E8=01=C0=B5x8=90-=91= t=E8=AB@;=03K=901=C2=1Ad0=86=19h =02=07=1Cr=10=A2=89/=E8=F8"=08 =8D=90=E1=B1=C7^=F8=E1P=1DhP=81=06=16_DH=05P=1B=92=88$=8CjXa=C6=8Az=E0j=AD= =E5X2=01=BE f`a=A3=94p =01H=96b0=A1=85=8B`=D0=C9=84=1BrB!=C9=9A=82]b=06=14= =B6H!=06:=8D=A8a=A9=EEZ=E8)=AC=B2=A2h=A1=07!x=1Cs=BD=B1=BC#=EC=87=1Enp!=07= =17=CCX+=CC=FA=D8l=13=AD7y=B0=C1=86=1A=E2=A5=C1=C0=B6f=F8=F3?=D3:=D3=C1O=03= =01=F5=D7_B=17=D3=C1=C3=0B=83=00"=0B'=9A=10b=07F=E9=FB=84=8C=86=1ES=8Dh=D4= =83h=B3=D8=A1=DAHbA.*V=98x=89=1B=B0=FAj=05=A5jxA=A7!¥=80a=88=87=86c=EE=C7= =9AL=80=01=89=14=ECz5=BA=12=A0=D0 =C9%M0=E1=84=FDfH";=ABx$+#k=BB=BB1=ACn=C9= lOM=17=84=C0a=88=19=06=E4=01=887=DB=1Do=AE=B4=FEs=EB=07 |=C0=01=B4=BFb=A0= =81=B0=03=0B=D3=81=0C=19=86=D8/`=00=E5=96=BB=C1=CFd =1B=07=1D=94=F8=C1=0B= $=8C@=C2=B2=F2*=95=81=08=C3=06z=A8=D6OG]<=E3=83b$=E9=86'=82=D0=01+=A0=8A=A0= =E1=86=1F=90=96=E1=04^=83=A6=01=05=D7=86#=81=85)rM=89&#x*=F9+=1D=96[=B2=04= =17d=80=3Dv=DB=95k=01=08=BF=E2ms=AC=1C=CA=14=EBi=A8=81=17=EF=05=CD=7F=98=97= =B0=18j=80=E1=AE=1F`=C0a=AD=B3=F2j+J-=94=D0=FBa=86=C4b=A0=FA=87|=F5=F2=8B= =87 l=B8=A1=07=C2=E8F=BFn=C7p=E0=A2=08=1Ft=B8A=D1#=C4=E5=E1=B2=1B=E8=AC=94= =87!|=A5M"=C71v=1CB =A7=02=16=88=88=07=F3y=02¥=AA=E3=83=82=84=C7=05(`=C1 = $=88=10=E2=94=00=064YIsZ`=02'=A1=CC=05G=88=DD=CAnP;=DB=AD=00hA;=C1=13=C2=C4= =16i=01=0Fx=C2=E3=8A=0B=AD=05.=1B=00A 5=10=83=0D=F0e=847=ED=E0=07yb=8B=9EH=14=04=1F=F4@ =16=CA=81=0F=F0S =04=FD=05=06oc=82=A0^P=AF=F4U=B10=8D=91=C1=0D=84=E0=03=0F= =91=EF=06>=B0=81=0Fj =87=C8Hf>C=88=01=AB&=92=B1=14=AC=80(=01=14=DD=00 x=03= =91=A5Q2=92=99=C1=BC=92=E0=9F=17(=EB=06 !N=E9.=08=1D=E7(G=068=E8=81UN=80=C2= =E9$e.?=8B=1D p=FC=D0=17=89=9DE=86=EC=81=E1=F0.Y=1F=17=EC=00=076=A0=01=10=C8=B7;=E3=D5=00= =07m=D1=0B=A0n`=033=90/^6=08=C2=0D=86=E0=84=1C=9C=0F}-=B3=C1'=91=80=19*Z=B1= =8AX=C4=01=E6NS=B4x=D5`J=E5=99=01=10.=E3+_I=EC=05;=A8=18=E3R =03=00:."=3D= =A0=88 =80=90=14=EDU=EA33=00=E7=94=8Ci=03C=B1=ACR=AE=19C X=92=BA=12=80=CC=04::V=B1Jp=04=C2@=81<=9DK=C1=14g=B7=03=B9=D4=8E=84@+H=0F= =92=B0L=B3=B80=93=C2=BB=E4=0C=BD=F3!=F2=FD=E0=078=80A=0F‾p=03 P=ED{`=83=DE= *=C7=F9Jq=F5I`N=CC=81=17k`=B6=04=05=CC=96=B7TL=18k=A9=98=1C$=E1=06<=10=82= =0D=B2@=CE"L=B1=06,=C0=8Dm=A4=19=83=FE=05p"-=98=D1 x =A2=C7=88H{6=D8B=11=FB=13=E9=99=F3=015=05.=1B=C1L=8AC=02=13=F8=00.=CC=E9= YoJ=B0=9B=1E=08=85=06=E5Q=81d=822=87=1A=A0(=05'¥d=EC=18=F9=98/H=AF=A0=98<= =E8=D3=98=B6I=EF=DC=C042 =03=11*S=B8U>=81=07}=8A=81=F3=DE=D4=83.t(=074=B0= =01=0F:=D3=19=FD4=A1N=01=BB=81bd=C0=83& =E1=0B:HL=82NZ=A0 XQ=B2=91-=8C=10= =BCW=1D=96=C5@(=96[A=0D=10=17=A3=17=3DD=050=E8=A95K=85=03Z=1D=E1 K=A8=81=0E=08=07=06=1E=94=954=98=F1=81=17=E2=B7=D2=18=14=01=06+=D8=C8N=A0= =B3=B3=F9=E8$=ADKR=01=B9X0=9F"=A4j=05G=01=13kT=F0=82=1C=9C=E0=05J8ax=83=A6= =B6=BB=E0=80).@=C2M=9D=16=D71%=94=3DlzA=13=A2@6=1A=18=D3=BEtj=A9=9D6=DB=16= C}=B1=07K8=FB=82=16^:=D4=93=DA=12=06Y=F8P=0E=80p=04=DD =CA1t=93b=FA=14=03=D1=04=DD=85[=C1=C9i=8Cb=C3=906>=04_=FD=DB0=A86=C6=82=B8= =1C=EAJ=A1=F9=0C¥&$=04"8a=08=1D=9A =10=9Ex?O=81=E4F2=E9=0D=D0:=B9=83=F34!=06KJ=81y=91&&=90=89=85=BB.8=8D=0BL= =18=DE?=1A=8A1z!Q.=F1=14<=F6j=D2=BD=D3R=0B=A6=EC=FB=D5y=BD=F2=08B(=0D=1F=EF= C =EDX=86NE=D8=02=10`=9C=83=19=10=A80}Z=8C=85=16u=03=8C=EC=A0R=05=AB%=DD`= =F0=BC=FD=9ATw=80=B1K=0B=B5=82=1B=E4j=18"=02=94=08=0E=BE b6F=E4=06+=A0=15=1AyP=04=DA=A2=B8=BE=16=12=82=11=94=F0=05%H*=89=DE=A4=01=C5= X=B2=17=17=94=80=06:i=1E=91d=00=96=1B4=01h=F0=F3K=C9=B62=D7=85=A6G=82=FB=8B= =04=DA P=F0D$=D8=F5=05Cxe=13=94=B6=DE*s=87xH{o=0Bd=A0=97=1B=84=A1*=C7T=AC= =1A8=D3=19 =17h=B1=FCL=02=10=16U=84%P=01=0EH=A0=1Cg=B4=C3=A0x=15J=07=BD=8EW=FC=18:=15= 7=9B4.=8D=F1%=A0=ED=12=A6m=06E+:=C8=B0 f`=E8l=AE=C0P =0Eq=8BJU=03!=18=024S=D1=C1=BBc=E0=03# X=07=08=B3=AD=15=84P= =B0#=F03=8B1=C0) ZP=83)=A4@#/=11=C3=0E,=97=14=3DeA=82=95=CA=E3=AC=BB=13-=B3= =0Ch./=C0=B5=04k=90O=BFpa=08Q=D0=03=97=D7=A2^=D4=B2=D7=BD=D1=8A=1A=BBZF=D1= )!=B2=07>(Cg(=DD=97=C6=D0@ ;=C8O=FC=80=00=04&t=E1=0DH=18=02=0F=E2=F4=18=18l=0F=07G=80=A8=A5d0=CE=C5=12= =01=EB=93l=B7=9F$K=03=07=F7=FC=B9=8A¥t=82=0D=88=80=14p=A6j X = =BF)Rq%=02<=E0=AF=89=C8=F2=A6=B0=9D¥^=B7R=A1Y=CC=0F=82=80=035=1F=E1=08A =82= =0E=B8=10=19=C6=1C=11=075h=A7=AF@=C6=96=1C=A0=80U =93=CA=0C=9E=00=85=17=D8= @t=AB=DEJ=10=8A=A0=B5=93=99=CB=055x=13"wp=EB=13=E0=BBe#=BA=9F=A2i=D0=83=1D= h=C9=06=B2=F6y=D4=BE=85=DD!=7F=AD=B4qI=C2=A4=8F=10=85=1FxR=B7=8DQ=D4=0E|`= =C3t=DF`=F5`xB=8BG=B3=83=19X=8A=FBA=E0A=14=EC<=A5=D1=AF=A1 =0C=D6=01g|pxx=0B=EC=89Gh=BB=DB=03=D6=84=A9_^=9C3=F8=01=134=AF=E4 =18=01=A7= =1A=061N1=99=1B=C8=08=BF=93&=D7z=81,=A8=08=81=A0=81=A1=12=82=D0=A0=81,P,-= b=82=1E=E8=01'=E8=01=B8=10=11=9ES=81=16=E0>S=01=02=FD=FC=E0)=92=88=81=1C=08= =82=1F0=82=B2=81-=19=B1=08=AF=A0=81=C4=90=81"H=0C=18=B0=AB@=13=15=14=88=81= [C=01=15@=11K=A9=01p=9A=81=1Cx=82=1F=A0=81=FD=E9=B9L=02=9E=AB=10=0B=17x=82= v=A1=8F7=81=81* =02!=98=822@=82L=CB=81=F8a=8C=18=98=82 `=02=CE=E0=0C=F2=C1= =01$@=02=1F("=1F=D8=81=0C=DC=C0=0Bd=82=1C=90=02Q=E2=02=0F=B1=8C)(=02+=00=82= !P=14=13=8C?=CD=92=AC(h3=06=F1=AC=B6P=14=F2=E9=BD=19=B8=01$X=1E=1E=98.=C8= S=82=D5=BA=8Dlr=AD#(=1C;c3*=008=11=83=88=1E=D8=02=80=BB=BBy)=0C4=A2=81=1F= H=B7=C4=B2=AF=C8=B8<=0C=F3=01=C3!=C1=1C=A0=82=06=AC=91=AC=B8=0C=0D=99=BE=18= =90=02=92=A8=08=AD=F8=A1=1E=C0=9B=AF"=1F=11=A1=82=F3y"=18=10=82=E9@=88=15= =18=02+=B8=1B=13=FC=03=02=A4=E9=AA=E0=AB=92i=99!=F2 =8A =98=1E=041=9F=1D = @ @=02+X=82-=D2=01#=80=BF=CF=D0=B6i{=A59=CB=01=1Ep(.@=02P=CA#=CA=F1=10E=19= =02j#=82"=08=02,=A0=02(X=02(H=BF=1B=A0=9C=F8#=94=12=BC=01#=D8=C3[=DA=01<=EC= =01E=013=1D=12=11=C9=A8=81=81=92=81Ps=C4=87=A0=18=D7=DA=01=92=F8=95=82=98= H=FF=C1=C4=14=08=B5=0D=83=88es3=C2=90=81&=C0=0Fc=FA*=13S=90=A3=B0;:=F3=15= @=01=E3=C1=811H=15Oi=01=D6@C=1A=18=BB=1B=B9E=16 =1A=1D:=94*=B0=AF¥b=02`=B4= =81JI=886=92=82e=E3>=19p=82 =B8 =CD=F3=B7=B8z/#=14 =96[=8A=EA=D0=01mC=13=F18%=BD=90=01# =9F"=F8=81'=D8=02" =82=D1X?=19=F8=02= $=B0=10=F8Y=A5x=F9=A4¥=FCz<=1Cp=02'8=A6"=D8=01=19=F4=90=C5=8A=1F!P=82=05{= =02&x=02=19=84=1F=F6s=10=BB=E1=9E=D5=E3=0BBA)=19=E8=01+X=94=0B=E1=812=9A=81= =89#=02#=08%=BB=9B=11N=C1=8D=97 =A7IR=11=BF;4L=F4=14=87P=81=85=03=02=C68=1B=BF=88%=13=AC=813=C8:=8C=FB =D5R=81=9E=00=99=0D=C2=01Y+=A0i=E2=AE)=B9=1A=8C=B3;=93i=8B=A1:=14 =89=82N=FB=A4,=FCE=E3y=02=DA=B8=C18 +!=BB=81C=81JgD=8A=DDh=9E=1D=08 =B6pJ=F1`=99=F1=F1=1A=B7=F2=0E=1D=88G=C3=C9B=1B=10=82=A33C=1F=A8=9F=C5=8B= =8C=1A8=91=F9)=82'x=A5W=D2"=8D:=A6$8=82=FF=D2=C7i=CBF=F1 =02%(=02"=106=1D= H,=9C=F4G=06=D1=9E'(=03=C3=04=C4=BA=D9=C2=C9b=B1YYH=C9=801=E0T=95=87=FC=E4= =1F=02"=02=11a=C5=E7C=1B=D1=FC;=C0k=1C=14=88=02r:=0F(=88=018=F8=8F0x=81+=80= =BD=8D=EB=01=AC=D8P=15=E8=0D=83=88=89=9D=08,=A4p=01]=DB=1C=AFz4=0C=AB=08=17= =88=8C=80=AC=1F=F5=B3=9B =98=95=1F=F4&=19=D0=AD=FD=88=16=AFh=C1=15@=0C=16= =E0=81=AC=C8=A5=C5H=82=E8=B1E=9D=CA=18eY=88=1B=90=01=19Q6=FFH=93=16=C0=81= =00=0B=DB=BCE=90X=01cA=81+9=81!=08=16=89=FC=B1UY#=B4=BFz=C8=1D=D8=01=B3,= =02=D1B"Sb=8C=1A=08=13=BF=1B=88 =B0=08E,=B6=A4=D8=A2=19=88=8B=A2=14#=1A(=03= =DD=A2=81)8=02=1Bx=81*=90=17c=9A=01sU=A6=E6=01=1B7=EC=81=A0<=D5!=88=13=A8= =CB@p=AA/=1B=88Gx9=D7=8Dz=A5>u=A8=89=8A%A=E5G$h=82 @=82(=08=82)Y=C8'0=14D= =E1=BA=18=B8=82!=18=02=1DX=BD$=E2=93=81=C1X=C7=10=02=CA[=D4=A2*=AA=C9=84V= =D4=D2=0FC%N=1AH=82=EE=83=1Ej=15=D1=D1=CC=18=19=10=A0=838=02=01B=0C=D3=F8= A=A5 =B6A=D37=8Ex=A7=0CZ=01=1D`=0E=1B=DD*=1D 2=AFP=B2=FEI=CD=18=C8=0E)=10= =82%=C0=02p=E3=A21<=98=E2=01&=10=02/h=02=A5=95=D7#=E8P=C2Q=11=90=A1Z=15=F8= =01=CD=BC=C5=A7=E1=02=B0(=B2=A4=00=0B=F8`=8A;=E0=8B=1D8=82/=B4W0=92=97t=93= =D7=97=A3=13%*=A6=BD=3D=02%=00%=BA=AD/=BD=85_=F8=D5=D3=FA=EC=8C=B6-=C9=1A= =10=17=C4=08A!x=82&8=14=11YVE=C1=0F]=84¥=C4=8B=DC=7F=9C=DC =A5=CC)=DB8=EE{=0C.:=02(=FCp=E0s=0BM=D6=1A]=DA=C3=E0=14X=A4=E6=19=88=13@,= =A1H=81=19=E8=AA=16=98=81X=F1=01=95=D0=91=0C=8A=8E=17=D8=9Bji=01#=80=81=CE= C=01=87=81=81"=B8=81$R=3D0=D3=DF=F5{=8C=CB=A0=AD=DF=9BZU=11=E2k=15=8B=D2=88= =9E=1BX_&(=8F=AF=D2=1C=0BY=A5(PM=C6=C0=C3U=BA=DF=BC]=A5w=AD[=B3=8D=DF-=E6= =D7=F9],=1C=E0S=1B=E8=01(=F0=01.p=18=D2=D0=81=89{=02;=E0=C5=C5=BA=90=B4¥=D4= =03=C6=D8E-"p2=AA=1E0D=1A=A0=83=A00=8D-=DC=01 =D0=A8=87=C4=DE$=82=02=11=1D= ]=D3=C5`=B4=02=9A=1C=D41=1A=08=1A=17=C8=A5C=D1 =16=D0=01=95=90=81=94=D0=89= =93=99 =16 =02=BB=D0=01 J=01=E5=C9=8E44Td5¥=A2z=8CO=E2=01=1FP=01=1E=10=E2W=FET=A9= =04=8B=11=DE=8D=84=9D=17{=9D/=E0=FC=12=82=CE=C0=02-=90,<=9C:=FC=0CJcR=D2,= =E62.=96=DF=F9Uf=FAU=0Dw¥=94<=B4=8C4=F4=01=F9=CAC=92=DC=01I=81=A8=81A=91=03= =EEX=19=F8=01=D2=D8=81=A21Wcj=82=B6P=D0Tc=81G=CB0U=85#=0C=C6=B5=13 =96=12P=01=13=E8=81=E5=B8=8A=15=18=A4=DEx=81=D4Aa=12=18UN=16=9DS=CA=A7¥=13= =02=B6=88G=1B=98=A83=F0=81=CA=A8=01=F0=13=910=E8 =CD=83=E5=89=B6Hg=EC=8Er= =81=BA=1A=D0E'x=16( =82=1F8=02=0BY=D2 1A=1F=18=D7-3=E6=94‾=DF=F8M=DF=A0¥=E6= =97=BE=81+P=B0=82Q=14h=DE=81=88e=82#=A8(O=C2=81o=96=92=04U=8CF=95=DCE=95=8C= 5=00=82=ED=03.=CE@#=94U=0C=AB=EA=91=054=B4C=16 =DA=03=9A=DB=91g=96=00=96=E4= @=9D=9D=05=92=958=81=B0=9A=01=9D=FC=08=82=87(=01!P=0E=13H=01'`=0B(=B0e=F2= =F0=CD2b=C8$=10=D2=DC=A0=E8=E9=BD=D2=B0=88a-=99=97Ir=8A=A5=A5=03p=EB=10%=C8= T=19d=CF"=C8=02=93T=E9=94v=E9=97VfQb=EC=EA=BB=E1=9A=8E>&=F8=E8 H=02-=90=02= )8=91=1Cp=82n*`B=99T=04=AE=D0=1E=C0=AC=0Bi=82!(=02=9D=06=BB!=90=82 =80=8C= =03z=EA=95=D5H=8B=F1=C8=19&F=D1=81=E7=ACR=92}=D6=D9=11=10=01=11=D0=95=12=C0= =01=DD=0E =B5R=01j=DC=0D#=00?=B3=05=C2=C8=98=81"=E8-=CB!4=E9=ADk"=9E=CD=FA= =D7=B6=C0,=CB=AE=82nL=02=CCj0=C9X=82?=1E`=F7M=ECc=B6bK=1D=9F=C7=8E=1F=BE= T=E6=CE=D06j=AB=E9 A=18-=10=D7! =ED=96=FA=01o=02ja=EC=EF=C5=10;m=81O=0Ba=82= =90=82{=CC=DC=1C=FB=00=88=1DOb=C8=88Ap=06=10=16*=16=A6h=E8=F0=E1C=14=12'= R=AC=98=02=C7=C4=14Bf=C0@=91=E2=85=0C=140T=98(Q=82=04=CA=94#V=92X=E9R=04L= =972Y=DA8I=02F=CA=9C&K=98=A0=E1=A2=05=D0=19In=D8=082=83=C6=0C":b=0C)=92=83= =8A=8B=15,VP=AD=B1b!=D6=ACZUP=ED=EA=F5=EBW=16b=C7=B2h=F1=D3=85=0B=1AHr=F8= 8Rd=88=93 :v=CC=90a=F7=0B=8D=1A;j=D0=E8=EB=F7/=E0=1A=82=07=13=AEa=E3=87=12= (D=89=DA`l=E3=F1=0D=1CAp=DC=A8=EC=B8=B1=E5=CC=91s=00=89=C2=E4=07=10$h=80=F0= =F8Q=C4G=8D=1FB =C2h=ED=BAu=8C=A51^=D36=18=E3(=0E!HvHn"D=8A=13&Cx=E8=08B$HA=BB3=8A(d=08=F1= y=C3=8A=D2)=AA=80=F1P=85=0D%;z|q=01=FB=D2=85=89=F0&U=CE=94 3fy=13-e=E6Li=D2= =C4 =144=C4=B6=88a=C3=05=16=18:=A0=E4=D5=F1=02=C7=112=1C=D5=C2X=3DL=B5=15= =82=0B=81=B5 Xd=8D=05=94Y/=00=D1=D8=12>,=D1=83=19;=E8=80=84=0Eu x=94=0D=80= =89=98W=0D=A8=15v=A2=0DBtA=C5=10@0f=C4c1V=E6C=0EQhv=A3f8pf=DA=0E?=F4`=C4=12= E=D0`=84]=B6=19D=1B=0C=06=E1=00=C5=91H&i=D0=0C8=00=01=84=0E9=E0=90=9BjE=1C= A=C5=0E;lT=90A9HQ=03=0E:¥=A5=02t=D0M']CR=A5pU=10=A8=B5=F6=82=0BD=0D=89=82= Y6=ADW=DEy}=96=F7'K:=B5=90C=0E=DA=D1g=03P.=D8=E0=D4=0D?=045=C3=0CL=C9=F0D= _S=9D=99=A0V=0Cj*=95=83=F4=01=F5=02=0F=A8=FD=80=04=12<=F0=B0=03=0F=3D=F0=FB= =05)=AB=90=8E=F8=D7=89=83=D9=80=A2=0D>=F8=00=04=13=95=E9xYe9 qe=0E7R&l=99= =94=05=DBD=89H=D9=05=A6=91=CD=DA0=84=0F=B29=F9=A4=0CJ=D8&E=10=BA =E1=A3=A9<=D8p=AA]=FE=D9@=04=0E1x=DB=C2=0E[=B9=90f kz=E4=90 >$)=04=0EI=BEp/Z=9F=1E=E1=C2 '=D9=C4g=9F=E7=01=FA=A7N%=9C=90=C4 6LA`Yb=B9=80C=94=0C=97=05=04=0E-=D00=ABU4P=85i=A6`=B5=B0i=A7=9E=BE=D0=02=0C= =3D`|=D8=11>=E0 E=88=AD=BA|=94=88=82=3DV=C3=0D2=CB=8C=F1=CD=8D=F9@=05=11-= F=91m=8EB=DC=BA=05=8E7=E8P=F4=95=95=CD=BC=EAQ=CB=E6=D0lAu=D9=A0=03=B3=D3=1A= D=03l2=0Ca=04Q8=D4:=E1=0F=CA H=C3=11-=D4=D5=97=0C=A8=B5=80=83B=ECBd=11D*=D4=9C=FB=DD=0F=B3=C5p=83O?=91= =FC=83=0C,=F0=84BI9=AD=14=B0=9F=03=CF=D4=9EI'@(=D6=0F=0F=FA=F0=82=83=F3I=F5= =F1W=1Cg=C5 =0Bl[JU=C8=13=F3=F0B=0CV=CE=10=B6`R=F8pC=13<(=11=06_H=BD=0Cs_= =B2=FA=D0=C3=85=95=FD=00=99=101=CA=A8D=CA=3D=F8=F0C=10=C1f=F6=AB=10_=08a%= =0EJ=E4he=D1=991a=04=1C=3D8=C1j=0F=CC=DA=16=AE=0E54ku=0E=AE=C5=00D=92=13=12= =D6=EA=B8@X=B5BB+=C8=90=95=DBn=A3=197W@ =05e=0E60=01=D4=83$=CF=E0B=0D=EA=CD= D=B8=C0=0C=E7=92=F6=90=80'=AD=C9=97=83Z =04!=88=A5+=94=93J=E5,=A7 M=B1=80= Fd=91X=02=B9 =BF[=11=C1/58=02_ =D3=97=D7=C1=0EV=82=01^=A8‾p=03!=E8=C0=07=BA=93Q=9C|`=85=1F=FC=80 =C3=FC=A2= =0C=0Ev=00=04,=F8@.T=18=96ep=10=05=1D$=EDF=C1*=CD=11=BA4=17 =E4=A0.=06)=92= =0C=A6=A0=83=B7=10=A1=07F=9A=16=92=A2=F0=02(t=AF=087=98=81^z@=03=A2=08!*W= =91 =FB=DA=A7=C6=E7p=A5=06< =88=0Cn =A4=D91=AC=055SB=0DX=E0?=80=11N=80=03D=89= =DFJ@=03=03=C2=00=8C^=A1=0F=E46=D5=15 N=10d1=A8A=0B =97=C7=90=01=85=06=C7= sB=0F‾=D0=BA=D6=89=88=84%4a=0D=8C =04?=8C=C1V=AA=B9=81=12 =A3=AB!=04a NHB= =10‾=90=03=DEL=A6LD=F8=DD=0F=8E@D ^) C=B8=12=10=83=B8=851=00A=08C=98=0B=11=92=C0=03=0F=C9=80l=90=EA=01eh`=BD=D9= `qN=F7=A2=13=9D=EES=03=B4=DC=C0=05e=A1=01=10.=95=C65=92=B3! =FA=C1=12=945:D]P=9A=FB/=A8=C1=BFX=F2=92>=FAQ'4CA|<=C2=95=B0=B0=00=06/P=A4= 89=06PN=F5=05 =F8+=8B=C4 =E4=9D=18q=F2U=9E|U=EC=04=03-=1F=A4=CAVJ=18V=9C=8A=F3=83+@=A1 K=08=C2=10r=F0=03=1Dt=92X=047=E6=1C=A7=B6o=05}AM=0C= =AA=17=03o=C2=01=06=0E[P=0B=90=E0=82=9D,=17%#hIY=0F=D7=93=18=AC =05=F6i=81= =0C=08=04*,=04=A1=06=CE-=0B=E6=C0=12W=B9‾=85=A9n=A5O=0Ex=00=04:=3D=AC=06#= =D3[_q=F0=03=13 &=B0=82=FD$=89@i=18=1C=14=A1=86g=80=A5=14r=F3=04=1A=B6=E5= =07=888=82=13LE=04%=00=81=86S`=C2=11=B0P=04=B9=B8=D6J98=0E=14=E4=F2=D2=11= =BF=D4=B5=1Aj=A1=10z=10=84=04_iU=D3l=92=93=A0=D0=1A)=E6=C0=8B=DD=1CY[=03=8A= =15=E2=D2=E0=A9¥=01=EF =B8=BB=83=BA=86mAb=99=0F=BF=14G=A0=12=8C=E5=04=01=13`J=AE=CA=82G=FET.W=E0= =01=B9=9A=D9@E=FB=AE=17+=9A=AA=D3=05=81b=83#=80=01=065=EB=C1=10=D0=D2=85=B3= =F45F*L=82=7FI=08=D1=AB=12=C6D=8D=D1=01=10=9E`=85=93F=AB=08Lx=82=ADl=15=D9= =C4=1Ea J=A0!=0D=95=80=04+`=E1T=A7=FA=01=114=94=D9=1Fh=E8J=14#10[=AB=83#=B8= A=08L(=C2=166K=A8& =85=06=CD=B2=8D=93=08R=83=19=98=9415=08^=0B=8E=D0=C0=E6= =88=B8Pm_VZ=A0=A0 =E4x=05-=E8=01=1C=B6=D0W=7F=A2=80+3=C8AWHP8(=A3=E4=06%= =80A=1Eg=C0=02=19=04!D=3D=F8=C9=96=E1=DA=E5}b=EE^=07=85=C2=10=F2=82=14=BE= L=E1b.=EA=ABwlz=83[=FAN=08#=943`H=9D=17=A3=DD=16c7=B0a=9C0¥=04"=18=A1KE(=82= =16=800=BB@=F7=A0=E0=816e=85=07=DE=D3 p=81 Q=D8=EF=940I=FB%L=8F8=07=C7=EC= =E1=10=96@=06=D0Fz=96=CB|1=AA_c=9B!h!x*"=C3`=BE=F8=CFE=D6=BA=9Cm#'=82vp=A9= =B0|=11 *=8B=0D=9A=ECX=82=EB=06=D0=8F=D7=B5I =BA=AB=82=13x=07=066=90=02Y6=B5m=F6=FA= =9A,.h=02=0Cp=F0=93=9A=BD=FB=AF=82=E9=9E?_=00=031=E4=B0 ;=18=0E=0F¥=F7:=13= zM070=82=C9@h=98=1FD=D8wK=08MbQU=05=DF=15=BC=EEv?8=DEsy=84)=ADt ]P=C2=8A=89= #Z=1DU=DCW@=A0p=10=90=D0=04=DFhH=08;$=0E=A4=84z=EA=C97=B3J<(p=08=87=93m=1D= =0F=B7};=E8=B1S=B52=03=04q=CE=05A=A0=81=0E=94=E0=83=19|=AC=05=F1D=8F=CF=03= =C5=93=9D=80=CA,@=E1=81=0B=9C=D0k=AF,=DD=C8=AC=DFA=0BV%=98#=BC =07=AE#=91= =C9=FB=9A=F0=18)=C0 =07Z=8F=81=13p=9AX=B1=8F=DD=92^=F8=96c=A1)=B4=9DI=C1d= 6=B0=D2‾=E9Nr=1F=B0=D4Tv?=BF=EF=F0‾=F0=D2N =08AH=82=12=A4 =9C#=84T=B4=AC=AD= xH=F1=FC=03#@=81 X=E8R=D8=AD=9A4=81=DC=E4AI=8A=E9=00=0F=94=1B=AB=D0L=0B =8A= =13=0C=01H=E8=D8S=CD@w=D9=9A=E5pN=D3=C8=C0=84=DC@Y=E4=80 =C4=DE=C0=9C=95 = =88=04=06%=1D=A7=F0=DE=B6=1D=12=13=94=C5=AA=D9@=0C=D0=05=0D=84 e=C0=D1Q=E4=12=DD=11Ae=B8E=D6 `=B4=00=C1CQ=D4=EC@=D3n¥=81=10¥Y=DD=8DJe=08= ¥=10=DA]=B7=A4=CA=DD=A9=1F=A2=EDW=A0E=A1=FBM=81=11=FC[=A8=B4=96=16j=07=A1= =8CX=12=94 =10=F4=08E=A1 H=9D=0D=01R=1E=0D=EC@=0E|=C1=0C=F4@=87=B8=CA=BC=11=C4=10H=1B=E7=FCu=1E=FC= =04=DF=AD=95=93=04=AD=C0=F9=F4=C0=0Dt=95=148=1B=17=90=C0=15=EC =A0=18=E2=E1= =14=0C|=BCI >=C8=CA=B1¥=97Q=C5=C7=B0@=88H=81=0Ch=C1=10=0CA=F5,G=16=D8=94=87= =D0=80=0FlG=0FL=01=0D=D9P=13=19=01=94P=81=80=10=C1=0C=1C=C1=EB=84=DD_=CC =B4=A0Pi=18=C1=11=98=86=A5=99=C1=15=14¥=136a=DD=F9=80=14 =81=12=1E=DC=A8=DC= b=14R!=83=99=8A=86=A8=A1=A6QI=17=92=98e<=86=15=08=C6Q=F0=C0=B2=14 6*=C7=87= =90=0F=0F0=C1=F4=E4=91pq=0C=BC=A8=80BL=D9U=10=979=ED=E19=E2SI=C4=93=1F=9D= =84Y=B9=07O=F4=95=0E=E4=85=C44=0Ex5NW=D8@=1Db=8AW=CC=CA=12=A4M=0DT=C9=17=99= =97=1C=85]@=DA=05E-=01=114=C1=11=08A=10=F0F=0DX=CF=87,=CB=7F=1D=D7=BC=A1Y= =0F=14A=13=FC@=01=140=D1=87=0D=C1=134Z/:=E1=DD=B1=DD=10=FC@=15L!=15=14=D8= 1=BEd=10=18=C1=10=94=C1=15p=C1k=11=07=11pHka=DA=12=DC=00=120=CD=00^#=E5a#= =1C-=8Br=F0@f=D9@=13tS8.D=0D=A8=8BVh=01Q=D8!=CC=AD=D7 =C8=0B=0C=04=0E"=86=E0 =90=07=01=95=80=0B=A8=80=0C =DBm=1D=D5=0B=FC!H=CC=87X=9CO?=92=9ET=B0Z=0CT= $=95=85=90=B8=C0=E7=BD[A=9C=D6=FB=85=C1=18=9CT=95l=8D5=16=A5Q*=C7C=F5=C5 =F1@=1E=D4=88=14=94=01=13=08=C12=96FI=A2=9F=C1=F9=80=128=A4=11 Zh4=01=10,= =01=A2 c=85!Zg=0D=8119A=18 =01=11l=01=12=10=81m=0D=9E=1A.=C1=0C=FD=A4=0D@=CC`=16=E0=1Ff=E3` H=16=C8=80?e[V=D0=1AW,=04=13dE=CD=C8=C0=99=FC=A0cT=E9=1A#=F9=80=3Db=84W=B2= =C7=E1DE=01=11=90<=8E=E0 =E4=C0Q=A1=05=0C=84=9DP=DD@=13=11=08$^=E0[J=DBTL= "=E7=C8Z]=B9@=E8=D0=80,% =0E=A0=C1=11@A=11,=10A=F2=00=0E=DC=E6`^dD=D9@=85= =15=01h%=01=14t =00v=8B=EF=80F=A09=C1=C1A=01=11x=C1=DE=B5=9F=A2%=C1=94=80= =C6=188=E8gN D=AE=941=19=C1=83V=89=16=96=D8=02%=C6=E5=AD=DA` =A5=914=13Q =E6`=1AA=0Dd=01=B6}=05r*=88=8B=AA@^=80=CE=A5=A0=E3V=AC@"}=E7 4=8EX=E8=80=10=98=80=D4=1D=0E=0D=EC =B4=00 =AC=C0=0C=B4=87z=14=0CO=9C@=D9=9C=05b0M=A3=B4a=91=B4=E5=E5T =E7t=05=05=9E=A0T=D8=C0=AF=E4=85=0C=D8UQ=F8=CE=138=C1=89=89=91=870=D3}=16= =A6=07=DD=80=13=FC8=01=18=18A=13=94=CA=A9=00h/fRN=1EA=15=D8=DC=0Fd=01=13@= =01=17=00=1E=A8!=81=16h=01=E0MI=130=C1=14=B4=9F=A2=BA=9F=10,=C1=14hA=12=98= =A6=1B=EA=80=15h=A1=A6M=01=1B=CC=E9c=91=1A=9A=DEf}=12=A5Q=D2=05=A4|=08=0D= P=8A=A5P=A0=0B8=CA=99$=CCU=B0@=A4L$=DE<=E5=8E=85=1E=E9%=C1=E6=1D=92=1C=3D= %X=FDQ=10$iN=C4=80=0F=F4=8B=11=A4=84V=16=D0N=98=C0=0B=0C=81=0D=D0Wc=00=0F= R=C8=D7$QE=15P)W=F0=C0=03=01T=E6=D0@=84=FC=04=11=94H=14(c=E3)g=AB=D8=E76V= _=0C=EAg=11=18=81I=F6=80j=02(=AA=F8=A2=98=06#=15=FC=80=14X=81=11T=81=13=10= =81=16D=C1=11 =C1=98=0E=01=11P=81i=1EA=12=B4=C8=A2=16=13=12$=01=194AO=F5=94= =86Z=AAk-=81=12=ED=80=12=FC¥fP^=81E =88=0E=F4=D4=19=DEg=11=1C=C5`y=D3Z=D6=95=1BJ=A2=AB:=CCQD=01R4=95=1E&=88T=F4= =CD=C7@=C1W=B8=C0=15,=17x=EDI =B8=C0=11=A0@t=FA=0B=05=8AE=E0=18L;=EE=04O=F8=C4G=A0=C5=BD=D0=80&.=8B=0DX= =8A=97Q=E9=CA=B9,X(A=1D=D1G=B5=91 =0EX=C1p=00=01=DA9=E6=E7u=AAE=0EVC=A9l_= <=CB=130=81=F9u=8B=BB=BE=AB=80=0E=A8=14=84=01=E0%=C1=13=18=81=11 A=BA=D2=AD= =11=8C=81=11$A0&=C1=16=FC]fMI=A1=BA=1F=10=0CA=14=18=C1=13=F0=C0e=3D,=C4=E2= =D4k=3D=AE&=B1=CA=1C =C8=D8=10=81=0DxH=01=DEf=1B=EE=C5T=F5=C5=E7=B0=00=DE=94J=F7=94=0B=0Bpn=0D= t=81A=BC=C0=1B=80=8EV=B4=AC=CB=B2@=0D8=DF=96I=0EU=E0@=BF=B4=C7>=A1=8B=BF=F4= =CB=D3=FC=E8=00x=BC=C7=0B=A0=00=D1=1E=EB=08=A2=00=12d=DD=93=10=04=DE=1C=C8= zY=85:R=C5#>=08=0CX=C8=C5¥=8C=AA=F0E=D8]=EE=A8j=AE=CB=C4 =0E=10=96=CC=F0"= =B8=BAk=13.=E1=C3!=01=134A=C1=FE=1B=FB=FE=1B=DE=D2=ED=11=F4=AB=18P=01C=06= =81=FD=06=81J)*=0D=C5=DD=E3j=A1=16@=ECk=B9k:=E5=C5=F7=82H=EC=1E=01=DA=10`= =D8=CE=00*-=01=0E=F0@=12`L=19=D9=C7=00B=CA=10=AC=8D=80=14=81=15=10=81=0C=F4= =00=E7U=E5=E5¥=0E=0B=BC=00=A4=9C=17=EC2=CCO=00=C1 =A4=00J=A8=87 =D8=91Y=10=01O=B0=CD;-E|=04o=C5=B4c=BF=BC=07|=E4=91?A=CD=17=82c¥=8D=1E#Q=10= }=A8=CA_¥=95=AB=8C+=F7=82=EC`%=D6=DA=0D=06=83=CD=CE=9C=D2=A9=F9=15=DC-=DA= J=14=CC-=FF=11=01=11=B0=EF=FB=F6k=FC=8Eq=FC=FC6=81k A=11¥=81=14@d=FBqA=12=E4=E4=E5=3D=EE=E3=AE=A6=16=060i$=D6c=CCi=1EP=C9=B7=E6= =80QR=1Ea =01=1E=9D=CA¥=98=CA=ED=E0=80=D6=A9=A2=0C|=8B=11=D0=88=A9=C9=C0Or=04q=B6=1C= =AE=D5h=8E=F5=D3=13=00A=F0=99M=0C<=08G=8C=07>=A1=80=0C=EC=C5=0B=A4=00=D1=11= =08=C9=E8=DA=FED=D7=0E=C4=C0 =C0=07x=84Gx=9C@>=BD=D6lPM=0D=F0=C1=0Cl=81or= =0C=0FD=A2=91=D1G=9D=18=05=CCh/=137q =D5=00c=A6=18R.=06=F0=04,=99=92=EF=15= N=D8=14|=F1=16=E4=92=13=EC=9B=17=7F=F1=BFM=D6=11=D8=E2=12$=01=12=1CA=17=8C= s=BFV=81=12P=C1=15D=EA=FD=DAo=CF=00=AC=17=BC=C1¥=BCV|=BEV=1D=EB@=0F=EC=C0= =14¥=E8=0F=E8=C8=14=ED3=AAlo=91=9CZ=B8=E0@=F4=B1A=A5=EA=80=16=F4=80=10=FC= lA[=C8=A6m=90=89=12=10=E1j=C8=00s`=A9=04V2V4=C7 =18=1F=E7¥=89f‾A=BD =01$=E5=00=81=98W;=9A=80=15x=8B=11,EC=10=84X=B0=CD=E4= =D4=15=0BP=81=BD=BC=C0+=C7=80,=D3r =85 =B0=1A=1Aq=15=10=14q =D2=15=E8=12E=13=B9=0C=16=B0 =B9=96k5 F=AAtI=DD=F5$wV=B3=16l=07=80j"=15=D4=E2=100A=18=A8A=104=81=13l07=A7=AB=96= =A4=01=14 =C1=14L=01=18=90=CA=14=90 ¥'=C6=14(A=85=B6=F3=02=19S=10=F0@=A6=FE=C6=89=D51=F9uA=E21=01=1E =01=17=B2= =C5=E5EA=A7=022=10(=87=86|X'N=81=13 Af=D5'=98=C8=00=BD=04=81=EFP=1B=1D=F6= =A3=8Fy=D9$=9A=9A=81=B8j_8A=DA=80=AC=C9,A=BE=A8=CC,=FF=C4#=ED=00=0C4=C1=9B= =185}=18=C1=0B=FB=D0=C0=D0=9D=00=13=D0=B2ngD=05M=819=B9=EAo=C2=CF=D2=3D-=E7= |S=F6=C8@=0D=C4=E7=A9P=9F@=DB=E7`i=D2=A9=A0]!=9B&=86=92A=F0=DC=E4=DAZ1=0D= e=D8=12=08=07=C0zq=11`A=12T=C1=11X=01=14PA=16<=C1=184=81=14D=C1=19,A=C2=8A= =F38=BF=C5=02=19=C7=FD.=10=9C=DE=A2=10=C0=ED=A42=EE=E3=16=01=10¥A=14D=81=C0= =BE=96=12=D4=A3=EBL=01@=C8=10(#FA=83=05w=10=14=C8CI=0E=1D@=844 =E3D=88=90= =1CMf=10=8C=01=E3=85=8E*3j=D8=E8!c=85 =93'M=AEH=B1=92eK=96'Y=ACX1=83=C6=19=198p=D4pq=A3=C8@=194=80=02=E5=91=03=87= =8B=19(=90=98H=F1=82E=0B=187p=A0=94=C9=82*U=1C-=B0f=CD=F1b=05=0C=18'R=9C=10= =8B=02E =1C)T=B0=F4a=D2e=FBK=94o=E1=C2=959w=05=D5=17.h=F0=E8=D1=03 =D0=19=7F=01=FB= =14,=E3/=93);=9C8=D1=F1d=C8=0E=1DC=AE=F0=81r$=08=0F=1D=0Eud=D6=B1=833g=1E= =9F}=14ILeHi"=A7=8D0=F1=A3=C4J=13=D7=89=9D<=81=E2=C4=8A=923J=92 I=B2d=CB=10= /C=AC=08 =12D=C8=14%Q=BE$=112=87=B3=E6=1C=CF=A1=E7P2=86 =12=D1=3D=1C=F3=B8Q#=E3=E0=83=075=C6=A82d =8E=1CQ=80=141B=04=8C=E3 =03i=E8= =E8=D1=E2n=0B=165d=FC=88=CB=B6m[=15%g=EAa=86=1F=82=88!=87)=8A(h =1Bh*c=BB= =EDj=D8=08=AF=B1R=A8K&=1AJJ=A9=AE#=B2r!=08=17Z=E8=C1=85=11a=18=8E,=1AP=18= =8B=AC=B2=DC=EA=CF=A5=FD`<=89=AE=B9=A8=CAJ=86=1Ap=F4k=06=1D=FE=1Al=A0=BFj= =08=03=08=1El=FB8=02=87=1Fx=D8=01=88*=84p=C2=8C(=84=E8A=B3);=F3=8C=07=1F=96= =98=E2=B4=D2=868=ED=88"=9Eh=C2 *=98h=02=8B=C4=B2x=02=0D(=D8=CC=E2=0B=DC=92= HB 1=95 M=B8=E1=82`=E2=88'=A8=10=02 =1F=A6=8C=EE9=9Ct=98=C2=87=1E=AEh=0E=8A=1C=82=E8=CE=A7=EF -=08=88%=82=C8=E1= =06=F9|=F8=C3=07=CEn=D8=81 =81h=AA!=A6=19W=A0a?=17_4i=060th=A1T=1E^=C0LA=C2p=B8!I=1F‾8b=87=1B`=D8=08= =87=15G=CDP=C3=BAZ=08=E9=85=1B=82=E0=C8=86=BBFt=81=A4=18dXQZ=16_@=D5=BF=18= =E3=92i=0BR=ABj=C1=A8=1A=82 )0=1F +=02=07=A0=B83=02=A8&xxb =1F=D6+-=3D*=A6=DC=8C=B3!>=DB=EB=CB"=B8$=E2= =08&=ACp=E2=88+=98(316=B6=F8=A2=0C1=C4=88=FB=02=8A(=A8Pb =DC=B2=80=A2=0D%= =88=A8=08=CF ‾=F8=C1=87C=B1+=C2=B1=CB=A0=BBl=87ZE=1A=A2=87#z=A0=E1=87=1C=8E= =A0=C1=D1=81"5=C8+=19`=90=01=8A=1Bn=00b=07(=88=C0=C1=0B=99A=FD=8B=08 =82=C5= =D6Z=B7=FE=BBA=08=19=EB=CAO=A3=FCj=B0l=07#&=0B=CD=E9=8Dd=E0a%=AC=84=FD=8F= *=1BZ=10.>=A0=80Pb=06$nx=C1m=18x=D0B=86=14=C8=A2{=C5=A5=FB=C3=F6=AD=19]=A5= =B1=A9bk=88=C2=06=1C{=F0!=08=1An =DA=C7!d=06=0C=B0=C4=D1-=BC=87!=89x=97=CA= =CEx=B8=A2=08$pM=A2 .=BB,B=8A.=C0X=A2=E0&=C8=18=A3 +=AEh=1D=0B;=A2=808=8D=88=E3L=A2=08"=86=A8H=F7)=8E@2=C9=91=EB=CD=8C=87"=84= =00"=87=C1=C1=BD=C1=07=C7=C7=A5=B9=E6=8D=BC=8A^=86#l=18=1C=FB=F2=C6 =DB! Q=E7=D2=1B=EF=97f(i=A5=94h=CA(=86=1F=08=1B=C2!=DC=A1@=E2=0B$p=C8=CC+%=D2=B2= =81=86$`Z=A1=05=C7.=FD=8B=06=1Cqd=83Nq=84#/hAZ=C6g7=16}=8Fi=FB!=D5=8ChP=15= =17t=0B=069=A9=C1=C7x@=842=F0=A0y=03=11=90`=98=17=AA=1E|=C6 =9D=B9=DC=0E=AE=E4=83'=CC J=08B=C6@G=04=CF1a M=88=82=13=AA@=85*=A4=E1=0B= `=E0=C2=18=B2 =06)D=C1 =13=93X=13=1E=96;=DD =A1K=FE=FA]=F04=B3=03!=18=C1c=DB=D1Q=07=05=13=A9=F0=F8= =A0=80/=08B=13vP=BD+=DE=C0@H=10B=11Z=90=83=B0=C1=88=81h=C9=01=02=C7=F7=1F= =17=E0=00g=D0=9AA=A5t=10=04%p!=0DK=B0=C8H=A0=A5=03=93xe=06)I =0Bh=90=03=C2= =CC`Wd=18=02=10p=FC`=83=E7=08=81=80M=B8A]=B8=D2F=17=C1h&=11=8CIL=800=97=FD= U=A5[.=B0A=18=91=E5=98=1D=8C=84¥=E4b=1E=0D=CCS%=CB¥=AE=07Lb=82=10=94=90=05= )La=89C(=02=13=8Ap=84*,=C1tV=D8=C2=14=A8=E0=85.=B0=E1=0Cc=08=83=16=DA0=05= )=A0!=0DRP=C2=11=F9=D5=04#=E8=8EKQxb=14=A7=E4=03=86=1C=AA =E0b^+=9D=07-=19= =F4D=06#=E1"=B3¥=F0=83=9D=F8=C0=068=D8=C1=05q=00=85=1D=00fTJ=D3$=0B^=B4=82= =1E=D4=E0=05=1B=89=01=18‾=D0=83=1C(=A9 |=F2=A5=0E=B6#=03#=0C!=06(BK=1C=A7= =82=1FFzs=95M=00=14=CAp=E6=95=18=CC=E03=82=D4d=DEb=14=B5=1C=B8=CC=93,0J=0C= =B0B=B6=0E=89=87P9=90=C2=0E|=80N=1F=91=B4J^@=92 =A9=94=84$=F1=E0=07D=80=D7= =14=FB=C2T=91=D2=14a Z=88=82=9CL=E7=04/=E8p=0BhhC=00 1=86-xA=9AQ=D8=82=11=A1p=87%d=01wJ=1D=C2=97=86=F4=03=CCM=A1^=98=E3=0B=CF=1A= =D7#=9D F1GP=1F=12tP=14=10=81=E8=05=D3=D3=01=0F=82P#!=10=94=06=3D=E0=CA=1A=DFrR=97= =F4`=05J=A0=C1=15r`=D0=18=DC=A0=07=B6=02=02=AE=82=80=9D{ D .x=C2Q=02=1A=03)=18!=06=DC=D9L=97=9E=10=04 ¥=E6HP0(H|=B0=02=17=BC=E8=A4=D8= =9A=CA=0Bh=B2=03=F8=0D=14‾/=10g=B3F=F4=02=B8=C9` ?)Bw=D4=A9=D3W=D6 =A1=0C=B9R=F0Ti%.=E9=CE=08J=18B=99"=A6=04)=88=01=0D]=98= =82=1D=B4=F0=861=D0=81=0Dj=F0B=16=90i=05=1A.au=C1=E4=97=EE=9C0=85=B1=1E=81= =89B =02_=80'=BC*=0D!=92=E7=9C=FB=ABO=F6r=99 =DC=C0=06:X=16V=9A"A=FB=C8=04= iU=01=CA=11=10{=12=C5=B6=A5=A03iB=0C=84+=04-X =07S=C0=D7=0D=920=03=1B=08Df%AB h=F0=12=93=E8@! =15=C2=12=D2P=9B =08=D8|9=BBJ=86¥=F2=C66=EA=ED?=FA#=9EB'=DB=B8=FFUo=07^t=9B= p}PZhi=D1=95=CBU=DE=0F=B6y=04(f=863@8=C2=96t=E7=C7!D=01 M0=E2=12=AC=10=85= =EDfa=0C`=00=C3=17=D2=80=05=1D=E2=D0=CB=05K=02=EE=A6+=1C% =A16O=F0=01=1F‾= =97=DF=CE=8CP/=F6=0B!=08Y=E9=13=C7=95=81=08<8=82=0Fp=B4=11=FBPe=82T=C1=D0= =03=BB=A7=82#=9C=EA=A4e)=8B l0>=C3 =B7=060=D8=15=F2B=12=D7K=ED=C0U=8C=15=DFEU=A0=04=AFd=06=07=EEC=02=14=BAt=99= !d=E4=07=FBv,1=7F=FES=C8=1D=DB6=A3Q=D8=E7"=83=B2=9D=EA=1D!=A4=D1=EB=D5=F3= @=18B=1F$.=809=80H=11f E+=E5=8A=97=BD$B=11jW=A7=D9=C5=CE=0EXh=DD=15=ACP=85= 1=90=A1 =05[=02=18=BA =85=DB=81=AE I=F0=98u=AE=90=E7=FCb=A9=D0@=90=1C=B8=80= r=83=10=D2d=08=AED=1C=0D=82p=A8=00n=AF=06=08=0E=96=FEf=C4c W=FAnu=93=81=16= x=D0=C5=1B a=06J=00=02Pt=00p!=B4=C0=06TYA=A7=F8=C3=12=1E=D4Q=08<=F1=C1=11= =A0`=84=EC0wj=E8=EB=A7IJ=8E=E3=EF=F1=BA.@ =C2=B8h=E2=05=1C=10A=9F@=E0=19=14= p=16=D2=E7%=F7G48B=0E‾PX=96=A9L=80=F6tHt=A8,=B2=BD|=ACc=1B=AB=08=11=94=D0= =06(d=01=AAurX=14=18V=86/l=81=0D=89)7=13=AEp=04=DA=E8=FC =CE=BE=0C=E6^>=D3= =98=E6L=89 E=00=82i=8C=80=A5'=F0=A0 @1=02H=80=82=83=E3=B6=120=83=0B=D7=0C@T=15Rm+=C2= =FE=FC^=B5=148-=82=AC@=06=C0}=C1=B2J=D4=B6=C1-X&*`=C1=C2=15=88=83^=3De=07= =BD=DB=94vp=80=DC=18df+<=C0P=0Bt=00=86B=86=DCZ=FBy=F4=8C=EE=A38*=EC=8A3=99= :=14D=19=B5=04 =0C=DD =83=B9c=0E=A0`=AF+=14=8E=AD8=11=14f2=E3=03(=08=81 O=F8=97=D5=87=101'4=01Nr=FAB=C5=D8=84=86'd!1X(7=15=B6=FF=84`n=C94D=90=AF8= =E5=9D_=CD=F4@=08Q0=03E=AA=E03=A2=E2=80z<=00B=18=B8cf=92=8DGh=E2=7FpD=06=B2= =C2=E3HE=E1=E0=02o=E0h%=A4e,P=04=05=86=03=06=9Ae><=04D=B0=E2=08^=AE=D0=C2= =86n=FC=C4=82=06¥=A0Wp=E4A=CA@fFL = =A2=08=A6 =B28f=06=04=04@=1E=10U`=04}D=C5[=0CHJh` fl=07=C0=80=08=8C=C0=EE= =A2=80(=96`=08=AA=A0=F8jf=A7j=C0V6=A3=07=9C`s=A8`=0C=1A=E2=F9=A2h=07=E6@=08= =92=E0=0B=A2@ xi8=84=C0 |c=08=BE*7=E4=E46=02=06 =9E=006¥=A3 j=C3=0F=98`=3D=D8/=FB=12=A3=08=E0/=FE=EA=C5!=00=0B=E5=F8=E0 =86=E0=B4=9E@=07=12c=07=A6=80 =E4=AA=C9=1C=07(=90=00=EED=90)=0E=AE=F3=180= =B16I=05|=E0%=CC=C2n=C4=02,N=C0+V V=B2"+p=80=94^NXV =A7=AA=C5=04=90=00=05= =10=CF<¥/(vp =8A=E0=06¥=A0=06pB=06=CE=A0=C4=EA=02=F4=AC=A5=F1(=AF=07=06g=06= =AA@=07=84KAf=A0 r=A0"=9C =0C=FC=9A=A0x.C FN!v =07b =FC'>=94 3=A8/v=AE =3D=9C=A3d2=A3=07=94 =0C=84 W=B4Ic=86=83=08=88=83=89=82= t#7=96=E0=0C=C4=AC =C6`=FC=A8=00 =AC@=98=92=00=0Bn=87=FDh=08=0Bz=C7w=AAD=96X/=08=C8=00=08=D6C=08=92D>T=8E=07= =98+=AE=D0)=84h=00=85=CE=08?j =E3=16=8D.=1E1.=02J=05f=E0=F3V=C2P=00jE.Q,=98= @,T=80=06^=C0=08=16M=F1=16=F0?<=8F=E3¥=E0=04L=C0=04p=C0=07=BC=C5=05=96@$=CA= '=A7=9C=C0/=A8=A2=07**&¥=05=12k=CF=81=EA=E2=8Ed=E0P=82=00=07=84`jn=02=08=82= =00 =E2k=08=C8=CA!‾M=06=80@=05!=05=84=A2=00=DA|=E09v`=CE=F0=80 =90 =08=BA= @=08=00=05=EA6C =0C=92=0D=00K=89=EE=C4=EA=FC=B8=10 =E6L=1D=D5q =D4=11=0C=A6=C0.=A1 =0D=BE$=08=8B =1F=03=A6 =82@=0D=C2=80 =86=80=8Ax=80 z@=EEVi=07=B4=C0=FD,=E5=06=96`/4k=84p=C4=F5=FCk=A7=FE=02=0BB=E8xxF%=13=EE= =11=1B=EF-=86=CF$b=82G42=C5=C4"&M =06L=E0=04=DCf#=A8=C0=A5=12=AC.>=91=05=08= =A2BL=8D*=AC=C0=04J=A0=04L=00=06n0=07=8AE=08=06'=07=BE=00=08=9A=00'F%=912= =E4=F3P=C2=01=F7&|=A6=82=9D*=E2 =94 '=8Ao=06=F8=CF=07=B6 J=B4=E02=AC=80=0Dr=C0 =E2=07+=BFC=D0x=AA8=8A=80=B5= =A0,w=0ECJH=E69=AC=B1=3D7C=07=DE=C0=0B=E0=CC=1C=AD. =AE b=AA=00 =8E=E0=08= =90=A0=0B=08t7=8E=C0=08=D4=CE:=FE=F24NC4zg=0Bn=C78=AE=CD=08=E2oL=FC=CC=F1= =07=08=0CY=F4B=08=98=A0=0C=F0=ED=8A=04=F0G=98=C7‾=1Ag=C0=12O=01WR=E1x@=E1= X`=0Bf=80=0F=F0C=07z%3=C8b5Y=D3=04^=F25c@=B7=BC=A5=90=9C=C2>p0=076r=13[=E0= =04P=80=04‾=13=06f %G=AAXZ=00=08=9E=00=06=1A1&0R:=F7=06g@=02 =08"=91=E0=85= H=04=82 8"=92=FCq3=14R =84=A0=10=99L r=80=07=A2=E0!=F2=C03=AAG/=FCod=9E/=DA4=03=DA= =90@=86=B8=00=08=FC=948=A4@s=BE=B0=86=06=B4P=07T@=8D Q=FD2=1FS=CE=08=9E = =A8=8Ee=E0=EE3=FEQ/=A8=EE=07=00=E8=07=06G/=E2=AA| Q=3D=FD=07HV1rR=12=D2F=F3-fOo=EAB=16=93 < B=B8=EE=03&}=F37O=E07M=A0=05‾=E5=05Rd=F5=08=8A=05p@G=FCu=C0(=86=E0=06N=80= =04L=80=04H ,=80=C0[jDT=A8=82Ig=80)=C2=06=B1=18([F=82=08=AC`=F0=AEb=D6=BA= =83=06l =06¥`=B0BB=A8p`b=F4MM=99=EC=C1r =D4h"'=80b =AA=84=F5=04e=C3=B8=D1= L{=A0c=FC=F4O)=03O*=87 =C4@@=13TQ=17=F5/=FFr=08f=08 ‾ = (=B3=0E=E3=0F=85=F2=85=17s$Dq=0033=13T=ED=C7=F5=08=C7‾=EC=E7]`=A0Te=E2=B0= =1C1=A5j@4=11=E9=06=C2=A3=80`=E0=14Q &=7F=B3e=7F=13=05^`V=81=D5@J=A0VK=C2= 7=954=06=90ugk=16=07h=E4=D1=ECb]=AD=94=8D=AA=15%0=EC=0D *=06=BA=00¥j`=07X =06D=AFM=FB=E2=06X=E0=05V=B1e=9A=F6=83=B2=88=C9D=8C=08=88= &#f=80[A=E2=07=82=E7=F9=D0R =FC=DA=C5=08=A2=E0=91T=CB)-=EEO=95=A0=0B=B6 7=A4 =8C`=0C=04vs=12=F5 =92@= =8F=C2@ &=C8Y]*=AEdf=F0=1E% =ED=8BG=08= c =AE=00>=A0L =A2k =E6=93 =ED=CB=BEP'7=8A'_=F3=D5`=AF=8C=FAp'6=044 =1E=13=87=8C=C0 =00=B7:=A4=C0=CE=04=97R1=E7=BE(=93=07=82=10=08l`T=F7=CDq=8B=C6=7F|@=08=EC= =E53 =B5=06=88=00=07A=04=96=FC=1A=D1T=F5=87=07N5%=AA`*=EEcHh=82c=08,=B8l`= =08b=D6ey=F6X=91=D5=08j6=C9vv=05h=17wk=97=85I=E0ij=E0=15#=18=83=93=A0=F1j= =EB$=92=E7FF=EA=F3V=C0=062D=7F=E4i&=A6=82=06=9E=00{=00#!=D2I=8B=E8=88=F0h= =80=185=8B=07=D8=80=AD=CC=D6 =BA1c=92@=0B=E4K8=D0=17}=07=B1 =E0V=0B=B4=00 $T=8F=B8=00 =98 =0B<=06 =AA=80@=89=A0=B9=06W=DE>=A3=CB=8C=00=0C=12=C3=8AXq=80?U=D0@=A5=B0=A8,6=90= 2=80=9D=05¥Z=AD=E30X&=A8=D3B=EA=02(*XF=D4I@4=D4=7Fj@ =E4=C9[Z=E0=08`=B2ew= =16YIxg=C3=07=05Z=80v=91=95=85Ey=04=E6=C8=04=10=B8*‾`Zi=84+=1A=F0=86=FF=03= =C3=C0=C5=90X=F2$=FA=86F=BC%=0B=FCj=C0=08Z=89=F8v0+I=CCqb=98=07=E4=B2"=88= =02'=CC=03=EA‾=C0O'=8A=1C=CF=17_=81 =C6=00=08=92=F9=99[=08}=8F@?=FF=E4c|= =C0 =B4Y=9A=0F=E5=8D=AB=04 =92`=08=94=A0=08=92=19y=82=02=8F=F3x0&=F6=06=1C=A2"=8A`2=D0=00=076=02=E9=12= ¥=1B=8D=03=A7=02=E1=96=B7H=17yX=9Ab=06,=E5(=F3=C2=025=D0[r=00Ig5=93=19zu= ek=85G=B9=04r7w=91=15=05=AE=02¥=D6=82=C7=0Eh=C2R=E2Fn=00%=98@=96MS*0X=B8d= =0BF=D4U!=85=8C=D6=14T"=A9=06=10=B6=88=16=CA=98=9D=AFM=89@=8C3FI=9C w=C8= =E3 :=C6=99=11=B6c=84=AF =90@=9A;FA=B9=EFc(s=A9=F9=EC=8D=7Fj3<=B4=0C=86(=07=F2= =80=07J.=9D=F1x=97=BBf=A2=DEy =9C=A9o=FC=0F=C4=8E =F0!=F1=02=8D=9ABT=80b=F5=FCY4e=02zw=B0=A0=DA=A6Cj@=8D=14I=05¥`u=19=9A=A2= I@=85qW=04=FC=FA=AFG=B9vY=D7+b=EB=119=1A=D3n@=0B=DE=C2=05=E0bdIz'=9A=C0=06= =9C=92=83|d=E8T=BA=F8|B=C8`Z2i=DA=98KfO=FF*3=B8=E0 =CA=E009=E6=A7Q=1B=B5=8B=80 <=E6c=AA=E0=07=86=C0 =02=97=A9=DFxp=B1=801=88=E09=80=80M=9A=A0=08=16=B3=B2= 0ZD=F7=8DD]=F5F=EC=898=8E=A0 *=E7J=06b =F2=E2=15=85s=06=DCY=07.H=06=96 $,= R4}x*=D0=C7>‾=A0[=C0=85F]`=A139=B0kW=A2G=E0=AF=D5{=94=91=D5V=91=14-B6F8z=05= b=E0=F3=A0S=C5RjUg=C0 =98=80H=FEL=F5=88=0F<=16Bfp=C4 =AA=87g=FB=A0=02=07=00=02=87@=819r=E8=00=A2=A3`=C1=1D:v=F0=E0=E1=E3=C7=0F= =12+Z<=82=E4=87=8F=8D=1C=81 =91=E2=A3=87=C8=87$I=8A=BCb=06=88=C0"?=8E=18= =F9=F10=88=C6!5l=D0=B8y=93=C7=8C=9D=E8=80%=BCv=E3pP=0F= N=98=19Q=14Lp=11=84=10h=D2I=91=9A=EDm=E7=03=10Z@=B7=C3=0EF=10=81=1F=13>=04= =B1=D4=C4=0E=1B=14=E4MM¥lh=C67=BD=C9=1F=117X=F5=82=0B0=B8p=03=106M=F1=A9=A7= =AE=0D=01E]-=BC=F0=02=D4=A9=D2=AC=B5=CD=14=C2=DACXA=C8=90=1A=0B5=C0=E0X_A= =87hXbn=E50=C3Y(=8C|=FA=16p=F4 =B3=AAA¥&ZZX=D7=88=B5f=10=8E%=D7=11-=88]=93= =0D7,=A1=83=82=F5=99}=B6=92=00=D2=D0DA?H=B1E=11L=08=E1=C6=11 =BD{=B7@*=E1= =BD=83=89=04=A1!D=F8=81C=1C=82=05+ A =16Q=C2=12=8EP0=1F =E1:O`B=11t=E0=03= !,=C1 O@=08=8A,=E5=03=93Y=8A=07=9C=BBX=C6=86t=93$=DC=A0ax:]=AC¥=D0=05=17=B8@N*=83= =FB=01=18 =F6=AA=B8=CC=E5=06.=D0=9D=A9p'!=1F=9AE.R=C1=01=11xp=05=1D=04a <= =A8A=0C=84=C7=03=E3=05=ED0=7F=B1=C1 =E6R=02=16=BC=EA=04'8=16=0D=E4b3=1A=FC= =E0X;XA=0CrT=96=17=D9=88=06=DD=F3^=CDT5;=D4=DD=A0=08=06=99=82}=A0=C0=BE<*= =89*=9F=1AH=BDz=F0&=1D4d=7F=FD=83=97=12=A1=10=04"(eK=06 B=11=B0p=04&LA"@P= =C2=11=17v=04D=B4=04;O=F0S=BD=92p=06=A6=14=01=07=0E;=19N,=C6=B9=13"*e&=8B= H=CBb=05=AB=D9=D5=00=072|=01=10=B4=A5C=A8]Ow@=0C=A2=AAt=A7C=18=D4 =08X=98= =95=16e=E0=A3=18=A4=C0=8C40=81=87t%=02=12=A8 =8A' =1A_¥=10=83Z=B9=00 =D5=9B= =10=CC`=00=07=16`S=06=3D=88A=0D=A2B=83=15=B4=B1j=FBm=B9L=A9b=E6=82=D2=D9=00= zy=AC'=0Cp#=83=1D$=A1=069=08=CE=C1r=90=86=E3=E0` =82dNBt=E0'=81=8Cg@=03=C9=C1=14=80@=04=1C|=AC=A1Fh=1B=1D=96p=05=99H=01=08= A`=88=14=88`=04'dD=82H=C8=01=A0d2=84"4=A1`@=F0A=13P=C99=D7tN=95%=FC=94=C5= ¥=98=C3W=AD,=87Gp=08=CCRe=BB=A8=E1=CE=87Z=0C=EAXZ=15=83?=C0=B2=05=B5=EA=10= =AE@4=B4=C4=FC=A5=07}=11B "#!0=A2=C6R=15=E3=81=0Cl=F0=83=DE]=A64=EB=B4=11= =8Evi=16%=C4%=A7=B0=8A'=ED=E8iO=FB=E8=E6[=06a"B=832=83=0C=FE=A06 N=DDp=B0= =D0=F144=08=02E=CE=10x=A0=AF#Pa=08=1A=D4=C1=13t=B0=D7=B8-=A1 P=B8=C2=0F=0689=C1*a;=10=F1=01M`ZS=9A=D6=FC=F4=94x=9A=E7Rc=A6=C3WA=E1&Z=15= =E2=0F#=E4=DA=15=8C=AC=B5=0FJ=01 Pp=02=14=04=89CO=3D=DE=AExE=B4=C4=90=A0=045xAor=A9E=B0 =C5SK=F8=C1X=CB =AD=9A=01=81=06qA=9D=0Ck=E0=02=1B=C4=D3=AD=B4=8B+=FB=E6J=83=01=C9=C6'R=99= =CA=0Cx=90=04"0=84=B1@=18=C3=16=00=1BX=86=E2`=08QP=A8`=F1=E6=1F=8D=10A=07= =02=A1=DC=0Erp=D9$8a A=18=02|Qd=03%=DC@=08=1A=F1=C1=18=FC =04#=98=B2=84=A2= -=A1Lk=10V'=E4=A0P=AF=B2=D0¥j=C0=02=B881=A8=B7=A3YlQ=03=17=DA =C9>y=A1=81^X =C5=E3!/=AA=1F"=81 =84=A7=04=95=A5=96?4(=C2=0D=A6=12=83&=9E= =05=BA=CCR=CBX=82=E8=02!=98=8F=06=3D=D8=81=90=E6=08=83=1C@=E1=05Q=F0=AE=1E= q=D3=03=B6=FB]p =AC=012o=92=02=04=864=CE?<=B8A=0E=E2{_=1D=D47=BE8=A0=82=12}@=AE=8F=0DH=B0= L=F9=81=156=12=04=04=97=16Os=13=C2 =9D#=93 =9B=D0s6=3DY=0D8=85=13"=B4=94=06@=E0=02r/D=97=1C=F8=80=C4=0F2=F1/= =CDR=3D=B9=08A=08=8Fn+=8By=1Bc=19=FF6y=81=B11vg=00=83=0E=CB=8E 6`=9EQ<=05= =84=E7‾=86=C8j=91=01jb=BD=82=1A@4A<=11a=8A=1A=05=84F=91L=D8=F5=D4M=0D=04=E9= eo=8Dw=06N=E8=01=1C=8C=C0=044=A39^=F1U=02A=84=F0=05?!!=BEb=D3=08=7F=8E=A0= =E0=3D=E3=C9=CFx=FA=C1xz=B0=04=FE=94R=A63]e=0D=C2=A0=04=1E4=E1=06>=90=82=C5= ‾0=03;=C5=E0=05<=00=C2=A3=E72-=1CPz=A8=A5=8A=0Bj=BEH=97=17=F8 =97?=90]=0B= N=A0=FB=17=A7=CAXh=A3FL=AF=FAb+=0DeQ=06?Hu[=C3=DB=A8=18=FC@ =0E=BB=01=F78= s=DB=94o=8F=058h=C19{=E3=9B=16=1C=01@=E6=15c=8A|`=03R=DE=A0=A2=EB=A3=81Q=E2= =8AO=1D=D8=80*=BC=D1M=0E=A6=D2=1BLY O=F7=95=F6=0Dt=E0=F4-=B4=D4Oh=0EB=14=800=04"=F0I=CF=BE.e)=83=84'=D0=E2D=95= =9E=B2=81=14=08=E4=1F=AF=F7 =D5p=F97mS=D5=CDJ=9F=CA,=E9¥:uq=E0=EF=98=E1 =DF= 0K=ED=14l=B0=82$@=1C=D4=13=9F1=8D=053=DC=E1v=F1=08m=AF%=ED=1A=85=03!4=CA=07= '=B7m=CA/=8F=82=18=B9=80-=A1=B2=01=0F=96F=84y=D2'=9F=822=C9=0F=A8‾=83 H=01= 7J`=0D=B1=AF=8C=C1!=D8=A0[L=AAy=08=E7}f=BC=D9=97=CDh=CERI=C7=B3g3=C3=97 -= =C5=F9=BA=FBMv|=11=B2{=B4=9E=ABA=9B=1C=C2=03$d=E4=9C=B3=CA=A1=87=DF‾b =0E= =F1&O=90=C1=10b=C0=93W=99;=07E=D0=EE=AB‾$=97=1D,=C7D=A0‾=A6=A8G=1D4=8C=C7= =05F=08=0B=0F=A1w=CE H(=05c=D1=0C=E6=FF=7F[=DB#!=FCU=03R=90=03=F84=03B=D0= 8Tp=04E=C0` e=10f=B2wecOF=01=058=F0sW=86O2P=7FE=B0=04F=D0=03=06=C4=12@=A0= =14N=E7tQ i=C0=B7gF=C0tXG=05`=93|=CA=07BbWS6=B1=13=E6=A5=03H=D0=10f=80n>=B0= =04(=02=04=A5c}=1Evb%fb,=D0=031CsG=80=03/=A0=03=AE=01=05:=00=03X=90]1=A0C= 4=80[=1B=E2T=BD=D5+&@q""c=18g+&`=02.=A0#.=F0=05MFr=95=07=03*=00=80o(=80*=C0= =02=FCY=01d2=90H=03T-L=E0=04R=80.=FE=85=04‾=02 =14X=811=A04@'=03=0CvN,=D1= ohp0?=C0=04WW=82N=17|=0B=85=03=94=A3gL=87=897=00=05=0C=14=83=CA7Z5U=03NF=03= _=80tU=A1DN=90RG=E0=039=80=044 C=B1t}E83Ce=19C=B4=02.@=05=E4=F7}:=10=14=00= =12=04=E6=93=043=90C.=D0LM=B5=850=E0+6=E0‾#=80=18^=18=7F=88=D7!za=02*=90!= :b[0=90=80=96=87=028=A0=8Doxyq=C8=02@ =14L=12=03O=F0_F=10=05P@=05=F5=C2=04= =05A=13B=D0=03=AE=97=81@'=04=DE=85O?=90=04=06=B1=15G0=05Z=C0Q=FF=85=1C=82= %=1E=97XZ=81=05X=E2=86=906=10=04=0B91=9E=F8=891=D5=03*=13fK0=8E2 H:=90=04= =1AT=05=FCd"H"=A3]=B0=04b=00'=8BBEpj1D5=F0=1C=CB=85BO=12=04F=D0v=FA=B7!z=F1= =02=D1X=028=004=D04=024=F0L=CE8=02=B4=B2=85=BE"=8Ddhy=B9=B5=03=99=A7r=DE=08= =87=D1u=1A,=F0$I=A2z=06v=04@=D0=80C=D0=04=07=15=1BH=E7zVvO2`=8F=BC=91>=1A= f=15R =05Z@&?@=04L0Q=0D=B5P =89=90=AA=C3=96o)h=0F=C9JX=01=11:P=04=AE'=03=CB= qYHpQ=E62{=A44K=99=02=03=162=92r7w=A8=B2O=01B=15=AEC=03=9F=15=04S=E6=02N=90= =02dX=02V=A5=19A=A0=17B=A1=02'=B0=8C!R4¥=E9=026=96=18=BFR=02=C8(M=B5=82=9A= d=C8E¥=D4=8DH=89=94J=B9=944=E0=03gS=14C0 = =C3=10=FD=B6=06=E3=98=1BZ =03R=08t5`.=FCu"QB =95L0=04=E9=91=10Zr=109p=05=04= =F9=96{=A6|a'=83q=F9=90=C8=A7=8AAP=1B=90=02=03=99=92=03=FEA=04T=A2(N@N=96= =F2_=B1B=84=85=D9K&I=16>=12=06S=C1=03Apl s=06+d>CP:B=80=17&=F0=02)=F0=02=DC= =88=02D0=16Q=D4=99=CC=18M%0=04"=C3[0=80=1A.`+=3D0=8D=B6=12=94dh=02=AB=B9=9A= =AE=F9=9A1b=92O=03+=D8=98G/=F0R5Q=056=90=04=0E=01Y=F28=8F=DE=B5=03q%Q=1Du= =03=F1#=10Q=D0=04!=D18=CB=19/=8D=A4=11=D0=19=9D=D4Y=9D=3D=BA|=17=A32K7=9D= =A9=A3=12=ABa=1FZ=80=05=E3=01:=10=11=05=18SJA=D0v-=90=84"9=92=EB=C9=03*=E0= =1C9=B7=814=A0=80=0E=F1=14w=B2o0p=17'=A0=032=E4=02=02=FA1=A1=C1T=FC%=00"2= =C0+%`=16:=C0=02z=01 =A4=B43&=E0=8A=AA=19=03=AAI=A1=16z=A1=18=9A=94=9D=A1= =02P=B0=8AE%=155=91:=07rO=FB=06+t=10^3 =1B=E6=05=A9>=D0=9B=BEYl=1B87g=06|= 7a=07=8Fe.FR=1B¥=E0=03P=D0=03=0Ec=03>p`p=E9=A3> =8A=A5=DA=90=CA=87"=03=92=A0a=1A=03Q`>=F2s=03=AFA=03L=A0=04=F9=E1=02M=C8=03= =E9Y=A54=E3=3D,=90 8=10=1CL=928=0D=81XE 7gV=04QV=94(=00)F=B0V =A6=03>)E=89= Wj(=00=11/`=02=C2(=A53=90=02=B1b=13<=A3=02=A6S=A1c=EA=A7¥=04=A8=81=EA=19=12= "=03:=08‾;=00=05G i=AF=E6d=D5=A5=13=E6=85=95Jb=A9=DF=F5]=BC=11=91=0C%=04w= =99tM=D0I9=80=10;=10=82&=13=AB=E6=A6=A3=FC<=BA=AA=3D =A4a=D1=AB=9D=C8t!=91=AD=F1t%=08V>=EF=91oL=D0S1=D0=03w=E0q=B5S=17=007=17¥= =E0Z=D2=F2=03=DAc5fQ=872@=04=F8=CAXR=D0=04=84=C2=04=88=F5y=E4=8A=023=C2=04= :T=8B=83=07j7=E6=17}aN; =03)=00<1=93=03, =A0=DA5t=B7=D5Dcz[=7F=FA=AE=FFgV= 9=D2e9=00=82^=C5$3=80=8Ed!N=8AI{=82=18=B0r=B5=B4U=A0h8P=04=DC=12d=85=C2=A5= =04EZ=E2aD=A9=CAtwB=B1=15[Jfba&=D5=05x=02XK=B7B=F46=04eZK=F7=D40=EC=86=92= =E9=83=04E=F0_=E7u=030=90 =E3=A3E=B1=82];p,#=99=03M=F0C=B3=864=A8=B3=95=EB= !iA=80=04X=90/=068{1=00=04=DEs=8BP=A3E:=C0T=D24¥:=B0=02$PM=FC$=D0=02B=B0=02= :q=1A=EF=84Z =B2o=0D=A1=8DG=10=80)'=03[=ABr=1A=AA=02=94sO3=90=044=F7=10=F1=98=03n=C1=02= !t^x=B9G =F8z=01K=88=AB=08=04=17=C4=15W=10r1@=04=81=D8}+2LQ=B0.=EA=92gU=B7= B=12=D1u=A5=D5ue&{=97=E2)=11=B9=03td`I=B0nz=02)=A5c=A6=A6C=1C6P=05 =B2tU=F0=026=C0=8FR=A1=03e=F0)>=F0U1=00.=19dp=85I-=97=A1=7F=95=874-=10B=F7= T1 qzE@=04=EAe=1B=AC=C1=03?4Dr=11=04L=B9!C=D0EXH=02=B9[=93eq=3Dm=E1#sA9=AF=F2= B=F1=84L=A3!=037=00=803=C0=BC=99G=1A=12=92=AE=C6=01y=80=F7=BB,=D0=10=95=E6= .g¥=16=89=97 2=03=0B=F9=BDo=C5=C5z=C4=1A=FC=04X=14=CC=1A=FC-c6J=E3-M=14o=FC=B1=11r=C6f= =92=C3=82=D3=B9=8Al `=3D=10=06=E2=88)A=10=06m=02=11=86=C0=B76=80=96=E2a>B= =08+/ =04/=F0=03=FF=E9=8F=3DP=042=F4=0461K=E6=E4,6!LfH=A5E=08b=00=EC=16@=E0= =024=E2=7FH=A3=C9¥i=1F=9F"^=DB=E1=10=12C=15=9B=C7=9E+=90=AB=B0=F4=03=B8u,= =B0=12=03W=A4=02%=C0=1BGv=1Ae=81=84=A1=E1=025p=05/=10=06=04,Cp=10=03=B1=13= =196=10=05=98=B7=19[=9B=C4>=07=03=16=99=8BS!=A0=B7,=15=D2=C2=02K=03`=8AI=15= =89$=04b{O"=C3=C5oU=812P=06=8F=85j=F6=D8=1B=82=D2=10M=009J=B0=90=FD=B6=03= =94=A8=03P=90nG0=BD6e>=E4&nO=C0=12=3DE=13TQ=89=C2=F1/Jff0 :=89=BBTm5=C8 =89S=FC>=0C=A5/=C4=B9=8E=B2V=95,=8B-=00 ;=85=032=C0=3D)W#*=F0=04702T`f9g/= Q=B0=04=B6!=14<=00=D1=EET=CD =F2)=9A=D2=B4=C0=D3=C2=96{=02>g*!Y=CD=D5r=06= =C3tfP=1A=19=E0=EC=BA=94Z#=C8=CCF=AD=E9=8D0"=AFK#$=94=BB=164 ]4=F08=08=15= =E7EHV=10=8F=F6=F1=CD=DF¥l=3D0=BE=92=F7=BD=E5,WC,HEPAO=10=95J=80z=82e=10= =92=1B=B7=9F=E2=04NP=89LH=B8=05=F9t=05=81=04=A4=F8-=E2r=C2[=F0=04=D8=82"F= p=86=F1DK9=B5Tx=F7=84=1E=97C=D8=B5VC=E0v=B2xF=98&NA@=9EUa=86R=A0N=97=C7=1B= 6 20=C0=04=80i)U=E0=A4=C1h=CB=E9*<=BD=01=15F`=85)=C0=D4+0=06=80=85=81=B6=85= 4:,=03V=D0=9D=FB=EFSh/=AA#=99}:M=EB=7F=01=B8=02CM=D4=F0Z=1Ad=11=CAQ35=C1-= =A8=12"=15=FA$$=A5=E8y =D5=03=F3=B5=A2W=8D=D5=DF%1=07=A8=95=84=98gx#=CF=EA= =88=05=8E=14Q=E3a`=04=A1DB=12=16H=C0=05=12=A1-=C2'=D7=FE=E3z.=81A=1A=A4@a= 6:0=D0=03=C0l=A6l=D5=02A=00+(=A2j=B2=133=B18=D1S=AAE=D3Es=ACa=05C=B0=02(=00= =10(P=9C@!=04=86=0C=18/^=C0=A0"C=C6=0D=1B4h=F8=90=D1=C3=C5=8F=15=19Ul¥=A1= BJ=0C >=B8=0C=E1=B1Cc=0E=1E4=1A=CEP=91=C2e =8E+j=E0=901=A3=C6M=1E6 =DA=F8A#=C6=90=84/l=D4`=B1=F1%=CC-=3D=8E d=DA=B4=E9Q=15Tf=E4=90=B1=83=88=8C#-aju=C9=B5=AB %D=82=D0`=C1=A3F=0C$7f=FB=D0=D8=01=11=07=8E=84A=15=CE=A5=AB=10=C6=DD=BB3=A2= =C4K=17=EF=DD=18Ar=BC=1D=02=C4J=91);t=E0=C8=C1=C5=06=10)9=988=E9Q=C3!=8D= =1E;|=F4=F0=E1=03 =12=1C=10o=84=C6=C1$=C8=94=180b=84=CEaD=08=922S=84=10=A9= =92=D0=C5=ED=16=B9u=EF=DE=ED=E2=89=0B=16=C1=85=03=17^=B5Y=11Y=FAj#=1D=90=0B=8F=05 Z=F0A=BC=DB=B6=05Wi=B9h=BC=ABK=1B=8Cxk=A7=1B= =90=D0!=D7=BB=B2=BC1=07=1F=83@=02=0E*=96=98=17F4=DBB=B0=AEu=CD=C5A=8D=04%= =AAA=CB0nh=D4=858=E5=8487=88=ED=9Cxb=E36l"K=1B=86P(n=84=06 Yd=EEV=F0=D4=05=CA=E9<.=B9=E0>=D7!=E4&n=10=EE=A1=F0`(=A1=84=9B=BB=82i=05=9F= =F0=F3!=87=1D=82P=E2=0B%¥=D3=EF=E2=EB=F2=C2=C1=CC=9FX=98a=85=1B2=9C=9A=EA= =AE=FB=FE=14=11C=AC=8F=B2/&h=9B=9BT=BC=B9=80H{=DB=BB‾=18=DF/=FD=E6=AEj=07= =1An=18L=BF=D4=E6=8A=DF.=18=A6bl=D6-=8A=E8=81=E9=B9K=BD=EB=06"=A5=08,=8D=AD=88V0=E1!=84=12=A73=90= C=0D|`=03=1F`=891>8=10_=C2=A9¥=B3=C1=170L=18=02B=E8=92=D6=B9p=F5w=FA=91=02= g=82pA=92=A1=F5=91?=C0=ADx=8C=00E=1B=88=A1=06[=AAjA=DB=BB=DE=F6=CEI70=F3=C1= =13@=E6ASJ=F4=06.=18=82)=8F0=1E=A2=84=C7=04-=00pJG`Y=DB=15=F8=06B=D0]S=10= =C5=02=14=08=F2=06=7F=F5=815=05=F4=84P=9ES=06=D1=C2Z=86e=EBg=11y=D29<=C0=CF= =FE=12=B4=03=1E=84=B5]=A1=D1=81=0F=8A=C0=05w=FD=05=C60=86A=0F =12=04=1E=CC= E=C8=E3=F9=C1Z=DF5=03=1D(A=0BB0=C2Y=C9=C6P=17=C0=E5=07[=E9=B3=91=AA=E2.=B4=92=C1=17=C8=96=17=C8=0F=AE"=02=BA=AB= ;=DD=80?=1E=DC=8D=17h=A0=BB=8A P)=0E=17Z=0B=88=DB=8D=1BP=02=C0[=9D=1809=1D= h=81=1B=B0&=82=10=A9=FC=BB=AC+<=A5=12h=81=1CH=82c=13=C0d=03=02=14=D1=8A=D8= ;=91=19@=B6=04=F4)O=82=3D+2=96=A83*=DC=D3=A4=1F=F0=01=18@=93=17=E0%B=BB=8B= tA=10=1C=88=82(=E8=81=92=F8'&=D8(=AC=CB=B7¥a=1Au=B3=0B=19=8C=BE=E9=A3'=17= |=A4=19(=9B4=A1=81=85{=9C=1F=BC=C4K=8C2=08=F2=B8=FD=92=82.=89D=1Dp=01=1D=A8= *=86i=01=19`=B3=14(=82=8D[=81(=B4=81=13=B0=C2=FCs=81+¥=81VB=81=9A=E9=81=CF= =03=C3=11=D0=08=F7=087=15`=14=02s=82dK=81=0D=FC=D9=AD=07l=C3=9Fz=C3&=FA=AB= =0B=F3=A4=8C=C0=8F#=18#W=E9=81,=01/=B6=A0=8E=1CP=17=15=04=BE=1B=80=82=BB=90= =82=EE{D=1C=83=A2E=DC4,=B8'=80=81=88"=F3>L=FCAML=19<=D9D=8Ai=0Ek=19=82=18= P=82!=B0=013=A0=C6=BAj=1B=18=E0=01=EEx=01=1A=B0E=13@=81=AEq=01X=BCB=85=A4= !=13X=81=CD=D2E5c=AC=15x=01=14=88=01=B2`=81=18=98=AD=9B#=01 H=02p=83 =1Bx= :d=84:=DCk=A2=14P,=11q=01=98x=81 =CB=8F=B8=98=11=19=10H$8=AD=9C*=A2m<=82W= =11=82=3D=C1!=B8(Gq=E4=B7=9F=04=1F=E9=BB =85i=C7L|=C7=F2=BB=93=C1s=02=AE=F2= =96-=C0=89R=B9=BB;=DC=81=D1=B1=1D=C2=8A=B9W¥H=AD=BC=AC"xH=88t=A1=81P=01=1B= =88!=02=DB=C5=11=10=01=B4<=B3=DD2=01=FD=FC`=01=CB=F09=DD=19=C9=AF =C9=A9=91= =C0=A7=A8")=A2=01!=98=01=1E=10=9F=1BC=1D=16H=03=DFj=02=FC(=CC=CD=03=BE=EB= =A8=8A[=C2=81=C3=FA=9C=A0=8C=BE=18x=CCG #=F5=CB=01v=AC;=A4¥()3=02y=C4"=D3y=9C=88=A0=8E=8E=92=88=B6P=08=8B0=C5=85=88= =81=C0=EA=B5=14=BA<=85=04=C3=FF=A2=01=AF=14@=11(=CB=11(=8B=93"=C2)$=A5= =01-P=A4=10=CB=8D=C7=A1#=9F|D=A3¥T=1D=DD=D1=85=F2(=C6=B3=81)=F8=C7 =B8=98= =0E=89=BD=95q=88=19=88=88=FD=E9=01Yq.=99Z=A0=85=10=1D^KH=AD=BCR0=D4=B9=02= =0D=81=100=D03=03=D3/-=B0=13P=81=19=80=88=1F=8DL=9EB=AA=83=88I=18=FC0=02=1B= x=90=0E=BD=907=1DV8=05=AA=AFX=82'=FC=A7=10=B4=C0"=90=08=D31=16=8C=D4=81=9E= =A8=89=12=FD=D5=DE=BB=A8=98l=81=18=D0=0D;:1M=93LF=0D=D7=F8s=D4=E2=08=8F=1C= =00=02=14=DB=81,q=91[=D9=9E=DD=D1=0C=87=A8=89WC=B4D=EB=81=A2=19=8A=A0=B8=82= =F8XMS}MT=FD=D7=02cU=81}P=B4=14XV=DD=D2=D9=E1=95=1Ep=0D x=90!`=01%p@=DE"=82= l=A4=81J=9D=A2`u3b%=D6g=FA0@¥=88=B7X=82=E6J=97=F6yX=DD=A9=02)R=81=1D(Q=E4= 0.=1A=E0=01=CF=81=01&=A0=93=EF=B1=A3=19=F0=CBpTTq=0DWr=BD5=17=08=02=19h=02= 7@=A2=DE=8BDR=EA $=18=82=1F@=8D=AA =02=1D=18T"0=02(=98=C3=1Bx=02=DC=12=02R-=D5‾=05P=80=FDW= =83mU=17=10=81=AF=1DX=06=FC5=81!=E8=88!=98 (=B0X=08=82=3D=DE=C9=01,=D8=A8=EB=A8*=87=D8=9D=03c=8A=8D=CD=DB*2=8A=A2h=AC= ¥ =02U=EC=90=FA`=01=1D=A0-*=92=A5=948&=8EX=8FZ=9DG=EF=A9=A1DT=88$=F0=17=B9= =08=CA=9D=E5=D9=9Eu=AFI=A1=C6=9BP=82=FD=08=AB=16=F0 =15=A8=B1=EB=98=8A=1D=90=04!=B8=02+H=82 =D8=03=C6h=AC=15=D8=0E=19=C02=FF¥= =C8=AE=05=D8=B1%=81=B15X=06=1D=81=BFJ=81=C2E=82=A5:=0E=89=C5=12|#=A3=3D=DB= =D6d=CA[=E65=C9=96p=88R)=19=DD=FB=8A=1F=A0K)=C2=BE=9B!=0B=8EpF=12=D2=81Fi= 4|=AA=82(h=D2=BA=B8=BES=BB=DCEm/=CC,W=F0=B3=12=88=B8=02lILgJ=81=C6=B2=A6=83= =02=C6=00=03$H=02,@=BE&=98=0E=EA=BB=DB=14=98¥8=8B=A8=17=90(*=B5=D2=DB=0D= =D0=B1=FC=DD=81=DD%[=11=E0=0E=17`=82"H=01=1B=08=99=0E=D1=88;=B1=81&`=0B'=C8= =15=1C=D0=027=80=01{=A4"=E6m=DE=E6=14=B4lT=0D_!*=98=90@=D7=AA^=A8=D8=9A=8C= =A8=81 H=B5.a=82=C4m=8B=B7=C8=95=BF=B4=A30z$=F4M=DF=83=1A=BFEM=18=1B=F8=CE= =EF=04=02'(=8F=180=9F=E5D=01=16=F0[=D5=18=82=C1=08=83=1F0=02#8=02=C5h=82=8D= =B2=99=14=A0C=F2=B0=81k=83=81=15=E8=0E=1D(=A5=FDS=E0=05=D6=C5=B1=15=DB=07= n=D5=DD$=01=15=10 =8A=99=A1=BF=82=0BOz=1E=1C=A0=18=F2=F0U=96=C9*$=88=1A%=B8=15=818a=BDmN=A0= =B5=82 =80=82=18=18K=0E=13=88=19(=16=91=DC =D5zN?I=A0=C5=19=8D=12=F9Q}=B3=0B=E1=F5=AE=1D=1Cb=DE`$=F1=D3=AB=1Ax=01<=13= =BFv=04=9F=B7*=022=8A=A5=820*=17=FC=F0F=8B=92=AB=1BP=03=B7=E2=A5=DF!=3D4=FD= =A6I=C1=81=E0=C0=8F=AD=CD=C56=06=C38‾=E09=EE=3DZ$=81=1B=A0=E3=11@=81V=A2=BE= f=DD=B3y=BC=8D0R=0D=3Dl=8A=D8Ed=14=A6=9A=DD=F3 =1C=A8=8C=D7S=81=1C=A8-8s=8A= '=08*=9C9=91=1C@=83=E0=02=82=99=B0=81=EB=9AB=0B=FC=A2=B3=10=E3=17=D0=02=D5= =08=C2=1B]=18L=BC=CC:q=A4%=F8=D9=B1=F4g=A3=C4f=BF=A8ZL=19=08=81=A8=81-=C8= f=18=D0=01t=B5=01=933=8Bk=D5^h)(}2=99W¥c=00;f=06N=E6=AFEK=18=10=820=18=81= =1B=90=D5=9B=93=13=1F=12f=F6=1A=BC=F0=A8=A1=A3=BB=DB=CER=01o=FEf=0C=A9^=1C= p=82=14D=1D=A8s=81 =A4=9E=14X=81,=88=93g=B3=89F=DB=81=B4=08=0D=1BX=02=FD=E0= =A6=17=93=1F=ED=CB=89=C8=E4=C1M=0BhG=9A=94|=FC=8A#=BBz=93=FD=EA=A3=DB=88B= n=AD=BB=B4J=88=1B=E8=BD @=14=14=B8=A8=06S=88=1F`=82s=B9=18=89=80=0Ey|=93P= =11=9Db=C6B=91vc=92=1E=D8=11X=88"=D8R=15p=D53=DB=88_=B3=99G=96=93=F1=1B=8F= =00y=0C=ED@=943=CE=E9=8D=AD=CB=8E=D0=D6=7F=0CV=1B=00=B4=AEX=01=16i=B7=1E=D8= !=1E=E8=0C=1F=A80=D6P=0F=FC=A88=C2=B9=8E=C1@W=A5e =BB=1B%=F0B+=AC^$'=B5=01= =DC=FA=EA=CCq=81=B8=95=E7=88=F3=BE=B4jX(=E2X=D7=C2=BE=17 =D16=82=9A=C5Y=0B= '=00=02=E6=B8=E4=16J=3D=CA=FB=AF=FD=EBkd=FE=EBV-lX=DD=D2=11He=F8=BB=AC=16= =10=83 t=CB=DB=B8=829@=02=A3Z=82=ED=A0lD=AE=CB=19@=02d=F5=A4=CD=8E@=97=08= =C9)NL(X=1A=02"=02Y!=9A=D0=C0=82=EA:=A7=A9=0E=17=D0=FB8=17=9D=F82=C9i=01=80= h!=B0=85=8B=176j=B8H=A8=D0=C5@=82 a=F0=E0=F1=82=06=12=1B=0CY`¥=A1=11#F=81.|=DC=B0q#=A1G=1D=0C=1B*|=A1=D0=C6= =12=164P=9C=88=19=13=85 =19PT=9A=E5=B1=80 g*r= X$=97<=D5=C9L=F5=8D=97=BF,=EF=85X =85=B5@3=EA=AA7=A6B=0CH=F4H=18=0E@=CCk=03=13X=CEp&e0=10=11C=15=91=F1=FA=C4= =8ED=F0`=BC=154=B8=A4=1CQK=B80E=12R=F4=80=83=0D>=F0=B0#O=D4i=BD=10O=BF=F1= =90=03=13=A4=D5=A0=D1=CB*=18=1AD=0Ed=BF=FDC=0D=07]=1B=C4=E0 =E50=04=CC:=04=3D=B9i'=F4=3D=1E C=F4=A0=07CP=C9=0B=94=90=A4=9F=10$=08dB=81=FC=96p=83"`)#,`=82@=F87=83=B5H= JR=98=03=D0Sj=F0=1F=ABp=AEs=9E=D3 =E8=14$=95=17=8Cn)(@=15=0B4=14=83X=A1./=FB‾9=8C =80=00=C3=182=06=06,=90=81=E2l=E0=9D=170k 8=88=81=0D=EA=C0& =F2=80=06Dp=02=B4>4&&tk=07/=C8=11=10j =83=85=BDl#J=F0At=DE=F6=BE=D6=C4=CC= 4O=A0Zo=BE=B744=01=81 =E7S=C1=87|=C2=C3=1A=F8 T=C8=01H=10=85=03=19=14a$=05= !L =BA=A3=12=82=C8=80=7F=E3=19U=CA=DA=02=B3=17=F4=C5i-P=C1=E4=AC=E3=91=17=AC= =E0=04=A5Q=8D=0E=90=A0=83=E4=AC@ <=B0=C1=0E=E2=D6=02:=C1@),=C0=1C)=1D=E4=82= =CC=05(=84"=F4¥=A7V=F0=C1=11=9C=A0=05=92"=02L=9A=D2=02;=B5=C5z0=A1=CB]R`C= =D7=C5=90/}=F9=81=BA=EA=84=C3=19f=01=06B=10=C2=0Fn=80=84=D4=00=D1[=17I=DB= "=B3=C7F=F4=DD@=088=98=01&yp=83=97=F9=E0|-=F0=81t=0C=D56)=DC=FC=E0=8B"=A1= =CF=0D=92=06%=EF=F9=880S=90=01=1BO=C4=C8=17=8CM=065=D8A=12"=C2=83=00=E2=C0= z=97=81=12jz@=17=1D=02=81=06=3D=F0=C1 =EF=83=B2=B6=ECp=850=B1=13lx=103=82Ha=06L=18OA*=F6I=B4=AD=A0=06EXB=13=E8I= =14"=B4=A0=08-=C0=98=83=96B=02=A5=BC=94=05A=8B=81=A4,=A5=CA=90=89=0Ct#=B0= =0DLI=B0=83=90*E=05QjKB&=8A=823=1C&=92=8Ai=96=AC=82=C9=AA=C4=0D=C1=98=AF=EB= =0Bi|=F8=02=D9(=E14=DB=DB^B=B0=A4=82=13=A5=C0=057=00+=0BL=C3=1E{J=C1=05_=05= k=16=AD=08=ADM=E2 7X=82Hl=00=04"=DC=91=AB=D9:=9A=19w=94=84=17=AC5=05E=80= =01=12=86P=99b=E9`=07L=B0=02=16=A6p=04=DDdM%10=D3DO=90=83=BA=80=C8=A1=0F=8D= =C2=A9=FCV=85=1B=FB=04=C1=81=BB=E3=02=BA=04le-$$=CA=F8=B7=94=80=A9=E4= 3P=C2ar9=AA=13=D8=C5aoq=C1e=A5=99$=15=9CK]5=E8=01$=7F0=83=B0=1A=C4A=94=F2= =D8MA=A0)=11=90=A0=B7#X=C1=08=F8#=FB=BA=13=08!=068=BE-Qp`8=16H)=07-=98=81= i=EA=85=C7'=A8=0EZ=B1=02o0=A9z=BA=D7=AD=E0 =8B|=D9=89=B0=14=03=1E0=A1I=A8= Y=CD=0E=8E=DC*=1C=E4=F7%=B5b=CC=CD‾pXc=ED=C0=07J=80=C2=0F=84=086=F9}o!0=C0= =1A=BF=CE=D3I=C4=A1=00=91=B5J=81} =03-=F5=8D=CB=0BqHB=10=8E=F5=03=D3=80=81= =B5}=19Q=E9¥=C0b=A6=C8=92t:H=97ml=00=03=14(=85=902h iM2=83=17=B4E=8A=0Eq=8BGb=C9=82=14=85=B2)$=88=C1=92=99,=DC'+=C8U%X=01$I=E0= =16=97=9CX]=CE=BB=CD@P=83(=1E=CC=8C1*@=16=0E=BEK=DE=F0=A2=A0=08=DAUU=AD`=90= =1C=D5}S2=02=D9f=B2T=13=032=84=DBfI=10t_4=BD=E9=19=AC@qh=12C=0EtP=84!h! O= =08qH=FB=84P=04#=F0=04=07=EF=93=CC=0D=ACD=19=E6=F8=E0=85=84^=01=EDbP=84,=D0= =A7 [0=02=8D=C2=A7=83=1D=1D=99=07=BCl=8Bi5=DB=16=DF=A2,=D7-=86 =0CT =86=16=80= '=E6K=B9W=EBJ=80=83=A5=9C=A0=06=99.=81=14L`=83Q=01=DB=A5=FD=D1=1CU=9A=9CS= =05a=11#%=08=CC =D0=96=C5=AAc=A4G=02a=EF=1Fi=90=9C=99=C5nG=E6fsxy=B0=EEY=F9=1Bv_U=01=0C=84= c=83 =FC=FA=058=F8=01=A6=C9;=CC[=DBL5=93‾=96=C9=C7=C5=05),! =C7=CA=81=82U= =833=16=B0d=0DJ=00l=B8=83P=A7=19=B6@G=A6A-=A0}`y=1E=EC`=9E=E2Z=C1x=01=86!= =9D=E3Z=E7=A4=CB=F5 =96 =84=A4=BF=9A)*I=FDea=9DA=0D.=9D=E9Sq=FA=A6=BER=03= )=10=08'=E0,=16=D9=A8=11k =C4=06R=FA=FB=01=11=B2=95=10=19=0CQ=9F=E8C#k=F2= M=F66=F3rU(x=89=0Cg=A8=82=17=8Ca=07=BE=BA=E3o@=04=03=A1=9F=BD=B5=EBf=CC=0E= wD=1F=B9=E5=C0gG(=82=10.=B3=83*8=EB=05W=88A=1B )=E6M=02=D77J=85N=86=C0=0C=90=90=08=E0=0C =D4=DCY(W=11=B0=C0Z-!=C9=DD=11i= =CC=C7=0E=FC=93=E5=1D=CB=0D=C8A=C4$=8BiX=DD=0B=81U=87`em=DA =0B8=C1d=94U=0C= =DC=CB=F7T=C6=D9=FCI=DF=0CX=1F=8F=F0=84=9CP=0D=0Ct=A5=BB=B5=07]j=08=0D=1C= =81=E7=AD=CC ¥_=99H=11oD=C6@(=89G=D8=00=18=10=93=0C4=81=0B=DC=CD=0C,=A0df= c=0B=95 yF=E6MR=E6=A5pNW=88=80 |=05 =04Fc,=0C=0BL=1Ba=F1=17}=F6Nex=C1[=F8=00=11<=1C=10=84=D8=DCM=06=8FP=01= =15=FC=94=3DU%>=DA=A6S=05#`=B0=C0=D9=18A=1E=F4=88=94=94=01pjH=0D(=06 =84=E1=0C=E0=80=D6lO=8F=E0_=0B=88=C4=9D=BD=99=E7=C5=C4=8A=A9=0C=8E=EDH=84= &=CBI8=84@p[Q$=07=0DDR4=A2=0Cy=8E=8E =A4=E7S=A0=90=8E=C6=DEz=82=E3*=B9=C0W=B0=00=10=B4=80O=F5=91=89=DD=92 =A0=00= =F8=B1=95 =AC =D3lXaM=81=19 =01=10=04=01}d=C1=0F=AC=17a=A0 =0Cj=1C=ADXe=83J=9Fv=FC=F9= =85O=10=01=10=C4=C0=0F=FC=05=0E=E4=E3=0CU=DD=B70=C9=0DL=81=17"!=AA=E8 4=E6= =C9=99=C4=CA=A9=0D=01=8Cb'F=E4=C8HH=13=0C=1C=1D=8E=BA$=90f=A3 =EC=1A=A3=EA= =A8=90=82=10N=ED=A4=08x=D7=0B1=8C=A6Q=86=0E@=81=9C8=01=A1=A9=00=DC=E9]=0C= =E0=95=C1=0D=01=144=C1=12=1C=81=10=E4@=12=FD=0E=0C=F6=00=C0=CD&=99b=A8=99= =EE=C5=14pH =04=01o=96=CF=89=E6=C5=8Ar=08 =AC=A3B=91=91=9B`=07j=B0=96L=94=0E=9F=8A=07*=C6=C4=0B]=D1=87=FCQ5=DA=00GH= =E1j=9DG=0D¥=A4=A2*=1D=A4>ELz=ABzJ*{z=05Y=EE=CF=91=9D=00=13=08A=AC=C0=C0=0F= =0CA=15=D4¥=0D =A3=C3=10=1E=98=B2=A5=E5=0DA=13H=81=B1=DC@=12=F8N=D1=08=C1N=C8=E6=82=DA=A0= m=EAix=A5=C8=F60=01=DE=E9E=FFD=E7 =FCtK=F8,=81=B8LAZ=16=90=BB9=C4=82mS=0C= (U=FF0k=86=F8=8D=9D=CC=80=10=B4=CDw=AA=C4=F7q=EC=14nK=88=C1=C0=05)=A6=E8=85= k=7F=F0@=CCN=CA=B8^=85=93=F1@=FE=A1=00=0B=A0=C5T=F4=00 =AC=80=0E=A8=80=AE= =84=E1=99=04=E1=10B=E8=DA=ADc=B3=08=01=B7=B4=E5=0E=84=81D=F6=80=EFT=01=9C= =F0=00=10=C0=00=13=94=DB=AC:=1F=83=C6=90=C3>=EC=ACl^=ED=88=19=C7=E6)=D8=86= - =B0=A2=C4=F1=00=0B&${D=9EW2=04=0DH=C9{}l[=F8=00=DA=92=C7q=04=81=BD=80=A8=B8= =04F=B1=A0=816=F5KL=F4=C0=CB=E6(=CD>=C5=0C(=EE+=D9lV=A4@ =BC'f=BA=E7N=12=8C= =0C=8C=80=BA=CC=80=D0=D6`_=B0=80=12=1E=9B=D4=C0=80=12=A4=13=1C=D5@=B5=E0L= a=F0=D0=D8$=16=0D=18=C1o=F8=00=D6R=18=AD=DAL=BB=01'=DA=FC=E6=C9=86=0Cd @A=16=E8=C0 =AC=1B=EE=86=ECL=B8=00=91=D1=80 <=81=0D=F0=8B=F0=84=D4A=08=CD=D1=C4=97w=C0=A9=F0=AE=E8=F4=C5=A5=F0yG=C5=98= =C6=89=B8=C0=0F¥=C1=12D=C7=0E=C8N‾1=C1 P=DB=AB5=EES$=A9=B7>n=80=F0=A4=C8=FC= =E4W=90=CD=DAu.c=C8=00=13=90=98=BDi=929=91M=18=DE=80=1E¥=D1=CB=14=C1=F9=0C= ,=C1=0EZ=87=AC=80=A3=EC=05=F5=E6=AE=0C)F =FC=06=10=05/=F5=F2EaxS=B8YT =FC@c=C8=C0=9A4=D3=8E =81v=8D=87 0p=C0=C0D=F6JF =C4=E1=0D=D4I =AC=14=81N=CB=0E=B8=00=0E=84S=0E=E8¥=FA>=05 HfM=B5=EF=E6p y=05Z=B4=16=7FuH=84=A6@=12=18=0EI=14=DF=BC=DC=C0=0FPA=84=CE= =C0=11=88f‾=1A=B0=CB=F4=C5=F5=F9=EA]=94=F0=F0=96=C8e=00=11$=FCU=D6=16=EBI= =E0=CCK =05=A3=CC=D0=0Cx=81=0E(=81=8D=E0=911=E1nC9lL=C4Y=8FL=94]=C6=84=0C= (=E2N0=02=DC =84=96=8D'=0E=BF=94=B8=F6p=A54=19=A5z=C5=F5=F0=00=16=3D=A5=EBP=15=D8E=10=E1= dD=0E=84=A6F¥=11X=1DY=FD=D2=CA=9A=B9=F0H=9CA=99=DE-=05o=08=D85=8Apjq =DB = =8B=94i=ADP=C6[T=CB=DE(+=DA=C6=DC=8A=B6=C0=15=10=01=1A R=8A=B5=05w=FD=91=97= =B1=80=0E=90=C1N=D0=92C=3D=A0 =FF=967=16rp=1D=B2{F=EE=85=A4M=11x=07=9A=1A= =13=C6 =05=C6=AE=CB=1A=A9@‾i2=99=A6=C0=11=CCPYy=17(o1=B0=96=C8=F5=15U,3=F0= Zt=81=0D4=E7S=9A=C6=EDT=AB=E2=9C1=D8=BA!=AA=D4=C0m=F1=A9 =D9%=0B=1C=01CP=B2= =DD@=91=86=06A,=BD@=E2 r=CD=C5&s=C7=1C=F2*U=AA=82pS=97=D5=EA=CB=CA=D2=0B=EC@=0C=AC=11=15W=B1=CD=A8= =0B[=1D=07=0E=0C=A45=A2=F38sq=F5ip=EB *=C3q=C8NT=E2L=C7I=A8=86=D1$=AB=CA= =B4d!9*=8D=81=ED =AC=88B=02=11=0BpA=13`=9EET=04!=C9=E4A=E3dB=A7=D2B;=99{N= =C5=84=08=12YrH[@=85=13=BC=14r=AE=00=10=04=96=82=D2=AE=87=C8=C0"=B3=D1=11= =80=C6=0D=FC=1AM8=DE)=8B=F4=C1=A6=8E=0D=FC@=0BA=A7=F0=E2=18=0Ex=AC=9D=F8=84= =D6=10=04=19=F5@=10=DC(=AA=CCt=AE=05L=13=F0=CD=1B=EEmRM=1F=0C=80=C4=D9=08= f=02N=A0 =1B=B5=E6=04=04=00;=FF= --horsespit And this is the trailing text! --horsespit-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.46.msg ================================================ X-Andrew-Authenticated-As: 0;bambam.sins;The Root of All Evil Return-Path: Received: from dimacs.rutgers.edu by thumper.bellcore.com (4.1/4.7) id for andrew; Sat, 26 Oct 91 03:16:34 EDT Received: by dimacs.rutgers.edu (5.59/SMI4.0/RU1.4/3.08) id AA04574; Sat, 26 Oct 91 00:44:07 EDT Received: from akbar.cac.washington.edu by dimacs.rutgers.edu (5.59/SMI4.0/RU1.4/3.08) id AA04551; Sat, 26 Oct 91 00:43:54 EDT Received: from Ikkoku-Kan.Panda.COM by akbar.cac.washington.edu (5.65/UW-NDC Revision: 2.23 ) id AA11903; Fri, 25 Oct 91 21:41:39 -0700 Received: from localhost by Ikkoku-Kan.Panda.COM (NeXT-1.0 (From Sendmail 5.52)/UW-NDC Revision: 2.22 ) id AA02327; Fri, 25 Oct 91 21:41:28 PDT Date: Fri, 25 Oct 1991 21:39:38 -0700 (PDT) From: Mark Crispin Sender: Mark Crispin Subject: re: more content-charset stuff To: Keld J|rn Simonsen Cc: Neil.Katin@eng.sun.com, ietf-822@dimacs.rutgers.edu In-Reply-To: <9110251926.AA11580@dkuug.dk> Message-Id: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED;boundary="16816888-2078917053-688452093:#2321" --16816888-2078917053-688452093:#2321 Content-Type: TEXT/plain; charset=US-ASCII On Fri, 25 Oct 91 20:26:56 +0100, Keld J|rn Simonsen wrote: > One advantage of having a separate content-charset: header is that > you are not restricted in the characters to use in the charset > name. There are no meta character restrictions. I don't understand this. Parameters can use quoted strings. I would like to see the quoting apply to the value of an attribute/value pair rather than to the entire parameter, but that's syntactical sugar. --16816888-2078917053-688452093:#2321 Content-Type: AUDIO/basic Content-Transfer-Encoding: BASE64 Content-Description: voice mail LnNuZAAAABwAAXAAAAAAAQAAH0wAAAABAAAAAPv/cnN3dG9vdG5zdnl5+fb2 /Hx6/fV+d3n/+O72/fP8/nVvbmZsbHRyb313eXlwd3BubXb2+vHs6evu8/f/ cHtzbG1re3l1c3p7cf37/v59+/1+/fz49vt7dHtucvpsaG96e3Vzb3n48e7m 6O7093Vue3pzbWxyam95ef56eXNubG18fnd0d3pzdnn/fH398u/7+vj58Xl4 fHd5cm9wdG5sfHh5/Hx8cf/z+PX+/v3++fn2eXT/dWx2e3Z8+f99b2tvbHF2 dXz8//rv9v/+/Pb8en58fP78eXtxcHttbX3y7+/t9Pn5/XVsamVpam9udf97 /fx6c3Rua21qbXJ49/X56ev7/Pry8/p8/P18/u3r8fr9e2xpZmBmbG51fH73 7fZ99n7+e3Z9dXh++fz6+3Nsc2tkaWdqbXZ2cv9+e3z//vr28vjv7Pj8//X8 +/h4evz5+3l6+nZ1e31+cnv2cX7+cnJ0cnJ9e3J2fn52dW5tcXn+e/99e3Ry bGpvbnD8+/b47e309v389vL0dnh2Z2ptbWtz+Hn57evyffb/cnl5/vn28Ovm 7fT9dGxnZmRmaWpta3Fvdn3/+Xp5+f1zcnZufe/y9/fz+nV6fHRvbm1sb21t ePX6+Ozy/3z6+nz+fn12en17+P9vdnpvbX18d3d++3J7/Xz29/fz7/d+/fn/ dXF4cXB1dm1tdXZ9enx9ev97cW14e37z8/b49Px1dnpqa3N8d3n5fv99dnNw cnJweHVv/ff38unj5unxend4a21uZWVpbHBvcnz/d/fzfHv8eXN2cXh5eHd8 9O/s7/p9bmttamVmbXD36ubi5+rr7vpxaWtpaWtrbW54/XZxfv338O/3/Phv b/t2c3l9fXF89fp99vD693x+fnJtanNtam5x/nn97/H2/f36cHL5/P/3/3Z3 ev/+eW9pbG1qa3V4/evzeXZsamdpaW727evs6+r7en1uam56+Pr5+v99a2ls bW91++/28/B6dHl4/H399vzveXNwbWtnef37/PPq8fXv+n5ubHV9/nb07378 9fhyZ2xpYmZtdn7/9vN9bGxubnF1/O3h6Ofs/f52c2toanJtbnNtc21ucn35 ++/p9HV7+Hhsam9ueH737Pbt5/R9bmRkZ2JkbWxuePPu7OXn4uz57/j8cnX3 eW1wen758/T9b3N0ZmFnZm51evt++/n5eXVxe3dwenn47e3r9v92aG1vam53 fe7s9Pj09fj4c3J6dW5uc359fXdrb3Nramx4ef759e74+3pyeHp++/Hs6ebr 8P94eGtkZWhramltbXF3/vT3/X56fHxzc2xx/3377+vv+Xx4amp2a2Zqefz4 93f78fPx+fD8+PHz8f37+fnw8/97bmtnZmdqbnT9+Pz5/H53d3p7eHltbHd3 c3J5fvbu6+30e29sa2djX2Zvdf30/Pf67uz27O3v9fn1+Xtycm9xcXV0c3Z5 +nNxaG57dHJ1+fHx7u3z9P13bnF4fHhua2lubmx4cnN0cHv4+e/n5ub0fXlv b3V3/vv7+X59c3p1dHBseG5z/Pz0fn58bm5vc3Z1ffbv6+78+nNmbnJxbm93 b3J1cnNscn326ezu7v9vcHRqZ299+vn28f38d215cXN6//7+9/n2+/7w8e/p /Pj6dHh1cmxuanF7b3v//n51a2prb3Z1fnv+/P39/fR3bXFtcm1weG1v8u/v 7vr+/Hn6/X56bnR0dH77fP737en6eHp1bW1vbHNsbXn4+vnzenVtbmpobv/2 9eXk6O5+fWtnY2Nod/n67PX+7+/+b255+PL2/nJ7fHd87/p7/H11bWxua2dq bHNycH3v/X37/fL4fPn7b29zcHjv7vL2+Pft+25sbW9vdnVta25tbnP+8/72 7/L4e3RtcWxtbWltevr38fz47vn58/l+fP95eH337+nm9vn8bmtraWVqdHlu b3t3c3h0anV6c3b+/Xzy7+zt7+17ev9zbm1pbnNwc3jv6/b58vr8+Ptyb3N1 fX54fvP9/XhycHh3bmhmaWp8fXd+/fT38vR0e3Ntfm589fvzfvb2bXV7b25v dm5ub374+Pb99+nq+X1+dXj6e//9fXh9+XxsaGJja2tsbHP//Pz09Ozl8/b2 8PxveHh5fvxxbnl7c2xrb3h1cH7x/P15/+7u9375/u/3dvd4+HlvbmpyZmtx anb//vZ/ef39+3ZzfG968vxvfPt6fXRv/nNucnT+e3xxd/v++3tud+/4/f18 9v34+3j8fXB2dXRtbvv/+f99//n9bmxzeHH/8uvj7fzy9+90ZGdob2VjcnJ8 dWpqdf79/nF4fP/z+/nu9fjp4+74+vr6cWtrbnRyanV5cnx8eXb++v5sc31u cnNudHp+9fl9bnv0e3RubG94eG9zc+7u++3v+Pnt8ftvdXRqdvL18O3tfHF2 ZmRnbHFobnFv9+977er5eHb/dm9tcX7+eXn26u52+vt5/3lraHp9ff/2e3d9 evpvd3N0/m1+dft6dvj/9nF6a2x6cnRwfHP35u379nl9+2xncXRvem/6+fr5 9+fyeHt4fn199/r6c2z67fBuc3lnc3t8/nhxa2ttZm53b/r8dHl79un9fOz2 +vx0eXn/ffvz/35qa2pnZF5ld/f16t7j7v11dv/weWtv/vH99Pd7aWNkZWxt cPzu/nfu9X1+d3p2bnH4+eXvffx28/37b217bXRs/3xrbm18+/r89u3q/G1y dXNvcnV6fHp46+1zem9ub21wffZ8dG158v1z8u17eXb+7+9+cHpzcnFxb2t4 ev5ucHRt83p0fP3i3+Xx+Xr/e2dpbn19c3J3cWJsbmt3ZfjyeX5udnZ1ff7v 7/J7+/f++3t59fFuefx6+XT98XFrdP5tZ2ZwfHL+dfHpfuvx9epz9ex8/25i cvlxbHJ6/vl1bnf+7/xzfvdzbW959nJofH519/T88u/8a2tvcm968O7s93D0 7HRnbW9sampz/vn26vp2bmd+/mdeYHR9+nh87Ozs9Pl5/fh4end5fP/0/Pxn aH1u/HRob3Lz7P76+/3t+Pff7G7/6vVzc338a2hsdnVqc310bW569ftrcGl2 /m5xbPHp+Pr37OLr+Ht89GRecn10aGByfmpmc+/ueHHy6ft2bX7l7XJscXds ZnVwbnz/3+j77+7q+m1rcHZ8fXr++/t7bnBubWdnb3dpaPvveHFyc31v8e/2 5+/u6uPl+Xx3e2pcYW1zbWz67u3t9PpucHRufHZtbvzs7n10dvTpenH19n5m aflvZ2NzbmZtbv1van7r4/Tq3+3vd3v7dXhqZnx4bmtr//z8/nt7enFy9/P8 ann0e/5te+vs7fl6bnNvamZuc2xse/f3enbx9fzx/G9uefpva3Zz/O/9Zm3r d296+/f/eXV+b3Rsfuv7+fn0/P/69ezp+Xt+dHRwdX31/HVra3BpaGp59m92 d3H6c29ze+l2anz3/WdteGxtcvb8e+/o7PPs6fn393VydPfvdW5663ptfWpk ZmpoY2Vtef76/vbv5eTu9Gtp8vtveXh49/Pz7f9v/3lva2Jpdm5nc+z+dPXx +H1ydfz4eH3n9Hn/ePT9bmNhcXl0bm3+/nL47vH1+Pbr83FtdP9vc235fm12 bXt6b21z+vpxe+b4fv9yfGxldnP06v/07+zy9/9naWpiZHR4evrq5erv9vDs 92hqfvpzcfz59v58dGtrZ2Rjc2dhe/x+c3Pue3V+d/Dz8/f37vX9/fHrdWxt c/9zaWh+/WdrcGtuePvy9PX88Ovzc3nx9Pj//nnt7m5rbnV1aWpobnv6+Hl9 ev78a3F2+O31/HN17/5wb3v4dW5wfm9s7ezy8v376/RsbXN+fnb38Xp2+Xpu dmZpbWJnamt6bW/06+zw7vf5/W9wcXR9efPv9e34eW50a11rbGn5fHLv6PL+ 8+/wfXt9dG5tdHh7c/rq7PV9efX4bG1raGloavn5fvPy5uvt7nv2dnBtZmtr aXJzdWxq+/l8/3Jy+nN2dW977efp6eTp4e11dWhvbGNjXmhveP38fO7s+vbt /nV6b/j8bHl8/fJ2b29taGNoaGlgX3v17/Dt4+1++ntxe3r8dnl+9ufp5+/7 fGtta2t2d/z3cXFxbm9qcHN5/fbt6+j6+/J3d3Zpa2ttbnL98vh38/1ueW16 c2/z/nn75+v8c29vcmpp/n14fvn2fP338//8/nR2dHxvbX3v7/fxbmRqam1v /HZv+vr2ev3p9/h7bnJzcG9ya2Vue3Nuc3L97Ozq83Z+/XVnYmptcnR97+jn 5OP4e3xv+fNtfPT8+f1ye/ZyeP5ubW90aWRtef7v7O3t9/p5aWdtcWpqePT0 9fH+8P1xb2xpYGlucv727ejj5urwc3N1c21kbXVr//1yev52cn73eHL//W1u d3d4ev/t7v/08f94fPduav97cWxpaGRzd3N7/+7y9f/9+XJveXx99un1+O7/ 7fZxb21tbXxye/l7/Pv2/G12ff77cG99dXzx+Hb+9n1zbm9saWx5/25sb/30 evft8ff2/XZ2d/z8cm91fX18/P14fH5vdnhseHJmaHF0+vX88/L09fTz7/50 9nlmbnxvbXVqbHhvcXF27unh7fnx/v/9+u/u+Prwc2ltbXFtbW9ramZsb2Zu cHj7eHv+/Xj87f38fvjv7ezz7fF2d2xpbm9vcm1yfXFv7+Xo7PV4b3Rrbnhr cXX3+Xn8+3tweW5rcnr/ev76dHn/dvbm6vLy9P98a3FtZ3Vvb3d4/nBsfnp9 9f94/3xvem1qdP/v7Obp6u10cm5maWdobWtx/e/y9/j582xu+37+e/r46OXv 8HhsZmNgW11lbHr48+/t5uXt/X17cXp2eP3v+nz3fvl9/nFpbWpqdXRubHH9 dv759/Ls6nx5/nN2dG5tbHZ6fvt9/Xv1em50d3R69f388O/u+/z1fX17dHJ3 //9+dntze3RnZGxuc254b2l5bW56+Pb14+Lr7O/+eXtqZGRmbXp6+vTt8fj3 +Hx4/XZqa277+Pry+fHt7/RvZFxdZ2x4fO/zdv92dWl2+XL07unu9PP++3l9 dW1vcHf9fHB3/Pl6/fd3eX14dP35cW98enL29XT37fPz7v91dWtnZ2Zrbmx3 cXJu//jz5ebp7/L8fH17cnB6c3BsaWRrbnj+/3htb290ePv1+vv5/3V7eHN7 +3r37e9+cHV4b290dXp+/fTy8/L07ezv9vHv/f53ZGBoZGt6+/L29nltamln bfx0bfR6dH3/ffz49fb89fjv7Pxwbm5pa25sbGlw9e3s5+Xq8vxveHJoeHN0 9/3udGpsaW1lbXFqa3B9+fn88uvu8P9yb2luc3F8+O7u8e/7dXBrZWdtb25v +PT17u7r9fjv9+/yeXR5eP92fnhybWptb3Bydfn9fv3/eGtzdG3/+nz57PP2 7312en1yaGlrb3F2/+/s9fb5/3lsam1rb3v4+/Di7fT7/nRqbWp29fb/df56 cXRoZm14/3zv8ff8dff8/Hl0dmtnX2hob358+Pz7fn37fvju7/L47u3v7Pz6 9X79+/9ycW9pbmhmb292cXh+ePxzd/598Xhsb25tbHJ1c293/fX2//r7/f1+ +e/t5uzw7Ofl93t2fvv79fXu7u709vp2bmpfW1tVU1RRUlFVVVhdWl9jdP3z 6urf29jY1tLP0dDPz87Pz87P0s/Oz8/V2NzkdVpPR0A7ODUzMjI1ODxCTFn5 1czKxsPBv8HCxMTDxMTFxMPCwcHExcPGycrM0tnra1NJRT04My8sKysrLC80 OkVa8M/AvLq6ubu7ur2/v8LExcbGx8rJx8fExsXExMPGyc7Y9lFKRDo0Lywp KSknKi4yOUVX6ce8u7q4ubq5u77BwcbKycjIx8XDwsC+vr28vb6+wMfTa1VM PDMuKicmJiUnKy0xPEhZ0r+9u7i5ure3uru6vL6+vb69vb29vby8vb6/w8jO 5VNGSDswLiomJCYjIyktMD1VX9a5tbeztLi2sbe8uLq8u7y+vbq8vb+/v8TE xMzR0mxGRkQ0LiwnIyQkISUrLjRK7tW7sbKzsbW4tbW9wLy9vLu7vbq3uby+ vL7AwMXM1mFEREEzLSsmIiIiICQrLzVO4c+5sbW2s7e9ure8v76+u7e3urm1 tbi6ubm5vL7H3k5NTDYtKSUjHx0bIC8rLWXdwau1vq6wvMLUx7rDacyyt7iv sq+orrerrLOuvj4oPNkbGjEZHUUZGk7Ewuaxq6ydtzTIzSslKzBC6krMoKKl nZ6bm6esqbPA2i0TEOgfBx4cGaZAJKKWlKewnsW+yxMYSCAaLH66paS1mZWn o6uvo67DtrTGQxIITOAHFhwalagmppiQn12vMTazEA8sKDxDsJ6VlKiena6u RUOoqbe0vicLE6kTCykQOpHHVKCVlLWxQBLF1AsdNCdurqidjZiun6qyyC36 pKWuux8HH54PEx8OpJTWXD6SkLWnGxelRBAVHjvBpamokJSauDOpvtGnq6i0 YwwFzE4TMg4ZlJWfJzmPmJ4yCy+eVBoRGzWfn8ScnZaXRKyp9p6luN0PAx/q ESccF5ucn8A7mJ2brBMvsza1LhIsxLmtp8Cila+vqqefrrUjAwktESI+Dk2Y jpc03F6bjSAQHzGWjy4VMaSQlTgdt5+coLyiq7UdAQ0WFaQXDD+0jJa/JSeO lC4ZFUGTljwfJqGLlMZPXLSTpbusKhYZIhAZJgse+7yX0SYksI66KRkel5Cv RiFJi4/NvEY+kJOnozAME8EgMisGF7yfpVYhELOaNUgYGqSfnMcezI+KkqIt SpGdozUFDyxElVIQEyKalrgXCR06rZwxJNW/mZwfLsSdiJCuq5qdoiQFDBfH kkMyLC2boVwYCg4ZxEglu1mijq3Cr7SVkJuhpKpKFhUYF7DMJKrPrZi0dh0N DBsiH8s9PZ2em5upo5qSnKavHQ4eKyKoriPIQVOUn7A7GBMaNiQtRBtFVM2M j5OToaKtMwkIFxqbkyxAvruSl90kFRc/nJ2uRRkVHzSpn5qQmZuuGQYLFh61 3SmdlZSMnb4mDxMpvqaWm7GmLifES6iiuLksDQgUFT68GS1ArYiMlKgaFCJf qZ+rtpeTmZ6ur/tBJQsHDxUwrtM3MCRIpqSgstTNWL7hbj7HnJuPkJmcrTwM BAsPMbPaqLDpoKU4JhwZPMvfr6msmJijnZubobMlCggKFE1CSLo5qZCcpmQY IzkuMjk0rpGSjpCZmaw5EAYIECAiPqm3lY+vvzMdLj0rLTwrxpmWjI+ZmrEv GQsHFRgYLjOujI6bnjUmdEUhHBkfe6mOjJKSnLosEwoQIhkZJzCcjZWZtkmu rkEZDxMtspeNkpafViYNChQWHCxEpYyNl5r3Pc1EPzAZHStDnZKWnsIzJh4i GA0SGi+hk5KRmJucsi4ZDxIt3KGVl5utSBkNFh0bHiYwrJWZkpmjmaewPR8g LU3DrqOiu08nFBQYERMbI9OpnJCPj5CZpfYbDxghwpiana5dKRYaGBUaGyvE rKKanJmPlpymSjkrHjBru67lTTEgHRcODhYcN9+znJaNi5GYqk89QDs5N+qr r62/MygXDxATFh0pSa2ckIuNkpmudSsbHh8uvLKnn6qw2ygXEg8TGiBOspeM j5ScrLhaMCQcHCAqPrGko6GxyugvKB8ZGyEzvJ+am6CqvUtGMy4wKC1prqKh rtDdT0c+KigrMGfGta65tsDizVA0KCAhL+irnaGors/xUT04Mjc+R37b3r64 yvg5KCsrLT5Svqijpaq3xMzpUkZL3sPB0z01OjRBV0Q5LygoPcyyq6mssbS5 5UI5MDvov7KqsbveODYoKC0pMDhiu7eurLCtr8pVPTY7Tk5jyL+0utN3Q0JB NS4yOEfRwLWztLLJbzgrLi875r21rKu6z0o0ODo7Xsy4sb/mSUzWwcdhPzo5 Ly42P82vrquuvMw/MDhJaM7L2sO2utZWOjI8Qj44OTdC0r+vqq+6/To8Qk/Z 0szCt7K1vXs/LywqLDU0OEVvu7GtrLfBzdvdd1FDYtTEsrjB5EhBNTIuJyk1 TcnAxcPBub3IyM3Iw8TQ/G7fc3fX0ch6PDEsLjxT3tdh+9K/ucjdVkdPeczK yc/ZwsXI105NR0VIPURTX+ts78/M029aTV3X1tZrWGBy2N/i2fZmXF1WWGZY XX3OvL7VW0xLSlvU0sW7xs5WOzk7Qk/81c/kXllLTFzu5s/GzMvdd2JT+MK2 tsFYOjQ1Okfv1szMd1tYUltlXltx5efi+dnDvLm9xehHQj46QFDuzM1zTkpJ XdPPztLpZVRQT2XbzL/C2P5WS09MTFln3szM6lpOTm16YWRo1MjLzt3fzcbP 7k49NjE1P1Xj1tPLxb/E0dt6YnDb1dLEytXiXldZXFJGPjw+SE5VcNHExMra bVZMYt/Sxr+8vsjfXk9IRD8+RUtQVUdL+c7CyN96XXLe5fppXezKzMjHz9bn Xk5KRUpMUm/w1tDa5t/h725ZWFhofnh5ZmL06X3zX1htdXt+cO/Vzc7d+2lY Wnfj5vZiUlxi9PFtXlNbd+/r4OTh3/RsZ27l3N7va+7f4uFuYlpaaWBfWFVe Yf7fz83a4WBTVFFebXj08fppWlf93tzU3Ot+aO7e3+NyZ/Tk3vFhUU5fd3tq X2ls/+Xn8/5sXFlo59vT0+Tg3+rg62hUUllgbV1YXF983tzk9vfl4Oj1cmlo ZGBdaOnRydb5X01OUVprdePa19bg8mVbXF9dc9v+XV1TXu7dzNFjV1tHTl3t 08vOy87R1v9cSklPT93jePVeXmr9e+rwZX5qfGJTbd7k79fEzMzQ3l5QSEdJ Rk9j39HW0d/x/GRrYFVX49zi2drV2dtfSmdcWGtZSXnu5t3l4N/b121lVlpx 63BTVdzO2u/lXlhUV93R1dzuW1pcU1lZZuzg2dPkdlxPU2bu2tvo9v9kVFRW X+rb09vTy87ZdFlWV11lef5zXV1eWFVOVWdy6uTf39fV1uLc2Oju++rc29zl 19LS2eDucGpZQTo4NzUvLjZATFzkv7Wzt7y6tLGurq+ur7K0vEEmLiopJxkc KjE+SD2wpKaou8W4aUlBPFFYVb+0r6mrpaSsrbW7TSQqJiEhFRQhKC5DN66b m5qiqqa6QSkiKCwsNlPFq6uinJydoKaruyweJhwfGQ4WISY9PnKZlJWZpqKh xjQeGh8gHixBwaesn5qZmJ2jp7PkIhggHBsTDRgnKUJXtpOQlJifn6ZdJx0Z GxsdMUy5qKeblZeZnaOqu907GhMZExYSDx4pNsa/pI+OkZafnqtHJxsZGRke Mt2tqKKXlpuiqq27bTcvHxEVFRchGB0vQLWmrJiPkZKcoafEOyEYFxkZJTNc rKqdmZ6gqrO4bzw8PDMbGCUnLB8ZKEdVusmplZSWm6Slr2ouHRYXGR4uQcKr n5udoqipsL9+RVbnPyEjKCksHBslL0J7dqqalpadoqi5WSgdGRkdJTFhuK2g naClqrCwyE1IWcdnKiwxLzYfGSAqOGxStJ6cm5+oqb5NLSEhIiIrPVe6r6yl p6izzNr/anzcwK+0TzxKPDUjGx8tLjg926urqayvrbtjSj48Oi4+2M/E08my u2lGSczBc8+2rqeuyWpaQjImIictLjE8S8zBxMjJwcLFydHd287O2P3y4exb Q0hUXN/Pv7OvsrW4v1Y1NjpEPTZA68zYU0NKPjQuMUhUWXzbv7zDxca/w2JP W2lvWVrJure1uLu9ytXZ8+fk3s3f4t5XPzEsLC8vLzM+a97Z182/yvZMQURG SGLUv7i2sq+yucDExN3h18/Q5fv1/2VMPT5BPTc2PVBvX1Vn4/NSSERBPzw+ SVdk58i7uLm+v77Bx8m/u7e+x8XN1GhHPjk1NDk+QUBKb+v9Y/vV2GZMUfPn /GHow8HZaVhf+U9OXtO/wsG8vL7NbmxZRUJBS0s+QExZYUtH/dLa8Vzgy9bi ddrHzeR2bXVnXWxqeezXyMLI0tLd71JFS1VTSkFIVVRPSU526N/s7NLP23zy 7+vxfOPg2uNwb3f34t7Z09bV1/RrYVlcdu/+73VvX1NUTU1SU1lZVF1t/+De 3tDLysnR3OBtXE5IVFlOTk5i7H7q0MS/v8HDzN5vVkxGPj0+Q0hMU2jv0snL x87Q0t/dblRXZX1sT05aZmxdbdvNzMrMzcrQ2OByW0xGREE/Rk1Ua37s3ePp 633u4eji3N7f83jv/m/s3tjX4N/b2dzy/fhva1xPTk1MTUtPXV3+6u/1bmr0 7H7z4NTR3eTd2dfh6dza3f1q/XNtZ1tcbGhcXV1fWlRZZPnqeO/i9GhVUVlb V1ll69nV1dHMy8/Z39/sal1caGpfWlxtaF9gYnZ9dXB64N3Z2N7j7fl1WVNR U2BjZG777vLz7+zv9u7u+m9pXl9nZWlhaXh+9+ja0NHX09XU2e1nWlRRUFBX Wl9u//1oaG/q5u3u6ur8c3BvaF9ZXWBcXV/629fT0s3M2Onv731gVE9aYlhV XXzudG3r2dnh7u3m6f93/PJ4XlVUWFhXX2/u7/fe1dTZ497f7G1cWVRQTFFg bv1pcOnh3Ojfz9HS197b52pbWl1aUlFaaXRtY/Hc2+H59+10W1teXmRhYnT0 7vTu4+Hj5NvX3OX7fP57YFleXl1dWl9rc3N57O/u7O3o9fp0a29vcnzx9Ovh 6Obo8X1tb2xlYmVsbWdjdu/x7vbx6P9uYGFrZWls9+rt9nNz+3d28+Ti4ujs 9X70e3RxZGRpbWVcX15iaGdod/Du9/nq3t7e5OPf6X5oYmZfXl9kevbt5efo 8e56/ntlaWdjaVtbZWNoamzv6OTh4Nzb4O/8+vN+aGBdXV9dX2/76+Ln4ePo 5u/19nZ0Zl9cWmd+eXT7+PDvfmlr+erufv95/u76dHNuY2Z3c3d8//rz+//x /HNvbWteX2Ds5HHv7ezj6vT4aH7V7XpqXnl8ZmdfXmlraGBhdfrzWGPO49zh 7eTl49zj/2tLXeFkb2RldlZizuf73mT+7l9tT1zbZOp8eNzX3ttbT87fbWdY X2xQT2bbXezI2u/q4cvU6e5UYVNCPVPafPn249vl0NDl8Fxc81FiZGB7+vn+ cfve+llla3z37t/Z4fF8bm1zZWRnXmZeXfTg697e3+v08uXw+Pxv+Ovx7O7v +GlbW1lZV1tybllkfG1vYmVkY2Bjeubd3M7FxMbCvr69xP9YVk9BNjAvNDQw Nj5KYmJezry5t7m3sbW8trOyr7G2xl5CQD8rJyQhKSgnMkrWu7q4q6y4uMJv UTs5Y05Xyr2qpaWgpLL32nEyKxoXIB0aICdLr7SrnJycnq+1xS0mKCAtKyzA sKSbmpeetLe6Qi8aDhgaEBkfL62trZaUl5iqrq81ISAcJCUgW7mompmUmqqu tGE3HQ4UGA8XHCu2sayWkJOXqKuqOiAeHCcjH1KxoJWXmqGqrd09JRcWFBAW HCRPvKybmZiZpq20RywnIi0zNcivn5WYobCtsEgtGhcfFhAbITXC06uZnp+s vKleJicsPEs4t5+dlZmgrbi8PisZExkVFh4qP7Wso5yip7/OyzUlISo8Tdum mpaTmqSwtdEwHxEUGRIZJzu3paabmq2trvg2JBsnKidJu56UlZaerKm+NisW ERoRFicqyKanl5iqn6i72iMcJiEmOGqgmJmbrrKo6jwlExsdEBwrNa2ur5id n5ytqsIqKyomOTrkoKSq5jeq5CsnFiIrFx87Qqmrupqfo5unpKw6NTwySUPP qLd9JjG4KCIaFywfHTblt6eunZefoKGhpMNGR9rMTVHFvEseJjkkIxITKx8g Lz+onquclpiZoKKhslR31ry9P27GLiAlHCAoEBkeHTQrQqutnpmelZicm6it v9a70eHmekQmJiYbHxoXHRodKy0/ybKfnJqYmJWbn6WxrbrO6VZKKiAjHx4d GRwhHSApMGHMtKWfm5uampyepKiqtLnGZT0oJCMeGxgYHBwdIytDybSmn56f n5+goqmuqqytrrvA2jswKSIfFxQXFxkfKT/KsqCam5udnp+otb3Nw7u9uru9 2UU4LCYhGhcXFxsfKkLSsaiemZmbnJ2gr8TK2M3VXedcUD8zLyklIR4eISIm LT1x0LOmnp2cnJ6kqq+6w3FdRDY2LiwvKiksKykrLTg+Nz/+xLWvqZ+jpaWo p67D3PNPQjMrLi0qJyouNTI2StPV4Na7trm6s6yyuLWvrrvC0NNeNzIvLSoo JiouMjhP2b65vrausrG1uLa7vrq8vMbW329DNy8qKywrLS43PEzbx7W1tLC3 v7u8vcPHxLu/u8rkeVBMOS4sKCkvLzA2R9m+vrawrq62wbrG0dzi3dLEzMrI 4fhPQTcuKi0rLy8yUt7KwLaxr6+xtbnE0eNiWWJp1+do1+xQTjw9PTw7MTA7 QFxr58K7tba3uLy9x+DoXllcT09WTkxfT1Za//xmUEFEVVZsUG3T09zLw73F x8zM1fdjaXFJQD1HUFtQWW3iz9/Z3t74Sl5ZQ01Pz8PIysfMxcrU21VNTj9L QD9QYnbY1s/N2c3PZ09HUVFbWtzd4NDNys3KxdpnXFdJRUFMTlNVXO3W4m7f 7fRjZfdo2+Pr2t7r2+Xj5m7e7m30aVloaGZcZV1xYk1PXWxcYnjczdnMzNXs bGt7a1Vgc97YbXLY0txzafhoT0lFSUpHWNXSyszOxtTj9Ftd+VNQa2xuaG/Q 1NfW1ORyUkZWT05LTnPc2uLVy9Tz+NTrcFZQZl9SWV7o1NHS52vu/1tfX2N1 a2NfW9/p6+bj79L4b+dmdV5VXFhg915kdF3o6uHZ7d/W53jkbvdqXuvm+l9t YvbrePRnb+9mVFpdX15Xefbl1/3UzeLf4ure42f/YOpeXGL6amdhYWtWXllY cVZX99713+Dq1W3c29ja3Obp3Wjtc+vdYlxXX1hVT1NfVGBm9vLW5tvr3uzv bPxmX1Ve/H3a3djU1PbjbuxXWldLT05qbOT9c9zb/vt3Z2VUU2JcfOrc0NPO 0M3Nztjt4G9dT0tVWVpWbGZu/2vb8H7wYvfxXl5lXF9qY3vsfurf5dbb39PY 4uj5YWZYU1ZRXGBaZXt76vfw+//z7v9tX25lau3m3tfU3Nzn/np3YFxWVFNR WWBja/713uHe4ujv+GlocPfr5t7e3+jZ3e79a2taSEJOaP516evbyMnJ3kZN ZetUX0xhzNPL4tfTysvn/1ZgVUlBPj9GT1RUWFzr2tPX28/N0Nbk5Ojl3tzn fe7l3eV3cnrydHLl4upsWE5JTE5NTklPbOvr3tLNx8jKz9LZ+11LREFFTExQ eN3a1cvGyMvT3+blflVcW1FVZf3+4evs7fVbTlNVU1VTT1xt9+faz9PVztjm 1ubvdH1u83ViUk/x3/FqZ2f15WBLREFESltedtXDurvHxr27wNF2aG5cTUdD P0NNUU9Y+9/vfltX+et6ZGRbV19kffPq2tbU1dnS19xkXFhOUVBXVlhfbvTW z8/S1t3q+PR07/l3/Ore3ub2enBza2trbGdqZmRjcvPu6f11bG12YFtbYnF+ b2327+/68+Z5aXNlWlFQVVFUVVljfebe0s3Ly83KzNDV2NrU09HLycXM5fV+ U0Y9ODYyMC8vMjk+RE56yr+9vLy5u7y8u7i1tLW1tLe9xcbQZ0k8NjEtKicn KSwvNTxO3cjAxMHAw8TMz9XOzM3HvrevrKirsa2stctLPzYsKB0aHSQnKCwx c7mvuL6vsa+72vXfwGdNYd+7saysp6CmrauvxF86LyckHxcXHCEjLDM/uqmm r62qsKu7c03mzkFKTGS8sq6yqKCjqrS1vOs8KichHxwXFx0pL0FG062inqyr rK+qv+Y/YMNZTzxMzrm6276wq6u/ZMO8XDIlJiQmJhocLUZrzsu7pZ2gs6+v uLDOPzJJ8jg6MDZS2ehD3bmvqa7OxKq17jgvMSw2JBwpQVZqxXe4pqevzbLN z71ANi9TPC44LTtR1PZusKumoKa2raW47Dg1LisyHx0rPT1w10K8rau/17tH xsM7NTNTMzg7LT1hxfPCrayinp+rs6euvlgzLysyKh4fKzg+XjtLwbOux7xE ScgyNx8hPTrL572tnpmjm5qbnLoZF7QkISMLQ6++6DOxpZbJI07HxPElFc28 PNwwXGyvMS+qLqyvcJyosqacpae3FQ1JLxQ/FTqOur+6sqOfQBRBzDNEHR6g qTC23rqpPyE0rDG2vT2UrcGcqJ+oLgsXqhYpNRSPmX6sV8KjvBEf4Ta2Lhmr l0G3zy+gSiEvNzt7tEacnMyZo6adwS0MGNoXLykmj6W+qke9qkYaML5Ccykd qa8r6S19riguPEe3t760m5+nnKqfoL4pCxvUGGAqKI+r1tsvV6w2GUzJ5tMl Jaa+LGwxvLAvPjnwt7+8sZmnq56sm6S+Jwkf2BhAIDWQtldPM9mpNBzDu01b HimqQi3a16nJI11U17ZEtJ6drK6on5qqsDwKE78VNUgYlZ40dDFqo/IbXq81 ZiIeqsYrxsOtoicsTkbCNNmfmaq1pp+Xpa2vHAgbOBi/JCaPtTA8RaypNx+/ uD0qHUGj0ivGs57FHS03wzoxrJuYrrWhl5+5q7chCBA8J7YjIJKpLTU7uqFe Ht+uLiokPp/PJr2fn1caIzdHMkKklpirr56arc6trTEKC79OTCwTmpsqJSe2 nrwZK6RDKSgunqMovJ2pvB0gOywsPaSWlJ+pnaK9TsuntCIGE6MsJhsck6gc L8GfnzEc3rorJim+mqg4v6ayMRspPM1N4pmSlqO/t6pLLLGlsiQGFqseKR8b lqAsXsutpDsYMew5UEaumawsSLpINSku13bOoZiWnrLqvtcrT6ejrSkID7kj JDMbnJY337nQrM4XIbZDyKtmrK0fMMI3xv8ry6y6pqKknK83VXRJuLKpp1oV Bx07K8seMpKfzb87XKcvFzlawag9La0+LK9Qt6pIVq2xxaSzsJ89QbdJ3K2r rcAZCBkuKMcjJ5eZsK8zNKtFGiAqUqW9LrusuK1WOrqzQP20uKervqqwUfZc w6ivucweCQ8iHH03NJqWpaxGOrnPIBghTK+yO9qmq73QX9avTUO1rKqztq6z STtHXry4tLG/JwkOOEm3JSKbl6t0H1qjNRkZLKOkQ9eoqLtJRKmy9+Rxpa1U 6casuzE6t668yrmuQCAVEvzPLDhYrqhDKi4uQCwfM9Ovq7qsrMnKub+85d6m orBh6bnFPS1Ir6y7wLavvjsuLR8gJCRgOzROLS85IyxeX7mvt6yuvsLEtMPz uqWho63HxVYtKi5fusS/sKy1aDg4Pi40Piw/Oy9UNB8fJCw4Mj+2paiusraw sbDM0qysrbG9uctdPTZA6HfPvLm3yjkuMi0vOzle1k8+MSwsJygzO0neu6+s qrK5ra+9yMa0t9VLwrqzyz5J19dOPE+8wkM1Mj46ODhNyPZqQ0NLMjE3NjtO a8G1uLq8rq/OWuG/u2Q3Sb61yVrWvc5SRUu/ve1CS2xBO0VjztDY90tKNzI2 O0dZz8DFytTLyNb2T2zP+lM+YnNdwcvFx33Fx9W/xF9PS1JLTkbdusTWa0te RjUvO13m2FTqvtHt51jN201Oc8XlVf7FydlSYt7LY0XQuctOOD7322JaxsXL UThJUWtMPWTHzcTG2cnN68bIc91Xar9oPj9Y7H5ANj94VEldd87fQj9TzsHE xcG/yn5f8dZWS+rYdlR6y8btS1vIwepDRtTHTkVLX81UPUVXSUA9TtfbTlTP v8jgzr2713Fwyr7cTmfN3U9CXcrLZFPi12VGSdhzSj9JX2tiVWjm9UhMfO7q WUvdzk5Uzs3G3m/XyrvMZNzHz1ZCTczPWVhv2dJVTPvl+E1KXf9cT1Nf7u1g UVBRSERITVr22ce/wsXLzcPI3tnK02xNTXTpbk1s2eTsSUrk9lJNUWdXS0pb YFxrZWLkT1Bq5s/Mzc3Awc7ZbV5ofmPq3Oly8tTwT1NdW1lZX/PcemHe3edX TW94T1NYW3RfUVhb5+p518PFydXR1HhYTVzd2/NWTvXTY1hTW+VaXnjh3N5f 883ebm5VVFBQXHd9bmdU/Ghc58/N02H129TlSVLW2Pvub+HpdVry7XX2cf3T a1JcddfU+HLf2FtCSnvaXUlb2ttpZu3a51lh+3T66mnWznFXVObS9U/v29pm XGvf3WVMYdjM3N/Z0HNFSHbg/l1dcGRZblzo3mtebe7XaVns1+9RUv7f61x1 /t3/V/Dq2WJUaOLR2PTfxf1ZYFdo4G5c/W9l5mvi3Nxc9fljaEpX59VRV2xv XmRQ2c5cU3rqwdF0bvHT0O5Za/teVGd+dF9r7mtUY+fPzeRq+O1wY13venZf VmdeWG5rbdvWY17/z9zlbnxwY1pm1upgam7fdOtkX2tPXOHu5dto7Glae3hx 1ORvVnHd2tX2X23YbF5aWmpw9Wv+79l36uzhV11bbGPu/Gpj79vt/fj83mv7 cWTibGVlVfF2cdLjZV/t0OZP8eT7XF7f7mhfe9/vWVtm/+90ffht8l9xae56 cn7W7udp7Wlv5Fxqfd7kZGTc3eZgT+lka+V3/HhM73Zo9eJpanbb4u/bW1xd b2PY6uhXVefOcEpnXl9e6tbgY2bZ4f91z+7j4/bk5k7c7FN7/XTpWFnvb2Fc VehhV97p1uhcz+JeZlXq41Fz52FvdlvXT37s/fXb3cxre2zsYm9U7FLrZ/36 723ZWu147FTfZNlp63nYV9Xe4WTsbGNGXVlvdOb92WHw2f9kalzoXVx4WePc bd7p4eV49Ntd6m3q6XRx4FJxW2tobmXr9HrhfuHs38ni3/z2XG5PXVh3aXJX UEhIQjs5P0FHW17Vzce6urq3uLe8wL/ExcLGxMXJxsfMydwwKjknJSAdJykh OldytbOmnqqoqLKx7U5LNTA3MkFGS8S+vLO3r6+9ur3IzNzMuszHxjckOCsf IxoiLCAtxWqtpqWbpq6ou9pHLzArJzRERsLAs6u4srLGvtZczFxhv72vqq6t sTwh5iwaJBMfLxkstD2on6iYqLGlxT4wJyUmIixjRbywrqSurK27yPxFb0xG yL2yrKynqLK5PSJCJxIeExckGCyuWq6an5agr6K2PjUtJSkqNcNwvqetpa/B tWk0PCkqNitPwMutpqagpqinu80wGjEqDxwYHTweOKK7qpegl6C1pLw6Licf JSMq+ku/qK+hr8Su1zQ0LzI8K2qxurKvqaOvtKiyxttIMBolLhMdGxs5IzGm rK2Wm5mcsqi1OCkoHB0jH0lX6aKko5+nsrfyODotLjQxTN/ivLKxqaqspq64 xP87HSQ2EhcaFDMfKKippZWVmJisp7EwIx8aGB4eQd19np+bmaOfqclHOiYm JB01NjvLxbSoqaegp6uuv887HSI3EREbEy0oKJ+gpZWUmpywtbonHB4bGCIt RbO1nZaamp2gr887LCIYGRsgKy1jtKignJubnaepttVSKxgeJgwVGxRNJzuc o6OUmaCdvLW/KCInHxsqKEm9T6OfoJygo6q7PTssHiAeKjUwcrWro6Ggm6Gq qrnHRi8eHCoTESIUKS0grr3MnJuem6SkodxKcC4dICEkNCrBqLeenZucq62z UygmJB8hIS5DSbunn56en6SsusxQMxwjMA8bIBI3HR+uPd2ep52ZppycuLW7 PSwyJi02JFttWa+7qai4ra7G0tlMTTUxPy82TFHtzLqtsrCtubxOMc4vGz8e GjcSIWgaVLVDoKewlqKtnrDGu/hLyERLtm7Gu/G84j7cQSw/NC4+LjhlOmq5 x6+wtKy7urjk1mZEYzA4XCw0LypNLCtNMjxWPOPOR8C42ri0uauvuamutq2/ u7lM2906Tz86TjMyRDo7P0ZubXvSzc7Jy8e828jHXsRWPnU8OToyNjcyNjoy OkxHcc/Qu7a9sLC4ra+ztsG9xWhqZ1P6ZUtdT0NMTktNVGv19OTp0s3PwcXP xcvrfUM8OCwsKygrLSszOUDh48a3ubSwr62usa+ttLe0ur/Ncd1WPk9DO0E2 PEo4P1dNWVdbzdDcwL6/vsnK0F5OPzk3MzYxMzk5PDtBT05YYn3P0Mi7urWv ra2vr6+5vcfO0V5p9FVbT0hpUEFPSkJAPkVKRktse+/8eHpTRkVEOzs+P0RG S1pcXt/e2MrYxr/Kv769ucPIwM/e0NrR0tTDxMrEyM7N6mRUREM+Oz0+QklP TV57VFZPS0c+Pz47Pj1DSU9bauDdzsrKwr++vb+8u7+/wcTAzcvIz8zMzdDj 4OddVUpKTEFHSElNVWJdaVZVUEE/PDs4Nz0+PkZQXW7t3dPO1cvExsG/vr29 v72/x8XKzdbe29jc4djZ2uzo2mtdYFZSTUpISkhHS0ZFRUNEPzxCPz1BQUdL TFNd/e3az8vGyLm2v7m7tbrBvdHMzd/Z533f3u7Z3t7p89trXU9YTz9HQUBA PkhAQUNCRj8+RUdCSE5cZ2XY0MnJy7/HysTEwcTFysTEz8fKzMbNzczl09pm 39la3n5bdEtSSD8/PD8+PT1FST9NS0lNREdXR0ltWujacsDK2MHKx8rSycHK yr/Ovs/LvuHDys/M19zc31TbfU5rW0VNQjtJPDxEPz5ES0VTVkrnWVVuZGN8 XPLo6Nzkx2fJ1/HN2eXYwW27y9Kw4bjGx7lStkfN2kPTSkl9R0VXOk88QEw0 4D492Dj1Yj7PTFv+71d6ykjG6lTDWOrE9ubD88vG3dbFxFy238vAa7n50djl fVnXQf9XPN87SUFOPEZfNc09T81A0OVXz1rMT9H7T8tK79hHzO7gyenMx9Fn ulz+y1PffdtJyOBOtknGyPnKYNxsSV9GSztMTjjYOXtRTuNrXPbAO75pQrA3 08A8xf3NQbzdPq8+yb05vdI/ylla10/OWcdR08FNyPhv0W9Q20xN8kpG80ZD yzxb3khp7nHcX8xt00/CekW1PNS8L7bBL69TV8RP/mjNPtPQMrhfQ7JC2rdC WLxDX8tKS9k/RsQ58c9B2PheYtpXTMg+WLswvM5Jv9nm17xAvs1AvWNFz34+ vDtMuDC6Rt/Y7Oh8wkDCUFXQSFn4RFLZPctL3d1KtUdOtTW/aD++OMZNXsc8 uE7vu07b1uJNw3U9tjffvjvcz1f4xDi6S2LJO8VTSN/PMrM4Xb82w/9fRL1J 3PlJtji+XuF6ScJCzE/a00q2M689WrEstv1CwVp7zFVKuDXqui27+j/GYD29 Yz26TlrKez/L0TC52Sqz3TW80i+rPEetPlO2RFO0Mc+7MLZrPrc+681JX8la 38o9v1RNyFlM3U9EzWk8tTjwuTC7ZES/SPXXSN3NTNDcRchf017nVP/ERM+9 Mbf5Pqwt07kvzr8uutQrq0Y9rjHJ2DmxQ1bJP9nBPdu0KcPMOMdKT83BLrfO Mq5ZeOLiTMxzQcNPU+XNRuzbzvndffLqa0rBS03JRXdb3WrdPtrRRtPVTE67 SenJVtxT229PUV75TMtJv0/XwEHF0j3avElrxjzPUUKzPUjB60fS+k26StPd Stl8Wk3ORF7PRvH8+nji9k/AUV3HbFfa2TzDSlfORMbjV9PJWnjFSPXNTmbS T+TVRs1Na91b51LV31fuTupxaflm2PdN6fJD59NJ2mZ+z3nb3NFF4eZGymtY e1xSXG7by+TJ1OreWexYVlZrZknK4VnO1ttXTtF+T2tcR01Z4OVnyt564VdX YF1m0Vf5yUnYvFJutUpQzE1fc8/nSXLLW0vKX0zGeErea0Pm7mnX/vdk0F/8 y15WU+9ZZlP61t58XNxV/8dH29ZF7slGYr4/9N5D/G7GZW780EpYvVXgXmbZ WN1vVc/lSM9QWMzjz35mzEZmWFPOV8neQmHmSOPCW1/ueNzsUFxzRMrCXexs XszPYGBIa9thzFtY6kbG2VtwT0xL63lX1M5Tx+ZwyFzQXU3qQ1fSXNDIVcTb OMtcPNFmV8NqQct0bNTO0VBcYmxN4cZIeN5vwktcylJO1cn3TdfKPOvNTPTy WUxkS+jdSrvcSdVf0Mre2z8640thv8bjSsZlUt1JXex59EhK9+XE2V7GTf+8 TVpWTc/BX97NRNfQSO52R2PbT0nt28pOW9BWUs5fRcFeS/xPZG260n7oQl1T V73nUcdeW1nIxE7FzERPSE7Nz83S91ldXU7Yz1rcPjrMVknF33XGVDtN6/q9 yVLdU07eX9jIzOxhdVBCdLrcR8XHP0zl4eRf8UA7w+TKtznvRje5y2JO29NN PUvH29K/cUJQTHy+XW3J6+TTYT7e4EfJzXNMSt3092LO3Uf3ymFKyUM+v29c zcvP9V9fdlhOXXPIykZTy09A2sjjV05RUThdtPT7s885Uc1FWb3zWM73ccXb /MHQQEvNQD+9z0Q7Q82/zU5Z6llZP0u+zFHhwkxC19zOvWg/1k5S4U7a3e77 X1tP3uBIP9fBy9VJU8vQ5tXcT1JSSXXU3NvNykk0Tq/CLVWvPizPu9x+29DP Tjvpx+vTyVhCcu9Zw71ORthQPmxqWPXv0MdWOm64vWZEOUzJ1L+6TD/MykQ+ 2b/VX+NjPkzl3uPEXTpQXHre4+fobUtc2df86c1lQ9bLQ1/Janjqaf1nX+HH 3j9P2F9Pzb3aX+H6TlRZ1cFkUMzdPUbMz9fF3kM7RWXk2eTr4ltW5njtx9xN VGJZT+jJ4VxcWl1b5bzDQDRA0svOt8Q8OFvJxO71vMU8OOd25ba7VkBGPkXl x9Ti5kM878jN51r9/1ZfVlTsysX4SVvcz+te3M9yR0Vi3Od7793aZ0M+5rm2 yDw741tG1L/Ozd49NkbRwcve60U0Psa98mLV2U9S1c9aUNnnSU3fyMjJz25Z V2/Nwsd1T+vbSz9dv8dRW2RIPz87QVdUUmjaVk/Zxcvb0txXSG7Q0sTDysfC xMbG0eD9ZVZXzLvRTFpPTWguHihZWEda+drL1vrGwOHy3XpTTFhVfby4t7O8 bEZQbenSyMDYVdPC19zEyN7sTSgXHum/2My8us9JP3rIy9HrSz05Ss/EwtTW ubbqQlx1TlDrycC9u7O560xnwbCxPhIOPKbMRr6utk8wNXC+v7/cPzk8PWi7 utLStrpJNENi8Me7sbTCztLOxsbhwq2uTA8KO5y2QsG5xkcsJS69qrLfNSw5 XdW7tcq5pbgvKz5lza2lqrngRz7usLlO3K+tvR0GEp+bUz3vx7FMHBlenKHF Pi4+6D44tae2q6s4JCw+16aeqbW+RSsywa20vLevsTwMBz6Upjc7Sa+4HxMj n5e1PTM4Wkg4u5+vXrG6KSY63aqdp8nRZi8rVK+rtLizsK5YDQUrkqAtNEmx qyEPHqKTqjcrPLraJzaipcq2ujouN1mtn65Z3s9IQE7Mr6ixxrq1ZxYGGJqY QTJTvq4sERmyk55LNUPfTikuraKrq7o9LTFKu6y41cq8v085+bCqs8a4s9Eg CQ6nlcgwPdawMRUa25aaWDNNUUY9M8egoa6+TykoTru6vcjRurR4OfS3s7XC /Mexwh4JFZuZOSY7uKtFGxnwlJ5BN0i/tzMixp2ow75XKS5JSti5wruork06 Wrquyz/Qqqu4KwoNpZo1LU9JrLAcE0iWm71PMVOvPx08oKOvt0wuOj8vO9K0 pqWzyWA9SdrXxayora7KFAYcnadNPim3nykRGq6SnWYmMKnDHCSmmaS2z0I3 LiQpyqGiqqy1XywsbcjMqqKqr7gvCQhHm6vdODihthkPI5mSqT8hRqs/Hi2l mKW7zzopJCY/qZuer8DNPCk35L+moKyvscMtCgYvl59OKzip0h0SIJeRrzUg RatdHiaflKKxYismJihBoZquv6ivNSMy1LCkrLGpuNVTFAQWmppXLCFFob4W EqePo0YeI6ynKRqykJy2yDUqKCgvxJ6gq6WrSh8i2q6vrKWltntCIQkLu5is +yYnqLIcEDiTmLcqHHSqOBxNk5ensjAjJygkQZmTpbC8RycgNsirn5+jtUQ7 4SEGD56ZuTQaL6XHHRa0kp+9IRdKrUkqrJWfqsYmICIkPZ+VpLnAzlMiH/6i nKKtuVhI0sQzDAnKmbhCHBqxnWQXJpiZtiQRLZucRTugoq++IRw+yFTQpKW6 uccxKjf5raGlrbjN98+8zhsHF56nPiEa0pmpIRW3mscvHDCbmLErOrGuqHIn bc0vNbuz3LixTT5h3unEqai1vL+5r7VNFAYWpaHOLCmuoWAcEjKpn6VfT7q4 RSc7sqScp1QqKC8uNWyxn6W/1EUvOcyoo6KmuM3GzUcXBRacnt0qGT6dtBcP ZpaXqSsc4aLHKUWnnJi4HR04RzRIxq+dovdIPCs5sKKfn65ASLrK1jcLCrWh UkIeI6GfKA8nn5qcRxg8nak4Oa+lnq0kIEz/LSc1vJ2ducftLzXhuaqip7O0 tvdRUhYGHKO3vlAeXKBPExXAm5epIiCwosI226ihpEImN0AwJCi5nJ6xbk87 MDToo5qhra+5V0HHLAgNuLG0rx0fpa8dEy2plpc5G26isG4/3KibtyYvSzk3 NzLNp6uxrm4jLNywq6WfpK3YL0i2HAUWrqikPBQ2n/gaG/2dlKUiJrOptUU5 tp+iSC1EQjosHzConqi2wT01ODDboZmdq73yXckxCgrPqbW3Gx+itCIaLa+a mDgey660vT3Fn6DbKkdaPjAdJbeeqMKvvDYwKT+mmpyjrcc9TLsuCwxEz7C2 GSWiplghIGabmzQo5bGgsTXEqrpJP1pMyTgZJsO1t7GnsfYyKEqqnJ6kqtBD w8sYBxU/+p9dGridzSwfI7eWqy7qvrGnTzuvs8lwVFxrRx8fODq/paWmwTo5 Q8+vpp+eq/RH22QaCBVlvaUvHLGfyy0gM6Wawi07RrGl17SlwML+MywyNiMr Wdyrqq2oczVjxby0rqWhsE1E0UkZCxk/ya4gHqmjuVAsS5+hNSIs15+kz6yo wso2JCpDOyg6V8OrtrG8Qsaxt7a+tqemulVjzi8ODiw6yj4a3JyuYzdDqaFX IjD5rqS/u6OvwVsqLTw0KSw2VbGwtKrLTrm4vbzHtaKlue/c1ikNDisxzjke r5y/UDk8rKVIKz3yrafsvaCvvG0tOTsqJScqTLGwpKLNv6/mTnTHrKGpvcW8 7h0LFjMuTCIonp/QXj7LobIqLEL3rrf6pqC2tWk6Si8hHiIrS7esnqO/sLlu z9XJq6a0xcG5+xwOHionKxgznKa4udOpn3MnLjj/uVHSn6myr//NdiwlHhwj O8esnqSspa7GbWvAsrfW5bmy2iISICofIBc0oKu8vcahnMNET0rZ4iw4sMK+ q7KnsVEvHRscJDTNqKajnqKosru5u84/OHe92ikWJC0jJRkptdNe3c6jm6mx r7e49CsrPy89zL+ipbPEOCkgISg36dGzpaGgpaenqbdIMkJtSSsVGzcrMSIk vL5EQT7Lo6WtqKanrVQtMSspN0m3r7a7XV8/NDpEZExQwa6rqqinoqnD9elp QCwWFSYgKigmybp+z9nHp6i0rbG0rcs2OjoxOz92xsnPREdsXPb2btzLx7a3 t66tqKu/xLnEajgdFyMfICIdMH1I6Lmwn52qp6mxr+otLzUrLjpZub9eT1Bn /HHgzMzAurm2t7u5srC6v7q82UopHCgpISAZHS0tNO66oZmenZygpbw9NDEm JCkuSkw8SFzNvbqwr6+vtrq7yNbMxL/M1MzY/005Ki07LSoeGyIiJDE9yKmn npmam6CsscRFMCooKSMfJCo5acmwq6mipKalqrG4xdNcPzc1OTw7LytKRjUv Iio0LCwtLlHexqmjnp2ho6WvwNZuRC0iISIlKCo3T8euqaKdnaGkqa627D44 My0qKyslLzoxTzczYj84PC1Czv+5ur+uq62sra+tstBeOTAuJyYqLDlR7Lyx q6WlpKaorb/xVD00MS80NSkpNzlHTDlRazs/PjzgW0bh0ri0u7GqrLa6v8Tj Pjs4NjMwOEr6yr2zra6urra1vNdmRz07MjI4MS47PUVVPEP6U1NLP05VTFdX 3r27t7Wzs7u/z9rSUT9ERkNLY+DIy8i+v729u7jA3epdTEk/PTwzMDQ/RURC S19UTD5AX1FQUG/Hw8e+t7e5x8e+12dXWdrfd+zq3udicujPzMLEwcrM2ddu T0k9Pj07QENDR0JAPzw7QkRJS1/WzM3Fvbi5wsrL1uXu89PNycbKy9btXFRW V2Nq6uHMzMTL0+J4+XxnWUdAQj87NTU7QT8+P0xdbGxz0sLHyMPHx87p6MvF w8W/vcTV6HheWk9JS1lv6OfS1czJytLN1tZwUlBIOjs/Q0c+P0ZLSUE/TGJU X3Vo0t/11cvFvsC+v8LEzc3T2/ViUnNl+llcXc/R1dbFwb7O5XNcSUVAQUBH TF9cXU9SY2xOTUhJTj06P01obfTSy8jI1cfGxcfSz8DIzXtv79bm+NfHwcDJ zc/edFhNSkJHQEVOSk5Tbt/hY/NlZUlAQ0dIRk5OVE9WXGzs2Mrf1dXM0OTo 0s3P2dfKwL7Bw7++zM/hcVVNRkpGT09TW2f6+WZraGFQSEpLRkdITGBQUFVW XWJoftvgfmFc3dTU4erPxcTGvr2+xtHY2N54aGZWV1Ve+9zQ72l0Zl5ZTVhY TUlHQ0k+Q0tVWV1d897XZGRy3t/0X2p60NfbzMXEwMrNzNvrfFxsW3Rx5evV 19jc3+njee3ea1lNTUs+PkNCS0FDUGF86Wbj0tXu+m/b2eL11crHz93TztTs cWVqWllXW33y3dzZ3Of03dfY2N3Z2m1OSkhFR0hMR0xMV1NqevJ8Yn3f3O/l 5dLQz87MzMjW3HNbW1ZUbvjn+uzo73hccH7k19rY2etvXFNeYFZWTVBSTldh Y3VaVV1jdfF+39vl19bSzNfbbu1tbmJq7uvh5+Hs4m9deePv89zT2ObsVl9Y X1xVVVRZbVtSVmNYaF3ubGx+e3zu5/jX0drl7G32WmT+4url6NjZ7PlecdnV 3eXm3+ZZZGVaWWdUaVZ4cellcF3vdGZfVlVmZ351/und7OP/aGrjfHpo+t7g 8vtv925j5/Tc2NnUz+nhb2ReYVlaWVphdn36aX7v9mtaUmJrduho89/e7npm XndkWV1s+ujj1d/ub3Zwanru+tjZ7uXf4uXtZf1UXVxTVndieWtt6Orz+P5v aVj/4e/s5vh0Z2dmXvjzYH1o59l+7fJY+m9t5mjg2OXj3ejZ8PLtVFhQWV5h Xed78d7j7OxmYWJeZGZn4vL+4Xd0fXn0d2dwaG1fbl1obn7y2dzb1M3a29vv 8nVZX09QT05WdWh75Nj4+25vb/Fq/HT6d3lm4uLf3tHTydHW4uxkS0ZBPz49 P0VLad/WxL6+vL/EytjjX05JSUhOT09j993Q0cjJz9tzXVVOSUhMVmj72si9 tLC9bulOTkErLC8zPjo60760r721r7e/a0NMPjY3NUPu/9THvbO4xcXT3mA9 Ozs9SktO5MzEwtHMyN9jSEJOSEVGS+XN087Px8TW/WBaalRLUWDj1u774+Ru T0hMSk5PVO3Jv7y8u7i8x3xTTkE1Ly85T0xb3MS2uMbN3NzuPzw8RF5j7ci9 uLvJzdxwTDo2Oj5ITmDLwb7CztbT62xTUm3p4N7m39b2W05JS0dJVGvh09PK xszV7mZXTU5SV3zUzMjM0+FfT0g/QUJHU1/t1cvJy9PZ6WVfWF1scOvb18/T 3uZsXmBZXmZn7vH76/pzZ1xbV1ZdaHXn9ujc3ePtd2xiYmZfY//x49/c19rg 7WljX1xfY11dYm5wdXz66ujl6O/i3N7d5O3pc2hrV01QWl/f+f7d3dncW1Ne XfRnTlRl387Ve/Pk2uRXTU9ZbGdea9/NyNDh7PfneltWWGL18Xbz7d/icFtR VmZta2z64Nfd/mxx5udvbGvj2+xqYGdmYE9OUFhsbnLn2M3O3Obs63NfWF1o de/r3dzd5Xx6bGJeXV1na2to89/e4Obp5u53aWJkdHNoZm34825iZ2tyamVx ++vh6Ont8fJvYmlq/fPy6urr9XxuaWJdYF5iZmhvc/Pl4+Pj5u74c2pmamVk a3nq4eHl5+jxcmBcYGFcXWZy8+7kbk9z3MjC235veN/xTUlMZdHR5WVebORv TkhLYtbZ+2Rv08vXfVpd5uV2W1Fg59rhY1r42tXV6XZ4+ndgT01Vb97Y4erp 73btVlt5XeVxYO97dOdq7dv00NPTzexgRjpDR1rpX/TY0snRbHJeZvpUVVtq 1c3R2e953OB7aU5f9ubZ/P3o+G1fVFVhcu5ZSXVf2c1n3XXlyd9v8lDu1WPe W1bn5M/WbGjp6tXgSEQ6RGx01m9q+Njc6VlTcuzN2Ojt4dXQ6lNOUfjf6m1T Xezd63T/697uaVZSWG7+evH+29HMzt3qZP/f5uplW2789FI7Oj5I0uPg1nzA wtN4Rj5SXfDVaNTMyMj+TkxRbNz6bv7nys/+V0xW6t3c52Pj0tDWa1n7zMS9 wMxDKy0nOFxE01rLrq+1wUE+TD1fRj/rxrSywOVtTl1bPDw8Rs/Ixb7W0MXo 219FT1Jw1+rwzsayrrC1/C0gHyE3Pj/5UbWnqq/MPT9DPUo2O+q/rq66xtDs 6k4zMTA+xr+1ucm8wsjdQjk+P1h3Xci9sKqrrsA+Jh0dIy86PWLKrKOnrtJD PTg3NzM85rmqq6+5zupJOC0qMD3MuK2sra+7z0c2LjQ8YMW8sK2qrLrvLx4Z GyAuTWTAt62kqa/IQDg2Mjg7QNW6raittsVfPS8qKCw81LCopqirtMJQMy4u PeS9r6ilqbNMHxMPFyg2Utq+oZqcpso0KS4/Oz02R7Cpoqm+11g+OCshJS5W s6qqp6amp7pQNSgrMDbrsaKepa7aIhUUER4sJcu7pJOZnqlGLi8nKjAtRLas paCus8M6MSUfJSs/w7CooqGfoay9RSgkIypUuKajqK/PJhgXDx0lHXVsp5GW mp/MSz0jIiIjMbasqJ+1rKzX2C4fIic7xbaspJ+cnqnDOSUgIStOvqiqr9An HhsWJSEcOTmtlZqan7jBXS4qJR8tQ1q4sLCmo6iq6zo2KTlDVLyyp56epa3Y OyskJCgySc7dNDQwJTEmHCoqPqipo5ynp6tePTIfLDcxzMfFrrGxqK+4smpV WDtc1Mispqilrb3dOC0mHhgPFScxq6nZr9bIq+g8PS09w8y3us22rrjH0z1S +knPP0XMu6akqbO90cC90cfd39X16FE8Lx0UFhUdLypHw7SbmJ+iuk5fODEw KS7staeirra7xcDmOjI1RMW8tq+3raywtstVOzo4NT0/Oi8nKCUlKh8iKDPA qaKgn6Omq7RQMi4rSnBg5f3AsKu0vtNnyt3yUjtIzLOtrrm/zHpFLikpLT9Q Wk0+OjIyKyUnJi9Mxa2koaGjqK23yWlGPTlCQkxrVdDEt7K5wXZ1V/PhWXpx ysDLXz8vKy8vOEVVyru4u8ZcPzswLy0uOU3GtbS4vcC7tre82lNEP09e6tHN wMC9wcnVedX7z9Tuz/JvSz00MjY1P0RK7ca5sLPA2lFJT1ROSD9EUV/q4+nd 6+htTj87O0t8ZHrvx7CutdBOSdi8t8NXTF3Mws5OPTg9VVzsYVVt/dXEv77E +Ec/P0tPQDw8RdPO0eVFTENDSUBGVNW8sra+yvzo4f54VFDryL67w9DL1dTS ZU9KR0xPUmnj18rTemNMVGJSTUNASVvhzdVuSz9CRUpWZHXp2NredGhmbv1t 5/XSwr63ur7AwsHG019HQUhh8elsZWlq72xRRj47PUNLVVpq+NvP0+dhUkpW dHzsW0xQWHng6uvq3M7Gx87T1szGxc3n9vnc0976YW7x1dPeZ0tLSkdEQz9C S1vh39/c8HRvWFBUTlFVVF505tbLyMbEyMvO3Ol9cP/q1c3O0ulwZGdeVFNU Z/Hd3X5dS0lMTE5OTFpv6Nbc82JaUlBUU1xfXvfb08vMy8vT1tzm+Ovp4Nba 1tve4HhpY1xkbFxaWGPg4eH2VE5JSE1OUl1kc+Ll3dv9dGlaXGZp9+zp3Nra 2NnW09zd3+3qemprXVtfXm56funq4+rx/252bXJlXFdSU1BXXGltbvR7b19c YW3+/uHd2tbb3eDe2tbX1931ZlpWVF5peHJuffjV1NLXfmhaWGdud/hyaG9k XV9VVFdSXF9da3H/7ebo3t/p3tnX19jZ3+Tr/2leWVphYG1uZf/q2M7P2+li WWBeZ15cbW75/WlhYV5ib2dkX1xdXmNtdvPz7eHc2NHN1Nzi/nJoamZeWFdf b+7w6uHn39zZ4PlrYWRhX1xcXF5ka3lsffP47ndkXVlZXF9qbe/n3tna0tTf eWVtcPr9bmVjav3s7/D5+Px6/P346+De7mhjX15hYl5bZHD66On5ampmX2Je XmN09unb2Nvg5/FrX1xbYnZ1cmxZTFHewLi8yOxQS05d7tzbYT83O03NvLm/ 109JR01v3NPhY09MUWva0NTZ7WdVTEU+P1rEtLK70kw+PU7Yv7q5xG49LzZS vrO6dz82Okxu4ejtc/Zu++fd19x7Zv3c2NVjS0dOaeTU43lbUVdebenk/mZV T17jyMC+vr/JfkIzLS02TM6+uby8vLm3trrGaT81MTEzOEBW1L64trvNVz03 NzpETkxHRElzx7eurbC5x99uX1tTTEZCQ0ld2snL2HdXV2j36elyWktJWPx9 eVdTdvT/3dLX41hKUu3NxcrnWk1MU2RiXVZe68zIycrX9VtYWFn93OFlSz9F UerHvr29xNZoTkdGRUlb993hZE9SXP7e421s/eXY7P3k2N5fSklmz8nUalZk etbHzen++V9VTEhNXXv3Z2F808zJyOtRQDtESEpUe9XFv8C/xcfL4GVVSkBE R0tUZt/a2HNrZvPabGZcWVdST1/q1sjHxMzT3+jn6+J0a2heVE5XW1ZQXmvo 0NfmaVRY9eTU1mtbZn1qWk1YfvDW3e/t7PJlXGrh2dPfXkxJUmzc3dTS3Oxo XVlYV1NRV19nfePa4fFpa9vY1uRkUlBc/d3i3/Fk+uPY2tXe/GhWYX7a2Nz4 X3z51udiX1lZYeTazc/e71xQS1Fa+NPb/k9LT11r59rW3G5dVldgXVxbbd7Y 325bVlFXY+/WztDga1ZPVV927tnU3/th7tPOzNtsWVdeaWzu/3nl9+no4OHv bVpZXG1tZGNhX2NsaHR89W9WXvfWzMjM4lZISlRm6dnV0N7m2N/e4/x6d3x0 Y1dQUVtv59jT0NjnalJISE5ZefR1b2d54N7f6nloX2jq6OxoWWX//fZzYmh5 6d3Y2t73YVpi8N3V5WZeXWJ1b2v58+ja3NznZ11WWF5u6N7f8WhiYWT5+nPy 6Ofp7G9kW1phXGNtc3tocHL65eHW2uTrbmdjYmp4Y2FdVWt+5+N8bXv36drm 39vxeWxkaXFz8m5o+vHk2t7v+GtnX1lWVFNcbPPW2t7a7Pdxa3huZ2xhXGp2 eezk4d3r//t373VrdXRydXRqaGJdW11tfu3f3urvbGFsfejm6+54XFpaXXL7 6+l3ZWNbWmJ+29bZ3+13b2/36efUysXAvr/Axs3Y7WdXSDkvKSIhIyg1UMi0 rq2us7S2vL7G2uXp5c7Cu7Wyr66vsbW90T4sHRMREBUfK22tpJ6cnp6krLDO RDEnJCYsPc21qKWoqbHBzWRu2NK/uru9ezcpGBESEhwnPK2fmpWYm5yptXYs IR0bHig2v6mhm52ip73fRjQ9SGO8trnPOCgYEhQVIC1gppyYlJicn669PSMa FRcbKT+vm5iVmqKr5DkuJSgxPr2qp6vISiAXFRIbIzOyn5iRlJmdqrw/IhoU FBkgMcyknZmbo6rXQDErLztrtaWgn6i9eiMYFRAYISy0npqUmJ6iuVUtGhMU Fx0tUq2amZaapa1cMCwoLUjPrJ+fnqW3eysWDxARHizsnpqZmJ+mrWM+Khwa GRsjNc6nmpiZn7BtLCQlLEC8qqCcn6Gos/ovHQ8PERcrPayanJyerK205d80 IBsWGB8v05+YmJmryDwmLzj5tK2tra63qqmrtFsyFg4ODx0sy56cnJ2ipqSt uO0nGBARGCheoJOVmKK/VS0uOUJPXUdIwrSfm56fsX8qDwoNER9Er5iWm5uf paSyzzUZDg4THTyolo+WnKv4NSYqKS44ON67pZyanKCntWElFgwLExk0tJ+X mJyhoayzyC0dEg8VHzGsl5aVnq/ONTYwPTs+VEHAuquhpaKoq7C/RSQYDQ0U Gje4oZqboairurnMOywfGhwjLeKtpJydoKOrtMZKLSghJC48u6qhnJ6gp6/U LRsQDRIaKcmtpqWstKmpo6G16iYXFBkiPK2elpedorHIQS8lHh4dKDXNp56a m52iqbTWLhwSDhQZJ+e3p6OnqKKmparMRCMaGh0pTq+knZ2jprnRPSYgHB0n OcCjnZyco6epsLTMMyIVDRMZI9THvbjayaiempmjrkofGRkfL8uwp6Svr77R y19DNjEsOUftuLmsp6Ofo6m0WyobDg4VGSs8RcGwp5aQk5afsEccExQZIz7P tainoZ6gprRTKB4bHipCuK2ln5+eoqq0XiYaDw0YHSvK7tesq56Sl5ugyDge ExcfKU7BwrWrqJ+dp7VTKCIoLli9w728u6ifoKWw5SkZExMcLzE8OiU4vKiT kZqevC8mICM1OCwrLT21nZiZoMU1Ly5GucpiPCgv5qydnKWvyjEjJCAhLiIa IB4qtaWclZymrMtYXD0rIx8gLcSrop+tys7hxbG74DsqKS/8s6ihpKqrs9o8 LCIdHiAbHSIiObSlmpaboqzERzArJiAqNULHuL/Gtq6rpKi+cz0uNUnoxbOs qqmssc41KSonIiMZEhYeOK6emZufn6Wut14sIyEjKzI9UN+5q6KhqK+8zW1Z Qzg5Urquq6uutLjIOikpKB8ZFxofK+KtrK2on6CtvMpNPEhQUlVU9snBwcTL 4lNIPDMxNkHZu728tbKvrrW/vr/EzVI4MTxHSU9MSkk5KyUkJS05P0vrwrmw r7a2rq2tr7zySkZGTl5TTEtR4by0sq+xtbnFb0c5Ly40Oz9NTkA9P0E/OzQ0 OTs/SUxazLetqaeqsrzI4NbRclA7MTE7W8C0tri8v7/FzmJLRkBETlFXe9zR 800+NzUzOD08Ojo8QG3Bt7S0usPGxcbVTj87O0fewby6urvAvr3N4XZaTktN X9zJvLm9y/NPPjc0MC4sKScpLz7+wrq4ubm0s7a9z2NPV3DXwrS1y9bN0tvd 708/OTo3PFJ6yLe4yca+1+PQ80M7NiwsNz08SWvfwbe5v7/HdEZCRU3e1mzc z+LNvcK/wGo/OTxC+si/vLq3v87Axcq72zwwMDYsLC8rQfo7U8b/vrla0ry/ t7nDur/uUD5MXUhJPkd1R0jNv769xsG7uru/v7/P0cjJx0YkLUgnKywfQFMo OVNXsrbJr6mor7i2vL/nTehPMTQzMT0yNPzLvba2r6uts6+sr7nXVWg8HiJR KSQ2HjDLJSzjQci1wq2mprS1q7u/3EXrWS0rNC0wOzrPsLu5rrKsq7StqLHB xM58OB4seR4gIhs9Lhsze8WxtaminqG4qazN6DVCXi4jJjk9Okdet7HGuq2q rLS0rq+738u/2TMdP+McJSAeRiIbOvbex7WkoZ6oraCuvO5Izj4qJi04KjdH UrzKvK+xrrG3trCwwMG+zsM/H0TGHCgqHDAhGjHfRHOso6Sgp6qeq7zOVtM9 KSowOyguUmHl5762r7a8sLW3sLq4tcTDxU0mQusaKCkYLCMbOH00aKmnq56j pJyvvbPOVDo2Ky48IS5fOnTex7Oyu7usrbuxtbe6zcG92ikpvSIcMBooLBor WDxJvqipqJ+knqKzr8zuUTM2KzMsJDY1PkhPt7e9r62rs6+rsa+8xrnVNyRM WhktLBw5Hxo4Oy9Lu6Oupp6snaO1rLrGWz05LjAnJS40LzPRxdC2r7Cqq62t q6/Avsd/YS8nZUAeLi8fLCgeLzs4XtSzrK6joaihpr6zr/1CRj01MS4sMj86 NT5h4cjIwrKusLy+r67N+8bTSDs5PkI4Nz9dTz5BSklHOz7pVU9v68HEddfE 1OlRW9hcaNzfytPOwcHCvbm9u8LMxsvd/E1JRT89PD47SUg4QVFFT3hPa9Ve WM7SaGbeY2FuSVzu6eLUytDNxMnIxdfZ3eTa1tLcy8bU0sx7WV9TPzhGSj9N Xmbe1/fe0WpbZUZBQz0+R15ZUH1z8OB21s7W7O3O1MrO7MK/y8rFu7zDz9TL 3U1JTVBMPkJSblZQ39JsT1JUSEI9QVBDQUxi+GL6z8vIy9rJzdjc7NTe3OPj ytffz9d6a1tOX1xLVXNbUXzR0sjEx77M5MrSdV5QU0lDRD5DQD1FSkVGTFNQ T2hxZuHLzMa+wcO+yNrN0mto/1laa09g3eTU0M/Rz9fp0dLifWJlXFdRU3li SVBWS0pESElFREZVXl/r3d7R0tPJzNXa4+9uaF1039/Z39jRzs7TzdPW1Hxf aWhxb3Z79OF9XWFaT0hJSUZNTFxkW/5oY+/4aXPoemf5bP3kX/77aHpf+tna 3drM1dfL0M7Oz9rj2m1f7mNYX1laWVtXU25dW2VZYXz+anB7YVx3dm/val5a V1NNVmrs5nz/++rvdObWzdTPytLP1N/b3+d3YntxZ1xf+ntoanHt8GVbZnde WVZbXllYUFlcW2Nhd+toXm5sa3ft6eba2dHL1NjT0+Nt5/dlZ2nwdW3q5tre /uLb6mdsfmlZTU1UV1JRXWZZW2djaGdbY/f1eeLa2dnd2c3a9t7e7P52e+57 XWfra2N3ffDv7Ovd3f7o321p+HJsaF9UWVdNWF1YUVFfXl1fcuPf3+Xb0tbe 3tHS3dzh6u5pW15vX1Vh+XNq9ujg2uPs3eL0cGtzYllZWVdYW1hVXWtkYWll Zmpla+nd29vX0dLX397l7nFnZF9jXFxhZGr76+rd397a2dfc5ev2/mdfYFpW VVdcX1hWW1pYXWxzee7o5ePm5t/h5N/i4ud+cHBkXmFfZGxneOjd1tja1trk 8Xl3X1laWF1fXWxuYmVkYl5jZWxza/3y6en06t7i6fHz93Jpc/hqbPx4/f7+ /f5vXFpuaFpQVv7b0dTQycXFy9l2amVbTEdJR1Jr8Ort1MvI0ebn/PBvUE5Q WFVMT2Tm/GVv5dTS7GrYzmlOdN9bPz1c5PtnX/7s7L2/S0Vf2NRlSUhLecPH XVnbxr/QVUdY0chfPELXwNx8WE3mzcrrSVXb2Xp6/Fhu2u5pcWdrUUvj2PZa f3XfydZnW+zqbmP09nJs5epMZ9zpe2NNTfR42WpGV9fK1/9dYF3Rv+NNRGnE y+tEPWTK8k1WXfLe8flkV+fI6Vv22tPuUVbY1mnmVE7Tx99OVG3qdmP5e/Js X2zZ1NrlW2be2NRqR0RazthOP0zXx9JuWvDQze1OS2V7ZF1ad93V2mdsV1vc ZVrvXmvW8mH70dTc52Px3NpjTU5v2M7XXl5l5WRd83RSWV5a1NJQUurb1upZ X1xy0VtBVeTSy9xQ59Dm2u1bWmJk4v9Zb2H1y9lWUHHKxWRFSlvT231YSmrL y3ZS7dvl32RJUfzf9FhOYOr+8eDecFrh2GP7/lz05ODd7Wxf/dvdblJW7+3x aFbm7m9t+/V16+9nceDebGzd9VRaZFX7cVT9dVb55njb2ubs7tvuUl/U3m1o WGXe1dVkTFnRyntFQl7PzVlFS2vEwWpMXNrFyftQVuvR3k1DS2fZ315WXd7J 0WpRa9ra5mJl9OXlX1No2u1hV1r23df5aWfbxs3+WHzV3G9bTlRqelhKU15Z TEtZamNbbG5h6dbZ3dvb1NbSzeX40s3mZeTk4t7udFdkeVtISVFr4vhmav3a z35MUv/Z6V5bY3n3+2hlberm3t1rWV7q1vJeYPvl6uX0dlph2974+3lv+uDe 8WhZaXBhbHdoXFtke2liZ2/o3ev15vZ08uXZ5mVm/XVtZFxbX2Ru/2xp6dze 6u96+N7Y1+Ti29jc4/xkaWpfWVZZV09OV1xaXnPucVxj/35z79rq7t7W2eXu 593k4e50ZF9tdVxWX3j7X11p9/3l62NkcHj679/m7PJ7/d/d525gX1hfa/Hs al534upzZm/54fRlWV5+/nFx5eDq497d2drj7ubZ2eH1Znje529bUEA5OT1I U1RNSlbj0tXtde/j3NzZ1NDNy8nFxcPDxsbHxsnOz8/Lys7X4N1tPCgfHytC TjsuMmO4s7zV59TR3PHez8zT6+XNwby7u8DKzczFxs3X+vlvWFJa9dzc4urc 2E0tIiIwb/Q6Ky1Oua+41V9n7d/UzMvcbFpyz8K+w8nQ3M3Gv8DJy8/Nztzo 2sjAwcjT1dVULh8fK1XlOyknPMGwuOJEPUVh083WXktO6r20sLbAxca+uru/ zc3Iy9H6XV/iycfM29bNWy0eHCZFVDMlKEywqK7HU0pY1sG/zWRY8Mm7ubq/ y9bt28vFx+NraH7ifGdo48i/v8bKx889JB0iOuZJLSk6u6qtv00/RnXEwc1d R1bUv8DO1tbM0tvMyMTM4OLYzNDp8OrPwb6+xcjDzj0kHSA2/0IsKDm4qq7J QjxM2r/F5ExI5r61u9haXdTCwMfY4tzUys/eel5049XLxsTJzcO/4i8eHSrx 1DYnKuerq75KPFTZxcbdcVziv7i821JQ7L+9yHtOas++vdZYTGjJwsLGyMbI x8G+3S4dGynv1DQmKmiurr9kTnPh1c7bb1rgvrzOWl3KvcR8S1Buz7+7v+1M YMG1ut1a3L290NzJxzseGB9HwT4nJkGuqbPLTU1+zLzC6VZ+vrrTWW+/usxW RFrYxrzB1lBLzre31EVbvrXDUU/JuMouGxkn8cs0Jit1q6m37z9Lybi57j5C 2ra6cEhpvrv0Pz77vLrDbk9vyrm71mHku7TFUkPatLV0JBcbN7zRKSMzuqSr zz4506+07DI0zayt1jpAzLG6XTw75rm3yUJA2rWvwVVOzrK17jo5zq+3RhwU HmCvcSMkTamhsE81PbysvjcqQa6lsj4uU6+s5S8uTrWuxEA2+K+qt1E/2bCs v0M1S7euvDoaFSbFtDseKbqio8YvLl2sqVMnLMejp90vL8ypsjkmMbqpuj8y V62msFs6abCpt0cuMdmvscc2GhUpv740HjCvp6rqLD2+p6swIzyvnq1FLS2+ pr0xJD2urtU5PLuoqcU7RbyqrmA0MES7sbnLPB0WKL/DNiAzrauvdSpDsqaz KSPkp6G9MSo2sKfwJybdqbJmO1a0qaxrOdqwrr9ORERYyL69v2MgER69vDsf LK6rrtcoO62kuiMgv6CjyC4rTainPB8ttqnCPTvcrqm4P0C4rbfQXVJBP/S9 srC+KA8ZuLQ1ICmtpbHDKC6noc8fHrWdqPssLtaprTMgN7Wy+jxExq+tvEpe tbG/0d1cPjlOu62stD0UD0CsQSgl6KCtwDclsZ7TJB7OnKhlLzLSrbM4Jz+z tklC5b+ytrnI8by4zdnW8z80QbyrrrS/Kg8UvLYxLS23o7nNKi6gqTMkLqqi yEIyQMC7VSwyvavSNUbMuLa6u9bPsbpu3cDdNS9+ra23uncbDSamcjAzPams zzwhx53VKSvKn6xMMDXPv1Q9RNS0uz06xLm9urTBU8WvyGS/xT0uO7+vsbXM HwwdpMotMTitqM83IN2cuSwoZ5+jYyw2xcNKPkv3vblIN864zcyxuk7esrrW w8lJOz57tq6zvSoOFq60Li47sqjGNCJynrAvJ0Ojn9spMbu7S0hLTMi3XDRg uLzFuLt40rS5y8vK9kI5R7ipssMpDRimvCkqN6ulzS4fxZy9Lyc8op7cJjWx unJtPTjKslI4ZsO4trzTXcmzvdzWztJNOD65pLJMGQ09ozgxJzmcqU8mJKOf TTEnVZ+iRiVEtr/JSThCyrtdWV/utrK79UXLsbfL3cnNXT08uqe5JA0dn24l LCmrncMwI8SdvzQuOa+ltT461N3GxTkvU8XTzPNH17Ox0UnitbG80ce+2Ug3 VrCvPA8Spq0oKyPXna84JVmhrkQwNLmpw1LTw1/WxFw7ND9avrXbX9a3uj9I s7DAvr/BvOU8Wbm+JwwbmrYnIx2ynMQoJ7Geuy4qV6arPji3qs1LTtbfSzYs zau5z1m+tkA8urPIu7PGx9U7fbRkFwxTm0I1Ih6onkwkL6qguzIn3KOwQTbJ sLXBPvzCeT8uUravwk/EukRLtbrUvLi+v1EyerIuDRalqfEtGTugrDYoUauq yCotq6XHRkbGyL6+42tRTENmd+O8xce/W0e7sL7Kx7y4vkM01EsPD66tSV4i LKurPCvFqrhgOza9qbtpc8DsUM+9vchKL1vC2dzmxbrfOGuztra5zcGzzjxL OA4QqK8zQyU6qrU1Kcqiq10qLbCmz2fCxOC+10n8zbfoR0xFvbp71Os816/H 0rq3u7jJSU8xDxCrrjVBIjiotDEn16WpwTIovaTBTsK50LrYOlzoxMvgzVb+ x8y/zjxBvrS5v8W+ubngQCcOFaa7KTUmbKO6LiXIpbLNOS29psBE1LTMzNU4 Sby43HjN+dDJ58C5YkF0z7iywcu8u9l7NA8OsK4qOSEvoak2HkukrbZFJcee tzxat7m65i9Xwc1hW7zEx/1LvbTRTd3NvrfQzLS2V0VAEg6zqyhCIyepqUof P6Ktukkjd56sSUy+tbnNMz7HxVU7y7u+1lHAwvHe0sC6uMLJvLvYTjMPD6qq MjkdK6iqRBw2n6SzNh5wnaZeP2a8qLIzK2mtvz5FYrKvU03q38XE18m1trm9 0N1ZIw0ZqcBJNx1Fp601Gkiiqq43H1WhpeFZTfaipzYnQri4yj00tqfJR0Po urvO67ixt7vP3TMSD1+yXmYhKbiosCQd2quptjAr06KsUWY52p+rPStFwLS2 PDW/rLVeN0m7rrjXyLewut0vERHyxkVFHy+1p6svJS9Tpq82PFmvpbphMUqr qLRQOD7PrbxPQ+q5vc9DM/CsrMNd5ri1RRkWMEtqRyMrSrGlveQ/Kk20zOFP S8C2tdbStb6+wOpQVc95V+BzRkHfv+9XxsDHzm3nu7RdOnDTfUMyLS0vLy8v MCste7ixu861rK243tzd23dDd8jCvedW1MrIxb++ybi0zc7RdtrCaigmO1lM NCsrNUQ6Li0wNkjftrLFuLCwrrPE/NPUcMS/y9XMzlhv3Me4v/1oysrSx2NH xr1JMjQ8OC8uKCk5PzI0Oj9jzLOutr7EubK1yU1SWF7Du8DefsvLwtFWxLS8 y+nizMDJRj1n2eJMPDc0MCwqLTQwLC4+bdbCu7C0xcS+trfKSzldvre2vMbI tq+53nXOycfXU23Ixl41M1vnRi4nKy8wLiwxPDw8U864ub2/xri2ubu8t8pH R+jDub3a7b+usc9sYd6/wX5T3c1aNjJGXUkyKigrNjguLTU8Vda9tbavtsXA vb3DzdLd/Xr+5MG8wsfHvLa4yV1VyLrObe7qSDdCSDo1Ly0pKC83NDo+P2HP vsC+t7y7u8LFxsTOzs79a9rHxb22uL6/ur7Rde3OzdjwTzk1R045LCstLSwt LzVJTlFa27a5vby/vb/Fx9DYycK/yfVy8cq6tLe7vMPIyszuWGH15F46M0NO Py4pLC4xNC8xPkt2cXS/ubq6uru+wsrzat3Gvbu/1u7Tvbe5v7290dDG0+jp 32M6Ky47PjgqJiowU91BRuvZxMrvb09yd1De9XHMvrq9vbu0qqq74dTDwMDF 7GjEvc7j2NZIJh4tNi0rHyhWyLdhOcy5vNE0MFS9tkU37LamruPiu6y3183D vL7bS0/CvWFwwL7G3vnT1zkdIUgwJiQjPsm/1US7qLzeTkLb1E0yPL6/ycfM t6645t2wr8hoYtbBxuBkwq21z9DKyGkoGSl+Jx8jKc+9W0V6qKtFPk/cu00v M8muzd++va6x4FTEsL7lwrzJ09rkz726w8e/xc3fNB0jWicZHyY73ktMyaqp al68ystnOEjCv05Zr6/NxL7Mu7xaYL28bUjUxNvOw8G4us7cyGIlJOcsGioo KV49PL20st5brrdv4UNDwN0wRra8fdu0tr22222xt1JcycZmR8m81MjH68vK WDguQU4nJjs0LT45O1I/P+bVv73VvbG5wcbP08zvSWDQb1/Yz8vMyrq908fB yb++ytLaaFFXUkA/RDtBTDo6S0Y4Li0xMjo+NEHUzcS5s7Gxtbm5uLrJ3N3g 0tfby83t1MLLxbu+yc7eTUVNPjQ1NTQ4OTxCRT0+TlJTXVRPW1xSZsu/v8vN urG0vcjHycnQfuvO11tJU+7W3VZdz8pvXdnOXkhMQD9KQTo3OkNIS+7X0sfL 2NfIw+BPUGb8+WVbbd/S3fXVxMra4fHv9fRkUXrcaWLUx8ra7+bd5VlERk1D PDo/S1VXZN7S0MjDzdLM0dnV33V25uNqc9rgcmdcV1tXS0RV/U9Mad/f+m11 39d2V2Tr8VtZ/eTk2MzKyc7NyNPzZ3P9ZF5cWmx+V1n7ZVZOSlJSTUtJWOLz X2ve0t3o2dnW0/pbaOXrXlzc0+zZyc3Vz8/kcm1pXlxkaHnt/l9a/utsWE1P YWBMSVTq22ZY/dfece/e3Nx5Ulf6fFFLatj+XvfkbsfCTcvDU870WMFoXsBY TMHUWMNVQsRQTNo9V9o/VFNKakZX8HzPTHzTTdP+RtTY4vH60uvW1ljR5uvU T3rXXfrPV83MX8pfX9dS6/RBT/VhQVfNUnjXT85vVchEWNA9405Pz1vcS+HH UsN3b8Ne12pGymxN6HB929DK2dHRzNVbz+NQfkdN5U5LW3tTWtxPYuVJ9NtC 7tlIbN5UU+tZW9fu7szj8cn029F8zdX04t5s8dJJWNtVT9FlXsl5aedgVFxT UU5dTHjtU+rW89TvX83fUW7p31xa81Xo6urZatne3t7vWdDLOvfMSFThUFjL VNvlV9TgVNDfWvnrW3fsTGC/Tz+/eTnF0UjYbk76Wkz9emLLYtnHScy9TGDI bktkyERHv/5K2MZOWs5aVl/haWn8aO1U4ftMyu5F7sz5SczLSNvQP2jKQkzK WFXR21/J1mXM5VDp6f9BadZiVVrJW1fCXFLJ10fezzv0yUtLzeFG7t17ZVPW +WJe0+JX1Gll0lD/x0l9wEtMzPlX3mFy4d5mXtF+cfjt1Hhd22xO7P5eZ2Hd 4E9JZuxGVO/980rnz1txzczi6tRvWOLvWm7scGxt3fVoz+pqXeJ4SuNs7WRh zufsXM/YUH3n+U9PXndHSttiVv/d0NvrzltawmlB/NFYTtf9ZeT3++zd6nXk aWreVkXJ1Ufp1X1e19VOWc3YTlzcbOjjX2ToaE114VdHb9f/ZPPL3lvi2d1t ZM/bVFvV3VBf3XJh4+Fh6X5VZWtmXGzz7flNd8VySWXO5EZK2cxSVdTlY+/V YezTWV9m711N+NjuXd/Yamni3m5u4OlWUNffUVbt3Pldcc/lT2bYck9f1Xlf 5Orqc9/V/W906nVZVVX7fV5p+fDoz9tpbd97VlxSaHZm397y99fPYmLa6Fpc 7l1QUm3tUV3a2HVj29T1btvuU1z16F1U6+F66OfsaWHv/Gxt6/VbdepjWn3i 8f9/5uj0/Whr9t7/aWzv5V1S9893T3PS1V5RaebkW05r3udjZN/X6Fpd7txq U3vnfGh8+vbT52Pt2+BeYende1pffPJRTGNvbGr74urp3N/d5HxvcWlgXWPn 5Pn1593pevt9ZnL/T0pdaVlPXfF0a2P84Xt1fu97ferr8Ovh5ujg7d7P19fO yszLzNXd/PD1/uLe6u3U2Vw4LDE4NCwpM1DdY2G/sbO+vrq/zeL6bV5eWWDW zMzP08nGz3tm39x+XnLRy9b83cnN6+XLxNw5KCs8PSkfKlbUUEHNraqyvsHD y95OQ0tZXF7axMDBy9LNyczf58/Jytns08jEzNXW5G5e5srHVSceLVNHIhoq v7RELeSkn7JaWMC1ykE6Q2PV1tLLwLi7x+5zz9F9WuXFyt3dx7u/2U5FYehb Vda6xTAdI2DILhgdcqy+MkGonKLES32+wEwzMTpdz8rX3L+1uNZETM2/zmj6 xLe6y9jPye5CPUn2zsbAv7zBQiIeL1k0GhcusafERryfnrE9LkTG3jUpLvmv rLjXzbqzulM5RcSyvVtLy7K8SzhG2fhCPVq+tbS2ubjJOB4bK0cwGhg1p56y TsGin7c1JS1b0kszM1+uoqjGWMaur200QMO0yEVF7tBnQkBLWlVZ0bu0s7O1 u8TQdDMcFyJTTyEZL6OcsDs/rKO4MiIrd7S7UTtPsKKmxDtHuau1Tjtgu7nt OjE5V9PdUkv9vrG1xczAusNrTlrlQCAYH0/OMR4qs6S2PTi6qbNRMThhwbzR RTj8raez/9yxqLBuQ1bW2lE9NjtZxb3WR0nTvMP2Zda+v9VtatjnOR8aJ1dn Kh0ruqevYlm4q6/rNi470bvGRj++op6s8f21rb5ENDlQ0ctuPz9qw85BMTdZ 1t3exre1vMfOzNdPLh0bKVZTKB4ysKW0VFy3rLTrNS9DwbTGTE+4pKSwzdjB vcRyRkNN0cJvNS05aPZCNT19v7a0uL6+vcTrUlBMLx0cLmlJJiFKravCT9+3 tL1sOjdYubPJVfqypqm30dfGubxmOTRVvso5Jy5jxXc4NlHEubq7vr27vs1v YuhhLRsdONI/Hx9cqKjLPFu0q7ZILTLKqq9oOW+on6vsQs6vsfMyMW22ukcr K0PN4zsyPeG/v7+9ta+0v9t92NtAIRkiR24tHi25qrVPRsKvscw8MUm1rMM9 Pb2nqMBO5bavvks2Psm0yzMpN9HMQjM84sC/wL20rrC941lv8zofGSVTXikf NLGqvkdLvK+3dDc647e53kpfuaqsv2nPsa7DPTn2u8FHMjhd1lg5OFnHx+9t v62rtc7Zy84+HxgmXkYhGzSsqs09V7Cqt0suN8avwzo5yaysv+fOtKuw1j9V u7fzODzZy0o0N07uak5W0r2xr7W9wL3QLRkaOt4qGB3Aoq9KO72jqNcsKmav ujcrWa2ns9DTuayuzUFSu7fUREjSylM2OXDWSjQ+wK+3yr+wsb9iLRsfQzwe FSOupslA9amjsU0sNMW3TCkyuqm27smuqbLdSfK0sN8/V8C/Zj47TdfmPzVI wrvGybi0vcjnLRogZDwdFiqsrtj1xK2stm4yPMPBPS5OvMLWvq6xvr26usLK zdS9vGI9T9FTPE/XYz9M0sXEvbi/zMh9Jhgp7ioZG1WtZk+3qqvB/VZYyOk1 NdKyfDXfrKzJ2raxtLq+w8u9yU1J/V82O8zIRT7OuMxex7G41WI9IR5GNBkZ LLb7LcGmqrrdzmRV2UQ4T76/QW+usdzvrq7bv6ysvdi8x1hNQTk55cs9ONqz u27iu7zP5HouGibaJBYfTcwuRqasuru4vVxeTThM29xKSbWvzNCvrNfQq6u5 1biw8kZNSTUy1cs9Pc60wunAu8nuYDoeIuYnFSE/TCo2parDuLSvx0haXPpE Oez41LzQ3LytusytrLm9srBeSMPfMitNxz435bvC2b26yuZ9TSMfUCkXJzAu LTiur8OutbCxTlzI/EA7z1U4vblXe7u3v7Gsra2vsr7N1ko6OTw/OD3izOTk t7LH29tTKSZeJBcuKSI1L1ivua+wr6nF2rdcPd9oOD7Jx1RVycC6sbatp66r rcnNZTs/Oi4vN0n4TUTPt8Px3M9oREdGPzUoLTctKS1CX0dP6MW6v728trnP 08TF31Nf5e3SwLGtsq+tsba+4mBLRkc8P1dPTFhf8fpmfFhDRkpINyksLykq LC85OE3m0723tLOwr7a/urjI/tDO/+HGu7i5urSyu9LPx1RAXFI/RUtJRkxM WH5pUk9RTEg9NDAvKCotLS8zTnZwxrWzs7KytLm5vMTXzdH16s28ucHBs7G5 v7q5z1p7akhDPT09Oj1LTE1STEpOSzw3MS0rLCwrMDpIZtu+sK+1tbCxur2/ wcbKzuDt5M3Byci5t7y/vLnJ6t14VEA8Pzw6QkZJX25YVltNRT03Li0tKSgu NjpN8MO4s7W0srS7v7zCzNHI0OzXxMPLxLWzuLm4tb7S2vFNQjo5OjY3PUpa a2VZX2VKPjkyLi0sKi00Nj5yzsG6trW1s7a9u7u+w8XL39PHytbIu7u8vLy6 u8nY5V9MPzo8Ozs7QlphamBf9lE+PTkvLCsqLC8yN0r6zr62tbWwsri7ur7A xc3c18vO08q+vbu6vLy7yM7LfktLRT48OjxBUFpccXlhW1JEOTYxLiwrLC8z O0lnzL65tbKxtbm6vL/HzdHVycjLzs+4vsG2u7vN3b7STFVMTT86QUxHbHJh PjngNytNLiw4KDg+L1DKWvu5t8C7v7a6S9u6TVTN4Nzrzb28v7SuvLKwvcTO ydA/RE8+QEBLbVjiyc7oTDZLOR4wLR4sJy5NNtOtvbiorLC0ur7OTFr0OUXa duHdu7K/tK+zs7i3yVTmaT45PDw2PE1V38u9tr/H1T1LOCAtKR0nKCxBP8qt s7GlqLOyutB7Pjo/MzxlUXq/s7Swq66tr7m80FNSRjk3Njw7PWLgxry4s73H WkVHKCYtHR0oJC87Sra0tKWjq6ysucVgQEIzMUdKQnC9srWxq62zsbnOX0pF OzA0ODg8SdTEvbKvsbnd7WMvLC4hHSMkKC88zrm8qqWrrKy2xOFBQTkvPEZH XcK0sK6sqauxt73oSEI5MS4wOTc7YtHOvK6vuMPL3Ts3LyckISUmKTlOzr2x qqiqrK64xmhKPTQ0Nz8+Tsm8sq6qqqutt7rbS0Q3MC8vMjY9Yu3Ms7KytL6/ bUM/LSokIigmLTlR176xr6usrrC3xe9WPzs3OT0+X9fBuLCrrKyusbvXXkQ6 MC8wLjE5Q1TMu7mwsbu5y1RdNywuJygqKzM9S925uK+rr6+xvMvbUUA9ODs9 QlrSwrivsK6tsre/1GxIOzgyLi8wNT9EWc7Hvri0s8G9xkBeRS85MC0vLzZE QGK7ybuutLSyusrOVUxEO0hATOncy725uLS3u8LOynxKRD84Njo1Oz9ATVN1 797Lys/Ozt3YdFNfSE1ORFZZYdfKycG+xcLE7u7oS0tNQkRKSVtWc9HozcrL w8nW5+ZZSkxKRUNPWFXt09DOyMrOy83Z++ZsUE9LR0NHSUtPUVtt6OTg3NbP 3drZ4dnV19jW0s/R09bc3OD+XFJOSUlGREhITFBQa+nd2NPM0dbU1Nvv7flj Y2BdaXxycevr/HJyZlZWVVZWXm5z++Pt4dbn2dbb0t3s5XZg6F1b81Zge1Ff aFdmWWFnYe5y7ebo3fj26/z55/bp3uTY3ODo7+Z7fXhs/PD08ezj7Hf4bVha XE9LTk5OUVRZXWru6OnY0Nrc093h3fTx/3Z1afzvfv/k3+ne3uTh53RkYFdW VlJSUVlbXnfo3tzX29rb5+1oX2JTV2RaZm/06Ond4eLu735dYWJcXWZtanD9 6vLe2eXZ2OHe3ur5bWpfWFtaW2FpefXv397h4ODvZ2BdWVpXV1xea3V37N/d 397e4u397m9eamleaW1xe//j5u7f4uff4OZ7YWdkXFtbWl1lbGzv3ubp3d3z enJpXVlcVllfXmdx8uPe4+Xf4ePn7H5ubW9tYWJnbX7n4NzY293e6v1va2Va VFlbWGJrb/bv8/Hu6ep99u1qa21pamVqbXrx+ere29rj7e53a2NmYFtcXWJp ePbv5N/h5uHo+fx5bmhiX19kYWVuc/358ezo6Ozr8e95ZmtfWl1jamj45e3i 2uHt7/xwa3duZV5hYF1pbf3u5+bq2+bo6W32dG1xaWxiaWtp++vf2NHTztHX z+ztbE9ORURBQkVDTFBY++zh1NHR09XY3tzd5ejj3OLq5+vm5ent8vP+eWtk ZFtdY1xla2BrbGptYmhpZXNt9PPz6u7e3dnYztLWy+bd6VZeTUpCPkI9QEVG VF/v1c/Kx8TEysrM19Td7+n9fnNrZFlhXFlfW2Vkae/y6uTZz8/Nzs7M2c/X XulRRkc6OjU1NzU+QUjx28vAvru7uru/wMbNzuxvaFZVT1JOS1ZSWmFf9e/o 1s7NysK/xsHCyMnT4WROQTk2Ly0sLC0vNDxGbdTEure0sbG0trm7v8TL235p VU1VSEtTS2ZqeNjVysrFw8fDysnP6+BdS0o6NzUuLi0sLi82O0Vl3MO6uLSw sLGytbq+xs7dZWJRRE1ERFlMYdjdxr29ubi5vb7D2+FtQ0M6LzErKSonKisu Nz1P3sa5s7Cura2vsbS7v8zd6k1NSj5GQ0hXYdnKv7m2sbKzuLrE6epFODcs KSckIyMnKi03P1nLvbaxra2tq62ur7i6wNncWENHPj5GRExs2s6/t7iwsryx v2fERTNAKyUpJSAkKScsPD1Xx7y0sKupramrsa60wMjPdFJWSEFMSEn14d2/ vLu3w7+5T9zPLT4+IyktICAtKiZATTy/t7yuraytq6uyr7O8vsjQ4/juWVVd WGDx2NLMwN11u045wTMoVisfLCwfJT4sLMZrda6yr66rqLGtq7S8trZuyrpM 7MRaXs3hXsrJ38paVcgzN9QlJ0IiHSkqHydJLzu6xbesq6Wuq6SxuKyy+L+w S3W0T1W93ffEwM7Bus9cbswvL+4jITYhGx8nHyBHNTqyu6+lqKGmqqattrq1 zmC6bEvAXmLJ0M7EvcS4uW9xxk0rTDweKisdHh4iJCU4PNzEvKGqqZ2pqaSs ubWvUs+4P2rGWFfRv97Htbq7X324MC3cKx8qJx0bIyQhNzZCrcK3naWpoqWs sbDIvcA9ycI87cDY3r64v7W7vdJGvzoqTScgJR0eHB4lJVBAQKWrrp+enqmn o7a7/crLMFb4P21cwL7OsLOzuV3ZxDkqOy4dHx8bHh0gLz9G5aWmqpqeoZyn q6u46mr6NzxHMVvXRr+vuK+vx2i7VCg9LR0hGhoeHCImQldSp6ihmaKcmqen qrTrY9otOU8pSd1Bw7evr73Uu7ovNkogIiIXHB8gIyzPTsGirJ2bpp6iqK67 ulXaRi1ePDp5WMTAsaxU1Kv1OkMvKScdGR8nHyVM39WuqKSdn6Sorqy5eGLd TTZHRT7b4Ou7srhiUbLMNzspKS4dGiItLSpYuK2jqJ+ZoKesu8LVQSsyPSsw NUa33M6qrLxNtLQ5aS8fMyAYHSAtKz2+vZ2bn5SYm560rr1IMycrIiYtIUXT S7bDU8Gu9DrONig2Hh0qJCo3+8qznaCakZuZm6usvVc0LykdKS0jOEZN6DRI u0I2OywtLCAeKTExRMC5qJ2dlpKYl52nqbhwNzAoISkoKTg+Ti8twz8rRSoi LB8aISorN9PDrJ2emI+Sk5WenqbCXEswIiknIjcvLDUrVUYqOSopKhsbHiIn K1DGtaWfl5GSkJSamqSzxPk8Jy4tJjYvLCktaCcnOB8sKBUeJR8mMGTLrqei k5KWj5WYmaetueE7MzkpLC0hIi8xHygvHSkpFiEoHyw8VcarqaGUmJiQmZmY rK6t6DznRShENR0tTCMjMh8gLBgXJB0fLi9dtLmomZmYkpOYlZyoqLXV2k81 NS4eJTwgIC0cIiwYHCgcIzgtRrK/rJyhmpOcmpadn6Oyr7TzTkorJDgnHS4g HCsbGCQdGSsuKMzGy56kp5OZn5OaoZqmq6O30NY2JTstGSokGSkdGCYgGygx JEzNXaiprZudp5qboJugop2nr7xPP0wmHykdIB8VHyIbHy0pLERFu628qJ6p pp6moJ6loKGlqr77vEgrOyEiLxobKB8bJyIlTSpesF+yprOtobCknq2eoKSl ubyy1zc9LCwsGx8sIR4qJy48Ks64Y7Syuq22yquutKqyp6vOr6zPzt41Vzsg LTQiKyskPi4tvttbuL6/rtG9rMqvvr6u+lauvlG1T0e/MDJRNCpLKzLRKWLB R8fL2b3ETrjBxL9ltsI9X7n00dQ8teA1YN07RjktwTw4w2ni419XyUfcwOiy y8G03UjCx0zFPVfCOjFZSjZOLnPCRMa7ur/jTeBJPvtQ39Tpw7po8LTzz8hR ystCSF03PTEub0VPy8K9xNfUwlzwcNjnWHvLyFNf0NXS2tzMw2xZWjs6Oy9A PTxrbd/W39vEz8rCycG+zMTA1nllz/jnXOvNW2JOOz09Mkw/QlJLdFNXXN7l 1MbRvsHNu76/wtrBxMTb0dbyTzk+Nzg0NjxFOj5RVF937MzIwMnDw7/Nw8DF ys3Au8DIzs7VS0NEOzozNz02NzlCPk1Pb9La18DDwcPHvcLBvrq7u7vIw958 YE5AQDk2ODQ0Ojo7PkNhZXvux9G+1MW9yL7Avry6v7q+x8fU6vlTREI3NzUw MjU1PURNWt1yy9HUxsXLwsDDvMPAwb/RxsnM2HP0bUtBOTg5NzQ6QEJFSGfq 7HrLzM7Ew7y7vL+9ycfMytbcb/NUU0hCPz89P0JCSEpKTldKXWrv4tDYvsO+ wLq6wcLKy9z8WmBlR0NJQkRGUUtUSkpRTFBWZvh9btTezMPMw8PGysbHzNFv 7WNiS09MS0lMRkZLS0hHTFJeduThzdPPzsvLy8rKztHX1nnqXWFYV1pgY2NX W1BRSklVT1Je/2D06dzOx8vLysrNy9HX52tyW1hOUU9VT0lNTE1IT1JgaGvo 5dze2c3JzMXIx8zPytHf7uD6Yl5OU0pHRz8/Pjs/QUNQW2PR08rCwby9usC9 w8zT1eDd4vfa909USkdHPDs6PDs5OkJJTFdj3snGv7u7urzAv8rQ5Nfl1c3K zcfKx9RVWF5JPTgvNC8sLTE2RUzsvLmzr7GxtL7F1VxQRUBIP0ld38O9ubW1 tLa8xmtCQT0vLSkqLSorND5TzsqwrKyqrKyvv+xnRTs0LzM4OkNX0L+8s66v r7S3u81LPT43LS0pLjIuMjxN28bCr62sra+vssLmUDs3LywtLTA3Pm7Ow7Ov rKirrKyytcxJTEo2MCwqNCwrLzlAW0/LtLmytbWvuNDYaFA/LC03LzIzO9vJ wrGtqaesqaqwtL3E+D42OjUtKiQsLCgqMDpYZnu1sKyqrauquMjcU0s4LSws MjQ3RvXDu7evq6utra2utbvB4UU4OTMuKyctLioqLjdJTU7Nu7KytK+ts73H zc9fQkNDQkE9SGVladzHvLy9uba0ub27u77LT0BLPjIuKistJiUrLTM7Q9S6 tq6qp6Omq62vuMhXRj40LSgqLy8xOEnewr+2raqqq6utsLi+xWM9OTgyLigm KysnKCsxQkt7vbOrp6mmpauvucrYTjYyLy8uKC04PUtczLOwsKyqp6qzs7XA z1xUTzcsLzE2MSotOzUvLi9DYEdnxLWsrq+opqy0v8DDXDw4OToxLC01Oz0+ Tc28urWuqquws7G1vczY2mhNPTU9Pzo1MC4yLyssLTM6QFPLua+srKuqrrS8 xdRmRjs5Ojk0MD1TdejRuaysrq6vr7jO415FOi4vMjQ6P0VozsnHy9fia0k8 OjM1NjY6QUxszce9t7W1tri6vcnX6GtUSEpYderczczY9Oh8825YVlpcX33o 0MzLyMfNzNLdVUY7Ozs2Ly8yNjg0OUbuz8rCubOzuLm5vMne5+rvbWne187P 1MvL1O1qamJLSkhJT09La/Tn2dze2udwalpcXFJRTEhGQT9BQ0JGS1bt7NrW ycvK0c7IyczX1s7LzczJw8bKzczP2m9VWFRNSU1VW1JRUlhbUE9XYGJdXmtr XFRcX15fWl12c3VaW2FiXWJiae3028vKycXAvb/FxcXL1O53ZlROS05KTkpM VE9NSk9VXVZg+9/b5Njb19zf+P36Yl9ZWVNMTE5QT1dWY/fo3tXQzMnHxsPG xcnKyczW3+Pub11TUkxIPz8/REZJTFNfe+/i2dXa1N3f4Pt5Z2lzbFtfXm54 cm/o5N/k3NjU2Ofd6uh3+XTu7Xb1dtrt5e3ofmtuavhPUlZjU1BQWmNVVlvq b+568eTz7fjo3+Hv9N3pdnNmbHz7bnzr9O1w6ODb3+zW09Ho5uj0aGRZX2BP TkxTVlFKXG5z+WPa6tjg1c3X4PnZ6O1dfHFeXE9pW2te8Ovo4/XZ3uXu5Nx5 7n31ePNn7P9feF9jaF5ZWFZnflZoeu5tZvXn9H7v3vpr7//Z7F103F5ofG17 8vrr7Ozk9vzX9l7f2Whe8NXjXWDm5VVN/9dYQknVYkhJ5cpnTNnA6fhoxr5T TtLLYUla1F5IXG1kSvHa9VrX1c7z3NXcdW7YX1FeclVPXvx2VN/bel7g221p 7vJZWHnvYl5s4O5z69nob/v3b1hi8Wtied/q7dnX4Ovf2+d7bHNtXFVVY2Ja XGz8Y1hl6uxubN7d4PPf1+T17+pyXl1qXl9hYmtueP3+fnv78evu8ujm5uLi 39zrdHNtaV9YZWVbWF1hW15kee7p4d3Y3t/k5fBwaV1cX11aXGVpdHjq5ufy 6OHm5/b16+/u9frv+fp0anZwZmBva2Z78vl48+zyanr0cmdqdm5hXWZpX2Jq /HB07/Dv7+ru7eLc4Org6Xd3c2xhXFhaYGb86+3i39rf9O3rbWJmYl5dZW9r Z3J7cP/8/v369fHr8fb0+Px7df9yb3t2dfZza3T4e2l08fD7bnr1fXN39enz 8+7t9m91/XRpZ2psbWhnb312bfnue374+3F4++zt9Ozo/nl+bW5nanJ3amZq bWtnaGhre318+Oji497b3Ob18nxmXWJpamZmcG9tcXV+eHH37ff38ffz7+7o 5+70fnhvaHNoX1xiZmdoZW1y9O/07ufj6u3s6ux6bX56al9hbmpmaXr5e3r4 9/ju7/Pq6fj8+HxuZFhZ0VJux0HP51LS3VPPa2DZVOxxbfPyeVTiXd/cYv13 9exmcexP6V1X61l5afZU1HBoznXe1WnidFJgUF3XWO5pUtR5+Mvo1vTmX95T 3Ftm3VrncGX86FndfF7bXmjZWOduTmRdZXtn621e3unu49hn3+JL4etV2fRU zFLj1Wbbdfx3bmxpX+Zm9ehc9+xY/G1W9Whb7uJdbdT34d5k/e9Pa3pWW9Zb 6N1fyWZcvlhm0Eps3kdhblff/+Xs23Ht3E/73FBj61z6de9ue9Fu4eBf2vJZ 2llV6X1M/Nlc1uf8ZnjqXPpsfl1UaHdpbs1n3ctq5edd7Vtcd21r/mJ8dfJZ 4txK0dpQ1W900k/fyVbdyk9Z2UxM3ElO12Pr5PjiVHDkXGlu32ta1WFa5fne 5N/cVvXdW27pfGHc4U1a6m5s3txt/tn8UeThV+3c7mJh5GdR29hO5d1K59ZO 6exU5//23Pbd2mlVX3pfZ19bZXj99ut+5tjcc+/8VuVkS+50VM7G5e7TcmP5 VkxvXlHYdVfd32X7flNrZ01a52l21P9+0dPm9+Tg3mzy1uzy2NBsbt12XWRV eVc/UulXTn1nP07lSEnZ6XRxW37Ya+/H1PDPwMTTzr/AxcTAv8K/usHV3+FB GBAsMBwt27OtvsSzukResctMzL7Gzr6vu7+tq7vzz248ROe/u7W9KwoTniQP zLusqEKvp+4uMrtILr2rvWK0qlrPqKm8+3YxL1DSqKaur94dCiGkFhW6zp2q KqGe118sY0AixqvNTNC0w7qopqvLOywuNDW4nqm3vj0YDx87JyBsn6asqbKv t0A0Q87kRtdBLsi5Vaiaq795Ly8+Ly7MrrS8tswkFhknQzYr25+hr7muqLNP c7S7OiY3TzI8u6ahp75PTy4eIzJA0rqup6ivyyoaGylwPS24naKmrruruTE0 Oy8tLEN+Tr+zsamvUzAxMSUs98K7r6ylo6zEMBoSIMZCKbGXnafAUL7JMysu QUQtL1a/tb+2p61eKik7MS5WtKuusKujqsM0GBQeRb5MRaSap7TbQF9bLCMs Qj0+creprbu5r8spJTxCO+K5uLKssK6mr20mFxYg08Ez2pudr7hfNTMtIyg8 8sa6trWwtM/HtlgrK0V8VGXEs621xK2kuksoFhUcOa2yt52euN0wJiowLz/X vq2yPj6usvdOvsNHLzRl0rzIu6ywxsivu1Y4HBUeOreovrykrmUwJCw9O0+y s7m2zkc6PtC7wcW9zENDRUnd29S1r7/BtMhYXiobIDC9qdtGtLVINCUsyLCv sdV5fiskOM6yrK6yvO01LTdaxbe0uLa949i/vL9RKR8cJcHGOsWqtLs/Kj/B ub1SOT4uLUDPsqeqr7DbLSYvV72vtLm4yem/ra+3xCwZFxtErcr9r62x0yss SL25RyovPT5Y1ryhnqvF9D0tLjZltLG9u7OysK2xvOUtGRUWI62qy7Krt8Yw IChYrq9GLT5+ST/JpJ6ovtlhLyYsU7qurLG0sbC3uspYOikeGRYpp6fe2L66 wiwjM9erqmkxNywuva+qpKKtv1ApIi7cuK+xsK+4ubvF4z8uJx8ZHP2mvFW/ vb3GOS5AuKrTJyQ0Tkt0rZycqL1RKx8iMNmpn6WxvL/E7Ffxze41IBoZKrG7 P+e6q61DLz7St1kkJ0Tmybmrnp+t2TspJSxCwKumqrS8uri9ytTxOx8WFRz9 qsXXsqup1isrNs20PiUrUsDFuKObortHLikoLE2snqOvuri7z1xU6Hs4HhUV I7es9c+zq6tWKSg8trYzJzTDtbyxpaOtzD8zLzM6XrKnqrW8ubnF7VxqWzIb EhUtqavrxbGrtDUnLFauuDgtO8G90bqnpK3JXD4uLDBer6art7i3us5VTXZb LxsUGC+qrPzNt6u0OCw0c6y1NigyfWHiraGjrrzUNiUmMuivpqivtba4yG5k 3kokFRMezabIRsarpNIsLTy+sEEnKka/w7mln6e6dT0tKy08v6ekq7S1sbvo T2XwNRwSFSuurkxftaSqRSwsQrG2NCYwxbvUtqSjr8DTQi4rLUC7p6asr66t w0VAVEYkFBEewKjdPsWloM4tKDS4rUooLXW62M+roai2v/02KioxWq+lqK6x rbFqP0lPLBgQGU6pwELbqJyzLyUrxKvfLStVuPlGvaShrLfWPC4pKzbFpaSp rKqowEhGPiUUEB7Prv1Gv6KeuTQjKcCvRygry69pOtOknqew1DwuKCgteKif o6moqr5XQzMdEBMqvb8/YaydoMM4Jy3UyDQjMLGsaTvHoqCprslELykoKkqs n5+jo6q9+DgfEQ8gzc4xOqqZn7lOMTQ+Oy0mMrmswV/KrKitrrHDPysnKC9W saKen6avvmcpFA4YOtc4M7CYmq9cOkZZOSggKb+ouj1Kq6GtwL6vuz8pIic4 zayjnZ6ms/UrFxEbLC0mPKCVnbLY08hJKiEfLcyxyD1ZrKGqvcK5vNk8LCUp TrWopKKiq8IxGhghKR8bLaGTnbzWr6pfIx0nNEX62e5hvqmnssi+tb5fPTIr LVO0qqahpK9VJR4lKx8XHdmamrJSvqCrNR0gS8ZSLi9qsq/BzLKnqrvX7WI8 LCxBw66mpKizUCgjKywfGR7joaLIPreepkciKr61OyAn0q2/QUuun6bEYsS5 6y8oNOC2rqysrrdTKCApOi8eH1mosDctvZ+pQS3yqbI1Jju8xTszyKSisvjT t8A4IyhMubO6ubGvuV4wKDBNSy4lL+LDTTE9vq23WEXJr7lLNkB26XnLtK+1 vstdOjI3T8u4srC0v/NIPj05NDhCTE9HRUhFQ0rgyu1T3b3HTT1Pz87m2buv r71mQkFKT1rovq+ut9JOQT89OjlAX9zce2FWSUJCTFJQUlNQS0lPVV3Xvri3 ubvD/kVEV23oyraur7vaU0Y+NzM5VdPU+2x0XktHR0hMW/hlSkZp0dtodMa6 vtpNSk1QWllq1MC2s7a/1GpUSz03OlbR3Vtb59tcR0t14GJKRlHw3XBZ7MC4 vt5eWllMQk1y2NHRxLy7yWVTXWBFNzlM3+VaV+7O0vhu9+xgRkRRa9vT3t/F t7vqR0leak9DTOXN0NfMxMLPdV1dVUQ+RmT7WlFd3tLnXVZaWFZUVm7d0NDY z8TD4ktIWvdeSkhb0cXN29C/vtdVT1xbRj1DYvZkYuXN0m5VVlxpZFtp2MrN 2NrS0epWS0tXc2tRT3vTz9rez8rR9V1aWFRRTU1g0srdXVxoYE5IU+PW7f/X yc73XuzP4VVMY9ziYlRm5ud9bPrj19HeXU5WcWlSV9rH0VVES15hT07xysjb cuvX3mpaauv2Zmb33trlaFlh9e94+d7V3WpXWWFfaOXV1n1RSEdNWV1o487M 0+x+39XgaFxu4nlUWeTN1WZYauLsYWT26HtbVFZfcObWztHhaVVRU1ddZGzs 4OPu6dzY4WJfePthU1zv2+Jubere5Pz16e36ZFNOWXHo3Nzd3exdTUpPXWtu /eXb19zk5Ov4bGFmZWBland4+uXq5uDc4/90a15ZVlx+39rc39rZ7lhNUm3u al/51tDjYmJ8cFlSWG58Yl1s5NvZ2tzi6Oh8aF5aXWZyd/Hh3d7t9nVeUlBa c/9u/NvS1uhoY3F5amly+nFdWmL+6OLr7/Dr72peXWn/enzu6ujc3X5iXmBf Wlpm7d/f4eDneV1ccOXf63lqbWhhbfLe5/jz7PRqYWFy8fT8efXp8mhbW2d1 YFhf893d3dzj+GddXnjs6OZ7dW5lXmP/9+/u9fl5e3xtb/76/nvv4eHnenrr +mVTU2Frc3P+7Ot3Y23z5uTq/mlnaHN7c3f76er+cnT9cmJbXXLp5O3t39rh bF5cXVxbZXnq5eTj4eLs+Pj4dV9XXXz7aGX55uLn6+Tj+2dcWmJv7eHk5eDg 721mXVlYW2NkZmv05Ol7bXh4bWNeYvXe3+rm3ODo5+foe1xXWFxkbvDo6N/b 5XBsemtaV2Xy7nx25tvf9nV1Z2RgXmZ1+v9qc/h7fu/k5PZnXmZ87+54dO7l 4fVnevNyXV1reXBoc+7s7vR+cWxobPz7+O7s7PpwbG7z7HhlYmRpeXhrav7p 5ufp6ufremZocm1paG345OLqe21oYmRjYmns3uju7+jxeXprb2xncfrxcWh8 7ujq5uXueWddV1VWWktOwWNQvFBkwUTuw3Ptxslabt1U7WlFfU5lXjzl1UTP 127N28/JzetlavVMRuZbSs9Zb/Xn3E3D9U7NaWHPU1vnTGNSV+pO5tj95VrV 2lLSel/h935TeOJL6uhVz3Pq0v/mbXhdYe7td/rmddnsUtjrVW3tTX3QbGH/ 7OlsbvJ23t1ffeZ4a17UYVHKTW/cSexTWv5NyGVazOzifF7bal77Y9FWb81T 3HBg32HcWFnTVG3cVPPoV91xXGHn1mr4V9zuT+3cenHg2ut1bfzz+vB5X2p0 WOVaYdpO5O1r+/zaam9y3mlV2fF3b/nnfW9ya35T+tn0Y/XY/2/nee576epo V2rYUUjv/FZy4W//2f5l2nlN6+JM+850XtjdVuvyX97wX1rf2U9i1W9Y595f Zu9qZeZRY83uaN3O9VvmYmRoX2xx7GVl2/Fn93Hkb1PxeWFtbdvfX2rV3Oj0 6OhiYFhgdVPr33hx7uZr/vFn9upeYOxwY/n1XW3xWmrmb1993F1o3fV9899x 49R8++3uYl/u7eDl+OnZ7m/Y2end3uDvZ+zoYlZdWjk1Qz0yN0JHQlTV1sq8 ube3u8TGxeli/GVdZubp1snKw8DAx8e9w8bF2zQjMjwjHiMzMStHybivq6Sl qq65vd5ANistMTI8Q+K9vbWysLW8usftVE1NQE/k5dTCtrK32DVJyTckIC40 IiY5X9zTtaurq66wtcDlPDY8OzMvPVtbZc+2tLu5tbXD3MvN4fDSydXQycG9 4js8VjYoKCksKio1OVLGwLStrK2ztrrF5kg/PTw9Pkxp2sbEwsS+vNXuzMpv T+HKzdbRw8DBxtVKNj05KSYnLS4rOlbnu6+rqKmoq7jCylUxLDExKy08S1nf v7y8u7y6v8jP2MrHy8zPzL++w8TE5Dw5Oi8oIiYtLC45WMG3sKupqauwt8Dm RjgyMC8uM0BX4cm+vb27usTay8rV29DIz9zPxb6/wMpVQDwzLCcnKisrMUXh wrSrqaurq7S+zl89MTEvLjM7R1rZxb+8u7q8v8HIzMrHx8vUzcXFyM/7RDg4 MisnJysuLzpOz7euq6qrrK+6xuBNOzIvLy4zPElf18S9urm4uL2/wszNy8rP 7fnUx8rbYkg+Ny8sKisrLjY8UdC5raysq6yvucbfTDsyLi8xNjxFW9jJv7u6 t7q9v8jOz8rM2d7dz8fJ1ldBPDgwKygqLTEzPGvBtLCsqaqtsbe/7Ug7My8v LzI3Pl7c2MW6t7q8t7vExMDBzM/N2tjKx+NCOTs4LyclKS0vMTvpu6+tqaao rLC2wmpCNy8sLS4vM0Nu7867tbW1s7W8wcTDx9Tk4ODZzc/vSTs7OC4oJCcs Li857rqwraikpqqtsr58RTguLCwsLDFFaX3OurK0uLSzvMbEwMXT3Nbb18zM 8kc7OjkwJyMpLiwsNu+7tq6npKWprK+82k04LiwsKikvQldX0bexs7Ourri/ vr/M3/BvZ/DSzetGOjs8MyghKTItKjB+u7yzqKSlqaqst8dsPDIvLCkmLDg/ Q3i7sbGwrKuxury9yN5lT1lueXj1dT42P0I0Jic2MikqO83Ixq6op6enqK+5 v2o4Ly8sJSUuOTlBz7ezr6upq66xtbzF4E5DSVJPUGFJNTVERSwiLDsuJixl xNG8q6empqWqsrbESTMyMikiKTQ2NkjFtbGvq6mqrbG2u8hcQUBLRUFf11Ey N/RWLSQuQC0jK0nT6Meup6SjpaqusMFFMzUyJiAoMDI1UL+2tK2mp6ytrbG/ 2lg+PEA/PlLK1Tc03cs4IihGMB8jOfJPUbSnpKKipKeqtF06OzQmHiQuLS4/ yLa0sKmkpq2xsbPNQz1FRDg3YMPHVTlmv00uJi4/JR4oNlVEXa2mo6Kkoaau wU5EOisiICgrLDNOwbi2rKSjqKysrb5pTklANjZI99TSUT/ew0QrKDc3Hx4t OUA+0aqopKKkoqivyU1GNykiJCorLTlmwr20qqanqaqrsrzKZUk/PD9GVPJp ODvFai4qLkkrHiw4PElMuKyrpKimpa2681RILygmKSwrMD19yMGwqainqKir r7fMXlNFPD5ETVdFLz7JPS0uM0ImIzcyQk1Nsq2rqKqkqLK62O9DLisqLSwr MzpYzMGwq6inqaeorrjG1mRCOzs9Pz8xK1vgLjMzPj8kLzw4WT3Urbmvramm r6++6NM+Ly0tMCcsOD7a0cGtqqippaOqrLLD40s/NzI2NS0lN/EtNT049y4v TztqQWazx7i0sqe0urncyEo1Pjg4MDVBPl/cybm1rayrqayssL/Zfk05NTg0 LCg0PC47LzfEOjPqYWp6+Me+v7+3tLq/w8rYX0BLRjtERT9P7eDNwLy1r7Cx r7C1v+17TjM2OS4vLCk4bzs9zXPG2kzN01RaWk1RTkp40e/Iv9TFv8zM3eHe aFhY2/1u2NS/ury8s7a/w+Z4Tz44NzguLTQ6PENIW9Pf7OLT2W1gXmpZVnDo 0czJz8rBzczS2s7laF9892xve9jIysvAvr/O6uH+S0BARjw4OT9JSExl2tnZ 3tLoXmROSExHP0VcYujc28jCx8nDwsvR2dnSfmpf4tjc0tTJxNHy0ulZTE1G QkA/SVBYX+va2NHW/nVpXUY+QD87OkRJWu7fysLGwb++w8jLz8rf5uLz3uTu dtra9ffq5WloXlhWSUxZXGhl7N3b1dzx7e9YU0lBRT89QEhIUlxs7ODR0MjI 1s7OzdTf3uPe5fje3ebe29rW3ebm8/BiZWpqem166uxtcHZsW15aU0pKSUFD R0ZLUFz87uvgzs3T0NPR1ujv625fa+7p4tXRzszS1dDf4+HzeG7+aHh6aGpu /35eYm1fUU1NS0hJTU1OVFhs/Hne4N3c5N7f8+r5d3DycfPb2NTW2dLV2Nvb 2ux0fPzvff7o6vTx7Plrc2pXUU1OSkZJS1BVU19qcfDt3u3q4+Dg52z59HDt 5t/Y29nV1tvb2t7q73r6dm7/8+9tbXz7emv8/GNdWVZaVllbXFlcZ2ZkXWVs ZmJv+PHufPr56Orh3dfZ3Nfa4uLh4/h8/n3zfnHt83B6+/TsdGdkX15fWmBe XGdiZG9jXmJiWGZsY2r+4+Xv9+3o9+zh4Njb4dvZ7Pvu73hta3pva/TyePZu dO92aWZnZV9lY11ianVuZm14Z1xfZWhzbXHy7e324eP16enn3/ry5uf9++rp fnnv8G55eP3peXX3def5YmtpbGFaYmJkdW9z9XRvdW5qb3FnaHVwbnX64t/k 5ePd5uTq/ft6ZnB7b3nv7fV1+e/8+2Jlb2ZqZmdnXmBvZWn9fPvv5vJqamtp al9pev7v5eXe4Obf8/t6bf9paGdr9ev7d/Dc5vn7/PJ0Y19kc2lo+Pzt+3n6 YHj5X2j2a2xjYPhpXXVranl+4d3o3tne7/v28nxraWJk92999O3d9vDu7fdf Z31eYVte/3Nw7+fr6uzrem/+bFpWW1tdYG53duXd3eDc6OXtbW9pX2JhY3H6 5+To49Te7OHzbV9YXF1ZWWVx6ODi2trf3etydmBdV1lgW1pfanFv6+713N/z 5Xz+82x7fGdy9u7u6u/h4ebi5H16bF1gXVZcVlpvbfTr2tfl7N/leGx5a1li XVX7+Xxybuzg9ufd6+Z0ZvNiV2Zu+nx96Onx5HRz8/5oXV1tX1dganN1eeLc 3uXp6u73cndxYWlhZX78evv25u35++7v/nJ2dW5cXWxdZvvp2NjW0Njb3vdt XVVTTU1PWF5h6+Lb1dzZ3e1zZWJeXl9idmz29f7l4+rn6fLyeW5rZWlrXlxf XWhtbG9rZ2569uzo39/i5+Dc2NPV1tTW09HPztDb7GpMQzcwNjEvMjE9VW7K vbSvr6+0trzPbEtBPjc4PktfeNrHvb3ExMTL3G1caXNy787Ev7u6ucc/MDEs KB8dJC44QvKwpKCjqKiru105NTEqKS9H1sa+tK2tt8fO3k47Oj9KTlzPura4 uri3vsvY19NJKiQsKSMiHyxNS/C9q6Kmq6+zuWY6NDQ4MzdiwLi7ubS0vOJj +1lMTlbOwcbCvL/N8k9OVUlI8czCyD8uOzElIh4lNzlMwaufn6OnrbTcOS4r KysvRcy2srGwt77OVk5QT37Sx7y6vL3D7VFBPUFFTtS9trLDOjA1JR8cGic4 R8Swn5ueo6+81DQmISYuM0y8q6OmrLPCXz40NDxR3cC1r6+3v89ZPTIzPUrj vLCsrLZMKikkGhkXHjtut6admJuirdVOLR4dIC0+7K+inZ6oscdNMSgqNUh4 wrGrrbrO3Uw0LTA8Yci4qqWpr71AIx4dFRYaH0W5p52bmJymuD8tJx4cJDPe taienZ6owH46KScoMUzdvbGrq7zL20s8NzhC0L67rayyt8s7IRwfGhkcH0Gz qqCdnJ2ouE40LiYgJjJWxbOpo6Gpuc3eWz01PE/q3OTEv+dffv9sZl15xb3L wb3Fw9tGLyEmKh4fIiNfy82ur6SgravA0r44MTItPDhB3cCsr6+mrKyvyc9u QzkzNjE3Xd/Guru+vspaQT44MjU7P05KUtdzT0w9Pko8ODo9ac3Pyby3tbvI ys7nZW/aysG7t7Wxs73DzlU/Ny4vOj9JX97S1NHoXFhQR05he9fUzszcc0pD SEE/Qj5CTVllXmNwZGdWTlhafNvLvry1sLOys7m/zO9gT0ZDS1pv+WVlZVNJ QD9AQUpV9szJy8nN5mFUTEpMSkpJS1RTTU5RTk1PT01ee+/OxcC8u7m8vb7G xcnS0+N37nVobl9VT0pHRkRARExTeGdgvsDvy9lm1Htk3k5LWUQ/Pzs+PjtD TEZR6+XVycS6trm3try6u8rQ2f1cXlRMWlNOX09CSVdKQFBh5Njjw8DLw8nP yulxdmZdSzcxRz0uNjI4XDg7Zl2+vsmvsq6svbe3ze5IREY7PUBIbenMvbq4 vcrQ7U9CPkVMS1V53MrGyMK/w87a1Xw1KC82JignJkdCN9nDqqSwpqatqcRV 8T8zKys4O0R0ybeurK6trbvdYkk8MzE2PENJT9jCw8K5uL3By9fRUy0lLzMg HycpPkI/v7Kjn6yio66xbT9FMComLUhJVL+uqqqrrq+11Ek/OzAsMTc7Sljg u7S1sa+vtr/D4T4qIyomGx0fKjs33rStnZ6ooKSrukdEOyknKC5BTfG8raip rKyuvNlPPTgxLC46QT9Oxbq4sbGxr7e/x/w9JyUtIBscHi42Ms64qp2hoZ+l qL1LTDsqJCcyPkFhuayoqKqpqrXIW0E5LSstMDg6SMu/urWvrK+3ucDfOiYp Lh8aGx8yMDLPuqeepaGfo6jGWGs8KyQmMDs8UrurqKmopqmxwnZJOCwqKy8x NEPfv7m1rquts7m/2zgoLCsfGxojMCo23r+noqSfoKClvtPfPiwkJzEzNEfC r6yrpqWprrrTUTkuKSkuLzE+a8K6uK6qrbC3v+U2LTQpHRscJikjNmPFqqei np+dorC4yE4vJyouLCw828G5r6elqq2yv+FCMy8vLy0vO0zuzb+wra6vs7rP QTY1LCEcHCImIis/27Ksp56dnZ+orbTPQC8uLy0pMEti4b+vq6+yr7fJZEVE PjQyNTlGTVbQvLa1t7W0wWZAPD4vIyEmKyghKkBo2MOupKOmpqarsb7WamdU QT5Q4/1a3sPN/uvcekg8QEo/PD9MXlNX38vCwsTBv8bS2+NeSkhIRT88PDo4 Oz49PUZYZ2Fv2M7OzcW9vL26tra0tLS5v8TOfVZMQz8+PD0+Q0ZKWGp03tHW 2dzX2u75fWpua1hNSUM8OTY1Njg6PkdTb93Jvrq5trOytLa2t7q+ytTaelZM RkhMR0VKTldUWu7t+uzd1N986uj0+mljal5PSEE9ODMwMDE0NzxHWOnLvri1 sq+vrq+ytLe6vsnU4XtaTEZLT0pISlFQSktPTk1OUVdTVV9kcPLt3+Lg6lpS TkM+Ozo9PUBLUVt24dDLx8G/vLi6vLu7u7/HycnT7Hb6+WNicWxoZVtVTUlJ R0VHQ0ZLTVFTWWdqZVtUVFRKQkRKTElLX3x45NTLxcjHv7y8v8C+vcDHzdHT 3ntrbG1nZXl9fGteY15STEpNSkNDSEtKSlBeYWxtXVxZT0lHS0xISE9n9O3d ysPFxb+7u77Avr3By87N1eloX2ljX11i/fxtZmluZ1VNTk1HQ0NISUZJVWBd W2BjYl5TUVBPT01PYPv36tPKysvIwr/DxcO/wMbLy8rU4u9+eGleXm1xcGlh a11QTUpIREBESktNU2F1dHrv+HxoXFlRUExITVBVVlt939jSysPAw8K/v8TJ x8jP19ra3Onr6Ofr+3J1aVhPS0dGRkJDSEpLTFJha2tu597l9X39aFdRT1RT Uldfdnbs2NDLy83KycvO0tTNztTT0M7U3dfV3vZvbV9UTElLS0pJSEtNTk5U X2tud/nt6+/u8P1qXlxaWFRRWmZ07+HY1tXX19TY3d/Y0tbc19DQ09LP0Nni 6O5vXVRPTU1LSkxNTk5PVWBzdW755ubv7eXn925paF9aXWFqcHL48err//Pr 6OTk3dbT09LR09bW2drc6Pfv721dXltRTElKS0tMT1deZGl27+nt7+fl7PT2 /v7t+/ns9ntsaWtrb2x74dze29bW3dzd4ufv8/14d25w+XVrb2diYV9bWVla W1xlaXFyen7893fv6/H+fPTy+f758O3s7fp9e3V8eHRvfH169/Ls7Ovua0zd VWFHNr0/zsjrxcrTt+L+wtRra0ZQ+UFV7FJW02Pa2E3XeU72WkhfXEJmR0lP QUpPSUpdXmjZysq8vru3vb22w76/yrvMx7nAvLtsJSzEGxgsFy0jGK3EMqaa nZ2ln5trMrY7Gh0nLCwmvqPJtJ2ap6+qqM4w18U+W7vAIRGyOgtNHCavDrSX LLyZlqKrubKpGBnDGRg/Ka+oQZeUuamjsc09J9xpH8uirKW3HiKgEQ64D00/ EJWdWaGVmre+W1Q6DhdAGifArpujo5qg0DLEPiYvLrmsvKCWn7EeFZ8WBjET 0L8VkY2fnp2cSyUcFSMWEnZMW56bkJiqrLxeGCM9KNlJrJSdoZynQAwRogoK JRqQuiCLjp2srqsfFA4WOiIonJyblKOcrTMkISQYMU2+m5+Xlp6msSwHFLUI ESYmjZ+wkZqlPT8uFhoTH81qoaGrkp59xUs3HCM0LLrIopCbm5ypux8GFlkK GSg+ipqvl5y1IB4fFiokJp+hqp+ppLFOLC8/HS9EPayknZ6WmquvJwkOTRAR NjKQj6iaoLA6HRcTKzA4n6WjmL5hoTkaLjQqJzHuppuemZiep7ogBRG7FxUp U42Pr7mspTcYEBc+rDAxlZKcr86ptR8RJTEiLGmelpWbnqCuJwQKaSUcKzOP i5/rN5zOHxUNL7LvILOOlZ64u591FxQdHzHww5KOmJ2oyQ8EEx8mIyuaiY+f raeq8R4MEB4lKjXblo6dmZqtPh0UEyAjTZmOkpuhIggPKR0bJDqai5pjpZOe qCQPM6oiDR01x6WgnZWYwCYYGikvUZuSnNkPDHrEICMnrpGnJR5IrJ+mxJyV p1kjHBomPEuhmZ6n1jNIs7e/vWIYBg0tKztgOJuOoS4ZHjqftimslJKasDJI 0duvw+Q/KiZcn6GgrE8oCgQXGxrTsJuOmLwnHyb4uTfAl5qqsviupWyzprlS TSwfuri1pswzCgklGRsbHaGPms57LKaOUBw6rJ2hS0iWnLeps7G2v0ZNZTNY LAkEH02xrhUbnZkvFBk8ko9NML6bkbYnrpmfnrBJvrVQSra+zCwMCRYfNigU NpqcwC8nv5GZR2vHuqw6Mq2Vj5mhqsI8IxoZGhgZM6Oity8dKjIjGSFVo6Hm u6SYkpuop6GybzYhL803ICQrLELfN0BhNFXNQj3SWTNNPmyrqqqmpLXlOz63 vXhMQUc7Lzu8rfU8QTp7yEVUr6/KeiskMi8tPMyun5+rtzwmJSQ8sq6nqbZx PnhGSToxycnz2MCzxW8sJDI+OjZcybmx2FVIQVrNr62vv7+uwkosMsm91jpC ycFtQkQ8KyEjL9i7tamu30NqaktNR7CkrKutsMNaMjb1a29XQDAyPS0vNDrN 10A2RUk+e8qzqKans7qzsrnQcebXRTU0PmZHQD06PC8lJi464Lu0srK7WGDD s7O9wbavxGXYytNWOTxjOiw2NT92RklSTF3f5m/dzLy70d/QxbO4zNTAuLp1 MC4zOTE0UMa3zjswOk87N9Kxq67Szr7WX/G/vbm/4mFDOzU89r694EYyLjUw NVbNwMDOSkzmfc+/v66os9tVVE9OPjl6tbPIRDI+UDcuOde7z2byxMlNOjlI 2t3PxsO6uL3QakBHzslSPmbAwutBQdz0QETvfERAPFnG0WFU+en7WVTe0su8 uLa+z8zLcnlYQ01JTElDT29xWEdFQj46P05gz8G7u77Ezs7X/d/Gv91reOHG xvNJaM/mTz01PT4yN0JQ7FZNa97O09rexbnAxLy7vMR2etXOxcfabmk/Mzs7 PkRFR0pANDpactjk7c3lbN/h1r+wrbG7zM3WW1fgw7vC8k9FOjQ1MzM4Oj4+ S1nu+HXr29DfbXzOv7Gsqq66zOFMPkZM38nGz+tHNjA4QTk8PzxBRjg5XdPE urzDvMbYxbq0r7G/z19JQD9HbsrGzvxNPjcvMDM5V2BN9d3aZEpW18zRw7q3 trzDv8HS63dyYko/R1lXad/gbEs/Ozs1O0Vf7+fSycja2NbTys/Jw7/D0ePv 1dXY82dVUks9P0ZUYUlCSv9rTklKa9Dna8XFysru28vGzMnJ2d/pWE1iamFk WlBRT0VLWVZbXk9VVFXz4s7Oz9zl5HTP0NrJytjb4Gbi73rcbVlXU0xJQz5S YVVv7u/a5l9fVmfe7+fOyMzM3/TV7F5ZaN7Z5mf+33dTTmhrV01OanxZV3nZ 2nZYT//S19Lb2tjgc2h+Yn7r4nlfXlBRS1JUUmxz+nxqYXXZ0c7KycLCysbC v7y9zN9dMi0vLCwyMTzxalb45MzD1GFd0MjBury7uLu4s7q8urq3usw+KCw9 KyYsKjjbOjReUmvG0ODLxdhnddz3atPHxb65v722try8t7q6vM7T20c8RD4x Ly0pKyopLTA4Q0xiz8S7t7m6ucDDv8HDv7u3sq+xtrq6usTS6FhHSkI0Liwq KygkJSoxOT9JzsO7tLO0r7O9v77FwL/Gv7u5vL2/wMvJy9LOzWJSTzsvLSgk JyUkKi84VurLua+rrK+ysLi/3E9SVUhITmPWztfRwr27uri2t7zObOdiQzky LjIxKSovNz9GQ2jMwry9wb6+zuJYXndWSlVf3NPPxLy5tLS4s7K0t7zO2Mvc RzozLy4sJSguMDQ3OUndxr7Aw7/D2ONQTVBNSlZc7se+urKvrqytrayusrO6 yGdRTz80LSkpKiYjJyotMzM3UNPCvsPBurvDz+rRz9XSy8S7u7y4tLOvs7az tri9xs3SY0A8PDUuKykoKigmKi41OzxAb8m7vMDBubi8w8/Hv8HJycO7vMLE vrm4vsTDwcTR7eHT2m1GPkdANC0sLTAtJyovOTo5Pum9tLW+vrq5vcTMv7u9 y9zZyszZ3NXEvsXO0NDL0NrOxsG/xU496z4xNiQuRikrLylRWi9MWOuuu3y1 t7uz0V+6yu7NT867bNG+zrm/67690sLb1ra9v71jMik/MiUxHSzNJzX/NK2x PbXD2bRIOcfPV3jc1a7GT73Zy8Q+zb7+y2nnut/9xL65u8O7sbrbKR7ZLh4z GD+vI2q5WKC3PLDHSWg0L93uL9u/16x+46vz8ulSuch7zL22vNXnvLniyMW/ r8F1Kh/oKB80Glm8JNXSRKvcOsFVPVk9P8jJU7yxtqi9v6/t02g/zup70u/D wOHaxMHDwtDDurzBTR0e3x8kLhixwSi37M+j8kG4a1O/RFWs0Uq2zri0O8zM SOE8R9xnQ03JwbzPxquvvtJZu7buwrrBQxce2R8uIxmlzCrITLGeSD+ywLzW L3WuWDzZ3K6+NsnCyuMz8rrJfkfStsZe6L7LUDs/z8jJvLKruXonG1ItHDUb XKcpvLHVn7tTrdJUzzs12U0x/NbMr1FktEPb0jy8wM28zdxm9k9GXD5Q723E 18extq+vvrpBHSg3JTojJLHNy7vmr6jVTVA8azwqR17nzlvItMPH1Gu8vdm6 t7W5UFF9PC8rLzs8P0nEsa+vrKu3vczWvfJALCE3OS88Mti69M9158trQDo7 RF5LRFhl6dTj38C6ubm/t7S+zmfo7ktBRmrZydRmy81hUDo54WVN70/Ev19t T+rLys/Nwk84LCxCPTc/S8S73ej35shePEHcxMXKetXG1NljT9a+vLrNxrS/ 0lZD2thJPUreyWw5Rl5dWjpH0PROP0F8Wj5DSmnfTUpv9P5WbMnGz8i6uslj fsTBzX1v3M3L2MvAwb2/3FpBODo3Ly4vOe7y7sfEusLR1XXh71VJSEtDQURL cl9g28rE0NfZ1szm/3vtz97e82D47NrGxcrBxb/A7GlOREU2NUFHTkpMbu/l UFNxWllQ3cTL0m/f0e9zUWjK21xq29HgXGTS1+nn181+TU9z+FpY7s/caGLk y+VUUFz6UEZS9dHeXmvtak9IUv1lWFRf2dXvevjY2One19Dc8mZad/t859zf fG7q4OL4at3rb/lXcOtd9efj2FVNZltlW01l4/JdUVFv/VBU5tPX/Xzf2d9f W/vf6Ftf++rc7fba0tjp+eLd6PR19nVbXmBdXFBUbmZk9Obl4+5p9XxYZl5k 9Fxy7/Pjbmbx4utoW/ff/fnq39Lb6+l4dm9bW1VWY3Lv9n7Z09/d6G3+aFFY XWVuU1hnaP5eWerZ1tXo3dDqbGVn/WxaXHbu7vv84ub/cm/472dp+/zt597e 2t73eWRcXVxaV1BPV2Zpa+3c1Nfc4PLq/ff8XGpta29ZYGlia2z+4eZx8d7l 3ePt2ettcl1iZlpbYmh67Ovp6Orm9mRsY2Xve3J+7PN9fXPs+2lsZmBqb2hy cWxz/fp3enfk3uDf4OHe6fvucXZ3Zf7ueGtta29iWGZ0bGleZnxraGZ45OV9 ZGrz925q6dzc5XLo5W9hV2v9aGtq99/ta27y6fZ2/vjg7Gtsb+7+aGl6/mhf VFFUVGFy49LOycrLyc3P0dbvWk5EREA9P0FMVFvq2c/KycvM1eV8X1pSTlRY WGf15NnVz83Pz87S1d/2Z1dPTk1MTVNhanjq39fa2tPX3/thWlNNTExQWlxk /efWz9HRzs3T5WxnWU5KRkhLS1Fg6dnZzsrIx8rPz8/W2tvb19vtZFFNSEFA QUJGSk1SW23q39PQztLb4mxcUUtOUlx55tHNzMrIxMrHxsrL1+Z8ZVpMSkdI SERJTVRaW2Z7fXF1eflya3R66uPj2svFw8C/vb3Bydh5UEQ8NzQzMjQ5PkhY bdPEvr6+vcDL4l9RSEVESll52czEvry8vr/Fzd1pVk1IQj9BP0BDRUpRYPzf 0svKzc3R1dbb3drOxcLGzNfoX01AOzk4ODo7PUJNXurMxb6+vsPN221jX1tc bODU0M/LycjKy87W2e5kUkpDPj08PT9FT3TdzMjEvr6+v8LGzONaSkI9ODc5 Oj9IV2bezsTCvr2/xNLtVEY9Ojs+RE1l18i+ube3uLq+yd9eTEU/P0NGT1pv 7OLW09HQz8zJysvUZko8NTEvLi4yOUVX58m/uLWysrO1vMPcXUpCPj0/SFFl 3c7IxcPEzNHhdVpPSkVEREtUX+fSw726uLe2ur/VV0A2LywpKCkuOERa8c3A u7SxsLS6y1o+NzY+TezNx8bFvru3tbe92U4+Oz5IT05JRUZez7u0s7e+xMbC w9dELSIeHycxPEVJTOC6q6WmrL9QOjk9SEhBPkJ6va2pq7K/0+Hc3mlLPj0/ SFBPTkpOZ9vHv7y5trO0uL/VUDYrJiMmKCsuNk/HtrCwtLm+zO5JOjY4RWrL v7q3s6+vs73QeVxTUU9LS0pLTUxRXF9re+XMvbe0trzG0nhLNSkmJSsvMDlA 7b22uLzCv7/UVzw4PD9KVHXKtq6tr7a4u7/NXkc+REdLSUhe6dvlZG7Vyb/A xMO/vb/L6k86KyYlKCspKzRJzru6s66vs8ddU01JPjpF7cS6trKtrbK4xthq QDs+P1JOTGVp+F9IUP/mztLHurm2ub/E8T8sKCooKSQpNEP/yrivrba9ytno TDw4PEd9x7iur6+usbS7zWM/P0lCT09Va0tMWU9rfGrZ3sq8uri+xcnrTC8q LiYmJyg4O0LKubWus7S61+z1Sz5GRUxv3bmytK6vsrfF0eZZSUFDRkVFSU5M S3bd1s/Lvb2/vr/Ez3tNNysvLCMoKCs1N2W+xLmus7W7xMXhTFVWRFrOxb6+ ta62trbD2NZfW1dBSkE5Qz07VU1p2uK/vLy1ubu+z/A+LjMuISopJS4xPtlt vK24s626vsLa5FlKV+1Vz8LDtrm3uLy6w9PK7llKPDk4Nz5ARFxf5ca7t7W3 vMLWUTY4MyArKR4rLjBdT8OwvK6psLavv+DSV05eS2f+b8K+vre1tby7vt7c ZUE7ODcyNz4+U+vKvLixsrW4wnc+Qy8gMSccLScoQDvRubysqbCtqrvAvU9H ZUBMXlnP0sK6t7G1rrjGvPxSTDo4MTM2ND1X8s27uLazuL10UWEpKzsdIy4e LDg14sK6rKuuqKy4r8VP4Eo9Xk1W7NfHw7G3t6u/vLju3F5EPTI3NjI/S0vZ wr+5tLi/93lXKTUzHCopHi4wM2fLu66urKmurq/H0sxMSmpLZd/fzb+3w7Kv yLS8ctRcRz04OjI1QDpI0dXGuLi6wt3TPy9KKB83ISA5KTPmW76ysausrKuz vsHdVPVTRt/v6sy/us2xstuwv13BXkdOQDs2QUI7WPhhzL3Fvsn+0Tg3WSAq ORouMyFMSU24ua+sq6musbi/2+7eQV7gS8rJzre/trjLt8lzy1Q/Sj84P0c9 SGxVcsTMxrnZ4s47PFAlLTQdLysjRjdNvsiwra2pra+1vsXW8Fd+fFjHz9C5 xru4yLvI38xbRk5AOUE+O01SUd7M0cHA4s7fOVQ/JDsqHzolKkUw38jHrrOt q7GwuL3EzNZm135wxdvGvMa7vMLEyd55bkRHRDhDPj1QTF7czcnCvtHY1T1E SyYxLh8vJyc8Mm7O0a6zr6mwsLS8v8zP49Pe78HTzLvDwrq/1L/cVtdESEk5 Rjo+T0R56N/MycXU2tk/R08oNTIgMSgnOTBY39CwuLCpsrGyvb/Eyt7T0e7E z8q8zbvDz7344NBOV05BREA/R0pOWGrgz8rNy+LjWzxtLyw/IisvJDgyPdxa uLm4qLCwrry6wcnJ1MvbycfOvMu+v96/6+jNS19MPkc9QkZFT1Ri6dzT1c7c 9+JCTksrOy8kNSgrOzFkbdOzv62suK26u7jMv9HOydvBzMPAzb7Tysx40FpU WUJKQkNIQFNPV+jt1tDI1nbZSD9lLi89JC8vJjwxP+pVt722qrevs762w7/F zcDTwsXNv9LAyNzG9N7rUl1JR0ZDREVOS1hqctbSzM7cees9R08oPS8iPCYt Pi3hTt2wy62tuK27uLrIvdTHytS/zL/Cxb3Vxdn2005dVUROR0NISUZRY1V8 3tzX0fb9YjxsOSxLJys4JDYzNd9GvbnDqbW0rby1vL+91L/KzsDPxMjFx9jI 4OzfVF9PTFFETUxHWVJVZ3D6/tjoWd5JPvsvMT8lMC4mOi9B/Uy4xLuqu6+v vLK+u7/Lus7FvtbGxszRz9H61+9lbVNUSEtKQExJSlhWavru2+1g3UhBfC40 QSYxMCc4MUFdUrnIuaq4rq+4sr24wsS837/I4r7R0Mra2eHc7WJuXkxNS0JF SEZITlRZ++jX3/reS0dgNDQ9KS0xKDM3OlhZwsC6rLWvrrezuLu+vr/LwcnY ytPV09zU5NviX+dgTFVLREdHQkNMS1h38Nrp4utOV1M1ODcpLy8pNDY8VWHA wLestK6ut7O4vL2/w8/FztnF18/L2M3cztNp2llJU0JAPT0+PUpIUft40+Xy 10tTXjM7OigyLyg3Mz1eW73Atqu0ra23sLe8v8PG0sPT18HbysjTxtTL1G3i S0lLOj88OT0+RkdQZ23a6vt8TlVROjw5LDQwLDozPGVUwL64rLWtrrevvL68 ycTOxMnWwMvJwczFys7cY3JHP0I5Ozk5PjxGSlNvbN/4dvdJWU01PjYtNS4v OTdMXd+8vrCtsqywtbS7vcLCzM3G1sjIzMDLxsPLyN1vXEVCOzg5NDg7PUlL WG914XD0YEdgPzc/LzE1LTg3PGtYw7y7rbKurbWwt7m7x77MysHZw8fMwMvG y9rVZVNMPjw4NjY1ODo9Rk1YbuTteetSUFI8PzowOjQ1PztV9+a9vravs661 tLa/usXIwNTEy8/Byr2/yb/O2N5VTUI7OTc3NTc6PEJKU1dn62x7c0xSSjs+ ODQ6NTk+Qlz9x768srOxsLa0t727wMbFyc3KxsfFwMXKx9HycU1DQTo4Nzc3 OD09P0xIUWhdaWdiVU9PRUVAPD08PUFKXPXQxr64t7W1t7i6vL6/v8HCwMPD wsbHytDT7WZaSUQ/PDo5OTg4Ozs+Q0RKUFdaYmplbV5UU01MUVRTXW/34NnQ zcrFxb++wL2+vr/BwMXExcrGzNPX7PNlW1dKSEVCREBBQUFDQkZJSEtKTE9Q VFddX2Rmam9sb/n4+uXg4dTQzcnJyMnHx8bEyMnMz83V2trg4uz0fWFcVE5N SUlJSUxKTlJOUVFVWVpfYl5da3BrfG1qfX57+29la3D139vVz87NzMrMz83R 0tDc397t7+/6cW9mYmRaVFJOTk1MTk1OT09WWmJu//h+7Ont6+/x9fvn6//u 7uvm6+Xe4+jp6Or05uLm3OTk4u7p9XP7fHZ3e3Jsd2ZhYmBiXF5dVlZXXV9f aG76+/T1e3hvcn13cXr37Ofk5uzo5OLo7fnu7/vm7OLf7ej7dHRmamdfX15f XFtfaHF0fH72eX7y+v97fO//dPx7/Xt7+fr1//nt9f/18XFscHFze37y8eru 5+p87ff59HZ5cWhpbG9mZWxobGlndm1sc259dvvq/fP4dXloaXH77fry7e3q 7O968v9qbmRgZm5vbvjs+Orm8/Ht+nr9bmRwbGtram9sa3F+9nb87vT18fFu en1seWhp/3vp7HTt7n3m9nvra+7fYHj4ZG5mfH1i7/xv6v5t/W5jb/JnWPlr W/Tvb3Lk73Dh6Pfn+O5mZOdrYG/uenPw/Gb+6ftp+v52+XV2befjYmfpaVx4 +l9k2+Vdet5gYNvrVVrtald42GpX0txa2d1Z9N1mW+fxVvTocXfe5Hdg7e1w 7Ob0cP/gb17hbF3velx47PZvdfpqY/VZXHb0elt7cF/xcej8Z9zgd+jmfG3v 7mL73ehaftBbW9hfVufTaEzx1kvzzE5ZzelPd9ZyUtTRVXnPXk526k1Nzm1B 49VXYs7eTNLEUVTP41Dq0VVe2s5rUNDYWu7fYWnw71VY5FJd2Wdd8mzmYGjV Z2fR/2n6bOdRZOVa5vls3Gh57Hb9V9nf59lP1s1L/dZQYW/nUFnMeFdb6dNc WulsXe/XWFjeYe7VTvPL6fpm5WtS6u5WW97pTNbPW1zo1FtV0nlV3thhe+z7 anvZXl3TZ1Bo2FtZ1+pZeN99UGbRdUzm5E7j4FVp3+DzXufYbWv861fv1E/5 1nlp7t/e4OJv/Obj62H8aEnt6U5SY9hXTcvaWe3c6kji2Elo0Gxm691dWvlh XHHbfF7S2Fjj4GRq33VcXO58Xe3X9XjZ3F9q1VxW5HFO8tpZa85tUurrXGrb 6WZk6OpSW9NcWtxTY85ceNXq3ubf81Tk6UhT+mxU+cteXsjaaPzP7E/f1VhZ 7/Zdad5XTc/fSuv3Xnds2FdP32Vn+WR1Wm3cV37a7dbS2+Jw1N9Sa/9aUH7f TWDS8Gfk1llVxt9H2M5NZsz1U2Pkbl5c/XpN/t1efN3uevr7WXRiT+v0Zfh9 5/hu1uZm4PdobX7uUlrgamvi9+de7c9k6eH62Fh921Jn6Xdafvhhfmti6Wxr 793pUd3hUOptWd1aWtdn92rm11jS2f3eZ+p4S31nZV5P0+Fbfvfq31998/lp +dtTaeN3aGTf4Wl7XOv+Wd1zX2voaHFi7vZh0vhb7Nnndd/jeW3572Nt8WRq bWpdV/H1UuH3XM71bH740FZP3v1bcNBvT9/VVXfsZF9o+Fvw5V5p7OVYb8tm XubZ6V/o2G/53P5ndGX8VWd2dehsXvPj5fT0bmLVald8XmdqdORZYNxp9nZn bePcXl/sbWnh5nPyznd64Xv5ed9dW9xvWn5uXV9s715i5Whv3u5aZd9ZXtlu Y37d6Vrv3HF95nRdcexjaeB4bd7sZvTiZ3rubGtp4+506+hq+uP6XnHhWGXn X3nlaPvu/Hts8m1T/vdYdG97duvabvDd92zl21f+4llt/F9oY2nna1/o9l3l 3GRu3Htp23Vf/e798+brWnnnal94+ltl5O9ecObrdfbfYv/eXVz4Zlx4/Pt1 cXNpeOxqcHhuYPni+e3p5Xnt6X55/XRtZ2bedHDZ/fHvXmFt7Vxd6P5f7u1r 7Ofm6u3w6f5y9Gpr9V5l5V9WdnhgWmpe/uV1bfTl3eVr6udi7thfXt72YuHq V33xbWp8/3PtfW5l9GRs62f2/n1l/e1u/m1zbHR+V2p1YHvl6PPd2erw2+9Z +vZbZvpoYnX7cHXX82Pi815s92hWaup3+N3ufuPg637q/mftb2r/92pXcnRe aG9ib3ru73bo42ts5Gpd+PdsZnX6a3rkcOzb8vbpZm/zYf17/3pq8/hsb/Z9 /Xf68Wtt7HBibnNqaXJ2d3v57Obq++/fcnX9YGVnbf598flr9+z39e9ubnhp XGh7b2xrcf5sdPV76vDt7ujl4ujzbnD+aGpZXd9S429s3WzaYP38bHJ833zv 6Ntu7+ZdeXL3b2rdZH1vdGdc+VRjbWRrZPdofO7v7d/fful8b2pjcWtwfv35 /ut59+Z3cfLtdH3s+Hr9625ub2lrbPtpdfNqdmv8bG3vdnjv+nlsfvt99Pjt 5vX37Xx9/HBpcmppZ2BeXWlidXZ+8fLl9+j0fPTv7fX0cvvr6ubl293PzNTa 3uZua1pSS0pPTEpMTVBVYF1w8+je39fY19ba4evq/vb/cXFu/v13ffp6++7v +WpnXVpaW2Joe//4evv09vTw7Onm6unp6+Pn6ez0/np4a2ttbGdmZ2NfX11j Xl5paH7+6uDn7Obi6uns8fbr6O/l7/L37+91a2xoYmBiYl9gZ2lrZmhvbm95 +fb78PH47e7r7H13b21tcnh78ezm5ejvd2xpYV1iaGdqd3z69u709fv4+Hnu 8e/p7Ono5uft7e33fHhxaWtlXV1dXVxdY2ZmaGhqbnH17+fq6+3s5+nh5+30 7+v39v1zeHZvaGJkYmRmY2NkbmxwdnF2eXt58+vk7Onk7Orn5ez39//+/nZu eHp9ent3bGZkZ2RhZWx3dXl99PL67u319fp7e3l27+z29/5xbGlmampwdPzx /Pz5fXd7d/39d3Vvem97/3f9fndzcm18fnN7fXr/8fbx8/p++PF6+313dWlu amJnbGppbG/78Ors6unu8v/8+nf/+PP+eXZwdG9vbnh9ef14bG98fnp7dXx6 dHb++/v5+vP0eXh+em9vdnVtbnpzaP96cf14e/n6/Xt9eXN5fHN78+nr7vP4 7/j5dnF5fHZy/nJrcXRtZ3X58/Pu7vb6fnBqZmBiaWRhbHZ0fPP7d/3r8HV6 8vf17/Pz+fr4+fny/3BwbXV1cG5sd29u//b7+vT79v3+e3X8/n758/H69/11 c292amxyb3h6d3z+cmt5d3N9/3h0dv3//PH1/vf5cn15bWZmcmpve/18dv37 fP3u8urq9v9ybmZrd3Zx/e7z7fL/d3l6dHV1c3Z4+fl++3xzc3d0a21uamlv dXb9+vz8/n56/f17/PTx9PDu8vjv9Pr6dXv8efp2bHVpb3h5fHF9e25vb2ts cWtodXV6+PT1+fr3/fvy/nl+e25qb/x6ev59+fL9ffx+dv7x/Xp++v79+/ty Z25tam1obHv28/j18e/y9f99bmtucXNvffr3+nz/c21pa2xqeHx1c37+9vP1 93328vrt9nx6fH5ze/dxcP90b255b2/2+vj88Ph6/nd3evZ5dfjw9P7x8Xh7 fnNiX2JkYl9ka3R+/f738fTx7vX++357ef/7eHb7+3z27nxx/P3//Hpufvpu c3j2cmh1dPj1/PD1++78eHZudHZwe/39enl2bHFzfH355+n6/ndoZFZFNz7C ZtbHaW7AvcXM0cZbZk09WUJNQtxd6tbc59hezW5gxNRPyunfzVnLbGHgVUti SkntUlvv+1vm72vk7nRnX9zdZGreT/PIWEfYP0jr+VflyF3Qa8NPYLpU3dnX X2rIR3xa9U5rYmldT8tGZ9llYenUV97WWd9gYt9ffd/x8+Ts7eJXfmR1bV3H U2HN4mnNaVnaT91iyFTv1U/bTutNdlflbknPZfdmylrfzVj4afdL8Ghb3E/X TNRO3FL64UPdTOhmxtttwk/Hb/dX595Dykz2ZHXqZWlv2Ftu01TYU9JtVr5N 7N3vU8xWXt8/uj3pw29e4NJHc1DiSk/WTla/TsZY4MlH29NCVLY0zMg3ymju VdNDwUpkvkltzdVBxeLvT/HHQ0W7REy5TUjEeT/KT8ZSRrI8Trw5TawxxuI8 vD7f/+g/uHVMxHdwTsZX315Kvj3GcmvaYdZKzfZZQM1xO9HEOWDAULztar5d TcVlPMs/0UdGxT/GTtbVP7ZCZ7A4XbpaOrtB6t01rDPX10/V78s7sznNyzK5 RVLa20XZ2EHBRc/Y9MzqZ2vQOcpuNrjmPL1IZMw/7NHcT+nFSfnJTf/LS93/ TtFL38xHx8g/xdM+13Nka05eVu3hTdvHPd3e5F9KsjtJsUo9tls6tEtLzU/u TdrjR9jTS8vp3lfFTfXdQclPV1HM60LAT+dLzHQ8t1hU2l9i12FIz29o017R TlzMVmXezUve3Ey9TV/KW1rPaUHKStdYTbYyyL02xm5Kxk5BxT//vTvR21/C XvjBS8zAO+TYSf9XX2hNztM/yehMxFFZ3t5XzV1QyVTZWWzvSNlSXWBv+EDM U0zRbPdqy2L7xGje2NBrysxWytjm/M/rWMhrb8tW6uJi7E5OSUE7QzM5OjA+ NTlCP198y7+2uKysraasrKuxtbvC0speVUZLPC9HLydDKiA7Ih8uICgvM0tf va+tpZ+jnp+koKeurLfR2lc6OTg5OTpTMjbPNS+8KSfBHyM5HScrLDk+v7u1 oKOnm6Gknqurqr/PyVU6Szo2RD9CUkQ2z0spuTQhwSQdQR4fMyk2Wsi7r6Kj o5yjqJ+tsKvJ1cpOO0Q4MDw5PFJaN/6/Ldu3H1LbGTgyGzUvLFbZv7Wopaif o66jq72uvFHS/zE/Pyo5PS9T8j9Isss1pU8lpS0fuCMgWywuVcvrxKe3u6C9 x6LZz6tWTblIOMc6Mso/SLbXW7yrQc2mI1OuGTPaFipFHi/uQ0iwre+npFym pEyqqj62sjbOvTBayDPdukpUt7gurswdrTgYwicXYikgXlVDxKu7uaG3waC+ 0aPLYqp2RLhFNco9ObtcQ8+vR1KkJj2rGTC/FCvqGzbKNXKuvL+orcusq26t rU+0tEDFvTDeyy7DxDvftcc3qVshqSsash8XvSIevD40rLfhpK7GqazLs6xo v7FI6705Q8AvSbU8TrW5O7WtH7rFFspIEedDGNTNKrmnUq+hY7WlW8moVXKr TEmvQjm0PDawTzi3sjnKpSVTqxg4thIvvBg9ti3uo9LInc3UodhPp9c/q9k4 s+svvm0rvtItz605WKAtN6QeKqoZIq8cK64yRqW9ep+2TaO9PqvAObHCNbvG L9DNK83DLmKtPUafMjWjJCisHR+yHyiwOECntuajrVOotjuuvja3vza9xTLd 2S5hzy4/rz89nzk5oSYsrB4ityEquTpPrLW9p67LrblHusE5vMwzvs81zG4y 39sxSrJAS6I3P6UlM7IcKsAeOL8wy6vAs6a5vq3LVLzlOMLcMr7NMr7fMLzN L8mwONCmMWOsJDXAGynnHTbKMMurxK+ivbmo1vq0XUG7dTu9zjnBzzXBzS3d sSvUqSbbsB5Ayhgz/xxNyS+6qcWrocGyqNrZs29Iu29BvNM/xto10tUrb7Up 2awl6bMePdMaMW0eR8M4vKW6rKC3sKnD1LrIUMfESNbDPFHXL0rfKT65LEms K02vJjbJHiz/JTrLTL+sr6uoqqy1rr3Ws91PvVU9yD8xaDQxajEwxD84sU05 tj4u8i4nSTEx8d7LtKurq6iptK6v1bm9Q8/hM0xGKzg2LEE/M1XNUOC0X166 PjhvLi1KNjn3z8K5q66xqLG6rsLNvFxR6T5APi01OSw5T0JU3sPCvbXExL9X UU00NTo4OUhQcL7Kv669wq/EzLjZ9tZTQ0U+NDU9PztG/Ne/w7qwwri0z8nL UVlFNjY3NDQ8Oj9kSHjH7M69x8fBxcvd6ehdRkhfTkbkw+PCssS4sMS5vdLL 0+5iSExANzAyNiosODAwPk9IWtbByMq+vL7Iwr3BzLzGx7bByrTL2r7PXtJ+ Xl35TmlLPU07PDw8Nzk3Oj1LP0pWW03b61zN0N/BxMq3vLyzxru2y8bD09r1 11xP901DT0M/Sko+SEJDSkpOb0he1u5Oa9lTctvu3N3mx9PPzMrGzc7O383S 8c7Yb+JfW1xPSkpDR0lJR1FZWFr8Wlzjb13baeLZ483P2szU087f0NHV3NvW 3fh722tfXVxYTEpXS0dOTEtSTk5eVVBPbWJv5dzJz9bCzMzF0s7LzunR0P38 7utaVVxdYltPaWJMW1FRVUlNW05LXVpQX2Ns3d/PzcvGysrK083h3s5z79ny ee9nZH1YYmtZVWdSWlZOUktQTUdXT19qbtzVz8/LzM/LzdLN3Hbhdmr/W2Nc UlZiYVb4/3fr9dnsaGtlZ09KTk5NVV1dcXbf2c/W0srPyc/Wzt3c2fJheWpP VVJLVFNfb1/s5HnzdHFZV1lQT1JOWvNl9Nzd6M/Q0M3m1M/e1dbq8Od7ZvlY V/pdW2taa+x0/ehvb2lbUk5ZVlpdXGLrb/Lebu3e4/za3uXb4eHk5u/jeO3l 8vn0/XTvcmtyZV5YYl9TW19TY2tkffDt73lr7/Lz7vbqbXt+9fFofu3scfrc 4OTo297t+n3tZV1xW2lkV259cPn2b354eejuav99b29kWm77aO/77/z83Oji 4Ort7Wd6bVRqXVFXYFtaYnj54u/n0drg39/q4/Tn+Gdnbvtca2ZbbPlh69ny /N7zbn5hZV1PUlheb2Vv4d7h39fq99/Z6fvue/v9cXNvYXJfYWtu+t/i8+Dk 72P0alpXXk9PU1xla3Tv4+vW2tLU297dbWv3bP1gWlhZU+Xq+e7n5N/k++po 8WZjXF9bWWJXXmts7+fn19vX0N3h5+3zYV1nWVRmbGpcV2bia2/r4+x+99/f +e/r/Vlje3ljamV05Oj12Nr1bW/u62NeeW1kZGR+eW947u9eau7pbXNq/HVo Zmh7+fV0cnH88t733N509OPk9m5wbV9pXFlva25uYm3v6N7hbPzi5/VpXmvz dP9leGj7fO9sZ/5vbXfubfZramzreOX18HBabN/v6et46N/d3/Zm7GJeXG5+ alxfX3fmdezh5evg9ndjdftzW2JpYWtbbm/78O7v49/d5OzoeWT7aGhfX1ds YFvsaeR72e3Q6NTd4fx0e2VpTelRfllha2PuaNtj6WtbYk1ZU1pUWF9g3tnP zczHzMnO1Nnq7XJ3YF5YVVlRWlxbW2hncX3s7fflfPFr6/l3dG508fV67nN+ eHNxdHB+8Xf893f7ev1wenl6+e/v+X36dWtoX2dgZ2h69XXx/Pd+/v3z9Xp6 +vF2d/Tufe7+cGtsaWR0Z3h9d///6nZxfn55//l3+37y9uz3ePnq3/Z6+PRx Z3B7dX347fL8e25yZ2FdX2JkbHXx+enr6eTi4PDzenZpZmNkZ2Rxa37+dnhz eHf/+Xr+cW1sb2ttd+7q6N7m4ebm/m3+bGVoa2xnbm9ibGtobXv6bfTq59/d 3OLn5up6bGdfXVtbXl9nePb7fe/z7fV8+XJ2+vT5+ffu7fT/e3d3bm9ubHBr amtsafj+ffl5bnv/b3Vycnn07eb16+n5/nRvam1rZWR3eHju6+3x5+zz8n79 /Pn1/33zdnZ5dmVpcmprbG9oanhvbnNpd/D9+np2dXJ+e3J2+vTu+Pfu9PPy 8X36b2NiX2Rmcnzz7+Tg5OHl7H7//XZ+eXVxcmtnaGJkZXVxZnf3/33/fXj7 9Xt8+Pl8+vt8fX34dnb3eG91efz69/f7+/xzc3dtaXz58fP07vn69n1vb2tk YWhjaW9yeHL/7+37+fv17vp3cf/5+fJ8cmz//G5yfP756vF8dWtqdXpxePPt 7Onx8/T8+mxodGhlZGdnaHx1dHNyevLp9333+e/o7e/4/3x7dXZ2b3N2bmRk aGJnaW1zenfy7vvv9PP1+H3y7Pb6/f77fHxva2t9e3j7dHFteHd88/Pp6+7z 9Ozz9PZ+cWplZGNfZmpse2519Pj3dW1udXh6d/78ffDz8fD08vn49X1vaW5v bm9sbG96eXf4//32/fd4bGlnbXR3cnL7eW3+8XdVVHB39d7SzMvJxcXHx8vV 7VpRTUhGREVCQklMSUhKQj5APkNOW9nIwLu4t7a2uLm8v768t7OwrrC7NhAW zRcTHBW2pre2pJGYn8A1XD4hFhk9utu7qp2YrcZRPUIiIi79vcito52hq6q0 vkwcCRBeGxgtKpuRq7ilnK7jIxYrPCAn8KaYnaiinr0hGx0fJR8trqCho6Oe nrTVub1lUc7EIQwtuRQzHhmXqji5qZ2jvSIhuSwXKTGpmtutl57BNSAaSCca zMCrna6hl6a7q8NPUi5mqK82DRmeFBIpEp2fGa+an6vuOya6JRSqtbKYsqGV sSwu/h0YHR6rqziknKSlWzm1visrzrCopaSk5A0MrRwOMBicjUG4nqWwSBkY tD4ipqacmERHp9YdHikpTzEkqqK4q9yuoD00xbqrzSlTp6+0qayuOgsQoxgP MxqbmR26l5+rXCxWqCwbrcDJpyrTmk0q3U5C7yIcvt0yrbWqnKyxrcsqJC02 R7afnJyns+ASCS8dDTcdqo64nJmoqs8uHSglIsNWy57EvaG4TTQ6KyEuK0u+ 26+dnKejrmEzHB4tK+2ppJqfqqq2x+MUBSdYDz8oR4usvZyouL8oFzQnFzve u5iospeuPkIsKjguL6icpZ/MKq5AFiUiMv4q2p2enZ2kotguVrK2LwoOnx4S chmTkyirqavHJhUkziAxn6CZmlm4qjgiHUvAw7m/mqdJUCcuHhcvbqe1s6Ks qL3msqnlNdK9qbdPFArCLg3MLbSSK02qXC3MdyylUEKawEivPSXMPTGjnKym rjG+NRhKOzXPP/aorT5EMS9KObmbmZ+sudZGRUVBLA0aqB01OR2byiu3t7yl uSrgKx80OESnnKqVnLutRCsfIyg0v7WZmKixRygZFBwlLtGvqZmYnqCw2Dwz MCy6xiMTJbYZJCYmnN82oKm2ps0sOSgfNte6m5mjmqKu4CEmJiUlPbanmKW9 UiEbHCMjP7Ovnp+foaqtSUQ0Lz9Fr9ogIDwiGxwa167rtaepoK42RDo2Vzm8 nae4qKiuyS9dtDMjKDLAvTZL2HHGOzq7ulhOx8eys7anrMRP9NUqGx8jJi4g LcC2wV/0v6/6SL3E3GFa3sHHw6aouq23vLQ8LC8oMEE+v662t/1m7D4+Qz9P 2vaxprGts8tcNSsmJSAiKi5JfU9YT1nKyb65u7C1zs3I1VU/+7Gxtayur79K VEAzM0FJYbnMwLtTcUg6Qkpk1sjBtsNTPjgoJzcrOkVCxVpHTToyMjxdu7mr oautuXlkVjs30ry1ra+qp7FsStxBMzk34MX61uz9VkdEPFk+MEU9Qmc+PDw+ PS40XF9LWurHyk99ub3iz7mttWO+t764Xdy9yL3IuK+1yebASk4/KmdEJk9N OWsuM79ENHdOUs82P75bSGtO41c5bN9KasvSwMvqs8RYyt5du+tYrrzCpthm rUBxui3csSzQti/TTh/LPSTyOUfBM1SyS1nXO8fcRmO6Xka7QkS9Qua+S7tl SrxjT+8+VrnQT62ywatPVbExOcAzuLQvuMVHZ0c6MFcvL7hGVbhYQLc3Q8sw xtRBxM/4yDVOvSrD1jyocFCl1Ui/PVnEOl/E08i/zcfDTMU0P7c0vL42sucq tVApqywzty/a6k/SzUbOXjavQzarPUyrLfWuJ7zYKK7HMrG7ZbhZU9tjOsXd UqxRyLE7xW4txk8vsD81pynavC7OQUVPWkPOz0G+Ssplbs1eunVcvM48vUg7 tS3juDKyvy+wtSazyyu9Vz2zWsu5YrxEa9Yuz084ukNWxUFVxkNKREfQSEnM 0tq9P9C7P9TgRcLRQ73p0VBQyD3NXEmySdWuPrzBNcJRROdTfT+7zS64RDW6 LzOtQS6sSUKvNvu4MM/RYM7Pyb1PznzoV0F8af5eRqs8RKwoy7shr8Yqpto2 qVc8uXc11cM/ZbkvvL4ptlk1vD9JuTrT2UXCSk7BQEOxMlStLr+6La/NMrPZ OKpMPKY1Xa4yUb8xxfE5vftfzkDYZUltRHppPN/YOLZEO68vXa4tyqsvy6wu ybEtyLs0v9E6rvc+s1tbyVU4vFExrkUwsEw1tUIyrU4zs+o5tkw2r01KvVte vEDxtzfY1TXETDm7TWK8O9DMP11fZ1ntxl3PvF5XrTs+rC5IrTNGpytWqiRt rix0sS3Dty7GvDhYyz5Mvm5OxcFKfro6Rq81NqpCOatON6toMb3LMsTEMcS7 Nde3PtjvPvBTTF9oecRN289O0l9L1HFD1tNHvG5DvNpEXe1ZZfp3+s9SQr/t PMJnZL5ZSbVaVb89XsFPUc9T4L5AZs5jX01rW2LNPNTXPs9HQbpfN7r+PLBe La/KMrnPP7TNLra4LMS5Kr23Js2pL0GmMDilOy6sRi6z1y27xTG8yDfk3FjY 5k9O37hCR7dJYbpCScP57dlZbHRJ1l0+xc9KvNFExsE6UfZtUk9tXsHNUNbT /99QP95jVtZL5M9MX2tW/HbtePTLZ3vTUdPhT2P+2F537X7T2UtPbPnfbF1t z81lXdtc3slVT2R08PJUYsfmfHRK4HxGbelj2c/aWOLXRlpzQOnVTGjF6vHB VGDIZmdlXm1661VN111+0lB02NnZ5evn13x3XFrr3+jp4l3fyVpKa0lV3kpL W1HsbklKSl1kVFhR6Mvp5ltk0P3R0ey/vs3Ax9u/xNjK2dfGy9bQ2c/S5mdQ QSsnKigsLCcrOUnGvb6vqqSkq7i+xONuPi4uNz9KUlXSvr22tsK+vsTH3lxW 6NDd087Oxr3DyP4sJiomKiwfHis26Le7sKehoKWuy05CPDgxLDJFac3Fy7+2 t7O0w8jO3dPSdnfp17/AzMm/v7/IWTQnIx8iJiAhJi1JvK2opaWkpau1ykM0 My0vOTxNw7m1rbC5ucnt31dBSExjzsnIysrO183Pxb2/xl81LSYhJicjJCgt W7Konp6ipq21yU80JyEhJi9KyLmyraqpqq660nZJQExIS1ZWfdzPzsrDwb28 uLa8zkkwJB8eHh8gISc8yKebmpuep6/ESy8kHh0fKj3LrKShoKOorrnRSTgw LS85QFbh79zPzLy1sK2tr6+4zk8tHxoWFxsfKDRctaObmJmdp7lJLCQgHyEo LkDCqZ2am5+pt91KPjAqJyQoMkTQvrq5ubOvq6iqrrbA3EkyJRwXFRYbJDTX r6WfnZudo63OOigfHyQsOV3MuKujn56gqrtbMiwqKywuMzlTx7mtq66vsrSx sra+0Vw7LSMcGBgZHik60rWrpqGenqOrwkAtIyEkKTJKzriqop6dnqWvzjwu KSYnKy43TNi9sq6trKyvsbfBzvhPPzEnHhkYGh8pNV7Iua2mn52eo6/TOSci IiYvQOO4q6OenZ6irMBLLiYjIiYsOFTNvbm2srKxtLi6wcfN3GtCMygeGxka Hyc4W8m0rKaenJ2grM42JiAgJi5EyK+ln52doKeyzz8sJSEhJi05TN3Evbm0 sK+urrK4xNn6TDouIhsYFxogLUXNtKuln5ycnaWx9C8iHh4lL066qZ+cnJ6k rb9WNSokISAlKzZOy7u0sLGvrq6vs7vL5VtFOi0jHRkYGyAtQtG2raehnp2e pK/lNScgIicxUb2rop2dn6avx0g0KiUjIiUqMUjfvbayrq2srK+zusXP6VpC MygfGxkZHSUwSsq0qqKenJ2hqrtPMSkmJiw577aooZ+gp6/BWzsuKSgnJysu OErnv7aurKurrK6yusPVZkc1KiAbGRgbICo92bSpop6cnaCnsctDLyooKjBC z7Soo6Omrr15PzYuLC0sLC4wO07Wu7Csq6qrrbG5v83wVEAyKiAcGxodIiw8 4LerpKCfoKKorrvdSzkxLzI8Vcq4sK2vtb3PXkg/Ozk0MC4uMDhL3LuvrKmp q62zvMjoU0E0LCUfHRwdHygxT8CvqKSgoKGjp6250kk2Li0vNkbowrWvr7K6 xuZSQTs0LywqLDE+fL2uqKWlqKyyvM9iRzszLikkHx0dHiQsOvK9rqmjn56e oKWsuehAMi0rLDA8XMe2r66xusnpTkI2MCwqKy47VcGxq6empquvvMxtSD42 MiwoJB8fHiEoMEXYt6ymoJ6en6KpssdVOS0qKCw1Ss+4rq2vtsDZVkc5Mi4s LC43Rdi6raimpqquucd4TD87NTAsJyMgHyAkKTROxbCpo6Cen6CkqrXVRS8r KCovPu7Ct7O0usLWZUtAPDYzMTM5R+nEtK2rqquutL3O/0w/Ny8qJR8eHR4h KDZWvK6moJ6dnZ6jqrnePS0pJysvPmDJvLm5vcPO1X1kTUE6NTY4QVbUvrWv rKusr7W+1FM7LiYeHBobHSArOuO5q6OenJycn6OsvF01KiUmKC87X82+ubm5 vLzAws94SDoyLjE3RXHIua+rqaiqrrnPSzElHRkXGBsgKj3Yt6minpycnZ+l rsBONSklJCctOVfNvbm2trS1tLi+z1g9Mi4uMzlJ7se2rqqoqq650kUuIhsX FhgdJTJguqugnZubnJ+mrsVONCslJCUqMD9px7mzrq2rrK6zv9tGOC8uLjQ8 S+bBta6srrbCbz4uJR4bGhodJTBVvKmgnJqanJ+nssxEMSklJCYpLjhO0rmt p6Okpqu0yWQ/NjAvMTU7SnbHurW1u8lqQDEpIx8eHyEoL0LWt6qjn56dn6Or tc1MNy0oJiYoLDRF07aqo6CgpKu3ylhBNzIvLzI5RHfIu7q7xuhJNy0mIh8h IyoyR9S6rqqmpaWnqKuvuMX8RTcvLCkrLjVK07WrpqSmq7G+1VxJPjk1MzY6 RmbMvr3A0V9BNC0oJiUmKC0zPmHLt66qqaiqrK6yuL3M7k4/ODU0Nj1M3b+2 sK6vtLvK3GRUTEZAPz9BSV7cyMfJ3VVDNy8sKyorLC4xND1I68GzrKinp6qt sbi/y91dSz88PUJS68zDvLy/xMnN0+tmT0tJRUZKXHHV0c7hZEw/OTMyLzAv MC8vLzE5Sde8r6qop6irrrG3vtFsSkA+PkVa3Ma/vb/CxsvN0+RpTEI7OTk+ SmHczNPbc05EPjs6OTY0MC8vMTdAXtK9ta+ura2ur7S6xNxbTEtMU3PYy8K/ vb29v8XM62xNRj08Nzg4PEFW8tva3XxdTkVCPTo3NDAxMjg/W9K/t7OxsLCx trvDz+hqYmXy2s/LyMO+vLu7vsnVe1hHQT05ODU1ODxDUlz4efl0ZmJYUkpA OjUzNDpAVOfKwLq2s7O1ub3H1Nne3dnR0c7OyMS/v8HBy83Y7WNTRD06NjY2 PD9JT1hWWlhfXVhWTkpDPjw9P0ZMXO7Vx7+7uLi6v8TLy83LzMvNzczJyMbI xszP093b6HlPRzw4Nzc6PUJIS1BYYGz3+G9sWE9KREA+QENJUmbk08vGwb++ vr+/wsTKy9TPzMjJyMbHzc/W29zk8WlUSD47OTo9QEVKTk9QVltfanhubGdd UElHREdJTVVdcunVzsXBvbu8vsDDysvNzs/NzcrKzs/Z3u/yaFdOSEE+PT4+ Q0ZITFFaWmZk+Hzp8u11aVpWU1BSW11javv23dLNzMjGx8vO0tjZ29jX1dXS z9DP0tLd+2RYTEtJREJGSEhKS0tOVldgdujj5Of/a2djX15jZGJj9Pfk3NPP zczRz9vp5+Xc393c3drd4t3h2tnd6G5aUlFNTUpKTk9TVFVbXW119Ozr7P/3 cW1vfm5taWdqa3D19+jl39zc5d7e4ejn4N/a29rc3trc5eb1cW9lXldXVVRO UU9PU1VZaWZz7/b5eXdxdPrv6ux59frv7uju6vv17//x6ebf3+zu9Hpx/X7/ +e3l5+Hk6/xrZl5fXVtcW1hYW2Jmce7r7+v3e2hrZm5ve/fu7ez69e/t6+zu 7Ort6eno6uzp9HdoZWBfX2zx8PLn9HxscWlnZWRjXlxaXWNubfDo4+fy+n10 cXRucXzv7+3u3+nn6ubp/Ovt+HT++2toamdsX1teY3V29fPn7/LufnF+em9p Z2dmZGtseHvu9uz5fX766/n57+708ml59vn68vLt8v7w8O3pfv1uam5kZWBk X2VlbWt5+Pby8ezy735jZGdlaX5y7+3t/HF5eHX28/vs9urt7/F4fvjqc/3+ 83h7+2xxc29haWppbm5qdG57bXt2bWn++vjw93JmaXNtZGx1/uv07ODd2913 6fX5cHlnafH2ee7x9XR29m/57vTvanZnYV5uaF5+fmFi/nL/anhqeWxsYX1s auZ5fmVs9OXp5NX03vjg8Oh392Fpenh4/O7hbHPxcP/sXG1pc/Lz6Nvp7mNb W1FPT1hsaGD88N3d5t7v6e/+dnF8dHVhfGf96+zm5ebw+3j29/X7dXL8a3d8 fvVx6vPt597cz9vx+nvj71xWT0RDPDo8PEJJUWnZ1cbCv7u9wsXNzvdSTklH UE5u2c/IwcC6u727vb6/y9bfZC8nKScuKSUwS3TG67+usLTFaclvSD88XNJ7 2Ma5tL3OytTfXEZGSklZW+bQ19DLy8XIyby4s7W80TMqLikrJSM2TU/fZ72s s7vM9sxePj5F+eZd3Ly7vtHszuFeWXHJvsfLy8zcSD4/QUM/SOjGvLaxsLW4 vMJPIyApJiojKs28vbjIrqrB00xHej8+WGvFy+bCv+TrWFjaWPjBvLW6ycfk Qzo0OkM6P1fhxcfDub7QVEhOSz4/T/jab+/GwMltUmBeTlLXvGYsP11UTjBC wsXfXeq5uMbe27/NWVVczW8/VtPI2GvqyNdRTW7Kzf907NpjP0hfY1hIWdtq TktVZkxCTmXk72vPy9tnUnHZ3+jKu7a6yNDUZz46PkVTb+jJw8/jY1NOQkJP Xt3Ryb/G3P9nXlhMT1tWUU1TePps797c6VdOYldQS1Te4vnm4dXU6evb49bS 2MvLz8zNzNF4YWNkeE9HTElHQUNXc2t89vXuX3ze9O599dXT4fHo3fpTT1lt dmnu2c/V7X5ueXZeYXd86+Hc2eHm525cV1doa3Lo5dvZ919TT1FNTlxu+np2 5tnkdHF05OZr9+/vb1pZa/x37+Td4+/r6PF+9Ol2aNDNz9Hw9PJo9NtbR05S VlJGT+9gXfZf799p5+du/W182uDq3+Tk719v7P17dn7uc/7T1N3f6ez7XVpc WV1SVGx+ePXj19ri7GxpcHJnXmFhbPtrX2tseO5+9/T68Hx5+PXx7uzm7XRl X2d1bHvl5d/f9/tz9vFfbO98b1xYbGxudWvu5PDvdWpeW2NiY3zq6Ofk5+vq fHL79Of19vB5/P/0fmttY2lybfvq5/tmbXxy/3306X5oZlxia2D94Orj3+Hl /WNeX15dY+/j8/f3e/xzbX7v/2ltfvP2du7vbGxoZXFtZXf87uny6ezs4/Hv 7f1rXltbV1trbPbo7/Ht7u/q7ubpfXFnW1hZXm3z5+nm3OLn4uDj7O3yc2pm Xl1eX2hzc/Lq6uf/Z21sbGxnYm1+dG1t7ujv9O3zcXBsdv52cm1na2tnZm3u 7f967eDo8eLc3ev08fZsYmp2/2pl/ftlZWx29fNubnhua19ie3lzdG7t4PXy 7O/seXN9a2luZ11haXHx7ujk7fH9YUpN7fvl3ePJzfXf4vbmcfDcdVxqd1pI Um1ibW5meGtY/fd55PP752tecmZjbWhv7+7o5+bm4OLo8fLi7/DzcX5sXmJv bG14+Ofo7+f5TkZeXVJta+PO6d/P3NvcfOXf8tnW1MzL0nM3OFE7P0FB1d1S zM3h0Hzs1k9Q3Hb74/fOzPDV1nbjZGHja+/X49voXF9aS05NSF5jWeTm5tPg 6eNqfuV0+vjdzMzHvry9wds0LUg2MTo84s9L2MDZzeNo3lRCZW1e1tbKv9HM yfjhZVbp6/zPzc/RYFlVQkJHSlBRTvfg3s/PycvPxb/KzcfFyWguJUo/Lz5A 0b1L47zx1dpvzV0+aX1MV2zvzNjYv9LOzeXN1uXN1erjR0VTRk77aefa5c3G x727w814Zd91Wz8sJjQzKzlA3sLiy7XBw8DW3ks8V2lcz8K+u7zHxd1lZk5+ 5151+F/pSUBuTkzj28W9w7q1urrIzb5WOzQ4TiAhZTcwRjzJxDfKul7W6/q/ WkHGzlzIy7+12MC6z8TfU/RQQV1XXOhb39Vr7NnSyczJurm9vL281EpYNxwc LikrMTu8vk3Kvt7O8nvUR0nN3M+/yL+9w7e41MLBzc9PSN7VTlR41Mpoa8XR VF3+zcrQv7W4yXNaWjwjFyQ2JCo+0LrOar7Ebk7P0UlTXeS+zsauu8CztsG7 1OrGXV/k28jOe+LTXVVpXGb4YuLEv7m3vMpkT0cnFBswJSU2YLKzVcWxeEzH ZV5YRMS53Luvv766ub3AzMy/2uHK0ez4Z1vvVD5s4ElRYfbCvr6wr7/bcGs/ IxIbPyQfOcq2t1DMtF1GydNU82jfv83Ks7i7s7C7urbIxsbc5HpV29lIUU4/ YOdJUnRZ0r/Fta++0lRTWjgfEh9KIR9KwLe9RsWxY0u2xWXYVW/B2te1ubar rrqusdDJ0U5RSj/o9Elj2F5n6UpM81Xauby1scTlek86LxsRJj0dJ8zFvNNF u7D477PIWVBO3b/Wx66tr6uosrS52uBRPEZNTPzqTGdyRk9MO0Bh7c21r62v w93lVTk2LBcSMzIeOtzft99QsbdVvbJORFxkxLzJrqetq6euu7bNS1M+Nj9m 19xOStBJLjpEQFFS0rCxr6y5ztZTSz0yMh0QKUoeLfnqs79Dta7c17xoTF3/ wLa2rKaqra6uusVePf1TNDlazMlBNV1NKjBtb/Poyq6stre1w3NRTUM/PDMZ EDE6HC1bv6rLX62067+8ZdTOcbytr6qtsKuxw+3baU5AO01S/NdNNTM8NDJR et3Ly7yus7yuuO/1eVFPRz07GA41Nho048Wn2kmps9S1uNPF11+7sbiurrKx tsRpzO9CT1hQSUdFPi8xQj5EauDWzMK4rq+ysbvxRGPeVk88Nx4OHzkeLlv5 qLBKta22t8Rpvs1Ex6+zsrKwrbG/+8x1PE1LP0A7QU80Mk1LR3Tgz8bNvK2v tri+zn768lhZQDgfDRtEHyhP46apQ7qpvMu/2eFiPcitt7Wpq62yv2Hz9jxI S05VQDVCOzNIQkTSy97JvLeysbS1vcp4ZtlcTT48LA8QOCckSUutnvperbfA v1hJylhisq+tpq20rrPuSHRDQ0xIX0k1PDw0R0hF1snVxr29tLK6uLzF/WLd av0/Mi8TDy8sJUpVt5/HTrW5vL9YQMnT57SsramstbW05jpVRUhbPkHqZkE6 NEdkPknLwsbDv7mwtLu+vcxP7t1bPjMtFREoJydPUr+iuOq4wry3ej/Lys20 s7Cprb27t9dHS0hZXjs7e+RMPzRK5EFL3ci6vs+8r7a6v8bF71tWTz4uGg8g Lh4sQrulrXS8sLvC3k7UwlDZs62qsrOssb1bTVdJRjxJYfRjTjs5Sz9D7tHO vsXCsrO4tL7Z0PBhSEE4Hg8cLyAuLtqirua9wLS3WVXcxNFh1K2nsLytqrLk S95ZTjU5XNbYWEE/Tjw5T9fS18i8trSzs7bPWd/fPTcuGBQsJiUuLLumxs+3 wa+5VP/a3cTrX7Gor7SyrazbS11x5TsxPs7HYj0+flI1PtXSwtnLra62t7/D 2EdOSzUcESUwJC8nSKW7TrzCrbFATMJratHnt6yxsqusrL/Ny1ldSjw5Veze WDs/ST8/TVbQxs69sa2tvc/N1k07OisXGzIjLS8uubNtvcK9qss/9+puzGDJ rbG2r62rsMzR1OhdOzNpze7sQT5JNDRET+fT2LuvsaywxM1uTEs9NCIXJzAm Myo4tMBfvMe0rv5L9Ovdydq7rLG0r7CuucfafeVVODp1ysxVO0E+MDREa8zL zbetrK+2vtZXQjg6MxwaLy0rLydEr8l2w8mtsEdN32nG5PGuq7Oxr6ytveVx eHQ/N0fQvdk/PEU6LjFP0MPMzLOqrbq7wtJPNDc3JRkkMic3LSuyvk681bes /E7S/c7LdL+rr7eyraq01MjnVEo2S9Lb2UxCRDwyL0Ho5svKu6ytsLS+zWw9 NTQnGyEvJy4vLM3HVsXVv6u/Y8fOzMh4zbSzubavrKy4wMdpSEtFRtvrTlk8 O0MwNlpP583Qr6uys7zI2EQ3NCogIyonLDMtR85YzMfSr7TKvMrBvXrtwb3C v7evrK+0udnyzkpAaVZqXzc5STk6P0Da1/DCtLC2yM3KVj80LjQrKC8qMj8q PepK02pNsLPPtLu2qsPlucDHxPS+r7rCzNe+zkZV3dtcODhFPzc1PFPybWbM uLjDy8rL10s9UutQPDlASTkuLjk8MS0xRF5W6L+yrrO3srK6vLu2r7a+v8TF 21F51uFXQEhqTD9NXWzsTVDS3GpuY+p6SEFJVU5EPj5BPDMtMzUwMDI+UWzL uq+qrK6sr7i/yLy4wMXEx8XkVOPT2/xRT3t0TE1ZeG5KQ1X8W1db7+dUSUpM SkQ6OD47NS0uNTIvMjxY2M27rqqrrKuttL7GwcDAwcG8vcvd2crK+k9OVlQ/ OkNLRj89RFlPT2jk1N15a2JcY0k9QT87NC8vMzQzNUHr1cW4sa6usLG2wMPF x8C/v7m6wcbIxMTP/1tgWE1BP0lKQT0/REhGSWbq6vhrYVVOTT46PT43MzMz OTk6RWDZxrq0rq6wsbW9wcLHxb++vby+yc3Ly9DsXV1dT0pBRExDP0NER0lJ V2596+33a09MST07PDk2NDQ4PD1ATuLRv7m2r7Gzs7rBwMTKxsXBvsTJx8jH yNDcbV5dTkZDRUhAPj9ERkVOWm3v6tzffVhRS0E+PTo2NDQ2Ojw/Tu/Rwrq0 sLKztrq9v8PCv76+v8PHys3P1uH/XFpcVEtIR0VAPT5EREdOVWjv5N3geVNL SkM/QD04OTo6PD5CT27dy723tbW1tri7vb7Aurm/v8DHztXs7/hYT05NTElC REhERERESU9QUmDr3uXe32ZPT05IRT87PD47OjxBTF770765t7e4tre7v7+/ v7/CxsjK1ejm6XpaTU5UTUtKTU9LR0dMTUlKU3bk4OLc2/ZXT15aSkRAPT05 NDg+RU9j2MK7u7m2tre6vr69vsHGyMrQ5nZ0cWRaUlNSTU1PVFlVTU9UUE9O Wn7o5tva5u5uWWJjT0hDPTk5NjY7PkZW5MvAvbu2trm7vb6/wsTFxszW3Od+ bWRcV1lSTU9RU1VWWVxaU1RYZHVvfubk6ujr8WxjV0xHQTs5ODY5PUFR9djI vry4uby9v8LGyMfFxs3Vz9Lf7PR1Z1hNT1pbUktQWVpTSlDa0ejRysvDy1tA Q049MC8vMj08NkvKwry3u7awu83c9HJTQEFW7dPRzb+4tru/wMXkXU4/Pj87 PENGS1/lyLy6ubi4u8ZdOCwtLSYmKC1D9erIuK6rr7nJzs5UPzw+UWRv2sO4 tbe7vr7CzNv2dG5aRj07PT08PD1Jad3Jv7qzsre+wsPRPyUiKSg0NitKt66s ucq6sbdPMDI5XmE7Rdy5rbG/yby5xNlNSdTBynlLTW1qRTc0O0xZVFPev7q/ 3VdVUEc9OTxK+9LIvLWur9owMTE2bzkvTN23rb3azL++zlg5PGLcvsJf6si+ vNM+MUFUYtpNT8W/vsFpR0xlVEtFOELjzcLNWlddUFBOPj9RY9zLz8/IxcLM +l9o7trR1NPMzdDU6FpMSEZJUVNaa23p3+VvW1dLSlZge9XPzsjN1dHfcldN UlFPTUxUfO7u4u7p3XxaWl5cXGXz0sfHzc/T2exnVlFh6tnPx8XM3F9OSUpH QT49R2bh1s7O2OlcTl31ev1+bd/Mzs7VbWhzZmRbT1Nh9t7X0NLa7WpdX1xS Wlxl4djY1tXf6HhWUU1OW11l3NHU1/JfXGVeU05MW9nR2NzZ1NTedltbZV9c VFdz59bW6ubc3+f0X19mZG1v4NTZ5WxmaWFbUUtRZG/77uXe5ud9XFpcce31 +fTk2drrfGlibWtcXW/x6ubh3dfY4fprcWpfWFZdaXVubG9vbnV++enc3Ojs 6ObzY1VSXHb18vPs5uPm8G9vbF9lb2phbHf+5fR5/3B5/HhxaGt9+Plwde7j 3+fv++nmfWtlY2drb3X97vT6eHRuXFxiZ3nu7+rq+fLx/Hd8fHB8eXJ9fvr7 aWFl/evw8H529ev6aWNdYHRtbnh3/vj18Ozn3+Hm7WtqZ2JmZWp3fffx+Xx9 +fj09W9oce/k3+bv+Hj+dWFcVlhncnR08dzY2+Z5bGtlZl9dY2xzennz6OTu b29ta2lrfPjr7/Tt8/Hy8nx0fPjr8/r7fu72c3BkYGFiX19pcGx77fR1Z2Fy +Xh7+Pz05+To7O7t5+rz9/5tanZtX19qbXV2bHL/8enq6vT++/r5XVBXVfbW 08fP4/NWVVtZ/et872dbamTp2vl6XE9SUlt92s7Lztnta19YUVZcX3fq497j 39ve3+9lWFNUX2155uPr+GxfYWFnfnvyb2b7997e7t/1//RranD449vk+29j cW9reWptbmBbV1ln/Ore6OvoeP78+e3t/Hv9a33o8ePn9nhjXl1aXWVp+/54 +m9vcHDz7+bs6ebo3ujxd2ljXl5fb/rs4OLobWRoZ3Bt+O38enFxbXJ0/fF3 cWReYmr76d/k7HVqamf46evk7f19ZGr88ejv+3xuZF9dX2137eXq8e3j5N/X 1NfqZVE/PT08UlzWwMm/zebdXWBnU1tYUmVq38zMytTpZU9QTl1y79fZzc7P zNHN1u5cTU5X6cm7uLzmOSofICczy7asrLnBflN+d93gTUM6O1zKsaussc5F MCsvOWfHuri/yXFdV1RrXFlNQkZKace5sbC3weNQTE7wys13NygfHiU0yayn prDKVDs8Rlbe+VpRSum/squss85DMi0zQti7uLvVU0M+R1vYzttvST9BT9W7 sa+0vdJSUF3q2E40JR0cITLFqKChqr5RNjQ7SXL0ZGL2x7Orp6q2bTAmIyo9 xa2qrLxbOjE2RHjKyuJVSE/au66rr7z9PTU3Sd3XUi4fGxskQbGfnqKu3zox Nk3PwcPWb27Otauoq7tMLCMjLEu5q6u2fDguLjzwvba+2U9ATcyzqqmwxUQw LzjdurvkLRwVFR88rpubn65RMS423ry4wFs/RM6uoZ6lskMkHR0oVrCjpbRn LigtPMizsbt4PTZA0q+mp63ERjAsNFS/udoxHBQVHTyqm5mfsVArLD7LrKu2 2To0SL+nn6SwTScdHSpgraKmtkoqJSs/vayttW86MznYsqinr8REMS03Xr60 vkcjGBIXJnShmZykvzcuNWmwq6/APjE3XK+ioKe/NSMdIjfIqqaw2DQpLD3M r6233DkyOWS0qqesvGk4LzNF2b6+3TQeGBUcNsefnaWrWjk9RLysr7TsOjpB wqqkprRTKyMkL9i0qq/dPCgpN/Kwq66+Tzk4SMuxrK242kU2N0BtzcjKSygc FxclSbadoKiuSEdddLCtu8U9MD5fsKOiqcE3JCIlOr6yqrlQOCoxTMOvr7x5 QzpIybSqq7XIRjUyOVTPy9NCJBoWGCfpqpyfrsM8M1vIrae1zT4uPNGsn6Gr zSwfHiZBtaiptUsvKS1KxLGwvfhBRGG8q6mrt+ZAMC85T9PE0U0mGBYVIuiy m56vtzs037+qpbh0Nys6waidnarHLx0eJTi2rq27PzMvOtK2tLrtOTs+frKs qq2850Y6O0lb491fOh4WFBYuv6OXoK/WKy5iuaWitPo3LEW4pZ2gr18oHSAq V7Ctrss+My4+1bq4x1g+Q16/r6yut8hRPzw+VtjU4Gw1HRQUFiy0o5ifvGkr LtitoqGxRS8sPLCgnqC0QikfJDZ1ubXETjk0PNa4r7boPS80WLytqK24ykw+ QUrlzNb6Sy0YEhQZQaidmKTOPykuzKmlqL42MT7OpJ2iq+EsJSYtWr66vdlB OzxB3sDD10s4OlXFr6qrtMD0R0RBT+vW3WtVOSAUFRkorKGen9I+NTTRqaWu vjssRMeqnaCtxzMnKi9Oy7/NYkk3PE31vrnGWj83PdK4ramyvdBPS09X6M3Z WUo/JhUTFh2/np2dtjUvNnWqn6nAQSw5u6Wdnq5aLCMmOcy+uMJEPzo5TODE xctLNjxFy6+srLXEfl5eTW/qef1fR0JDJBQVGSSunqCm1jE0Z7GloK9IMy9J r6Cepbs8KSowUb3By145NTZP27+4zmM7NUT1t62sscJ9Tlj+3tfiaVBHPkRC JBMUGyqnmqCsXC4yyqmlpLo2LjjLqZ6fr1gtJCo9x7S7wlQ5Ojc7UsS/vL8/ PU//t62vvtlXSXbX83r5VVBXREpGHg8VHz2fm6nbOz1gqp+ouUIrLfiooaGo 1TAtMjpevMhU6Uw9TkhBVMbGxM0/Re/Cs7S51Gbb0cjRV09XW19ZTEstFA8b K7GbocMyNWm3n5+zRS0uQK2eoaq7QiwyT09oxGVK1991UD41OHfEv9Fc6s+6 tL3L9tzMyMpZSU1b4XROSjYaDhUnzp2dtDQr+a+fnq1NJitJtZ+eqL5fQDdL a0A/TU3rw8ZcOzo7TNDJ7EluwLi0u8v/48S+xvFUSUx99V1JOyQQDx9PpJyq SCY6r6GeqNorJUS3pJ6nt/BWTkNMPjM+Vcy8vuwyLztOz83XTku/s7S+0ur/ xrm+1GxYUmZwU0M/MRgOFjGunaXMKiu7n56nxjUmM7imoqmzw+ndb0I4LTVe zLi50zsuNkLbxNRxSee3r7fZ8/bcu7jIW0hPXebuTz42IA8QJr2epLw2JWSi nabGPS0xxqimr728u8TOSzMrLma9uLvWPzA+bGj2VU1Oarqxtsjx0N3PvcHY VVdcT1hVSEIzGg4XO6aeslQsMa6cn7s5Lzd6raWrxciwsMJLMSwsRbiywGpH OjZVz9dSQVJb2LawuNrhzNvOwb/eTFFVTVNTTT0gEBEmtJ6tUzU2uJ6fszcs PNawq66917WpsGMuKy48xLG670lGRVn7WUg9RFrdvri1wPvk1Mm+u8RUQ09c WVRSSCoTDx7Jn6pGMze9n52sPSo9z7m2uLrDsKar3C4qMj/kwL/cVG/k6FdC QD5ASVrKurG0zGhtzbq4wlo9SG9mTEZLPh8QFTGqo+AxNN6lnqTPLDHetrbC vru0qKe5OCguQXLVzMxuXuXbXz09TE9IS9O5tLTDX0/ru7a/3EU+TlxPSU5a MxgPHOKirjcuSK6foa9DLke+ssDfwrWqpq52LCk6as/j6OVt2dZWOzhS3nVM Tcm0sb9NQ/i5sL3gSUJZeVA/PmHZLxUPIbagxCouyKCcpsEzMOW0tmpNxq6l p7s7KC9XzM1pYO7e0N9dPzpKed5sasq/v+hIXcq4tcDeQzxLVUtBTtrgLRUS JbGj6Co2tZ2ere4yO825wUtOvKmiq9kwKTzVyN5NWtvLyW1FOj5m1tJ2Y8/G zVtI6sC2uMdsPj1OVUtGZcTNLhUSKLGnRSM1rJmdtEkyU7u73z1KtaSgrkYs Lve9zFE8WcnCx1Q+Oz907Phtbc3L3VVJ3b63t8P4PjdDU15c9MLGOxoRH82r YiQwrZibujw5yK6/RTNDtKSjsj8sNsm25Dw4Wr6+zkc0NkjOx9l06cXIZkZG 2bu2t8VrPzlJbfhnaszMORoTIMesSyAvqJedzDNFsKvjLy5lqqKqxzk2brq/ PzFAxrjWRz9L5PFPTf7Cv85TQ1nMvcPQx8DRRDM7cNL1TWHQPh0WItC1Nh83 o5eg9jvGp61BJy/JqKq87Ezjv73mODv1v8pCPVvLzEY6V7621UE9WMW/zvjf vrvaOzVbwMtIOFPIQh0XJcq9LR8+opmmWUmzpLA5KDe9qrTzWue9vdJcS9nC z047WM7fRzZIxbnKQT5fycHe99zKv9ZVR1LN0VE8Pd7XLRocQbhDHiO3m57F P76jp+QqLeawtF9ava+1bEr+xsBaPD5vvdU/N0HIvdRHPuXEz/7tvr3XWVPd 1nFjVE9JR1c8Ih0s32kmHkWmorhUu6KkvD482sLOUlK8sbtpSsq4v084StXI 7T09SGbYdm1z7tR0cMm6unNEYcnDYkRj3P0/NjMkIC5HRCgkWK6uw9OroavJ TdK7z0s7Xra0xlhzubbRQz/s0/ZhV3BSQUhQfO9fbF5rybmzwGNV787XWUtT X2FGMCIfM2A6JiVTscBhz6qgrs/RurHGRT5dvLxuTdq3t9le28fkTl/Z40U6 RE9OWf7ad1HlvLG79U5Y8PtTTVht/FI5JyAuRjQoKE673Vi+qqWxwLe0tsP2 fnzXzmNW6MjF3enIxepg18ncTENJQTpEdudPQGW+tbnJ1OdaTlFfXVFUaFgx IypDOCopON9fSMWvrbG4sq61u73K3+nqa0xLeedv2cbCzdrGw9VzV0tCPEFe W0RHY9PIxL6+0ldNWnlpSEl57EArLkQ6LC04SEI857i7wruysLa4tLW9yMnX bF5WS0tk2Njs3MjDzNr3XklCSFRUSklafOLWysfTXElOXV1PUerK1VpPUUg9 NzIvLzI3P0hP7MzDu7WysK+xsrW6wtDteW94fGRfeeDh6+39aF1hb33+Zmti WFxs9mJKRk1RS01c7uH8bnVVQjw4My8uMDg9R/nIw762r66vs7Kytrq/0fJk WlZWUVZt++DQ0NnX5///ZGloVk5LT1NRUU5SVlBNUFx0a1Zf9lM/Ozc0MC8x OD9P2b+6t7Owr7G1t7q7ur7M1NzleGpsZV1Ybd7c/2p+bmNWVGFUSUdKVFdV XXXtaVZi7fdcT1tpTD46NTEuLTA3PUvmwri1tLKvr7G2uLa3vMPJ2Phxc3Vr Wlpw39zvaGpkUU1OTktAP0ZMS0hV7t/+a9/S4lpPYFxJPjk3My8uMTg9TePC t7Kvrq2usba4ur7CwsnW6/ft6nFgZHL78PP1bVtOS0tKQz0+REVERVN77unk 1tPvVlFWUEU8Nzk3MzM3PkhQ5b+2srGvra6ytre5vsPEx9D5avT2bF5cYV9c YmpbTktKSkhCQUNFR0hNXvzn4OHd3XJWTEdGPTY2NzY2O0VWYPHHubOxsa+v sbW4ur3CycrL0+Vsbm1jW1leXFdTVFdNR0JDR0VDQ0dMTldu49PT1t3m9lNG Pzs2MzI0NzpFZuDTx7y0sLGysrS4uby/xMjJztXk6vJ0b2FfX11dWlZST01G QkRFREFDSE1UWnfcz9b29HhYSz86NjMzNjg8SGjNwL27tbCxs7S2uLu+wcfM ztPb4+Ln72phYF9lYF5ZT0xLR0E/QUNEQUNLV2Nl/+Ld5WpZVks/Ojg2Njc9 SVN1zLu1tLOysbK3ury/w8rN0Nfe3Nne3eTs92dcV1FNR0RERURERUNHSkxN Tl3x6fdy7OphUElDPzw5OTs8Q1Rx2sq9t7SztbW2ur2/wMbN0tPU29ze393g 5u91XVRQTEhDQkNDRkdFRklRWFlfdOHrZGBfXVNEPT07OTo8QVFv1sfAurW0 tLW3urzBxcfLz9jb3d3a3uDp7f3+dV5YT0xLR0NAQENHSklKT15+7uXh4/dg TkxMQTs5OTw+P0he38zDvLq3tba3urq9wcbLzNHY5u/q6uPm5uh5b21mWU5K R0dEQD9AREhMUVhq6Nva6OnmY01GQD06NjQ5PUNPd82/ubWzs7W2ub2/x8vM 0NjZ1djb397c39zk7H5pYFdPSURAQD9ARUVJWW/hxcRKQcviPT02LjEyLS44 Y8vKv7GrqKu1trPEWEE+T2RWc9G6rrO1r6+zxGZbST04Ly43Oz1FY8nHxsLM 1Gs5IRwrLCMsKTitr7+2tKiiultV2rzLTU/Bs7rWXNu+v+Jc2b22vtXHvcTz Pjc9QzgyOEJuzMnBuLi/z/dPOiUYGyoxTzszuq6ttljPsLTHPzfsurnR8tjH u8bV2sS1vLu6u6+vt8VqSzovLS40Pk9TbsO7urnE3GBALBgRHC3MtDlGvK2g uUFSvqqyQi89uaq2fDpWt7fJR0rFsquzwMG7u9I5NDlH9nF4Xmz8z767v8TZ UD8oExAdL6qvNzEvwaOw9j9Nsa3UNi92q6Oq0VLYuLpmQEDAqKSosb/J6j4y LC48XMfG1eHSyMLJ3kw3Hg4TI9yesz0tJ8qorbLN6MDYRTcvS7mrqbHHZsrn WlhIxrKopKqxu+dPOzE4PmThy729trzV30k4Hg0PHFWZqWgtGT6uq6TAY8Ph zG8yPEfEqayxweVZSz9E3r6opKeorrXDTzgwNT07RN25rK680D4bDA4Z8Zmq vSobXMCnpN7fRT/DyM3EOk3X5Ky7v8lMXUde0cCxrKyssry3xNZrPDk1P9u3 rrTGKQ8NEjmapbEjEy1TnZmzxCoo/8Koq15dNz691LjddcDeuL3PzNnAsru7 v+vAwL/ISDo1ba+tszYTDQ8rnJ+oNRUfKayYqKo0ITlLqKG5vjczzfuz3Txb O7qsr63tTeh1tK+8uMu/vmtNN0y/u84eExEUuaOgpicrHyqkqaa4KS0pS6Ot qskt60Szrj9XKTy8rJ2nvGUzQ8S+r7q7s8q6V0fRfUYbExIZu6+hrjP6Klq0 669EOUEu1rvHrM30vD60/kLOLOzkvKe8sc5Qwcy3sLy1x+jFcci+YSYUFhU5 sb2mLDlhQp2vu1ceMjnGosG/0jWz7sK6LegwP7vvq7jHvD9YysSqsbGx0Llm TstGJBYYGWmqtasiKzE4nauoxyUuK06qra+wRb7MybIxPikv1cymq7G9OzE7 Tq6pqa3LuM3HyEAdDhMX0Z6koigmJiyfpaG3KC0mUKisrbg7ztW6qUnsKCtI Q6myr7VKTD1Bac+xqa6uwdjPNRwTFBrLr6CnNlIjNbXAor9EPyvdta+pvMzA SshHPtM9vdBgxUHmw826fllpaLSzsrPGvt8pFBITKqiunkwtZCqrrs+1KjtU TKi4vq3Oq63OySMtNU+kr6vZLz061LbW1ktZsrOrtM3JTCgTFBQpq7afTCpP KayotKkyNjcxt7m3qLiqqszEJikwP6esprk3Pi9Gwt7BYlu6u62xv8ZEHw8T Fj6graMzKEcrrrDCrkXty/22zke+zKqivr8oKTlLpqyqt0FSOT3Oc8O/6L7O uq6/vTITDhEdpaCmthstMHadt7VeJ1lvsqO6vc/uqq+3TSErMreiqKtvO0I/ X99Zy7y0r73Bx87MKA8QEi2bq6M4GTkqsZ/BrUgzzEe+t1K0taedtNsiHi18 o6Opv0Q/UFLe/1C+tayuv83R4i8PDhcimKSu6hEvNsWb0tNVLbW2wbMxV7yu mKq/JhouTp2cqL4wMD99y8xcxrasrL7C28kpDQ4WL5OjsjsNLE+tlMhGLh/E p66pOTDPtZmhxCUZKu2bmqbPKi403r6/z8u4rq2/y2zPIgsTGtqPs7ohDlK6 n5haLSwnu6LFuz1FrqmgtUQfIzm9mZ+lzy00LEPKvb27tLSwusHXThcJGSOj kVlUFROvppykLyQzQrGpP0/lsZ+otlQ0JS88yZ6foLsuKSU/sqywwL61srXK WBwJEyuuj78tGhOymKCuLCBQt7vYMyfCnp6nRS7cTN46J7qjmqI/KiQ3s6y7 z7+trLbLMQ0JIUyVlywjFCKanLjPOrylTyAZKa+Xlr8uHjihs8woIq6dnK8r L0j/t/xqqKKqv0QvFQok7qaULh4hKZ+hLyfOnJm2Gw8fyZeTtDswQ7TYLS1o o5+sOy3Gr7FELDqvm6GzfjASCR/onJQ1GhwvoZswH+agma4gFSm6paQ8Taal ryEXJr+ZnK5YP96+Py9QbKqjqKq8HgkPJLKRqUEpLrteKid+l5rKJBYuoqLP JiWrmZ5GHiErxbnCoJqfuyscM7W3ra6uqi8NFCxZnssi1KWqzhoScpycsCcj xqjCLCA1pputNio53s4yLq+dm6ZGM2LHv8zmt7EiEiVNr6cpHrCmq78bHE63 tD4v0qSiyykkPsatykS9ue4vJS+5nZ6qvkJgw761yth3Hhcy42+/KSKsprG4 LTWzYTAoKsOqr1ZBwaqo9yspO7WuWTAoL8+qoqSsv8Vua2Y8SG9aPs71NDUj JEBY27zNvqq73ctMTmQxLD5f2cDCzratt7//OzYuKjfNtK+vyEpKOzlJ27Wu rrjHy9w7Lj3WubjeREZMOzIsJz3EwspPPXi5ucNvQ0pL8nJAWdi7qKez3TYr Nd67ub/M7nXMSzI1OkptX1+/ra+7SCwtQtW/1Uc/O1TNyLzD18bPSj80L0rD srHIS0BNXedfadvLxf1LPkToztbeb+W/vMxeQjlPy8O9zW1NQ0M8O1LHtrjd PC4wR8q5vMzd3t1vRjs6Scy8vMVpXev2Z2n/ybq9yFE6P/zC0l5JPU53SDw5 QMy5tbxcPjs/9M/KvLq2t81LOzlB7vFvYUZe6mVXTFnNvsfeSDk8TePKxMnj WEU+Td3EvMHObFFV587Y6ltS3cG/zkMyND5xzM/U1exfWlBm2u76bfrPy8t0 TFRs1dtPQEBIbtTHvsTuSkFL3MbG7UxZ3cnJckdNVWTs9tTZd2JWZtbN291a REZH+8fDz1w7MjxO0MS/y9TP0tBdbc5v52Vb1u5g2VBRWk7f1W9eTULp0c/P 4uPM7Eg+PlTfy8Xa2/ZGP0BK7MTKwchsT0JPzc3VfFTcxc3ZWkj48HPiZFtR Q0xe68zNx8PkTD87SdfKy95fX1ZTXlhn1s7GxdxvT0RJTE/lz8zK+lxVUOTZ 3N9gYmRTZufhy8fJ2mJOQz5EZM6/w9pZS0tPXXLe2eB+Z9/kaldIUNrMzt1d VV5bbODf1tpfTUlOZ9/MxMXMckxKSlFh3cjG1X1TR0pd89jOztLiY1VNTVhp 7Nvc72daV1jy2tjS7FlPTlru2tfT3unvXlNST17ez87f7WlRTUxf4c/O1ttu YV1XZnrk29/pa2ldVFlf99rd62BXZe7d2ePn7GtdX2N27fX1amzzYVhbWXHe 19LP0t13W1JTWWBo/nb/3dzi6nBjZlxTV1v/29ve6ezodWR159nX82X5831x WE5QVV5q9tvR0uP1bWJtePp1WVJdc9/X3ehtZGx583Tz6+fecF1WUmh1/v5s /t7a4mZcb/Xp7HNjdOfo7X5nZH7m6HJfV1Tt18/O8mZjYf1tVF5q7tXd+W5o /3dbXGLy3v5cVVdedHvp2t3c6Wz57Pr9bXLs6+9rXmpu/G9lePXmfGBdZOPY 1+BrbmpndGt36eXzaWp+eWdVU2Px3+ZvaWhud3zu9fpqXnTj1djleGN75/Jo Wlpid/Dd1tnbc1lZZevremlfa/t0/3VqbGJq+ODZ32tWWm7t6HZiYmNr/+vf 5Ox4ZGhw7OHy8+7xd293eef1ZF9o7OXsbV1k7+X9X1dddObk7/Dv/mBfdPHk 6XFnYmly+u/+bF5eZPDd3N52benc2+hkX2hq7/xubGZ5eGhoaXj6bv7q8uz9 a2pubv/u5t/rcVxYXW7y7/93dX19d/v/evTv7OXg3ujt83d7bXV3Y2NWVWJt 59vmb2VdX19damd26Onk5PluaWr07efoeHx+6d/i5/x1a2FZWmZ98W9fY2lu 7/Lazs/K09vY5ej6XE0+Oz9L19PQ3VVeX+/V7HNYS1p33snOzdZvfmBxe2Ji WmX64NbY5/RsW2Nlff10dFxlemzv5N7X3uhrWV1fYm1uaGtsbXjs6/D3+nRl a2pjaml36nPf4+XlYG1ebe388e7z3eTv9lxtXV/ye9ji7eh7397e1Nrg7llM SUpQSUpDR15tyc7OzujddG1qWmBsZt/Tzcja0nZZYkxxde/bbP5dWv/57+vv 9/Fu/nvez87Awby7xWg3KyQpL0LPxry/y8PIwMPtTTcxN0LavLOwucTlUl1Q Tkw8REhnwsC5vs7hUU9UUFhOTFRax7auqq62bTQkHR4jL1TJtrCxrrK1udRZ NCwrLD7Zs6moqrXLVTk0MTE4QFzIvbKxtr3uSjs4Oz9Oa8+7sayrrbTRPiYc GRsiMua2q6ioqq6zw2k3KiQkLEO9qaGfpa7NQC0oKCw4VcCyrKuwvN1KPDc4 PUhc2MC3r6yssL1eMCEaGBshMWWzpqGfoqiyzUcuJiIjKzvOrqSfoam2bjct KSw2U8S3r7W8zV5MQEROXevj29HIvbaytLzbPiofGxocJDHzsKWenqCotMxD NC0rLC43SNG4rKqqrrbD32lNTUlKQz08OT1K4r+1r7O6yPlVTV3cxL3A3kAu JR8dHiMtUMCtqainqqyxuspeQTMuLC00Qui9r6uoqauwvdNLOzAtLC00QN+7 sK2wuMboXFv+1snDy+pJMykhHR0fJzJJyrSrpqOho6asueI/MCooKCw1T8Ow qaenq7G70Fk/NS4tLzdF+snAvsDBxcK+vLm5vMlvPy4kHRoaHSQuSMexqKKf np+hp6/CTjIoIiEkLDv1uaynpaeqrrjE+0g5MC8uLzQ7RVbhybyzr62trrK8 00gvJB0ZGRsfKTh8u62kn52cnaCos81CLiYiISUtPt+6rqqpqqyutL3QUzwx LCsrLjM8TPrIuq+qp6irsL3oPy0jHRsbHB8nMEnLsqihnZycnqStwFI0KiYm KjA+Y8q9trSzs7e7wc3yUEE7NjQ0NTg9TPfEtaypqauwu9JNNysjHhwcHSAo NFq/raWfnZ2eoqm0y1k+NjMzNjpAS1r94dnPzcjGxcbN1e1ZRzw4Njg9Tt6+ s66trrK4wt5LOCwkHx0dHiMrOV3Br6mkoaChpKess7zNcE0+Ozg4OTk7PD9F TnbSwby7v852S0NAQUtX6czCu7i2t7m9x+JOOi8oIiAfISUqM0P3wrWspqKf n6CkqrC9208+ODIwMDAzNjtDUOzOw7/Cx9XxaF5fZXb83tPMx8C+vb2/x91W PjIrJiMhIiUpLjlL172up6GenZ6hqK6601M9NjEvLzAzNjk+R13cyb++wcfU 4m1qaHf249XMxb++vb6/xtpaPzMrJiMgISQnLDVE372tpqCdnJ2fp6683Uw7 NTAuLi4wMzlCVNnEvry/xtb5Z1tmanX27NjOxr67ubm7xOBOOS4nIiAfISQn LTdPyrKnn5ybnJ6lrbrgSDkxLy4uLzA3PEvtyr67u7/M1/lfWFNVUVNfa9TC ubKwsLS90k82KyMfHh4fICQsOGC5qZ+bmZmdoqy610M4LiwsLC81PF7QurOx sbnD5U1BOTg4Oj9FW9jAsqypqKyxxUwvHhsZGSElNk9ntLSooaSgq7jpMCwr L17Fr6mtrL/bZT1SSV3fY83WzMbi/Uc8OjU5Oz5bz7OopKSrvzkfERIaJcW8 rKzArLKqp8NmJx4kLcqmo5+svshG1U48Oyw+Ybmlp6WuxGw2LiooLC4zTNqt oZ+hq7c/HRQOFyxeoqyzrcGlqLXNIxwcJNiup6XByc7Krb/IQiw0M3C5rqKi pKvIPygfISY0a8ewqqimrbTCWikRDhAfuaearW6wwKSqQzQcHz5tsrlPv8Gu o7i6QDQ7KjMvTaqelpyqzi0kIyIuR8CnqKuvvbG6xmsuFwsQGMucqKQ2Oqq7 o8spPixYvDQ7NUSjpaatbcZePScdJ0uflZeetN42JyAeK9qnoqu+xbStsctH Jw4MFR+inLqvJkqhw6tMKbrWzeYfKk67nqu5ubezRh4WHj2llJqhqrC0RSQc ImCzrsdMvKmkqr7aORoKDhpclai7TCGqqO69LNGgutghGC7Spqe1rqWlWh0T Gz6pmaC0raWnuy8kL0rSRDR9rp+jrrXLXBgHDhu5kLhDLx+hoDvXO6qXuTgY GEqtp8vyrZyeORgUJ6+fq9ZJq5+suj9avj4rHyyrnp6svbS8Og4HFjCZmiQi I2CWvCV4rZObPxsUL6ii3indnJiuHhclvKDHNUC7nKbFtrmw/h8bI8OfoKu4 t7tEDwcc3ZmbGxYiRJeuG1WgkZk2FhdrnJzgI0qjnrscIteloSocL8+cpMmm o6pdHRwp4auxr6mttyoJCi2nkKoYFSXGmUYasJeRpR0SIaqXpD0q7qnWJiHO m5mvIBsu4Keqrp+ozjgmNdzs6N+2qrVIDwgfu5eZKBkmOKOyGlSclZ0rFR67 mpzMLkbBdS0cO6Ocm9YjLDXQrLanpspVRE68wkRkt7W8IggNMamSsh0nO7il JCGomJhbFRZCm5m3N0KpqzYaHM2goLw+b8TJ8z6+pa/hOHivtegwaaevKgkM NKeS4xIjupucHRa5lpPCFRRLmZjPLjWroVYjH0Ktq/02Tc2ztsmwrcdjPFa4 wOM6S662HQkUR56VLBQlx5adJCbFmplEGh2+mJ7EKyrJws9AN8XA2kw+T0Hy vLGmsGNgwKqtbSsoy640Dg46pJfIFBlNnpbvJ9qinVcZHNqZm63NNVM2IS5P rKbpO1HEwEs7Tremr+jitayxzjMqNyAPH7KgnSwRHDijmbzCqam0JRUluZyY qHJINTdLMte6XdYzL8vCq6fLPjExvZ+irrfXPyAMDC2elKMnGCfosksls5WY uBwWMa2Zmqu95jgrKTWto7NSIx8u3aijqr09MkLCrq21vvwfCw8/o5a8Ghs3 p5zUOLmmrC4ZIVCgk5uq0jIsLzRXuLKrs1wwKDPbta+0xE3ZurrCTTAbDRi9 nZtGGBw4pKI8Pq6dqCkZI82am7XQS8uwvN5uRz1SQG29vaqtSy0qOL2npq3N NB4ODjmcmKgfDx7nnqJzs5+kORIUMJ+Oma9CJzlAQPu2qKrrLiw6t6WtudxP UlfLr6/VJwwKJ6SUnyoXH1Kkuie/nJqzGREiypaTp7dCMk0/Xqy3vccuO1B2 q628vT85976qrt8vDwkerpicMRkiS6utMNacm7EbDx/bn5ipvrbMXzomW7Kw qes/V0C2qMTOVkK+srCvxT0VBxRdmZNtGRUlqJtcQKeanS8PFDakk53N6VRC US08sbSs1DNVWr+nsre3QTxL4qmozysMCiOvkp0rGRxCn6c416ScqCMRG12h mKjnz9PHTiQu5a+jt0Y3Prisvc9S4bGur7XDTx8JDCulj6kfFRfRlqVgvKub shwRHb+ZmKxPTsjMMyAr66Whulw3ea+6y0Uz0qyop6/CTSMMCyKzkZstGRMw mpy4vtympiwZGjGnm6GwvdlMLh8s3amgt0U5Tb65yO3mv7K1trW1uVMfCw0r rpKqIRsb0pmqzujwoawyHxosr5qYosEwJSIubb2lpa/GLSo1TrCprbK9xdHo z8bMPRIOHzyaoTEuGzqeqrNTK76t2DoeJLKcmqhILDg+P0c4s6CjqzgoLDu8 r66vtLTJQEfHtrsoDhIez5a4PisdsJ+0vSkpwsO0wzROybq2vM3Kv0hLPDXE v7azfWNUTMjDx7W5ubzR2sO91i4SDxkvnJ+0bB04vsi7LCfUp52oOyEjTaSd psZMOUNNNz9Hya6zwWw8QtC4rrXGw7+6vdDV3ywTEBMpm52lcxkjK1qhr6yu Rmw7L9fCrKWvsnxCOzVFPUVC8Lisq8c/MD7Cq6ewzlZa4sjAvsIzFxAQJKah pEcbLVCpnNI8Ly+upKirdj8/O86vrb1PJyUwPrKrq6zPTz9K+t3AsK63bzY9 4Kyoui8QDREppaKfwTFZMtC23bXY7Le8s7s8NCszva+irVEsHSc2vaWmprbV Tj1H5bmwtPc1Lje/o6GqwyINCxIvnpiaxygpJraeqao+LENCt7XczEpK2e66 ucNRJh8gNbmgmp2qw0c4NDY+S/PGvLSxr7HB1j8gFxQWK8WonbprRTC0rLGv OzhBO77E6cQ9S9XKqbPTMBwdJm6jmZeerlssJycrO9G1q7C4yW7FtquuyzAW Dg8cTqeZpr9XO7moq7YvHRwg6KihocRMREO5ucJNLSsvYb+qoqOktV4rHB0n W6mfo7HZVeS7sa60w1MkFA8QHmammaKuzTdNWd7LOSwlKFeunJmfrkwqKCc2 Yb2uuLzHvq2wxDwoJy9Jz8PHu7Osq7nHXk3dy7u+2jwfFQ8SHj2imZuixDUi IDu/pqK3Vi0ta7WlprjYPFbAtK/MPiwoLkHMsqqqr809LiovN1LJsaWiqLpM Mi494MnYNycaFhkfO7ylnaGmstprPDc0LC8zSrWhl5acqHQrHh0lNMisqazD ZnPnyPU8MCotNz/+xrWopqauxkgrJy1LubTLOB0RERous52ZnKa2Uzo5Qf/f 0/duzLyspKGgqr49Ih0fLPqzqq28Si0mJjN8uK+4xl1KVHTJv7/AycbDxc9X PDEvLi8uKCYgJjPap56bnqq4905LQ0NETNq+tKyqq7DBUzUtKSkrLDNG0bOu sr1lQTs+WtjQ1mFGRlPKsaqrssxCMC0yR9jIdTUkHh0mO8Oln56hrbPB595P R0U1NDQ67ryvrLK6x+lYPS0mICMuT7aoo6OqtctOPTUwLzE7V7+xra685T82 PFLDtbfGSy8lIiQpOE3DsKynqa2vusXcTj0vKSgpL0bCraSfoaez+DUnIiMn L0rCrqimqa+95jssJSQrOu+8tK+urq+yvMpePjYtKyooKi00Sn3Mu7izsbGx tbm9zFg+NC8vLzZB6beooqGotuY4KigqMkZ2ycHBu7q6vM1ZPDIuLzhEec7D u7y4t7m6wMxvPy8mICEnL0jWvrGvra62ur/DwcXMc0IxKiouQs2zqqiprbnS Sjw6OTs7Oz5IXOzQycLBz/tQRkdHR0lETe3EtK2rrLTDTi4lHx4jKjhdybOt ra6yt7m8vb/G1VI1KSQmMF24q6eqr7vQa0tGSk5cc2dQRTw4OD5T17+5usPj Sz05PlDiwrmzr66yvmA1KCEhJi4/X97HxsbBv7avrauvu+47LiotNk/Lv77E ycvQzdXZy8S+wdZQOS8tMDlGZ9fJxMbM2uny+unc2c/Kx8jKzNTqVD8zLSws MjxMWmJpb9e8r6mmqa/BUzcuLjNE9srI12lWXNvAt7Kws73aSTcvLzQ9R0xL SUtZ6dfLyMbCv7/CyNTi/2deWWBZSz86ODg5PD4+QERP+cS2ramqrrnOX0dD Q0RGSE1Xa+PVzMS+vL3Dz/BYRz88Ozw9PD9GVG55/+jRwLq3ucj5UUdLYtDD v8TQdUxDPjs5NjU0NzxIbM+9uLe6wcvV0szIxsnN2H1pafPUyb+/x+BNPjg1 Njg8QUdPVltcYXjhz8bBw8nXfF9o4cu/vsLL1t7e3+5qVUxHQ0NESEtMS0dB Pz9ES1n57XFaVWjZwLWtqqqsr7e/zv1SQTk1NDQ3Oz9ERkhLUFtkZ2hnd+DR ysjHx8XDwcLFy9jrdXXx5v9UR0A/RUxPTkpGQUJEREdIR0lPas++ta+tra+0 ub/J1epoVEhAOzo7P0xYXFZPSkZGS1VhamtnZG7s2czEv76+wcrQ331hX2Jz 6OT0WUg/PT0+QUNBQkNESU9p2MS5tLO0uL3Bx8jMz9p2V0xMTVdz9PVrVU1J S01RVU5HQUFIUGro3Nji83x39t3PysbFyM3Z7HdnZl9ZWFNMR0NAP0JJT2Pc y8TBwcPFw8TExcjN1uxcUE1PW2zu5uf5aFxQS0lJS01PUFJYX2dvbGVmbHT2 6trQ0M/R3Oj2++7p6XteUUpISUxRWWN17NrPzszNzs7LycnKz9xzXFRTW2vt 5ODj6/9pWE9PTk5PUlFOUFlgZWtwZmr/+fn//v32493b2djZ3/VjVVBRUlRX ZXLx3tjV1Njb2tPNysjKz932aF1ibH7q4t3obFtTTk5PT1JST09SVVdeY19e X2FiaPbf1s/R2N/l7+rf39/o/WVdWlRQUlliePT2fv7s3tXOzMzP1dz5bGRp /+PZ1tnd5XVfXFJOUVRUVltXVFRUU1NXV15y7d/a0tTZ2t7v//Tr3tzb2+Ls bVtWUFFXXF9dXl1hed/X09LX293f4+nu+Hz87N3SztHW3fRoWFNUVVxdV01H RERITlhldu/v+fjv5N7b2NnY2NjZ2NXU1Nfg/W5oYmBeWlJOTU5SXGt+7ufp 6O37+X719/Dh39nS0c7Ozc/Y3vByYFdPR0RDREhMVVxeYmRnee3i29va3drT z87Q2OLw8vV5c29vbmxoYmBjYmFeXF5pfP1+b19cX2xtc+7f2tbU19vd5PH0 9Px8dWJZV1ldX2NgV1NYXGBrevz++nh49+3e29jZ3d3d3Nvc3t7h6vxsb3V4 e3BsX15fXV5ZVlVSVFVZZHH77evy7N/a2NjZ3+fp9/b38/p2bV5UU1ZYY296 e/nzempkZWRqevDw5NnW1NTV2t7vbGRhaHTt5ujr82xeXFVUVFhdZnF1/fpy cf//8PL3+Hz6+O7r6+1zXVtmZ3vx5uTRz8/R2upxalxVTlFUWGJpbHvw7en3 9Ozn5uXl6/NyX1VSUlFTVFhcbP1xdXn+8efc2tfUz9DT1tXT1tfa3uju93lq X1lWT05PUE9PVFNQV1peanT++O3p6OPi5+vj5eXf5uXh3t3g4+Ln6+nufnNr XllYW2Fs8+jk3uPtfmxnZmheVFJWWVhYW1926uLh3dza2Nvh6Oz+cmVmbW5w cW/+9vDr+O3s7f1tamdv/ft2cX18dGlfXVtWXGVs8u7t7fLs5+33//Pr7+vk 8PL0+Pbw6Onm5+bh5fFtYV1ZWFZTUVNZWFphcujg3uXr6urs7vPy+PTu6ePk 4OXo7/h5fn1zamFcV1dcX2Ntdm9teXhwamlx9ubr493f29vV2N3e7XlhWFRA Pd0/adBM4lVrv8XHxlva0t7RYmJxZ2BQUmRtaE1rS2NWTPFj5dpt9PVl4uXQ 1NLc2XLna+RfdFhib/h37GVseHngfdpn8XBaZmpX+/tqa1hdbV1Telt+/3pr 3Ojp2vjb3Ova7Ojf7N/m7OfX09zm9OfgZ/ZfXWtcXe1ZVWBFWU1KQjk5PERH SVXjxr27uru7u8LM4lpQQERHQlxX+szIwb/FwL/Fzdx54OXj3vTl2dzTzM/N 5FxQOCknHiEqIzEwOr20qqSmqKayye88Mzg2Od52v6y2qa6/w0U9PjY1OjpZ x8O6vcG9w+VeQz5YWXPa3Mi+wL7G5OlLPDUmGhsgJDw7OsSzpJ6mrK60ud01 LC05YsS8uaymo6e3zUc8NCsqKzRZzcbDxMO8xeRUPj5JTVT7zsS9wcTGzM5q UEA0KBobHyhPTUy/tKKeqa/Cy8RVOi837Lerrre1srG6VjUtLzs/R03Pta+2 ylJKTUtAODlBaMrDwsTK0GtRPTxCVOx3bksxIR8lL3vn68WwpKCntcbT2GJC OD7Xua6uusTGy/VIMSwzQvzS08y/vL3VSTs/VW91RUFP0L3Azl1QV0xEPkF4 xrq8zWk4IB0hKPrK1La1p6GqtNRW/29XRzxbzLizyela7tXeTzs/SOfGysvO 2ubaXVRcTVVANTQ4SdHEydRSTFdf0dDXx8O7s7e9v849HxoeK8C4xszfsaiv v0Y2QUVMQjlVy6+nr7zjZePXXjkyN1y6ra20xeVpPzMrKS42Pj5Her6vrrnl TU3jyszKxsC7vL69vb7PMxwWGyrJtMjparanrL88Ky86SW3yxK6loqrBTz9L Zl9GQVDEray11zovLjE1NTg8RlRUPD95vqyuvdxP/cXGy9nux761rrO2yVIu GxQZJeirrrG9xrnTQC0mLUbBraytrK6vueRKQkx5ycbO0+vVy8vbSTcxMC8w Ly8zPVvLvretrKy5XDkuOHPEt7Oyra2wut5NPDYwIRodKs6nq8M8LTxkz9lK R++8ray2wMa7srXDY0tQ4+NURT9O2sXG7kE1LiwtMDpP1L24u8tndN7P1Wlc 7r6vrK65x8/1XllQWOHQeDIhHyU70k44Kytcu6+uvsXBw7i8xb28tbS8zlhK TGpfUkxEYM7DwN8/MysqLTFL2snHfV/mzbq90/liybWwsLrN19vc2/HZzse/ 2DceGBokVd1eQzfSr6qqvmZiY8q9yMG+tK61wWNISl3vWVFIUuHUyu1ANS0s MDpNbnLl+/nW0cS/wr/ExL+/vL3Axs7Ozcq/x+tSOSwfHB8oVMbez01vvb62 xV93WuHByLy2tK21vc9RTUxbWFVTV9/NwslXPTIrKywwPEvu0MW+vbu4ub7N 7evPvri5v8rOyL/J7Es4LSEdISt4tL/QPzpe6MLH69DOv7jAxMrGt7e5wutu Yu9+VkxIXtnIynA/My4uMTY8RvLNv73Fw8jExNfe8dzBurW4wsvJwL7NTTMh Gh0lRLW2uNFJ9mlyWjxFXc60tLa2vrm3wM5XTFB73OL8V27Yy8XcTzsyMDA3 PT5FV9e/ub3H2vZ3cWtq1rywra+4wMLIzF82IhkaIz+ysbnNWM7P/UcxNUjc tLG3tru0sbrIWU9YaelgX13YxcbMX0I7NjU2NTo+RmrdysDEwcbT2lxOWP7G uLWztbi2vMZkNSQaGyI1u7K6vuHCv95QMi49Xr2zube4tK+5yVhFUmzoWE5P 3724utlANDE2Ojk5OT9W2cC8vcPK31xNSFPlwri0tLS1tbbD/T0nHBoeLdyz t7rS1ct+UTkyP2a+sbSztLe0vtBlS2Hn0+tbS0zq08bNXEU7Nzk4OTk4QFnU urW0tsZ4Sz9IY8y7trSztbi7zO1AKh0ZHizWsLi+29/H6E04MEPZua61uLi5 s7zPY0pl18zYWUpLeNXV5E9CPz09ODg8P05k6se7s7O+8UI7RWfNvrizsLC1 u85bOSQaGiA0t661uerFx11GLS0/ebmutK+wsa/F+0xHdc7M/l1Q/crN2005 Njg6PDw9QUdPW2/NvbSyus1rUk9b78u5sK6usbvOPiMYFx4zuLS0ucWyuug7 KCk1Ub+5ua+tqKm43kNAVd/vUE9dybm7zEw4NDc6Ozg3PUtlcvbpxLWzuNdQ RlnPzdDYzryvrbO/ZCscGh4r0b69ucewr8dRKycuOt3Av7GuqKewyFVIV9ja Uk9Wzri6x1E2Mzc6Pzs5OTxKTVb9zrevs8FeQkZsz8XEw7qwra630TIdGRwn fL/AusKxrL1ZLCMpMk3KwbSsp6Wtw1xKUdPNXV5i0rm8zU44Njk8Pzs6OjxA PkNQzbaurrrYT0VKWeLKvLSwsLC3yTsfGhslW7++u8avqbXeLyMlLUPcybet pqOrvk9BRWbdXWPvx7S2xmE8Nzk6PTs7Pj8/PT1J3LqzsrrNbElITlzIu7Ww sK+wu+0xHhseKV3Pxrq6rK3ASiokKTFAb862qaOjrchTRktpX07uyrmzv9lX Qj88NTU3O0RCPDs+XMa5srO9zlhAP0zrvrayrq6us8VKJxseIi79T8O0r6i3 ajcpKzE4RF7FrqemrLjL39xdT0ZJ1sm+xN7e8FtRPjU5OTs7NDlEYcm/u7W3 wOdDOz5Rz7y2r6ysrrjbOiQdHyc0VFbJr6urv0QyLjc7NjhLw6ymqrK9v8LM WUA+T8/Ozs3PwsTeTTk5PDo2Ly86R3PJwrexucdcQkNJVGvOuKypqq651zok HiEmMT49zbGsqr5ZRjw9Ni4yRsGura+1s7C4yVhGS130WmHp18XXWk9ITEg4 Mi8zPEFV1r6xsLjH8lZIQkVZzLquqqqtt3IvJiQmKCwsOsWyrbDDx8h1RDIt OlzUyMS9tq+zu8HHzdV8Uln34uhdS05bV05EOzo4ODk+WNC+uby9xNpdSUlZ 7tfIvLGusr9iPDs6Mi4sKzlRWfXxfM3H6HNt7ci+vr6+w8zY82Z0Zlt/2cm8 u7/CytblWkY+OzUvLy81Pk76zcHAw9H5eXDx2dnPwbm0tbrF1N7ieVlOSEpH QT42MC4rKywvOEvZvrGtrKyusLS4v9Lpbmz26vz54t/Y3fV+Xkw/Ojg5PD5D TF35dltOTl/l0cvDu7axsrrDz+NfSz86OTk5Ozw9P0FAPkBESVf9zr63tre2 t7e4vMHIx8nN0dzk5vleVU9NTEY+Ozo6Oz0/RlZxbmJZYfzbzsvHwLq5u77C zOB8T0A8NzQ3OTxBR09j6N/j5ODSy8S/v8DCwMLFx8vP1d3g6fLw+3llXFZU V1ZOSEVERUNCRUxYXl9aYOrWz83MysfJys3c43VYT0hCQUNDR0tPXHDk2Nja 2Nzc0svJysrKysfGyc7Y3eHm7Pby7PZ2X1hUTktGQ0JDRUZITFVjb2Zq9ePR zczKy8nHz93qXlBKQT0+QUROWWfs3tjX19rmfW1+3M7KyMnGw8LGy83Qz9bl 9nd+/2ZaUkxJR0Q/Pz89PkRKVGrn1c7NycfHxcnOzNLm9F5MST88Pj0/Q0pa 6c7IxsbIyc7c9WZo793TzszJyMfHytHY4PZ5bGZmXVdQTEtJSEZERERISk5c /tnQzcrMzM/U19nqc11PTEdBQUJCR05TX+vTzMfFxsbIzM/e7mpdb+ni4NjS zsjJyszO0tzvbmNdVU1IRENDQUJDRUlPWWbi1M7KytDY3t/3aWZYUU5GQkVG SVFe8NjNysrKx8XKz9HY2Nni8Hj8fXjz8+Tb1tLT0dTa4/lzWE9PSklIRURG SUtSXWvv5dvRzszP1tr6XVNLR0Q/P0RFSVZi89LLyMXDxcXGycnLz9HY3uDp emlfXW3z7+be3+Dg+Ht0W1tSTk9NTE1OTlZcZXfp2tbX3Obt6HlaVU1GQz87 PT9CS1vrzsO/vbu8vb/JztHb4OHl7Ovu/O/78Ptob3Z9/fV7+/B7cmJcW1RS T01SVldeZnns6ejl9fv2XU9ORkJCPj1AREhTZe7PxsK+vLy7vcXFyM3P3PDr 4ev+dHj6eHZ1ZWVzc3f78XloY1xZVVBKSk5PV11x49ra3vhtelJJRz8/Pzw8 QEdOXnTdycC+vLy9vL/Fx8rLzdDX2Njf5XRcX1tbWlRZX2tye/3593lnXFlY U1FUV19z6uLo6WpbX1VHRD48Pjs3PEBHW2jjyb65uLi6urq/wMjLyM7U2eLy 6edgX11VWlJNT1RbYWRiZ253b2Jhbvrv+ezg5eHlXk9WUkVAOjQ3NzQ2Oj1S 7d7KvrizsbO1tLm6vMnLztnd4vNpbGVpXlRNQk7f6FJIZc/kWmnr7fP62N/u zcLNb0QxLzMtKychKT1IUunLr6anqa+3sq+9/0w9TN7p5nXhwLm7xc3Uy813 TDs4Oz9FPjtDWNPAxcO6ubi5ws7sWkw5Jh4gJCYvLSpBxrOpq7Crq66wy1NH RlDzaVHTwbWtsbW/xL/HzG1AOTg5OzgvNj9Uz87Mv7iysLW+z+xqTkExIBwg JCs9MTLdx7WmrLOuu8m/bktNP0nmzL20tbSwsbK7w95P+19STzozNjc7TEhO beLCtrO0t7vI0/hLPzUkHB4dJD40O89XuKWtpafKvclCyvRA+FJ4u7ixr7Wz t8bB0ODlUE8/P0Y6PDw2RE1R297KubWvsr3Ic1BILyAcGhsqNDrOXsuvsqej rq/EPVdGS8ZZ9NH0vbOzrq+7wMvXz9DUdlVBOzk5P0Q9S01Hz8W4rrK3vtlf SjMiHBkZIi0+v8e5tL2sp6upuT09MTbXzbm1wca/vbWsr7O93mbv3trVTD03 LjM7PX7ibNP8yrSxrrbLaTYkHRsZISksZ27AqLGrqLKvtFdOOy5FSdW2t7S1 vMa7u7iwtrvAz+vmVUxNPDc3NDdJSOzEz7i6vbfJ1k8pHRgUHCgxubmxq7ux rK6prfJPLCk2Oca1r6uzu8bMzru3sq++xOxLTkxHRT07RD5PZmrIxry2vsDT TTMhGxgZICdIxbeorK6vuLuyzNhNLzgvQs+4qqyuw99v6bevqqqvvNRNREM5 PDU2QEfr0Mi9vry+zd4/KR4ZFx0kM8PCra67r7WyrbvqVS0xNjbBvrCqtrri UF7hvq+rqamyu+pOQjU1MDQ8Rt3AtrC1u8nwQysdGRYZIy3Wuq+su7a4t66v x+IzKC4qY7esn6m3XzI6SMWuqqiqsLS7x8VfPC8mKTJGvK2rrLS/7zUfGRQV HyhVtLqpt8Gzua+qveM/JCopNbewoqa5yj07Te68sbWysLWsrK+23zkrJic2 YL2srK+22zcfGRUXIChOvb+twsW2uKyrwm82JS0uTrGyp6/I1k38ysLCyOrz xbeooaStyTstKy1K2b+yurvMMCMcFRwmKON17bpHzre4pqvOby4oNzy8rrWz YUVU2a+rrbxNOj/us6ajp7bjRj9R587N2tnSzkAmHxkYKSpCvUvJTjXQwq+o u1s6LDhmu622xEYwOWawp6Wu1EU84burpKy41UJe3MS80d1509swIBwXHTs/ uLVU9S0sT9mtrdNOLzJtyqmsvMIzLzY+u7aytsrFwLOusrG+0MHIvLO+ymtY 6dtGHxkXFCloyqG2vs0sRWLdsF0xLydZtq2fss1dKzlN1bvNdkFZxq+kqKu1 3u7cxLSxucrg2c9PJBoYEx86N6ywu6tL07rus+4tMiY0yMKmrszBOkDn+r3V Z0tE1r2wrrOzvsG6v7e2xtJo48pFJh8cGSQrLc7du6y/r7C9tGw2Nis3bNWv tcbHPz9RWs7Ny9/+08O9vre3vL29u7q3yH3q8Vw0IyIiIy4uMD9Dyr69qqyw rvFEPjE7PErMzry5zc3uV0xJZ9u/vb7SWvLPvLSurbG32UhWcUsvJykoLToy NDQ0PkD1s62pqbrAyuTdSUc+NUtOaMzb3E1IUua3rrC/b0ZK176xrbG9Xz9M bnA9Mjs9TGdPPzk2LSosNUL+yM++sK2tsbnPaO/l7e5pPC8vLkbHtq+1u8bJ urWvrbK/dEhNXFA8LjA5O0xcSEM6LSgnLjdD23ncuLSvra+wuLi1vMPKSDQy LTlY3cbR0szJt7CvrrjQXkZU3N1NNzQzLzU+PEM/MywqMjtQxtHDtbSwtLW5 vry4ur2/YD43LztDWNZ27dPNu7KtrLK/41NO/OpZPDc6MjU4NTY0Ly0qMTtD 1dTMt7Our7KzvL69v8TD3k9CO0ZIWtxq7tjQv7qzsLW92mNaaW9VPjI2NDY5 OTUwMC0sLz5Ia8nMvbOurrCvtrq6vsbU3lJBQkNEWmVefuzMxL64t7i9yNTz 5e50VDgyNzc9Pjw0MS8sLTA9QV7K1ryxr66vsrm4ub7M22w/QD48S1lv39vL wb23t7a5wczW3trd9V89MDc7PDw4Mi4uLS0uNTxD7d3Esq2trq+0srS8xuZa Rj07PkJUbWjRzMK3t7a2vcLK0c7W6eZ3TTo0PDc1NS8vMTMyMjI7PE3c3buw r7CvsLWxtbvH7VU+Ozs8RE5g5dLIvri3tLS5u8HO6WhkWWp0QTM5My85Njc+ OzIwLC40Ovfava+vr7C0ubO5vMLzX0I/R0RNeujc5dnKwLu1tLi5yNTP5fDs 919JNS4yNTtEPz8/OTMuKS83P9PHubCusLO2vsPO0WpNTD9HWfjTzcm/u7q2 ub29ztba6c7Q0Mvb2NP8PComHx8oJzdVZsW+2Lu0va2+2ds5MDMyP8W+r6y9 w3k+OkBN1ru6uLzCwsPJv8fbzFlL5WPKs7extc5FJx0YGB4mPea5rbCvrbOv r/hkLyMoJDTVvKmnsbjcPlNFR9jbw7S6tbK7t8ZWV0RAbF/5wcKzrrOwvmo0 IRoXGR0rTcurqaqpsrm6e087JyslKUVbs6qrqbPK3UREWk/Hubaxtb7JeExQ Sl3V08W+xLq2trS8xXY3Jx0ZGR4jN2m9rK+ttMDG8kA7MCszL0XUv6ysq621 v87o38/HvLi8xdRdTkBGT2bJzMfF1s3NysDGxM92XTcqJB0fISU5Qdq6xr3G 0MTM09FhT0c4Oj9Pzreuqqaop6y3v/JWSEFEREdQXd7Nx7/J2GhMTk5f3tPK yM/ZYkkzKiUfISEnLTRcyrKrp6eqtctSODgxOkJUxrqsp6Wkp6y2z0w7Mzc7 RWrYy9PiX0lDP0RMYdzLwb/I0vhTS0U/Ni4sKSgoKCs0T8uzramprLG7x+fw WFlZXt7Vvrq2s7W3u7/Jz9bgXU1DOTUvLjM4RmrdyMPDvsTL0PZcUkpSZmhe PzYvKywsLjZFa8u8t6+sq62vt7/QYE9DSVB00ce9vLu+wcbKz+5OPjUwMTI3 PUdZbeLWzsrGxcXBxMjN3O5sdvJfSTw0Ly0qKiovPl7Eta6qqamsr7W9zuZZ Rz45OTpEXtfCvbzCydXxcFpPST89PD1IVuvPz8zO2dPVzsnLy9Ld+V5YVEs9 Ozg3Ojk7PUpc79nWxsO7urq5urm+xdtdRTs4NztFXtTDvLq6u77GzeplT0Y+ Ozs8PkNNZN7MxsTGzuF7ZWvp2M3Gwsr/Sj04Nzc1NTg8QEtb2sG4sa+wtbzN fUg/Pz5FTl3q183LycfDwMLGztXd+3lnX1ZLRj8+QUZPWVtcXGFn68/Kwb29 vsDMXT0yLzA0ODo9RE1szLqtqKitvGc9MS4yNz5KWXjPv7StrK661F5LTVxg VUtERkxm29/9TD8+P1bjzMvZ5vHgzsbExMfLx9JLMCgkJy4zOz1PvayhnqOs v1Y+OjYwKysxULyrpqmuu8veTjswLjVK1Lq3vL/Gyt9GMispLzxMd/rRvbaw tL7Rbl504Mu+trG6Xi4mIygtKCYpObqknp+lq6+/Sy0gHyczVca5q6Gen6vK Py8uMC8vMz/Ssq6wucrjRy8lICMsRsmzq6ekp67BVT06PENay7Srr8s4LCkq Kh8dIza8qqimo6Kmt0MsJigrKy1DuqOcnqSqr7XiMyclKzlARn2/srHGSTIq KSgoL0u/rqusq6yuuftBOj1Kb8e0q6u1bDc1LyceGRwuUsO6tqedn6vHPzo1 KicsPMWxrqikoqWuwf1ANC0qLDVBU/7ZydlHNi8xPUNf3cq5uLW4u8DaXFpV 2MG9sa6vuno6Ny8kHx0fLz9H78Gto6izucTZUTk1PkFH4r+uqayvs7i/5j88 RUE8Oj5MTkI5MzU6PUNX0b66vLm9v8LoWU9JVd7GtK2srbS/Tjg4KB8iISUt MEnCvbOqrLK1vsnTSUJZTFXOy8fEx726wse/xs3V92hRRDkyLSoqKiwyRc25 sa6tr7K7z/1GQUxI+8W7sK2srr1bQUsvICUiHyUjLlFevaqpraikqa26zc1E Mj46MjtJZuTNu62ttLKzwc9XNy4nIiMkJS0+Zca3raiqq625w9Z1dkZE6sy/ uLW5y1FTZDEnLSkhJCctODhltbKzqKKprKuvut5HVkMxNkA7PG7Jvba2rqy5 wtJGODApJSQkKTM5R8q5sKurqqqusrfB2XJoXFJd/vhlRkFeSTAyOSsnKyov OD3av76wp6WpqaiuusvndUE3PDw5Okf+3cq8u7y9v8f8QjYxLSoqKSw4QPrB va+pqKanq6+4x+NvTT8/PDIwOz4yMDg4MC8zOEVU+MG2trCrrK+xtL7M4Wtj Uk5OTVVbd9bY2c3V+nNaSktFOjo4MjM2OUVd1se+uLGurq+vs7m9w8jmTU47 LzUyLCsoKzQuLTtNxry8r62qqK+ztLvIbVJcV01CQmfncnLuz83XfFJebUxF Pzo9PDc2Okdk59XKvri1tbS0sre8v8jLz+pQPDU1MS4rKCcpLTM2Q9y8r6ys qqioq7O9zd3sVEZDRkxea11acd3W51lOVFdPRj88OTs8PUZUes/Dvbm5ubi2 usDAxMrJzNTsSDw5NDAsJyUkKC4zPl3Lta2ppaWmqKuwusfcWEpFQD8+QEhK T1lw6X5lX15gT0RAPTo7PURNYtrIv7u1sbS3ub3Dy8/V4nhZRT06NTQxLSsq Ki0xPE7hw7mxq6mmpaeqr7i+x9piTD86OTc3OTw/QkVMTVbt3NvyWFBLSElP Xfve08fBvbq6u7/Dyc3Ky8/dVUM9ODY1MzAvLCwuMz1Z1cG4s66sq6mpqq6z usbR9lJHPzo3NDM2Oz0+RE1baP3pfWFhWVRYWGPm0srEv729vb2+wsPFycvR 3mxMQjs1Mi8tLSwsLTA3QFjMu7KtrKqqqamrrbG5wtVfSkA7ODUyMC8xNDpB TmN77ntsaWn78efU0dDIxMG9u7q8vcLFxs7U2fViTkE8NTAvLi4uLi8yNTxH a8i7sq6rqqmoqaqsrrW/2FU/ODMvLi4vMDM2O0ZYeuva2vxqb2/v2s/IysnE v727urq8v8TIz9vmdFNDOjMvLS0tLi0sLjE2QnHGtq6rqaipqamqrK+2w+ZN Pzk0MTAwLzEzOD9JVv/q9fpoX2Nv5dbRz8vKw727uLi7v8HCxMXL3GtPPjUv LCsrKyosLC44Q3jCuLGtqqmop6iqrrfF319ORD04NTIyOD5MZm5eVU9MU2BY T0Y9PUNR1r+7uLm6t7Szs7a/z+D4eXtiSDctKigrMC4uLi42S9S4r66urq2r q62ywdxYUGFdbFtCRVBY3dHd22RNUEU/OzMxMTI3OkFf07qvrautsLG2usHc a09LVFpaUTsuLi4uNzArLjI/18W9trOvrq6yub7J3elxZ3rr08nIy8vMy8nU cUw7MTAvLzEvLjI7TNzDu7Ktq6yutLq+yN1xWF3w4tjaYDgsLzAqKSUhLkVN 1MS6pqClqrW9vchbOC80P3fX176zrauwvL3A2ksxJiMmKSsrKjBOzr63sqyn qK21vcPJ60hDTF3Zz8y/v2gxLTMsKiQcJTU/6tq6pZ6hrLGzs74+LzM5TlpW zrasra6utLbISDcvLCgjICQtMzlH+Lqurq+tqqqvvtTa311MSlHnzca9u8RO LCw0KSMeHS5ARk7PrKCfqq6urrpMNTtLRj9I2bavsrSsrLfNTEZENCghIiYs LS46bMW8uLOsqKuwtrnC3WZUWVdMUta9ubvMRzE5NSclHyIvMjQ+3raqqq6t ra21xdfLzmdbX8nAyNTOu7/M62VzVDksLjAxLywuOktKVte9sK+ysK2vt8LU zd9NR05s6PFfdFY8QEdFRjoyNT07NDM4SWxjT+W7sayqqaenqK2wustqQTw0 Ly4uMjo/QUtr1tPfcFRQQjo6PENWaHXWv7izsbS0trzAxs3iZ01GR0pJREZM U1xWSD49OTItLjE3Q1PQua6qqKeoqKuyu8rfUz85Njc2NTc+SllcWV5gXk1D QkRIRkRLas/Hw764s7S1tre8w9Z+Y1BIQT4/Q0dGR05PTUhBPz9AQUVMZN/Q xr65tra4ury/y9vpemFOSUlNV1pWTlNaVkxEQENJR0RITmrh2NXLwb6+wb+/ wsbP1NjybV1UUVNOS0pKR0NFRUZKTlVg7+Lb1NXV0tPb3uPq4uDY09DNzs7M ztXc53JeWE5JRENERktKTVdcafd6+Ovq3dvb2tbQ0MrIzMvLztbg/F1SSkJE RUBBQ0lPXG/u4d3Y3fb36/Hm1M7Jys/U1NTU2uDwbWJUTk9PVllXYvVxcvxv 5NjpY1pdbW5dZPj07t7Wy8jMy8nJdD89Ozw8MDA8TGV3+sS2tbu/v72+1F1Y UlNPTl/o4WlvevXX7fjd5+blZmn/anVyZGZfdt7c29bc1svR19rb0t3x7kcn Ii4sLi0nR7e1r7GuoqOyzk5KSTUqLknPvLqvqKitwP5XOykjJS08RV2/sa2u u8TG6k1FP0v/avDHvLm8v77E3k85HxQfKyc0LUqjoqipr6ilyTAnLTtBOk+t pKSoray05zMnKCstMEHItbi7v8reTT03OT0+V8m7sLC7wMbjV0c9SG/az8zA 4x4WKzI9PyXin6WswM6oqWIpJ0jB0UTUp6Ssx17PeTgqKTde0cS2q63EQyww Pzs+PEzP3O/IvrGvzVZVU1E/PGa4s7q9xTwZFzU+8VUtsp2mtDw/sbdKKCnD rb1QUbeuvF9O18DSPjxNcs7ra8K/zcpnTkxJPzExNT/tzce5u9Xp++3O32/T wLq6vry/NBMSOdi89SyxnKnJKiq0rFgoKr+rt0s6vamtzXvLt7ZAKS9B3tdu vq6wvUItLi8uLjnqwLzI1b/JW03mvLW+z8W8zlt6va2zPxUNLbq8zCE3naO3 Nx/MoLU2HiyroLk/TLijqmlEU8DHODA+yKyzzFk5OzQpKjBJxMXR9lTv1tzU yrmsrbvYSUz7bta3q6q6KA0PLeyxVSS5mp+tLB3fq9soHzyimq1URr+iqtdG RcfCRDY6bLa02DcrMzs3NTlzy3oyLDl9sK2zqqGlsz8oLk7OzsSpoKjbFwkY PsWtLSmim6G8HiHEscctI1yjnrNAMNSgoLVENf+8zjsvP72w2SwlKzhZZU7n z+o/KytTrqSkp6mxWS0mLsirqaqqru8XChYtvqQ+OKihn7cjJE7AuUAmMrml qswxS6WcpeItMd7AdT8/y6y4OSYhKmS4xOFnPTQyLjq/railq7TVNy01bLKq rK67LA8RJ32guilurKKjPB4yu6y9LR4us6WoxjrIoZ6tPSQrzbPC51O8qcAy Hxso36+uwG9RPzAnKEqxo6CnsdQ6LjPqsquuwS8UFCxeqKkxOcOtn7grLV2w rWwnHzC9pqrZTL6morM8JCrfsbDGasK7ei8eHTWzp67OPTpJNCksPrOeoKi3 TD08OWK5rrUvFBUqzqSuOEW7qqS/MTFQw7nZOC0yT7yttMPJv7m72zsvNv2v q7LDX0o+KyMpRrOqtug/O0Q6NDp1raGntGUwMkJ4ubC4QRoVIEiqqUk22Kie rEIpMt26vE8sL3a2rrPN0r3CzPBEQENNyK+rr9Y8NC8sLTNIyLa3yF0+Nj1F SMWsqKq5SzQ5Tr+utFQfFBsxvqvHPliwn5+3OSgsQNDJV0Jpuqupuf5WS1Z4 TUpdacy3rq6+QysmKjhW72ll1cC92D01OUfPtayqsMdINTdVu66w5iUXGSRA u7rJwK6koqvLNCYkKzvxvrCsrK+81W1FPkJDYs3KvLSyssU8KSQpPM7LXkJC esbG2mRb3MW+vcTI2lM8O+uzqai0QR4WFx42vK6usa+spKa3RCIaHS3MqaOn s87LubS75zgrLTvOsK2vwkUwLDJI+lY9Nzg/Tm/SvK6qrLfYPzc7PD1GaMCu qKu3xk4oHhwfMtC3ur++ubO77j41OEbr0dvTwbevr7W/4X5YVOjm6WBBOTpI 783VUUJCSUxBNi85fritq7LOTj86PEJTzLy7vMLKzNlVPzlAXdrKyszJx+FB MCsqMkFOd9TCta2tsbnKdk1P5sO7x1xAPkz85FdDQkpjbkc2Lzlayr/G1+De 4OxmVlnky8jEw8C8u8XpTD4/REZSe9jDvsntRjcwLjI+X8m9u7u5u8TRa1r3 zMz2TT0/XczEz2ZKTFteTUE8RFltalj3zcG/4E1GTvXY3m5a78e5tLfFakY9 Q1r+39bg//1wV0k9OUBf0MrY//razMvR2+T4XU9HQ0htzMbO3eXj435dV138 621SSU14z8vXZE9UYFxWU1Vh4czFwsfWZVZXYvju8fvw7vxeTUdHVeTP0uld U1j71MvJz+9TTU1TddXO1O1fWVpuenvk19LX/VJLTmfc2eprZHD4dWNcWVx0 6Orp6u/t7/f1e2hjZXbs7nBeW2nu4uhsVllv5tPOz9TiXUtFR1LqzszQ2epu bPf0Z1tk7N/vWktPZ9zMz/ZZUlJg6uD/ZmViYP3c0MnM2nROR01b/dzjbmVv 7NLQ6VhJS1d0083Q1ulmUk5Xd93X3XZfWVVs2tDS4WxeW11bWl5seunj/Wtt 9d/Z52xfYW9x8+Db1NLbdlVNTFNeb/br73b/9nVsZGR08+/z7+vn7nRmaf3g 19jf/GRcVl3v3t7qbV5dWlRYW2fz497+XV752c7O4V1RVV7q1tTT2OxmWltk a3NpW1xp+uvl+mhr+Ofp7n5pX11faG386d/e4+X0/fry6ejo7fZ0X11cXF1q 8un1bllPV2L64uDpe2toc/Dr6ePf3u1yam3z6+1oWl1q+X327O7t/2ddX2Re X2Rr8t7Z2d72YVxhdt7W19nb4P1lX1pYX218emthXV5r+Pr5dWZiaPLp7HVp 9d7b2+n7ffXxbF9ZXW7x393e7Pl2ZXL+aVpWVFdq69/c4PZvbfDf3Nzzal9f YWRsbHLr5eXsd2dZV15oevLqfHX3+f9nYGN65+vu6+Xe3ed0YWJ35t7e5ftn XV5kdf98cWpiXmNndHp2eGtmbe3f293m/m1ka3d369/c4u5rXVtebG5oZmt2 6dze7GtfY2d19P/w5uTg8GpeYWhnZmZkbXro2tTNztbffV1PSUdITVl86dzY 0szMz+NlUUpCP0BGUPTOxL++vb3AzHVHPTs+SFNu4dXMysvN1+R5XlFPTU5U Xvfc2+12bF9fbXj5dnPv+erk7v97aFxYU1NXbO/e2NbQ0dnqa19fa/fvdXJ1 b2xpdvXv7N/e4+/6/WlcWlxfY2ReWFdhb/zh1tHS2elxXVlcW2BeWVxq59nW 1dzf5vL7/nx9dGlsZmJxe3h8dXjs5Oj2ZF9cXmZtbGt2d2ZhaX7g09DY3d3f 621YT01TZu/d2t7nbWFdW11bZHX17+zi6+vf5PR7bG5769zc6GxbWF1eXWj/ 6OfqbVxZWV9r+OfZ0s7Q3v9fUFJXXWv55t/c3+hza3l2d3NvcnJxbGJibGtq ++7o4N/vd21qY11dYG3y3uHpel9iaX75+fjs2drkcmJjbHR4dfPg3+xrXFlU XHLu3t3e4+b9bGdkdG5qZmpvffH87fh+fF5aXnXh3Od2ZVpeaGxvfOba2drZ 6P1uYldZZHnh5vFxaGtueHD+cWj//f91c3T77/r/+Ozm6O39amprb3F9fnry 6etuaWJcWlRaYv7i2tjj7fX+bmVnbHRt++/x833+bXr18eHj5u7v7u7v/ff7 7Ot8a2JcXGd2/PD2bl5PRT04Njc6QE/tyLu1sq+wsba8xdft/fzv39nUyr+7 urzKTDEiGRUVGB8qQM2zqJ+bmJeanqrENyEcGx4mMUzMuK6ppqSlqrHNSTUw MzlDU/LNvbOurq+42DsmGBARFBsqP8SspJ6Zl5eboa9WJRgVGB8v0a2kn6Kn qa+6zUYyKictPtCvp6aprrrH1XxcWk9GOCkgGhYZHSQ8Z8Cvr6min52fqbw8 Jh4eKDvGq6amp62ytcbrSTEvNEHGrqelq7jZQTQvLzM6SeXWVTcqHxwfIy5L YMK2sKaenJ2jsFEmHBsgMGazrK6wuMK8v9htPDI6Tbuln5+ls9c+Ly4tMztL x7Svs9c5JBUSFhoqSOWwq6WamJmdq/8hFBQbK82nnZ2jp6y3vUoqIBwgNcaf l5qgsE04MzQ7MysqL+ymm52jtjkYCgoSGzeyqKGdm5WUmqHDIw4MExw/opeW mqSpqrPDNBkRExs0qZSRmqlnKyYvQEIyJSU6qpSRl52uPRQIChAcL8Wkpp2T k5Sap9waCwwTHUCklJSYnKOkr+EqEwwPGSuqk5CYpW4uKy9LQjEoJUCqlpGZ nqvkKBELDRIdLV+lnJWPlpqjyykSDRIaK8KelJaYnaiuXCkbEhQcKrybk5ae rz0nIyYwOkJIXLekm5qfp7lfMh0RDQ4THzK5nJiWmKCpxjMkHBkdJDy/ppub m6CsuUc1LCkvN266rqqzyEktLzVLubOwtcrc4Ma+vMPeZ0U0JBoVEhknNq+j pp6ssa3Fuu0uKB4iMeqlnZqbp6y+xMXmVC4nIyhDz6+tt7zGvrGzvE8qHxwl UqmdnqWuzjAbEQ0RGiFNtqmZmZiXnqXCLR4WGSAvxqyfm5yanaKr6i4cFhge MeGupampra+wxE4pHBocL7idmJyhq7xIIxQMDBMcL66elpOam5+qtD0hFhIZ ID6unZWWmpymrL8/KBoWGB81vqKfoau+y2BIPiwmIydIrZyZnaSv3C8aDw0Q GilepZ+cmJ2cn6u7MB4WFh0mT7GimZmYmZ6kuEMjFhMWHjDNq6akp6qrtMc8 JR4dJ3emm5ygqrTUOyQXDw4TGynYr56YmZeanqbLLxsUFx4v1KiamJeZnqGv 0zIbExEWHze5op6fpa/FZjktKSctULSgnJ+krsBIJRcODRMaJl28pZqXk5SZ n7kuGBIWHS1as6GdmZaYm6W8NhsSERcgN8Gsp6isrra80kg3LS5Gwqqkp625 zFMwIRkREBccLF2+opyZlpqdp8c4JB8fJjNBwq6nnZubnqq9PiceHB8mNEda 23TYv7musLjDX1bbvq+utL7aUj4tIx0WFhkbKTRiraedmJman6u/RCwlJCYs Pm+4pp+cnKGpuVMxJyAgIiUrLzr7v66np6mvu8G/vr3D22xJPjYpIxwYGxse LjButK2empqanqq3dzUvKyksMTnlsqeenaCos+pENywsKCMkIyo83rOop6iq r6+vtrvXTj40LyslHxsbHh4qNj3DtayenJyboKqw7jwzKCYoKzrcs6afnqKm rL3UQi4oHx0eHyk6+7SopKGiqKqvu8Z0QzkvJyEeHB0iJScxLz+7r6CZnJ2e q7C5XD4vIyEnL0y7rKeioaSjqrzcNCQgHh0iJitA0LKjoKKlq66xucpiPjAq JiEgHx4iIiIuNVuwqaCbnZ6fp668WTkuKSksN0rWtq2noqSorsVVOywnJSIi JSw64rWsqKWnp6ittMddPzYvKCEfHRwgJCQsOVWvop+cnaGjp6u13UQwKywu LzlM0rOopKWrtMbfYT4xKyIfISUuUcO1qqempaaqr7zoQTQvMC0mIB8eICks MEnSua6sqqeln6Cnq7nkXUMzLi0yP/q+vMG9uLaytc1NNywnJSguOlTUxr2x qaSlqrbPWktJRz43LiQgJSgpLC4vOUf+yr2uop6eoKWmq7W+aDs1Oj00Ly89 +8K5ub7L3lQ+ODk/S0hAPkrRu7i8zNPR71JGQUdORT0/V9HIx9Lo2+tbW2/d 0tl2W2dnV0g/QUhSZe3Z29bQxriwsLjC2lxSVVhnYVBLUunIvr7D2VlGPDw8 OjUvLjI7UdrFv8DBxMfJzdHR0s/HxcjJy83Lzth3TEM7Njc7RVJUTUhHS1x8 6+Xs893LvrWvrq+0vMfV7WFLPDc0NjxCSUpFPzw7Ozw+Q0/uzr23tLCvsbO4 vcLXWExKS2TYz9L7WEo/PDk4NDIzNTxGWt3PzMrIyMjHztLS0snDvr29vb/E zNpzU0pGRklJSkxLTUxKSktIR0tLTFhw4MzGv76/wMLEyMfO2N7j6vdqVUlC Pjs2NDU2Oj5CR1jt08rDvbq3t7m8vb3Ax9HY3uDf+GdhX1hQTkxMTkpGREA+ Pz8+QEM8QN7fasG4ubW6ubG5vbq+wMl7TEI+OzUxNTY1Nzc+X2P1x8jHxtfb zNL0/e/TzNrQv7q6u72/yNPudGZPQzo2Nzw6OUNLS01KUuj97MvIys/TysbE wMO9ury4t7y93kM/Ni0sJSYxLzdQb766vrvAw89cXE9IT07jvrq3tbO0uL/H yeJfW1ZSTEtLS0c+ODY0LzE3PE78fsq9w76/zMbG0s7Ixb+6uLa0t72/xtFr Tz8uJycrKCMuP0Hy+c+3vr+/wMRt8tr/09PNvr66u7/Ay9TsdHxRTE1LRT5F SD9BPT1FR1V338/Y3vhLTtXeZ8vExr7Fwra4vbq+y9fuWFdfSk1fT05bTDkr KDY8JS/WUce8vqmyvLvDwz9C0UtZdOm+ysfFxcZMSks9QzlE7WPoetbE/Pve fVhETFti29TBucfSz91QNjV2YDzmv76+19G/40FO+kZDbuvNxd7Iu9F3zs9J OS8uVkUq1bxbvdK/vEvU621GL3ZON19uvspXwMTLVU7AX1zZ77vG0cDOzk1G eERES1XO39fAv8fn5uNOQz5GTDcxT+85SM/f1+3kvsT3xrnN2r/Dy8jMwMbs 1cfaTEA1L1MuI88/Ld1J1s5Xws3KSj+/RDnL3M/Qy7K6v8a+ukpiw1hZeOvN fO/bXmBJR049SE5Na2fNyWbp3fFMRWtKRFA8XcFL5bTI173C1c/xZO1YWM/L 6Ma9yNHb2nlJRU08LD5tKDfIL0PSZNJeyL/J1me81z/axW5P3MfU5s/Bym3b v91a0cpnVHhfSUttZ01f3vxc383rfNvc/1xbZWBGP0xFO0RJV95W177X1b/B 0drIv9R+xsTr48jZfs/oc9dpS0Q0OEIpLkwvOWFv9tK7wsbAxMnX6uLRVGTH 4dfEzcfA0dDQ5mlPZ05JV094Wl/wWFtOWWdYZ23V3Gzf6fpsbWdWUUlPYm3f y8nR1sTTW87hSG76S1zuXnXxe+/o7Nzb8NvvZ/XZZmjNYkhfYD09ZD87WmRX dc/LzdfSzeNhVW5URVRm+fbVxsfHxcbM0tfO3fjY9Wf+325WfVtPUVNMQlFQ RlhZT274Z+fb9Hvl6nXk5eLT2t3X0+lu3PpZYFxaU09ZVlBXZ3z049TR2tfV 3t7e9+fe5dvPz9XR1ef9WU5URTw/Pj4/SFROaPzw497e8tbV3drY0Nra1s/L 09bNy9PPzNLT19rj9W9PTUs/Pj8+P0dJUFxXaHzo2uXOztzR1+Pf4v7r33F+ 5Prs3N/s5e1lXVlNTFRMTF5eXXvZ1tnOzM3MztXc4eD3cXDu3/rk1OX45/pa T09JQEBFQj5FS0lJUmxmcNzSz8zIx8jJy83Lz9nb2dna0tHT19ra5XJdVk1J RkRFRkhOVlpbYnN7/u3f5ufe5unf5+rf2+Xp3+L2aG5zampjaWZaWFBQWFJV bux85tLUz8zMzczO1dTV3Oju//92ZGVlZl5WXFxRUVFLR0dHRURFR0xVW2Xs 2tbOycbIycnJzNfb09zm2tfa3t7d3uPt6vdvZFlZU0tKS0pISVBYWF/t4+fa 2d3d4vJ6cmBeY2RobGx+6+3y6e5manpwavvi+fzk4t7h5d3e39zUz9XSz9Lc 3+N+cV9RTUtGRUZGRUhNS1JZVVhdW1dgZ2nv5tvU09HOzMvLycrJytHPztbZ 2t/3935fY2FYUlJRTUxMTEpMUlJTW2lveOHd3NTb3tnZ2dbb39jb497fe259 a2JcVVJWUE9UTkxMTk1OUVVf/ObZ0MzHx8jIy8/T1+Lh6O/vfnFybmdvamhw aF9dWlVQU1RPU1RYX2z3+Ozn5enn6ffw9/Xu7u/t6u3h2tfd3dvf6O/wfnp6 bG1ybnN2cm9kZmxrZWn/b3BsX1xdXFhZV1JWW1lbZGhyfnvv8nb8d2xo9Ovq 393V1NHNy87Rz9bc3ePs7vludG9lYl5fXVxfX2JfXl1eYV9fYV9cXmtiY//w 6+Xi3N3k6/B8a2pkX2JhZGp2eXj5eG5taWhlaGx88vLs7Ont+PHv9/bw6+r0 7eTo7ern5vBxc2hlZmpqZ37u7Ofp6PVzeWtmY2Fsa21ocO7u7u7m6PLv9n55 bm5qZF1cXmJpZGh0dvjr9HN6dW1wdHJ39n55+vh+/+7r8ezz/nVtcmlqbWht aXN6dvtudvHs7fDs9vLv7+rz9uzs8fx+cnz5/Orx++vu+Htzbm5uZmZoaWxv fPv//H13b210cnJsamRdYWRmaWx5//n2+vz9/fX8dnp5eHz6+Xpzd/339O/r bWrb3vT85t3p++bl9H399HZud/1qXGJ5bGBib2VaW2NpZGb36/fx6Obq8ufs 6ur56/F6eXR0bXf6+35za2RlbWZeYWRmZm51bnf+++7o4d/f5u76eGpmaWZr efPu+vXq6fT+fnV3dWRia2548+Tn6u75d3Z2bGxpZmp7/Xl9+O7y9u/xfX37 em1pbG9tanlza3Zvcm9zcmpuePz07/X28+zm6/b/fv37enJ0dvx3df9ubW1k Z21xb3NybXhwfP7z7PDp7fLq8nVzfn5xb3Bvc318cm56+u3m6+3+bWlpbGpx 8u3w7/Hxenl2Zm1ubm5vcXF2ff5+env5+339dGp4+nVyeHl5bm9vaWdsanL+ d33w4evq3env9Gd1bHL+7ODt6XxvZ2Joa/7+9fnz/nJzZ25qc3l3+3nyePf/ aWhndXH47fJ5b21nZWlyb3R6/Pj57u//7+nq5+vv935ubHN1fnP57vR9cXJm ZWRjaG5tevnz7v13c3V8ffH0/Xhzd25ocHd2++zp+PB0edRrXPj29flzafbu 82xsePf5Z2xz9m9hanL4dWxwdXp+a2/v7+jw6+Tp9W/+c3lva3b/6+98bmhq aF9eY2x3evf07+r0//94ePZze+3ydHl7dfx6ev/5+3VsZ3J6fH17+/Py/X54 bnJ+9Xx67Px8eXZvZmppev56enb9fPn8+Pz99P/49fb//3Zw//x9fnj//21t cf10bfb/bv7+cXf7cnB9fPf69/t573x0fXf/dnF+/nRscHN18/b07Pp5eXRv bntxdvn6+vz9bmhoamlvamZqc3d6fH38/vj1/fzx7e3s7uv2fe/2e3hqZGVu cnL7+P309Hh5/n1vb3lze/v3+vH08/98fW1sb21qbHBqbHh7d/Lp7+ryfXj9 +/x3c3b1/Ht+cXt1eP5tZ3H8/Xt2+fb6/v98evl9b3R5//H9cmxv/XZua2xq Z2tpZ2tybXL59e3o5+zm5+/u+3pxcHJ5cm339enk7P12cGtta2VkZWZodfjy 8Onv9fd6b2xxbGptb2x09PL9evZ8dnV3fX7w9nf9+X56dW5z9fD18PF9e3f5 9P74+nt3eXtxb3v/fH1ya3vu+Hl5eXJybmhpa29oX2hvbvzz8Ojp6O3x8/11 cndnZW13+vv5ff/0eHl6cG5rbWpu8vHv8/d3en11b3L69uzx9O3u6fptaWll Zmhncnry7u3r83hxeH18dHV17+r1+XRzc2tpbm57/HlvfPh4b255ff/7dHz7 /P726vL57/l2eG9qZGlqbXV1cXfs7fbs+25y/3xydXL/eHn2/nZsa3d8fHz7 9H3+eX5tb3hpev7+fPjv9Ozy+/37+H59fnttZ3F7dHd0bm96/HV1eHFvfPr9 +u/s+fx4bXT69Pv19nZwbG5ya2toa357ffn8+vDy93z8/np5d/x3c3l7dnpt b37//3T17vr+ev317vR9dm9vc3f5+/3w+P52/ndqbWtrbmprbXT/d316fH79 7/1ydv1+c3b+//bzeXV0b3J4dnX++3Z5/XNrcnl6/u7s+Pft7vPv6+/t9W9v enZtZmRmcHh1c3Rvb3d1aG39e/7+9O32+fj/bGdsbXJyfPTs9P38fvz78/Z8 d3x6fP728vTv9ftvbWhsb2lsbHp5evn3e3N1cnJsb3X79O7p7vb57fhvaWVq YWNtevl99O//9vL6/Wpvc3L+fP368+7w9nl4eG1tc2xrb3d6eH5ubG549+/u 9fP19fr0+3n9ev17eXNoaWx0d3t5cnh8dG1qbXN97+zr7uvq8/X/eG5sdHlv c316dm5saW5vd+/z9/Ln6/Pu7/p3/Hh7fXJtZGppa3NycXJ8c252cHl6dvNy 9exkeej/4ebp73pva2hganp7+HVrZ2lmZ2/75uPj6e3xbXNyent4e//7fX38 fHR2eHt6eG9ye2xnZGV8/nr06ebk6fT+bG53cm9zdHRybWxrdXz67+/t7uvs 8PF5cXpvcnhx9vj6dnRsbXtua3d3/Xp3eGp68Hzz+258cmx8c37y8/j/em1n Z2ppbHh8 --16816888-2078917053-688452093:#2321-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.47.msg ================================================ X-Andrew-Authenticated-As: 4099;greenbush.galaxy;Nathaniel Borenstein Received: from Messages.8.1.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 via MS.5.6.greenbush.galaxy.sun4_41; Thu, 9 Jan 1992 13:30:05 -0500 (EST) Message-ID: Date: Thu, 9 Jan 1992 13:30:05 -0500 (EST) From: Nathaniel Borenstein X-Andrew-Message-Size: 438+3 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="Interpart_Boundary_MdP9G7i0M2YtQbPlt5MdP9G7i0M2YtMbPlxY" To: rsw@cs.brown.edu (Bob Weiner) Subject: How MIME looks in AMS (MIME format) CC: Michael Littman In-Reply-To: <9201061308.AA17408@pebbles.cs.brown.edu> References: <9201061308.AA17408@pebbles.cs.brown.edu> > THIS IS A MULTIPART MESSAGE IN 'MIME' FORMAT. It may contain enhanced > text, graphics, or sounds. If you are reading this warning, your mail > reader does not understand MIME format, and some of what follows may look > strange. However, the plain-text version of the message appears first, > and can be viewed with any mail reader. --Interpart_Boundary_MdP9G7i0M2YtQbPlt5MdP9G7i0M2YtMbPlxY This is a MIME message. I'm composing it with Andrew, and at the end you'll see a picture of what it looks like when I read it with Andrew. Note that the word "read" was italic the first time and bold the second time. The word bigger is in a larger font. I'll center some text and demo that next Because italic and bold are getting quite old Now for a picture: [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] and some audio: [An Andrew ToolKit view (alinkview) was included here, but could not be displayed.] This is what the message looked like on my end: [An Andrew ToolKit view (a raster image) was included here, but could not be displayed.] --Interpart_Boundary_MdP9G7i0M2YtQbPlt5MdP9G7i0M2YtMbPlxY Content-Type: multipart/mixed; boundary="Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps" --Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps Content-type: text/richtext Content-Transfer-Encoding: quoted-printable This is a MIME message. I'm composing it with Andrew, and at the end you'll see a picture of what it looks like when I read it with Andrew. Note that the word "read" was italic the first time and bold the second time. The word bigger is in a larger font.
I'll center some textand demo that nextBecause italic and boldare getting quite old
Now for a picture: --Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps Content-type: image/gif Content-Description: Jessica Rabbit Content-Transfer-Encoding: base64 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 AAAAAAAAAAAAAAAA --Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps Content-type: text/plain Content-Transfer-Encoding: quoted-printable and some audio: --Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps Content-type: audio/basic Content-Transfer-Encoding: base64 Content-Description: Would Be Cool 2N7gZl1cdFtZWF/p3svK099w63XR1W1xY29gY19eXFJUT1hfeXJ57fZ1fN3n/u3r6e7b3fB7 7eJ76uJoaWlxbGdq9+pxe27vf3Lf9fDu/1lt4HhheNXhYfXqcWhraW/+3+n7cXnkYmZ8bWx7 cP7rdX/16Plqefd4XWJs+uTd3eJlaPnx6Pz58WtYa+Tn7+rl/lly+fl7cX1yfnzb3ePn/Ovm 7e98WVhmdnF1dmlwe3Hz6fz58XJyePzm6dzZ7Hxrbuvq6PNobmlid+jt+f5zcGtq+Nzre/v0 9+7k4PttcG1iaPLo9mdpZnR7+ev0dXL56PHq3uvt/vbl7u5zdm9mb+5pXGx2eG99f3xyfnF5 7OfreXJtdu3k4uXr5uz/7urvevvu9X1+6v5yb2ZqZG1+fGZtdXH5dXh+eG5/8vX99Ox+eP/n 4vV0f3zz9vLtdn5+7/h9/XR8dHD/+ff3/HJlc+3ybnF8/vjr5O7zdXJ4//f19v3/fnhvcW1t em9tcvp0aWxua//xeH7y8P759/Pu5/H16+vs7urp6ev3e3NtfXRpZGBtePl2emtoeHV++/14 cHJuePr19f/u4OTq5+17fvLw+Xly/25sd/DteXR1cG1983tta3D/bm9xdnt1dvr3+vPt6OXg 4ujs7+/o8PDq7HtjaG5qZ2p0aWRodXT48P1yZm768nx4dff+//79cnfu7e7z+u3s5uXu6vT1 8nhxd3r/f3j4+f5+ffjy8Ovr/X326u/9fHd0d3J+cmloZG1x/vn8dW5v+e329/vtfvLu7fPt 8Xz0+HPte+xy6fft5Gzpb+F36PZu6uVOwUa3PDXD331EUWbx793e7Pzizsp/aVfJ5FHX+nZY XPx8Y/rrZtnZYHb97fJ9+mv25WtZ399a7ftK379P6Vnl5/Fi/cJYWU9q3NzzZGtp6evg6V9n a13v7Pxo/3Tw6Hza/P798ur9537u/e/6/u/1e2t0Xv56ePlvePdz//t3b/9pYm9md3Pr5eXo 733v4O377v/9+ev9dnBtal9mem9haG1pbXZ87f5vZvHk637qcHLn5ut+7url2MnQ8FtUXPt6 V09TYurX13tfW+vf1+VjUlZueuFsX2jq3d/r/+585Oveet7d31FaWP1sX0tRdeDU8u3f8XTt cl1mdX3q9XR52s754uzZ6/l8aO3a2mplXPzd3VpNUuR7bVFW7t7VW2dY2ul8bEvf9cleUv3e yHlV4OHaU2jXz/lUYe/WdHrkZFvaa91hfMbG7j9x591lS+pf209c2OfqTnP7/fH76lxa4Ofi Xl925sleX2LP2VJpb8nlVVn51PH8XmbT3fxvX/XfyldeVdPtYWpW1m1hVlzc6OlhWdna6WXx +PTgb1ZU5c9TXfPm0GXpU9jVU1tS1OxXWfXD5VtT2tPuXFXN6V5TeNdyXt7p4l/m0u75VG3T a1jv1mpk//LsaXtkb25X5FxyZXT7bHNh3/DT2tfVbeTvYmBoelxhVNLj3vFfye9u9mxURmXt ZV1h1chwVnPOy1pTbNDsb13h0vz4UOTPa1n73HlS5dxuVl3SZlpk2Pt0Ue7UUGZu395cbsvN Ynj26fVh9/Rle+DSYNjkZORp3ltrV179XWxl5ezc6m798Wvtallsfub65trg22vy2nl0Y3Dc 7WFffuB7W3Hu//t1f/Hm7mr63ef+/3Hibnd57etmaHN9+O/+7XhpeetgYPThYGn45H1dbWjx eHFw3e117urYc23j6W7493Le5m/39F9e+vZxb1zy6F5c7+BacfXm9GD0+vxoddb2Zefh7Hj+ fO99a+7ucnPueG93bO98XXvzX1dk3+tYbuHfbvvY5u53/mz+83Lw93Ly4OtmZPnoZl317v5h aXT2/PR+dvFsZO73bG3o33hu7trvb27eYm1+d/Z3eO/nanH36PloY/P8fFxt8W506ef4evVv 9OF89/fyeWB47G537el+/OzcYGjvdW1wcWZ93+H+8X15bHZpZHlu+Ovc9+rd//Dp7mtqeWhv aO/meHh73f7vfmTdaGT/5/1wbH54Zm778Fnp62jl5t/o6Wzv8nZv6uvzZODfcuf25mv5+Ohl Wndc/Xhe+PHpd3R16t/zb17o+Gvm5Hti7OtuYOTh6Ht97+fnXXLf82xtcXZe/Xf1ZGjedefv 5/Tr6uNobe57dPXm7+ngfXxy/v1dXWLz/mL373Xn8HHt92l65WFj5+xk7t30+fhd5dxmZ+zv b+Tr9Hz0bXPmbGpweXj3bnTwcfrqf/R1ZnlzZfbueHnm5/HzffTk9F/q2/tbaONpbGVpb2tk 4dxp7v3dcGr53+lmZercd/X05XN4bfttbG3oelnw5W1n9eR36nTs4+7q6et64HFqeFl49V9m 4G1neu99bd5o//taauf6aHHmefN//u727nNu6PFwc/L8cd/z6+5u3HNl4Xj3aXr9aH5v7/r7 aW/+aV/v+FV57Pt873z26udvdN9ve+r4ZW3o/Gr/e/fwfe9v6Pby6Px7em9uannrcW/96fN2 aPB0ffNr9Otqdvvme2j972xs8+14f+7u7m17ePN+Z3jmemli6ulob35482ZZ7uJ3ZuTjcnHu 4m1s8O7safbX72/+9/3ubHXofWP89/dn9X5ac2lvcGJ99fh2eeLtcG9kdvP6bW7o/G5t+eHv f+lxZ+Xu8en/7+l4+/rteHBrbe78b+PpX+vv7+/x/2Pz7mZofuxkYGh26GRgevlrZu7y7vf3 dv989Pf49v/39Of1dfzo9mZl5nZ4/Gd85uV4+eXpb23tfnPob27r6u7t8/f9fnpldnB8fW1q b/D1ZXDjd3hv/fVkcH5ueH736Wttfefa/W3m7H3w9frx9u/69vLl3n7rfGx+e2praH38+Xpl eW9uZW9r/nLtd3Xxcnb+8/Tiem3t7Xjs6PDz4HFqbX39e2xhb+X7X3b3aW3xeP1j8Oh0Z3rc 43lv397n7d/scXVye3ZgdWl1bGp0aP59c3t1cH1vbW9lYXHq9mp6Z+bpfuzq4u309HV53uhn Zezu7+10buXkb29+9GhkZWZj+P9qbnl8eu9zafv+93r56vnhcGz592Zu+npzb335+2398/Rp /urpcnV+8uxl8t78b/Z0ePps6+L7c/fjdm1293Fkevt1aW1xaO7ub2hu9/z/dfbu6n1qbebz e/Nye3Nx/vr44eD0/n546v5kcXPz9mRn/Pf7/X1+a2x6bGb34/p+5N7p79969ulxZ3Nvae7z ZXF3+35fbPX7Yml25u9x+Pj+9/f7fG788XV18evk5vVy8up7ZW/8ef59bnl6fPhuf/Ntfu1m Yu3o4e/4/W53bu/sa2/1bWR3aG7v+vvz/vv8e/b5/uzr/Wxx8fb+aGFs/Px3/Xz/7uPr82t8 83hubX749Wpv8+7s92r+73r5/2tp+HVobH12aez5bP71fHv89+Dd6e7m+3h47uhsbW56cWlo ZG1pa3lvZmd+bGR18vV9e/Py/Ojs5uF4/OLf7/vp5Pl66vF1+XRpa29xb19XYG1rZ2Jpdnd0 bnn18vDs+nrr7vHy5t/o9/nx+/D0dXx7/nR4/nhtbGdhcP706uvv/vXq7O/w7vd2bHR4endp dHF9emdueHhydXH3/G//8P18fv/4d3v16eh7bv/ybW94a3vx8/Pj9vbt8enw8vDu/XN1+/R+ b29sbG90b2lvb3D1737v729venRuce/rfHj97OrwfP/r5vD/9P1vb25iZWpv/2xtc//x7u3u 8Ozu9uzydHD99/r68Ors9PL4e3p993F19Pj2dWh2+W9fXG/wcWRqZ3nxdHzu7/H+/ejqfHr6 +XNxfv1ybnBz9vh0cvvo7vV9fXv3//nn6+rq9G9na/t+bXH+/Pf9ePp/cnVxa2549nhma/59 dmx673dlbP7v6/t09Ofl9nL56fJ6bvPo9nN49fj7f/fyfl9ebPl+b3V8f/P4b3Du62tm8d/p +3d95u5sav3re2367f39eW59+HV6c2xuaGJm+fRub3328fP47/h1dHzt5unq7/Po5eXy+nlt bXj5f2thYGtoaHb0fWhsc/rv+W1qe+vf3+z1eXb6/vDt6PJtZm7p6nBeZHr1+mp97vNsXG3k 6PpsceXodm/36eb9fvjv8G5sdHhxaW/8fmphY2/89f3v/PbzevLt7v9rbWp16e33en5++O7o 7/j8cW9tb3Ruamx97vx7efTe62hgaubc82hpfePre/f67/VoXmPu6H5nXmTv6PN+eu7t9Xjz 9nZsZGxzeWpkbW7+6un09Ofr9vvs3+Dj7Hdz+ent/HhsfOzw+W5hX2l8e3RfXWxlYGtrZ25o ft/n5OD9/ur6ePB8aHX4ee/n+ml18X17bW13d/Tq8vv49/Pv7O54b317bG1vc3RvfPrz7fP7 +fJ9+HRianX49ntramxka2ptdG1ub/jq7eTj7erx9evu7+PtefH5+nx3fnX99vp6a2NraGNu fXt5dHrx9fHu+m12fn96c3v9fHR0+/Dt6n51fPvv+/vx7/X/fvXp9v50aXJnb3Jsb3Tq8Prs 5Op5b2z48vf+bXP/7/N2aGlze31+e//17/t9/fny6et0b/HzfXVuZWh7cXl4fuzubn317OHs enVtbPb2dG587+ftcm17fe7o/n74e3V5ZWRuaG5xb23/9XJy8uLlfnLy6unva2R49PDq6ft9 e/56c3h8/Hdvb3n563ZgZn3n3/Rubv7w8evy+Wtt/vbn4ux7em7/6/drZmNpcndzal9iX19x fHdvcm94/O3d5fLydHPt4fT87fV57ePk+2tpfXhmcnh3eGt5+Hd8/W58/WtrZ3ns9Gdmd+7n 9Plubvrl5u/pa2h1bmZpbnL6bHju7+L4a/r7/3B0bfbvbGd16+5w/f5ifu918Gdl5d/n5n5x 4fZw7P5r+m9ddffr73hmb/P8fmdefP35eF313N5+eej16/5pfXBo9nhpaPrn+HRf/u51a3n2 5f5l/+va6mBc7ejs9mZ2bt7c6/N7eOjQ3vns9dla3tpgUVnmQTg3577HXjtS3snY/lZQethY 1bXIw1g+3LfB5O3lxNTRwt86O/LbKxg8qqa9Jy1TqM/qStDDQTFVtb/La07bfPi5t8tvVlS/ v7uyvLlLOzA7vDsdEEqgpXomQ8SwOUXJs9k1PEy1vb296k3f3cu0vre5xbuuqq4wGi+owhwR HMGjzyp3sLg9LVGuujhBPXuvtrXHx11XXtq8t6irsFHJq18cI6woFiLJtq0zL7SzNzPVxsos L1+/srLTw7RPX7m1r6mwqKTCTz0xbT0aDiO3yMcwYs/KOk/Ne0pBQz/Hra29u868vs3Qrqqp n52lJh17RRALLqS4QS+2r1IdMLbHNjvRv7G9yq+v5O3CwLiuq6CcnsUpLLwiBhLDuz49raK8 Hyc/LSQ1sqiywaGjb0KvpLtMvJyeuMraVqUrBRnHLxqzpK/MJ1c3KBYtx7aus52fwketq9bB saTJ1ZGpLp24BAtIGyQudp6nLVWtHhU7uV22q56c18KbqL+hptD8zLeppQ8CNDoYH1iipis8 pycgY9TKS7CSm9OvoKrCvavJPbqfp0gOByIUEkG/xrKvvcIzQrrdS7aem6CrpJ+rr7fCYj+1 sDcZDRgRFB8rWrmvqqNtTMa/38aimZ2hnJyqssy4vDkyai0NDBwYFBstxMS8pqfW1revwr2f mqCdmJmfrba71zEvORMKGBsQFihTX0unoMzrtbfRWaycnZ2amJ+tsb87PufONRQZJBgRGCIt MECtr9uvnqi7taiqvLqhnKSrprM/Ly4uPisfPjwiKCwhKC4yTWXUq6qup6WvvbzKxLy7trG8 sM87RTUxPiwwWjk8PjMzNTJBYcy4srazvsbNxcnKyrm2w8fOyk89Oj89OTxFXmVLR1FHRllq ybi8xM9dbs1cYMjfvdhr+/dRdObbZEFK6GRdXs/SY2Hs7lzj19t9W0pOU1Zp0d5c/VhY2dDY 1XZYW/3q0MTHz9He2ehoVk9y/k9VS0hYT2P+Z2N219/Tytd061Jt+UvWzc7P2O7XalFnT1dX XGjrWtzJ+NXX331cbufsUE9cVU5O1dFsZHjm2V3gTmn5XPDR3tHHysPJ49n2TEZNT9n7a2FZ S2dkU+lVeW9oU9zq/nFm5eHbyc7LytfPY1R6b27o4uvjbG1sVlNJQkhJVVjX29vg5vDW3N/I 087UeW9ZTFhdXVzf4NvOzs5v7d1oSkhdT1HicmL7Y17hbs7l62JeWVtlae7b09jLyNzI29nb bOteWmRdaVdSZE9aWlpVVk1LV1hvcmzez87Pz77Ty8/e1/dk19P13tvkZ05WWEtJVE9DQEZL Sn3z18/MysfGw8zS2NXnfu/o6+Xq73hoW1xJS0xVTUhPVVRbYvfwYNbTyszLy8nS1t3n0eHe bmtaVF9gUVpdUl1WTVFV3/jr3M/Y3ePOz+9b2dxtaPzhfFl05l1PT1FTTkv7bP3kzsrLy8TC y9jQ1NPrXWpYSEc/Pj05Oj4+Qk9s3c/Et7CurKuqp6y/1OspJCokIiEmODc32L+/vb2ur7Gk pauoqqu5TD0uICEiISMmN2hezbS3t7i7usTIsK21ta6ss8BdNCklIh8fIitJWMqzsK+1t7rG ybq1sq6pqq+vuEUqJScgGx4oLDhKvrTBua+xwsy1sry3q6essq2wUSwoLiMbICosMUW7uem3 srvO57Kzz7epqqyyrKtMLS0wJBshLSgsTsTBz7WtusnAt73Rua+3tK6utr9IMy4sIh8pKC48 YMPCv7K6vr3HvMvIt7q1r6+1tcdDLi8wHyIrKi07dsHPvK69v7++vd3CtMS6rLW7s71UNjc+ JCQ0Kig9UPNm1rLfc7u/5dC+vMe9rrK2squ8QktpMCMyLSItRDpAbMHPUbm/9sa9yM6/r7K1 ra2xxGBMSyooMSYlNjo0c33X4Oq80tW6xN66t7yvqq60qrRNUvstJDAoHy03LkNQXWRgv9Pb t7vJsLC0rqunrrervzRcXx8qNx0lPCcvVztQTti9+risxrSouq+osa6pubu1PE1lISw3HSI6 HypXLkHqZb+5uKyys6ivtKuytq2zvrrSNWIwIS0mHicuJjpFPnzPv7qyr62xrq+1s7a7uri/ wsPePkE5JiorJSYxLTFOR2LLwbmxr66ts7W1v8nAwtHIxdjP5T1OOiwwLissMzM9Sl7Ry7+2 tbi0tr2+vsnNz8vT39HPfnJjQkM9Nzo6NjpBPklaZOnX0MbFwrq8vb/ExMrW1+ZjX1tcXGBg fmpYU1JPRUFBQT9IV1hr29PLxsXAw8fL1uDfdlxzZmTg2ODe1NPT2d7udWNcT0RGQz9EQ0RL UV18bV29z0fKu8dvv7nR7cG94/nKy2xs0+hUT1hJPj5BPj4/RUtOXO3j2M7KxcLFw8LHyc7X 2epsbm1fWVdYVVFYXF1dcvZubF5WXl5effD939vd2+P+7un86/Z7bfl1a2R+enXp5tzU1tPT 2djb+Gx5Y11TTU5NTE1TVFtrXVr+2939/t7a2M7N0c/S2Nfb2ebtYmx+ZmNdYVpTTj89a9De Sm3M0OHhzunv4dlqUnfR0F1NXtPfaPTMydhyW2Rhc1RETXhfWF/5dGZe183f5/bW7uDu2ehP ZPvof2vm0VVEd7241kQ9TO5X389cT2LMwdLP0t1oQ1rt205CS3B9UVxv5mlg4NPVbnzf2tby /tzez9rW0vr1XXVvVfHTztxVbtzSZ0xET05APTtESElKW9bIxMC+urq7vL/Dzc/X+tfc3N5Y bFlHQjg3NTIwMzU5SFl45sK4s7K3uLm7xdLk59Ta2c/Gu7i8w9BeUz8yLSgmJCcnKzpN08C3 sKuoqaqvub7I5F1XT/LOyL69v7i4fks9LiwoIR4iJSo7P3m+r6ilpKelqq+53VJJRkFMYNS+ vbq3uMVnQy4rJyEfHyInM0L5u6+moZ+go6m1vOhIPjc2OUZvwbazr6+1zlY7LSkjHh0eIik8 WsevqaGenqCmr8DdRTgyLS0zQ9q1rKqmpqmvzEcuJiAdGxobHyk+1bCooZ6dnaCmsc1EMi0p Ki01TMuxqaOgn6Ksw0gsIx4bGRkaHSY22q+mn52dnZ+mr79NMismJSgxS8ixqaOgnp6ls+oz JR4ZGBcZHCEsQ7+roZybm52hqrbSQTEpJSUnL0vDraOfnZ2ep7V5MSUdGBYVFxofKj/IrqOc mpqbnqWvx0s0KiYlJiw83bGmn5ycnaCsxj4oHhgVFBQXGyEtULmnnpqZmZueprDMSDIqJiUn LTzWr6WenJydn6vLOSQcFxMSExYbIS5TuaeempiXmZyircNPNiwnJSgsOu62qKCdnJ6irdA4 JBsXFBQUFxsjLlK8qqCcmZiZnJ+puO4/LyspKi04YL+up6GfoaWuzDwoHRkWFRYYHCMuS8Ku o56bmpqcn6Wvw1s5LispLDFA676vqaamp6y5XjUlHRoYGBkcICo55beqop2cm5ueoam1zkw0 LSopLDJA9ryvqqamqK2+VjMjHRoYGBocISw+zLGmn5uampueoqq69T4uKScmKS8+5bitp6Oj pqu9TS8iHBkXGBocIi1CwqyhnZmZmZqepa/KSDMpJSMjKDBKx6+nop+ipqzFQiweGhcWFhkd JjbpsKOcmZaXmJugq71MLycfHh4gJzZvt6egnZ2eoqnAOygbFhQTFBgdJ0S/qZ2YlZOUl5yk t24xIx4bGx0gKT/Eq5+bmpman6e8NyMZEhAQERYdJT65pJmTkZCRlpynxTkoHBgXFhkfK0yy opuWlZaXm6OyRh8WDw0ODxIYIy+9oJeQjY6RlZ2pvzcfGRMQExgeMeSvnpmUkJCTlp2zRiYX Dw4MDA8SGi7epZaQjo2Ok5ihxjYgFBAPEBcfLGGtoJePjo+Plp2q3i4fFAwLCwsRGiFAsqGU jYyNj5iltEklHBINDxMaL++5pJuVj42PlJuqvU8rHxUNCgwOFSApObeflI6NkJadrL1cJRgS DhIcKD3JtqaYkI+PlZ6jqblSKxwVDw0OExYdJza9oJeSkZSanKW6RycZFhYYHio1b6+impWV l5mcoai6Py0mHxoSDhEWHSouPbyglpOUm5+gq7pFIRoZGiAoLjjZq5+ampybnJ2hr9o9Ni4m Gw8OFhofJCExtp6YmZuem5mjujsmIiMhHyApOMuurKWenJqcnqSqsdVGLyIaEhAVFxkcHjG+ pZ2bmZeVl5+tzDwuJB0bHCEpM0/HrZ+bmZmam52jsus7Kx8VDw8TFBgbHzi1pJ2ZlZORlJyp uWMwJBwYGBseJDBesaCamZeVlpmfr85GLB4WDw8SFhYZHSziqp+cmpaUlZmgrbxwNCUeHB0g JSw9y6yfnqCgn6Suv1w8LykmIyAiKTAyNkPYubCwtbe2tLvRTD48PT4/QUhg07+2r66vs7e8 wcnnUEI+QEZLS0ZJVWL4+PLn4+xqU0lAOzUyMzM3PklY4Mi9tK+urrC0uLzD1XpjWFhdXW7q 28/HxcjNz95fTEA6NTAuLS0vMzk+SmDcyb+7ubi3ubu9xMnM0tzx9ujc0MrEv7u6uru+xtVo ST43MS4sKystLzQ5P05/08nFwsC/v7/CxMTFxcnNy8rJycbDwr6+v8TN1939W05HQj09PDg1 NTc4OTo9Q01XXWv938/JyMXCwcDBwL/DxMLDxcbHyMnP1NTc+21rZmdrZFhPTEZBPTk4OTk6 PT9FUV50597a1tfV0NDOzMzKxsHBwsPEw8PFxsfKzNDb5vhyY1pPSUZGRUNCPz4/QEE/PkFG Sk5TXGz659nOx8TBwb+/vb7AwsTGys3V1trn7u37b3Fyal1bXVlRTUlEQkA/Pz4/QUNHTVhr 7ODd2M/NzcrJysrGxsrKyMfJyszP2dze8m1mXVpVTk1PU1deYnFzbm1mXVVPS0dFRkhKTVZp 8ODW0M3LyMjKyszO1Nnf6uvzeHF9efv8+Orl4t7h7vX6fWpfX11dXlxaWFlXVldYVVZZW19u +Xx+7fP58ujd3trT0NDV2NbW2d/l8flycnVgUfzoZ31u4efh39zd4t/o8XtiWVBLSUtNTE5P TlXY1Hhp6tHN1uns6dndU0buylJVc9i/0uTkvrvSzMK/wNPh2FlDTT80MzAyMTY9Pk3f1se6 uri4uLzEyN5qb1JGTFZbT2zNxMK+ubW0t767v1o9MzgwISIpKCUpOklOy7irp6uoo6iwuLbJ ST87ODIuOERPZs6yr7Wrp6yzuL5vPC8oKB8aHyIfJDVGRcSsqaWioJ+jqa6vyUlPPi4uMzY3 SG3PtrWvqquus7XSQzwtKCIdHx8eJCw5PdOysaqjoKGlpKixucjiQzo9NTU7RllXxrm7tq+v t7zKST07KSEnIh4jKiwvR93HuK+opaqmo62vr77iaV5CPEA/SExby9PGs7m7uLzQUEs8LSgn JyIiKy0vPf3SybStraqqqauzsbnI1uxeRUlMSVZd1czRuLy9uMbIWUZFMCopKSQiKy0sOk7c z7yvra6uqKy3rrTHydN9Tk5OSl9Xe8LMyLa3wLy+elJKOi8pKCgkJSsvLzz23865r62xrqmx uLK3yd/P9klNVFlg+dHCv8K2tL++v91JPTwvJCgpIyQqNC845c7NvK6stq6psLm3tsny1OtT S1v9XPXQxL/Fu7i8wsPJSj08NCkkKikjKDQ4Nk7GxcK2rK23rqqwvbu3zU7v3Uk+S+5cSNW4 w8ezrrzHu81AODgwJCQqJiMpNjk5XsLAvbKqrbGsqrC+urfSS1hgQjpM22pPyrS4wrautch7 ZUgwLCkmJCIlKCwyO1XIv7quqaquq6qvu7++0UxKS0Y+PVnbbtm5srO1sbC6y25FNy8rIiAl JiMlMkRFVryvr66npqqtrbC8zuVaQj09PD1Hat3bv7KvsLCvsrrHXTowLCggHiImJSUvR1zx vrCrqaemqamrs8HO2GtAOj0/PUbv1djDtrK0tbO3wt5PNCwsKiIeICgrKzFJ38a4r6yqqKaq r7G1vuJWTUQ9Ozs/T9rGxLuyraywt7vD20YvKiknIh8fJCkvOEZuxrWsqaqpqKqus7zJ715N Qj09Qk1oz8O/uravrrK7xNVjPzArKCUjIiMnKzE/VuLDt62rqqqrra+0usn2WE1GQEFGT2nP xL+9ubO0ucDM31o/MSspKCcmJiksNEBd1cS7sayrq6utsri9xttfTUdDSFNq7dLIwb66ubm8 w83qX0s7LywrKikoKSsuN0n5zsW7sq6sq62vt72/ydj3WkxISlnt1M3LycW8ur7Gy9fzY007 MC0tLSsqLC0wOUp20cO6tLCura2xuL3G0Nx8X1RMTVvlzczMycfBvr3CydZ+UkM4MS8uLCor LC4yO0psz8K5sq6tra6xuL7DydhmUE9PT2Xe1tbOxsHAwcHFzuVzW0U3MC8tLCwsLC0yOkz1 zsC5tLCvrq+xt73Dzd9yZWJeYHTi1NHLxcLBxMbIzdp4UkA3Ly0tLCsrLC8zOknzy8G7trKw r6+wtrzBytX1bmhcWWr139TLxMLDxMTGzeBpVEg8My4tLCwsLS8yOENf0cK8t7Kvr6+vsrm/ yNTpal9cV1lu287NysTAxsrKztlwVkY5MC0tLCsrLC4yOEVtzcG7trGvrq2usbe9xtLjfGhb UE99zsnJyMLAwMPGzedYRTsxLCopKSgoKy0zPVjQv7q0r62rq6uttLvBytLlZFJPUmvZysHB wL28vb/K60o3LSsqKCYkIyUpLj1Z3cq9s62ppqeqrrG1ub3K8lBJS1re0tfVyby3trvK4VQ9 MS0qJyMgISUpLjlL7M27r6mmp6mqrK6xuMXsU01OT2Xn5N7OvLOyuMDN6UYzLSsnIh8fIygs NUV1z7ytp6anqamqrbK70VlHSk9NVXHkzL+1r7O7vsTXQi0qKiYgHR8kKC07VtjFs6ejpqio p6qwuMVxSERGQ0FP58/DurGvtLm8zkQuKy0oHxseJSkrM0zPu66mpKampKSruMHKb0Y9PD1E X+3bxLSur7W4utM8LS0rIhwcICYmKjr5w7erpKKioaGmrrW600Q4OTo6P0hZ07mwsbS0s8JC MjUvIRscIiUgJTbvyr6top+fn6Cjp6y320xEOzEyPkRDW7+ztbeztdc7ODsrHRseIR4fK0Rl 3Lemn56enp6fpq65yl89MjVEQDtLzLi7vbW32zkzOCkcGx4fHh8qQX7JtKifnZ6enp+msb/H 8z41PllDPd64tru6uMk8LzQpHBkbHR0dJjlpxLGlnZucnZ6fprLE2U86NUbySE66rrCwr7DT MC4vHxYVGRsaHCc/z7esn5iYnJ2cn63K+E84MDhRT1y+r6moq6y9OTIzHxUTFhgYGiQ8yq+n npiWmZ2fpLL3PzUvMT9OT8iup6Slp6zXMC0oGhMSFBcaHitdsqSdmpiWmJ6puddJLycsSd1h 2q6gnaCnq8YwKyUYEhETFhofMNOsn5uZl5ebo7LsPzQqJixRxcKzpJyanKKuUykkHRMODhAW HSlEtqGYlZaXmp6p3C8nJyUmL2m7q6CalpebobkuHxwWDw0NEBopRbumm5OSlJqirMY2Ix4e IjBjxK+hmZSTl5+vPCIdFw8NDQ8YJ0e6ppyWk5Sao7T4NCUfHR8sebutopyWlJefszogHBkU Dw8QGCvcrqSfm5eWmqW/PCokIyMlLlq4pp6bmZmbobA4HxoWFRUVFBst2qadm5ybnJ+mvzUj HR4iLUHVuKmfmpiZnqnJLB8cFxUWFhkiOcOjnJqZm56kruA0JR4eICk/x7Cno56cm56n2Cge GxobGxkbJDa2n5yam5+kqbPOPicfHh8tWsGxrK2mn56fqVwnHxscHx8eICY3uqKcmZyip622 xU0tJh8gLVPAr62uqqikpbBHKB4aHB8gJSgtR7akm5ibnqizvdhCLycgIy1Lva6tq6urpqq/ OiUcGhwdICYqNOqtoJmYmp2osL78PC4kISUvYLmtrKqqqqiv8C0fGRgbHSEmLDrEqJ2XmJqf qbTBXTgrIyIoOs6yrKyrq6entE4nHRcZGx0iJSw9uqaalpiboqu3wk84KSEhKEO+rqusrKqm pbNDJBoWGRwfIiMqPbWimZaZnaattL9PNScgIitctqytr6ynpKSzPCIaGBseHyEgKD24oZqZ nKGoq6+3YzMmICYvbbiytbKupqKkrFgoHhwdISAfHiAu3qienaClqaenrcE4KiQpNVHXyMO5 rKafpKu7PyslIiAgHRweJD3GrKemp6akoqe4aC8sLTQ9QkPnua6lpaWpr7LKPiohHh4eHh8i Lk69raqnqKWnp7LPQTEzNTs7QFm3q6Wlqqipqq9qLB8eHiEeHB4kP82vr62qo5+krOFKOj07 Ni4xQbykoqSop5+fp8MsHRweHBoWGCI5yruvqZ6bm6a4z1dLLyYhKDRazbOinZmYmpufqsYp FxIUExMREx44uKmem5aUmKGuwjwpHBkcJCo2V6+alZWUlJSZptktHBEPDgwOEBos6q2dlJKQ lJmirkEkHBcZGhwkQrifmJaTj5CTm6rJMhoNDg8LDQ0WKWCzoJSQj5KXmp/hKR0YGRcXHTJs r5+XkI6PkZScquInFw4PDAoMDhohN76dlJKPj5CWn8NRKRwYFhgdIzO+pJyZk4+PlJukszwe ExIPCgsNExohOK2bmpSPjpGXn6e/MSMfHRscIDLtuaudmJeYmJqhtz4mHBkQDA4PEhUeMcOu pJeSlJSUmJ6svOI2JSIkJic2ZtO1pqGfn6OntkwvKx4WFhUUFhohM0DVqJ6dm5aXmp6iprNW SD8vKzI/OT/Oubm1rbHNS0E8Jh0fHRoaHiYuNOizrKifmpyfnp6msLq/ZTo2P0Q2PMrT18Cx tm1O4z8mISUfGRwhIyQuar68qZ2enpybnaSqrsBURj4vLz82POnYvbq4r8hRbj4rIiIeGxwf Jiox7764pp+fnZ2en6etr8xMTzszOUI8Q8/rybu/t9tJ9DQpJiQhHSElKC8/0ci5pqemoJ+m qKevucDZ7ElCS0lITNjoZr/Mz9BITDcwLiQqJyMrLDE8S8zEs66tqamorKyuu7nA19tvYVBZ U0zbblje5e1bXlE4OUguKjwvKTY/OELU2di3t7i3r7G8tLS/wb/B2+/Rf1ZjbFxYbV9MXGJP UmFJQlNOPj5nRzpRVj5G6lJJ3NT027/Bybu5wMC9ws/S1mhfbk9ITlBOU/T78NHJzcu/zcrJ 5HZNQz43MjIyMTU8Q03tzMa+urm7u73Dx8zU7nNsYFVk6vnszcrLycfJ1tfgZE9KRz89P0JC R1FaZPTf2t3i7nhpVVVWTExMUlld5c7IxL26u7u7vcTO6mJUSEE/P0FFTWD959XLzM/R1uto XFNKRkVFR0lOXPvaz8rDwsbGyNTld1VMSktMTlNefeDQzcrIysvP2XpeV01HRUVHSU1WY+fU zMjFxsfJz9nvaFlPTEpMT1dfaPng18/My8/U1+P1altWUU1MTFFXXG339OjZ0NPY1t3p8Xdp XFpXVFtn9+vg3NjOzs/U2uTyf3BnXVhYW11eZfft8fHw/3R9dmZdXVhTU1VXXGd46trW2NDN z8/S1dvp5+9tbWdqbXB7dXn19/N4c25oa1tYW1tdVlRaYGluePbu697b3tzX2uv08Ovy9vP9 7+3f3d/i5t/e3+HteVROWmZvXlJJR1Tx13pcWn/Nx87p9+hOPFq+ts8/PF/A2k1W2rzKXUvq w8HbPzpH7tJtTUlS5NfZ7mn12NXeYF11299kZlzu293V7f563t3m+l9jZnf/ZFpLU1xh72z8 a3h19+X0+ObneWFr3NTgd1pf4svJ61ZN/M/J2VhPVOPIz/lOT+3K0GdHPENq189hR0JQzr29 5klJbMzI12lPUejM0excZezS0/VSTVJzb2JrUFld/cfExmpMUd/Kz2FERVjPxMrlfNS/u8Vg ODI2PklERlzTysftT1THr665Tjk/5Lm8fzYuOte4ud5OTG/Iwt5lV1BwYEtEQURa29xxY27c ycO+xtpfWOTP0FpDPEJZ1svi1crCucF3Pi8vQ9nB1j8zPM+wrLVlPUH3vbfNSDpA0Ly2yjgu NNy2wVw2NTt1vri/0F9OU2HgzMraYl1Rae3Y2OdnS0pf0bu/xc3k62tVS0JPVWNQSU1Y78rE x99PSEVO9NdtT0ll39rSbdzX5NPLyMnMys5pW/bXz+tNSE7k1dlkOTQ5UMLFzGVHRU3qxbzM akA+RuXKX05GXMu5trnUVVdd0szPT0NN7cztfvH7/O9i7/TU30hYVWJdYNXeaUhT/Nna5F9Z Z9nIzNjbVTs7XMO61k49SuXHv9BjR0RJ6MzEyfpZSlTnycPOUT06Q+LO22RfeunIurq+3kdG T2roy3ZGPD34zsLabF5b4s7QydVORz9V6d7Q71ROT1JvY9LK32RKUlLkwsTQ32xTW/3a1Mzl REpJX9HLy8XbXVls39PVWlZEPU7uxs1ZTVF02N/octnYcGBRRWffycvM9ks/QNK6vMx1Tlfk 3MlybnpWRVptbN9hXmfaYOfT2ttbU09QV+PM0+9QTU/nzsfNbW9VdN/O1exdT0hM79vhVFpb 6tHa1u/leOzX0NtoY0xXdtnWe1lPWVzf7PFkaO573n7k2+L/WVlfcG/+8tfYbf1lfuve39fP 8F1MTV7k1NFwT1FZa+7n6n1aX2vn2Np5W1t93NPX3HbwZF9vcWpu7eLVZ11jcfNq9Hxea+3i 4eXk6WdYWHvh3e5oVU9Yad/b2dXb9m/y6dPP23xRT1V6dGtnaf199217+ufo/dzi7m5fXmd9 /u3pcWdjee7n4eDf6/tsde7f1d1mZvno7Pjo5/FcVlFTWVRPT1VUWFddbvfb1tHU1NDSzcjD wby8vb7Eytv5W0M5LyolIiMmKzRD98e6sKminpuamp2iq7fhOSkeGRYVFhgaHiczXLmpn5yY lpWVmJufqbbmNiYdFxQSExYZHic0Wbyso52amJeXmJuepa7HRy0gGhYUExUYHCMuRsmvp5+b mZeWl5mcoqu8Ui4iGxYUExQWGh8rP8qupJ6bmZeWlpiboau9TCwfGRQTExMWGiAsS7+roZyY l5WVlpicoq3EPykdFxMSERIVGR8sTrypn5uYlpSTlJaboKzEPScdFhMREBEUGB4rSbyon5uX lZOTlJaboKzIOiYcFRIQEBIVGR8tULmonpqXlJKTk5ecoq/VMyIaFBEPEBIVGiIyfLOlnZmW lJOTlJeco7D0LyEYExIQERMWHCQ1+7KlnpmXlJOUlZidpbJfLiAYFBIREhQYHSg9z6+lnpuY lZWVl5qfqLdPLSAZFRIRExUaHyxGx62knZuZlpaWmJufqbpOLSAZFRMSFBYaHyxGxa2knpya mJeXmZufqbVoLyIaFhMSFBYaHytCyK2lnpyamJeXmZufqLN2MiMaFRMSExYaHypByq6lnpua mZiYmZuepq/POCYcFhMSEhQYHSY46bSnoJybmZiYmJqcoau6VC0fGRQSEhIWGiAtSr+rop2b m5qZmZmcn6avxEIpHRcTEhIUFxwlNHS4qaCdm5qampqbnZ+nr8xBKR4YExISFBgdJzT6t6qg nZubmpucnJ2gp6/BTS4gGhQTEhQYHCUwWL2so5+cnJucnZ2foaatuec+KB0YExMTFhogLT3N s6ignZubm52foKSmq7G980EpHRgUExQYHCIuPc61qaGdm5ybnqKlqaqusbvTVS8hGxYTFRgc ISs4Xb2tpZ6bm5udpKqusbSzuL7NTjMjHBgWGRsfJi07UL6xpZ6cm56fqrK5v7i5trjA4D8t IR0aGhwfJSkwPGi7rKGenJ6jqbjAzcu+vLW4vMlpPCslHx4fHyQlKzNExLKmoJ+fp6y8zf9d zsm5s6+utbltOywhHx0dHh8lKTdsuqqioKOnsL7OcmPevrGqo6Gipq7OOiccGhgXGRseJC5R v6qioKCjqrG5ydfKvq6moJ6eoarAPSYbFRMSEhUXGyM0yqqcl5WXmqCsud1VUva7raSfn6Kr uz8mGhIPDg8QFBsmQbKgl5GPkJSbprpSNS0sMky/rqaipKq0ai0fFxEQEBIWHCdFsZ6WkI+Q lJunwT4pIx8fKDfPraCcnJygrGYqGxIPDxAUGSAy0KmclZGQkZeeslQrIB0cHyc5wamdmJaW mZ61NBwRDAwMDhMbKVirnZOOjY2RmKfmKRsXFRgeK2OtnpiUk5SYna46HBALCgsMEhss2qeb lI+OjpGYosguGxUTFBohNMKmm5WQkJCTnKhKHBAKBwgKDxgq+qqalI+NjY6UnbsvGxAPDxQd Lsmom5WRj4+QlZyqQxwOCQUGCg4bL72hl5GPjY6Sl6XjJxcPDQ4THTTCpZuUj42Njo+Xob8p FAsHBQcLEB85uaSalZOPkZSaql8kGA8PExks0aialZGPjo+Rlp+xQyETCgcEBQsPHz2znpiQ kI6Pk5enzCoaEw8TFyRStp+bl5SSkpOXnqrJMh8TDAkHCg4WK36pnZiTlJGVmp+4QSEZEhIX HDPFp5qXk5GRkpabp70/JhsPCwgHCg8ZNL+hmpWSk5GWm6PDOCEZFRYbJU+zopqYl5aXmZ2k tdk4Jx0SDQsKDRMcN8OlnZiVlpOXnKO5PiYdGBoeKFi3qJ6dm5qbnaGpv2I5KSEYEA4NDRUc ML6mm5iTlJSWnaW4PSgdGRkbIC9vuamgnpycnJ6lrLzPTDYqGxMPDQ4WHT67pZuZl5mYm6Kq zTUmGxkZHSdEuamem5uZnJ6krLjiVTQsHxYPDg0SHCfDrJ6ZmZaZmp2oslUqIRkZGyAx3q+m np2enaCjqrS/b0k2LSQaFBMQFiEqvq2impuZm56hrcJOKSUdGx8kNe+0qKOgoaGjp6y1v9lb RTgsIBgWFBUgJVmxq52enZyhpKvL7S8mIh0gJi9guqyjoJ+ho6assLrK4FM+MCMaFhQUHSM8 tq+fnqCeoqqpvm1FJycgHygyS7quqKKjo6Smqq23vc5fRTMkGxcVFR0iOLu4oqChn6SqrL3p Qi0oIyUqN1y8rqimpKanp6uutcDbVj0vJBsZFhcfJD3Cu6WkpKCmq6vB2kIuLSgrLz3+vLSq qqimp6SorrLEdlAxKB0YFxUdIS3VyqympZ+gqae5cnIrLiomMztKu7qvp6ykpaelrK+9Ykgu IxwYFxcdIjZrwquooZ6eo6S65EApKicpMjxmwbuuq6qlpaSnrbPRTDclHhoYGB0iLVffr6uk np+gpK/TSSsoJiUuOEnCvK2oqKKkpqWss8dGNCQdGhkZHiMtTP+xq6Senp+lstM9LSclJyw5 Rse4rKajoKKmqa672j8tIBsZGRwiKjhdya+ooJ6eoaq+WDEpJyQoLDRJy7WnoZ6eoqassMBf NSQbGBcaICg5VNW1q6OdnZ6mu1E0KScmJiosNVC9q5+dnZ6mqrK4wkQtHhgXFx8tPG5/zrSl nZmdqsgvKistMC0oKy/qq6GcoKits6+utM5CJR0dHCsuO0M3U8itoZ+otfE/UD8+NSkoMES6 rK6svLmwsq/CTTs6SM3AwkcrLSxOaUc3KS5Ts6iputTdyba/XjArL0rIwc5fbcSvrLDIVVjb v73PWTcqMS44PS43N1a9sa+vubq50N09NDc3TGFf886/s7S7x3bl3+dmTk1l3NHHydVHNjIv NzQ1OkrLtq+ws7e3vc1TOjY4OT9ESu/KurW2uL/DydLa2ubpSy4xLjdBNTc87buwsri8ubnI 8j48Pzw7PkFyxMK9v728v8z3Vk1YaXBp99fLwstUODczNzcwO1bEubW1sbG4zUs9ODk2LzdO 28S/u7Kvr7e+xs3aWUVETVg9LjQ3Rkk8SdW7ur3ExbzFVz86O0I9Oknt18XExri2vMXS3NXX c2/YzcTG1dVIMzUuMDUzOVHeyLm3t7W94nZJPkE9OkVIV83IvLW2ubq/xMLQ6PVfceVt9G0y MToyNzMyPuhm3L+7trbM1cfiWEs+SFJESfbOv73BvLa6wMPMzdHk39Xa6EgvMDEuLi0uO01a z7mxrrG6vL7PZkI5Ozo5Q2HVw725s7S6vL/J1N7q3MzRz247OzQpKyopLjg+0bizraqur7XJ 4lg5Mi8tPj49y7+4rbGxrLXDx9n56lxVzs1KPUQ0JywsKTIxOcy7t6yqrKuxzN9WNjAtKz9G NtC3tqqvtKmw0tvvWvZTP27LTz+8uzcsKjREKiIvZ9Vn4LynprzEubnMPDNEVzQvUtW9vtm0 q7W+yce+x09MzcTDzezE0D84Jh0sJx8qLUO9wbuppKepsMtgXu8zKDA9/e5SwayqsLi0r7Te RExrWTs6VNHIbE1IQL5pIkZjJFMtIblpP7vYvay3ZcO5XdRWNs3OS8/Ky7W5zbq2y8n5Rv3e TFPgWNzNXdzjTVRPPj9AQkZEPj5ESEhJWGxi/mxr1Nba0dbIvb/AwL/AxMfN2NbZ1+R23N3c YFtpTFBLQlBEQ05aXmd2bdr6bllOXl5ZVGt86+Hi3M/Q6tnyauhuZm1a+93s7d/b3u9pUWZr YGda29rWzs/N6s/a/Hr0+3hgYXJTWmX3bF9l6O5jb3td+uBic3Zd52N89FxrTFZSV1dPXuFq YtDkzXXcznrOW9PVbMfPz/jexNfuZN5r4FxI2kvtUGNh3PBKy27/bk/3TVpgS+NaYP1N/+Zm ZVVlZtbjWF7Zx2ra3crFV9NpydtNxF7Y0Fv31dle3Ghie2FRZF9g+ltD1G5fXUzxeE5tePl8 WNnl7+DsdOXU/tNZZsjRXGhddNTdW1XD3ebjVtDmT3jQbUhTZPtcUPLta2/Y3n3cdlPYf3Z0 UOnKylpbz+l19mdUXvNWaW5j13ZQ+tXvTGzkXOVc4dv8W+zS6Pn44uTN7ux55d3+eOhidf5f 2/j+dH5o9PJVYmFUW25zcNJjavtl2m9sWVzi7W1maejZ3ezo5vlzdOdpd/Fl+e3tceLe8djz W+jcVl7p5Fzrb//t8nrl6VbodmJuXvxrUW1u4O/s7XB0XNLoXW5aftheXNfl5N/cbenf8v31 UG/eX+xe7Nbeal7cY3FmVl1t+/t35dhe2srua+tecupfVvdjYWhl7N3h9lrf4F3mX+3c6e58 83jr52Bc53FdeW9e72Fl7d3ybdnf2uZgbnld/Vhjf2/paPLk2vXm7W348nZq+HJ6Z3D47OVu aHbl9WVdbOJ2+ulvaHNt7Pl6eGVr7t73/XX1fn3n7eFzZ2ru4nNpZu/y7+rq3Ot5+X50aVte aHtobvnu5enj69/c63F0c2dlZnT7+3R4fvz77/pxbGl9/HHr/mRuffzrcXR1/u/3/v7+/u34 7OrvePjq4t3v+Orl6vn9dm5rdX10Z15la2xfXmZkZnR08e95+fz37u33+PH38enw/+fl9/rq 7fH0/HZ78PR9+vf4/nt6/XJlZGxudHX//Xtw+/H7e3ZwaGVnb/r59Pv28e/n6+7v7vH19Pfv +vnq93t+ff37e3N7eHlvfXptdXB8+/x1alxaWFhYW2JnbHns39rX2djV1NXU1tjd3Nzd297k 6vz7+GpdU0tHSUpKSEhKTVJaavrr3tnUz8/R1dna3OLn9P717unk4t/b19XT0tHP0M/T2uh8 ZlNOTkpDPTs7PkNJVF1q6tnQy8vLztTY297p7unq7vDo39zU0c7OzcvLyszO0t73X09IR0VB PTw7PEBHT1tt7trSzsvIys7S2uHj6err8/Xz7unb0tDT1NLSz8zMz9nnf2ZWTkxGQT06Ozw/ RE1VYu3Zz87Ly8zO0dXc3t/e4OTc3NnV1NbV19TS0dDU0dPe6/tcTUhGQT46ODk7PkZQX/re 0szIxcbJzdPa3eHx7fHy5+Lb1tXSzMrLy8rJysvO2vNkVklDQj88ODY2Oj9ETVt24c/KyMjJ y8rO1dvf49/a4Nza2tfT0c/MztHPzczM0dnqaVlLRkRCPjo3NTc9QktXZevYy8bCwsbJzdXb 3d7b3d/i4NrUz9DR0dLPzczMztXY329WSENEPzw4NTM2PEJOae3bzcrIxMbJy83V297k3+He 2tnV0c7My83Qz83LyszU33leT0ZAQT47NzU1NjxCTVhp6dTMyMXExsrNzdDW19LV2dXW1dHP z83Mz8/NzcvN0d75ZlBFQkQ+OjUyMjY7QU1Zb9/Ry8bDxMbJy83T1tTU29fZ3dnTzsvLzc/O y8nGzNffc1NHQ0I+OTQyMTQ4PkhPYOXRycXCwsPGx8vN09XT1dbV1tjUz83LzdHRzsjIzdDd b1VIQ0M+OzYyMTI2O0FOZOHRy8PBwcHCxsrMztDS19jd7eDWz8vJzs7JycXDyM/Y71tIQkE9 OTMwLy81OT5EUOjLw7y7u76/wc7qVk1PXdrMwbu5sa2urrS5wNFePjQqHx0eJDf/vLa6v8vK ys3SVkU5Nj9P2b66t73EysfBxs34XHrPuLCwtb7E1WpPOy0gHB8oVLqws8tdSWTNx8dWPDI0 U8i1tbzJ/XvYxLvDz3V7ybesrbTMV2L34l9BKxwdIju2rrDZPTI82L22z0I1MUjPt7C4x1hM VNi+wcTP2sq5ra2xyX15TV9NOygdHyh9sa20WT83Xsa7wkU2LTroubC7ylhHSWnJxMLP1Mu+ r6ytsr7L/k5BNisfHipAta+1azw6Sbu7wUUsKzXNtaq24Us5SvfKy8vO1b+/tq+vsLm/zc9f Py8kHCAy0KqyxzY0O8uuvN4sJitUr6qpdks5R8rKxFreacG2ua60sbq5u8jhNy4oISIvVLm1 xE1ATue2xGw2Ky1AuLmsw3dRSM1tyztScMKuu7C+r7a1tczUOjktIRwoP7CptGMyPEitssY2 ISo2tayv0Tnr4bK9WT81ccKsr7S3x7SyrsM+KSEhIC1OxLfJb0jyyre37zgqLT7Kube/fe/j wNBgPT5oybe8t7iyr66pv2AvJCIcJzi7rLnKNEr8ta3IRicnLmS3tr3mRdTHvNQ/Rki/v7m6 vK+0rKuzWS0iHRwnT7ipyOwzS7+vquk7JSpA3rbFy+PUxs7iSUl5yb3E1cm6rqupq8A/KCEb Giphq6rFPS9Rv6eu+DElLlC7s8HMas3L3F87Rt64s73GybiuqaavTywhHBofQ7mluGwyPsWy rPM3KixFx7u7ysvEwsNEPDdwtra337+3raiprFgzIhwaHDi9p7FhOjy+sK9dLygu+MO3zu7J ua7FUTA42Liwx8/As6qpp7JgLSEcFx42t6i6SzVet6y3PCorNeTJ08nPsK6w9Dc8P72/xNLP r62orKqz9TQgGRQeQKupyDs8vayrei0nL2LZXUX5uKuqs1U6N1THwMxuvbCqqauqst8vHxcU Il2ssVk3Yq6qtz0pLz3+WDdIxaqqsMpT3m3eZGzIuaywsrCrp7o9JBsWHC7NusxBW7itr1k2 LTw/UT5MxLiusLvD1nBNWUzcv7SrrrKtqa5OMiIeGRsuzbHNXV+1q7dQNC88TUY7/rqvsry8 vdRURENf08e2rK2tra21PyYfHBkoO73Bxnm1rbbDOTs4Rzk4Tsqwu7jBv8P5Uj1aXcK4q6uv rKmyTTMiGxYhPLvNV+a1p7fSOEg8Oi0uV7q21r6yrb5NRGLPVVnCpaWssamtvygcGRorNUZF wbutss6+7FstLSo76ODOw6msr09Szc9dO2mwoa+3rJ6uOiAiGxsfLF/SycCsrrHFVUQ0LSk5 TNLXuqqssc3V4no/VsSsqbCvpaW7NCUjFRonMT9m4aypuLm71j8vJzNCPEtyr6OpvrfB0E08 7q6subSqpLRTNiwdFB8vLzRRtKavxq+x6jIsLT8yL025q62zrqzLTEzwx7K2sLCtprhSNyYY GyMnKTvqrbG6rqvEQjk2OTAsOnG/sLOpp7HE/mvTuba6s6qsv8hjLBwbIyYhKv68wL2sp7hb UF81Ki05PUO+r66sq6y65t25sL6/s6mzUNj2HxojKSEgNcDC/bKkrtvyy0ctLTc2L+q6t6+s qK6/vLKzwLu2tLXScV4qGyArIB80XeVmvKatx7+6WzM2PDkrNbLC6ayorLi9ray/wq65yNfD fC0eIS4fHS9WQE27qq3Auq/VNkNHLik9zXPcsaiwva6rtLeysL3FvMtXNSYfJyQeKTw+Tcyy rLO4sMBRSkQ2LCxZ8Em9q6+4r6qrr7OtscbByF04KCInIx4lODlA0rixtLOvteJgbTgvLDz6 P+KusLywq6ytsa6sv8XF20UqHyolHSIvNDRdva60t6yzxs3hRzYsNV05V7S1uq+tqqmurqy0 w8DQRTMkISggHikxMkDWu6+0ua6wy9foQzAuPz5A5r+1t7Ssp6qvqqy3v9ZuPisfJigfICk2 PEzTtqyzt66wv9JRQjUzOj1N+si7uLOtqKmurrC4w3RGPC0jJigmJyovPWjVx7WxsbG4vb3Q STpBSEdPZ9LBv7y4uL7Fxs/b1trc4vhnWEg+PTk1MzQ5PEFOauHVyMC/yczO2ev+6/p55dXO zszEwcXEwsLBw8jTZUtGQjkyLy8xNT1FTlnhx8DEy87V1tXW3eTZz83LzMnGyMnJxcLCwsXN 8FdMQjs0Ly4vMTg/SlnpzcrGxsvR1dDS297f39vW0MzIx8TCwb6+vsLI0mlMRD84Mi8vMzg+ RlRu3c/KzM3S2Nfa3uju7OjY2NnRycXEv727u729w9hjTkY7NDAuMDM5PUROXu/d1tHO1dHL ycvS2NbS1drTzs/KxcG+vLu8wMrdY0tDPDYxLzE1Ojs+RVFm49fUzs7Jx8jN0tTa19HT19LM xL++vLm5u7/F2F9KQDs1MC8vMTQ4PD5HWvPXzsTBwMHDxczU2dfY5OvazcfBvby7ubq9ws9t TUM9ODIuLS4vMzY6P1Lyz8a/vLy8vsTM0Nvh6evn49TKw768ubm7ur/J211KQDw3LywsLC8z OD1GX9zIwL68u72+w83Y7/Pq6tze1srEwL+9u72+v8XTcFBDPTcwLS0tLjM5P0pv08S9vby9 wcHI3vNeYuvx7uDYxLi4urmurrW9ytFBLiwpKCQjKi03PW27urKvrq24v8ZtRzs3Oj48Q9jJ w7ivqqqurKqxy8TIPTYoJCsiICgvMThmzba4t6quur2/3E1COjw2PExN5Ma9uLWvrKywr662 zeDbRy4nKSwlIi05NTltu7zAtKy1x8LCdT88QD45P2bj/Mq5uLm2ray1ta+1xtj7XjwpKC0o IioxNjlBxbnBvK+wvsPFzUtCREFDP1L559XBurq4ta2wubKvvvXh50swKC0sJSUuOTk7bry7 wrWvuszLzW8/P09HPErm5vzMure+u7CwuLu2s8He3HJXNScrMCkjLjlEP1G4tL+8sbjKe/Lc QDlFS0JOXtPFyby1ubq4trO7xbbA3np76jsvKiwtKCo1QEJM17u8x7y3wtfo82dKPktqUE7e y77CxbW3wb+7trvOurnp+f/eQiwmMDkkKjNRTT/bsrjbvri94UVr6UE2WVhOXGy/u8zAtLzB wbuvvtC2udNl/c9GLCQ2OyQqNGBTPmCytt7LvrrTQmDeTTw9aNRMTsi4xdu9tLvOwbG1zs62 uPFM09Q3IyhBLiUoReZGO86uut3PtbP7Q3PRRzg/dvFLaL65wsW8s7rFurO7yMrAw19Wck4v JC84KykrQl9CRcu0uMXLt7PTVGDrVTg6Umte/M+7ur26t7S4vL7EzdTe7lZd7GJFLzRCMy4t Mj88OUTexr7Bvre3vsvrfnhUS0lW++Hm3dbLyM7T08nL3NjKxcPIx8TH0ftZS0M7NTIwMTU5 PEpt2tbTy8TFzdHY299jYW5o/ezg1M/Mx8bIx8LCw8LDxMzW2eVeST8+OjY1Mzc7PkRPXvba 2dLQy8jO2+La3OXx7NzS2t/Z08vM0s3Ew8bJy8nM1N9qV1JGPT09Ozo5Oj9DRkpQbOvk1srH yMnLy8vQ2t7f1tbf3NXOz9fPyMfKztHOztp6YlpUS0I/PTs5ODk7PkJJV3fcz8nEwMDDxcjP 2dzn+/hzcu7r59/b1M/Oy8zPz9DV2elwZFJLSkM+PDk5Oz1CS1Nz3M7JxsbExcnN1N/v/nRp ZXbv7OTa1dHPz83P0NDV09t5ZFtNR0ZCQD89QEZJUmR33NPRzdHc5X7o7lln5vvn29/OycjE yMjCxsjFxMjQ/EtFQDQxNTY9RUJP4tXIy9XJzOZrT0lYXVlx3tzCvMfJzc7Fzf3e0c3EwMXE 0E8+OzAvOTdCVVXey8/M13tqV0tHSkpm2tHGv8PBwsnSZVze2dzX0sS5tbzYUTs3My4zPEfu 1dHIy83aXUxEQEFFSljVw726v8jI1+B9VVZu4MnBwcLBvb7KVzItLjRJU1D+28u+yd9fTE5P TEdIU/fKv7/C0eXd7GRjU1bw4sy/wsnP2tPP09hKLzA7UMrPVlRb38LPW0pCVNrT6V1Y7cfA yOZPTmXs2N1pW+jPx8bVclxi18fK1j4wOkTZwtxXU1fWwNloSUFZ4NfnT0Zf2srK9VZUXeHT 5fl978/JzNfubODIwcTxPjc5RerQ3GtbWuPY6mpNSVX84OtpTlPq2MzXfWNcbena39bQ0czQ 1edmaN/OyszeRzU2PvDEx9xUREVe4NfjWVNbdtzdZllm4czL2v1cY+zRx8vQ4+fg4M/Lz9ht WE9FQkNMYt7T3mxSUmRw+3hhXWX0+ep++97vdujt9Nvf18/UzszMy8rI0OlZSD88O0NVadjb 5OVw6dvp7VZKTE/22czO2/JhfXd67vPj29rY2dPMxb++xORHNjExOl7SwsprVEx5zcvPV0E9 P1fcx8PG1PXvfnRwdNTOy8nc2tfKuru+bjgvKS08Xb3A0+RJXN/Pwt5URDxDW9HGxc3c2ePr e2Tv49rNycTHxr++wvM/MCYoMk26s7vNRUJZ1rq/+0I0N03OvLvKfFpdadzQ19fY0cvMv7u3 t8pSMyYfJjfJrK++VjZC9ryzyUo0LTnvvre82mFUXdHS1th307+6tLW3vM9XNiUeIS3mrKy3 ZzQ8Z7uuvUsvKjL/trG11kZVT8u9281da723rK+3u3JIMSQfICxirqy28Tc+bL2uwEUvKTLk tK6x2k5cY8DC4HxN6bqtq62zxFw6LR0dJC20q623ODhD3K2xzTMlJTK/rqq4XldPyL3F0091 xK6orq67W00uHRweKbuqqLM7LznbrKe5NiQfLMaup7dnU1TFv8HfV8q4qaqtr8jWSCEYFxxI qaCqTSgnRa2gpV8lHSFSrqi05lNjuLrE6T/gsqSkrLDE+DwfFRcj1p+etjEeJNOhnKY9HBws z6iu2EtHurG41URcup+gra/eVX0hFRUdX52ZrjcbGkyimZ9OHRoo16utyFLZvbe8VU/Gp5ui sL9HQzEZFBwzrJmiUiIaJrWcnrgrHCZMv7K+bsu1ssBmQ9SfmqKv3S4qIhUdOM+fo8EtIic6 q6e+fy0sO/7FzLnVxrjWy9S0np2mue8uJxwSHk2xnKPNKiYxQbK+OzozSdK/0t7c1LG0zXvO pJyfreUvIRsXIe22p7RMNTzKurNmKSgmP7isrNNrTG21u7CjnqS0bykeFxYsrKCl3SYgOa+l qWMlIypoubG0zMjDub/ar6Sgobg6Hg8OHL2bm6wsHy3IoqXNLCEpR7WxxOLQs6qrtrixrqq+ RyAPDh23n5+9Kyo8sae8SCksVbGmvEtEzKmkoaa1xL3ASh4ODB2pmJ3oHhssr6CvQCMo3aWi vjw+tp6anKnb6Lu3QxYLDS6fma0oGya3naM+GBg0ppul7T7Co5ycp8jFs6zQGQoMNZqTqScX Gkqioz8aH8qfn8krK8Wbk5erWXK7rFUTCA/ClJW9IBwptp+2HhMqppqmSzRIsZyZo9PZr6a6 HQoKJKCVqS8lNbeksiUSHbacpFE/v6ecm6XvRbqlriELCiGfla4jHS+vnq4lFB+vmqgvLMSf lpejUTTRo6YlCwkfoJWxIh45qp/EHREjppemLivRnpSWo1U3v5+qHQkKLZmWzx4fR6af3xoU LKKbxSkxtpyWmKZpP7ihxhUJEMiZnzghLsOjrS8YHcyfqTwwz6icm56yXM6prCsOCx6rnL4m K9upqkYgHTqrp/cuSa2dm5+ryNu2qcsbDRFLoKwtJFarpc8lHSW/o7E+OMCinZ+lsdHAqq8r Dw0hq6F4Ii69pa04Hx46sa3xOt2onp2gqrrBr6tVGQ0TRKWrMylzralrJiAuv67IOTu7o5yd pLHDva61LhINHMKn1ic1uqatOyUjPbe1bzhNsaCdnaSwubGrvyMPDyW7sTgmPbenuDkpKU27 wVpA26ygnZ6pur6uqdceDxIsubktJDq7p7hBLCz3srdmOmGuoZ2dqLzGr6jHIRITJ8zCMyQr c6yudy0rVre0zUlgu6mfnqSyvbKpsToaEh1BvkgjITDBrbhKLjfNsbXUWuG5qJ+grcO8qaS4 KxYWJlrnKx4iOrmsuUIySbiqr8Re7bqooKi80LakorYsGRklPTkjHSAyxq+070Tqr6aquuTr yLKsssDEr6Sjr0skHSAqLCMeHylHw7jI3MCtpqetu95bfcK3tri1rquruTwkICUqJyIfIio+ ybq5uLGqp6asvmlO2b23vcPAtq6xzjcqKi0vKiQhIy1KycLHv7Wsqq23y9zVxb6/y8/Hvbi8 ylZAPz47LyknKTA8TlxVVubFvLu+xsvFvLe3usC/u7Syu9RORUhIPjErKi41Oz06OT9vxr/A yMe/ure7wsa/uba5vsrT4O5sU0c/OTQxLy8wNz5HV2vhysLCyMnEwL+/v8HDxMC9ubq9xdPc 81c+MCwsLzM2Nzk9Rlzlz8/PzsrAv8LM0su9t7W3t7e5vMn0UklDOjIvLi4vNDY6P01208fJ yszJxMLBw8O/uri5ury9vsDJ41VFPTs1MS4uMDQ4O0FMZNvJxsK+vr/ExMfIzc7JxsfN0s3H xcXL3f1xWEU4NDEzNDY7P0ld3cvIysjKxsXL121gb/Lf2dHNycG9uru8w87U5mNLPDg0NjY3 OTxBSVr04uHk7dvb4fl1/OrYz8zCvbq5uba0tLa9x8/gZkI1LystLi8vMTc+T+/h3djNxMLG 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 z0AoHhsbHyxEzry4tbGuq6mssspHNC0tNEFwy8C8trOysrnE7U1GQ0hLT2bnx7q4tLrHej0s JB8eIio3a8K2rqysrbTC8kU9P0Za5tDIxL65trGxt8LxRTo3OD1O+c7CxMXVa04/Ozg2Nzk8 QlvfzsfM0+RiWFZXY/jn3tfTysS/uri5vcnZbl5dX/fm73dnXVldXFhSSEI+PkROatrNycvV 8VlSTkxXW2Fz7ubg1dTMyc3P2N/0+uvs5+vk4ufn+XRsXllPSUVGS1zq1svKzdLfdF5UWGFm bXX6c3Pv4t3Z297p+Pxyamdw++ff6ujq7/Dscl1WUEtKTlJh7d7c29/xdG1jX2h67uPd3NXR z87S2N/p/nBtbXRubmZncfnt9H50b21jWVJPTVBWW3fg2+Lt/WJcXF1ibH3n29jU08/P0dXa 3eLn8f9vZGRofO/k6fp4Y1xbW1xeX2RnbXj9/XZvdGleXFtaYvrv7d/e393a2dnc4ux+/n9s ZF5jcPTf2+Hv/W1sbWxqa2VfYWJse/7z8H19+vt8fvXt7O/38+/p4ePn6ezwfGxlZGRlZ2lx /vz2/X15/PD/cG9qZ2xyd3b/fn31+Pf3+vDp6OTg6PtvavXl39/l6Orsfnl8/21nZmVjZm5y 9u7x9n5rZmFfXmVlYmZu9+fj5ejn5+35+vf8e//v5OLc2t/m7+7u9m5qX19ramht/Ozo93Ft aWNeY2pra3388ff44N/c2dzpd2Zub2RvfP5+eu3r5+fu9PRtaWdfbfn8b3r39O5waXZ4Y15i X2Zz9+no3NnX2uHr/v1ycnFve378f/Pn6+7o8PZuYWdubGxoZ3J77+rq+mtkZ2piamJn/fjp 6efn4tvc4+/8Zl5jbHb88unq5+Lq6+bt93hranTu9/z6cHFta2xrZmBjXmdvaX3j3Nvd4uf7 dP98d/v/cnH47O3z7/dwb3B8c251cHvy7+zw+P36f/j0bGhkZGtuc3n13+R+9/n57O7ub2t8 en/6/X3t7u7v/v9ybW1wbGZ38+7v6+/+d3B2bm5qZmxuc3J26d/e4Oru6/V3//nv8HN0+336 9X79dnJsamxxdnl8efbw7eju+/79+3p7b2txe319+Pn3fHn9+Oz2dv348e/1cW5zdnV3/nd8 fX55dmxv+Xpz+fL1+n9++e7w9vj3/3h9+Xj58Xp8+ft3bm5vbGx1//96dnv0+Pzx9n/19/f2 ef/w9f55dnZ0c/x8dnZ88vd/7vTy9Ph5bHV7e29taG10cX36/3/87+vp6+37ee/s7v90fvPv /n1sZGtuefP7bnJuZml0dP/18f98+vTu7/f57u/18/D3eXp8b3Z9fPx6+v3+f3F1d3R88/V9 +f54fX76/Pfz9Pz7+nlvfv51fP9zb3l8cXZ9fX37+vfy9vjy8H59e3n78/z49HxudXx9/vDy //Pw8fr0/Hv/fHl6e29pb3X/935+fnJvd3psb3RsaHvy9/rw6/f16ubp7u/v8vTy9358fW1t bW1ydHV2/fbt8vH6dnX/+X7/d3BwcnR6ff33/X72+vt4fndu8uzw+fN7dHh3/fv9fHj+/vjw 9ffu4+rv7O78ev3+d3hvbGtnZWlucnb9+XZ1+Pz99/Lz9vjy7vX7dn34+PDr6fj8+/fw9v9u bnV7fnpuZ2xtamxsbXl6c3h1ePTp6vLu6enr7u7x8Ozq6/d/+vx1amtzfHR5cm11eHNzbGx1 eHRy/fB+bG95ffv29/r38e/7cnP+8fLu7Ozq6vR8enp8+HtpaHBzbnj0+Pt6fv749Xx2cG9x /Pb/dXp0cvnr8O79/vDw+v99eXBsbnJ9cnvy/fnz/H756+9+/Pn7eG949fr+eHBzfft+en31 8/T9ePv1+H3++nt8e3r79vX+cXF0fP/9fnZu/vxwfvD1ffv6eHT9eXB1/nz9/H1vbfrs6/t8 /fzw5+n68/9wcf70fPn07/v67359+v/++fx7cHB0dmtnbXRsbXl5fO/w/fj18uzq7/v58/f+ dH57eP78b2hpaG1y+/P7ff/27Oz7/n/9cm7+/Pjz9/X3+PLu9Prx9vH17+7u7397dW1maGll ZW93bG53+e/2+vX6eXF2em5x9fV/8uXk5uDk5+j4+PlzbfXqfnR3dXdubGpoZGdrbW527/T7 9O/t8Pfu7vnv6+rv+n/v7n52fnVpb3JvbXZ4b3n+/Xx/9+/r7fH093pzdHlybXBwcPXr6uPp 7/Tv+vv0eXR3/f92bGtmZ3J6dWxrb3l6dnv8/vfv+fr49fz67O7z7/P27O/7+e/u8f5vcP56 c3Bubnl+dnF7+Pr7/Hpvcnhydnh+fPz5eXb17vT8/vX3eXR+/P/9fH708e309O7u6+ju/Xd+ bmZvbmZgZWRdXmhrbH7x7/Dy8u7r7PX3fnd1evH5/ezf2tfRztHa3udvXFlZVVFPT09PT1BV W15pcvHl3drb29zc3+bp6O91dfv2//3v7+jd2dfY2dzc3uHo6uzyf3t7b2lfWlFKRUE+P0RK VW7h1M3JyMnKztDW435eUVBWWWDw2M7JxMPDxMfN2OR6X1hTU1hSS0U/PDo7PkRPbt/OycnF wsLDxcrT6F1PS0hNWGLv29XRzszMzc/Z7vNrXWJu+Ozd0s/R1vtJPDY0NDg+SVV11cvCu7i2 ub/QZko/Oz1ETVj30MnDvLm5u7/J3XhfXGBkZGNUSUE7NTM1OT1GWfvax7+7t7e7wtDvVUlD Pz9ASVjpy7+7ubq9wMnP3PB8bmFaYPze0M3iSTQrKSovOkdRW+LIu6+rqq6820s9Ozw9PkBI Vdu9sq6us7zJ1eL4b2tbTlRgVUtIPS8pKi0zP2TUy8G3r66tr7rhTD88Ojs+QERaz721sLC2 vsXLz+FyXVRVcdLL2GNEMickKC0yO05v2LytqKirsstNQEE+NzY4OkLdt6+vr7G4vb29x91u YFRa3M5uQTctJCIoMTY7Te7MuaukqLHA+UY/SEg5MzdEasOxrbG3tbS5vb7K62Nw4uPfY0E3 LSYjJSwzOEJY0LqspqatvNxaSUVCODE0PvvBtbC1ubm0s7q/ydDf9dXN0lk9OC4lHyQsMDRB ZNC+rqansMDR9VVOSDgwNEfYv7i1trazr7C6w8jGz9jMzW09NjQpHx4lLzI2Sd3GtaijqbvS 1t9aTD80LzhfysK9ubWyrq2zv8vAvsnOz9ZLODQqHhshLzYvOF++sKagprfVzsLePzEtLTZb xsfSybSrqqyzwcm9t73X7NxvRTcoHBskNDIpLUu6qqKgqbnCt7XjNSkoLTpv131uwqynqq+3 ubm3u8765czjRi4eGiAxOSYhLeatpqOor7GsqLVBKygtND9IPz93sqiqsLOurbC4yfP8z89x PiodHCo/NiEiN8Wurautr6ynqck3LzU/NzMzOErPsrC2ta2prrjBycvOxdJYPTMqIicvMycg K0zBv7yyraurq7fba/v8PjM1P09W3Me9ubGutb2/vcXsY1VQRzgvPUA7Lig5VPc+N2LBt8TK 09PHwb7oW2nPz2vv283PyMLKztjN3GdgcH1NTmXj5nv77dzi+045O0dPOzY5Oz1Gcuhv5MC2 trm7ur/Kz8/vVFJZXFV72e9t5sjDzeZwcmV1Zko9SOf1TkdV/PdaVFRPVlRadOXqfHzg0tHe 6uTpfPji5H1f3cnKz9ra1MzW6W976XJmXGZfXVNNUlVOUFJcXG3h2eJrcevZ32RWXm52XlRa 2dTgfdXHxtn33M/Ub2bi6WVWX/5oVUhLW2JXWerZ5O/Z1tXh6nVtcHdqZHFrXl9t39XZ797v 4u3j4G9f+uj6amr0YFZZVWFRWV1e8uXe43zt4O9mXPV/fO923OPd4d/a2N3f6nDt4enyann5 7F5gdmdWZfJVXmLuWFP84nLv9lnrff1XZXtxXerk3HbQ3mV71N5y5tnk49nX+/r7/vX7bW5n S1rpa2tP5GbeflPYXvtqXtFdU9ndWEvOzEtZz9lNVcTeVMzOWVzL1FHT3k/k5+nrTdDRUtXj XWdlx15D32U8Rt9ISGlWRnHG7XHGyODSxtDe0NN9fN5sW3RwZmh1amtz7PL18fX3b/91Zmpn XF1bW1pda3rz/O7k5+rn3t3d3N/q63xudPp4aGt8bGn/enzs6/v7+XVudWpua2RcXGNobfvz 8/Dq6uno5+Tf3tze6O/39/V4ffV6cnb+fG599/txbG1sZl9lb2ljbHl0efz2/vTudv/5eHX3 8nz55+v87OXr7Ovk5vXv5u7x7On5cG9vc25raGJeYWdueHl2ffd/eX5xZWx2dnj45e/78ff4 9/r4/PL+bnD+9Pvx8ezq6erv8u/n6Orn7nZ1/2tiZmBeX1pbYmhpdn729e/q7u7u7uvueHf5 9PP29vPu6ebue/jv8/J89vd1bmxlYGRlaHF5d3n08/jx6uvy8+vzdHR4fvn57f18+3rz8fnw /H369vP7d25vcG1tbWtsdH3+dX19bnN38/T87/D49vDp8n56b253c3b5/fHr7O/4fvbu/fz0 /nZ8f3h6fn5xaWVqdnFiSt+7PejCQs97UMxcZelb2mv75Wvr6f1l7NTIdjO7zTjCM/CrK2/G O7I4Sq411787s7lEyVbHwDnEPVHHNFxsTthHT8/L3uvO3c3eXmxZTmwyTbs+3r5Nt8dRut75 3UZ7RUzaOtnLPsHg8czTw16942TO9edi2vVJ31A9TDhJPjZGPlheSNjHyMTKvbu+wcnGxM/0 yPTJ3+i/y8q+zN7P50cyLjctKiYkMjk5Rdm1sK+tq6isusHQVEs+MzY+REdfysO3s7S2r7W/ uMXM22dIOzYkJC8lISYrNUP0zbenp6umqKuuykhCQzQqLTk9Uu/JsKusrqyrr7fIyMFsPDo0 Kh8lKR4jJyk+ati9q6OkpKSpq7XvQD83LCstNURe3ruvqqurqquuus7P5kQ4MC0hHSknHiYp M3rOxq+joKSlpqqtwUI4Ni0pKSo4T2jMs6qnqKqpqKy6zNBsQTkvKR8eKiQeJSk2c+bIraSi pKepqK3ISjs5MiooLDtPXdG2qqerrampr7vIzOVQPDQvKCAlKSMlKCs+c+/Crqikpamqq7HJ Tz46NC0sMkFV9Mq5rausrKyutL7Rz/s/PzkxLCUnKigoKS04Tf3Tuq2pqKiqq6651FxLPDc0 NDpEWOfLvLKvsrKzub7Oy2NZUjlKPDM3LiwvKystLzpDYsu+sa2sqqyur7rF2lFHRDw7QUZY 2tjIvL+5vsvBz8zfX+VXVk5KRD42NTYzNDM0OkFOX9bFv7q1tba1vMDL33VbUFxZW/rfycfJ xcnH2Nb+7W5wfUpfVk1NSkhERkNEREQ/QEZHS09f7tLMxcPDxcPGz8bOzMzMzs7Pz9zg7m95 f11vUWZbWFtXXVdoZ2Rh8/9hXFVRTEpHREZGSk9cXu/X08vMwr/Av8LFxc/K29/vbPhsVVZT UExOWkxTX2rw5N/e2dTx6+lz5mtYX1BXV1VNUllfam/s+NvU19nk2Nrb3ePY793j5fVc+Xlg fmdx/WvdWuV73nLid2/o1O7XfOHk4+5cYFdgWVNIUEdaVVlV+3zg3OXZ2tXa3tb05t932Gf+ 4XrtXWrXZeFw99Lpzdjez3rH5+n7ZeNgU1pGRkpJS0lGVU5vb/Hz2eHS0NrM8dTi4utoante 7nbi6tfW3svQ0dfYztnU4/73ZttdW1dabk9JSEFGQUJERUxQV+vl69rYx83OyNLN1NXU7uvt 59Xq6+PY0M/Q2Ojdy8/edXtqWehkT0ZBQz9IOzo6PUxJVl741sjCwcDGwcrDytrba+h7bWZo XvjV8tHbzeHOy8/V39jo29zpaFlLQTw5ODY1NTg7RE1m3M2/u7e0tLi/yM7afFtUUEtOXGXq 28zJysfJx8bU2drj2ttsUEk/OjY0MjIyNDc9SnbMwLq2s7Kytbq/x9leSkRBRU1efe7f1cjA vr7FzNfSzc7O5FlIQDo2MS4tLC4wNj1N58W4sa6trK2xt77OflFFPjs9Q1J018vJxr66ur3G 0NjV2fFgSz85MS0rKistLzU9TH/HubCsqqqrrbO7yeZWRTw6Oj1FV+TMxL++vr27vL/J0+9h VEQ7MSwpJycqLTE5R33JuK6qqKanqq+3x/RNPjc0NDY7R2/Lu7S1t7m4uLm9yOFcSD00LCgm IyMnKy86Uc+6rqmmpKSnq6+62E08MS0tLjE7Tt/BtK2rq62vs7i9x+JNOzEqIyAgICMoLTRJ 1rqtpqOio6WqsLrPTjkuKSgqLTpZyrmxraqoqKmtsrvJ9Eo8NSwhHR0cHiQsNErPuKujnp6f o6u5y187MCslJSkxRs22raupqKinqrC6ye9YST42LCMcHB0fJjA3Q9W2qaCcnaOrttNbTDkt JyQmL1e7rqurrKupqauxx3BWXXZxWD8tHxsdHyQrLy47z62gnJyjr7zI4/dELCMiJzjJr62v r66rp6m00VhK7L66yGZLPTQqHx0cHiIsOFy8qqCenqOuwupAMy0qKSs0UrytqKiqrbG4w29P ftzMu7e7vLrMPCIYFxoeJisuSLSemJmers9TRzgrIiAoO8WtqKmqqqquvVU3N1HGt7Owraur r9spFg4TGh8nLTe9nJKTnK1XODgyJB4fK3mroKesqqqttk4rKjZmvrCvsaifoKvXLiEaEhAW HilJuKmemJmhuUUoISQnKjrPrqKdoK7SVEw+Ny4tPcarpqamqKmor98wIiIlIxoUGy/Fqqm2 wq+mq9EuISRDu7a+v7mtp61dKygyTMvH2Mmyqamus7i/vLvIRDk7MCccExcmTr25vbmpnqC8 MyMlM/K8yc+4q6ivXSkoPdC5vMrEsqiptcLNy7iwu1M1My0dDxEcLrqrq7ConZ+zPB4aJE+6 tq+2taur1zMtLkW4rbe8u7i3trvJ38u6t7fiMSspHxYSHC3CpaesrqmosmYnHB84uquqrrqy sL5TMy0sX6+srbrP38y8wL3Dzb25s75UMh0WEBIiQK6op6enoajMKxsbIlOso6Cmqq213S8h ITDHqqavyHrjw7q0vtXIurG52DYeFg8SIUqspKWqraqvzS8eHCJIrJ6dpLHH51Q8Lyw07q+n qbheP0nOtK21y9bfxMhGKx0YFhwzy62qsrzAuLjGSC0oLl6vpqSrwXVUZupnQzc93bWstNxB PGG4qKm521di19tPKx4WFR4zuaqstsa7sKqwcS4kJzy9qKSqvNX1Y9vpTkVDTunBv8XL08K0 sLbAdkM+ODU0KyEeISxLubCxu8W+ubS2v108ODdF1by2tLzL1Nvd2v5VRD5CW869sq+zvcrZ 7m9WRz81LSUfJCYwRtq6sqqqpqmtu2g8LiwsN1nEta+zuL7IytTvVUhARWDMurW4wM/y69XU b0QxJB0cHiQ0arqspaSjpquyx082LSouOlLJu7q7vL68ubzC4Ek7O0jfvLi5vMbIycrnRC4f GxobJDBgu6mjoJ+ip6/ESjQrKCsvQeS+ura2uLS0ucPhQzk8SdvBvLy+w8vMz3A/KR4cGx4n NXS5q6afnp+jq7xUNiknKC04TN7Fubexrq+yvuRFPT1O38q/wcTEx8nQZjgmHxwdIis+7Lyx qqWioKOquOo7MC4sLzU8SmTXwLSvrbG911RKTW/ZysPEv7/GzuNNNikiHx8nLj5U1cC4ramj pamzylk/PTk8Ojk7QmDLt7Kzu8nV4Nrc1t3azci/wMjqUz80KyUmJiwyPU7ywbuvrKuttL3V 905JPj5CRVhh0sa8uL/Lz9HWa2TpysO5uLq50WRDOSwlHBwfJzlmv7mrpp+fprRbNi0xMjc7 P2u/rqyuucrP2uFQPzg9Yr+wr6+yt7W+XzgnHxwbHiUxS8uzqJ+eoKvHRTMtLC4xQtq5raqu tbvI0VQ4NTxN18bCs62trbPL7k04MyohHhwiLT933byvoaKks+JEPDw2NzRK1rixsrvAvMDJ Wjs9T+/Y39K1rKyuvdHO7kkxJh8cHCMrM0FnuqifoKWxwedKOjAuMknmxru3t7Szvs5WRk1M TE1ezLSws7C5urx4OS4oJCAeISQ4Vce5s6ino6y15lZHPDkzOkXdyLu8u72/vdP5UkRJUWHf v7m0tbW3uchWRDYyJhscISg3ODzdsKSfoquts7rNQi8uLzU+PUPeurCts7e3usXmS0322tjU 0se9xddwTj8xIiAkJSwqLDjQsqelqKWlpqy+Tj81MzEtLTdJ1L27tLCusbfH0Nvl+21h7NXd 6mJwUUEtKConLCkpLUbRs62tqaelqK7F2FZIPTUvMjlJY3rWxrm3uL6/wL/G3lRe+PteUU5S X1Q+LjAwNjYvLzhby7m8ubWura66x9Ld41lIQ0ZLXFpfd+Xczs7Ky9Dj3Nx6eF/9burieFt0 YUQ6ODg6Pzs6PUz3ysnHwbu3t7vBxcjHztx2Uk9eT01OTWTi8+7d3d3Z/X5k6OBu4V5Y+O/t c1NWWldQSUQ+QEdJT1tt2ci/vLy8vL7K0tpfcVdRWktaVllyWH70XNxv4Ploz/nX5f7b0d7P 0N7y4WROTEZGQT4+Qklbe+DYzMrFxc7NfuLQd23sXW1o/vZ2aWx0fe5WWm7c6dbL2MzIx8rd 1tVd9FlPWEpJREhFSU1FSVpcffnv8N3Mzs/N0NPP0+fvflhhU1xWVmb56efdztXNycrRz9vn 1mBqYVdeXmRfXWtgX1pTUU9ZUVRPV1/25+7e3+7a3/FobXFu5Glc7N3t2dvd28zP1s7Y1uDf 2v10X/P0ZVZkbk5gVlpaWmlmXGJk/OtvXV9kfHtfanhe7nhoZeje9dTq3dvP/Nn02Xx+7ejc /d/w5ufi/uZwd27udPBqVmBh/FbtX15fZWV+YmNsXmFecGr8bv327u9ze3796H3b6u7t6efn 7Ono7Njm2tXO/O/a4vLg73J1aGdodVNaWldiYlpfe2x1W3Fjbl9XXF53ZOppbWfq5uvn39fr 2nrc3tzb3Nna19bi7tfb6Odp8O5Y9GxuWmxlXGVe9mpxZmNaXllZU2RWVV5iZltsamrp8+zW 9d/s3n3c29nT1NfgyenL39vt6eHy5PXdbtXu2HPp3tvjXlVKTEdGPTw8QEVLUF9q39DNzc3K zs7U4/Ps9t3k6t7Xz9HR1dHK2M7Z3eTe1HbtWXFWZ1tOT0tSRkg+PTw+TEtVV+vXysLIycvI ztnk7/xvfH337ubu5Nzd3+Dc19TV1dPT1t7vfmtlXVxbX1dUV1VPTEtJSEZJSUtQXGf47t7T 0c7NzNHU2N7f6PHo6+/v59nZ3N3Z1c/NzNDW1drrfXtoXl1cWVFOTk1KRkRGSEhLSkxSV3Dp 4NnT083Oz8/V29/j5un4fPHu3tfW1NPMysrMztDT1d98b3NoYlpYUE1LS0tHSEdERkpOUVhf b+7o3NXX1NLW29zf6npr9u/1f/Hi3NTRzs3MysfIyszO0djjfGlbWVlXTUlMSklFRENESElM T1Nbd+nc2dfW2NTU193i4N/p4uDq5d3Z19PU1NHPzczNz9DW4Ol7X11bU0xISUpKSEVCQkdL TldaYXvg2dPP0NLT09nd6u/0cGtr+uzk3NnTz8/MysrKysvO1dzi6nleXFZLSUdISURBPz9D RktQVWJ64NPPzc7W0s7R1t3r+HF57+rk6+je29XQz9DPy8vKy9LV19vj+1ZMSkhFQT48Ozs9 QklLUmjq1s/KycjHyMnN093o83RrbnFweX7v6N3Xz87PzsvJzdDS1t3jbVROSUhEPz49PD0/ R0pQX3Xe0svIyMjKycvP0tvrfm5rYmV0f/Hu6NrSzs/Ny8zMzdLY3dzuXk9LSUVBPzw7PD9D R01XbOvXz8zJycnMzc3O0dfd7fn1d3p4e/Pt49nV0c7My8rM0NTW4G1YT0xJQj47Ojo6PUFG TFl+3NDLyMXDxcfJy87R2uLm7PJzZ2dtb/7g2tbRzcrKy8zO0NTsZldNSEM/PDk5ODk8QElU at7OycXCwMHFx8zT1Nnp/2pqaG14cXvy5tvQy8rLx8TEw8fS611PTEc/OjY2NTc6PURKVHTc 0svIxsTExcbKztrc8HB5Zvrc0tPMwb24tbGvs7rKUTorIR0cICo48Me6r66rrLXMRDczN0hX b2hqx7u0srzJcFBaZuXYyL69tbGztL3XTDctJyAdHyk+xbe3u7+8urrNSjgzP+zAt73bdNLB vr7cTktN58bEx8vDvri1urq/2Vg3LComIyAmN2S3tLu/1crFyN1IQD9Xx766wtdtX83Lxs9S VVnqxsS/x8O9vLa7xcrY3lM6LSIeHShSxLO+fGHYu7e9WTIzPdS0tcDtXW7Kvsz3Tk/gzszL zc3GurW0t729vcxfOCkfHBwnPcm4vNLv0cC5w147OUTRubfE605Wyru7yl5ETs29vMtkfsCx r7S9yO1UZUszIBYWI+OqpblDNV+zp7BFKig/tKWrzzk3X7mtuVQ2PN+1s8ZTSuK4rK660uDi b2pFLSAZGyhkrq28TEP8u664WjIxRr2usc9HRG/Aub13UlDxyb7DytPPvri5vL3H3FFJOywh Gh0q+bCuwUhDYLyzv0sxNFe1rLHQS0pc2L283FdPd8i6vsrQz7+5ur29v8HUPy8nHhsgMPS0 us9VadC4ue8/ND3rtLO93E9i28PJy/Js/9rDxsfWysS6usDGw7jGXD0yKh8cHizhsa++W0z0 vbXCTzc6WbywuNBcWerCy/xcYnXXydDQ1su/uLvGxr+5utQ/MyolHx8oP7+1ttJWU+PBwc9K QEngu7i8z9tjXt7Vx+V2T+nOxL/Oys26ub3Hw7/Vbjo0KiMdIDfbrrXLQT9rxrLEXDk8WcGy vcb+aPXVzuniXtzMwsfT3dy+t7G7ytbLw9BTPC8kHBwqVbCwwT84Tsattd82MkHMrrXFWlXd wL/Y8khoyL/I6lpXwLSwudpi98W9wVE1KyQeHzBUubnNRTxnxa61zUQ4ROS3ubzNcNvT1V56 T03Ky8Z2aV/FsLSz3mBNz77O2jcvJiIhLfnEtdpHPFi6sa7PRDg+2ry2w99o5tLXze5OSOrE xstSWtq3r7LCTU5hv7jDSjAoHx8qScS73jw5Vrqtrs4+NkLMuLjOYlzOxvpvVVrjv8DlXkn9 xLSzudNGV9K4tcU+MC8qKigsO9rD3/5K8L2xt9ZHNkPbv7jC22jQzujT7ejtV2X+zezez8Wy usVLTO/Es7lnMi0oJyc0RtfIX1hQwbmvvFxBPWrPwMjrf97MxcxOR2PMw8hbPk7XubK4zlhT Zsa1tsJKMDc7LyopLkrBvnRTTcu0scdCOj3ew8TWV+7Kvb/mST7kyM7aS1P2vLu8v9/g6srL vLvGVy4yODIsLC9EzMFzYGnNt7nNQkJD5cPKz/DLy8PKS0hKzs/Kb0do3by/vs3OzNK/zMXN UT87PTg0NCouT8bB41JJyra+1z9BVsa/z9X1xcDD3EQ9X8jJ2nNLa8/b1M29vr5pVvHlzMvz RUE7NDMuLkDMys5WXN+5vdxbRu/bz+nTy87D5VpWVGHuztPQZU5808nGwcC/2FBMZNHGwllG PEI9MTMwYOTeTELpx7bSWVBgz37+W8W+0OpZa1rK6ufe3NdtX1XFw8LN08vO7VrkxcDQSThf 5zwxLSw/y0tEUsW9t9pM59nUVltmv8ZbenLcxNhRWtjt31tJ2sfN+9DKu7xqWcbJ2MtST17x Pi4uLzxOS0Riyr/E1PLS5nZVX93DyGXW1c/bWF3fy09xXu3a3HLgvcjJzsrMxXVvzeJZUExI NC8uNklGSFjHv8TgfeHdbVNh2cnG2tvWyMxWW8PeRkvj5tlubsvAy8/GyrzU3NbkWFpOQE8z Li86P0RSccO/z9LY1Gb8VuvV0NLpzM3d1HT5cORbWfh72ezQ3cTGv8TIvsTOXt9xRUlPNS0x LzlGQkrWwM3Ey9Dc9lNe29nO7cvD2c7dVXPPXUR41u9h6dDBvsC9wr7G0+7beDpSTz4qLDM7 QjVN077by8PD1ltlfd9m5srJzenTymxc19JNUO7c+njbwbq/xL+7vM7kzkY8PT4zKy8vRz0/ T8fC2MXIw29bXnBtXMzYzczOy85gbsleVnTxYt3e1MC7v8K7ubjZbeRHNTk8LCwzNEBKSnPK ydG+xM/d+mBVXmLP1ubO0tTjzt357N5zXeLfz9PAvb2+u76/zE5DTjc2LisuNjg5ZODVz7+/ wcrw13FVSGnw8PbTxuLKxtZwzM9ree/a5NbGuL++t7fM/NVbPS84LSkrMDw3THXAysO8usj1 6H5hS1h53mXWwMjVv83V29vv12hg3s3JwcK5sL/Qvmw+PjstKiwpLjw5S9bFw7i6vb7O42hS TFpRY93e1MvIwc7Yzcpiad35XtvCxMS7t76+xuNWPzcwLCgoMzE0SNLMxre0tMHGzupGS1hN Slrh3uHGwMnUxMje6tnXft3Gxci+ubnLx9TqPDE+KyUmNi4tQezKy7uxr73Jxc5OSVFOU0dR yNfwwrjDzcPF0e940svez727xMm+x3FLREAvJicsLiwvTX7bzLeutbu9vcxYUFdQR0Zl6e/T w77ExL/Czdze1dTi3czEx8zJ0t5qRj43LSosLi4vO1Dsy7+4tLW6vsHL419YUUlITF3e3d7N wL/FycnFxczZ2tDO4frp8mtSS0Q9Ozc0OTs7O0RXcd7NyMHBxcbIys/V33lrc2Vo++Dd39rW 2Nra3t/f4ufd1c/T09zr7HFbUEpHQ0JAPj4/Q0lSWV9r69rSz8zJycrMy87X3uDxanV2a2d+ 4tnV0tHOy8zLy87Z3uhuVk1IREE9PDw8PkBFS1Fe+NzSzMjHxsXJyszW5eXudGZnamz76d7a 1tDQ0s7Nzs/Q1tzofl9STUhCPz49PDw+QkhOXPzj1MzKx8fIyc3O1Nje83RseX7/7+ng2tbT 1NPPzs/T1dfd7HVnXFFMSkdCQEA/P0FGS01aduHXzsbIysjKz9fd5+TseX7u/P7o6unk3djW 2NbPzdDT09Xb5/RnUUhEQj49PDw/REhQWmrk2c/NysjJyczO1N7n8e9vZG10fPXq4NvY19TQ z8zLzc7T2NvqalhOR0E/PDo7PT9FSlBe6tfSzcvJycjJ0Nre5nt39P13c3V89+nf3dvUzs7K yMjL0M/S5WJVTEdDPzw7Oz0/QkdQYvDX087KycjKzNDX3uvzfnF8eXJ+7uvw5NrW1M/PzczN ztbZ3utqT0lGREA9PT5ARU1WXm7g1tTQzczOz9DT3OHe3+96f/l7bW1v++Xi3NfT08/NzNDa 3uP4XE9JQz8+Pj5BSExRZPHc0szKzMvMzc/Y4u55d29ndv51cnL+8O3j3tnV19LS1djg4f9f VE5JQ0JAQUZLT1ZifuTY1NTOzdPa3+Xt7XBs6vf47d7Rz9TVzM3V2NXO1Ong3VxNSj88PDg6 PkJIWO3YzMXCv8TLztToYlJPVFBRZv3j0M7GwMnKyNHl7OP7W132/GZrbEtJT0U+QUNCSllz 4dnOxsbIyM7V2ftkZFZSYV9f4dja0M/RzNXe1+V8fXtofvpw7vBVS15QQEZNSEVPaH/32czQ 1MrI0drZ4mteZGxlX+Xb6t7Mz+XY3PptaXFoWVpuamP662ps/nZqYW1pU1diVFRod2Zt4Nnk 3tPY5d/d8W7t6mZz3+n92M/a2svJ19/Z7k9OT0M+QkRCRE5kbOnOysvIyM7Z3OloXllXVVtt ePrc09nOz9rQ5G7pblZiZ1dXXG97bfrvb2j49mht+3BgZmleZXZvb+7f4uDb2+jm3uh1fv1r Y2RoZWd0aWZ69/jt4+p8/f9oaP51Y2Vvd3v06enr5+v5fvry+fbzfv718/P18/p1eXRpYWlt amdqd2pq++5+devr8Xt16/v+5+t8+f10eHBtcHH48/Dr7/9+/HVqbn1jYHFrb/t+9u3s6urm 5+vt9fhscv5gbHB0eGv5fHt68e378+/t/e39bu31eX14bllda19ieP107ePe3tzb3t/j7nVx Zl5cXWJb++5w3uLc2u7m7Gv+6WRv9GtzeG5vevX3funo/+Te9v7tfX34d/V1Ym9dXG9kbXZt +HVu93hz5Oby6uzn4ujg7Xjo/HXw+Xd26e7y4+b2++33ZE1f8kFc2VByzdTczsvR79LNWXbf TkRlSD5PTE1O+eJ018rX4snS6dfabmDxX115YPzu5dbe09Dm6d5uZXxbWF1cYWhu7urn1d7z 3t92aGdZS01QSklSVVVr7ube1c3U1c3c7uH9XWRuZVx733zXzt3Y09vt5PBrZXf2YvTe6+LX 199r9FRHSTw+Pz9GTV7y1M3Fx8nFytPa7lNZUk5SWmRf48zUzsXL0c3O3erf5XHb11zX2mXj aldMRUc9OUM+PE5eXN3JzMzHws7ZzOZWX2hPTetfYNnTy9HDwtnMx93czNre1NTa4NByVVs9 NkYzLj83OENf6NrEur/Et8TYye9TT1tNQGDiT9zAz8y/wczRxtH+1c7828Xp+Mj8TVc9MEAx LT00O0Ve0szCtbnGtr/c2NlKQlVFQ0/nXt2/xsjDvM/aytHz3MvW2NXM1+Lq5Vg8OjI7LS0+ MTdO2uHDtre8vrTG5tF0REZQQUhmYuTQyL/GwL/RzsrY28/OzdvMy+n15V9OSDUtNzQmODwy P+bGy72xtMi6tmHR1kZGXUVJb3nd48G9zr6+09TI0eHYy871ysZSZs5FQUQ8OCw1PS40U0xI 0MC9wry2xNHLzl1Ga3RITs/1c87FxdbCwd3cxcjmzcPN3sjNX2leYTs8QzMtL0cwMVtaW3K8 ucfEuMNjz9pqSlDaVlPYxd/Svr7L1b/N99HM2ePJx9bW2PxySUdNNjk9Ki5TLzdfX9zdw7W/ z7zHbuBj619Lftbf49HBv97EvOd23NridM7D1M+9ztvYP3dPNDk9NSwtSUEyS8nZ98S4vd7M vdVU5sZfV9nJ4E7CvevswsLpXdfFdlzHxsjX4LzsSVdOPD46Oz8zMDtfPUft0crfxbvM5s7P fmvs19hW98PcesvOzHztyuhn39DKzdPCvs3hzdZGSlNBPjFMRS8wRP84R17D21nNu8Vv28jG ZU3DylNV1r13T8u83WbOxM5b5r7N/dbJxNNY9eQ/TD9HQzg9ODg9S0BOaHrPz8vDxsfN0NHM 2tZy4OlT6eDd6dzQzObs1d7v18zOytDLxdhkb/FSPztJPzo0NT9LPkVl29rhzr7BzMzNzNfw bdnqbGr1fN3g2s7K2tnY3N333tnd4NvY4HpnXVpSTlBMSk5LRUVMTExMUWNu++7Xz9DPzMrM z9LW2+b8fGldYWdrXl5x8Pvr39bT0s7OyszQ0dnk5/tgYF1STEdGR0ZERUdOUU5Yc+jg4d7S zdTa29ndfG5sbW1manT47eri2s/Nzc3Kx8rNzs7R4e7vfl9UTUlEQkFAQ0RHSk5TXvzp39nP zM/R0djk+H9+bV5gZGdrePjo39XNzczKzc/P0NPa3t3k7fljUEtIRkRCQUJFSEtRXvri2dLO y8vO0tjm9H1qZmhiZGx8+ePa3OHb0tTU0dTX19nd39vc7f14YlNNTEhDQkNCREdNWGT439fQ zs7Pz9Tb3+jx7O348/L4+/357OLe3t3b2NTU1dXa29vj7n5oXFROSUZDQkNGSUtQWWZz6tXP zc7Q1Njb3t3j7/36fv74ef7x6ejk2tnb29PQ0Nvx2tbgXlpdTUtEQkVIR0xaYPf54tjS1NnV 2+H+e21cY2lybN/z4dfd2tff5NzV6OzYzNXTxMjN12NYSjc9PDY4Q0lY3dbExsnHxuR4X05Q TE1Z8XPOyMvDv9LLzu5kZV1dW1za6PbWztfS2t/bTTBSXi80ZVQ+dcq+6Nm9wlJwzVZFTmh7 UW/GyeLGvM/P19fdWVjjZEzj0PDjy83X51lLPzo9OjpCTVPiy8nCxMbH1Ph6V05TTk5mbN7P y8nEyNjT22lXa15ZbOvi8NrS3/rm+V1XVU0/SF5KTWvoYt3Pztzb1e5fXulXWuttY9LX5tfR 2tje33h5/G3z3dbbzNxaZV5FPkdBQEhcfPPTysrPy9Tpd2NST1VOW+ra1crGzsrO5eVjXl5j U3BmcePn5OnibXpdWlRTU1tla3j77/Fv/+RcZfH6Xf/tbnju3v3dz9bi0s357c/pZN/ZeXfg 4U5D7kc6VF5EStNkdtbG2ezP125a4FxQeeFx88/Z0NXVzmzs3l9N3GFO7e5cbdLp4+jd7HJz YFRVa1dY81pX31pTb/dbe+B05Obf6ed4fu3g6m3a2+bV1dnXzd/X0t7f3epGR3M+O05TPVLZ WnLOyvrTy+9e7/FNVPZtU9nH/tHD1t3N3HBzbF5eXP5teN3o9trXeuXnXV9rTlNLUFpIVX1r Udbfbdza8f3d/PB28PXm4tr50Mpz0M/la83o5t3a1eXN0GM6VVouPlQ7N9XiUca/zt7BzWP7 4VFIdlVK08/yzcDM4sfPeXvZZ1Hj42/mztrPz9nT7Tk+5Cw3WkIz1spKyr7Ha8XMXVjb8T9h 101Zwcpxvrzj1L/lTt3oVuTWzt/RxlxPUz86Nzw3QExma9jDzcfIyuHk71tUUktYcVfRx9XG v8/Hzt/UePrd4dfK2dXJW1FIPDo3Mzs+P1Xc2si/wsfHz+b5X1NLTFhmXNrOyc29z8jG4t7P 3//B29XPz+hPbT4xPzYvO0k9T83PzcK8zdTP7FdZWUpIX+FM08HWx7nMzr/Y4sPI4sLA2NjL 70RMOjA2NS86P0Zc2sbJwMDH2tnvVk9MVVFM29fiwrvSw7vY3MPU6svFxsvLwl1eWzwvLkEq L0hJPc3D1cW6v97T12BJV1ZJR9ze4M27xsy+wvLSwc/kx7nKw77Y8lo+MSwwLys1Rz5UwsfD vLnL0NnoTkdSTkxV3sxvwbjNyrzL8cm8zc24vsa8v2hXRTAnKy8mLEpIRMC1w7y0v+nhz0o+ XFA9UdTK7sS5y8/B1+HJv8/Etrq9vrfpO2ouHzUuITVKRlK/tL3JtcNTZtU9PFZkP/jF97+5 zL++08rOwr3St6+/uMlozDcvKiUuJi0+SEzBvLy9vsTyUWVMPk1bSObI0cW/vcnIwM3XvrrG ua+7udvSzC4vKScqJzA+Rmi8vry9wc5aTllIOkltWWvIvMPHvMXPzcvGu77Csa+1uthsXi0i JCslKTVYaPm4sLvFvtROQEw/Okj739G/u8K+wMvazsW+v8SzrrWw1EjRLyAlKigoMGbW5Lmu tsTH1VA+QUI6Rnlgxsi9u9K/vu/Pxbq5z7Opt73SQk4rHyEvKSk46MDQu6y0xdTkVUE+PUJe bnHGv8XPxr7Tdsq1uM+4qK272k/ULRwiKykoLfi70r+trbzce9pGOz5GWFliyMHI1cy/zWLX urG9yqyls9hoWjMhGyczJio/v7jHu6uyzV1oWks5O3fRXNG+v8zWyMbf5b+vu8qupbBvVUov HRoqMikpQbqvyL6tr8pHTXVeODrtyc7Rybq+0OndyMe+s727raeuYzM3LxscKC4vLUazrr28 ubHJQTlZVzs74si8ysK3vcvV38W6tMDCrqmt2Tk/Mh8aIy8wLDTCrLW+uq+3VjNF4kA1Q863 wti8t7rL7cWwr8zRsKqwzEEzMyIaJystLzPVrre7ubW43ThBWT49R/i9v8i9uLi/yrutr8C7 sK7BYWg4JB0fLywmKkO5ssi/sa6+RDdXXD03TNO+xM+8sre/v7CtvMO1rrPjQjwtKR8gKyou OETCtLe0ub6+0Es+OUFPUlLbyL+7u7q0sK+3vbq0ts5MRzsvKigtLy4vOEd55NjIxcXBxM/h 5+Hh/Wt/5Orq6tTJx8bCv7y2tLm+wsz9RTk1NDEuLjA3PD9LY+3b2NnOy8zLy83P19za2tfO zMnFv7u4uLm6vsv5TT84NC8sLC0xNz1DUuzV19LHwcPIysnJzc/Qz8rHycnEwb68u7y/ws1s TkE5NC8sKywvNz1DWefTz83GwcLIzM7Ky9PSzMrJyszHwb++vb6+vsfeX0s+OTIuLS0vNTg+ SmHk1trXysjO0tPLyM/W0szIyczLxMDAvr27u77DzHJMQDo0Li0tLzE0OkNTafTn0sfFxcjE wMTKy8vLz9TOysnIxcG/v8C/xM/8WEhBOzIuLi4vMzY8Rk5W9dXEvr+9u73AxMnLzdff3dnO zc3Iwr++wMHEzOFhTUE7NS8uLi8xNTk+S1r52Me9vL28u7y/y9bW2uvr597S0M7Iw8HAw8TF zN15UEM+NzAvLi4wNDlEUmXezMW9vL29v8TI0eDc4PTv4t3Sz9LKxsfGxcTGytLfdU9EPTYz MTAxMzY7RVBs3c7Gv8C/vsHGydDZ2ODk3+Pe19XQy8nIyMrMys3Z5PNiS0Q9Ojk2Nzc4PEJJ VXvm3M/JxsnMysvO09nd29zj3NDOzs/PzczNzc/T0dPe/G1kVUxKRz86Ojs7PUFFTVpndOXU y8nJxsXFycvMzs/Y3Nvi+Glr7+rt6+fe2Njc19TZ6nxtYF1YT0c/Pj4+QEFGTVtrft/OzM/X 1M/ab0dEvam8PEG8uE5zssI+R7u15lbIw1hBZ8xsOzpLTjovNUJHQEVj0tbt3svBwsvPzdDU 3ffv1tDpWdzH1GTew9Vs6M/XbGXt3NhfZvn/bFBUT0xJQ0NAPkRRV0tLdNfb7NjFx9/ox8TP 3NfI3W7lz8zufc7WeN3a3HLw3HthfmpP8eJvZVZoTjxIVUA4O0ZLRUh1z8vLyb65vcbFwMXZ 7W5+3ldNW/rzaVdibNbgTWPXxdtM5Mfca+rP219g7009P0hEOThGXU9O58bAxsW9ur3FztPS 8mdSTVhPR0dacGd6de7V09Xe5MnC0/LSyNjl2v5VUk9CPDw9OzU5S2BcXtW8ub+/t7a+z9/c eUpGSEVHS0tWfeXg4M/Iy8/Q1dLN0Oby09Hm3uNeUmlNNzQ6PzcvOln4a3fJtbW8vLi3vc7e 9lNKRkJAQkVKUmrc2NbKwsfNycTDzdrb29/X1d7iaEc6Pk4+Lis2SUY7Q8+7vcK8srC4vsjP 2WVJPz5ERUA/THza3NrJv77CxMLDxMzb5+Pd2NFvPDVEXDwqKjtQPjVGx7m/xbqwr7e/yM3W c0g9PUJHQj5GYd3a28/DvcHJycPG1O/x4etqbdzRbjw4UXY8Ky1BVz04TcG5xMe4sLG4v8TI 0P1LPT5BQz8+SWB2793MwL/DxMTEzOH7fW1tXlz839viUDxFbU4zLDleSDpD1LvBzb21tLe9 wsva3WVCPkNKRTw/Wuz5c9u/vcPGwsHJ1+Ls6NjlXFFPT0M7Pj85NDZBTlFnz8C9u7i2uLu+ yNZ1V0xDP0FER0VGWOLd4NTIwsXJy9LV2OtpWFppYVxheOLg6OPc6VpJTVFFPDtCTE1Ub9fI xMG+vb7Ay9xzZFJCPURNSUZa0s3Oxb29v8DDy9TV2OXvXUU7PEU+NDE5RkVDWc/Cv767uLi6 wM7odVxIPT5HSUVIWfHe19HOysbI0tnV1/NdX2tmXl1qbnze29/d2d77em1dTERISkQ+QVBd X/jVy8fDv8PIyM/9W1tcT0VJXm1r48rEx8PBxMfHyNFkRj9APjYwMTg+Q0tq0cG7ubi3trnB 0u1sVUY+PT5AR1Bu3dHJxcXExMfS5fltWUtJS01OU2J55dXSzs3Q1eB/XU5FQUI/Pj9IVWXk zcO/vby9vsHJ2G9aVU9KR0tWYWr01czIxMfHxsrYXUY+Pjw3MjI5QUxi3ca6trO0t7m9yOhU S0Q+PDw+Qk9o6trSyMHBxcjN1977W1JTVE9QWmj549jUz87U3fdYTk1HQT4/Q0dPX/PczcTB wcLExMna/WlaUVBNTU5e5NzVy8XFwsHFy9XtWEY8Ojo5NzY4QVFz2szAu7a1t7q/x9b2UkI+ PT0+Q0pRcNfLyMbBwcXJz9npcWBaU09UbvP17+vu/nFeUUxJSUZEREhQaPDf08vGwsDCx8vS 2/FhWlRTVV7+5dvX0szLy8vO0NfgX0c+Ozk5NzU1OkJW3MvBvLi0tLW7xM/dblFHPzw/RkxT W+zSyMPCwsbM0+H/a2FYVVtdWVx85+xeRz0+TFpUSD9FX8u+wcjNzMO+wNFvUU9cXldOTVRt 29DV2dvTzs3M1Ox9dn1/dmdbXF5fVEhERkdLTEtLT2bj0MzOzcrIyMnN2vdpWlJSVVVcb+vj 3NDOzMnLztPW3enxdmNdXFdOS0ZCQkRHRkVKUWft2s3NzMfGxcnO1+/+9HRxZmpr89nX2dja 2NTW3ujq+f/z6v1iWE9MTE5NSENCRUpRVlpcbOHQysfLztPSztDS2eXy6Nva29fTz8/Qz9vv ZlpUTUdDQ0RHTE9TW2Xm09HU1tvh3+b3aVtaXGNv9PP27N3W0dHX2tvc3ujtb2VrePz7/Xp5 b3X/fXRtbV9cW1pZVlZcaGxub3Ts49/j7O7u7u5+cvvu/nFsb/no2tfd3N3g3+Di6vxsb3Bo XVtaXmxxd2tpeebY3PB6amJ46+j2YFleYm338XVeZPfg2+trZ+zVz9hgWGzr52xYU1Vv4t/o 8+jd1Nvt+Hv+7unsfGdr9OjvdGZfZ/z9bGVfZnno7XtoaO7m82hcXGzw6/F9b2ty9urn63tv 9+zt9H306uDf6+nr497m9H359W9hXV9tfXZkY2xqbXFwfnJsamFmb3Rw9On2+ezm6/Pt6+vr 8+3w8PB+dvXr8m1lePfv8nduaG769uv0ff3v4uZ7ZGL/9fj0dml09e/7bGhfZn51dWpjZ3Xi 3Onx6eTj6/RydO/1aV1o/337/n7t4+Lj8fXt6fJxa299dG1nZGNudHn/b3X19vVvbu7v7nZm /evf5Ht4fvbwdmltfX75/25t+97h+25rd/b3emZdb+Xe8m9+8+bleWZm9/h2eGlu/Ofqfvr2 6/xx9nVqbmtuZGB1dPvw7+nz7OPr+W1z6efv9nV48fT17/R+fvJ5bHdzd3Rx/3lvdP30cmZ8 83Fxev7/8e55+n704+589/Lr8HP+/v3y7Of3c3n8/mtpb21yeG96fXn28+nybHv04+J2bXj0 7Hdu/XhtaGz//HL57+7u9ff1fv99b/X1+f9tcm1q+vPw83Z18+xvb/367vP49P77/fTtenz6 //X5+v58+Hl3cG56eHJ9+/fufXvx+u/q+HRyeHFvbWZkc+75/fjr4+Xxfvrv/Wxrb3Z6bWVq en10b/To7u7t6Ov8+u3s8vj9dWxtdv12bm94fPt9/evq+Xl2c3Nu/339emxoZm/8bmXy5/Zt ++zo6e3v/fT48Pj78vfu7v359/T8dXx5Z2rz8HBtd/7y+XduePx4bnL39XVudH77bml9/3V1 e/fp7PPv6+v3fXf37+/u8Ofi6ntpc/jzcGlvbnx/e3/18H1weXNteXBv/vV1b/72em989e75 fXr+8PD4f+zm6vX36ePr/Xn/9HtoaW5pamlpbX/0eXZ5c3J3cXny7PTu8ebn6+br7e76/Xhx b371fX7z9Ht8dXdwaGtpZ2puenj//fr+dvzs8e7v7ezr9e/p7fPy6+3v+nBtbmxpcG1mbG1z dn3y+H7/e3n/fXx6evz49fP58u/t6e93dXJye3l9fXt7fvl4b294e/x8cX19+v1seO/s8Xt4 dH3p6u/z8Onk6evv+Pt1bGxvbWhlZmp0fGdq/fTq8u7p7vXz+/707O/8b2tvfH1rcPvy/v34 9vf98e3t7ejz/+3u/nJmZWJhamhvcXl+ePrv7ent7u/u7Pd7/fl78/L5cXB+fW9rcXv6enxw bXL+cm19+v5+7+vs7/h49O1+dPry7/N2+/r58vf3eHZ3d3Byc290evr38/n0/HhzfP/7fXV2 ffv57/T7/e7y7/P8/nz3+HJ1c2z7/Wtv8ftxb3n07np89n1xbHN0bX/x9vj78O/2/nv87ujw 8fru6fh1bXf5fXR3ePx2b/x+enB1cGlrdP12cW9+9f3t7Hpv/O72+vbr9fXt7ux+cW12d3n6 /Hh9/357/vP6bmx3+/fz9Pn9d/31fnd69v93fHx5dvvv9fTzemxra217/X58c3j9/fh6evju 7evr6Ozu8fT3/v98emprcWpsc3l7fHx0e3r+fn707/D57erl4uT1b294+fp4b3V2//54bXj5 eHFvdWpsbGxze/V8dfLs9fr18/90dfbs8Ovt+u3n8P337uns8n5sb3Nz/PT2fn56dW1pZml0 dGxnZmlrd/r06O767uvt6u3zfHTy9PXv8vn68/398Pp++/10bHBvbW909fZvenxve/Vxferv 5N/xfHly/vxqav72bnJ9bHD/dm51eXhwbfrp6efh5+vw9u3t7/Rzam1qbXrx8ffw93h97O57 fvr6/G5mc3RpbHZtbG9we/338uzx+PDq7vb18vD68envdXx9a19lcnRsb+/1cG96fP34+e/y 9+3o9PXn7H/+9fLz9vv/+/92dm5oanx9a2tvd3vz6ejq7Obq+397dmlgZWZjanr7/vjs5+jx 8O73/vn7d2tscnV0b3V/9vDs6/Tu7Pbv8fnu931+f3p6effw8/V4dnZz/Pn8+PX5fm9paWtn ZGhlZ3b59/Pq6u/27+br8e/t9nr+fXp/8P54f/b0ef3+eXl2/frze3d6e3t3eHL+//T1+Pt6 fHp3+35v/vXv/nzz8vLz7n1ub3dwcnx4dnd8fPz18/f8fW5oam1vc/fx/Xb97ff37e/y7Oz4 fu3o8/Ls8vX4/v78/m55ePru+nx4c2tqZ19ldHl4dP/19vn69Pjs7e/6dHt6ffj19+vr7e3t 7fD8amtoaHF5dm1udnj++fX8eP39+fr08e7s9+/v+nh9dm1tcXd2cW5y+3drb2trdPr2+fHq 5+79e/b4/H727/D7+v52dv9/d3h++f1+/+/wfP78c3J9fHZx/e/u+f5+fv18eGpka3R2e3r7 /3BzdHZ7/P308+3r6+f3+u7p7PD5enFy/Xh4fvH29/xycm1yfP7+/PX1+fj8/nVvb25tb3h+ /3VybXJ5d/749Pf39fz29fPzfvzu7/3+/nx7/3t8//Ls6/N+fn318/bw8377+vT2+vn7d3z1 /n11cWZkanN4dHRqdPz5+vX3+/b19fX3+/n8fX17+PH+f/n4+O/t7e7z+/Xt7/r4+Xjz7n15 8O/5f3x+amVkZGZocW1lbXv77uzq5Obj5Onr93x1fHlvd390bn71fn56fXlscXNvbnV+ff70 9vnu7vTy7Pn78e7z7+z7/v3w+HVzfHp+fGpsbWxteH3/8316cW599H58f/t+/n7+9PPz/fx+ 9vH3dX328u3//Pb7d3N4dXVwbm5ze/Xt7O/x+XJy+fD4+f3t8X74enR89/J5bmpvcWlse/T7 /Pf2/Pv7fHj49Pt7fvz69PXt9f14ffHq8/vu8nVyc3Ntb/x1bnRye/T1f+vs/O35cHDy7Pxw a2t6eXz8/H19+fjw6+nn5+/3fW5maXJra25tbGdsev328vDv+n5+ff759Px5ffDt7vf5+fL1 eXx8dX7+c21raXBzcXh4ffv99+/o5OXp6ur2fn90dX15b210dmxw+v5tb35zd3t6fnx6cHb9 8u/w7O/8+/Ht+GPt7nR47nZ1bXxtbuT17/Z/4Xr8cnjuffJ4cHd3d2r4dnF5cHV2dft4evXz +nj++HR3fHn/+O7t7fP67ers+/319P9tbGhqbHFwaG50cXV6/Pns7vH18PDt7erp9fzye3Ju b254enl3bP36eXj+enJ4b2188fvz8Xl3/vn8eP10cHX17PLz6+nr6PL0fW548+73/Xlydnx1 fXFtfPl+dP37fPX8b3X/+fb7eW14fW5z+fv+9e/7b3H88/t5e/n2/fbt8n1+7u708O32+/n/ 7vn5fGlrbPfl6m1kZV9g+unp6en19urz9XhmaPnq5+r+bGZpbf3w8PN9bW98e/z27fBzePZ6 cXF2ev7u8u7o7377/3Rvd3Vy+XhwcXN4/vX17/348vL4+/TweHf6/vPz+/10dHxvZ3J6cnb+ dXjz+vTy8vl4cnn+/Pb9c3J1//1zcvfw8+74cXP6+W9v/fj29ndpdPj07e3y9/v28u/98/Zy bWpqa3h8+/p8739obf12bnxzdfv+dnz3/Pj8+/5/7PP3/vz09Off6H308v18enVtbnJtb318 dGxwfXJ49/758ez1+fz/9//89fb+d2prfnBwdmly8/Dx/HV/9PX1++jq4d/r/Xvs7f10ffn6 cXrd0txta19KRkr7y+V02ur33exhU1373dTc5e9veObRzt3w6OF/XF9pXFNbdHx7aFxpalpe X37f4eLn6+Lg493kf28= --Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps Content-type: text/plain Content-Transfer-Encoding: quoted-printable This is what the message looked like on my end: --Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps Content-type: image/x-xwd Content-Transfer-Encoding: base64 AAAAawAAAAcAAAACAAAAAQAAAqAAAAOCAAAAAAAAAAEAAAAIAAAAAQAAAAgAAAABAAAAVAAA AAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAIAAAKgAAADggAAAAAAAAAAAAAAAHJhc3RlcgAA AAAAAAAAAAAAAAAAAAAB////////AAD///////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ///////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVAAADH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAP/jEAQAAAAAAAAAAggBy AAAAAID4BgIAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVAIkjFhQAAAAAAAAABhQCKAAAAAICAAgIAAAAqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAIkjEyQAAAAAA AAACiICCAAAAAICAAgIAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVAIkjEaQDRxxxxxxwAiICCxyxxx4CBwh5yxwAqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAPkjE QQCqKKIKKKIAiICDILKKKIDyIiKLKIAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAIEjEsQCr5hh6L5gAiICCJ6KL6ICCIiL6BgAq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqAIEjEmQCqAQSKKAQAiICCKKKKCICCIiKCAQAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAP8jFDQCqKKKJ6KIAhQCKKKJ6KICC IiKKCIAqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqAIAjEAQCJxxx4JxwD4gByJ6IJx4CBxx5yBwAVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAIAjH/wAAAAACIAAAAAAA AACIAAAAAAAAAAAqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqAP/jAAAAAAAABwAAAAAAAAABwAAAAAAAAAAAVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAADAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ///////SSSSSSSSSSSSUkkpJJJJJJJJJJJJJJKUkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkklSSSSSSSSSSSSSSSSTJJJJJJJJJJJJCSSEkkkkkkkkk kkkkkhCSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTJJ JJJJJJJJJJJJJJPlVVVVVVVVVVVdVVaqqqqqqqqqqqqqqtaqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqvVVVVVVVVVVVVVVVVXVVVVf///////v//3/ /////////////7////////////////////////////////////////////////////////// /////3KqqqqqqqqqqqqqqqvKqqq2qqqqqqq9VVdqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlqqqqqqqqqqqqqqqqvqqqqoAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAXKqqqqqqqqqqqqqqqvFVVVYVVVVVVVAqqklVVVVVVVVVVVVVQSqqVKUpSlK UpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSnlVVVVVVVVVVVVVVVXV VVVaAAAAAAAUAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAbKqqqqqqqqqqqqqqqvVVVVYSIiIiIiARESSIiIiIiIiIiIiIhKI RIpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUpSlJHKqqqqqqqqq qqqqqqvP//+5AiIiIiIkERAgiIiIiIiIiIiIiIAiECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAtqqqqqqqqqqqqqqqqvlVVUoCAAAAAABQASCAAAAAAAA AAAAAAkAhIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKHKq qqqqqqqqqqqqqqvWqqpZQSSSSSSQCSAQkkkkkkkkkkkkkkBIICAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvVVVVVVVVVVVVVVVVXHVVVYBAAAAAABIAFC AAAAAAAAAAAAAAUBBISSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSLKqqqqqqqqqqqqqqqvtVVRaUUpJKUpUCkgQpSSSVKVKVKSlKVBQQCAggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggvKpVVVVVVVVVVVVVVbHVVVYAAAg gAAAIASCwE4PALAAgAIAAAAdGXlElCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCFqqqqqqqqqqqqqqqqvsCCJZF//kJNKJCUAmUlasIpRTkkhJSiUocHXDhQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQvKVUlJSUlJSVJVVVVXG pUpYRkkhAYAgIASBQMUUCFEBwAEAAIAgkYBUyhBJBJBJBJBJBJBJBJBJBJBJBJBJBJBJBJBJ BJBJBJBJBJBJBJBJBJBJEllVVVVVVVVVpWqqqqvuVVayDBh0SyQKG3DuVI0WuZYmi+Hu/i78 NPJAgoUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAAXKqqqqqqqqq WpUlSVbFVVZYRqZwBoEgT/uSQSX0ZrIGobYlRBshELDJkxAJAJAJAJAJAJAJAJAJAJAJAJAJ AJAJAJAJAJAJAJAJAJAJAJAJAJAiUnVVVVVVVVVVpVVaVqvuVVZZByT0nCAEmIhy0wWsHJFE iTPsRpVoVJpAgUJASASASASASASASASASASASASASASASASASASASASASASASASASAIIAdKq qqqqqqqqWqqlqVXGVVdYF4nyGQqQCKrWQUyktJQKgZJC2DEgEChS1QgJAlAlAlAlAlAlAlAl AlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlASghJHVVVVVVVVVVUqqqqqvtVVRZJzT3cEAEiokS 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 VVRZD//wpIApJBCCQBUpIEACqBIgCECAEohEAQUEswISkEhABAQBKABAQBKABAQBKABAQBKA BAQBKQAghCSUkAgAEABIAvKtVKqqVVVVVVVVSqrGVVdYQf/6AAkAAEQIEkAAAQSmAkAEgQoJ QAIAlBAiHiiCCQIEkBCUAkkBCUAkkBCUAkkBCUAkkBCUACSKEIBAASCSQkkAqFqpVUqqqqpS qqqqqqvtKqxYEAAAUkBEkgEiQBFKlCAIgIkgIECAEkCSAIIIgIAkgECQIoIBQAIoIBQAIoIB QAIoIBQAIoIBSQAAQikJJAgAgIBSAvKqqrVVVVVVVJVVVVfGVVdZQkkhAQUQQEgACUQAAIkg KiAEhQQUgAoAkgigFAKACQoEiAhIBKiAhIBKiAhIBKiAhIBKiAhIAElJCAAggSFKCgkAIllV VUqqqSqqpVSqqqnuqqpYCAAIJFAEFAJJAAEiRAAEgAqQICEAJICkAKAEgSglIECQAkICUAAk ICUAAkICUAAkICUAAkICSAIAASQIIAgAQEAkiPKqqqlVVqqqqqqVVVfKVVZaIJKggACQgSgA UkgIEJKQBEAAiIhSgCQAkgEQJAAACQQAkAgoBJEAgoBJEAgoBJEAgoBJEAgoASgkpAEhBSJJ CRKAArVVVVaqqVVVVVVqVVXWe76ohAQKJIgEIAKkAAJCAgAFIREkAgIAKgEkAEhEAUqSQFEk BIICQARIICQARIICQARIICQARIICUgEAAUgISAAAQAAqQPKqqqlX9VVVWqqVqqvm7vpYEFBA ACJQmnABJSgQSL7wBAceSCgPB5QAlQEBSIAACQAAkCiQBJACiQBJACiQBJACiQBJACiQACRK lAEhASSSEkkACrKqqqqrOVVVOVVVKqvOkopZB//pKYACCJiQAAIEgYjCQSdIAgKDhgEoAFBI AqJUgCSpBIAEkAUgAEkAUgAEkAUgAEkAUgAFJIAAAJAEQAAggBBEgPVVVVVXWqqrWqqqqVbW qrVYFQAgAaVIGhIElJBQJQxIJAKJKJAqmkgCUgUCKEgAJIAAEAJQAlASJQAlASJQAlASJQAl ASJQABJIkgJQCkqCCUEQJTKqqqqrX3dnuVVVVqvKqqpaRFy0kwACizZNuHXjgUhDh5LYc7uC ih0444euHMJEgCpJBKQFSAJAgFSAJAgFSAJAgFSAJAgCUkACAKQEkBAQgAgEgPVVVVVXOzO3 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 CQECIXVVVSqqqqqlVVWpVKvNSqpalqJzfAAkgaGOOZYyWIrMzuMKjtYlj+GzN2djNcgFKiSE kgRSAIAAkgQSlAAlQSlAAQkCEpKUoCAACAAAKQABICQoCnKqqtVVVVVaqqUqqqvWqqpYBBCx BJUAJ8T4fwPoGen3f+dHH+8H/8XnO8pHeYKgAAAQAKAASCkkAJCAASSACAASSCBIgAAACQpJ AkiUgESkCQEBQbVVVSqqqqqlVVVVVVXLVVVYTIo7fgAUgBCAQCSBKQABIAEkIABIgAAIQCEo BQgEpEpBKhJJAIABKgIKSAASIKSAIIEAFJJSQEAgKAIACRABICREBHlVVVVVVVKqqqqqqqvu qqpZB//wgSJAJQIqEoAgDEqQCSIBCVUCJVJCEggCQ0EQAQAQAAACKhKQAKCgAkoAigAkihRJ ACAAEhIJAkClIASQCgAQkXKqqqqqqqqqlVVVVVbCqqpYSf/yFAgEgEgAQCSKTQAFIAkkIAAo AAAIQEBICiRAiElCkSUogEAEpAICSABKACSAAEAAJIJJQABAEAoAAlABIJSCBLKqqqqqqqqq qqqqqqvuqqpYAgAAgUKQJAJEEgAAgFJACkABCREBJEkiFBICQgAUIgAIBAAAERSgAShIAqSA kQEUkBKUgBAAFKQUhSBJIAUoBAAggXVVVVVVVVVVVVVVVVXHVVSqSCRKJBAAgSgRQEpSCQAI oBKUIEQIgQQAgUBIESSAgEkhISSiRAAJJAEBKAAkBCRAAUAACUSUgAFAIAEABSACUJKCEnKq qqqqqqqqqqqqqqvsqqpYAgEAAASUIAJACQAAQCSCBIAAhAFCJCFIIBSCQAgiKAAECAAIAJIA ASBEASQBIIASSAklIAEAJSQJCUhSkAkgAgAoQdlVVVVVVVVVVVVVVVbHVVVZKKQSSVAAhJAC ICSSJIAoEBJSESQQAIAAhIAICSCIApKQISkgkgCkpAIQJAEkAgSAISAABJQSgAAgIAIAASAC SEkBBHKqqqpKlKqqqqqqqSvtUqpYAAEgAASkIASQiQAAgCkCRIAAQAAEkCkqECSCQAQCQCAF BAAIAKQAASiFASQBSKAkiApSQACAJJIKCSCSSAlIAQBAUrVSVVWqqqqqqVVVVqbHVUpZJJQE lSABD/Hr+B9KDoBQICdJBfqmAoABYIA4B90oEuuQEJZBKgEVJAAgJACUABKAASAAEpIJAECg IBIAIKABJCUFAHlVqqpVVUqqqqVVKqvqqqpYB//gIAkgTWMwjnMAVBIZKQEAIZgKoBJBaiSM kRgCQGNCQAQSAEhAASQIgUgAkgAqSAkkgACgSRIEiQCUiApQQABQJdKqVVVVVVVVVVVVUqvH VVVaVACp8SAKKSqSlClJGEAkUCWSiUoiCkAVIAAIAYiQCVEIEpNAkQAAlAFCJAJSAEkAASCA ClICIAAQABIAAkABCVIAgHqqqSqqqqqqqqqlVVXsqqpQBlgx+ApABQQow0KF/fVhdLkwAYMy w5/fLT17SQpy4FlO93IQBEpUAUgQAJAAqQBEkAQqQABICSSFSoCkkBJIAACUJXKqqqqqqqpV VVVaqqvGqqpcliV1mSAEkZSKikiTUZBIiEkkkumXdJk1NmTpIfjJJWsRIiUEkAAASACAkgSS AAkQAlAAEkkBQAAgAAoAAUACVIoBALKqqqqqqqqqlVVSqqvuqqpYB0zwOgSQAwYYgsCGVSRC mmngADEyppQhavyKCyo7wE1fKqGQBJKKAkgkAJAASkAFSAUiQAIkFJSIkSBJJBKQACCAUvVV VVVVVVVVaqqqqqvLVVVYl4n08JABSRSKqlLSEQFQ+DNL/KsSIxCzIkKYQYhoyVUSUmUCUEAh KAKBKgJJABKQASAIAkiAgEACBAEAgAABIoAVATKqqqqqqqqqlVVVVVXWqqpYBzLwaAVIAUIw hSEDM0hFBVkiQQlWadQhZkiKESyKYEcwHcFAAhIAAkgkAJAASQACUAkCkAAkJBJAkUhSKUko CCpAJPKqqqqpVVVVVVVVVVflVVUqVoh5YJAAlQsyrDuaEYlRTEm4BZ2yZpilJ2LZgQnZKVOZ qpMJSAAkkAAAJAJVAEpIBKAoBKkAAIAKAAIAAAAAoAAIgLVVVVVWqqqqqqpVVVXOqqi4BBEw SgJSA6Hj+l4XfPBjjneZIfDbxy/zvD11J7x1wOEPCIKQAqSABVKSgSAASQACIAkBIABSkiUg kkiSSlSSCokiKvKqqqqpVVVVVVWqqqvrVSspJkQyYEgASIKEAAAQARIpEJAgEgJEiIIEICQl AABElIQUEkoCSAAKUAAIBAkiAEkoiSAkAokAAAAAAAAAAAAAACAAAFlVVVVKpVVSqpUqqqvO qqpYD//w5AJJAhAhSSVFKECQRAIKQFAQICBRCoECkooQACEhQAUgASpAAiSCUSAIlAAAAAoB SCAkqUlKVJJJJIlKogpJJXKqqqq1WqqqqWqqqqrlSqpZIf/yESgACEEEBAAAAhIRAkhACQJA gQkAICQSCCCCUoQABKwJJAAJSIAQAASgAJKSSUCkAQSAAAAAAEAAgCAACEAAAnVVVVVKpVVV VUqqqqvOIIFYAAAgAAJSQBBAkUkpIIBISAISQEgUKEBJBAFAgQQgACEkkAJAQSKAACpEkkAJ SAAAABAAkEAqJJSSiRUoJIpRARKUkNKlKqqqqqqqqqqqVVfUlSpYpJKEpJAAEoUKAAAAAgkB AShACQBAgQUEESQEJBECSQQABJAFBAgSSQAAABJAASkpUkESAhKAgAAAIAABAAAEJAAAAXVV VVSqqpUqqqqqqqnKqqq0CAAgAASVACBAklJJSEBQSAESgEoIEEAhQACRAQBIAEFKQASgIQJA AESSSkASSAAABBRAoIAQJSSoCSJIUkkBAUklSvKqqqtVVVLVVVVVVVfVVVVYQlSCkqIAJIIE AAAAAQUFASQAJQAiRRSAAlIAJEkAkiQABJAIhCgFJRAIIAVAAKSlIIASChJEgAACoAgBCABU FAAAAFqqqpSqqq0qqqqqqlXKqqq0EAAoAAiRCCCRSSUkkFAASAEoAEkAAAApKACkgABSBACS oAUCIIEgAAUiCSAVKgAACCSAAEAAKVJACQKkApIAgJSkUvKqqVVVVVKqVVVVVVfVVVVZQIkA SkAEIQoABACCCQBSASQCkgBJSSSAAEoABJUAUJIACVBIAgQCVJAAQAiAAApJIIAEqQSSgAAE QCgAkABCIgABAFlVVqqqqq1VqqqqqqnqqqqoKlJVISqiiKFVUVRRRFUJVJFQSVUkIkkqqpCq qSCqCklVRASSqVKpAkVVKqUqqqESSlVSBFJIVVVSlUKqSqoolKqoqvKqqVVVVVKqVVVVVVfF VVVVRIEglEEUJQoiBSKKEoJSIkpFJIiJSRCQhEUJIkURUSIkKVJEREREqSiIkRAgQEpJJIJJ UokiggkkIhQBJBFFIkRFBLqqqqqqqqqqqqqlVVXVVVVVVX1eq11Vqura9Vqq6rqqqqq1VWq1 VVautVrqrVqtVVqrVVVbW1taqqqqrVeuvrVVVXqqqrVauuqrWtX6q9a1WVVa6vKqqqqpVVVV VVVVSqvP/v7//+v1/fv//99v2+3/3+/////f/7/v//v73/ff++/3/+/9///2/e33////+/17 6+/+/9f//+/v99/97/+v/X3v7//3v9N93//fu7/7/vd+/f/6q6uqqr6/V16qqrf1fr9VdXqq qqr1Vet6qt6u9b11Xvq9VXqvVVV9r369VVVqrrfevrqvqv1VVXr6vXVfeqr6r696+1W91XfX dVV27uquq73Xt1X///////////////////////////////////////////////////////// ///////////////////////////////////////////////////////AiBAiJAAAIABESIAE AEAiAgEkkQgEiAABJABAAAACAAEAiAJAIkgBAACAREQJEIAAgIIgCACIiAAAAAIAAREAgCAA AEgAEggABEIAAAiAQAAAABDVJUqUkqqqlVUpIlUpVSVJVFSSJKVSUVVUkqqVVVVUqqoqUqkV SSVUqqoqkpKkolVVFRSSpVUlJVVVVVSqqkoqVUVVVSVVSKSqqJSqqqUqlVVVVUvKqqqqqqqq qqqqrVVVVVVVVaqq1VVVVqqqqqqqqqqqqqrVVVVqqqqqqqqqqqqqrVVVatVVVVVVVVVVVVVV VVWqqrVVVVVVVqtVVqqqqqqqqqqqqqvVVVVf///3////+///7////v//v////f///f////// /99/v//f/////9///f//9///33///+////+///////9//9//v///+/7/+/////3///////3K qqqqqqq9VVVVXqqq+qqqr6qraqqqr1VVV1VVVVVVVXfV6qr1VVVVVXVVX1VVfVVV9dVVVXqq qqvqqqqqqqvVVXVV6qqqvquqvqqqqq9VVVVVVVPpEBBYAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAvIiqW5SUpCVVKVQklJBKlUkEpJKlJSQSqUqSkpVUqqpRAkJVQJKSSSSSVJIJVSAkpI CSVKUgSkqUgSpVUkkpAlJRJIEpJJAVJVAUqqqqEqqpVVVUbqtVWoBAAIAAAACAAAEAACAQAg AAAAFAAAAAAAAAAAAESAgACgBBBBBAAEAgAASAAhIAAAAFAQAAJAAAAQCAKAAEABQAgAJAAA JAAAAAQAAAAAABPJSqtaQJJChEkiIqpUhRIApFIJRJUlASJJEkqSIkhCKAApEhIKgQQQQUiR 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 rJmVBcM2cjhVgwRbJgAk/DjwTMD37nuoSDzie+PCM7q+dNijw4heEkAEAAhIABABQlQEAEoA SgFAlAXOqqq4AEMABKBJABEkkJIgAAGIqIAEEIEAAUQgIhABEEIAUFkSAEkBAiQIAhAEkRIG GSEkgAAUABAAiSIgCEQRWBJAkkECkoVICACRUACSAEgIAVfrVVUqkhBKkAkAEkQAAgCAlC0q AiShQCQqSBEEikSkQWhJBQQAKQAkCIEhSEKQAECT5AQACSSApUJUBAhVIRFEIkASAQRIACAB ISIAApIACQIiSAXMqqpYAIQABQIlAAEqUJIUIQYcgAAICgiAAgBABwAAEOIAAACVAEkAgCQI AQgEpBAAkSEpIAAiABABIQEQCAABIBSApEACSAiQBAiSIACUoECAAifmqqpYSgEokCgQVKQA BEBAgJBAEkpCIEIEqCUUkSpJRQCSVFIASQBKEoAhJCBQAIUqAAgAgkkIEkFEACQkolJIEkAK AApIAqICkCAAilIAAQoEqInOqqq0AKACAgECAAEigBIIEgQUgAAQhBCgAoAABAAAAFAEAQCg AFIAhCUEAAoFKQAAkkJIJBBCQBQRVICAAAACQAlASSACSACkBQkkAACklCBQACfrUqpYpASQ SCRICSQIEoAhQBFAJSlAEUAEkCRJUSSVEgJQSBIFSQASEACQUqAgACkkABABAEEQBICAABIS iSUoBKAJAAEoABIAkCABEkoAAIECRIXOrVSpASEEAoACgAEhACkIEkASAAAUgBIgBAEAAAAg QJACAkCQACVAgpAEAASJJAABKQUkSQgEkCIkRQBAIAACkApAVJQCpQBIAgqQQABKSCQgECvl UqpYJAQRKAkoEpQEVIAhCAJAlKSABICJISQSRJKCEgFISBIAKoAECASRSRAAAKSkACCAACEi BIgBECUJBKSQAkAJAACQACkCSEBBAkkAAICCRIPOqqpZASCAAScBJwEgAHzkQvASAAglIyQA aAiAEAAOAJQCAgCVAC9hISAB+EXJTsHxdc8pq348gPGQBIAAQAAEoBJAJUQESQBAAhAUKABJ SiQoAC3LVVVYJAITJA2kAkgBIs2wACJEEkSAJQEloEhKQSkiUgBISKoAIgzMBAkkTQCAAk4M qyiAh0K4E50JICSlCkpQBUAEgBCRACUJKESAgKkAAAEBJIPsqqpZAUiDQSmBJgJICKWVKEgV QBAkoZAApRoAEgAEgKICAAiRCIlJQQBBREmkk00kimilSExEgSjASQAAQAAEkBKQJAQAUgBA AQAgJABSUSBEACvHVUpYJAAOBAyEAjzZIYYQA2PeNLNg9sdL2T2zxiXNDhi8174EQCwee/vE Vjiw4mjWTCGBEgVwJYqJACSSCSkgAIAEgFBSAJISpBKKgIkABAoQlRPWqrS5AJStISdRSrLs BNx0ls2IyBWpQ1yRCVCVOYbOtm1lWzBAEg+oiRIwzOzdmlUjEVUmnph6sQhAJAAAgAAJJCSA JQIAkgCAAQAAJCAlASCCAEbmqqUoEgAYCA2AAg5UkHgwCIyS2rNgjkmDNiGiExRpkMyE0SEJ QCGK+RvgeEaoM1KqKIKCMwiMISlkgJUqCUlEAIASgAiKAEokiFSRAQSAVAQIEgvNVVS5QKYy Qki/5lpG/opEmbFZ4CJJpZ6SkqkyvEpIqPGUqqhA/wRYkuJKTFSK8lYioqImaVQV/wxAJAAA oAARSCkgKSAgkgAAIgAESEAoASEhQJPWqqpYEg7oEAmBAyNkAhDACRMhCUthBNICJEJGKQiT BolHJkISBClIwKMAZMSpGnJ2EIIDIRBFMShKgUikBJJABIAJAAKEACiSgEJQAhKAiAgEAgvO qqqqAEfCBV2QSjJMkOmam13rsFSlWVlKb1vUci+7bOkWa9LAkIzMzFMyRm6Nk1m4YJKSO6pI YZrAJAIBEAQJIBKASUgBSQIAKBAEkIASIkJBKEbTVKpYJQuQUAdFHF3uAMX4Bcm44mRRyo4F NmN1HIYMOHUEG2pSAguneMXp6znc7+pBIooBXiByIvCJACgIQlEgAkAJAACUIEgpAokgABJA AAAEARPuq1S5AEEEAgAAAhICVCAEkgQACBICAKSkEUgABCFEggFCQCAAkKQABCAAgpEiQBYY EIJJAkkoiJKgSQKiCAAJIBSASSQACgIAQCAKVIAVSSlQiAvGVKpIkhIhSCqUSEAoAIFQABCS oIhIEgAWRAJSUIQQCEgIBIVKBACUUIEiCAQICkHyQhAEyAAAIAECIBAAIEkgBUAVAACRQBCl CQSgAApAAIACIFPWqqq4AICIAoABAhKCiCgEpIQABCECQEpYAJAABCAFIgIiQBAAgSQBBCgI oSECgBIAEIShglKJCklICkRJCgAKkAkgVJIEEoQAIEAEiSAIkhSACgvmqqpaShICEARIEIAA IoEgAhBJEIRICQAIkgElIQlQAEiACUAkFAEkIQCgBAgoEkAlQhAACAAgACECQAEAQCSgACAA AECQABAkiQSQIAEiAEAUoCXOqqpQAECghKECRCSoABAJIIUARAACQFJCAKQACEACSQApIBUB IJBAiEoKEQIBABUAEIUogpIKSQhAEpBSEoAEpQpKRBAFSIUAAEgEipAAqAkABIvrVVVZKQIC EAhIAQAApEUgBCAlAJJIBQAQKgEkoASIABKAhIAkAEISAgBAQCikKUCUhBACKAAgIAEJQAIA gBKQACAAEIKQAiASSQCQAAKkASAkkBPNVVRYAChIhAICkFIkAQAKQQiASCACkCSEgEgACkAi qkASECIBJBCAQJARCQABAAAAIQJAASkEhKQgEkiQJEAEkgSkhCACSAkgAEkFIlABEApABQ3n VVVcpIEAEKhIAgCAlAkgFEISAoSoAIAAAQBKQAqAABJABIhUAIIJEgKEIESIJJSRCEgJRACQ AgCEgAACgQSQAJAAIIkoASAElQAQCAEUQqASkBPMqqpQACq7hAABIJIkAUAEgBBAkAABJCpS VEoQEoAkIgASgAIBSiBAAJAgiRAiAAAEQgJAESQEkJAgJKSQICAEqAUkCAACSAkhAFJCQkhA EASAAkbmqqpckoREISKUCgAASBJQBIECBCpEAQABAABCQCkAiFJAFJCIAAkSSgSCAASASpJQ AEgSQACQBAUJEAIBBISQAlABQlKQASAIIgAICAECQRACSAvOqVVYABgEiAgBIJSVAgAFICQo gQARUESQRJIAEgBIAgASQCAiUoAAgJAglIApAAAFKAJAEkgFISBARSCoSCAEgAJQEAAFJApC CJSCQpBIEESoEVPrVqoqSkCTYSNIPAADOJ0gBIp8KZFBxxOCEEBLj13dMV3oBIKAABJKJAEK ACSASSUgASgCQCCQCAIJAAQBAIlQCUgCQSSQgCAQIAAIEAUAhQAARAvNSVTYAAwAhASCUSVE pAQJQRrFAoQIzoFIhBICsJdUZySNIBASSIQAASRApIASAAgJJAKQFIoCQkiAJJEQSQAFIAJI EAgAJQSEhJKhBJBSIEkSAIbmqqpZKJG6UJbIFnAWjS3TlAGJlPfi5hMGbbX8J1RVITXkCUSI AiEpJAAIAAlAJKEgAJAJQABIEAASgABBAAkgAkgAgqElABAAIgAEEAAAAgBAkhPOqqpYAghA gAMCEUkEyEp1AJDAbJKwqoFJWdNNK0mISWQjAAAhIAgAAUkCJJASAAAJSARACSICBSSAJKQU UkAJUAKSIABAUkSpCEiBQkpJSJQSAIvlVVVYSCKkyky+t23ziRalL0KFypaUqiUNqmZQOUyq YSaqKRSEBKEklAAogAJAVSSgAlEJIAgoUBAkgACAACUgAkgACiUSAAAAQQIUAQAEAABAEhPO qqpZAkgQoAWAVUgFNDWqgBDVWMyRmgG5NlK0q2AAyyUigEABQAAAAKoAKkAUAAgKSABACkIC AkSAKkgiSQAJEIEpIIAAkqUSEFBAkFKBJKUUgErWqqpYEBJBQVMSZ20nPBjWCoF53dj516vm FLcwJYmaI9nWBQSUCopJUgCSgBSBREJAAkkFIBCQiAAEgAKIBAkgRCQAAASSAABAAgECAgAo AAAASRPLVVS0hIqukARAkSAAAoQrQCQCAhUEICACpADCVEhAIBIEQEAAgCAQAEAAEkAgERAS QABABIQEIkkgEkgCgUAIAQFKlSAAlEgUkJBIpJICUkkiAA/WqqpYEAlVRRACBASUSBCJCQEo KFAQgoUoASpID4ECVIApEglSKQFEiQVSQAKEgABACSUUkABRAAAJQABIKCSilCQAABJKAQJA QgUAAABIAQAISqHNVVUqRIJAgEKQgUEBAQIWQEgCgQiEKBABJAACkCQoECSIAJAAAEgAIFAA EkggJKUJIEAABSkASSqAEqQBAgAAAACRIkAAkEgJCEBSSSQCkFJCABfWqqpYABEKKQgCFBRI JEhBCQCQBCIhAEEkAJEoAICCRIABKgESSQJJCQEKQQECgABECQiSUAAJAIAUgACUEBKJJJIE CASkAQEgARIAAACQAgAQSQXmAAFZKQQgACEkQAACAAEIIFIEQIAIRAgBKAQBJCQQACpIAJBA AEgAQCRAEEhIKkgRIAIAAkkgUhEAJEkAhIAgAQCRIkEBSEgJSACUpKgEkJSEAFfXVVZYgFCB JIQABKJIUpQggQCREhJCESCkAJEkEIBBJIAgpAUJSQElBIASQgIAAASABKhJSAABAARSgQAS ECSCSEoAABQkAQCgAFIAAAFQAgABKQHMVVa4EgAoAAFSQAgCAAAKKCQABACAgAgBSgABBCkI ABIIASAgAEgAQCSAEJClIkAkgAEAAqVIJKAAJFSAhQAkEACSSQABJCQJJQCSSkQEoJKgAFfn VVZKQEUCSlQACSBISSSgAICSUFIUEqKUAEkkIIAgqUBBJAiElQBSEoAJQgAAgQSAEkQKSAAE gAiJAAAkIEqAQpIAACSUEBBAEBIAABAgCgAKSQvMVVZYFBBAgA8lJwoBAHjiSyQEAgGBBgAA kQwBCCbKAB0SAUIMAFIODlJwCKWnkFcmhBCgAS/TKQIgUkozz8gkgAClKgAAhQUUgkCVJISJ AJIAgBPnVVa4QEEFElmAAkCUJc24AQCQSCTISiSSBCZUIQhABIQAJJAUkgEmrEgRIAKBAgIC VEIBJBgxAEgJAAjmaEgAClIAAElSACAACAIAECAAJABSEkXMVVZZCQhTABKpShAAgKcSlZIC AgECBQAAgIgAiEGioCpJAMSKAIgNFQKYCSDJUIqRRQhIQTKVSQKAJTSVNKaSQABJRIAApIiS QlCRBAkkgUkABBfXVVZYICIGSViAAp76BIRQAtn2LXtJlDSdfmj2w1yIG4mR0wNoJCBFHNeW XDqBAiJG/9uHNiNpZe4e/BEEQYwIEkkAECUSAAIACAIEIKCCCCASUEXKVVaqCgCNABnJJjJs Udw0k0iZsiPmyug2NJwbXYkBHJS2QV2UgQoV9Uy7M0SlSAoSRG7tn2yLs1FiiSnhwUKCAAIp BABASSClISCQiAggkQpAghPWVVZYICQ4Sk8AAydFAHiwBlqVJkomaJli5TC7SrGkSrEilQiQ JEBGpGgVRn6RAEKDVWVB0UiJFh8+XGNyVQoQSSiAIJIJBBIABAoCAkEEBAACCEvOqq05BIU0 ABGf4hpU/gpCTYlResMozeRMSxQksRUfiJWhApW0AP4EpE0RHlCFkhImRExWk0rZUpSpMCoY IoMEgAAkiACAQQBJIQCQoBBJIKJQQhbqVVaokB5hJIYkiqpGCViBBM0myIxYkRBNWbC0k7Ig GaJUyhMhSQSUVshZssKhAEKCTURMmWmTGjAgYKNQqgpQEpEAASolCEkACCQACUUAAggJEIPO VVZYBQfIACwACjNUoGHYSUqmZKbPndJ1lWpLVWqJMzrUgzVqQEAmxFxTMmKJWxYyxFVMsWbh chq11jM2ZSIEgARKUgAAQgBUgkEkgABJIEJABCvlVVZckBOgUpiVLF3uAsX6GpQ5OYMmSuCm qLBIrZMgHhNnig2aZRKOTue7nT3j+Yf/M+73e6kF509e/JHn5ASQClAAAEiSCCUACAQQJRIA CRABIQXOVVZQAkUKAAQACQABEEAAgEZkSEkIABIICgkkAECKYIkQIoEiAAAAIgSAIkkIACAB KICBBJhwCRABADQQCUwFIAUkkgIAggAlQkEEAECkgAUoCFfWVVVZKABAJJFIoBVUQRKSCShA AgAglEAgoCABSQoAICBBCigASSSUiFAkgQABJQJEAgoEECfBIASUJQhBQAkgASAQAEhKCFSA CBQQkhIAJSAEoAHNKq5YAqQSgAACCQAAFAAAgDXpIKoEARIKBIpIAiBJegkUQwJJAEAgAgQI KFSkAEgQkKCRBAgSCUAggEoQEkhJSAkFJAEAoQAkQkFEAIBKAAkgClfmVVZckAFACSkoQFIi QJSSFJAgAgCQSAAgEAACKIEAACAAAEgASQSBKCCggAAAkgJCBAQAIUJAIBKCEghCQCUAASAg ASQkBASBEAABKgkAlKACQAvWqqawBEgSQgAAEgCICAAAgAAKUEAFAkqEhUlAgBBSSQpFKAKS AiAUAggEEokkAJAAgQFKRBASCQAQQIIQFIAkUAkJUACBEUAgBJRIAEBQAAkgEkXGVVZZUQCA CJJJQBIBIlJUIqVAAQpQSCAQIAAKAkUBACAQAUgASAlAkKKQQCABKgJKFBQAEIJAoBJBAhCC QASBAqAgBKoEQBSEkAEAkQUCUkCCQAvuUq04AFIkgACAFQCQAAABCAASlCAAAgRCCJJAUAAk UkSCSAEoASAIBAAFEgqQAJAQgUCSACAQCkAQUIQgCSAgSAkJAACgCIAgBUhSBFAgABIoEpbK rVZIiQAAEkoEgFICSklIQBJAAIFKSJEBIggRBJSAAAAIASQClAEiUCSQAEAJJAJACAIApQlC QASFAhEEoASFAEBAEkQJIgSJUAIAkACKkkACQAPWUq64IC7uwABQIACQgAACEoASRCgAAAAo AIIEIAAklSSCkAFAAUgABQACSREgAUgKQiCkAEAQEpAgIEBICkAgJBIShBEAAKAAAiCQBIgA AIkAElbmVVJahIARCSkEhUoCEUpIAEpAEQIkpSSAkhBQgSSAABAoBJQKSAJJIEpIIAQEpAEg EIoAiQSBQASIiQkCQAqEgUBAEEApSgkkiIQCkCEkSiApQAPOqq5YECoEggAgIACgBAACpAAS AECAAAgkAISCFAApIgSBICCAAkgCCAACCkEAAJAJBABIIEAoEkACACBAEpAQJBQUggkAAABA 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 EBIKgkhQAkkJQRFKJAQACBCACAQBKgBJKkkggkHOVVZZIgAFABJIIKVIAUAAASiSSJJKKQAq QJJAACoAEAQkCgAASARAECBQAAQEkpQJUElJKkAEhECAAAIEkAAAAAAAASCUggISgoFIAJQA QAAIKBfWVVVYAJFQJUACigACSASSRAIIAAAggEkAJAARKQBJQJABIBSJACESRIUCklBQAACg BQAAABJQERIolKggBKUklSSSSAIAKEhAKBQBJACVAJShAkvNVVZZJAQCQBSgAEiQAlAAEUCC klSEEgBEgVSEAEQAFAVIBIAgUogAACAgBAQFVJIJAFJKRIAEgAACAAKJIAAAAAggApCkAQAU AQCQASQAKgAEQBPmL9ZYAJAIBIAEkQIEqAEpQAoQAAAQQBUQBAAgJRCUgFAAkCKBAABKkoiF ISEgAAAAUgAAEAUgCSSQJJAABJJSkSEJSAIApCVApBIEpABIgCSQEkXWra6qSAVCQCUQBEiA AkgAEiBEpSIEEoAEkEQJAAIAJAJIBIgoJJIAIAIQCAgIiSSkAJJSRSAJQAEEgARKkAAABARA ASCSAQAIAUCQAUoCEkAEgBfLLCpYIJAQFIBCUAAUkAJSQIEAAAihQAiQARCgJEiSgUgCUAAA gABIgkhBICCiIIAAigAAAAkgEpQQJSEAASlKUJAElAoAJBIhJAIElAEoQBKQCUXuWpZZCgIE gCQIBJJABJAAEhBSSQAIEkIFSAQKQQAAIAJIBJKSKUoCEAEICoQACCpSIJUkkSAKAACEAAhR JAAAAgSQASBJASCEAJCAAJAAEgAEgBPCpVdYAEiQBIEhIEAEkAFKQEUAAFJAgAgQAJBABEkp CkgBIAAAAAAoQSQgoBESQQAAAAAABASgSlIgpKIEASSSSBACSAIgJAIQkgIUkgRJQJJQFIvu VVRaUQAFICAACRUgBUgAEgAlKAASKSFBKgUSQAIAQAKQClSUklKBFAAIBABAEESUlSJSkSAE AAAIAACBSAAAAoUgApCKASBCAKCAAJEAEgAFACbWVVdYBBJQEoSVIAAJUAJJQBSAASVAAAQE AJAACkhJAkgBIAACAAAEASlCkKUJRRAAQAgAAASQUkSiSSQkAJUpSCAJKAQAlAkISgoRUgAk gCUgKRPNVVZZIIACQBAACSJAAkgAEoAkkgASSoEhIAJJIBAAUAEoCSUgpSRAgAAQAgAgAAUk CSKUkpAFABAAAgEAkgAAAAkAASEgASAAAABEAJIAJIAIgEbmVVZYAiVIBEFIoAgEiAEkgCSA ACSAABQEAkgAAUElBJQEoAAEAAEKFJJESCSCSJABIAAAAACQCUEkqBQSAJEkkqBSpAAKSAJS pKkAEgBKgAkiBQvOVVZZSAACQRACCkJAISAAJAApSQApIkCRSAJVSAgAACEgCpFBKSRAgAQB AgAgAgJICSRJSSQCQBIIAUEApAQAAAgAASkAgkgAAABSgKQAKkAAkCbVfv1YAJRIFAUoABAK hApKgSSAABSAiAIAASgAAiJUUoACQAQEAAAECVBICJSFKEgBIIEABAEoJIBCRAAqAJElKkFK JABSCAJJEokACgCpABJSARPO165ZJAECASACogUgESAQJAASVIASAkikUAKIkIABABSQESEh JKShQAICQAAQAQKkCCRSQUgCACQQEJSASAAAABAAgUkAQpAAQCAkoEkARIAApAvlVFJYAEgI SAiQCKAAQAFAAElAAhJASAABApAiBAlEEkACRAgEAAAEBIgoElJBJEgAIQAACACQkoBAQgAB AJJUokSSBAAJEACVCQSAAQACECVKAFPWq1VZSgJCAkIEAAlKCSQKkhAVAIASAqSQSAQAgSAQ gAlIAQJBJSkQkCKCgAAQAAElCEklIlQEACkKCJJUVCAACAAAoJSABKQAIEApEFSohAAASQbH VKpYASgIKAAQpSAAIIAgQESAVAlASAAJAFEkFASCJSAASCgUAABCBIAAJUlCSSQAQQAAAABQ KQAhIAEAAQkiQJUkAgASUAJIiQSARQAAAUkRAAvsCRE5IAKCgpSCAAkkiCSAFAAgAUASASpA SgABISAgAApKAkJBUkkIkCRSAAAQgAiQEFSSSRIFAEoACUgiQEAIEgAIkJJEBJACAFASACSK UABESVPGpKSoBJAoAABISSAQARAKgSSKiBJAJAABAESUAAKEpKABKAAAAAAgAIEASRKCEqIC iQBAIEEgJQBJIACIBQSiQEiiAgEBIACoSQJAFIAgASkAAAvpVVVaSAQBKSQBAAkFJAUgIAAA IgQUgSKUIhABJJAQAASgAkkpFKQElCRJAEAgQACkACQUiQgIgEkACSQCkCAAEgIAkKRQCSoB ACAVQCQElABSVBXVVVVYAlBEAAEkFKAgACABCUpIgJCAJAgAiISkAgRAlJACSAQAQACQAIAA CQkJEkQAJICAACBCEgBKoBBIAIKSQEgEAgACRAAEJIlAAICQACUAAUPKqqqykAURSlABAAoJ UokoQAACEAAkAQEkACABSJEUAASQApFIEkkFRCSUoEBAABEkgCQkkgoQQJIACkUBKCgAFAKh SEkQEUSgAQAIlCkFJQAlIBbVVVVYASAAAAJUUkCgAAACCSSoQlKAlCQAkoEkAAAAkpAJSAAB QAAQEQAACQkEkkAAEoCAAEBBAgBIgAAkAoBJQSgEAQBCQBAClCUiAQAQACSABJPIiCJZJAlJ JJAAABAJFKSAgAABEAAkAIFQIBQAkkkkAAUgASRICqpCAFKkgCBIABSVACQlKRIQUKQCIkiB QBIAAAEgkEgICAUgAAAAkEkCUQApIAvVJUjYACAAAAFEiUJAQAAqEqpECSUAUiQChECSAAQB JJABJAECIAAIJQAAJIkBJUAAJQCAAACFAgBICAIkEkCUlKQCAQEhIVAJJKSSAQAoBBSAApPJ VVe5SQkpKUgQIAgSCSkAQAAQgABKAACIAQggpSFIAAJIASBIhCJCgCRJAABIQAlIgFISSkgg EFIRApAAABAAAAEoqFIECAJAQAAAqEpCgUASkAvUqqlIICAAAACAiSJAIAAREkJCCUkAkkog lCCCAIABKSgElAUAEIgQJIEACUkCEiACEgAIAAEIQQhAKABJSkJJSSQAAgCQIIgFEkpKAQAA JAJAASXiqqu5CgklSlQkAAAUikpEABAIgBBQAIAIAIoQSCkgAgKQAUhSAgIEACRUoABAgIkg gJKCkqRCFAIKQSUCABCAAgEkgJAFCiEgAAAAJEkoAJASVBfMqqrYAKAAAACBJJJAAAAAkkSg KkICkhJCUgBBAQAKkJABKAAASBChJIAACSUKAgAECgAQAAAAQJAgBBAIEkIlKCQACgSQIACC JKSkgAACkgFAAEXSr9WqSAqSJIgkAQAJIpJIAAAEAACIAAAQAJAUSEpABASQAkkUgoQIACkS AABAUJSRIJSEpEkpBAUJEIShQBAAAQFKQIACBJQogQAAJKSAIKgUiRPIqqrYAkAAgCCAlCSg CAACSpSQokogJUlEkgFAAgAEUBACkABACBAgSoBAUlIRAgIAAAAQAQQAEJAgQgAECUJJJBQA JBUokAEABBKUgAIUggCAIAvrXCu5QBEoJAokAAgKgklAAAAECAAKgAAAAKQJIJJBBUJIBKQS QQUFABISAACEIJCkqkkEkEFKQgIIAKSAgAgAAUCSAQAABSBEoIAAKSCAEEokiSbIqqqoFIQB EKABJKJACAQUqJKQQSkgJJSSUgAgEgAUABEAUAJABFAQJECBJUogigACAQBQCQgACEghKhAS JSEpJAIAJEiSUBIQEiSSgAQSQQAAABPSqVW5ACFIBASQAAARISCAAgAFEAACAAAAAEoKQKSB UARSBSASoAJCAQgkAAAIAJJIQFIEgEJJIAKEAAUgAAQAQJClAAIAAkCFAAAAEpEAFCJKSkbJ VVWoIogAoJACUpJECIIEkJJQBJJIkkklJQCgAgAQAqAAIAJABIgIlCCASRJBJAABCgAgCQgA ASgQSKAEpJAlEgQASSglSAIgEkpSQABJQIgAAAvqqqtaCAJKCAVIAAABICCgBAACQACABAII AFAEkEpESAkVCSgSICJAAIokAEAQASpAIJIKQCJSlAEFAgkgAAUAAIEkAgJAAkgIgAAAFJQA CAKkpJPJVVXYIJAAApACSSUkAQoCkCpICUokkSggkgKQCQABACBAIAJAgoACkgAAlQJCVAAU gACgJIAAAKQgCAAElJBIkhQBKEgESABCJKlKQACVISgAAAvS/+65CASRQAJAAAABKEBIBQAC QAAAAAEEAIgFIFJISoQIhIASKCUoAEkoIFAQAUSAKkgEgCSSSAEJQqSQAAACAIEgAAJBApUQ AQAACUgABAElJSbLqruoIlAECkgKSlJUAREAkBFIEpJJSSQRKiAQAQACABEiECpAAQAAKQAC gAlBSBAigCEQEoAAASQgEAAAkqUoSggKSUgUCAAAlAJJIAFIkCQAABPqqqq6iQqioSVRIQkC qkSqRUoiiEiSJIlEQIqlVFVRVSSIioEqpKqqhKqkKoQqEoqUKopKiFVVVElKiqqqRBCFIVKh JCKCoqqqQqkSSqolJUlVVUbFVVVRJFCUFJCElKRUQRIREhBJJSUkkiSSlSSIgoiKIEIlJFSE EkRCUkRIkSlIpFBBQBEkJSJIkSIkUAkRKKUoigkUkUpUShBElCRIkhCQkiSIiAvqqqqtVa6r 1Va1VVWrXWrW1ddVVVVVVaqqqqqquqtqr1rVVVV11VW6qrWrVtVWq1ddX9VVqq1WrVqrV9Vt VqqqtdVVVqqrVddaq1WrVdatVaq2t+vN//d7/33+v/vf//9++9/7f33///v//v//////7/+/ +v+////vv/7X/999+7/9/v77/X////v79/f+/X/3+///73///f/+/r73/f9+/7v3/t/t+r3f VV3eq9dX6r71VVfXrvVf1dtVar6qr6qqqqq1uqrq36vqqqq66rf9VfXfXuqvV6uuq9aqqr6+ vV1Xr9VdXqqq+9VVX1VXq+u9X1fXqu69V/V7X9////////////////////////////////// //////////////////////////////////////////////////////////////////////// ///////AIiAARABABAACIiAAAARACAIkCAAiIBJIRJIEASIEABACSRICBAAAiAIAQAQAABAg RAhESAAAAQEAAAiAgJJEAAkiACIgEAQAgCAAEACAgAECAADVSUVVKKqVUqqpSUVVVVKUpVRJ UqqUiUkikkSpVJRSqqKpJElUqVUqUVRVFVKqqqVKkVEpJVVVVKpVVVJVKkkpSqSJVUlFSqlV FUqqpVUVKqopVVXqqrVVVqqqqqqqqrVVVVVVVVWqqqqqtVVaqrVVVVWqqq1VVaqqqqqqrVWq 1VVVVVVVVq1VVVVVVVVVVVVVVVVVVVVqqqq1VVVVaqqqqqrVVVWqqqvFVVVf+//9/////97/ //7///9///f/7//v/9////7///d//3//////979/v////////ff//+/v///////////v//+/ /f/f////3f3///9//77//3vVVVVVXqqvVVVVVXeqqq+qqqvVVX1Vuqq6qvVVVVeqqr3VV9VV VVVVXevV6qqqqqqqt11VVXr6qqqqqqqqqqq6qqvqr1V1VVVV91dVVVvVVeuqq9XKCAhYAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhUqW5ISlAkklKVSCVVJBKpKQqqgJJJUqJVAlSqkhJ JIRKSCSSlVVKkBAkEqqqqSkpJJKVSkQEqqqpSSpSkklEpJAUkJSKUpJICKSUqpBJUhRSSC7N VVWoBAAKAQAAAAoAAgEAAgCAAEggAAAgAKAAAQEEEBEAAIAIAAAABUKAQAAAAACAAAAAAACQ AAAABAAACCAQAEJAAgAgAAEBIgAAAAUAAEEBAIPhVVW6kUpApFSSRICQgKRIkEghCQIKSJAK IgokQFBBBQBSpCpBIhCRIBApFCEISpISkkkiUlIFCEIkkSKUggoFKQgSkKSElKRSAJJJCIBU kggkUivNVVWoAAASAAAAEBICFAACAQKEIEhAAgKgiECBEgUIICkAAIAECEIEAISAAIQhAABA ACAIAACQIQiAAAgAEECQACJABAAQAAAAkgggIhIAACCAAAXRVVW4kkkASRJUhICggSSQkEgQ iAISkKAAARAkAIBCCQAkSBKRIQiRSiASkhCESJAUqQpBEpACCCAlJIJEhBAEkgASQSSFSSSQ AEIKQICJKQgklVfkr+rKAABJAEAAICQKCAAEBQBCAShABAklJASAShIIoCSBAkAABCAAAAJA AEIQAgKAAEAEQAJIoISAAEgQEUJQAJJAJAAgAAAFJQBABEogAEKAAAHKqpW4qSQAUhKJCQEA QlKBIFIIkgESQQAAASAkAECACQAkSBJJIIpJJJAUpAhCQKQkiBKQFJAACQApSQEFABACSACJ ASoIklJACFISQAAKkhApIS/orRXYAIElAIAgQCQRCAAUAgAgAEQABBKUlASBKRISQBKAAkAE AgAAAAJAASEBCgAAIUABQAlSQBSAACQQJIJJAkogJABCCAAJIAhACUkgAIIABAXLWKqpEiQ/ 0CQIEgFfIkkMkJKEpBEl0IU/AWA85wDAEoIkkBKRSElSUkgJIABQQElJCAikCSAAEkASUgFC CCAASAAKAUQQgpUgBIISkAAEkiCSkSfoq1XYQAC2woChQJRgwAAmBAAQAEAAghERyDKKQhKF QCYAAkAAAQAAAQEgCkoCEQAAQiIAIAElQAJAACQIoIKSASRAJBBEEAACUBBAASSQAAIAAAnK pKs5CSQmUCgIEgDKUpSEkSQFKhSpiIKQgmAM1oBAFAGVIBSSSFIlJFAKQICQhFJSEICSCkgA FJAUlICABCgAoEESgAUBBJEgBQQSSAEEqSiUpJfIq1XYIACWTxFe7u+No8cVlznd9kOHsyYb riyURju3Hb0AAkAAAgCAAASgBBICIAAABAoAoAEkgAlAABIJEQBSBQQACVAIUAQFIBBAAJQQ AAAAAgXqqqqpClAGG5R1JNUyLlkGzW7ImwRMsQSfGzYlRNS7YmjJUAlJIJIpSQAEkQCQCSUl QSBIBKQAJSAJJQRAQEoAQCFIkAJCBIFACUUUpACEiklJIJPJ/v/YQAJXWdAhzEUipA5WaVSq kU/qlZRRmaqGvHyZPlGABKAEBAAAAFKQABIBIAAACAIhEACUgAEggBAlCQAlFIgCBIgIIBQU oAAAAlIQIAAABAvTV6q4EkgGGYIow0tqLUYESERJVQUIkQYQ0SISqkKRIsSkAAkhQSSJJAAF SUCkClJSIkgIRSQAJJQIJIIAIEkAAAJIgCKCCSAACSSSSACEBKSSQUblVKqpQACWXYhia7km ZAMkzVV3EZQq1RSalWaLWEjVqFCAqkAAFAAgASSQABIBIAAAgABBAAEkgAAhAEkkgQAkkSgA JIAoRAFSQAAAAJIgkAAIFAvKqqq4CUoGGbIhITWbhrks2GwqmSYtm4QxmyYjGuKRMUKoABSU AVIKUAACVABIBJSQKUoQSSAAKUkESQAAKEkABAJJACQBASQAElJJJAAJBSpCQJPVVVVKRAAv TxB1yZCiS86nnLpiO6vHTcs/Lr0BUD37numCkUABSAEgAkpIAUkAkAAFAABFAApSgACQACSU gQBKUJAAEoBEKABEiAAggEkgEAAAAgvKqqq4EJIIEQkhIglpgAQhAAASQkKkUAIBACBKFCQS RIEABAlIAiQJIIARAABIBSUgSkkAUkAAEkgFKAAAEFIAAgUpICUQgpIQIpSIKQIJIkSpIJXX ///YggChRCAEACAeElCEJSlACAgBAQkkJQkAgIFAEAoUkCAASIAgCglAVJUCUAABAAASABFK QACQApJSRQCSSBAACQACAACCgAABAEggABAACgPNVVUoIKQEAQqRSQkBAIIQgAAUgkEgJEMB AEBIIiASBSNABIpKACSEgEAJAABIAlJQSSSAlIQAFSoCQAAAACQAAoJKQElAqSggESSQSAEK SQUUgKvWqqpahAEQSCAAAEAkKghCJKSAKAQEgAiUEgkBCApAUAQCUAAAkoAiEQkgElICSAAF ABASACASQABIClVJSIApSEgAAQAUAACERAAFApRAACBAJBPmqqpYESBCAgRJJBJBAEEAAAAk gSEgKSABQIBIQkASAkCQBSSgACkAhEAJAACQApJASQUAkglACUQCgAAAAikAAAKklFIBEpIR ASUgQAASpIgJAQvXVVVYQAoISJEAEEAEEQQKSkqABAQCgIJIEiUCEAJASBIJIAAFKQAUEBJE EpICSAASACAqACAJIBEoEkQlKAAkkkgAQABIQABACIACCklAAgEgJCXMqqpZCQCCAABSBRSR RCCgAAAlIUFQEhACAABIhJAUAkCACUkgAEpBBICBQACQASkApQkAlQogCAABIBEAAkoABAEk EkkCFKQUoClIgAASIKQKAIvmqqpYIFIIJSkAoAAAAIIAkkkABAgCQESoJJIAAEJBSAIkoAQE pQAIUBIIBJIElACSACBEAECEoUkkCUAUkABJUSQAgABIgAJABQAAJKSAhAEgUhPOqqpZCQC+ gHB0CSUk9yhKAcHe8PP4aAAxARCSWhwcdSzg53k5/C0CBIBCYARAISQASQgRIBAABAIBABKA BSSCAAiSJSgAIiAJEEkkAAAkISAEAEbrVVVYIAQx1LIwIAQBQgEAVOXEMmWJIJKQlFIACC1Y zARyxhh0hJQoICUUQlAkgABJAEFABUJSkCgkJIAiUAAICSIIAAFJCIkgQAABSkqBBASRJQvO qqpZClEygDCKCU1QUyBSAaKNKKEoagAYABCpFQotlUlRUpRRkBkBCQAFMAIBFJICKBAJQAgA BQEBACQIAlJBIACCkkgAQAAJCpJQAAAgQSAAACbSqqpYQAA4d75x455Eyh7u6KqEOrURI69T XLbAXBoowAxVQhVYinz19uXvopEkAAgogUUkCiEkkEQUEoCiSAAEBKQQCACVCSSgIAgBKSkK FAUqSRPOqqpYEkketzcyZNxAfrZEQrbMraHwJs2WLBdpI0voejDb017Q+BOzW7MkGAQAkoKA JAAAgIQIAhFBQCgAApUhIAEEgqQAIEAJBIKUAABAgUAAgEbrVVVZQACXMzO3bs5JQjJU0JaG JaVSrEjcslIgMg1tWJJKQhKSylEamVlsUJBKABABAEiSJBBCSIAACQKSSACECSRQEAJIgQpA EBAASUkEEBSkCQvOqqhYCSQHs3M/7CwCUqamhLSkZSEQJVqUGBKpPklIBBBaVjLQkBlSMRGl FAIApISoSQIAAQQQACSUQEAAgSAhAAAEhEgCFAAUhISSAAAhBAABICbKVUtYRBBhuzs2DI0o RiI7kIiEJiWEtEiTLLYgQQqIllTEwpMagVETFVI0EEgkABABAAgklCFAlIABCQSSJAkIUkkg IQEoQSlAEBAAJSSEIlEkBJPnUrRaEQQ5szN3bk7BQrZRBY2mYrEoJ823JhK01ZitzBBVQhFQ zBW2ERumVQKBKQSIUkIBAIgSACkgIFAAAQBCAIIJCEABCAAJBISlAAAggAQBIAvOqqVYgCC/ Xa4z16ZE9x0VUenOenP5e5c5uD9w456cuJrk7705/Lznu7nTMEgkAFAiAAhUEgCASQQEiQEl JCUQigggIBUkIEkgUCAAkkqCJJAkApPVVVpYJIkABIIwBAggBEAgAAAQgggEAESASSAEACCA RAiIECEEACJAEkQkIAABJAQAlSEAgKQkAEFIACQIAQAEIEEKCgAACgAJBIkkABAgAAUBSArn VVJYgAASkCi6kKKJUBSCkkpCAKCQUQAlAAVRKoAJEFQhQQgQkoEEQBCAwpKkASFKAAQCEgCA pQgBJIEglCkgAiRAQFJJQCUgAAAAKUAFJSCUAJPNVVVYJSSABALgAgAABQAgAAAQUAoCBCkA UpAAABSgBQYECEJEBBBQEgISaAABSAgAkUFQgEgoACJIACAEAIAJSAAREgAAEoAJUkpJAAqQ AEAAkg/WqqoqgBAkkUggSBJJIBKJJSlBAkBIIIBJAACJJEAJIAiQIgAAUEIBQEhAACokASAk BAQCCQSClIACSopQkgSgAElEAESqQCSgAAAgRSABKQSSABHNVVVYJIQAAAIKAkAACUAAAAAU JBECiCQAJJIgAQkASIAEgJUqAhCQFIESSoCAkAqBIJCIQEAAACSQAAACAKAKSgABSRAAEAAJ FSSJEASkACAAqUfmqqpYACCUpJChKASVIAIqVKSAgIQIAICUgAACpCAlAhKQEgAASEIEgCQA AAQSBSAEAgQgJQkpJIAAqJJIEgJAAJUkAAEiQpJAQBAAAJAAJIVSAAvWqqq5SQkACAQAApAg CSiAAAAgJCFBJCQAKUkgAIoAIIAEgKJEAQhAJAEpIkEAkARRIJEKACAAACpKAgACgEgSSAAA lJAIEAQSCQSSSASSgCAASSXGqqooAAASQlEUkASBIAABRJKCgIAkAICSgAQJEgBUghJQEggR JCESgKQACBRKAJEACgAApIJSUoAgEElIJQJAASRKAAUgQlBAICAAAlAAEokJAAvuqVS5KlJP Q9BHB2AYCSTpwIAoJCgBUhJkEkEgQJEAIIAEgAJAAAQAJAElIQAAkgBJIJJQACQAABEEhAAA AEgSpAEApUAKCAIUhIlKkASkQABASkbFVVVYAAAY1jIDTiksoAFAktUBAQEkAIgkyAgJEgQE hCUgJKgCUpBJASQABBEkAEkEAAABFIBKkkQQIJUlUgBAAKQkABJBIEhAEAAAASABBJIlABPu qqpZRJS0zRCSiwBICpBSgBGISEgAkCFpjSJAAIFAIQAJAAKQAAQQSAFJIUQBSQAhSlSUQCQA AAEEiAAAAJIUSACBJACACgIJBSSRKApIQACAUkvGqqpYEAAwTFYGqmfLjhzAy7/24c3SH24t /7cPfNQUhAkgCpAJSlFBAJQACABUABKAAAAAAoCkSkhQAqRSJEBBAJIkAFIJIEggEAIEBKAC CSoSABPtVVSqBUk0LBKS2rZduWZUgNUbtybAYbskiN25NjAAIUAKoARAAAAIUgCUgkkAlIAp JSVJICgBAAIEkAEAgRQAVAABJQBABAIKglCRIASQkAAAkgvGqqpYkABwjUADViSIgz9ApJFV UHZTkZG2rIqDo01JCCSgACEJJJIhABIAEAACAEkAAAAACQEkSSggBCQKBACVAJUkAAkKkSig SAAAAJAEBKJSAKXuqqq4Akk0LBVCUqQqjSBSgZkRGaTDRTUkiajNKgYAQgAESohAAACIJICl BKSopABKUkiSgEQAAAIJIQEgoJIAIgABUkBAAAAAApUklAUhIAgAkgvKqqpKSAAxTRAKqiyI s2RAyNFVUmRFgREkyIqVIhwlEIqRAAASSUoAghIAUAIAAJUAAAIAJRCUklBEACQAEgBIiEiU ACURJKJKSAACAJAIASBKABPWqqpYAlSY1nJCIqYsmTHShJURFy1QczNsmZi5s3KABCAASSUA gACkIIBIBSCJJABJJKCpAAQABASBSgFKAJICAQIAkgAECAgAASJIpAJCSAoAqSbnVVU5KAAv g+sXt3Pd7p7h/ez7ud7gm7v/Z93O98AJIABJAAASJSQAhCUBIAQgAJIAAAQAJJBJUJAIAJQA kgAoJAiSAJJQISEklAgAASgQAkAkAAvNUqpYAkQJJAAEBBSRCUgQJAJJIkAUIAAACAICBBSQ CUoAUqlAAAEkEQBICSEKSAClSkESAASAAgSRJACQAKkBAUAAkgAFBAQBASKkkAIFUBKBEpPX VVVYkBCgACJQEEAEAAFCgIkECBJAhKkiISgokEAAoAAlAAAJJJQAQEkAoAhAAlIAABRASlAk iBAEAFICSgBEJBJSAEkgkJCUSAAABJBQAUAIQAvKqqhYBIQJSQgChQkhSSQQJCBBIQAIEAAI hAKABAkkClKAJCRAAAEqEgBUCSISoABIkgASAAQAIUJBUgCkAEkQgAAApAIIAgIAAkiSQASB EBJCEkbXVUtZUCBAACBIICAAIACBAIIIBCShQkUgEJAEkSACQAAkgIEEqUgAQBIAQAAACUkC AKJAKSCShAEIAJIBKQACEqSSASggSEgSSAIICVAEQkAIgBPMqrRYBIkSVIUCCIqUClAkUhCC QQAICBAJAASgAAqQEkgAKRBIAAJEFISJEpKSAABIpAgVAAkAEJBCJABIAEkgQAgASAEKAAKA ApCCgASQEBJAJIvnVUqqIAAAABAQQgAAQAKAAEQoCEpCIEEgSlAEpKACQAKkgEECRSgQQBAg AABAJSUAAEJAJKBKQgIQgEkASQQJAkElASRAJShJKAQQFSACQkAJEBPWqqpYiSVKRISEEEil EkgpJAECggAQhQgJAASQAASgEpAAEhQgEAJFCSEKSSgUgABJKRAIgAgAAKQEJABKAEEgUBBA SAASgAAAASEEQAkgEBUgBQrGqqpYAAAAECAQQQIAAAAAAJQQKElEECEgCSACSpACQACKQACC QEgAIAQABACAElIgAAEiEkSSSgChAJUASQgBAkESAklAJKSSpAgRAEQCQUAEoFPtVVVZJVJS BAkFCEBIkpKSkgCEAQABBAgJQAkgAASQFJQgEpAoFQKRCoFJQUolAAAKSkgAQAAAEEgISgBR ACJIIBQAkBAIAAAEAQKAVQFQFAkgCA/GqqpYAAAAUKBQIQkCQAAAAJIgRBJIIKCgEqAJKJAJ QAEBQAKAQBAEQBQACAAAKklAAAJJBUlKQQEgAJIEEoAEhUCSAkIilJJQJFBJAEgJQCAJISHu pVS0qJJJBAkCCEBAFKkpKAAJEIACCAgJAApAAgSACUBIEkgSBISAEQCSQiSRAAASkpAQIAAA BCQKkACBIClAIAgAoACAAAACAAQAIAIACQkABBfKqqpYAgAAAEAIQiUUgAAAAklEAgpIokJA EkASkBAJIAoggABAkBAUhBIICIAEESpAAAJEgiUkkBBAASQkCQAEgiJKCSoSSSVISSEShShJ IEBSkEXWqqpZAJSUqRJBEAAAJIqSgAABQKAQABAUgBIABIVACSAKKSQSBISAIUCCQClBRAAS SSAAKIAAIoQRKAgBAEpQIIAAAABAAEACAghAEAIACBIABBfnVVVYKgAAAAAEAkkkgCAAFJUo CgFCSUFASkBSUCAFIAFAAIFAECASgAIQBIAEASJAIAkkgBJSgAFEBKCUSQAEigSSUpEEpQRI KCASQJAlIUASUUHMqqpZAJKlJKUhQAAAJASUgCACQEgAABAJABIABIiQCkgRJCQShAkAKShF IBJQkAgSCSBAEkAAFKABIAQAAEkAAFAggAQgACECgQoAFASACBSAABfWqqpYJAAAAgAEFJJS gJAAEoBIEQEUlIUgEkAkkAIBICCEAQAAEKBJAAEACUACASBAQAkJQAJKQAUkAJCklQBSSQSE ClCClIQQBEBKQSIJIIAkkkvOqqpZASkSSElAAQQAKQSkgBUCBEhAACAJABUBBSCkBIohSFKU hAkASkBSQBSISAoUFIAAElAAEkABSgQAIEgAACABIAIoACCEQBIAAECgCiSAABPTVVVYJABA AQASpBBJABAAEkAQUAEBUoEgSUAUIAQAkAAIAAAAEEAlABUABIAhBKCBQBJUiASSQBSUABCS gAKSlIJUAkgAJIIRCUEklQQEoAAFSkXuqqpZAUgUkFIAAIIASSJJAAiEBKQoABAIEAlACSEk BJECSklJBRIASQAkoCSAQAAgCQAAAoEAEgAAkoQAFSAAACABIAJFACiAQAgAACEQBJJQABfF VVJYJAFAAgBKJEglAAgAJSIRIACBEkUhQSAEoAQAUARIAAAAIACSAEiAAoAKEkqCICUiUBRJ QFJSABBKQAklJIlIAkgQEoASJSBSqIRAkAEASUXWqqpZAJAJSJQAgQKASkKUgACACSQkQAAI CAkQCUEpBIACUpRSRJQAkgIqSCSAgAAoikAIBEAAFIAAqQSACSAAAAACUIIEgBJAgAoAAiAU BKQlABPXVVVYEgUgAAFSBAgSAAAAJKQkoAEABJShISBCQBQAABSoAAEAEAEqAEgAAQASCUkA AAShIQCUgASSABAJIAJSUpJIAhBQEkASCSBJEASAkACAJIvMqlRagJAKSSAAoKEAklJJAAEA CpBJIAAECAgIEgEkqSACkkBJBKAAqQEikFUAkABKSSAECFQAJJAASUSACUgAACACkAQFIBIA QAQARJAiBSQoACbnVVVYSgAgBAIkEgQUQAAAJJQKQAEAAqSQISEgQEgAAASQABUEIAkkACQI CQAqASkAAASQQgCSgAFJAAAUoAJJSQlIAlCgAkBJBJCVAACIkAAClRPWqqpYAJUEkUiBAIFB FJSkgAFAEShVSAAFBAgKFAKVJQAElIAhCQABEgEBICIAkABJUpAEgIgAJSQASlJACkAAAEAB IAQJJBSASAQAJSQAAlKAAAvGqqpZJACQAAAEEhQIAAAQCUgJRAIAABKQESCgQKgAAFKQAAiA IClIQJQkBIhIBSUAAASQFCEpAAAVAAACQBSUlQSUBJBAAEAlAlBIgBCSSAAKUlPtVVVYASA/ 9GpSgEBOj3eHv8IgAUCEUoACXMQECAEiSAAFSSI0igCDEASBAwECQABJFOAEgcQASVKYSRUh toAgACABKQQSSQkA0AXCKQYAAklAAArGqqpYlASmkSACCQEGHDGjiFCBJAoRABJICFERIkQI ASSRAAASAJK1hSYkKSRIJJIAQUJSFFBJAABIAEAKmiKCSIJICCNAICAlQSBIASNUqAASRJPu pVSoAUAkkCSSQFIlVSFFCgQoAIBASQACjYBAABEipAAEpUkKkAARIAoBAwACACCkAFAChEUA UiQakgkhUggQAigCkgoUiQkBkAhCRQBAApQAEA/KqqpZSApMX2OGPRyHFKNNGJNvPjrnh98o KB90vrm3Nz57bDx3j/+9aKs7L33394Tn18H3r1h1HNl4d7mYE0edeA6dmPfmucB7x/d4c87y kAFJQlHWqqpYAkAFGyyiyDIltDFtj8G7ImkmbREACU3YNmzdmzZJNmkSREbVshENmTUSKgGT ZtWSDWyoI2zJImyNNhkiTRkGzZIiamnZJiNtyaNQBJAACAfnVVVZKAlUEaaGcEYMrKVpDIWR P2HIyJ+SrAiMoEWI0SNzM1QbFmSREBUqmaXyIio6JEA2RFX4vkSMKmWoEgw+fCNUaUqrS+CJ gipEHQJEkASVIkvNVVRYAkAGVSMiNR6FpiEtSSE1YDjDzrAACJqoKWSqlWoxYmZSAkmZlL8I 0SEltQDSrFHSFUSEKNaolEyKUodpQk8GSwIiQhKrEaTWeSrABIAAABXXVVVYkAkUETWKmDIU VDMxKAURMlp2VxSSSgiKYEaIkSIdIzgSS7zRMCDalaWB3EVSJMFTRGaQYkSKNUSYGisgSBEU aUqqZkCJRd5EyYJUkCkkSUPKqqpZBIBFUWSCSTKGRSEVDMGTMUkmRJigGJqoO3zMu3bJKmSW AVCVFSmImzGYilGbNtWaDEzGMVXYCm3aUok1YzlGyYo2wxnZAKhUyxJABIBBABbXVSpYECUO P/dXdB0ubnvT3+u7nnXDt48knB3cnjnd1x5z9zw5kxHPuHHd7vDxmELvc6Dpo+54nu52WLhs Pw5efA6HnvXb5eB3yYrvdMeyUAkISRPMqtVZBIBIgAEEkUQBCIIQAAAgRIEoCGKQAkACAIIR FAAkgEMiQJQhIggEAAoIRMBAhEQEBIEkJICIGCSCAkIBCSUkQCAIESRAQECAEEggBIACAkfn VSpYUBICCSQQABCUQhAElIKFECQArchBKAKokghAMJSACu4IEgCECKJQkqAhAIkSERBQkAiA gAog0QAoSAiUIAAFFIEiQAEJJQQSQQCFICSoSBXWqqpYBICQkAiFJAQAEESAACggBIEkDwAU ApAAAKEUuAApQDkCQJIhAAAEAASIJEAAQAUCBKAkJKAEZEoCESABCpJeACgAEkhAAFEAFEoQ CQABAQfGqqpZIBIEASAgAlBSQQAVJIECUAQCQJKASASJKgQACSSAJEAoAgAIUkkhKRAAgRSl BSAIkAkBAACREABIRAJIQAAAJIJKQAIEkgAqQABAoEpEJCntVVVYCkCBJAQJSAUACEqAQCBI BKFIEAAiASAgAEEkgAAkARSCUKSCAAAIAEVSJAAAQAigBIBIUkoARKQCASQCESkSgBAAFUiQ AJSACSQUCQAQAIfGqqpYoBIUAJCgASAEoQASBIUBIAgAQSkJJASCkQQAElKBJAAAAgBIJJKg pQAAAJKSFKIEkAUCCABJAACQSAEoBABAEkFSQAACSgAEoICAQAlBShXulVS0BICBSAQEQAig CEiAkBBQCQJJCABAAUAgBCFJAIAQASUpIEkCAQQIAFEUkAAAgACABSBAgpIAUkgEApACgUkS AIgACJJIAESQCCQkEkAIAEfFVVUZEBIIAlERCkISQgISAkABICgARKUCVBSEkIgAShJElAAA CQAQlBACkgRAQlJKBJISUAIUEACVAAFQSASQFAAASgIkogEBKRICQQCAiAkhKRXuqqpoRIDi SDBActAAEJxAkBeUCgJcIABRBgAoAgaUAAABceSUgF0EAIdAAIAJEGCgQABOUlCBBKQAOyQH ASBqQJSWAEiAAKcsADDgGlISIpAIAAfLVVVZABIoAJkFEkClRAUCAUYBIJAGrJIBoqKJKCoB JKSUMYAQJURRMioKSgkgBKKxEkkHUAIEEAakUhCRlAGoAiBEKQAFJAEEklApmABAAAJCSSnW qqpYSQBhJBBANMoAASRQkAKAAASIBQCUMggcAQMgAAEAaKlUgEwAEKJAAKAJIDCkBBBOWSCh QkiBFIIxAVSkkGTRAFJQASFWABoiiiQUkSAQAAfLVVJaAEkjh1Mclkxyd3WHNkoXnTppb13f fuBWdl673v4RLoc85PeXvnrLy7/cu+JG558+IH9zhw33Vjw/acH653j99w4Duw8Fz1Hp645C BAlAklXuqqpYlAA27Zq0EtmYqi7YuwMicm24bBqJI2QiGzJqZkSEJK2REUbMkCtkQRE2aygT +bNmiiIuWUWMkuURsiKJrSRE35GOTbtGzZNgrZEAgQAUBAfKVVVYASqlSp4yWnD6IqRPkyoE J0UZJAipYyCyVSbL5GYQt4jT9FRlsmK35VGjUmJDGYNmAKKgzQyRlkQZU+irLLFWiL8g6pEM aNYpiL+UFCSAUJXXUqpZIAAsSNRYElKAmlVKUUKW+KkQJUSVKjI+EaJCE0iCIqqZQUVGlCol AJYyRiATH79uSDZTZkSHslFTGkCJBiBEqZQLSNVFTJKgqpQBIQglAAfmrSpYBJCkWpIMmsik HcRYFQoIQptibA9xoqBBtSpmQ7wIKoiRFFRI0KKkCu4mYzSLWDNnAR3FQxWsksARUxLNSyJm jJBEypEUSpoiiJEkACCABSnNUtSykAQnzZutElzFKZVNUUNIdOtoJSMpKilVEXbDGRGhI62z iMZulDI2oMU2w2AjHrdmSEimWQSMlnZVExCZCbDEyLqWWLsFzbNwzNiBJIQkoEfnVSpYAVF7 p7m4P+d4CM7nv4cquky08wJj33Dju53l4ViEcIeM8D7nbJ9z5Exc6dKHr127AQmLrq5nfz0P veX/rho/3c9Dvc7Xlz3Sfc8kABCAAhXMqqpZSABAAAQCRBAkkgEoQJAIACRAEkgQAJIIRAQQ kgIhJEgQlICIACJEASACACARAAFIUEhCRAkhIIAgQEEAiQAIEgASQhIAAIEIAiSBSgQkkIfX VVVYAkUCSlEoEUSCABQBEgJAJIESQASCkgChEVCCAJCIAQJCAAogkogQRAEoEoJESpQBAQIQ ESCEAiCJCQQiAFSiQFSACECKUgAgqAAEAKEAAhXNVVRZIBBQAAACQAAgpIEgAJASgCAEFJAg AJIEAAQgpAQCkEgQkkAEAAIEEJQCQCgAAACQSEgEgAghSAgAQFAIpAAAEgAkghAgAKkIApJQ kAhVIEfrVVVYEkACSJJIAiSEACQKUglAEoSQQACJJEAQJSCCAJBICQBCACSRJJChQgBIBIBJ JFIBAQBQEkEEASJJCQCgASJJQJKCCEUCSgAikAACAkIABQnOqqpZABUQEgCCSIARKQEAAIAU QCECCSQACBSEgAgoSAIBIEoIlIAACAQICKUCkBIAAQCoSEoEgBBBJAAAICQKJAgAEgAgoQBI AEoABKkgpBCEoCflKqpYSUBBQEoIAApAAAgpJCSBCQRIIICUoIAQCSEBAkgkAQAgAAkkoJBC IAAQAkCSlBIBAgEgCUUUACVUhIJAgCCSQCSEBAkASQCkkAQEAEAQCIXO1VVZAAQUCABCpSAU ikIAAQAgIEACiCkABCSFIAhASAKBJEkJJIBABAQQhJEiSBIEAIBEIJAKQAABKQgAECAQKQkE EgAhEKBKAEgABIFBJBSEgivrKqpYJJBAIUkQAAFAIAiSVBKEgQpIAQAkkIAgASEFASgkAAAg gCUSkFFAEAQIAkCQkgkQEgEgJJJIACAJQRJEgCAQgEkEQgEBKQCKUAgUAUAQCAPOqqpZAAQJ BAAESSgJCUAAgQAQKEACSHoMBCSJSAhQSAABUpSEKQAABQAKBSECQBAAAKAFAKQEgAACkkVA EgAAEgkgKRBAAJQgAEggBJEBJAkFIVbSqqpYSlCgEBJRAAIgQAlKCCpEghEoARgskIAAAUIA AJKkAAAQAEkkkAIgUAhQCkJKUgkgUgCQEpSoAAAEgJKSQKACgAESSgCJJQKBIABIACBQBAPO qqq0AAQJRUAAVICIEkAAIgAAAIQBJBqEBCkkUBCVJAAAlKSFJAAAAlCJAkIFIBAAAABEAEgE AAABKSRQJAAEEgpIEpIAEEQAAEgoCkgCkgkCQSvrVKpYSSBAAASSAaohQASS/uJJKiEkjDgQ UQABApQBASSOAAAgAJ5KSAIACAAgAkFSSUkQRQCRSlJEBAEEgEpQQAAAQAAlQRCSUgABIQKQ QKAIBAvOq1SZAAkSSJAAiIJkFJAAksgAAAgAJRuePn987BEhkEAjIiQJSBQAFSCSQlIJSBQA AAAEkFQAAAARIUgAJAACFKKSFKSABAIEAJKIAEgEEgkioJPlVKpYEqAAAgFKIpIQAAEq0kCS okBJBF3MzMxmfEgKCQSCCICgAVCpRAoACACgAEASlJUgAACkkklAAACkgJJIQAgAgAAJEEgQ kgAiSgCQgAAAEgvOqpVZIApe8PnNh4ft+vgAGFpwd3eXfRztxczT8jPDbCcquXvHbj7mz4Cp ISQJJQlAAAAJJRIAIAASSSQAKQACCQJSIkpAQgKCAKkAgJIEJKUkAIbrVWpYAkA0jdNm7Msm 7IykUuyKKibtdBnM1Mb/YJJRtoyCZtaKmpGzdCQAgICAACACSVEgAEAKhJSBABBKgElIICgA CAAJCChISgAkEgAhAAAAkhPMqpS5SBIw+Qo0SoJtRPgBEFX4oqxIRljMzNzAaDNFKiWmHKVv tDUWJgESFCgkkgkoAAQKSBKgAAAkVIQAEgACRIEkgpKAQoAAAEkBAKSIUlJSAJbnVVUoAEBZ kSKlSIokTYEkEkSSGkVNRBztenjlYJWBIwaCtIZIERFSpCRAQAEQQCAAlSEgAUAEKVKAAACk QBUoAgQACAAqEAklSQAUJAAACAAASgPNVVS5JQkMhQokaqKlVKQBWNSAXeRoVTjMQMHhahDR okmiRaeakFESNQAQEohEFIpJAAgJUBIhAAAkiVIBEoACSEFKQSgAhEAAAEpBASklApSSAKvm qqpYACA21cttTYYsRMUkEEXNCYbJbB2Nfnx2YBtFKhyLdIIMWhO7JFSFQCEAgAAAJEEgBICI JIkAIAAkAAiQARQAJAKiARJSKQAAFAAQEAAAJBPOqqqZSIp4efPO72H+73mAuu54KKecew9e f3899Luj9wdHO9PnuLznd0AgCQgkJSSkARAJACQCACBJCRSBJIIFIACSAUAIUAAAgEkqQSUE hJKpAQrqqqpYAgACQAgQAASASBISCBIggQAiBCEIk4OEEEAIiKSQAkUgQAiQIJKCIECAgAAA pAEgKoBISoIgQEAEACgQClIBJARBASVKCQAACAAgEAAAlBPOpVS5IJEAFCFFUpAlAkBAgoCK FFKIgQhCweUgghKCIgAEoBZqFIIEiAAgiBIkJKUoAUgJACkCACCIEgkhUgKCQACkAJEQSAAA QFKSQkkJIkkSAI/TVVUoEgQpQIQAAACACAkCEBIAQAAAFCII5uICCIAIAAkiBIOggCgQASkK AUAAgAABJASgEQAIKQoBQCCEAJAICJIASgABAlRJBQAAECAgAABAIiHOqqpaQIEACAEkSSQp QkBQhECkEkkkgICCfHyQgCkhJKBAkCQIJIKEkABASBSSEkkkAJAKRElCgEBIFIggkgSiQgBJ AKkkIAEAQCSkhIkKlVIJCBfVVVVYAhQlIVQBAACACAkCEQIAQAAAIhIIkIICFIAEEAkEBIEg gAAQBUkCIIBACAAASgJAAAAQAgEAgAECABAAEEkAJAQAiUgJFIAAIABAAAAgIEXOqqpZKECA CACQSlISISAgQFBJCSSpCECgBCiggBJBBQBIgCAIJSiFIABQiiIUgpSSAIASkkoEqJRKJSRQ lISSRAIkAQFSAAJAACkpCSQRIiSJChfqqqpYAQIEQiIJAABAhASJCQEARBAAQQICUIAKEkAk ICUCEopCgAIgAiUEAAgAEABBJCpAAABQAAAAAAACABAIASgQlCgAEkglJIAAQAJECIAAQEHO qqq0hEhREIiAUpIQESAAICRSAQUSEChIBCSAQBSBCQBAgACIJJAJSIABIkKShKQQAQASVSQE ikkkkVJISQSCSAEEAIIkhAIAABKIFJABACpSEhfmqqpYEAEABABJAACCQAJShIAAFCBABIEA kIARCUAEIBIUSSQgAAEgACRUCABAEACCVCJAAIEgICCABAABAFAQASQiUgCAEJCSUkAhQEEk KQAAgEvNVVSqQlBKQSQAJJAkEpAAACklQIgUgCBJBCSEIAkghICAAAEFSkgJJAEAglISRJIg AIgSQCAJBIQpQJUgUgUFJAEAAKgqQAQAAIkICQgBAESQJBPmqqpYCAEACAEkgAKAQAFKUoQA AgJAFIUAIIAggSASEEoCSlQQAACgAJQCCAAAAAAFIgCIBQSgEBAAEgAFACBQACQUkgEAElEp SiBCICJUJRACgUXOqVU5IpQkgkgIJKQkiSgAAAFIkKAJQBBSCCoIFApARACgAACCUqQJUgFQ opKUkklACEkCkEgJBAUkAJFAJQgCUoFAAEREgAAAAAgQhAAAgAUkEBfqqqpYAACAEQEhEAAA IAESSigCBAkgAkAAIQBCQCAJASQEqSIIABBAAEgCAAAACCAUoQAQAgJAUKABSgQUgECIACQB SRAQBUkkkkKEEUkiCJAARIXOqpSqkkIpRFAEBSSSCkhAAIJIQQBEkBUlCEQQEoSASAEhAAiC SAUSJAIgSJSSQgoABFJEoJASAglIAIAAKBIikgCUAASFIAAAABAhAAIIQgJRACvTVWpYAAgA AASRIAAIQAEEkgAAJCUQCUAAQRFCQBAJAJQEBKAoAqAAgUiJAgAAEECREAAAAgJAiCABJBKk gkAAAJIAKpAgEiVKUkEAEighCEgEFIPOqpVYqSEkkgAACSkhEpBAIKklAQAFIAkoEAAIEgSg SQEgkAkCQAiSJAAASKSlBBAEQkkpKJASIgkkASAAABUokACSAAQJAIAAABBKQIEEIQKAgCvV KqpaAAQAAFKpIAAEAAUKhACACEkgASABRJIgQFAJAEgCAkAQFEJAACklAAAAIUJQCACAAAJA AKAAlARJKUACAkoASJCgEhIpJUUACgQQiEgSIoXO1VSwSkFKUgAARJKBJJAgARIpQgAJJAlE AACFEgSAUgJQoBJEgRAUkgAASSUpCBAFApISRJASSApQASEAAAkgpACkggQEgECAAABSgJFA AgEACCvrKqpZACQAAEoiEEAkAACAlEAACCkgACAQEqoQACAJAAgCCUAABACAAJJSAAAAIIEg KABAEgJAAkACSAQSpSACASQAECEQSQIJSRIAJAACkCRUoAPOqqpYSQCSlACIhBQBUkgoABJJ IQAJSoQFQABCSQkgJKKQABUlQSQlSAQApJJJBCQIgSgUgKAUkBJIAkCAAAlISAiUhIhEAihA AECSAUkoBIAACpblVVVZABIAAKQAAICUAQKCUkAABBKgABFQEiEIIEQEggAEpIAAFACAAlBK EEAAEIEiBAKABAlAAkAAqBIKSSABASIAEAIBKAEJKhIAJAAAkAkiQAvOqqpYSQCkkgElJCIA SEgIABSSQQAKUQAAAIgCCgFAIJJACCJSAUgkSAIABBSShCQAkSAlIQAJSBKSAkCgAAkkSACS QkCQAUQgAICSQJSIBJAIESbWqqpaACoAABQAEIhJAAAiSUAICFJABEpFSgEoQEgShAAJIIgA SAKBAEhIoIBAIQBKAASABCUgAEAAEAIBKSAAASQAAQoBJBCJJBIIEgAiUAEiRBPKqVSolIBK SQFSQgIASpKAAAkiggARAAAQAJBBEQIAISkgBAKSAkgQUgICCRIUCEkApJAkoIAKShJUhShI AApSSAFKUECoAIAAAQCCAKSABSQAAQvXVqpYAAEAIEgACEgpAAAJJSAAKCSEVJJBJAUEBEhJ BAACkEgASABCAEgoAEAAQgAkAgCAAgkgAEAAEAEAkqAAAlQACQQCUhKSpBIQkgAJIABJJCXN Uqq5SVRSCQIkgQIAUSkgAAqQAgEAAAAQASAQgAIAQUpIBQEpAlIQlIKCpBKSEKSBEKQkkJAE ohSJAkRUAASUoACSQFEAAEAAAUBEAJJCCVIAAQvWqqooAAAAQEiAJBClBAAEqSACkJQpRKSE lARCEkiVBAAAUCQObYCCAAgAAIAAQBAIQAECAgCQCIAgSBAASRAACSIAAgAVJQJKJAkASggI IAEqVBPmqqq5JIkSEgApAIQAAUkgAASQBAAAEAggAUEAgAAAUJKkAgEktKQgklEokiSkigTC FKhISEoEgCSJAkJFAEUlAAipJIlAACgAgIBSAEKBCRAAAUvWqqpYECBAQCSAEhAkVAACRJAE kSSkgSCJSAhKJVJSAgABSJQGRYEKABQCAAAAICKIgCEBAQCQEoAASAgQFQAAJKAAACAIpIEk EiUBKQAkIEEkkBPNVVSqRAkUFIASQIUBAJSQEASQAAEAJAQAAiIAAAAAiEiQAAEkJKHju7zl 6e9+5cHnO/hIUFAFACSSAkICQElIgAkSkQoiACBBAAAkAFIBCBQABArmqqpYAKABQAlAAiAk AgIJQlACUlQSgJBJKIASUiVEIQIJEkgEhockTZFbQ02bsqSo1aUAAQJQSQIASBBIAgACCkBA BACAFIUEJKSASQCUQUCSolPOqqpZJAkgCSAVKAiBUJCACAUgAACAJAUAAClAAIARAFCAQIKU JKKX2rXyiwmRF+iPjjBKSCAAEEioAgSCkJJIkBIUoUgSQBAhCAAkACQAEAgACA/rVVVYAEAC IASAAEIkAgAJISAJJSIJAJAlJIAJSgRAJQQJEggGhooEiJECIayVsgKqFKAABIlFQQABKFAI BAgAAkCACAJAAkCIIRSBJICSRSEqQSHNVKpZShKQipAiShAAkJJABAkgAAhASAQAABIgAFEJ AAEgAEEkJMKmKZVWBMixEqCIjiqSkAAQCEkSAgSBISJJIBAkgkAUkBICAEAgCCQAAAQAEBfm qqpYAEBCAASIAECSBAgkkCABSSAlAlBSSUCCSQAEElQJJQQUFIsWLNGKk02VGxmcUaAAASSC IgBAkCAUBAAgCUKAEApACUBIpQSEoIBJSJEiQkXNVVS5JBIQkSACkhQAgSIBBQkoEAoASAUA gBIQAElBAAEAQFEPD8Pr3c33A6d7+eBnv5pSRAgggJIIBIkhISSKQBAkhJASgBIAAEAgBCkA EgAICBfnVVUoAEACBAJIAIBKFACUECAAhKBJASAKFIBBKQAIKkgpEgAQIkgAQCQASAkAAgJE kCgAESCCBEAgkAAACAAABIEAEAJAJICSShKCkIAUgEkhIEHMqqpaUhSQgSABJCUAgSQAggqS AAQASAlAACQUAEpCAAJAAJKEiAFSEgCpAkAlCKAQAQJJAAQoUBSIBSUkgpJEkCRKRSASACQE AIAoBBJAIgAEChfXVVVYCEAEFAlUAQAkCACSCKAAJJCpASASUoCASQAIkUgEkgAQASQAQJIA CASAIAlApBAEElCBAoABUBAASAgQAIAAAAJAkoCRJAkAkEACiEpQIEvNVVRZAglBIIABUEiB IkgAoASUgAQASAgAACgiAFJABAJAAJRFIACSEABKQkAkhIAUAQSRQAQQICSkAkJSASIFSikk kUgQACgAASBEBBUgAQAChBPrVVVYUCAEAhSIAQIkAAJSARAAEpBFAKFSSQKIJQASUEgJSgEA CkoAhSUACAqAECSAlFAABSBEhIAACAgAJABQAAAQBACFKQEklAkQkUAJJAlIAUXOqqpYBQpR IIAiJEABSUgASEJJAAQQUgQAgEACgCSAggJAAJBJIBCSAAhJQpAkhAAkAAVJIAkAICUlQgKU gSSCUkpFISQgAEQAAQAEAAkgAUACUBfSVUpZICAAAhKAgAkkAABJAQggKSFAABASCRIoJIAS CEgFJAEAAUAAKSAACAAAIUqASSAACKAkhIAAEKgAJAAIAAAACACBJREpSCSQSSAElBJIBIXP SrVYCISSSEAQKSAAlJICJAIKQAgVJIUAQACAACkAQgKQAUhSSApSAAUkgSVKCAAlAAiSQgoA ECSSBAEkAUkCSSSRIlIoAAAAAkAEgAlAAAACQCvWtUpYohABAQRCgAlKAABIEChABKCAACAl EkoCpIAlECgAlAIAAiGBclAAJAwAQEkAJSIAEABJQIBAkEQApAAoAIAEAAACUkklKAlQJSAS pKUoBIPKlVS0AEJIUEEQEoAApUoBBQISQAgiUgkABACoABJABIEoAJCVIICkIAJSAVSSGgBI gQCpBKICFCgQBBEkAJSBJClBJJSAAAAAAkAEAAkAAQACUCvXaqpYiQEAAhQEQCUkAACUIJBA CkEIASApISQAiUAIkAQBUgIAEgWAqUgAlEYAUCkCBSQEEAgoAQKFIkAAkgAIgQAEAAAUklKk kAUhJKBKJBSQBIXsn9UyIFBSiIEhEgABJFABCAQSQBICSAkAQAESIBUCBSFIAKCRzaeh45v4 4fXPPWx5/8EBRQKBIEAgQBKoBEkgJEpRUpJABAAABSAIAAgAgIAEgCvGSohYCQIAIAgIAJJU AQJIIJBACUAoASBJClRABIAoEAgBEgIDpsyHNE3dsEbMlDZEiRRIACgEBQSCEkACkCABAAAA AAARUEkUkARCSkEkEiJQJIPWnKa5ACCUCkJCSAABIEgCCAUVIBKCkAkAAAASQCICgkJIQEhI dVmSJ9iJNGRT0SZ+c0ACJIEhQFAQgBIAAgqUSSJJFKUEAgBAIkEQEBIBAAgEgC3WKRZIJIoB IAgQAkpIBQCoQpAABIAABKAlKSJAEoiQCAgCCQEDpEjCpkrJkUzGmDLIqQEogAQIEgJECUAp KEAAIAgAQAAQCJUCgBQCQkCUSSEgEoPO1W1aQACQBIIFIAACkCQCEAJEgCiokAkAAAgSQAAE okJIgFBSZUyKNAiZEEVIkmJAcVQAKSEiAIgBIBSAAhEkikKSCSlCgABIFIFAABAAAgQJACvq KpY4CSQEkBCghKlIAIEQQigQFIICAkAkpKBABJJQABAAJQEDLG2jZqqNtNRu0CNriwEkgAgA SiCUBIAEkEQAABAAIAAIEpIAQAgJSkSRKJEgSRPOqq6pAgEgBSAIIAABJCRECIJCQBBAkBIA AAoVIAAEkkSkACQl3udF093c6D7nTXc93MAAEkJJAAQBICVQBAFKRISpCkkCQACSCSIgAAAE AAAJAAvKVVJcKJQCUAUhAokkEIAAoAAIAkEKAkCSSkCACSUgCAAApICAAQgRJAhBIkIQFAQg ESpJQAgASJBIBIABUSQAECAAIABIElIIIACJKSlQkkkgClPuVVaxAAFIAkAESCABBCSSCSkC kBBAkBIAABAiQEAJAkkkACglSEKACUIQABCEgVEKRAAQFSKSAgUCQCRIAECSBAkSBJICAACC ipAAAAAEAAAKQArCqq5YEkgCSASQAQSUIRAAAAAoCUUEAUAlSUKIBQSgUAQAlICAAhAJIBCE pIQACAAgACJEgABASJBIEoECRRIAUKBAkEAQpJIQAAUlJKUhJJSgCSfuVVZaQAJAApAEkEAB CAVJUpSBIAAhSBIIAAgCQCAJBSFIABIkkISABAQgACEpIiSEpIgAIkgUAAACQCBAEACpBAgS BBSEAQCESJAAAAAICAAEkAvWVVVYCSgJSAJQCQkoISAEAAAEAkiEAICgSSBIFIkgIAACkkAA BCAqUVEEkogAAIAQAAEkiACBKSUoCQoKQJIAAEFAkIARFAoRAgBSSSRBIlKQBKXOqq5ZIAJA ASAFICBCBAiQlKUhIAIglCQEAAkCQAAJCUpIAIqSQQkAAABAAAJKkCSFKkgAApQgAAgCQECA EgBJUhAQBCUgQKBAQKUAEAEQAAAFIAvqVVZYApAklAUgBIUAkCICAAAECSgCAIEQlSAIASUg AAAAkiAICAARSRISlJEAAoAgAQJKSACEkqCQCQISQEkAAISCkIACAgEJCgAJRJQCSSSQAJPO VVa0kASAAUAJIBAkBQCAkklBAAKQpCRCAApCUgAKUlJIAAiCglJEAECAAABIpCkJIEAAASQQ AAQEgFCAEgIkkiAgAiSQkJAgQEkgAAFIAAACSgvSVVZYAlAJSBSgAkCAkCQqAAAIUpACAQAI kSAIAJSgAAABKv4QKAAAJQUSS1oCAAGHAh9elABBKRCQSQQJQEiAAAKJKAACBASBCQACSUgA lUpIICXOqqpZSASAAgAJIBIkAgiAkpJCAASQSEkABASiSAAElJKkAMZEApUkgCCQAwCQSSSj SIYGIVISAEIEAAFAEgAqSSAAAklIkSAoQFKQAAJJAAARCRfWVVdYASAVKCJABUAASKAIAAAI ilABAgBSUJAAASSQAAABJEIAkAAABIIZKhIBAACLACYmgABASQgiSlQkgCkABASSkCAAAAKC CQAJJSgASElEAEHNKqxZIAkAAogSkBKSAAUCVKkgIASoQKQAAgUlJAAFSSkgAVa6eu7z3i54 0uHl3c/D886+FEkIACEIAAAAKQBEkUgEBIpJJJAAgCSAAAJSAgABSBfmVVdYBSBIkABAAIAB KRAoAAAEgSABCgCJSJAAAJKQAAAEpHxUydImkQKjZCZDJsyLtmZmQQAikoQhKSJKgEkQAAJQ kAAAgEIqJIASVJAACJJIIUvWqqRZQAoCBKUUpCSkAEICiRKAJAkQQEkgAAJJUCACSpJIAMd8 oDKmH4RWrVUg7VmDN2ZuAEoAIAEAAAgAEgAFSSAABJJSKQiACCkAgAUkoCACCBPGVS9YFKAo EAAAAIAAJQiQIEAUgSBCEQAJEkggAoJIAAAAkkpBitYrsBVEREwFpEirPndmlQBJBJQkkqEk QJKQAAkkkAAAACAIoIAqAlACBIJIQIXuVVZZAASChJJJKCklACAECBSAIAkIhFRAQAIJEBAC USlIAELQgTJhlSik2YlKJUqDdmZmAFEAQACAAAQBEAACSQAAIkkkiQpCBBJAUAJIQBABEivV KqpYJJAAEAAAAIAAJIJRIUAShSAgIAEJBKhAQkEoBAABJM5m1ZNkmI6nWuyDbG2LN2Z2UgQV ElIlKRCUAkpIAFJKiCCAIAAQEEABAkgBCUKUAAPOVVa0gASohKlKShKSABAACAkAEAkKCQgA SAESCBQCQUpSCPw9eu2/LwXK5Fch3udi4887AIEAAAAAAEABJAACVACAAggpCkkEhRUkIAKQ QBABJS7lVVYYBJACIAAAAEAASkSSQiAkQSBAQCClAkQAIECQCAAAIQFAACCAgFAgCQCFAQiB CBREkghRJSSSSQVIASkoAJIREEEAQCAQIAAACUgCBIJIAIPOVVbZIQUACRJSkRSpAAAAiIkB EAgREkQAQBFJCggEgkkkgFASVIgkKgQEQEggSEIUQkEAAKIEAAAAgEACkAACRAAERJBIEQlE iSJSgAEgkCACUCvWVVZYBBBUoEAABAAASSlKIAAUBKKEAACSEkAAQCJQKAAABQJAAACBAJCR CQKCAhBAEAAUkgAglKUqJRIoBJJQEElQAAUChEAAAAgAJJQKBISoCQXNVVZakIAACRSSQJIk AAAABJSBIAAhSlIAgBJUEoAEglKSUCAVJKQgQAIAIEggoIQJBJSAIEkIAAAAAACBIAAEhQAE kiBAIBJJJIJJAAEgkCACQFfmKqtYAhKSQAAAEgCAkqUokAAkCSSAAABKCUAAQASQAAABAIpA AACFCkgkiQAKBAEgEAAiiQBCSSSRJEoEAlKQIBUgAIQUgkAAAEgAFSQAAIKQAQHWqq5YoIAA FJKSAJAkAAACBUkBAAApJJIAkBSJElAEqSSkJAAJJSggIAIAAEkAQSAKRUkIAFQQAAAEAQCR SAAEiIAKUgEAIBSlUgKUgEEqSigFKFfLKqoqBApJQAAApEKBKRJIEABIUkkAEAAkBIAgAASQ AAAAgEkgAAEIhKhKSQApCIUgAAAgSQBApSlQlCQAASSQAhEgABQkhUAAAEgAIggBAAAQAgvu VVbYQSAACUkoCBAkAEACgkkCAIJJBUkBICSKSQAEipSQKgBEqSRCEAIQAFUAQiAEkSoJACUK AAACAIFJJAAEkIQElIEAIAkokgEkiIJAUkVCQIXCqVZYFACVIAABIIEAJQSQCAAIiggAIAQU AIAAIClQIAACgSUQAAAQQJDAlQBJGASQNGAgJIAgFKSIEiQAAEpQACCQAEgkgiACACQAAAgK ABAICivuVq5ZAUoAClSQBCRJAEAkolSgIEEkiJFBShJJCgAECKUgAAAFEkkEFERSACAAMpAF EKSEACIJAAAhQACUkgAFJAgFSQIAIIpAlIFSSSKAkkIigAbWVKpYSACRIAACkIAAkgqAAAAB AiQCAgAAAEAAAEkhQgAKKSkgQQAggUyASIUkggJQMjARSoggJIqEBJIAQCkgEKJQAAhKigAS ACQAAAAkAAiAJJPNVVa0AlAEBIlIBCkkAIASKSSUSAEgkJIpJBUkpIAIEEkggAALlzyPPP/f DxPZt9wHEeJAAAKEgCAQkARJFQAIhAACSSEAAEkAkgCVKpIBKQAQACfmVVZaSAJQkCAAkIAQ SiRAgAAAAKQEBACEAEACACUgQQAAEkkmXWYaIkRtukZKliMt2ygFJEgCEoBCAlAgABKiAJJI AAQkSQBKAEoAAECUAFJCqRXOVVZQAkgCBApSBBUEAAEIEpJJJAFJISQBKQlISQAKCFJKBAAB yXxbf2ZIkwzY0z4KkqJAAQEggCoAkAIJIkAAqAACVJCBAFIApACRQBABSQAQAgfqVVVZKAJI EKAAEEAgpJQiQAEAgSQAAAAoACABAAkgIgEAUKVLTEEZIERK2URImiiYmiAklCQECQBKAkhA CAkSASVIAAIkSQAkAKQECoJIAAVBECnOqq5YAkAChASShAiJAACAFKRIIAEklKkCkgkgUkAE gIhSAAAEWFBOKVVYjhVKkqIKkzIAAIFJIEQAkAISQkBARAACRUAAAEkBKQEggCQCSlAURIfK VVZckBSQEJAAEKIACVIJQAABBJQAAACQASAJACSQEiAAkpSWyOYIsURMmIbt0jEts2CSUgQA CRCkAUiIEAkJEFIoEApJJQCUACQCKQEoAACAABXmVVaoBIAEQgUkhACkoABACSSkSACSpRIE kAkgJIEEgApIAAAHvTyfPnf9zyNG/d5HOdgEAKCSQAQBJAAiBSAgBICCQiAAACQBJAFIAEgC UkgiSQfXVVZaUCJRCBAQIRIABIkFIAAAAlJAAEAQCSAEgAQQJKACSSJQAAIQgQBBMoRSAAkI QkSRJBIACSEUEBKAUASCUBIAAIEqVJBIAJQASQCQAAEJAFXMUqpYBIgAIUJECEBKICBQClJJ IAAUSBJEgApAKlCEAASQAAgCVJCdpFIQGaFAkkACEAAAAQCkgEBBBUASAkAgBACpKCQAAAQC SACSAFIEkpIAUgfnLVdYkAEkhAgBQgkAhIkBIAAAgkSBAkAAJKASgAIhSpAElKBIAAAugACC TgjkQQSoiSSklBIAJQUAIBJAiBKFIUoAAIEkkSEoAVIASQCQAABSAEnMpVZYBJAAAIJIEIBQ EAAkBJUoKBAgSBUpAASAEkAIAAUgIAoCkkoAKRAgEoIgEEAAAAAAAQBKACBUiAASIQAQCABK khAABAgCpACpACQFKSgAlBfWVVZYkAJKUhAAQCUCQSSAkAABAkEJAEAAEpASQASgSJAEgkBI ACAkgEUJQBCCggqJJKlJSEkASRIAAVJAAJJCQikAAESSkCCQABIAEoCQAAKSAEXOqqqqBSCA AISSFAAgEAEQBSJIQBIgSglKQASAEpAKAgJAEBIBJISAEgBAEkQoJIAgQAAAAgIkEECJJAAS SAAIEIBIpAAABQkESoBKQCQEkoAAkhPqVVZYkAoJShAAgJSFQlRCUAgBEkCBACAABJAKQAJA KEgJQUAkABAJQEkEgAAAgCkJEkUqSCiBQgQggEVAASUgQAECASkqUCARAAkACQCQACpKAIvO VVZYAkBAAEVIJAAgEIAQAkKQABAUSQkkkAUgFKASgQKQEBKBUgUgFABAKSUkJABAABAAAgAk AJEIJBAVKAgKFShASAIAAgkAUSBJIEgFSAAAkiblVVdaSBESSQAEgkkIggCBSBACSUJAACAA BJACQAlABAgEhIAkCFAEgSkKgBABASIJJUCRKEkASgABAkEABKEgQAIJAkgiSCApBAkACQSQ AUikABPOVSpYAgQAAEiQEABCIFQkAgSkABASUgkpQAJICQASQUEgICQAAgJAIABAEkJISAiA ABIEAgBSAJJQSBBEgAAECSCQSAEIAokAAQBKQEABKAIBSQvVKq0pKFAlKQICQKkQCQCASFAA lIJAAKAACSgBICSACCQAgoBJUIgShKUEQAgAASASlIAQkEkAJAAFAEEQKSSRIAIBASQgSAAS VCkAAiSkAkgUBBPOVVZYAgUAAECQFAAEgEQpAgSQICASkgqSQEKgCQgkkAEqECoCBCJAEABB FQKSkApAAClCBBBJAUqASQgEgAgACVCSIAEKASVAAIBSkIAIgAJAkUbVVVa4kCCSSQoCQRKQ JREACCAChIVAAAAABQAEoCCAASQAQQEoAQASRJIUABAIBKAJJIAIEUEAFAAJACJQCSCkoAIA ClRBJAAFIgkAAgkgKSgCAAvOVVZYBIAAAECQAEAEgABJQgkgACAUlKJKUCiQCgQqSAFEFEAB UEkAAACBIkSCQASAABIhQAhKgJEgUgAEgAQICRCkgAAQCKiQCIAkoEIFAAKQkibmVVUqUBSU pQQElQSQCSUAEKCEkoiAAAgAAIICQJCBApQQQAkkAQAkklIICAAQEpASUkCEAiIAIgQCAJUg ElBCQEQASSJBIgIAoBKABRCQEpACAJPWqq5YBQAAAFEgACAEgABJBAggIAIiSQJSiACQEAQA SAAFCSABFFSAAACCQqkEgASEABIBKICQCJFIkgAJBAUAEgEpAAgIAECSCSAkkAQEgASQpAvG KqtZIElSkgABKIJQElIAEEEChEgJACgAISoBQlEqACSgIAJIQAAJVSQoEABQJJAhJUAUAAoC oAAAABEgUSBKQCQAJKEiSRIAAAkAAJAQElAEABPuqqxYCAAAAIlIQigFIACqQhBQAQEAUgKS CACUCAAApQEICkgQCRJCAAgCBEkEAASIABKAkkCgCkklKUQJAAgAFIEkAQQAAACpUkBSSAKE gASRJUbKVVdZISSJKiABAAEgBJIACIUElCRSAJAARKQAIkkkACQAoAFBIEAICKCQoQABSlAB JIASAAQKQCAQAAEgCSCSQCQAlBBKUlIAAAEBAUgQJSAAAAvWqqpYCAggAApSKSAIgQBEgCAg AIAAkgSSAAEiAAABJICkBKQICBKBIgQECElQAASQACkApSEAEQpCSSAJIAoACQEkAEIAAABK SpQkUgJCAApJKJPmVVZYoKCEkSAAAASiFCUQJQiCUhKSAJAAKSQIpJKkABIAkAAioUAkACJQ QgACSSACVIBSAAQkhAAIAAUgBKAkoCQQSQgpJUkAAACAAEgISSAgAgvOSq60CgQQBASSSUAA gAAEgEIQAEAAkASpAAEgAQABKQCUBSSACBIBSQgCEJRIAApIABIAkpCAIUkClJAKQASACQEF AAKAAABJJKIkkAJCAASKQJXVNSpYQBBCUJAAAAqSEpSQCQBCSQJKApAARKQElCkUAEoAkAAE QICUAEBIQAEAlKEBIkASAAAkiAAQAgEgBJAlICQgJKgCUiUAAAgABSgQKlAAEgPOSq5ZEQUI AgUpJIAAgAAEgFIQAFAApASJEAEgAABBSQCSAlJREiQAkhICCkBIAABICBKAqSUAAlKEkKQJ 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 SUSkEqSQgUkSQlAgAkgggCQAABJAABICQQAIAAIAIiSAAAAAAISAkFPOVS6pJAAAkgFJQlIE gKkBIAKQpKQEAkIggABSAKAAAAASlCAAAAAQkEgIAAABAAEEJAIAgAUKQAIKKQCUSAASSQCg EFVCSSCSCIApVSqqUiAQBAvqqqpYAApSAEgACACQEgAkAkgCAAJQkAgAEkoAJARSiSSAAISk qSRCBQJCkkkkSRQhACiSCSAgCkiAAEoBAUlAAEoKQgAIAARAQBKAAAAAAAJEkSXOVVZakoAA kgJKQkgEgEQBIAEgkkgCBIEqQACVAREAIAgkpBAAAAEIgEgQBAAAEEAISQAAQgiEgAAkiQCg UAAUqQBAEIRCpJAUEgAkQkISkkgAIAvKVVdYQCiSAEgACACQCRCUBSQSAQBIkCQAElIAlEAE gSCAAEJJIlQgEgBEUJJJQQShABElCEIQJJSAICQJBJSAAEkBQhEQAgKBQEkBCAhACACSglPm qqxYFAIApAJSQkoFIAQBQAEApCUABIEiAACAABJQKAQpJBACCACFIKUBAAQQCCAEUoQIQBBE gCAkiQEAAAAlEgBUCEAESKAgFIBIIpESQpIAEAvOVVdYgEhKASgAEACQBJEoElQSAIAkkAQI UpIUkkABAlCAAUEoISIQAgAIElBCIISQACEgCUEAEoEQACQkqVKAQEkAIQkhAASEgCUAgAAA AABKRJPWVVRYJQEASAKSBSACQAACAAFASCgABSEiAACAABUkQAQSkBIBBAgEkElCQAIAihAE lAgFIBAkgBIElAEAAAAkEgAiBCAISRAQIgBSKJSSUlIAAQvlVVdagCQJAJAAUApICVKQSUgJ AQFJUAQASkoJKUAACSBABIAkECBQAQAIBUhKAESQASCQBISAEkAiAJQVJIkAQBSIkISiAEJE iJIAAgBAAAAklCXOVVZYJAFAUgSUgkACggAEEAIgSEQQAkiSAACgAAlKQgkUkCSBQoUCVFIi QAIQkAAEkAgEgCAqQBJApAFAACBJFIAAABAAkggAAACUgJIUlJSAABfWVVZYAJQJAJAACASo KBJRQRCJARCEiAIASKQJSSAACCAAAIAECBARAACAFEhAAUlQBKFQKoKAEkAEAEgCSokAAElJ SkCSACEkkkoAKgAAAAASUUXNKqqpSACAJASkgpAAAQAACEQAUAIAIpCkAgEAAAkkgQpEpCpQ QgSEIkgpAQIKVAAFIAQCACASABSRJQIgAABUkgACABQAqQQBBACSAKVJSUkABBPmVVZYAVIU gJAACAEipEpJIQBJAkgkgAABKCRJJSAAJCAQAIABEFAgCACASAggACkgBJAIIgpApUAAAEiE pEkAAEkoSUBKABCUESQARAAAAAAlIIvWqq5aUACAJASSQSQIAAAACFIAIIIAJKSQAgAAAAlS AQSFKBJIBAIJIpQSAkIEiQAJIAVCiIAQAAlJJAAgAQAlSQAAAAkASoAAgAEkgSRKSkpACCbG VVVYAkQigJAAJAAgJKSlIgCSihCqgAICkEpKVKAAlBAQAUAAkEggAABASAhQIEUgBJAIABJC kiAEASkSlBKAAApJKSBJAApSJKiAFAEAAAAEoRPuVK5ZEBEIKAUpAVKFAAAAAJAAAAQAKRCQ BIAAAAkUAUUCRBKUBQKFJJISAoIEiRAJIAIhJIAQAIpBSAAAAIAkUkAAAAkASKAAAAIpASRS UlJICAvFVVJYQUBAAlAAJAAQEpKSSgJUklBCAEACUCSpIkBASABIEAAAUAgQAABASCggAAEg CUiEACSESgAIAJKkkkkBACSSpSAJAgEkpIgASAAAAAAAQlPuVVa0FBISgAJKAJRCQAAAAJAA AAQQiRSgBAAACBIJAiQCBUklAkEEqUkSAQIKSSQKQAAQqQEBAJJCUgAAAABIJIEAAAlAQEgA ACEkApJJJJKSEArVKq5YQAAAKUgAkgEIBJSUpAlJKSJEIAAJIUkioEAgSIEoUAAACCQQAAQA JCCgBAAgBJJCACQUJAAIABJJJJUAgAQUiSAJCQJKSoQCSEAEAgAAQJPOVVZZCUlJAAKQBEAC kAAAASAAAAABCSUACAAIChSIACACAlSkggEiSSFKgIgEkUkEkCAAigCAgSSCSUACAABSKlCA IAkgQEgAABCQABSBSKSpCg/lVVVYIAAgEkgCUBUoAlJSlAESkpSUIAASoCUgQEACkoSQSAAA KCQAAAAAEgCQAACQBIKUIEoSBBAoABJIlJIAAAIkhKAJBQCkpEICUoAoAAAAICHOVVZZClQK QAEkAkABIAAAASRAAAAAiklACgAJEQkgACAEAkUpAoEpJJRIgJQFSJIFQBABBACAoQSCVAAQ AACSRIAAEApAUEgAAQCQACSCSSokCRfWVVdYQAFABSQASACkCSSSSAASSlJSACAEgFSgBCAJ KQlRSBAAICQAgEECCgCQAgAQEkEkEKQkBCAAAKVCSVIAEBSSQkAJAgFJJAoCSQAQAACAoEXN VVRYEkASQAikApQBIAEAApUAAAAAkgkgIgAKQIqAAEAAAgSSCAEkKQhIQJICIKlCABQBBAEB EIpSiAAAAACUhIAECBJAIKQCAUCgAEkEkkAkBBfmVVdZQBSAFKIBSAEkApRJKAAkpJKSAEAE iCJAEgAkpQUSSFAAISQAACEBBABIggAISUAoUJQkQgAAIUkUpRIAIAlRIEAEhABIlAQElQQQ CAqAkEHWVVZYEgA/sCCSASAMkAAGASIAAAAAkhScAo4RAaZYACBAAgJKiAFOkgQgUSQAKEkB AAkCAgCACKSUCABAAECkikAAChJAESQAAJEQAEFFIkAoBRfGqVZYgKS20SQDFASUQTEzJAhJ SSSSAEAFKAKEkorJJIIEkJEAAlQUAJCFAACUgQAkJSBICCIJIAAAQkkCSQIAACSJIEEJQACU kgBBUggAABECkAvtKq00JAAklEEkQSAGFBhiASECAggAqQlEASIgAKIqACiQIARRIAAFJAAg JKgAEEoAgAkCgghCCSUlEABIAFBJIgAgBBBCFJIAAKQQAIIkkkRAAkbGVVZYgElEFmuGOHf1 h75+y4N+PLnnh44U9Opjz4LJnoObh9zuDu18gJKIgAFSQgBKCSAQEKEIIAAAAJUBKgkECJKE kEIIAECSUgBCRCiAAAASSBPuqqqyKQAWuySizKo2zJAjZGW7Ikk2TVEG2bNMTabJUw7Nk3ZF MzZs0gQCKkQAiJIQQApEhAQhCSlJSgBIAIBBIAAQIgiBRBIAAEoQEQApSkkAEQvKVVZYABJE EbaKcCMlUdCit8ERvmXA2J9UiROn6IJfHyRqijNMHypFABBIABASAABCJKAAEBCEIAAAAJIB JAkIASpAgSAUEIBJSQCCQESAAABKQFPWVVa5JIQUlSMCMlJMRpkyJRNVKTDLTrQErZqEDKZK EAVIoyIqUGNUJIECRIUAUlIAgASSRQAQhUkkSACkASAiSAAUEApABCgAAFAgEhASUqQACgrn VVZIABCGESWmmB3lWpAqrEERIDplZxCViVJNKIJpVJRKgipoGSpEgCQIECAlAQCUEpAIAEpC EAABAJIBJASAAUiCSSABUIKVJQKFQAJAAAEkoCfMVVZaSkAkWaSCSkqETLRiJilTdckuRJqE 2bbmL6LNmIboyqKUmKLsqQFCBAkASEgBAAUikAAAQiSkUgBIASApUgIgAASUAgAAACAgFJAU kiQACQvXVVa5AAKPO/dPeBjO500fc+O7nnXjt68vcuczx0/87yedx3cwD3c+gBQIUKASAAJI JJAAAqkpCJAAACkAlASAAEgIklAACCpIlIkIgEFAAICSQCXKVVZYUpAQAhIBAkIRIQAEkggQ AAEACEAISBAkkIABBIEJEEhpQkgBEoCCAgSAlSACAAJIoAAAAAUkkgBIASASJAKCAIVJQgAC AABCJBAJSCQEEgvWVVUoAAJAKECUKAgEBFJQAEFEqqQSrcSgAECAAgkkECQgQQKgCACoQCIQ iBAqAAkoSkgCBSKkqSAQAKUBSAlAgEgQSgAAEJEoJJIQAIUgAIBQQFPOUq5aSSQVARIBAkFB SAAFSRAAAACADyAKUhQpSEABBAEIFEjKQkoCFAhEIkUAkSACAAKQQAgAAAiFJABQAkASJAEE AFEkhAQCQCCEkiAKVCkCFAvVKqtYAACAJABIEAQEASUgIAUkkRISQApAAECAARKUEJQigAEg CAAQgSEBAABEBAKQJKgBCSCKRSIAARIFKAJAAKQQSQQQIJCQAoIAAAEgAQAIgSXmqqxZJKQi ASQCRJCQkAAICkAABECAEkASlAgSSAABQgCAJSAJIqSEIARQSSQRISAFAAEkIAggEACkpECA ApAUlAFFAAEECAIEkBCpSSgEgElAIBfOVVdYEAEIpBBIAAICAkkiQBJKkBIKQBFAAKFAAEpI CJIEgAUgAAAQAlABAICACApQSkQAiSCBQJIAAAIIkASAAJQAElQhQSgQBEIABACQFQASgkHW VUpZBSBAAQUCkpCgkBAAEgAQAgCgEkQSSAgUpQACIACgJJAJSJJCkAJIUiQkgkAAABFSAAoo EgBJJJCiBKAlSACRIACIEAKFIRBKQUkEgEoAKBfKqrZYIAoJJCBICAQCAUJJQElASEoCQAAA AkCAAEkoglIEgAEgAggICUgCAACCCBElKUAAJKAAgCUEAAIAkAKAApIECSIAQpAQBAEACAAQ IgBJAUvuVU65CQCAAIgBISEoqACAEhAKAgBIFSVJIBIlJAAAEABAJUgKSEKCQAKQkkggogQA ABIkgASIJIBBSlBIBJAkQACRAAhKEARCQSQiQkkEiJEARBPKVVYoIFISSgEkBAgAAJQkgEIg KEkAQAAECUAAAJSiQkkSgAEgAQAIAkgCAAEEAFAkpICAEpAhEBIIAAEAkAEBFFIAUqEAglEI FACICABQAAQlEAXWqqq5CABAgKQBAQJEigEAJACEggBKCSRBIBSRKAAIEAAAJEgEkFJCUAEg lKRBJIKAACQpAASIRQCCUpRUBShIAQCSAARQIAAiQVICglIEkkEABVfmVVZYIUkSJACUVCgQ ICQlEKoQECkAIAEIBIAEAkkghKUpACCQAgAICSQCABAUAAgSkoEAJJABACooAAAAUAEBJBIA iRABCkSAAAAoKAAgAQhJIAXOVVaqCAAAARAAAIEEBICARABEhIBJCVBCQCVBQAAJAAAAUgoF SJSCQEFQkgUBKQIAACBJCASQJIACSSJFAkhIAQCkIEJIQBAklEkAApSKSEIACJPVKVZYoRJJ JEVJIgiQkBIJAREAIAkAIAIRBIAECVKgFJSlCECQAAAoAQQCAKBIAFCqSQUAIJACgACQAAgQ CAECSEoACQgBAkSAAQAikAAAIAgUogvOVq5YBECAAAAACEIEBIBAIEQkCkBSCRCAUCRQgAAJ IAAAAhACSkkCVCCIpAgCSAQAEEgkhAVIJKoEkkICQpBAEABKgCKSIAAqSEkIBEkiCkKAAJbq qVVZEBIlSSiUoRAiUAkEhQCAoAUAoEIKBIECFSSAAUkkUEJIAAAQAIIgAIJIApBCQQAQEFAB AACQCBBIEAEKQSkAJIAAhKSBAgAgkQAIQBAJJAPOVVZYQgAAAgIABASABJBQICQpBKAkCBCA gCAgQAAlJAABBBACUpJEiCgJJCACkAIQCEkFBQJIUiAFIgSCRKhAFABQACSkIQAAQKoIAFKC EkSAASvmVVZaCKSSKEgSkJAJIAEEiIEAEAiAQoQkJISJAEqAACSUAISoAAgAIIEgAISoBEhB IQAgIAgCAIKQAFAIAAIJQEkCkoAABCUqFAAhKQBIQAASlAXNVVaogAAAgAKAAASQCkgAAiBJ BQIpCCEBACAAVQApSQEBUiACSSKSCggKUhABIQIUCFKIiIJAkigEkgSRJICACQAgACSSkAAA gQkEACQCEpJAAVfmVVZYEpVKApAkSlAEoQJSSAUAIEgAIQAkEoUpABEABBRIAASQAAABICEg AEJEAEiBIgACAigKAACQACAEAAoSICSJKQAAASSkBCCQkoBIQAAJJAHOVVZZAAAAqAQBAASA AEgAApAkiAJJAEoBABAAIkRJIUACJSAFJJJIBIQEkggRSAAgAJSgoAJAlIgEpQpBUkCAhIAA AFJUkEABIIgEACkBFJUgAJfVVVVYKSIkAFCUCSAkigBKqAEQASgAJQCUKkEkiAAAAACQgASQ EAAgkBCQACBAISSEkgAEBJAEACJQACAIACQKEApSpQEABQkkAgCQSQAkAAACUgvOVVZaAAiB EgQBQAkAIJIAASQFJAKSAFABABAAAlJKVJQEKSACRSSIBIAFJIUICAAQIJIhEAVRJIAFKQSC JQEgRSAAACQkkAABUKQFAEkBJKJIAJPqVVdYpKAkQCBIEqASgEBIhAAgAJAAkgJIIkKVKAAA AACRAAlIABABUApQEBAhRKpEggCEQlAAAAkgABAogCQBAAJKJICAAFKkAgJQFQAkAAgCSgXO qqxYAAkAFQkCAApAKhSCIUkJSASoAIgCCBAAApUkiSQASSACSQSQBIACRIIIAAAAEJAgCAIS kkIJJISAKIFISSAAgCQSpQAAiEgCQEoBSQKQAKvKVVdYikAkgCBIUkAJAAAICAAgAlABKiCo IEJIkACAIIEpAAEoACAFIClIAAggkkSSQgUJIkhACAggABABAgQBAASkBIBAAAkSIQCIAgCU AEgApAPmSqRYIBIBEQkCABKARJJCQlUJIASIAAgChQgCBJApCCQASpQCkgpACQACSSKKABAg EJBAAAEUgoEJSkSoQKCkJJABICQUSUBABCQhIJAAlAEqAS7XNK9agkAkBEAQikAlEEAIEAAg CSAgokKQECEokAEAQQBJAACQAKAJICJIBAAAJUCJRAECSSQAECQgAAABBAIAEEEkEoFBAAUE kICECgJSAJQAJAPMq1RQEBUAgBJEIBIABBSCBIiJIAkKCBAEQgAABJBIEEkASJAEpASACggC QUiRABQAASQoAAFEhAEJJJIkUShJBBIBACQAUlBIACQRIKQApAFEgSvnKldcQUBKEkABAkCU kIAoUCIAAqAAQEIhCJSkkAUBQiAlAgKQARApICBICAIESQJJJACAqlQQEJRAAECAAAEEIICU SQAVAAACSoBAAACSAEgQBAXMVVZYFAgAgBSQSBAABCSBBAClIApIEgiIAAAABSBIEIkASJAE kESABIoCgkiAEEAAAUgkAAAFBAASkhQlFIhBCCQAAElAJJUgACkJSkgASgIEoVfXVVZZQCCS FUICAEKSUIAEAKQACkACQSABJJJJUAIAggASAARQAQACUAEoKAApQQSSlAEARJFQUFJACACA QCIIIoAklQAAgAAEqQAgAAJJASiQBAHKVVZYCQoAgACgkhAAAhJBUgEkgBKgEAkgQAAAAlCk IEpAkkEEqEkoBSAAAlIACFAgAJBKEAQABQAUgpAkCQCCACkAAFSUKkSQAEkKSSAASAAEkJfW VVaqIECUIhQKAIJJSAgUABQAEkAEiSAFCUqUiAQAhQASACQAAgQBIASSkABJIgCEkgUAglBF IAlAEAKBICQoSQBJUgABABAAiQBAAASVACSQAgvOqqxYhBABCIEAqCAQAoJAlIEpABIgIAqQ IAAAIkEoIEkAqQFSIJFECUAABSQAAJQAAJBIIAIQCIAJBKAgCQECEEkAAIkgRIVKIEgSVJAg SoAiQJPWVVdYEEJIQAgkARJBEBACAAgAUkCChKABCSiSgAQCggASACQAggARIApSUACSSgEq UgABCUiCQiUgUAkFICQQQQAKRCAFECAAAQFAAgSCABKICgXmVUpZBQgCEkIBEEAIRISQkoKS ABAoAASkQAIAJSEgIKSASQCSEJIACSAAAlIEAIgAAJUkQAAgEAAJBIBACgEEEEpAEQqQBIiS lCQSgJAQkQACgKvNKrdYEEJ///////////////////////////////////////////////// //////////////////////////////////////////////////0QJAPWVUxZQBAgAACQBASA AAAAACAASQQAkiAABIBIAAAECAAkACIAAABJAAJJEABAkAEiSAAACJIJAkiAABISQJBBBAAR AAAAgAAAAAAAEAEAACREAS7mqVdYAoC///////////////////////////////////////// //////////////////////////////////////////////////////////UAlAPNVqpZKCQv //////////////////////////////////////////////////////////////////////// //////////////////////////RIASvWKVZYAICsSSQBIEAEkSSSRABEAAAgAAAAQBIAkRJA AAkAEQACSSIAEiAAAEIIAEgAACCIgAAAAAABEQAAAAAAABEAERBEEREiASSRARAiSQ0BSAXO qq60kiguAAEkCRJQBAAAEVQRJKoKSSqqEkCSBEAVVUBKhElQAAiSQIkklBCCSgJJJQgiJJKk qSSoREkklJVVVQRJBEQRBEQIqAAEUESIAERQApfqKqpYAAFsJJQAIAgEkJSSQAFAAACgAAAA iAIBVV3VVVdVVVVV3dVVVVVVVdV1VXVVVVdVVVVVVVVVVVVVVVVVVXVVdVXVdVVVVXd1V1VV d1YFKAnO1VZZSSQtf/FSikKAAgAAEhAKUkAJJIiIAkim6qqqqqqquqqqqqqqrqqqqq6qqqqq quqqqqqqqqqrqqqqqqqqqqqqqqqqqqrqq6qqqqqrqqSAASfKKqtYAAA8QBAAAAAJKBKlQEIg gHpAgiIiUAABXVVVVXV1VXdXVXXXdV3XdVVXd1d3XVXdd3VXV3dVXXd11dVVVVV3V11XVVdX VVVVVVd1VVwJJAXmqq40lJKtXNkSSSkgQUAAEhCEpIgSIAACBSkmq6u6666u66rq7q66quq6 rrqqquqq6qqrqq7q6qruq6quurrrru6qqurqu7qq7q7u7uqqruUgAVfXKqpYAEAsbJBAAAAJ BAkUgEIRgaJABJJIkAABVV1XXVVVVVVVVVVVV1VVVdXdVVVVV11VVVVVVVVVVVVVVVdddVVV dVdV1VV1VXVVVVVddVQEpAHMVVa5SRItRrQdvvXHHPHAPnLHpInNvHHGLXSS6qqqqqrqrq66 quqq6quq6qqq6q66quq6rqq6uu6q6q7qrqqqqqu7qqqqqqqqqqqqqrqrqq1AAJfnVVZIAABs TJCKooqoso4voouogMIuo44qsqhDV3XVVV1V1XVXd1XXVV1XVVVXV3XXVVXVdXdXV1VdXXVV 1dVVVXVVV1VdXddd3VXXd1XVVdQEkgvMVVa5JJQtSxQqvnGHpvnJGfo6pJM6sqnCKooSqqq6 66uuqqqqqq6qrqq6rruqqqqq6qqrqqrqqqrrq6quqrrrrq6quurqqrqqq666quqqrqUgAJPW qlZYEAC8bbCLoJJs4oJATIsogIIqoopGYpiBdV1VXVVVXVXVVVV1VdVVVdV1XVVVV1dVVdVV 1VdVVVXVdVdVdVV3VVdV1VXVVXVVVVdddVwFKgXOVa05BSItUNQatoopnsqyIqpqqa6rvqoy K3gqrqqrquq6q66667qu6ruq6qqrquq6quq6rq6quuqqqq66rqquq6qqqqquu6quuqqq6qrr qqUgAKvlKlaoIAgsQJBMnHXHknnAnXIngHHIqHHHog0DVdXdVVdV1XVVXVVVVVVXVV1dV13X XVXVdXVdV1VdXXVVVdV1VV1Vdd1VVVV11VXXV3VVVXQEpAPWqqZaCSKtf/QBISEgJgAQIAkQ kgAkYQkgJMhC6q6qq6rquqqrqqqquqrquququqqq6rquqqrqqrrrqqqqqrqqrquurqrqqrqq q66qqq6qrqaQAS7mVVZYoAAsEgFIBAgKXFJFCqBCAEqBJEQEgHAFVXVVXXVVVVXdVdd3Vd1V VdVV1VVVV1VVVVVV1VdVV1XXdVdVddV1VVdVdddVVXVdXVVddVQBJAPOVVawCSRtAKgCQSJA AgCAQAgISQAoEBFAJRUgEgCSgAgSRJIAIiCAiAISRCREASSRAISRJJIIJIAIkJIgiQCSACQC QJAqCACSUgCCQkEiApSkASvVVVZaQIE8SgBIBAACSEoSCEEgIEiAQkAKgAAJQIoAEkFAEAAS iBIEIShAEQAQFAAEFBAEAgEggCSiAAACACQASQBICgCARJQAAIoQEBQASAYAJAXOVVZYEhAv //////////////////////////////////////////////////////////////////////// //////////////////////////RJAVfmVVZaQESv//////////////////////////////// //////////////////////////////////////////////////////////////////UAlAHW qq6oEgAtJJJJZLLJJJJJSSSSSkkkkkkkkslJJJJZJJJLJLLJJJJJJJJLJJZJZLLJJJLJJJJJ LJJJLZZZLJJZJJZJJJZJJJJZJJJSSSSSSTRSAJfGKqpYQBKukm2mk002k0kkpptNpSabaSbS bSy0m0mm0k00k00kk0m2mkk0kmmmk0000m002m0m00kk0mmk02mm0mmlsmkm0kmm2kk9ptNt pNYAEgvtVVZaEoA+ddVdXVVVdXXduuq6vdV1V3VdVVWrqrqqruqq7qq7qrqq67uq7qq6qqqr rqqrq6rqqrrrqqqrqq6qrqq6rqrqruqqq7v1XVVVXVSSQJPGKqtYQCStXVVV//////////// //////////////////////////////////////////////////////////////////////// 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 rXVbdXVduret6re9VWq9d1q711ut1Wvt7qruureuqrXV3VXWru1u9VdVVq3rerW6vd7VVbq6 qrQCQlPKVVZZAAAu////9//////v++/9/29q/+//9v/+///+/9v3v973/9/7//f+v/f7//72 //+/993//9//f//9+/vf3////fde399/9r937/dv3dUgEA7WVVdYEiStqqqq3XVVVVVavrqv V/f/rvqqv6r7qqrXqv696vf7VfVeqr1X6r1eqq2/VVXqvXdVqvVX1VVXXq719VVVV1339fXV f+v2ur3693QEiSPOVVRZAIAv//////////////////////////////////////////////// //////////////////////////////////////////////////ZIIAvqqVdYUgpsUqYmQSZl IiVEAGUkoBASQAFIgIoCESAQEIgABAgASgqARAEACEQQRUEASTIpAKRENhJgEkiJEUIACzFM iCQEAgJIAACBSgABJAQAhKXOVqxZAJAurSnZXJkpZbK27orVW1dlXdytd1Lq7a7nbqu7u3Xd suldrd27t1XXOTrdrYqmdxW5kqsd22rZVTru6UpS22u61d1W7bq6Vbu6q7VJABflKVdYCgC9 qqqrq7VdWq6qq7VVVVVVVVdVVV1VVWq6qqqqqqqqrVdVVVVVVVVV1VVVVWq7XWqrVdVqqq1W rqqqqquqrVVVXVVVWq6rqqquqqQAEkHOVVRZIJItVd1V/+/v7////9////v//7///v+//7// //////3f+7/////+///////v/7/+/7/9/v/d//v7////f3//9///////9/////9///0kgBfV VVdYAAAs6qqqqvr6+qqqqvVVVV6qq+qqq6rqq+qqqr1VVVd1Xuqqqqqvqrqqq6q6q+6rq/qv V6r3VV6vqqqr1/VdXVVVVVVVXVVVVVXVVVQQJUvOVVZZSkquljJloAkElIEkkCklKUkSSECS SIkkiCQCRIEkkkkkhIikpJJEkQSQEEkkkEEEgESEpCRJCESQQkkkSIiCRJEiQSSkgkEgkkpB JIUEABPmVVZYACAuqUqfrqQUBW1VJJKpJSFSkRaUpNUSpJXaVIqlJJJKkRKVJVSQSuqtzklE kRV0bRUxIMsRZpJSWpKTIiUqklJKnKqqmk0rUpSdVVwglIXWqq1ZJIRuldXagJTSsCAIi0QQ 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 qBRUlEohKoWEttIsCGQSBBPJUqtZAqRs+pdVhKgUQA7CFmkYmQGSSQpJSnLEoJElFNCITEko EFKUoZJkgLTCCkkioVlWidJNUVSQKJJIEkaCQ2QBJZKEQsTNQFgxAEGBlY0AgQbkrVXYCAEu yqrtmQLFE7AJYIJCglokqSEkAoAVIxSI0Q1VEQQjJSISjCQUmkIpxJSYLQFIEgUxIlEmioSK 1JBqSAnaQkQpKBAAVpFNNTRaIkRKFEvSqqq1QRAsduqzoiwpUEKwi1kqSkCSJNUlbJtRGEkr CVIhYNKsikrSsaNJQkqkMkUmwGkBqTAEjAUpQklIIRERKaQhGlLCC1O1EURAgIUEKiQAgBXJ VVXYBESvyrrLqZNCFkpOKAJBKkspSCiRECCQQoCQIiGCFglBaCQEBBgDGJSSARBBJIJ2BEti M2RANISTTSlEogGUoJIUpAxCRCiabSlpSJUkIkPr7vsyUAAwIQSQCAAogCQBAUkQgSBEEgAE BJAlSlQEqIgoiIAQBQEhEgJQQAARJEQQFCCIoQgQgAFJASAEAkRJAKgkBAkkgIAIEQgiAEAE AkwBCBbKu6/YAJK///////////////////////////////////////////////////////// //////////////////////////////////////////xUAJPVSqi6qkhFKJEVRVUEqolSVCJK JEoikqqiokpAIAKgAiICRFUlSKiSSVEKKqqJERKKgkoAEkVJKqgiVEqkpEkSVAUSpUREVKqi iJKEqiqlVCUCqkvKqqqRASUoQkSgKCCpBFIIgpSQkoiUREQUCREqlVQVVJSpKSCSEQJJIgpR QQBSSkhQVJFVSSgiQAKUgpEIiSRJIqhJCCiSgQAUJSQpAUEIIpCpESPlVVVVfVVXWrVfVq6q 9VXWuVVWqrarWrXV6tVVVVXVVVVVVV1V1vqqrdVVXX6qqqtWqq1VVVatX/qqtVVraqtVWqtV a6tVev9V1VWq+rrrqq6q1VvP////6//+/9/1+/3/r/977+////v9999vv7////9///////f/ e6//+3//++v/9/3///v///v7+q/3/v//v/3/9////v7/r9X/e/7/r++/f/3/f+/aqqqqvqqr q3Verq9V+qve+vqqqq6vbff662qqqq3VVVVVVV1V3vVVXtVVXr1VfV9VVV6tVV6+r/V9V6qq 6q9VXVVVV6+q+v6r3q+q9XXV1VdX1Xr///////////////////////////////3///////// ///////////////////////////////////////////////////////////////////////A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJJJJVIEkkJIkhJJASASQAAQEkkkiQBAIC ESSSSUiJSSSqSSJJAQJJIJJJIEEkgSASSSBJKSCAkASASBKSRJAkkSSSSEAkggEkACAkhIIJ EkiQBITAAAQACgABACAIAAVAkAFUkEgIAAIFUSiQhAgEAAIgAgAAAggAUFAACAAQChQAJAlA gAoAAAgkBJAlAoAEEAUABAggAhIAIJABVQkAICigQAIEoCHSqlCIoJKUJIEiUlAEQqQAAiCg pSiQAAAEIEJQlSgJKEpEqCElCQlSoSlBIEBKgCASEqAkpSKAkASASApQglBKUCCEqEBKigJU AEQShIAJBKgQEojAAAAiBAQBACgAAAIhEACJSAoEAAAESkpBCRAAIAEAAAAQAQQAAAAACAAI BBIAJQoAQASAAAAoBSAoAkAAIAIABQQAARSAAJAAiBEgICSASAFEgALkhJKAEFBIEoJJJUiE ARIgAUAQlKSRAAAIQACSgSRSkqlCRBBUpKSKRKUiUEApAEBJCRASkkkCUASCSCSSiUhJIJEq RAASJAEiIUAJAoAJAkQABJDB6wAkmgICQAEQAAAglEAKUBEEAAAASUkiEkoAHAAAAAAAEUIA AAAgAAAABQkASBEAIEUAABBAAkAAAgAAAAEACAAAEJIAgUgIBAkAUCUgQBCSUATLOSSACIiR ajVCUiSCAAkgBIRRJIlJAAEAIQBKRkkkkiJKQAhEkpKAkkklICBJAkQSgQBKSUEJSBJUqElJ JSQJQiSRQgCkJASgkCBJAQACEkIIAlDGDUAqSCAEAJEAAIAgkkAEgCAAACAAUkmSqFEABAIA IIgAEgIQAAAqAAAICIoASAEgKEgAAAhAAkAAAQAAAAFAEIEECJABAJAEBIkAJElIgAhCiATU qXPD27c82z9+vj7lw494euS69/++uDvOecQkvPNzwgEpQFCBKSkASpShIgBJASQJAQEklSIS SAKSRCUqVJQSQBQQIAKUEgCQUAAkgAAAJSEAISDGBbImSRs23ZE2aFuyNLJm0RBJE1Eiaks5 JiAAbN2yKEgAFAQkAABCAAAAAEgASAEARCQAIACAAlAAEIAAAAAEFICEhKQBAJIFBJIIKSkk AABSAAnUERPsTzGiSrWiVRGb5xwMrfl18hG/QXEDY+lJRqkb4QEkgKEBJSUISSSKSQClAlRS EBBSgEoJSAElQgSRIlFQgCIQEABIKgAQAAAggIAQpJUAlKDFBVZFGhUqSJEq5BUyiw11yYAx lq4gaDFNKkACZImSkFAAIghIAAAhAAAgEFIAQAAAhQSAFQBAApQACFAECAQAJAiEhSQCAKlC UqkEEhJEAAAkAAjWKRMUCVEjbNUiOTESIaZMdRKdAgqpQFsVowkoRM0SAQSkiAABJKSEElKB QQASCkSSICASQEkFKABSIQCRIJASgKAgIABIpAAIAACQQEAASUiBEkLHU1MWq5t2SJGqJBVX FJJkQYhJqoQxSklZKxSRbNlbtAAAAqUgAAAhIAAkCCVAgBAACQkACABQASIAgEoACAUAJAQJ CSkAARIiSRIFEBSSAAIgQBDh47nj3Pcc/e/3fHu59zy7evlw9xRe4HTO2eaUO3O55lKVSAAK SkkICSSAIIASEkJKQCAlIkkARAiSBQBJISAlARCgAAAkiECAAEAQBUAAlSgFCUTAEBIoIBQk BAQCQwACBIgQpIBKCEUJJIEQAFCBJBQECAAAASkggBBCQAApCigAgAgAEgoAAABKEIAAoCQA CEkASEQKUkoAIhISpBJCQApIAAJAIAHFQkCChJCBUJEobgqoIAFCzAkAoQAgABRFJQQUAEFR IkkiJAAEEkEAAlSAIAKSJKEpQKAkpJUAQhJKCIEqoQApAQBAAQBKgIBAAkAIEiECSJAUgkjQ EBAQIDggBAACeKACSUgIdIBIBFCKUkAAAAEhSQAAAAAIgSSBAAhUkIASBIAACAAAEgSAAQAk CIAAAiAABCSAUFISkEkAJCQUSBSCQIBQAgSAIALBAUJBCSUFIJJIAgIQAAIgkCkBEAIAAQSS UlQAAAokklSgJAIUJKEAAgJAkCpUoIqSQBAUlEiBICSoqASiEIACAgBAAgBJAABBAIBIAhIE qJAEhUjQSBAQQgBACAACIEiEkkiEBIBIRRCSkEAAAAEklKCAAAAJASCAgAglSFASBIAABCAA EkUAAAIgCQECApAIghJQiJQSSJIAUpUASCQCUACAAAVAEADFBIFCEEkJIlSoiQAQAAAQkAkB AEIAAgkpJJAAAAIJKpJAJAQiCkCAAQFAkAJEkIRKQABJIkgEoBQQEAJACAgCIAFAAABJAAAV AoBIAUoSRJAKQBL///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////8= --Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps Content-type: text/plain Content-Transfer-Encoding: quoted-printable --Alternative_Boundary_MdP9G7i0M2YtIbPlllMdP9G7i0M2YtEbPlps-- --Interpart_Boundary_MdP9G7i0M2YtQbPlt5MdP9G7i0M2YtMbPlxY-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.48.msg ================================================ X-Andrew-Authenticated-As: 4099;greenbush.galaxy;Nathaniel Borenstein Received: from Messages.8.5.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 via MS.5.6.greenbush.galaxy.sun4_41; Fri, 11 Sep 1992 13:34:20 -0400 (EDT) Message-ID: <8egBWQW0M2YtE1Y7Ea@thumper.bellcore.com> Date: Fri, 11 Sep 1992 13:34:20 -0400 (EDT) From: Nathaniel Borenstein X-Andrew-Message-Size: 948+7 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="Interpart.Boundary.EegBWL:0M2YtE1Y78F" To: Marshall Rose Subject: Re: I'd like your opinion In-Reply-To: <7821.715397074@dbc.mtview.ca.us> References: <7821.715397074@dbc.mtview.ca.us> > THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME. > Please read the first section, which is plain text, and ignore the rest. --Interpart.Boundary.EegBWL:0M2YtE1Y78F Content-type: text/plain; charset=US-ASCII Marshall -- sorry it took so long. Since I assume you've already seen what your MIME Simple Times looks like using the richtext program, I thought I'd check it out using the MIME implementation in the latest Andrew. Aside from the fact that it re-tickled a bug I'm aware of in the support for multipart/digest (which I'm planning to fix, don't worry) it looked really nice. I'm enclosing some screen dumps to show you what it looked like, in parts, using Andrew. There were a few places where I think some tokens should have been added, but basically it looked great. (In particular, if you have two consecutive richtext parts, I think you assumed there was a linebreak between them, but there isn't -- you need to be explicit about it. That's how Andrew handles in-line pictures, for example. You'll see what I mean in the first of the enclosed snapshots.) [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] Anyway, it looks very nice for the most part! -- Nathaniel --Interpart.Boundary.EegBWL:0M2YtE1Y78F Content-Type: multipart/mixed; boundary="Alternative.Boundary.EegBWL:0M2Yt01Y75h" --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Marshall -- sorry it took so long. Since I assume you've already seen what yo= ur MIME Simple Times looks like using the richtext program, I thought I'd chec= k it out using the MIME implementation in the latest Andrew. Aside from the f= act that it re-tickled a bug I'm aware of in the support for multipart/digest = (which I'm planning to fix, don't worry) it looked really nice. I'm enclosing= some screen dumps to show you what it looked like, in parts, using Andrew. = There were a few places where I think some nl> tokens should have been add= ed, but basically it looked great. (In particular, if you have two consecutiv= e richtext parts, I think you assumed there was a linebreak between them, but = there isn't -- you need to be explicit about it. That's how Andrew handles in= -line pictures, for example. You'll see what I mean in the first of the enclo= sed snapshots.) --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: image/gif Content-Description: snapshot 1 Content-Transfer-Encoding: base64 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 W/YXKfgXdQu3f2KYfYV0VPy3hdekdb7keenHhr2Eg2cXfZeHecmnOzQHgkY4hD3XeWtn bibnh0NIhuoHeTb4SaBnhdKEdw4HSzUXfCuIbS0YbTHYVAzFgxNIcmiYheFnhWoo/nqn x3w5V31J12391E/wRojGN0L3dIIBVYR+x3dAJ3Kf2HfUZ4ZaVIEIx3dFyHBsp3RKSIqV CEqXmImO6Ge9Fonaln83c3hI434dd3I4FYZiA40zpVtdCClfaDXMeDTS+HOgRW9ks42M Z42PKHDISHBZKGT3Jo59I2/VxjDUWHDkaIzGdo5P9474mI9dU44qp4/++I8rw4/2CJAE 6Y/X+CjZWJAKuWwH6SgJuZAQqWsN2SgPGZEW+WoTySgVeZEc+WkZuSgb2ZEiCWkfqSgh OZIoiV4lmSgnmZIuqV0BxyWS+JI0mV4xiSUC0JI1uZPBdZOSoio6yZNCyYXlyCS+/hKU Q5mUqBWTtFIATvmUtYKUSjmVl2V/T+mUpEUAUkmVXIlYVlkATgKSLtiVZJlaVvkkYjmT ZbmWmLWSiLKVbBmXXHWT+ZWMcnmXfnVtXaKWeNmXbuVsgOaXgtlWgElpg3mYXVWYjIaY jJlYKxiYjRmZB6WYpHZmlnmZmJmZmrmZYkKPC8aZoBmaojmapKllnhlnqJmaqrmarNma raIxiBabsjmbtFmbtpliKHaburmbvNmbvvmbumJjUjacxFmcxnmcyJmcyrmczNmczvmc yvllpTmd1Fmd1nmdASad2Lmd3Nmd3vmdY6JVrjme5Fme5nmecMZglAac7Nme7vme/vD5 Lae5nvFZn/Z5n/iJnyvoJXwpmf7JRs7WJeaIjv9ZoKLlmZsGMwN6jwbaoIoToFnpWgvq oBR6oDGToLY1oRW6od+EoBGqoP3JoSJ6OBBqXLRiXCE6oiqqNyWaKomGona5ojIaNy36 XGHpoik6ozp6NjXaamiJozG6o0I6Nj36kxo6pEhKNkUqoTmapE5aNUsKokH6pFSaavv5 oRnapFW6pUUDocKipVwapjgToMMCpmJ6pjNDmZyGpmxKXY9pmG0apzWjppdCoHJ6p9Tz pouJp3xaMgH3pVPap4IKMX8KLGM5qIg6MW6plYeaqI7qMIsKl486qfsSqY1KqZha/jCW aqaZ2qlFJJCKd6meOqpOA6rDJ6oviETdGG9/iEw3mE/sWDraR6rJtamBqnFCmKqA541R x4AP8092SKvCZat2ekKCV4fzF4/IKn/e1jBI907C2pOmen+oGoOVN3KjyE9xeIiFWEwj t60U94kmN26PF60q6JmQmChX6ZRpeau9WoXMClBmRIfgGq/zN324Z33bhHVnl3vmWoxT syjrmpWSunOtF3kVOIjIB1PfB4VsSHOGd4dK96/1N61Y2STtWqzvuqvBOIoLa4TuWHOm x1CdNLHP+nsUC1tneaMsWa3G90qjZ1G7Goh5CHUKG7P8FEsnC7HKmrKJOa1e6LK6/spx 0/R+NfuxwDp5I/tCsiexzTSxPruUQIuNQguGnad5U7eKb/iKA0WKeGSCtNeL4qqzuli0 UWuWU4uQVbs0sbptBdOzZ+tUxMqg3Ai33TOrcSu16GqOocqpzbiqNENTdpu3IDW3hDuq hnu4nZq4ioupdJklftu4cvq4VZKTayu5d+qTElqwmMulmqugnNu5Vfq5GRq6ovukpOso QHm5p4umqetblhu5rRumr8soqyu7s7ultWtcppu7Qrq7Ltq7vqujwGujrDu8o1uUWBq8 x4u8qKu8Riq8zquixRtt0ju9Ilq91HK92Luh2nu77tq9Tvq9sRu+4ouk5Mu959ug/unb vOs7o+2Lu++7ovFrvvMLv9C7ue57vyNavxrLv/i7t0bZK+oLwI3JlEe5vwZcoYy7wEna wA48pBAcwTs6wRQcwAE7kBcswWnrkAq8wf5pwSDcvx1MkR88wgdcwhp5wiiMmCLcwgys whlLtzAcmS9cw+wrwybJwjjclzfcw//5w0AsmUI8xCm8t/1oxDGMxBqsxA5axE48mFDs UgRVxXrEeVhsxel4xVoMqyT7xXcHxlprTGOcxVx8xlucxl4cxmxcxl0sxmQcx2asxnA8 x2vsxmh8x3L8xm28x3lcx3yMx3Tcx3YMyH9MyIEMuPYyxVHswzrcsvLbyHHJyJIs/peU XMlsecmYXJaavMld2cmeTJWgHMpKOcqkPJSmfMo8mcqqXJOs3Mov+cqwnJKyPMsjWcu2 3JG4nMsXucu8HJG+PKN6PMePGsy/rJDGfMwEmczK/I/M3Mz6+MzQjI/SPM3VVs3WPG3Y nM0M+chvycPcvJDbHM7CNs7kLJHezKiRXFPP83GV6HH8RokONz5XO44iE8/jmrOW90fx psiH17asOrjIQ8VuS4SRxsR9a79lo4r+aqzHmok396wQy3PNulGdM9EF531vt6/z3KoY lbTBatDOutGj46yyitF469ApzTfmbDMMXdEhDdMWVXik568yKNHVeDkoLdL7Wnc8/hux KAtFrveC8jjS61TS8HjSSa09Rc3S6VzATSPU4sdADqg9NL2EAIg+ebSGdfdPY7eGZrvH 8JaBSyh+M+3VQG2yOk1uEqTV6BduhjfVryizJtt6g5R9WN21eESFY/u0WJvXrUhP8IrX Mk2jTw3OWgNJOdSs+6RGqSdUvrrY+YrT9uTXle3XL410O8uBMwjS+zbUvLd9Hy1F69S0 QIh+qA3ZlN3QCxi24+eDf7jYqpTaNi13Hz3asA2sv/fadNc3LY0zQo16KPjQF63Vlm13 xw3aixSCyhex9srPzg2BDa3ZFD2FrufVC3eEso3Ztz3U1K3ca03XyA3ewj3ejm3e/hi9 2eMq2c1E1TbotKxt2Ah9quvcUaUd3zpb3rZ32c793f3t00qt2jKL3d2t1jYt3vgd3ZBd 2Wit0gd+3//t3bid1uEd4Mmt4A/O3z2E3hn+PZTt3zb3fvBd2Jk239Ra39MI4cXki0yN 4eS92Vet1qvN1ce63JaN0iDe008b1D/t4Ixt4RF+2SdLdxQU3P595AXutBRU4OMNtf/2 4UkujLM94gKdNL+9jCqO0+TX4kOe2xeOskcdd1Tu3Ve90Qte1Yytgxun3iTubVtd5pht fqLo3rV9h3Ie5JoN59Fd47g93DpeSniee7t94QkeUoeN4luDi66o3WW31/lc1ovO/oq1 VK5jK9FjJ64ht3VsrW+aXq5Fe+lPJK/dxnZkWE9HR9L9d4SmqIlgfX19SG66SHZpSOmn 1+qaXteHaIgkeugKrVxVrlqD7uQxlegWfdAZnND/u1xnDmlUJ+wQl+I8vTdX3lYAHVww aFiUiDjTfs6otu3cbmre/u0eyevJLu4WGe7mfmnozlSyeK8mbYZw/bKu+usdtXoed9Qk 40ltfesAe1xJDOz47uyMB88CD61v+4DSs+Ix3ebF7uiJyH7V/rMmHrSIzlY+p9S/aqyr rYwiTe/QXuEYb9wRc+89/XIb/1nrLj+W/uYQT9b2du8duIMlO9W8R+cqf4Vg7eHN/lfr TOh/xZ3fYM7wj5XyTGXnPpjnmnfjO93dME6vd27dNQg7ME7oe470U6/h4k3bjRhaRA8/ f/fdSF7edL3Wzhj2/A3dCq9BV5/jls7kcV7wHD2MS4/y5E7Dh7XgYO/2oA3yFn71gf7j Cz89fi/gs27gt2f0CW7zf16xE0+1FU/tvS3keo/1Id/3Sn75e5/4GzT4VQ/hcc3m2135 Nl7obVn3uaXYqvj0Ew74HZ6LTZ76gB50y3o4qn3ne+7maO7mct7kUPt9gK6ypo9bsQjY rt6KmKjqPHuCf61vNO61Xo/6MIitnf55rn/rzqh8vn/FjH/s9N3rsebxn3XyHC/0/nBv k8GPj+B/WYRffBEN7uevzBHP79r8/unukl1f/ypJ//h/y/q//7rc/wgQutz+MMpJq704 6827/2AojmRpnmiqrsFxEIIAAC4sEHiu70Rts8CgcEgsGo/IpHLJNNZis+eNR8X5Ys2s dsvter/gsDgljb5i1epVMG673/C4fE7flmnnaXq3rvv/gIGCg4RNd1J7PH2FjI2Oj5CR dYd5iXwvP5Kam5ydnp8dlDaWOosZA6ipAwqqqaytqwGwsbOvrbaquK6ysLqovrS9vLfD ucW7tce/ysHEyc/C0M7R1NPWxtLY1drXyNve3cvZ4Nzl5Ofi3+nhzebr7u3o8e/y/sD2 zPfj9PuxGKJopKxgwgKqoMGDCBNOymNmVMAeA9konEixosWLKv7pIWUKo8ePIEN61PgQ Ig6CIlOqXMnSEcmHHVvKnEmzJpeXAWPa3Mmzp08SODlG/Em0qNGjEIJa0om0qdOnKZUm Ygq1qtWrBaXuoYq1q9evg7Sm4Qq2rNmzYcSqGYq2rdu3WdRSIQu3rt27IuQqYou3r9+/ GvReOikRsOHDiBUILsU3sePHcBfnoAu5suWnkgUSvuxV37x+nK9mNpkptOnTRUdTRs26 NUjVjV3Lnv0R9mbauHNTtF1at+/fnXijBE68eCPhhY0rX+4HOfPn0OE4j069epfp/taz a0eCfbv37yu6n6q1C0OuYB3KT5iFvgToLMuArIrfgD6vEPbFcXg/Xj5/8/81EeAG9r0y 3nysEDjgAuWpd0KBQDGEh0M5xQbgfen0Z+B96S3IwC8gtkeCh0iQOAItEfBnYgUqJnhB Pyum+MGK75kI4xY34ifLhwxeyGGM9bEI2oJASlBkBuKZt6GIFtB3JAQQPtDek39Q6cGA LeoYpAZWOtDljixuuV6PWnwppZdkNsnjlWHmCKUIZkqQJJc1zjckhA66oueUITJ4J5F/ DvNjoLh8CGOB3nBYX4ZOMnrjnh6CI+ik+tnSY3yH1jnokora6Sem+3xqIJ4NrkPp/juW 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 jiN0LEGZ0Qld+oWZtXeR1kWfaVkscZQ9lYJjocVAdnY23niYPwYUfGOhvQBpEUqLPjOU fBmZBSQP6DSgStmMERV2gFGgaulGiYmgvEJWBuqYVeluMPabz/CE/ChF9oecaJd/mXZ5 WXUtTTGS+4hVbelqmHZ7pjYJoSZ2qjZWQGRsy6VEighwPepW1aWjpLZr9bcXMMdU/s4i dVQlpQ7Jo42xa1BVM4chkqVmkOboem6XUz26nNQwcu5lgiZXTs0XiOU0i0H4h8CxiHz6 bt/JhIBaG246qEiypih3c476qJBqE4eqqJRKTZNaqZi6TJeaqZwqTJvaqaCaS58aqqQK SzmYqGq6R/62f4XHgAaopBPZb3taqhdnikP3kQZFcK3miVNXT3YiqKhDqxRoq75ocDLq q4G6bog6q8LKcMQqiYEXElhEart5lly6kSEJlS8JnPIILvVHkII3pBwJrM2acc9qnacF dtQZp/CYko0le0Kprt/UjFBJeAk6P5vGrOXaTOf6pV21mPIJme2qov1JsAk6r6ZF/p3E wp/TqVj7qnvnypZ1aZ+xYpbwuK4ZWZ2FebEFKprTmiuWJmsPG3oRy6sdy1jVaa0Yq7EY u6vWF7IE066/5rH6OrIP2JWHlKfFynn/KpX1mrLrY7DKSaBIKVQKK6cn2aGdhqs2q4c4 m0lfGY6LYWvZaZn2WKVfFFb3h6VTqmlShFVfJ4q1RqRVJaZNa4dPy0o6CyHNp6vGCR81 e7bDNKp+5EfMOI1kQq5yG3GnCql++7eAG7iCO7iEW7iGe7iIy7R7W6tpa0vqt7iQO3eN +0trG7mW+3CTi0xRe7mciyR027mgOx+fG7qkC32ZG02PW7qqCyKju7que0mnu08v/vi6 tGshrVu7uDtHzKlN6Te7ufu7Axi7Jwa8xLt7wru5xZu8M3i8lau8zsteu0tyeJq6z1u9 5XG71pu9N8q81Ku93kti0XunSdi831u+yIG95pu+tMS9vqu+7ltCddqCWvec71u/L8O+ 9Gu/+osf+Lu//jsi/fu/AtyDATzABrwZ6HvAxJvACvy7DNzAuPvAEEy7EjzBrlvBFqy6 GJzBpLvBHAy6HvzBnBvCImy5JFzCkHvCKLy3KrzCZ9vCLmyzMBzDDzvDNFyuNnzDwmqK uVk7ZvtI5+RycfvDx3hgKHorbwuaoDHE2TuEf6I6NhaK50kauMiNrpiwETYvKVFn/q+o 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 lV75lT+ZAAA7 --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: image/gif Content-Description: snapshot 2 Content-Transfer-Encoding: base64 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 W/YXKfgXdQu3f2KYfYV0VPy3hdekdb7keenHhr2Eg2cXfZeHecmnOzQHgkY4hD3XeWtn bibnh0NIhuoHeTb4SaBnhdKEdw4HSzUXfCuIbS0YbTHYVAzFgxNIcmiYheFnhWoo/nqn x3w5V31J12391E/wRojGN0L3dIIBVYR+x3dAJ3Kf2HfUZ4ZaVIEIx3dFyHBsp3RKSIqV CEqXmImO6Ge9Fonaln83c3hI434dd3I4FYZiA40zpVtdCClfaDXMeDTS+HOgRW9ks42M Z42PKHDISHBZKGT3Jo59I2/VxjDUWHDkaIzGdo5P9474mI9dU44qp4/++I8rw4/2CJAE 6Y/X+CjZWJAKuWwH6SgJuZAQqWsN2SgPGZEW+WoTySgVeZEc+WkZuSgb2ZEiCWkfqSgh OZIoiV4lmSgnmZIuqV0BxyWS+JI0mV4xiSUC0JI1uZPBdZOSoio6yZNCyYXlyCS+/hKU Q5mUqBWTtFIATvmUtYKUSjmVl2V/T+mUpEUAUkmVXIlYVlkATgKSLtiVZJlaVvkkYjmT ZbmWmLWSiLKVbBmXXHWT+ZWMcnmXfnVtXaKWeNmXbuVsgOaXgtlWgElpg3mYXVWYjIaY jJlYKxiYjRmZB6WYpHZmlnmZmJmZmrmZYkKPC8aZoBmaojmapKllnhlnqJmaqrmarNma raIxiBabsjmbtFmbtpliKHaburmbvNmbvvmbumJjUjacxFmcxnmcyJmcyrmczNmczvmc yvllpTmd1Fmd1nmdASad2Lmd3Nmd3vmdY6JVrjme5Fme5nmecMZglAac7Nme7vme/vD5 Lae5nvFZn/Z5n/iJnyvoJXwpmf7JRs7WJeaIjv9ZoKLlmZsGMwN6jwbaoIoToFnpWgvq oBR6oDGToLY1oRW6od+EoBGqoP3JoSJ6OBBqXLRiXCE6oiqqNyWaKomGona5ojIaNy36 XGHpoimaNPE4oxtao62GljgaoxLzcfbmeOAogDzqlz76kxoKMgfXiLm3f0W6o0nKk0sq oTn6jFcHpUT6dlVKoVcKokI6ccNYd4fof1SIPmf3ieCHT1/XjV+alGGaoVlKpj04iBd4 p2JUguzHenF6lxAqLHUqpXdqeHl4hbIUcj5Xe38qlwE6LIMahUKoiXpYRYCnhxuX/ouN 6qiPaZjItIAUqKfJ03qJWoaZinVUuqkRSZmcVnxPWHkFmKgcZ02niqSqKqedupgFM3ar KEFxaIi4aIqtKEFsyo63ypGseikEeqzMujMBJ6hj2qzSejPPCixjOa3YSl0CqXjXmq3e WjNuqZXd+q3kyl2eCYncGqnluq4TE65wya7wmjDuOq7xWq8SM6/qaq/6+jfnao7pGq37 GrAFg68AK7AGCzAEu6wHu7D98pVXmZYFy7ASG5D9uihXCZYQq7ATu7H08pU3ypL0yrEi Wy9n+bFvGbIjK7IJy6ApK7Ar27Iwu48VO5Axm7IvW7Mje7M4y7E6u7MT27M+y7BA/hu0 Bzu0ROuy2zp8KHu0+mq0YAinGkeDD2OsSmdRLBeLJtd5W8dPEDgxqCqPn+qNL7iK+lZ2 UbqMjbdz3jaJ5BZTi9RI22YyTquMxvpPatowSAePnUN6zcdCtQh9NfhtJZe2Z6s9hbtO d6h9gwe4NNe4SsW3eeu4faS2OfO2l9Nxdlgyc/tOkkuEUDS1nTszn5u4kStUd5u4vAO2 YCuD60RTeft725SqcUuEaztvhle7OEO4DiO7C7O5hhtLR6e19pSGwCp9lneLIzeKJ+ir qZe83haBOVRy0ttMSRd4wet5uKi1lThI/Ia8FEeLauq8VRu5t+u4sshPvTh2DOi3/uLX vpqXvokITSR4u+IbrOFGiltLbteXhC80decrevC2g1zrML57QqWEUR2oiq07qj24ps1k frkHhH+IdK+6tvvmema6fQg8uuhHwQpcvglMvetrRQ4oeBZcwuXri+RbuqWDwag7wT4I hHZnwi/8wdaXpj74b2KHuh8sexqcwq27wTGsiqNnwjL8wBiMe7iLMAU8Pu0bvapktyzs wivMw/CHwL6IxUCcw7Q0ha73T+5Id6gHxVR8uNE7w1v8uq/UwiJ8pPoWxJL7gClstzSM xndnvjwswsO7xY1oQA8Mg/Jrx+6ox3YcpVUMxxQcxW3Mux2btPe3tJwLvGxceS6s/scg /MKEbMZaLH97/LpCVUykm8VgvIWJjLhlXLvuV8p7/Lw1/MmTrMpWa8pTPL4MdMpZ18ab jMlJvMmlTL4/jMVo3MUK5MOsG8w2rMuWu8pg7MpzzMhNvLeWbMhaPLqSbMvUDMuITMuq XMhVO8fVDMQex83dfMrJLM7BnMmXDMerHMvdDLsn3MfZ983mLM2GHM/GbMvR7M2FK36E zEziloG9/MqmnM7KPM2NS7UUOzX9uFGXynsZ3MnqfMPRrMaLC6rjm29CvM6MaoOYTEEc qIODJ8gPLdJnrM7ELNCczMqv7H2WS8fgnHkjDNJNaMn3XNAwfdFILL09fM4hHcuw/kvE dWe+vZfDdtfDBj0/juyFkOzE5Je96Lu9wcir8ax8xoS1rthtzyPVdGe/f4x699u24ZuG zDtP+Os/ynfVx0uGqXyEat29xNtwcJ2/OJ2/Zq2FT4y+KO2KbqqL9fa999urX23WxTpN ec12A/W+AMW1a0h1WT3VDfPMQ+TOV8PImJXM8iPZoStEkC1EjMg0lH1Zls1UcvzZc7PZ nI3Qoova3+i+2gidpC03ps203hrbso2ttF3b0nrbuM2sur3bt9rbXstRXVrVXSfXgTu2 xbc0jPzae8i2p6i+ij3Itos8mAbcv6u4mbvEl1vRYqzJ1w3NfKvdEHe42T3QEXPN/san e+3scCmNtyfD3G2Z1Ni41NNNu+Dtuh3dzuBd3vutjOJ9bruaMuj9ghfNwoWny1gD31Up 3whJ3yCXvPBHquEL0HUtvjUc0R6NfW7d1V99ekVMgvYrh30KhaH3hkfYtW/IvnEtimzq 4So+fyOtw0Hd0W3Ne4cY3cIoqmDXSS8+4f9tlgzukA7+4BYNq0V+yBL9zv5M015U0hZs 1BN8zRD8vEBd4ok45R2Mzke9fR1sumQEqlKMwr58wevcvNVMwuQ8qkncwJDk5LRHqh58 usKl29tMzzbN0xTtxo+X39t95zP3TEjuwWSO03mex+Ss5Yx75rx8SHU+138Et148/rzL jIJjvMxZjM8EXdOCTsbKReeL/s5+Pr0Xrt21PNdL3OicmNNpbOjsjMuunumu/nKI+NIg TMep/OmjfoOhDMyxa4dj/n6vPuCNHurj3OlBTpFD7tOvzuozXM65PMn6fdD3vezL7uS5 3t+wbs3BXsleftO/58nOnu3X3ufe/NPSvre/vsbivu36jM0/TpQz+68aO+1JLua5XOq1 jscr3bccnOXqvtPCaMUHPdTWrulYXsmojM81rcj5jub5HrsgzdFMXt559O0fPdFCXPCc XPHFroLxrrT5Wr1mu+GGLccoftgUp0dwLdll+3DCStf+29axqL1vbuK7aOL/57/E/qvy ei3yNc7Wxfu5XG2oRHyKrc7XV43Wssi9utiLY53Z9VeUWxLyKKPgAc5Vn43Zvr0vdGkl OZns5vPuo4P1Yj+5dbj1JCv1TPquIqPaueX2o4j266X2Esr2ct+oPln3YH/3v033Cmr3 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 zMRczKWcAAA7 --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: image/gif Content-Description: snapshot 3 Content-Transfer-Encoding: base64 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 W/YXKfgXdQu3f2KYfYV0VPy3hdekdb7keenHhr2Eg2cXfZeHecmnOzQHgkY4hD3XeWtn bibnh0NIhuoHeTb4SaBnhdKEdw4HSzUXfCuIbS0YbTHYVAzFgxNIcmiYheFnhWoo/nqn x3w5V31J12391E/wRojGN0L3dIIBVYR+x3dAJ3Kf2HfUZ4ZaVIEIx3dFyHBsp3RKSIqV CEqXmImO6Ge9Fonaln83c3hI434dd3I4FYZiA40zpVtdCClfaDXMeDTS+HOgRW9ks42M Z42PKHDISHBZKGT3Jo59I2/VxjDUWHDkaIzGdo5P9474mI9dU44qp4/++I8rw4/2CJAE 6Y/X+CjZWJAKuWwH6SgJuZAQqWsN2SgPGZEW+WoTySgVeZEc+WkZuSgb2ZEiCWkfqSgh OZIoiV4lmSgnmZIuqV0BxyWS+JI0mV4xiSUC0JI1uZPBdZOSoio6yZNCyYXlyCS+/hKU Q5mUqBWTtFIATvmUtYKUSjmVl2V/T+mUpEUAUkmVXIlYVlkATgKSLtiVZJlaVvkkYjmT ZbmWmLWSiLKVbBmXXHWT+ZWMcnmXfnVtXaKWeNmXbuVsgOaXgtlWgElpg3mYXVWYjIaY jJlYKxiYjRmZB6WYpHZmlnmZmJmZmrmZYkKPC8aZoBmaojmapKllnhlnqJmaqrmarNma raIxiBabsjmbtFmbtpliKHaburmbvNmbvvmbumJjUjacxFmcxnmcyJmcyrmczNmczvmc yvllpTmd1Fmd1nmdASad2Lmd3Nmd3vmdY6JVrjme5Fme5nmecMZglAac7Nme7vme/vD5 Lae5nvFZn/Z5n/iJnyvoJXwpmf7JRs7WJeaIjv9ZoKLlmZsGMwN6jwbaoIoToFnpWgvq oBR6oDGToLY1oRW6od+EoBGqoP3JoSJ6OBBqXLRiXCE6oiqqNyWaKomGona5ojIaNy36 XGHpoik6ozp6NjXaamiJozEKhu4obvG4o0baLz36kxpaMGVnSEV6pFCKL0kqoTkadY3I c1GapQ0zpSAapFbafU5oTOMXh25Xivx0plp6mFyaoVUKdR24g1L4igxoprJXh2lalhAq LG1KpP9HgXkIePokS61np3falQE6LHtKjAwlfoM4iHeHfmdYqH5JmZxWfMDHqHoY/qfq 932SOpiUeikECnVn+kwgqKlxakA51Kl3+amUxaAAFW/AKKaxSnvXt4qfeKuqKpesWimh mqu+qjIBp6de+qvE2jPlWGuJWqzKCjJuqZVjuazQajLNCpfRWq0JM63Paq3a2jHYmqzb +q1/45mQqHjZCq7mujDdOqznuq4Bk669yq7w6jQCSa7eGq/2Wi/u6qr3Gq9feZVpqa77 GrD9ipX/+q4Be69feaMsWa4H27D0cpYK+5YM67AHm68Ue7H7KK7mSK8Ai7HnarEe27Ag G7ICO6/DN7Eky64jm7L2urIsC68u+7LrGrMya640W7PferNg+DDsSH8i07PftnNX/oql jcRy7oeL4TaqQ+o/DtN4TPqkQXtvRTtvnfOCsWhynbd1StuNWKOz7xQxTvu15rNOYrtR zVS12pN7Sudt++dzscSpf9h88Ki2FsWkvGOHdNtx6wS1FER6ckt3NQe4QLszXpu2POu3 hksyUIS41Zi3bFu3j3u2L7i2QvW2hme5ufd7hzsxUFs6ePuze6tUZFt421S5lXu5PGqy 94eyyviqS8hC40Z4syh+DZe1azhNY1e6uWuKp6h5J3h6o1d3Iwe8wsi0tDt/wlu6l6u5 DkduEtSHbxi9DsiGomi7qXe8DFhPlThIUwepuOo8sNu9vIeL1xu+SHel5ld36nuH/mhT uCekSuj3hJJ7e+zrgxhld/N7v8lDv5R7v673v/VrT80UvHOaqk2IdQY8iv5ruWLni1db v/z7h0J1vovrhvE7v3SIdLgneKgLhIu4gKk6wPYLSdAbghxYpw+8wC/XwPrbvqrrhaxb tjQHwQsswAB8h7DnbbSbwBBItyFseAmIw5CrwZKrwzWMv5kLwUMKuybsev+0xIT3T/l7 xDNswx2swjmswVmstjxMxHnbxVVMwcrXv5jrxefLwfM3hU6su4NLuC+MjTGcuFxMxVd8 w0UcwOvnuWecuRMcuqA4gACMxEYcyEVcwXVsuKS7xpibtovkuTf8xGwryEgsxahr/sU0 nHVTbMVBN8lhfMlDrLw+KMl9jLbL64uW3LlurLH9aLZkm8mcbMeVjMdkZFF7vMhSXMto PHsZKMl+7MWxXMmUPMNizLzCTMqWPMePrLyNDMxTvMyH7Mm+/MqDrMl3zMyR+8xZS83P bMvrW8hrG1JvjJBx/L7vZ30tPKh59Hboc8Dyd8fpnHnT/M7azEDFbM0tbM7VLMaDB6i6 S8aLDL86OHgbbMf0bM0bLM8dnMh2p4rnLMgcrMXCqMTCnL75jMEEHdA2iMeoTF3h7JDj bIau64oiHb8VSIpkR3EmrcNryLuvtLvU68hA/Eda+707nIHKJ6v/hrQ4rIpNmtM7/ixB Yfq6YaeLxgtvRE2GtVqAWKu92cdPunjSaWiIeWfUA6WJY6dvWvt4ZreEG40z7uuwJ9fV 06O5KNfRFPnRAXu6RMhWjEiYZq2RaL2v4si1CEXXifnWBauvOPurX73XytrXfk2sgB3Y vjrYhK2qhv3NVkszYd0wbeyzYOuNkxuOYg1z4EiMORPWUpdwjNu1eG2ScQ3T2se5n9vY jj3akw25jYvaYSsxlX0511wzZC3Hik3Oka3an1u1rd3Ktp01iU21pG3MNkNTxC3cilvF KfPauA1xrLzcub1trWvctE2in72w9Vp51wup1vvSu1jVrqjTTTi94rvO3r3V5Ju0/mm4 tUbdw0gtijNNvNgr3lJtvukNf4M6vaOajhLI3jbNvZ6Epp8M4NjEb03ai+n9uscri7YK 1BQndyLN3+CNT+XL4HRT3RJ73fmWwekL0XHY0CI8zz24elQIwvvL0BxIuQQcwby8fbTK 0yO8txRdwS1O4u1MyR6M3RZtuiFuwQ/dg9qMR0HY4xHdzFzs4uj8vyae0Hxsv5gczfvr yifcxEXz24Rc5TJt0FscydLs0KacxMmMej/szWR8d5hIzEiuv/umxGlu0GFs4zDN5Vo8 TQEMyfkszZgY4PDszwMMg5H85hZ9z3vOw5480XJexlm+5cxl4c6K4V1+yEk+58h8/sqj PM/IXeWD7suVrs+DXs3cfOawDOnXvOIUPOnIHc29LNr6bOZATOm87dzb1+de/rjMVNum Xkp5DOvxHOm4/nv0XOthnjNU/uOv7MyYDuVWTseOvMeYXuyyLsvMXsuqnuTBLOZ9y+bH ztu1vumdfsrQnMmVLtraruzfHubE7s5PzOW//Oy0Xs+9jux2nTLBLuobrtCAbrofPskx 7uXKTtFzWnJvnuI+vs7rF+1WfsapbvDU7uMBvclwHvCni8B0ruQgnrz+/s0oTO8ovr42 3nsvbsMmrs4Tjt/OLNDsrunCnmqKTq1WTauEeNRS3eJKfeVX7Ywrf4TozbTAi4Pv/k1N Jl3VM8+KtzvVSF3Tchq8OD93zrvS5F3f3p27Sc3SOD2LLsWH3ab0AHjzR2i9cuq7ZqTg Sa/TPb/gWK1HL6/cChPs0X01Zg9Saw/ufTnbwJ7yoW23kRNcbd/qd9nWNYP2E8eT7w6P j52Sf2+sqjyQh52zcs/oh3+nfL/4R9r4jr+jkB/5M8r3Nh/StMjZPhv48ii1ONe57PiL Q3vb83b3pT+1nl+IcxPvjIqpN06ovY3ta73a+CaDjus2fBvbMiz7m+v2zZ00hmz7mq/Y pg/vid+xuY3w3Szw3z63eP/cv9/5pc03uX+3zx/9pA/8fhz7UUv8q3/8Bpv8Ec/8/hX/ tkM/vrLIezuN0rPbf1U4bk393egN38P79S8/vlif/iIvfU1t9C9keQgwEdO6jjU4mYz0 2Wrz8p+CjY5YhlVEahc7cRcUf3Pdos/rYpko0SvWDZTK4YQmIIzGbDqf0Kh0GjgcCAIB AGDFCgjgsHhM6HqpUeTS1ZGxgSGK7Of7dXRzjbE9pyPjd305Jkl2e21/cimAKHmAeoqG kYJMeIiKlpmPdZh9jIN5PqB3hYd7ahuPjXWQl66LSpKhfKebs0WGh4KltZWnpaqyq6Zo xcbHaF1ZW8pfZM9gZlnIlXB2npypjJSxtL7cgyROrXwto+Cf34gn1q/sTbCkI+PE/ubV jvivm/Pwwe2o3rq1Coer35F6ofjJi5dooa5GBz2hy9eQnJxyGAcGs+iOB7WPIKk0Y3Yl CzRo0gSEDMhSm5t2cXYE+sRqIz2DrrZB1MeNTk+cGqG8iKmz3FBZQv5N5DkTZjqMLn2y PBo06bVtSS0+fCkx59KiFzMCXVqRZtOiQWdyTLuyrVsmI7mUdHZyTMqVb1pm29uPnK56 VZ+seQpWGELAhXNuJcwpq1IQUMn2RHyv8uLG/ppStnq15c/LXn8yTRwPrT+Ek792TdvL aOa3sFfGbVaXzN2QMhfh2n0OJqw3vy+eq/mv0E7irG1p1vqUg0y9kJ6vZX7r8Kxr/tmG dcXWmhS+39ElPncJ3G+3DcY7YYf6K2Z0YNUtK9/q3I96UINzJY7NH8rsubXZdcUZH5Wg R31DJPhOZR6wswJ6RRAEmUBL9DChgSroEI53CUYUBDxHGZXhDqzwsOCImKA4IomE0CMh gzE4GCGEGw7hkQ3vGEiER2o4FyJ6SmgIIotH4NDgjD0KGWNYFl5ICJJBEtnflMnMRZIX AYpxG5WRcenll2CGiUxeYpZp5pkgcYbmmmy22d9/WGYZzYDTcKmmm3jmqSdEFe7p5594 ASrooHvCaZKcZdCpEqGMNuqoi49GKumNklZq6TGG0pXllpd26umnoIYq6qikVunF/pWH yslpqay26uqrsMYqq6nLyBWnqorOquuuvPbq669rZopoomDUCeyxyCar7LK+CovoqsxG K+201Fabp7O4FrtomX32B0O31k4Bbqt38jfumSr0YFWSFZ5QrrjUUBrun9humiu6YjaU hq7vwrtrv4Fut2ZBHDp1XVjd3slRMQDPy2a9AUILZsMB72fxqBQL5vCYF+f7mGuO7QLj fhmPszGhENcmMcNIRmjEt7xFaWSRcMBMkIozzmyJL/ita/OBPTepc3onJsFjzDMLPY+J 9tiHNB4/D6lekUT3aWLMR2e1rk7ZKQaUhjViOHRnAp+MZ8p1rUxFckjxEp9U7ogH/p9m zZ02tXB3t+21fRm1VxAqGeLNN3h7/zjUQG4TvhuI+uU3ONfX9Ty31ol8C/l6Gi9H0X3p lW12m2ifpLa4OSL4seB0N73WPgw1J6NCnLV+U0eyq1n75aHJzifroNW9eeqr/86Yuuqo Y17TjNNMmNBdWm683aF1+fnDVtqaqr3appn5amYB1p1obGEjvGmrEdc3h/S9Ngnbw6/f veAhM8h2YJHLl7vvguWWmvSnR1m5wefRH1NQ47npoSl0KLlXvCDFvd/5xXTLGw13WtTA /rFvMhBUzQDBhz/KrGNhW+vgRB4YPwIer1y30yBWwKKvB8rPOhuMXskMyCUEPmN0/lKo D+KIUr+9HYdv8wnP6XQoRBGNzzDFw8z5gNe5E7ZmFNPh4QuRyJPjMU53+4Nge1JXMOks zDVmQZhN4GcLLIqGhmeyoW0UGC+cSQhFMYJj6Xy0l6wdKIJzbNGNVmSDJSnIjUyKo5LS dSQK8vFBL7rBHmFmD7FhSI6UQuQa3OUyngVJkYPcYw0WCbQ/Kg9HG7rZjihIBDSCrnq0 eRYbHUUmZLWSVK90UyxNSctkqVFA2ZtUb1y5S1j2Upa/rKUwf3VLLa2SlefylbxKtUw8 NXOY0NxVMcOAw2ha85rYzGZIpjmnXGrzm+AMpzibwE1iEWic6EynOmlZzmqu853w/own MVEJIFV6U574zKc+ZdXOY+7znwANqKT6eU+BGvSgCL0WPW+FvXMm9KEQjWgNF3q9iPlT ohjNqEZFQlFNWbSgGw2pSEVKUIeO9KQohWhJjZXSlroUoCvd1ktnStN3xrSmOM2pOG+q 0576FJo8/alQh/q5oBL1qEidllGTytSmzvNU1vOoyi7q1KpalVVLvapWtwqqrHL1q2B1 lFfDStay6mms0kpmbGaYxIzpS0RPit0djcFWs74UrWk1U10T4tbiXSUvIVzQ2uxqVbyy iq175RhuuELXmkmRPZnrmr8I21TDMspB+rHReDKYQyi+LGxJY+RNAJYz3PXRdpKd/t3V dOPZQFJWopa9bA83w5XF7EstZMStbm2Hhu+BMYCTzWE+vtML2772obEl1BMdKL6zDJaO IlNOk1BoHB19Byfb+WIs6IighzxxaYk9rk07Oix3Kpe5VbSGcTVGv1U8D4COlZ5v3zpc 9nrue8uNr3gzmtxB5Ze22lhv/sYYiKq8LLv1vUf6HlMakzlXweKhyBb3i9H+CupBTCIY dmrEsG+8bhck2oll3pXB1YZWuK5NHlwhwzQK85e89jSppcL7Uhq7+KAWBpSNW7rjGwc0 x356JlGF7OOQArnISN7vkZPMZMIuuclQDuuTo0xlrU65yliubEetwOUue7nLIM2y/pjL mqkvm9kKAjDvmNesZag2wwx1yYKaL/w6l4lSdXW+M8uCcGfr+jnPxHORnQP9Zz4TGtCC 7jOiCz1oPBOZzaMq84DinGaqQvrSTJV0gORsaWQa2tGNZrSee7voUn9a1Pk7talDvWq5 qvrVrIZ1jzENKE3XhtNhprWuiWprSs9518B2aa9PgmsZB/vYOR02NIrNUmQ7u6bKfgaz Zfrsagt7y5MmdqVzbe1ubzTaZJi2t8d9UnCPQdzkTrdGzS0GdH/qrSsK7OFY5DNHtnFC o1Rrbz2mbpVie9PbNrYuzzMVg8zVeZMUGcV89NdJ8K+xYZp1v7HJ7jC4+1KYiWVg/tVb nvcydrDLo85bJL69ieP437cOeLMx/kL6joexB67t7tYGuyEWCHNku7np9G3ydFZcW7/W 8cg4u+LrkschHfOOVgh4jOIWsMO77TlMUe7rTrNyZNFjj9MLnOCHU2I6RIe6KXiO4rGT XOo0/LkXgv4n+j74M193hG+9fokvalfsEtTe0emO9nBKOguAD7zg2R5k+zU4jKXRXe9I 54bO4fzme7dxzN/e93WWWfCYDzzh9WRiFm/PkJbjh9iwnuoTO66NpIRbmpTk8MrD88rM jLjrXQ97WMp+9n2vve29dHbcZ1n3vg/+vIAv/OIrFcbZErjxl29K4p+X5thNdSRJ/j3q GVi3QBxmOGxKq33mW9P5/oU6fEe8QJhzPOvQj3uH8GKeRHo/muAXusLIh+Kn1/+3swR5 Xz7elthx/f3XFH+yJ1pSBDVwlAoE2EmUlGIRZnOoFzI/0n/Tp3oACFTI11ArVylbVzgj ZHSKZnRSgxZMJ3atNGu94XYVWEsCeHvf1WIAtnUl1Hj1V293N1lRRHa3lTuOl4JotIIT A4InhA70s2D/d1vzZ39CoT7ms1gJtoQ82IMX+FHK9ygwCGHAk14P5kIORnmPNyaTt4G4 8YUg+IRQ6Gb1lHwZGCmBkwudJBU6IknCYTPWlwYl1hmJdWoixn59lodkaEA+2IeA/ngp fxiIhPgog1iIiDgoh5iIjFgoUThV3NaIklgqiziJlphGj5g2Vvdubfhwozd+1Jc0voGD lrRJcyWBIbZhl1hUmSg6m/huFZSDpCiLOhhB4ld3zMOEZ+F+q+gwlYgmRJiDfNd08gNZ 5bd/UVExf8F/vTh8rZhAkdgoRpOKTFM1NPEkmQVxBhM/XlgRqYV9CeFezWg2v2guHigQ 54hnY0hzbpeKq4dvErdIoDiOx2eGDCWFaaiG6ThGYCiEiFUYIaR33SN5gXRHs0iPvFKO a7WP5hd1hjeMVriF8xhcuAiRnycfAoaQyKKQ23eO+MGPFXSK+9aQHzNDH8mQAlki/uuo kdHCkW4ROIsjepnAYYKEhKXoZyx2kKaohS8JXdHFktTikkA5lBxljxUFiVNIlEoZLM94 Q6+4lFD5JUIZlVQ5lVQJlVZ5lUqZlVTik+vALaUoijnHjpekih2pjgyolc3SlGsUjaES jL3nVz6TjYq1i7nIfuonWGp5LFzZlbEYl48VkBk5ksBhkZ1lhd+4l73SlxyzM9a3c93X R7p4Wu6hk/sgjh3pjYapmK3CmIoFhsHhkDumNUoRTCMpYvHoGZvJmVjFlriUlNKIkjAo DguJXUVUV4K5g+VXgrrJmrrimcTokAXYdZaJdYCFfhSZDoNJOgrBQ4Dpm4ICnBDn/nQn qRYxN5rS5TTLiZG51WPBs53QSSrSGYozCSHcIQ/4FoadmH0HWWhhdJb495zhSS+uaUxu OZ/46R/1SU1PmZ/+uQDj+Z+BGKAC2ocEWqBPeKAImoIKuqAA2KAO6n0QGqHLN6EUWnwW eqHBl6Eainsc2qG0t5/dBJsgypkfWqJod6Io2nMquqIT16Iuqm4wGqPkNqM06m02eqPW lqM6+mw82qPI9qNAGmxCOqS7VqRGSmtImqSXtqRMymZO+qRjFqVS+nsiak75WKUsSaVa SmVc2qVQ9qVgymRiOqZIVqZm6mNomqYutqZsqmRXunlvaqBx2p9zWohueqeUlad6/mpX fNqnZFan9yl9xcmHdiKfdFUyvOUpxVmoE3mLNpiY9zYljioUC+dXF5aoJddZy9QwjyYF UyaSk+mXNgmWfBeMmWo/93dGo9qqRpiMdZl0xAiYl4qcnKd//keCEpmc1BCqj6p/diKr pqqoLKeqwsiqoIKdpFcxvHeMiLpAJMZCwbmawqqfRilVmjion9eJOykzfDKNZemYivRX cgiPjxlif6NZc1k6YvmYjUON58o53AUkQzOvVfNZNLlhlAMp9po41zdH8gpY5SqZH3JJ jpk13lpIjZQuVtMyYdNE94qMcTiuoRexyrmwqferoCqoJGqpV7OPUGR4/po3BvmC/lwj CiAJhAKzYN7lN0GjN0qkCeSXrmJxH2V0P87VYMXVGPCxQ+hjswrWs/Uls+oFtEzUgFgI RJIRNwmHNHAnYZhTnt31kSNYqtZaK6mEhtQ2rQlHrjXHYNATPLRzgoJFbxlGYOPCsgrj QQBhtnlnRajTPjgZEednqXK5tB6UPOFztIa6t86DdKqDO+0FdrWDWUiLGiIHQ0EIYtRx dzTmq+8jRsYaQxfEgSq2qNm1uC8Xke+5XUvrhtuohIzhhJbrG0mYYhEYtf+lQlQhuoqx uXmHc6gqQ+iFs9UAQoL7GScCPVwEQ6bLjBobBZA7PocntmzLQSokDLY5YEnLgHBZ/haU mxkxWLPRq6pweboFyUJm5zt+G7YGhxWbu7eoM7sgxHq+i2C4e7j7I7ciJDzcWES7+hHD S7MTBq7b9bJEC71dZJ0r9EMui17/g5jvJbUhSwu3GZLzgcAHU0f927INaEJoK0ahmYVA i19zsxFuI4MyaDUNjEdwq0O5C0SaqXgFJ8LL27/Be7VaEFXlZaf+g66gBF2AIwrUyHrE U7B2VJbTxUh/tknhqoANi7JEZLA5DEk8k0kq6T/nmnpFk7EN8sNvBDaPVEmFBHr1GlpB zDzVKCV/1DUkdMOT9LcWcoCQtJ4MN2gAi2Ex7HknG14n+qzPR6opTEP5NytwfCx3/uwl b7wstBp92aRhyoROeTxR19rC2hpklRouCBtOn/oqjcxVfwqoUsaxWSrJiBjJlgzJlLy1 mcyImNzJV1WOvfmOyzqpEuhx1YqpefUlCSN5AEGHE1OrI0cuYZiofFaujzwFxKddg9kv 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 cIyjHKGYAAA7 --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: image/gif Content-Description: snapshot 4 Content-Transfer-Encoding: base64 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 W/YXKfgXdQu3f2KYfYV0VPy3hdekdb7keenHhr2Eg2cXfZeHecmnOzQHgkY4hD3XeWtn bibnh0NIhuoHeTb4SaBnhdKEdw4HSzUXfCuIbS0YbTHYVAzFgxNIcmiYheFnhWoo/nqn x3w5V31J12391E/wRojGN0L3dIIBVYR+x3dAJ3Kf2HfUZ4ZaVIEIx3dFyHBsp3RKSIqV CEqXmImO6Ge9Fonaln83c3hI434dd3I4FYZiA40zpVtdCClfaDXMeDTS+HOgRW9ks42M Z42PKHDISHBZKGT3Jo59I2/VxjDUWHDkaIzGdo5P9474mI9dU44qp4/++I8rw4/2CJAE 6Y/X+CjZWJAKuWwH6SgJuZAQqWsN2SgPGZEW+WoTySgVeZEc+WkZuSgb2ZEiCWkfqSgh OZIoiV4lmSgnmZIuqV0BxyWS+JI0mV4xiSUC0JI1uZPBdZOSoio6yZNCyYXlyCS+/hKU Q5mUqBWTtFIATvmUtYKUSjmVl2V/T+mUpEUAUkmVXIlYVlkATgKSLtiVZJlaVvkkYjmT ZbmWmLWSiLKVbBmXXHWT+ZWMcnmXfnVtXaKWeNmXbuVsgOaXgtlWgElpg3mYXVWYjIaY jJlYKxiYjRmZB6WYpHZmlnmZmJmZmrmZYkKPC8aZoBmaojmapKllnhlnqJmaqrmarNma raIxiBabsjmbtFmbtpliKHaburmbvNmbvvmbumJjUjacxFmcxnmcyJmcyrmczNmczvmc yvllpTmd1Fmd1nmdASad2Lmd3Nmd3vmdY6JVrjme5Fme5nmecMZglAac7Nme7vme/vD5 Lae5nvFZn/Z5n/iJnyvoJXwpmf7JRs7WJeaIjv9ZoKLlmZsGMwN6jwbaoIoToFnpWgvq oBR6oDGToLY1oRW6od+EoBGqoP3JoSJ6OBBqXLRiXCE6oiqqNyWaKomGona5ojIaNy36 XGHpoik6ozp6NjXaamiJozG6o0I6Nj36kxo6pEhKNkUqoTmapE5aNUsKokH6pFSaavv5 oRnapFW6pUUDocKipVwapjgToMMCpmJ6pjNDmZyGpmxKXY9pmG0apzWjppdCoHJ6p9Tz pouJp3xaMgH3pVPap4IKMX8KLGM5qIg6MW6plYeaqI7qMIsKl486qfsSqY1KqZha/jCW aqaZ2qlFJJCKd6meOqpOA6rDJ6oviETdiEfsOD6ranykKmybGqgaJ4SwWoPFV4fv1Iix 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 feurzlsdluGMlZ+xqInGyEjNRIbMlByllleXb4T4IZhqRLF66hH3UH9epFR3pj1/SmTJ cBP/88nOQa8ayhPt88wQ9Es/TC7vtjVZ8B71dD09dmLJ1Caj4ICDxo3r2Fv51qKCunAq QEolemi8pgYE2KLiyn5HhFUFaZbZxHeYpoonV4V32+1k89gmR2I3H1ulSrV3hMO4SEOH l4BCu27V9qR7pUI8uFUcuo8b71rfwtAt2t0dfrLt8cEOviAv6RVe+fQZ3tyX+U8g3aAP OVrMnbudCM59+q7vE63/+rIPDbE/+7bPCLV/+7o/gpO/+76vnb0f4Lv7+8SfBfJu/vnF n/xWkPufr/zO3wR99+JYHnPPX/2OEPwd+PLZ7ujW3/0wAJFK/swG6v3k/7ObH8chT4wl v7+kX/7PffxKfrf37f70X1zYP4MvT7WTXP/873z3/78IELPRO81Bpp6LMOrNu/9gKI5k aZ5oqq5s675wLM90bd/ucRCCAAA6noBALBqPhKAQp8own9CodEqtWq/YrHYb7P26Q6SY qOxtN86zes1uu9/wuDwL/u5643FZ0E7P/4CBgoOEhYYjdUB3YXlHe4eQkZKTlJWWhYlg jUiPl56foKGio6QBmYubjjtLpa2ur7CxsjKnQqlGnbO6u7y9vpa1eLdkq2a/x8jJ/srL U8GMt7nM0tPU1dYNzsPERMbX3t/g4aLZ2tHi5+jp6m7kw+br8PHy87SLdrblxXz0/P3+ /x3aQdMHsKDBg+gEpnqHsKHDh7wUbmIIsaLFi54kNqKIsaPHj3805uEIsqTJk1ZE6iGI sqXLl0xUiiEJs6bNmyBkcmKJs6fPn9jsKcLnjifQo0hR6lTFbV/Sp1AxLsVlNKrVqwWn FqGJtatXcVq3sfpKtixYoZryNX3hpwMFDW1BxC3xFkOMujbwopir126UCX76yp0AQ7AU wYZDAI6U+DAGwmxFUJirAA1lDo1thE1StcmItpcxp3ACWrGJ0IVbUF7tuDKa05VR/rt2 61eGbLgfWOe+cIjw7RsZfEv+THy26Nd0U6JFpXbsCshyrZDeC/vJb+prSievTpu37RO6 u5vuXVvL9evjwXNvtpzowLWqjUuYXEHC4+AMHuRffD+N/tj43QeXBRX4R199j9VH4HwM LgjggIHx99Z/Dw6oIGAB1uXgghbQN6GA3s3XYYENOihihQxipmGH+gWYonwFkjYZgTQG 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 vuxkv5UZjaqpi4Amf6KboVkMir6nquTKZUZCtzoGxnm7wgeMa70rXL87kSpMx3ycEC28 FUark3fUx4R8Di4LTYN7Fay4yIzcyI78yJAcyZI8yZS8yIUsPAgcNAqcmJfcyR9xyJ4c yvIAyqJcyulAyqacyuCAyqrcytXAyq4cy8sAy7Jcy79Ay7acy7qAy7rcy6/Ay74czKMA zMJczBnxx2LByca8zMhAzMz8zIfgzNA8zfOKzCi0wNScza4gzdrczYqWyYC0ny/szeTc sdaMueWczisKzpcbyOr8zq12zu4Mz/QcEvI8zvWcz3PAzfrcz8l2z9jszwLdBvw8/tAG /YHs3EV5fNAMfQYF3dAQXWMArcwRXdFR8NAWndFBkdC+q9EejS8cjccfPdKYbMeHKdIk ndJsG9KbvNAq/dIIbdIJ7JYBDdM2TZAsTdMUfdM8/QEY3dP6/NNAXc9CPdTwXNRGrc5I ndTlvNRM7c1O/dTa/LAUu6NDeUby50OgmbF6SbYm85oRa8ZXVUlPLNUa4LGWpKNqSZgj Ci+rC3RoW5wOZ6qp2rcmip97atYEPdEubbAvSo9aWW+HlHIcR4KFWDKUWqlmetV6/c0y rck63dfjAbu9isJEHLfOm5Wlsbwyenk1N4cqY5QqdaGzGtoOCHD2KoaMCyCqO4C9/im9 je3TfO3BWhhOinOpv0Wn4TU/+/eCq8qnVMPbVaPZuuU4NrJM9bvDda2FXNLEVMonPhXb EYDWRTN96Pa+jJXIcxp+EmdZTwh+uX2O19V4gg3cb8aEmzp5VuPVJE3dExpSmUfEWTrX zyKXiK2GOphjCvNihEaEx63YUJqK5jJbDdpgVS3V7s2e6I1myzujrHRTthWhbkWhBTqq s9qHe/mg3U1/ZKh/eB3bCW57arXeqZPDirc7jAhbb9xa++2g8Ml2Ajfcdu2EjD1its2p aiIcOQfdbw3is0240uq4v9mM7vpkvfemINy/DLaqVYfGoDqt6xt2uNlVW7zYSr6o/lGq ddIdED8ey2W95Rv92OHcovjMxwUL5g7d5arM3mj+zzktzjXd5hod1XLuy3Re57p853hu y3q+57Lc537uyoAe6Ko86IRuyoZ+6KKc6IruyYze6Jf86JBOyJI+6Xxc6Za+wpie6d+7 6Zw+uZ7+6Vgb6qIOs6Re6ix76qiOsqq+6iTb6q4OsrAe6zc567Q+k7Z+6y+Z67p+krze 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 --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: image/gif Content-Description: snapshot 5 Content-Transfer-Encoding: base64 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 W/YXKfgXdQu3f2KYfYV0VPy3hdekdb7keenHhr2Eg2cXfZeHecmnOzQHgkY4hD3XeWtn bibnh0NIhuoHeTb4SaBnhdKEdw4HSzUXfCuIbS0YbTHYVAzFgxNIcmiYheFnhWoo/nqn x3w5V31J12391E/wRojGN0L3dIIBVYR+x3dAJ3Kf2HfUZ4ZaVIEIx3dFyHBsp3RKSIqV CEqXmImO6Ge9Fonaln83c3hI434dd3I4FYZiA40zpVtdCClfaDXMeDTS+HOgRW9ks42M Z42PKHDISHBZKGT3Jo59I2/VxjDUWHDkaIzGdo5P9474mI9dU44qp4/++I8rw4/2CJAE 6Y/X+CjZWJAKuWwH6SgJuZAQqWsN2SgPGZEW+WoTySgVeZEc+WkZuSgb2ZEiCWkfqSgh OZIoiV4lmSgnmZIuqV0BxyWS+JI0mV4xiSUC0JI1uZPBdZOSoio6yZNCyYXlyCS+/hKU Q5mUqBWTtFIATvmUtYKUSjmVl2V/T+mUpEUAUkmVXIlYVlkATgKSLtiVZJlaVvkkYjmT ZbmWmLWSiLKVbBmXXHWT+ZWMcnmXfnVtXaKWeNmXbuVsgOaXgtlWgElpg3mYXVWYjIaY jJlYKxiYjRmZB6WYpHZmlnmZmJmZmrmZYkKPC8aZoBmaojmapKllnhlnqJmaqrmarNma raIxiBabsjmbtFmbtpliKHaburmbvNmbvvmbumJjUjacxFmcxnmcyJmcyrmczNmczvmc yvllpTmd1Fmd1nmdASad2Lmd3Nmd3vmdY6JVrjme5Fme5nmecMZglAac7Nme7vme/vD5 Lae5nvFZn/Z5n/iJnyvoJXwpmf7JRs7WJeaIjv9ZoKLlmZsGMwN6jwbaoIoToFnpWgvq oBR6oDGToLY1oRW6od+EoBGqoP3JoSJ6OBBqXLRiXCE6oiqqNyWaKomGona5ojIaNy36 XGHpoik6ozp6NjXaamiJozEKhu5YcUPqRc8Eg0tYpDtKlj36kxoqj3VIejXoi0hHc95G d1a6pGvZpBKao8qYe9+mdNrTTOs0eL8HplralVwKokH6pc0kfgZkRfnWc6VjeP9mQGLq bWnKpPv5oRnqpe80p/L3h1C0Th73PVWKPniKiXvKlhAqLIA6phgFjjlUp74YqJO6/k3J 80/x2KgjGaDDEqknJKiVh6aFiqYWZae/t6l56qlxSZmcFqZ3aKn2lKqZ2jmXWnKTyqmu ipeweikEiqngx3uuR6vMlHu2t3F216pZ2qtC+auUxaAudYR8aHn71qqGiKVkl6S26qxD Ca2VEqzS06neapDlCKltOq7lqpQBV2uiuq7wqjJuqZVjGa/2ijPzCpf3uq8Tk6/1yq8A 2zMCqXj/GrAGS2wDO3wFe7AM2zH++q4NG7EI87DpKrEWC1cJe38Le7Eci7GeCYkEC7Ed O7L78pVXmZYVS7Iqqy8mi5UoK64rG7P28pU3ypIbK7M4O7MZC5Y1+5Y3m7M5S7Ew/gu0 Kiu00kq0F2u0SLu0+/ix5hiyKcu0HKu0Ugu0VFu1OHu1WBuzWru1RZuxXvizXmuxXTu2 HVu2L8iOfcQ7v1h85uN+lKhG1no14Mi2tuo/4cZPENis2hN4ajsyzAiNh6e2fXg5JYO2 LygyiRoxp6qn3Uqmbyt4BSN1O3duqdpy83a5TEhLsqd9tcqsGQWlk+u4uIqqicuqFCSl CYO4bto9fOswjSuDhnoyZyq6uFp4ScNAr0urG2WsYipUivq7uzuqV8o05Kq6iWu6X3q8 yhswrCusvHeKn7iLA6Wo2We90nt0nmS9FEeL3Ku3Dti9tBeKM5h6rfemuou7S8hC/tqr t3IovgA4u9naiu2bt4vUiMGrq5B7peMLe4UKp6aYtxQXvl0nQd+7vhdovltnwNOEi5s6 cqOIVBIkiwzIjs8rqVlnpz6IdLhXrPybv38YwrHbg5/7u+aHrCdcwou7wIQKhKrYrApM fgsYf1U6fj7YwqYqSwpseCSMfo0rwNzrjCGMrLP6uZBURZC7uJXafsu6wT08w8Xav4ba g2fawcXrwRz8whpsxRMLttgothisqbCXhk3MwVnqSYt4xkVMRr6LenLqxk1MusmaxLda t4sadBrMxnC8v39Ex/FmpWbsx8J7xZyrq9uLrUWsxWssuSZnb2+8xWO8yDesilWs/saC PMiNzG/TdMl7vMULc8HEm6f3W6aCrL6A3ENxzMcZrKc1bLqBLKiHqsK3asR2mL8KFMdw q8hr/E+cDKaVnMe87MmgS8e8+ri0HMWzG4L6W0zAq8qs3MbbJ8yDt7/OrLu9DMOJbKmj XMJd7LT92Ltlus3YjMV1x7vbnMrA3MutTLrSXIXirMivrMvQvM7xDL7nPMvZzLuaOsuv nM+nvMv/rM+aF8ixq8orLMn0LND13M6VqsT+jMnBPM7t7MEP7bFT8822G0t5tNHqm8rW XEpOLIyJLM/pPM1JvM6Oi8Ql3cHH6swbvKvUbKYjXc4ULdHWF75mmsJiDNLULEV3/pur BX3DGp2oS7zSvUfTIuzH8GzJNz3PPA3S9Iy7G43PFn1cGK1uAzy93ruGdxeLachPoCdQ rjjEymdMI2fWmHynnPeK34vW3Wu/Xzd2rXh611e9XA3BAky+9TvWwouLqAfEcnyH8wTW VHfGeQe8dT3XuijXbEeG/et23Bpv8xuLrNjVjv3YU+ovoGy5XsW8mTu8buPZoJ2Um61U 7PxRou2NUYo2op3aClnaOfO3GtSNJEPboc24dwnbZguwur3b+9rbvm2vwB3c8DrcxF2u xi2ryBR1+As3ODhv9YS3TdiIrv2MGZ22k1vdPJe5H/fIm4jGl/jRhr2BeBSGjFgz/skd xqMdyrc7zLk7uj5tuMm7z8csyacd29c938Kq3aWbcM2rz7KrrUOsyVktdu5du9BMXV6M kGCs3A8jtwK9NJRYy8a8hW9H1Qct4eajuvwt37DruSCO4CKt0Gl92iIe0AruzQMJ39EN i5030PYbwY9ndq744uQGdgXcetXLwklKre47dv2dxRTtPEl4yxCc2AQMwAzMvucri++L qHjdbaPH4wgc5QbMwg6MvS+k5KTIfhFI39ycw+HMy6kL00ad4he94tkNwnbHqtLcuUcc zHD+wCWtx1Lc1Dg80Vwsubenxz+t1FP80h/c0C7NxCfNgXMu6DbciTGNdYRevlCM/sLk bMSUbMsp3LkwjYJMvsnqfYSkLNZ1nKs5k9xo3NPKl8eMrM6vNMh1y8gL/er428+NLucU hLoEncyU/ud3h9AjzekIXcbQx+udDNB7y+q7eq2dLOD0ncWcfqorDH9U3d//rOyBLstd PuoL7pANLu33HO0gHM1Bfc5C5X3KC7f+DOxD3u3dDu4zaIdujswQ/aZtbM1yXtHPLO/o btIOXdPxzs6w7uER3dLLHu37/uxE/OkeHtAZfvC4fN/ymu0Uue0Jv+5hvswYTvCc3ElB Xs38nPHhPu8dX+4XXt8cX3OyHsC4Xu/J/O+uztQRXfK67u3XLNQDz+8FL9Ei7t02/o3S jzvup9zhVc1SVw3iMr3sPN/nkH7vSG/YgLzUiB7p1h7nvvzEPMzvwwrvxC7PQl7oWX/U Fi/ox9zwVPrUZ77Tj97SQmjLUA3UOiiKk27CfCvwO6/TYF6rt6j2QN9BEK+REj+KXW7Z 1+7p8LfjY61vWU5ui112nufYVF7jiE9Np/TuuJ6OmoxP14vy+gbDmK3VSD7QrFj4l2/4 DXfXo4/5h53JeU3608v5iP2GkA2IXy3Zp77A4j5307zwM5PeZnPix81UNLr3L3u0zv2A vQ8/ef/wKg61Q4tzsl3826X7zp+m0B/9Szr91K+j1n/9Mpr92q+ipB6MO5dU4I+8/mvb upm92qus5ASuiROzw687uMff3CxufAjfSBtejdsG3pfPcniL/niENAhwRyIAiglCq70k ysC7/+DAiQEJjuGZdubZqnCMyq732jg9D+bb+r+cbpgj+WZCXY/IVDZjxuZRtnxaVbdn 9kot2US8knELC4/GXHF6zYw0Hu4JZk7RNNhk1ooWLLOxV301ekNVXklmXoKHf36MHzd5 e5KNg5WPTlKEl5ydXJFnO5SQi2mJnpVxcAsNdHR2AmtZYVGLp5uPiTy0aqdmvz1gSGqH tGO/xCy7KL6zKYaKzIhlyMtnYMbWUcpivsndpLzNs8Df1uHBP7rL2Nrm4+q9QOLq/kDE 7deh2aH5isD2/cCVC/jlGDlS78jNE4iGITdlo1DBUAWBlRxXF2DJQviv2MNIu4IhscVv m797K0xC4wXpSzGTSaINEybz2i2X5QRV2TYFJMphjIyN5IgGGVCjO0UppSk0aMmW8qBG dYqzKNV9SAmJw+Wxq8qhVYG6LPjzZrd4DLHlG/hS4hWKcTBi0GhK6teroHrC1Pm0q1+t O3AZFcyT3x6vOJjGBBR4EuC/kPGeA/ty8lWtIe3abCi2z87MVB9jMmRwyt+Qd72CrneL sznMlpNiAdjUbMCBuBvmdmsFrkW5GRds+KQZrEFL6UjC9hwaVM2VnYvY7OKUOU2x/owj N5bd0zEmIbKRG3ekXdfhu85HU6YMs3ip5o2nZW+2qT147IZLtrMcTr//e7qhxtsTvkkA nAV0BQLVYKmJF51gXEnT1ncnNQhZdxTONJRnexUiWn/nFCade+SF552JJLpgH3Px1bcg V6Thd1mEMUb2HmFjoXhfht8A2KNUPga5W5AD9mbRKgYeWIdwdxCXmD9qRTMYhGWddlJQ SwjDEjfmaRlYEIVFCdBpLOaSnT72ufgYhkVwxpdSM4mJGY5sKZbMdaoZplZr68F3Z1i5 ZKmmm4FSKWJRhHKZZn4+uoPQf0NGOmWRNBTYipIZMBlLIHwSOdJNIR7zkHoE6fWg/ql9 mvdpXh3Vx5I2ZoEkqoNnCdgPPAXJus9ZIXQEK6iv/porOGmxBhGWmcWW7D9HtDodO9n8 ig9E9RBr7VSgkcUrOscWq+JqqGEV7XHbUjqEpRcdmKC57LbrLqURvSvvvPQyEW+9+Mpr W76VHllRkkquy+/ABM97b8EIJ+zJwQo3jAfDA6OLaaYUNOnwxRhnrPHG9PLH8cdSeJyx xJgKDPLJKKes8sost+xyByQHrOnLNNds880456xzDDGrO/POQAct9NBEF81bz8CZbPTS TDft9NM1Iy2X0lBXbfXVWGfNrtQYUa1EuK7J0lqr7EwVIaN8QGzFvjniCaS9bGst/vfc WXPtitdpY6u2d1Rud9SDHka099kteUnGvRbSrfjiUNv9ys9r93UJNH8yumh6mXi4EXU8 Okk546CHPrTjc+BdSLXQ5hdqpztOuNd+iVU77LXQjo3o7NqCvXqUxNY22eCiBy/8yP7G VTLkn9Am7lId8s3di0Sl+pHfj97+06CDHjrnpMAP7/33BJM+F/KcVh9go6xzdCViI+5o K42uHY4ejKthv2D9LXYP/v78vyt+cBXblCmU559wlcoPXloT9NxHnl6M6iDz+1txbAS4 5vXvghhU2P8QRL61ERB93/raqNj3ofHMB0ffCY+F0qOjFZUwgzCMYb42WAHTibBt/gWs hp6oMUIRvfB8GuqLD6eHlx51KXt6IJSJ9CfDJjqRCDRcUgDFtg4D1m5b2ercSnTXLVxR a3Zl+91CliWqeewHbM9iVlok98Q2uvESUaTYcN5IxzraUWtxtOEd98jHPtIsjx30oyAH SUiQAXKKhUykIheZsEPOkZGQjKQki+RIi03ykpjMJBcqKUBNevKToPwAJ0NJylJmcpSm TKUqE4nKVbrylXZsJSxnScsYyrKWuMyl926py176km68/KUwh/m0YBLzmMgMmjGTycxm vmyZzoymND8GzWla85qNLN5vjodIbHrzmwirJjjHSc4BibOc6ExnI86pzna6sw3a/gSY z7r5znraswnsvKc+7ZnPffpTnf38p0DHGdBcKYRCwhKI2agVN/UlxHLMaugA82VAIgSr P7Wa1UA9WdA2me9MLEqTSDKhqr6pbjGT49dI+bDDscSJcBuFZEfVZFKXrrRFNS0RjGxq Jpj+gYl4QCmtjojCzsVUkTNN1ShqlJW31WILeYFQLeSjLdrlhFVVLRes5CE7pzIDqs+Q UBB9elRWxvNSMqOnFtAmMpo+z6sy+ht0psrQlKDprgvF1pzaclU5Aa5Ph5EJnt4X17Ka VQJIQus8H6mFtrJtK6pyYfugMCIwWYmH9vOLaUpTQfZsJrCLAlICb2RUwxYyqaWN/qvh KgvX1Gq2pwksbOVeGxoTLkaFL9ypbP022AaaNpKoPZxQ9RRSuOahTL29XmoZZNvN/rW5 uZXgcStrwd+GMrgp0Y2KeojTlZYisi6lbWF5Iia/kqpOf6oNEsda0tG8taeWsK5Mz5qu pAXydN0J0QkZmi3CwverGkVWZQjSq672blfT+WKCD4wPaRlUtIXz1a1sA1T5whC1Fs6w KzGs4Q6XksMeDjFH6TsxPYr4xKkEMYpXzEgVs/jFhHQxjGfMRxnT+MZ0tDGOd+xEHfP4 xxn0MZCHvD8hE/nIwjMykpfMOCUz+clyczKUp2w1KVP5yk2zMpa3TDQtc/nLO/My/pjH bDMxk/nMLTMzmteMMjWz+c0bczOc5+wwOdP5zgWzM573jC898/nP/iMxNxkLL4lGLqhU aGh7JbJoQPdSzhUe3N4E564KO1qTkE6pkw7NOXNZ+tKnFHRaCV2kMu6Jd/rgFX3wmsWr ToJ3F+XSQpcXXjcZGtSgdHM8Ym092KrkOs5ItWjtFFlYM6W8zAtiaHFtSl0TMYKXdd0Q XVVBuvrJddCdUW2ZPcukojGjpiGhoNZDrvgEm4IKzLa4XYTc4XK72aJerCXhxdoZTelz JJQP5rRnnLcyV9uYe/cq1fy8Y0tjTwfXXmwPLtbxaGm1hptqxHPIcDsJfMPxtq9a/gfk qM+Yyhu32esCFwKfklql39cyImwuDks/n8lqn2Y5vBH7L8VqnNT4ivnKdC7z62Z8avft 2K2D1taeE9PlRk+6DJCu9KaDgOlOj3oAoC71plO96km/OtZ7rvWts7zrXhc42MPO7bGT HddmP/ul0652QLO97Xx+O9zxLPe507nudocz3vPO5r3zHc1+/zuZAy94MBO+8Fw+POKx rPjFU7nxjocy5CPP5MlTHsmWvzyRM695IHO+8zz+POhxLPrR07j0pocx6lPP4tWzHsWu f72IYy97D9O+9hq+Pe4trPvdW7f3vjct8INf1pl++6dDt9dP00aJRi8M38RXHHbR/rbp 5VdfE5nzdPS/N/3daq4Rkr7+y0u9fe7/vGtBz76Au5hyU0dlbFBC9ToAtOqmgMfYE0q1 /blqRA51q/xRdn53k34s1T7a5UCIgHBlAWsehSXb9ikphBNwwlciYT1IYV75BoBY032i oCz4MVI+BG1FVCWvVm1iVSPYBnDqxnMamGYC+Dgbp3yTJWsIVW/VQVOV0W4nch7mJhrv FSM66H0taDQc+Dk6Als9mIKAlYHKxoPrNoGHAm2Jw4JD2GYvWDoEyDnz91U4ZUKjJXEI +HC8VRMMR4aXIYYQdyVpuBs6NFpkVYVCY3wVpWDekjv99nE6YXLUt0L/tj6f4ScI/mY5 K/eGcAg0fkeFJ2NpiFiIF3OIWhNpjFhMVzg+MegwRWc0lxiJojN8mthOnNiJ6fSJoFhO ojiKBDWJAIRzpoh2qMhBlbiKoFaKsIhNsjiL1lSLtihNuJiLzrSLvMhMvviLyBSMwnh0 rVhDWViMb0aMyvhLzNiMj3aMUqSK0LiM0ihH81aNd3eNJqaNhseNyeiN30hzxjNq2SiO fQeOr4iOg6eO1MiO4/gGNVdfQLeOiZZFeTM5B5N8jLaImwOPjeiO52hRI1SAiOZaDVcv /lgXABmQ5LhN5thJa0WIFGmQiFMwC9mQOdN9VQRGbOVqwyJ/tjMrZ8R/IXRFKbc+/gy2 kgUWQhNWkvuHPxppLsHVX+RFPYCyfw7YhxDIV/xHYZllD7ihbmyUJ7RlgcA2k1sjkBKJ ff3XGbHigxPEWbdlQdDHVPhIOf/mXwUZKxGEW0rZLkVIg1G1gxKkbedhcddmVw/oVkkJ fcJWa28plcoVlpTElAyZhM7BQtJjW87DXjCFkjwCls+hU73iWYSZiXbJCRx5gEQFfzwJ iNAhRK0jUkX1JvfGU0S0JtWVGuG2mKjgbYRVNqrGFi/ZfmS0YFgULWuBFbSimihJmu4F LIM1DvlnRWqEkKD5Fni5PxnZLvFCWrsJR735Pb+pfcEZNsPZCc9YNcmnmMu5Bs0Z/p2X NJ3UKUnWeZ3z9ZDydHMDqZ1Dlp3giVTFOZ6YV57muXnomZ6et57sGXru+Z6kF5/yeXr0 WZ+qd5/42Xr6uZ+w15/+OXsAGqC2N6AEmnsGeqC8l6AK+nsM2qDC96AQWnwSOqExJZ4W 2kR1B2y4KTaBlWj56Bb8KKJjglmHuVbHmXcbam+7xZdvY5CAQGlOmaKU9aLxZaMsRaNz t6L+pn5tKYM1+n0EKYT0hqNGCjFuE4mQ1yyyY5P0cFdehFEJJkaw0zvWkiwPlVcEdhur 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 mqiKuqiM2qiO+qiQGqlxmgAAOw== --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: image/gif Content-Description: snapshot 6 Content-Transfer-Encoding: base64 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 W/YXKfgXdQu3f2KYfYV0VPy3hdekdb7keenHhr2Eg2cXfZeHecmnOzQHgkY4hD3XeWtn bibnh0NIhuoHeTb4SaBnhdKEdw4HSzUXfCuIbS0YbTHYVAzFgxNIcmiYheFnhWoo/nqn x3w5V31J12391E/wRojGN0L3dIIBVYR+x3dAJ3Kf2HfUZ4ZaVIEIx3dFyHBsp3RKSIqV CEqXmImO6Ge9Fonaln83c3hI434dd3I4FYZiA40zpVtdCClfaDXMeDTS+HOgRW9ks42M Z42PKHDISHBZKGT3Jo59I2/VxjDUWHDkaIzGdo5P9474mI9dU44qp4/++I8rw4/2CJAE 6Y/X+CjZWJAKuWwH6SgJuZAQqWsN2SgPGZEW+WoTySgVeZEc+WkZuSgb2ZEiCWkfqSgh OZIoiV4lmSgnmZIuqV0BxyWS+JI0mV4xiSUC0JI1uZPBdZOSoio6yZNCyYXlyCS+/hKU Q5mUqBWTtFIATvmUtYKUSjmVl2V/T+mUpEUAUkmVXIlYVlkATgKSLtiVZJlaVvkkYjmT ZbmWmLWSiLKVbBmXXHWT+ZWMcnmXfnVtXaKWeNmXbuVsgOaXgtlWgElpg3mYXVWYjIaY jJlYKxiYjRmZB6WYpHZmlnmZmJmZmrmZYkKPC8aZoBmaojmapKllnhlnqJmaqrmarNma raIxiBabsjmbtFmbtpliKHaburmbvNmbvvmbumJjUjacxFmcxnmcyJmcyrmczNmczvmc yvllpTmd1Fmd1nmdASad2Lmd3Nmd3vmdY6JVrjme5Fme5nmecMZglAac7Nme7vme/vD5 Lae5nvFZn/Z5n/iJnyvoJXwpmf7JRs7WJeaIjv9ZoKLlmZsGMwN6jwbaoIoToFnpWgvq oBR6oDGToLY1oRW6od+EoBGqoP3JoSJ6OBBqXLRiXCE6oiqqNyWaKomGona5ojIaNy36 XGHpoik6ozp6NjXaamiJozH6gv7DNHnnjNzYcOz4jEaKTDTVjU80fxQ3cYx3de64jsPW oz+poQXjc80oVEYXjyKDgyckMYg4eMjUR8UngFXXiFvqccmTpGgqbFgqoTkadUqXNGKa exlVpo3kMHn6h2cag2nKcsX0duO4hXAqqHK6nx+aoXUqpaaoeafUg8DIilsnQZ8Y/qUS dH2GKH5uF2+lqHyqFIe46ISBZ0yxCFCVioCrOH4QSIqRuoOXWoFh13r8pIuvJHquWqqS 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 pjfN6U57+tOgDrWoR03qUhc6AQA7 --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: image/gif Content-Description: snapshot 7 Content-Transfer-Encoding: base64 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 W/YXKfgXdQu3f2KYfYV0VPy3hdekdb7keenHhr2Eg2cXfZeHecmnOzQHgkY4hD3XeWtn bibnh0NIhuoHeTb4SaBnhdKEdw4HSzUXfCuIbS0YbTHYVAzFgxNIcmiYheFnhWoo/nqn x3w5V31J12391E/wRojGN0L3dIIBVYR+x3dAJ3Kf2HfUZ4ZaVIEIx3dFyHBsp3RKSIqV CEqXmImO6Ge9Fonaln83c3hI434dd3I4FYZiA40zpVtdCClfaDXMeDTS+HOgRW9ks42M Z42PKHDISHBZKGT3Jo59I2/VxjDUWHDkaIzGdo5P9474mI9dU44qp4/++I8rw4/2CJAE 6Y/X+CjZWJAKuWwH6SgJuZAQqWsN2SgPGZEW+WoTySgVeZEc+WkZuSgb2ZEiCWkfqSgh OZIoiV4lmSgnmZIuqV0BxyWS+JI0mV4xiSUC0JI1uZPBdZOSoio6yZNCyYXlyCS+/hKU Q5mUqBWTtFIATvmUtYKUSjmVl2V/T+mUpEUAUkmVXIlYVlkATgKSLtiVZJlaVvkkYjmT ZbmWmLWSiLKVbBmXXHWT+ZWMcnmXfnVtXaKWeNmXbuVsgOaXgtlWgElpg3mYXVWYjIaY jJlYKxiYjRmZB6WYpHZmlnmZmJmZmrmZYkKPC8aZoBmaojmapKllnhlnqJmaqrmarNma raIxiBabsjmbtFmbtpliKHaburmbvNmbvvmbumJjUjacxFmcxnmcyJmcyrmczNmczvmc yvllpTmd1Fmd1nmdASad2Lmd3Nmd3vmdY6JVrjme5Fme5nmecMZglAac7Nme7vme/vD5 Lae5nvFZn/Z5n/iJnyvoJXwpmf7JRs7WJeaIjv9ZoKLlmZsGMwN6jwbaoIoToFnpWgvq oBR6oDGToLY1oRW6od+EoBGqoP3JoSJ6OBBqXLRiXCE6oiqqNyWaKomGona5ojIaNy36 XGHpoik6ozp6NjXaamiJozF6Mt8Xjzu6oj36kxpaM4uUe0XapOu1nx+aoTkqpKXjpFY6 MEcqoVOqceIHSco0eMPIe6eoeSw0SF3KT2h6pR2ZpSAapFGXiJVndwuoiv+0fUhHp3Bq fa63p0SqpsEGocKypSeEUUh3h810qPbEpDQHgdBHqI4qf5jIjn7KkPs5LIJqh3vq/m13 +qiJ2qkWtajrl6lyWkr0N6kRSZmctlGcCkWriqiq2DlKp0qbKqqZV6qmqpCoeikEqj0c 6KXoJ3t/uE21KFS/an58Sqqvequ4+piGWTBrSE9lmnrGNK0UB4x5dKaal4GzyEzKSpC5 SlkMWo0406fd6pIBF6hu+jDkCo/lepjnCixjuY7LKKntaq4CqXjxWq/6WjNuqZX5uq8A y12eCYn4eqkBe7AT069wibAMmzAK+68NG7ES87AGK7EW+zcDa44Fm64X27EFQ7Ec67Ei CzAgu6sje7L98pVXmZYhi7IuG5AZuyhXCZYsa7Ive7P08pU3ypIQi7M+Wy9nubNv/tmz P+uzJRuuRduxR5u0TLuPMTuQTVu0Sxu1Pzu1VIuzVnu1L5u1WouyXNu1I/u1YOuxYju2 F1u2YDhuE2Osxqeotmoz9AoyoxdvQWe2NoO2vJqsEqO3pOdtoOq3y7hOESNxdapPdQe4 dlsyeDuonbqul/NtjBurSiW4HTdv82eobpu4I7O47/Q92OqAW7eEvCeKn1h3fOhvnxu6 YNd12RpupGit/UeFrsiJhmhAhep+rKi2AIWmcqi5/sK5vAq6hhenPdi4vRqC+XascSp4 ntp+v9qqPniHczu8epqpPRSH7Dernop1QzqndOi7+gK8keuq8Ie5ZKS825u8ZVql/rkH S7frqoQKe5pqvspHvXeHqfZ7qKOavoj6t9pbqOCLL+KLv/D7uP2Lu+gLrKsKwAcsVDaH ue/LwNRrvqy6ToVbTBCsvwe8we3LvvyLuAE8wLAaq4VLwQWst52nvsxLwv0rjBmswUzK wO8ruQVMwxb8qIUXrDM8wTEMvSAMviJswBAMwDN8ewn8t8p7wfGLvhwceMNKuoY3vde6 xCU3wvn7h6H3e1Hsg9fKthIcwDl7r8NHtC8oi9TKT8+KTy81u2mYfd3niuhjea/ouu2L i5o6phKUxj5XhaxYuh5npoP3umO3hmBsL0G8NFqMWuIXvIUMVmJ8f2SsNYz4We4o/sSN 3DGHjMhxG47Q2cmVDMSP7IWRzGz5dMllk8mm7KSonMpFusqsrKOu/MoyGsuyrKK0XMsi esu4vKG6vMsU2su+3KDAHMwFOszE7J/GfMyRmczKzJjM3MzuGsrYOMrQPMvSjJDUXM22 fM0Omc3anMvcTJHe/M28HM4aOc7k/MvmXLNIm84G+szuHJfwHM9rOc/0TJb2fM9cmc/6 PJX83M9J+c8ALZQCPdA7WdAGTZMIndD2+rQba7MM3ZgLHdEjOdEUvabrbJLofNF9adEc bZEe/dEQGdIivawOPcYVW9J3SdIqDZAs3dIGmdE8m9J0O61Hp29y7Emw646w+Lrj/lO3 FeeMMB1pJw3JNA2KbxethYhH1arUCujUb7pzMdiIQ82iMj20R01LSQ1+Rhe7aQrVNNio ZayuFVzVfePKObTUOUjV5rfIXU153DqCvXt9Jrhz0up/rXt2Zr00aA1/w/rXFvVCbq1H vxi9UJjWVFe8+vd1DFiKe51qV+2vWV2rag3WDLR9UM3Vr4TYZYjZ6ldGlxiExTvJj50z fd1Imp3a8ftMg716yeOM1lS6UviAbi3agei4pT2xkb2wVG3ZvPipMOjbTK26sf13zoSD gJfcIJjbRXPacA3YbC29G7fH7+d9rJ2H0dtIF+i9ksfczb3bG52GNe1JN01uJjdQ/oRd TFu9rfWEVKbo2mfsx3K4yd6dsOA92R9VynuL2/VNMffdslxV1vvd30jz0ocDjs9I3wTu 30Utyvi94Chp4BAeaxI+4Rj53xBt4QqN4e2s4SJZ4R4OaiAe4p424iR+aSZ+4iTJ4Squ lCne4ur14jCukiw+4zwp4zYeXjie4zBZ4zz+kjv+49IV5EK+XERe5Ml15Ejekz6+5Bjd 4NP84E4+bUo+5bjV1w7MjcdnwYjIcjnGfyO3tvztjWPd2+NKiRyl4DznUtM7RDqn5lja 5FNdh+Oqfb4YS19MwHanxXRHuZarMkvat0g8uZbswZ27bQbMt2sk4FbcM3Iu6D+c/jM0 JUUePOmfKqySG+gNM+YvaOiHPuiS3uiePr7dk+jWu+h+fumODuXY/OBTJ32sK7qp+9XT pHbiLYJuF8dhfsMd3Ot3rMeyK0F0rLY7yLqi93KpW77J3nrxxrt3TYUpvIqmq62nV7vF Gq06TcC63tTOju153d6q29R5p9PWLu7lHe7b3rqY/OipOIPjZ9jcjdivlMRD3Ouajnsx LHe8Tr/N9Np42r2Nzb+0J+/V6+7Mm9ZzCr1NGH9ZnKejWsQtzMX+7vBevMKFju93fLzG W8NTOO/NK/Fb7MAPX6fc66sRz+BT04/jyPGrTfB3+skU2KUEz6kmzKj7XtY4X+mr/gSq /9vDtIp6Lq/zlJ3zNn+/vv7CV9y48mv0MkzzPW+/S0/qL29vLs/nLV/CsqreNVz0Uc/C vr6/9s3q3Szld/7zH5/0WI+8YGrDTe+3EC/qX7/v/I7AcZ/0SK+9SE/BxMrzNO/z88vr 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 7YwMyGzJQrHJhmykOtE3NjXQ1xhMNAdVUkFD00KBQu1T18tNQi8z0SRFVDQNdWhF5YSd 1nT0VLQCG2gyCtKSmpRCJD2pSlcqoJSy9KUwlY9LY0rTmo5npjbNqU6Lg9PraNOZIt2N yqS10Q8erCTlKBhKpjVAhBH1p7OsocB+U7DhHGtYc+llVoPaRuL01KdGvQhXkeKcpaJS XPeKyhXzWKxVovWOCAPrNaFFMxcqLH53batd9cpK1HCjk/tSq2++OsshFpE6b2Vr/mkm Wsaz+nWvrpjFupZqVsjWMa23cU1ZA/ZYTkQksoLtDWGZiBPDkhAyukttz2RyT8g8c2g/ SyI5+ZIznF32nFiDrTjtCLSsrRYmtc3tN7fWrOpQNnzJxKHO2Mfamn3Na6m1GucmKU/n YnOS20QmYJK2REL+8GJ0A6do/akneMmSWc9bySER91m/YQJvEcOi2igISMCajnV7Ixz6 PhveG9a3ffAFXeRShrTm8VeQdkzcgV0WmVjZTZLxpS/3yKc6Rrb3b9iVsODoBkS/GG9p 9hMlaGlE3ndl6LxyfSEoTjvGDG7YvQUl4+yu99BNyk+MUQRsAD33zBzmZb+/EzCF/hEX yaZW8JMXrB6Dd/w9H4/ibDCkYh55TGS2us8aTfRqidXYIjZ2dXUr/itzkdpgIlrSu/rV YhaxVUI1wxV7WRbyFndY5hfrkHcAzGCRp/JmIuYYyaW0chUfWAcon9LOcq5fd7E3Lwc7 WT1bhqWkGH3lwyaazFJWsgdj6OYQz5Wf5pvhPMOI6DTTmYtVDOGp9dzHA1KamjfmoZ89 rWkRqvPQQJ41q0c8sO9mcjejpfWsZwbjGM6Xw/yVLxL/uOfJ5XjAYAy0A6cMxyA3RL+h DPJ791bJXD+xr4jUpwP52LIJk06TH3H2ueX8yFZLMLAb3vSP/3hs1wTbi0mzJzDx/o1j c8bRKz3+aY+FO7VhHqYshfHZkqlRMhznLpcefrg3Ga7vUTscL4pTpk6sW+PFNJK3tS1M i6Mp7qXRVuIMD5k3Rz4YYmq8ZLFV7cV8ac6iwibSAFUVfWx+Hp4HKaE+J1NFg94wnJs3 oATjENFzVNnrmGro4z3jK3O+LIKNdae6uXqxtI7119y762APO2W+Lvaym91OUh/b0XV+ 9ra7vR9kf7vc554Uo58Y6XTPu95bWYapr73qBl06re7Va1r08lgpfxp3P1oLwVuW695y fKskH524D748RC+84eGxdGsd0dB9JdfmM+tYyY7YMpS3BmedTh7LkzVEqWde58Us/sTS 96aojSV97FW/2NVH9aZ2XyOKI5/ysBT/t2MZKjvVm2GiUeSb7LQaOpsL4f4O3PkqGx/F XP7cF4c7D/VumnBdO36Jqfz5iWnnMtXC2zimf57T3dn2u4kyj1A8niIfcFxEKRnuzh9p u4d2rqR2d8d28kJhGCZirHRsG1dhFeZHjARB2AZHDxY3+cVckgMwfBNn5eR/EuhsSbZu kgRhfCSCmKNC2cZn6ZZu2PaATHaBrVZ9X+GCEWhhGHhj2mF51rNscZZUH0dqeNaDc6Rr /XM8PhSCPnF9eQZiS4ZUiFZOthNOL0E7wtNwArRrLJhpHqc9lENmPgZrXBSDgjRo/k7W cUcYgPrgeu+GZkI4ZuwAQ9GDcYVQEwhEaKsAaJr0aIEFZB3WhNrnOwPTZJcUh2zYRX7V g/EmPpT0aVH2WNKmY1qYZ3DYLavWIMHXZcMXeWhWiZGlhaeGa4CYhNHETdmDiMrVQwvk Z334bInkEudCimmGh5zWQGADajG4hzSkY7cliZSmLQCnRERYa8Dla6YmHTo4R480MvjF gKmwECW4E8DhRHXoi100X5ykajeISgsFbYboViT0eRoBQseFbG9mh9h0htRIR3iGQU82 SC34X+8WgYowjBNGb4hobDToe1E3gP/0d2azS7eUXMmUQpX1WiuXTr/ocvhGT4ih/nIw x30kx0/iR1qNRHP5NH2wBhctZ3HtZpH3ZEs0JzVHRkENZ13GB00iEzn1B5Ls9X4dhHC6 xJIC6XESOVswaIyXaCNeZlCVUS9omFc/SR5ByXt7x1M5+SM76VGoV1jEcVEClXVF+Ryu Fx+Mt2a+UZUegpVRySFTuZVeiXVd+ZViWVNhOZZmyVJleZZqWVJpuZZuGSpt+ZZymSlx OZd26Sh1eZd6WSh5uZd+WSd9+ZeCySaBOZiGOSaFeZiKmSWJuZiOySlHeSSZ+JiUCSiN WZmYuSOXmZmcKSOb2ZmgmSKfGZqkCSKjWZqoaSGnmZqsGSGr2ZqwiSCvGZu0+R+z/lmb uEkfOviR5gKGxTGUXihVTCQwPtmbvml4xxmcxKlLQGUw9DQrJhdz4qVaCZecm3KMIGhV FsRoFKWPl0eUidVZ2llV3hkMt/VxXXU7ihRaawWegYRa12SE/nUq2JlsiQWdCAWVjRee b0Wer8drTmdatMd6ioVlhQigAoqLn9KVRSCd9IWS7Id977l/riVx9Edy4iU1AKlx1sc0 xWWSELpd8DmHIVdgvWVCnzeTyxVJxOZFHWo97ddvnHYTh5GgbGYqDJqNQGSQg5SCjXNy XwiNETZviSOkEHhfGQeJENiF5YZg5SOiJPhfnEc9G+dB6nU4dSWDDChujiVSM5F9/lcq PZCHKDkKYFUGj4LYQ1SWVUHaiXFDhWO4P4rGgSa3cFN4iqVkjr4ZcEyYi3NzZmJlNHq4 poIqnuf5NfCmnJpSpiPUhITmP2PYqAd6bQN0je5jSBIoY+gIRe4GnghHiKEXZuXWZ/Yg qqkoh7+Wagx2cH74CYlanngZmU+SlOE5Z2I2jJ1Wasv2iWdafJfUhrImjG6aa7tGe3pK lH1ICohkSgPFix9oq/PZaL86oNu4qLJ6JZOZV8z2rOtWaFLqbs4IV+YobO61Sgoop8io paoEqFrkiYaop5HYbdfYid2znkRqpLqGq/HHpN4WqKcXq2nXjwUIeMSHWx2zb1UT/hcO GU4n90sGyZu/pDQZin8DmTbGB5ES6m/R2XIYyZwQmhYYe5Lew31646IV11rqJ5PvJZN2 sU9ZI6O0E3KvVSq3CS7SmoqUApy5OQU1u3Nm6E4EFXo7Oxo967PlMqZ9grRDexRFu7RO m4PX+iV497RU6yFNW7VYq2UBW14Dm7Ve2yFX+7ViS2Jba2LCN7Vjm7YAErZq27aXwbZu G7dMG7Vokq1ye7foAbd4u7c3V7ZcppN2y7eCOx16O7iG2wWFe7iKy3doRIBna4CLG7n7 2HeOi4loK7mYa290Cye0mrmei1GbOyiQ+7mkC7p+K2mdW7qqeyGhG0uXu7qwWxSJ/hu7 hzu7tDu4tnu7fJu7uou3vNu7cvu7wOu2wju8alu8xju2yJu8X7u8zJu1zvu8VRu90vu0 1Fu9S3u92Luz2ru9uNm93kub4Bu+sDm+5Mua5nu+qJm+6kua7Nu+oPm+8MuZccenz1mo 5IKyHrV/Bae/62QzW9dUZtN081t5rTtp4BVd6qmoBxhiSsufbeR/t+Y6dzFXPhhW6MXA Bay1/Mi1j0uwETyiRvXAVolBPqe0FOqElFhH8slUToWeG2wcx8haFod+HElxKnl911Wh HQldAamShEDDKhycFXxDfXM3N3yx5covOEOx8BfDlTHDz+U9LOx5zEfFjVNIU/rE/udK qe0Gct0UccOJbm6kjGy2ORf1nGiRpE8MxXN7ulSHLhhXxlWsxeQYxhwLtNy2i3SMNi4z x+q5wiM7nzRmVtGoSiexOVjcxyTsxq9zwKm7qodMxXW8x358nkC8b0d8eOjnlGvzUBOs xoZDyTBqx2wcyJXMxp7syAJIuQL7wQczPZNMYJM8ywTGchScgaQ8XJj8yZcVykbzfrYc XrOsw7dWxKr8s6zctx1stpY7ulNFyH3sfJZcyIpYw3TsoWWMTr2MqUPcyztsylBWzKIW zsgMX8q8zJgByYGbVIQxcRXsSz7Mp1yTeM7lw1zcvzTzzvqsw4lcTfp8MwZ3vwD8/rAA qLPkW7iNHDs6Mk5EsdDqzLh+17USFZQQzSDxtg8XHdFVoLf+rC5aCSLWKVkhzdHvw86v a9KqK78qvZcs3dJ3+dIwPZfrEQY2fdM4fdPtPNOZW9M5/dMHIAAIzNOL69OzQQZDTdS1 u2Vx4BRIHclKvdR+29QD8dQ7HdWKa9SbYdUpjdVZzdS14dRCDdVevbtgfdRjfdVlLbha LdZJvdZ329ZVndZdDddmPdVhPddvbdfEe9ZbTdfQzNds7dduTdaC3bZy3QtcHdiH7buE rdeG3djK+9iKDdggLNl769NksNmc3dl7jdleW9OdPdqc/dmgjbUyfdpyp4ZQKCFB/rXR +LLRZAV0H62dnMqd/BZSDNOdFkyc/8jDCKutWLWdJw3H/ihXsv0cCcNXeOUtsHpU8WMu h7jcMPyv4DavrZrdwikruB3NB5h7rJjBC/ygwq0wG4Wd1v0e1G2oS5ne5ml6zt2L/EnA 7s2dorZZ3o1Y5d2fdxXb4Mc8QhszsczMruzBz3zZvm2ySDxbumxcp/ywvjpqwtySUzx/ MHrFIstL9DdzRfNO+vZyGTp+BLdBzRVwBKmMGlrEIgtxF5d/TCzCP/yi1xWhGvrD65cW FgRxPdx9QVyOp8V4TdeSivYKrH02R4ym1WxAFshBi9iun6quCXjLUJ4OzwhK+Op5/kH4 bbRcgpaEXZ+jfQ3IxdyokUu6jtwIbdkU5RxmX+Cq5W6Wglzqo9AYxKMcOJOBhXqUi+W8 BQxKhtJUPKzDoZz4yTR2sWb+h4D+OHAIroLepiZ8qUm46FFzZ/U6iam6o0Zcj5G4hfJm gecjD4leaVVIjKhAhYyASQ/KVfqaRXv+yMZN0XgFhNMahuyIQpa6ZquY0dBwZrfObLrK a5SQahq0rJsYRpM6jyY+6qiYPrzuiAZUjLPuzTea69R4j0g4i3CG6i2KZY3OZ9COuCjN 2J1l7ZA+o/MmD6hVqNT+hsKasCQu6kL7pbx6opo6qH8G4LnKr2Hm53Z6aWxB6uf+/q04 KH2Wfu2xKN+1B0l+uMSKPiDhjuBbt8ht/uKhri8ZuEgi4a0UX67jWKVm7j/EavGyR8hZ Xm9GHqk6iu9y3uQlWzwHFkQ/SslWtPFNfmEsTOutiI1rjl8s2q/2ap/P+uRAT+QPL8ex 5cQxzrL5hOb3vOLHzHEAjc1Xo+MoN500CcAoabAT1+ITG66GHl3yZ34cR7EQa3/uBE9W /3z1DJAZbnDip7AgO33PdnggbuhUH5EL+7JSmO4uLn21zedFHyDBfrOadbPVyp69p9rs 8uqwLPgK+JvpfMmbh9D1bdepze0wfpVXV9LDPRq38vmgH/qiP/qkX/qmf/riG/iK/n/X zfy3SKnWqw+9qh/7cT37tB+3l3/7YZeXyb0qSrX0ee+//ND7nsFYrV4t22OgDqazXPfA m0X88c3QVWL7oQV1BNrAmGZp0G97z31U1n/8pJH8IHFwCO2flpXtu81Y128m1P/eAY79 0Q//5prwld/fECx69S+elO+pAq7d5s7bCBC63NMwyrkevZjazMPuygeOZHkchCAAwJkK RCzPNOG+ZTVY++55n14IKBL2eD6gUpckDoVE0W/zCDKoWCm0moQyq8tQ12v0bcdcrTHs hHijyqOY137Pr+tzsAnX/Nx6FUN3TmVncVJthEhMeHyEDmZciIx/dYpzk2FvhmRj/myN T3uVko85p6gMLiosqzA1sDE3KqeSg4i3jFZ/WIO2S6RiU3QOuLuZVLfCvGDJVzrAxFqC vtLUbtBd17nL1sKfYJbd39mWxMzK2Om5mtLt1+e6Rd7e5uN46fRpwNX9e77UnNWT922e P4L2xKVamMpVKxQqYsWaJaBWQHjI1rFRwy0hNHHOnk1RduzTBG1fimDEp9CjQY/FOh6Z t+WiS5KJPgp0hAZlS5E/Q9KzmXCnxmiOeMaT8IjPUoAKfQJ9OnOZTKI5fVIlyrBrDoct IL6SSIOiRahF1QHaZuYqO15T1YU7BvJjJLjbYrqcG6FeHEE5b/5cZ1RovkRt+dXV/ruS qRy1hTviNQyTnNVwhPP+vYs2smXEWDU2MYq3ZWLSW72qJgHWFdkaZnOg5npUcdrObiU3 pstbJdrBgkknJYMxMGXjkHH/tiqZuOZptX3Hhfq00OjQ0++FbKxbZ3PqtHOf4zy7cvnz q9N3aC32dVkUOGS/k5kMdGmUAtv5/ZWdt/eo+213nF/Z2bbYbpexNIxivUg1nm3SbSLh L9A9l40+G7GlHyj4UVfJgk09OJRbwQS1oUkj3VdQdx0iBc6D6sUIAXsvuDdDbPKNUkom mEASTRr7FHLHY0MmxQwSSHqCWCk6AmJIkaCYdxpdGemhxmhMdoNGKJHM9eQXYBZJ/hOX fVi5ZYHGRClkID9mASBmdVTVSVXWmbIZLmU69VggduTBiZ5IySioKmI9VKONssBHy6CM Nuroo6lECKl6VE5qKXCXZsqYppx2GgGNESFqg6IVeWrqqagydWCqtXzIqoyBveporLLW qhqoY9mIo6289pqenb6CYEewCw1LLKXAHqtsBriKOmoMiy4r7bTUVmvttdhmu16hYR2K 6K7ahivuuOSWa+65HDQrKrjotuvuu/DGK6+j6n5L6rz45qvvvvzOW6+u9/Yr8MAEF2xw qv+6xy6jdJ6FSsPCqsXBGqvNxF+kMNoKbC9rtWsnrSd1lSykpoDMqcWa9JrwawuL/hyy mn3FjAGtrvqh3MQlqtrBiAwRWGtWT6Bprn0Ta1YCnCdL/CrPvK5MVss9v4wpUIDNfMF2 NlMdcXhaXw2ey13LSnNy7prstWpmz7os07Y6LRHUXsuZZJBCaYPyM/9QgmR/dqMMJJYI ccjmniPns9HHetpCOB1sGskj3Ynz1BeQYKZ8SeND7nj5mRc67njKgEtucSgX//nlIZo3 cnrfXhrTZJfNnPkizFpbXhPmg7o9UcBHxw4hXy7qEhVbWIGupT+3oTO7jxxXNzY+WulV YjwnlqYdZm2dl7H1b0X/F9bHBdRMXhRajid/VA204vmGk1O+ddKL76KK5yN9Z/bz/in/ fOdFjV/barqDBdzOJh7YrYRKAsKOOYblIOyUxy4cWaCxaie+Pu3JJuGzy+RyE4W5dSc8 A6pJSuJXDRFmZDrgU6AHTeNA+ZGtgO1L3ng4AcMDolCBOjvgBUfYqADChnckKAmLyIZA IsmQO+U4UGroF5N/VMdqN8yhDYPDmbtMr2sVAhoLOUgSmz2xizn84gNhlMUalox4N4OO 87q4i/wc5jfo+d/wlrMqenHLNesC4giEaB4iUk06Y7QQHFuonDZOcWoUpKMgJ3NIDe4l gZuqDAgbCUbHBGmL0cHhEelYxk0yByaB7JIihLNENzkJjfTDmtKEU8lH+fA90CrV/tGg J8a1NJB8/GuQKlsEQwq5UCsDqY8U+6chwMxHl2B8SQohOKH8cVKHVWMmCROUNyWuL5cJ amY09UeiabLvg6B05hXBGcP6Be8ogKSmgtKGilfeSI87u07iQidKTKTOE4FS0imNSKd+ bslPeaNYT0QTOis5yU2EWwQ9RZkkeyoJoSAZnVLilLo+eBMOphsFRSeXhZI8lId8qmgH I1enHklpbxSVW0MNaDpaLoigCB1oRu34AkOFyl6xBNvBdvqwsMmGp1kDqtRWxU6fhsud MhjgzoTKVGHVzGFNDVpUN3i4Ty4VXUhNVE5757euevWrYA2rWMdK1rKa1W/omuBU/otV 1IMZS60zK9y1svqs+Kz1rnjNq17FRVel7vWvgA2sYCfVV3gO9rCITaxi23nH9uRxq4uN rGQnS9kAFBaylc2sZjc71cva9VwhkiNnR0vayHo2WmmVS2lXy9rJnlaWqY1ka2dL27++ Nkcl3RxK+ecjc/JDnh3FG+fgR9LSLdSktU2uchl125/20n8AOqdLidkiqXwPg+t7X3Wx u9zuejdGzZ0lfUzYQRIuM5XcRQ5I+ai9idLuu/CN7wjCK94v1jGKc0Tv19RL0EM6T5Xv la+ABzyjxnoLYJgN4j0lxt9aFjK9Q81KKXVjXUcS+MIYtqyBb4rgz4o3otuUEDRD/ru8 cV6nmFJFiC/3K0zuZfjF36Xvh2lySYvmloFVzdJIeUSmxRnTSE+a6ShhTGT4ylhabWVY kZfMZMbWtFscVphhlZXkQVW5yViG8ZGpLFeSdTnLYC7ylsNM5jIfdsxmTrOa74rmNbv5 zQdrM5znTOd8ybnOeM7zue6s5z77ea4bzpWUE/znQhu6Wrg6gaIXzehFE/rQkI60yjbc 6Eo3+tGSzrSmTUUjZ9UAtZsOtagv1WlPzwDUo061qmVUalNjetWwjvUpWu1qVMv61rhO l4EtzWtFvzrXwA62AmjUa16/wtbCTnauiQ0fRIUK2cqONqyZ7axnw1ba2J72rptt/iNr Z/vb2n6yC27g7GNfG9zozjS1T62CdtPA2+mOt7q3/e52C4Dbh4K2vPeN53XLQAWOZvev +U3wN/sbWoyu98ALznAzH9w98G64xA1Ob1FFfOIYd3jFy73wjHv8xQ9/zcU/TvIlM9ve KE+5uz1c8pZnmNgqj7m9O+7ymi+X1qYGeLF3zvOe+/znQA+60IdO9KIb/ehIT7rSl870 pjv96VCPutSnvnRx4zvnVM+61rfO9a57/etgD7vYx072sj/d6q5Ou9rXzva2u/3tcI+7 3OdO97rb/e54z7ve9873vnuaFWGRueAHT/jCG/7wiE+84hfP+MY7/vGQj7zkJ0/5/spb /vKYz7zmN8/5zq+gBZ4PvehHT/rSm/70qE+96lfP+tajngVnjb3sZ0/72tv+9rjPve53 z/ve+/73wA++8IdP/OLLngU2T/6fka/85uOZ+c6P/puhL/3qm5n61s9+lrGv/e4Xmfve Dz+GwS/+8suX/OZPf3fRr/7205b97o9/aeEv//prlv72z79k8a///iOW//4XgIAFgAJY gHhFgAaYgE2FgArYgDvFgA4YgQMDgRJYgfpCgRaYgfGCgRrYgejCAiAYgiI4giRYgiZ4 giiYgiq4gizYgi74gjAYgzI4gzRYgzZ4gziYgzq4gzzYgz74g0AYhEI4hERYhEZ4EoRI mIRKuIRM2IRO+IRQCIMJAAA7 --Alternative.Boundary.EegBWL:0M2Yt01Y75h Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Anyway, it looks very nice for the most part! -- Nathaniel --Alternative.Boundary.EegBWL:0M2Yt01Y75h-- --Interpart.Boundary.EegBWL:0M2YtE1Y78F-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.49.msg ================================================ Return-Path: Received: by greenbush.bellcore.com (4.1/4.7) id for nsb; Tue, 29 Sep 92 10:19:23 EDT Date: Tue, 29 Sep 92 10:19:23 EDT From: nsb (Nathaniel Borenstein) Message-Id: <9209291419.AA19468@greenbush.bellcore.com> Mime-Version: 1.0 To: dnd Subject: Re: Happy New Year Cc: nsb Content-Type: multipart/mixed; boundary="PART.BOUNDARY.4099.19398.greenbush.717776361.2" > THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME. > Some parts of this will be readable as plain text. > To see the rest, you will need to upgrade your mail reader. --PART.BOUNDARY.4099.19398.greenbush.717776361.2 Content-type: text/richtext; charset="iso-8859-8" Content-Transfer-Encoding: quoted-printable =E4=EB=EC =ED=E2 =E4=E1=E8 =E4=F0=F9=EC ! (I guess there are several ways to express Hebrew in email. You used the= low-tech way. Above was the medium-tech way. Here's High-tech: --PART.BOUNDARY.4099.19398.greenbush.717776361.2 Content-type: audio/basic Content-Transfer-Encoding: base64 W1Zj4Ovfbl9pXlFaeXNZZdLe9c3O093z3vf/69nc29l+5W9XdntvcGd603Zja19qTlRaXmpi 8/Lg3d3+c9rV3V/gZGjxX/tpaPr4c2n2X3jm+G/l3+DW/mfkbfNrXNPj+up52ttqYeZvT2F5 +eX2/+pxWV99aWT/6ejv3/ls3+F83drlbXH1bl5u5Or2YW1sYXzs7WleZWF4/nDn2+tfbefn dGHk4vPtbefn5vdr9WNp6HdoWl/i6/pW9edYWmRr+Gdjbu1x49x04uDz193n+n/c73Nh5udg 8mZjet7f+lp08mxgWWxhZlNeY2vwbeD7eOLn8+xudO304HL06G3jeVp89Gvq8Gtg4ehffXrb 1nNl5+frb2ne9Gr78GpdWfPiWlhz3th3Z9vfb3VsbnBx7/FjVV7u5uN3+dHc7+pvb+5lUVpk /HddZHbo3eTn33/w3+pkW3Zh7/1Y4+Hp5fbZ52rz+2JZ8OT6a2Xl2vF8ePf46XRl7l1m6fts Z2Tlbln3fdvwXvvYem366d1yYuF3V/7k7u1eX+X8ZuPmbOD36/Rd6/53bV3871pV9PVa8Pn2 4l3t3d/xadfkZ2Zi3fRX8OXk+WXt4/Ji3Of3+Fzg8l/+anF6YVBk72VybWjy8t/g6djg3t/2 +fTb5OV8WOdxVvNza/dgb/ZjWPvxaf5u5d3+/ORuefZs8vxv725fb3h0d2dp2t9w5tzn7G79 8WlobXVweHF9/XJm9OdscGx33vtg9ffq3mj37OfU3N3Y8/TefltccXR1VFzz5u157G9uXWdv Z3P25f93b/9vaGJp93fy5utt39jw4/T1+XR98PFlaHbubGVv/N/yfe7kee/h4nxt6nNp/e7w 7FNZ4nj0aG3gd/lvfnpk+PJubv7l6Xd9eO9ra2Vr7nVy9ebyduv6X2xkct56XW746ex78nls 7Nnv7evr3/t07XRZZGFlbnrxeWhebHxoev1z7fV5/u/q9fvi5vbj3dv3aX1q+nZcdXdec3hs 83xkamRrb2zyfmx3dvju/OjX63bj7ePybff+eGx3bGJzZ2vt7+Tm72xx6PFsa/Hm3/Js7/p+ +3x4d2/v5/N+fGd17mhq+W5+8mpzbffgbmDp/XLeeHDp7nf0bXLrb3t7eev1bd7rWXH2bnZd XOvo5etz5urn4/Tz7vX+b19xePDvbPLc4vL4+/3s/Fp68FpddXr07nh74uxub/Pze2Ff7mlh 83r23X7t2PHq5mnr3HdpbGd+ZWT89PlfXG9+ZW3c6mH75d7jYvXX3ulvbejf9O7rcnlvdejo bHbm9GdkXm/pZFxhcXf3aWr4fXft6Ovs7/ppb+rscWdj9uN2+93r8d3l7ehcT3R3XmVgefFn Zmv8/XJvdO74/Hbt4Xjx8/nz/e7j62152uLpfGDv9n1yefPqbVpwemprZn7vc2r4cXn+X/nk XGHj6+j+a+Pm9vz36OB2W2r+c3X48HdrcO3c3/hw6uTz7f7/+3Ri7+ZteWxrdWRjcWp0aGjo 8O9oavd1e2zv19zr7OTc6nvu33laanr38Wby33nx7f78+mdfc310afh+bGl6+nttafDie+je 5nrm/mP3b2Fse2x1a3nsb+3j3+px7Of992hw4/tt6e/+8Xvz8OFqXuNvWmpqY2pgX3zl+290 4Nnf9nPe2+rveHN4buTnXll+4eJxX2zy9mBi8vJfYWv75fl+4+LzbnHv92doYXJ4bd/q6exo 7N9nY+p89XVk7eN4bHt7+W1t/nt9bXTr4/Zfbfhr8X1i5Xdf++/k1eV56efq5Wv93uxpcWly /m10WVVgXmL5ZVvqe3jd73z7a2lpYGXx7unxcOPc/fHp+Ojtfen+591vY2p48l1dcvz6b3bz +3J7+W5seXjr5nFg6trwePP34vT+3eHw5udqav5nXlpXYV9ffHNo8fJ08N/k6e3m3+XedV55 +fzh/mJiffllWVxr/G5vYnjp7Nvga+/d19bu+djddV1b9OZbZu5v+Hnz6HR4amjr+2laXXd1 aGp62u5i6OPsbmXv425ZXuv2ZWl+2+t63d/feWXf22ZbduvnaVpk6OluXvvh7W937PZ56358 93Bp+v5q5e/27WFsdfTqaW53fu9mZ3dnaWNfeW933eL07t/d4Pr0anrxX27wbPx4Y3H5ZGv2 73deZO7m/vd++97W4n3j7H5pbG5uffZ4+fNm7uX67992ZflqcuVzZWxu3+toaGb36Ptbavvz 82H8e3Te7Pvm+Pzb53f7d/nsZmJ16XhhY158bnJtYPPg6/196+Pf8uPh8+Xxeujv/mxmcm96 dPD5Y2T7flZb8+XzZmF97vJ18urr8ufj+vT75uNxbeftd/NjX+nqeWxfdvNlXm507PRnfunq 5O733ut27eltZ2VuaV5j9OLr9njw7e55X2n1eXjo6Hv64+nu6OXg6W1caeDiXWDs6WxZXe9t Ulp7dW9nedxuWH3e72l22M/Za33W2O1g+O1v7/5r9O9w5+Nrb/ju72JbXlxhX2/9aWP63Opv aefY9WFp5d3+Xm3w6Wtl7P1vc+vnbFhf3NlkWnPo3+pt7Nzwfmtt+WxteWBpfOfe7m1y3d3t cPHd4fFha+nvamNjZmZ36PdrdPLkal5wdmtcWmF4/3H37uDidmzq6nh0dOrd5ejn6+fx39vv b//qdl9dZH51X2599fPz7/j/7e1ubmNndHr7ZGro7eTtfO/s6X556Xhi8uJoZmdg7u1xav3l /e/u8+9mcunl4eh8+Xtr7G5oc/Xua2l+9fzm+vD2Yvfi7W5v5+t58v34/25sXWtyc/BsfO56 c//z6X5i9u9u/G9f+uDr9u3j7HLn4PD37ejhdF5r7eR6X19fdvlsXm7s3N3n9Obf7ePc82p3 9W1cV1lrXF1sXWhoYvXt7efx7O/76err6+Ti5Pv86vXs6vPr+PN+Z3H+dnBt7+/0e1xfd25l YXnta3bj6ev7buPc8Wpvbn1uXnH1dW3+dG92/u5zbXzr7Wtge+Pe4PL149zfdXPx5uxhXmdb Ynbs+2Rx49vrf/be3/pqfv307W1n7utv/P92Ym1tb2laY3hyZWFe+O338Hnt4Pzr4Ojh8u/h 3uzv3eNueO3k8F/742lQWv7qX1to7+BnX+LnbHBt9/1va3jpcGHs2en+cf3y5/hhbfDp5Pb5 29ze7HvsdWZxa1dcX3lzYVzt6Gh1fHXye2rq7m7y4vt09eXo7/zh2NTcevv28u9uW1xlY/Z8 XG7jeG9u/vlkfHFaYuXd8VtYbt3r/H1+5fDv9vx6+PByZWfo6/teY/PoZWr27etv/PHwe234 6H1x8dx3auXi3PFrZfDec2Vha271f15efnP3e3Jiburr6HPs3OR/Zn7g6G5nf/9+enH8efVr Y3Rt7+pmaW10eHLs/mtu7ubwcPra3+vn8+rrZWBnZHzw+mt+fOjveWxmefnubWtqefJ8bmVu 7+bs+evncfp4++9sa/3za11m3+1t6Nvi6vTd6W3xfuTtZfXsc+zm/GFbZGxjXVxnbWZlevX3 7fr1fP7qenvu7N3f5Ox65ufy+ero8+5/dnJxd29gYf7ral1z+GVj8/htY/fh6fls4ODy+PLq /HX462Vbb/hkX2/j93p7fu7/fOPq7uvt9v137vZneuvr9HZwf+L2a298e/Hu+3tw8XRta1t2 4Hpvf3dyaWzm92x27PVr+97X72X75uP0ZHHj+GVaYWRq83lvdW10aHhvaGhtbmn23unn5OXj 4NfZ7OXt5fNjdm5savz4ZFpqfmdbYPj5+mxx/XxoW2ptX3fl/WXr3uvl3Nzq3/x+8Wj992xj aHBsbOvjcXfzfHXv8X7v+GJ5/mN8cP3h7vP0+/hzcG9xeG16fmVpdf7ifVxw4+plZfn2cHRy bvbu9vLy8uja3nJv6+Z7bH7n3+5ue21z4e5kYnZsbHv+7Xt96O1pa/Hm9Gtt6OH0dePd5/pr eHNyXl5YXmpfc3h+ee3qdX/16t56eN/d6Hvs6OPm6urq6nJ8/31tberkcWNbcfJcWFrp5Xxr dObweHxufXF2eHR1fvXy93poe/R9e/L49+Xf4O3q7P31+G9oZ2hvbHF27+N5+P54alxeYnds dPL26d7V1ujs5eDr+3NjcXdvaWNr9XZcWWFjdW5aYWNw49/ueufb29vk5ebr6ffyb2/s6elv Znr+amVbXGl+dGj5e3R1cfb+aXXt4+917+Ls+Xl48uHqbWtzb/5yZV5v7PJwd+v2fvhwYnr5 5u1vbPDsev/97+brfPDb3Obz/+3w6O5mXl9eaWRfX2nvfG5ycuTg7Wpp7e9xYWNvdmRi8et8 dePa8Wvr2+f/feLifm5873N5eXj58ep+ZmJlfPN6aWt2//72b2v07n5wffP5/mx98PDh9+7j 9Pfz+WNgYF5fYWFxfGJrd+bh59/q8enj5+vx6N/d3fDs6/1rfG5hZm1vZmNmX2h/bnV8cnNr 9ex28+zw+Pjx6+f3c+ztfvD1+mhlaWJo/X1xeu3s6ubn6O1uanZxYW5rZG9xbHH57Pz57u74 dfH7fnT23dzuc/Ln9vrn+Xv+ePt/ffPl7nlmefpqamJeYGJwd2Jfb/h6e3vu5vJ29+fm5uXt 9PH46+10Z3fo/Wl3cGdzcGtpfujq8nvz5O5wd3pye/pvaHPs4+Hk8Ozi6+vq/Xp4b29lY2lf XGV8/Xp4dXZ3ffr37PDi3urf4fZv9/dxfvJ2YGFyffT9b23+7Hd1cXT+cGVi8uHf5u309OXk 9Pz8cvx2YWh1+HBuaGh+6uL9e3H273FtaXfv9nVvfH17dmxtcP7r7Hrw7/Z27+Lu7eXxdPv1 fv90aHLt9Hx19Htxc2RhZm54b37s+e7l6/p6b3j38Xr/eXB2f3p88/H27+l6amxw/ndraWx7 /m53+/Dl4fxx9tzc8PH29vz+cHR95+V5/Wx0emdiXmRkbv9paffp9nX67uvv9HH/fnp+/PHv 7O3q3eHk4OHp+/v7dGFXYG5qYmNs+u3n7Ph8/e55aGv38nh4/Orj6vHvfm/z8f9tZ21oZmVm eOvp8eXs9+jo7fp/bnPz8vDv/2lnbfH78upvYm348/Dn4+b39enp4ftv+/P1+G1iX19kYl1b Wmp+/XXz7nX6+3B46Ofp3+Pj2dzf3Nva4N3sd3t5bVxfX15gXFxocGdbam5gcfDr+/Pt8+n+ c+/w7vh16+vs7Hl+d2hka/b9/+vue3rp7e3n/vvm5Prz6Xl1c2pjZPfx+PV6//T5eXh+bXx9 Ymvu+2VjaX3w+PPy7PHx/Gx46N/reX3m4/j7emhkafD3Z2R7d2FmamloZvn5/e/07Onv+ujg 63397e777+rz6fNqfvpybmFgZWlwamlncvDy9Pv86fp/7Pl96uPp+/j0fGllfPf+a2FocvL6 bv3o4+L2+Pv293RmY2t/e3xxbXJqaHn7ee/p7/L26OH3/u/28Ob/a3vx5OdybPz7aFxhb3Rv cWpyc3ju6vV1b3bvdmrs3+t98fN2evNxYmj54Xtt5dzh6eLa5njv7m5lZmxmZGppb2hpcHRy ce/9cnF87eXg4uvv5Onq8Obt8urscml+b25vbHZpX2r4f19tcmZwd3589+3y7ezl3+b0cPf5 bHJ+a2Fv5ur0++rocGj95vJtbGtfYnJ2dnBzdfz/bmzu5/5pa/Dh3t/q7d7f531vaW53cmhk av32bmd09Oj2+Pj1fn7q+XJscOj0XWzh723//H1sdvlvaWdqbHR2eW9pdevqd3z6b3jn6v7+ 5N3e5Xvv5ettXmn98XNt/nl9fXHr5/tv/HdfaX5pXFhu5e1uZnLq5HBtbf7vbmlw5u1+4OZ6 /fnr7H565eHyaGRvbWl5cmhx+Ht/6n7w5+j9e+/q4t/n6vVnZ25pavJ3XFhc9PdjYW1kavf0 +/j36+/48+zh//Pxdm107PN7/+bn/u3f5+bu6+v4/HpoY15cY2FlaWh98e58/er2bW91aGjw 737v8erq+vDe2d/k6u3+c39oYGJtdWtlZX/8dHb89/j26vD28Xh67e7u4+lvbXlwdnZobGpu 7ev4/u7lfGFo8+9nbHv/bm3x8ftxc/Lv7OHs7dxrXM7fV2L+5+VcaNbd9f506OtXWO7dbU5Y 7e5/cHXs5F1a7ut+ZWbn4m928d7e7e3c5H/s+GptfPvq6+r1cX3u/3NrYmxtXF5vZmVxdnpz 8fN3ZnHn3N94+unp5+Hqfnzq6Onsfvf37Hdq7/xsXWF0aF9hbXJsfvv4+O/o5evo3ujq4+Dq 9fj1eF9fbW9jXmB0ZGn/ZmZkaHxzbGxz7OPh3N/j5t7a5PB37uDvbn7rfnjzb21w7t3oaF1o aWloXF1mbm929/nv+nb9/Xt3cnxxdfPs83Tv7ndx+nzv9Xr17+n/7+bt83X03uh8bm7z+Xdn bH70cn/s8Xh3cGVhZ292/v13dv5oc+bp83Z1bv75eWt0bF5t7uv79eLn9Pf6fXjx/XV7bWr6 5d/m7/nv4+94/O7z/XlpYWZ48vB5cWj/7G9pcmhy/3Ntanjx7fds+uHv929t//Pm6+/o53x7 +fz6e2Vgam9m+ub4bvPl7/H/8+rq+Pnl3+n3fGdt9fV9d/rzdmNdXGVoXmNub3zu+/3o4uLn 6+Tm9Hh6+Ovs7fR9dXnw9nplZv52ZGL54/h64t97f+jsdXrt6+zs+O/reHp0b2tpaGBfXF9m X2Fw/fb26uns6N7b5erh4u55d+rs9X196enp+PZ7a2pzb1lXbX1oXm95+vdu8Pt7+PfycWl8 eejh4n358+1iZt5l43No0ubv4HHd3v3p5+Rw8e5iZ3BrdFxWdOdyW17+7XD6+HFpeXr8Z2jp fnFtdefqdu7ycXvu7W5lbvX1dm95b/v68Obs6eXe6O326+vx//Pve3369/V9ce3+/uv3fnZp ZmZgXlxkY21va2ttf3hsYmZ97/jt5uHf497c5Pf5/Hx3bHDze2nx4vfn4d/v9vL++W5xe2tq ePj7dnr29vHn92hpbv5tb2xs/XhjY21293ZqZnN46fJv93d6+Hn53+Xt7ejw9Onv6ODl+Ofq 6uTh7XV/9nZfZmlmYmv3c2BeZHVxYnVvanR++3hubXrt7ezi297o4N7h83X88u51d/54c/Tj 9Gl26e1ra25rbnp3/XZqbH1lXF93cWF46vh95+Pe63/56+jx7ePta+zmf2Rre3ZtYv7+dnB0 evH69/tsYmlzfP9lafPn5+7j5e7v8/977uXpe2nv5Ox3a2xkZ25oYmru5/9qavb3emxt7397 9Oj2a235bm787uvt8u7p9//88vt97fT66/F7aHF4b25nbXV2anz6ffF5+fv05vPq6//p5eHr +Xx2cmdxaV9iZl1dYmVkZm1tc+7d3t3n69zf5d/i7+7k6n76/XloaWdr6fBvYGNlZHdgXG5s b3x3dvrj3uvm5+rm9/10b3lvcm92fnl1eHn683t/+Hh2+/Hv/O36cHV2+fR0ffD+aGZ0eO3r 7u/r8Xbx9GxvdHVtZGt4d/j2fX12b3j76vH1f2/78+3x+Pj7b2lvc29sc/DueX746ff5fnF1 fuvt9nZ58Oz3d+/zdezqeu3z7fj6+/bra15pcWhrZF5caX17YGT86Or87u7d2uzu4eHe5O/t dHF0cmVvenZ2cHTw5/b3fXV7+mlsf29uaG5zf+rqdGxsfO7xe3987+v0+3Xv4eH9c+7l7H78 cnJ48v139/ryemz26m1lcGllb3ZpbG969/9rYm7t7/fq6uvj3ujr7ODfcG5++2xp/m5udv5w an54bn98bWzz431jY3H6+fh88Obu5uno5ez3ZGd09vJwdnl8fXv+6vNybG1ra2loXV9tbm92 9O/t5u7r4+7v8vx/d+3p6vPy7vjt5+rvcfrvcmxpc/z5bXD5+XVebHBmbXJwaWNv+P5y/PTv 5vj19erm3d/v/Xvx6ud3bW9qa3r+d2xvdGlmY216e/rv+/v38unzeefj6uju9PT+9urq/G/2 fmNganFoZmtrefx1d3Z7+e7ufvLf6f91dP3w73z6b2z49Hl/937ycXPq5vP/enFmee56b279 fHhscX3v7/P4+N7f4vxy7vP3eGdjZ2xvZl9faftsZvnn6ezs+2zt5/5yfn1x+/Hp7evn7O71 cnB7cn17d3h0aWlueHR5/PHu9/tsc/xzcn56bHz9b/35dW92dm9+9f1wfuzz8u7o6PPu8vv0 7vtpbnD672psfnny5+12/Pd8fmZv//J4aXX4ffPx/fRucf5rcW5+4+Ln7ef0evN7dHZpZW11 e/P0+HR18/N1bGtoeP50bHf6/nFxa2/97/99evz88e7u5X/68ejn6N7j+nf69u14bXJ4el9h aGZyfnb7evv0+/p8b2xnZGlra379fvDt6+fo6ejh3+j5enB/dmxy+n5qbWVt8fx+bmZr+vD9 cWZqeu9wa2567uz7++vf6Whq7t/l5+bu/Xb0//9ranViXGX+eGReZ/Dp7vDk8erh53xqe/ht bf7w8vz9bW51/vP1dmv9eW1kcPPp/P19ffjp4uX0ee/r7+Xsfv3y73h5/WxibPZ6b2pmYXH4 6/htfX52Z3Dx53t5fHFv+ejp7e3s7efn3d7p8HBqfPrr+mVlaG5taF5hbmVfZXl7fPzv8vfo 3un1/O7u7/L37vb+7u756OX5cf12dvVycHN7a3bv/Wdpc3Bq8u13aGR3+/b8ffTrfvn68/Pp 4/Lm6eXlfGdtevfo5nV0/3r+YmFjZ3xuZWl87Pp3f/rn6PLv6e3w8HJwfOPj+nx5bXd7dXFs eOrn7vjv6vh++/f+/21ufXD87vZoY3j/d3X+8HxsaXXr73p7fPTs6N/u+Ojj7P305+13+/do YXvvd3xpaPt9amtsZGFpc3Ztam1/++7h4+Pq6ep6d/72+Pz07Xt+83t5cnP15v5w9/T9b2dq bWZpfvZ7+O3zal9qc3t+eHr5+PP2+P756fxsZG/ufnb+7/X+7eTj7/57cG9ye/10bv7v//bv +XxubnL08/zu6f5t9ux/am/++v1xb/l4bWxqXmbx+Gpx7PNzeHX99vd+9+/y9Ozq/vTxc3T6 7Ojf3fVufXb78/h2evV4aWVueXl7amx1c3V6bGr05PDt6+vm6PVrYWh6bmxzaffp8P55d291 /e/3e3l69Pz77OxxbO3n9nlwfuvvfHj26t/e53v59XtsaG1kZ2VkaGltaW//efvv8nV67+3k 6n747PHo5PP59O7u/ff3fVxfenRvbG158nNvd376b3Zqbvfn4uz0fe/tfHj89Ofj7/7ycPz4 X19j9O13YWDr4v95aXDs63dfc3vm3u9mbPd17ep3aHj9be36fvLp5N7dfvN5ePH772poZmlt bmtle/Lmal1Y/tnzdVlf89zlXF9z3M7eZf3a4OBnZ3bd2l9fWmb+7Whaav/l/2Bk4eTf63ve 2dTqanD53XlaW2JsfP1rcmRhaG9zaO3g9+vv3t/n1trfa2BrbN53bW5j9f1jWlxy9+jd/3L6 8OlvcWVq63ne2N3mXWj13txzXWT31dH5YFTgzulMOT5jxMdnSk7dzd1NSGfLw9pbV+XJz/tU c8/U809V69DPe11f7NvyW01Yc+NqUVNa395oW1/m3uP97tff7ebxffr68drP5F1u7eTuZPl9 7Gk8MDvgtrpkPkTJxeBJPfC9ts1LSFbGvdpWS2DbdU5LesPL0V5kw9LgUVLtRjZrtLLNODdJ u8Y9NjP+7j1F3rOuyEw698zh5U7EuLvGSmTSwMZMTU7ax8pUHx86r6K9NSljrbluKi7Cqqtf NjvSrbtmQkrQyvc3Oj5RrrfLST5MWcdK2re6tMfl0ry/RT88OkchG0Oyn7c6LD2o4T4wL7Cr rFc207+t8TE/V7nbRkVLutjWzsm3x8PXxbrEyFlZcGM/LCUWKKusqi4yOLKuKD45t6PDSyvI tMXBNNixwGUw4sO2tTrpx7mwxc5gvctLbD9QzVwtFg8/nZq9ISzQnXwhKFCdo9MsM7i72kdD srHfOzPAuLLQRL/BtMrdwcnZMknAxkcpJhgmq7PpOE23pNseK8WqrV47aLO9Qjtcta5KMU+0 sdZm+6us3OvLQeOx5ezCvkY0Hg8YurrFzs6+qMkmPEHmx830v6zPTN/bsrQ/LUq9vcPFvKiv Z+++vtVLMD/Kt9UuJy0mGyU4uq7FUcjPSU7b1ci528+9v/JV1MC3v8vUfFvSuK639EZMZeZO QD8oKS0kLjpA6LboT+1wzt/uTMTD0Vnjvba6y87Ow8viy7y8vsDCvLfCxMTcRDc1YFwsJSks MDAnPrvB2/7nvrJzS2S/xWM/4Lm8zO3CvsxX78e4ury4s7W3v8q+eDw9TC4pKiAlLjBS3k/O vtPuY2nQyGBcys7TycG6wV/8zu3T0cWurbSysq+20evQSzYuLDQrICIpMzIwX727yPfPu8Tq UNO/xtPGvr3J08zB41loxLW0sa+uuMLGzXlZPiwpKCYpKykzPz5M/M+7u8rFwdjsZk/eyNLF xNC/w9PLy9a+uriwtLq2ucvmc0o4Ni0qLCgnLzU3QT9M0d3dvre2srvIwc5faGNn2ebv6PTd zs7HxsrGx8jAv8XN0cnI4VJCOjYwLjAxMDU3PEVT887Fwb2+wcXU4OL38u/w7dnJxMLCv7y7 vb27vsPN1e9aT0pCNy8uLS4vMDc+Q0xq7s/Av8DCwsfJ1Oji4Ojb2trKwLy5uLm6ury/yNHp W05AOzczMC8uLS40Oj9LXuPNyMjGv7/Iy8zU1NPX0s/Py7+9vr26uru9wsjM2mtSRDszMC8v LzAwMjk+RlDzzsjFxsTHzc3Jyc3T09LPy8zHwL28u7q6v8bK0+VuUkA7ODU0MC8xNjs/Qkpb 6dvRzc7Nzs7O0NbOztLOzMrDv7+9u7q7vcHJ0OBiRzw5NTQzMzQ3Oz9GTVZ029fW1M/P0M/U 3NrV29nPzMfAwL++vLy/yMrL3HRXRT47NzY1NDc7P0hPV3Td2trW2dbZ6ebf7Oze2dHMx8TC wb26u77Bxs7c/1ZJQz05OTc3Oj5ARU1d8eDl2tHc5u/u7fx06+vs0cnFwr++vb2/xMrP3/Va SkM+PDs5ODs/Q0lUYvrYz8/Mzc7R2uTf29zg7N/V08nFxMPFxsjN2+5cSD88Ojk6Ozw+RU5b Z+nd2dPPzM3Q1dbU2NrT0NXSzsfCwcXGxMjM2PFlTkI8ODc3OTg5PT9MXXjf0MzFwcXHyczQ z9jo3tfPzczGwcC/w8vR2u1dST07ODM0NTU4PkZPXu3XzcjEw8XEys7MyszPzs/OysbCw8LB xsvO3XZbSTw3NDEzMjI1OD1JVnzbz83HwMDDx8nKycnGx8fCvb29vL6/wsjSdldMPjgzMDAy MjM2O0VTW2Xf0c3Hx8jIx8bJy8rHxsK+vr68u77DyM3fcE9BOTMyLy8vMjg8QUpUauDaz83J wsjJzGldtrq+sbq5t7OvvMTF5VxHPTksKCssKi84OEVU28TLzru8/8PIXdLZ18TDvLO7r6qy sa+vyGPsPikrJyAkJCksLUD8aMWwwr+uv9XB1/V1ZsvZzq+vsaWkq6qoul1xOSgnIB4dHiUm KENcT7uwwK+qv7S238ft9MTav7K7raapqKqsv/V+MCgnHh4eHSIkK0E+cbTBvqm/uq3awb34 wMG/srivpqmpqau85c45LCwgHx8eJCQpPDlIwc/MrbzUr8HSvMnHvbi3tK2pp6eqq7Tow0kr MSMeIR4hJSQzMznK1360udmyttO7vcm+uLS0raqpqKurscXCWzE1Jh8jHyEkJS4yNuTd6L27 vsC4vtq6vti1tbysq6mnramuzL7XMDgtHyUhHyMkLC8xXuruv8a/v76118O3+rqvu6ytraOs qqXOwbguNzUeJiIeJiAsMyxmZkXAx9K6yr6/0bnJv6y6rKiuoayrpMu/vS8+Mh4pIR8oISw0 LGpbSb3h5rzvxM1pu9TDrruqqayfqaejvrm9Mz8vHykfHyghLTIu7F9XuePPt17L0lW/38qv vqupq52pqKDFubovRDAeJx8fKB8uNCzuUkm65M2/asB65rlmu6+/qKmqnquloM+3uS1GLh4p HyEoITMzLtZMTr1iz89UxE31uU66r76lqqmdqqSjzq/ALEoqHigeIScgMjEz0kxquW/DxU6/ Uly5T8Cvv6Wppp2roaHNsL8rPiwdJB8gJSAzMDLPTmC7d9DX+Mo/2r5Nt7S+pKmmnamfo+Sr xCdNKR0nHiMnIjoyNsBnZbjn8tNqbEN6ykm9trqmp6SeqZ6n6qnmJlYlHSgeJSckPTQ6uWZh s9nl5GXoPevBTb+1uaino6Cqn6Rcs70hNi8cIiIkJic9PjrGvVTKuW5FyOM17b9kwrOtqaie n6ygolrTvCYmLB8eHiYqIzZ8SF+xv02/tzxJvz49ysS/v6yhqqGbqaemy8VDKjUeHiodIi8u MkvY6MLB6s3WTk1bQ03T1Li3r6OloaCpp63eW1QuKiciJiYoLTZCQ/zS08PUWu3jXFFOacbB xL+5tbm4srO2t7u7vdpmbEE7NzU3NDI0Ozo8QUNKRUFOXlda8trLxsG6t7ezrqyvsrCyusPZ VUE4NDUxLS0vMzM3PkFJSU5vYVv+/unTy725uLKtqamsrK2xt7/kTj01My4qKSssLzM0OkBE Sld0c3rg6OrXwbq+uLCuq6qqq66wtr7VTTw3MiwrLCwsLjE1OD1IYFxm5djO3+rKwcC/ubSx raqqra+vtb3aTD86MC0rKystLzM5OUZdY2Fdc+RxX/jaz8W9uLGvrKiqra+vsrzZXEk6MC4t KikrLi8xN0JLV2lu2+X03N7Yyb+4tbOuq6qqrK+xt8XnUD01MC4sKistLi80Oj9JUGjj5+LS zczNyL24t7Wwrqysrq+yuL/ZVD40MS4qKiwtMTQ4PUJNY3BnbnrZ0OLcxcC8trSysKyqrbCz uLzLW0A5My0pKiorLC81OTxKYHFx8tXLy9LKw7+6tbGwr6ysrrK1trzQUUA4Mi4sKyorLTE0 NzxLW2J449bNzM7LycG6tbS1sa2srrS1uL7PWEY7NC4tLCorLzI1Oj9NXfnq59XMyM3PzMi8 ubi1sq2srrGzub7MWkQ2Ly4pJycrMC86Q0z5/u9fcNZm3N3Vubexr6ulo5+lrrK03zIqJCch Gx8pOjM53r+wx860vUsuSEgyPz/Crbetn5yfnJyotbdKJyUYGiAXHSxCQc+yt6W12rLOLyU3 MSpHR66jr6KZmp+cna7CwTMpGxIiHhYhP3DmwLqnrU7kuzciJTEyLUa7oaepmpqdoJydr13b TR4YGSMdGCp+w03DqK/eQvDVKx4qPjAwx6ujqKSZnaWhnKTEf8I/HRsbJR0ZNs/jULesuW06 4+AnIC88Nj68qaOpopyipqSiqLRfw04dHx4fIR0u685Lu63QfExIUS4jKj07PLWspqGjn6Gn qaOrv7ncPyghHx4jHi9JTMu6t83VVUBFNSwpKUBf6rCjoaWjpaSqsamrsch5UScnHh0lIyw/ 0+DAvtjqRzc/NicoM0tRuqiko6akp6uwraeusK7DRC8pIhwdIy0uPc7CzeLNZ0JIMi0wKFDI wq2lpaeoraqrtq6orqqqSy83JRkdHyIsMUDTz1fMu1JKVC8tOEhYwbKppKytqayyr6yrqKin qUcmLiIXGRwhJSk50dBvuLjPy1ExTuA5XLa2rquurKy1rKqsqaWpsK22MB4oIRcXHCIiJDBv 1XnDsLjOz73BztXWtbG+sq2xsKypqqyyr7HLSktVLyEmKyEcHigrJixG49XNtq6zt7m3trm7 uLC3vr3N2sO4xnHpzs9mT9fbRURIR0E4ODoxKzE2ODtMZtzkz8nAvry7u7rCz7+uvdbHxsXG 0c9qREtGQTxCQTo3PUlSVVFq2tLMys7Lzmpi7G5fbNfj9MC7xN7cy8pqQ09YPjo5TOtVQE9g 3s9X4767yPXZvsdoX8/OeHTXyMNlRrzHWkk+YU03QURCUFRTRm3c+ldOaPjazevoxb6/2vjC ucrSzL/OcFnYzFZDPk5RPj5BTktETlnf6f7e4+PbzMjSzsvJ6fHQ3nJi2s3g5tvT8VJk/k9N Y0o9RmxcQUJfcVhS6c3c6M/Bw8XBxdzc1dfnYVvWz1dKXO5cREl5401FZehpXO3Mz2pk19pf VtnKfUrXv9NPR9bH011Rb3pwTkRHVFBj2d5f6M/b+u3R4fXu09bu9+HX6vDl3t9+Zvbe6V1T Wl9eUz08ZNVZQlrLzlZQ28vpW9a9vth+0sTOVln75P9KW9noWVNfUkdiz9xTT+HwTExVZFVg 29DfV+jFyuJd2b7MZN2/xfpPWcfPSU3V6DcyU8xLM0i8vUo6xLDUSlrAwF08Td3lVUNRa+DV 3t3O277LQ/SusU4zTbrRLy9vyk8977/FYWPFuNVJX9JrNzvXxD40SbbUPs2vr08/yrhdOkbI 3UFCeNRHOEi5t+hmu7TqNjZa8Ptlxr/F0uxg7vRTTk7fd14/RtnvSWq6sEUqRrzGOT/It105 1bK/R0i+rb1PTc3NPDVgw1MuOs/FTj1cy77f1MfIWk1i0+tObN7QYdva8Wtd3OB6SmL0+1xg 1szP38bAymNw29TaZ91tUEA1ODUvKy9BSk7mv7u/w7q0tcG7s767uL7GwcOxs7+4rUYcJTAd FxgjT9I9faWhtdNay7NfNtettcbFvKutvrqtrbCzwL+yPhEWKhsUFyTAobXHn5qtWS8x0Eko NLOusbC2p6KwvrCutcNp7b27JA4YLh4ZHzWnmrLWqaTGLyIn/tsvTqiko6e4r6Sx6cC9yb7Z abCpPhIRIyQdGR+5maPVvaasVCMgNGnMbb2opJ6nxcK3wczFacaps7aprkQTDRkfGxYfsZea s8evsE0eGSvTsrm4qJyaps9cyrjGSVOxp6qutK2uIwsOGBoZGi+gkpu6x7vSMxwaNLGvr6un m5y8P0fr2NH6zKihqq2sr7JMDwkRGRseKbyWkKTf19VDJhodX6u1q6GhnaT6OFHezLnDuaWl r7Gssb8kCQkTGR8oQaeSkqfLYD84JhwgTK+nnqKmoarJQkZS0bTEw6+qqautus8mCwkQGCIt Ra2VkJ2yVS8zKRwdNbWjnJ6in6S3RzY4Ts1iza2op6apsLw1DgcNFB4tOsWbj5WkwTIuLiId Ijy1m5ien6Gpuz8pKT5T47SwrKChrLTOHQoKEBkqMTmrko+ZqNU4MSQdHiU7sJyZmZqkt+8w JSktNsWsq6ajp6uyShgMDhQeNDlcqZmWm6npOTMrKCgsPbOdmpujvfFLNSwtNE+8t7eppq22 xkcgFRYdLkNCTc2vqqyz3D86QVlVVdSwpaWrvVVCOjc4OD9Yx7evqquvveRWRjInJjBMck4y LT3axtlPRU9r3Ma4srS2t8LuTD48PUZn3tDFs66yust1UU9W3tpeT2L+TjcrJyguOEJGS326 ra2vsrvS2c/qTz9GYs++vLzBzNHQ4l5QS0tqxbi950xIUT8tJicuO1VlWt66rq650fH+XFBe fPbXyMC7vcrhXlVdcV9PXM+2ra/BZ0hCQD0wJycvRn32b9C+u7/cTj5AWenYyL+7u7q6vt5J QkZc7+bfz762sLXSTEdKRjoxLS45WthuT1vj2fNOS1T61szEw8O/vcPU2OBsXFTtyc3a0sXC wcTiS0BDST80MDhP4epTS05k4uRrYXfPydTbyMTL1eT8c2118/DSyMLFycO/vctbRUFDPz05 MzhU211AQVvMy+n13t7d2OHhy8zR3ejbz8vmfNbExcfKxb68xF06Mjk9Ny8tOGbP5VZb1cPD 0W1p2dFuVO/Dxd9i5cTEz9PIvb6+uLm6us45JyEnLisnLVW2rrG7wb7E2Uk7QVZmRkfPs7PG zcS+v9Xlv7W1sq6usuIrGxcaHyIlM76inaGqr7ncOionLThKd9GqnqWzwcfeSjhDuq6tqaeq vDMaEBIZHSMyu52XnKatt10rHx4qN0TJr6CZnKzD1G4+MTbTq6WlpKXDJhUPEhgcIUKom5id qrnQOyEcITA/VMCflpqmsLfJPiwv36+qpKSlrzcYDhAZHB4xrpiVn7G5wzceGB41Vmy6o5mY o77LxWYzN86rpKOlo64yFw0PFxseL62YlZyty2oyHRcdO8a9rqGamqv6WWlAO2m6qaKioaGw MBkODRQcHi+rlpKarc1PJxcVHj67saebmZ6uWzg8OTjXq6CenZ+krS4UDQ0RFx01ppSSmaXD Nh8VEx1IuK2hmJWcuDo9Pi8v6KacnZ+cnbUkEw0MERceQqGUkZmq4C8bERMfZa2km5SWoMA5 MC4sN72knZ2dnJ67JRMMCxEYHkmfk5CYqmwrGBETHt+jnpmTmKfPLSQsMDm1n5ycnJyguiUT DAsPGiVKoJKPlqhVKBgPDxzqpJ2YlJik1iokKS9EsqGcmpuepLYuFg0LDxkhO6aTj5anTiYZ EA8bXKKbmZaYoMgnISw1QLuhmpmfoJ+tMBcNCg0XHjGqlY+To08oGxEPGVCfmJeUl6duKR4l NFWxnZqcnZ+mtTwbDwwNFiAvupmPkp/fKRwTEBc4pJiWl5umwSwdIjZut6Kcm52nqavYJxYN DRQeJ0+fko+ZuC4fGBASJK6Ylpian7M2Hh4w9LqpnZmcpaytuT8cDwwPGiIvt5ePlahKJRsT ERtxnZaXmp6ndSMdK267rqGamqKvrrRSJBQNDhYfK86dkZGd2CkeFRAXL6aXlpmdpcUsHiI/ va6jnJuhrbS2xzQaDw0UHyQxrJWPl7I0JRwTEx+6mpeanKGyPiIfNMyypp2bnqiusL4+HxIN DxkfK8mbkJKiWiseFREaSqCampqco8wnHy1SyrCgm5ykrrS65CUSDQ8ZHiVdnZCRn8k0JBcR FjGnm5ybmZuxLSAtQ0/ZqJuaoainrN8iEAwNFh4lTJ+Pj53BOSYYDxMqqZ2em5aYrC4jLTw/ 86mamZ6hpK9iHQ0KDxkeJFicj5Ggy0IqGA8SK6yjopqTlqg5KzY6MkesnJqeoKGnVRgMCxEZ HCDPmI+VpL3rLRgPFS+6sqeZkZWnSzxDMSo+r56cnZ2dpj8WCwsSGBkfyJmRmaa0vTcaERk1 WGWymo+Vp7/D/DQoO6+goZ+bnag3FQwNExcYIMablp2oqq5PHxkgMjA02J+Umqasrb48LD60 qaukn6CrPxsPDxcZGh9Lp5yjrq2rvDojLEUxKze6n5+oqqaqwE1OuKyzsKqosk8jFxUaHR0e LM+trri1ra28UUvOYDQtMtOzuryvp6aturOoqa60w9dfNyIYGB4lJSMqScXG2861q6uztq+x yzwuOmVfSe+zp6iurqmnsNBOSUc8LywsLjUxKykpLC8wNETKtq+qpaSqt8n7VEtDTdfAt7Oy sbnPUT89NTA1UsnAw8PBzFk6Ly0vNDU5SNrAxtTR3FtCPEZ1zbyzrKmrssHWaUY6N0F+18u+ uL3H1V9DNzAuMTk+SlZm7G1OPjtCTFffv7KtrrG3ucHkU0hRX19d4cXAv8PG0XZNQT9CREdJ UWBaQjg2OTk4PVnMwL6+vby/0mJeeH1p+NTBuru9vLzA0XRka2176ujq91Q+ODc5OTk9Rk1P XH/j3n9dXWj19+Xc0sC9vr6+v8DByNLV0c/Kzc/aYUxIQj0+Q0RBQj9BSU1HQkRNW2Tr2MzG xcnMzc3Pz83MysTBwsPCxNV8Z2NfYP7l7WpTS0lAOjc2ODo/Rktk19LP0NDS3OTa2NHOzcfB v8bN0Nzj+WJp5tTQ193X2G1WT0pCP0BBR1dhWVRXV09TVlhgbOre08zLzMvU3d7l3tXO093a zMnN2N7p5dve+/zuc1hLTEZCPz0+QEJITl3q4OPZ0tnU09zb09DT0s/U397a2unc3NrQz8rG yMrP5WlRS0U/Pj49Pj9BRktSVVphb+nf29fQz9DPys7Xzs/Xz8vLycjJy8rLz9vY6l9eU0xH R0hBPj0/QEVISE1XbH11bN/R2tPQ2NLNzMzLx8XKzM3OzczOzc3V5OfyZVRKSkI+Pj09QEJE S0xYbVxadO3X2NjJyMjGyczNzNHb3NTLzM3HydDQ2dxqT09GPz8/Pz9BQEVHR01RXG951M/N zM3I1NnP29rPyM3JvsO+vL+9x8nWcFdLRDU2Mi4yMDI4PkVH9NPNwL24vr++xsLK083M0MW4 wr61u7rAxmdJQDYsJyooKSgqMjxE/8G6tK6srq2xtrrG1+Tb5OTf1cnDu72+vMRpSD01KyUo JyQlKy42QVjBubOrq6yqq6+vub/Ay8zOzsrBx8C8z8nvOzw3KSMnISAlJysvOkvKvrSqqaqp qK2usLi/ysjM0tXDwsS7v8jJUDk9MCImJR4iJiQqNTdfx7+vqquno6qrq7C5v8fGzOXBvtG+ us7Kzzw/OygnKiEhJiEmLjA9dOq7r66ppquqqq+1vL3Ezs7Kyca8t77Hu80+ST4qJykgICIi KCwtPGlltq6xqKWqqqmwsLrAxOHezMnOvry9w8DIRk5GLScpIh8jIiYpKzl8XL2tr6mjp6qn rq+0wcLO3trG1869vsjEv0VGRTAoKiUfJCIlJys0UU/MrbOupKWrpqqusbq7wM3VyMzSv73C zcblPE46KSYoHx4iIScpLkL+XrSqr6ahp6ikrq+0xsbX79jX78a+xbu/ydxBQTgmJCYfHyAh JiwwR9LQraaqo6Cop6WxsrvOz+hd7+Vrw8XLucjIzD4/OiQlKB0eIiAlLi9NxcurpKmjnqWl pbC0vM/hZFH+WFjLx8u9tsbdTEQ+JyMmHxwfIiMrMkvWw6+kp6Seo6ikq7u4wl5bXEpLUuzF y8u2uNVmTkIvJCYjHR4jJCgvPt3Gtammpp+gqqartr3F6ExKWHZKZ8jGz763vMRXSUkuIycm Hh8kJikyRdG/tKinqqOhqaqqs8DG3VFGS1NCU8/15b/BxbzDPjtNLiQoKCEkKCwxOmC9wLqo q6ynpautrbTD2dp0RUdjUVj+zezez87X1OcwOlkpJy4pKS4rOFY937nMvqqvsKqtr6+4vbRS fsBN7kXS3D3aRcdXP788y0Y/Ok/8KEdHMTs6PXI5Ru1pcdO2xrS2uK28vbi83MrEXNFQWdZQ TN9K/VdZ22LTRlhPSUM8QTxIPT0/ST5MX93V3LTIubW7vb67xdPK2r9HVeRI7zHzY0PuR7Zd 41vNwz5K4Vo/PDnMOztST8E81M3K1my1xW3BarzGOLN66s1KuV9LyUy9P0C7OL4+Oq04Rb8/ zUhS53NlPM3DMclIX9I+1lPHUOzAzU+5bc2/QLnOR8f6Wsc/8M/eTkS9TW/eP7lpPbk5x+dM 4UPEOt1POcQ8UtJSZlzbzstq2LtOyPzOzl9Ox8c5xHtizEbOuFBGwsfKOua8S+80yHk6QUS/ PD5p3t49U77b/FDIsj7NzVm0NcnN3U9vv27byT6y2T22Pbs3zF40tSfHYjPCNNZKbco2tVFi vEy/4VTLWr0/ys5awEzK+sRp171MxFrY5z3KP+g/ZO1KS/JsVV5Dx1Z0Pbg7zO1AuEG9O7ft Rrk/xb09vGTA+2e7ObNDUrk23mo+zElB2ETMQ2Z70WZc79NbXNA9tD1Dujy2W0a1Z9HU4cX1 y0XM2UTFUEvRR/ZOZsU0w149xUg8tz5dxT+8RcreP7lWTrY/xfFdvju2OsvDOLRC6L43sjS8 aTm2MM7fPL5eS8JOyEzS7mx8TMxI2EV9xDnG7EO1Pm3CXNVH2s1FzWZNuD1kzWz9Z8RNy/BO 0c9F3O5462HIP8xa4dY7yU9l1z3G8EXMzkfd702+UTvMzUtJ1NtYxkPOu0jzxcjwZuvR01RB 3b1BRe7Q2kdJ4sppP+PETOtPS7hEQ8r0zkhS1ch0W8tiw99ExdL3e0PGy0Z2Tb7ZPOpu4WNW Vs9dZEbH3z3Nc2pX1eFv1+tMycg92N/tb1n/xutFwGnhbE7G80VaecheSuDJZknt185ISubX 8kxL0MxeU83LZd7c+27fZ2HtXmvr7GNS6efVTlrLz1/85kbu7mlUXWff51bY2ezZ2Wxb1nFX 4/5S+d5lZnXx/XPc91tt1ulf7HB+6mjp4N/0ZNRiY2526U9f5OFsT3zN1F/w7eLabk7zbk14 5mZaYOTj4N9559b5b9nobl9o721e5fHk8Wl65nBr907hdUz35Oxvb9zkdtpiXNtwUV9t7Hdf 6s/8Zs/R3eje0tp/T1lZWVtX+WVl6nxsffZ97npTeGZjaFrqb1/94t7f49TafeLZ6fN4497u 7d3kbu9/3HhRet1pU1df50tZ6mhxSG/bfWJf3d9dZuNiZnfh3ePj6dLd193z19XldO3ZXVPT +WZ/8PhY/HtOVWj3X0xWWF5VT99ZZtPy7ebe2s3X98zM0txp2c3gbevT2Gvm3GhjbfJUUVNP U01GSk5XV1Ribe5bXuHi4t3X1OHPzOTc1MzW3cbF0efez9/79/Hqc1VVXVNMSE9PREZJT0xL WWN1Yd/W4ufaz87X1dPf0N/fzMrr1M/QxdPz2dLfYlReVlhNQkdLS0tESlVWTlrwcmPyzd1s 2tTF03rLzc/L39bN3MrN1d33zM7ZZmT5X0tARUU+Oz5BQERRVl/u7dTPzsnO08rL0djd29PR zs7XzMbVycLOzsrdXEZMUT03Nzo8OjlBUmJeddPLy8vGwMra293b2d3Z09PUzczHysa/xca+ xmtNRkA4MS4tMTQ2O0Blz8zCv7u3ur7Ez9luTFl3Xlj+yLvAx7q4uru9vMDuSTkwLismJSou ND1N4L+2tLGurbC8yM/pRDg/S0NIa8+6tbq3rq+2uLq63DsxKSUlIR8jLDlK8MCvqaqtqqmv wNRlTTwuLjg/UnLMtq6usa+tr7S6wM9CLyUfISEeHyk8+ca4rqWjqq6vtL9kPTg3MCsxUuHD u7erp6yyr6+3v8nXUTQkHR8iHx8pOPO3sa6mo6ivvMrOUzUvNzk3O0+/r7S5sayutb6+vLzJ 1OA+MSUcHyckJi9Hva2usauor8DpYV9IMzE+SV/rzLausLm+urS7yc7AubzMVTswIx4gJCYr M1e1qq2vra+5zU0+Qj45PErfvr7Atq+1xNDHvr2+v725s7tjOCwiHiEjJCs64rKrrKyvuMZh PDlCPTxN5sa3usS8t8LlcmfKu7++t7OvsN42Kh8dHiImLkXGrKSpra+820k4Nj1GTOvLwba4 yMzJ3mFOTs66u7uyrq2wzTknHRwdICYuRb+poqWssb7sQTIvNUJuzsW4sLDCbmZiVFBN5Lau ra2vsq+6QCceGRofJSo806yfn6iyxG1JMy0vQPC+uLi1tr3dUURGS1jfvK+trK+vtb3hOCMb GBojLjVUuKadnqvASDc2My4yXbyvra62wvZBNi89WNnGtKuqq6+5wb/NTywfGhofLz5NyK2f nqa+PjAvMTY5Q9O1ra256URCSU10cdq+squttr2+wMfJ3lAxHxobIDFJ2L6vo6CqyzkrKzE+ VPfVtquuuH5BPk/cycbUyrqwtr7L0MzBt7vCWyobFxojPH7Kuaigoa9IJyMqM03x4cCtqKu2 VD9GT9XI3lLfvLa3ucPYxruztMNpMx4ZGiA278a6rainsk8pISMtUMa4sq2rqazCVDg3QVld T1PXtauptMfP1MbDzOJmMR8bHCU91NjHu7KvvEEpJitMu62sqquusshNOzc6VO101MS5s6+0 wuhPYt7T28vDwv0lHRweM1VNTuPcvcD8PjpK1K6qrbrFdlh4T3Npccu8urq8v8DO2Nve+273 7eJv18vSaDgmHx8hNllo18nGvbrM3ldIW8zDx8zjaOe/u7q/zsO9u77MX0lLSWfbz8bYXU1d XF1XQjk9QT46Njc+18bDz1tUZ/pea09YzLm1u8fa0dHIv8fV2Mnc2uVc+1tkaGNaUU4+Qz9N bd38WE9JYU7eXFJVWOzQvu7lU2rY0tvof0vY0s7Pzs7fycnAzWhMS0z+0893XnNRXEs/QUlL cldMY97Gx81dfGd7zt5qT01V4NjK2f3l0b7FzlpLSG3Fx9xaREvizMLeSDc8R3vufUpD6s60 utFDPEJ1u8nzUk13v7vTY0BMzcrM7Wc/QUPFsbDNOTk/xcBZMTtH0L5dRlHOvbxNPDVJz8nY T0hbxcG92Ght4MnByGRVUOfLzttoS2vMzPRLP0Vd8dtZRVLx1tNbVFPvx8LtWlRg3tvLdFtY dtTG/lpf3drj2tvkajs6O+TzxGHm8tRnSkhL+f7MWnlG3NvKys52btHPxt/pW2jZwdXnWV7b z8/RWT9R5db2WExPXernW0xMaP7lWF9VX3zy4/zq4enx1tLW6ubidlpOZufdbmLjX9Df4NDy ZkY/RVTuz+12X9jX8+P119TY5Fdy59TNz+NhXe3eztt5+F3s/F5SXutwUVFSYF5SWmFk52xS Zs7N0m943dXT51xeyuVVNz5hw72/70RY7b7MdD06d725zE9GZMG2vVxVR1lIWfdzRDQwM7iq q+EuLEmxsdc0Lju9tLtrOknLrrXWPD54y8DNakhK3sfPblln0s/cVTxK7OfiaUpQW33G681a T1JfzdP6YN9pY/0/OlThzcLazulvzNnOVkJFV3vWzm7f2cvAz15nX93P4mRQZ+bi2HVXWGNj XlZXUk957O5XX1By7svd6etfSUdMyLnCb0pQ5cPT7EhOaufKx15JX+i/6E9TVX3N2/5eT9bN zt/3+HH56mleTUlJePbfVFFObs7BzVNNVc7Izk5AT8zBzU1CVtzDyP9GWmvc1+RxUUtqzN7Z 6n5+z9VwTU/bycfpaVdbftvdTEl65uJaU1BZc9F+WE1x4ftqUlXny8fcVE5ix73VR0rTx8Lr fFxs4s3ga0xKTHnPyXdURUJjx8NjS0rfzs5zTUv3w8pdP1TcxL7OTzxH58PG+kxFScy8zVA/ RtrHz+FJTF7Z39pkTkpt19vKXFtR7NPgS1nh2tzeYE/i09/4+W3U3MnJ1mbX4+p/3eBp7Whh UVhZXURObG1LPj4/R0xQa+/gydh34s/MxcPLyb25vsbOz8nAws1oWtjLz1ZEOSQhLC08/klb usPM2DwzR07Nsrq5sLvEusna1cm4ts9Wau7Mv8HR18i6vywRER43r606Tq+vrfwhIT7HrLFr za+urLVn3sDJydZV2sbLwLzBzcu/vLk4Dw0bLbKjRzyqqqq+Hxox9LSpylizra+tyU3LxGxo ZXTCurq2ucLDv8e9yB4LDx1Jnqg3y6qtqz4bHjfdp6ncvKy2r7df18NoUlpC3LK1s7LIy7zH 0sT4HgwOHemdolzQraytNxgZLdqpqLyzqauw1DlGxs1lTEHJqayvttLKxt707nwrEg0YQaKc t0i+ra9aHhchfqihqbWtqrLzLy5QwMRjRmu3qqy1zN/K1OvPwtgiDw4fu5ye2Tu+qbE2GRYm uZ+erc+4r8NZMy1RvsTaXNutpa65xX59ytPMvDcWDhM2oZuuO0KzqsgiFhxNoZqfvuq9u3E4 LjvEtL7fT9qtqre9ydnKyNLGxy0VDRVRoJ2zOVWsq94gFh7Rnpmk1kjLutc+MkS7rr1XR9Ot qrS+zd/Du9PW1ycRDBbvnZy2Q8+qq1wdFB6/m5mnZEDWxWU/NlSxr8tQQOitqbC5wcrDvtDM yiYPDBZmnJu7N9apqnocEx68m5ioSTrYvMxGM0yzr8ZMPXevqa21yNDAxerdxjoVCxAxopmr RG6qpsMjFBlTn5qhzTllvcZqPz/EsMZDOEu2p6mss9DHwdvLvlEaDA0mqZqkTUqspbgpExUz pZqfwzdkusDeRki6rMY/Nz69paWrsMDKvt91v04ZCwwiqZegSUavprcnERMvppmdvztburnU Sk2+q7o8MES4o6KstL/Nx95O/lAaCw0jrJeeV0CyprMqEhMxpJmctzc+x77MdF/Dsb4+LzvC pKCqtcbQxb3J8DAVCw8yoZilUVmrqN4fERVCn5mfvD09YsjKd9rCur5TN0G/p6Cmt9DUycDH zC4SCxA+n5moP1qop2odDxVNnZigu09dMy3DuLCmykHVWkDFsqmeqN7Oxd+0yCAOChTJmZ3C PdmlpEMXDxrNm5mnwmY+M0HLuK2w3lx2R1DEr6OgsM7CyMa4TxsMChm2mJ2/Rb+iqTIVESCx mJiq6UxJMzbCurGvU0bPW1S3raeit0ffx8ezySINCxblnJ7ARrahqTwWDx6+nZqlzUBG4dbH v8K/w+5IQU65pqOpssjWxcfCeh4MCxi8mp3CPbujrDMVDx+vmZqo6UVEPe+4t7K7UUhXQ1q3 qqGhs9Vp88nIdSIODBjcnp++SLejqz0ZEh+4nJyp7jNJt7zNz9y+tl4xO++vo6atu+b4w8ze yS8RCxEtopqr97imqmocERpcoJqjwUU4662yzcxt8clCMWCvpZ+oxdji7svP20UbDQ4dvp6l wb6qqMElFBcwrJyguUg8v6q1y+nUv+MzLUuzop+osLrT2v1L2comDw4TNJ+ftsevqa85GBUk 1J+drMk7P6uourtnQtVKKzi8qJ2etdHfWNTH1+czEQwWJa2csL+oprVLGxEg8aqdqlFTt6ys tWd2vnYxLzXHn56kq8F0zWZH0M8uEQwTJqacr8CvqLFCGhMfVKicqO0/7aypvN513b9PKy/W pZ2erMHS7cnJWtdEFAwUH7ybq8mrpbR7HREcTq2doMM5QqyqvMRRcrhNKTF4rJ2eq7jL+f7i 4+huGgsRHMibpcixpK3PIxIZO7KeotBEt6mttmRMyM02LjfZpqCmp7Hp4fNN6ctOHA0QHt6e qsu1qK7RJhUcPrSiqMzoxLartvnKx2lGMzTdrKahpLS5wlBJ/sDDJgwMHDOmoXbDoaXALRUW Nryrp7zDrq22xeHPu9g7MjnnraipoqnB3W5E98HPPxQLFCS1orbDqaOvUx0UIFuvqb3praeo q+pgu9U4LC5Xq6Woo6m7yNhCP+DJQRMKEySunbTRrKGvTBwUJNivrM3Jq6amreHVuVA2Li1X raaloqu+zl1L4l1URxQKFya+nrX3pJ+9TR8UJtrFrq++q6i7tLPN1WY2LTlatKOjo6i7bNrQ QUVKQhwMFCLNoK/asqS3SiIXJtvPs6i2tqezvbTK3fQ5LT/guqaiqKyy401IRf3fyCwMDh1B oKs8x52n1SwWHWa+tbHNvZ+tva/Nyb5JLTnrv6inrKWyTUFNT+y/vDQOCxYyqa5Q3aGdsiwX Gz2/u9G6qp+ktce9q7s6KjHBr7Curau5akxGRfR422sRCxckraD/R6ShwEkdGjvT4rmvrp6k wrWwtsE7JjTLwa+stKysx+BiMTtP+rQyDQwXRZ6hTUuqrbwtFx1Fvaims66msbW4wbO6Py04 bLSorK6xzcxmLS9E5bdPGBAYLL22UuKpq+AoHCjuvK+wuqqltLy1s6+6SzhGTMysrq+zTj1P R0RKx8dFKRYTJUvNtL1ct8wpJzNKsarKybO8tq6yramtxz4xP8y0rqq5QDVFxMhT/cU+MCMU GCQxwaSrvFQkKUZt6cnAtqy9yruuoqOuxGI4MkLOr620zEg9Y8n+PF7sRkYmGhwqXL+x3T48 PTxI3uPGw77BybeuqaqusL9dOzpLv66xyE5b2+dGRcjDXDYrL1pOKis2zbwrHjTMwMw+TLu8 39jTs6WvurW0yzs7v6ervlPYxUhJUMWxxDMpO2tKP0csV7s5JicpMshjNcO462xNX6+svsnt z7m+xdG6rK222F5c1upNUNu4zjI12cHCzDU7Ti8+PCQrQFFFMzFiuOPodV69z3b1va+zzcKw tLC00eHHvsBcS01Sr6nUVjMmQ8tLOzYtT+VTUCwoOk8/PCs5rsFJ+L6yttZfwbG3zMS0ra3Q zrS32E9LWsTwWu1jy94yJzlfekY7TTIxOz3WUD9IKDOqtDpAyrGtzDJPs7e7vMy/vM68t769 yfvD50BAfM903zw91jw8PC5LvEVFSShM1UfaSDu910jI0+LSScGvVse63by5bPHD4edX0LnP 7F5MxME8PVzeXD4nNtbBsMo6PvlG4EQwr7o+RD+9ru08QX7AZDfPtX5QW7e1PzBct7PDO32+ w/Y0NrnFU9nozelPQzdUy+7YPESyx3s/N0xz1b3KOcm6OW11xss8Md7A39lI+rDKPEZO0Mjd ycHr6sFL1lw76NjE6TxIXFa1yj9ON0W4yNG2RzpKP9e+S0TD4MLGSTdJUsPSST4+x7zmTr7I 3HlL6NzN1+G3vEk6VNG35i49zbzNPEu8wVA5LsuozDErPK62PzxR6LzezM46NUi+sk8+fWG/ w2/UtsN5PD+1yuzbVsrUREdqWFhMP763Rj1E5r7qNUnGTznHu8TpL1vLzWVQccZCa8HCvE5A 27XFWDZYu7nDbFjsbFz+2+79PzZXSGzrUerE39NgOzJI5tzPWdXPT99gcsfETjw+bbW0ydHM 09ZAXVXZvtLQw35OWVbLyfJSRjxDWuHXXkJI0so9MVjFs1o14L/STzlHv8fpYmTcZsqzzGJJ UsG5ztz71cTVQD9i7mpqSd3CTjw5XL/aPERE3MD0SkvTw21qWXG/xdDk01BnWd7K6kR0y2Be TujD0FJS29fNdk/g3PRP7dvoTENTz8veTz9d2lpo78/H6l1+91M8TsjC0O7kelHiycRnTE9T /ODX0cfP0W8/O1bobPh55sfT+mBNaXRGTOPV82ZVx7/331xK3nNOV+7JzzxHxLzER0r+eG/U 28tkWdtgX9b6WmR4/UNl9uXW9tPaT0Jf9/To1s7P2k9KWMjcVkDpv9VTUOvNaT9Fa2j/797H 1ndbTMe7eFTlv8ZdRtvNz+9M4dFTQj5qzE9LYuzHX1jH60xDUt9OO1PIws3b3dtxUFJc195i WNvIzOLsysTgUGH5eWJeatbY711c1/n0TVTeSjtaeOfrXcrFaV9JTP1fZlFWx7zYZHPWyHtO cV5g6tnp1eNia3Du31vvyct3VnzX2VxSWt73YFhMWlxMSmzU2l5j1vVdXOnY6VJO2MnN1fLX wf9MTXfbZO7O29528thYQ0773nZYWHLW2f5PS2ThfXbi1tPzVl/u3NDN4PXs1OxVWV1zfmnw 5PXm7XV8UU5cV1le697V3e5UTVVl083Uz9zk3+Dg5e1fYv1oVVftztpnXXfj3nxc+e3iWUdP /ndo+OtuV1f2z+Jpat7fZ93p0svW62RTWVR+2tvV1+zj+VBf9X5dUkxddtHsb+Hr7mxPbM7q /9z37+5e7eps7Ofn6mZdWvPU61xt3tljWmH+7VhV6tnU32Ff4td0ZWruWlJo/evX/1hsfm75 7+DP0u7lztpiX+z+a1lLXnth8uH063ZTT1rW225qX3rlX2TX0dXkZmrb62Zz28rhWE9Q9upb Y/Pd5mZmbN7b5XtsX3bdc1z4/mvg6n90du/ed15g6+JubmZi8updWWhwePtdZdrret/d+X5e /8/U+WLfzvlYYObM1l5w82xnZl9f6/1mUVD183Bqd8/gXWJPWdjZ52r43t1sWGbm51pX9/Ph 3G/u3uFya2Bbae/3535p3M7Y79jW2+hpUWDiYk9Wb9vbWE/s2OVZWXzv9F9Wb99sZ1xt42tZ aXX14d3OytX1ae7Xak5j2d/fZVHb0P37a23ibFdg591qVWlw8OJTX9Tzcexh7N5+dv3vfGJi cGP47XPd3mzp7O3n7G1cYltbW2t6fHRpbuXr6tjg6N/f/vDa3fnq2+Hbz93l71NcelROXVNX cWVfX11cW19UVH1fU+jd5dDP2NfS2dvSz8vFzN3f7FxVXllQVlxZYmhbW1dVUFBPTVtjetbP 3uPM037n6fTazczOztba2WdZal5TWV5WX/tuZlhQWmBOS11hXuXb3dnQ0uxkaufe6/XOv8PM y97h3VlJTFxfYFZs1tN7TktXT0hLTX7P0ubd0t7nYkpPaG1i/+LZy9Dd0dR1afjo4dbf29bm 6ephVmFeREBNYH1wetnS3ux8ZGRu+V5d2svP2d/h6mxaWFpTW3rn5+bR0Nvd83nx51JGTE1f +FNV1svN41tc19ZfV2Dk3Onl/tzL5V5VT2nmY2Dk3dPN2tzi9+xfWGN38vxuad3vb0w6RVRm +Fpvx8LMcVFfbE9HTVHgz9fTzsrI1H1z897c3d7Lx8jI2ubqYEY8OkJNRUJR1s/Zamdtb15S UF7i0NTnz8jMfVpVYGVr7/jay8PFyMrK0edgemxk9l9LREhOSURDU+TtYFttbOfT+u3h7Njc 7Gds2t3q7NnP29/u2M7e2M3i39Hd7XF1/nNOS0tEPzo+RE3s3m7j1dDjWljk3nXX2dXO1cnO 9dTQfllSXu3j0snIy8fJ2GFg42Nn7Gj87F1HODA1QUNJS2rHxtHjXdvSVlZaYOfV0srCycDE 6Xru89/q0sbN0MbG22xs7VtOWGllTlNnXU1MQTc1O0VISWHKw87e4N9TSFX00MPDxMG+v8Xo 58na39jazMvW33B/bFNNUlxVRkpgW09ITmbrflpNTWBSS0dMd21Ra8/a3t7c1tzaxs/VxsXN 19LR2Xzp2c7ffuDlZnb6XHLxaltRV3lTRlp8WldNU9N/XGZNUnhPSW/n1+xd589uZ/Puy8/z 4N3Xy/JY6N9/YFrfy+Xu0dbc2uV+fGvwblX332xtdeTsWVZuZlddaXJzcm1vW1loZmdzbWNc efFXTWHf39jj+9/c2eT6+NvUb+vX1tnw4Nfm39zeeGhrZPlo5NtZ6dz9ZWTlX1hVb1hGVm1M UFbY6ERU3stiUWzWznBQ1OXNXFbNfsZj3s3c5mTf7tRe2tV70e9Z+OFh0VJn7WlaUeFxWnJY 4GNNzE1/YO7PP+RY0kpIw1XkanHuxU/Yb9Hs1/BeyknLRdrLTl9972rvXlvX3V3dV8zZUdjv 0dZk6d/vZVn500nsbFvyWnH/UGbPROBMyltcamrPS2PeY+j2T8zrVchM0tpp5f7b5OVozObb X9de6OJf4/HjWNdOyFf+eFL0/lXrXE/kTOtQ4fTZbv/OYdNcXc5L5vtj7Gtv5dZNzFrLTdNM zVXVbvx65mVfzk/n527Z2krCdmrb3EvESedyWWx1V/h8ZWho7m54a17JTM7qZNBEz07WWGHZ WNfgb81Z4u5ayFzadOraS8hM3tpLykndcW/jTt9d8O9V3GDiWM9M2+9v1VxPy0TJau3cXNzl 5N3q9eLvWm1sbulT/E/XWXHqa/F+7Onf6N/eWNlL02H852ta9d9Y0EzId/hh3O7cUO7lYVf1 6EvMRd11b+99W+R01GHS7X7GWclcbNNH2HhsdVVpaOlf0UrDRNR8W+lT3lJm+2HjeVze2+xe yVr6z1LBYl3IScZR3PvXT8xSXvFO/W1T5u9l2UrJTerPS8FpWsRGylNFwUdtyzu/WljJUc5q 7HDX2EzeWFrJQO7JP71C293Sb+/abM1S2Gd240vaX2dre2rdTcE9xVbaz0zbYNdUzlPPdlVa vj/XXkm5RPLNSrxB1WXvzD7P5k97VubOTufp6dVT2lTKStJM4dlf3EzPfkzCRr/pTcpYaGL0 6GBldutlTMRIz2JWy1jrTt7oZsdXZMhCuj3JTc9mQr88vlRSvj7M1E7PU2Htau/P495az13O Qs9FylZK1jvPROO/+tDd681mZPTfXUbbaHrvSsJb01fp0uBzUGbh40zCPcBRX99M3W37WubW VcxV4dNV21zb3WjYUO7LXs9K3G7oVF7wWtVPV3Jk51L+7tLUWvfXX8xV5uJn+Wz6ftbpTNdw /M9N8+/+TFnwXd5QcO1fzkr5eOjPcNzW1cxZztbQz/DP8n9pV+fpb09eWlRHREVKTT1NVVxs 3+3T2M7OzdTOwMjBv7+/xsjL2uvU18zMczElJyozMTA+v7GxtdjY3lZBNzJQvri6ubKvs89i 6djN2t7Ox7+/xshsNCQeIikwOkfArqquwt5RQz4yMDl2uq+usa61wW8/Um7c0MO4sa2stLhu Kx4VGSAtRmW5paGls0g2MC0uLjfVr6akrK/A2FU3PUjawL63rampsL7XOCMcFhomNeG9rqah qLo/KyUnKzldvaijo6i+e1A5NTc+0buxq6uqrbjIXD0uIh8cHyw7w7esqKmwxzcnJCYvTsGw p6Kirr1LNDUxPl7Vs6+trLK2vltNQzkwKScfJS9Wvbeyr669ZzIpJy5Quqynp6msyVcxKjA7 T9zBuLCytLvO5WheZ3hLNC8kJS40yry1ra23ykkvKy9B0b2zsbqyw0w9LTNP7Mm7u7q4vrzG zr+/wcz8Ni8nHiUrS8G3sa2wudU0KiszUL66t7u9u8VYPzg/ZP340NC8r6+vt729vdjmRCss IigxOdHGt7a8y1c3LC00P9W4t7e6vcTnaEU/R1j9283Esq+trrq+xM7VfTYsKiMtNj/Jzri3 y21CLi0vOE/Fu7OyvbzF7X5CPEdY5srOva+urLTAx8/Y41cvLCopPjtMys+/x2pNPjIzOED8 v7Wtr73I309LPDxNT97I0Lq0sbC8x9bm2M5+PDswMEI2RV5Ny9T11UU7Pj9IcM/Dub3J0Ofo eEdHUFPj2My4urezwszQ2MLA1FxEODY+OT1EO2btc8piRUlCR15e98nR3dDb7vtTWu5Z4crO xsjJvcTOxsy/ur691GZJQz02OTM1QENZe1nxflrf2tXQ71hQSk9qe3Jv2NDTyc7NzcnBy87B w762u8DMTjw/NzE7OD1VTv3XVFdNSWt/ZN/tU19u39LkYvn95NHaz7+8uLK8vrrEu7zsTTot LS8uP0tK0dXVyVE8PDlDft/Ox9zPv8bHzUxNZlF+19e6tratsr26wcTIQjQwJis2LlTWZb3e WN08Njw2R87DvLnX3sPTzM5FTGlnysnOurq3rru+vMe5xUM7LiUvMjbRceDETVlPMDY5PF/J vbjEWdjO37/zP1FXzbvOybm9tLPFvL7Btcw4MSsnOjQyxdTOuz89QS89WD9hv8K1tu951e3C 1TxLT/e8yc3Axrq1wL+8vbfAQy8nIy87Nsa8y7pjP0YwMk9GUcfEu7bP8855f9k8OVJvwLjI vby9sb3EusG0sUguKiUvSDpNvda6wDYzMC5KVkrazL+vu2TqXE7ZSj5LT8S0vb+9xLm8zL65 tLHFOSwqJDU8PrTG0Mc5MToxO2ZazbnAvMBTWeReXE47PvTAs7DEzcjJubrGv7SvsV4uKyAq STzIt9bHVS41ODBEYfm8uc3M3FbPxGpiRDppyb+0vNrMx8G5wL6ysrxKNi8lKTo4066+wkEr Njw5TlJIyra4ud1D7dbY8UZFUvDFuL7DwdS/tr68t7Ox7jQtJCIuN0avsL7PLyo6PUvoVuu6 urrBQUzS2sV8QEtNbbu4w7/L2Ly9w7OzsLk9LicfKzxCuq24vj8nLTE689LZu7bDz11J7cHA 5UE3PWjDtrvIysW7vcG0q63wNS4kJjU0PrGsrLc2KS4tPXNQ37u5v9JDQV/CutJFNTvzvba3 u7y4u8S+squ0OygpJC9DLVqxr6e8KiUnK1HYXMK4xbfGPEHXvbfIPjlA47a6vLe3trrAuKyx UygjJSxGODrltKetTCkiJDRq4NS8ubS36T9J7MC75kZEYMi8ta2vsrbEvLbLQCceHSpCZLvE xLK26zolIis/zba7w7q/w8ZeU83tcNBt38rFr6yvr7jBu8XePh8aGR8/vLevr7WxvzYjHiM6 0Levr7KutcVbP0JNSuzOzMjIuq6rrrfNcG7cZSsdFhkvz7avua+nrcE1IyQtPf7TzrWqpqe1 e0E1NT5H2L29uLCvsb5eRkRow8RBIyAlMWRKPEx5uLbLcEhP2eZn/dXAuba7yOFaR0VO+dDX 0cfDv9ZPQz9O5cjDz+r76+nv4vVfVlJaV01KSUFBQ0pZ2tXCyn5gSUdJUGnu2MW+u73H5FtT VVza4PbgVs/Ny8ro319TW1VTUE5fVG751MXHx9v3VEc/PUVDSl911c7MzNre7XV2bWBu8erS x8PH1uhtW09TZFZRVmDu3dLa4Pp7cWZYRkhQYmb63+jb09Pr+HJd+O/n08vJzcvN2vVfW09T XVtWTE9RZOv2eHhva25oWFJp8vd++O555tbX3ffr6e3Rzs/OyszY4/1kVlVYTlBWW2ZjfXX5 7HRZTU9WWltaZ/7u6un6+drP0+Xs39bX09rr6eXd5Ojj6ON8al9cXVZcXmXk1trrX1hgY/hv Y/hxYF1eV114cGFUbffn2NfU5uLffHBtd/Z7/eXh6ev97e/p3OnuYGBbWVhbYF1v/+nm1dbk 3+7u5+7p+fL66+Lo5/35X2RfaGZbbVhTW//q/eja7F9veGVeY3dbZfHs7n3y9Pfl3NzW1t3d 39/f6nhbXmpsal5fXm7s39/o4+/ubm1tXWFcXFNb7ubi3Njc4ebpbGN5bGxjXmh27On5fO7x +Gttc2Fp8ezz+Ot9ce3t6OTofFDcXk3H4u/D0fdhSlTkYG9dZFXd49bc6/R3+O3tWkdZ1ebU fFtu2NPjU/B5duP4cVz9d+vt5dxl5vlfWmpNc1Pv3ufv8GN24eryWXzw3+ve3eTu+3vj2n5l 43jv7M78dmVaXF5ral5RYklJ7vD+b+jMx8vdQU3MYlPbTePp39jH7uRfa2NrX97I0cHrzePu bVZPVvpUTVZcXd9V92B71kxv5GBrVDjcYuvUyM/Izu/U2eZaSlfPW97uZMHR5/HUTUJMUs/c 8l3MW9tIUM7nSWLN7s9h6fDRTfFz6u9mas39ZPPpT2pRVPRnZlt/09NJ6NPO1mHi3clQ2VXl 4l1p2/Hn5knKU9hr5l3R9VvTRftNWk/nY9vr6mzl1VDPT/NdTVhmftvP1c/f19D4aF5MaVZU YF9acWFq2Olv6GnrzN7v5tTJyejL0s7J6mXe2n3o3dTt71I9Ni8sKSwvN1nPyby+v7y+w8O6 urq7vbS5xL67vbzUYu/q+d69Xh0bHR82KiAqTryvv1m+srKxyNS2r7bAwLuuqrq+v8O3wVdJ 8+ZoXkk3GxoiHywqJi3Gq7TGbdS0r7zmebisq7rEt7SsrrnKy73kWU1O3MTMX9E3FxocGy4x JDO4ramtTUq6urDASt2zq66xxcWutbW818zYy+Fk0eXV09NYGxQYGSk5LipNrqSerGNO1ra6 w1hJuq2prL/Jybe2xMVlYNbYzcbJ99jYOR0UExcnPz04X7Khm6C6aENF2N1JQfm8qaKrts1u 1L691t3yeLy9v7/X2VMjFRMVHzZMTd6zp52dqsRHNzAyPTxavq6hn6a5YD5J2cvP0nX/xby6 v8PfOx8WFBgjO1Vqw62hnJ2pwkUzNS8sOUjFp6GjqbxMOzw/bszPxcTIvri3ubvcKRcSFB49 1dzgwK2em6K9Py4wQj8zNj/Ho52hrW0xNEnkv8J18sK4sK23vrtlIhcUFSJEbVvix66enaa8 Qy84U0E0MzLfpZ6isEovPN68tMJdb8e1rK24vsBIIRkVFiI6UVvgy66fnqSxYzU3SEQ0LSxL rJ+frVw2RMm1s8hMVMy2rbG+xcPYLBwWFB0vS1hk7buinJ6pyzo1RUA0LSg4tqOepcNGTMq5 tcRMSeq/srC5v7m4SSIYEhckNUFASM6pnZygtFA4Ojw0Likt46qfn6rRSmTJur39TlzevrK3 vbexuTwfFxQbKjxDRVzBqJ6ep7xONzg5MS0rNMKmnqCyWD9RzbzHT0l30r6ytbi2src/IBkW HCxBR0RL46+ioKi6TDY5Ozk5NT69qKOmt08+T+bHymxe27+2sLK5ubOv+ScbFxsqQUE4MzbU q6Wpt1c5Q1hYdVhQvayoqbhYPUFK7c94bNLGvLOyt7i5uLdcKB8cIC88NC0tMu6uqq++Xkne xsfE0OO8sLO43Ds0PFDTxtnbwbqytLvFxsK8t8w5JyQlLToxKyotPM+6vcXgcMa2tLi9w7+4 uMZYOTY9Rl3m0se7s7W7vsLJysjFvsZLMisoLDQvLCoqLkvNwbq/yb60s7S5ydHMz9ZsQzxC WNa/vb69w8vJ1N3Z1tDIvrrHUjctLTMzLiooKjb+wsDI0NG+tbS5xNjPzM/P6VdSZ9jIwcXO 19/a2NfRzcrKysrI30o8Ly0yNjQxMTE6/s/c2OPaxL69urzDvb7ByORTU1pX7dTd5d/n3MvI wr/KzNLt3N5UOzgxMjw/Ojc4OEjv8O9vauLIvbq6wczO0dfb92b7083Ew8bHztDOzNHc6V9X WnHZ3lA9Ojc6Q0M6NTY3Qlll8d3XzcK9vcDL2dve2c/V0s7Lxr++wMTR72Rqe2hmWFdcYe77 Sjw8PUNTVkk9QEFN8/t6eHzrz8rLz9XXzszMytbTy8nGys3Y7fT54efp4O13dG9gYlRIPUBC RFFOTEtMTlxpX15ZXXvVzc3Ly8/Nx8rHy8zI0dLT3+L/a/bt5u7u7Hrd6Oz5Rzs6OkFYVkZA QT5S7PP3a3HmzMO+w8XLysnLzNrm8tnLy8rQ6vHvbevnb3r94tXuPTQyMUfzWD05Oj7fzOdd UV7Pv7y9v8LAusLM2U9q4s/IytvY183Pzcvcyr+8yzsqJCQvSkk2MDJNubC76z888sfEzl3g uq2uuHVCSurAvbvIy8O/u7/Gyby2yy8eGBsoR/5IOkHGqaSvXi4qNVTmW0NksZ+dp8g3Mk/A trjExbevq6y4vbo8GQ8NEiu9tbu/tqGaoMokGBkoRm7gWbKbkpSkPyEkOMG1s721p6GdpK/L IAwHCA8xrKaooZ2WlKcpEg0RJma8raebkpCbziIZHjnArq2vqJ+cnKO3MRMGBQsaupybnpqZ l545FAwNF0etpJ2alZOaxiUXGSr7saqrraGbm56rUB0MBQcOKqOXlpeXmZ/QGw0LESayn5uZ l5WZrCwaFx4/urSvrKmcmpuizC0WCwYJFkObkpGXmJ+1LxMMDBg9opmXl5iaockgGhsn2ri4 trCmm5ibp34iEgsGChhVmI6PlpusbSURDA4dWpuVlJSYnahTHBocKuK8zL+ro5eVnK0+HxIL BgkYypSNjZmhvTkgEAwPIbqVj5GXnaa7Px0bHzLEs8W9qp+Wlp68LRwRDQgKGdmSi42cq24v IRINDiaxkY2RmKW85j0eISc2wbPJyqmelpWezC0dEw8ICRi+j4mMn8A8Kh8UDA4po4yLkaK2 1ktCHx0nSLqvynitnpaYol8pKBwSCgcSx4+JjKNSPjcpFQ0MJ56MipOp62BHTiUiK0i5uM9m rp2UlqBgJyUeFAsHD3KOh4yiPTAxKhYMDCWciomVsT9bZFgoHy3nsLtiP66ak5anTikrJhYK Bg/MjYeNqDMvLygTCwwql4mKmbw9UE1MKSVHwLXIR0OrmJGYq0srLCkXCQQO042GjqwuLTgr FAoNMpKHip17Mz9TSyopXLe0czY6q5eRmKxDLC0wGQoFDVONhY6oLi07MhYLDSyTiIqeYCxH 4kstKXG4sk4vNK2YkpixSi8yNR8MBQs3kYaMpjMuPDUZCwwml4mJnGYzQklNMizLs7xELi+z mZSYq0Q1PzstEAUHIZuIip07LD88HwwKG5+KiJZcLDRv6DwsSrO0+S8tv5qTlqdNMDdIOhcJ BRaqi4iW3Ck6PykQChO0jIiPvS8vPj1EMEStsuE0LmGelpefzDM5P1gnCwYLPZCGj7UoJz47 GgsOMZGHi6MvKTNiXTk2uqu8Ryw8qZiWnL86OT/eSBUHBxijiYqfNCAuSSkQDBqhiYeUWyYp SdlEL3mtr9MuLcidl5mqPi49478oCwUMTY6GkdYgKERBGgwPT46Gja4oJTE6OjU/qKC9Nyo6 qZmZoMU5OVu/zhkHBRWkh4edKhsrZjERDBiiiIaUQx4iOFFCNsmkqM4tKfOfmJmpQi8+XbJb DwUIIZWEjLcfHTjHKQ4OJpiGiaErHiU2Pjw+rJ+tTygtt5yZnbM+NlfKsFkPBQgkk4SO2hwd P7wrDg4qlYaJpiUcJEBPNkSroapbJi6znZufxjM8a7+s3RMGBx2Yho28HR0+tTUQDSKZh4if KR0gL0M7W6OerEIiKrWdnKLBPlXIzLbMGgkGFKiIiqYjGzGwyhkOG6iJh5gzGhssV0lpq6Gs WyUmw6CdoLlRX9G/tLwuDQULQ46IljIaK7axJg4PRo+HjsMdGyZH+syuoqpuJyZkpp6iq8Do 2/HEulkWBggfmYiP5hwly6w5EQ4nmomMrCEcKE7GyLmprN8rJUGrnp+pt8rb3fDTySMKBhHA jYqhKydLsdoZDRm0joubNx8iL9a8tKas3zQrOLKhoaOrvu1OO12+dhkHCR6fjJLaJTm9si4R DymejZCuLiczz7W9uLHGRzEzzqqioKe0yeY+Odq8OBAGDDiWjZo/K/q01B8PFGuWjpe/KSQ3 5rCttL5gODZUwK2kpamvz0VDUujeHgcJHqqNjrktXsrHNBMQLKKRkK0rKj90rbDSvck7NT/5 q5+kqq/TX2pBWb4tDAcRTZGNoD48cMNFGA8dupaPojctPP2vsfHGxEY4PFSrnaGpssvZyFJM 2DwPBg4rmYuXSDFL51MeERrKmpGdXDJUwrm7Z8+88zc5e6qdoK/EzuzeV0TzShAFDSmaipZJ NkhcUR0PG72bkZxfPrzAy8w7+7HRNDvwqJqescjlWHxGP+l6EgUOKpiLlzovTd95HQ8buZuT o9K2qb9KMizEr2c2P82hm6S0x1Q/QkBay9wRBA4xl4mYMz/O3VYZDR20m5Oju6in2jAoK760 TD1Jvp+dp629WT8/L0+vXgwGEkaOiqQpP1TQPhIOKaiZlaSqpbM6Kys/uMFET8+uoKSop7s/ Lyo0zKs5BwcWy42Oxyne1rwsEBNDrZuTpKqlwS4+NEO2yF7RwLCipKWqdTIxMkW5thUDDiSg jJktSLhXPxkOILutlJmpnqQ7PVMuz71B873Qq6Sno646LDMs7KstBgkaz46QZjPAXP4kEBnp rpiWqKKfv01VMkHWV0/KzrKkpqSq3zYyLTlyRxEHEyudkJ9AxcBHLhgWKbWimJ+io6nIY043 TlVMfc+9rKWgpLc7Jyg1Rc9vFQoWL6GUqjXPxU4yGhY1q6Saoqukp+JbZEXO2TxTxM2tpqan uzckKETV0NEjDRYsv6KzMlm34T4dGzyyrJ+kqKGr3V5rdsTM8tXN17WrqKvcLS01PUo6TL09 FRcgaaqvOD+/wV0jJEWtqaKusKy6UUnEtLDFZPPPx7m7trxHNTQ/zl85P1K8zCIbHSu7wDdO 127ZQDjRs7WvwtXB52y3ra6tvt3EzdjmWnW+1FpWOULfcv3SUUU1LCcmL93BxV8zO9TD9kc/ 1b3LSlTIsq+2s660yH1M8MrQf9fPXUHrubS7SiwuR/ZSOkzkztxzMiosLDvX4lfd+77NSkfL tKyw0/TIy9jHw7a0x9TmWNNNN1TGv7xtOkBbe/JCNj9sVkVNNy47PDxl2tfEyVTY3O/Gy2zA wMW718y+xMzF7s6/0tHN62HlTHbgY01FPko/PDo1QWfOekdK2uxaSU7Oyfph53TdxsrKv2VW 1L66yE5cvr7GcUt3y3p34XRZQ0jqyF9LOjhLPzpszsDCUkA/R2ffw7bGSzxDbL6xt724zkpD PVjZ0cS+xEg6O0pqztN3bWRHRVlP1ttYU0tIT2be1tPN2tDJ3ffDxsDM/+VYS15j5svb3epW TUVRWk5SaHxXcfvg6N/oV09mb2VUWPXNzc3VbONlWWF32tLVvslxeFxw32tYXVzj+kpKWdXO 2X1faXVUVV9jbmVxf2tq79rZ09lncftVX23i0MzR5V9s+VNPYH1sYt3O09TP32hRQ0JSVFlk 5MvQ7Njd7+NkXXllWVX60srIzNPtXmFXVmhdX+vd1N9bb/JhY1RaXU9edPTn63fu2d326vZ2 cE9QctzRz93X1fJ5ZmduVWPg5OtmduXh429o6/9YT1BV9dje6+j2cm5953Jr8vbwbm/d6+ft X/pvZf567OPz5trh4X17fHFhW1/+/fp59uP5XmD7+Gx45HpuXV/+6/VjX/r2bPPt4Nrv/G73 4fbk5OXkePTn+P91fvJ6X11hWVtpXW3f49/vcPrr6fh4dP5savPv4+Pm7WdgeHVpa2xrX2v9 e/j5/O/l8vdpdPd059zc7Pr1/m9udf7+7nR3fXzv9flua2tnXmXy9fh87dzl8+np6Xp97mpx cGdmc+/t5N/b8HlsavT1Zl5sfl5dZ2/zeeXof35veuvq6u188ntubHB7d/ft+efc6Off2991 aWtcaebobmR4ffz++/j2+Hpvbnn9+Wpz9e7t/X1xeHT3+P77ZWZvZ23/f3jo6nN48O3w9uzq cmhkbfju6t3h4dvj4eHf3fplYV9eWmFnanRhZv1raH7+eGxqc/f99+3m8vnr3tzg5vTw+W5t fmJeaWNoXl9zfOTi6/v14OPi5vZrZGh5c3Xk5Off8+7m7vtvbmhdXF5hZ2RhZnbw+ezr9+zq 7Or6c/vt629rd/bp7XFsdOz4fmx2fXFueWpt7e7m3ubm4OPq8v3+dWRdZGRnenVx8fDu9ftu e3hydmZv+ft5fvNyd/J6/vhxdGtncu7p8nzu8Ofq6+h7bnhuXWNsePt8fnd+ZWZ9fPLl4+vt 4OPo/XDx/XH37uvr9ejtbmf9/mn39XFgenZdYWdrYF9zcX3z6/lvePB5bXzo7vnl397b5+Dv /fVxbGRgYnR5Y2B75mrt+Hvo6PP27vR3amleXm3/+fP54OTl7erxeOPpY2d+9ud3amxp8elw aX7x7Hx1a/vh4v18Y3vr6ud6bWB26v5hY3LseGlvZ/Dqcffv7e117v34Y27vfXxu++nl8uXo 4uV++fJzc3Br/V5iaGNuY27j7ezhfW3+fOvt6vJ08F119+9/aHt7bm343vX7+W/g5HNZW/rv amRef+jx43lnct/53tVs5+Xn339ub/L3efri3Wlkd1xfUldUa+31d3zW2nVe7fP+XXXx6+R4 7tzX6/P32+peWmt57WBeZWdpWH56a3bo2+nZ3vVo8/r+7Hn4/+vo927q7vxz5uddZm5laVdw 6ePjVHnh7d1na/Ft//ps6nT17mP79HNu135rYF7j5XtmdX7+Yl7j3P1i3tLr6m172/NeZPvg 7mtm4uf9fnjrfv/r711eYO5rX19q1OJdYfNtd2J37Gvd4O1vY3DR4mx3+uXo5N3gbOvn9Ppb XutxWV1f4txpXWDq9uxcXGz+4eRt8+Fp8eXt+nj13O1aZGvkeHPp39fc7+rfaGRna15wemRs ZV9w//zdcfN66+jk6e/UZ/ry6HFqYenr9m9oaGBg5vJXXGd73HFiatvf+Xpc9Nx5d+fe2+du dO19X3Xsa3f6cXT4b/rz6vF4d+fvaHjp4/97cuHrZO94e2/w+WdaZGj36mJXYGz33/zz+/Ld 4eZ62N1nddXvdm374/jw5Wj37V5sZWdvaGh4ZXBodu56+dzZ7Olp7Nf4eWFp4XFbdHh2Y136 4/rwZH53c19t5nvvfP713mv34N3raH3n6tztZfLeemx+aG5pbu/0alpe3d1fZWl09GpVauX9 5N/69W1k5dxodPHt42j85ebq+mn0c2hvffd2cXZrdGpv/vTn6OVqcGnp42JvcOvlcv/z59N5 XnB+83r0c15n8eRzX2b4/15VY9nYc1pr2eZ6fXzf2en36+je8fXscG549XhaXV7371tZbejt b/7f4O91aXNuc/Lm+l1o7N/5Z2/j5HVmd9vl8XtveuDxbPNp9eR83+987NzpbmVu8Gh5Y235 7G9ubH9qd+54/l9gc2tub2hrZ+jn7+nv8vj5bG1vf/F19/179ubk1uju5+TifGp2d2xpYH7+ bWvo3OZsde7n7Whja3hwXmx6bVxf6eltZmzl4un3/ub9ce7q8vx2ffLk8u7ud3zybV/87vdx Zmnp8O177+Ll6PJ95HxofGlte31rbPxubHtqc3ViY2pt7/557Obi5+Xn4tzf4OTn92trYGhk XWf5a3lw/OT1bW7l7mdgbvfj8HNk9OPj6PP/7fT49G9qZ/12cF5w7/7m835+5tvoZWry5+1x /u5qee/+/Xn1eHlxa3zq7HVfZWtxcu/q/n7s4ej09nVvd2z7dXLv+334a/rq9erk92Vq8elt a2hsZ1tk8evpfHT48ejr8+Xr6d7l6e/79/Vqa2dv7/ttYW/+c2NjXWF2eHp79PX09nr+fPDt 8/r43ufu5/7u+fn7e2n+8G1kX1xea3FqZnb19+vx49/q6Plt9fTs6/z2d3Lq6OpvbvNuZGls c3RnZWJjbP5xbH36+O358/d6fu7s8/vu5N7g5uHd3eLsb1tcW11fXFpcZnn8cW/x6u378u/s 5e10+/vs5+rt6fHz9uzmfXh9+2VebmNbXmpsbXx+bnjv6+/s7+7e3+r06uXp5npv9u3ycmZt a2JlaHL9fnP/fXz78vbu4PD09vXo63xsXmNjaW9janL28e7r+Pfs6uXl7Xt0eWtx/Odza/Xv fG9x7vV++//u933u6319+ejqcmtubGZ2+Gxo/vbv+Pbj4e99cm5r/P1taGp3/HFr/Or67t/k 7PT4+P5vbnF3aV9m9PTu73199vD5+PPq9Hptd+/m6Ozy7ujv9/v3Z2lsY2BfaGRhaGly++ji 9vr8dnfv6vj47Onl49/f5efu6+vvfWxoZGViX2lpbWds+Xr48+/l6X538uzt6eDrfHxtbG5v cPr6aWVvbW5u/ndxb31+/f50/vnu7u717N/f6eLd6OXg8nr0fGxvbGNteG1oX19nb2thYmp1 cv31+Pp+ePHs+n/x8/Tp4u398uztfPrr9/L2b25rbW96bWv7/PX2ffr49e/0fu/r7PF6b272 9/j0fvX1+P12e25oanJ4cm5maXp5ePNyfu3t7vzu7vLv9vr56/r27/x19vX9//18bWNhZGpu dfb39u7i5P128Ojv597uZ2pqZmleXf7pbmBrXVZpWlJdbnXgz9Hg2dHZ2tzQ03Zv8nFaUExO X3lpbubr8fp77+f9cPXze3r56+pzWv7a6WF4fllh8v9u2szU4nVu6un97fBeUFdkYF1WW/bn 5NfV1s7Kzd7p4+x6X1VOVVtSVVxnY3Lm4ufc0trf2Nfpbn78al1ieHVv9+Pe3N/r/u7qYGPp 715n62pfcHBpXmJoaHvk5ff+5+B1Z/Pp8/9qcefc3djLx8/X09DV3fFtX1lcXFFPWFJLTVJN SlBZXGp0e37u5fXc0dvk4dzc29va4ez3bXF0ZWNvX1hm+evu4t/t7eni8XZwcl1bZG5uaG9f ae7k629taW5waWVkb25pXF7+/Wllevl67+fg3+bl7u/v5fL+9W5kZGhmdvZ4fPvq7GppcGlj aWdjXVlWVWBjampt6+Lg6OTn4Nrd5vXx/Hzw/Wx1+XNqZGhtdXtvb3F18m9s8OTj73l3Zmhz aGNqc352fe7t7uXf7O7m3+Xo4OTe4PtlXWhybnJoZWhsaWp87eT+ZG3t6uftfn7+6+x7bnL8 +Pb78+p9ffft83Dv5vVz8OTk4d3a3uro5Ovv5ez79f79anZrYWlmbWpq+npoZvv8+ep7YGD+ 6fj98+Ld4efm3t3o7e/2f/jt6+zo5ePzeX13ZF1lYV5fXl9rffjs9Pju29LT2t3a2tvfdmNn YmJhVE9WVFRYXmrx8e3e5eXuaWttdOjZ4uLZ2d3l8+3s+/5qX+/i9PpjYf57aWdfa+zy+Obq 3uldXF1g6WtYbnbv82RlfW/9d11n39zc5Xh57vLudWj37frt6uDb3O3v3Nja3uDp7enyYl9r /v9/YUw4MT9T1MvsfMnEz2lCRWPb0Nbo0b/F1nlq+uL8Y1hh0cvY/Wzx1OVeW2Xu0c/f6vfy fmNgaVE3LS9A5snX9su7vM9MPknv0tbbz8C9yNlkVlROREZSaOfbz8vKzuNgXGzp2c/JxsXK 0+P7eWNXU0I5Ni43TeTGwtXPyv1NPz1O2czIyM7DwM/3VEhITUtd79rLxMjP1+lza11YbNPE wsfKzdHU5FNHR0JDPi0sPP+8utZi4Od8TDg6WM++vczKvsDLekA9SFpnb+vLxMPJ9Hj6Wldc aN7IwMPHz918V1pca/FKPDQrLkRnw7zKzcpyTkM6QvfMv73Hx8LP4E89P09m7e3nyrq8yOtX XvtlW3DVwLvC0t/d4mhNS15eUD8yKi1C6L2+093O1PZNPEFoyry6xMfCzOFOOzxJWPX57My/ v8zrVlx8+H1w2MG9v8bdemdWW/nn529KQD4xLjtWxrzPan94als/PV3PwL3HzcXH5UtCTe7a c1nuw73E8llf7fddW+XCvcHP2dbWeFNX6edTQz1EPjE1Qui9v/ZUYXvpVj5F6Ma8wdbSyc1m QkJX1tB1atjFvcTvW1x843lc78u/v854b+57Yl572fBSSkVAODE5Tsu9ym976HtiRD5P3MjD zdXM02pbXGXY1vvv2cvDzePp8uTeaFnuz8jG1+3e5Pv67t3W+0pGQToxLztaxsDOd11vX05B RVzMvb7ExsfL7k1PWe/ha2/Ty9DQ/mrk6nH6c/fLx8zP6XHtdGrj19PWX0lGPzgwNEfav8hk UWl8Xkw+SO/HwMDJycTaXVdafetjYOLNwsbY6t3b3XFTXtfJydhuaunj9+nV2+pcRURDOjAy P+6+wuxVa+v/UEBDZsq/ws3NydlnXlh932Rg39HMy+dj7ub/bmT3z8fGzNfk6eDgavHW3GJK RkVFOS81Ss28y1pQa3VmTD9M5sW/xcvO1O1pZWx/d37o2cnK0Nnh6/N2V1Zx2cvO3/H77eLc 1M/P4U49Pj06NTVD2L7F3VdZbVRMRkr/y8LBx8rN3mZVW2Fs8d7TysrS1drzbWxbW/nTx8Xa b/Tm6+bj5dvebEY+PT07NDlUzsbPY05mbVZOSlHYwb6/xc3V33Zudm9s+OTYzs7P1d/s7mxd ZXPcztXp7nrk09bc4en8XkI/QDk1NkJ1yczjaF5jXE5KUn3Mw8TKz9jd9Hru+/Hc09LLysvO 1eT7b3b3+d7V1dre7vDl3+Pp6GNIP0BAOzMyQePEx+tYYnVkUUlM7ca+v8bI0N3h+fX9fv/c 0c7Kzdbc5vx2Zmbl18zK3fpvYeTU1uxsX0pGQTwzLzhQz8PSZGP6bVdGQU7Vwr/BxcTI1e9u euzrevfVyMHL2tzk8XxfUFXv1M7O4u/wZl7v329hVEZKTTwyMz77wMjpa3Ph5lRASWfOwcXN zczQ4WRfb3z+4t3MxcfM197m63ZnZHHs3uDr6Ozb1tzd321NRUNCPTMxP3HLyeBceuVcUkVJ +szFxMXJysvkZ2xqZXDx38rHzc7U3ebra2T139HP2u1x9uXo3fpqZlBAQUY8ODtO3MPV/nNy dl5KQEllzsHDycLI4PdrWml1VX3Ty8fO3uPa5/L6burU0cvN19re6d7Y5vhcRT4/Pjk1N0X3 ytD0bf5tXUtGTnnOx8PGw8ja6G5teHJ+383Hw8vd3975Ylxda+bZ2drX1+vzdXvd1eJPQj9C Rj42Ok/bzdZpXuTvYE5IWNPHyMzOz87bb2ZdYvvv5s/Jy8zQ4N/a7P1rZuLa4+NvcOXn7uxj UkxGSUs+NjlK5sbJ3/be5XRNP0Zc2MrHycjM3+lqXF9bVXnYzsvL19zb5+9td+fX09LQ1dbY 3uPX4lxMPzw9OTA1RXbIxc/d0+RtUT9DVuvNxMPAxNPl8VpXVk9s39fKxcbMz+Bla2h45eTc zcjKz+L18uDrZ0k9PT45NTtL7szR5Of9Y1pKRk5z2c3KysjEyt9uU09e+/DYzcXBydnk4+11 bP3dzMvQ4+nf5OpuX15OPz46NDdBUd7J0s/P6WVSR0hUZNzOz8zFxsvWXk5QWVhed9XFw8fM 0NHW4+fy18/X1t3u6/Zs6ftfaEU1Njg9Sk1P3M3O0G1UU1NPVlhx29/dzcnKzeZtf3361MvM xMHHycnP3OB9c3P06Obf43x3Z1peWVlhVzkvMTlETk5Z1sjM2XJi9HZl/G9q18vNx7/DyM14 XHrv3tDQz8fIzdTm3eRgYmxmf/xmaHJbVV9XX+pwXlE3Mz89RVRL7cXb5OJOXOBaXd/vzsTR x7y/w8ne3Nzs3NXYzdTr2tPh7mJUXXtpX15eelVJTFhwXurscOB9TEZLQ0RPSkxvXPxpWfXs 3fRs7M7Nz8jHxMHK0svK1ONvf9vl3dPv5eRhY29TXmVoY0pObH7t729h8vFtXVZUS05UT0xc VEtYWl5lW2by7ePWztjNztDGysvI0szPz8/e1+Xfa1xeVGROS1FTVWhqYvb15N90Wvh3Xulg VGJbXH5YWX1aWn1WU3P8btx35tHP2e/Z3N7d6df51tzV4eneWGhdXVz+XW12cdtp4Nfr7nni 62JZXWBObHVi8Gxb8/pfZmVZbVxVefFh4mhv8Xvg38/Z2dnX5mLd2HruWnfu9+XY7trl79zz YHT9XXd0XWRYX1dYbf9sW2hcb/1f5vR43+rh62Hd8u/k4vvk4nfr8m1+4t31be34aGt7bXLl c3NybXjy8OPybu5rXmxrWm/78/b49+ptfOTr7uFo8P1z73Bu9m9m+G94/GLy3+7o7XHe8Hvp enn87ul7Z3t+c+nseONnZGxcWXTu+O//39x59mlkeuryd/Nt+/n66H766Hj77PXnd27u8210 93j5e/Hu5uvr93H0Y353ZXFv72j6+/lqePl9cXjz72l0+Glw6vJ+eHZp6uP+debvenxq+t/h dfpuderx/u7q+m5q+fBw8W5fcvvs4/lkY/dzaGlmXfrye3Zp7PHu4+Ds5e9ueOf37+Z15OHt bnhnY35iavn7a3h39ODjfHr3fn51/ux7ZHhzb+lpXmf1bm7j63b683zq5mV06X397nlu6+h4 bXr4effw825oaXXs/HNocuR86ezwfnfu5urt7/x3e+Pr7+b2b3j1emxmZmNobWdca2JpZmt1 +33r5ebg2d7n5Xv27/HxdXrv+Pv6+W9tbmd7cmj0ZWhibH55+Xj68fPu4+36+uzv+3Jm+/b3 8Ory+f9q8OhqaWVub3Jzd+zr/fRzaO/seWprauz6fml5/e7s+m1yff769vHwc3Nu9Wt4bF55 bHrt7P7+6OHi3eDc4N/h9OXvdnRlalxobFpYXm9xdl9m8/Xv+3Bt/+vtbV/24vTk5uPp9Pl4 5/f5/G9xZWxxc2x47uV2fv1+4+999/T689zp7et0fuX5YX1pYWv+eH7z/Xdx+2xtemZofu99 dOnu+Grr4u7h4Xdheejg5W1la29+aVx1dPLp7vnx7PnvaO7e6u3y7ep0/N3/aGxjaXNjce12 Z3J7fvtq8f1w52lebW7x7nxheOff6//35fdqbvh8cmz2dHn73+jy+3Li3O9v+v9obnP5+vHq 5vfn7nVoXWFobnxeYWRlbtrwdnP46/X8bG3/cuHt8Pr45fz05/tuffbvamV+7X5pdt3i82Li 3/1r7m3x927y623ybmlqamtrbG17dmjpfft9aOzt8Xv/5t3xePXefOxp3NrrZuVj5/7/6+h8 d35cWF1bXm9a5nb7bHBt8vvvffts5Oje4v3b2N7nZOriYPn/8enyXP9lX2/tdGpmZX7bae14 bNz7dfj2fHBkafzadXds7m1pd/J+X2jg7/N95+DscHnt6O17e2pp8+rm7Hj15PVybW5meGJe 7V1ldnvl+XRn13nr2fLg6+L15Vz9eGZe9mpsY2/j9uh9dGRoX1tsYVhbaHFo+XDg+9jP09zP z8rHzdjKzdDU1NHY5FxMPUE7NjU2NjxATezWzcC7vsHJztH+Y/Zfants5dPVysPFxsPDwsjP 1dnPbFliRTg6OTIyNDY+P0ntyc/Dv8LBys7U6F5oYVdaaPfb3M/IxsK9vb2+wsDDzc3M+VZK ODYzLy0vMDM+R/HXx8e8vcHBxc9/fGxlU15mYFv018zMy8K/wMHBxMXGw8TN1vRYPTYwMC4s MjQ6PmLwy8i/ur7Dx8To8m1eVk9SbWpk187Jxr69vr6+vcTGxL/F0mv7SDAyMC0oLC40OEHb 1MfEtbi8wb/B+Vt19klLXm9Ub87Fxsq6vcHEvsLNzsXBzcjQ4Fw7NTQtKyktLjM5TOHZv7u2 uLvAwc1dal1MSFFeeHnbwr7Bvrm8v8C/ws3Iv8jTxHhMWTguMS0oKi4uOEFLzsHBubK6wMHN 1lxNYV1ITefe2su/u73Bu7rCxsLHzNHJxNzV21FQOC8yLyooLjE5QkzPxb+8uLnEys7YXEhQ XltQ7crKx8K7ur/Fvr7M08zN1tbNztLkXFVENS8uLSwrLzg9RmnJvry+vbnAztHeeFxfbPzd 3s7ExcLAv8HIz9fU2P7t3trW19jY+k5DODUxLjAvMjo+TG/NwL26vLy/zNTg+GxncXf83NfN x8a/wsfJ0tjZ8mtnefRo/O3z+11XST8+Ozk4NztCS1vw18nDwsDGy87X625mbH9r79nV1NPV 09LX2Njl+vfp7XF449rd4N/o729US0ZAPz09P0NLV2R74tnPy8/W3dzX1dPW2dbP09jW3uXd 7P12+/RuZl9od3p+7d3V1NzwaFtTTEdFQEFHRk5YZvbg1dLNysvN0dTW3u/y9O13Z2ZpbG/s 737s5ODc3d3b1tnY2dXR1952WVNPSD49Pj9CSU9acOPTzMrMzMrN1Nzf6mlcWF9sZv7sd+zb 19zi29rX2NTV1dHP19ne6n5dT0hEQD49PUFIUF3839nQysfLz9Lf8XJjXl5mZ2hv6+Ld2dnT 1dHU3NjW1tfa1tLZ2uL0Y09KRENBPz5ARU1cb+vd1c/Q0NLY4Prz/nx29ujq7Onk39/j4OPg 3N3d3Nja2tne3NPV5XNeT0hHR0NAQ0lMUV988+jj29bX2+Hg4ezq6O7v8Ofi39/d3eDc3ePe 3d3b29/b1dbd5e39aFFKSUpLSklGRUdOVlpgbfvo4NvY1tve3NfY1t7p5uXg3+Th29nW293a 2drd4+rf2eDxc2lsZ1RHQkZLSkpIRUpQWF5ibunZ1dHO0NnW1dja3OL25OHq3uDk39va3+Lg 6ePob2dqa25wZm5tePt+blZTVFRYTk5PT1Fdb3H03N3k4+Ld3uPr5eTg5uTf5+Lc1tfZ2t3l 9m97bG34b31y/Pzm8vTpZl5ybl1PTFJaYVtSWnLy8HxkWnfd3eT17trc3Nja3ufp+X/p4ODx c2Vs5ex58Hd83u7u/W3j6W/85nvo4mZub1ZVUktOVltbV1lseHH+aG/e3+nv6tzU1Nbb3+Pa 19vh3tbf7erm5fV2b3ztXE9afHdqY1RSXlpVUlFRTk9d7eXm6/Dm4Nzl597n5t3c5d/b1tLX 2dff8u/28n3//u3j6vtsYFlNUVVZbGlZWF/v+lNRXXD05/Vr8+1we9rc4t5uVWbp39fOzs/Z aFFd69fR4XpgWmtsZd3Z/fVlU1FZc+3i5v3eyG04PUV8urrFWDo4Rte9u8ZrRUJP5MTG2U9L 5M/R4k9NYOnX3WlXWPTUz8jP+VxOW/Tz6GNKTltXXt/MzdxmUV/j2M7UblZMTejO0NZaOTn0 vrS8bEo+Tc3K1ldETkla19XK5lJcaNbIz+RNR2fYwsVxWlNX18fI5ktCR+3N0t9LPlLfx8Ts VU5R7s3PdFNNTnzOytFeTV/yz8vpTkVFVMe9y14/QFrLvcX5TktO6sjK01ZET/7LweRQSUpu ysjZTT9N7sK/4k9ET9zZ2uVXWmr52eH2V01aa9fR7e1e7cvS5l1NUVNe5/Hq3NrLz866ziQh W62frTgoLMSoqcgrJzPUrLL+Ni1GuKqwTi0tSrGqu0EqL3e5sspFPD/Wvb/FSj1KbMjSaVtM XuLUzvRdYFjhz87UW1JTW93T4+hlVlx/1NXo81tj6+nb09brXF5w/vpkVVZZft/zf11j3+Pm 9ltbft7b6H1qbWVm7H5x7t/O2GZnbl93+3b9aVpl8vF+4ex4fXrq3tzgfW5faO5tZlxWa+DT 0u5bWP/Z2v5WT17r1tzifWZ47edscWRcfenkcFtWadPS12dPU/7U1u5eWF312ubvZmtp2crd a0pLbNPK1FZETe3R3GdbVlr31NDkZ1146eXpdWRo5tTP2nJkb+/4cWpcZure2PRv8eXj53Nm Z2BVVG3j3flda+rPzOhpS1rd1s5fQkNOzsXK2k9PZO7L5nlOPmDs1spgVFToytXXe1x+5tTH 1v1NTFzv0s36V1F6+NDRfl5MTnTm8F9PV2Xh1eZmT2zXzslmV+jfzNJnbW9xem1fcHZ/8HxY fuBz6Xxd+15r7/be/VlmZfrN3lpLTd/JyO1VVVvp3uRmWGzl0s/vXFZfc3t9WVdu2tvf4HJz 3d/i4n356fr67ODZ4nVnYXzh6W1sbGf6fmNVUG7o/V9JRk9o9l5WU1ve2N3e5c/O087Rz83N zMjFxMrZ59DJydHc1t0vHB4jMsXMTMa3sazSNTpCW9RKP8i1r6y/3L/N+lc7SM2/ubzNxb2/ wcjLwlweEhcfSK2747asqKxfJyUuP8O6yr+3ua6yzNtqRkZFQ3bDvLSvtrm91tTN08NJGxEV IuKqr8+5qaWpXiAcJDq6rbKvra6ttmI5Mi46ZOHHvcTBuLWyueBNTtq3slYfFBMg1ayuv8mw pKleIxseOrKoqqyvr7G/Ti8qLz/mxcvTxbu3tbW+0tfOv66wPx4SER/Vq625v66iqz8dFxw8 q6Gmqq2trdwuJycuecDKxMLJu7W8t7HC2tjYtKxbJRcRHNWsrrLFvqWrOBwWGTumnqOrsbS1 WSglKji/tcK9u762sr27tMbt1cy0rNsqGRIbT6+vttDMq681GxYbQaOcn6u2t7xHJyUvVrOv w8i9vbq6yse3wXjwxa+s2ikYEBtSsKyy1sKptC8bFx7Ynpufrbu3vTwjIjDUrrDQ78e8usPX zLu+3Na7rKt4IhIPH76pqrl2vKe/JhcWJK2YmqO2z73FNSEgMrqpsdlc1Laxv87Fvr7K17mq r00fEA8lt6iqv1i2qO0gFhYspZicqcTYus8vIylPs6u+U/G+tbbAyby5yeXIsquzOhgOFD2p oqvreK2sPRwTGVqcmaC4WNW5WCgkL9essFxG1bqyuMjDtbvXzripqN4gDw4hsKGluVW+qMof FBMlp5abq9RTyr88JitHuqy/SFfCtLC6xb24x3nWtKatOhsODyyqpKm8ZLOmUBwUFjWdlZ2v 6Fy/xjElL2q2r9o9Zry2t8DLvrvZbb6qprMzFw0TOaqhqMLNra8zGRIZV5yXnrVUXMVeLSg0 0a+zfkf2vLG3wMS+v9Xbu6mksi4YDhI6qKSpuciurjEYEhlPm5aguVpWz1EpJDPMra7bR9W3 sra/xLq50tK3qqS2LBYNEjiqpKe4zK+xLBYSGm2alZ6yb1nQUSgkPrysrnM94bq5u7/Iubnc 6b2spLEvGQ4QL62lprDHsK4xGBMZQZyWna3VW91JKCQ2vqqqyUJUyLq7wcG5tsfcvayotDAW DREtrqGmuMaxsjQZEhhGnJSbrdxl4EcpIzS8qKvLQU7Dub/DwLmywOjCraq0QRoNECe4oaO4 zbKyOxwSFjudlJmp12DmQicjNMKpq80/TMq+wMS9s7PH+cWtp645Gg8RKrGjp7XEsq4+GxMY PZ6Vm6zOXGw/JyEvxaqqw0VL0sDCw7uzs7/bx62nskAdDxAmvaajr8y1sD0dFRYvoZaZpcRa dkInJDPMqqfGQk/exr7Gvq+wxeLauKmvRyITEB/draeswbyxTyAYGSqrmJmitu9kQiomMd+u qbxMT+rPwcW/srHC5eS/ravYJhQOG+KnpK3Ix6/HJhcUIbOYlp+44vpKLCIq+auksGpJ7MfH zMGyr7zhd8KtrO8mFxAbUq6prb/IscknGRcgwpuYnq/OZ0ouIylbrqev4Ex+zMzVzLaut899 yq6puzAbEBQtvKmos8GztjQcFxs/oJebpbvfWDMlJTe+qKnCUkxo2Nnau6yvvtLzvq2zXisY DxxHsqSpyMywzysdFh+4mZeer1xSSisiLFeupLBXSF/lz9fQsaq3yNDKr6zhKhoQFz+zqam4 0LW9LBwYHeOalpyozElPLyAmQremqt4/Ue/Oyte9rK+/zNS6rbhBIxQRJNespq7OvrFNJBoY KamYmaG5UU06JCIv2qqlt1RPbNrO2ceuq7fI2sOyr98uHxMZN8OrqLLSucEuIBobQ6GanajP REQuJClAuKepyFRg/tTQzraqrrrP5LituEIlFRIlXLCmr9O/tEYkGxcorJqZn7RtYz0nJi/o q6W0+lZc387bxa2sucj61bW3XTAiFhoz9a+ossy8yDEmHR0+p5ydpsRPSjAnLkG/qqrA8nFf 19Diva2wvMLaxbTHPSUXFCVjr6WvyL21UyodGSmunJqfteL9PCYkK0uuqLXeX1fmzuzJrayz us/PsrReMSEVGTBOsam5y7S/NigcHD6qnp2ku89+MScqNcerqrnR6G/f7Pm9rq+4wcy5ss4z JRoVIjvJqKm4vbhMLCEaJcWinJ2qyec/JyQrR7SnrcPM2+HU9dezrbK2v8C1vEssHhMYL+yq prXJt8czJBkaPKmcm6G2x+wvJCUv3K2qtsbN2N/69ryusbW/zrewyT4nFxMmQrins824sFst HBclv6Gcn664vUopIyU6tamuucLJx+lL37mysrvJuK+8RisbEh024amquLet0TIhFx1HrJ6c pK605ywjJCv+r62wtr/N3GDou7a2uL65s75MLR8VGSo/sqevubO9PyscGiu/opudp66+PSkm Jzu9sK6wvdDbamy/u7u3wMW3vE8xJRkZKTnIq7K7tLlQMiEcKP6sn5+nrLRaLSgmMsu1r6+2 vcfiVdrEvrvBvrS36zkmFxckNL6psbiusdk5HhkiSa6enqWnrdc1Jh8qS8WvrLK1u+JObc/A ub6/tri+Yy8fFxwoS7GvtLOtt3ErHBwq2KifoqWosVctIyIvZruura60v95d383Jwb22tLrv OigaGSIvxa2vtLC10z0iGyE6uKShpaasxz4qISg8zbGtra61xd7n3NXJx723vdNHLyEbHihC uK6wsrK8ajIgHipSr6OjqKu15zopJCxEw7Gur7O3ws7P39bGxby0w1FDJxodJS/Esry2rrnK QyIeKDm/qKipp6zDUy8mLThduq+urbG/xcfr4s/fybfA5lgtHRsfKV+3vbevsLfSLR8iLnWu qqqnqa/HOignLj/MurSurrO5w9Xb1dHPw7vaUD8jGx8lM8C6vrKxu8FEJiIpPL6rq6mnr718 MCgsM1e9trGtr7e7yfPq29e9usv2SSweHiArbb+8tbGyt+ssIiQubbStq6ipr8E/KyouPtS9 ta6tr7W82WJocNC9wmtLNyQfIyY3zcS8srO7xzwpKC1Bvq6sqKistuw0KiwxSs69s66usLbD 4/7q0cjE4Uk/Kh8gJC36v7+2sre89i4nKTFytq+tqauvvE0vLC88bMi7sq2tr7nQ6vvsx8Da UUEuIyIkKD3qzbqztLnMOi0tL0TKuLCrq62z0D4vLjRG8si7sq6tsb3O5+/NwM1XQTYoIiMk L1/PvLOytbtpNi4uNmbDu7GtrrC6ZDozMDxR+Me4sa+ut8fQ4M6+weBFOSskJCQoOFXNta+x tL5UOjIvOljRvbWwsLG8c0M6OT9JY8u6tK+vuMHFysbBz1ZCNSgiIyMrPlTNtK+ur75eRDs4 Qk5R7Mm9trO912tLTV9q9dLCu7S3wMjMxbu6xHVJNCglIyIqMTlhv7Wvr7rL3l5QUEhDSWjU wLu/w8bMzc7T2dPNxcLR+P/nzb67v9JwRjErKCQnLC46Ws+8srO2t7q9wNRYR0RFSmh359TN x7++v8HGy8rWcWVbaNDHwsLJ2VE7MSwqKywtMTtW08K7uLSysLO9z2JMREZLRkpb587Dv8G/ w8rN1epxduzbzMnMyszoSDkxLS4uLC40PljOwr65tLGxuMXnW1FPWlhQXOLMxL/FycrOzdHp YmNq7tzW1dPU3l9BODIxMzEvMjhK68m/vbu4tLW9yN9/amJuZlxabN/Z1tjX19fNy87U2eXf 1NfV09z+Uj44NDI1MzEzOUnvzMbDwL24t7rC19rb2dxxXVhe6tjY2tHNzMbI0N/w/uXp9ujm 8XdPPTc0NDUzNDU9VNjKyMbBvLW0u8XQ2NrW7lNNT1lsdm/y28/HxMvR1tbWz8/c4uTnb0g7 NjQ3NjQ0OUJW49LOyL25uLm+xcfR3eJnT09YX23r5drOx7/BzN/s7ufd+nRxXl9PPTc1NTg2 NjlAU/TPycS+ubW1usHN2OjpY0tITVZt4unmz83Mxs3e39zg39vy7epuVUM5NTU3ODc6P07l y8TBvbu5t7jC3OpoXFpKR0tSYurc3tPJxcHEz9fV2djZ4OzsbFI9NDMyNTY1Nz1R3MnFv7y5 t7i8xNHffFpYVkhNX/3f1dXOxsW/v8nQ1dbQztfya1NDNS8tKy8vMTtO2MC6urq2t7W3v9Fi VE5NUE1SYezPyMfPyMDCvsPN0djTz9tpU0c7LioqKS4vNUJ0wriztLi2t7m/znpSUE5WUldj 7s/R2dLRy8nEvsDGy8vFxcrrUEEwKikoKi4yPF3HuLGzubq+xcrrT0VGTV/x7NbNzMXG0eTf z8q/wMnIxr+8wNhVRTMqJiQlLC83ZMK0ra63u8DO1upPTU9UZ87IysLFy83hXl191MW/xsnG vre6yl9FMiglIiQqLjhkvrCsr7q+w9XsV0NDT2TbyMrHwsDI3nVfZuXTxL+/v7+8t7jA6Egz KCQhIyksM1e+sq2uucLM52lOQEJRbNa/vr++xc/aYlFYatvAur2/wL24ushlSzYoJSIkKy86 bLyxrK27yd5WTEhBRlrqzL26u7zE2XZUSk1g2r+5uby/vLa5zFhBNiolIyEqND/vvbCsrLrW bEtISD8+Td/Fu7e7vcDZb1dMT/rNvrS2ubm8ubnKWD0xKSIiIigzPuG5rqytud1VQDo9PkZn zL22sLW6v99TS0VLbtS+srS5ur66ucJcPDIpIyEhJjNB3ritq6u10F4/Nzk6PFbOv7ixtbzC 7kpCQEZf076ysLW2urm2ve5ANiskISAjLz1mvK6qqrLSUD42OT09U8e5s66yvMHrST89QV3W w7iztbe7v7y+0Uk4LiUhIiMtPU/Brqqqr8hVPzY1Oz1OzLu1sbO5wdhLPD1DXM+/ta+wt73D wr3FWjw2KyQiIig3Rty1rayuvlI+NzM4Pkbmu7KvrrW+0k0/P0FUzb62r6+1u8LIvsNfPTUs JiEgJC9D/ruvq6qw1kY6NDc/Rm/AtK6utcPZXEE8O0bxxLq0r7G5vsXDwc1UOzQqIiEjKTtQ 2Lasq629TTs3NDpET9K4sK6vutHqSzw9RFjLurOvsLm8v83GzWI/OS0lIiImNErvvLCsrLZi PjczOENM67yyra65zv9LOztAUtC7tK+us7u9yMfD4Ek6NCojICIrQFvKtq6ts81BNTAzP0tm v7GtrbLB8FhCOz5K5761r62vusDLzcXNUDg0LCQiIyg8WNK4rq2vvUk2MjA7Tl/NtK2tr73r WEU6PUhewrWyrq60vMLPyMtaPTctJSMjJjVOab2vrq66Uzo2MjhNYs+2rayut85pSzs6QlnO ubSwrrO+y9TJvsxPOjQoHyAiKT9fybKtrK/JPzg1ND9VcsCvra60yHdaRDk8TOi/trOvsLrB yMzCxG0/NSoiICMmN03hsqmprLtOOjYyNUNF7rmxr7G73XhNOjxIasa4tK+ut769wr2+100/ MCMeICIuPUy/raursu0/PDUzPD5WvrGvr7bG0exEP0pd07+5tK+2v8TGv7zLUj0yJx8gISg7 R86vqamtvldBOjU5Oj77vre2tsDP0mtKTVrtxLmyr7S9wMC9u8VfPjcrIyMgJi87bbutrKy4 3lpBOTs8P07SwLezur7A0m5fW2fPv7u3u8XFwr++xf5JOCkiIyInLjVTu62qqrPEzm9KQDs5 Q+3Xzb6/w7zK6OLw683Avrq8zczFwL3Hd0s4KicmIygsMUy/sq+tsLe7yO5XS0BDS0hQ7OrV w8rKwsHGvrq7u8PW09DOzdtZSzksLSwsLS0wQdXAu7m9vLm8xdXzVk9KPjs/SFTf1cq9uLGs rbC0vc7a3fNaTEk/Mi0uMDEuLjE9X9nT1s7Buba2uLvByNRZQjo2O0JJU9i9sqyqrK60vcrf W09EOjk2LzE0NDY1NTtNVFlz/tO/t7SysbW4u8ttSjo0Njk8UNvJuLGxs7i/xMnZ+F5OSlBM Pjs8PkE8NzU6PkBGSE/0yLmxsbOxs7q/1lVDPT4+Qk9f5s3Gw8THxsXL0Nnq6tvY9FpOS0tD Pjo2ODk4ODtAU9/Nwb27ubrBytT0Z2FgaubWy8fDwMG/xMvO3O/m73RraFROTElHPzs5Nzk6 Oz5CTHXYzcPCxMLFzt/m/nr66tjRycbKyMXFwsjW09Xh3eXu7OTlaFlNR0E7OTU0Nzk7QEtg 39LKxcXFydPc49jQ1tbMysvGxMnMzM7T39/f5/P+c2/q8GpcTk1JPjs6ODo9P0ROZNvQzMnL zc3S19PV09HUzMnNzMzS3d3h72pk7Hl63OX17/fv721dU0lERT8+P0BHTU5YZfvb2dXOztDP zs7O0tTMztHM0dzY4N/o+fdyb3f+b2pjV1hWT1ZUV2ZeWFlOTE9UXWBfX/r39Nfc29LV0dbv 5NnZ19nc5d/W1Nva0Nz66mln/V5ZWFVZXFxaYmNgb1xVUU9bXFRcXlp16+nt6N3U09LO3d3S 1dbR1tjS2NzY5u95W1hXVlVfXl9dVnNqX3JaXWtZVFtZVFxoXXvs8Nzf1dHVz9nq6Obi4dzc 2Nnf2d306eluaFlWZGRs+GZ17/l0YGNvblVPTkxUW1VeWl3h3eTc2d/X0eXr4+7f1+ze2Nnb 5ezs7+Xn6+Xr59jU2NzmY0xFR0U+Ozo+QkxWXfvTx8HJzsjLzMvd3tnp2N565+bi3Nvb18/W 3drg297ycVdGPDw+OzY0OT5IY+LbzsG7uLm+xMPH13FXUmJqXVhc7NDGyM/Jy83Ky87Q5XRi QzY0NjYzLi02SGPz4s2+ta+yub6/vcPnT0hOUlFPS1rPwsLAvr27vsnO0upfTTouLjAyLikr OFTz48++t6+sr7jAwcDPWkhJSkxTS0/4zb6+vrq5ubzJzc7vUj4vKi0uLysnL1Du5NjFtK6s rba/w7/IUjw9S1ZIRUztysXBvrq3tbvJy8bN7kU0LiwuLionKzp571/Stq2tr7O4u77J/kdD SUVCRE1t18zBvLmys7u+wMXD5kc7LiouLConJzdfWmfIt62tsbO5v7zPSj9BTEU4P2/az8jE u7Gtsb2+u77KZUk9LikrKygoKzdMWs67tq2sr7O7w81YRkM7PkA9TnDjxsK/tbKzs7i7v8jM cUg6LiotKygpLTtKWc++ta2wsbK4wNlbT0c7OjxGXmrqxr68trOvsri6v8XKX0Q4KyksKSUn Lz5GYsm5r62vr7C4v9pdVD84OjpBSkvxzL65urGwtba8vb3VY0o0LC0sKSYqMztM7Me0rq+u rbK6xfhWSjs6Oj0/P13ez8C+trCzsrS3u8vYWDctLS8oIykuND1N2LqvsK2orbO6wsdPPUA8 Ozk7TGrdzsS3trays7nCysl6OC8vLiklKjA2OUXQvLqzra2vtLi5ymVTT0c8PUJEWe3Pwry2 t7W1vc7RZTs4MS0sKCwuMTtD4svBtK+tra+xt8DI3lJGQz8+QE5UbtbHvLy9vb3LVVFEOjIs Ly0uNDtOWtzAubixrrC0t7vCzH9aV0pFTU5e4dXNwsfKxWFMTTszLy8vLy82Q0Zizb23trKv rrS2tb/KznhbSktTTU5f4unLx8TJX/FqOjQ0LywsLjY6O2bUyr+2sbCwsq+2u7vDz+X+d1dM Um1eXd7e5mdrcEo9OTcyMTE1OTtIYN3Pxry5uLi3uLq6v77Dy8PM2N3c42Xo7k9ITkk9NTc0 Ly8yOzo9WNfXy767u7u4ub6/vsbKzs7JztLNx8/Ly9lqVU5ANDAvLCwsNDg6TenVxru2s7a1 tbu9v8PN3N/Z3vTMzdbKz9rwbVJENTYvLCwtMzI6SGfiyLu2tbOvs7a4uL3G0M3aYdfeddlv e2lUTEE6OjMxMDM2OD9BSm3YxcC+ubO3tLO6u7y9vczJxOLP21BKTEI3NjMyMTI6PDdKb1zj 2M/ExL+9xsW8wsXAwsHCvMHFvs3ea04+NTUvLi4vOzpEeXrewbzAvLzBwsfKzt3UzeXYvsvL v9Pq5Fo/OjUxMC40OzxO997Pv7+8t728v8jJ0dnM1/zEzefByl5cW0E4ODMvLzQ9P0pq0sa/ uri9vby/zdPb18Z9zr7bzsLnS1dLOTYyLzI1N0NOWc/Dvbu3ube6w8XM193SX3TN3NvZdElP Rzk3NTI2OztK69zLvLu4uLy5vMjNx9be3uvS3/nd9UlERzcvLzAyNTlCctjJu7O0t7Ozub/I ycnWZ/nP4G3m7ks9PzcxLi0xMzY+ccvFvLSwtbi5usDR08bM5tHBxdDYY0pDPDIuLSwuMzhC a9PEuLW0s7W6vMHQzMTe4cfEys7XVkhBNzEuKy0zNzpP1cq/uba1uL2/ws7VyczXzcrIx89t TElANjEuLzU8PUjux7y6uri2vcHE0ezQ0Hjf1dXU3F1EQj82MzIvNUJLYNvIubK0ubW5wsnl d93O5+/e2MnI8kI8PDczLiouO0hT5Mq6r6+1tbe9vMl098vT7dzm1srdRjc2NDMxKio1SWrd 0cKxra+3vcC9vtZffdLOztXXy8PVRzUyMTQvKSw1TNjMzMG0ra+3x9nLzOlgcdvKvcPMxcLP UTgvLi4tKywzS9G/vLqyrq+1wu99d19ZVWfZw7y8vcLNWzszLSwsKiwzRt6+trKvrq6zv91d TkpNTFztzby5uLa8y1c4LywpKSgqMUjVurGvrq6vuMpnSkFDS1Br0sK4sLGyt8hpPi8rKCgp KzBFzLivra+xtbvLWD04OD9JVNrDvLGur7C3yVY3KykoKCksNFbAsaurra+1wNdOOjQyOUdZ 1sC5sqytrbC/cz8tJiUmJysuPN65ramqr7a6yGZDNjIzPEpk2sK0rqyrrrK60EozJyMlJysv N0zHs6yqrK+3wc1OOTMuMj1MbMm9tq2srbC6v8t7RjInJCYpLzQ4S8+4ramssLa9yP1ANC8x OlDZzMbBurGvs7zG0tXdYz4tJicsMTQyOE3IsaqqrrO1t73yOCwsL0RufOXUxLavs7m+yMO/ yNhrRDQtLC0vLy0xQN68sa6xsbK2vN9CNjIzPkZJX/bQu7e5vcLBuba4vcPL0mo2KiclKSsp Kzn1t6mmqqyus7vWQTMvLzdHSk9v07y0tLm9vrq0usrsVFt2Sy4kIyYtNTAxQ8Gtpaaus7O1 vO06LjU8SVNEQ2jAuLW6yszExs/tUEtp39rOy9pNODk6OzouLDVL2MC+xbyvrK+86k1TU0o8 NTZC9N7a19vKu7i/z+XlzcjS2tHIvb/pNi0wLzItKCxIyL66ubWrqKq3z1NPTj0vLTE5SVVX 4L23trrIzsDAz+5bT/Pd6NvOz8/TSDc+PTQuKys7a+/WvrSsqay4wtZfSTowMTc/TWXdwrW0 ur/FycjXTkdJV2dpaunKxsjX62tOREQ8NDY5Oj9JT3vUycC/yM/Hzdvh4t3X0dLV0c/O0tfb 2tz2XVVZXFZNTVJcaPv04d3w4N7n8GxbVl1bV1dSWnzq/GtgXm53cG5qbd/S2+PUysjM2Ox6 dmpeVk9SYnb99erp49zW1dbW3OX0cmNUTUpNU11mfPfq2M/Kztrd5PFxaVVPUllcXl1fcnLz 8m9laPt9anF5+/Xu7/37+OHf4uTd1tLT2+n19PZ6ZmVjaGpz7unt7vVyam/6fWBaW1ZYWVFW WFtma2xp6OPo3tvV0tTa5e7p5vB9bXX18/X7+vf9fvpnXWFraXH7ePPx7+nqf19u9/307/pt 9e93fmtjcOr2bGdjXWZjXWlv7Oz17t/T3N7b3+Pk3+ltaG1oY19n+/Ltd2Zj/vT2633/8O76 evjr6ezn6+PffmtyW1NbW1dcaX/q7+3a193u+35qbW1jXV5yf/Ps6t3c5ur49Ozo5ur26ePg 3+pubfttbWVhZWJcYmxna2185+rw5u9ud/r9c2NeZmhsfPjy3+Dk5n748Plwbnb87fjt6PLk 5uz3cPr0/XVmYmdoanF7bWNpanfq/Xvs+3jl6uvh397g6vX2/WxpZ2Vga3x2bmhpZ2Vsam9x bm/47OPf6u715uPm4Of3+Pp7b2JqfP51fvf45uHp+/p27/RnYF1dX2p3anH37OPm6ODn5fpt d/JtbXnxbW9zfXj8d3tfZmlyfWxv7OLm7eTd3dzg4+l1cnlrZFxmY2JhZ2xvdO/04/7w2t/t 8el6bV9n5fNpbXl8dG/sa1rg3e73/+vh7Wr6aGpgZmBYUHdq5Nva1dDT2N3ec2BaU1xWXlxl aeL89u/j/NjU1tvd5vf2b/VrZ2JdbXr772tdXGdjZ19abfVraml4dWn38evt5ubd8ezk5u3k 39jlTVnva29q5+jt6PvVcXBvdutfVVvv/urp6ePo4N9+6O/0aVlhanluYXFkXHhkZmJo/PVq 39/e2Oz9cf5zdOft3Orj/XZj7GZ3Y3df92fmcvHo9X5ud2bv7OVo8eLYZOJj7l/t/ttv8G9y c3tpWlxWZGL5X9/y3+zbZdxe5nHbbNh1+nr0eXty+95qamnd6/f+7fBzXet4dXx6X+Fq7GB1 62Frc+9oZf1n8Pd2bWfn8Ot/8vr093n18Wl56Hnocuv+6nvqZufubuLlc2rh8u1reXbpWPdY WF1jWGHf+flk7dDxY3D73uZs3tXbd+zr7d54Yf5i4n18XPBYZGxm+mFX6P5f2ubVXtPz02F0 8tdyc2bb8G10+979XFrj+Vb4Vv7efOHcXe3vdF9sXvv1Wu7n33Zre9r38fXa4XReYvBkdVVs 5+Rt6F3Z1+bne3v4/FL+cPhqYmLXb/N4cGnYZP1jeOPeXv/L8fRcbHP5ZlT/+fH4XPTZ3fJq 5tr1X1xg32hnVtXSY19c3ej0Stffz090293eWM9z1GHNVdtqdPRcY1nlXO9V1G5hW/3P+mRU 2eNdT1jOd01k3Nxzbu3b6+t219prU+bi3WxP4NFm5X3S2txb69TsX13raGhXZHHoTllZ8l5l Xl3+7GjlcdrT4G/s5+LzYvzv2vj0ftXdX17rdfH6YPP5/2hqcV9dUU/nX3dl6d3o5tfi589q bWnr5GtUb9na8mrZ431p3X55T+h1emBj217eTNr1Z1xZc19+Xvjt937m6fnpce91+WLr2GRs 49bX4V7Q315YXe/jYk5r3uHjXuTe2WdP81/vS01s7Hpm7M3J3uXd2OplbH1yZk5qbWZd9+ng X1jvfddTcH/q1PRs4udaemZ1fV5eY3zue+7vb9h5fPfc3HXd4eVwbV793uluXWrs32Ro5dfz dl1idE5dZWRcWnnl52du4uZ17uLn3vDubu3c8dzh+XHi6GBuWHtpZGdZ52vpY3LheO7g1Xbq ZXP4X+Zr9W199+XkfPbr2u7oZ2//8WtaZ2hxW2d3fvj8+vFx7O39/W3e92h89vJmYG7za2Br 5Nvp9+rZ3/Zk3tZ9Ym/n03pubN7vaGFZ7HTuXnVfZnNd8mZmWVnv6fVlYejf9W9u6unn+N/a 3d3x7s/he1lTcmBdW1luZWdZZd/23fPY2+HU9+Tv2vh14VpmVV/o7t1sbXp0+GxmXFxvb3hq Xt3n6XNs2/XsdmPu5ujx72164+j73Oh7a1tgWG9qY3Rl5Gbh1ePYd+Z67fVl6/dkZvDo+Wxy 6u3xbHzmZ3xv92hgeWHa4Oju7N/861h6+nncX3J+4fLx6PbhdWNbXlhUX3FlYmjs0djh593b 6+Pf53vp3nFoZG/4ZWZaZOzq8XJ79vT1aXh5a+bo5XV+6HDxdmRkWfR+a2lr3eDoZ/bX7fdp dO35ZGdudfP8eO/n/ffh7utna/X8XlhZceTvYV9x5N3i9X7i7dXbdO3p5/l2ZG/pbFRVYHbx Zlpof3R8Y2rz7fZubXfvae/f/f3q2tHd9+Xk3etyXVlmaHRtZe1rd3xrdXZ5/u/p7+Z+8tzt dV/tfW1eZ9jm62Nl7vtgXFxha2xue/Tj6ebpeurf7XppZmt3ePPn7Hnt2+Dj93bv6fFfaujz YGNi6eleY2jl3+9z4t/zemNoaW1kav5z53lq7/H2/Hh05/3tdu7ccv5x7vFjXFzu7GdVXOTY 7F5i3N3ld2r34+B4fu7U3mpmbPF8am1uZ2929vJub2N7eu3rZG/s3/Zu7+Pl9V/v8uv7Yfx8 6e7z9Ph9aXJccGlmY1txdPBfWv7p6Wl4fubj6ers4f7r7uTn+/zs6+z+e/nu4nB7YW1z9e5v 6Pji9GlsWVdVYWpWVnDi2dx96Nr2bW33b19YYXV6bmrc29fbcOTi3Plr6efb6Glve/L7aW12 6ntdXXl4emf+52tgX3P03+ny6/hsdfHr9PJzX2ru8Xd3b/xtbXh/e/L+afr7+mtpcu14bPbj 9P7u7eDj5fPf6e7tbGph/ut+fHl89enuffTm9HReYff0b1tuZGdkWmZpevZncOrt7Ojv4eJv aW5tX2VmbGv06v7m3tvg6fHf4fXs+Nzse+nf4XX47uxjWXR882BbXFvq/FpOVfvo72vt5Ohr XGLv3H15Z37l8+vt4OB9ZvTq8/Xq+HZkZvTh72RqdurvaFb93uTk7vbz293u8ffj4XlvaV1l bH9qZWp472Vgcfx3XWBsYvzm69zjfdzc73ru3+169Hr0bXL9+OpvcG1lYmJ2d/L62t3z9/nU 53Z89+tmaXBobGBpZ25rYW975d96bt/u5Wxg5+/oavh47nlf7XH/YWF05t9zfnX1fvvu8e3l 3/x4b9/ddXN36W56dm9ffPRbaHrtfGldbu9nfXzucmr45OteamXy7fv86eDu7efz+fPr6HV1 69zj6v79b1tvbHVtXXRvanHy6HtfX3Pl7fT+++/qf2ju6nlhYF/p8GX39uj0+vdzenfv4d3q 993X6nps7P5qXWL9b2ZzY2xmbO1yc3h46vz26vf7ffV6bnT4+epvaPjq+GVueOr6fft28eni 6/l5ZXFy4eJpYG3e5WVdbd3tZXbj6Xzj7HVxb+v3Y1tid3z9aXB+6+j1c374f+t9YGL36ejw c/d26/5qevvu5PTs5u/9amRwc2NbXV9t/3BxfO7k7mTy29ba2Nfc3ejX6WJeaHZnYl1daGdc ZWrp5fT78v1rcnBvb3trbGt9/ubl7ePn+e3m6Htkc21lYmZqavfm535t59nb29/o5+LocW9n Z2NfXl9iaPd6c/7u6f1zfXV5+mxoaPbsfWxraHP46v5q/Ofa3Ozo1dfmcP7r73JtYVxcX35q XFhjaHFsWV5eb+be19na1NPke/n67m9p6urtb2tvamRebXJm7+7+cXN8/Pfy9W5z5trwb/fc 2+5vam9mYldYXGZ48Nzc4ujc2ef/Y2hwaXBfW1JdY1148NjR0NHX6mxmXV1SUl1t5d/c3+He 4+fg19x+ZmxqY21meuLn29ji5H1oX11bWVxdXFtcY/no7tzj3Nbe5GVZZvttX3D+bvft3ud2 bvHgfmxoamxeaWpgdfbi4vLi3eP4fe9sc/Pv9eze5uDyefXk3+1sf+x4W1RXXFxcb/Ho6uPf 9P7zevN2ZWFjfP7uefzi4Od8fOfq+mxjY2FxZ2dnZfHs/GtgX25tYVxtemx3+drTzsvMzdLV 3HRgVlZfa3FgX215bvd+5NXX1dre43ppV0xJSlJTVFBWZHBz/uze2dHNzdPq7e5sWFNXWVdV W3b/5trd29nX1dvj4NzfZ15fZXBfVlZefHju7dvS19LT1tvr6Ohxa11fYFVYWFxZUk5SXFtY XG/d09rRzs7W29jscmhmalteav50anzx5ujp4tzl5Ol5a3h3ZGVVT1Rm++7s8OPV193l6eLk +mloa2JdZW1gZnzz/W/16ujy6t/h5mxjYF5ma/Hy/Org7mliX2hvYmZ1fPf25t/l5evu9uzr /H9u9+fl/vHe4Obv+nRveP1ubXJ6b11ZY2hcXGdoZmvv6Xt89Ofi3+To7P7x8n9rY2V283py e/l46+x8+O/o9Xp2aGhjZWxpcfHc2t/v59LW4e/r3uX+c2deXm93Zmtmbf/ybF5s/HxkbHv6 9Hl1dG3w83NwdG5vZ2Nocnj3dvvp4+T0cW1lbu/z6+bn5N3Uzs/S1tzk7PFtX19mXFtZXmNe Yl1jXF5s7Ot+7NvU3OLd4t7a4/V0ZGNeU05TXm95bWBofvDvfXd5/PN9dmxycWpwZ3Tp3+Du 6uHZ1tfa3+rv8vhsaGluam1vbnFublxbX2FmdvLp7O7k5un+/Ojf5u7q5X5wc2NhcPp5aGr3 +3JlY15bV1liYWFg9eXj4NzX29ze3ujt6up7Z2xnZGNeXWVodvfw7Ove2djY297o6urm3N75 e3toX1pWXGT8+GhhZmNsZV9w+vzk4vLq4O1u/mtbY2dpZ275effr9PRv+uPi6/b6dnl1cXJs fefd2+He2+Pm9m5qcv1xZFtf8+Tm+n/u7uzsem73dmdhZmp88W1scO3m+fZ6a2VhYlxgcnNr Y2FqZ25tdu3m4u/66vD3f/Z4cenk39vd3vHq4fFuYGFdXGtvfe7m6O7+8/L37ubk6O7x+nT4 8314c2Rldf72dW1pZmtmaXpxa3J5cWhkfXt0Y2Z65tzl5+bi3N7s7+3s6t/p8Ojp8WxjZGVn Z19dWWn1fW575ebucn3i3Nzj8353b2dmbm/56eLf3tjX2+Do+3P0dWFbYXhsZV9q+WtlaGxo ZnpkW11jfPTp4+vi3t3g/v3t39ze3d/b2d33cGtfXl1aXF9fY2Nlamd5+vT6cfvp83v5+XNs an/zfX52fPPt7t/d3d3f3N7i8Pzv6eZ9ZVxXW11cW2J/9XV7+3x1dG9pZ3N8bGhqeH78/fjx 7+rf4Ozi2Nnj7O3s9HBjXFpYWFpXV1xue2xt8d7d29XX2Nvm5un1dv9zevhva2NqaG19fndz bGZiZWxwcW9tY2Nqb2959f53+O3j5+vc4+3r6uzq3uTr6+Lual5YWV5gY2p+ff7tfvrp6f5g XV5kbnxxe+rp4+jv5d3gffzs5ur3fXh8d/j3a2BgZXF6a3H67f138fH47/VvamV6fmpteujt 9unx8ufz9/3zfPru9ujk4efn7WxsYWdydWljcvhy++b6+/57bG5rZWxrdvrs4Obq5+z2eXJm amppbm5ta3f2fnNxcXnw8Xd3//3q5eXm49/m7fh58Ozyc23u6OrtcnB3dnJzb2lvfHt1dPbv 5ux9/n1vZmBjbG1ze3Lv5uPs+mpobV5cX2zp4Ob1+uzv9nn/cXXv6/lv79/l9u/x/v51dnP5 8vbxff38dm1kcPT/bXx7ffx09+Xf3t7e+/nm7XVjaWpoY2r4+33o5+71amFeWVlfZG5wduzd 2dre5+ru6vF/9Ojh8XH+bmZoam1oa3d2bmJp7/N+9u/+c3RubH3u39/sev/r7vL78/L183pz d3hubGZt+P1+b3BscvxvYmlsbHHu9Xf38PZ+f/t0cP5wXl5qaGn46ufe2tva2+Dl3+zyfn33 9/5qbW9yYmBcV19pbGVz8/bm4er5/Or5+3lqdnF5dHJwc/f4bGz8++7l7PHh5PXv8fD8/2lb XmdrZGF56+Hj5+bl6uzk7nx59O/r6ezq4ebt6un9dvpzaGFgYVxeYV9iXlpdaGVfb3ny5Nze 6ePY3vp3bGxvbnrr4t/o7PXu4d3g7Ony7eXh6Ht2b2RubGNqaGRaXWNjZWpuevn07ebl49zf 6Onp6e/7eGtoaGBdZGdv9nJrc/j5+3x1aGdxdXR8+HZ0/nRseO7t8vx6/vx+7urq7u/k3d7b 4ebs+fz+ff//7u3zfP3+dXt2dmtqbWNdX2NiYGFfanx6dPXi3OHm7Pr5/XVvfft/Z2BeXWRp a2tobnv+cXbu6+vd3drY2Nvd39/b3urt93z97/RkantzevT2eu36b2tqcXFucXBtdm9tb3J0 bGNiaWZbV1tpefHm7Ofp9Pj19nFpaGJgaWtv+ujl6+Lc4d/a2Nzi6nrv7vjz6uru5ez56+ru f/9sYG9va3Rua2lgWlZZZGhfZm1pcvDwdHb+/v9tZHD9fXx/9e7o7fX67+Xp8XZuaXh9bf7n 4+rs8Xz37/p8emxs+/r78uXd3OX66u/s6vTyb2lkY2lkcm1scW/4e2xu/e35f/5vY2p8b3vx 8nhz+np9+3puam5lbvZ9ffnm6Pfn5+bk7vp7enBwb2z77enq5OHn6u39fvTw/2xoaWxx7/d2 eOLg7PhrefPyeGZra290bWdmcW1nX2BoYmFtbm938+Xp7uXld2Bt+/btfn/n5ODg5+np3eLq 7Pj45up+dWlv/3BgY2FmcGJcYnT9fn397+3o5fH69O/49Pj0/3T79vX49HdqZ2hoZmZcWl1f anR0b37w7erl5O3m6+fh6evm4d3g6O3o4Ofq8ezxe/13bGl1cWd2fG1udW5ia/n4bmBmcGhi ZmRhZvru9O7r6e33eG795+nx6evt6+/8cG5xcXV77/LwfW17b2hud3FtenJv/Hrs5uLm7eTm 4t7k497d5nd5/HRmYWBdY19cWl9hYV9ZXHbr6/Z9/fvw+25sf3hzcHnu59/h5Ojd2d/6efXw +mZiY2h3dHByc3V3f3X88O3q7ev+d/Xm3OHh39vd8Xhx+XFoc2ZbYG9ta3n+bmtod31tbWpu aF1dYmlhYWljaPvj3N3f3drc4OHl+X3t7erv7Ovu+X14bWptfuvzfXdvaGNseWpfaXd49vPu 6u7m6Ovj7/N6bn3x92pmbHjs/3BxcPB3bW95c2pwY2Jsb3f47vTz6vPw9vrl6O/67ePe5nFp dX3+bF1mb3T1/3L+9vDs4PL36Obe6u/y9XtxdGxzb3D/fXT7cGVobW1seWxhcf5pbX/+d3T6 +f/w6/bw3ubyf/7r6e/86OT8fe78euzsb2hkZ+7ofG5tb//2dGpv6ePzfu3j4ej7a2v/7vNs ZWz7/m9vaHP3c2VjZ2dseXtv/env9fj37uv28fd98/Pw9n7r7fPx6t/c3+j57+DseG9wcW5p XlxcX2Zs/Xl1dHb57N7nfHxrYWrv9Xru8fV8evz57/pzbn73e3h8e/98+XpvePj6bmp1/Xp0 /ffw5ux0a2Z88PNxdvb07O3o497g5+jq9PL1/mtren7+9OfzffX0bG76al1dW1hbX1pfanfy 8+/v5ePm6vP88vd7bF5fdHhzanfo4+bh3+Xk5Ot4bXJ1/21ue/r17fLy4OP86+99//dxZnBu b3x77/Xv7+zs8vf6eWpraWlnZGdodvl8aGpten50cP/v9/Pt8PD0d2pnd375/P75//Hp5ebm 6/j38vP46Onv7ejp4+bp721vcmZnaGVlZGRtdn5uY2Ntb/jtdXf58fx55dnc39/h7/v39vxu Z15gXV5ucGpkb/5vdG5s+fLy7u3s8uPa5eLi4OHo6u/u/vp+Z2pwbWdeYWhuY11jbGxnZm1u cPzx9/rl3dzg6OHe5evw/vz0/mxjXGV0cGVpeXH36+nt5uDn6Hx1+3hsaGx49O70+3N+83Nv bmJrb2hiXV1eZGt38O7l3trc5d/k7fH4e3d2cmxma2lv7ujr8u3q8ejr/vPt7PV98+74+3hr avb7e+98dnh4X1leYmhkaGhof+nt/H7w7P5tZ/nv+fx49+vh5/bp3+Hi5n37735taGtnam9s amtsdfR+cXt88vP18vfx7fN+fP17cf/47+jvfOzg4+34cWZva2ducG9vb356+ez0eW91a2ls aXZraGRqe3z59e74797l7unp+O/lfWhodHB1dnrn5eXn5vlq/Pf7fnpsZW5oYmRkX2d++eff 6e7w6+Pk6uvx7+7re21+93NrYF9pampuc3p9+u/x7/vy83hveP5zeXx3ffL8bmdseu/y/X5+ 7vr97Ofg6fl+8Ovt6uzx9Off5+ru+HZ2bm5uaG9nXl5ia2hhY2RqdfPq6fn+/vL28u/2bnbr /3v5fv3o5uju+fbs7O/3935yb3VuanRtbXx+eXF6efvu8Pl+8ntyc2pueG1ubXr79evw/mZx 7urn/v3r5u3y/XX97HhreXRxfnpnZ317aG5ubmpv7v5+7t/g7+zr9X15+/D8+3dza3ns7vD2 /PXx7m9wdWNfXl1pamheX21teH1sevHt5Ofs49vd5+3t7/71bWhqb/zz7+fm39zj9Xh8cHn0 fWdocWZrZ2JkZnTx6Ory8+fm7e30dH3s7/PzdmJiamVjcG1kbG9tcnlsaHD5enn1+H/+8/Tu 8Prw6fr16+fl4ODo5d7k9+bk7/luZ2prb2hfW19uf/h8f+7t7Ozu5N3ybG1pdXZpZF5s+P5v ePz37vF7fvTv8H1oZ3T++3Z/fuzj5uji5/vs/GpvePR5eHdpdHj/aWr/eu/6b27v5/Xo5ePf 4+Hm7e75c2ppeft7cXLv8313bnLz/mNoYWRrbG1paWhoa2VqcG5uffr55OTn6u/r5+1/b/f5 d3b27fD27uvq5O30eP3x9Pfz6OHm/P50b3NjWVldYW/8eHz06+Pq6/7x7vP4bGv66O1xbPx/ c25ta2tx/n9mY29/dm9ubmZkYmV1b3r7/Ona2t3c2tfX2uTzffLufHJnbXFpcPX8+319aWZ4 dmRjbnb56PJycWdiaWtpdnX8+3j27Ov7aGN5+X34a2h78+/s6ejo4+Lv8eXo/nZ0eW9qcXZt dHF1dW1oevd1c+ff393c3+nt73tpZWZqa2Zxfvd5d29ocnFxaWZmX2l5cPftfXV49+/z9+vp 6PX27Oz6+Or7ampraHR4fPLv6/Pu7+7s6/b+6+bu73Zx8fZ8dvt1a2NaV1tgcHN09u/e4OPq 6d/o7XVjd/Hu+m/68/FzZ2dy/m1xa2h6fHFobu/x+P9ve+7r9/Ho7eXe6vH473RtbG5zamhp 9uTq7/t89+vp7H5xfXjw9nHw9u/q6uh5dG5jYVxfZV9eYW1+/+7+ffvr4O18ffHp7PD1+/jv +/55b3h1eXp6/v/17Ov8bGhs9ef5b37v7Ovp/nFxfn51bW5+/P5+8uzi5fF/dv51X19mZ3Z/ cmx5/O/wem10d29ubmxwefT7/e7r6/N3fe7q9v349eXh5+/n4er0em1z/mllb3JvbWViZW/9 d3Jtcfnx7+7u8fDu7+7y/u/vfXr68Hxydf53/XFmamlza2txbnd8b2757fHv6e396OLu8ufh 3+X4fe7m73xuam1rbWhy/vn5cWht8ur7ent6eXd7cmhjaXR0dPny/e3q7ubo9Xr893Rta2pp aGxuaW/yfH3w6d3b3t/f3uDl8PX5+vf4bW10bGViaGZla310aGd07uvq7Pr7+nx97efm6ubh 6+zvd3p0cWVfZ293bmpkZ3dtdn7+7+bn+O/3+Ovt9vzt/P17cPDq4On9/H3s5+9vbfr6+Hh0 /vbt8v5//Xdvb2tudWpob+3n5Ob3fHR0fG9nZG18/254/nr+9/n17Ont6ero7X1zcfh2cnlx b2tocHnw6ePk8vp4/u56cvru/PLl7/x58v169ezl7X1rbWxvdmRfZmhpbGRgaGRrefLl3+fs +Xj9ff1wbX37+HZ7ffHp7+zy8OPtfXJ5/vn7d3hx++h7bnR3eHhsbvZ+/Xz7eHjp7nn9/HBr cHd2fnhv9urp5ejq8vfu/vp2amlrY1xjamZscGxubv71fP/78O188Ofs6e32fvf39e346+vt 7Xx2dnFnZnh9bWdmaHH/6u18f/Dq7fzt5Obh6v/1fnR3a19bX21sZmhlZm5raXD37Or7+e7n 5evq6unl6OjucW5pZGhlaXP9c2hwd3x79O7n4uTk5Oz1f/r8b3x0Z2du/XRocH11d3N0Y2Zt bmVgcfp+8+7y9/jt6Obh5urs7e3z8vF4b//5d2djZ3N1dG9reu/u/nZudnFubm16+vp9fvr7 /Ph+dvHl6ff5fO7l7v598+zp92dobmx8cG52dffx6+bk5uv5dnh4eXpwYWdyc21yfvf09/br 7O3w+vVx9vtramVqaHjufXH99/148/T+7/X65+jw7/j693Ztb3R3e3t4fvHu+2xpa3Z4bGVn b3n6fnXt6+fn5uDd29vm8ebk7XxraGFeaWVoZWNzeHJ/8fHzcnH+fX52bG9vdHr8ffny/Pd2 dPv//v73c2n+5uXt8Ozq8Xd/9n98+v5qdPj6cWd1eXV+9/F59/dzeHRxb2ltamx3ffp5fO7v 8Oju9Pn5+35vbHBub/h4c/Lu4t7j7n37fPn6c/Xu7u5tZ298b2JqbWtxaF9o9/J8fW5v8O3v +ent8eLj5OHs8u7+bnX9cWZpc2xrd3JpZnRxbXVx/PTyd37m4d3e7Ong5+fj7n357/b5bGdi ZF9cXl9eW15rd/Xt5Oru7+3s+Xj66vdx9e7r7Obw/Ph5/PDt9fJ+dvr4f3Fubm5+e29pdPl5 /P99/3X+fnJ8b3J6bmp+7/7u/H7g5O3x8/N9eHR3/H93//t3ePr9fejofnD9em/v+nZzb/r3 6n9obXX15+f7cPXx+f5sa2pvbGp1/vTw9+7v6+/37vT9b2RlaWlubXl8dP/5/vbt7P3x7+rz fPf7/f/+7ezq5ubo7ebn5uHw7/rz+XVnYmJfX2NdWl9nbWRhZmhtbXV69OLk7O3r4ujm6PDv 7uTh6+7s7uvuaWRmX1xdZ293dnN29+778np55OTv6ebp3+D2ffl9Z2hzX1VYYGRmbnN0fXNu /uzq7fn4/vfu693c3t/s9+nd6nT08vl8+ntudnFiXGVtZmhvb2x6/XJxeHj58u94dXv75ebu 6un2dP90cnx3b2lxfX52fnb87/V8/PPy6Or1+X727vDq6+vq6/L7dG7/b2t9dW9naWluaWxv bnT/+nh++Ph6dnx6b3h6d37y6e/t7O736N3i6ubm5ufu+e7q7er7a3J+839rZmZpYmFqY2Bh YXH5dG7+fffu6+Ps5+Hk5fv++/P+cGRfa3ppam1tenz38+/j3Nzm6+fr6u3x6u72//h6evHx 8nZ7+3ZsWllfYF1dW15mcu/o7/31/3199Ovvev7z7/vs83/+bvr3dG577vZ+7Ovw/H1xampl bWdmZ2x6eXp5+PR2b//u6fj68/Hl4OX07+Lm7Hx7+Pl3bnJgXGhuaWltbvv8dWtsc2dsfvR8 c3ZvdHr3+P/56Ori3efi3uP7a2ZpbWRkZ27y4uPx7+jl39/rfW969XtmanJpfG92ePfudvvy 7/777u3o8G94dP76bmdt+W/37PP18Ojt921saWZlZ2lrfX50+Pz66fB+7ePu6+nt7Ozv6+zv 7ubp7u3283ZpZGlraHhqdPd2Y11fZG19bnV8eejtfXN3dnF0b33t6vL9/3/x5en38vP08vfu 7ebp7O3p/Gx5d2/47/1xbndzfHFlY2dpcnZ7+Xb3+Pfx7Onn8e3n7Ovv9f37e2tmaHb47m50 eXj+fW1rZWJsb2169fHy7vz05Od7aW388X52dn/29vZ7/O/8/G9xd/bwcvr28vX79PTxfXh4 cnZ89ndoee/k6fPy+Xp2amdwb+/qbmlu+Ph9eGloam9vZ25yc3ZobfLufvfz+PDl3ePs8vb+ 7Hxy/Wxqcevr9e7s5eru5+z08/j+bHn+eW55dGZlXmljX2htbm1ram7w+292cv5+7+3t3+Pf 397a3d7h5eh2dWlnaWz+a2NfbXtod3Vhbe7/c3h+fn10dXbq5Ofs8uXn6Or1/Hl9eG1oZGx6 bWZobnX573N4bGl5/H5uf3Zqdf59+PV3c/jv7Pb++Pvp7fnxe3p7cHz8fG5sfvP/cHv3+3d6 eHR2/PpraWn/6On3en3r7uz4d3N69/t7cXn/+3dzdu3q9X5yfvtuaWlwbnB0c/b38+jo93v3 +Pnq8Hr47PL67+7yeW58dfT3dnZ++n58amdycnD8+Wxt6+b9b/fneP3n7vbu5OTvcWx7/Gho /3BkZnZ7aGnt5ebn3+t1/ubqZWV19+Xu+PX58G9gX2Vx9P1wdG/w3ef7bWZo/PF+eP/29n3+ 8vL2e/Xr7OTj6f35/Hv+bmhreGtlcPb9bG5x+nZrbWlpbvP1+vnt5+rq6fn18vf1635od/16 bGx0cGz99/jw9u3u8e73+uzh6nR593d5fnZgYXZ1au/Z42RcYF1SWnfv5t7Oz9bwWU5MUmHc ztrk3uxvYWVYW3Xt1NTX321gdODo7/FzaWhucGlyeGljbGt293xu9OTl5X52Z2Z7/vLs3+Lq /fje3+DrbGFcYGhfXGBeXl5fXF5se/Tm3t/a3urk5err9Hp6bm98c23+6Ob2fHFsc/v7+vl4 amt3c2psdXP14ub6/PbxeG95a2tuZWRz8OLh8Px4dvTm+25+dWRhX2R86+18Z2/89/5rbG1v 9Obg7HR0cP738ejufv7o5vt3dnhsaWdn/PL1e3hsbOne5ufi5+vl8nJ8eXFvbF5nfXpmXnL4 ef31/3z2+Pn7dnz8fnZ47ft7f3fw6u/u7u/78uzv9nvt7Xr37X58eGxqefvwfW999u/u+Xd1 bHFwcfHm6Pf68/v492pfZ/r49vV4+PV9ZWtucfb9/vrm6ePl8vXs3u7t3+n9furw/ff+cWhx /WxpYF1re3tpbH/27ujreW767u31cWlqZXZ+d/zr5uno5vD073h4+nNvbfv3++zp7e7j6/np 5ur3fG536n1ubGltdXdoa/To/W1wavz1dGhhbW5udm5oann79vT35uHzeG/t4ebu/PHw6ej5 //7r/WxsavN7Z2pt/PR9bWxqan58bm77+H14cnn49nJw9u7l4vJ+/ujh4/L39/P9e/73+3Zt bWNncGpvbGxx/ndy/fV+dm9tcHRybHBscffu7vru6enp4+Hm7O/v6+Xl7ntrbnhubm9oY2Nw +e79e/55ePHi5/xt++z7f+vu7uzt+XNoaW5kYWFkbXBpbW5nb/zl8u/n7uvt6ODe3/Tv/mps c/5za3B/93398m9neW5ob3zu7/Pr6N3d6f52furn7Xxvb3BxalM/V8fJWky+w0FB7MlQMljL 2sboe3Pv0k9HaF5e8se3u/5GU/5qP0ftc+LMxsXOcVVfeFpLbMrVdl9JVnBWW1FfcP7RzdJm WN/X++vrWl5VVW/s2dP5dfpXYNPN08/Z2u5l82lSWv5+eOh7aV5bZufp8+70WE1PUm3f7PH+ 7ux03tHZ6NrQ3Ot47m9aU23tXVZdYX31/u3kc2t0am/q8O/f7vd6/eDhf/LceFj44F9de/hj VnPa+m7k3ONpbvtzbOhzXPntffZfW3dcZO3i3ubr3/9bfujs6m11dlpZae7o+e/i39zf6+3s 5OLi725tX2lpXGxvbWdmaGJu7uh4ZWpmfOxubX/o7njs7Ovq7ujf39/l5/l2fW55e/T8b29p XV1rb3Jtefvk5efj9P9qZ3Xz3vNydml1cX1tXGrw6uzn3+v9dWheXGh/6+rq597a6vh5ZGbw 8PXu6P50e/H8bHRsbfXz7f9zYmn2bmdxefx88fF8fvZ9c/Jxb2hq9f7+b/vo9fLv8XhnanLv /nN5enpze/fy8ez5bXzl53N19n10fP3q8efj7/zv4ej3d21qc25iZWtoaWlnbf3p5/Hy6Ovx 9v5nbvH3eHb/fPH9cGxx/uzl6v51aWr29nzu6n54+Orn+ft1anF1/2939PHx/fj69n117v5+ 9G51+fVyaXJyenV99Pvw7ejk9fbxfnNmd/1nZ2phYf3t9nB2//Hs9v39/G547+rm5evu9u3n 6ev++vn7bWdtZmhoZ2Vtb3BuaWh87efv+Pvy6OTv9vpy/+/68ujp9H9vbm9vamlx/P1/ePt4 /e/+e3Z9+vPw7vf/7/Dz9vfw/2z57fz2dmt0enn9alxiaXNpYmFkbX/s7eXp7Orl7PLl8Pb3 9u789e7r+/39fevu/HpvbnNsZ2Vla/b7/+re3OHo7v73/25iW19scGRhW1hrbW96cn/393j9 4uDf6nty9t/k6u7z+vXl73rw9HxyaWJicG9qaGNmc/v77uvx5N7g5t7g9/vy/O/leGtsZ11d YGFhXl5gZGRoZWxtdOjq7+fh4+fe3+Pi29/49/br4nh2c/7+Z2dra3F+dWFm+vH0eW/56OHx 8+3p5/L6dWlnaW5sbHp9eGxudXNvaW1pbft2cXH66OX0+Obf3+Dg5u/07H5udv3t9nRudHFl XmVoYV9pa29teujj8/3r4dzc3+Pf4ubg5Ov7eGtpbWtlXl9lbGhjYmZx/fJ7eP3v6ezs6/F2 b334+3x3/HB29//78/z76+n+fOvp8ff8eu/q7O/37Ozn72tqb/rxb2lja2xgXWRjYmVmb+3l 5+7r6efs6eTo8fnx+Xd+7+1+aWZpfHdoYmdtfOrn+P/x6+Tr7e32b2/v/3d9dmxmbXJ17/Dm 6Oji5+x4bG9xaWdsY2Rtb3Nxa2t99/P3++zv7Ph28+fr9f378u/u5ul8fuzwb2NtbmxraWti Z3d5c3T26Ofu7+jj3+Po83n17XZnam9uaWdqcnVpY2hmaXJtaXv18eXr+une4e706e729/b7 /u/u/nZz/nx4bW50cHx1b3Xz7erp+/zo5PP4em1ufGlramh0e/ttbnpxcXj1/H398fR/b2r5 7vLr7/vx5+bv+HVzf3hzd/n+c29vc3R79fdta/n3+XJ26ebv7PD59359bGxtbnVvcX78c3Pz 7uzo7O3s7/X0fnz17+x6dnRrev58bnN6bnVzampve3Rv+/Hy6e3w7+rd3+r9+3pwcHD+/m5v cXhxbW5namZhafl9bXNvb/ro5u7u73x97Orw+/Lp5ufr6+3n+2xt/vluamtra3b0eGJnfHds b3z68+v2bnr39/11bPbs6up8bXf29nZ99fx7bGxq8erv5u33fPn6c37+cXFpcXzv+XB5d3v6 e3R4fPb6+3N+9/x+df7r6evo7Pn5fXJnaWhjbXf7cmp5e3BtbXh7dfPh3uPq6uTteGttc3Fr c21kb+vp8PL15eDt7vPt5ez7b2tvenRqaHP+bWlvcXry7Pf69fLm7nr68/X/fH7+6OLm8P/8 /+n0Zl9jYGJfZnh5dnlzbvtwannu3vr42tnn2tbcW8rPPGny6v9Rt8U+QdJpQXvO09pQbE1c 6T5ebK+qtr0zLBUcvquWoFFju2wlGzS6n5u4UixJKDq068NPVno+VHrPtdksLr+svmUuLlS7 rsFuTEdCRETNr7K6321HQ15mPTjmubK0zzQrM/nl9bO1zUQ7S0Jyytt5Sv7Hx8xMRFzHv9Pt U05CRUVcv7rCS0hFPmdtx7+5ztRPODw83cK82l9mQlFp6vzM2s/ZZ2RFT2vs183kbvVPZFZd fMvB4uZd7/xcXEtPZeVdXlxUzszg0lFGSEzVv7y/2mxIT1bjyd7a3s3PdktAU2bdwc7vTUVU XPbv9U1J893O2OP7XE9j2eLr4dXV/VNY4evvaXd8eeT/fFhZ48fHzmBITVzmxcfhb2TWy9ft WlHtz83hX01CTVzg0Nh7VFxXYvrr4t/c099uXlFW4M3L2V9ZV1tXVVhl5mtnZFtjV2Zp287v 3N7i2+P88+R34Nfm4GFn6Ofa5+ruV1dVZWhr+WzpZ3Hk8PBvb3x6enFiaW/7Z1ttfPPj1Npd WFNm1NXb/V1ZWfre5d92X3F9fPrlb2hmft/vfG1hdvJ9e3l+8+b5aWhp++v/b3VzdujpaG9u dHFncnjr8ujs+uz0/PTj4u93bHN3aHpwYV5ma3P3a//f39/8aWnw7Hxtb/z+9Obp7Xhodffv 8ep0YnJ/9fdtYFp149/d63leZm5te3Hr63N1a217fHpqcujg6XRte3rr2ez9f2Vu5+Lt/vf7 6d/j4OxpZ/Pb2u9rYF5i/OXr+3Bmd+73dGJkZvfj7OTn6fdz//zf8WJjXHt29Oj56/JyYFxf Z3Xy7f71+vn59W9tbXry9nlv8O7u7O/5bnzt4+Pj3d3u7N/kem3/eW1lXmdgY2xqaWl3bGVl bG5lbHLz5ebvfvXs6+Pl93b68fPp5u7+eWZfY2Rse2ldb/L08/d4d3JnZWRs7+Lp8O7r5uTu 7+rk6Xdpaf/4/fp1+vX/fG9vd3t1ampua2Zsc3v++v1tZnD1+flt/ejb3fZ+f2734+Tza316 dnXt5+ziW1Hr7M1wTtDmV9HadmhL3NJp2sxuXVtEPU1Ya8nNZ+ZvZ19i+dzX4+xZV2/f0czN 1PpdVVt2/tbW2c9+UlxRT1B+6vF4bWNbeNfS3dLb63JbWXL77Nne2Nh7WlhTVWB53N17bvhq XWBbYu3v6ens7Ofm393t9uVzXFZfbfvs+WdeZGlvcn3n39zV1eHs4397ef3lb213a3Rq/ubj 5uLpbmxbXFtXX/1zaG9u+3dtf/zm1tvl5OLt53Rke2lxbWVj++fs7eX0X1RbX2b99uv4fXT9 7njt3ujk3Ojt9XTd3OTm+nz0dFxlZF1ubWp08O9ufftocnru63l5fe/o5O5xb2pjbnFubHZ8 8+bp4er08fV0dXx47+/t7H5pcHtv+u/3a2Vubmr68Oz89/9fYGJ25/F++vHm4Ot69np49nf1 7vv3a2/3+/p4bF9j7uLu/u3x5trlfXxqZGt8/X7waWBramr+8P72/2lt+XRqeXdzdnpte+f1 9eXc3d7ienl9bm5ubmxqdnp19ed58+779fL9e/D8evh8ZWVtcWViaHT6enb6e2v06fTt7uz3 /PDw8G9ydvvtfWtncf39++7u/u34a2hp//F1av7q6On06fft6O/z8X1w+XZs9unj6O3q+Hdw YGFhXmNlY3T6dW1od+/19+7l5OPj7PH9f/B9dGt0fvbp4+rn59/p+29vfXN+cXl7aWhlYmBk X11eZ3vq6ejs6unj2tnb3d7q8e7w+/N4bW1qeXlyamRiYGBlaWtz+Xp+8Pj7cvrh6ev2d/P9 7vr98Ojf6/5/8+98dH1x/XlqcW1mbPf9dvjr/nFtZ2huaWpydfjz93z77fTq4+jj393n7e3z 9fPw7f12ZWX9d25mZWRcZ2phYWd2dvn5dPx1+PX79vjv7eru5t7k6fP28vL6/G/+5ej9bWVq e3F0b2N3dGVrbWxrcXp97ePf4Ovq59/d6+/69vN2dHF0eGpoX2BmZWBbXWV1/3lsbnzy39/o 4+Dd3uz57P5u/X16fvL+Z2Vkdv1tb3FzcG588Orv8ft88uvteWt1bW53eXhy+P1+8nz3dXX8 d290eHL49H37en9+anz/8ujh3/pvePjz73lmaW90cGdsfvbq7nJ28Oz59fV+8fvx7fn5evv2 d/vq3+l6dmxwa2lsZWpqa2hob3d8e3j26e78ePj76+frfnF3fvX17/L39/bv6Oj9/PVvaXJ7 dm5ucXZ1fPf49/x48unu5+Do7e3yfnJ7/XVoam1uYFplaGhz9Hd78e3xfvnw9ntvamNr//ry 9Onq7Ojm6/jr5e938/ZvaGleaHJka3Bqc/X0cnv08P19/H33/nJzefvs6ePyfuLf3d/o6ejj 83xoXlxfYV1YXGJkaWh2dP3v9u3u+O/m3uDa3/x4e/H5fP7173l8+HhscG5zffvy7/V6cWpn cHbw5ufo6Ojz7+5+dv7q6vJtX2RsZGNpde/k7H5+8fFzdGxna2hiWVpcZO7q4d/c1dje6/jz b2ZjfOjl3t7k4ujh3ez17PtmX1lTWl1eam11/eLpc3lnXVthaHx/dXb25eXb2drb3dra63ds dmJfZWdzcXBmam5+8XhoYGVpbW1obXRrcvLi393a3unu4Oj3/Hv8+Xdz/vPwfn52/PL5bGdk X2NhXmH+5ujd3N7e297s9vDz929fWV1mXl5eX2V883t9+H1qYm5++vXx+P717+z4bnz2eHL8 7O3t397e2NTT1Nbe6n1qaWthXFhQUlpdX2lz9eDY2d7l6nxuZlhYWlleYmFp/efm7uvt7uvj 3+nk4Ono6PlzcG9v/3t5bXR1/Oz17u7v729ubGtvcmZZXF5jbGp0+Oje29nV1dfY4e7q93Zl XVdVXV9kYl9gaGluevDk3trY2Nrf7Pl7fHh8bV9lfOjt9XlsfOzr/nN1eP5qX2BjaGBeZ21x 7+bh3tzf3drd3uDs8/t9bmRlbGxnX1xhZ2tvcnF+8e/q6d/d3OLr4d3f6XRqaGVdWllbZHZv ZGJs9/Lx7v3/5+x4e/vq4uT76tzZ2tzm6+b2cHVzd/33c19bZGlcVVRYXXP7X2B5/v3y8O7o 6e3n4+Te5uzs8untfHd77+30fvP0eGxtc2t/9vd6/Xzz6P5nY3Tv6ufvfvt8b2xv+PN8cXrp 7vrx7/5xaV9cYnfyeW9tb3z7cm5xb3vyef7p3dzqeP7r4ut/+v356+xsaHr+cG149e/v5ujt 7flubGJkcPT+fu98+Ox//vN6cfz3/+vo+P95fvX17n76cmttXmJlcPP29/Tz+e/5aWVhYmdp bWt4bW755uTq7enn7e3x7vDr7P/47e7m6fJuaXVvdW5pYmVjYGRu9d/h393b3PH4/vT3cmxi aHr5c2Fiaf79Z3N9amx4/nz37/399vnz5uPzffX6ffh9eHt5e3Fqbf/zcWViZmBcY3f08Ofh 5ODj4N7x/uXj6+jk7/VvZGloa/zp+21ycWpqaGdram/46/Bsf/374efteW365OPs6ubg6Obq fGpmbmpfYWd1dGx28+/t/G1mbe7t/3dqbm9sb2566OXu6uLY19vj+nBwamdt+vj76vfv5Ob2 en12Yl1tdW5jae9uaPn5amz8eXT1+np8e/Lm4/n74N37cPZ2dvn4bWpqa2dqZl1t9ebl7ez7 /u7d5W1ocvJ5e/D9bm7u5vd79+jj5ehxa//xbFtebWxna2ldafLreWN45/Zz+vb+8e58+PLv 5vdx/HJvffr1/OblcGzx7/l9bGt4fGlkZG9z+vtvbffl4+T5+ezo5urpfW53+vRxcGxkZ2z+ 7/5qamdv+fJ6bHT7eXJ/+PHu/vrv7+vr7v59en3m2tnc3Nvf3+ltaWVdX1pVWFdeYlpdZ2Jg eP579+7d2+b3+u/p3t75dv7n4vD56dvd5ujr8e3x93RkZGltbGhpZmBiavZ3ZV9mbnL+/GVc ZHrwfm787Ovs6d/e3N7n6Ojn4+X0+uzzb2tqZ2RnYV1ibG57eGp35d/j4d/g4ujo6/579mxi aGtraWtv//519Xhsc25mZnX7f2lnbXL58nN86+Pg6fLw6Obz/nH06ObmfWt79/5sYW5+a2do Z2t5+vl76+bp6PX///j6ef/s5+zu9Gxvfn77bW53bW/5e29vdnT9dvbzY2n+7fHtfG707e96 Zmptdvp+cnx68+rs6+Xd3+Ls+f3++HJuc2lnbW1pZ2dkYm//7u767Obe4fXp3t3c3+598u9v bWVgbGRhX19mbXhna3fq6vVyYm5//vh9fn796ex8+Ofl6uni4tzd6O78cW54dnz9d3J2/PH6 cf9/aWRmYmd0cnJue29tfv377+3x9Orl4OXr7/fs6/fud2FlbWdkX2dtbWpzaXf06ebw7enp dXL9dv387+vsfvv8fP1vdXp19+3m7fr+/vn47+52cnzv829sefLm6v91cPpuX15hZGFfXmFo c3Zwe/Xo5+Tm7PHp3+bp5u/2bvzo6+Xs6/Ls3+x0a2lgY2VgXmVsa29vZWV3f3dwf+vu7u3v 6vbw7nn78PR1e/T1++vt6+3x8G579/96fHBt9v5pbm5ubGNpZm53/+7v7+3q93L++Hv49Xls 8ef8+ft7eHd1cvbu+G9xbmhya2xiX3Lt4+zv6ujo7vj26t/k6uTl7vX2bGhkWlhaWl1kcG5p bvXp8/56/ezm8/Ln7+ri5/fs9W/v8m/5+3hzdvP2cWlqa2l+9X3z8W9scHX+7XhscPzzfXFl Ym37/nF8ev3v+PX16+vu8HJt/+7u7Ob59e/wfH3xe2tmamlqcnj9+Ozv+fPs4OHn7nz98Or+ bWloanh2am969v5rZ2zw6Xtvd3vt6O/v6efj7HF8/Hdnam5ubWhfX19sbnBzaXnm6/P26Ofg 3unq5ufr5+b3/u/6dv77cWh9+n7u9ezt7urt/Wpu8+ft+n5vdG1lYF9obX56a23++3z+9/D3 5+R+bXd2c/f0dHNsb/72dGdiYmv0/Xt1/Onn3+P8fejd6PH0ffPf5Pz07u/m6u39dnRvcGpu eWlmb2xrdHl2dX7u8m52c2lqaWZoeHdre/Tq6er489/f5n566+jnd2tqbf7w8XpxeW9rbW1o bvnr7/3u/Pfl9vLze23+8+7+dmpmc3j7c3zz9Ph99Onr9nJ6fvv0cmRebvz29nx6/u7q93Ju eO/4cGlw+XV1fm9xd356dXz19P389vf++O3p7/5zb3htaXP/9/R9+fZ2dv3y7/h46+ns6nl4 +vnl62tma3Rramxwb21xdHttZ2dvcnpvbf307/Hyfn7u4eTr5+Xz+v5va3D4+Wlt+vL3/Xh0 +P56fHlxefT6c21y7+7q6+fienn/dnFu8f9vdW9tZm1vfP9tenVpbPn8d3z/7env+/Xw9PPy /3Fyevb5bnJ2efjs8PPl3uLv+vvw6+/9eHdsb/d4c3l2f/v3/vX5bmp7fnRwcWpkbn78d/Tz d/Pm4+bu8e3vdmdra3JwbGJn9X5z7+/159/q+O7l5ODkfWry6/Vub3FveHp4bm9tb3NpbHR1 cnh0bHju+nr08e7u9e/u+P5tfuHj5eXvdHH383xsb/b6cnb9bXT+//729H5ra29vc3x6dvPq 8P/8dm5rc3j47u73//l8+e3t7/H8d3R4ef37bW5udXr/fnN6evf8b21yeHJ67+/w7O7t6d7f 5Xxqan/6fnlraGlwa29wc3n7+vHh4+z09e/1+nt97vD07u9/8unm93Nxa/v6bGJgY2ZraF1f a21uePfs8/vj3d7v9evo6Pz+bW3q5vd1aWx45+9vc3nv7e3+bWt97XttcnT6+mpeYmZt+Hpu bvbk6Ofu//fo5ez6cXjx+HJx7Ozz6fRpYWpub2lfYHj6e3xqXmB0/PDq8O7u7vvv397xdnZ1 eu/4aWf4fnL/8/t4/39+fX707e347vptfv55+vXu8O3k7f5+eXh8eWNeZnnw93VsbPfz/Xxz 9efsenft/e17Zm1yc2tpbXv+8Ozs597o8PX3+vPv+W1pfP9/cnz5839teXv76e/49fny7PH/ bnn5fmtqcX3t6/Bw8eXq+Xvv9nluYV1kZWl1bWj/9PT18uri3+707/r+cmpoYWBma2387/v0 /fvf3O19d/n7c3lvaX36cW/58uzzcHf35OTl7W9teH56a2l2/3FeYmdra2tsbXnv6eXz6uLi 5/17+PV8evP27/T+Z2T+7XpfZX56+/hzbW3v83Fobu98a2f68fTpeHv6/e93evbe5Hv/9+Hq e3119+zr7/d7++38d/vyfu/3al9neGhfYWNmcP34+PLe/WF56Ofz8v3z4Orm8W7w6e7z8H1t dHloX2V2dGFobG9ybmlv83dtf+vs5+Pr9e/e2+nx7+j2evR5/n1vbGprbGlhX2xubfjsd2zr 4Ozx6OXtdHd9bm3x8nf16/V+cX73cXx2Ymdy9/t3b2lyeXF++3X76+57eODl7ubrfnLzdmpz cHZqYmp4cGFu7erp4eDm7dzZ7X525t/l7WtnevNsZGlsffj8+vR0dn5iXm/+7vX5+f52fnZf bnj2eHT5+fnw6vD57e7v9vP49O737Wxs7er2cfvw9/d7cmt1d3ByeOvn7uzx/3Vyd3n38+vn fXxsb3v9/nP2fu/n6er1bGFkZl9iYWx9evr6/O3p6O37//ft8/z66uzq6nZoaW1ycWp09/pp cHl5//d1anft8/Z6/+3wenZ+9fHo5Plw+PNoXGp5a3FtZnp9+P1taG38dXv5/ure3OV2cPR+ cvP0cGxocf5lY3dvbP3p7fV78+51evz9bWhuc21+8G9ndfr+9u7g4uvy7ut/fH98cGVnbvP1 b3T4e2d0fXF47Ol0ee7s+Pjt6erv6npraXNwXl5vfv31enl56+b3dv3p6ODe7e3s7+95/v55 fHVwdXR2a2ZiYnJ3b3Z+fXp8ePXn9XJranfs5u7s6PPx+vbybGRqaGn37vl5dXl57+rv6+jo 6/b8+Xx6+ntvbnt/dG7x7n13+fj49vV7aGpyf3r29ezmdXj5cHvs+Glqe3p9cmZw9nz7cm51 cPtvaWz37e3p7Hh0/3ry6vPy7ntt+uLf/m/5+/rn7fZmYGh7ZWD+ev54ePpte+3n7X7/fvr2 /v3z+evr8unt7fXz+HNxd3dmaHFua3X3eW958PdraHp3am3y5/L86Oxyee/p8fxuefL05ujt +W9t/vhwcHBrdffl7//v/n7+fGxwc3zvbGVhbvXyfXP+7/r97fRwbfrrfnB8eXRy8dzj7+zo 6333+XJ4b/n1aV5pdmpnbnFrZn/qd2/56uHv+vr05+zg5n3+fO/m7e58bnn78uz+d25pYml+ fW9yaGhta3N4fWhs7fn36uvh5+fq/e/o6/5tcP38+mt0dHbz625ed+/ydm55ev1uavry8eXt fHp+9/z/+PXp8fbq5vH78vxsbPfwe3B5aF1gZF9fbHr+b2tq9O12euzf4uvi4On4++5pc+/1 +PXq5Ojv+nlnYXV5amNv+evr5er0+e7vZl9rbGr+eW5saXV3/fdpbn39fXD4dHXs/P768nx7 3/BveHB4eXF68/X3fG/x39/r+/Hn6Obm8X3s83l373lrX19wbm1rfHVt+/b0a2VzaGloaXV2 9vLqb2b0fmx/6eX46uPf393b6P78e39xZnRzc25sZF9qbWl77vptb3xlb3Rqevns7+7w5uPp 6fTv7PH393j9dvvydG9qfe9vb3r46urq+vry6XldW2FtbG1oaft6cHFxdn75enNz/vt+e3R7 eu3t8Onn2t7r6e54bu39a/709XJ58e12a+nzcHN57+79e3tfWm/pcn7scWR87/Rwafb8fG77 fWlpdHX/fXX8fXv17fP57+rt6vTu5d7n5u1y+mh4bFxdZGls/uvu9u/6/PHz4uT8+P3//vhz Z/Tld2p85etrbn5fam5kYWb88vD5+v35bnT96vD73+ZwcfDte/18/+rw8ezi4u/p8Hx/fGNc WV7+bmNobmRdaW7xfH7l/vfl6e7w/Orl3uTd4PX2+PtubWpiYnNubXJucWpu8vt1/enya/73 eXdo/fVvfebd8Hb08N7vc+1ycf/tdl5q9Ot3bXf96t3b3u93d+5vWlpqXlRe9+x6c+f0aHjo 92Ru3uF8+N3c+/z0c3br2dzubW7i92ls+25t7vB+825famNaZH1+cO3g8Hdw7Otscebje//e 4nX/9XFhZWz9dWn48PHp8PxtZHnva11t9PZ69vNv/PDw5Ori297ubn5++3Znemphc3h0aGn8 92lz5t787t/u7+npfGZlYXFxY2/5fP59emppeW5qefLt7evv+uno7+7q93Xz9H7r+vfydPjr 7W9fX15oaFtdXmJqduv37uf99vl77uff5O3q6n357/duYH7ueOrg53Jq+W1naeb2Yvvv/3Lu 9WhiaP1gXvrs8vPp+Gxffud2fnxu9/vveWh89fH59PVteul8a3v5dnjm3OPu4/R56e/m/V1m 9unz6+9tZ2hldWlffHZqaHji6vL2a19p7+755uRvaW9rdfZwb29se/Dq6OPn7PDx7eTd3Xpv 9nRwf3Zoa2v673d76+pyX2lrZHvo63J583dwb350Y3f0/u/i4uzj/GxqZGxw6eHmfGP5emb6 9vhpceR0bH1tcWFm+vZyb97b7+/l7m9t7fNta3Xv8uL7fOhjYXj/aGR4d2NpcfBoWXHn9G/j 2+vw7Nzheevd5Xhu8H1fW2b7ZF/v6WVn6drlb/Ln/GtyfHhibHVvefvt72pl89/o7t7k7Hdq fnBdaev2ce7m4+1rc3ZqdOnj3N7k3+9kXGJfW2Z4fnNq+Hx68+/u/Gt96nxpc3l7bXPm4Ojm 7f72/Obl3+Xq5O/memR6b29oX2ZnZF5vcW3r4/Fzb3drbmtw8mxgcPbn/v7n7Oni+fny+un4 dWp4fe7v8X9mb+/za3F+9u/+9vHt5u/m72/7fmxrbXZ5c2loaf33d3J3+XBxdnv07nZucvb7 df347+/z7PhrYXXt/vT1e+/kcmVoaGdu++r4eO/x+3176tvx893mb37o6P1xfXlhY21/eWtr 6+v46W1s+HPs3/5tbmtiXXHp9Wns3ety/ft7amT4ZFZg6eT0+vDi7GVp8n166d3j5t3e7W1q /Ovx9vH3dG90b3B77ed8aWl2eWNd+O5sb3119X1673NtdXZsW2Lv3uv93N7n5PLneWvj6X36 fvDtcnZ6cn7vbFxaZm13Z23983xnb3X+6Nbc+3R8d35t9+Vybu30cX53cm1z//9pZ/R4/m9x +Xf67Oj4cHr4+/t55+f+efj4e3n++GJccfv1dvff7mVp/vVqbf50b/Xd7WhfX25vZX/u9XX5 5XVu7+1kV2zp629y3uR8+/97bW/o4/l73d3s5/d98G1s+nNlb/V7d+/6/3V5fGZlaGxnZnz7 cGNn9+73cuve+O3r+PR+7vD+fuvf+WRzcHZvb+96eO38dl9ldnRv/vD/b2tmbnH04fL/febT 1+Dm39jj7P77dHH5b2JhZGBkZm7+bXJ6e/Ts6/B2bHZ1am5zc/Pt+vzu/v51b3tp+dnj++vo 5vxpefJ3cvXp9Pp6725faWpv+/jx6vXt+Gz373xwb25taXb5cmZtbnR0d+3o7P735ejydWp8 6fr77vLwcXNqb+7o+fP+ZGz3cVlYbPpsbuXo9PTh3OTv3N5zcm968Ovz6nVeX2d7b/Hq6mZr 7O97ZW/1cGrr7nBudnn2ZX3f+nT77HR29vHr5u3o7P/v8eXye/P9dHX5bV9q9/5tX2b15Pb4 6e1+8+91eGhebnlkYPfv9/T86+rn7+bi8nb83N5vaXpnWV1sc15d/e/9bHzx9mz47/ff3eTm 6v50cvt5/258enn67up8fGx07u/u9vl88fN8a2ZkY2dfYWz69unhe/7rf2lpcWdjavd+bnTv 6+bo7O3vfPz2+nxyfWhxevnreWhu6O50cPl5YXDm8frk3N/u7nz4cvnw8XRt9H11XmV0fGhk aHD0dfb+ZXLv8PJ5Z3Lp7+/t8N/t7+/9/G1jXv77/nvv/F9qavl+fOjv7Xvy5uLn5OR17+j+ 93Nqa3ju6vlmanhpaWpsYmdo7Oj+bmx3/+r+/2poeeHa4+Tg4uno7evsa219bvzz+evwfGZk W1hjenlob2tr7unk+uvh3OD14eff43lgZW763Or8eWltcl9dW1tgXm329+7w+v7r3+xtdePn dfLh5Oju+3d4auTd8u/x7vF6cGxvZmRpbHBncPppXm96/nNpfPro8/bw+/z53efp5OD4cf9z c29v/PL17erob2R6aV5ca3FjaHXp6ejxcm1xc+rs8t3Z2ufq8O70bGdfXV1p/nR86ud5a2Nk ZWdrbHzr7PN7evPj3+r79/Tn4n9q8+1ubfXu+/X7/3f/6n5eXmj9c2NmdHf97PZ2Z/Tr9fl9 a/Hm5/D88vlvbPru/HZrZ2FlcPjt9u/w7Onw9PhvfXVy8untdPPu7env/l9mdnp7duz0e/v0 eXv3fHJiZGtoamj57Xt5c//7+O55aGvz8nJmb+zh3OTq/Wlw5e5qbvXo8HLq5vRy7eN7c3jy 83t+7Ov7ce3uaGJraV9cXWhlXmb+9/L34tzw7+Da5ebm9Hj07+v3dvt6dmdtbGRibPFwc/32 f2/36+56cPB+a3rt5e927O7z8O3kfGds5eN4/u3te21saG5pfG9gXWL25PZr+eDf39/4ZGx1 ZGpwa/3vdGp48+3v+fzi3urv3+l8+WVlY2308/R3b3L4+HR38v/m7Pd+9PdybWv7YFpeYWJh c35ucO7h6+zh4Ol89uzu8ezt7uLb3t3l+fn6cnJmXGd0Zl1uampoZ2pYXGlqZmj06/ny7N7V 3OLz7e7y6/x99Ojs+2tdYnhxbWx2fWl4eGlfbO9taWRt+uXh397i3t3o7/XqfmZode36eXB9 enns7mllcGNgW19scm9q/e7q397e5uvk7H93+3Z7aFxj+evuen13bPTh7Pz48+368/Do7Pzu fPpuaWZkXFtdYG9qam5v/uXX1tni497h3+x9/X39fvXn+G5qYl9h+v1kZWn87fJ4aWtmeXTx 4O/x6Ofx+eri5Pb59vXqeWdqfnhkZmJid2pianH78OTx7fbq5+be4vN+8fXz8PlsZGRt8+3/ 9e34c3b0cF9gamFgcXpybPvo8+rm4uv58e/rd3T4bGV2eHztfv70efvz/3z4eHZ0ZXr3/vF+ aGRobf9wanLu+fHt7er59Pv24dri9OnrfG5uc2ZfamlofP398nVncnhsYmh49/Fvcvz15Ofx 7vr87Ob2fvb173x1/v12fuz4cnRwd3Vz+fdteXZs8+/s6Pb6+nb77/h3cnj3fnP4cWxrcHlt bHl4aWFscG1y9ev67t7Y3evx+e7o7f55+u3v7vr4+u/1bGJqe3x8bmdvdfrx/nb/b2p88PNs aXNtcWtzfnt79evs7/Pq4/1pdvd8/fz97+f06O1s8uXybmdqe/ZpZGt45+Ho6vZtcH12b2Zl a2VqdO3t9P/28PLu7HpnbnlwbHh3+O91a/rr9Hf79vL4+Pz/f3vv8/3s7Pryf3fr7vF5aF9l dG9naG57+/Zvde7u6ez38u3o6e3z8+jucnt4ZmFqaGvzdm98bHjq3+924t/pfPx9eXR0cGx5 ffn4/XF26u1maX3293V1/nNs8/h1bHnvfn3s6fz67/Lv/m7/93nv7u/9dPTsdGlr7+7u6fP+ Z3P9fGt75PdzfX7783x/b2xx7fF1am3ueWJq8u3l7f727OLd4nNqdfftdW30bGz36u5/9/Dx a2lob3Vwb2xyaGpqcvXp9mxt9/J7cvT29Ot67+bl4ur+dnhybnd1fOv2em1scGR7639pb+vt 9+7lfX7z9urxc3b5+3Vwd3Z1c29nXV1t/XBucHv18uzvdnB35d3m5vF5b3TzeGVmbGppbftu bn3o4PTt7Ovy9Ozv9Xf75vlr++7zd/jybWl1fHVnaXhzZmRydmxodHpub/fudm/t7/bv7Orw fHvv6evg7n10/OXyfHhmavj57+Xq++fk8O3s9WxlfHdobW5tc/V8Z2twd3R++nB8bGtxY2V7 enj75ejf2d7f5t/e5+fs6n5zefPu+W9raXlpXl1YV1lv53FobXX69ePn7+767+/w8O7wcn7u 7f159v315O3y9PP2bWlx+3NlYGpx/OjteGx58vHv7/fq7/Hl9vF4a29mZW1rdHd59Op9bPf+ dXp9b3Dp5+97dPT5dnj3eH33d214+Hxvamty+3traWl2enF2e37m3/Hv597X5mlj++b27/x3 d3B8/GZhb21mZ37wfXVvcnN+/vnt9Xrx9PD28ezq+mh89/p8cPru7uLnfGlncWxsaGZpaG/6 /nv57ePf3OXu9v31+PxvaHh5ZGdwZF9v7/pvevPr7evn6+tx/G9revPzbfbtdnj47vT39O70 8fl5emtoZ2p3cW1ud+3/dezg5e709u559/ByaGv6/mtp7u95/Hrq7PHxa2lhd/htbGpqcfvz +Xjx6/X15N/s8/fj19rf73twbPdybF9dYWRrXV15e3jx/v3j5fppeXdnb+rrbHHt9fPj7fbz /vfw7O3x/fTr5f5peW1nbHt8bHN093ZteXh+b2Fhfu57bml7/v53fO71fvHn9+zp8fX37+3o +/ru8uv0b3V9/v56cO/yYm15amp95Ovt9nHv9m1lb/n+dmVrbGh7+v/2/nZ5c3x9bnb6d3vv 8X1rfe559+vi3OLk5dfY6fP4dmZmdnNiXWdzdWFfYWltXGh///Ds7eno7e7t6vbu7u/3aXrk 7+ry+vd9+nBkaHz/eXV5d2z/+P13dXt4b3fu3+psZX3n5Hd46/Rx+fT9cP7+b29t++LteWdv fGt2cXV7+XJr/3b77uv3+H3y6PVvdv188e7s7e7vfuri6/l99PJz/3twZGVfY2djb/nyb2dy 8+z9ZGp1bX/983ltdv/u7+vc2+Dl8eLc7Wtr/XxmY2xua2RubWBp8ffw6OXl39jj9Pbw7nN4 7PbweXn4fHRhbHBcW3F8YVdWWl9haPn2cfzy6eHe3Ovl2ufx497q9fju5+ntfHZpXmpsb25j avjw+/3i2/X+7Oru7/BxYWJmd+9vX2zs72188ex2YWRmanB2enBq7ebg3/H8dunqaWl27Hpm b/Lf4vXv5vPq3+Hi7/rseWRrcu3tZ19k+mxZXmBgbHH++Gpr/Pr7fu/o8ev9/uDh7P9v++v7 bvz6e2z45n55fvDs/n/g2d76buzrbW1tbGRdX2h7aV9m/Hlvdezzb+/m7HP/7t7j+/tt+t7g 6vZ+d3h6emlkZXH0alxodf50ae7peHd+4tzs6uTk7fz57Hdvb27vbWlr/G9hW2js9vzq3Ont 4XtvfPn77f9v83rv53d19Oz7bfXn/WFka3xtZ2ZrcmFifG1eae3u8vPq3eDl6uTa3N/o7O7s /GptY2JhaGdVXH7scVxl++vo7vrl8nPs4+Dtb3Pz+2xkdXlfZ3n6/Xt3a/J/aX7t8PbpeW/x 9PHv5uP38N/sbWl6dGJeX2llYGNqZWf97nVrcXnq2+t76N/k5+b06/Tyefzw7u/s7XX79m9y bWttb2BoaV5lbG9tfnx2fe/f5+/06PVucHX5efTh7O18eObf+mns5Ph1+ezl+P7o9Hd8a2xq YG56bWBjbO7wcH3r8+nh4/L/fnxoamtnaWf87fHy4t706uPf5G595e1lZmVuY11pcXR69OV1 YHbt4uppa+3r7ubp7/bv4+n8e3l9bWh4emhubnR9/3N4+WtpaW12f+t8an3l4+vt7+/w9Htz eGpt8floa3zwcmd18PH97urg537s3t/47uZ1W15/b2NlX2xtbn1zaPt2cvJ7cXN/dWheb25p furl5dfZ6Ofd3+Hr8d7rbGp2/Glv5vdhY2T/9mtvdHBrZvnu9Xls9mts7uPl6Ojzfuvl8uf7 9vTt+/h6YmZoaXFxYWtuZn758+ZtZnpvbm5uZWFid93t/w== --PART.BOUNDARY.4099.19398.greenbush.717776361.2 Content-type: text/plain Happy New Year! -- Nathaniel --PART.BOUNDARY.4099.19398.greenbush.717776361.2-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.5.msg ================================================ X-Andrew-Authenticated-As: 4099;greenbush.galaxy;Nathaniel Borenstein Received: from Messages.8.5.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 via MS.5.6.greenbush.galaxy.sun4_41; Sat, 6 Jun 1992 10:42:04 -0400 (EDT) Message-ID: Date: Sat, 6 Jun 1992 10:42:04 -0400 (EDT) From: Nathaniel Borenstein X-Andrew-Message-Size: 434+4 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="Interpart.Boundary.4eAAtte0M2Yt8fF9oM" To: ysato@etl.go.jp (Yutaka Sato =?ISO-2022-JP?B?GyRAOjRGI0stGyhK?=) Subject: Re: MIME example in VIN In-Reply-To: <9206052121.AA02633@etlibs.etl.go.jp> References: <9206052121.AA02633@etlibs.etl.go.jp> > THIS IS A MESSAGE IN 'MIME' FORMAT. Your mail reader does not support MIME. > Please read the first section, which is plain text, and ignore the rest. --Interpart.Boundary.4eAAtte0M2Yt8fF9oM Content-type: text/plain; charset=US-ASCII Neat -- that's very nice looking! I thought you might be interested in seeing another view of the same messages, so here is a picture, first of all, of how YOUR message looked to me when reading it with Andrew: [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] And this is what the older message you sent me a picture of looks like, when read with Andrew: [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] [An Andrew ToolKit view (alinkview) was included here, but could not be displayed.] Finally, just for fun, here's what my mail-reply window looked like while composing the message you are now reading: [An Andrew ToolKit view (mailobjv) was included here, but could not be displayed.] --Interpart.Boundary.4eAAtte0M2Yt8fF9oM Content-Type: multipart/mixed; boundary="Alternative.Boundary.4eAAtte0M2YtIfF9lv" --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Neat -- that's very nice looking! I thought you might be interested in seeing= another view of the same messages, so here is a picture, first of all, of how= YOUR message looked to me when reading it with Andrew: --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: image/x-xwd Content-Description: Your mail to me Content-Transfer-Encoding: quoted-printable =00=00=00k=00=00=00=07=00=00=00=02=00=00=00=08=00=00=02=A2=00=00=03=82=00= =00=00=00=00=00=00=01=00=00=00 =00=00=00=01=00=00=00 =00=00=00=08=00=00=02= =A4=00=00=00=03=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=08=00=00=01=00= =00=00=01=00=00=00=02=9E=00=00=03~=00=00=01=DE=00=00=00=00=00=00=00=02xwd= ump=00=00=00=00=00=FF=FF=FF=FF=FF=FF=07=00=00=00=00=01=00=00=00=00=00=00=07= =00=00=00=00=02=FF=FF=FF=FF=E0=E0=07=00=00=00=00=03=00=00=00=00=FF=FF=07=00= =00=00=00=04=92=92=92=92UU=07=00=00=00=00=05=B6=B6=92=92=AA=AA=07=00=00=00= =00=06=B6=B6=B6=B6=AA=AA=07=00=00=00=00=07=B6=B6=90=90UU=07=00=00=00=00=08= =92=92=92=92=AA=AA=07=00=00=00=00 =DB=DB=B5=B5=AA=AA=07=00=00=00=00 =B6=B6kkUU=07=00=00=00=00=0B=DB=DB=DB=DB=AA=AA=07=00=00=00=00=0C=B6=B6=B6= =B6UU=07=00=00=00=00=0D=92=92llUU=07=00=00=00=00=0EmmmmUU=07=00=00=00=00=0F= =B6=B6=DB=DB=AA=AA=07=00=00=00=00=10=DA=DA=DA=DA=FE=FE=07=00=00=00=00=11=FE= =FE=D9=D9=A9=A9=07=00=00=00=00=12=FE=FE=DA=DA=FE=FE=07=00=00=00=00=13=FE=FE= =FE=FE=FE=FE=07=00=00=00=00=14=DB=DB=B5=B5UU=07=00=00=00=00=15=92=92kk=00= =00=07=00=00=00=00=16mmHH=00=00=07=00=00=00=00=17mmIITT=07=00=00=00=00=18= IIII=00=00=07=00=00=00=00=19HH$$UU=07=00=00=00=00=1AII##=00=00=07=00=00=00= =00=1Bmm""=00=00=07=00=00=00=00=1C=92=92IIUU=07=00=00=00=00=1D=B5=B5=DA=DA= =FE=FE=07=00=00=00=00=1EIIIIUU=07=00=00=00=00=1F=D9=D9=B5=B5=FE=FE=07=00=00= =00=00 =92=92=B6=B6=AA=AA=07=00=00=00=00!llll=AA=AA=07=00=00=00=00"=91=91= ll=AA=AA=07=00=00=00=00#ll=92=92=AA=AA=07=00=00=00=00$=B5=B5=B5=B5=FE=FE=07= =00=00=00=00%=DA=DA=FE=FE=FE=FE=07=00=00=00=00&=B5=B5=FE=FE=FE=FE=07=00=00= =00=00'=91=91=B5=B5=FE=FE=07=00=00=00=00(mmmm=00=00=07=00=00=00=00)$$$$=00= =00=07=00=00=00=00*mm$$UU=07=00=00=00=00+mm=92=92UU=07=00=00=00=00,=DB=DB= =92=92=AA=AA=07=00=00=00=00-IImmUU=07=00=00=00=00.=FE=FE=FE=FE=A9=A9=07=00= =00=00=00/=FE=FE=B4=B4=A9=A9=07=00=00=00=000=92=92II=00=00=07=00=00=00=00= 1$$II=00=00=07=00=00=00=002$$IIUU=07=00=00=00=003=DB=DB=91=91UU=07=00=00=00= =004=DA=DA=FE=FE=A9=A9=07=00=00=00=005=92=92=DB=DB=A9=A9=07=00=00=00=006=B6= =B6mm=AB=AB=07=00=00=00=007=92=92=92=92=00=00=07=00=00=00=008II=00=00=00=00= =07=00=00=00=009$$=00=00=00=00=07=00=00=00=00:IIII=AA=AA=07=00=00=00=00;=91= =91II=AA=AA=07=00=00=00=00<$$$$UU=07=00=00=00=00=3Dmm=92=92=00=00=07=00=00= =00=00>IInn=AA=AA=07=00=00=00=00?JJmm=00=00=07=00=00=00=00@=92=92=B6=B6UU= =07=00=00=00=00A=B6=B6jj=00=00=07=00=00=00=00B=FE=FE=B4=B4TT=07=00=00=00=00= C=B6=B6=91=91=00=00=07=00=00=00=00D=B3=B3=91=91=FE=FE=07=00=00=00=00E=D9=D9= =91=91=FE=FE=07=00=00=00=00FllII=AA=AA=07=00=00=00=00G=FE=FE=B5=B5=FE=FE=07= =00=00=00=00H=DB=DB=DB=DBUU=07=00=00=00=00I=91=91=DB=DB=FE=FE=07=00=00=00= =00J##=00=00UU=07=00=00=00=00K=DB=DBkkUU=07=00=00=00=00L=92=92""=00=00=07= =00=00=00=00M=FE=FE=D9=D9TT=07=00=00=00=00N=DB=DB=B2=B2=00=00=07=00=00=00= =00O=91=91=91=91=FE=FE=07=00=00=00=00P=B6=B6=B6=B6=00=00=07=00=00=00=00QH= H=00=00UU=07=00=00=00=00R=DB=DB=92=92=00=00=07=00=00=00=00S=DB=DBii=00=00= =07=00=00=00=00T=FE=FE=91=91=AA=AA=07=00=00=00=00U=B6=B6IIUU=07=00=00=00=00= V=FE=FE=D7=D7=00=00=07=00=00=00=00W=B6=B6HH=00=00=07=00=00=00=00X=00=00$$= =00=00=07=00=00=00=00Y=B7=B7=DB=DBUU=07=00=00=00=00Zmm=00=00=00=00=07=00=00= =00=00[=00=00$$UU=07=00=00=00=00\=00=00=00=00UU=07=00=00=00=00]=92=92##UU= =07=00=00=00=00^=FE=FE=91=91=FE=FE=07=00=00=00=00_mm=B6=B6=A9=A9=07=00=00= =00=00`=DB=DBmm=AB=AB=07=00=00=00=00a=B6=B6II=AB=AB=07=00=00=00=00b=94=94= =B6=B6=00=00=07=00=00=00=00c=00=00II=00=00=07=00=00=00=00d=FE=FE=8F=8FTT=07= =00=00=00=00eII=92=92=00=00=07=00=00=00=00f=B6=B6=DB=DB=00=00=07=00=00=00= =00g=FE=FEll=AB=AB=07=00=00=00=00hII=92=92SS=07=00=00=00=00i=B6=B6!!=00=00= =07=00=00=00=00j=92=92=00=00=00=00=07=00=00=00=00k=DB=DBIIUU=07=00=00=00=00= l=B6=B6=FE=FE=A9=A9=07=00=00=00=00m=DB=DBHH=00=00=07=00=00=00=00n=FE=FE=8F= =8F=00=00=07=00=00=00=00o=00=00=FF=FF=00=00=07=00=00=00=00p=A8=A8=A8=A8=A8= =A8=07=00=00=00=00q=FF=FF=00=00=00=00=07=00=00=00=00r=D3=D3=D3=D3=D3=D3=07= =00=00=00=00s=00=00=E6=E6=19=19=07=00=00=00=00t=00=00=7F=7F=7F=7F=07=00=00= =00=00u=00=00=BF=BF??=07=00=00=00=00v``````=07=00=00=00=00w=FF=FF=C0=C0=CB= =CB=07=00=00=00=00x=E6=E6=AD=AD=D1=D1=07=00=00=00=00y=7F=7F``=E5=E5=07=00= =00=00=00z=00=00=00=00=80=80=07=00=00=00=00{=F5=F5=DE=DE=B3=B3=07=00=00=00= =00|=DD=DD=C8=C8=AE=AE=07=00=00=00=00}zzoo=9A=9A=07=00=00=00=00~=B8=B8=A7= =A7=A6=A6=07=00=00=00=00=7F=98=98=FB=FB=98=98=07=00=00=00=00=80=00=00=B9=B9= =00=00=07=00=00=00=00=81=89=89=E2=E2=A2=A2=07=00=00=00=00=82LL}}=C8=C8=07= =00=00=00=00=83rr=BC=BC=B0=B0=07=00=00=00=00=84LL}}LL=07=00=00=00=00=85=89= =89=E2=E2=89=89=07=00=00=00=00=86rr=BC=BCrr=07=00=00=00=00=87=89=89=E2=E2= =98=98=07=00=00=00=00=88rr=BC=BC=98=98=07=00=00=00=00=89=89=89=E2=E2=96=96= =07=00=00=00=00=8ALL}}=8B=8B=07=00=00=00=00=8Brr=BC=BC=92=92=07=00=00=00=00= =8C=00=00=00=00=F7=F7=07=00=00=00=00=8D=BF=BF=BF=BF=BF=BF=07=00=00=00=00=8E= =BF=BF=90=90=D8=D8=07=00=00=00=00=8F??????=07=00=00=00=00=90=7F=7F=7F=7F=7F= =7F=07=00=00=00=00=91rr=BC=BC=81=81=07=00=00=00=00=92LL}}=CC=CC=07=00=00=00= =00=93rr=BC=BC=B2=B2=07=00=00=00=00=94=F7=F7=E8=E8=00=00=07=00=00=00=00=95= =89=89=E2=E2=99=99=07=00=00=00=00=96LL}}=9C=9C=07=00=00=00=00=97rr=BC=BC=9A= =9A=07=00=00=00=00=98LL}}=8C=8C=07=00=00=00=00=99=00=00=00=00=81=81=07=00= =00=00=00=9A=F7=F7=EB=EB=00=00=07=00=00=00=00=9B=89=89=E2=E2=8B=8B=07=00=00= =00=00=9CLL}}WW=07=00=00=00=00=9Drr=BC=BCww=07=00=00=00=00=9Err=BC=BC=B1=B1= =07=00=00=00=00=9FLL}}XX=07=00=00=00=00=A0rr=BC=BCxx=07=00=00=00=00=A1=DC= =DC=FE=FE=00=00=07=00=00=00=00=A2=DB=DB=DB=DB=00=00=07=00=00=00=00=A3=DC=DC= =FE=FETT=07=00=00=00=00=A4=FE=FEHHTT=07=00=00=00=00=A5=FE=FE##VV=07=00=00= =00=00=A6=DB=DB$$WW=07=00=00=00=00=A7=B6=B6=00=00WW=07=00=00=00=00=A8=92=92= =00=00UU=07=00=00=00=00=A9=FE=FEGG=00=00=07=00=00=00=00=AA=FE=FE!!=00=00=07= =00=00=00=00=AB=DB=DB =00=00=07=00=00=00=00=AC=B6=B6=00=00=00=00=07=00=00= =00=00=AD=DB=DB=00=00=00=00=07=00=00=00=00=AE=DB=DBII=AA=AA=07=00=00=00=00= =AF=FE=FEkkTT=07=00=00=00=00=B0=B6=B6$$WW=07=00=00=00=00=B1=FE=FEii=00=00= =07=00=00=00=00=B2mm=00=00UU=07=00=00=00=00=B3=FE=FE##=AA=AA=07=00=00=00=00= =B4=FE=FEHH=A9=A9=07=00=00=00=00=B5$$mm=00=00=07=00=00=00=00=B6$$mmTT=07=00= =00=00=00=B7=00=00IIUU=07=00=00=00=00=B8=DB=DB=00=00WW=07=00=00=00=00=B9=00= =00=00=00=00=00=07=00=00=00=00=BA=00=00=00=00=00=00=07=00=00=00=00=BB=00=00= =00=00=00=00=07=00=00=00=00=BC=00=00=00=00=00=00=07=00=00=00=00=BD=00=00=00= =00=00=00=07=00=00=00=00=BE=00=00=00=00=00=00=07=00=00=00=00=BF=00=00=00=00= =00=00=07=00=00=00=00=C0=00=00=00=00=00=00=07=00=00=00=00=C1=00=00=00=00=00= =00=07=00=00=00=00=C2=00=00=00=00=00=00=07=00=00=00=00=C3=00=00=00=00=00=00= =07=00=00=00=00=C4=00=00=00=00=00=00=07=00=00=00=00=C5=00=00=00=00=00=00=07= =00=00=00=00=C6=00=00=00=00=00=00=07=00=00=00=00=C7=00=00=00=00=00=00=07=00= =00=00=00=C8=00=00=00=00=00=00=07=00=00=00=00=C9=00=00=00=00=00=00=07=00=00= =00=00=CA=00=00=00=00=00=00=07=00=00=00=00=CB=00=00=00=00=00=00=07=00=00=00= =00=CC=00=00=00=00=00=00=07=00=00=00=00=CD=00=00=00=00=00=00=07=00=00=00=00= =CE=00=00=00=00=00=00=07=00=00=00=00=CF=00=00=00=00=00=00=07=00=00=00=00=D0= =00=00=00=00=00=00=07=00=00=00=00=D1=00=00=00=00=00=00=07=00=00=00=00=D2=00= =00=00=00=00=00=07=00=00=00=00=D3=00=00=00=00=00=00=07=00=00=00=00=D4=00=00= =00=00=00=00=07=00=00=00=00=D5=00=00=00=00=00=00=07=00=00=00=00=D6=00=00=00= =00=00=00=07=00=00=00=00=D7=00=00=00=00=00=00=07=00=00=00=00=D8=00=00=00=00= =00=00=07=00=00=00=00=D9=00=00=00=00=00=00=07=00=00=00=00=DA=00=00=00=00=00= =00=07=00=00=00=00=DB=00=00=00=00=00=00=07=00=00=00=00=DC=00=00=00=00=00=00= =07=00=00=00=00=DD=00=00=00=00=00=00=07=00=00=00=00=DE=00=00=00=00=00=00=07= =00=00=00=00=DF=00=00=00=00=00=00=07=00=00=00=00=E0=00=00=00=00=00=00=07=00= =00=00=00=E1=00=00=00=00=00=00=07=00=00=00=00=E2=00=00=00=00=00=00=07=00=00= =00=00=E3=00=00=00=00=00=00=07=00=00=00=00=E4=00=00=00=00=00=00=07=00=00=00= =00=E5=00=00=00=00=00=00=07=00=00=00=00=E6=00=00=00=00=00=00=07=00=00=00=00= =E7=00=00=00=00=00=00=07=00=00=00=00=E8=00=00=00=00=00=00=07=00=00=00=00=E9= =00=00=00=00=00=00=07=00=00=00=00=EA=00=00=00=00=00=00=07=00=00=00=00=EB=00= =00=00=00=00=00=07=00=00=00=00=EC=00=00=00=00=00=00=07=00=00=00=00=ED=00=00= =00=00=00=00=07=00=00=00=00=EE=00=00=00=00=00=00=07=00=00=00=00=EF=00=00=00= =00=00=00=07=00=00=00=00=F0=00=00=00=00=00=00=07=00=00=00=00=F1=00=00=00=00= =00=00=07=00=00=00=00=F2=00=00=00=00=00=00=07=00=00=00=00=F3=00=00=00=00=00= =00=07=00=00=00=00=F4=00=00=00=00=00=00=07=00=00=00=00=F5=00=00=00=00=00=00= =07=00=00=00=00=F6=00=00=00=00=00=00=07=00=00=00=00=F7=00=00=00=00=00=00=07= =00=00=00=00=F8=00=00=00=00=00=00=07=00=00=00=00=F9=00=00=00=00=00=00=07=00= =00=00=00=FA=00=00=00=00=00=00=07=00=00=00=00=FB=00=00=00=00=00=00=07=00=00= =00=00=FC=00=00=00=00=00=00=07=00=00=00=00=FD=00=00=00=00=00=00=07=00=00=00= =00=FE=00=00=00=00=00=00=07=00=00=00=00=FF=00=00=00=00=00=00=07=00=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=8C=AC=01= =01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01=01=B5= =01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01=00= =01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01= =E8=04=01=01=00=00=00=01=01=01=01=01=01=01=01=01=01=01=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=00=00=00=00=00=00=00=00=01=01=01=01=01=01=01=01=01=01=01=00=00=00=01= =01=00=00=01=01=00=00=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=01=01=01=01=01=00=00=00=01=00=00=00=00=00=00=00=00=00=00= =01=01=01=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=01=01= =01=01=00=00=00=00=00=00=00=00=01=01=00=00=00=00=00=00=00=01=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=00=01=00=00=00= =01=01=FF=FF=01=01=00=00=00=01=00=01=01=00=00=00=00=01=00=01=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=01=00=00=01=00=01=00=00=00=00=00=00=00=00= =01=00=00=00=01=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=00= =00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=00=01=00=00= =00=01=01=E0\=01=01=00=00=00=01=00=00=01=01=00=00=01=00=00=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=01=00=00=01=00=00=00=01=00=00=00=00=00=00= =00=01=00=00=00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01= =00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=00=01=00= =00=00=01=01=FF=FF=01=01=00=00=00=01=00=00=00=01=01=00=01=00=00=01=00=00=00= =00=00=00=00=00=01=01=00=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01= =01=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01=01= =01=00=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=00=00= =00=00=01=00=00=00=00=00=01=00=01=01=00=00=00=01=01=01=00=00=01=00=01=01=00= =00=00=01=01=01=00=00=00=01=01=01=00=00=00=01=01=01=01=00=00=00=00=00=00=00= =01=00=00=00=00=00=00=01=01=01=00=00=00=00=01=00=00=00=00=01=01=01=01=00=00= =01=01=01=00=00=01=00=01=01=00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=01=01=01=01=00=00=01=00=00=01= =00=00=00=01=01=F4=88=01=01=00=00=00=01=00=00=00=01=00=00=00=00=00=01=00=00= =00=00=00=00=00=00=01=00=01=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01= =00=00=00=01=00=00=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00= =00=00=01=00=00=00=00=00=00=00=00=01=01=01=00=00=01=00=00=00=01=00=00=00=00= =00=00=00=01=00=00=00=00=00=01=01=00=00=01=00=00=00=00=00=01=00=01=01=00=00= =01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=00=00=00=00= =00=01=01=01=01=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00= =01=00=00=00=01=00=01=01=00=00=01=00=01=00=00=00=01=00=00=00=00=00=00=00=00= =00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=01=00=00= =01=00=00=00=01=01=F6=C0=01=01=00=00=00=01=00=00=01=00=01=01=00=00=00=01=00= =00=00=00=00=00=00=00=01=00=01=00=01=00=01=01=01=01=01=00=00=01=01=00=00=00= =00=01=01=00=00=00=00=01=01=01=01=00=01=00=00=00=01=00=01=01=01=01=01=00=00= =01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00=00=00=01=00=00=00= =00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=00=01=01=01=01=00=01=00=00= =00=01=00=01=00=00=00=01=00=01=01=01=01=01=00=01=00=00=00=01=00=00=00=00=00= =00=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01= =00=01=01=01=01=01=00=01=00=00=00=00=00=00=01=01=00=00=00=00=00=00=00=00=00= =00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=01=00= =00=01=00=00=00=01=01=A4=1C=01=01=00=00=00=01=00=00=01=00=00=01=01=00=00=01= =00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=00= =00=00=00=00=01=00=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=00=00= =00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00=00=00=01=00=00= =00=00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00= =00=00=01=00=01=00=00=00=01=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=00= =00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00= =01=00=01=00=00=00=00=00=01=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00= =00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=01=01=01=01=01=01=01= =00=00=01=00=00=00=01=01=01=01=01=01=00=00=00=01=00=01=00=00=00=00=01=01=00= =01=00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=00=00=01=00=01=00=00=00= =01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=01=01=01=01=00=01=00=00=00=01= =00=01=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=01=00=00= =00=00=00=00=00=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01= =00=00=00=01=00=00=01=01=01=01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=00= =00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00= =00=01=00=01=00=00=00=01=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=00=00= =00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00= =00=00=00=01=00=00=00=01=01=8C=AC=01=01=00=00=00=01=00=00=00=00=00=00=00=00= =00=01=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=01=01=00=00=00=01=01= =01=00=00=00=01=01=01=00=00=00=01=01=01=01=00=00=00=00=00=01=00=00=01=01=01= =00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=00=01=00=00= =00=00=00=00=00=00=00=00=01=01=01=00=00=01=00=00=00=01=00=00=01=01=01=01=00= =01=00=00=00=01=00=00=00=00=00=01=00=00=01=01=01=00=00=00=01=01=01=01=00=00= =00=00=00=00=00=01=00=00=00=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01= =01=01=01=00=00=01=01=01=00=00=01=00=00=00=00=00=00=01=01=01=00=00=00=00=00= =00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=00=00= =00=00=00=00=01=00=00=00=01=01=01=B5=01=01=00=00=00=01=01=01=01=01=01=01=01= =01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=01=00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=01=01=01=01= =01=01=01=01=01=01=00=00=00=01=01=00=01=01=01=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=01=01=E8=04=01=01=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=01=01=00=00=01=01=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=01=01=FF=FF=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=E0\=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=FF=FF=01=01|||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||z|||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= =01=01=F4=88=01=01|||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||}z|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||}=01=01=F6=C0=01=01||~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=A4=1C= =01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}z||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}|~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC=01=01||~~~= ~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~}}=01=01=01=B5=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~~~~~~~~~~~~~~= ~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01=E8=04=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}}}}}}}}}}}}}}}}}}}~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01= =01||~}}}}}}}}}}}}}}}}}}}|~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01=01||~}}~~~~~= ~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~vvvvvv~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{zz{zzz{{{{{{{{{z{zzzz{{{{zzzz{{{{{{{{{zz{zzz{{{{{{{{{{{{{zzz{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{zz{{{{zzzz{{{zzzzz{{{zzz{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=A4= =1C=01=01||~}}|||||vvvvv||||||||~~}}{{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{zz{{zzz{{{{zzz{{{{{{{{= {{zz{{zz{{{{{{{{{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{z{{{= {zzzz{{{zz{{zz{{zzzzz{{zzzzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}|||||vv||||||||}||~~}}{{{{{{= {{z{{{{{{{{{{{{z{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{{{{{{{z{{{zzz{{{{zzz{{{{{{{{{{{{{{zz{{{{{{{{{{{z{{{zz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{{{zz{{zz{{z{{{{{z{{{zz{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC=01=01||= ~}}||~~~v|||||~~~}}||~~}}{{{{{{{{z{{{{{zz{{{{{zz{{{{{{{{{{zz{{{{{{{{{{{{{= {{{{{{zzz{zz{{zz{{{zzzz{{zzz{{zz{{{{{{{zz{{{z{zz{{z{zz{{{zzzz{{zzz{{zz{{{= {zz{{{{{{{{{zz{{{{{zzz{zz{{{{zzz{zzz{zzz{zz{{{{{zzzz{{zzzz{{{{{{{zz{{{zzz= {zz{{zzzz{{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01=01=B5=01=01||~}}||}}}}}}}}}}}}}}||~~}}{{{{{{{{zz{{{z{{z= {{{zzz{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{zzz{zzz{zz{zz{{zz{{zz{{zz{{{{{{{zz{= {{z{zz{{z{zz{{zz{{zz{{zz{{zz{{{{zz{{{{{{{zzz{{{{{{{zzz{zz{{z{{zz{zz{{z{{z= {{{{{zz{{zz{{zz{{{{{{{{zz{{{{zzzz{{{zzzzz{{{zzz{{{{zz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~}}|}}}}}}}= }}}}}}}}||~~}}{{{{{{{{zzz{{{{{z{{zzzz{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{zz{{= zz{{zz{{{{{zz{{zz{{zz{{{{{{{zz{{{z{zz{z{{zz{{{{{{zz{{zz{{zz{{{{{{{{{{{{{{= zzz{{{{{{zz{{zz{zz{{zz{zzz{zz{z{{{{{zz{{zz{{zz{{{{{{{{zz{{{{zzzz{{{{{{zz{= {{{zzz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}= =01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzzz{{{z{{zzzzz{{z{{= {{zz{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{zz{{zzzzz{{zz{{zz{{{{{{{zz{{{z{{zzz{{z= z{{{zzzzz{{zz{{zz{{{{{{{{{{{{{{{zz{{{{{{zz{{zz{zzzzzz{{zz{zzz{{{{{{zz{{zz= {{zz{{{{{{{{zz{{{zz{{zz{{{{{{z{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{zzz{{{z{{{{zzzz{zzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{zz{zz{{= zz{{zz{{zz{{{{{{{zz{{{z{{zzz{{zz{{zz{{zz{{zz{{zz{{{{{{{{{{{zz{{{z{{{{{{zz= {{zz{zz{{{{{{zzz{zz{{{{{{zz{{zz{{zz{{{{{{{{zz{{{zz{{zz{zz{{{z{zz{{{z{{{zz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zz{{{{{{{{{{zzz{{zzzzz{{{{{{{{{{= {{{{{{{{{{{{{{{zz{{zz{{zz{zz{{zz{{zz{{zz{{{{{{{zz{{{z{{{z{{{zz{{zz{{zz{{z= z{{zz{{{{zz{{{{{zzz{zz{{{{{{zz{{zz{zzz{{z{{zzz{zz{{{{{{zz{{zz{{zz{{{{{{{{= zz{{{zz{{zz{zz{{zz{zzz{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{= {{{z{{{{{{zz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{zzz{zzz{zzz{zzzzzzzzzz{{{= {{{zz{{zzz{{z{{zzzz{{zzz{zzzzzzzzzz{{{zz{{{{{{zzzz{{{{{{zzz{{zzz{zzzz{{{{= z{{z{{{{{{{{zzzz{{zzzz{{{{{zzzzzz{{zzzz{{{zzzz{{{zzzz{{{{zz{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01=01||~}}~~= ~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{{{{{{{{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzzzzzzzzzzzzz= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01= =A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= }}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zzz{{zzz{{{{{{{{= {{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {zz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz= zzzz{~~~~~~~~~~~~~~~~~~~~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF= =FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{zz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{= z{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zz{{zzz{~~~~~~~~~~~~~~~~~z{~~zz{~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{= z{{{{{zz{{{{{zz{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{zzz{{{{zzzz{zzzzzz{zzz{zz= z{{zzz{{zz{zz{zzz{{{{zzz{{{zzzz{{{zzz{{{{{{zzz{{zz{{zz{zzzz{{zzz{{{{{{{z{= {{{z{{{{z{{{{zzz{{{{zzz{{{{{{z{zz{{z{{{{zzz{{zzz{zzz{zzz{{{{{z{z{{{z{z{{{= {zzz{{{{zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{zzz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~{zz{~~~~~~~= ~~~~~~~~~zz{~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01=01||~}= }~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zz{{{z{{z{{{zzz{{{{{{{{{zz{{{{{{{{{{{{{{{{= {{{{{zz{{z{{zz{{z{{z{{{z{{z{{{z{{z{{{z{{zz{zzz{zz{{z{{z{{zz{z{{{z{{z{{{{{= zz{{z{{z{{{z{{z{{{zz{zz{{{{{z{{{{{zzzzzz{{{zz{{z{{z{{z{{{{{{z{{z{{z{{{z{{= {z{{z{{{z{{{z{{{{{{z{zz{zz{z{{{z{{{z{{z{{z{{z{{z{{zz{{z{{zz{z{{{z{{{z{{z{= {z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~zz{~~zzzzz{zzz{zzz{zz{~zzzz{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzz{{{{{z{{= zzzz{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{{{z{{{z{{z{{{z{{zzzzz{{z{= {{z{{{z{{zz{{{{z{{{z{{zz{{{{{{{{{{zz{{z{{{z{{z{{{z{{{z{{{{{z{{{{{z{{{{z{{= {{{{zz{{zz{{{{{{{{z{{zz{z{{{zzzzz{{z{{{z{{{z{{{{{{z{{z{z{{z{{{zzzzz{{zz{{= {{zz{{{{{{{zz{{z{{{z{{zzzzz{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~~zz{zz{{zz{{zzz{zz{{zz= {{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{zzzz{{{z{{zzzzz{{z{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{zz{z{= {z{{{{{{z{{{z{{{z{z{{{z{{{{{{z{{{z{{{z{{{zz{{{zz{{z{{{zz{{{{{{{zz{z{{z{{{= z{{z{{{z{{{z{{{{{z{{{{{z{{{{z{{{{zz{z{{{zz{{{{{{{z{{{z{z{{{z{{{{{{{z{{z{{= z{{{{{{{z{{z{z{{z{{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{zz{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~zzzzzz{{zz{~zz{~zz{{zz{~zz{~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzz{{{z{{{{zzzz{zzz{{zz= {{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{{{{{z{{{z{{{z{z{{{z{{{{{{z{{{z{{{z{{{{z= z{{{zzz{{{{{zz{{{{{z{{{z{{z{{{z{{z{{{z{{{z{{{{{z{{{{{z{{{{z{{{z{{{z{{{{zz= {{{{{{z{{{z{z{{{z{{{{{{{zzz{zzz{{{{{{{z{{{z{{{z{{{z{{{{{{{{zz{{{{zz{{z{{{= z{{{zzz{{{z{{{{{{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{{{{{~zz{~zz{~zz{~zz{~zz{~~zz{~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{zz{{{{{{{{{{zzz{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{zz{{{z{z{{{= z{{{{z{{{{zz{{{z{z{{{z{{{z{{z{{z{{{z{{{{{z{{z{{z{{zz{{z{{zz{zz{{z{{{zz{zz= {{{{{z{{{{{z{{{{z{{{zz{{z{{z{{z{{{{{{z{{{{zz{{{zz{{{z{{{z{{{z{{{{{{{{z{{{= z{{{z{{{zz{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{z{{z{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~~~~= ~zz{~zz{~zz{~zz{~zz{z{{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{{{z{{{{{{zz{{{zzz{{{{{{{{{{{{{{= {{{{{{{{{{{{{zzz{z{{zzzz{{{zzzzz{{{z{{{{{zzzz{zzz{zzz{zzz{zzz{{{{zzzz{{zz= z{{{z{{{zzz{z{{zz{zz{{zz{{zzz{{{{{{{z{{{zzz{{zzz{{{zzz{z{zzz{{{{{{zzz{{{{= z{{{{zzzz{{{{z{{{z{{{{{{{zzz{{z{{zzz{{{zzzz{{zzz{{{zzz{{{{zzz{z{{zzzz{{{z= zzz{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~zz{~~~~~zz{~zz{~zz{~zz{~zzz{{zz{~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{= {{{{{{{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzzz{~~~~{zzz{zzzzz{= ~zzz{{zz{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{zzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~{{{{{~~~~~{{{{{{{{{{~{{{{~{{{~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{zzzzzzzzzzzzz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01= =FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~~~= ~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{zz{{{{{{{z{{zzz{{zzz{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{= zzz{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}= }=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzzzzzzzzzzzzz{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{{= zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|= |~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{z{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{z{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{{{zz{{{{{zz{{{{{{{{{{zz{{{{{= {{{{{{{{{{{{{{zz{zz{zz{{zzzz{{zzz{{{{{{{{{{{zz{zz{zzz{{{{zzz{{zzzz{{zzz{{= zz{zz{zzz{{{{zzz{{zz{{z{{{{{{z{{{{z{{{{z{{{{zzz{{{{zzz{{{{{{z{zz{{z{{{{zz= z{{zzz{zzz{zzz{{{{{z{z{{{z{z{{{{zzz{{{{zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{z= zz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z= z{{{z{{z{{{zzz{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{z{{zz{zz{{z{{{zz{zz{{{{{{{{= {{{zz{zzz{zz{{z{{{z{{z{{{zz{{z{{zz{zzz{zz{{zz{{z{{z{{z{{{{{z{{{{{zzzzzz{{= {zz{{z{{z{{z{{{{{{z{{z{{z{{{z{{{z{{z{{{z{{{z{{{{{{z{zz{zz{z{{{z{{{z{{z{{z= {{z{{z{{zz{{z{{zz{z{{{z{{{z{{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzz{{{{{z{{zzzz{{{{{{{{zz{{{{{{{{{{{{{{{{{{= {{{{z{{z{{{z{{z{{{z{{{z{{{{{{{{{{{z{{{z{{{z{{zzzzz{{z{{{{{{zz{{z{{{z{{{z{= {{{{zz{{z{{z{{{{{z{{{{{z{{{{z{{{{{{zz{{zz{{{{{{{{z{{zz{z{{{zzzzz{{z{{{z{{= {z{{{{{{z{{z{z{{z{{{zzzzz{{zz{{{{zz{{{{{{{zz{{z{{{z{{zzzzz{{zz{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzzz{{{z{{zz= zzz{{z{{{{zz{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{{z{{{z{{zzzzzzz{{z{{{z{{{= z{{z{{{{{{z{{{{zz{z{{z{{{z{{{z{{{zz{z{{z{{z{{{{{z{{{{{z{{{{z{{{{zz{z{{{zz= {{{{{{{z{{{z{z{{{z{{{{{{{z{{z{{z{{{{{{{z{{z{z{{z{{{z{{{{{{{zz{{{{zz{{{{zz= {z{{zz{{z{{z{{{{{{{zz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{zzz{{{z{{{{zzzz{zzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{= z{{z{{{z{{{z{{{{{{{{{{{z{{{z{{{z{{z{{{{{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{= z{{{{{z{{{{{z{{{{z{{{z{{{z{{{{zz{{{{{{z{{{z{z{{{z{{{{{{{zzz{zzz{{{{{{{z{{= {z{{{z{{{z{{{{{{{{zz{{{{zz{{z{{{z{{{zzz{{{z{{{{{{{{zz{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zz{{{{{{{{{{zzz{{zzzzz{= {{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{{zz{zz{{{{{{{{{{{z{{{z{{{z{{zz{{{z{z= {{{zz{{z{{z{{{z{{{z{{zz{{z{{z{{z{{{{{z{{{{{z{{{{z{{{zz{{z{{z{{z{{{{{{z{{{= {zz{{{zz{{{z{{{z{{{z{{{{{{{{z{{{z{{{z{{{zz{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{= zz{{{z{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{= {{{{{{z{{{{{z{{{{{{zz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzz{zzzzzzz{{zzz{{= {{{{{{{{{zzz{zzz{zzz{{zzzz{{{zz{{zzz{zzzz{zzz{zzz{{zzz{zzzzzzz{{{{{z{{{zz= z{{zzz{{{zzz{z{zzz{{{{{{zzz{{{{z{{{{zzzz{{{{z{{{z{{{{{{{zzz{{z{{zzz{{{zzz= z{{zzz{{{zzz{{{{zzz{z{{zzzz{{{zzzz{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{{{{{{{{{{zz{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzzzzzz= zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zz{{zz{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= }}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C= =AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||= ~}}||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01=E8=04=01=01||~}|||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~~~~~~~~~~~= ~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}= =01=01=FF=FF=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~~~~~~~~~~~~~~~~~~~~~~~}= }{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01= =01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~}}=01=01=F4=88=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~~~~~~= ~~~~~~~~~~~~~~~~~}|||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||~}}z||~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~}}=01=01=A4=1C=01=01||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}z||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01= =8C=AC=01=01|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}z|}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}=01=01=01=B5=01=01zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=01=01=00=01=01=01= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||=01=01=E8=04=01=01||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||}=01=01=00=00=01=01||~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= }}=01=01=FF=FF=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}=01=01=E0\=01=01||~~~~~~~~~~~~~~~~~~~~~~= ~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|~}}=01=01=FF=FF= =01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~~~= ~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=A4=1C=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}}}}}}}}}}}}= }}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=8C=AC=01=01||~}}}}}}}}}}}}}}}}}}}|~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{z{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF= =FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{= {{{zzz{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{{{{{zzz{{{zzz{zzzzzzz{{{= zzz{zzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{zz{{{{{{{zzzz{zzzzzzzzzz= {zzzz{{{{{{{{{{{{{{{{{{zz{{zzzz{{zzzz{{zzzz{{{{{{{{{{zz{{{zz{{{zz{{{zz{{{= {{{{{{zzzz{zzzzz{{{zz{{zzzzz{{{{zz{{{zzzzz{{{{{{zzzzz{{{{{{zzzzz{{{{{{{{z= {{zz{{{{{{{{z{zzz{{{{{z{{zz{{{zz{{{zz{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{{zzz{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{z{zz= {zzzz{{{{{{{zz{{zzz{{{zz{{zz{{zzz{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= {{{{{{{{{{{{{{{{{zz{{zz{{zz{{zz{{zz{{{{{{{{{{{{{{{{{{z{zz{{zz{{zz{{z{zz{{= zz{{{{{{{{zzzz{zz{z{zzzz{zzzz{{{{{{{{{zz{{{zz{zz{z{zz{{zz{zz{{z{zz{zz{{zz= {{{{{{{zz{zz{{{zz{{{{zz{{{{{{zz{{zz{{{{{{{zz{zzz{{{{zz{zz{z{zzz{{zz{z{zzz= zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{z{z{z{{{{z{{{{{{{{{{{z{{{{{{{= {{{{{zz{{zz{zzz{zz{{{{{{{{{z{zz{{{zz{{{{{{zzz{{zzz{{zz{{zzz{{zzz{{zz{{{{{= {{{zzzzz{zz{zzzzzzz{zzzzzz{{{z{{zzz{{zzzzz{zz{{{zz{zz{{zz{{zzzz{z{{{{{{{{= {{{{{{{{{{{z{zz{{zz{{zzz{{{zz{{zz{{{{{{{{{{zz{zz{z{{{zz{{{zz{{{{{{{{{zz{{= {zz{zz{z{zz{{zz{zz{{z{zz{zz{{{{{zz{zz{zz{zz{{zz{zz{z{zz{zzz{zzz{zz{{{{{{{= z{{z{{{{{z{z{zz{z{{zz{{zz{z{{zzz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{= {{{{{{{{{{z{{{{{{{{{{{{zzz{{{{{{{{{{zz{{zz{z{zz{zz{{{{{{{{z{zz{{{z{{{{{{{= z{z{z{z{{{zz{{z{z{z{z{{{zzzz{{{{{z{{z{zzz{zz{z{{zzzzz{z{{z{zz{z{{z{{{zz{z= zzz{{{zz{z{{{zz{{z{zz{z{{{{{{{{{{{{zzzzz{{{{z{{{zz{{{zzz{{zz{{zz{{{{{{{{{= {z{{zz{z{{{z{{{{z{{{{{{{{{{zz{{{zzzz{{{{z{{{zzzz{{{{{z{{zz{zzz{zz{zz{zzzz= {{zz{zz{z{{zzzz{z{zz{{zz{{{{{{zz{{zzz{{z{{z{{zz{{{zz{{zz{z{zzzzz{{zz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{z{z{{{{{{z{{{{{{{{{{{{{zz{{zzzz{{{zz{{zz= {z{zz{zz{{zzzz{{{zzz{{z{{{{{{{zz{zz{zz{{zz{{zz{zz{zz{{zz{{{{{{{zzzz{{zz{z= z{{z{zz{z{zzz{zz{z{zzzz{{{{z{{z{{z{{{zz{z{{zz{{{z{zzzz{{{{zzzz{{{{{{{{{{{= {{{{{{zz{{{{zzz{zz{{zz{{zzzz{{{z{{{zz{z{{z{{{{z{{{{zzzz{{{zz{{{zz{{{{{{{{= {{zz{zz{{{{{{{zz{{zz{{zzz{{zz{z{{zz{z{{z{{zzzzzz{zz{{zz{{{{{{zz{{{{zz{zzz= zzz{zz{{zz{{zz{z{{{z{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{{{{{z= {{{{{{{{{{{{z{zz{{{{{{{{{zz{{zz{z{zz{zz{{{{{{{{{{z{{zzzz{{{{{zz{zz{zz{{zz= {{zz{zz{zz{{zz{{zz{{{zz{{zzzz{zz{z{{z{z{z{z{{z{zz{zz{{z{{zz{zz{z{{{{zzz{{= {zz{{zz{{zz{{{{{{{{{{{{{zzzzz{{{zz{{{zz{{z{{zz{zz{{zz{{{{{{{{zzzz{zz{z{zz= zz{zzzz{{{{{{{{{zz{{{zz{{{{{zz{{{zz{zz{{{zz{{zz{{zz{{zzz{{zz{zz{zz{z{{z{{= z{zz{{{zz{{zz{zz{{{zz{{z{zz{{{zz{z{zz{{zz{{zz{z{{{{{{{{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zzz{{{{{{{{{{zz{{{zzz{zz{zzz{{= {{{{{zz{{{zzzz{{{{zzz{z{zzzzzzzzzzz{z{zzzzzzzzzz{{{{{zzzzz{zz{zzzzzz{z{zz= zzz{{zzz{zzz{{{zz{zz{zz{{{zz{{{zzzzzzzz{zz{{{{{{{{{{{{{{{{{{{{{zz{{zzzz{z= zzz{{{zzzz{{{{{{{{{zzzz{{zz{{zzzz{zzzz{{{{{{{{{zz{{zzzz{{{{zz{{zzzzz{{{{z= z{{{zzzz{{{{z{{zzz{zzzzz{{zz{zz{{{zzz{{zz{zz{zz{{{zz{{zzz{{{{zz{{zz{{zzzz= {{zz{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{{{{z{z{z{z{z{z{z{{{{{{{{{{{{= {{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{zz= z{{{{{{{{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= z{{{{{{{{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{zz{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{zzzzzzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{zzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{zzz= z{{{zzz{{{{{{{{{{{zzzzzz{{{{{{{{{{{{{{{{{zzzzzz{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{z{{{{{{{{{{{{{{{{{{{{{{= {{{zzz{z{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zzzzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zzz{{{{{{z{{{{zzz= z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{zz{zz{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{= z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{z{{{{{{{{{{z{z{z{z{{{{{{{{{{{{{{= {{{{{{{{{{z{{{zz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{zz{zz{{{zzz{{{zz{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{{{{= z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{z{{{z{{{= {{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{z= {{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zz{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{{{{z{{{z{{{{z{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{z{{{{{{{z{{zz{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{z{{zz{{zz{= zz{zz{{{{{{{{{{{z{{{{z{{{{{z{{{{{{{{{{z{{{{z{{{{zz{{{{z{{{{{{z{{{{z{{{{zz= {{zzz{zz{zz{{zz{{zz{zz{{{zz{z{{{{zz{{{z{zz{{{{{{{{{{{{{{{{{{{{z{{{z{{zz{z= z{zz{{{{zzz{{z{zzz{{{{zz{{{{{zzzz{{zzz{{zzzzzzzz{{zzz{{z{zzzzz{{zz{{{zzzz= {{z{{{zz{z{{z{zz{zz{{zz{zz{zzz{{{{zzz{{{{{{{zzzz{{{zzz{{zz{zz{zzz{{{{{{{z= {{{{{{z{{{{{z{{{z{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{zz{zz{{{{{{{{{= {{{z{zz{{{{{{{{{{{{{{z{{{z{{{z{{zz{zz{{{{{{{{{{zz{{zz{{{{zz{{{{{{{{{{zzzz= z{{{zz{{z{{{z{{{{{{zzzzz{{{zz{{z{{{zz{zz{z{{{z{{{zz{z{{z{{zz{{zz{{z{{{z{{= {{{{{{{{{{{{{{{{{{{{zzzzz{{{z{{zz{zz{{zz{{z{{zz{z{{{{{zzz{{{{z{{{z{{{z{{z= {{{z{{{z{{{z{{zz{z{z{{{z{{zz{{z{z{{{z{{z{{{z{{zz{zz{{zz{zzz{zz{{zz{{z{{{{= {zz{{z{{zz{zz{{zz{zzz{zz{{{{{z{{{{{{zz{{{{{z{{{z{{{{z{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{z{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{{{{= {{{{{{zzzz{{{{{z{{{{{{{{{{{z{z{{{{{z{{zz{{{{{{{{{{z{z{{{{{z{{zz{{zz{{z{{z= {{z{{{zz{{z{z{{{z{{{z{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{{{{z= z{{z{{{{{{{{{{zz{{{z{{{zzzzz{{z{{{z{{{zzzzz{{z{{{{z{{{z{{z{{{z{z{{z{{{z{{= {z{{z{{{z{{z{{{z{{{z{{{{{zz{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{{{{{{z{{{{{= {z{{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{zzzzz{{{zz{{{{{{{{{{{{{{{{z{{z= zzzzzz{{{{z{{{z{{{z{{z{{{z{{zzzzzzz{{{{{z{{{{z{{{{{{{{{{{z{{{z{{{zzzz{{{{= {{{{{{{z{{{z{{{zzzz{{{{z{{z{{z{{{z{{{z{{z{{z{{{z{{zzzz{{{{z{{{{{{{{{{zzzz= zzz{{{{{{z{{{{{{{z{{z{{{z{{{zz{z{{z{{{{{{{{{{{{z{{z{{{z{{{{{{z{{{z{{{z{{{= {{{z{{{{z{{{z{{z{{{z{z{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{{zz{z{{{{{z{{{{{{z{{= {z{{z{{{z{{{z{{{{{z{{{{{z{{{{{{{z{{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{= {{{{{{{{{zz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{{{{{{{{{{{{z{{= {{z{{{{{{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{z{{{z{{{z{{{{{{{z{{z{{z{{z{{{{z{{z{= {z{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{z{{{z{{z{{{z{{z{{{{{{{= z{{{{z{{z{{{z{{{{{{z{{{z{{{z{{{{{{z{{{{z{{{z{{z{{{z{z{{z{{zz{{z{{{z{{{z{{= z{{{z{{{z{{z{{{z{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{{{{z{{{{{{{{z{{{z{{{{z= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{z{{zzzz{{{{zz{{{{{{{{{{{{z{{z{{{{{{{{{{{{z{z{{= {zz{zz{{z{{{z{{{{{{{{{{{zz{{{{zz{{{z{{{{{{{{z{{{{z{{zz{{z{{{z{{{{{{z{{{{z= {{zz{{z{{z{{z{{z{z{z{z{z{{z{z{z{zz{z{zz{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {z{{z{{z{{{z{{zz{{z{{z{{{{{{{zz{{zz{{z{{{zz{{{z{z{{{z{{{zz{{{z{z{{{{zz{zz= {{zz{zz{zz{{zz{zzz{{{{z{{{z{{z{{{z{{{z{{zz{{z{{z{{zz{{{z{zz{zz{{z{{{z{{{z= {{{{{z{{{zz{{{z{{{{z{{{zz{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{{{{zz{{{= {{{{{{{{{zzz{{{{{{{{{{{{{zz{{{{{zz{zzzzz{zzz{{{{{{{{{zz{{{{{zzzzzz{{{{{{{= zzz{{{zz{{zzz{{{{z{{{{{zzz{{{zz{{zzz{{{z{{z{{{z{{{z{{z{{{z{{{z{zz{{{zzz{{= {z{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{zzzzzz{zzz{{zzz{zzzz{{{{{{z{zzz{{{{zz{{z= zzz{zzzzzzzz{{zzzz{zzz{{{{zz{zz{{zzz{z{z{{{{{{{{{{{zzz{zzzzzz{zzz{zzz{{zz= z{z{z{{{zzzz{{{zzz{{zzz{zzz{zzz{{{{{z{{zzzzzz{{zzzzz{{zzzz{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= {{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{zzzzzzzzzzz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{= {{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{zzz{{{{{{{{{{{zzzzzz{{{{{z{= {{{{{{{{{{{{{{{{{{z{{zz{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zz{{{{{zzz{{z= zz{{zz{{{{{zzz{{zzzzzzz{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{zzz{z{{{{zzzz{{{{{{{{{{{{{zzz{{{{zz= zz{{{zzz{{{{zzz{{{{{{{{{{{{{{zzz{{zzzzz{{{zzz{{{zzzzzz{{{zzz{{{{{zzzz{z{{= {{{{{{{zzzzzz{{{{{{{zzzzz{{{{{{{{{{{{{{{zz{{{{{{{{{{z{{{{{z{{{{{{z{{{zzzz= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= zzzzzzzzzzzz{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{= zz{zz{zz{{{{{{{{{{{z{{{zz{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{zz{{{{z{{{{z{{{{{zz{{{{z{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{zz{{z= z{{{zz{{zz{{{{{{{{{{{zz{zz{{zz{{zz{zz{zz{{zz{zz{{{{{{{{{{{{{{z{{{{z{{zz{z= {{{z{{{z{{{zz{z{{{z{{{zz{{{zz{{{{{{{{{{{z{{zz{{{{zz{{{{{zz{{{{{{{{{{z{{{z= {{{{{{{{{{z{{{{zz{{{{{zz{{zz{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{z{{{z{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{z{{{{= {{{{{{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{zz{{{z{z{{{{z{{{{zz{{{z{z= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{z{{{z{{{z{{{{z{{{z{{{{z{{{{{{{{{{{z{{{z{{z{{{{z{z{{{z{{z{= {{z{{{{{{{{{{{{{{z{{{{z{{{z{z{{{z{{{z{{{{z{z{{{z{{{z{{{{{z{{{{{{{{{{{z{{{= z{{{zz{{{{{{{z{{{{{{{{{{z{{{z{{{{{{{{{z{{{{{zz{{{{{zz{{z{{{{z{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{z{{zz= {{{{{{{{{{{{zzz{{{{{{{{{{{{{{{z{{zz{{zz{zz{zz{{{{{{{{{{{z{{{{z{{{{{z{{{{{= {{{{{z{{{{{z{{zz{{{zzz{{zzzz{z{zz{zz{{{z{z{{{zz{{z{{zzzz{zz{{zz{zz{{{zzzz= {{{{{z{z{{z{z{{{{z{{{{z{z{{z{z{{{{z{{{z{{{{{zz{{zz{zz{{{{zz{z{{{{zz{zz{{{= {zz{{zz{{z{{zz{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{zz{{{{{{z{{{{{{z{{= {{{{{{{{{{{{z{{z{{{{z{{{{{z{{{{{{z{{{{{{{{{{{{{{z{{{{z{{{z{{{{{z{{{z{{{zz= {{{{{z{{z{{{{{{z{{zzz{zzz{{z{{{z{{{z{{{zz{z{{z{{{zzz{{zzzz{z{{{{{{{{{z{{{= {z{z{{{{z{z{{z{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{z{{{{{{{zz{zz{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{z{{{z{{{z{{z= z{zz{{{{{{{{{{zz{{zz{{{{zz{{{{{{{{{{z{{{{{z{{{z{{z{{z{{{z{{{{z{{{{z{{zzz{= z{{{z{{z{{{z{{{{z{{{zz{z{{z{{z{{{{{{z{z{{z{z{{{{z{{{{z{z{{z{z{{{{zzzzz{{{= {{{z{{{z{{z{{zz{zz{{{{{{zz{z{{zz{{z{{z{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{z{{{{zzz{{{{z{{{{{{z{{{{{{{{{{{{{zz{{z{{{{z{{{{zz{{{{{zz{{{{{{{{= {{{{{{z{{{{z{{zz{{{{z{{{{zzzzz{{{{{z{{{z{{{{{{{{{{z{{{z{{{z{{zz{{z{{{z{{z= {{{z{{z{{{z{{z{{{z{{{{{{{{z{{{{zz{z{{{zz{z{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{{{{zz{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{{z{{{{{z= {{z{{{z{{{{{z{{{{z{{{{z{{{z{{{z{{z{{z{{{z{{{{z{{{zz{{z{z{{{z{{{{{{z{z{z{{= z{{{{z{{{{z{z{z{{z{{{{z{{z{{{{{{{z{{z{{z{{{z{{{z{{{{{zz{{z{{z{{zz{{z{{z{{= z{{z{{{{{{{{{{{{{{{{{{{zzzzzzz{{{z{{{{{z{{{{{{zz{{{z{{{{{{z{{{{{{{{{{{{{z= {{{z{{{{z{{{{z{{{{{{z{{{{{{{{{{{{{{{z{{{{zzzz{{{{z{{{{{z{{{zz{{{z{{{{z{{{= {zzzz{{z{{{z{{{zzzz{{{z{{z{{{z{{{z{{zzzzz{{z{{{z{{{{{{{{z{{{{z{{z{{{z{{z{= {z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{z{{zzzzz{{{zz{{{{{{{{{{{{{{{{z{{zzzzzzz{{{{z{{{z{{{z{{z{{{z{{zzzzzz= z{{{{{z{{{{z{{{{{{{{{{{z{{{{{z{{{z{{{{z{{{{z{{{{z{{{{z{{{z{{{z{{z{{z{{{z{= {{{z{{{z{{z{{z{{z{{{{{{z{{z{z{z{{{{z{{{{z{{z{z{z{{{{z{{{{{{{{{{{z{{z{{z{{= z{{{z{{{{{{z{{z{{zzzz{{{{z{{z{z{{{{z{{{{{{{zzzzzzz{{{{{{{{{{{{{{z{{{{{z{{= {{{{{{z{{z{{{{{{z{{zzzzzzz{{{z{{{{z{{{{z{{{z{{{{{{z{{{{{zzzzzzz{{{{z{{{{z= {{{{{{{z{{{{{z{{{{z{{{z{{{{z{{{{{{z{{{{z{z{{{{z{{z{{{z{{z{{{z{{{z{{z{{{{{= {z{{{z{{{{{{{{z{{{z{{{z{{z{{{z{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{{{{zz{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{z{{{z{{{z{{z{{{z{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{z{{{{{z{{z{{{{{{z{{= z{{{{z{{{{z{{{z{{{z{{z{{z{{{z{{{{z{{{{z{{z{{{zz{{{{{{{z{{zz{{z{{{{z{{{{z{= {zz{{z{{{{z{{{{{{{{{{{z{z{{z{{{z{{zz{{{{{{z{{z{{z{{{{{{{z{zz{z{{{{{z{{{{{= {{{{{{{{{{{{zzzzzzz{{{{{{{{{z{{{z{{{{z{{{z{{{{z{{{{{{{{{{{{z{{{{{z{{{{z{{= z{{{{{{z{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{z{{{{z{{{{{{{{zz{{{{{z{{{{z{z= {{{{z{{{z{{z{{z{{zz{{z{{{z{{{{{{z{{{z{{{{{{{{z{{{zzzzzz{zzzzzz{z{{{{z{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{zz= zz{{{{zz{{{{{{{{{{{{z{{z{{{{{{{{{{{{z{z{{{zz{zz{{z{{{z{{{{{{{{{{{zz{{{{zz= {{{z{{{{{{{{z{{{zz{{{z{z{z{{z{{z{z{{z{{{{z{z{zz{zz{{z{zz{z{z{z{{z{z{z{{z{= z{z{{{{{{{{{z{{z{{{z{{{{z{{{{z{{z{{{z{{{{z{{{{{z{{{{{zz{{{z{z{z{z{z{z{{{z= {{z{z{zz{{z{{{zz{zz{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{zz{{zz{{{z= z{{zz{{{{{{{{{{{zz{{{z{zz{{zz{zz{{{z{zz{{{z{{{{{{{{{{{z{z{{{{z{{{{{{{z{{{= {{z{{{zz{{{z{{{{{zz{{{zz{{{{{z{{{{{z{{{zz{zz{{zz{zzz{{{{zz{{{z{z{{{z{{z{{= {{{z{{{{{{{z{{{{{{z{{zz{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{{{{zz{{{{{{{{{{{{zzz{{{{{{{{{{{{{zz{{{{= {zz{zzzzz{zzz{{{{{{{{{zz{{{{{zzzzzz{{{{{{{zzzzz{{{{{{z{{zzz{{{zz{{{z{{{{{= z{{{zz{{{{zz{zz{{zz{{{{z{{z{{{z{{zzz{{{{{{zzz{z{{zzz{{zzz{{zzz{z{{zzz{{zz= zzzzz{{{{{{z{{{{{z{{{z{{zz{{{{z{{{z{{{zzz{{{{z{{z{{{{zzz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{zzz{{z{zzz{{{{{zzzz{{{{{{{{{{{{zzzzzz{{zzzz{{zzzzzz{zzzzz= z{{{{{{{{{{{zz{{{{zzz{{{{{{z{{{{zzzzzz{{{{z{{{{{{zzzzz{{{{{zz{{{zzzz{{{zz= {z{{{{{{{{{{{{{zzzz{{{zzzzz{z{{{{{{z{{{{{{z{{{{{{z{{{zzzz{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{zzzz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~= ~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6= =C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{= {{{{{{zzzz{{{zzz{{{{{{{{{{{zzzzzz{{{{{{{{{{{{{{{{{zz{{{{{zzz{{{zz{z{{{{zz= zz{z{{zzz{{zzz{{zzzzzzz{{{{{{z{{{{zzzzzz{{{{{{{zzzzzz{{{zzzzzzz{{{{zzzz{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{zzz{{{{{{= {{{z{{{{{zz{{{{{{{{{zzz{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{z{{{{z{{{{{= {{zz{{{{{z{{{zzzz{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{zz{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{zz{zz{{{{{{{{{{{z{{{{z{{{{{{{{= {{{{{{{{{z{{{{{zz{{{z{{zz{{{zz{{{z{{{{z{{{{z{{{{z{{{{z{{{{{zz{{{{{z{{{zz{= {{{{{{z{{{{z{{{z{{{{z{{{zz{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{z{{z{{{z{{{{{{{{{{zz{{{{{zz{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{zz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{{{z{{zzz{{{{{{zz{{{{{zz{{zz{{zz{{z{z{z{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{= {{{{{{{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z= {z{{{z{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{zz{{{z{z{{{z{{{z{{z{{{{{z{{{{z{{{= {z{{{{z{{{{{{{{{z{z{{{{{z{{{{z{{{{{{{z{{{{z{{{z{{{{{{{z{{{{{z{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{z{{{z= {{{{{{{{{{z{z{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{z{{{{{z{{{{{{{zz{= {z{{{{z{{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{z{{zz{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z= {{zz{{zz{zz{zz{{{{{{{{{{{z{{{{z{{{{{z{{{{{{{{{{z{{{{z{{{{zz{{{{z{{{{{{z{z= {{z{z{{{{z{{{{{{z{{{{{{{{{z{{{{z{{{{z{{{z{{{{{z{{z{{{{z{{{{{z{{{{{{z{{{{z= {{{z{{{z{{{{z{{{{{{{{{{{{{{{{zzzz{{{zz{{{{{{{{{{{{{z{z{{{{{zz{{{{{{{{{{{{= {{{{{{{{z{z{{{{{{zzz{{zz{zzzz{z{zz{{{{{{{z{z{{{z{z{{{{zzz{{{{zzz{{z{zzz{{= zzz{{{z{{{zz{z{{z{{{zzzz{{{zzz{{{{zz{{zz{zzzz{z{{zz{{{{{{zzz{{{{zzzz{zz{{= zz{{{{{{z{{{{{z{{{{z{{{{{{{z{z{{{{{{z{{{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{{zz{zz= {{{{{{{{{{{{zzzz{{{{{{{{{{{{{{z{{{z{{{z{{zz{zz{{{{{{{{{{zz{{zz{{{{zz{{{{{= {{{{{zzzzz{{{zz{{z{{{z{{{{{{z{z{{z{z{{{{{z{{{{z{{{{{{{{{{zzzzzz{{{{zzzzz{= {{{{z{{z{{{{z{{{{{z{{{{{{zzzzz{{{{zzzzz{{{z{{{{{{{{{{{{{{{{{{z{{{zz{zz{{{= {{{{{{{{zzz{z{{zz{{z{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{z{{z{{z{{{zz{zz{{{{{{z= {zz{zz{z{{{zz{zz{{zz{zz{{zz{z{z{{{z{z{{{z{{z{{{z{{zz{{z{{z{{z{{{{{z{{{z{{= z{{{z{{z{{{{{{z{{{z{{zz{{z{{z{{{z{{{{{z{{{{{{z{{{{zzzz{{{zz{z{{{{zz{{{{z{= z{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{z{{{{{{{{{{zz{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{z{{{z{{{z{{z= {{{z{{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{{z{z{{{{{z{{zz{{{{{{{{{{z{z{z{{z{{{{{{= z{{{z{{{{zzz{{{z{{{{z{{{{z{{z{{{{{z{{{z{{{{z{{{{{z{{{{{{z{z{{{{{{z{{z{{{{= z{{{{{{{{{{{{{{{{{z{{{{z{{{z{{{{{{{{{{{z{{{z{{z{{zz{{{{{{{{{{{{{{{{{{{z{z= {{{{{zzzzz{{z{{z{{{z{{{z{{{{{{z{{z{z{{z{{{z{{{z{{z{{{z{{z{{{{zzzzz{z{{z{{= {z{{{z{{z{{{{{{zz{{{{{{{z{{{z{{z{{{zzz{{{{{{{zzzzz{{z{{{z{{z{{{z{{{{{z{{{= {{{z{{{zz{{zz{{z{{z{{{{{{z{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{zzzzz{{{zz{{{{{{{{{{{z= {{{{z{{zzzzzzz{{{{z{{{z{{{z{{z{{{z{{zzzzzzz{{{{{z{{{{z{{{{{{{{{{{z{{{z{{{= zzzz{{{{{{{{{{{z{{z{z{z{{{{{{{{z{{z{{{{{z{{{z{{{{z{{{{z{{{{{{{{zzzzzz{{{z= {{{{{z{{{{{{z{{{z{{{{z{{{{{{{{z{{{{{{{{zzzzzz{{{z{{{z{{{{z{{zzzzzz{{{z{{{= z{zzzz{{{{{{{zzzzzzz{{{{{{{z{{z{{{{z{{{{{{z{{z{{{z{{{z{{{{{{z{{z{z{{z{{{z= {{{z{{z{{{z{{z{{{{z{{{{{z{{z{{{z{{{z{{z{{{{{{{zz{{{{{{z{{{z{{z{{{z{z{{{{{= {{z{{{{{{z{{{z{{z{{{z{{{{{z{{{{{{z{{{z{{{{z{z{{{z{{{{{{{z{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{z{{{{{{{{{{zz{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{{{{{{{= {{{{{z{{{{z{{{{{{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{z{{zz{{z{{{z{{{{z{{z{{{{{z{= {{z{{{{z{{{{z{{{{{{{{z{{{{z{{{z{{{{{z{{{{{{z{{{z{{{{z{{{{{{{{z{{{{{{{{{{{= {{{{{z{{{{z{{{z{{{{{{{{{{{z{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{{{{= z{{z{{{z{{{z{{{{{{z{{{z{{{z{{{z{{{z{{z{{{z{{z{{{{z{{{{{z{{z{{zz{{z{{{z{{{= {{{{{zz{{{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{{{z{{{{{{z{{{z{{{{= z{zzzzzz{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~= ~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{zzzz{{{{zz{{{{{{{{{{{zz{{zz{{{{{{{{= {{{z{z{{{zz{zz{{z{{{z{{{{{{{{{{{zz{{{{zz{{{z{{{{{{{{z{{{{z{{zz{{z{{{z{{{{= {{z{{z{{{z{{{zz{{{z{{zz{{{z{{{{z{{{{z{{{{z{{{{{z{z{{{{{z{{{z{{{zz{{{{{{{z= {{{{z{{{z{{{{{{{{zz{{{z{{{{{{{{{{{z{z{{zz{zz{{{{{{{{{{{zz{zz{{zz{{z{{{{{{= {{{{{{{{{{{{{{z{{{{z{{zz{{{z{z{{z{{{z{{{z{{{{{{z{{{z{{{z{{{zz{zz{{zz{zz{{= z{{{{zz{{{zzz{{zz{zzz{{{{zz{{{z{z{{z{{z{{zz{zz{{z{{{z{{zz{{z{{zz{{{z{zz{z= z{{zz{zz{{{{{z{{{{{{z{{{zz{{zz{{{{{z{{zz{{zz{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{z{{{{{{= {{{{zz{{{{{{{{{{{{zzzz{{{{{{{{{{{{zz{{{{{zz{zzzzz{zzz{{{{{{{{{zz{{{{{zzzz= zz{{{{{{{zzz{{{zz{{zzz{{{{z{{{{{zzz{z{{zzz{{z{zzz{{{{zzzz{{{{zzz{{zzz{{zz= zzzzz{zzz{{{zzz{zzzzz{{{{{{{{zzz{{{zz{zzz{{{{{{{{zzzz{{{{{{{{{{{{zz{{{{zz= {{{{{{{{{{{{{{zz{{{{{zzz{{{{{{{{{{{{{{{{{{{{zzz{{zzz{{zzzz{zzz{{zzzzz{zzz= {{{{zzz{{z{{zzz{{{zzz{{{{zzz{{zzz{{{{zzzz{{z{{{{{{{{{{{{{zzzz{{zzz{{{z{{{= zz{zz{{zzzzz{{zz{z{{{zzzz{{{zzz{z{{zz{zz{{{{{z{{{zzzzz{{zzzz{{{{{{z{{{zzz= z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{zzzzzzzzzzz{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}= }~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=01=01=01||~}}||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||||||||||||||= |}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||}}}}}}}}}}}}}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01|= |~}}|}}}}vvvvvv}}}}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~vvvvv|~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~vv= ||||~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=F6=C0=01=01||~}}~~~~~v|||||~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01= =01=01||~}}||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}|||||||||||||||||||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~~~= ~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~~~~~~~~~~~~~~= ~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||||||||||||~}}=01=01=E0\=01=01= ||~~~~~~~~~~~~~~~~~~~~~~~}|||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||~}}=01=01=FF=FF=01=01||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F4=88=01=01||}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}=01=01=F6=C0=01=01|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01=A4=1C=01=01zzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=01=01=01= =01=01=01||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||=01=01=8C=AC=01=01|||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||||||||}=01=01=01=B5=01=01||= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01=00=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}=01=01=E8=04=01=01||~~~~~~~~~~~= ~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|~}}= =01=01=00=00=01=01||~||||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~|||||||||||||||||||}~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01= =01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~||~~~= ~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=F6=C0=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~||~~~~~}}}}}}~~~= ~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =01=01=01=01||~||~~~~~}}}}}|~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~||~~~~~}}||||~~~~~}}~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01= ||~||~~~~~}|||||~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{{{{{{{{{{zz= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{zzz{{{zzz{{{{{{{{{{{{{{{{{{zz{{{{= {{{{{{{{{{{{{zzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{zzz{z{{{{zzz= z{{{{{{{{{{{{{zzz{{{{zzzz{{{zzz{{{{zzz{{{{{{{{{{{{{{zzz{{zzzzz{{{zzz{{{zz= zzzz{{{zzz{{{{{zzzz{z{{{{{{{{{zzzzzz{{{{{{{{z{{{{{{{{zzzz{{{{{z{zzzzzz{{{= {{{zzzz{z{{{zzz{{zzzz{{{{{{{{{{{{{{{zzzz{z{{{{{{{{{zz{{{{{{{zzz{zzz{{zzz{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=01=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{= {{{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{zz{{{{{zz{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{z= {{{{{z{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{z{{{z{{{z{{{zz{{zz{{{zz{{zz{{{{{{{{{{{zz{zz{{zz{{zz{zz{zz{{zz{zz{{{= {{{{{{{{{{{z{{{{z{{zz{z{{{z{{{z{{{zz{z{{{z{{{zz{{{zz{{{{{{{{{{{z{{zz{{{{{= {{z{{{{{{{zz{{zz{{{{z{{{z{{zz{{{{zz{{{zz{{{{z{{zz{{zz{{{{{{{{z{{{{zz{{{zz= {{{{{{{{{{z{{{{{{{{z{{{z{{z{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~||~~~~~~= ~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{zz{{{{{{{z{{{{{{{{{{z{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{= {z{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{z{{{{z{{{z{{{{z{{{{{{{{{= {{z{{{z{{z{{{{z{z{{{z{{z{{{z{{{{{{{{{{{{{{z{{{{z{{{z{z{{{z{{{z{{{{z{z{{{z= {{{z{{{{{z{{{{{{{{{{{z{{{z{{{{{{z{z{{{{{{z{{{{z{{{{{{{{z{{{z{{{{z{{{{{z{{= {{z{{z{{{{z{{{{{{{{z{{{{z{{{{{z{{{{{{{{{{z{{{{{{{{z{{z{{{z{{{z{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=00=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{= z{{{zz{zzz{zzzz{{zzz{zz{{zz{{{z{{{{{zzz{zzz{{zzz{{{zzz{{zzzz{{zzz{{{z{{{z= z{z{{z{{{zzz{{zzzz{z{{{{{{zzzz{{{zzz{{{{{{zz{zz{zz{{{{{{{z{{{{zz{{z{{zz{{= zz{zzzz{{zzz{{{z{{zz{{{zzz{{{{{{zz{{{{{{{zzz{{zzzz{{zzz{{{{{{{{{{{{{{{{{z= {{{z{{{zz{{{{{{z{{{{{{z{{{{{{{{{{{{{{z{{z{{{{z{{{{{z{{{{{{z{{{{{{{{{{{{{{= z{{{{z{{{z{{{{{z{{{z{{{zz{{{{{z{{z{{{{{{z{{zzz{zzz{{z{{{z{{{{{{z{z{{{{{z{= {{{{{z{{zz{{{z{{{z{{{z{{{{{{z{{{{z{{z{{{{z{{{zzz{zzzz{z{{{{{{z{{zzz{zzz{z= {zz{{{{{z{z{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~||~~~~~~~~~~~~~~~~}= }~~}}{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{zz{zzzz{{zz{{zzz{zzz{zz{{z{{{{{{z{{{z= {{z{{z{{zz{{z{{z{{{zz{zz{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{{{zz{z{{{zz{zz{{{{{= {z{{zz{zz{{{{{z{{{{{{z{z{{{{z{{{z{{z{{{zz{{z{{z{{z{{{zz{{z{{{{{{zzz{{{{zz= {{z{{z{{{zz{zz{{{{{{{{{{{{{{{z{{{{z{{{{zzz{{{{z{{{{{{z{{{{{{{{{{{{{zz{{z{= {{{z{{{{zz{{{{{zz{{{{{{{{{{{{{{z{{{{z{{zz{{{{z{{{{zzzzz{{{{{z{{{z{{{{{{{{= {{z{{{z{{{z{{zz{{{{{z{{{z{{{{z{{{{{{z{{{z{{{z{{zz{{{z{{{{{{{{{{{z{{z{{{{z= {{z{{z{{z{{{z{{{{{{{{{{z{{{z{{zz{zz{{{{zz{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0= \=01=01||~||}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{zz{{{zz{= {zz{{zz{{zz{{zz{{{{{{{{{z{{{z{{zz{{{{{{{zz{{z{{{z{{{z{z{{z{{{z{{{z{{zzzzz= {{z{{{z{{{{{z{{{z{{z{{{z{{{{{{z{{z{{{z{{{{{z{{{{{{{z{{{{{z{{{z{{z{{{{{{zz= {{zzz{{{{{{{zz{{{{{{{{zz{{{{{{zz{{z{{{z{{{z{{{{zzzzzzz{{{z{{{{{z{{{{{{zz{= {{z{{{{{{z{{{{{{{{{{{{{z{{{z{{{{z{{{{z{{{{{{z{{{{{{{{{{{{{{{z{{{{zzzz{{{{= z{{{{{z{{{zz{{{z{{{{z{{{{zzzz{{z{{{z{{{zzzz{{{{{{z{{{z{{{{z{{{{{{z{{{z{{{= zzzz{{{{z{{{{zzzz{{{z{{z{{{{z{{zz{{{{z{{{z{{{{zzzz{{z{{{z{{z{{{z{{{{z{z{{= {{{{z{{{zzzzzzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~|}}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{= {{{{{{{{{{{{{{zz{{{{{{{zz{{{zz{{zz{{zz{{zz{{zz{{{{{{{{{{z{z{{{{zz{{{{zz{z= {{z{{{z{{{z{z{{z{{{z{{{z{{z{{{{{{z{{{z{{{{{zz{{z{{z{{{z{{{{{{z{{z{{{z{{{{= {z{{{{{{{z{{{{{z{{{z{{z{{{{zz{z{{z{z{{{{{zz{z{{{{{{{{{{z{{{zz{z{{z{{{z{{{= z{{{{{{{{{{{{{{z{{{{{z{{{{{{{{z{{z{{{{{{z{{zzzzzzz{{{z{{{{z{{{{z{{{z{{{{{= {z{{{{{zzzzzzz{{{{z{{{{z{{{{{{{z{{{{{z{{{{z{{{z{{{{z{{{{{{z{{{{z{z{{{{z{{= z{{{{{{zzzzz{{{{z{{{{{{z{{{z{{{z{{z{{{{z{{{{{{z{{{{z{{z{{{{z{{{zz{{{z{{{z= {{{{{{z{{{{z{z{{{z{{{z{{{{z{{z{{{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~~= ~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{zz{{{zz{{zz{{zz{{zz= {{zz{{{{{{{{{{z{z{{{{{zz{{z{{{z{{z{{{z{{{z{z{{z{{zz{{z{{{z{{{{{{z{{{z{{{{= {{zzz{{{z{{{z{{{{{{z{{z{{{z{{{{{z{{{{{{{z{{{{{z{{{z{{z{{{z{{{z{{z{{z{{{z{= {{z{{{{{z{{{{z{{z{{{z{{z{{{z{{{z{{{{zzzzzzz{{{{{{{{{z{{{z{{{{z{{{z{{{{z{{= {{{{{{{{{{z{{{{{z{{{{z{{z{{{{{{z{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{z{{{{= z{{{{{{{{zz{{{{{z{{{{z{z{{{{z{{{z{{{{z{{{{{z{{{{z{{{{z{{{{z{{{z{{{z{{{zz{= {{{{z{{{{z{{z{{{{z{{{{zz{{z{{{zz{{{{{z{{{{z{z{{{z{{{z{{{{z{{{z{{{{{{{{zzz= zzzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F6=C0=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{= {{{zz{{{{{{{zz{{{zz{{zz{{zz{{zz{{zz{{z{{{{{{{{z{{{{z{{z{{zz{{z{{z{{{zz{zz= {zz{{zz{zzz{{{{zz{{{z{z{{{z{{z{{{z{{{{{zz{zz{{z{{{z{{zz{zz{{{{{z{{{{{{{z{= {{{{zz{zz{{z{{{zz{{z{{z{{zz{{zz{{z{{{{{zz{{zz{{zz{{z{{z{{{zz{zz{{{{{{{{{{= {{{{z{{{{{z{{{zz{{zz{{{zz{{zz{{{{{{{{{{{zz{{{z{zz{{zz{zz{{{z{zz{{{z{{{{{{= {{{{{z{z{{{{z{{{{{{{z{{{{{z{{{zz{{{z{{{{{zz{{{zz{{{{{z{{{{{z{{{zz{{{z{{{{= {z{{{{zz{{zz{{{{z{{{z{{{zz{{{zz{{{zz{{{{z{{zz{{zz{{z{{z{{z{{{{zz{{{zz{{{{= {z{{{{z{{{z{{{{z{{{{z{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~~~~~~~~~~~~~= ~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{zzzz{{{zzzz{{zzzz{zzz{zzz{z{{{{= {{{zz{{{{zzz{{{{zzz{z{{zz{{zzz{{{z{{{{{{{{{{{{{zzzz{{{zzzzz{z{{{zzzz{{{zz= z{{{z{{{z{{z{zz{{{{{{{z{{{{{zzz{{{{{zz{zz{{zz{{zzz{zzzz{{zz{{zzz{z{{{{z{z= zz{{{{zzz{z{{zz{{zzz{{{{{{{{{{{{{{{z{{{{zzz{{z{zzz{{{{{zzzz{{{{{{{{{{{{zz= zzzz{{zzzz{{zzzzzz{zzzzzz{{{{{{{{{{{zz{{{{zzz{{{{{{z{{{{zzzzzz{{{{z{{{{{{= zzzzz{{{{{zz{{{zzzz{{{zz{zzz{{{zzz{{{{zzzz{{{{{z{zzzz{{{zz{{{zzzzz{{{{zzz= {{zzzz{{{zzz{{{{zz{{{zzzzz{{{{{zz{{{zzz{zzz{{zzz{{zzz{{z{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=01=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{= {{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}}}}}}}}}}}}}}}}}}}~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{z{z{{z= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01= =01||~}}}}}}}}}}}}}}}}}}}|~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zzz{{{{{{{{{{{{zz{{zzz{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{= {{{{{{{{{{{{{{{zzzz{{{{zzzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{zzz{{{= {{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{zzz{{{zz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{zz{{{{{z{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{= {zzz{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{zzz{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~= ~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{zz{{zzz{zzz{zz{{zz{{{{zzz{{{{= {{{{{{{{{zz{{{z{{{{zzz{{zz{zzz{zzzz{zzz{{zzzz{{zzz{zz{{{z{{{{{{{{z{{{{{{z= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{= z{zz{{{zz{{zzz{zzz{zz{{z{{zz{{{{{{{{{{{{zz{{zz{{{z{{zz{{zz{zzzz{{z{{zz{zz= {{zz{{zzz{zz{{z{{{{{{{{z{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{{zz{{{zz{{zz{{zz{{zz{zz{{zz{{{{{{{{{{{{zz= {{z{{{zz{{zz{{zz{{{zzz{{{{zz{zz{{zz{{zz{{zz{{{{{{{{{{{z{{{{{{z{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{zzz{{zz{{{zz{{zz= {{zz{{zz{zzzzzz{{zzzzzz{{{{{zz{z{{{zzzzzz{{zz{{{{zzz{{{zz{zz{{zz{{zz{{zz{= {{{{{{{{{{z{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{z{{zzz{{zz{{{zz{{zz{{zz{{zz{zz{{{{{{{{{{{{{{{{{zzzz{{{zz{{{{{= {zz{{{{{zzz{{zz{zz{{zz{{zz{{zz{{{{{{{{{{{z{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{zz{{{zz{{zz{{zz{{zz{zz= z{{z{{{{{{{{{{{{{{zz{{{{zzz{{z{{zz{{{z{{zz{{zz{zz{{zz{{zz{{zz{{z{{{{{{{{z= {{{{z{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= zzz{{z{{zzzz{zzzzzzzz{zzz{zzz{zzzz{{{{{{{{{{{{{{{zz{{{{{zzzz{{zzzz{{zzzz{= {zzzz{zzzz{{zzz{{zzz{z{{{{{{zzzzz{{z{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01= =B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{zzzzz{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{zz{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zz{{{{{zz{{{z= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{zz{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{zz{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{zz{{{{{zzzz{{{z{{{{{zz{zz{{{{zzz{{z{zz{{{z{{{zz{z{{z{zzzz{z{zz{{zz= {{zz{zz{zz{zzz{{zz{zz{{{{zzz{{z{zzz{{{{z{zz{{{{zzz{{{z{{z{{{zzzz{{{zzz{{z= {zzz{{zzz{{{{{{{zzzz{{{zzz{{zz{zz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{zz{{z{{{{{{zz{zz{{z{{z{{z= z{zz{z{{{z{{z{{{z{{z{{{zz{zz{{z{{{z{{zz{zzz{zz{{zz{zz{{z{{{z{{zz{z{{{{zz{= zz{{z{{{z{{z{{z{{zz{{z{{zz{zz{{zz{z{z{{{z{{{{{zz{{z{{zz{zz{{zz{zzz{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{= zz{{zz{{{{{{{{{z{{{z{{zz{{{{z{{{z{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{z{{= {z{{z{{{z{{zzzzz{{z{{{{{{{z{{{z{{zzzzz{{z{{z{{z{{{{{{z{{{z{{z{{{{zzzzz{{{= {{z{{{{{{z{{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}= }{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{zz{{{{{{{{{z{{{z{{{zz{{{z{{{z{z{{z{{{z= {{{z{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{{z{{{{{{z{= {z{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{zz{{{{{{{= {{z{{{z{{{{zz{{z{{{z{z{{z{{zz{{z{{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{z{= {{{{{z{{{{{{{z{{{z{{z{{{{{{z{{z{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{{z{{{{{{z{{{= z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{zz{{{{zz{{zz{{z{{{{{{z{{{z{{z{{z{{z{{zz{zz{{zz{zzz{{{{z{{{z{{= {z{{zz{zz{{z{{{z{{{z{{zz{zz{{zz{{{z{z{{{{z{{z{{zz{{zz{{{z{z{{z{{zz{{{z{zz= {zz{{z{{{{zz{{{z{z{{zz{{{z{zz{zz{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{zzzz{{{z{{{{{zzz{zzz{zz= z{{{zzzz{{{z{{{{{{{{{{{{{zzzzz{zzz{{zz{zzzzz{zzz{zzz{z{zz{{{{zzzz{zzz{{{z= {{zzzz{{{{zzzz{zzzzzz{{zzzz{{{zzz{{zzz{{{{zzzz{{z{{{zzzz{{{zzz{{zzz{zzz{z= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{zzzz{z{{{{{{{{zzz{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{zzz{{{{{zzz{{zzz{{zzz{{{{{zzz{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{{{{{{{{{{{z{{{{{{{{{{{zzz{{{zzz{zzz{{zzz{{{zzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{{{{{{{zz{= {{{{{zz{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zz{{{{{zz{{{{z{{{{zz{{{{{zz{{{{z{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{z{{= {{{z{{{z{{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{zz{{{{z{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{z{z{{{= z{z{{{{z{{{{z{z{{{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{z{{{{z{z{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{zzz{zzz{{zzzzz{{zzz{{{z= zz{{{{zzz{{zzzz{{z{{{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{{{{z{{{z{{{{{{{zzz{{= zzz{zzz{{zzz{{zz{zz{zzz{{zz{zz{{{z{{{zzz{{{{{zz{zz{zz{{{{{{{z{{{z{{{{z{{{= {z{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{zzzz{{{zz{{zz{{zz{{zz{{zz{{z{{zz{{z{{zz{{zz{{{z{{{{{{{z{zz{zz{z{{{{z{{{= {z{zz{zz{z{{{{zzzzz{{{{{{z{{{z{{z{{{z{{zz{{z{{zz{zzz{zz{{zz{zz{{z{{z{{{z{= {{{{z{{zz{zz{{{{{{z{{{z{{{{z{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zzz{{zz{{zz{{zz{{zz{{zz{zz{{zz{zz{{zz{= {zz{{{{{{{{{{{z{{z{z{{z{{{{z{{{{z{{z{z{{z{{{{z{{{z{{{{{{zzzzz{{{zzz{{{{{{= zz{{z{{{z{{{z{{z{{{z{{z{{zzzzz{{{{{z{{z{{{z{{{{{{zz{zz{{{{z{{{{z{{zz{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{zzz{zz= {{zz{{zz{{zz{{zz{zzzzzz{zz{{{{{{zz{{{{{{{{{{{z{{z{z{{z{{{{z{{{{z{{z{z{{z{= {{{z{{{{{{{{{{z{{{{{{{{z{{{{{zz{z{{z{{{z{{{z{{z{{{z{{z{{z{{{{{{{{{z{{z{{{= z{{{{{{{z{z{{{{{z{{{{z{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{z{{{{zz{zz{{zz{{zz{{zz{{zz{zz{{{{{zz{{{{{{zz{z{{{{{{= {{{z{{{z{{{z{{{{z{{{{z{{{z{{{z{{{{z{{{{{{{{{{z{{{{{{{zzz{{{z{{{z{{z{{{z{{= {z{{z{{{z{{z{{z{{{{{{{{{z{{z{{{z{{{{{{{zzz{{{{{z{{{{z{{{z{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zz{{{zz{zz{{zz{{zz{{zz= {{zz{zzz{{z{zzz{{z{{zzz{{z{{{{{{{z{{{z{{{z{{{{z{{{{z{{{z{{{z{{{{z{{{{z{{{= {{zz{{{z{z{{{z{{zz{{z{{z{{{z{{{z{{zz{zz{{z{{zz{{{z{{{{z{{z{{{z{{{{{{{{z{{= {{{{z{{{{z{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{zzzzzz{{{zzz{zz{z{zzz{{{zz{{zzzz{{{zzzz{{{{zz{{z{{{{{{zzz{{z{{zz= z{{zzz{{zzz{{z{{zzz{{zzzzzzz{{{{{{zzzz{zzz{zzz{{zzz{zzzz{zzz{zzz{z{zz{{zz= z{{zzzz{{{{zzzzzz{zzz{{{{{{{z{{{{{zzz{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4= =88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8= =04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{z{zz{zz{{{{{{{{{{zz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{zz{{{{{{{{{{{{{{{zzzz{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{zzz{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zzzz{{{{zzzz{zzzz{{{{zzzz{{{zzzz{z{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{z{zz{{= {{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{z{zzzz{{{zzz{zzzz{zzz{{{{zz= z{z{{{{{{{{{{zzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{z{{z{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{zzz{{{{zzz{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{zzz{= {{{zzz{{{zzz{{{{zzz{{{zz{{{zz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= z{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{z{{zz{{{{{z{{{zz{{{zzz{{{{z{{z{{{{{{{{{{{z{{{{z{z{{{{{{{{{{{{{z{{{{{{{= {{z{{{z{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{= {{{{{{{{{{{{{zzz{{{{zzz{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{zzz{{{{zzz{{{zzz{{{{zzz{{{zz{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{zz{{{{zz{{{zz{{{zzz{{{{z{{{z{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{zzz{zzz{zzzzz{{= z{{z{{{{{{zzz{{z{zz{{{{zzz{{zzz{zzz{zzz{{{zzz{zzz{{zzz{{zz{{zz{{{{{z{zz{{= {{zzz{{zzz{zzz{zzz{{{zzzz{z{zz{{{{zzz{{{{{{z{zz{{z{zz{{{{zzz{{zzzz{{zzzz{= {zzz{zz{{zz{{{zzzz{{zzz{{zz{{{{{{{zzz{{zz{zz{{{{zzzz{{{{{z{zz{{z{zz{{{z{z= z{{z{zz{{{zzz{{{{{{{{zz{{{zzz{{{{zz{{zz{{{zzz{{{zzz{{{{zzzz{{{{zz{zz{zz{{= {{{zz{zz{zzz{{zzz{zzz{{{zz{zz{{{{zzz{{zzz{zzz{zzz{{zzz{{{{zzz{{{{{zz{zz{z= zz{{{{zzz{{zz{{z{{{{z{zzz{{zzz{{{{zzz{{{{zzzz{{{zzz{{z{zzz{{{{{z{{{{zz{{{= z{{{{zz{{{z{zz{{{z{{{z{{{{{{{{{{z{{{z{zz{z{zzz{{zzz{zzzz{{{{{{zzzz{z{zz{{= zz{{{zzz{{{{zz{{{zzz{{{{{{zzz{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{z{{{z{{{z{{z{{z{{z{{{{{z{{z{{zz{zz{{zz{zz{{z{{{z{{{z{{{{= {z{{{z{{zz{zz{{z{{{z{{{{{zz{zz{{zz{zz{{z{{{z{{{z{{{{{z{{{zz{zz{{z{{{z{{{{= {z{zz{{z{zz{{{z{{zz{{zz{{zz{{zz{{zzz{zzz{zz{zz{{zz{{zz{{zz{{{{{{zz{{z{{zz= {zz{{zz{{z{{{{{z{zz{{z{zz{{{z{zz{{z{zz{{{{zzzz{{{{{{{z{{z{{z{{{{{z{{{z{{z= {{z{{z{{{z{{zz{{z{{{{{z{{zz{zz{{{{{zz{zzz{zz{{z{{{z{{{{{zz{zz{{z{{{z{{z{{= {z{{{z{{z{{z{{{{{z{{zzz{{zz{zzz{zz{{zz{{z{{z{{z{{{{{zz{z{z{{{z{{zz{{z{{zz= {{z{{z{{{z{{zz{z{{{{z{{{{{zz{{zz{{{{zz{{{z{{zz{{z{{{{z{{{{{{{{{zzzzz{{z{{= zz{z{z{{z{{z{{{{{{{{{z{{{zz{zz{{z{{z{{z{{{{{z{{z{{z{{{{{zz{{z{{zz{zz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{{z{{z{{z{{z{{{{{zz= {{{{z{{{z{{z{{{z{{z{{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{z{{z{{= {z{{{z{{{{{z{{{z{{{z{{zzzzz{{{{{z{zz{z{{zz{{zz{{zz{{zz{{{{{{zz{{zz{{zz{{z= z{{{{{zz{{zz{{zz{{{{{{{{{zz{{z{{{z{{z{{{z{{{{{z{zz{z{{zz{{{z{zz{z{{zz{{{{= {{zzz{{{{{{z{{zz{{{{{{{z{{{z{{zz{{{{zzzzz{{z{{{z{{{{{z{{z{{{z{{{{{z{{{z{{= {z{{z{{{z{{{{{z{{{z{{zzzzz{{z{{{z{{{z{{zz{{{{{zzzz{{z{{{z{{{z{{{z{{{{{zz{= {z{{z{{{{{z{{{{zzzzz{{{{{zz{{z{{{z{{zzzzz{{z{{{{{{{z{{{{{zz{{z{{{{{zz{{{z= {{zzz{z{{{{z{{{{{{{{{z{{{z{{z{{z{{{{zz{{{{z{{{{{{{{{z{{{z{{{z{{z{{zz{{{{{= {{z{{zz{{{{{{{{{{zz{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{z{{z{{z{{{z{{z{{z{{{{{{zz{{{z{{{z{{z{{{z{{{z{{z{{z{{{{{{{z{z{{{z{{= {z{{z{{{z{{{{{z{{{z{{z{{{z{{{z{{z{{z{{{{{{z{{{z{{{z{{z{{{{{{{{{z{{zzz{{zz= {{zzzzzz{{zz{{{zzzzz{{zz{{zz{{zz{{zzzzz{{zz{{zz{{{{{{{zz{z{{z{{{z{{z{{{z{= {{{{z{{zzz{{zz{{{z{{zzz{{zz{{{{{{{zzz{{{{{z{{{zz{{{{{{z{{{z{{{zz{{{z{{{{{= {z{{{z{{{{{z{{z{{{z{{{{{z{{{z{{{z{{{z{z{{{{{{z{{{z{{z{{{{{{{z{{z{{z{{{{zz= {{{zz{{z{z{{{{z{{{z{{{z{{{zz{z{{z{{z{{{{{z{{{{z{{{{{{{zz{z{{z{{{z{{z{{{{{= {z{{{{{{{z{{{{{{zz{z{{{{{zz{{{z{{{zzzz{{{{z{{{{{{{{{z{{{{{{z{{z{{{{{zz{{{= z{{{{{{{{{z{{{z{{{z{{z{{{zz{{{{{{z{{{zz{{{{{{{zz{z{{z{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzz{zzz{{{z{{z{{z{{{{{{{zz{{z{{{z{{= z{{{z{{{zzz{zzz{{{{{{{z{z{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{z{{{zzz{zzz{{{{{{= z{{{z{{{z{{z{{{{{{{{{z{{zzz{{zz{{zz{{{{{{zz{zzz{{zz{{zz{{zz{{zz{zz{{zz{{z= z{{zz{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{zzz{{zz{{{z{{zzz{{zz{{{z{{{{zz{{{{{= z{{{{zz{{{{{z{{{z{{{{zz{{z{{{{{{z{{{z{{{{{z{{z{{{z{{{{{z{{{z{{{z{{{z{z{{{= {{{z{{{z{{z{{{{{{{zzz{zzz{{{{{zz{{z{{{{z{{{{{z{{{z{{{z{{z{{{z{{z{{z{{{{{z= {{{{z{{{{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{{z{{{{{{zzzz{{{{{zz{{{z{{{{zzz{{{{= z{{{{{{{{{z{{{{{{z{{z{{{{{{zz{{z{{{{{{{{{z{{{z{{{z{{z{{{{zz{{{{{z{{{{zz{{= {{{z{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{z{{= {z{{{{z{{z{{z{{{{{z{{z{{z{{{z{{zz{zz{{{{z{{{z{{{{{{{{{z{{{{zz{zz{{zz{zz{{= {{{z{{{z{{zz{zz{{{{z{{{z{{{{{{{z{{{z{{{z{{zz{{{z{{{{z{{{z{{{zz{{zzz{{z{{z= zz{zz{{zz{{zz{{zz{{zz{zz{{zz{{zz{{zz{{{{{{zz{{z{{z{{{z{{zz{zz{{{{{z{{{z{{= {zz{{{z{{{z{{{zz{{{zz{{{zz{{{{{z{{z{{z{{{{{zz{zz{{z{{z{{zz{{{z{zz{zz{{{{{= z{{z{{{z{{{{{z{{{z{{{z{{{{z{{{{{{{z{{{z{{zz{{{z{{{z{{{z{{{{z{{z{{zz{{zzz{= {z{z{{{z{{{z{{zz{{z{{z{{z{{{{{z{{{{zz{{{z{zz{{z{{zz{zz{{zz{{{z{z{{{{{{{z{= {{{{{{zz{{{{{{zz{{{z{{{{{zz{{{{z{{{{{{{{{z{{{{{{z{{z{{{{z{{z{{z{{{z{{{{{z= {{{z{{{z{{z{{z{{z{{{{{z{{z{{z{{{{{zz{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{zzz{{{{{{{z{{{z{{{zzzzzzzzz{{{{zzz{{zzz{zzz{{zzz{{{{{z{= {{z{{{{{{{{zz{{{{{zzz{{{{zz{zz{{{zzz{zzz{{zzz{{{{{z{{{z{{{{{{{{zzzzz{zzz{= {zzzz{{{{zzz{{z{{zzzz{{zzzz{{{{zz{{zzz{zzzzzz{zzz{zzz{zzz{zzzzzzzzzz{{{{{= {zzz{zzzz{zzz{{zzz{z{{{zzz{{z{{zzzz{zzz{{z{{zzzz{{zzzzzz{{{{{zzz{zzz{{{{{= {{zz{zz{zzz{{{{zzzz{{{zzz{z{{{zzzzzz{zzz{{{zzz{zzz{zzz{{zz{{{{{{zzz{zzz{{= zzzz{{{{z{{{z{{{{zzz{{{{zzz{{zzz{zzz{zzz{zzz{{zzz{zzzzzzz{{{zzz{{{{zzzz{{= {zzz{z{{zzz{z{{zzzz{zzz{{{{{{{z{{{{{{zz{{{{{zzzz{zzz{{{{{z{{{z{{{{{{{{{zz= z{{{{zzzzzz{{{zzz{{{{zz{z{{{{{{zzzzz{zzzzzz{zzz{{{{{zzz{zzz{{{{{{{zzz{zzz= z{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{zz{{{{{{{zz{= {{{{{{{{{zz{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{z{{{{{{{{{{{{{{zz{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{z{{{{{{{= {{{{{{zz{{{{{{{{{{{{{{{{zzz{{{{{zzz{{zzz{{zzz{{{{{zzz{{zzzzzzz{{{{{{{{{{z= zzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{= {{{zz{zz{{{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{= {{{{{{{{{{zz{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{z{z{{{{{{{{z{{{{{{{{{z{z{{{{{{{{{{{{{{{z{{z{{{{{{{{{{z{= {z{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{z{{{{{{{{{{{z{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{zz{{{{{zz{{{{z{{{= {zz{{{{{zz{{{{z{{{{z{{{{{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{z{{{{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{z{{= {{{{{{{{{{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{{{{z{{{{{{{{{{{{{zz{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{z{{{= {{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{zzz{{zzz{zzz{{zzz{{zz{zz{zzz{{zz{zz{{{z{{{zzz{{{{{{= {zzz{{zzzz{{{{{zzzz{{{zzz{{zzzz{{zzz{{zz{{zz{{z{zzzz{{{{{zzzz{zz{{{zzz{zz= {zz{{{z{{{zzz{{zzz{zzz{{{zz{zz{zz{zzz{{{{zzz{{{{zzzz{{{zzz{{{{{{{zzz{{zzz= z{{{zzz{zzzzz{zz{zz{{{{{zzzz{{zzz{{z{zzz{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{= {{{z{{{z{{{{{{{{{z{{{{{{z{zz{{zz{z{zzzz{zzz{{zzz{{zz{zz{{zzzz{z{zzz{zzz{{= {{{z{{{{{{{zzzz{{{zzz{{{z{{z{{{{zzzz{z{zz{{zz{{{zzz{{{{zzz{zzzzz{{{zzz{{z= zz{zzz{zzz{{{{{zzz{{{{zzz{{{{zzzz{z{zz{{{{zzz{{{{{{{zzz{{zzz{zzzzz{zz{{{{= zzz{{zz{zz{{{{zzzz{{{zzz{{{{zzzz{{{{zzz{zzzzz{{{zzz{{zzz{zzz{zzz{{{zzz{zz= z{zzz{z{zz{{{{zzz{{z{zzz{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{{z{{zz{{z{{z= z{zzz{zz{{zz{zz{{z{{z{{{z{{{{{zz{zz{{z{{{{{{zz{{z{{z{{{z{{z{{{zz{{z{{z{{{= z{{z{{z{{{{{{zz{{z{{z{{z{{z{{zz{zz{{z{{zz{{z{{z{{{z{{{{{z{{zz{zzz{zz{{zz{= {z{{zz{z{{{z{{{z{{{{{zz{zz{{z{{{{{{z{{{z{{z{{zz{zz{{{{{z{{{zz{zz{{zz{z{{{= {{z{zz{zz{z{{{{z{{{{z{zz{zz{z{{{{zzzzz{{{{{{{{{z{{{{{{{{{z{{{z{{zz{z{zz{z= {z{{{z{{zz{zz{{z{{{z{{z{{{z{{{{{{z{{{{{{zz{{z{{zz{{z{{z{{z{{{{{z{{{zz{zz{= {z{{z{{z{{{{{z{{{z{{z{{z{{{z{{z{{{z{{{z{{{{{zz{{z{{z{{z{{{{{z{{{zz{zz{{z{= {{z{{{{{z{{{z{{z{{{z{{zz{zz{{zz{{z{{zz{zz{{zz{{z{{z{{{z{{zz{{z{{{{{z{{{z{= {z{{z{{{z{{z{{{z{{{z{{{{{z{{{z{{{z{{zz{zz{{z{{{z{{zz{z{z{{{z{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{= {{{{{{{zzzzz{{{zzz{{{{{{zz{{z{{{z{{{z{{z{{{z{{z{{zzzzz{{{{{z{{{z{{z{{{{{{= z{{{z{{zzzzz{{z{{{{{{zz{{z{{{z{{z{{z{{{{{{z{{{z{{z{{zz{{{{z{{{z{{z{{{{{zz= {{z{{{z{{{{{z{{z{{{z{{{z{{{{{zz{{z{{{z{{zzzzz{{{{{z{{{z{{z{{{{{{z{{{z{{z{= {z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{z{{z{z{{z{{{{z{{{{z{{z{z{{z{{{{z{{{z{{{{{{= {{{z{{{{{{{{{z{{{z{{z{{{{z{{{{zzzzz{{z{{{z{{z{{{z{{z{{{z{{{{{{z{{{{{{z{{{= {{{{{{zz{{z{{z{{{{{z{{{z{{{z{{z{{zz{{{{{{{z{{{z{{z{{zzzzz{{z{{{z{{{z{{{{{= {{{zz{{zz{{{{{{{z{{{z{{{z{{zzzzz{{{{{zzzzz{{{zzz{{{z{{{z{{{{{zz{{z{{{z{{z= {{{z{{zzzzz{{z{{{z{{{{{z{{{z{{z{{zzzzz{{z{{{z{{{z{{{{{z{{{z{{{z{{z{{{z{{z= zzzz{{z{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~= ~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{zz{z{{z{{{z{{{z{{z{{= {z{{z{{z{{{{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{{{{z{{{{zz{z{{z{{{z{{z{{z{{{{{{= z{{{z{{z{{{zz{{{z{{{z{{z{{{zz{z{{{z{z{{{{{{z{{z{{{z{{{z{{{zz{z{{zz{{z{{z{= {{{{{{{{z{{{z{{z{{{{{{{z{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{z{{z{z{{z{{= {{z{{{{z{{z{z{{z{{{{z{{{{{{{{{{{{{z{{{{{{{{{z{{{z{{z{{{{z{{{{z{{{{{{z{{{z= {{z{{{z{{{z{z{{{{{{{z{{{{{{z{{{{{{{zz{z{{z{{z{{{{{z{{{z{{{z{{z{{{zz{{{{{{= {z{z{{{z{{z{{{{{{{z{{z{{z{{{{{{{zz{z{{{zz{{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{{= {{{{z{{{{z{{{z{{{zz{z{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{{{{{z{z{{{z{{z{{{{{{{z= {{z{{z{{{{{{{z{{z{{z{{{z{{{z{{z{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{zzz{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{z{{{{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{= {{{z{{{z{{{z{{z{{{z{{z{{z{{{{{{z{{{z{{z{{{{zz{{z{{{z{{z{{z{{{z{{{z{z{{{{{= {z{{z{{{z{{{z{{z{{{z{{{zzz{{{z{{{{{{{{{z{{{z{{z{{{{{{{z{z{{{z{{z{{{z{{{{{= z{{{z{{{z{{z{{{{{{{{z{{{z{{{z{{{{z{{{{z{{{z{{{z{{{{z{{{{{{{{{{{{{zz{{{{{z= {{z{{{z{{z{{{{z{{{{z{{{{{{z{{{z{{z{{{z{{{z{z{{{{{{{z{{{{{{z{{{{{{z{{{z{{z= {{z{{{{{z{{{z{{{z{{z{{{{zz{{{{{{z{z{{{z{{z{{{{{{{zzz{zzz{{{{{{z{{{z{{{{zz= {{{{{z{{{z{{{z{{z{{{{{{{{{z{{{{{{{zzz{{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{= {{z{{{z{{{{{{z{z{{{z{{z{{{{{{{zzz{zzz{{{{{{{zzz{zzz{{{z{{{z{{z{{{{{{z{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{zz{{{z{z{{{z{{zz{{z{{z{{{z{{{z{{zz{zz{{z{{zz{{= {z{{{{zz{zz{{z{{{{{{zz{zz{{zz{{{z{z{{{zz{{z{{zz{zz{{z{{z{{{{{{zz{zz{{z{{z= {{z{{zz{zz{{z{{zz{{z{{{{z{{{{{{{z{{z{{{z{{{z{{zz{{z{{{z{{{{{zz{{{z{{{{zz{= zz{{z{{{{{{{{z{{{{z{{z{{{z{{{{{z{{{zz{zz{{z{{{{{{{{z{{{z{{{z{{{{z{{{{z{{{= z{{{z{{{{z{{{{z{{z{{{{{{zz{{{z{{{zz{zz{{z{{{{z{{{{zz{{{z{z{{{z{{z{{{z{{{{= z{{{{{{{{z{{{{{{zz{{{z{zz{{z{{z{{z{{{{{z{{{z{{{z{{z{{z{{z{{{{{{{z{{{{z{{z= z{{{z{{{z{{{z{{{{{{{zz{{z{{z{{z{{{{{z{{{z{{{z{{zz{{{z{{{{zz{{{z{z{{{z{{zz= {zz{{zz{{z{{z{{{z{{zz{zz{{zz{{{z{zz{zz{{{{{{{z{{{{z{{zz{{{z{{{z{{{z{{{{{{= {{{z{{{z{{{{z{{{z{{zz{{{z{z{{{{zz{{{z{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4= =1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{zzzz{zzz{zzz{{z= zz{zzzz{zzz{zzz{z{zz{{zzz{{zzzz{{{{{{zzz{{zzzz{{{{{zzz{z{{zzzz{zzzz{{zzz{= z{{zz{zzzzz{{zz{{{{{zzz{zzzz{zzz{{{z{zz{{zzz{{zzz{z{{zz{{{{{{zzzzzz{zzz{z= zz{{zzz{z{{zzzz{{{zzzz{{{{{{zzz{{zzzz{{{{{{z{{{zzzzzz{zzz{{{zzzz{{zzz{{zz= z{{{{{{zzz{{z{{zzz{{zzz{{zzz{{z{{zzz{{zzzzzzz{{z{{{{{{{zzzz{{{{{zz{zzzzz{= {zzz{{{{zzzz{zzz{zzz{{zzzzz{{zz{{{{{{{zzz{{{{{{zzzz{{{zzz{zzzzzzz{{{{{zzz= zz{zzzzzz{zzz{{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{{{{{zzz{z{zzz{{{{{{{zzzzz{= zzz{{zzzz{{{{{{zzzz{zzz{zzz{z{zz{{{{zzz{zzzz{zzz{{zzz{z{{zzzz{{{zzz{z{{{{= {{z{{{zzz{{zzzz{{{{z{{{z{{{{{{{{{z{{{z{{{zzz{zzz{{zzzz{zzz{{{{zzzz{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{zz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~= ~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{= {{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{= {{{{{{{{{{{{{{zz{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{z{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{zzzz{{zzz{{zzz= {zzzzzzz{{{zzzzzzz{zzzzz{zz{{{{zzz{{{{{zz{zz{{{{zzz{{z{zzzzzzz{{zzz{{{{{{= zzz{{z{zzz{{zzz{{{{{zz{zz{{z{zzz{{zzz{{{{zzzz{{{zzz{{{{zzz{{{zzz{{{zzz{{{= {zzzz{{{{{{zzz{{zz{zz{{{{zzzz{{{{zz{zz{zzz{{{{zzz{{z{zzz{{zzzz{{{zzz{{{{z= zzz{{{{zz{zz{zz{{zzzz{{zzz{{{{{{{zzz{{{{{zzzz{{zzz{{zzz{zzzzzzz{{{zzz{zzz= {zzzzz{zz{zz{{{{zzzz{{{zzz{{zzz{zzz{zzz{{{{{{zzz{zzz{zzz{z{zz{{zz{{z{{{zz= z{{{{{zz{zz{{{{zzz{{zz{zz{{{{{{{{{{{zzzz{{zzz{{zzz{zzzzzzz{{{zzzzzzz{zzzz= z{zz{{{{zzz{{{{{zz{zz{{{{zzz{{z{zzzzzzz{{zzz{{{{{{zzz{{z{zzz{{zzz{{{{{{{z= zz{{zz{zz{zzz{{{z{zz{{{{zzz{{{{zzzz{{{zzzz{{{zzz{{{{zzzz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{{z{{zz{zz{{z{{{z{{{{{zz= {zz{{zz{{z{{zz{z{z{{{z{{z{{{{{zz{{z{{zz{z{z{{{z{{{{{zz{zz{{zz{z{zz{zz{{zz= {{z{{z{{{z{{z{{z{{z{{z{{z{{{z{{zz{{z{{{{{zz{{z{{zz{zz{{zz{{z{{{{{zz{zzz{z= z{{z{{{z{{zz{z{zz{z{{{z{{{z{{zz{{z{{{{{z{{zz{zz{{z{{{zz{zz{{{{{zz{{z{{{{{= z{{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{{z{{z{{zz{zz{{zz{{z{{zz{zz{{z{{{z{{{z{{{{= {{{{z{{{z{{{z{{zz{zz{{z{{z{{z{{{z{{{{{zz{zz{{zz{zz{{zz{zz{{{{{{{{{{{z{{{z= {{{z{{z{{{z{{z{{{{{{z{{{z{{{z{{zz{zz{{z{{{z{{{{{zz{zz{{zz{{z{{zz{z{z{{{z{= {z{{{{{zz{{z{{zz{z{z{{{z{{{{{z{{{z{{zz{zzz{zz{{zz{zz{{z{{{z{{zz{{z{{zz{{z= {{z{{{z{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{zzzzz{{{zzz{{{z{{{{{{= z{{{z{{{z{{z{{{z{{zzzzz{{{{{z{{{z{{{{{zz{{z{{{{z{{{zz{{{{{{{{{{zz{{z{{{{z= zzzz{{{{{z{{{z{{z{{{{z{{{z{{z{{{{{{zzzzz{{zz{{{{zz{{{{zzzzz{{z{{{z{{{{{{{= {zz{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{z{{{{z{{{z{{zzzzz{{z{{{z{{{{{z{{z= {{{z{{z{{{z{{{z{{{{{{{{zz{{{{{z{{{zzzzz{{{zzz{{{z{{{{{{z{{{z{{{z{{z{{z{{{= z{{z{{{z{{z{{{z{{z{{{z{{{z{{{{{{{{z{{{z{{{z{{z{{{z{{z{{z{{zzzzz{{{{{z{{{z= {{z{{{z{{z{{{z{{{{{{{{{{{z{{{zzzzz{{{zzz{{{z{{{{{{z{{{z{{{z{{z{{{z{{zzzzz= {{{{{z{{{z{{{{{zz{{z{{{{z{{{zz{{{{{{{{{{zz{{z{{{{zzzzz{{{{{zzzzz{{z{{{z{{= {z{{z{{{z{{zzzzz{{z{{{z{{z{{{z{{zzzzz{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{z{{{z{{{{{{{{z{{{{z{{{{{{z{{{{z{z{{{z{{{z{{z{{{{{{{{{z{{{z{{{zz{z{{= z{{{{z{{{{zz{{{{{{{zz{z{{z{{{{z{{{{{{{{{z{{{z{{z{{{{z{{{z{{z{{{{{{z{{{{{{= {zz{{{{zz{{{z{{{{{{z{{{z{{{{{{zz{z{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{z{= {{{zz{{z{{z{{{{{{z{{{z{{{{{z{{z{{{z{{z{{{z{{{z{{{{{{zz{z{{{{{z{{{z{{{{{{{= {z{{{{z{{{{{{{z{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{z{{{{{{{{{{z{{z{{z= {{{z{{{z{{z{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{{z{{zzzzzzz{{z{{{z{{{{{{{{z{{{= {z{{{{{{z{{{{z{z{{{z{{{z{{z{{{{{{{{{z{{{z{{{zz{z{{z{{{{z{{{{zz{{{{{{{zz{z= {{z{{{{z{{{{{{{{{z{{{{{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{{{{{z{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{zzz{{{z{{{{{{z{{{{z{z{{{= z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{{{z{{{{{zz{{{{{z{{{z{{z{{{{z{{{{{{{{{z{= {{z{{z{{{{z{{{z{{z{{{{{{z{{{{{{{{zz{{{{zz{{z{{{{{{z{{{z{{{{{z{{{z{{z{{{z{= {z{{{z{{{{{z{{{z{{{z{{z{{{{{{z{{{{{zzz{{{z{{{{{{z{{{z{{{{{z{{z{{{z{{z{{{z= {{{z{{{{{z{{{z{{{{{z{{{z{{{{{{{zzz{{{z{{{{{{{zzz{zzz{{{z{{z{{{z{{z{{{z{{z= {{{z{{{zzz{zzz{{{{{{{{{{zzz{zzz{{{z{{{z{{z{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{= {{z{{{{{{{{{{{z{{{z{{{{{{{zzz{{{z{{{{{{z{{{{z{z{{{z{{{z{{z{{{{{{{{{z{{{z{= {z{{{z{{z{{{{z{{{{{zz{{{{{z{{{z{{z{{{{z{{{{{{{{{z{{{{{{z{{{z{{{z{{z{{{z{{= z{{{{{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z= z{{{z{z{{{z{{z{{{{{{z{{{{{z{{{{zz{zz{{zz{{{z{{{{zz{zz{{zz{{z{{z{{{{z{{{z{= {z{{{{{zz{{z{{z{{{{zz{{{z{{{{zz{zz{{z{{{{zz{zz{{zz{{{z{zz{{{z{z{{z{{z{{z{= {zz{{{z{zz{zz{{{{{zz{{z{{z{{{z{{zz{zz{{{{{z{{{z{{{z{{zz{{{z{z{{{{{z{{{{{z= z{{{z{zz{zz{{{{{z{{z{{{z{{z{{{zz{zz{{{{{zz{{z{{{{{z{{{zz{{{z{z{{{z{{z{{{{= {{{{z{{{z{{{{z{{z{{{z{{zz{zz{{zz{zz{{{{z{{{z{{{{z{{{{{{{z{{{z{{{{z{{{z{{z= {{z{{zz{{{z{{{{z{{{z{{zz{zz{{z{{{z{{{{{{{{{{{z{{{zz{{{z{z{{{z{{z{{{{{{z{{= {{{z{{{{zz{zz{{zz{{{z{{{{zz{zz{{zz{{z{{z{{{{z{{{z{{z{{{{{zz{{z{{z{{{{zz{{= {z{{{{zz{{{z{z{{{z{{{z{{z{{zz{{zz{{{z{zz{zz{{zz{zz{{zz{{{z{zz{zz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{zzzz{zzz{zzz{{zz{{{{{zz{{zz{{{{z{zz{{{{zzz= z{{{{{z{zz{{{{zzz{zzzz{{{{zz{zzz{{{{{{{zzz{zzzz{{{{zzzz{{{{{z{zz{{zzz{{{{= zzz{{{{zzzz{{{zzzz{{zzz{{{zzz{{{{zzzz{{{zzz{z{{{{{zzz{zzzz{zzz{{zzz{z{{{z= zz{zzz{zzz{{zzzz{zzz{{{{zzzz{{{zzzz{{{zzz{z{{{zzzzzz{zzz{{zz{{zzz{{{{{{{z= zz{z{{{{{zz{{zzzz{zzz{zzz{{zz{{{{{{z{{{z{{{zzzzzz{zzz{{zzz{z{{zzz{{{{{z{{= {z{{{{z{{{{{{{z{{{z{{{zzz{zzzzzzzzz{{zzzz{{{{zzz{zzz{{zzz{{zzz{zzz{{{{{{{= {{{{zz{{zzzz{zzz{zzz{{zz{{{{{zz{{zz{{{{z{zz{{{{zzzz{{{{{z{zz{{{{zzz{zzzz{= {{{zz{zzz{{{{{{{zzz{zzzz{{{{zzzz{{{{{{zzzz{zzz{zzz{zzz{zzzz{{{{zzzz{{{zzz= {z{{zzz{z{{zzzz{{{zzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF= =FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{z{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{z{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}= }~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{{{{zzz{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zzz{{{{{{{{{{{{{{= zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{zz{{{{{{{{{{{{{{{zzz{{{zz{{{{{{{{{zzz{{{{{= {{{zz{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{z{{{z{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{z{{z{{z{{{{{{{{{= {{{{{{{zz{{{zz{{{{{{{{{{zz{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{z{{{{{{z{{{{{z{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{z{{{{{{= {{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{zz{zz{zz{{zzzz{{zzz{{{{{zzzz{z{zz{{{{zzz{{{{{= zzzz{{zzz{{zzz{zzzzzzz{{{{{zzz{{{{zzz{{{{{{zzz{{{{{{z{zz{{zzz{zzzzz{zz{{{= {zzz{{z{zzz{{{{{{{{{zzzz{{zzz{{zzz{zzzzzzz{{{{z{zz{{z{{zz{{{zzz{{{{{{zz{{= zzz{zzz{zz{{{zz{zzz{{{{{z{{{zzz{{{z{zz{{{{zzz{{{z{{{{{{zzz{{{{zzz{{{{{{z{= {{{{{{{{zz{{{{zzz{{{{zz{{{{{zzz{zzzz{zz{{{{zz{{{zz{zz{{{zz{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{zz{zz{{z{{= {zz{zz{{{{{z{{{zz{zz{{z{{{z{{{{{z{{{z{{{z{{z{{{z{{z{{{{{{zz{{z{{z{{z{{{{{= zz{{z{{{{{zz{zz{{z{{{z{{zz{zz{{z{{{z{{zz{z{{{{{{{{{{z{{{z{{{z{{z{{{z{{z{{= {{{{z{{z{{z{{z{{{z{{{z{{{{{zz{{{zz{{zzz{zz{{zz{{z{{{{{{z{{zz{{z{{zz{zz{{z= {{{z{{z{{{{{zz{{z{{z{{z{{{{{{z{{{{{{{zz{{{{{z{{z{{zz{{z{{zz{{z{{z{{{{z{{z= z{zz{{{zz{z{{{{{zz{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{= {{{{{{{{{{{{{{{{z{{z{{{z{{z{{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{{{{z{{{zzzzz{{{= zzz{{{z{{{{{{{{{zz{{zz{{{{{{{{{{zz{{{{{z{{{z{{z{{{z{{z{{{z{{zzzzz{{z{{{{{= {{{{{{{{z{{{zzzzz{{{zzz{{{z{{{{{{z{{z{{zzz{{{{zzzzz{{{{{zz{{{zz{{zz{{zz{{= zz{z{{{{{{{z{{{{{zz{{z{{{z{{zzzzz{{z{{{{{{{{zz{{zz{{{{{{{{z{{{{{{z{{{{{{{= z{{{{{z{{zz{{z{{{{{z{{{{z{{{z{{{z{{zz{{z{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{{z{{{z{{{{{z{= {{z{{{z{{z{{{{{{{{{z{{{z{{{{{{{{z{{{{z{{{{{{{zz{z{{{zz{{{{{{{zz{z{{{{{z{{= {z{{{z{z{{{z{{{z{{z{{{{{{z{{{{zzzzzzz{{z{{{z{{{{{{{{z{{{{z{{{{{{z{{z{{z{z= {{{{z{{{{{{{{{zz{{{zz{{zz{{zz{{zzzz{{{{{{{z{{{zz{z{{z{{{z{{z{{{{{{z{{{{{{= zz{z{{{zz{{{{{{z{{{{{zz{{{{{{{{{z{{{zzzz{{{z{{{{{{z{{{{z{{z{{{{z{{z{{z{{{= {{{{{{zz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{z{{z{{{z{{z{{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{{{{{{zzz{{{z{{{{= {{z{{{z{{{{zz{{{{{z{{{z{{{{{z{{{z{{{z{z{{{z{{{z{{z{{{{{{z{{{{{{{{{{{{{z{{= {z{{{{{{{zzz{{{z{{{{{{z{{z{{z{{z{{{z{{{{{{{{{zz{{{zz{{zz{{zz{{zz{zz{{{{{{= z{{z{{{z{{z{{{z{{z{{{{{{z{{{{{z{{{z{{{{zz{{{{{z{{{{{{{z{{{{{{{{{z{{z{{{{{= {z{{{{{z{{{{z{{{z{{{z{{{z{{z{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~= ~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{{zz{zz{{{{{z{{{z{{{z{{zz= {{{z{{{{z{{{zz{{{z{z{{{z{{z{{{{{{zz{{z{{z{{z{{{{{zz{{z{{{{{z{{{z{{{{z{{{{= zz{zz{{zz{{{z{z{{{{{{{{{{{{{z{{{zz{{{z{z{{{z{{z{{{{{{z{{z{{z{{zz{{zz{{{z{= {{{zz{{{zz{{zz{{zz{{zz{{zz{{{{{z{{zz{{z{{z{{zz{{zz{{{z{z{{{{{zz{{z{{z{{z{= {{{{z{{{{{{{{zz{{{{z{{z{{zz{{z{{zz{{z{z{z{{z{z{zz{zz{{z{{z{z{{{{{zz{{{{{{= z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{zzzzzz{= zzz{{zz{{zzz{{{{{{{zzzzz{zzz{{zzzz{{{{{{zz{{zzzz{zzz{zzz{{zz{{{{{zzz{z{zz= z{{{{{{{zzz{z{{{zzz{zzz{{zz{{{{z{zz{{{{zzzz{zzz{{{{{{{{{{{{{zz{{zzzz{zzz{= zzz{{zz{{{zzzzzzzzz{{zz{{zzzz{{{{zzzz{zzzzzzz{{zzzzzz{{zzz{{{zzz{{zzz{z{z= zzz{{{{zzzz{zzz{{{{{zzz{z{zzz{{{{{z{{{{{{{{{{{zz{{zzz{{{{zzz{{{{zzz{{zz{{= {{z{{{zz{{{{z{{{z{{{{zz{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C= =AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}= }{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{||~~~~~~zzzz{~~~~zz{~~~~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz= z{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~zz{~~~~~~~~~zz{~~zzzzzz{~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~zzz{{zzz{~~zz{~~~~~~zz{~~~~~~~= ~~~~~~~~~~zz{~~~~~~~~~~~~~~~zz{{{~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zz= {~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~~~~~~~~~zz{~zz{{{zz{~~}}{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~= ~zz{{~{zz{~~zz{~~~~~~{{{~~~~~~~~~~~~~~~~~zz{~~~~~~~~~~~~~~~zz{~~~~~zz{~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{{~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~z{{~~~~~~~~~{{{~zz{~zz{{~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz{{~~~{zz{~zzzzz{~~~zz{~~zzzz{~~~~zzz{~zz= zzz{~~~~~~zzz{~~zzzz{~~~zzzzzzz{~~~zz{zz{zz{~~~~zzzz{~~~~~~{{{~~zz{~zz{zz= {zzz{~~~zzzz{~~~~zzz{z{~~zzzz{~~~z{~~~zzz{z{~zz{zzzz{{{{~~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz{~~~~~zz{~= zzz{zz{~~zz{~zz{{zz{~~zzzzz{{zz{{{~~~~~zz{zz{~{zz{{~~~{zz{{zz{~~~zz{zzz{z= z{~~zz{{zz{~~~~~~~~~~zz{~zzz{zzz{zz{~zz{{zz{~~zz{zzz{~zz{{zz{~zz{~~zz{zzz= {~zz{{zz{{~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{||~~~zz{~~~~~zz{~zz{{{zz{~zz{~zz{~zz{~zz{{{z{~zz{~~~~~~zz{{= {zz{~zz{~~~~~zz{~{zz{~zz{{zz{{{zz{~zz{~zz{~~~~~~~~~~zz{~zz{{zz{{zz{~{{{~z= z{~zz{{{zz{~zz{~zz{~zz{~zz{{{zz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz{~~~~~zz{~zz{~~zz{~zz= {~zzzzzz{~zz{~~{{~zz{~~~~~~zz{~~zz{~zz{~~~~~zz{~~zz{~zz{~zz{~~zz{~zzzzzz{= ~~~~~~~~~~zz{~zz{~zz{~zz{~~zzzzz{~zz{~~zz{~zzzzzz{~zz{~zz{~~zz{~zz{~zz{~~= ~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{||~~~zz{~~~~~zz{~zz{~~zz{~zz{~zz{{{{{~zz{~~~~~zz{~~~~~~zz{~~zz{~zz{~~~= ~~zz{~~{z{~z{{~zz{~~zz{~zz{{{{{~~~~~~~~~~zz{~zz{~zz{~zz{~zz{{zz{~zz{~~zz{= ~zz{{{{{~z{{~zz{~~zz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~{zz{~~~zz{{~zz{~~zz{~zz{~zz{~~~~~zz{= ~~z{~zz{~~~~~~zz{~~zz{~zz{~~~~~zz{~~~zzzz{~~zz{~~zz{~zz{~~~~~~~~~~~~~~zz{= ~zz{~zz{~zz{~zz{~zz{~zz{~~zz{~zz{~~~~~z{~~zz{~~zz{~zz{~zz{~~~~~~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF= =FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~zzz{~= zzz{~~zzz{zz{{~zz{~zzz{zz{~{zzzzz{~zz{z{~~~~{zz{zz{{~zz{~~~~~zz{z{~{zz{{~= ~zzz{zz{{~zzz{zz{~~~~~~~~~~zz{~zz{~zz{~zz{~zzzzzz{~{zz{zzz{~zzz{zz{zz{~~{= zz{zzz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~vvvvvv~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{||~~~~{{zzzz{{{~~zz{zz{{~~zz{~{zzzz{{~~{zzz{{~{zz{{~~= ~~~{zzz{{~~zz{~~~~~{zz{{~~zz{~~~zzzzz{{~~{zzzz{{~~~~~~~~~~zz{~zz{~zz{~zz{= ~{zzz{zz{~{zzzzz{~{zzzz{{zz{~~~{zzzzz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||= ~}}|||||vvvvv||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~{{{{{~~~~{{{{{= {~~~zz{~~{{{{{~~~~{{{{~~~{{{~~~~~~~{{{{~~~{{{~~~~~~{{{~~~zz{~~~zz{{{{~~~~= {{{{{~~~~~~~~~~~{{{~{{{~{{{~{{{~~{{{{{{{~~{{{zz{~~{{{{{~{{{~~~~{{{zz{~{{{= ~{{{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=A4=1C=01=01||~}}|||||vv||||||||}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~zzz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~zz{{~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz= {~zzz{~~~~~~~~~~~~~zz{~zzz{~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~v||= |||~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~zz{{~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{~~~~zz{~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zzzzz{{~~~~~~~~~~~~~{zzzzz{{~~~~~~~~~~~~~~~= }}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~~~~~~~~~~~~~~~~~~~~~~~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~{{{{~~~~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{{{{{~~~~~~= ~~~~~~~~~{{{{{{~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{zz{{{{{{{= {zz{{{{{{{{{{{{zz{{{{{{{{{{{{zzz{z{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{{{{{{{{{{{{{{{= {{{{{zz{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{zz{{{{{{{{{{= {{{{{{{{{{{{{{{{zz{{{{{z{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{zz{{zz{{{{{{{{= {z{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z{{{{{{{{{z{{{{{{{{= {{{{{z{{{{{{{{{{{z{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{zz{{z{{{{zzz{{zz{{zz{{{{{{zzzz{{{zzz{{zz{zz{{{{{zzz{zzzzz{{{zzz{{zzz= {zzz{zzz{{{zzzz{z{zz{{{{zzz{{{{{{{zzz{{{zzz{{{{zzzz{zzzzzz{{{zzz{{zz{zz{{= {{{{z{zz{{zzz{zzz{{{{{zzz{{{zzz{{{z{{{zzz{{{{zzzz{zzzzzz{zz{zz{{{{zzzz{{{= {{{zzz{{{{{{zz{{{{{{{zz{{zzzz{{{zzz{{{{zzz{{zzzz{zzz{{zzzz{{zzz{zz{{zz{{{= {{{{{zz{{{{{z{{{zzz{{{z{zz{{{{zzz{{{z{{{{{{{{{{{zz{{{{{{{zzz{{{z{{{zzz{{{= {zzzz{zzzzzz{{{zzz{{zz{zz{{{{{{{zzzz{{{zzz{{zz{zz{{{{{{z{zz{{{{zzz{{{{{{{= zzzz{{{zzz{{zz{zz{{{{zzz{{{{{zz{{zz{{{zzz{zz{zz{zz{{{{zzzz{{{{{{zzz{{zz{z= zzz{z{zz{{{{zzz{{z{zzz{{{{z{{zz{{{zzz{{zzz{zzz{z{zz{{{{zzz{{z{zzz{{zzz{{{= {zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{zz{zz{{z{{{z{{{{{zz{{z{{zz{{z{{= zz{zz{{{{{z{{{z{{z{{z{{{z{{z{{{z{{{z{{{{{z{{{zz{zz{{z{{{z{{{{{z{{z{{z{{{z= {{zz{{z{{z{{{z{{zz{zz{{zz{zz{{{{{zz{zz{{z{{{z{{{{{z{{z{{z{{{z{{z{{z{{{z{{= zz{{z{{z{{{z{{zz{zz{{zz{z{{{{{{zz{{z{{{{{zz{{{{{zzz{{zz{{z{{z{{zz{{z{{zz{= {zz{{{zz{zz{{zz{{zzz{zz{{zzz{{{{{{zz{{{{{z{{zz{{z{{zz{zz{{z{{{z{{z{{{{{{{= {{{{{zzz{{{{z{{{z{{z{{z{{{z{{zz{{z{{z{{{z{{zz{zz{{zz{zz{{{{{zz{{z{{zz{{z{= {zz{zz{{{{{zz{zz{{z{{{z{{{{{zz{{z{{zz{zz{{zz{zz{{z{{{z{{{{{z{{{z{{z{{z{{z= {{zz{zz{{zz{z{{{{{{z{{{z{{z{{z{{{zz{zz{{z{{{z{{zz{z{{{{z{{z{{{z{{{z{{z{{{= z{{zz{zz{{zz{zz{{zz{z{zz{{z{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z= {{{z{{z{{{z{{{{{z{{{{{{{{{zz{{z{{{z{{{{{z{{{z{{z{{zzzzz{{z{{{z{{{z{{{{{z{= {{z{{{z{{zzzzz{{{{{zz{{{{zzzzz{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{z{{= {z{{{{{zz{{{{zzzzz{{z{{zzzzz{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{zz{{{{{zz= {{{zzz{{{{zzz{{{zz{{zz{zz{{zz{{zz{{{zz{zz{{zz{{zz{{zz{{{{zzz{{{{zz{{{{{z{= {{{{zz{{z{{{z{{zzzzz{{z{{{{{{{{{{{{{{zz{{{zzzzz{{z{{zzzzz{{z{{{{{{z{{{z{{= z{{{z{{z{{{z{{{{{z{{{{{{{{{zz{{z{{{z{{{{{z{{{z{{zzzzz{{{{{z{{{z{{z{{{z{{z= {{{z{{zzzzz{{{{{z{{{z{{zz{{{{z{{z{{{z{{z{{{z{{{{{zzzzz{{z{{z{{{z{{{z{{zzz= zz{{z{{{{{{{zzz{{{{zzzzz{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{{zz{{z{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{z{{{{{z{{{{{{{zz{z{{z{{{z{{{{{{z= {z{{{z{{z{{{{{{{z{{z{{z{{{{{{z{{{z{{{z{{z{{{{{{{{{{zz{{{z{{{{{{z{{{{{{z{{= {z{{z{{{z{{z{{{z{{{{{z{{{z{{{z{z{{{{{{{zz{{{z{{{{{{z{{z{{{{{{z{{{{{{z{{{z= {{z{{{z{{zz{{z{{{{{{zz{z{{{{{zz{{zz{{{{{{{zzz{{zzzzzz{zz{{{{{{zz{{{zz{zz{= {zz{{zz{{zz{{{{{{zz{{{zz{{{{{z{{{zz{z{{z{{{z{{z{{{{{{z{{{{{{{{{{{{{{{{z{{= z{{{{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{{{{{zz{z{{z{{{z{{{{{z= {{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{{{{z{{{z{{{zz{{{z{{z{{{z{{zz{= {z{{{{{z{{{{{{z{{z{{{z{{{z{{z{{{{{{z{{{{{{{z{z{{{{z{{{{{{{z{z{{{z{{{z{{z{= {{z{{z{{{{{zz{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{z{= {{{{z{{{{{{z{{{z{{z{{{z{{{{{{z{z{{{z{{z{{{{{{{zzz{zzz{{{{{{z{{{z{{{z{{z{{= {{{{{{{{{zz{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{{z{z{{{{{{{{zz{= {z{{{{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{zzz{{{{{{z{{{z{{{{{zz{{{zzz{{{{{{= zzz{zz{{{{{zz{{{{{{zz{z{zz{zz{{zz{{zz{{zz{{{{zzz{{{{zz{{{{{z{{z{{{z{{z{{{= z{{z{{{{{{z{{{{{{{{{{{z{{{{z{{z{{{{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z= {{{{{z{{{{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{{z{{z{{{{{= {{{{z{{{z{{{{zz{{z{{z{{{z{{{zzz{{{{{{z{{{{{{z{{z{{{z{{{z{{z{{{{{{z{{{{{{{= z{{z{{{z{{{{{{{z{z{{{z{{{z{{z{{{z{{z{{{{z{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{zz{zz{{zz{zz{{{{{zz{{{z{zz{{z{{z{{{z{{{{{{{z{{{{z{{zz{{= {z{{{z{{{z{{{{{{{z{{{z{{{z{{zz{{{z{{{{z{{z{{zz{{{z{zz{{{z{z{{{z{{zz{zz{{z= {{{z{{{{{z{{zz{{{{z{{{{{{{z{{z{{zz{{{z{z{{zz{{{z{zz{{{z{z{{{z{{z{{{z{{{z{= {{{{{{{zz{{z{{{{{zz{{{{{zzz{{z{{zz{zzz{{z{zzz{{z{{zzz{{zz{zz{{zz{{zz{{zz{= {zzz{{{{{{zz{{{{{z{{zz{{z{{z{{zz{{zz{{{z{z{{z{{{{{{{{zz{{zz{{zz{{{z{z{{zz= {{{z{zz{{{z{z{{{z{{zz{zz{{z{{{z{{{{{zz{{{z{zz{{z{{z{{{z{{{{{z{{zz{{zz{{{z= {{{{zz{zz{{zz{zz{{z{{{z{{zz{{{z{{{{zz{zz{{z{{z{{z{{z{{{z{{{z{{{{{{{{zz{{{= z{z{{z{{{z{{{z{{zz{{{z{z{{{{{{{z{{zz{{zz{{{z{{{z{{{{z{{zz{{zz{zz{{z{{{{zz= {{z{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{{{zz{zz{{{{{zzzz{{= {zzz{zzzz{zzz{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{{{{{zzzzz{zzz{{zzzz{{{{{zzz{= {{{zzzz{{{zzzz{{{zzzzz{{zzz{{zzz{zzz{{{{zzzz{{{{zz{{{{{{{zzz{{{{zzzz{zzz{= {zzzz{{{zzzz{{{zzzzzzzz{zzz{{zzzz{{{{{{zzz{z{{{{zz{{{{{{{zz{zzzz{{{zzzz{{= {zzzz{{{{zz{zzzz{zzzz{{zzz{{zzzzz{{{{{{{{zz{{{{zzz{{zzz{z{zzzz{{{{zzzz{zz= z{z{{{{{{{{z{zzz{{{{zzzz{zzz{{zzzz{{{zzzz{{{zzzzz{{zzz{{zzz{zzz{{{{{zzzz{= {{zzz{zzzz{zzz{{{{zzzz{{{{zzzz{{{{{{zzz{z{{zzz{{zzz{zzz{{zzzz{{{{{{zz{zz{= zzz{{zzzzzz{zzz{{zzzz{{{{{{zzzz{zzz{{zzzzz{zzz{{zzzz{zzz{{{{{zzz{{zz{{zzz= z{{{zz{{{{zzzz{{{{zzz{{zzz{{{{zzz{z{{zzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{= {{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{zzzz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{zzzz{zz{{zz{z{zzz{{zzz{{{zzz{= {z{zzz{{{{{zzz{{z{zzz{{{zz{zz{zzz{{{{zzz{{zz{{zz{{{zzz{{{zzz{{{{{zz{zz{{{= {zzz{{zz{zz{zz{{zzzz{{zzz{{z{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {zz{{z{{z{{{z{{zz{z{z{{z{{zz{zz{{zz{z{{{{zz{zz{{zz{z{{{{zz{zzz{zz{{zz{zz{= {z{{{z{{z{{z{{z{{{z{{{{{zz{zz{{zz{zz{{z{{zz{zz{{z{{{z{{{z{{zz{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{z{{{{zz{{{{z{{{z{{z{{{{{{{z= {{{z{{z{{{{{{{z{{{z{{{z{{z{{{z{{z{{{z{{zz{{{{zzzzz{{{{{z{{{z{{z{{{z{{z{{z= {{{z{{z{{{zzzzz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{= {z{{z{{{{{zz{{{z{{{z{{z{{{{{{{z{{{z{{z{{{{{{{z{{{z{{{z{{z{{{z{{z{{{z{{{zz= {{{z{{{{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{z{{{{{{zz{{z{{{z{{z{{{{{{{z{{{z{{z{{{{= {{{z{{{z{{{z{{z{{{z{{z{{{z{{{{zz{{z{{{{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zz{{{z{zz{zz{{z{{{{z{{= z{{zz{zz{{z{{{{{{{zz{zz{{z{{{{{{{z{{{z{{{z{{zz{zz{{zz{zz{{z{{z{{zz{{{z{{{= {zz{zz{{zz{zz{{z{{z{{{z{{z{{{zz{{{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{zzzz{{{zz{zzzzz{{{zzz{{{{zzz{{zzz{{{{{{{zzz{{zzz{{{{{zzz{zzz{zz= z{{zzz{{{{zz{zz{zzz{{{{zzzz{{{{{z{zz{{{{zzz{{zzzzzz{zzz{{zz{{zzzz{zzz{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6= =C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zzzzzzz= {zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zz{{{{{{{= {{{{{zz{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{z{{{{{z{{{z{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{= z{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{z{{{{{= z{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{z{zz{{{{zzz{{z{zzz{{zzz{{{{{zz{{{zzz{{{{{{zzz{{zz{zz= {{{{zzz{{zzzz{z{zz{{{{zzz{{z{zzz{{{zzz{zzzzz{{{zzz{{zzz{zzz{zzz{{{{{zzzz{= {{zzz{{{z{{z{{{zzz{{{{zzzz{{{{zzzz{z{zz{{{{zzz{{{{{{z{zz{{{{zzz{{{z{{{zzz= {{zz{zz{{{z{zz{{z{zzz{{zzz{{{{zzz{zzzzzz{{{zzzz{{{{zzz{zzzzz{{{zzz{{zzz{z= zz{zzz{{{zzz{zzz{zzz{z{zz{{{{zzz{{z{zzz{{zzz{{{{{{{zzz{{{zzz{{{{zzzz{zzzz= zz{{{zzz{{zz{zz{{{{zzz{{{{{{zzz{{z{zzz{{zzz{{{{{{z{zz{{{zzz{zzzz{{zzz{{{{= zzzz{{{{zz{zz{zz{{{{{{{zzz{{zz{zz{{{{zzz{{{{{{z{zz{zz{zz{{{{zzz{{{{{zz{zz= {{{{zzz{{z{zzz{{{{{zzz{{{zzz{{{{zzzz{zzzzzz{{{zzz{{zz{zz{{{{{{{{{{{{{zz{{= z{{{{zzz{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||= ~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{zz{{z{{{z{{zz{z{z{{{= z{{{{{z{{z{{z{{{{{zz{{z{{zz{zz{{zz{zz{{z{{{zz{zz{{z{{{z{{zz{z{{{{z{{{z{{z= {{z{{{z{{z{{{z{{{z{{{{{zz{{z{{zz{{z{{z{{z{{z{{{z{{zz{{z{{{{{z{{{zz{zz{{z{= {{z{{{{{zz{zz{{zz{zz{{z{{zz{zz{{zz{zz{{zz{zz{{zz{z{zz{{z{{z{{z{{z{{{z{{zz= {{z{{{{{z{{{z{{z{{z{{{z{{z{{{z{{{z{{{{{z{{{z{{{z{{zz{zz{{z{{{z{{zz{z{z{{{= z{{{{{z{{z{{z{{{z{{zz{{z{{z{{{z{{zz{zz{{zz{zz{{z{{z{{{{{zz{{z{{zz{z{z{{{z= {{{{{z{{z{{z{{z{{z{{{z{{{z{{zz{{z{{{{{z{{zz{zz{{{{{zz{zz{{zz{zz{{z{{{z{{{= {{z{{z{{zz{zz{{z{{{z{{{{{zz{zz{{z{{{z{{zz{z{{{{z{{z{{z{{{z{{zz{{z{{z{{{z{= {zz{zz{{zz{zz{{{{{{{{{{{{{z{z{{{{zz{zz{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{z{{{z{{zzzzz{{z{{{{zzzzz{{{{{z{{zz{{{{{{{{{{zz{{z{{{z{{z{{{z{{z{{= {z{{{z{{zzzzz{{z{{{{{{{z{{{z{{z{{zzzzz{{z{{{z{{{z{{{{{z{{{{{{{{{zz{{z{{z{= {zzzzz{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{z{{= {z{{z{{{{{{{zz{{zz{{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{zzzzz{{z{{{z{{{z{{{{{z{{= {z{{{z{{z{{{z{{zzzzz{{z{{{{zzzzz{{{{{zz{{{{zzzzz{{z{{{{{{z{{{z{{z{{{z{{z{= {{z{{zz{{{{{{{{{{zz{{z{{{{zzzzz{{{{{z{{z{{zz{{{{z{{{zzzzz{{z{{{z{{{{{z{{z= {{{z{{{{{z{{{z{{z{{{z{{zzzzz{{{{{z{{z{{z{{{z{{zzzzz{{{{{z{{{z{{zzzzz{{z{{= {{{{{zz{{{{zzzzz{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{{{{z{{{{{z{{{z{{z{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{{{{z{{{{z{{{{{{{{{z{{{z= z{{{{{{{zz{z{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{{{{z{{{{{{{{z{z{{{z{{z{{{{{{{z= {{z{{z{{{{{{z{{{{{{{zz{z{{z{{z{{z{{{{{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{{z{{= {z{{z{{{z{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{zz{z{{{zz{{{z{{{z{{z{{{{{{{{{{z{= z{{{z{{z{{{{{{{z{{z{{z{{{{{{{z{{z{{z{{{z{{{z{{z{{{{{{z{{{{z{{{{{{{{{{zz{{= {z{{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{zz{{{{{{{zz{z{{z{{{{z{{{{{{{{{z{{z{{= {zz{{{z{{{z{{{{{{z{{{z{{{{{z{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{{{{{{{z{{z{{z{{= {z{{z{{{{{{{{{z{{{z{{z{{{{{{z{{{{{{{{zz{{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{z{{= {z{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{= z{{z{{{{{{z{{{{z{{{{{{{{{z{{{{zz{{{{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{= {{{z{{{{{{{{z{z{{{z{{z{{{{{{{zzz{zzz{{{{{{z{{{{{{z{{{z{{z{{z{{z{{{{{{z{{{= z{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{z{{= {z{{{{zz{{z{{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{zzz{zzz{{{{{{{zzz{zzz{{{z{{{= z{{z{{{{{{z{{{{z{{{{{{{{{{{zz{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{zz{{{= {{z{{{z{{z{{{{z{{{{{{{{{z{{z{{{{zz{{z{{{z{{{{{{z{{{z{{{{{z{{z{{{z{{{{{z{{= {z{{z{{{z{{z{{{{{{{{{z{{z{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{{{{z{{{{{{{{{zz{{z= {{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{zz{{{z{z{{{{zz{{{z{{{{z{{z{{z{{{{{zz{{z= {{z{{{z{{zz{zz{{z{{{z{{{z{{zz{{{z{z{{{{{{{{{z{{{{z{{zz{{{z{{{z{{{z{{{{{{{= zz{{{z{zz{{z{{z{{z{{zz{{{z{zz{zz{{{{{z{{{z{{{z{{zz{{{z{{{{z{{{z{{zz{zz{{z= {{zz{zz{{zz{zz{{z{{{z{{z{{{{zz{{z{{z{{z{{z{{{z{{zz{{{z{{{{{{z{{{{z{{zz{{{= z{{{z{{{z{{{{{{{{{z{{{z{{{{z{{{z{{zz{{{z{z{{{{zz{{{z{{{{z{{z{{zz{{{z{zz{{= {z{z{{{z{{zz{zz{{z{{{z{{z{{z{{{{{zz{{z{{z{{{{zz{{{z{{{{z{{z{{z{{z{{z{{{zz= {{{z{zz{zz{{{{{z{{z{{{z{{{{{zz{zz{{z{{{z{{zz{{{z{{{{z{{z{{z{{{z{{zz{{{z{{= {{zz{zz{{zz{{{z{z{{{{{{{z{{z{{zz{{{z{zz{{{z{z{{{z{{zz{zz{{z{{{z{{z{{{{{{{= {{{{z{{{{{zz{zz{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{zzz{{zzzz{zzz= {{{{zzzz{{{{zzz{zzz{{{{{{{zzz{zzzz{zzz{{zzz{{{{zzzzz{zzz{{zzzz{zzz{{{{{{{= {z{{{zzz{{zzzz{{{{z{{{z{{{{{{{{zzzz{{{zzz{zzzzzzz{{zzzz{{{zzz{z{{{{{zzzzz= {zzz{{zzzz{{{{zzz{zzz{{zzz{{zzz{{zzz{{{z{zz{{zzz{zzzzzz{{{{zzz{z{zzz{{{{z= zzzz{{zzzz{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{{{{{{z{{{z{{{zzz{zzz{{zzzz{zzz= {{{{zzzz{{{{{zzz{{{{zzzz{{{zzzz{{{zzzzz{{zzz{{zzz{zzz{zzz{{{{{{{zzz{zzzz{= {{{zzzz{{{{zzzzzz{zzz{{{{zz{{zzzz{{{zzz{z{{{zzzzzz{zzz{{{{{zzz{{zzz{zzz{{= zzzz{{{{zzzzzzzzz{zzz{{zzzz{{{{{z{zz{{{{zzzz{zzz{{{{{{zzz{{{{zzzz{{{zzzz{= {{zzzzz{{zzz{{zzz{zzz{z{{{{{{{{{{zzz{{{{{zzz{{{{zz{zz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{z{{{{{{{{zz{{{{{{{{{{{{{{zz{= {{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{{zzzz{{{{{{{{{{{{{{zzz{{{{{{{{{{= {{zz{{{{{{{{{zzz{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zzzz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{zzzz{{{{{{{{zzzzzzz{= zz{{{{{{{{{{{{{{{{{zz{{{{{{{zz{zz{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{z{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{z= {{z{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{z= z{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{{{{{{{{{{zz{{{{{{{{z{{z{{z{{z{{{{{{{{{{{{{{{{z{z{{{{{{{{z{{z{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{z{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{z{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{z{{{= {{{{{{{{{{z{{{{{{{{{{{{{z{{{{{zz{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{zz{{{{{{{{z{{z{{z{{z{{{{{{{{{{= {{{{{{z{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{zzzz{{{zzz{{zz{zz{{{{= {{{zzz{zzz{zzz{zzzzz{zzzz{{zzzz{{z{zz{{{{{zzzz{z{zz{{{{zzz{{{{zzz{{{zzz{{= {{{zzz{zzzzz{{{zzz{{zzz{zzz{zzz{{zzz{{{{{z{zz{{zzz{zzz{{{{{zzz{{{zzz{{{z{= {{zzz{{{{zzzz{zzzzzz{zz{zz{{{{zzzz{{{{zzzz{z{zz{{{{zzz{{{{{{z{zz{zz{zz{{{= z{{zz{{{zzz{{{{{z{{{zzz{{{z{zz{{{{zzz{{{z{{{zzz{{{{zzzz{{{{{zz{{{{{{{zz{{= zzzz{{zz{zz{{zz{zzzzzz{zzz{zz{{{zz{zzz{zz{{{{{{{{zz{{{{{{zzz{{zz{zz{{{{zz= zz{{{{{zz{{{{{{{zz{{{zzz{{zzz{zzzzzz{zz{{{zzzz{{zzz{zz{{{zzzzz{zz{{{{{{{{= zz{{{{{{{{{{{z{{{{{z{zz{{{{zzz{{{{{zzzz{{zzz{{{z{{z{{{zzz{{zzz{zzz{zzzzz{= zz{zz{{{{zzzz{{{{zz{{{zzz{{{{{{zzz{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{zz{{z{{zz{{z{{zz{zz{{{{{z{{z{{z{{{z{{{z{{z{{z{{{zz{{z{{zz{zz{{{{= {z{{{zz{zz{{z{{{z{{z{{z{{z{{{z{{{{{z{{{z{{z{{z{{{z{{z{{{z{{{z{{z{{z{{{{{z= z{zz{{z{{{z{{{{{z{{z{{z{{{z{{z{{z{{{z{{zz{{z{{z{{{z{{zz{zz{{zz{z{{{{{{z{{= {zz{zz{{z{{{z{{{{{z{{z{{zz{zz{{z{{z{{{z{{z{{{{{z{{zz{{z{{zz{zz{{z{{{z{{z{= {z{{{z{{zz{{z{{{{{zz{{{{{zzz{{zz{{z{{zzz{zz{{zz{zz{zz{{zzz{zz{{zz{{z{{{zz= z{{{{{{zz{{{{{zz{{z{{zz{zz{{zz{{z{{{{{zz{{{{{zzz{{{z{{zz{{zz{zz{{zzz{zz{z= z{{zz{{zzz{zz{zz{{zz{{zzz{{{{{{zz{{{{{{{{{{{z{{{{{zz{zz{{z{{{z{{{{{z{{{zz= {zz{{z{{z{{zz{zz{{z{{{z{{{z{{z{{zz{zz{{zz{z{{{{{{z{{z{{z{{{{{zz{{z{{zz{zz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{zz{{z{{{z{{{{{zz{{{{z{{= {z{{{z{{z{{z{{{z{{{{{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{zz{{{{zzzzz{{{{{z{{{z{{= z{{zzzzz{{z{{{z{{{z{{zz{{{{{{{z{{{z{{z{{{z{{{{{zz{{{{zzzzz{{z{{zzzzz{{z{{= {{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{{{{z{{z{{z{{{z{{zzz{{{{zz{{= {{{{{z{{{{{zz{{z{{{z{{zzzzz{{z{{zzzzz{{z{{{z{{{{{zz{{{zzz{{{{zzz{{{{zz{{z= z{{zz{{{{zz{{zz{{zz{{zz{z{{{{{{zzz{{{{zz{{{{{{{{zz{{z{{{z{{z{{{z{{{{{zz{{= {zzz{{{{zz{{zz{{{zzz{{{zz{{zz{{{{{zz{{zz{{zz{zz{{zz{{{{zzz{{{{zz{{{{{{{{{= {{z{{{{{z{{{z{{zzzzz{{{{{z{{{z{{{z{{z{{z{{z{{{z{{z{{{z{{{z{{z{{z{{{z{{z{{= {z{{{{{z{{zz{{{{{{{{{{zz{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{zz{z{{z{{{z{{{{{{zz{{{{z{{z{{z{{{z{{z{{{z{{{{{{z{{{z{{{{{z{{{z{{{z{= {z{{{{{{{zz{{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{z{{z{{z{{{{zz{{{{{{z{{{z{{{z{z{= {{{{{{zz{{{z{{{{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{zz{{z{{{{{z{{{z{{{z{{z{{= {{{{{{{z{{z{{z{{{z{{z{z{{{{{zz{{{{{{z{{{zz{z{{z{{{z{{z{{{{{{z{{z{{{{{{z{{= {z{{{{{zz{{zz{{{{{{{zzz{{{zz{{zz{{zz{{{{zz{{zz{{zz{{zzzz{{{{{{{{zz{{{zz{{= {{{{zz{z{{z{{{z{{z{{{z{{{{{zz{{zz{{{{{{zzzzzz{{{zzz{{{zz{{zz{{zzzzz{{zz{{= zz{zz{{zz{{{{{{zz{{{zz{{{{{{{{{{{z{{{{{z{{{z{{z{{{{{{{{{z{{{z{{{z{{z{{z{{= z{{{z{{{z{{z{{z{{{z{{z{{{z{{zz{{z{{{{{z{{{zz{{{{{{{zz{z{{z{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{{{{{zz{{{zzz{zzz{{{z{{= z{{{z{{{{{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{zz{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{= zzz{zzz{{{{{zz{{{{{z{{{z{{{z{z{{{{{{{{zz{{z{{{{{{z{{z{{{{{{z{{{{{{z{{{z{{= z{{{z{{{zzz{{{{{{z{{{z{{{z{{z{{{{{{{{{z{{z{{z{{{z{{z{{z{{{{{zz{{{{{z{{z{{= {z{{z{{{z{{z{{{{{{z{{z{{{{{{z{{{z{{{{{zz{{{zzz{{{{{{zzz{{zz{{zz{{zz{{{{zz= {{zz{{zz{{zz{zz{{{{{zzz{{{{zz{{{{{z{{{z{{z{{{z{{z{{{z{{{{{zz{{{zzz{{{{zz{= {{{{{{zzz{{{zz{{zz{zz{{zz{{zz{{zz{zz{{zz{{{{zzz{{{{zz{{{{{{{{{{{z{{{{{z{{= {z{{z{{{{{{{{{z{{{z{{{z{{z{{z{{z{{{z{{{zzz{zzz{{{z{{z{{{z{{{zzz{{{{{{z{{{= {zz{{{{{z{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zz{{{z{zz{{z{= {z{{{z{{{{{z{{z{{{{z{{{z{{{{z{{z{{{zz{{{z{z{{{z{{{{{z{{{z{{{z{{zz{{{z{z{{= z{{zz{{{z{{{{{{z{{{{z{{zz{{{z{{{z{{{z{{{{z{{z{{{{{z{{zz{{{{z{{{{{{{z{{z{{= zz{{{z{z{{zz{{{z{zz{{{z{z{{{z{{z{{{z{{{z{{{{{{{{z{{{z{{{z{{zz{{{z{{{{z{{z= {{z{{{z{{z{{zz{{z{{z{{{{{z{{zz{{z{{z{{zz{{zz{{{z{z{{zz{{{z{zz{zz{{{{{zz{{= {{{zzz{{z{{zz{{zz{{zz{{zz{{{{zz{{zz{{zz{{zz{{zz{{zzz{{{{{{zz{{{{{zz{{z{{z= {{{z{{zz{zz{{{{{zz{{{{{zzz{{zzz{{z{{zz{zz{{zz{{zz{zz{{zz{{zz{{zz{zz{{zz{{= zzz{{{{{{zz{{z{{{{{{{{z{{{{{z{{{z{{zz{{{z{{{{z{{{zz{zz{{z{{z{{zz{zz{{{{z{= {{z{{{{z{{z{{{z{{{z{{{{{{{{z{{z{{z{{{{{zz{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{zzzz{{{zzz{zzzz{zzz{{{{zzz{{{{{z{{{z{{{zzz{{zz{{zzzz{z= zz{zzz{{{{{zzzzz{zzz{{zzzz{{zzz{{{{zzzz{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{z= zz{{{{{{zzzz{{{{zz{{{{{{{zzz{{{{zzzz{zzz{{zzzz{{{zzzz{{{zzzzzzzz{zzz{{zzz= z{{{{{{zzzzz{zzz{{zzzz{{{{zzzzzzzzz{zzzzzz{{zz{zzz{{{{{zzz{{zzz{z{zzzz{{{= {zzzz{zzz{{zzzz{{{zzz{z{{{{zz{{{{{{{zz{zzzz{{zzz{{zzzzzzz{{zzzzzzz{{zzzzz= z{{zzzzz{{{{{{{{zz{{{{{{zzz{zzzz{zzz{{zzz{z{{{{zz{{{{{{{zz{{zzzz{{zzz{zzz= {zzzzz{{{zzz{zzzzz{{zzz{zzz{zzzz{{{{{{{{zz{{z{{{{{{{zzz{{{zzz{zzz{{zzzz{{= {{zzzz{{zzz{{zzzzzz{{zzz{{{{{z{{{z{{{zzzzzz{zzz{{zzzz{{{{zzz{zzz{{{{{{{zz= z{zzzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{= {{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{{{{{{{{{{zz{{= {{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{z{z{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{= {z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{zzz{{zzz{zzz{{zzz{{zz{zz{{{z{{{zzz{{{{{{{zzz{{zzzz{= {{{z{zz{{{{zzz{{{z{{{zzz{{zz{zz{{{z{zz{{z{zzz{{zzz{{{{zzz{zzzzzz{{{zzzz{{= {{zzz{zzzzz{{{zzz{{zzz{zzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{{z{{zz{{z{{zz{z= z{{z{{z{{{z{{{{{zz{zz{{z{{{{{{zz{zz{{zz{zz{{z{{zz{zz{{zz{zz{{zz{zz{{zz{z{= zz{{z{{z{{z{{z{{{z{{zz{{z{{{{{z{{{z{{z{{z{{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{zzzzz{{{zzz{{{{{{zz{{z{{{z{{z{{zzzzz{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z= {{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{{zz{{zz{{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{zz= zzz{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{zz{z{{z{{{z{{z{{z{{{{= {{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{zz{z{{{zz{= {{z{{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{zzz{{{z{{{z{{z{{{z{{z{{z{{{{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{z{{{z{= {z{{{z{{z{{{z{{z{{{{z{{{z{{{{zz{{z{{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{zzz{z= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{zz{{{z{z{{{z{{zz{{z{{zz{zz{{z{{zz{{{z{{{{zz{zz{= {z{{{{{{z{{{z{{zz{zz{{z{{zz{zz{{zz{zz{{z{{{z{{z{{{{zz{{z{{z{{z{{z{{{z{{zz= {{{z{{{{{{z{{{{z{{zz{{{z{{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01= =01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{zzzz{zzz{zzz{{z= zz{z{z{zz{{zzz{{zzzz{{{{{{zzz{{zzzz{{{zzz{zzz{{zzz{{zzz{{zzz{{{z{zz{{zzz{= zzzzzz{{{{zzz{z{zzz{{{{zzzzz{{zzzz{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0= \=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{|= |~~~~~~zzzz{~~~~zz{~~~~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~zz{~~~~~~~~~zz{~~zzzzzz{~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~zzz{{zzz{~~zz{~~~~~~zz{~~~~~~~~~~~~~~= ~~~zz{~~~~~~~~~~~~~~~zz{{{~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zz{~zz{~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~~~~~~~~~zz{~zz{{{zz{~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~zz{{~{zz= {~~zz{~~~~~~{{{~~~~~~~~~~~~~~~~~zz{~~~~~~~~~~~~~~~zz{~~~~~zz{~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~zz{{~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~z{{~~~~= ~~~~~{{{~zz{~zz{{~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{||~~~zz{{~~~{zz{~zzzzz{~~~zz{~~zzzz{~~~~zzz{~zzzzz{~~~~~= ~zzz{~~zzzz{~~~zzzzzzz{~~~zz{zz{zz{~~~~zzzz{~~~~~~{{{~~zz{~zz{zz{zzz{~~~z= zzz{~~~~zzz{z{~~zzzz{~~~z{~~~zzz{z{~zz{zzzz{{{{~~~}}{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz{~~~~~zz{~zzz{zz{~= ~zz{~zz{{zz{~~zzzzz{{zz{{{~~~~~zz{zz{~{zz{{~~~{zz{{zz{~~~zz{zzz{zz{~~zz{{= zz{~~~~~~~~~~zz{~zzz{zzz{zz{~zz{{zz{~~zz{zzz{~zz{{zz{~zz{~~zz{zzz{~zz{{zz= {{~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{||~~~zz{~~~~~zz{~zz{{{zz{~zz{~zz{~zz{~zz{{{z{~zz{~~~~~~zz{{{zz{~zz{= ~~~~~zz{~{zz{~zz{{zz{{{zz{~zz{~zz{~~~~~~~~~~zz{~zz{{zz{{zz{~{{{~zz{~zz{{{= zz{~zz{~zz{~zz{~zz{{{zz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz{~~~~~zz{~zz{~~zz{~zz{~zzzzzz= {~zz{~~{{~zz{~~~~~~zz{~~zz{~zz{~~~~~zz{~~zz{~zz{~zz{~~zz{~zzzzzz{~~~~~~~~= ~~zz{~zz{~zz{~zz{~~zzzzz{~zz{~~zz{~zzzzzz{~zz{~zz{~~zz{~zz{~zz{~~~~~~~}}{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz= {~~~~~zz{~zz{~~zz{~zz{~zz{{{{{~zz{~~~~~zz{~~~~~~zz{~~zz{~zz{~~~~~zz{~~{z{= ~z{{~zz{~~zz{~zz{{{{{~~~~~~~~~~zz{~zz{~zz{~zz{~zz{{zz{~zz{~~zz{~zz{{{{{~z= {{~zz{~~zz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{= {{{{{{{{{{{{{{{{{{{{{{{{||~~~{zz{~~~zz{{~zz{~~zz{~zz{~zz{~~~~~zz{~~z{~zz{= ~~~~~~zz{~~zz{~zz{~~~~~zz{~~~zzzz{~~zz{~~zz{~zz{~~~~~~~~~~~~~~zz{~zz{~zz{= ~zz{~zz{~zz{~zz{~~zz{~zz{~~~~~z{~~zz{~~zz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~zzz{~zzz{~~zzz= {zz{{~zz{~zzz{zz{~{zzzzz{~zz{z{~~~~{zz{zz{{~zz{~~~~~zz{z{~{zz{{~~zzz{zz{{= ~zzz{zz{~~~~~~~~~~zz{~zz{~zz{~zz{~zzzzzz{~{zz{zzz{~zzz{zz{zz{~~{zz{zzz{~z= z{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{||~~~~{{zzzz{{{~~zz{zz{{~~zz{~{zzzz{{~~{zzz{{~{zz{{~~~~~{zzz{{= ~~zz{~~~~~{zz{{~~zz{~~~zzzzz{{~~{zzzz{{~~~~~~~~~~zz{~zz{~zz{~zz{~{zzz{zz{= ~{zzzzz{~{zzzz{{zz{~~~{zzzzz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~{{{{{~~~~{{{{{{~~~zz{~~= {{{{{~~~~{{{{~~~{{{~~~~~~~{{{{~~~{{{~~~~~~{{{~~~zz{~~~zz{{{{~~~~{{{{{~~~~= ~~~~~~~{{{~{{{~{{{~{{{~~{{{{{{{~~{{{zz{~~{{{{{~{{{~~~~{{{zz{~{{{~{{{~~~~~= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~~~~~~~~~~~~~~~~~~~~~~~zzz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~zz{{~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~zzz{~~~= ~~~~~~~~~~zz{~zzz{~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~zz{{~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{~~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~{zzzzz{{~~~~~~~~~~~~~{zzzzz{{~~~~~~~~~~~~~~~}}{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01= =B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~= ~~~~~~~~~~~~~~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{{{~~~= ~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{{{{{~~~~~~~~~~~~~~~= {{{{{{~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}= }{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{zz{{{{{{{{{{= {{{{{{{{{{zz{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zzz{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{= {{{{{{zz{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{zz{{zz{{{z{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{= {{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z= z{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{{{z= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{= z{zzzz{z{zz{{{{zzz{{z{zzz{{{{z{{{zzz{{{z{zz{{{{zzz{{{z{{{zzz{{{{{zz{{{{{{= {zz{zzz{zz{{zz{{{{zzz{{zzzz{{zzzz{{zzz{zz{{zz{{{zzzz{{zzz{{zz{{zz{{{{{{{{= zz{{{{{{zzz{{zz{zz{{{{zzzz{{{{{z{{{{{{{{zz{zz{zz{zzz{{zz{zz{zzz{{{{zzz{{{= {{{{{{{zzz{zzzzz{{{zzz{{zzz{zzz{zzzzz{{{{{{{{z{{{{{{{zzz{{z{zzz{{zzz{{{{{= {{zzz{{z{zz{{{{zzz{{zzz{zzz{zzzzz{zz{{{{{zz{zz{zz{{{{{zzzz{z{zz{{{{zzz{{{= {{{{zzz{{{z{zz{{{{zzz{{zzz{zzz{{zzz{{{{{zz{zz{zz{zzz{{{{zzz{{{{zzzz{{{zzz= {{{{{{{{{{zz{{z{{{{zzz{{zz{{zz{{{{{{zzzz{{{zzz{{zz{zz{{{{{{{zzz{{{{zzz{{{= zzzz{{{zzz{{zz{zz{{{{zzz{{{{{zzzz{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{z{{{zz{zz{{z{{{z{{zz{z{{{{z{{zz{{z{{zz{= zz{{z{{{z{{z{{z{{z{{{{{zz{{{{{zzz{{{zzz{zzz{zz{{z{{zz{{zz{{zz{{zz{{zzz{zz= z{zz{zz{{zz{{zz{{zz{{{zzz{{{{{{zz{{{{{zz{{z{{zz{zz{{zz{{z{{{{{z{{{{{{zz{{= {{zz{zzz{zz{{zz{zzz{zz{{z{{z{{{{{{{{{{{z{{{z{{z{{z{{{z{{z{{{z{{{z{{{zz{{{= {{{z{{{{{{zz{{z{{zz{z{z{{{z{{{{{z{{z{{zz{zz{{zz{zz{{z{{{z{{{z{{zz{zz{{{{{= z{{zz{zz{{{{{z{{{zz{zz{{z{{{z{{{{{zz{{z{{zz{zz{{zz{zz{{z{{{z{{z{{{z{{{{{z= {{zz{zzz{zz{{zz{{z{{zz{z{{{z{{{z{{{{{{{{{{z{z{{{{zz{zz{{z{{{z{{{{{zz{{z{{= zz{{z{{zz{zz{{{{{z{{{z{{z{{z{{zz{{z{{zz{{z{{zz{zz{{z{{{z{{{{{z{{{zz{zz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{z{{{z{{{z= {{zzzzz{{z{{{{{{{z{{{{{zz{{z{{{z{{zzzzz{{z{{zz{{{{{{{zz{{{zzz{{{{{zz{{zz{= {zz{zz{{zz{{zz{{{{{{zz{{zz{{zz{{zz{{{{{zz{{zz{{zz{{{{{zzz{{{{zz{{{{{{{{zz= {{z{{{z{{z{{{z{{{{{z{{{{zz{{{{{{z{{{z{{{z{{z{{{z{{{z{{zz{{{{{{{{{{{{{z{{{= z{{z{{zzzzz{{z{{{z{{{z{{{{{zz{{{{z{{{{{{{{{zz{{z{{{{zzzzz{{{{{zz{{{{z{{{z= {{z{{{z{{z{{{z{{{z{{z{{{z{{{{{z{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{{{{{{{zz{{z{= {{z{{z{{{z{{z{{{z{{zzzzz{{{{{z{{z{{{z{{{z{{{{{zz{{z{{{z{{zzzzz{{{{{{{{{{{= z{{{{{z{{{z{{z{{{z{{{{{z{{{{{{{{{zz{{z{{{z{{{{{zzzzz{{zz{{{{z{{{{{{{{{zz{= {z{{{z{{zzzzz{{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{z{{{{{{z{{z{{{z{{{z{{z{{{{{{z{{{{{{{z{{{zz{z{{z{{{z{{z{{{{{{z= {{{zz{{{{{{zz{{zz{{{{{{{zz{{zz{{zz{zzzzzz{{zz{{{zzzzz{{zz{{zz{{zz{{zzzzz{= {zz{{zz{{{{{{{zz{{{zz{{{{{{zz{z{{z{{{z{{z{{{z{{{{{z{{{zz{{{{{{{z{{{z{{{z{= {z{{{z{{{z{{{zz{{{zzzzzzz{{{z{z{{{z{{z{{{{{{{z{{z{{z{{{{{{{zz{{{z{{{{{{{z= z{z{{z{{{{z{{{{{{{{{{zz{{{z{{{z{{z{{{z{{{z{{z{{z{{{z{{{z{{{{{z{{z{{{z{{{{= {z{{{z{{{z{{z{{{{{{{{{{zz{z{{z{{{z{{z{{{z{{{z{z{{{z{{{{{{{{{z{{z{{{z{{{z{= {{zz{z{{zz{{z{{z{{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{z{{{{{z{{{{{{{zz{z{{z{{{z= {{{{{z{{{{{{{zz{{{z{{{{{{{zz{z{{z{{{z{{z{{{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{z{{{z{{{z{{z{{{{{{z{= {{{{{{z{{z{{{z{{z{{{z{{z{{{{{{z{{{{zz{{{{{zz{{{zzz{{{{{zz{{zz{{zz{zz{{{{{= {zz{zzz{{zz{{zz{{zz{{zz{zz{{zz{{zz{{zz{{{{{zzz{{{{zz{{{{{z{{{z{{z{{{z{{z{= {{z{{{{{z{{{{zz{{{{{{z{{{z{{{z{{z{{{z{{{z{{{{zz{{{{{{{{{{{{z{z{{{z{{z{{{{= {{{zzz{zzz{{{{{{zz{{{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{{{{zz{{z{{{z{{z{{{z{{{z= zz{zzz{{{z{{{z{{{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{{z{= {{z{z{{{z{{{{{{{{{z{{z{{{z{{{z{{z{{{z{{{zzz{{{z{{{{{{{{{{{{{{{z{{{{{z{{{z= {{z{{{z{{{{{z{{{{{{z{{{z{{z{{{z{{{{{z{{{{{{{{zz{{z{{{{{{z{{{z{{z{{{z{{z{{= {{{{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{zz{{zz{{{z{{{z{{{z{{zz{{{z{z{{{{{{{z{{zz{{z{{z{{zz{{zz{{{z{z{{z{{z{{{{{= zz{{{{{zzz{{{zz{{zz{{zz{zzz{{z{{zzz{zz{{zz{{zz{{zz{{zz{zz{{zz{{zz{{zz{{{z= zz{{{{{{zz{{{{{zz{{z{{z{{{z{{zz{zz{{{{{z{{{{{{zz{{{{z{{{z{{{z{{z{{{z{{{z{= {z{{z{{{{{{{{{{{{{z{{{{z{{zz{{{z{{{z{{{z{{{{{zz{{{{{{z{{{{{{zz{{z{{z{{{{z= z{{{z{{{{z{{z{{z{{{z{{zz{zz{{{{z{{{z{{{{z{{{z{{{{{z{{z{{{z{{{{{z{{{z{{{z{= {zz{{{z{{{{zz{{z{{z{{zz{{zz{zz{{{{z{{{{zz{{{z{{{{z{{z{{{z{{{z{{zz{{z{{{z{= {{{{zz{{{z{z{{{{{{{{z{{{{{zz{zz{{zz{zz{{{{{zz{{{z{zz{{z{{z{{{z{{{{{zz{{{z= {z{{z{{zz{{{z{zz{{z{{zz{zz{{zz{{{z{{{{z{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{zzzzz{zzz{{zzzz{zzz{{{{{zzz{{z= zz{z{zzzz{{{{zzzz{zzz{zzz{{{{{{zz{{{{{{{zz{zzzz{zzz{zzz{zzzz{{{{zz{{zzz{z= zzzzz{zzz{zzz{zzz{zzzzzzzzzz{zz{{{{{{{{zz{{{{{{zzz{zzzz{zzz{{zzz{z{{{{z{{= {{{{{{zz{zzz{zzz{zzzzzz{zzz{zzz{zzz{{{{{{{{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{= {zz{{{{{{{{z{{{{{{{zzz{zzzz{{{{zzzz{{{{{zzz{{zzz{zzz{{zzz{{{{{z{{{z{{{zzz= {zzz{{{zzzzzz{zzz{{{{{zzzzz{zzz{{zzzz{{{{{{zzz{z{zzzz{{{{zzz{{{{{z{{{{{zz= zz{{{{zzzzzz{zzz{zzz{{zzz{z{{zzzz{{{zzzz{{z{{{{{{{zzz{{{{{zzz{{{{zz{zz{{{= {{zzzz{{{zzz{zzzz{zzz{{{{{zzzz{{zzz{{{{zzzz{{{zzz{z{z{zz{{{{zzzz{{{{{{zz{= {zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4= =88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{= {{z{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{zz{zz{zzz{{{{zzz{{zzzz{{zzz{{zz{zz{zzz{= {{{zzz{{zz{{z{{{{{{{{{zzz{{z{zzz{{{z{zzz{{zzz{{zzz{zzz{zzz{{{zz{zz{zzz{{{= {zzz{{{{zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{{zzz{zzzzz{{{zzz{{zzz{zzz{zzz{{z= zz{{z{zzz{{{{z{zz{{zzz{zzz{{{{{zzz{{{zzz{{{z{{{zzz{{{{zzzz{zzzzzz{zz{zz{{= {{zzzz{{{{zzzz{z{zz{{{{zzz{{{{zzz{{{zzz{{{{{{z{{{zzz{{{z{zz{{{{zzz{{{z{{{= zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zz{zzz{= zz{{z{{{z{{z{{{zz{{z{{zz{zzz{zz{{zz{{z{{z{{z{{{{{{{{zz{zz{{zz{z{{{{zz{z{z= z{{z{{z{{{z{{{z{{{{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{{zz{{z{{zz{z{{{z{{{z{{{{= {z{{{z{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{zz{z{{{{zz{zz{{z{{{z{{{{{z{{z{{z{{{z{= {z{{z{{{z{{zz{{z{{z{{{z{{zz{zz{{zz{z{{{{{{z{{{zz{zz{{z{{{z{{z{{z{{z{{{z{{= {{{z{{zz{{z{{zz{zz{{z{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{zzzzz{{z{{{{{{zz{{z{{{z{{{z{{{{{zz{{z{= {z{{{{{{{{z{{{z{{z{{{{{{{z{{{{{{{zz{{z{{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{zz{{= {{zz{{{{{{{zz{{z{{{z{{zzzzz{{{{{z{{{z{{z{{zzzzz{{z{{{z{{{z{{zzzzz{{z{{{{{= {{z{{{z{{z{{{z{{{{{zz{{{{zzzzz{{z{{zzzzz{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{= z{{{z{{{z{{zzzzz{{zz{{{{zzzzz{{{{{z{{{{{zz{{z{{{z{{zzzzz{{z{{zz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{{{{{z= {{{{zz{z{{z{{{z{{{z{{{zz{z{{z{{z{{{{{{{{z{{{z{{z{{{{{{{z{{{{{zz{z{{{z{{z{= {z{{{{{{z{{{z{{{z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{{{{z{z{{{z{{z= {{{{{{{z{{z{{z{{{z{{{{{{z{{{{{{{z{{{z{{{z{z{{{{{{{zz{{{z{{{{{{z{{z{{{{{{z= {{{{{{z{{{z{{z{{{z{{zz{{z{{{{{z{{{z{{{z{{z{{{{{{{zz{{{z{{{{{{{{{z{{{zz{z{= {z{{{z{{z{{{{{{z{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{z{{{z{{{z{{z{{{{{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{z{{{{{{{{z{= {{z{{z{{{{{{{z{{{{z{{{z{{{zzz{zzz{{{{{{z{{{z{{{z{{z{{{{{{{{zz{{{{zz{{z{{{= z{{{zzz{{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{zzz{zzz{{{z{{{{{{z{{{{{{{z{{{z{{{z{= z{{{{{{{{zz{{z{{{{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{zzz{{{{{{z{{{z{{{z{{z= {{{{{{{{zz{{z{{{{{{{{{z{{z{{{z{{z{{{z{{z{{{{{{z{{{{zz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{zz{{{z{z{{{zz{{z{{z= {{{z{{{z{{zz{{z{{z{{z{{z{{{{{zz{zz{{z{{{{{{{z{{{{zz{{z{{{{z{{{z{{{{{{{z{{= {z{{{z{{zz{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{{{{{{z{{{{z{{zz{{{z{{{z{{= {z{{{{zz{{{z{z{{{{{{{z{{zz{{{{z{{{{{{{z{{z{{zz{{{z{z{{zz{{{z{zz{{{z{z{{{z= {{z{{{z{{{z{{{{{{{{z{{{z{{{z{{zz{{{z{z{{z{{zz{{{z{{{{z{{zz{{z{{z{{zz{{zz{= {{z{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{zz= z{zzz{zzz{{zzzz{{{zz{{zzz{zzzz{zzz{zzz{{zzz{zzzzzzz{z{{{{{{zzz{{zzz{{{{{z= zz{{{{zzz{z{{{z{{{z{{{{{{zzz{zzz{zzz{{zzzz{{zzz{{{zzz{{{{zzz{z{{zzzz{{{zz= zz{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{{zzzz{zzz{{{{{{zzzz{{{{zz{{{{{{{zzz{{{= {zzzz{zzz{{zzzz{{{zzzz{{{zzzzzzzz{zzz{{zzzz{{{{{{zzzzz{zzz{{zzzz{{zzz{{{{= zzzz{{{{zzz{{zzz{z{zzzz{{{{zzzz{zzz{zzz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8= =04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{{{{{zz{{z{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{= {{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{zz{{{{{{{= {zz{{{{{{{{{{{{zz{{{{{{{zz{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{zz{{{{{z{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{z{{z{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{z{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{{z{{{{{{{{{z{{{{{{{{= {{{{{z{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{z{{zz{zz{{{{{zzzz{z{zz{{{{zzz{{{{{{{zzzz{zz{{{zzz{zz{zz{{{z{{{zzz{{zzz= {zzz{{{{{zzz{{zzzz{{{zzz{zzzzz{zz{zz{{{{{{{{{{zzz{{{{{{{zzzz{{{zzz{{zz{zz= {{zzzz{{zzz{{zz{zz{{zzzz{{{{{zzz{{zzzz{{{zz{zz{{{{zzz{{zz{zz{{{{{{{{{{{zz= zz{{zzz{{zzz{zzzzzzz{{{zz{zz{{{{zzz{{z{zzzzzzz{{zzz{{{{{{zzzz{{{zzz{{zz{z= z{{{{{{z{zz{{{{zzz{{{{{{{zzz{{z{zz{{{{zzz{{zzz{zzz{zzzzz{zz{{{{{{z{zz{{zz= z{zzz{{{{{zzz{{{zzz{{{z{{{zzz{{{{zzzz{zzzzzz{zz{zz{{{{zzzz{{{{{{zzz{{{{{{= zz{{{{{{{zz{zzzz{zzzzzz{{{zzz{zzz{zzz{zzzzz{zz{{{zzzz{{zz{zzzzzzz{zz{{{{{= {{{zz{{{{{z{{{zzz{{{z{zz{{{{zzz{{{z{{{{{{{{z{zz{{z{{zz{{{zzz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{zz{zz{{{{{z{{{zz{zz{{z{{{z{{{{{zz{{= z{{z{{z{{z{{zz{zz{{z{{zz{{z{{z{{{z{{{{{zz{zz{{z{{{{{{z{{{z{{z{{zz{zz{{{{{= {{{zz{{z{{{{{zz{{z{{zz{zz{{zz{zz{{z{{{z{{{z{{zz{zz{{z{{{{{{zz{zz{{z{{{{{{= zz{zz{{zz{zz{{zz{zz{{{{{{{{{{{z{{{z{{{z{{z{{{z{{z{{{{{{zz{zz{{zz{{z{{zz{z= {z{{{z{{z{{{{{zz{{z{{zz{{z{{zz{zz{{{{{zz{zz{{z{{{z{{{{{z{{z{{zz{zz{{zz{zz= {{z{{{z{{{z{{zz{zz{{{{{zz{zz{{z{{{z{{{{{z{{z{{z{{{z{{z{{z{{{z{{zz{{z{{z{{= {z{{zz{zz{{zz{z{{{{{{zz{{z{{{{{zz{{{{{zzz{{{zz{{{z{{zz{{z{{zz{zz{{z{{z{{z= zz{zz{zz{{zz{{zz{zz{zz{{{zzz{{{{{{zz{{{{{z{{zz{{z{{zz{zz{{z{{{z{{z{{{{{{{= {z{{z{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z= {{{{{z{{{z{{{z{{zzzzz{{{{{z{{{z{{z{{zz{{{{z{{{z{{z{{{{{zz{{z{{{z{{{{{z{{{= z{{z{{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{{zz{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{zzzzz= {{z{{{z{{z{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{z{{{zzzzz{{{z= zz{{{z{{{{{{z{{{z{{{{{zz{{z{{{{z{{{zz{{{{{{{z{{{{{{{{{zz{{z{{{z{{{{{z{{{z= {{zzzzz{{{{{zz{{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{z{{{{{zz{= {{{zzzzz{{z{{zzzzz{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{zz{{{{{zz{{{zzz{{{{= {zz{{{z{{zz{zz{{zz{zzz{zz{z{{zz{{zz{{{{{zz{{zz{{{{zz{{{{{zzz{{{{zz{{{{{z{= {{{{zz{{z{{{z{{zzzzz{{z{{{{{{{{z{{z{{zzz{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{zz{{{= z{{{z{{z{{{zz{z{{{z{z{{{{{{z{{{z{{z{{{{{{{z{z{{{z{{z{{{z{{{{{{{{{zz{z{{{{= {z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z= {{z{{{z{{zzzzzzz{{z{{{z{{{{{{{{z{{{{z{{{{{{z{{{z{{{zz{z{{z{{{{z{{{{zz{{{{= {{z{{{{{{{zz{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{{{zz{{{z{{{z{{z{{{z{{{z{{z{{z{{= {z{{{z{{{{{z{{{z{{{z{z{{{{{{{zz{{{z{{{{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{z= z{{z{{{{{{zz{z{{{{{zz{{zz{{{{{{{{zz{z{{{zz{zzzzzz{{zz{zzz{{{zz{{zz{{zzzzz= {{zz{{{{zz{{{{{{{zz{{{zz{{{{{z{{{zz{z{{z{{{z{{z{{{{{{z{{{{{{{{z{{z{{z{z{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{{{z{{{z{{= {z{{z{{{{{{{{{z{{{z{{z{{{{zz{{z{{{z{{z{{z{{{z{{{z{z{{{{{{z{{{z{{z{{{{{{{z= {z{{{z{{z{{{z{{{{{{{{z{{{z{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{z{{{z{{z{{= {{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{z{{{z{{{{{{{zzz{{{z{{{{{{= z{{{z{{z{{{z{{z{{{{z{{{{{zz{{{{{z{{{{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{{= {{zz{{z{{{z{{z{{{z{{{zzz{zzz{{{z{{{z{{{{{z{{{z{{{z{z{{{{{{{{zz{{z{{{{{{z{= {z{{{{{{z{{{{{{z{{{z{{z{{{z{{{zzz{{{{{{z{{{z{{{{{zz{{{zzz{{{{{{zz{z{{{zz{= zz{{{{{{zzz{zz{{{zz{{zz{zz{{zz{{zz{{{{zz{z{{{zzz{{{{zz{{{{{z{{z{{{z{{z{{{= z{{z{{{{{{z{{{{{{{{z{{z{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{z{{{z{{{z{{{{{z{{{z{{{z{{zz{{{z{{{{zz{zz{{z{{z{{z{{zz{zz{{z{{zz= {{z{{{{z{{{{{{{zz{zz{{z{{{{{{{{z{{{{z{{z{{{z{{z{{{{{zz{{z{{{{{zz{{{z{zz{z= z{{z{{{z{{z{{{zz{{{z{z{{{z{{z{{{{{{zz{zz{{z{{{{{{z{{{z{{zz{zz{{z{{{z{{{{{= {{{{{{z{{{zz{{{z{z{{{z{{z{{{{{{zz{zz{{zz{{z{{z{{{{z{{{z{{z{{{{{zz{{{z{zz{= {z{{z{{{z{{{{{z{{zz{{zz{{{z{{{{z{{z{{z{{{z{{zz{zz{{{{z{{{z{{{{z{{{z{{{{{z= {{zz{{{{z{{{{{{{z{{z{{zz{{{z{z{{zz{{{z{zz{{{z{z{{{z{{z{{{z{{{z{{{{{{{{zz{= {z{{{{{zz{{{{{zzz{{{{{zz{{{{zz{zzz{{z{{zzz{zz{{{zz{{zz{zz{{zz{{zz{{{{zzz{= {zzz{{{{{{zz{{{{{z{{zz{{z{{z{{zz{{zz{{{z{z{{z{{{{{z{{z{{z{{zz{{zz{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zzz{zzz{zzz{{{{{zzzzz{zzz{{zzzz{{= {{{{zzz{zzzz{zzz{{{z{zz{{zzz{{zzz{z{{zz{{{{{{{{zzz{{zzzz{{{{{{z{{{zzzzzz{= zzz{z{{{{{{zzz{z{{{{{zzzz{{{zzz{{zzz{zzz{{zz{{zzzz{zzz{zzz{{zz{{{{{zzz{{z= zzz{{{zzz{zzz{{zzz{{zzz{zzz{{{{{{{{{{{zz{{zzzz{zzz{zzz{{zz{{{{z{zz{{{{zzz= {zzzz{{{{zz{zzz{{{{{{{zzzz{{{zzz{zzzz{zzz{{{{zzzz{{{{zzzz{{{{{zzz{{zzz{zz= z{{zzz{{{{{z{{{z{{{zzz{zzz{{{{zzzz{{{{zz{{{{{{{zzz{{{{zzzz{zzz{{zzzz{{{zz= zz{{{zzzzzzzz{zzz{{zzzz{{{{{{zzz{z{{{{zz{{{{{{{zz{{{{zz{{{zzzz{zzzz{{{{z{= {z{{{{zzzzz{{{zzz{zzzzzz{{{{zz{zz{{{{{{{{zz{{{{zzz{{zzz{z{zzzz{{{{zzzz{zz= z{z{{{{zzzzzzzzz{{zz{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{zz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{zz{{zz{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{zzzz{z{zz{{zz{{{zzz{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {z{{{zz{zz{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{zz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{= {z{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{z{{z{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{{zzzzz{zzzzzz{zzz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4= =1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||= ~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF= =FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{||~~~~~~zzzz{~~~~zz{~~~~~~zz{~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~zzz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{~zz{~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~~~~~~~~~zz{~~zzzzzz{~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~zzz{{zzz{~~zz{~= ~~~~~zz{~~~~~~~~~~~~~~~~~zz{~~~~~~~~~~~~~~~zz{{{~~~zz{~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~{zz{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~~~~~~~~~zz= {~zz{{{zz{~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{||~~~~zz{{~{zz{~~zz{~~~~~~{{{~~~~~~~~~~~~~~~~~zz{~~~~~~~~~~~~~~= ~zz{~~~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{{~{{{~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~z{{~~~~~~~~~{{{~zz{~zz{{~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz{{~~~{zz{~zzzzz{~~~zz{~~z= zzz{~~~~zzz{~zzzzz{~~~~~~zzz{~~zzzz{~~~zzzzzzz{~~~zz{zz{zz{~~~~zzzz{~~~~~= ~{{{~~zz{~zz{zz{zzz{~~~zzzz{~~~~zzz{z{~~zzzz{~~~z{~~~zzz{z{~zz{zzzz{{{{~~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{|= |~~~zz{~~~~~zz{~zzz{zz{~~zz{~zz{{zz{~~zzzzz{{zz{{{~~~~~zz{zz{~{zz{{~~~{zz= {{zz{~~~zz{zzz{zz{~~zz{{zz{~~~~~~~~~~zz{~zzz{zzz{zz{~zz{{zz{~~zz{zzz{~zz{= {zz{~zz{~~zz{zzz{~zz{{zz{{~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz{~~~~~zz{~zz{{{zz{~zz{~zz{~zz{~zz{{{= z{~zz{~~~~~~zz{{{zz{~zz{~~~~~zz{~{zz{~zz{{zz{{{zz{~zz{~zz{~~~~~~~~~~zz{~z= z{{zz{{zz{~{{{~zz{~zz{{{zz{~zz{~zz{~zz{~zz{{{zz{~zz{~zz{~~~~~~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~zz{~~~~~z= z{~zz{~~zz{~zz{~zzzzzz{~zz{~~{{~zz{~~~~~~zz{~~zz{~zz{~~~~~zz{~~zz{~zz{~zz= {~~zz{~zzzzzz{~~~~~~~~~~zz{~zz{~zz{~zz{~~zzzzz{~zz{~~zz{~zzzzzz{~zz{~zz{~= ~zz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{||~~~zz{~~~~~zz{~zz{~~zz{~zz{~zz{{{{{~zz{~~~~~zz{~~~~~~z= z{~~zz{~zz{~~~~~zz{~~{z{~z{{~zz{~~zz{~zz{{{{{~~~~~~~~~~zz{~zz{~zz{~zz{~zz= {{zz{~zz{~~zz{~zz{{{{{~z{{~zz{~~zz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~{zz{~~~zz{{~zz{~~zz{= ~zz{~zz{~~~~~zz{~~z{~zz{~~~~~~zz{~~zz{~zz{~~~~~zz{~~~zzzz{~~zz{~~zz{~zz{~= ~~~~~~~~~~~~~zz{~zz{~zz{~zz{~zz{~zz{~zz{~~zz{~zz{~~~~~z{~~zz{~~zz{~zz{~zz= {~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{||~~~~zzz{~zzz{~~zzz{zz{{~zz{~zzz{zz{~{zzzzz{~zz{z{~~~~{zz{zz{{~zz{= ~~~~~zz{z{~{zz{{~~zzz{zz{{~zzz{zz{~~~~~~~~~~zz{~zz{~zz{~zz{~zzzzzz{~{zz{z= zz{~zzz{zz{zz{~~{zz{zzz{~zz{~zz{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~{{zzzz{{{~~zz{zz{{~~zz{~{zzzz{= {~~{zzz{{~{zz{{~~~~~{zzz{{~~zz{~~~~~{zz{{~~zz{~~~zzzzz{{~~{zzzz{{~~~~~~~~= ~~zz{~zz{~zz{~zz{~{zzz{zz{~{zzzzz{~{zzzz{{zz{~~~{zzzzz{~zz{~zz{~~~~~~~}}{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~= ~~~{{{{{~~~~{{{{{{~~~zz{~~{{{{{~~~~{{{{~~~{{{~~~~~~~{{{{~~~{{{~~~~~~{{{~~= ~zz{~~~zz{{{{~~~~{{{{{~~~~~~~~~~~{{{~{{{~{{{~{{{~~{{{{{{{~~{{{zz{~~{{{{{~= {{{~~~~{{{zz{~{{{~{{{~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{= {{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~zzz{~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{{~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~zz{~zzz{~~~~~~~~~~~~~zz{~zzz{~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~= ~~~~~zz{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{~~~~zz{~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zzzzz{{~~~~~~~~~~~~~{zzzzz{{~~= ~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~{{{{~~~~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~{{{{{{~~~~~~~~~~~~~~~{{{{{{~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= ||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C= =AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}= }{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zz= z{{{{{{zz{{{{{{{{{{{{{{zz{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{= {{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{z= z{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{z{{{{{{{{{{{{{{{z{{{{{z{{{z{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{z{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{= {{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{= z{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{= {{{{{{{{{{{{{z{{{{{z{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{z{{{{{zzzz{{zzz{{{{zzz{{{z{{{{zzzz{z{zz{{{{zzz{{{{{{z{= zz{{{{zzz{{{z{{{zzz{{zz{zz{{{z{zz{{z{zzz{{zzz{{{{zzz{zzzzzz{{{zzzz{{{{zzz= {zzzzz{{{zzz{{zzz{zzz{zzz{{{zz{{{zzz{{{{zzz{zzz{{zzz{{zzzz{{{zz{{zz{{{zzz= {{{zzz{{zzzzzz{{zz{{z{{{{zzzz{{zzz{{z{zzz{{{{{zzz{{{{{zz{zz{zzz{{{{zzz{{{= {zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{{zzz{zzz{zzz{z{zz{{zz{{{zzzz{{z{zz{{{{{= {{zzzz{{{zzz{{{{zzz{{{{zzz{{{{zz{zz{{{{zzz{{zzzz{{{zz{zz{zz{{{{zzzz{{z{zz= {{zz{{{zzzz{{{zzz{{{{{{{zzz{{zz{zz{{zzz{zzz{{{zz{zz{{{{zzz{{zz{zz{{{{{{{{= {{{zzzz{{zzz{{zzz{zzzzzzz{{{zz{zz{{{{zzz{{z{zzzzzzz{{{{{{zzzz{z{zz{{{{zzz= {{zzzz{{{zz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{{z{{z{{{z{= {z{{{{{z{{{zz{zz{{z{{{z{{{{{zz{zz{{zz{zz{{z{{zz{zz{{zz{zz{{zz{zz{{zz{z{zz= {{z{{z{{z{{z{{{z{{zz{{z{{{{{z{{{z{{z{{z{{{z{{z{{{z{{{z{{{{{z{{z{{z{{{{{z{= {{z{{z{{{z{{z{{{{{{z{{{z{{z{{z{{z{{{z{{z{{{z{{{z{{z{{{{{z{{{zz{zz{{zz{z{{= {{zz{{z{{{{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{{zz{{z{{zz{z{{{z{{{z{{{{{z{{{z{{= {z{{zz{zz{{z{{zz{{z{{zz{zz{{{{{zz{{z{{zz{zz{{z{{{z{{z{{z{{{{{zz{zz{{zz{zz= {{z{{{{{{z{{zz{zz{{zz{{z{{z{{z{{{z{{zz{{z{{z{{{z{{{{{zz{{z{{zz{zz{{z{{{z{= {{{{zz{zz{{zz{zz{{zz{zz{{{{{{{{{{{z{{{z{{{z{{z{{{z{{z{{{{{{zz{zz{{zz{{z{{= zz{z{z{{{{{{{{{z{{{zz{zz{{zz{{z{{z{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{z{{{zzzzz{{zzzzz{{z{{{{{z{{{z{{{z{{zzzzz{{{{{z{{{z{{z{{{z{{= z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{{zz{{zz{{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{zzzz= z{{z{{{z{{{z{{{{{z{{zz{{{{{{{z{{{z{{zzzzz{{z{{{{{{z{{{z{{zz{{{{zzzzz{{z{{= {z{{{z{{z{{{{{z{{{z{{{z{{z{{{{{{{{{{zz{{{{{z{{{z{{{z{{zzzzz{{zz{{{{zz{{{{= {{{zz{{z{{{z{{zzzzz{{{{{z{{{z{{{z{{z{{{z{{z{{z{{{{{{z{{{z{{{{{z{{{z{{z{{{= z{{zzzzz{{zz{{{{{{{z{{{z{{z{{{z{{z{{{{{{z{{z{{{z{{z{{{{{{z{{z{{{z{{z{{{z{= {zzzzz{{{{{{{{zz{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{z{{{zzzz= z{{{zzz{{{z{{{{{{z{{{z{{{{{zz{{z{{{{z{{{{{{{{{z{{{z{{{z{{{{{zz{{z{{{{{{z{= {zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{{{{{z{{{{{{z{{{{{z{{{= z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{zz{z{{{zz{{{= z{{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{z{{z{{z{{{{{{z{{{zz{{{{{{{z{z{{{z{{{{{= {z{{{{{{z{{{z{{{zz{{{z{{{{{{z{{{z{{{z{{z{{{{{z{{{z{{{z{{z{{{{{{{{zz{z{{{{= {z{{{z{{{z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{{{{z{{z{{z{{{z{{{z{{= z{{z{{{{{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{{{{{zz{{{{{{z{{{z{{z{{{z{{z{{{{{{z{= {z{{{z{{z{{{{{{z{{z{{{z{{z{{{z{{z{{{{{{{{{{zz{z{{z{{{z{{{z{z{{{{{{z{{{z{{= z{{{z{{z{{{z{{zzzzzzz{{z{{{z{{{{{{{{z{{{{z{{{{{{z{{{z{{{zz{z{{z{{{{z{{{{{= {{{{z{{{z{{{z{{{zz{z{{z{{{{{{z{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{z{{{z{{{{{{z{{{{{{z{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z= {{{z{{z{{{z{{z{{{{z{{{z{{{{zz{{z{{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{zzz{zzz= {{{{{{z{{{{zz{{{{{{z{z{{{z{{{{{{z{{{{{{z{{{z{{{{zz{{z{{{{{{z{{{z{{{z{{z{{= {{{z{{{z{{{z{{z{{{{{{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{zz{{{{zz{{z{{{z{{{zzz= {{{z{{{{{{{{{{zzz{zzz{{{z{{{z{{z{{z{{{{{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{{{{{= {zz{{{{{z{{{z{{z{{{z{{z{{{{{{z{{z{{{z{{z{{{{{{z{{z{{{z{{z{{{z{{z{{{{{{{{{= z{{{z{{z{{{z{{{z{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{z{{{z{{{{{{{zzz{{{z= {{{{{{z{{{z{{z{{{z{{z{{{{z{{{{{{{{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{zz{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{zz{{{z{zz{{{z{z{{{{{z{{{z{{{z{{zz{{{z= {{{{z{{{z{{zz{zz{{z{{zz{zz{{zz{zz{{z{{{z{{z{{{{zz{{z{{z{{z{{z{{{z{{zz{{{z= {{{{{{z{{{{z{{zz{{{z{{{z{{{z{{{{{{{z{{z{{z{{{{{{{z{{{{zz{{{z{z{{{{{{zz{zz= {{z{{z{{zz{{{z{z{{{zz{zz{{z{{{{{z{{{zz{zz{{z{{{{{{{zz{{z{{{{{z{{{z{{{z{{z= z{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{{{{{{z{{{z{{{{z{{{z{{z{{zz{{{z{z{{= {z{{{{{zz{zz{{zz{zz{{zz{{{z{z{{z{{{{{z{{{z{{zz{zz{{z{{{{{{z{{z{{{z{{zz{{{= z{z{{zz{zz{{zz{zz{{zz{{{z{{{{zz{{z{{z{{{z{{{{z{{{{{{{z{{{z{{zz{zz{{z{{{z{= {{{{{{{{{{z{{{zz{{{z{z{{{z{{z{{{{{{zz{zz{{zz{{z{{z{{{{z{{{z{{{{{z{{{z{{{z= {{zz{{z{{z{{{{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{zzzz{{zzzz{{= {zzzz{zzz{{{{{zzzzz{zzz{{zzzz{{{{zzz{zzz{{zzz{{zzz{{zzz{{{z{zz{{zzz{zzzzz= z{{{{zzz{z{zzz{{{{zzzzz{{zzzz{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{{{zzz{zzz{{= {{{{{zz{{{{{zzzz{{{zz{{{{{zz{zz{zzz{{{{zzzz{zzzz{{zz{zzzzz{{{zzzz{{zzz{{z= zz{{{{{{{zzz{z{{{zzz{zzz{zzz{{zzzz{{zzz{{{zzz{{{{zzz{z{{zzzz{{{zzzz{{{{{{= {z{{{z{{{zzz{zzzzzz{{zzzz{zzz{zzz{{{{{zzz{z{{zzz{{{{zzzz{{zzz{{{{{zzz{zzz= {{zzz{{{{zz{{{zzzzzz{zzz{{zzzz{zzz{{zz{zz{{zzz{z{{zzzz{{{{{{zzz{zzzz{zzz{= {zz{{{{{{zzz{zzz{{zzz{{zzz{zzz{{{{{{{{{{{zz{{zzzz{zzz{zzz{{zz{{{{z{zz{{{{= zzz{zzzz{{{{zz{z{{{{{{zzzzz{zzz{{zzz{z{{zz{{{zzz{zzz{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{= {{{{{{{{{{zz{{zz{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{zz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{zzz{{zzz{{{{{zzz{{zzzzzzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{z{z{z{z{{{{{{{{{z{{{{{{{{{{{{{{= {{z{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zz{{{{{zz{{{{z{{{= {zz{{{{{zz{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF= =FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{zzz{{z{zzz{{= zzzz{{{zzz{{{{{zzzz{{zzz{{zzz{zzzzzzz{{{zz{zz{zzz{{{{zzz{{{{zzz{{{zzz{{{z= zz{{{{zzzz{{{zzz{{{{{{{zzzz{{{zzz{{zz{zz{{{{{{z{zz{{{{zzz{{{{{z{zzz{{zzz{= {{{zzz{{{{zzzz{{{{{{zzz{{zzzzzzzzzz{{{zzzz{zz{{{zzz{{zz{zz{{zzzz{z{zzz{zz= z{{{{z{zz{{zzz{zzz{{{z{zzz{{zzz{{zz{zz{{z{zzz{{zzz{{{{zzz{{{zzz{{zz{zz{{z= zzzzz{zz{zz{{{{zzzz{{{{zz{zzzz{{{{{zzz{{{{zzz{{{{{{zzz{{{{{zz{zz{zzz{{zz{= {zz{{z{zzzzzz{zz{zz{{{{zzz{{z{zzzzzzz{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{{{{= z{{{z{{{{{zz{zz{zzz{{{{zzz{{{{zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{{{{{zzzz{z= {zz{{{{zzz{{zz{zz{{{{{z{zzz{{zzz{{{{zzz{{{{zzzz{{{{zz{zzzz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{z{{zz{{z{{zz{z{zz{z{{{z{{{z{{{{{z{{{z{{{z{{z{{{z{{z{{{{{{z= z{zzz{zz{{z{{{z{{z{{z{{z{{z{{zz{{z{{zz{z{{{z{{{z{{{{{zz{{z{{zz{{z{{zz{zz{= {{{{zz{zz{{z{{{z{{{{{zz{z{z{{{z{{zz{{z{{zz{{z{{{{{z{{{z{{z{{{z{{{z{{zz{{z= {{z{{z{{{z{{zz{zz{{z{{{z{{z{{{z{{{{{zz{zz{{z{{{z{{{{{zz{z{z{{{z{{zz{zz{{z= z{z{z{{{z{{z{{z{{z{{{z{{zz{zz{{z{{{z{{zz{zz{{zz{z{{{{{{z{{z{{{{{{zz{{z{{z= {{z{{{{{zz{{z{{{{{zz{zzz{zz{{z{{{z{{z{{z{{{z{{zz{zz{{zz{{z{{zz{z{z{{{{{{{= z{zz{zz{z{{{{z{{{{z{zz{zz{z{{{{zzzzz{{{{{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{{z= z{{z{{zz{z{{{z{{{z{{{{{{{{z{{{zz{zz{{z{{{z{{zz{zz{{{{{zz{z{z{{{z{{zz{{z{{= zz{{z{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{{z{{{{z{{{z{{zzzzz= {{{{{z{{{zzzzz{{{zzz{{{z{{{{{{z{{{z{{{z{{zzzzz{{zz{{{{zz{{{{{{{zz{{z{{{z{= {zzzzz{{{{{z{{{{{{{{{zz{{z{{{z{{{{{z{{{z{{zzzzz{{{{{z{{{{zzzzz{{{{{zz{{z{= {{z{{{{{zzzzz{{z{{{z{{{z{{z{{{{{{z{{zzzzz{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{= {z{{{z{{{{{z{{{{zzzzz{{z{{{z{{z{{{{zzzzz{{zz{{{{zzzzz{{z{{{z{{z{{{z{{z{{{= z{{z{{{z{{{{{z{{z{{{{{{{{{zz{{zz{{{{{{{{{{zz{{{{{z{{{z{{{z{{z{{{z{{z{{z{{= {z{{z{{{z{{{{{zz{{z{{{{z{{{{{{{z{{z{z{{z{{{{z{{{{z{{z{z{{z{{{{z{{{z{{{{{{= z{{{z{{{z{{zzzzz{{zz{{{{zz{{{{{{{zz{{z{{{z{{zzzzz{{{{{{{{z{{{z{{{z{{zzzzz= {{z{{{z{{{{{z{{{{zzzzz{{{{{zz{{z{{{z{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{z{{{zz{z{{z{{{{zz{{z{{z{{{{{{{{{z{{{z{{{{{{{{z{{{{z{{{{{{z{{{z{{{z{{z= {{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{{{z{{{{{{{zz{z{{z{{{z{{{{{z{{{z{{= z{{{{{{{{{z{{{{z{{{{{{{zz{z{{z{{{z{{{{{z{{{{{{z{{{z{{{z{{z{{{{{{z{{z{{{{{= {z{{{z{{z{{{z{{{z{z{{{{{{z{{{z{{{z{z{{{{{{z{{{{z{{{{{{z{{{z{{z{{{{z{{{{{{= {zz{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{zz{{z{{{{{z{{z{{{{{{{zz{z{{{zz{{{{{{{zz= {z{{{{{z{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{{zz{z{{z{{{{z{{{{{{{z{{z{z{{z{{= {{z{{{{z{{z{z{{z{{{{z{{{{{{{{{{z{{{z{{{z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z= {{z{{{{{{{{{{{{z{{{z{{{z{{z{{{{{{z{{{z{{{{{z{{{{z{{{{{{{zz{z{{z{{{z{{{{{z= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{{{{zzz{{{z{{{{{{{{{z{{{z{= {{{{{{zzz{{{z{{{{{{z{{{z{{{z{{z{{{{{{{{zz{{{{zz{{z{{{z{{{zzz{{{z{{{{{{{{{= z{{{{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{{z{{{{z{{{{{{z{{{z{{z{{{z{{{{{z{{= {{{{z{{{z{{{z{{z{{{{{{z{{z{{{{{{z{{{z{{z{{{z{{{z{z{{{{{{z{{{z{{{z{z{{{{{{= z{{{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{zz{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{zzz{{{{= {{z{{z{{{{{{z{{{z{{{{zz{{{{{z{{{z{{{{{z{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{= z{{{z{{z{{{{z{{{{{{{z{{{z{{{z{{{{z{{{{z{{{z{{{z{{{{z{{{{{{{{{{z{{{z{{{z{{= z{{{{{{{{zz{{{{zz{{z{{{z{{{zzz{{{z{{{{{{{{{{{{z{{{z{{{z{{z{{{{{{z{{{z{{{{= {z{{{{z{{{{{{z{{{z{{z{{{z{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{zz{{= z{{z{{{{{z{{{{{zz{{{z{{{{z{{{zz{{{z{z{{{z{{z{{{{{{z{{{z{{{z{{zz{{{z{z{{z{= {z{{z{{zz{{z{{{z{{{{{zz{{{z{{{{zz{{{z{zz{{z{{z{{{z{{{{{z{{zz{{zz{{{z{{{{z= {{{{zz{{{z{zz{{z{{zz{zz{{{{{zz{{{z{z{{{z{{{z{{zz{{{z{z{{zz{{{z{z{{{z{{z{{= {z{{{{z{{{{{{{z{{zz{{{{z{{{{{{{z{{{{zz{{{z{zz{zz{{z{{{{zz{{{z{z{{z{{zz{{{= z{z{{{z{{z{{{z{{z{{{z{{{z{{{{{{{{z{{z{{{{{{zz{{z{{z{{z{{{{{zz{{z{{{{{z{{{= z{{{z{{zz{zz{{z{{z{{{z{{zz{zz{{zz{{z{{z{{{{z{{{{{{{z{{{z{{{z{{{{z{{{{z{{{= z{{{z{{{{z{{{{z{{{{{z{{{z{{{z{{zz{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{z{= {{{{z{{{z{{{z{{zz{{{z{z{{{z{{{{{z{{{{zz{{{z{zz{{z{{zz{zz{{{{{z{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{zzz{{zzz{zzzz{{{{zzzz{{{zzzz{{{{{{zz{{zzzz{zzz{zzz= {{zz{{{zzz{zzz{zzz{{zzzz{{zzz{{{zzz{{{{zzz{z{{zzzz{{{zzzz{{{{{{zzzz{{{zzz= {zzzz{zzz{{{{zzzz{{{{zzzz{{{{zzz{{{{zzzz{{{zzz{z{{zzz{z{{{{{zzzz{zzzzzzzz= zzz{{zzzz{zzz{{zzzz{zzz{zzz{{zzzzz{{zz{{{{{{{zzzz{{{{zz{{{{{{zzz{{{{zzzz{= {z{zz{{zzz{{{{zzzz{{zzz{{{{zzzz{zzz{zzz{{zzzzzzzz{zzz{{zzzz{{{{zzz{{zz{{{= {{zzz{z{zzz{{{{{{{zzz{z{{{zzz{zzz{zzz{{zz{zzzzz{{zzzzz{z{zz{{{{zzz{zzzz{{= {{zz{{{{zzz{{z{{zzz{{zzz{{zzz{{z{{zzz{{zzzzzzz{{{{zzz{zzz{zzz{{zzzz{{zzz{= {{zzz{{{{zzz{z{{zzzz{{{zzzz{{z{{{{{{zzzzz{zzz{{zzzz{zzz{zzz{{{zzz{{{{zzzz= {{{zzz{z{{zzz{z{{{zzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{zz{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{= {{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{{{= {{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{{{z{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{= z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{z{zzz{{zzz{{zz{zz{{{{zzzz{{{zzz{{zz{zz{zzz{{{z{z= zz{zzz{{{{{zzz{{{zzz{{{z{{{zzz{{{{zzzz{zzzzzz{zz{zz{{{{zzzz{{{{{{zzz{{{zz= z{{{{zzzz{zzzzzz{{{zzz{{zz{zz{{{{zzz{{{{zz{zz{zz{{{{{zzzz{z{zz{{{{zzz{{{{= {{z{zz{{{{zzz{{{z{{{zzz{{zz{zz{{{z{zz{{z{zzz{{zzz{{{{zzz{zzzzzz{{{zzzz{{{= {zzz{zzzzz{{{zzz{{zzz{zzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{zz{z{zz{{z{{zz{z= z{{zz{{z{{zz{zz{{zz{zzz{zz{{z{{z{{{z{{{{{z{{z{{z{{{z{{z{{z{{{z{{zz{{z{{z{= {{z{{zz{zz{{zz{z{{{{{{z{{z{{z{{{z{{zz{{z{{z{{{z{{zz{zz{{zz{zz{{z{{z{{{{{z= {{zz{zz{{{{{z{{{zz{zz{{z{{{z{{{{{zz{zz{{zz{zz{{z{{zz{zz{{zz{zz{{zz{zz{{zz= {z{zz{{z{{z{{z{{z{{{z{{zz{{z{{{{{z{{{z{{z{{z{{{z{{z{{{z{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{zz{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{z{{{z{{{{{z= z{{{{zzzzz{{z{{zzzzz{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{zz{{{{zzzzz{{z{{{{{{= z{{{z{{z{{{z{{z{{{z{{zz{{{{{{{z{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{{{{z{{{z{{z{= {{z{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{{zz{{zz{{{{z{{{z{{z{{{{{{{{{z{{{z{{z{= {zzzzz{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{z{{z{{{z{{z{{{z{{z= {{{z{{z{{{z{{{z{{z{{{z{z{{{{{{{zz{{{z{{{{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{= {zz{{z{{{{{{zz{{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{zz{{{{{{z{{z{{{z{{{{= {z{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{zz{z{{{= zz{{{z{{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{z{{{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{z{{{{{{{{zz{{z{{{{{= {z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{zzz{{{{{{{{zz{{z{{{{{{z{{{{{{z{{{z{{z{{{= z{{z{{{z{{{{zz{{{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{z{{= {z{{z{{{z{{z{{{z{{z{{{{z{{{z{{{{zz{{z{{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{zz= z{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{zz{{z{{z{{{z{{zz{zz{{zz{zz{{z{{{z{{= {z{{z{{{{z{{{{{{{z{{z{{zz{{{z{z{{zz{{{z{zz{{{z{z{{{z{{z{{{z{{{z{{{{{{{{z{= {z{{zz{{{z{zz{{{z{z{{{z{{zz{zz{{z{{{z{{z{{z{{{{{z{{z{{{z{{{{{z{{{z{{{z{{z= z{{{z{{{{z{{{z{{zz{zz{{z{{zz{zz{{zz{zz{{z{{{z{{z{{{{zz{{z{{z{{z{{z{{{z{{z= z{{{z{{{{{{z{{{{z{{zz{{{z{{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{zzz{{{{zzz{= zzzz{zzz{{zzz{z{{zzz{{zzz{zzz{zzzzzz{{zz{{{{{{{zzz{{{{zzzz{zzz{{zzzz{{{zz= zz{{{zzzzzzzz{zzz{{zzzz{{{{{zzz{{{{zzzz{{{zzzz{{{zzzzz{{zzz{{zzz{zzz{zzz{= {{{{zzzzzz{zzz{{{{{zzzzz{zzz{{zzzz{{{{zzz{zzz{{zzz{{zzz{{zzz{{{z{zz{{zzz{= zzzzzz{{{{zzz{z{zzz{{{{zzzzz{{zzzz{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6= =C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{zzz{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zz{{{{{zz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zzz{{{zzz{zzz{{zzz{{{zzz{{zz{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{zz{{{{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z= z{{{{{{{{{{{{{{{zz{{{{{{{{{{zz{z{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zz{{{{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= zz{{{zzz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{z{{{{{{z{{{= {{z{{{z{{{{zz{{{{z{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{z{{{{{{{{{z{z{z{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{z{{{{{{{{{{{{{z{{{{{{zz{{{zz{{{z{{{{z{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzz{{z{zz{{{{zzz{{zz{{zz{{z{{= {zzzz{{{{{{zzz{{{zzz{{zzz{zzz{{{zzzz{z{zz{{{{zzz{{zzzz{{{{{z{{{z{{{{z{{{{= z{zz{{z{{{{{{{{zzz{{{{zzz{zzzzz{{{zzz{{zzz{zzz{zzz{{{zz{zz{zz{zzz{{{{zzz{= {{{zzzz{{{zzz{{{{{{{zzzz{{{zzz{{zz{{zz{{z{{{zzzz{{{{{z{zz{{{{zzz{{{{{{{zz= z{{{{zzz{{{{zzz{zz{{z{zzz{zzz{{{{{zzzz{{{zzz{{zzzzzz{zz{zz{{{{zzz{{{{zzzz= {{{{{{zzz{{z{zzz{{{{{zzzz{zz{{zz{{{zzz{zzzz{{zzz{{zz{zz{zzz{{zz{zzzzzz{{z= zz{{{{zzzz{{{{{z{zz{{zzz{zzz{{{{{zzz{{zz{zz{{{{zzzz{{{{zz{{zz{{{zzz{{{zzz= {{z{zzz{{zzz{{{{{{{{{z{{{z{{{{zzz{{z{zzz{z{zz{{{{zzz{{{{zzz{{{zzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {z{{z{{zz{zz{{zz{zz{{z{{{z{{z{{zz{{z{{{{{z{{z{{zz{{z{{z{{{z{{{{{z{{{zz{zz= {{zz{{z{{z{{{{{{{z{{{z{{{{z{{{{z{{z{{z{{{{{{{z{{z{{{{{z{{{z{{z{{z{{{z{{z{= {{z{{{z{{{{{z{{zz{zzz{zz{{zz{{z{{zz{z{{{z{{{z{{{{{zz{{z{{zz{zz{{z{{{z{{z{= {zz{{z{{{{{zz{zz{{z{{{z{{{{{z{{{z{{zz{{z{{z{{z{{z{{z{{z{{{z{{{{{zz{{z{{z{= {{z{{z{{{z{{zz{zz{{z{{{z{{zz{{z{{{{{zz{zz{{zz{z{{{{zz{{z{{z{{{z{{z{{z{{z{= {{zz{zz{{zz{zzz{zz{{z{z{{{z{{z{{{z{{zz{{z{{{{{zz{zz{{z{{{z{{{{{z{{{z{{zz{= zz{{zz{{z{{{{{z{{{z{{z{{z{{z{{{z{{zz{z{z{{z{{{{{{{{{z{{{z{{{z{{{z{{zz{z{z= z{zz{{zz{zz{{z{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{zz{{{{z{{{z{{z{{{z{{z{{{z{{z{{z{{{z{{{{{z= z{{{{{{{zz{{z{{{z{{{{{z{{{z{{{z{{{{{zz{{z{{{{{{{zz{zz{{{{z{{{{z{{zz{z{{{{= {{{zz{{{{{{{z{{{z{{z{{zzzzz{{z{{{z{{{z{{{{{z{{z{{{z{{{z{{{{{zz{{z{{{z{{zz= zzz{{{{{z{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{{{{z{{{z{{zzzzz{{{{{zzzzz{{{{{zz{{= zz{{{{z{{z{{z{{{z{{{{{z{{{z{{zzzzz{{z{{{z{{z{{{z{{zzzzz{{z{{{z{{{{{z{{{z{= {z{{{{{{{z{{{{{{z{{{z{{zz{{{{z{{{z{{{z{{z{{{z{{{z{{z{{{{zz{{zzzzz{{z{{{z{= {{{{z{{{z{{z{{{z{{{{{zzzzz{{z{{{z{{z{{{z{{{{{z{{{z{{zz{{{{zzzzz{{z{{{{zz{= {{{{{{{{{{zz{zz{{{zzzzz{{z{{{{z{{{z{{z{{{z{{zz{{{{zzzzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zz{{{z{{{z= {{z{{{z{{z{{{z{{z{{z{{{z{{{{{{zz{{{{zz{z{{{z{z{{{{{{z{{{z{{{z{{{zz{z{{z{{= {{{{{{z{z{{{{{z{{{{z{{{z{z{{{{{{{{zz{{{{{{{z{z{{{z{{z{{{{{{{z{{z{{z{{{{{{= z{{z{{{z{{{z{{{zz{z{{zz{{z{{z{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{{{{z= {{{z{{z{{{{{{{{{z{{{{{{{zz{z{{{zz{{{z{{z{{{z{z{{{{{{z{{{z{{z{{{{{{z{{{z{{= z{{{z{{z{{{{{{z{{{z{{{{{z{{{z{{z{{{{{{{z{{{{{{z{{{z{{{zz{{{z{{{z{{{z{{z{{= {z{{{z{{z{{{zz{{{z{{{{{{z{{{z{{{{{z{{{z{{{z{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{= {{z{{{z{{{zz{{{z{{{{{{z{{{{{zz{{{{{{{{{{{z{z{{{{z{{{{{{z{{{{z{{{z{{z{{{z{= {{zz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{zz{{z{{{z{{z{{{z{{z{{{z{{z{{z{{{z{{{{{{{zz{{z{{{z{{= {z{z{{{{{{z{{{z{{{z{{z{{{z{{z{{{{{{{{zzz{{{{{z{{{{z{{{z{z{{{{{{{{{zz{{{{{= {z{z{{{z{{z{{{{{{{zzz{zzz{{{{{{z{{z{{{z{{{z{{z{{{z{{{zzz{{{z{{{{{{{{{z{{{= {{{z{{{z{{z{{{z{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{{z{{{{{{z{{{z{{{{zz{{z{{z{{= {z{z{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{{{{z{{{z{{z{{{{{{{z{{= {{{{z{{{z{{{{zz{{z{{{z{{{z{{z{{{z{{{z{{z{{zz{{{{z{{{{{{z{{{z{{{{{z{{{z{{{= z{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{{{z{{{z{{{{zz{{z{{{{{{z{{{{{{zz{{{{{{{{{{z= zz{{{{z{{{{{{z{{{{z{{{z{{z{{{z{{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||= ~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{z{{z{{{z{{zz{zz{{zz{z= z{{z{{zz{zz{{{{{z{{z{{zz{{z{{{{z{{{{{{{z{{{z{{{z{{zz{{z{{z{{{{{{{{{z{{{{{= {z{{{{z{{{{zz{{{{{{{z{{z{{{{{{{z{{{{z{{zz{{{z{{{z{{{z{{{{{{{z{{z{{{z{{{z{= {zz{{z{{{z{{{{{zz{{{z{{{{zz{{{z{zz{zz{{zz{zz{{z{{zz{zz{{{{{z{{zz{{zz{{{z{= {{{zz{{{z{zz{{z{{z{{z{{z{{z{{{{z{{{{{{{zz{zz{{zz{{{z{z{{{z{{z{{{z{{zz{{{z= {zz{zz{{{{{zz{zz{{z{{{{{{{zz{{{z{zz{zz{{z{{z{{z{{{zz{zz{{z{{{z{{{z{{z{zz{= {{z{zz{{{z{zz{zz{{{{{z{{zz{{{{z{{{{{{{zz{{{z{z{{{z{{zz{zz{{{{{zz{zz{{z{{z= {{zz{{{z{z{{{{z{{z{{z{{{{{{{{z{{{{{zz{{{z{z{{{{z{{zz{{zz{zz{{z{{z{{zz{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z= zz{{{{{zzz{{zzz{zzz{{zzz{{{{zz{zzzzz{{zzz{z{{{{zzz{{{{zzz{z{{zz{{{{{{{{zz= zzz{zzz{{zzz{z{{zz{{{{{{{z{{{{{zzz{{zzz{{{{z{{{{{{{zzz{{{{{{{{z{{{zzz{{zz= zz{{{{z{{{z{{{{{{zzzzzz{zzz{zzz{{zzz{z{{zzzz{{{zzzz{{{{{{zzzz{{{zzz{{{{zz= {zzzzz{{zzz{z{{{{zzzz{{{{zzzz{{{{{{zzzz{{{zzz{z{zzz{{zzzzzz{{zz{{{{{{{{zz= z{z{{zzzz{zzzzzzzzzz{zzz{{zzzz{{{zzz{z{{{{{zzz{{zzz{{{{{{{zzzz{{{zz{zz{zz= z{{{{zz{{zzz{{zzz{zzz{zzzzzzzzzzzz{{zzzz{{{zzz{z{{{{zzzz{{{{zz{{{{{{{{zzz= z{zzz{zzz{{zzz{z{{{{{zz{zz{zzz{{{{zzzz{zzz{{{zzz{{{z{{{{{{{{z{{{{{{zzzz{z= zz{{{zzzz{{{{zzz{{{zzz{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zz{{z{zz{{{{{{{{{{{{{= {{{{{{zzzzzzzz{zzz{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zzz{{{{{{z= zz{zzzzzzzz{{{{{{zzz{zzzzzzzz{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{zz{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{= {{{{{{{{{{{{{{{{{z{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||}}}}}}}}}}}}}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{= {{{{{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{zz{zz{zz{{zz{{{{{{zz{{{{{{{{{{{{zz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{zz{{{{{{{{{{{{{{{{zz{{{{{zzz{{{zz{{{zz{{{{{zzz{{{zz{{{zz{{{{{zz{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{z{{z{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{z{z{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}= }|}}}}}}}}}}}}}}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{z{{zz{{= z{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{z{zz{{{zz{{zzzz{= {{z{zz{{{zz{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{= {{{{{{{z{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{zzz{{zzz{zzzzz{zz{{{z{{{zzz{{zz{zz{{{{zzz{{zzzzzz{{{zzz{{zz{zz{{{{{{z{= zz{{z{{zz{{{zzz{{{{{{{{{{{{zz{{{{{zz{zz{{zzz{{zzzz{{{{{zzz{{zzzz{{{{{{zzz= z{{{{{{zzz{zz{{zz{{{{zzz{{{zzzz{{zzzz{{zzzz{{{zzzzzz{{zzz{{{{{{zzz{zzz{zz= {{{{{{{{z{zz{{z{zz{{{zz{{{z{zz{{z{zz{{{zz{{{z{{{{{{zzzz{{zzzz{{zz{zzzzzz{= zz{{zz{{{zzzz{{zzzz{{{{zzz{zzz{zzzzz{{z{{z{{{{{z{zz{{{{zzz{{{{{{{zzzz{zz{= {zz{zzzz{{{zzzzzz{z{zzz{{zzz{zzzz{{{zzz{zzz{zzz{z{zz{{{{zzz{{zz{zz{{{{{{{= zzz{{{{{zz{{zz{{{zzz{{{zzz{{z{zzz{{{{z{zz{{{{zzz{{{{zzzz{{{zzz{{zz{zz{zzz= {{{{zzz{{{{{zzzz{{zzz{{zz{zz{zzz{{zz{{z{zz{{{zzz{{z{zzz{{{zzzz{{zzz{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{{z{{zz{zz{{z{{zz{{z{{zz{zz{{zz= {{z{{z{{{z{{zz{zz{{zz{zz{{{{{z{{z{{z{{z{{{z{{{z{{{{{{{{{{{zz{{{{{zzz{zz{{= zz{zz{{z{{{{{{zz{zz{{z{{{{{zz{{zz{{{{{{zzz{zzz{zz{{z{{zz{zz{{z{zz{{z{zz{{= zz{zz{{zz{{z{{zz{{{{{{zz{{zzz{zz{{{{{{{z{zz{{z{zz{{{zz{{{z{zz{{z{zz{{{zzz= zzz{{{{{{{zz{{zz{{zz{{zz{zz{zzz{zzz{zz{zz{{zz{{zz{{{{{{z{{{z{{{z{{z{{z{{z= {{{{{zz{zz{{z{{{z{{{{{zz{{z{{z{{{z{{z{{{{{{z{{{z{{zz{z{z{{z{{z{{{{{{z{{{z= {{{z{{zz{zz{{z{{{z{{zz{zz{{{{{zz{{z{{{{{z{{{z{{z{{z{{z{{{z{{zz{z{{{{zz{zz= {{z{{{z{{zz{{z{{zz{zz{{zz{zzz{zz{{z{{{z{{{{{z{{{zz{{z{{zz{zzz{zz{{z{{z{{z= {{z{{{z{{zz{z{{{{z{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zzzzz{{{zz= z{{{z{{{z{{z{{{{{zz{{z{{{z{{{{{zz{{z{{{z{{z{{{z{{z{{{z{{{{{z{{z{{zzz{{{{z= zzzz{{{{{{{{{{{zz{{{{{zz{{zz{{zz{zzz{{{{{{{{zz{zzz{{{{{{{{{{{zz{{{{{{zz{{= zz{{zz{zz{{zz{zzz{{{zzz{{{{{{{zz{zz{{zz{zz{{zz{{{{{{zz{{zz{{zz{{{{{{zz{zz= {z{{zz{{{zz{{zz{zz{z{{zz{{{zz{{z{{{{{{{{zz{{zz{{zz{{zz{{{{zz{{zz{{zz{{{{{= zz{{zz{{{{{{z{{{z{{{z{{z{{z{{z{{{{{z{{{z{{zzzzz{{{{{z{{{{{{z{{{z{{z{{{{{{= z{{{z{{z{{{{zz{{{{z{{{{{{z{{{z{{{z{{z{{{z{{zzzzz{{z{{{z{{{{{{{{zz{{{{{z{{= {z{{zz{{{{zzzzz{{z{{{{{{{z{{{z{{zzzzz{{z{{{{{{z{{{z{{z{{{z{{{z{{zzzzz{{{{= {z{{{{{{zz{{z{{{z{{{z{{z{{z{{z{{zzzzz{{z{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{z{{{{z{{{z{{z{{{zz{z{{z{{{z{{{zz{z{{z{{{z{{= z{{{z{{z{{{z{{{{{z{{z{{z{z{{{{z{{{{{{{{{{{{{{{zz{{{{{zz{{zz{{zz{{zzz{{{{{= {{zz{{zzz{{{{{{{zzzzz{{{{{{zz{{zz{{zz{zzzzzz{{zzz{{{zzz{{{zzzzz{zz{{zz{zz= zzzz{{{{{{zz{{zz{{zz{{{{{{z{{zzz{{zz{{{zz{{{z{{zzz{{zz{{{zzz{{{{{{{{{{{zz= {{zz{{zz{{zz{{{{zz{{zz{{zz{{zzzzz{{zz{{{{{{{z{{z{{z{{{z{{z{{z{{{{{z{{{z{{= z{{{{{{{{{z{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{{{zz{{{z{{{{{{{z{{z{{z{{{z{{{z{= {z{{{{{{z{{{z{{{{{{zz{z{{{{{z{{{z{{{zz{{{z{{{{{{z{{{{{{{z{{{z{{z{{{{{{z{{= {{{{z{{{z{{z{{{z{{{z{{z{{{{{{{{{z{{{{zz{z{{z{{{z{{{z{{z{{z{{z{{z{{{{{{z{{= {{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzz{{{z{{{z{{z= {{z{{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{{{z{{z{{z{{z{{{z{{{{{{{{{{{{= {{{zz{{{{{zz{{zz{{zz{{{zzz{{{{{{zz{{{zzz{{{{{zz{{zz{{{{{{zz{{zz{{zz{zz{{{= {{{{zzz{{{zzz{zz{{zz{{zzzz{{zz{{{{{{{{{{zz{{zz{{zz{{{{{{z{{zzz{{zz{{{zz{{= {z{{zzz{{zz{{{zz{{{{{{{{{{{{zz{{zz{{zz{{zz{{{{zz{{zz{{zz{zz{{zz{{zz{z{{{{= {zzz{zzz{{{z{{z{{z{{{{{z{{{z{{z{{{{{{{{{z{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{{= {{zz{{z{{{{{{{zzz{zzz{{{z{{{z{{z{{{{{{z{{{z{{{{{z{{{z{{{{{z{{{z{{{{zz{{z{= {{{{{z{{{{{{{z{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{{z{{= z{{{z{{{z{{z{{z{{z{{z{{{{{{z{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{zz{{{z{z{{{z{{zz{zz{{z{{zz{{z{{z{{{z{{zz{{z{{z{{{z{{zz{zz{{z{{{z= {{{{{z{{z{{z{{zz{{zz{{{z{{{{{{{{{{zz{{{{{zz{{zz{{zz{z{{zz{{{{{{zz{z{{zz{{= {{{zz{{zz{{{{{{zz{{zz{{zz{zzz{{z{z{{zz{z{{zz{zz{{zz{{z{{{{{zzz{{z{{{{{{zz= {{zz{{zz{{{{{zz{{zz{{{zz{{{zz{{zz{{zz{{{zz{{{zz{{{{zz{{{{{{zz{{zz{{zz{{zz= {{{{zz{{zz{{zz{zz{{zz{{zzz{{{{{{{z{{{z{{{{z{{z{{z{{{{{z{{zz{{zz{{{z{{{{zz= {{{z{zz{zz{{z{{{{{{z{{{z{{z{{{{z{{z{{z{{{{{{{{z{{{z{{{{z{{{z{{zz{{{z{z{{{= z{{{{{zz{{z{{{{{zz{zz{{z{{z{{zz{{{z{z{{{{{{{z{{zz{{zz{{{z{zz{{{z{zz{zz{{z= {{{z{{{z{{zz{{{z{{{{z{{{zz{{z{{z{{{z{{{z{{z{{z{{z{{zz{{{z{z{{{{{{{z{{{zz{= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{zzzz{zzz{zzz{z{zz{{zzz{{zzz{zzzz= {zzz{{zzz{z{{zzzzz{{zzz{{zzz{zzz{{{zzzzzzzzz{{zz{{zzzz{{{{{{{{{{zzzz{{{zz= z{{zzzzzzzzzzz{{{{{{zzzzzzzz{{{{{{{zzz{zz{{{{zzzz{zzz{zzz{zzzz{{zzzz{{zzz= z{{{zzz{zz{zzzzz{{zzzz{{{{{{zzzzzzz{{zzz{{{zzz{{zz{{zzzzzzzzzzzz{{zz{{zzz= z{zzzzzzzz{{{{{{zzzz{{zzzz{{zzzz{{zzzz{zzz{zzz{zzz{zz{{zz{{{{{{{z{{{z{{{z= zzzzzzzz{{{{zzzz{{{{zzzz{{{{{{zzzz{{{zz{zz{{zz{{{zzzzzzzzzz{{{zzz{{{{zz{{= {{{{z{{{z{{{zzz{zzz{{zzzz{zzz{zzz{{{{{zzz{z{{{{{zz{zz{zzz{{{{zzzz{zzz{{{{= {{zzzz{{{{zzzz{{{zzzz{{{zzz{{zzz{zzz{zzz{{zzzz{{{{zzzz{{zzz{zzzz{zzz{zzzz= zzzzzzzz{{zzzz{zzz{{{{{{{zz{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~= ~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{zzz{{zzz{{{{{zzz{{zzzzzzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zz{{{{z{{{{= zz{{{{{zz{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{{= {{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{z{zz{zz{z{{{{z{{{{z{zz{zz{z{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{z{z{{z{{{{z{{{{z{{z{z{{z{{{{z{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{z{z{{z= {{{{z{{{{z{{z{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{{z{{{{z{{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{{z{{{{z{{{z{= {{z{{{{z{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{zzz{{z{{zzz{{zzz{{zzz{{z{{zzz{{zzzzzzz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01= =01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=00=01=01||~}}||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}|||||||||||||||||||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01= =01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~~~~~~= ~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=F6=C0=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~||||||||||||||||= ||||~~}}{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =01=01=01=01||~|||||||||||||||||||}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01=01= ||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=01=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~||~~~~~~= ~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=00=01=01||~||~~~~~}}}}}}~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~||~~~~~}}}}}|~~~~~}= }~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0= \=01=01||~||~~~~~}}||||~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~||~~~~~}|||||~~~~~}}~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~|= |~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F6=C0=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~||~~~~~~~~~~= ~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=01=01=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~||}}}}}}}}}}}}}}}}}}~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=B5=01= =01||~|}}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||~}}=01=01=E8=04=01=01||~~~~~~= ~~~~~~~~~~~~~~~~~}|||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||~}}=01=01=00=00=01=01||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01=01||}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01= =E0\=01=01|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}=01=01=FF=FF=01=01zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=01=01=F4=88=01=01{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{=01=01=F6=C0=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=A4=1C=01=01{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {=01=01=01=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=8C=AC=01=01{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=01=B5= =01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{=01=01=00=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=E8=04=01=01{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{=01=01=00=00=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=FF=FF=01=01{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01= =01=E0\=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=FF=FF=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=F4=88=01=01= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{=01=01=F6=C0=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=A4=1C=01=01{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{=01=01=01=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=8C=AC=01=01{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=01= =B5=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{=01=01=00=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=E8=04=01=01{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{=01=01=00=00=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=FF=FF=01=01{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= =01=01=E0\=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=FF=FF=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=F4=88= --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable And this is what the older message you sent me a picture of looks like, when r= ead with Andrew: --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: image/x-xwd Content-Description: The way that message looked to ME Content-Transfer-Encoding: quoted-printable =00=00=00k=00=00=00=07=00=00=00=02=00=00=00=08=00=00=02=A2=00=00=03=82=00= =00=00=00=00=00=00=01=00=00=00 =00=00=00=01=00=00=00 =00=00=00=08=00=00=02= =A4=00=00=00=03=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=08=00=00=01=00= =00=00=01=00=00=00=02=9E=00=00=03~=00=00=01=DE=00=00=00=00=00=00=00=02xwd= ump=00=00=00=00=00=FF=FF=FF=FF=FF=FF=07=00=00=00=00=01=00=00=00=00=00=00=07= =00=00=00=00=02=FF=FF=FF=FF=E0=E0=07=00=00=00=00=03=00=00=00=00=FF=FF=07=00= =00=00=00=04=92=92=92=92UU=07=00=00=00=00=05=B6=B6=92=92=AA=AA=07=00=00=00= =00=06=B6=B6=B6=B6=AA=AA=07=00=00=00=00=07=B6=B6=90=90UU=07=00=00=00=00=08= =92=92=92=92=AA=AA=07=00=00=00=00 =DB=DB=B5=B5=AA=AA=07=00=00=00=00 =B6=B6kkUU=07=00=00=00=00=0B=DB=DB=DB=DB=AA=AA=07=00=00=00=00=0C=B6=B6=B6= =B6UU=07=00=00=00=00=0D=92=92llUU=07=00=00=00=00=0EmmmmUU=07=00=00=00=00=0F= =B6=B6=DB=DB=AA=AA=07=00=00=00=00=10=DA=DA=DA=DA=FE=FE=07=00=00=00=00=11=FE= =FE=D9=D9=A9=A9=07=00=00=00=00=12=FE=FE=DA=DA=FE=FE=07=00=00=00=00=13=FE=FE= =FE=FE=FE=FE=07=00=00=00=00=14=DB=DB=B5=B5UU=07=00=00=00=00=15=92=92kk=00= =00=07=00=00=00=00=16mmHH=00=00=07=00=00=00=00=17mmIITT=07=00=00=00=00=18= IIII=00=00=07=00=00=00=00=19HH$$UU=07=00=00=00=00=1AII##=00=00=07=00=00=00= =00=1Bmm""=00=00=07=00=00=00=00=1C=92=92IIUU=07=00=00=00=00=1D=B5=B5=DA=DA= =FE=FE=07=00=00=00=00=1EIIIIUU=07=00=00=00=00=1F=D9=D9=B5=B5=FE=FE=07=00=00= =00=00 =92=92=B6=B6=AA=AA=07=00=00=00=00!llll=AA=AA=07=00=00=00=00"=91=91= ll=AA=AA=07=00=00=00=00#ll=92=92=AA=AA=07=00=00=00=00$=B5=B5=B5=B5=FE=FE=07= =00=00=00=00%=DA=DA=FE=FE=FE=FE=07=00=00=00=00&=B5=B5=FE=FE=FE=FE=07=00=00= =00=00'=91=91=B5=B5=FE=FE=07=00=00=00=00(mmmm=00=00=07=00=00=00=00)$$$$=00= =00=07=00=00=00=00*mm$$UU=07=00=00=00=00+mm=92=92UU=07=00=00=00=00,=DB=DB= =92=92=AA=AA=07=00=00=00=00-IImmUU=07=00=00=00=00.=FE=FE=FE=FE=A9=A9=07=00= =00=00=00/=FE=FE=B4=B4=A9=A9=07=00=00=00=000=92=92II=00=00=07=00=00=00=00= 1$$II=00=00=07=00=00=00=002$$IIUU=07=00=00=00=003=DB=DB=91=91UU=07=00=00=00= =004=DA=DA=FE=FE=A9=A9=07=00=00=00=005=92=92=DB=DB=A9=A9=07=00=00=00=006=B6= =B6mm=AB=AB=07=00=00=00=007=92=92=92=92=00=00=07=00=00=00=008II=00=00=00=00= =07=00=00=00=009$$=00=00=00=00=07=00=00=00=00:IIII=AA=AA=07=00=00=00=00;=91= =91II=AA=AA=07=00=00=00=00<$$$$UU=07=00=00=00=00=3Dmm=92=92=00=00=07=00=00= =00=00>IInn=AA=AA=07=00=00=00=00?JJmm=00=00=07=00=00=00=00@=92=92=B6=B6UU= =07=00=00=00=00A=B6=B6jj=00=00=07=00=00=00=00B=FE=FE=B4=B4TT=07=00=00=00=00= C=B6=B6=91=91=00=00=07=00=00=00=00D=B3=B3=91=91=FE=FE=07=00=00=00=00E=D9=D9= =91=91=FE=FE=07=00=00=00=00FllII=AA=AA=07=00=00=00=00G=FE=FE=B5=B5=FE=FE=07= =00=00=00=00H=DB=DB=DB=DBUU=07=00=00=00=00I=91=91=DB=DB=FE=FE=07=00=00=00= =00J##=00=00UU=07=00=00=00=00K=DB=DBkkUU=07=00=00=00=00L=92=92""=00=00=07= =00=00=00=00M=FE=FE=D9=D9TT=07=00=00=00=00N=DB=DB=B2=B2=00=00=07=00=00=00= =00O=91=91=91=91=FE=FE=07=00=00=00=00P=B6=B6=B6=B6=00=00=07=00=00=00=00QH= H=00=00UU=07=00=00=00=00R=DB=DB=92=92=00=00=07=00=00=00=00S=DB=DBii=00=00= =07=00=00=00=00T=FE=FE=91=91=AA=AA=07=00=00=00=00U=B6=B6IIUU=07=00=00=00=00= V=FE=FE=D7=D7=00=00=07=00=00=00=00W=B6=B6HH=00=00=07=00=00=00=00X=00=00$$= =00=00=07=00=00=00=00Y=B7=B7=DB=DBUU=07=00=00=00=00Zmm=00=00=00=00=07=00=00= =00=00[=00=00$$UU=07=00=00=00=00\=00=00=00=00UU=07=00=00=00=00]=92=92##UU= =07=00=00=00=00^=FE=FE=91=91=FE=FE=07=00=00=00=00_mm=B6=B6=A9=A9=07=00=00= =00=00`=DB=DBmm=AB=AB=07=00=00=00=00a=B6=B6II=AB=AB=07=00=00=00=00b=94=94= =B6=B6=00=00=07=00=00=00=00c=00=00II=00=00=07=00=00=00=00d=FE=FE=8F=8FTT=07= =00=00=00=00eII=92=92=00=00=07=00=00=00=00f=B6=B6=DB=DB=00=00=07=00=00=00= =00g=FE=FEll=AB=AB=07=00=00=00=00hII=92=92SS=07=00=00=00=00i=B6=B6!!=00=00= =07=00=00=00=00j=92=92=00=00=00=00=07=00=00=00=00k=DB=DBIIUU=07=00=00=00=00= l=B6=B6=FE=FE=A9=A9=07=00=00=00=00m=DB=DBHH=00=00=07=00=00=00=00n=FE=FE=8F= =8F=00=00=07=00=00=00=00o=00=00=FF=FF=00=00=07=00=00=00=00p=A8=A8=A8=A8=A8= =A8=07=00=00=00=00q=FF=FF=00=00=00=00=07=00=00=00=00r=D3=D3=D3=D3=D3=D3=07= =00=00=00=00s=00=00=E6=E6=19=19=07=00=00=00=00t=00=00=7F=7F=7F=7F=07=00=00= =00=00u=00=00=BF=BF??=07=00=00=00=00v``````=07=00=00=00=00w=FF=FF=C0=C0=CB= =CB=07=00=00=00=00x=E6=E6=AD=AD=D1=D1=07=00=00=00=00y=7F=7F``=E5=E5=07=00= =00=00=00z=00=00=00=00=80=80=07=00=00=00=00{=F5=F5=DE=DE=B3=B3=07=00=00=00= =00|=DD=DD=C8=C8=AE=AE=07=00=00=00=00}zzoo=9A=9A=07=00=00=00=00~=B8=B8=A7= =A7=A6=A6=07=00=00=00=00=7F=98=98=FB=FB=98=98=07=00=00=00=00=80=00=00=B9=B9= =00=00=07=00=00=00=00=81=89=89=E2=E2=A2=A2=07=00=00=00=00=82LL}}=C8=C8=07= =00=00=00=00=83rr=BC=BC=B0=B0=07=00=00=00=00=84LL}}LL=07=00=00=00=00=85=89= =89=E2=E2=89=89=07=00=00=00=00=86rr=BC=BCrr=07=00=00=00=00=87=89=89=E2=E2= =98=98=07=00=00=00=00=88rr=BC=BC=98=98=07=00=00=00=00=89=89=89=E2=E2=96=96= =07=00=00=00=00=8ALL}}=8B=8B=07=00=00=00=00=8Brr=BC=BC=92=92=07=00=00=00=00= =8C=00=00=00=00=F7=F7=07=00=00=00=00=8D=BF=BF=BF=BF=BF=BF=07=00=00=00=00=8E= =BF=BF=90=90=D8=D8=07=00=00=00=00=8F??????=07=00=00=00=00=90=7F=7F=7F=7F=7F= =7F=07=00=00=00=00=91rr=BC=BC=81=81=07=00=00=00=00=92LL}}=CC=CC=07=00=00=00= =00=93rr=BC=BC=B2=B2=07=00=00=00=00=94=F7=F7=E8=E8=00=00=07=00=00=00=00=95= =89=89=E2=E2=99=99=07=00=00=00=00=96LL}}=9C=9C=07=00=00=00=00=97rr=BC=BC=9A= =9A=07=00=00=00=00=98LL}}=8C=8C=07=00=00=00=00=99=00=00=00=00=81=81=07=00= =00=00=00=9A=F7=F7=EB=EB=00=00=07=00=00=00=00=9B=89=89=E2=E2=8B=8B=07=00=00= =00=00=9CLL}}WW=07=00=00=00=00=9Drr=BC=BCww=07=00=00=00=00=9Err=BC=BC=B1=B1= =07=00=00=00=00=9FLL}}XX=07=00=00=00=00=A0rr=BC=BCxx=07=00=00=00=00=A1=DC= =DC=FE=FE=00=00=07=00=00=00=00=A2=DB=DB=DB=DB=00=00=07=00=00=00=00=A3=DC=DC= =FE=FETT=07=00=00=00=00=A4=FE=FEHHTT=07=00=00=00=00=A5=FE=FE##VV=07=00=00= =00=00=A6=DB=DB$$WW=07=00=00=00=00=A7=B6=B6=00=00WW=07=00=00=00=00=A8=92=92= =00=00UU=07=00=00=00=00=A9=FE=FEGG=00=00=07=00=00=00=00=AA=FE=FE!!=00=00=07= =00=00=00=00=AB=DB=DB =00=00=07=00=00=00=00=AC=B6=B6=00=00=00=00=07=00=00= =00=00=AD=DB=DB=00=00=00=00=07=00=00=00=00=AE=DB=DBII=AA=AA=07=00=00=00=00= =AF=FE=FEkkTT=07=00=00=00=00=B0=B6=B6$$WW=07=00=00=00=00=B1=FE=FEii=00=00= =07=00=00=00=00=B2mm=00=00UU=07=00=00=00=00=B3=FE=FE##=AA=AA=07=00=00=00=00= =B4=FE=FEHH=A9=A9=07=00=00=00=00=B5$$mm=00=00=07=00=00=00=00=B6$$mmTT=07=00= =00=00=00=B7=00=00IIUU=07=00=00=00=00=B8=DB=DB=00=00WW=07=00=00=00=00=B9=00= =00=00=00=00=00=07=00=00=00=00=BA=00=00=00=00=00=00=07=00=00=00=00=BB=00=00= =00=00=00=00=07=00=00=00=00=BC=00=00=00=00=00=00=07=00=00=00=00=BD=00=00=00= =00=00=00=07=00=00=00=00=BE=00=00=00=00=00=00=07=00=00=00=00=BF=00=00=00=00= =00=00=07=00=00=00=00=C0=00=00=00=00=00=00=07=00=00=00=00=C1=00=00=00=00=00= =00=07=00=00=00=00=C2=00=00=00=00=00=00=07=00=00=00=00=C3=00=00=00=00=00=00= =07=00=00=00=00=C4=00=00=00=00=00=00=07=00=00=00=00=C5=00=00=00=00=00=00=07= =00=00=00=00=C6=00=00=00=00=00=00=07=00=00=00=00=C7=00=00=00=00=00=00=07=00= =00=00=00=C8=00=00=00=00=00=00=07=00=00=00=00=C9=00=00=00=00=00=00=07=00=00= =00=00=CA=00=00=00=00=00=00=07=00=00=00=00=CB=00=00=00=00=00=00=07=00=00=00= =00=CC=00=00=00=00=00=00=07=00=00=00=00=CD=00=00=00=00=00=00=07=00=00=00=00= =CE=00=00=00=00=00=00=07=00=00=00=00=CF=00=00=00=00=00=00=07=00=00=00=00=D0= =00=00=00=00=00=00=07=00=00=00=00=D1=00=00=00=00=00=00=07=00=00=00=00=D2=00= =00=00=00=00=00=07=00=00=00=00=D3=00=00=00=00=00=00=07=00=00=00=00=D4=00=00= =00=00=00=00=07=00=00=00=00=D5=00=00=00=00=00=00=07=00=00=00=00=D6=00=00=00= =00=00=00=07=00=00=00=00=D7=00=00=00=00=00=00=07=00=00=00=00=D8=00=00=00=00= =00=00=07=00=00=00=00=D9=00=00=00=00=00=00=07=00=00=00=00=DA=00=00=00=00=00= =00=07=00=00=00=00=DB=00=00=00=00=00=00=07=00=00=00=00=DC=00=00=00=00=00=00= =07=00=00=00=00=DD=00=00=00=00=00=00=07=00=00=00=00=DE=00=00=00=00=00=00=07= =00=00=00=00=DF=00=00=00=00=00=00=07=00=00=00=00=E0=00=00=00=00=00=00=07=00= =00=00=00=E1=00=00=00=00=00=00=07=00=00=00=00=E2=00=00=00=00=00=00=07=00=00= =00=00=E3=00=00=00=00=00=00=07=00=00=00=00=E4=00=00=00=00=00=00=07=00=00=00= =00=E5=00=00=00=00=00=00=07=00=00=00=00=E6=00=00=00=00=00=00=07=00=00=00=00= =E7=00=00=00=00=00=00=07=00=00=00=00=E8=00=00=00=00=00=00=07=00=00=00=00=E9= =00=00=00=00=00=00=07=00=00=00=00=EA=00=00=00=00=00=00=07=00=00=00=00=EB=00= =00=00=00=00=00=07=00=00=00=00=EC=00=00=00=00=00=00=07=00=00=00=00=ED=00=00= =00=00=00=00=07=00=00=00=00=EE=00=00=00=00=00=00=07=00=00=00=00=EF=00=00=00= =00=00=00=07=00=00=00=00=F0=00=00=00=00=00=00=07=00=00=00=00=F1=00=00=00=00= =00=00=07=00=00=00=00=F2=00=00=00=00=00=00=07=00=00=00=00=F3=00=00=00=00=00= =00=07=00=00=00=00=F4=00=00=00=00=00=00=07=00=00=00=00=F5=00=00=00=00=00=00= =07=00=00=00=00=F6=00=00=00=00=00=00=07=00=00=00=00=F7=00=00=00=00=00=00=07= =00=00=00=00=F8=00=00=00=00=00=00=07=00=00=00=00=F9=00=00=00=00=00=00=07=00= =00=00=00=FA=00=00=00=00=00=00=07=00=00=00=00=FB=00=00=00=00=00=00=07=00=00= =00=00=FC=00=00=00=00=00=00=07=00=00=00=00=FD=00=00=00=00=00=00=07=00=00=00= =00=FE=00=00=00=00=00=00=07=00=00=00=00=FF=00=00=00=00=00=00=07=00=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=8C=AC=01= =01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01=00=0D= =01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01=00= =01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01= =E8=04=01=01=00=00=00=01=01=01=01=01=01=01=01=01=01=01=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=00=00=00=00=00=00=00=00=01=01=01=01=01=01=01=01=01=01=01=00=00=00=01= =01=00=00=01=01=00=00=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=01=01=01=01=01=00=00=00=01=00=00=00=00=00=00=00=00=00=00= =01=01=01=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=01=01= =01=01=00=00=00=00=00=00=00=00=01=01=00=00=00=00=00=00=00=01=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=00=01=00=00=00= =01=01=FF=FF=01=01=00=00=00=01=00=01=01=00=00=00=00=01=00=01=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=01=00=00=01=00=01=00=00=00=00=00=00=00=00= =01=00=00=00=01=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=00= =00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=00=01=00=00= =00=01=01=E0\=01=01=00=00=00=01=00=00=01=01=00=00=01=00=00=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=01=00=00=01=00=00=00=01=00=00=00=00=00=00= =00=01=00=00=00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01= =00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=00=01=00= =00=00=01=01=00=0D=01=01=00=00=00=01=00=00=00=01=01=00=01=00=00=01=00=00=00= =00=00=00=00=00=01=01=00=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01= =01=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01=01= =01=00=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=00=00= =00=00=01=00=00=00=00=00=01=00=01=01=00=00=00=01=01=01=00=00=01=00=01=01=00= =00=00=01=01=01=00=00=00=01=01=01=00=00=00=01=01=01=01=00=00=00=00=00=00=00= =01=00=00=00=00=00=00=01=01=01=00=00=00=00=01=00=00=00=00=01=01=01=01=00=00= =01=01=01=00=00=01=00=01=01=00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=01=01=01=01=00=00=01=00=00=01= =00=00=00=01=01=F4=88=01=01=00=00=00=01=00=00=00=01=00=00=00=00=00=01=00=00= =00=00=00=00=00=00=01=00=01=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01= =00=00=00=01=00=00=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00= =00=00=01=00=00=00=00=00=00=00=00=01=01=01=00=00=01=00=00=00=01=00=00=00=00= =00=00=00=01=00=00=00=00=00=01=01=00=00=01=00=00=00=00=00=01=00=01=01=00=00= =01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=00=00=00=00= =00=01=01=01=01=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00= =01=00=00=00=01=00=01=01=00=00=01=00=01=00=00=00=01=00=00=00=00=00=00=00=00= =00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=01=00=00= =01=00=00=00=01=01=F6=C0=01=01=00=00=00=01=00=00=01=00=01=01=00=00=00=01=00= =00=00=00=00=00=00=00=01=00=01=00=01=00=01=01=01=01=01=00=00=01=01=00=00=00= =00=01=01=00=00=00=00=01=01=01=01=00=01=00=00=00=01=00=01=01=01=01=01=00=00= =01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00=00=00=01=00=00=00= =00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=00=01=01=01=01=00=01=00=00= =00=01=00=01=00=00=00=01=00=01=01=01=01=01=00=01=00=00=00=01=00=00=00=00=00= =00=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01= =00=01=01=01=01=01=00=01=00=00=00=00=00=00=01=01=00=00=00=00=00=00=00=00=00= =00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=01=00= =00=01=00=00=00=01=01=A4=1C=01=01=00=00=00=01=00=00=01=00=00=01=01=00=00=01= =00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=00= =00=00=00=00=01=00=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=00=00= =00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00=00=00=01=00=00= =00=00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00= =00=00=01=00=01=00=00=00=01=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=00= =00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00= =01=00=01=00=00=00=00=00=01=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00= =00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=01=01=01=01=01=01=01= =00=00=01=00=00=00=01=01=01=01=01=01=00=00=00=01=00=01=00=00=00=00=01=01=00= =01=00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=00=00=01=00=01=00=00=00= =01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=01=01=01=01=00=01=00=00=00=01= =00=01=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=01=00=00= =00=00=00=00=00=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01= =00=00=00=01=00=00=01=01=01=01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=00= =00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00= =00=01=00=01=00=00=00=01=00=01=00=00=00=00=00=01=00=00=00=01=00=00=00=00=00= =00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00= =00=00=00=01=00=00=00=01=01=8C=AC=01=01=00=00=00=01=00=00=00=00=00=00=00=00= =00=01=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=01=01=00=00=00=01=01= =01=00=00=00=01=01=01=00=00=00=01=01=01=01=00=00=00=00=00=01=00=00=01=01=01= =00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=00=01=00=00= =00=00=00=00=00=00=00=00=01=01=01=00=00=01=00=00=00=01=00=00=01=01=01=01=00= =01=00=00=00=01=00=00=00=00=00=01=00=00=01=01=01=00=00=00=01=01=01=01=00=00= =00=00=00=00=00=01=00=00=00=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01= =01=01=01=00=00=01=01=01=00=00=01=00=00=00=00=00=00=01=01=01=00=00=00=00=00= =00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=00=00= =00=00=00=00=01=00=00=00=01=01=00=0D=01=01=00=00=00=01=01=01=01=01=01=01=01= =01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=01=00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=01=01=01=01= =01=01=01=01=01=01=00=00=00=01=01=00=01=01=01=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=01=01=E8=04=01=01=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=01=01=00=00=01=01=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=01=01=FF=FF=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=E0\=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=00=0D=01=01|||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||z|||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= =01=01=F4=88=01=01|||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||}z|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||}=01=01=F6=C0=01=01||~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=A4=1C= =01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}z||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}|~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC=01=01||~~~= ~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~}}=01=01=00=0D=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~~~~~~~~~~~~~~= ~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01=E8=04=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}}}}}}}}}}}}}}}}}}}~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01= =01||~}}}}}}}}}}}}}}}}}}}|~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=0D=01=01||~}}~~~~~= ~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{z{zzzz{{{{zzzz{{{{{{{{{z= z{zzz{{{{{{{{{{{{{zz{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= z{{{{{{zzz{{{zzzz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=A4= =1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{z{{{{{{{{= {{{{{zz{{zzz{{{{zzz{{{{{{{{{{zz{{zz{{{{{{{{{{{zzzz{{{{z{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zz{z{{{{{zzzzz{zz{{zz{{zz{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{z{{{zzz{{{{zzz{{{{{{{{{{{{{{zz{{{{{{{= {{{{{{zz{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{zz{= zz{{zz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{{{zz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{zzzzz{{{zzz{{zzz{zz{{zz{{{zzzz{{{{{{zz{zzzzzzz{{{zzz{{{{{{{zz{{{z{= zz{{z{zz{{{zzzz{{zzz{{zz{{{{zz{{{{{{{zz{{{zz{{zz{{{{{zzz{zz{{{{zzz{zzz{zz= z{zz{{{{{zzzz{{zzzz{{{{{{{{{zz{zz{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zz{{{z{{z= {{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{z{{zz{{zzz{zzz{zz{zz{{zz{{{{= {{zz{zz{zz{{{z{{zz{{{{{{zz{{{z{zz{{z{zz{{zz{{zz{{zz{{zz{{{{zz{{{{{{{zz{{{= zz{{zz{{{{{{zzz{zz{{z{{zz{zz{{z{{z{{{{{zz{{zz{{zz{{{{{{{{zzz{{zz{{zz{{{zz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{zzz{{{{{z{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z= z{zz{{zz{{zz{{zz{{zz{zz{{zz{{{{{{zz{{{{zz{{zz{{zz{{{{{{zz{{{z{zz{z{{zz{{{= {{{zz{{zz{{zz{{{{{{{{{{{{{zz{{{zz{{zz{{{{{{zz{{zz{zz{{zz{zzz{zz{z{{{{{zz{= {zz{{zz{{{{{{{{{zzz{{zzzzz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}= =01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzzz{{{z{{zzzzz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{zzzzzz{{zz{{zz{{zz{zz{{zz{{{{{{zz{{{{zz{= {zz{{{{{{{{{{zz{{{z{{zzz{{zz{{{zzzzz{{zz{{zz{{{{{{{{{{{{{zz{{{zz{{zz{{{{{= {zz{{zz{zzzzzz{{zz{zzz{{{{{{zz{{zz{{zz{{{{{{{{{{zz{{{{zz{{{{zz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{zzz{{{z{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{zz{{{{{{z= z{{zz{{zz{zz{{zz{{{{{{zz{{{{zz{{zz{{{{{{{{{{zz{{{z{{zzz{{zz{{zz{{zz{{zz{{= zz{{{{{{{{{{{{{zz{{{zz{{zz{{{{{{zz{{zz{zz{{{{{{zzz{zz{{{{{{zz{{zz{{zz{{{{= {{zz{{{z{{{zz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zz{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zz{{zz{zzz{{z{{zz{{zz{{zz{zz{{zz{{zz{{zz{{{{zz{{zzz{{z{{{{{= {zz{{{z{{{z{{{zz{{zz{{zz{{zz{{zz{{{{zz{{{{{{{zz{{{{z{{z{{{{{{{zz{{zz{zzz{= {z{{zzz{zz{{{{{{zz{{zz{{zz{{{{{{zzz{zz{{zzz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{= {{{z{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{zz{zzzz{{zzzz{zzz{zzz{zzz= z{{{zz{zzzz{{zzzz{{zzzz{{{{{{{zz{{zzz{{z{{zzzz{{zzz{zzzzzzzzzz{{{zz{{{{{z= zzzzz{{zzzz{{{{{{zzz{{zzz{zzzz{{{{z{{z{{{{{{{{zzzz{{zzzz{{{{{{zzzz{{zz{{{= {{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=0D=01=01||~}}~~= ~~~~~~~~~~~~~~||~~}}{{{{{{{{z{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{zzzzzzzzzzzzzz= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01= =A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= }}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz= zzzz{~~~~~~~~~~~~~~~~~~~~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF= =FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zz{{zzz{~~~~~~~~~~~~~~~~~z{~~zz{~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~{zz{~~~~~~~= ~~~~~~~~~zz{~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=0D=01=01||~}= }~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~zz{~~zzzzz{zzz{zzz{zz{~zzzz{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~~zz{zz{{zz{{zzz{zz{{zz= {{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~zzzzzz{{zz{~zz{~zz{{zz{~zz{~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{{{{{~zz{~zz{~zz{~zz{~zz{~~zz{~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~~~~= ~zz{~zz{~zz{~zz{~zz{z{{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~zz{~~~~~zz{~zz{~zz{~zz{~zzz{{zz{~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzzz{~~~~{zzz{zzzzz{= ~zzz{{zz{~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~{{{{{~~~~~{{{{{{{{{{~{{{{~{{{~{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01= =FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=0D=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}~~~~~~~= ~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}= }=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|= |~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C=AC= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01=FF=FF=01=01||~}}||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~}}|||||||||||||||}||~~}}{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=0D=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~}}=01=01=F4=88=01=01||~}}||}}}vvvvvv}}}}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~}}|}}}}v= vvvv|}}}}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= }}=01=01=A4=1C=01=01||~}}~~~~~vv||||~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||~}}~~~~~v|||||~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=8C= =AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=01=01=01||= ~}}||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01=E8=04=01=01||~}|||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=01=01||~~~~~~~~~~~= ~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}= =01=01=FF=FF=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=E0\=01=01||~~~~~~~~~~~~~~~~~~~~~~~}= }{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=0D=01= =01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~}}=01=01=F4=88=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F6=C0=01=01||~~~~~~= ~~~~~~~~~~~~~~~~~}|||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||~}}z||~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~}}=01=01=A4=1C=01=01||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=01=01=01=01||}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}z||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01= =8C=AC=01=01|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}z|}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}=01=01=00=0D=01=01zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=01=01=00=01=01=01= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||=01=01=E8=04=01=01||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||}=01=01=00=00=01=01||~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= }}=01=01=FF=FF=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}=01=01=E0\=01=01||~~~~~~~~~~~~~~~~~~~~~~= ~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|~}}=01=01=00=0D= =01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~~~= ~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=A4=1C=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}}}}}}}}}}}}= }}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=8C=AC=01=01||~}}}}}}}}}}}}}}}}}}}|~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{zz{{{{{{= {{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{zz{{{{{zz{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{zzzzzz{{{{{{{{{zz{{{{{{{{{{zzz{zzz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{zz{{{{{zz{{{{{zzzzz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{zzzz{{{{{zz{zzz= zzz{{{zzz{{{zzzz{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{zz{zz{{{{{zz{{{{{{{{{{{{{z{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z= z{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{z{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z= z{{{{{{{{{z{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= z{{{{{{{{z{{{{{{z{{{zz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{zzz{{{{{zz{{z{{{{z{{zz{zz{zz{{zz{{z{z{z{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{z{{{z{{{{z{{{{{{{{{{{{{{{z{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= z{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{z{{zz{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{z{{{{{{{{z{{{z{{{z{z{= {{{z{{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{= {{z{{{z{{{{{{{{{{{{{{{{z{{{{{z{{{zzz{{{{zzzz{{{{{{{{{{z{{{{z{{{{z{{{{{{{{= {{{{zzz{{{zz{{{zz{{z{{{z{{{zz{z{{zz{zz{{{{{{{zzzz{{{{z{zz{{{zz{{{{zzz{{zz= {{{zzz{{zzzz{{{{zzzz{{z{zz{{zz{{{zzz{{{{{{{{{{{{{{{{{{z{{{zz{{{zzz{{{z{zz= {{{{{{{{z{z{{{{zz{{zz{zz{zz{zzz{{zz{zz{zzz{{{{zzz{{z{zzzzzzz{{zzz{{{z{{{z= zzz{{z{{{zz{z{{z{{{zzzz{{{zzz{{{{{{zzz{zz{{zz{{{{{{zzz{{zzzzzz{{{{{{{{z{{= {zzz{{{{z{{{{{{{{{z{{{zz{{z{z{{{{z{{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{zz{{{zzzz{{{{{{{{{{{{{z{{{{{z{{z{{{z{{zz{= {z{{{{{{{{{{zz{{zz{{{{z{{{{{{{{{{zz{{z{zz{zz{{{z{{z{{z{{{z{{zz{{{zz{z{{{{= {{{{z{{{{{{{z{{{zz{{z{{z{{z{{{z{{z{{z{{{z{{{{{{{z{{{{zz{z{{{z{{z{{z{{{{{{= {{{{{{{{{{{{zzzzz{{{zz{zz{{zz{zz{{{{{{{zz{{{{{{z{{{z{{zz{zzz{zz{{zz{zzz{z= z{{z{{{z{{zz{z{z{{{z{{{z{{z{{zz{{z{z{{{z{{z{{{z{{zz{{z{{z{{z{{{{{z{{z{{z{= {{z{{{{{zz{zz{z{{{z{{{{{{{{z{{{{z{zz{{{zzzz{{{{{z{{{{{zzz{{z{{{{z{{z{z{z{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{z{{{zz{{zz= {{{{{{{{{{{{z{{{{{z{{zzzzz{{z{{{{{{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{z{{{{{z{{= {z{{z{{z{{{z{{z{{{z{{{zz{{z{{{{{{{z{{{{{{{z{{{{z{{zz{{z{{{{{z{{{z{{{{{z{{= {{{{{z{{{{zz{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{z{{{zz{{z{{{z{{z{{{z{{{{{{{z{z= {{{{{z{{{z{{z{{{z{{{z{{z{{{z{{{z{{zzzzz{{z{{{{z{{{zzzzz{{z{{z{{{z{z{{z{{{= z{{{z{{z{{{{{{zz{{{{{{{zz{{{{z{{{z{{{{{z{{{z{{{{zz{{{{{{{{z{{{{{{{zz{zz{{= zz{{{{z{{{{z{{zz{z{{{{z{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{z= {{{{zz{{{{{{{{{{{{{{z{{{{z{{{{z{{zzzzzzz{{{z{{{{{z{{z{{{{{{z{{{{{{zzzzzzz= {{{{{z{{{{{z{{{{{{{{{z{{{{{z{{{{z{{z{{z{{{z{{z{{{z{{{z{{z{{{{{{{{z{{{{{{{= z{{{zzzz{{{{{z{{{{z{{{{z{{{{z{{{{{{{z{{{{z{{z{{{z{{{{z{{{{{{{zzzzzzz{{{{{= {z{{{{z{{z{{{z{{z{{{z{{{{{{{z{{z{{{{z{{{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{{{{z= {{{{z{{{z{{{{{{z{{z{{{z{z{{z{{{z{{{z{{z{{{{{{{zz{{{{{{{zz{{{z{{{z{{{{{z{{= {z{{{zz{{{{{{{{{z{{{{{{{{z{z{{{{z{{{z{{{{{z{{{z{z{{{{z{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{zzz{{zz{{{{{{{{{{{{{{z{{{{{z{{{{z{{{{{{{{{{{= {z{{{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{z{{{{{z{{{z{{z{{z{{{z= {{{z{{z{{{{z{{z{{{{{{{z{{{{{{{z{{{{z{{{{{{{{{z{{z{{{{{{z{{z{{{{{{{z{{{{{z= {{z{{z{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{z{{z{{{z{{z{{{z{{{{{{{z{{{z{{{z{{{z{= {z{{{z{{{z{{z{{{z{{{z{{z{{{{{{z{{{{z{{{z{{{{{{z{{z{{{z{z{{z{{zz{{z{{{z{{{= {{{{{zz{{{{{{{zz{{z{{{z{{{{{z{{{z{{zz{{{{{{{{{{z{{{{{{{{z{z{{{{z{{{z{{{{{= z{{{z{z{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{zzzzz{{{{{{{= {{{{{{{zz{{{z{zz{{zz{{{{{{{{{{{{z{{{zz{{{zz{{{z{zz{{{z{{{{{{{{{{zz{{{{{{{= z{{{{{{{{{zz{{z{zz{zz{{z{zz{z{z{z{z{zz{z{z{{z{z{{{{{{z{z{{{{{z{{{{zz{{z{{= z{{z{{z{z{z{{z{{z{z{{{{{z{z{{z{{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{z{{{zz{{zz= {zz{{z{{zz{{{{{{{z{{{{z{{zz{zz{{z{{{z{{{z{{z{{{z{{{z{{zz{{{z{z{{{{z{{{zz{= {{z{z{{zz{zz{zz{{zz{zzz{{{{zz{{{z{z{{z{{z{{z{{z{{zz{zz{{z{{zz{zz{zz{{{z{z= {{{{{z{{{{z{{z{{zz{{zz{{z{{{{{{zz{zz{zz{{zz{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{zzzzzz{{zzzz{{{{{{{{{{{zzzzzzz{{{{{= zzzz{{{zzzz{{{{{{{{{{zz{{{{{{zzzzz{{{{{{{{zzz{{{zz{{{{zz{zz{{{z{{{z{zz{{z= {{{z{{{{{{{zz{{{{{{z{{{{{zzz{{{zzz{{{{z{{zzz{{{zz{{{{{{zz{{{z{{{z{{{z{{zz= z{{{{{{{{{{{{{{{{{{{zzzzzz{{{{zzz{{{zzzz{{{{{{{zzz{{zzz{{zz{zzzzz{zzz{zzz= zzz{zzz{zzz{{zzzz{zzz{{zzzz{{zzzz{zzz{{zzz{z{z{{{{{{{{{{{{{zzzz{{zzz{{{z{= {zzz{{{{zz{zz{z{{{zzz{{zzzzzz{z{{{{{{z{{{zzz{{{{zzzz{{{z{{{{{{{zzz{{{zzzz= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zzz{{{zzzz{{{{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{= {{{{{zzzz{{{{zz{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{= {{{{{{{zzz{{{{{{zzz{zzzzzzzz{{{{{{zzz{zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zzz{{{{zzz{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zzz= {{{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{= {{{{{{zzzzz{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{z{{{zz{{{{{{{zz{{{zzz{{{zzzz{{{= {{{{{{{{{zzz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{zzzzz{zz{{zz{{{{{{{{{= {{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{zzzz{{{{{{{{{{{{{{{{zzz{{{{{{{{= {{{{{{{{{{{z{{{zz{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zzz{{{zz{{{zz{{{{{zzz{{{zz{= {{zz{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zzz{{{{z{{{{{{{{{{z{{{zz{{{= {{{{{{{{{{{{{{{{{{zz{{{{{{{{{zz{{{{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{zz{{{{{{{{{{{{zz{{{{zz{{{{{z{{{zz{{{{{{{{{{{{{{{{{{z= z{zzzz{{{{{zzz{{{zzzzz{zz{{zz{{{{{{{{{{zzzzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{{{{{{{z{{{zz{zz{{zz{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{= {{zz{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{zzzz= {{{z{zz{{{zz{{zzzz{{{z{zz{{{zz{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{= {{{{zzz{{{{z{{{{{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{= {{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{= zz{{{zz{{{zz{{{{{{{{{{{{{{{{{{z{{{{zz{{{{zz{{{{z{{{zz{zz{{zz{{{{{{{{{z{{{= zz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{zz{zz{{zz{{{{{{{{{{{{zz{{{{zz= {{{zzz{{{{zzz{{{{{{{{{{{zz{{zz{{{zz{{{{{{{{{{{{{{{z{zz{{zzz{zz{{{{zzz{{zz= zzzzz{zz{{{{zzz{{zz{zz{{{{{z{zz{{z{zz{{{zz{{{z{zz{{z{zz{{{zz{{{z{{{{{{zzz= zz{zzz{{{zzzz{zzzzz{{{{{{{{{{{{{{{{z{zz{{{z{{zzzz{{zzzz{{zz{zz{{{zzzz{{zz= z{zz{{zzz{{{zzz{{{zz{{{{{{{{zz{{{zz{{zzzz{{zz{zzz{{zzz{{zzz{zz{{{zzzz{zzz= z{{{zzz{{zzz{zzz{zz{{{{z{{{z{z{{z{{zzzz{{zz{zz{zzz{zzz{{{{{{zz{{{{zz{{{zz= {{{{{{{{{zz{zzz{zz{{{{z{{{{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{= {{zz{zz{{zz{{{{{{{{{{{{zz{{{{zz{{z{{zz{{z{{zz{{{{{{{{{{zz{{zz{{{zz{{{{{{{= {{{{{{{zz{zz{{{zzz{zz{zzz{zz{{z{{{zzz{zz{zzz{zz{{zzzzz{{{{z{zz{{z{zz{{{zz= {{{z{zz{{z{zz{{{zzzzzz{{{{{{{z{{zzz{zz{zz{zz{{z{{{{{{{{{{{{{{{{{{{z{{zz{{= z{zz{{zz{{zz{{{zzz{zz{zz{{zz{{zzz{zz{{zz{{z{{zz{{zz{{{{{{{{zzzzzz{{zz{{zz= {{zz{zz{z{{zz{{zzz{zz{zz{{z{{zz{{{z{{zz{{zz{{zzz{zz{{zz{{zzzz{{z{{{zz{{{z= zz{zz{zz{{zz{{{{{{zz{{{{zz{{{zzzzz{{{{{{zz{{zzzz{{{{{z{{{{{{{{zz{{{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{zz{{{zzzzz{{{{{{{{{{{{zz{{{{zz{zz{{zz{zz{= {zz{{{{{{{{{{{zzzzz{{{zz{{{{{{{{{{{{{{z{{zz{{zzz{zzz{zz{{zz{zz{{zzz{zzz{z= z{{zz{zzz{z{{{{zz{zz{z{{zz{{{zz{{zz{zz{z{{zz{{{zz{{z{{{{{{{zz{{zz{{zz{zz{= {{{zz{{{{{{{{{{{{{{{{{{{z{{zzz{z{{{{{zz{{zz{{{zz{{zz{{{{{zz{{zz{{zz{{zz{z= z{{zz{{zz{{{{{{{{zz{{{zz{zz{{zz{{zz{{{zz{{zz{{zz{{zz{zzz{{{{zz{{zz{{zz{{z= z{{zz{{zz{{z{{zz{zz{{z{{{zz{{{zz{{zz{zz{{zz{{{{{{zz{{{{zz{{{zz{{zz{{{{zz{= {{zzzz{{{{{z{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{z{{{{zz{{{{{{{{{{{{{{zz{{{{{{zz{= {{zzzzzz{{{{zz{{{{zz{zzzzzz{zz{{{{{{zzzzzz{{{{{zz{{{{zz{{{{{{{{{{{{{zzzzz= z{{zz{{zz{zz{{{zz{zz{{zz{{zz{zzzzz{{{zz{{{{{{{z{{zzz{{zz{{{zz{{{z{{zzz{{z= z{{{zzz{{{{{{{{{{zz{zzzzz{{{{zz{{{zz{{{{{{zzzzzz{{{{{{{z{{{zzzz{{zzzzz{{z= z{{{zz{{zz{{zzzzz{{zz{{zz{{zz{zzzzzz{{zz{{{{{{{{zz{{{zz{zz{{zz{{zz{{{zzzz= zz{{zz{{zz{{zzz{{{zz{{zzzzzz{{zz{{zz{{zz{{z{{zz{zz{{z{{{zz{{{zz{{zz{zz{{z= z{{{{{{zz{{{{zz{{{zz{{zz{{{zz{{{zz{{zz{zzzzzzz{{{zz{{{{{zz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{zz= z{{zz{{{{{{{{{{{{{{z{{{{{{{zz{{{{{{{{{{{{{{zz{{{{zz{zz{{{{{zz{{{{{{{{{{{{= {{{{zz{{{{{zz{{{{{{{{{{{{z{{{{zz{{zz{{zz{zz{{zz{zz{{{zz{{zz{zz{{{{{{zz{{{= {{{{z{{zzz{{zz{{{zz{{{z{{zzz{{zz{{{zz{{{{{{{{{{zz{{zz{{{{{{{{zz{zz{{{{{{{= {{{{{{{{{{{{{z{{{{zzz{zz{{zz{{zz{z{zz{{zz{zz{{zz{{zz{{zz{{zz{zz{{{{{{zz{{= {{{{{{zz{{{zz{zz{{zz{{zz{{{zz{{{{{{zz{{zz{{{zzz{{zz{zzz{{{{{{zz{{zz{{zz{{= zz{zzzzz{zz{{{zz{z{zz{{zz{zz{{zz{{{{{{zz{{{{zz{{{zz{{zz{{z{{{{{zz{{zz{{{{= z{{{{{z{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{zzzzz{{{{{{{{{{{{{{zzzzzz{{zzz{{{{{{{{{{{{{{z= z{{{zz{{zzz{{z{zzz{{z{{{{{{{{{{{zzz{{{{{zz{{{{{{{{{{{zz{{{{zz{zz{{zz{{zz{= zzz{zz{zzz{{zz{{zzz{zz{zz{{{{{{{zz{{zz{{{zz{{{zz{{zz{{zz{{{zz{{{zz{{{{zz{= {{{zz{zzzz{zz{zz{zz{zz{z{{{{{{{{{{{{{{{{{{z{{{{{zz{zz{{zz{{zzz{{zz{{zz{zz= {{zz{{zz{{zz{{zz{zzz{{z{{zz{{{{{{{{zz{{{zz{zz{{zz{{zz{{{zzz{{z{{zz{{zz{z{= {zz{{zzz{zzz{{z{{zz{{zz{{zz{{zz{{zz{zzz{{{{zzz{{zz{{zz{zz{{zz{{{{{{zz{{{{= zz{{{zz{{zz{zzzzzz{zz{{zz{{{{z{{{{zzzzzz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{= {{{{zzzzzz{zz{{{{{{{{{{{{{{{zzzzzzz{{{{zzzz{{{zzzz{{{{{{{{{{{zz{{{{{zzzzz= z{{{{{{{{zzzz{{zzzzzz{{zzz{{zzz{{{zzz{zz{{zzz{{zzzz{{zz{{{{{{zzz{{zz{{zzz= zzzzzzzzz{{zz{{zzzz{zzzzzzzz{{{{{zzz{{zzzz{{zzzz{{zzz{{{{{{{{{{{{{{{{{{zz= z{{{{{z{{zzz{zz{{zz{zzz{{zzz{zzz{zzzzz{{zzzzzzz{zzzz{{zzzz{{{{{{zzzzzzz{{= {zzzz{{zzzz{{{zzzz{{zzz{{zzzzzzz{{{{zz{{zzzz{{zzzzzzz{{zzz{{zz{{{{{{{{{{{= {zz{zzz{{zzz{zzz{zz{{{{{zz{{zzzzzz{{zzzz{{zzzzzz{{zzzz{{{{{z{{{{zzzzzz{{{= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{zzzzz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{zzz{zzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{= {{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{zzz{{{{{{{{{{{{{zzzz{z{{zzz{= {zzzzzzz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{zz{{{{{z{{{zz{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{zzzzz{{{{{{{{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zzzz{{{{zzzz{{{{{zz{{{{z{{{{{{z{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{{{{{{zz{zz{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z= z{zz{zz{{{{{{{{{{{zz{{{z{{{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{z{{z{{{{z{{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zz= {{{{{zz{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zz{{= zz{{{zzz{{{{{zz{{{zzz{{{{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||||||||= ||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{z{{{z{{{{{{{{{{z{{{{{z{{{{z{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{z{{{{{{z{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{{zz{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{z{{{{z{{z{{{{{{{z{{{{{{{z{{{{{zzz{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=0D=01=01||~}}|||||||||||||||}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{zzz{{zz{zz{{{{{{{{{{{z{{{{z{{{{{z{{{{{{= {{{{z{{{{{{{{{z{{{{z{{{z{{{{{{zz{zzz{zz{zz{{{{zz{z{{zzzz{{{zz{{{{{{z{{{{{= {{z{{{{z{{{{{z{{{{{z{{{{{{{{{{{{{{{{zz{zz{{{{zzz{{z{zz{{{z{{{zz{z{{z{zzzz= {z{zz{{zz{{zz{zz{zz{zzz{{zz{zz{{{{zzz{{z{zzz{{{{z{zz{{{{zzz{{{z{{z{{{zzzz= {{{zzz{{z{zzz{{zzz{{{{{{{zzzz{{{zzz{{zz{zz{zzz{{{{{{{z{{{{{{z{{{zzz{{{{z{= {{{{{{{z{{{{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~vvvvvv~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{z{{{zz{{z{{zz= {zz{{{{{{{{{{zz{{zz{{{{zz{{{{{{{{{z{{{{{{{{{{z{{{{zzzzz{{{{{{{z{{{zz{zz{z= {{zz{zz{{z{{z{{zz{{z{{{{{z{{{{{zz{{{{z{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{zz{zz= {{z{{z{{zz{zz{z{{{z{{z{{{z{{z{{{zz{zz{{z{{{z{{zz{zzz{zz{{zz{zz{{z{{{z{{zz= {z{{{{zz{zz{{z{{{z{{z{{z{{zz{{z{{zz{zz{{zz{z{z{{{z{{{{{zz{{z{{zz{zz{{zz{z= zz{zz{{{{{z{{{{{zz{{{{z{zz{{{zzzz{{{{{z{{{{z{z{z{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0= =01=01||~}}||~~~vvvvv|~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{z{{{{{{zz{{z{{{z{{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{z{{{{zzz{= {{z{{{{z{{z{{{{{{{z{{{zz{{z{{z{{z{{{z{z{{{z{{z{{zz{{{{{z{{{{{{{z{{{z{{{{{= {z{{{{{z{{{{{{{{{{{{{{{{{z{{{z{{zz{{{{z{{{z{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{= z{{z{{{z{{{z{{z{{{z{{zzzzz{{z{{{{{{{z{{{z{{zzzzz{{z{{z{{z{{{{{{z{{{z{{z{{= {{zzzzz{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{{{{{{{z{{{{{{zz{zz{{zz{{{{z{{{{= {{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~vv||||~~~}}||~~}}{{{{{{{{{= {{{{{{{z{{{{zz{{{{{{{{{{{{{{{{{z{{{{{zzzzzzz{{{{z{{{{zz{z{{z{{{z{{zzzzzzz= {{{{{z{{{{z{{{{{{{{{{{z{{{{{z{{{z{{{{z{{{{{{{{{{{z{{{z{{z{{z{{z{{{z{{z{{z= {{zzzz{{{{{{z{{{{{{{{z{{z{{{{{{{z{{{{{z{{{{{zzzzzzz{{{{{z{{{z{{{zz{{{z{{{= z{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{= {z{{{{{{z{{z{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{= {{{{{{{z{{{{{{z{z{{{{z{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}= ||~~~v|||||~~~}}||~~}}{{{{{{{{{{{{{{{zzz{{zz{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{z{{{z{{{z{{z{{{z{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{z{{{{{z{{{z{{{{z{{{{= {{{{{{z{{{{z{{z{{z{{z{{zz{{{zz{{{z{{{{{{{{{z{{{{{{{{z{{z{{{{{{{z{{{{z{{{{= {{{{{{{{{{{{{{z{{{z{{{{zz{{z{{{z{z{{z{{zz{{z{{{z{{{z{{{z{{z{{{z{{z{{{z{{{= z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{{z{{{{{{z{{z{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{= {z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{{{{{{{{z{{{{{{z{z{{{{z{{{{z{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{zzzz= z{{{{{{{{{{{{{{{{{zz{{{z{{{{{{{{{{{z{z{{{zz{{z{{z{{{z{{{{{{{{{{{zz{{{{zz{= {{z{{{{{{{{zz{{{z{{{{z{{{{z{{{{{{{{{{z{z{z{{z{{z{z{z{z{z{zz{{{{{zz{{z{{{{= {z{{{{z{{z{{z{{{{z{{z{{{{{z{{{{{{{{{{{{{{{{{{z{{{z{{z{{z{{z{{zz{zz{{zz{zz= z{{{{z{{{z{{{z{{zz{zz{{z{{{z{{{z{{zz{zz{{zz{{{z{z{{{{z{{z{{zz{{zz{{{z{z{{= z{{zz{{{z{zz{zz{{z{{{{zz{{{z{z{{zz{{{z{zz{zz{{z{{{z{{{z{{{{{z{{{zz{{zz{{z= {{z{{zz{{zz{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{zzzzzz{{{{{{{{{{{zz{{{{{= zzz{zzzz{zzz{{{{{{{{{zz{{{{{zzzzzz{{{{{{{{{zzzz{{{{zzz{{zzz{{{{{{{{{{z{{z= {{z{{{z{{{z{{zz{zzz{{{{zzz{{{{{{z{{{{{zz{{{z{{{{{zz{{{{{{z{{{{{{{{{{{{{{{= {{zzz{zzz{zzz{{{zzzz{{{z{{{{{{{{{{{{{zzzzz{zzz{{zz{zzzzz{zzz{zzz{z{zz{{{{= zzzz{zzz{{{z{{zzzz{{{{zzzz{zzzzzz{{zzzz{{{zzz{{zzz{{{{zzzz{{z{{{zzzz{{{zz= z{{zzz{zzz{zzz{{{{{z{{{zzzz{{{zzz{{{{zzzz{{{zzzzz{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||}}}}}}}}}}}}}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}|}}}}= }}}}}}}}}}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6= =C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{= {{{{{zzzz{{{zzz{{{{{{{{{{{{{zzzz{z{{zzz{{zzzzzzz{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{zzz{{{{{z{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= {{{{{{{{{zzzzz{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{= {{{{{{{{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{z{{{{{{zz{zzzzzz{{zzz{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zz{zz{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{zz{zz{{{{{{{{{{{zz{{{z{{{{z{{{{= z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{{z{{z{{z{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zz{{{{{zz{{{z{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{zz{{{{{zz{{z{{{{z{zz{zz{{{z{z{z{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{zz{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{= z{{{z{{{{{{{{{{z{{{{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{z{{{z{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{zz{{{= {{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{= {{{z{{{{{{{{z{{z{{{z{{{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{= {{{zzz{{zz{zz{{{{{{{{{{{z{{{{z{{{{{z{{{{{{{{{{z{{{{{{{{{z{{{{z{{{z{{{{{{z= z{zzz{zz{zz{{{{zz{z{{zzzz{{{zz{{{{{{z{{{{{{{{z{{{z{{{{{z{{{{{z{{{{{{{{{{{= {{{{{zz{zz{{{{zzz{{z{zz{{{z{{{zz{z{{z{zzzz{z{zz{{zz{{zz{zz{zz{zzz{{zz{zz{= {{{zzz{{z{zzz{{{{z{zz{{{{zzz{{{z{{z{{{zzzz{{{zzz{{z{zzz{{zzz{{{{{{{zzzz{{= {zzz{{zz{zz{zzz{{{{{{{z{{{{z{z{{{z{{{{{{{{{z{{{{{{z{{{{zzz{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{zz{{{= {{{{{{{{{{{{{zz{{{{{{{{{{{{{{z{{{zz{{z{{zz{zz{{{{{{{{{{zz{{zz{{{{zz{{{{{{= {{{z{{{{{{{{{{z{{{{zzzzz{{{{{{{z{{{zz{zz{z{{zz{zz{{z{{z{{zz{{z{{{{{z{{{{{= {{z{{{z{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{zz{zz{{z{{z{{zz{zz{z{{{z{{z{{{z{{z{{= {zz{zz{{z{{{z{{zz{zzz{zz{{zz{zz{{z{{{z{{zz{z{{{{zz{zz{{z{{{z{{z{{z{{zz{{z= {{zz{zz{{zz{z{z{{{z{{{{{zz{{z{{zz{zz{{zz{zzz{zz{{{{{z{{{{zz{z{{{zzzz{{{{{= z{{{{{{zz{{{z{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{zz{{z{= {{z{{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{z{{{{zzz{{{z{{{{z{{z{{{{{{{z{{{zz{{z{{z= {{z{{{z{z{{{z{{z{{zz{{{{{z{{{{{{z{{{{z{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{z{{{z= {{zz{{{{z{{{z{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{zzzzz{{z{= {{{{{{z{{{z{{zzzzz{{z{{z{{z{{{{{{z{{{z{{z{{{{zzzzz{{{{{z{{{{{{z{{{z{{z{{{= z{{{z{{{{{z{{{{z{{z{{zz{{zz{{{{z{{{{{{z{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{z{{{{zz{{{{{{{{{{{{{{{{{= z{{{{{zzzzzzz{{{{z{{{{zz{z{{z{{{z{{zzzzzzz{{{{{z{{{{z{{{{{{{{{{{z{{{{{z{{= {z{{{{z{{{{{{{{{{{z{{{z{{z{{z{{z{{{z{{z{{z{{zzzz{{{{{{z{{{{{{z{{{{z{{{{{{= {z{{{{{z{{{{{zzzzzzz{{{{{z{{{z{{{zz{{{z{{{z{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{= z{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{{z{{{{{{z{{z{{z{{{{{{z{{{z{{z{{= {{z{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{{{z{{{z{{z{{{{z{{{z{{{{{{z{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{zzz{{zz{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{{{{{{{{= {{{{z{{{{z{{{{{{{{{{{{z{{{{{z{{{z{{{{z{{{{{{{{{{z{{{{z{{z{{z{{z{{zz{{{zz{= {{z{{{{{{{{{z{{{{{z{{{{{z{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{z{{{z{{{{zz{{z{{{= z{z{{z{{zz{{z{{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{= {z{{{{{{z{{z{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{= {{zzzzzz{z{{{{z{{{z{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~= ~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{zzzzz{{{{{{{{{{{{{{{{{zz{{{z{{{{{{{{{= {{z{z{{{zz{{z{{z{{{z{{{{{{{{{{{zz{{{{zz{{{z{{{{{{{{zz{{{z{{{{z{{{{z{{{{{{= {{{{z{z{z{{z{{z{z{z{z{z{zz{{{{{zz{{z{{{{{z{{{{z{{{z{z{{{{z{{z{{{{{z{{{{{{= {{{{{{{{{{{{z{{{z{{z{{z{{z{{zz{zz{{zz{zzz{{{{z{{{z{{{z{{zz{zz{{z{{{z{{{z{= {zz{zz{{zz{{{z{z{{{{z{{z{{zz{{zz{{{z{z{{z{{zz{{{z{zz{zz{{z{{{{zz{{{z{z{{z= z{{{z{zz{zz{{z{{{z{{{z{{{{{z{{{{{{{z{{zz{{zz{{z{{{{{zz{{{z{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{zzz{{= {{{{{{{{{{{{{{{{zzzzzz{{{{{{{{{{{zz{{{{{zzz{zzzz{zzz{{{{{{{{{zz{{{{{zzzzz= z{{{{{{{{{zzzz{{{{zzz{{zzz{{{{{{{{{{z{{z{{z{{{z{{{z{{zz{zzz{{{{zzz{{{{{{z= {{{{zzzzz{z{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{zzz{zzz{zzz{{{zzzz{{{z{{{{{{{{{= {{{{zzzzz{zzz{{zz{zzzzz{zzz{zzz{z{zz{{{{zzzz{zzz{{{z{{zzzz{{{{zzzz{zzzzzz= {{zzzz{{{zzz{{zzz{{{{zzzz{{z{{{zzzz{{{zzz{{zzz{zzz{zzz{{{{{z{{{{{{z{{{zzz= z{{{z{{{{{zzzzzz{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzz{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzz{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{zzz{{{{{{{{{{{{{zzz= z{z{{zzz{{zzzzzzz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{zz{{{{{z= {{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{zzzzz{{{{{{{{zz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{zz{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{zzz{{{zzzz{{{{{{z= {{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zz{zz{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{zz{{zz{zz{zz{{{{{{{{{{{zz{{{z{{{{z{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{z{{{{{z{{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{zz{{{{{zz{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{zz{{{zz{zz{zz{{zz{{{{zz{{{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}= }~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{z{{{z{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{z{{{z{{{{{{{{{{z{{{{{z{{{{z{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{z{{{{{{z{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{zz{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{{{z{{{z{z{{{{z{{{{zz{{{{zzz{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{zz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{zzz{{zz{zz{{{{{{{{{{{z{{{{z{{{= {{z{{{{{{{{{{z{{{{{{{{{z{{{{z{{{z{{{{{{zz{zzz{zz{zz{{{{zz{z{{zzzz{{{zz{{{= {{{z{{{{{{z{{{{{z{{{{{z{{{{{z{{{{{{{{{{{{{{{{zz{zz{{{{zzz{{z{zz{{{z{{{zz{= z{{z{zzzz{z{zz{{zz{{zz{zz{zz{zzz{{zz{zz{{{{zzz{{z{zzz{{{{z{zz{{{{zzz{{{z{= {z{{{zzzz{{{zzz{{z{zzz{{zzz{{{{{{{zzzz{{{zzz{{zz{zz{zzz{{{{{{{z{{{{z{z{{{= zz{{z{z{{{{z{{{z{z{{{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{z{{{= zz{{z{{zz{zz{{{{{{{{{{zz{{zz{{{{zz{{{{{{{{{z{{{{{{{{{{z{{{{zzzzz{{{{{{{z{= {{zz{zz{z{{zz{zz{{z{{z{{zz{{z{{{{{z{{{{{{z{{{{z{{{{zz{{{{{{z{{{{{{{{{{{{{= {{{{zz{zz{{z{{z{{zz{zz{z{{{z{{z{{{z{{z{{{zz{zz{{z{{{z{{zz{zzz{zz{{zz{zz{{= z{{{z{{zz{z{{{{zz{zz{{z{{{z{{z{{z{{zz{{z{{zz{zz{{zz{z{z{{{z{{{{{zz{{z{{zz= {zz{{zz{zzz{zz{{{{{z{{{{zz{z{{{{zzz{{z{{{{z{{zz{z{{{z{z{z{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{zz{{z{{{z{{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{= z{{{{zzz{{{z{{{{z{{z{{{{{{{z{{{zz{{z{{z{{z{{{z{z{{{z{{z{{zz{{{{{z{{{{{{z{= {{{z{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{z{{{z{{zz{{{{z{{{z{z{{z{{{z{{{z{{z{{{z{= {{z{{z{{{z{{z{{{z{{{z{{z{{{z{{zzzzz{{z{{{{{{{z{{{z{{zzzzz{{z{{z{{z{{{{{{z= {{{z{{z{{{{zzzzz{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{{{{z{{z{{{z{{zz{z{{{{z= {{z{{z{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{z{{{{zz{{{{{{{{{{{{{{{{{z{{{{{zzzzzzz{{{{z{{{{zz{z{{z{{{z= {{zzzzzzz{{{{{z{{{{z{{{{{{{{{{{z{{{{{z{{{z{{{{z{{{{{{{{{{{z{{{z{{z{{z{{z{= {{z{{z{{z{{zzzz{{{{{{z{{{{{{z{{{{z{{{{{{{z{{{{{z{{{{{zzzzzzz{{{{{z{{{z{{{= zz{{{z{{{z{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{= {{{z{{{z{{z{{{{{{z{{z{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{= {z{{{{{z{{{z{{{z{{{z{{{z{z{{{{z{z{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{zzz{{zz{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{z{{{{{z{{{z{= {{{z{{{{{{{{{{z{{{{z{{z{{z{{z{{zz{{{zz{{{z{{{{{{{{{z{{{{{{z{{{{z{{{{{{{z{= {{{z{{{{{{{{{{{{{{{{{{z{{{z{{{{zz{{z{{{z{z{{z{{zz{{z{{{z{{{z{{{z{{z{{{z{{= z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{{z{{{{{{z{{z{{z{{{{{{z{{{z{{z{{{{z= {{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{z{{{zzzzzz{{z{{{z{z{{{{z{zzzzzz{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{zzzzz{{{{{{{{{{{{{{{{{zz{{{z{{{{{{{{{{{z{z{{{zz{{z{{z{{{z{{{{{{{{{{{z= z{{{{zz{{{z{{{{{{{{zz{{{z{{{{z{{{{z{{{{{{{{{{z{z{z{{z{{z{z{z{z{z{zz{{{{{z= z{{z{{{{{z{{{{{{z{{{z{{{{z{{z{{{{{z{{{{{{{{{{{{{{{{{{z{{{z{{z{{z{{z{{zz{z= z{{zz{zzz{{{{z{{{z{{{z{{zz{zz{{z{{{z{{{z{{zz{zz{{zz{{{z{z{{{{z{{z{{zz{{zz= {{{z{z{{z{{zz{{{z{zz{zz{{z{{{{zz{{{z{z{{zz{{{z{zz{zz{{z{{{z{{{z{{{{{z{{{{= {{{z{{{zz{zz{zz{{zz{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{zzzzzz{{{{{{{{{{= {zz{{{{{zzz{zzzz{zzz{{{{{{{{{zz{{{{{zzzzzz{{{{{{{{{zzzz{{{{zzz{{zzz{{{{{{= {{{{z{{z{{z{{{z{{{z{{zz{zzz{{{{zzz{{{{{{z{{{{{zzz{{z{{{{{zz{{{{{{z{{{{{{{= {{{{{{{{{{zzz{zzz{zzz{{{zzzz{{{z{{{{{{{{{{{{{zzzzz{zzz{{zz{zzzzz{zzz{zzz{= z{zz{{{{zzzz{zzz{{{z{{zzzz{{{{zzzz{zzzzzz{{zzzz{{{zzz{{zzz{{{{zzzz{{z{{{z= zzz{{{zzz{{zzz{zzz{zzz{{{{{z{{{{{{z{{{{zzz{{{zzzz{{{{{{z{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~= ~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01= =01=01||~}}||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}|||||||||||||||||||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~~~= ~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~~~~~~~~~~~~~~= ~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||||||||||||~}}=01=01=E0\=01=01= ||~~~~~~~~~~~~~~~~~~~~~~~}|||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||~}}=01=01=00=0D=01=01||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=F4=88=01=01||}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}=01=01=F6=C0=01=01|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01=A4=1C=01=01zzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=01=01=01= =01=01=01||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||=01=01=8C=AC=01=01|||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||||||||}=01=01=00=0D=01=01||= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01=00=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}=01=01=E8=04=01=01||~~~~~~~~~~~= ~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|~}}= =01=01=00=00=01=01||~||||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~|||||||||||||||||||}~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01= =01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=0D=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~||~~~= ~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=F6=C0=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~||~~~~~}}}}}}~~~= ~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =01=01=01=01||~||~~~~~}}}}}|~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~||~~~~~}}||||~~~~~}}~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01= ||~||~~~~~}|||||~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{zzzzz{{{zzzzz{{{{{{{{{zzz= z{{zzzz{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{{{{{{{zzzzz{{= {{zzzz{{{{{zzzz{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=01=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{= {{{{{{{zzz{{{{{zzz{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{= {{{{{{zzz{zz{{{{{{{{{{{zz{{zzz{{zzzzzz{{{zzzzzz{{{{zzz{{{{{{{{{{{{{{{{{{{= {{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~||~~~~~~= ~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{{{{{{{{{{zzz{{{zzz{{{{= {{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{z{{{{zzz{{{{{{{{{{{{{zzz{{{zz{zz{{zzzz{zz= {{zzzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=00=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{zzz{= {{{{zzz{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zzz{{= {{{{{{{{{{{zzz{{{zz{z{{{{zzz{z{{{{zzz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{= {{{{{{{zzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{{{{{{{{{{{{= {{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{zzz{{{{zz{{{{{{{{{{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{= {{{{{{{{{{{{{{zzz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{z{{{{{{{{{z{{{{{= {{zz{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~||~~~~~~~~~~~~~~~~}= }~~}}{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{{{zzzz{{{zzz{{{zzz{{{{zzzz{{{{{{{= {{{{zzzz{{{{zzzz{{zzzzzz{zzzzzz{{{{{{{{{{{zzzz{{zz{{{{{{zzz{{{{{{zzz{{{zz= {{{{zzzz{{zzz{zzz{{zzzzz{{zzz{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{z{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{z{z{{{{{{{{{z{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0= \=01=01||~||}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{{zz{= {zz{{zzz{{{zzz{{{zz{{zz{{{{{{{{{{{zzz{{{zz{{zz{{zzz{{{{zzz{{{{{{{{{{{{{{z= zzzzz{{{{{{{zzz{{{{{{zzz{{zz{{{{zz{{zz{{zzz{zz{zz{{zz{{zzz{{{{{{{{{{z{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{z{{{{{= {{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~|}}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{= {{{{{{{{{{{{{{zzzzzzzzzzz{{zzz{{zzz{zzz{{{zzz{{zzz{{zzz{{{{{{{{{{zzz{{zzz= {{zzz{zzz{{{{zzz{{{{{{{{{{{{{{{zzzzz{{{{{{{zz{{{{{{{zz{{{{{{{{zzz{{zzz{zz= z{{{{zzz{{z{{zzz{{{{{{{{{{z{{{{{{zz{zz{zzz{{{{{{{zzz{{{zzz{{zz{zz{{{{zzzz= {zz{zz{zz{{{{zzzz{{{{zzzz{z{zz{{zz{{{zzz{{{{zz{zz{zzz{{{{zzz{{{{zzz{{{zzz= {{{zzz{{{{zzzz{{{zzz{{{{{{{{{{zzz{{zz{{zz{zzzz{{{{z{zz{{{{zzz{{{{zzzz{{{z= zz{{zz{{zz{{{zzz{{{zzz{{{{{{{z{{{{{{z{zz{{{{zzz{{{z{zz{{{zzz{{zzz{zzz{{zz= z{{{{{zzzz{z{zz{{{{zzz{{zzzz{{{{{z{{{{{{z{zz{{{{zzz{{zzz{zzz{{zzz{{{{{zzz= zzz{zz{zz{{zz{{{zzz{{z{zz{{{{zzz{{{{zzzz{{{{{{zzzz{z{zzz{{zzz{{{{zzz{{zzz= zzz{zz{zz{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~~= ~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{zzzzzzzz{zzz{{{= zzz{{zzz{{zzz{{{{{{{{{{zzz{{zzzzzzzz{zzz{{{{zzz{{{zzzzzzzzz{{z{zzzzz{{{{{= zz{{{{{{{zz{{{{{{{{{zzzzzzzz{zzz{{{{zzzz{{{{{z{{{{{{{{{{{z{{{{{{{zz{zzz{z= z{{{{{z{{z{{z{{{z{{zz{zz{{zz{{z{{z{{zz{zz{{zz{z{{{{{{z{{{zz{zz{{z{{z{{z{{= {{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{{zz{{z{{zz{z{{{z{{{z{{{{{{{{zz{zz{{z{{{z{= {z{{{{{{zz{zz{{z{{{z{{zz{{z{{zz{{z{{z{{{z{{z{{z{{z{{{z{{{{{{z{{{{{{zz{zz{= {z{{{z{{z{{z{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{zz{zz{{zz{{z{{z{{{{{{{z{{{{{{zz= {zz{{zz{{z{{z{{{z{{z{{{z{{{{{z{{{z{{zz{zz{{z{{z{{z{{zz{zz{{z{{{z{{zz{{z{{= {{{zz{{z{{zz{z{z{{{z{{zz{{z{{z{{{z{{zz{zz{{zz{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F6=C0=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{= {{{zzz{{{{{zzz{{zzz{{{{{{zzz{{{zzz{{zzz{{zzz{{{{{{{{{{zzz{{zzz{{{{{{zzz{{= {{zzz{{{zzzzzzzzz{zz{{{zzzz{{{zz{{{{{{{zz{{{{{{{{{{zzz{{{{{{zzz{{{{{zzzz{= {{{z{{{{{{{{{{{z{{{{{{{z{{{z{{{z{{{{{zz{{{{zzzzz{{z{{{z{{z{{{z{{z{{z{{{z{= {z{{{z{{{{{z{{{z{{{z{{z{{zz{{{{{{{z{{{z{{{z{{zzzzz{{zz{{{{zz{{{{{{{zz{{z{= {{z{{zzzzz{{{{{{{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{zzzzz{{z{{{{{{{{{zz{{z{{{z{= {zz{{{{zzzzz{{{{{{z{{{{{{z{{{z{{zzzzz{{z{{z{{zzzzz{{z{{{z{{zzzzz{{{{{z{{{= z{{{z{{{{{zz{{z{{{{{{{z{{{{{{z{{{z{{{{{zz{{z{{{z{{zzzzz{{{{{z{{{z{{z{{{z{= {z{{zz{{{{z{{{z{{zzzzz{{z{{{z{{{{{z{{{{{{z{{{{zzzzz{{{{{zz{{z{{{z{{z{{{z{= {z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~~~~~~~~~~~~~= ~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{zzz{{{{{{zzz{{{zzz{{zzz{{z= zz{{{{{{{{{{zzz{{zzz{{{{{{zzz{{{{zzz{{{{{{{{{{{{{zz{{{{zzz{{zz{{{z{{{zz{{= {z{{{{{{{zzz{{{{{{zzz{{{{{{zzzz{{{{{{{{{{{{{{{z{{{{{{{z{{{z{{{z{{{{{{zz{{= {z{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{zz{{z{{{{{z{{{z{{{z{{z{{{zz{{{{{{z{{{z{{{= z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{{{{{{z{{{z{{z{{{z{{z{{{{{{z{{= {z{{z{{{{{{z{{{{{{{zz{z{{z{{{z{{{zz{{{z{{{{{{{{{{z{{{{{{z{{{z{{z{{{{{{z{{= z{{z{{{{{{{z{z{{{z{{{{{{{{{z{{{z{{{z{{{zz{z{{z{{{{{{{z{{{{{{z{{{z{{{zz{z{= {{z{z{{{z{{{{{{{{{z{{{z{{z{{{z{{z{{{zz{{{z{{{z{{z{{{{{{z{{{z{{{{{z{{{{{{z= {{{{z{{{{{{{zz{z{{z{{{z{{z{{{z{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=01=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{z= zz{{zzz{{{{{{zzz{{{zzz{{zzz{{zzz{{zzz{{{{{zzz{{zzz{{{{{{zzz{{{{zzz{{{{{{{= {{{{{{zz{{{{zzz{zz{{{zz{{zz{{{zz{{{{{{{zzz{{{{{{zzz{{{{z{{zzz{{zzz{{{{{{{= {{{z{{{{{{{z{{{z{{{z{{{{{{{zz{{z{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{{zzz{{{{{{z= {{{z{{{z{{z{{{{zz{{{{{z{{{z{{{z{{z{{{{{{{{zz{{{{zz{{z{{{z{{{zzz{{{z{{{{{{= {{{{{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{{zz{{z{{{{= {{{{{{z{{{{{{z{{{z{{z{{{{{{z{{z{{z{{{{{{{z{z{{{z{{{{{{{{{z{{{z{{{z{{z{{{z= {{z{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{z{{{z{{{{{{{{{z{{{z{{z{{{z{{z{{{{zz{{z{= {{z{{z{{{{{{z{{{z{{{{{z{{{{{{z{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{zzz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}}}}}}}}}}}}}}}}}}}~~}}= {{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{{zzz{{zz{zzz{{{zzz{{{zz{{zz{{{zzz{{{{{= zzz{{{zzz{{zz{zzz{z{{zzz{{{{{{{{{{{{{{zz{{{zz{zzzzzzzz{zzzzzzzz{{{{{{{{zz= z{{zz{zzz{{{{zz{{zz{{zzz{{{{{{{{{{z{{{{{{{z{{{z{{{z{{{{{z{{z{{zz{{{z{z{{{= z{{zz{zz{{z{{z{{{z{{{z{{{{{{{{z{{{z{{{z{{z{{z{{z{{{{{z{{{z{{{z{{zz{{{z{z{= {z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{{{{{{{zz{zz{{zz{zz{{z{{{{{{z{{zz{{zz{{{z{z= z{{{z{zz{{z{{zz{zz{{z{{z{{zz{{{z{{{{{z{{{{{{z{{zz{{zz{{{z{z{{z{{zz{{{z{{{= z{{{{zz{{{z{{{{z{{{z{{{z{{zz{{z{{z{{{{{{{z{{{{{{z{{{z{{zz{{z{{{{z{{{{zz{{= {z{{{{z{{{z{{z{{{z{{z{{z{{z{{z{{{z{{zz{{{z{zz{zz{{{{{zz{{{z{z{{{{zz{{{z{z= z{{z{{z{{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01= =01||~}}}}}}}}}}}}}}}}}}}|~~}}{{{{{{{{{{{{{{{{{{{{{zzzzz{{{zzzzz{{{zzzzz{= zzzzz{zzzzz{{{zzzz{{{{zzz{{{{zzzzz{{{zzzzz{{{zzz{{zzzzz{{{{{{{{{{{{{{zzzz= {{{zzzzzzzz{zzzzzzzz{{{{{{{{{zzzzz{zzzzz{{{zzzzz{{{zzz{{{{{{{{{zzz{{{{{zz= z{zzz{zzz{{{{zzz{{{{zzzz{zzz{zzz{{zzz{zzzzzzz{zzz{{zzzz{{{{{{zzzzz{zzzzzz= {zzz{{{{{zzz{zzz{zzz{{zzzz{{zzz{{{zzz{{{{zzz{z{{zzzz{{{zzzz{{{{{{{{{zzz{{= {{zz{zz{{zz{{{{zzzz{{{{zzzz{{{zzzz{{{zzz{z{{zz{zz{zzz{{{{zzzz{{{{{zzz{{{{= {zzzz{{{{zzzz{zzzzzz{{zzzz{{{{z{{{{{zzzz{{{{{{zzzzz{zzz{{zzz{z{{zz{{{{zzz= {{{{zzz{zzz{{zzz{z{{{z{{{{{zzzz{{{{zzzzzzzzzz{zzzzzz{zzz{{zzz{zzz{{zzzz{{= {zzz{z{{{{{zzzz{zzz{{{{zzzz{{{zzz{z{{zzzzzzzz{zzz{{zzzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~= ~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{= {{zz{z{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{zz{{{{{{{{{{{{z{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{zzz{{{{{{zzz{zzzzzzzz{{{{{{zzz{zzzzzzzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{zzz{{zzzzz{{{{{{= {{{{{{{{{{{{{{zzz{{zz{{{{{zz{{{{zz{{z{zz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{zz{{= {{{{{{{{{{{{{{{{zz{zz{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zzz{{zzz{{{{{{{{= {{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{z{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{zz{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{zz{{{{{zzz{{{zz= {{{zz{{{{{zzz{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{z{{{{z{{{{z{{z{{{{{{{{{{{{{z{{{{{{{z{{{{z{{{{{{z{{{{{z{{z{{z{{= {{{{{{{{{{{{{{z{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{z{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{zzzz{{{z{zz{{{zz{{zzzz{{{z{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{zz{{{z{{{zz{{z{{{{{{{{{{{{{z{{{= {{{{z{{{z{{{{{{{z{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{z{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zz{zz{zzz{= {{{zzz{{{{zzzz{zz{zzzzzz{{{zzz{{{{zzzz{{{{zzz{zzz{{zzz{{z{zzz{{zzz{zz{{{z= zz{{zz{zz{{{{{{{zzz{{zzzz{{{{{{{{{z{{z{{{zz{zz{{{zz{z{{z{zz{{{zz{{zz{{z{{= zz{{{zzzz{z{zz{{{{zzz{{zzzz{{{zz{{{zzz{{{{{{z{zz{{z{zz{{{zz{{{z{zz{{z{zz{= {{zz{{{z{{{{{{{{{{{{{zzz{zz{zz{zzz{{{{zzz{{z{zzzzzzz{{{{{{{{{{{{{{{{{{{{z= {{{z{{{z{{{z{zz{{{{zzz{{zzzz{{{{{z{{{{{{{{zzzz{{{{{z{zz{{z{{zz{{{zzz{{{{{= zz{{{zzz{{{{zzzz{{zzz{{{{zzz{{{{zzzz{{z{zz{{{{zzz{{{{zzzz{{z{{zz{{{{{{{{{= {{{z{{{{z{{{{zzz{{zzz{zzz{zzz{{{{{zzzz{{{zzz{{{{zzz{{{{zzz{{{{zzzz{z{zz{{= zz{{{zzz{{{{zz{zz{zzz{{{{zzz{{{{zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{zz{{z{{{{{zz{zzz{zz{{zz{zz{{zz{{z{{z{{z{{{z{{z{{{z{{zz{{z{{{{= {z{{{z{{z{{{z{{zz{z{z{{z{{z{{zz{zz{{zz{zz{{{{{zz{zz{{z{{{{{{{{{{{z{{z{{{{= zz{z{{z{{zz{{{z{{{zz{{z{{z{{z{{z{{{{{z{{{zz{zz{{zz{{z{{z{{{{{{z{{z{{z{{{{= {{z{zz{{z{zz{{{zz{{{z{zz{{z{zz{{{zzzzzz{{{{{{{{{{{{z{{z{{zz{zzz{zz{{zz{{z= {{zz{z{z{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{zz{zz{{zz{{z{{z{{{{{{{z{{{{{{{z= z{{z{{{{{z{{z{{z{{z{{{z{{{z{{{{{z{{z{{z{{{{{z{{{z{{{z{{z{{{z{{zz{{z{{zz{z= z{{zz{{z{{zz{{z{{z{{z{{{{{{{{{{{{{zzzzzz{{{zz{zz{{z{{{z{{{z{{{{{zz{{z{{zz= {zz{{z{{{z{{z{{z{{{{{z{{{zz{zz{{z{{z{{z{{{{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{= {zz{{z{{zz{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z{{{z{{{z{{z{{{z{{z{= {{z{{z{{z{{{z{{zzzzz{{z{{{z{{{{{z{{{z{{zzzzz{{z{{{{zz{{{{z{{z{{{z{{z{{{z{= {{{{z{{{z{{z{{{{{{{{{{z{{{z{{{zz{{z{z{{{z{{{z{{{{z{{zz{{z{{z{{z{{{{{z{{{z= {{{z{{{{{zz{{z{{{{{{z{{zz{{{{{{{zz{zz{z{{zz{{{zz{{zz{zz{z{{zz{{{zz{{z{{{{= {{{{{{{{{zz{{{{z{{{z{{{z{{{{{zz{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{zz{z{z{zz{{{= z{{{z{{{{{zz{{z{{{{{{{z{{{{{{{z{{{z{{{{{z{{z{{zzz{{{{zzzzz{{{{{z{{zz{{{{{= {{z{{{zzzzz{{zzzzz{{z{{{z{{z{{{z{{{{{zz{{z{{{{{{zzz{{{{{{{{{{{{{{z{{{{z{{= {z{{{z{{z{{{z{{{z{{{{{z{{{z{{z{{{z{{zzzzz{{zz{{{{{{{z{{{z{{{z{{z{{zz{{{{{= {{z{{{z{{{z{{zzzzz{{zz{{{{zz{{{{{{{zz{{z{{{z{{zzzzz{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{zz{z{{{{{z{{{z{{{z{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{{{{z{{{z{{{{{{z{z{{{z{{= {{{{z{{{{{zz{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{{zzzzzz{{{z{{z{{z{{{z{= {{z{{{zzzz{{{{z{{z{z{{{{{{z{{{z{{{z{{{zz{z{{z{{{{{{z{{{zz{{{{{{z{{zzz{{zz= {{{zz{{{z{{zzz{{zz{{{zzz{{{{{{{zzzzzzz{{{zz{{{z{{{z{{{z{{{zz{z{{z{{{{z{{{= {{{{{{{{{{{{{{{{{{{{z{z{z{z{{{{z{{{z{{{zz{z{{z{{{{{{{z{{{{{{{z{{{z{{{{{z{= {z{{z{z{{{{z{{{{{{{{{z{{{zz{{{{{{z{{{z{{{{{{z{{{{{{z{{{z{{z{{{z{{{zz{z{{z= {{{{{{z{z{{{{{{{{{{{{{{z{{{{z{{{z{{{z{{{z{{z{{z{{{{{{z{{{z{{z{{{z{{z{{{{{= {{zz{{{{{{z{{{z{{{z{{z{{{zz{{{{{{z{{{z{{{z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{= {z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{z{{{z{{{z{{z{{{z{{z{{{z{{z{{z{{= {z{{z{{{{{{z{{{z{{{{{{z{z{{{z{{{{{{z{{{{{{zz{{z{{z{{{z{{z{{{z{{{{{z{{{z{{= z{{{{{{{{{z{{{{z{{{z{{z{{z{{z{{{z{{{{z{{{{{{{z{zz{z{{{{{{z{{{z{{{z{{z{{{z= {{z{{{{{{z{{{{zz{{{{{z{{zzz{{zz{{{zz{{{z{{zzz{{zz{{{zz{{{{{{{{{{{{{{{{{{{= zz{{z{{{z{{{z{{z{{{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{{z{{{z{{z{{{= z{{z{{{{{{{z{{{{{{{z{{{z{{{{{z{{z{{z{{z{{{z{{{{{{{{{z{{{{zz{{{{{z{{{z{{{{= {{z{{{{{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{z{{z{{{{{{{{{{{{{z{{{{z{{{z{{{z{{{zz= z{zzz{{{{{{z{{{z{{z{{{z{{z{{{{{{{{zz{{{{{z{{{z{{{z{{z{{{{zz{{{{{z{{{z{{{z= {{z{{{{{{{{zz{{{{zz{{z{{{z{{{zzz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{{z{= {{z{{{z{{zz{zz{{zz{zz{{z{{z{{{z{{zz{{{z{zz{zz{{{{{{{z{{{{zz{{{z{z{{{{z{{z= {{z{{zz{zz{{z{{{z{{{{{zz{zz{{z{{{{{{{{z{{{{{z{{z{{z{z{z{zz{z{z{{{{zz{{z{{= {zz{zz{{{{{{{z{{{z{{{z{{zz{{z{{z{{{{{{z{{z{{z{{{{zz{{zz{{{zz{{{zz{{zz{{zz= {{{zz{{{zz{{{{zz{{{{{{{{{{{z{{z{{z{{{z{{{z{{zz{{z{{z{{{{z{{{z{{{{{{{{{{{{= {{{{{{{zz{{{zz{{{{z{{{z{{zz{{z{{z{{{{{{{z{{{{{{{zz{zz{{{{{z{{z{{z{{zz{{zz= {{{z{{{{z{{z{{z{{{{{z{{{zz{{{z{zz{{{z{zz{zz{{z{{zz{{zz{{z{{zz{{{z{z{{zz{{= z{{{{{{{{{z{{{{z{{{zz{zz{{{{z{{{z{{{{{{{zz{zz{{zz{zz{{zz{{{z{z{{z{{{{{z{{= {z{{{z{{z{{z{{z{{{{{z{{{z{{{z{{zz{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{{{= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{= {{{{{{{{{{{{{{{{{{{{zzz{z{{{zzz{zzz{zzz{{zzz{{{{zzz{zzzzzzzzzzz{{zzzz{{{z= zz{z{{{{{{z{{{{{zzzz{zzz{{{zzz{{zzz{{zzz{{zzz{zzz{{{{{zzz{{zzzz{{{{{zzz{{= {zzz{z{{{z{{{z{zz{{z{{{{{zzz{{{{z{{z{{{{{{{{{zzzzz{zzz{{zzz{z{{zz{{{zzz{z= zz{{{{zzz{{zz{{zzzzzzzzzzzz{{zz{{zzzz{zzzzzzzz{{{{{{{{{{{{zzz{{zzz{zzz{zz= z{{zzz{zzzz{{{{zz{z{{{{{{{{{{{{{{{{{{{{z{{{z{{{{zzz{zzz{{zzz{z{{zz{{{{zzz= {{{{{{{zzz{z{{{zzzzzzzzz{{zz{{zzzz{{{{zzz{zzz{{{{{zzzz{{zzzz{{{zzzz{{{zzz= {z{zzzz{{{{zzz{z{{zzzz{zzz{{zz{z{{{{{{{{zzz{{zzz{{{zzz{{{{{z{{{z{{{{{{{{z= zz{z{{zzz{{{{zzzz{{zzz{{{{{{{zzzzz{zzzzzz{zzz{{{{{zzz{zzz{zzz{{zzzz{{zzz{= {{zzz{{{{zzz{z{{zzzz{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{zzz{zzzz= zzzz{{{{{{zzz{zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{zzz{zzzzzzzz{{{{{{zzz{zzzzzzzz{= {{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zz{{{{{zzz{{{zz{{{zz{{{{{zzz{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z= zz{{{zz{{{zz{{{{{zzz{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{z{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{z{zz{{{zz{{zzzz{{{z{zz{= {{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{zzzz{{{z{zz{{{zz{{zzzz{{{z{zz{{{zz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}= }{{{{{{{{{{{{{{{{{{{{{z{{{zzz{{{{zzz{{{z{{zz{{{{zzzz{{zzz{{{{{zzz{zzz{{zz= z{{zz{{zz{{{{{{{zz{{zz{{{zzz{zz{zz{zz{{{{zzzz{{{{{{zzz{{zz{zzzz{z{zz{{{{z= zz{{z{zzz{{{{{{zzz{zzz{{zzz{{zz{{zz{z{zzz{{{{{zzz{{zzz{zzz{zzzzz{zz{{{{{{= {z{zz{{z{zz{{{zz{{{z{zz{{z{zz{{{zz{{{z{{{{{{{{{{{{{zzzz{{{zzz{{zz{zz{zzz{= {zz{zz{{{z{zz{{{zzz{{zz{zz{{zzzz{{{zz{zz{zzz{{{{zzz{{zz{{z{{{{z{zzz{{zzz{= {{{zzz{{{{zzzz{{{zzz{{z{zzz{{zzz{{{{{{{{{zzz{{z{zzz{{{{{{{{zzz{{{z{{{zzzz= {{{zzz{{z{zzz{{{{{{zz{zz{{{{zzz{{zz{zz{{{{{{{{{{{{{z{zz{{z{zz{{{zz{{{z{zz= {{z{zz{{{zz{{{z{{{{{z{zzz{{zzz{{{{zzz{{{{zzzz{{{zzz{{z{zzz{{zzz{{{{{z{{{{= {{{{{{{z{z{{{{z{zzz{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{zz{zz{{zz{zz{{z{{z{= {{{{{z{{{zz{zz{{{{{z{{{z{{zz{zz{{z{{{z{{{{{{{{z{{{z{{z{{z{{z{{zz{zz{{zz{z= {{{{{{z{{{z{{z{{z{{{zz{zz{{z{{{z{{zz{z{{{{{{{z{{{z{{zz{zz{{z{{{z{{zz{z{{{= {zz{zz{{z{{{z{{{z{{zz{zz{{{{{{z{zz{{z{zz{{{zz{{{z{zz{{z{zz{{{zzzzzz{{{{{{= {{{{{{zz{{z{{zz{zz{{zz{zzz{zz{{zz{zz{{z{{z{{zz{{z{{zz{zz{{z{{{{{{zz{zzz{z= z{{zz{{z{{z{{z{{{{{zz{z{z{{{z{{zz{{z{{zz{{z{{z{{{z{{zz{z{z{{z{{{{{{{{zz{z= z{{zz{z{{{{{{{zz{zz{{z{{zz{{z{{z{{{z{{zz{z{{{{{{{zz{zz{{zz{zz{{zz{zz{{{{{= {{{{{{{z{zz{{z{zz{{{zz{{{z{zz{{z{zz{{{zzzzzz{{{{{{zz{z{z{{{z{{zz{{z{{zz{{= z{{z{{{z{{zz{z{z{{z{{{{z{{{{{{{{{{{z{{{z{{{{zz{z{z{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{z{{z{{{z{{z{{{z{{zzz{{{{{{{z{{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{z{{{{= {{{{z{{{z{{zz{{{{z{{z{{{z{{z{{{z{{{{{zzzzz{{z{{z{{{z{{{z{{zzzzz{{z{{{{{{{= {{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{{z{{{z{{z{{{z{{{z{{z{{{z{{{{{zz{zz{z{{zz{{= {zz{{zz{zz{z{{zz{{{zz{{z{{{{{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{z= {{{{{zz{{z{{{z{{z{{{{{{z{{{z{{{z{{{{{zz{{z{{z{{{{{z{{{{zzzzz{{{{{zz{{z{{{= z{{zzzzz{{z{{{{zz{{{{{{{{{{z{{{z{{z{{{{{{{{{{z{{{z{{z{{z{{{z{{zzzzz{{z{{{= {{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{zz{zz{z{{zz{{{zz{{zz{zz{z{{zz{{{zz{{= z{{{{{{{z{{{{zzzzz{{{{{zz{{z{{{z{{zzzzz{{z{{{{zz{{{{{z{{{{{{{{{{{{z{{{z{{= {{z{{{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{{z{{z{z{{{{{{{z{{{z{= {{z{{{{{{z{z{{{z{{{z{{z{{{z{{{{{{{{z{{{z{{{zz{{{z{{z{{{z{{zz{{z{{{{{z{{{{= {{z{{z{{{z{{{z{{z{{{{{{z{{{{{{{{{{{z{z{{{z{{{z{{z{{{z{{z{{{{{{{z{{{z{{{z{= {z{{z{{{z{{{z{{{{{z{{zzz{{zz{{{zz{{{z{{zzz{{zz{{{zzz{{{{{{{zzzzzzz{{z{{{{= {{z{{{z{{z{{{z{{{z{{z{{{z{{z{{z{{{zz{z{{z{{{z{{z{{{{{{z{{{z{{{z{{{zz{z{{z= {{z{{{{{z{{{{z{{{{{{{zz{z{{z{{{z{{z{{{{{{z{{{{{zz{{{{{{{{{z{{{z{{z{{{{{{{= {{{z{{{z{{z{{z{{{z{{z{{{{{{z{{{{{{{{{{z{{{z{{z{{{z{{z{{{z{{zzzzzzz{{z{{zz= z{{zz{{{zz{{{z{{zzz{{zz{{{zzz{{{{{{{{{{z{{{{z{{{{{{{zz{z{{z{{{z{{z{{{{{{z= {{{{{zz{{{{z{{{{{{{{{{{{zzzzz{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{= {z{{{z{{z{{{z{{z{{z{{{{{{z{{{z{{{z{{{{{{z{z{{{z{{{z{{z{{{z{{{{{{{{z{{{z{{= {{zz{{z{{z{{{z{{{zzz{{{{{{z{{{{{{z{{z{{{z{{{z{{z{{{{{{z{{{{{{{{{{{z{z{{{z= {{{z{{z{{{z{{z{{{{{{{z{{{z{{{zzz{zzz{{{z{{{z{{{{{z{{zzz{{zz{{{zz{{{z{{zzz= {{zz{{{zz{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{z{{z{{{z{{z{= {{z{{z{{{{{{z{{{z{{{z{{z{{{z{{z{{z{{{{{z{{{{z{{{{{{z{{{z{{z{{{z{{z{{{{{{z= {{{{{{zz{{{{{{{{z{{{z{{z{{{{{{{{{{z{{{z{{z{{z{{{z{{z{{{{{{z{{{{{{{{{{z{{{= z{{z{{{z{{z{{{z{{{{{{{{{{{z{{zzz{{zz{{{zz{{{z{{zzz{{zz{{{zz{{{{{{{{{{{z{{= {{z{{{{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{zz{{{{{{{{{{{{{{{z{{{{{z{{{z{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{zz{zz{{zz{zz{{z{{zz{{{{{z{{{zz{zz{{{{{{{z= {{{{zz{zz{{zz{zz{{z{{{{{zz{zz{{z{{z{{z{{z{{{z{{{z{{{{{{{{zz{{{z{z{{z{{{z{= {{z{{zz{{{z{z{{{{{{{{{{{{z{{{{zz{zz{{zz{zz{{z{{{{{{{zz{zz{{{{z{{{z{{{{z{{= {z{{{{zz{{zz{{{zz{{{zz{{zz{{zz{{{zz{{{zz{{{{zz{{{{{{{{{{{zz{{{z{zz{zz{{z{= {{z{{{z{{zz{zz{{z{{z{{zz{{z{{z{{{z{{z{{{{{{z{{{z{{{z{{zz{{z{{z{{z{{{{{z{{= {{zz{{{z{zz{{z{{zz{zz{{zz{{{z{z{{{{z{{z{{z{{{{{zz{zz{{z{{{{{{{{{{zz{zz{{z= {{zz{zz{{zz{{{z{z{{{{{{{{{{z{{{z{{zz{zz{{z{{{z{{{{{{{{{{zz{{zz{{{zz{{{zz{= {zz{{zz{{{zz{{{zz{{{{zz{{{{{z{{{{zz{{{z{zz{{z{{zz{zz{{zz{{{z{z{{{{z{{z{{{= z{{{{{{{{{{{z{{{{{z{{{z{{{{zz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{zzz{{zzz{{{{zz= z{{zzz{{zz{{{{{zz{{zzz{{{{{{{zz{{{{{zzz{{{{zz{zz{z{{{{{{zz{zz{zzz{{zzzzzz= {zzz{{zzzz{{{{{{zzzz{zzz{{zzzzz{zzz{{zzzz{zzz{{{{{{{{{{zz{{{{{zzz{{{{zz{z= zzzz{{{{{{{zzz{{{{{z{{{z{{{zzz{zzz{{zzz{{zz{{zzzzzzzzzzzz{{zz{{zzzz{zzzzz= zzz{{{{{{{{{{{{{zzzz{{{zzz{{zzz{zzz{zzz{z{zz{{zzzzzz{{zzz{zzzz{zzz{{zz{{{= zzz{zzz{zzz{{zzz{zzzzzzz{{{zzz{{{{zzzz{{{zzz{z{{zzz{z{{zzzz{zzz{{{zzz{{{z= {{{{{{zzz{{zzz{{{{{{{{{{zzz{{zzz{{zzz{z{{zzzz{zzz{{{{{{{{zzz{zzz{{zzz{{zz= z{zzz{{{{{{{{zzz{{zz{{zzzzzzzzzzzz{{zz{{zzzz{zzzzzzzz{{{{{zzz{{{{zzzz{{{z= zz{z{{zzz{z{{zzzz{zzz{{{zzz{{{{z{{{{{{{{{{zzz{{{zzz{zzz{{{{zzzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{= {{z{{{{{{{{zz{{{{{{{{{zzz{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zz{{{{{zz{{{{z= z{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{zz{{zz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{z{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{z{{z{{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{z{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{= {z{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{z{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{z{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{zzzz{z{zz{{= {{zzz{{z{zzz{{zzz{{{{{zzzz{z{zz{{zz{zz{zz{{{{zzzz{{{zzz{{{{zzz{zzz{{zzz{{= zz{{zz{{{{zzzz{z{zz{{zz{zz{zz{{{z{{zz{{{{{{z{{{{{{{{{{zzz{{z{zz{{{{zzz{{z= z{{zz{{z{{{zzzz{{{{{z{zz{{{{zzz{{{{{{{zzzz{{{zzz{{zz{zz{zz{{{{zzzz{{{{{{z= zzz{zz{zzzzzzzz{{zzz{{z{zzz{{zzz{{zz{zz{{zzzz{z{zzz{zzz{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{z{{{zz{zz{{z{{{z{{zz{z{z{{{z{{{{{z{{{zz{zz{{z{{zz{zz= {{zz{z{{{z{{z{{{{{z{{{z{{zz{zz{{z{{{z{{{{{z{{{zz{zz{{z{{zz{zz{{z{{z{{{{{{= {z{{{{{{{{{z{{z{{zz{zz{{zz{zz{{z{{{z{{z{{zz{{z{{{{{zz{zz{{z{{{z{{{{{zz{{z= {{zz{zz{{z{{zz{zz{{zz{z{{{{{{zz{{z{{z{{z{{{z{{{z{{{z{{zz{z{z{{{z{{zz{zz{{= z{{{z{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{zzzzz{{z{{{= {zzzzz{{{{{z{{{z{{{z{{z{{z{{{z{{z{{{z{{zz{{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{z= {{{z{{{z{{z{{z{{{z{{zzz{{{{{{{{z{{{{{{{{{zz{{{{z{{{z{{z{{{z{{z{{{z{{z{{z{= {{z{{{{{z{{{z{{zzzzz{{{{{z{{{z{{z{{{z{{z{{z{{{z{{z{{{z{{{{{z{{{z{{z{{z{{{= z{{{zzzzz{{z{{{{zzzzz{{z{{{z{{z{{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{z{{{z{{{z{{z{{{{{{z{{{{z{{{{{{{{{z{{{z{{{z{{z{{z{{{z{{zz{{z{{{zz= {{{{{{{z{z{{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{z{{{z{{z{z{{{{{{{{z{{{{{{{{{{= zz{{{z{{{z{{z{{{z{{z{{{z{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{= z{{{z{{zz{{z{{{{{z{{{z{{z{{z{{{z{{{z{{{{{{z{{{{z{{{{{{z{{{z{{z{{{z{{{z{z{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{{{{{z{{{{z{{{{{{{{{= z{{{z{{{z{{z{{z{{{z{{{zzz{{{{{zz{{{{{{z{z{{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z= {{z{{{z{{z{{z{{{{{{{z{{{{{{{{{{{zz{{z{{{z{{z{{{z{{z{{{z{{z{{z{{{z{{{{{z{{= {z{{z{{{{{{{{{z{{{z{{z{{{z{{z{{z{{{z{{{zzz{{{{{{z{{{z{{z{{z{{{z{{{z{{{{{{= z{{{{z{{{{{{z{{{z{{z{{{z{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{= z{{{z{{zz{{{z{z{{{{zz{{{z{{{{z{{{z{{{z{{z{{z{{{z{{{z{{{{{z{{z{{{{{{{z{{{{= zz{zz{{zz{zz{{{{{z{{{z{{{z{{z{{z{{{z{{z{{zz{{{{{{z{{{{{{{{{z{{z{{z{{{z{{z= z{zz{{zz{zz{{z{{zz{zz{{{{{z{{zz{{zz{{{z{{{{zz{zz{{zz{zz{{z{{z{{{z{{{z{{{{= {{{{zz{zz{{z{{z{{{z{{{zz{{{z{z{{{{zz{{{z{z{{{z{{z{{{z{{{{z{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{zzzzz{zzz{{zzzz{zzz{{{{zzzz{{{{{{zzzzz{zzzzzz= zzz{zzz{{zzzz{{zzz{{{{{{{zz{{{{{zzz{{{{zz{zz{{{{{zzzzz{zzzzzzzzz{zzzzzz{{= zz{{{{zzz{{{{{{{{zzz{{zzz{zzz{{zzz{{{{zz{zzzzz{{zzz{z{{{{zzzz{{{{zzzz{{{{= {{zzz{z{{zzz{{zzzzzz{zzz{{zzzz{{{{{{zzz{zzzzzzzzzzzz{{zzzz{zzz{{{{zzzz{zz= z{zzz{{zzzzz{{zz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4= =88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{= zz{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8= =04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{z{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{zz{{{{{= {{{{{{{{{{{{{{{{{zz{{{{{zz{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{z{{{{{{{{{= {{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{z= zz{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{z{{{{{{{{= {{{{{zz{{{{zz{{z{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{z{z{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{z{{{{{{z{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{z{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{z{z{{{{{{{{{zzz{zz{zz{{{{zzz{{{{zzzz{zz{{{zzz{{{z{{{{zz{zz{{{{zzz{{= zzzz{{zzz{{{{{zzzz{{zzz{{{{{zz{zz{{{{zzz{{{{zzz{{zz{zz{{{z{{{zzz{{{{{z{zz= z{{zzz{{{{zzz{{{{zzzz{zz{zz{zz{{{{zzzz{{{{zzzz{z{zz{{zz{{{zzz{{{{{{{zz{zz= {zzz{{{{zzz{{{{zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{{zz{{zz{{{zzz{zz{zz{zz{{{= {zzzz{{{{zzzz{z{zz{{{{zzz{{{{{{{zzz{{{z{{{zzzz{{{{{{z{{{{{{{{{{{{{{{z{{{{= {z{{{{{{{{{{{z{{{{{zzz{zzz{{zzz{{z{zzz{{zzz{zz{{{zzz{{zz{zz{{{{{{{zzz{{zz= zz{{{{{{{z{z{{{{zz{zz{{{{zzzz{z{zzz{{zzz{{zzz{zzz{zzz{z{{{{{{{{{{zz{{z{{{= {zzz{{{{zzz{{{{{{{{{z{{{{{{{{{z{{zz{zz{zz{{{{zzz{{zzz{zzz{zzz{{{zzzz{z{zz= {{zz{{{zzz{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{{{{{{z{{z{{zz{zz{{z{{{z{{zz{{z= {{z{{zz{{z{{z{{{{{zz{zz{{zz{zz{{z{{{z{{{z{{{{{z{{{zz{zz{{{{{zz{zz{{z{{{z{= {zz{zz{{zz{zz{{z{{z{{{z{{{{{zz{z{z{{{z{{zz{{z{{zz{{z{{z{{zz{zz{{zz{z{{{{{= {z{{{zz{zz{{z{{z{{z{{{{{{{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{{zz{{z{{zz{z{{{z{= {{z{{{{{z{{{z{{z{{z{{z{{zz{zz{{zz{z{{{{{{z{{{zz{zz{{z{{{z{{{{{zz{zz{{z{{z= z{{z{{{{{z{{{zzzz{{zz{zz{{zzz{{{z{zz{{{zz{{{{z{{{{{z{{{z{{z{{{z{{zz{z{z{{= z{{z{{zz{zz{{zz{zz{{{{{zz{zz{{z{{{{{{{{z{{{z{{{{zz{zz{{zz{{z{{zz{z{z{{{z{= {z{{{z{{{z{{z{{{{{{{{{{{z{z{{{{z{{{z{{z{{z{{{{{{{{{z{{{{{{{{{z{{z{{{zz{zz= {{zz{zz{{z{{{z{{{z{{{{{z{{{zz{zz{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{= {{{{{{zz{{{{z{{{z{{zzzzz{{z{{{{{{z{{{{{zz{{z{{{{{z{{{z{{z{{{z{{z{{{zzzzz{= {{{{z{{{z{{{z{{{{{z{{{z{{zzzzz{{z{{{z{{z{{{z{{z{{zzzzz{{{{{z{{{{zzzzz{{{{= {zz{{z{{{z{{z{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{zz{{{{{{{{{{z{{{z{{{z{{zzzz= z{{zz{{{{zz{{{{{{{zz{{z{{{z{{zzzzz{{{{{z{{{z{{zz{{{{z{{z{{{z{{z{{{z{{{{{z= {{{z{{{z{{zzzzz{{{{{z{{{z{{z{{z{{{z{{{{{z{{{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z= {{{z{{{{{z{{{z{{zzzzz{{z{{{{zz{{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{z{{= {z{{{{z{{{z{{z{{{z{{z{{{{zzzzz{{z{{{z{{{z{{{{{{{{{{{{{{{z{{{{{zzzzz{{zz{{= {{{{{{{{{z{{{{{{{{{zzz{{{{z{{{z{{z{{{z{{z{{{z{{{z{{{{{z{{{z{{{z{{z{{zz{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{z{{{{{{zzzzz{{{{{{{{zz{{{z{{{z{{z{{{{{{z{{{{{{z{{{zz{z{= {z{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{z{{{z{{{z{{{{{z{{{z{{z{{{{{{z{{{z{{z{{= {z{{z{{z{{{{{{{{{z{{{{z{{{{{{{zz{z{{z{{{z{{z{{z{{{z{{zz{{z{{{{{z{{{z{{{z{= {z{{{zz{{{{{{{{{z{{{z{{{z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{{{z{{= {z{{{zz{{{z{{z{{{z{{zz{{z{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{z{{{z{{{{{z{= {{{z{{z{{z{{z{{z{{z{{z{{z{{z{{{{{{z{{{{{{z{z{{{z{{{{{{z{{{{{zz{{{z{{z{{{z= {{z{{{z{{{{{z{{{z{{z{{{{{{{{zzzzz{{{{z{{{z{{z{{{z{{z{{{{z{{{{{{{z{{z{{z{{= {{{{{{{{{{{{{{z{{{{{z{{{{{{{zz{{{{{{{{{{z{{{{{{{{{z{z{{{{z{{{z{{z{{{z{{{z= {{z{{z{{{{{{z{{{z{{{z{{z{{{zz{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{z{{{{{{{{zz{{= z{{{z{{z{{{{{{z{{{{{{z{{z{{{z{{z{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{z{{{z{{{= z{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{z{{{{{{{{{z{{{{z{{{{{{z{{{z{{z{{{z{{= z{{z{{{z{{{zzz{{{{{{z{{{z{{{z{{z{{{{zz{{{{{{{{z{{{z{{{z{{z{{{{{{{{zz{{{{z= z{{z{{{z{{{zzz{{{z{{{{{{{{{z{{{z{{{{zz{{z{{z{{{z{{{zzz{{{{{{z{{{z{{{z{{z{= {{{{{{{{z{{{z{{z{{z{{{z{{{{{z{{{{z{{z{{z{{z{{z{{z{{z{{z{{z{{{{{{z{{{{{{z{= z{{{z{{{{{{z{{{{{{zz{{z{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{z{{{{{z{{{z{{{z{= {z{{{z{{z{{{{z{{{{{{{zzz{zzz{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{zz{{{{{{{{{z{{= {{{{{{{z{{z{{{z{{{z{{z{{{z{{{zzz{zzz{{{{{{z{{{z{{{z{{z{{{{zz{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{z{{{{{z{{{{{z{{{{{{z{{z{{zz{zz{{zz{{{z{zz{{{z{z{{zz{{z{{z{{{{{z{{{z{{= zz{zz{{z{{{zz{{{z{{{{z{{{zz{zz{{{{{zz{zz{{zz{{{z{zz{zz{{zz{zz{{z{{zz{{{z{= {{{z{{{{zz{{{z{zz{{z{{zz{zz{{z{{z{{{z{{{z{{{{{{{{z{{{z{{{z{{z{{z{{z{{{{{{= {{z{{{z{{{z{{zz{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{{{{zz{zz{{z{{z{{z{{z= {{{z{{{z{{{{{{{{z{{{z{{{z{{zz{{{z{{{{zz{zz{{z{{zz{zz{{{{{z{{{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{{z{{{{{{{z{{{{zz{{{z{z{{{{z{{z{{z{{zz{zz{{z{{{z{{{{{zz= {zz{{z{{{{{{{z{{{{{z{{{z{{{z{{zz{zz{{z{{{{zz{{{z{{{z{{{z{{{{z{{{{{{{{{{{{= z{{{{{zz{{{z{z{{z{{z{{{{{{z{{{{{{{{{z{{zz{{z{{{z{{zz{zz{{{{z{{{z{{{{{{{z{= {{z{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{zzz{{{zzz{{{{{zzz{{{z{zz{{{{zzzz{= {{zzzz{zzz{{zzz{zzzz{{{zzz{zzz{{zzz{{{{zz{{zzzz{{{{{{zz{{zzz{{{{{{z{zz{{{= {zzzz{{{zzz{{{z{zz{{zzz{{zzzz{{{{zzz{{{{zzzz{{{zzz{z{{zzz{zzzzzzz{zzz{{zz= zz{{{{{{zzzzz{zzzzzz{zzz{{{{{{{{zzz{zzz{zzz{{zzzz{{zzz{{{zzz{{{{zzz{z{{zz= zz{{{zzzz{{{{{{zz{zz{zzz{{zzzzzz{zzz{{zzzz{{{{{{zzzzz{zzz{{zzzz{{{{{{zzz{= {zzz{{zzz{z{{{{{z{{{zzz{{{{zz{z{zzz{{zzzzzz{{zz{{{z{{{{{{{{z{{{{{zzzz{zzz= {{{zzz{{zzz{{zzz{{zzz{zzz{{{{{zzz{{zzzz{{{{zzz{{{zzz{zzz{zzz{{zzz{zzzz{{{= {zzzz{{{{z{{{z{{{{z{{{{{{{{{{{zzz{{{{{zzzz{{zzz{{{z{{{{{zzz{{{{{{{zzz{{zz= zzz{zzz{{zzz{{{{{z{{{z{{{{{{{{zzzzz{zzzzzz{zzz{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{= {{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{{{{{{= {{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{zz{zz{{{{zz{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{zz{{{{= {{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{z{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z= z{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{{{{z{{{{{= {{{{{{{{{{{z{z{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{z{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~= ~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{zzzz{{{zzz{{{{zzz{{{{zzz{zz{zz{{{{= {{zzzz{{{{z{{{zzz{{{{zzz{{{z{{zz{{{{{{zzz{{{zzz{{{{{{{zzzz{{{zzz{{{{zzz{{= {{zzzz{{{{zzzz{{zzz{{{{{zzz{zzz{{zzz{{zz{{zz{{{{{{{{{{{{z{{{z{{{zzz{{zzzz= {{zzzz{{z{zz{{{{zzz{{{{zzz{{{{zzz{zzz{zzzzz{{z{{z{{{{{z{zz{{{{zzz{{{{{zzz= z{{zzz{{z{zzzzzzz{z{zz{{{{zzzz{{{zzz{{zz{zz{zzz{{zz{zz{zz{{{{zzzz{{{{{{{{= {{{{{{z{{{{{z{zz{{{{zzz{{zz{zz{{{z{{zz{{{{{{{zzz{zzz{{zzz{{zz{{zz{{{{zzzz= {{zzz{{z{zzz{{{zzz{zzz{{zzz{{zz{{zz{z{zzz{{{zz{zz{{{{zzz{{zzzzzz{{{zzz{{z= z{zz{{{{zzzz{{{zzz{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zz{{= z{{zz{zz{{z{{{z{{z{{z{{zz{zz{{{{{{z{{{{{{z{{zz{zz{{zz{zz{{z{{z{{{{{{z{{z{= {zz{zz{{{{{zz{z{{{zz{zz{{zz{zz{{zz{{z{{{{{z{{{zz{zz{{{{{z{{{z{{zz{zz{{z{{= {z{{{{{{{{{{{{z{{zz{{zz{{z{{z{{{zz{{z{{zz{zz{{z{{{z{{z{{z{{{{{z{{{z{{{z{{= z{{z{{z{{{{{zz{zz{{z{{{z{{{{{z{{{zz{zz{{zz{z{z{{{zz{zz{{zz{{z{{zz{zz{{zz{= zzz{zz{{z{{zz{zz{{zz{z{{{{{{{{{{{{{{{z{{{{{zz{zz{{zz{{z{{zz{zz{{z{{z{{{{{= {{{{z{{{z{{zz{zz{{z{{{z{{{{{z{{{zz{zz{{zz{z{{{{z{{{z{{zz{zz{{z{{{z{{zz{z{= {{{zz{zz{{zz{{z{{z{{{z{{z{{{z{{zz{zz{{zz{{z{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{{z{{zzzzz{{zz{{{{z{{{z{{{{{{z{{{{{{z= {{z{{{z{{z{{{z{{zzz{{{{{{{zz{{{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{{{= z{{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{{zzzz{{{{{{zz{{z{{{z{{{{{{z{{= {z{{zzzzz{{zz{{{{{{{z{{{z{{{z{{z{{z{{z{{{{{z{{{z{{zzzzz{{{{{z{{{z{{{z{{z{= {{{z{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{{z{{z{{z{{{z{{z{{{z{{{{{{{{{{{{{{z{{{{= {z{{{z{{{{{zz{{z{{{z{{zzz{{{{{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{= {{{{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{{z{{{z{{{{{zz{{z{{{z{{zzzzz{{z{{{z{{z{{{= {{{zzzzz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4= =1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{{z{{z{= {{{{{{zz{{{z{{{z{{{{{{z{{{{{{z{{z{{{z{{z{{{z{{z{z{{{{{{{{zz{{{z{{{z{{{{{z= z{{z{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{{{{{z{z{{{z{{{z{{z{{{z{{{{{{{{{{= {{z{{{{{{{zz{z{{z{{{z{{{{{{z{{{z{{z{{{{{{{zz{{{{{{{z{{z{{z{{{z{{z{{z{{{{{= z{{{z{{z{{{{{{{{{z{{{z{{{z{{z{{{{z{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{{z{{z{{z= {{{z{{zz{{z{{{{{{{{{{{{{{z{{{{{z{{{z{{{zz{z{{z{{{z{{z{z{{{{{{{{{{{z{z{{{z= {{{z{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{z{z{{{z{{{z{{z{{{z{{z{{{{{{{z{{{z{{{z= z{z{{z{{{z{{z{{{{{{z{{{z{{z{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{z{{{z{{z{{{z{{z{{{{{{{{zz{{z{{{z{{{{{{z{{{{{{z{{z{{{z{{z{{= {z{{z{{z{{{{{{{{zz{{z{{{z{{{{{{zzz{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{{= {{{z{z{{{z{{{z{{z{{{z{{{{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{{{{z{{{z{{z{{{{{{{= {zz{{{{{{zzz{zzz{{{z{{z{{z{{{{{z{{{z{{z{{{{{{{{{z{{{z{{{z{{z{{{{z{{{z{{{z= {{z{{{{{{z{{{z{{z{{{z{{{z{{z{{z{{{z{{{zzz{{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{= z{{z{{{z{{z{{z{{{{{{{{{{z{z{{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{z{z{{{= z{{{z{{z{{{z{{z{{{{{{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{z{{{{{{z{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{zz{zz{{zz{zz{{zz{{{z{z{{z{{= z{{{z{{{{{{z{{{{{{z{{zz{zz{{zz{zz{{z{{zz{{{{{z{{z{{zz{zz{{{{{{z{{{{{zz{zz= {{zz{zz{{zz{zz{{{{{z{{{zz{zz{{{{{{{z{{{{zz{zz{{zz{zz{{z{{{{{{{{{z{{{{{{zz= {{z{{z{{{zz{{{z{z{{{z{{zz{{{z{z{{z{{{{{{{z{{{z{{{{z{{z{{z{{{{{z{{zz{{zz{{= {z{{{{z{{{zz{zz{{z{{{{z{{{z{{{z{{zz{{{z{zz{zz{{z{{{z{{{z{{z{{z{{{z{{{z{{{= {{z{{{{{{{{{{{z{{{{{z{{{z{{zz{{z{{z{{{z{{z{{zz{{{{{{{{{{z{{{{zz{zz{{zz{zz= {{{{{z{{{zz{zz{{z{{{{{{{{{z{{{{zz{zz{{zz{zz{{z{{{{{{{zz{zz{{zz{{z{{z{{{z{= {zz{{{z{z{{{z{{zz{{{z{zz{{{z{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{zzz{z{{zzz{{{{zzzz{{zzz{{zzz{zzz{{{{{{zz{{{zzz{{zzz{{{{zzz{{zzz{{zz{= {{{zzz{{{{zzz{{{{{{{zzzz{{{zzz{{{{zzz{{{{zzz{z{{{{{zz{{zzz{{{{{{{zz{{{{{z= zz{{{{zz{zz{z{{{{{{{{zzz{{{{{{zzz{z{{zz{{zzzz{zzz{zzz{{zzzz{{zzz{{{{{{{{z= {{{z{{{zzzzzzzzz{{{{zzzz{{{{zzzz{{{{zzzz{{zzz{{zzz{{{{zzzzz{zzz{{zzzz{{{z= zz{{zzz{zzz{zzzzzzzzz{zzz{{zzzz{{z{{{{{{{{{{zzz{{{zzz{zzz{{zzz{zzzz{zzzzz= z{{zz{{{{{{{{zz{{{{{zzz{{{{zz{zz{{{zzzz{{zzz{{zzz{{{{{{{zz{{{{{zzz{{{{zz{= zzzzz{{{{{{z{zz{{{{zzz{z{{zzzzz{{zzzz{zzz{zzz{{zzzz{{{zzzz{{z{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {zz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~= ~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF= =FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}= }~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{zzzzzzz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zz{{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{z{zz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{zz{{{{{{z{{{{{{{{zz{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= zz{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{zz{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{{{{{zz{{{{{{{{{{{zz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{z{{{{z{{{z{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z= {z{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{z{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{z{z= {z{{{{{{{{{{{{{z{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{z{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{= {{{{{{{{{{{{{{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {z{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{z{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{zz{{{{zzz{{{{{z= {zzz{{zzz{{{{zzz{zzzz{{{{{zzz{{zzzz{{{zzzz{z{zz{{zz{{{zzz{{{{zz{zz{zzz{{{= {zzz{{{{zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{{zz{{{zzz{{{{zz{zz{zzz{{zzz{zzz{= {{{{zzz{zz{{{zzzz{zz{zz{{{{zzz{{zzzzzz{{zz{z{zzz{{zzz{{{{{zzzzzz{{z{{{zzz= {{{{{{{{{{{zzz{zzz{zzz{z{zz{{zz{{{zzzz{{z{zz{{{{{zz{{{zzz{{{{zz{zz{{{{zzz= {{zzz{zzz{zzz{{{zzzz{{zzz{{z{zzz{{{zzzz{z{zz{{{{zzz{{{{{zzzzzz{z{zzz{{zzz= {zzzz{{{zzzzzz{zz{zz{zzz{{{{zzz{{{{{z{zzz{{zzz{{{{zzz{{{{zzzz{{{zzz{{{z{z= z{{{z{{{zzz{{{{{{z{zz{{zzz{zzz{{{zz{zz{{{{zzz{{zz{zz{{{{{{{{{{{{{{{z{z{{{= {zz{zz{{{{zzzz{z{zzz{{zzz{{zzz{zzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{zz{zz{{z{{{z{{{{{zz{z{z{{{z{{z{{z{{z{{{{{{zz{zz{{z{{{{{{z{{= {zz{zz{{z{{z{{z{{{{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{{zz{{z{{zz{z{{{z{{{z{{{{= {z{{z{{z{{{{{zz{zzz{zz{{z{{{z{{{{{z{{z{{z{{zz{z{{{zz{zz{{zz{{z{{z{{{z{{{z= {{zz{z{z{{{z{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{{z{{{z{{{z{{zz{zz{{z{{zz{{z{{zz= {zz{{{{{z{{z{{z{{{{{zz{zz{{zz{zz{{z{{{z{{{z{{{{{z{{{zz{zz{{zz{z{{{{z{{{zz= {zz{{z{{{z{{{{{z{{{z{{zz{z{z{{z{{z{{{{{{z{{{z{{zz{zzz{zz{{z{{{z{{{{{zz{z{= z{{{z{{zz{{z{{zz{{z{{zz{{z{{zz{zz{{z{{z{{{z{{{{{zz{zz{{z{{{z{{{{{zz{zz{{z= z{zz{{zz{zz{{{{{{{{{{{{{z{{{z{{{{zz{zz{{zz{{z{{zz{z{z{{{z{{z{{{z{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~~= ~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{zzzzz{{{{{z{{{{zzzzz{= {zz{{{{z{{{{{{z{{{z{{z{{{{{{z{{{z{{{z{{z{{zz{{{{{{{z{{{z{{{z{{zzzzz{{zz{{= {{zz{{{{{{{zz{{z{{{z{{zzzzz{{{{{z{{zz{{{{{{{z{{{z{{{z{{z{{{z{{{{{zz{{{{z{= {z{{{z{{z{{{z{{{{{zz{{z{{{z{{{z{{z{{{{zzzzz{{{{{z{{{z{{z{{zzzzz{{{{{{{{{{= {z{{{z{{{z{{z{{{z{{z{{z{{{{{{z{{{z{{{{{z{{zz{{{{{{{z{{{z{{z{{{z{{z{{{z{{{= z{{{{{z{{{z{{{z{{z{{{{{{{z{{{z{{{z{{zzzzz{{{{{z{{{z{{z{{{{zz{{{{z{{{{{{z{= {{z{{z{{{z{{{z{{zzzzz{{{{{z{{{{zzzzz{{{{{zz{{z{{{z{{{{{zz{{z{{{z{{z{{zzzz= z{{{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{{{z{{{z{{{{z{{{z{{z{= {{z{{z{{{{zzzzz{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{z{{{z{{z{{{{{{{{{z{{{{z{{{{{{{zz{{{z{{{{{{z{{{z{{z{{{{{{z{{{z{{{z{{z{{= {zz{{{{{{z{{{z{{{z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{{{z{{{zz{{{{= {{z{{{z{{{z{{{z{z{{{{{{{zz{{{z{{zz{{z{{z{{{z{{{zz{z{{z{{{z{{{z{{z{{{{z{{{= {{{{{{z{{{z{{z{{z{{{{{{{{{{{{{{{{z{{z{{z{{{z{{{z{{z{{z{{{{{{z{{{z{{{{{z{{= {zz{{{{{{z{{{z{{z{{{z{{{z{{z{{z{{{{{{z{{{z{{{z{{z{{{{{{{z{{{z{{{z{{z{{{{{= {{{{z{{{z{{z{{{{{zz{{{z{{{{{{z{{{z{{z{{{z{{{z{{z{{{{{{{{{z{{{{z{{{{{{{zz{= z{{z{{{z{{{zz{z{{z{{{z{{z{{z{{{{{{{{{z{{{z{{{z{z{{{{{{z{{{z{{z{{{z{{z{{{z= {{zzzzzzz{{{{zzzzz{{{{z{{{z{{z{{{z{{z{{{{z{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{{{{{{{z{{{{z{{{{{{{{zz{{z{{{= {{{z{{{z{{z{{{{{{z{{{z{{{z{{z{{{{zz{{{{{z{{{z{{{z{{z{{{{{{{{zz{{{{zz{{z{{= {z{{{zzz{{{z{{{{{{{{{z{{{{zz{{{{{z{{{z{{{z{{{z{z{{{{{{{{zz{{z{{{zzz{{{z{{= {z{{z{{{z{{z{{{z{{{z{{z{{{{z{{{{{{{{{z{{{z{{z{{z{{{{{{{{{{{{{{{{zzz{zzz{{= {z{{{z{{z{{z{{{{{{z{{{z{{{{{z{{{{zz{{{{{z{{{z{{z{{{z{{{zzz{zzz{{{{{{z{{{z= {{{z{{z{{{{{{{z{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{{{{zz{{z{{{{{{z{{{z{{z{{{z{= {{z{{z{{{{{{{{{z{{{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{z{{z{{{{{{{{{z{{{z= {{{z{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{{z{{{{{z{{{z{{{z{{z{{{z{{z{{{{z= {{{{{{{zzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{zz{= {{z{{{{z{{{{zz{{{z{z{{z{{z{{{{{{zz{zz{{z{{{{{{z{{{z{{{z{{z{{z{{z{{{{{z{{{= z{{{z{{zz{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{{{{z{{z{{z{{{{{z{{{z{{{z{{= {{z{{{{{{{z{{z{{z{{{z{{{{{z{{{z{{zz{{z{{z{{{zz{zz{{z{{{{zz{{{z{{{{z{{{z{{= z{{zz{{{z{z{{{{{{{{{{z{{{z{{{{z{{{z{{z{{zz{{{z{z{{{z{{{{{z{{z{{z{{{{{z{{{= z{{zz{zz{{{{z{{{z{{{{{{{z{{{zz{zz{{z{{{{{{{z{{{z{{{z{{zz{{{z{{{{z{{{z{{z{= {{{z{{z{{z{{{{{{z{{{z{{z{{{z{{{z{{zz{{{z{{{{z{{{{zz{{{z{zz{{z{{zz{zz{{zz{= {z{{z{{zz{{z{{zz{{{z{{{{z{{zz{{{{z{{{{{{{z{{{z{{zz{zz{{z{{{z{{{{{{{{{{{{z= {{{{{z{{{z{{{z{{zz{zz{{z{{{{zz{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{zzz{{{zzz{zzz{{zzzz{{{{zzz{{{{zzzz{{zzz{{{{zz{{{{{zzz{{zzzz= {{{{{zzzzz{zzzzzz{zzz{{{{{zzz{zzz{zzz{{zzzz{{zzz{{{zzz{{{{zzz{z{{zzzz{{{z= zzz{{{{zzz{zzz{{{{{zzz{zzz{zzz{{zz{{{{{{{zzz{{zzz{{zzzz{zzz{zzz{{zzz{z{{z= z{{zz{zzzzz{{{{zzzz{{{{zzzzzzzzzz{{zzzz{{z{{{{{{{{{{z{{{z{{{zzz{zzzzzz{{z= zzz{zzz{zzz{{{zzz{zzz{{{{{zzz{zzz{{zzz{{{{{z{{{z{{{{{{zzzz{{zzz{{zzz{{{{{= {{zzzzz{zzz{{zzzz{{{{zzzzzzzzzz{{{zzz{{{{zz{{{{{zzzzzzzz{zzz{zzz{{zzzz{{{= {zzz{{{{zzzz{{{zzz{z{{zzz{z{{zzz{z{zzzz{{zzz{{zzzz{{{{{zzzz{{{{zz{{{{{{zz= z{zzz{{zzz{{zzz{zzz{{{{{{{{{{zzz{{{zzz{zzz{zzz{{zzz{zzzz{{{{zzzz{{{{z{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zz= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{{= {{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{{{{{zz{{{{{{{{{zz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zz{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{= {{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{z{{{{{{{{{z{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{z{{{z{{{{{{z{{{{{{{{{{{z{z{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{z{{{{{{{= {{{z{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C= =AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{{{{{{z{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{z{{{z{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{zz{{zz{{{zzz{{{zzz{{z{zzz{{zzz{{{{{{{{{zzz{{zz{zz{{{{zzzz{{= {{{z{zz{{{{zzz{{{{zzz{{{{{z{zz{{{{zzz{{{{zzz{{zz{zz{{{{{{{{{{zzz{{z{zz{{{= zzzz{{z{zz{{zzzz{z{zzz{zzz{{{z{zzz{{zzz{{zzz{zzzzz{{{zzz{{{zzz{{{{zzzz{{{= {zzzz{{zzz{{{{{{{zzzz{{{zzz{{{z{{{zzz{{{z{zz{{z{zzz{{zzz{{zzzz{{zzz{{{{{z= zzz{z{zz{{zz{{{zzz{{{{zzzz{{zzz{{{{zzzz{zzzz{{{{{{{{{{{z{{{{z{{{{zzz{{zz{= zz{{zz{zz{{zzz{zzz{{{{{z{zz{{z{{{{zzz{{zzz{zzz{zzz{{{{{zz{{z{{{{zzz{{{{zz= z{{z{zzz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zz{{z{{{{zzz{{zzzz{z{zz= {{{{zzz{{zz{zz{{zz{{{zzz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{z{{z{{{z{{zz{z{z{= {z{{{{{{{{zz{{z{{zz{zz{{zz{{z{{{{{zz{zz{{zz{{z{{z{{z{{{{{zz{zz{{z{{{z{{z{= {{z{{zz{zz{{{{{{{{z{{z{{z{{z{{zz{z{{{zz{zz{{z{{{z{{z{{{z{{{{{zz{z{z{{{z{{= z{{{z{{z{{z{{z{{z{{{z{{zz{{z{{{{{z{{{zz{zz{{{{{zz{{z{{z{{{z{{z{{z{{{z{{zz= {zz{{zz{z{zz{{z{{z{{{z{{{z{{{{{z{{{zz{zz{{z{{z{{z{{{{{z{{{zz{{z{{zz{{z{{z= {{{{{{{{{{{{{zzzzzz{{{zz{{z{{zz{zz{{zz{zz{{z{{{z{{{{{{z{{z{{z{{{z{{{z{{z{= {{z{{{z{{{{{{{z{z{{{{z{{{z{{zz{{z{{zz{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{z{{z{{{zz{{z{{z{{{zz{zz{{zz{{z{{zz{zz{{z{{z{{{z{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{z{{{z{{zz{{{{zzzzz{{z{{{{zz{{{{{{{{{{{{{zz{{z{{{z{{z{{{z{{{{{z{{{z{{{= {{zz{{zz{{{{{{{z{{{z{{zzzzz{{zzzzz{{z{{{z{{{{{{{{zz{{{{z{{z{{z{{{z{{z{{{z= {{z{{{z{{z{{{z{{{{{z{{{{zzzzz{{z{{{z{{z{{zz{{{{zzzzz{{z{{{z{{{{{z{{{z{{{z= {{{{{z{{{{{{zzzzz{{z{{zzzzz{{z{{{z{{z{{{{{{{zz{{z{{{zzzzz{{{{{z{{{z{{{z{{= z{{zz{{{{{{{z{{{{{{zz{{z{{{{{{z{{{{{{{{{{{{{z{{{{z{{{{{{zz{{z{{{z{{z{{{z{= {z{{{z{{{{{{z{{zz{z{{{zzzzz{{z{{{z{{{z{{{{{{{{z{{{{{zzzzz{{{{{zz{{z{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zz{z{{{{{{zz{{z{{{z{{{z{{{{{zz{{z= {{{z{{z{{zzzzz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{zz{{{z{{{{{{z{{{{{zz{{{{{{{{{{= zz{z{{z{{{z{{z{{{z{{{{{z{{{z{{{zz{z{{{zz{{{{{{z{{{z{{z{{{{{{z{{{{{{z{{{z{= {{{{{{{{zz{{{z{{z{{zz{{z{{z{{{z{{z{{{z{{{z{z{{{{{{z{{{{z{{{{{{{z{z{{{z{{{= zz{{{z{{{{{{z{{{z{{{{{z{{{z{{{z{{{{{z{{{{{{z{{{{{{z{{z{{{{{{z{{{z{{z{{{{{= zz{z{{z{{{z{{{{{{{{{z{{{z{{{z{{z{{{zz{{{{{{z{{{{zz{z{{z{{{{{{z{{{{{{{{{{{= {{z{{{{z{{{{zz{z{{z{{{z{{z{{{z{{{z{z{{{{{{{z{{{z{z{{{z{{{{{{{z{{z{{z{{{{{= {{{{z{{{{{z{{{{{{{zz{z{{z{{{{{z{{{{{{{{{{{{{{{zzzzzzz{{zzzzzzz{{{{{{z{{{z= {z{{{{zz{z{{z{{{z{{{z{{{zz{z{{z{{{z{{z{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{= {{zz{{z{{{{{{z{{{{{{zz{{{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{z{{{{zz{= {{{{z{{{z{{z{{{{{{z{{{{{{z{{{z{{{{{{{{{{zz{{z{{z{{{zzz{{{z{{{z{{z{{{z{{{z= {z{{{{{{z{{{{z{{{{{{{z{z{{{z{{{{zz{{z{{{{{{z{{{z{{{{{z{{{z{{{z{{{{{z{{{{{= {z{{{{{{z{{z{{{{{{z{{{z{{z{{{{z{{{z{{z{{{z{{{{{{{{{z{{{z{{{z{{z{{{{zz{{{{= {z{{{z{{{z{{z{{{{{{z{{{{{{{{{{{{{z{{{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{z{{{{{{= {z{{{z{z{{{z{{{{{{{zzz{zzz{{{{{{{{{z{{{{{z{{{{{{z{{{z{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{z{{z{{z{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~~}= }{{{{{{{{{{{{{{{{{{{{{zz{zz{{z{{z{{zz{{{z{z{{{{z{{z{{z{{{{{zz{{z{{z{{{z{{= zz{zz{{{{{z{{{z{{zz{{z{{z{{z{{{{{z{{zz{{zz{{{z{zz{{{z{z{{{z{{{{{{{{z{{z{{= z{{z{{{z{{{{{z{{{z{{z{{{z{{{{z{{{{{{{z{{{{zz{{{z{{{z{{{{z{{z{{z{{zz{{{z{z= z{zz{{{{{z{{{zz{zz{{{{{zz{{{z{zz{{{z{z{{zz{{{z{z{{zz{{z{{{{zz{{z{{z{{{zz{= {{z{{{{z{{{z{{{z{{z{{z{{z{{{{{z{{{zz{{z{{zz{{{z{z{{{z{{{{{{{{{z{{{{z{{{zz= {{z{{zz{zz{{zz{zz{{{{z{{{{{{{{z{{{{zz{{{zz{{{z{{{z{{{z{{{{{{{{{{z{{{{{zz{= {{z{zz{{z{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{zz{{{zz{{z{{z= {{{z{{{z{{zz{{z{{z{{{z{{z{{zz{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{zz{zz{zzz{{{{zzzz{zzz= {{{zzz{{{z{{{{{{zzz{zzzz{zzz{{zzz{z{{{zzz{zzz{{zzz{z{zzz{{{{{{zzzz{{{{zzz= z{{{zzzz{zzz{zzz{{{{{{{zzz{{zzzzzz{{zzzz{zzz{zzz{{zzzzz{{zz{{{{{{zzz{{{{z= zzz{{{{z{{{zzz{zzz{{{{zzzz{{{zzz{z{{{{{zz{{zzz{{{{{{{zzzz{{{zzzz{zzz{{zzz= z{{zzzz{{zzz{{{{zzz{z{{zz{{zzzz{{{{{{zzzzz{zzzzzz{zzz{{{{{zzzz{{zzz{z{{zz= zz{{{zz{z{{{{{{{{zzz{{zzz{{{zzz{z{z{zz{{{z{zz{{{{zz{{{{{{{zzz{{{{z{{{{zzz= z{{{{z{{{z{{{{{{{{{zzz{{{{{zzzz{{{zzz{zzzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{zzz{{{{z{{{{zzz{z{{zzzzz{zzz{{zzz{zzzz{zzzzzz{{zzzz{zzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{zzz{{{{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{z= zzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zz= zzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzz= zzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzz= zzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzz= zz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzz= z{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz= {{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{{zzzzzzz{= {zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{zzz{{{{{{{{{= {{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{zzzz{{{{{{{{{zzzz{z{{= {{{{{{{{{{zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}= ~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz= {{{{{{{{{{{zzz{{{{{{{{zzz{{zzz{{{{{{{{{{{{zzz{{zzz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{z{{{{{{{{{{{{{{z{{{{zz= z{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{zzz{{{{{{{zzz{{{{zz{{{{{{{{{{{{= zzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zzz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~= ~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= zzzzz{{{{z{{{{{{{{{{{{{zz{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= zzz{{{{{{{zzz{{{{{z{{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{= {{{{{{{{zzzzz{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{= {{{{{{{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzz{{{z{{{{zzzzz{{zzzzzz{{zzz{zzz{{{{{z= zzzz{{zzz{{zzz{{zzzz{{{{zzzz{{{zzz{{{{{{{zzzz{{{{{{{{{{{{{{{{{zzz{{{zzz{{= {zzzz{{{zzz{zzz{{{zzzz{{zzz{{zzz{{{{zzzzz{zzzzzz{{{zzzz{zzzz{{zzz{{zzz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zz{{{{{zz{{{z{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zzz{{{z{= {zzz{{zzz{{zzz{{{{zzzzzzzz{{zzz{{zzz{{zzzzzzzz{{zzz{{{zz{{zz{{zzz{{{{{{{{= zzzzz{{{{{{{{{{{{{{{zzz{{zzz{{{zz{{zz{{{zzz{zz{{zz{{zz{{zzzzzzzz{{zz{{zz{= {zzz{{{{zz{{zz{zzz{{{zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{zz{{{{= {{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{z= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{zzzz{{z{{zzz{{zzz{{zzz{{{{zzz{{zzz{{zzz{{zzz{{zzz{{= zzz{{zzz{{zzz{{zzz{zzz{{{{{{{{{zzzzzz{{{{{{{{{{{{{zzzzzzz{{{zzz{{zzz{{zzz= {{{{zzz{{zzz{zzz{{zzz{{zzz{{z{{zzz{{{zzz{{zzzzzz{{{zzz{{zzz{{{{{{{{{{{{{{= zz{zz{zz{{{{zzz{{z{zz{{{z{{{zz{z{{z{zzzz{z{zz{{zz{{zz{zz{zz{zzz{{zz{zz{{{= {zzz{{z{zzz{{{{z{zz{{{{zzz{{{z{{z{{{zzzz{{{zzz{{z{zzz{{zzz{{{{{{{zzzz{{{z= zz{{zz{zz{zzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{zzzz{z{{{{{{zzzz{{z= zz{{{{zzz{{zzz{{{{{{zzzz{{zzz{{zzz{{zzz{{zzzzzzzz{zzz{{{{{{{{{{{zzzzz{{{{= {{{{{{{{zzz{{{zzz{zzz{{zzz{{zzz{{{{zzzzzzzz{zzz{{zzz{{zzzz{{{{zzz{{{zzzzz= zzzzzz{{{zzz{{zzz{{{{{{{{{{{{zz{{{{zz{zz{{z{{z{{zz{zz{z{{{z{{z{{{z{{z{{{z= z{zz{{z{{{z{{zz{zzz{zz{{zz{zz{{z{{{z{{zz{z{{{{zz{zz{{z{{{z{{z{{z{{zz{{z{{= zz{zz{{zz{z{z{{{z{{{{{zz{{z{{zz{zz{{zz{zzz{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~~~~= ~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{zzz{z{{{zzz{zzz{{zzz{{{{zzz{{zzz{{{zzz{zzz{{zzz{{zzz{{zzz{{zzz= {{{{{{zzz{{{{{{{{{{{{{zzz{{{{{{{{{{{{zzz{{{{zzzzzz{{zzz{{zzz{{{{zzz{{{{{{= zzz{{zzz{{{zzzz{{{zzz{{{zzz{{{{{zzz{{{zzz{{zzz{{{{{{{{{{zz{{{{{{z{{{z{{zz= {{{{z{{{z{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{zzzzz{{z{{{{{= {{z{{{z{{zzzzz{{z{{z{{z{{{{{{z{{{z{{z{{{{zzzzz{{{{{z{{{{{{z{{{z{{z{{{z{{{= z{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=00=0D=01=01||~}}~~~~~vvvvvv~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{zzzzz{{zzz{{zzz{{zzz{{{{zzz{{zz= z{{zzz{{zzz{{zzz{{zzz{{zzz{{zzz{{{{{{zzz{{{{{{{z{{{{{{zz{{{{{{{{{{{{zzz{{= {{zzzzzz{{zzz{{zzz{{{{zzz{{{{{{zzz{{zzz{{{{zzzz{{zzz{{{zzz{{{{{zzz{{{zzz{= {zzz{{{{{{{{{zz{{{{{{{z{{{z{{{zz{{{z{{{z{z{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{= z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{{z{{{{{{z{{z{{z{{{{{{z{{{z{{z{{{{z= {{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~vvvvv|~~~~~= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {zzzz{{zzz{{zzz{{zzz{{{{zzz{{zzz{{zzz{{zzz{{zzz{{zzz{{zzz{{zzz{{{{{{zzz{{= {{{{{zz{{{{{zz{{zzz{{{{{{{zzz{{{{zzzzzz{{zzz{{zzz{{{{zzz{{{{{{zzz{{zzz{{z= {{zzz{{zzz{{{zzz{{{{{zzz{{{zzz{{zzz{{{{{{{{{{zz{{{{{{z{{{z{{{{zz{{z{{{z{z= {{z{{zz{{z{{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{{z{= {{{{{z{{z{{z{{{{{{z{{{z{{z{{{{z{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{{{{zz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6= =C0=01=01||~}}~~~~~vv||||~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{zzz{{zzzzzzzz{{zzz{z{{zzz{{zzz{{zzzzzzzz{= {zzz{{zzz{{zzz{{{zzz{{zz{zzz{{{{{{{zzz{{{zz{{{zzz{{{{{{{zzz{{{zzz{{zz{{zz= {{{zzz{{{{{zzz{{zz{zzz{{zzz{{zz{{zz{{zzz{z{{zzz{{zzzzz{{{zzz{{zzz{{{{{{{{= {{{{zz{{{{z{{{z{{z{{z{{z{{zz{zz{{zz{zzz{{{{z{{{z{{{z{{zz{zz{{z{{{z{{{z{{z= z{zz{{zz{{{z{z{{{{z{{z{{zz{{zz{{{z{z{{z{{zz{{{z{zz{zz{{z{{{{zz{{{z{z{{zz{= {{z{zz{zz{{z{{{z{{{z{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~v|||||~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{zz{{{{zzz= {zzz{{zzz{{zzzzz{zzzz{{{zzz{zzzzzzzz{zzzzzzzzz{{{zzzzz{zzzzz{{{{{{z{zzzzz= {{{{zzz{{{{{{zzzzzzzz{{{{{zzzz{{{zzzzz{{{{{zzzzz{zzzzz{zzzz{zzzzz{{{{zzz{= {{{zzzzzzzzzz{zzzzz{zzzz{{{{{{{{{{{{{zz{zzz{zzz{zzz{{{zzzz{{{z{{{{{{{{{{{= {{zzzzz{zzz{{zz{zzzzz{zzz{zzz{z{zz{{{{zzzz{zzz{{{z{{zzzz{{{{zzzz{zzzzzz{{= zzzz{{{zzz{{zzz{{{{zzzz{{z{{{zzzz{{{zzz{{zzz{zzz{zzzzz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||= ~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}~~= ~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{zzz{{{{{{{{{{= {{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zzzzzzz{{{{{{{{{{{{{{{zz{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{zz{{{{{{zz{z{{{{{{{{{{{{{{{{zz{{{zz{{{{{{{{{{zzz= zzz{{{{{{{{{{zz{{zz{{{{{{{{{{zzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzz{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~~~~= ~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{zz{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z= {{{z{{z{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{zz{{{z{= {{{{{{{{{{z{z{{z{z{{{{{{{{{{{z{{{{z{{{{{{{{{{z{{{z{{{{{{{{{zz{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{z{z{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{z{{{z{{{z{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{z{{{{z{{{{{{{{= {z{{{z{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {z{{z{z{{{{{zz{{zzz{zz{zz{{{z{z{{{{{zz{{{z{zz{{{{{{zz{{{zzzz{{{{{{z{{{{{{= {zz{{{{{zzz{{z{zz{{zz{zz{{zz{{{{zzz{{{zz{z{{z{{{{{{z{{{{{zzzz{{{zz{z{zzzz= {zzzz{{{{{{{{{{{z{{{{z{{{{zz{{{{z{{{z{{{{{{{{{z{{{{{{{{{zz{{zzz{zz{zz{zzz= {zz{zz{{zz{{z{{zz{zz{{zz{{{{zzz{{{zz{z{zzzz{zz{{{{zz{{{zz{zz{{{zzz{{{{{{z= {{{{z{{{{zz{{{{zzz{{{{zz{{{{{zz{z{z{zz{{{zzz{{z{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01= ||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{z{z{{{zz{{z{{{zz{zz{z{{zzz{z{{zz{{z{{{z= {{{{{{zz{zz{{{z{{{{{{{{z{{{{{zz{{z{{zz{{z{{zz{z{{{zz{z{{{z{{zz{{z{zz{zz{{= z{{{{{{{{z{{{{{z{{{zz{zz{{{z{{{{z{{{{{{{{{{{{{zzzzz{{{zz{{z{{z{{{z{{{{{{{= {{z{{{{{{{{zz{zz{{{zz{zz{z{{{zz{zz{z{{{z{{z{{{zz{z{{{z{{zz{{z{zz{zz{{{z{{= {{z{{zz{zz{{{zz{z{{z{{z{{{{{{zzzzz{{{zz{{z{{z{{z{{zz{{z{{zz{zz{{{z{{{zz{{= z{{zz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=8C=AC=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{{z{{{z{= {zz{{zz{{z{{z{{z{{{z{{z{{zz{{z{{{{{{{z{{{z{{{z{{{{{{{{z{{{{{z{{zz{{z{{{{{= zz{{z{{zz{{z{{z{{{z{{{{{z{{{z{{z{{{{{{{{{z{{{z{{{{z{{{z{{{z{{{{z{{{{{{{{{= {{{{z{{{zz{{z{{zz{{z{{{z{{{{{{{{{z{{{{{{{{z{{{z{{zz{{z{{z{{zz{{z{{z{{z{{z= {{{zz{{z{{z{{{z{{{{{z{{{z{{z{{{{z{{{z{{{z{{zz{{z{{z{{{{{{{{{z{z{{{{{z{{zz= {{z{{{{{z{{zz{{z{{{z{{z{{{{z{{{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~= ~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{z{z{z{{{zzzz{{{{z{{z{{z{{{z{{{z{zzzz{{{{z{{{{{{z{{{{z= {{z{{{{{{{{z{{{{{zzzz{{{z{{{{{{z{{z{{{z{{z{{{z{{z{{{{{z{{{z{{{z{{{{{{{{{{= z{{z{{{z{{{z{{{z{{{{z{{{{{{{{{{{{{z{{{{{z{zzzz{{{{z{{{z{{{{{{{{{z{{{{{{{z= {{{{z{{z{{z{{z{{{z{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{z{{{z{{{z{{{{z{{z{{{{z{= {z{{z{{{{z{{{{{{{z{{{z{{{zzzz{{{{{z{{{zzzz{{{z{{{z{{{z{{{z{{{{{{z{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zz{{z{{{z{{{{{{{z{{z{{= z{{z{{{z{{z{{{{{{z{{{{{{{z{{{z{{{z{{{{{{{{z{{{{{z{{{{{{z{{{{{{z{{z{{{z{{z= {{z{{{z{{{{{z{{zz{{z{{{{{{z{{{{z{z{{{{z{{zz{{{z{{{{z{{{{{{{{{{{{{z{{{{{z{= z{{{{{{z{{{z{{{{{{{{{{z{{{{{{{z{{{z{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{z{{z{{z{= {{z{{{{{z{{zz{{z{{{{z{{{z{{{z{{{z{{z{{{{{z{{{{{{z{{{z{{{z{{{{{{{{{z{{z{{{= {{{z{{zz{{z{{{{z{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{z{{{z{{{zz{{z{{z{{z{{z{z{zz{zz{{zz{{z{{z{{{{{{{zz{zz{{{z{{{{{{{{= z{{{{{zz{{z{{zz{{z{z{{z{z{z{{z{z{z{z{zz{{z{z{z{z{zz{z{{{{zz{{{z{z{z{{z{z{= z{z{z{{{{z{{{zz{{{{{{{{z{{{{z{{zz{{z{{z{z{z{z{{{{{{{{zz{{{z{{zz{zz{{z{{z{= {z{z{z{{z{{z{z{z{zz{z{z{{z{z{z{z{zz{{z{z{z{z{zz{z{{z{z{zz{zz{{z{{z{z{z{{z= {{{{{{z{{{{z{{zz{{z{{z{{z{{zz{{z{{z{z{z{zz{{{{zz{{z{z{{z{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{z{{zzz{{{zzz{{{z{{z{{{z{{{zz{{{{{= zzz{{{z{{{{{{{{zz{{{{z{{{{{{{{zzz{{{{{zzz{{{{zzz{{z{{{z{{z{{{z{{{z{{{zzz{= {{z{{zz{{z{{{{{z{zzz{{zz{{{{z{{zz{z{{{{z{{{{{z{{{{{{{zzzzzz{{{{zzz{{{{z{{= {z{{{{{{{{{{zzzz{{{{zz{{{{z{{z{{{z{{z{{z{{{z{{zz{zz{{z{{{z{{{z{{{zzz{{{z{= {zz{zz{{{{z{{{zz{{{{z{{{z{{zzz{{{{{{zzz{{{zz{{zzz{{{zzz{{{{zzz{{{{z{{zz{z= {{{{{zzz{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}= }~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{z{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F6=C0=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||||||||||||||||||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{zz{{zz{z{= {{{{{{{{{{{{{zzzz{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{= {{{{{{zzz{{{zzz{zzzz{{{zzzzz{{{{zz{{zzzzz{{{{{{{{{{zz{{{zz{{{{zz{{{{{{{{{= z{{{{z{{zzz{{{{zzz{{{{{{{{{{{{{{{z{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{zzz= {{{zzz{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{zzz{{zzz{{{zz{{= zzzz{{zz{{{{zz{{zz{{{{{{{{{{{z{{{zz{{{{z{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}|||= ||||||||||||}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{zz{{z{{{z{{{{{{{{{{{{{{{{{{{z{{z{{{{{{z{{{z{{{{{{{{{{{{{= {{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{z{{z{{{z{{z{{{z{{z{{z{{zz= {{{{{{{{z{{z{z{{z{{z{{{{{{{{{{zz{{{zz{{z{{{{{z{{z{{{{{{{{{{{{z{{z{{{{{{z{= {z{{z{{{{{{{{{{{{{{{z{{{{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{z{{{{z{{{z{{z{z{{z{z{{z{{z{{{z{{z{{{{{{{{{zz{{z{{z{{zz{{= z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{zzz{zzz{zz{{zz{{zz{{z{= {{{z{{z{{zz{{z{{{z{{{zz{{zz{{z{z{{zz{{{{z{{z{{{zz{{{zz{{zzz{zz{{{{{{{zz{{= {zz{{{z{{z{{{z{{{{{{{{{z{{z{{{z{{{{{{{{{{{z{z{{z{zzz{{{{{{{{z{z{{z{z{zzz{= {{{zz{{{{zz{{z{{z{zzz{zzz{{{{zz{{{zzz{z{z{{zz{{zz{zzz{{{{{{{zz{{{zz{{{zz{= {z{z{z{z{zz{zzz{zzz{{zz{{zz{zz{zzzzz{{{{{{{{z{z{z{{{{z{{{z{{z{{{z{{z{{z{z= zz{{{{{z{{{{{{{{{{z{{z{{z{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{z{{z{{{z{{{z{z{{{z{z{{{{{{{zzz{{z{z{{z{{{z{{z{{{z{{z{{zz{z{z{{{{zz= z{{{z{{z{z{{z{z{{z{{z{{{{{{z{z{z{z{{{zzz{{{{zzz{{{{{{z{{{z{{{z{{{{{{{{{{z= {{z{{z{z{{z{{{{{{z{{z{z{{z{{{{z{{{{zz{{z{{z{z{{z{{z{{z{{z{{{{zz{{{z{{{zz{= z{z{z{z{{z{{{{{{{{z{z{z{z{{z{{z{{zz{{zz{{z{z{{{{z{{z{{z{z{{z{{z{z{{z{{{{{= {{z{z{z{{{{z{{{z{{z{{{z{{z{{z{z{{z{{{z{{{{{{{{{{{z{{z{{z{{{z{{z{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{z{{{z{{{z{z{{{zz{{{{{{{{z{{z{zz{= {{z{{{z{{z{{{z{{z{{z{{zz{{{{{z{z{{{z{{z{z{{z{z{{z{{z{{{{{{z{z{z{z{{{z{z{{= {{z{{{{{{{{z{{{z{{{z{{zzzz{{{{z{{{zzz{z{{z{{{{{{zzzzzzzzzz{{{z{{{{{{z{z{{= z{z{{z{{z{{z{{z{{{{{{z{{z{{{z{{zz{{zz{{{z{{{{{{{{z{z{z{z{{z{{z{{z{{{z{{{z= {{zz{{z{{z{{z{{z{z{z{{z{{z{{{{{{{z{{zz{{{{z{{{z{{z{{z{{{{zzz{z{{z{{{z{{{z= zzz{{{{z{{{zzz{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{z= {{{z{{{z{z{{{z{{{{{{{{{z{{z{z{{{{z{{{z{{z{{{z{{z{{z{{z{{{{{{z{{z{{z{{z{z{= {z{z{{z{{z{{{{{{z{{z{{z{{{z{{z{{{z{{z{{{{z{{{{z{{zz{{{{{{{{{z{{{{{z{{z{{z= {{{{{{{{{z{{{{z{z{{z{{{z{{z{z{{z{z{{z{{z{{z{{z{{{z{{z{{z{{{z{{z{{{z{{{{z{= {{{{{{{z{{z{{z{{z{{z{{z{{{z{{{z{{{z{{z{{z{{z{{zz{zz{{z{{z{{{{{{{z{{zz{{z{= z{{{z{{z{{z{{{{{z{{z{{z{{z{{{{{{{{{{{{z{{{{z{{{{z{{z{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{zzzz{{zzz{zzz{{z{{zz{{zz{{z{{{zzzz{{{zz{zzz{zzz{{zz{= {zz{{zzz{{zz{{{zzz{zz{{zz{{{zz{{zz{zz{zz{{{{zzz{z{zzz{zzz{zz{zzzzz{{{zzzz= {zzzzz{{{{{{{{{zzzz{zz{{{{zz{{{z{{{{{{z{{{{z{zzz{{{{zzz{{{zz{{{zz{z{{zzzz= {zz{{zzz{{{{zzzzz{{zz{{zz{{{zz{z{{{zzz{z{zzz{{zz{{zzz{zzz{{z{zzz{{{zz{zz{= {{{z{z{{{zz{zz{z{{{zzz{{z{{zz{{{{{zz{{{z{{{zz{{{{zz{{zzzz{{{{{{{{{zzz{zz{= {{{zzz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zzz{= zzz{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zz{{{zz{{{{z{{z{{{= {{{{{zz{{{zz{{{zz{{{{{{{{{{{{z{{zz{{zzzz{{zz{{{{{{{{{{{{zz{zzz{zzz{{{{{{{= {{z{{{{{{zzzzz{{{{z{{{{zzz{zzz{{{{{{{{{{z{{zz{{{zz{{{{z{{z{{{{{{zz{{{zz{{= {zz{{{{{{{{{{zzz{{zz{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{z{{z{z{{z{{zz{{{z{{{{{{z{{z{z{{z{z{{z{{{{{{{{{{zz{z{{z{z{{z{z= {{z{{{{{{{{{{{z{{{z{{{z{{{{{{{{{{z{{{{{{{z{{z{{{zzz{{{{z{{{z{{{{{{{{{{z{{= z{{z{z{{z{{zz{{{z{{{{z{{z{z{{z{z{{z{{{{{{{{{z{{{z{{z{{z{{{z{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{zz{{zz{{z{z= {z{{z{{{zzz{{zzz{{{zz{{zzz{{{zz{{z{{{{{{z{{{{{z{z{{z{{{z{{{z{{{{{{z{{z{{{= {z{z{{z{{{{{{{{{z{z{{{{z{{{z{{z{{z{{{{{{{{{{{zz{{z{{zz{{zz{{z{z{z{{z{{{{z= {{{{{{z{z{{{{{z{z{{{{z{{{{{{z{{{{{z{z{{z{{{z{{{z{{{{z{{z{{{{z{z{{z{{{{{{{= {zzz{{z{{z{zzz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{z{z{z{{z{{z{{zz{z{z{{{{z{{z{z{{z{z{{z{z{{z{z{z{{{{{{{{z{{= {{{z{{z{{z{{{z{{{{z{{{{{{zz{{{{z{{z{{z{{{{{{{{z{{z{{{z{{{{z{{z{{z{{{{{{{{= {{{{z{z{z{z{{z{{z{{zz{z{z{{{{{zzz{{{{z{z{{{{{{z{{{{{{{{{{{z{{{{{z{{z{{z{{= {z{{{{z{{{{zz{{{{z{{z{{z{{{{{{{{{{{z{z{{z{z{{z{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{z{{z{{z{{z{{zzz{{{{z{{= z{z{{z{z{{z{z{{z{zz{{{{{{{{{z{{{{{z{{z{{z{{{z{{{{z{{{{{z{{z{{{z{{{zzz{{zz= zz{{zzzzz{{z{{{z{{{z{{z{{{{{{{{{{{{z{z{z{z{{z{{z{{z{{zzz{{{{{z{{{{{zzzzz{= {{{z{z{{{{{{{{{{z{{{{{z{{z{{z{{{z{{{{z{{{z{{z{{{z{{{zzz{{zzzz{{{{{z{{zzz{= z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{z{{{z{{z{{z{{z{{z{{{z{{z{z{{z{z{{z{z{{z{z{{{{{{{{{{z{{{{z{{{z{{z{{{z{= {{{z{{{{{z{{z{{z{{{{{z{{{{{{{{{{{{z{{z{{{{z{{{z{{z{{{{{{{{{{{{{z{{{z{{{z{= {z{{z{{z{{z{{{{z{{{{{z{{{z{{{z{{{z{{{{{{{{{z{{{{z{{{z{{z{{{z{{{{z{{{z{{z{= {z{{{{{z{{{{{{{{{z{{z{{{z{{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{zz{{zzz{z{{zz{{zzz{{zz{zz{zz{{zz{= zz{zz{{z{{{{{{z{{zzzz{{zz{{{zzz{{z{{{{{{{zz{{zzzz{zz{{{{{{{{{{{{{z{zzzz{{= z{{{{zz{{{{{{{{{{{{{{z{{{z{{{{zz{{zzz{z{{zz{{zzz{{{zzz{zzz{zzz{zzz{{z{{{{= {{z{{zzzz{{zz{{{zzz{{z{{{{{zz{{zzzz{zz{{{{{{{{{{zzz{{zz{{{{zz{{zzz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01= =01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{zzz{{{{{{{{= {{{{{{{{{{{{{{{{zz{{{zzz{{{zz{zzz{zzz{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{zzz{zzz{{zzz{{{zz{{zzzz{{zz{{{{zz{{zz{{{{{{{{{z{{zz{{{zz= {{{{z{{z{{{{{{zz{{{zz{{{zz{{{{{{{{{{zz{{{zzz{{zz{{{{zz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{{{{z{{{z{{{z{{{{{{= {{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{z{{{z{{z{z{{z{z= {{z{{z{{{z{{z{{{{{{{z{{z{{z{z{{z{{zz{{{z{{{{z{{z{z{{z{z{{z{{{{{{{{z{{z{{z= {{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{zz{{zzz{zz{{{zz{{= z{{{{{{z{zzz{{{{zz{{z{{zz{zz{{zzz{zzz{{zz{zzz{{{zzz{zzz{{zz{{zzz{{{{{{z{z= {{{zz{zz{zz{{{{{{{{{{{{zz{{{zz{{{zz{{z{z{z{z{zz{zzz{zzz{{zz{{zz{zz{zzzzz{= {{{{{{{z{z{z{{{{z{{{z{{z{{{z{{z{{z{zzz{{z{{z{{{{{{{z{{{{{z{z{{z{{{z{{{z{{= {{z{{z{z{{z{{{{z{{{{{{{{z{{z{zzz{{z{{z{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{zzzzz{{z{{z{z{{z{{z{z{z{{{{{{{{z{{{{{z{{{{z{z{z{z{{{{z{z{{{z{{z{{z{= z{{z{z{z{{{z{{z{{z{z{{z{{{{{z{z{{{z{{z{z{z{{{{{{{{{{{{z{z{z{z{{z{{z{{zz{{= zz{{z{z{{{{z{{z{{z{z{{z{{z{z{{z{{{{{{{z{z{z{{{{z{{{z{{z{{{z{{z{{z{z{{z{z{= {z{{{{{{z{{{{{z{{z{{z{{{z{{{{z{{{z{{z{z{{z{{zz{{{{{{{{{{zz{{{{{z{{zz{{z{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{z{z{{z{{z{zz{{{{{{{{{z{{{{= {z{{{{z{z{z{z{{{zz{{zz{z{{z{{z{z{{z{z{z{{{z{{z{{z{z{{z{{{{zzzzz{{{z{z{zz{= {{{{{{{{{{{{z{z{z{z{{z{{z{{z{{{z{{{z{{zz{{z{{z{{z{{z{z{z{{z{{z{{{{{{{z{{z= z{{{{z{{{z{{z{{z{{{{zzz{z{{z{z{{z{{{{{{z{{{{{z{{z{{z{{{z{{{{z{{{{zzz{{zzz= {{{{z{{zzzz{{z{{z{{{{z{z{{z{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z= {{z{{z{z{{z{{z{z{{{{{{{{{z{{{z{{z{{{{{z{{{z{{{z{z{{{z{z{{z{{z{z{{z{{z{{{{= z{{z{{z{z{{z{{{{z{{{z{{{zz{{z{{{{{{{{{{{{{{z{{z{{z{{z{{z{{z{{{z{{{z{{{z{{= z{{z{{z{{zz{zz{{z{{z{{{{{{{z{{zz{{z{z{{{z{{z{{z{{{{{z{{z{{z{z{{z{{{{{{z{{= {{z{{{z{{z{{{z{{{{z{{{{{z{{{{z{{{{{z{{{{{{{{z{{z{z{{z{z{{z{z{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{zzz{zzz{{zz{{zz{zz{zz{zz{{z{{{zzzz{zzz{{{{{{z{{{= z{{{zzz{zzz{zz{zz{z{zz{zz{zz{{{{zz{zz{{zz{zz{{zzz{zzz{{{z{{{zz{{z{{z{{{{{= zzz{z{zzz{{zz{{zzz{zzz{{z{zzz{{{zz{zz{{{{z{z{{{zz{zz{z{{{zzz{{z{{zz{{{{{z= z{{{z{{{zz{{{{zz{{{zz{{{z{{{{z{{zzzz{{zz{{{zzz{{z{{{{zz{{{zz{{{zzz{{{{{{{= {{{zz{{zzz{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0= \=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{zz{zzz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{zz{{{{{zz{{{z{{{{{{{{{{{{{{zz{= {{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zz{{{z{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{z{z{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{z{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{z{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{z{{{{{zz{zz{{{{z{{{{zz{z{{{zzz{{{zz{= {{{{{{{zz{{{{{zzz{{{zz{{{zz{zz{{{{zz{{zzz{zz{zz{zz{{zz{{{{{{{zz{zzzz{zz{z= z{{{{zz{{{zz{zz{{{zzzz{{{{zzzz{{z{zz{{{{zz{{{{{{zzzz{zz{{z{zz{{zzz{{zzzz{= {{{{{zz{z{zz{zz{{{zz{z{{{{zzz{zz{zz{{{{zz{{{{zzz{{zzzz{{{{zz{zzz{zz{zz{zz= {zz{{{{{zz{{{z{zz{zzzz{{{zz{z{zz{zz{{zzzz{{{zz{{zz{zz{{z{zz{zzzz{zz{{z{{{= {zz{{{{zzz{{{{{{{{{{{{{{zz{z{zz{zz{{{zz{z{{{{zz{zz{{{zz{{z{{{z{z{{{{z{{zz= {{{{zzz{{{{{zz{z{{{{zz{{{{z{z{{{zzzz{{{{{{zz{z{{zzz{{{{{zzzz{{z{zz{{{{zz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{zz{{z{{z{{{zz{zz{{zz{{z{zz{{z{{{{{zz{{z{{zz{{z{zz{zz{{{zz{z{{zz{zz{{{zz= {zz{z{{z{{{z{{{{{zz{zz{{{zz{zz{z{{zz{zz{{{zz{z{{z{{z{{{{{{z{{{{zz{z{{zz{{= z{{{{{{z{{{{z{{{z{{{z{{z{{{z{{{{{{zz{zz{{{zz{z{{z{{zz{{{{{{zz{zz{z{{zz{zz= {{z{{z{{{z{{{{{{{z{{{zz{zz{z{{zz{{z{{zz{zz{{{z{{{{z{{{zz{zz{{{zz{z{{{z{{{= {{{z{{{z{{z{{{z{{{{z{{{{z{{z{{zz{{z{{z{{z{{{{{{{{{{{{zz{zz{{{zz{z{{z{{zz{= {{{{zz{{z{{{z{{z{{zzz{z{{z{{{{z{{zz{{z{{{{z{{zz{{zz{{z{{zzz{z{{{z{{{{{{zz= {zz{{z{{z{{{{{{z{{{{zz{z{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{{z{{z{{{{{z{{zz{{{{{z{{zz{{z= {{{{{z{{{z{{zz{{z{{z{{{z{{zz{{z{{z{{z{{{z{{{{{z{{{z{{zz{{z{{z{{z{{{z{{zz{= {z{z{{{z{{{{{z{{{{zz{{z{{z{{zz{{{{{{z{{{z{{{z{{{{z{{{{{z{{{{{{{z{{{z{{zz{= {z{z{{{z{{{{{{zz{{z{{z{{z{{{z{{z{{{{{z{{{{{{{z{{{zz{{z{{z{{z{{{z{{z{{{z{{= z{{{{z{{{{z{{{z{{zz{{z{{z{{{{{{{z{{z{{z{{{z{{{{z{{{{z{{z{{{z{{zz{{z{{{{{{= {{{{{{{{{z{{{z{{zz{{z{z{{{z{{{{{{z{{{z{{z{{z{{{z{{{z{{z{{{z{{{z{{{{{{{z{{= {z{{{z{{zz{{z{{{z{{z{{{{{{{z{{{z{{z{{{{{{{{z{{{{zz{{z{{z{{zz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{z{{z{{z= {{{z{{z{{{{{zzzz{{{{{{zzzz{{{z{{{{{z{{{{z{{z{{z{{z{{{{z{{z{{z{{z{{{z{{z{{= {{{z{{{z{{{z{{z{{z{{z{{{{z{{z{{z{{z{{z{{{{{{z{{{{z{{z{{zzzz{{{{{{{z{{{{z{= {{z{{{{{z{{{{z{{{{{{z{{{z{{{z{{z{{z{{{z{{{{{{z{{z{{z{{z{{{{z{{{z{{{{z{{{{= {{{z{{{z{{z{{z{{{z{{{z{z{{{{z{{z{{{{z{{{z{{{z{{{z{{z{{{z{{{{{{{z{{z{{z{{{= z{{{{z{{{{z{{z{{zzzz{{{{{z{{{{{{{{{{{{{z{{{z{{{z{{z{{z{{{z{{{{{{z{{{z{{z{= {z{{{z{{{z{{z{{{z{{z{{{{{{{{z{{{z{{zzzz{{{{z{{{z{{z{{{{{{z{{{z{{{{z{{{{{{= {z{{{{z{{z{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{z{{{z{{z{{{z{{zz{{z{{{{{z{{{{{{{{{z{{{{{{z{{{{{z{{{z{{= {z{{z{{z{{{z{{{z{{z{{z{{{z{{z{{{{{z{{zz{{{z{{z{{z{{z{{{z{{{z{{z{{{zz{{{{{= {z{{{{{z{{z{{z{{{{{{{{{{z{{{z{{{z{{{{{{{z{{z{{{{{{{z{{zz{{{z{{z{{z{{z{{{{= {{{z{{z{{z{{z{{{z{{{{{z{{z{{{{{{{z{{{{z{{z{{z{{z{{{z{{z{{{z{{z{{{{z{{{{z{= {zz{{{z{{z{{z{{{{{{{{z{z{{z{{{z{{{{z{{{{z{{z{{{z{{{{{{{{{z{{{{{{{{{{{{z{{= zz{{{z{{z{{z{{z{{{{{{z{{{z{{z{{z{{{z{{{z{{z{{{z{{{z{{{{{{{{z{{z{{{z{{{{{{= z{{{z{{z{{{{{{{z{{zz{{{{{z{{{{{z{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{zz{{z{z{z{z{z{zzz{{z= {zz{{z{{{{{zz{{z{{zz{{z{zz{zz{{z{{z{z{zz{zz{{z{{z{{z{z{{z{z{{{{{{z{z{z{zz= {{z{{z{z{zz{zz{{z{{z{z{z{{{{{{{{z{z{{z{{z{z{zz{{z{{{{{{z{{{z{z{z{{{{z{{z{= {z{z{{{{{z{z{z{zz{{z{z{z{zz{z{{{{z{{z{{z{z{zz{zz{{z{{z{{z{z{{{{{z{z{z{{z{= {z{z{z{{zz{{zz{zz{{z{{{{z{z{{z{z{z{zz{{z{z{z{z{{{{{{zz{{{z{z{z{{{{z{z{{z{= zz{z{zz{{z{{z{{z{{zz{{{{{{{{z{z{z{zz{{z{z{z{zz{z{{{{z{{zz{{z{zz{z{zz{zz{{= z{z{z{z{zz{{z{{{{z{zz{z{zz{{z{{zz{zz{{z{z{{{{{z{z{z{zz{{z{{{{{z{z{{z{{z{z= {zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= zzz{{{{{zzz{{{{{z{{{z{{zz{{zzz{{{zzz{{{{{{{zzz{{{{zzz{{{zz{{{{z{{{z{{{zz{= {{{z{{z{{{z{{{{z{{{{{{{{z{{zz{z{{z{{{z{{{zz{{{{z{{{z{{zzz{{{{{{zz{{{z{{{z= {{{zzz{{{{{{z{{{{{z{{z{{{{zzz{{{zz{{{{{{{z{{zz{z{{{z{{{z{zz{{{{{z{{z{{{z{= {{zz{{{{zzz{{{zz{{{{{{{z{{z{{z{{{z{{zzz{{{{{zz{{{{z{{{{zz{{{{z{{zz{z{{{z{= {zz{{{{{{{z{{{{{z{{z{{{{zz{{{zz{zz{{{zzz{{{zzz{{{{z{{{{{{{{{z{{zz{z{{{z{{= {z{zz{{{{{zzz{{{{zz{zz{{{zz{{{{{z{{{z{{{zzz{{{{{{z{zz{{{zzz{{{{zz{{{{zz{{= {{{{{z{{zz{zzz{{{{{{zz{{{z{{{z{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {zzz{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}= }{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zz{{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{zz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{z{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{z{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= zzz{z{zz{{{zz{{{{{zz{z{zzzz{{{zz{{{{zzz{{zzzz{{{{{{zz{{{zzzz{{{{{zz{z{{{{= zz{z{zz{zz{{{zzzz{{{zz{{{z{zz{{zzz{{{{{zzzz{{{zz{{{{{{{z{z{{{{{zz{{{{{{zz= zz{{{zz{{{{{zz{z{z{zz{{{zz{{{{zz{z{{{{{{{{{{{{{z{{{{{{{zz{{{{{zz{zz{{{z{z= z{{{zz{{{{zzz{{{{zz{{{z{zzzz{{zz{{{zz{{{{{{{{zz{{{zz{{z{{z{zz{{{{{{{zz{{z= z{zz{{{zz{z{{{{zz{{zz{zz{{{{{zz{{{zz{zz{{{zz{z{{{{zz{{{zz{zz{{{{zzz{{{zz{= {{{{{{{{zz{{z{{zz{{{zz{{{{{zzz{zz{zz{{zz{{z{{{zzz{{zzzz{{{{zz{zz{{{{zz{{{= zzzz{{{{{z{{{{zz{{{zzzz{{{{{{zz{{{zz{{z{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{{zz{{z{{zz{zz{{{z{{{zz{{z{{z{{z{{{= z{{{{{{zz{zz{{{z{{{{{{z{{zz{{zz{zz{{{zz{z{{z{{z{{zz{{z{{{z{{{z{{z{{{{{{z{= {{zz{zz{{{{{zzz{z{{zz{{z{{{{{{z{{{zz{{z{{zz{zz{{{z{{{zz{{z{{z{{zz{{{{{{{{= {{{{{z{{{{{zz{zz{{{{{zz{{z{{{z{{{zz{{z{{z{{z{{zz{{z{{{z{{{z{{{z{zz{{z{{{{= {zz{zz{{{z{{z{{{z{{{{{{{{{{z{{{zz{z{{z{{zz{{zz{{z{{zz{{z{{zz{{z{{{zz{z{{z= {{zz{{zz{{z{{{zz{z{{zz{{z{zz{{z{{{{{{{{{z{{z{{z{{zz{{z{{{{{{zz{zz{z{{{z{{= z{{z{{z{{{z{{{{{{{zz{z{{zz{zz{{{z{{{{{{z{{{zz{{z{{{z{{{{{{zz{zz{{{z{{z{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{{{z{= {zz{{z{{{z{{z{{{{z{{zz{{z{{{{{z{{{{{{{z{{{z{{{z{{{{{z{{{z{{{z{{{z{{zz{{z{= z{{{z{{z{{zz{{z{{{{z{{{{{{{{z{{{{z{{{z{{{{{z{{{z{{z{{zz{{{{{{z{{{z{{zz{{z= {{{z{{z{{{{z{{zz{z{{{z{{{{{{{{{{{{{{z{{{{{z{{{z{{{{{z{{{z{{z{{{{z{{zz{{z{= {{{{z{{zz{{z{{{{z{{z{{z{{zz{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{z{{{zz{{z{z{{{z{= {{z{{zz{{z{{{z{{z{{zz{{zz{{z{z{{{z{{{z{{zz{{zz{{z{{z{{{{{z{{zz{{{{{{{{{z{= {z{{z{{z{{zz{{{{{zz{{z{{z{{z{{z{{{z{{{{{z{{{{{{{zz{{z{{z{{{z{{z{{{{{{{z{{= {z{{zz{{z{{{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{z{{{z{{{zzzz{{{z{{{z{{{z{{{zzzz{{{{{z{{{{z{{{{{{z{{{{z= {{z{{{{{{z{{{z{{z{{{z{{{z{{z{{z{{z{{zzzz{{{{z{{{{{z{{{{{{{z{{{z{{{{z{{{{{= z{{{z{zzzz{{{{{{{z{{{zzzz{{{z{{{z{{{z{{{zzzz{{{z{{{z{{{{{{{{{{{{{z{{{{{z{= {{{z{{{{{z{{{z{{z{{{zzzz{{{{{z{{{zzzz{{{{z{{{{z{{z{zzzz{{{{{{z{{{{z{{z{{z= {{{z{{{{{{{{{{z{{{z{{z{{z{{{z{{zzzz{{{{z{{{z{zzzz{{{{z{{z{{z{{{z{{zzzz{{{= {z{{z{{z{{{{{zzzz{{{{{{{{{{{z{{z{z{{zzzz{{{{{{{z{{z{{z{{{z{{z{{{{z{{{{z{{= {{{{{z{{z{{z{{{{z{{z{{{{{{{z{{zzzz{{{{z{{{{{{z{{{{z{{z{{z{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{z{{{{z{{{{{{z{{zz{{z= {{{{z{{{{{{{{{z{{z{{{{{{{z{{{z{{{z{{{{{{z{{z{{{z{{zz{{{z{{z{{{zz{{{z{{{{{= {z{{{{{{{z{{{{{z{{{{z{{{z{{{{{z{{{z{{z{{{{{{{{{{z{{{z{{{{{{z{{zz{{z{{{{z{= {{{{{z{{z{{{{{{{{{{{{{{z{{{{{z{{{z{{{{{z{{{z{{z{{{{z{{{{{{{{{z{{z{{{{{{z{= {{{{z{z{{z{{{{{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{z{{{{z{{z{{z{{z{{{z{{{{{{z{{{= z{{z{{{{{{{z{{z{{z{{z{{{z{{{{{{{z{{z{{z{{{{{z{{{{{{{{{{{{{{z{zz{z{{z{{{{{= {{{{{z{{z{{z{{z{{z{{{{{{z{{z{{{{{{{{z{{z{{z{{{z{{z{{{{{{{z{{{z{{{{{{z{{{{= {{{z{{{z{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{z{{{{zz{{z{{z{z{z{zz{z{{zz{{z{{z{{z{{z{z{{{{{zz{zz{{{z{{{{{{z{= zz{z{z{z{z{zz{{z{z{z{{{{{zz{{z{{z{{{{z{{z{{{{{z{z{{zz{zz{{{{{zz{zz{{zz{{z= {{{{{{z{{{zz{{z{{z{z{z{zz{{{{zz{{z{{z{zz{z{z{{{{{{{{{{z{{{{{zz{zz{{{{{z{{= zz{{z{{{{zz{{z{{z{{z{{zz{{z{{z{{{{{zz{{{zz{{z{{{{{zz{zz{{z{zz{z{z{{{{{{{{= {{z{z{z{{z{z{z{zz{z{zz{{z{{z{{zz{{zz{{z{{z{{z{z{z{zz{z{zz{{z{{z{{z{z{zz{{= z{zz{{z{{zz{{{{{{zz{zz{{{zz{{z{{{{{z{{z{{z{z{z{zz{z{z{{z{{z{z{{{{{z{{z{z{= zz{zz{{z{z{{{{{z{z{zz{{z{{z{z{{{{{zz{zz{{z{zz{z{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{z{{{{{zzz{{{{z{{zz{zz{{{{zzz{{{zz= z{{{zz{{{{{{{zz{{{{z{{{{{{{{z{zz{{{z{{zz{z{{{z{{zzz{{{{zzz{{{z{{{{zzz{{{{= {{zz{{{{zz{{{{{{{{zz{{{{{zzz{{{{{{z{{{{{zzz{{{{z{{zz{z{{{{{zzz{{{{z{zz{{z= {{{{{{{{{zzz{{{{{zz{{{{{{{zzz{{{{z{{{{{zzz{{{zzz{{{{zzz{{{z{{{{{z{{{{{zzz= {{{{{{{zz{{{{zz{zz{{z{{{{{{{{{{{z{{z{{{z{{{z{zz{{{zzz{{{zzz{{{{{zzz{{{z{{= {z{{{z{zz{{{zzz{{{z{{{z{{{zzz{{{zzz{{{{z{{{{{{z{{z{{{{{zzz{{{{{{z{{z{{{z{= {zz{zz{{zzz{{{zz{{{{{{z{{{z{{{zz{{{{zz{{{{{{{z{{{zzz{{{zz{{{{{{{zz{{{{zz{= zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{= {{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{{{{{{{{{zz{{{{{{{{{{{{{{= {{{{{zzz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{zz{{{{{{{{{zz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{= {{{{{z{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{z{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{z{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{z{{{{{{{z{{{{{{{{{{{{{z{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zz{zz{{z{{{z{{{{zz{{{z{zz{{zzz{{{= {{{z{{{{zz{{{{{zz{z{{zz{z{{{{{zz{{z{{{zzz{{{{zz{{z{{zz{zz{{zzzz{{z{zz{{{{= zz{zz{{{{{zz{{{z{zzzz{zz{{{{{zz{{{zzzz{zz{{z{{{{zz{z{{z{{{{{{zz{z{{{{zz{{= {{z{z{{{zzzz{{{{{{{{{{{z{{{zzzz{{{zz{{z{{zz{{{zz{{{{{{{{{z{zz{zz{{z{{zz{z= z{{{{{zz{{zz{zz{{zzzz{{{zz{{{{{{{zzz{{zz{{z{{{{zzz{{z{zz{{{{{{zz{z{{{{zz{= {{{z{z{{{zzzz{{zzz{{{{{{{{zz{{z{{zz{{{zz{{{{{zzz{zz{zz{{zz{{z{{{zzz{{zzzz= {{{{{z{z{{{{{zz{{{{{{zzzz{{{zz{zzz{{zz{{{{zz{{{{zz{z{{{{{zz{{zz{zz{{{{{{{= zz{{{zz{{z{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{z{{z{{z{{{zz{{z{{{z{{{z{{z{{{{{z{{{zz{zz{{zz{zz{{z{{zz{{{{{{z{{z{{z{{z{= {{{{z{{z{{z{{{z{{{z{{{{zz{z{{{{{zz{{z{{zz{{z{{{z{{{zz{{z{{zz{{z{{{z{{{{z{= {z{{zz{zz{{z{{{{{{z{{zz{{zz{{z{{zzz{z{{{z{{{{{{{{{{{{{z{{{{z{{{{{{z{{z{{z= {{zz{{z{{{{{{{{{z{{{{z{{z{{{zz{z{{{{{{z{{{zz{z{{{z{{{zz{zz{{{{{z{{z{{{z{{= z{{zz{{z{{zz{z{{{{{z{{zz{{zz{{z{{zzz{z{{{z{{{z{{z{{{{{{{{{z{{z{{z{{zz{{z{= {{{{{zz{zz{z{{{z{{z{{z{{z{{{z{{{{{{zzz{z{{zz{{z{{{{{{z{{{zz{zz{{z{{z{{{zz= {{z{{z{{zz{{{{{{z{{{zz{z{{{{{zz{zz{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4= =88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{z{{{z{{{z{{zz{{z{{{{z{{{{{{{{z{{{z{{{z{= {z{{{z{z{{{z{{{{{{z{{z{{{z{{{{{{{{z{{z{{z{{z{{{z{{{{zz{{z{{{{{z{{{z{{z{{z= z{{z{{{{z{{{z{{z{{zz{{z{{{{z{{z{{{z{{{z{{z{{{{{z{{{z{{{z{{zz{{z{{{z{{z{{{= {{{{{{{{{{{z{{{{z{{{{{{z{{z{{z{{z{{zz{{{{{{{{z{{{{z{{z{{{zz{{z{{{{{z{{{zz= {{z{{z{{{{z{{{z{{{{{z{{{{{z{{z{{{z{{{{{zz{{z{{{{z{{{z{{{z{{zz{{z{{{z{{z{{= {{z{{{{{{{{{{{{z{{z{{z{{z{{zz{{{{{zz{{z{{z{{z{{z{{{z{{{{{z{{{{{{{z{{{z{{z= {{zz{{{{{z{{{{z{{{z{{{zz{{{{z{{zz{z{{{z{{{{{{z{{{zz{{z{{{{{z{{{z{{z{{z{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{z{{{z{{z= zzz{{{{z{{{{{z{{{{{{{z{{z{{{{z{z{{{z{{z{{{z{{{{{{z{{z{{{{z{{{{{{{z{{z{z{{= {z{{{z{{{{z{{z{{{{{{z{{{z{zzzz{{{{z{{{{z{{{z{zzzz{{{{z{{{{z{{z{{z{{{z{{{z= {{{{{z{{{z{{zzzz{{{{z{{{z{{z{{{{{{{{{{{{{z{{{{z{{{{{{{z{{z{z{{zzzz{{{{{{{= {{{z{{{{z{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{{z{{{{z{{{{{{z{{{{z{{z{{z{{{{{{z{{= z{{{{{z{{{z{{zzzz{{{{z{{{z{{z{{{{{z{{{{{{{{{{{z{{z{z{{zzzz{{{{{{{z{{z{{z{= {{z{{z{{{{z{{{{z{{{{{{{z{{{z{zzzz{{{{{{{z{{{z{{{z{{{{z{{{{zzzz{{{z{{{z{{{= {{{z{{{z{{z{{{{{z{{{{z{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{z{{z{{{z{{{z{{{{{{z{{{{{{{z{{{{{z{{{z{{{z{{z{{zz{{z{{z= {{{{{{z{{z{{{{{{z{{{{{{z{zz{z{{z{{{z{{{{{z{{z{{{{{z{{{z{{z{{{{{{z{{{{z{{{= z{{z{{{{{{z{{{{z{{z{{{z{{zz{{z{{{{{{z{{z{{{z{{{{{{z{{{z{{z{{{{{{{{{{{{{{z= {{{{z{{{{{{{z{zz{z{{z{{{{{{{{{{{{z{{{{z{{z{{{{z{{z{{{{{z{{{{z{{z{{z{{{{z{= {{z{{{{{{{{z{{z{{z{{{z{{{{{{z{{z{{{{{z{{z{{{z{{{{{{z{{{z{{z{{{{{{{z{{{{{{= {{{{z{zz{z{{z{{{{{{{{{{z{{z{{z{{z{{z{{{{{{z{{z{{{{{{{z{{{z{{z{{{{{{{{{z{{= {{z{{zz{{{z{z{{{z{{{{{{z{{z{{{{{{z{{{{z{{z{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{zz{z{z{z{zz{{z{{z{{{{= z{{z{{{{{z{z{zz{zz{{z{z{z{zz{zz{z{{{{z{zz{z{z{{z{{{{{{zz{zz{{{z{z{z{z{{z{= {z{z{{{{z{{zz{{zz{{z{{z{{{{z{{zz{{zz{{z{{z{z{{z{zz{z{z{z{z{zz{z{{{{z{zz{z= {zz{{z{{zz{zz{{z{z{{z{{{{{{{{{z{{{{z{{{{{{{zz{zz{{{zz{{z{{{{{{{{z{{{{z{zz= {z{z{{z{z{{{{z{z{z{{z{z{z{z{{zz{zz{{{{{z{{z{{z{zz{z{zz{{z{z{{z{z{{{{z{zz{= z{zz{{z{{zz{zz{{z{z{{z{{z{{zz{{{{{{zz{zz{{{zz{{z{{{{{z{{z{{z{z{z{zz{z{z{{= z{{z{z{{{{{zz{zz{{zz{{z{{{{{z{z{{z{z{z{zz{{z{z{zz{{z{{z{zz{z{{{{z{z{z{{z{= z{{{{zz{zz{{z{zz{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{zz{zz{{{z{{{zzz{{{z{{{{zzz{{{{{{{z{{{zz{{{{{z{{zz{{z{zz{{{{{zz{zz= {{zzz{{{{{{{z{{z{{{{{z{{zz{{{z{{{z{{{{{zzz{{{{{zzz{{{z{{{{zzz{{{{{zzz{{{z= z{{{zz{zz{{{z{{zz{{z{{{{{{z{zz{{{zzz{{{{zz{{{{zz{{{z{{{{{{{{zzz{{z{{{{{{{= {z{{z{{{{{zzz{{{{{{{{{z{{{{zz{zz{{z{{{z{{{{{{z{{z{{{z{{zz{{{{zz{{{{{{{zzz= {{{zz{zz{{{zzz{{z{{{z{{{{{{z{zz{{{zzz{{{{zz{{{{zz{{{zzz{{{{z{{{{{{z{{z{{{= {{zzz{{{{{{z{{z{{{z{{zz{zz{{zzz{{{zz{{{{{{{zz{{{{{zzz{{{{{{zz{{{{z{{zzzz{= {{z{{{zzz{{{{z{zz{{{{{{z{{z{{{z{{{{{{zz{{{{zz{zz{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{= {{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{{{{{{{{z{{{{{{{{{zz{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{zz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{zzz{zz{zz{{{{zz{{{{{zz{z{zzzz{{{{{{zz{z{zz{zz{{{zz{z{{{{{{zz{z{{z{zz= {zz{{zz{zz{{{z{{zz{{{{{{{{zz{{zz{zz{{{{{{{zz{{{zz{{z{{z{zz{{{{{{{zz{zz{{{= {zz{{{{{zzz{{{zz{{{{zzz{{{zzz{{zz{{zzzz{zz{{{{zz{{{{zzz{{{{{{{zz{z{zz{zz{= {{zz{z{{{{{zz{{zz{zz{{{{{{{zz{{{zz{{z{{z{zz{{{{{{zzz{{{zz{{zzz{zz{zz{{zzz= z{{{zz{{{z{zz{zzzz{{zzz{{{{{{{{{zz{{zz{zz{{{{{{{zz{{{zz{{z{{z{zz{{{{{z{{{= {zz{z{{z{z{{{{{zz{{{z{zz{{{{{{zz{z{zz{zz{{{zz{z{{{{{zz{{zz{zz{{{{{{{zz{{{= zz{{z{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zz{z{{zz{{z{{zz{zz{{{z{{{{{{zz{z= z{{{zz{z{{z{{zz{{{{{z{{zz{{{z{{{{z{{{zz{z{{{z{{z{{{{{{{{{{z{{{zz{z{{{{{zz= {zz{{{z{{z{{{z{{{{{{{{{{zz{z{{zz{{z{{zz{{z{zz{{z{{z{{z{{z{{z{{{z{{{z{{{{z= {{zz{{z{{z{{z{{{{{zz{zz{{{zz{z{{z{{zz{{{{{{z{{{zz{z{{{{{zz{zz{{{z{{z{{{z{= {{{{{zz{{z{zz{zz{{{zz{zz{z{{{z{{{zz{zz{{{z{{{{z{{{z{{z{{{{{{{{{{z{{{zz{z{= {{{{zz{zz{{{z{{z{{{z{{{{{{z{{{zz{zz{{zzz{z{{zz{zz{{{z{{{{{{zz{zz{{{zz{z{{= z{{zz{{{{{{z{{{zz{z{{{{{zz{zz{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z= {{z{{z{{zz{{z{{{z{{z{{{{{{{z{{{z{{zz{{z{z{{{z{{{{{z{{{z{{{z{{{{z{{{zz{{z{= {zzzz{{{{{{{{{{z{{{zz{{z{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{zz{{z{{z{{zz{{z{{{{= {z{{zz{{z{{{{{z{{{{{z{{{z{{{{z{{{z{{zz{{z{{{{{{{{z{{{z{{zz{{z{z{{{z{{{{{{= z{{{zz{{z{{{{{z{{{z{{z{{z{{{z{{{{{{{z{{{{{z{{{z{{zz{{z{{z{{{z{{{z{{{z{{z{= {{{z{{{{z{{{{{{{{{{{{z{{{zz{{z{{{{{z{{{z{{z{{z{{{z{{{{{{{z{{{z{{{z{{z{{{z= {{z{{{z{{z{{{{{{{z{{{z{{zz{{z{z{{{z{{{{{{z{{{zz{{z{{{{{z{{{z{{z{{z{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8= =04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{zzzz{{{z{{{z{{{z{{{{{{z{{{z{{{z{{z{{z{= {{z{{{{{z{{{z{{{z{{{{z{{{z{{z{{{z{z{{{{{{{{{{{z{{{z{{z{{{{{z{{{{z{{z{{z{{= {z{{{{{{{{{{z{{z{{zzzz{{{z{{{{{zzzz{{{{{z{{{{{z{{{{z{{{z{{{{z{{zzzz{{{{{z= {{{{{{z{{{z{{{z{{z{{z{{{z{{{{{{z{{{z{{z{{{{{z{{{{z{{z{{z{{{z{{{{{{z{{{{{z= {{{{z{{z{{z{{z{{{z{{{z{{{{z{{z{{{{z{{{{{z{{{{{{{{{{{z{{{z{{z{{{{{z{{{{z{{= z{{z{{{z{{{{{{{z{{z{{{z{{{z{{{z{z{{{{z{{z{{{{{{z{{{z{{{z{{z{{z{{{z{{{{{{z= {{{z{{z{{{{{z{{{{z{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{{{{{= z{{zz{{z{{{{{{{z{{zz{{{z{{z{{z{{z{{{{{{z{{z{{{z{{{{z{{{{z{{z{{{z{z{{{{{{{= {{{z{{{{z{{z{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{{z{{z{{z{{{{{{z{{{{{z{{{{{{{{{z= {{{{{z{{z{{{z{{{{z{{{z{{{{{{{{{z{{{{{z{{zz{{{z{{z{{z{{z{{{{{{z{{{{z{{z{{{= {{z{{{z{{z{{z{{{z{{{{{{{z{{{{{z{{{z{{{z{{z{{z{{{z{{{z{{{z{{z{{{{z{{{{{{{z= {{{{{{{{{z{{{{z{{z{{{{{z{{{z{{z{{z{{{z{{{{{{{z{{{z{{zz{{z{{{z{{z{{{z{{z{{= {{{{{z{{zz{{{z{{z{{z{{z{{{{{{z{{{{z{{z{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{z{{z{z{zz{{z{{z{z{z{zz{z{{{{{z{z{z{zz{{z{z{z{zz{z{{{{z{z= z{z{z{{{{z{z{z{{z{z{z{{z{z{zz{{{{{z{z{z{{z{z{{{{zz{zz{{z{zz{z{z{{{{{{{{{{= z{{z{z{zz{{z{{zz{{z{zz{{z{{z{{z{{z{{z{{z{z{z{z{{z{z{zz{{z{{z{{z{{{{{z{z{z= {zz{{z{z{z{zz{z{{{{z{z{z{{z{z{{{{zz{zz{{z{zz{z{z{{{{{{{zz{{z{zz{zz{{z{{z{= {z{z{{z{{{zz{zz{{z{{{{z{z{{z{{z{{zz{{{{{z{z{z{{z{z{{{{zz{zz{{z{zz{z{z{{{{= {{{z{z{z{z{z{zzz{zz{{zz{zz{{z{{{{{{{z{z{z{zz{{z{z{z{zz{z{{{{z{z{z{{z{z{{{= {zz{zz{{z{zz{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{{zzz{{{{z{{zz{zz{{{{= {{{z{{zz{z{{{z{{{z{zz{{{{{{z{zz{{z{{{{{z{{z{{{z{{z{{{z{{{z{{{{{{z{{z{{{z{= {{{{{zz{{{{zz{zz{{z{{{{{{{{{{z{{{z{{{zzz{{{{zzz{{{zzz{{{zzz{{{zzz{{{{z{{z= z{{{{z{{{zzz{{{zzz{{{{{{{z{{zz{z{{{z{{{z{zz{{{{{{z{{z{{{z{{{{{{zz{{{{zz{z= z{{z{{{{{{{{zzz{{{zz{{{{z{{z{{{z{{z{{{{{zz{{{{z{{{{zz{{{zzz{{{{z{{{{{{z{{= z{{{z{{{{{{zz{{{{zz{zz{{z{{{{{{{{z{{{z{{zz{{zz{{{{{zz{{{{z{{{{{{{{z{{zz{z= {{{z{{{z{zz{{{{{{z{{z{{{z{{{{{{zz{{{{zz{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{{{{zz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zz{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{= {{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{= {z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{z{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= {{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zzzz{zz{zz{{zz{{z{{{zz= z{{{{zz{{zzz{zz{zz{{{{zz{{{zz{zz{{zzzz{{zzz{{{{{{{{{{{{z{{{zzzz{{{zz{{z{{= zz{{{zz{{{{{{{{{{{zzz{{{zz{z{zz{zz{{{{zz{zz{{{z{zz{{{zz{{zz{{zz{{{zz{{{zz= {zz{{zzzz{{{{zzzz{{z{zz{{{{zz{{{{{{{zzzz{{{zz{{zz{{zz{{{zz{{{z{zz{zz{zz{z= zz{zz{zz{{{{zz{{{zz{zz{{zzzz{{{{zzzz{z{zz{{{zz{{zzz{zz{zz{{{{zz{{z{{zz{{{= zz{z{{zzz{{zzzz{zz{{zz{zz{{{zzzz{{{{zzzz{{z{zz{{{{zz{{{{{{{z{{{{zz{z{{z{z= {{{{{zz{{{z{zz{{{{{{zz{{{zzzz{{{{zzzz{{z{zz{{{{zz{{{{{zz{zz{{{{{zz{{{{{zz= {{zz{zz{{{{z{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{zz{zz{{{zz{zz{z{{{z{{z{{z{{z{{zz{{z{{{zz{zz{z{{zz{{z{{{zz{z{{{z{{{z{{= z{{{{{{{{{{{{z{{{{z{{{{{{z{{z{{z{{zz{{z{{{{{{{{zz{{z{zz{zz{{{zz{z{{{{{zz{= {z{{{z{{{zz{{z{{z{{{z{zz{{z{{{zz{z{{{z{{{{{{{z{{{{zz{z{{zz{{z{{{{{z{{z{{z= z{zz{{z{{{z{zz{{z{{{z{{{{zz{z{{{zz{zz{z{{zz{{z{{{zz{z{{{z{{{{{{{z{{{{z{{{= zz{zz{{{zz{zz{z{{{{{z{{z{{z{{zz{zz{{z{{z{{{z{{{{z{{{zz{z{{z{{z{{{{{{z{{{{= zz{z{{zz{{z{{{{{z{{{zz{zz{{zzz{z{{zz{zz{{{z{{{{{{zz{zz{{{z{{{{{{{z{{{{zz{= z{{zz{{z{{{{{zz{{z{{zz{{z{{zz{zz{{zz{{z{{z{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{zz{{z{{z{{z{{z{{{z{{{{{z{{zz{{z= z{{z{{z{{z{{zz{{zz{{z{{z{{{{z{{{{{{{{{{{{{{{z{{{{z{{{{{{z{{z{{z{{z{{zz{{{= {{{{{z{{{{{z{{{z{{zz{{z{{{{{z{{{z{{z{{{{z{{zz{{z{{z{{z{{zz{{zz{{z{{z{{{{{= {{z{{{{zz{{z{{z{{zz{{{{z{{{z{{z{{{z{{z{{z{{z{{zz{{z{{{{zz{{z{{zz{{z{{z{{z= {{zz{{zz{{z{{z{{{{{{{{z{{{z{{{{z{{{z{{zz{{z{{z{{{{{z{{z{{z{{z{{{z{{z{{{{{= z{{{{z{{{zz{{z{z{{{z{{{{{z{{{{zz{{z{{z{{zz{{{{{z{{{z{{{z{{z{{{z{{z{{{z{{z= {{{{{{{z{{{z{{{z{{{{{{z{{{{zz{{z{{z{{zz{{{{{z{{{z{{z{{zz{{z{{{z{{z{{{z{{z= {{{z{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{= z{{z{{z{{{z{{z{{{{z{{{zzzz{{{{z{{z{{z{{zzzz{{{{z{{z{{{z{{{{{z{{{{{{{{{{{{= {z{{{{z{{{{{{{z{{z{z{{zzzz{{{{{{{{{z{{{{{z{{{z{{{z{{z{{{{{{z{{{z{{z{{{zzz= z{{{{z{{z{zzzz{{{{z{{z{{{z{{{{{{{z{{{{z{{z{{zzzz{{{{{{z{{z{{z{{{{z{{z{{z{= zzzz{{{{z{{{{z{{z{{{z{{z{{z{{zzzz{{{{z{{z{{{z{{{{{{{z{{{{z{{{z{{{{z{{z{{z= {{z{{{{{{z{{z{z{{z{{{z{{{{z{{{{z{{{{z{{{z{{z{{z{{z{{{{{{z{{{{z{{z{{zzzz{{= {{{{{z{{z{{{z{{{z{{{z{z{{{{z{{z{{{{{{z{{{{z{{z{{{{{{{z{{{{z{{z{{zzzz{{{{{= {{z{{{z{zzzz{{{z{{{{z{{z{{{z{{z{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{zz{{{z{{z{{z{{z{{z{{{{{{z{{z{{{{{{{z{{z{{z{{z{{{= {{{{z{{z{{z{{{{{{{z{{{{{{{{{{{{z{{{{z{{{{{{{z{zz{z{{z{{{{{{{{{{{{z{{{{{z{= {zz{{{z{{z{{{{{z{{{z{{z{{{{z{{{{{{{z{z{{z{{{{{{{z{{z{{z{{{{{{{z{{{{{z{{z{= {z{{{{{{{{{{zz{{{z{{{z{{{z{z{{z{{{{{{z{{{{{z{{z{{{z{{z{{z{{z{{{{{{{z{{z{{= z{{{{{{{{z{{{z{{{{z{{{z{{{z{{z{{z{{{{{{z{zz{z{{z{{zz{{{{{z{{z{{{{z{{{{z{{= z{{{zz{{{{{{z{{{{{z{{z{{z{{{{{{{{{z{{{z{{zz{{z{{{z{{z{{{z{{z{{{{{{{z{{{z{= {{z{{{{{{z{{{{{z{{z{{z{{{{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{zz{{z{{z{z{z{z= z{z{z{{z{{zz{{z{{z{{z{{z{z{zz{{z{{z{{z{z{z{z{{z{{z{{z{{{{{{{{{z{{{{z{{{{{= {{zz{zz{{{zz{{z{{{{{{{{zz{{z{z{z{z{zz{{z{z{{{{z{{zz{{z{{{{zz{{z{{{zz{{{zz= {{z{{z{{z{z{z{z{{{{{z{z{{z{{z{z{zz{{z{{{{{z{{{{{zz{zz{{{zz{{{zz{{z{{z{{{{= z{{z{z{z{{z{{z{z{zz{{z{{z{{z{z{z{z{{{{{{z{{{z{{{{zz{zz{{z{{z{{z{z{{{{{zz{= zz{{{z{z{z{zz{{z{{z{z{{z{z{z{{z{z{z{{{{{{{{z{z{{z{{z{z{zz{{z{{{{{z{z{z{z{= z{zzz{zz{{zz{zz{{z{{{{{{{zz{zz{{{z{{{{{{z{z{{z{{z{z{zz{{z{{{{{z{{zz{{zz{{= z{{zz{zz{{z{{zz{{z{z{zz{{z{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{zz{z{{z{{{z{{zz{zz{{zzz{{{{zzz{{{z{{z{{{z{{{zzz{{{z{{{z{{z= z{{{zzz{{{z{{{{{{{{zzz{{z{{{{{{{{z{{z{{{{{zzz{{{{{{{{{{zzz{{{z{{zz{z{{{z{= {{{{zzz{{{{z{{{{{zzz{{{{z{{{{{zzz{{{z{{{z{{zz{{{{{{zz{{{z{{{z{{{zzz{{{{{{= zzz{{{{zz{{{{{z{{{{{zzz{{{z{{{{z{{{z{{z{{z{{{z{{{zzz{{{z{{{z{{zz{{{{{{z{{= {{z{{{{{zz{{{{z{{z{{{z{{{{{{z{{z{{{{{z{{zz{zzz{{{zz{{{{z{{z{{{z{{zzz{{{{{= {zz{{{z{{{z{{{zzz{{{{{{{z{{{z{{zz{{zz{{{{{zz{{{{z{{{{{{{{zz{{{{z{{{{{{{zz= {{{z{{{z{{{zzz{{{{{{zzz{{{{{zzz{{{{zz{{{{zzz{{{{{z{{{zzz{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zz{{zz{{{{{zz{{{{{{{{{{{{{{{z= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{zzzzzzz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{z= z{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4= =1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{z{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{z{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zz{{z{{zz{zz{{{zz{z{{{{zz{{{z{zz{{{{zzzz{{z{zz{{{{zz{{{{{{= {{zz{zz{{{z{zz{{{zz{{{zzzz{{{zz{{{zz{zz{{{zzz{{{{zz{{{{{{{{zz{{{zzzz{{{{{= {zzz{{{zz{z{z{zz{zz{{zz{zz{{{zzzz{{{{zzzz{{{zz{{{z{zz{{{{zzzz{{z{zz{{{{zz= {{zzz{zz{zz{{{{{{{{{zzzz{{z{zz{{{{zz{{zz{{zz{{{{zz{{z{{zz{zz{{{z{{{z{{{{{= {z{z{{{{{zz{{{{{{{z{zz{{{{zz{zzz{zz{{zz{zz{{zz{{zz{{{{z{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{zz{{{{zzz{{zz{zz{zzz{{{{zzz{{{{zzz{{{{= {{{{{{z{{{{zzz{{zzzzzzzz{{zzz{{z{zzz{{zzz{{{zzz{{zz{zz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{zz{z{{z{{zz{{zz{{z{= {{z{{{{{{{z{{{{zz{z{{zz{{z{{{{{{{{zz{{z{{{z{{{zz{{z{{{z{{{zz{{z{{{zz{z{{z= {{z{{zz{{z{{{{{zz{zz{{{z{{{{{{zz{{z{zz{zz{{{z{{{{z{{{zz{z{{z{{z{{{{{{z{{{= zz{zz{{{z{{{{{{{z{{{{zz{z{{zz{{z{{{zz{zz{z{{{{{{{{{{z{{{{zz{z{{zz{{z{{z{{= {z{{{{{z{{z{{z{{{z{{z{{{z{{{{{{zzz{z{{zz{{z{{{{{{zz{z{{zz{zz{{zz{{z{{zz{{= z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{zz{zz{{zz= {zz{{zz{zzz{zz{{zz{{z{{z{{z{{{{{{{{{{z{{{z{{{z{{z{{{z{{{z{{{z{{zz{z{z{{z{= {zz{zz{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{z{{{zz{{z{z{{{z{{{z{{zz{{z{{{{{{{z{{{{zz{{z{{z{{zz{{{{{{{{z{{{z{{z= {{{{z{{zz{{z{{{{z{{zz{{zz{{z{{z{{{{{z{{zz{{{{{z{{{z{{{z{{{{{{z{{{{{z{{{z{= {z{{{{z{{{zz{{z{z{{{z{{{{{{z{{{z{{{z{{z{{{{{{{z{{{{zz{{z{{z{{zz{{zz{{z{{z= {{{{{{{{{z{{{{zz{{z{{z{{zz{{z{{{z{{{{{z{{z{{z{{z{{{z{{{z{{{{{{z{{{z{{z{{z= z{{{{{zz{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{z{{{z{{z{{{z{{z{{{z{{{z{{{{{zz{{zz{{{{{{{{{{{{z{{{z= zzzz{{z{{{z{{{zzzzz{{z{{{{zz{{{{z{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{z{{{z{{zzzz{{{{z{{{{{{{z{= {{{z{{z{{zzzz{{{{{{{{{{z{{{z{{z{{{zzzz{{{{z{{{zzzz{{{{z{{z{{{{z{{{zzzz{{{= {{{z{{{{z{{z{{{{{{z{{{{{z{{{z{{{z{{{{z{{{z{{z{{z{{z{{{{{{z{{{z{{{{z{{z{{{= {{{{z{{{{z{{z{{zzzz{{{{z{{z{{z{{{{{{{{{{z{{{{z{{z{{zzzz{{{{z{{z{{{{{{z{{z= {z{{{z{{{z{{{z{{{{{{z{{{z{zzzz{{{{{{{z{{z{{z{{{z{{{z{{{z{{z{{{z{{z{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{zzzzzzz{{{{{{{{z{{{{{z{{{z{{z{{{z{{z{{{z{= {{z{{{zz{z{{{zz{{{{{{{{{{{z{{{z{{{{{{z{{{z{{{z{{{{{{z{{{{{zz{{{z{{{z{{z{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{= z{{z{{z{{z{{{z{{{{{{z{{{{{{{z{{{{{z{{z{{z{{{{{{{{{{{{z{{{z{{z{{{{z{{{{{{z= {{{{z{{{{{{{z{{z{{{{{z{{z{{{{{{{{{z{{{z{{{z{{{{{{z{{{{{z{{zz{{z{{{{z{{{{z= {{z{{{zz{{{{{{{z{{{z{{{z{{z{{{{{{{z{{{{{z{{z{{z{{{{{{{z{{z{{z{{{{{{{{{z{{= {{{z{{z{{z{{{{{{{z{{z{{{{{{z{zz{z{{z{{{z{{{z{{{{{{z{{{z{{z{{{{{{{{{{z{{z{= {z{{zz{{z{{{z{{z{{{z{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{{{zz{{{{{{{{{{z{{{z{{{{{{z{{{z= {{{z{{{{{{z{{{{{{zz{{z{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{zz{z{z{{z{z{z{zz{z{zz{{z{{z{{{{{{{z{z{{z{{z{z{zz{= {z{{{{{{{{z{{zz{{z{{{{zz{{z{{z{z{{zz{{z{{z{{z{z{z{{z{{zz{{z{{{{{zz{zz{{{z= {{{{{{zz{{z{z{z{z{zz{{{{z{z{z{{z{z{z{{{{{{{{{z{{{zz{zz{{z{{{{{{{z{z{{z{{z= {z{zz{{z{{z{{z{{z{z{zz{{{{{z{z{{z{{z{z{zz{{z{{{z{z{{{{{{{zz{zz{{{z{z{z{z{= z{z{{{{zz{zz{{zz{{z{{{{{z{{z{z{z{z{z{zz{{zz{{z{{zz{{{z{z{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{zz{zz{{z{{{z{{{z{{zz{{z{{= z{{z{{{{{{{{z{z{{{zz{{{z{z{{{z{{{zz{{{z{z{{{{z{{z{{zz{zz{{z{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zz{{z{{{z{{{z{zz{{{= zzz{{{z{{{{{{{zz{{{z{{{z{{{zzz{{{{{{{{{zzz{{{{z{{{{{zzz{{{zz{{{{zzz{{{z{{= {z{{zzz{{{{zzz{{{{{{{zz{{{{z{{{{{{{{zzz{{{z{{zz{z{{{{{z{{z{{{z{{zzz{{{{{{= z{{{{{zz{{{{z{{{{{{{zz{{{z{{{z{{{zzz{{{z{{z{{{z{{{z{{{{{zz{{{z{{{z{{{zzz{= {{{{z{{{{{{{{z{{z{{{{{z{{{z{{{z{{{{{{zz{{{{{zzz{{{{{{z{{{z{{{z{{zz{zzz{{{= {zzz{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{= zzz{{zzz{{zzz{zzz{zzz{{zzz{z{zzz{{{{{{{{{zz{{{{{zzzz{zzzzzzzz{{zzzz{zzz{{= {zzz{{{{zzz{{zzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||= ~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{z{z{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zzz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{zzz{{{{zzz{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF= =FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{zzzzz{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{= zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzz{zz= zzz{{{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zzz{{{z{zzzzzzzzzzz{zzzzzzzzz{zzzzzzzzz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzz{zzzzzzz{z{z{z{zzzzz{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzzzzzzzzzzzzzz{zzzzzzzzzz{{{{{{z{{{z{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzz{{{{{zzzzzzzzzzzz{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzz{z{z{zzzzz{{{{{zzzzz{{{z{= zzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz= zz{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzz{zzzzz{{zzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{zzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzz{{{{{z{z{zzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{z= zzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{zzzzzzz= zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zzz{{z{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{z= zzzzzzzzzzzzzzzzzzzzzzzzz{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{{{{{{{{{{{{zzzzzzz{{{{{{{{{= {{{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zzzzzzzzzzzzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{z{z{zzzzzzzzzzzzzzzzzzzzz{z{zzzzzzzzzzzzzzz{z{zzzzzzz{z{zzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{z{zzzzzzzz{{= {{{{{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{zzzzzzzzzzz{{{{{{{= {{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{zzzzzzzzzzz{zzzzzzzz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{zzzzz{{{{{{{{{{{{{zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzz{zzzzzzzzzzz{zzzzz= zzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz= zzz{{{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{{{{{{zzzzzzzzzzzzzzzzzz{{{{{{{{{{{zzzz= zzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{zzzz= zzzzz{zzzzzzzzzz{{z{{{{{{{{{zzzzzzzzzz{{{zzzzzzz{{{{{{{{{{{zzzzzzzzzzzzzz= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzz= zzzzzzzzzzzzz{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{zzzzzzzzzzz{{{{{{{{{zzzz= zzzzzzzzzzzzzzzzz{{{{{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{zzzzzzzzzz= zzzzzzzzzzzzz{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{zzzzzzzzzzz{{zz= zzzzzz{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{= {{{{{{zzzzzzzzzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{zzzzzzzzzzzz{{{= {zzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{zzzzzzzzzzzzzzzzzz= zzzzzzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzz= {z{zzz{z{zzzz{{zzzzzzzzzzzzzzzzzzz{z{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zzzzzzzzzzzzz{{{z{{{{{zzzzzzzzzzzzzzzz{{{{{{{zzzzzzzzzzzzzzzzzzzz= zzzzzz{{{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz= zz{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{{zz= zzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zzzzzzzzzzz{{{{{zzzzzzzzzzzz{{= {{zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{= {zzzzzzzzzzzzzzzzzzzzz{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{= zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{= zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{zzzz= zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzzzzzzzz{{{{zzzzzzzzzzzzzzzzz= zzzzzzzzzz{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{zzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{zzzz= zzzzzzzzzzz{{zzzzzzzzzzzzz{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{zzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{zzzzzzzzzzz= zzzzzzzzzz{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzz= zzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzz{{{{{{{{{zzzzzzzzzzzzz{{{{{{{zzzzzzzzzzz{{{{{zzzzzzzzzzz= z{{{{zzzzzzzzzzzz{{{zzzzzzzzzzzzzz{{{{{zzzzzzzzzzzzzz{{{{{zzzzzzzzzzz{{{{= {{{{{{{zzzzzzzz{{{{{zzzzzzzzzzzzzzzzzzzzz{{zzzzzzzzzzzzzzz{{{{zzzzzzzzzzz= z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{zzzzzzzzzzz{{{{{= {{{{{{{zzzzzzzzz{{{zzzzzzzzzzzz{{{{{zzzzzzzzzzzz{{{zzzzzzzzzzzz{{{{{{{{zz= zzzzzzzzzzz{{{{zzzzzzzzzz{{{{{{{{{{{{{{{zzzzzz{{{{{zzzzzzzzzzzzzzzzzzzzz{= {zzzzzzzzzzzzz{{{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C= =AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzz{{{{{{zzzzzzzzzzzz{{{{{{{{{{{zzzzzzzzzz{{{zzzzzzzzzzzz{{{{zzzzzzz= zzzzz{{{zzzzzzzzzzzzz{{{{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzz{{{{{{{{{{{{{{{{z= zzzz{{{{zzzzzzzzzzzzzzzzzz{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{zzzzzz{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{zzzzzzzzzzzz{{{{{{{{{{zzzzzz= zzzzz{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{zzzzzzzzzzzz{{{{{{{{{{zzzzzzzzzzzz= {{{{zzzzzzzzzz{{{{{{{{{{{{{{{{zzzz{{{{{zzzzzzzzzzzzzzz{{{{{{{{{zzzzzzzzzz= z{{{{{{{{{{{{{zzzzzzzz{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{z{{{{{{{{{zzzzzzzzzzzz{{= {{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzzzzzzzzzzzz{{{{zzzzzzzzzzzz{{zzzz= zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz{{{{{{{{{{{{{{{{zzz{{{{{{zzz= zzzzzzzzzz{{{{{{{{{{zzzzzzzzzzzzz{{{{{z{{{zzzzzzzzzzz{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz= zzz{{{{{{{{{{{{{{{{zzzzzzzzzzz{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzzz= zzzzzzzz{{{{{zzzzzzzzzzzz{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz= zz{{{{{{{{{{{{{{{{{zzz{{{{{{zzzzzzzzzzzzz{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzz{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{zzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{zzzzzzzzzz{{zzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzz{{zzzzzzzzzzzz{{{{zzzzzzzzzzzzz{{zzzzzzzzzzzz{{{= {{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz{{{z{{{{{{{{{{{{zzz{{{{{zzzzzzzzzzzzz{{= {{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{= {{{{{{{{{{{zzzzzzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzzzzzzzzzzz{{{= {zzzzzzzzzzzz{{{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzz= zzzz{z{zzz{{{{{{zzzzzzzzzzzz{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}= }{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{zzzzzzzzz{{zzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzz{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{zzzzzzzzz{zzzzzzzz{zzzzzzzz{{{{{{zzzzzzzzzzzz{{{{{{{{{{{zzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{zzzzzzz= zzzz{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{zzzzzzzzzzzzz{{{{zzzzzzzzzzzz{{= zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{{zzzzzzzz{zzzzzzzz{{{{{= {zzzzzzzzzzzz{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz= zzzzzzz{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{= {zzzzzzzzzzz{{{{{zzzzzzzzzzzz{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= zzzzz{z{zzzzz{zzz{zzzzzzz{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{zzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{zzzzzzzzzzzzz{{zzzzz= zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzz{{{{zzzzzzzzzzzz{{{zzzzzzzzzzz= z{{{{{{{{{{zzzzzzzzzzzz{{{{{{{zzz{z{{{{z{{{{{{{{{zz{z{z{{{{{{{zzzzzzzzzzz= z{{{{{{{{{{{{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzz{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzz= z{{{{zzzzzzzzzzzz{{{zzzzzzzzzzzz{{{{{{{{{{zzzzzzzzzzzz{{{{{{{zzz{zz{z{{z{= z{zz{{{{zzzzz{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{= {{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{zzzzzzzzzzzz{{{{= {{{{{{{{{{{{zzzzz{{{zzzzzzzzzzzz{{{{{zzzzzzzzzzz{{{{zzzzzzzzzzz{{{{{{{{{z= zzzzzzzzzzzz{{{{{{{{zzzzz{zz{{{zz{{{{{{zzzzz{{{{{{{zzzzzzzzzzzz{{{{{{{{{{= {{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzz{z{z{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{zzzzzzzzzzzz{{zzzzzzzzzzzzz{{{{zzzzzz= zzzzzz{{{{zzzzzzzzzzzz{{{{{{{zzzzzzzzzzzzz{{{{{{{{{zzz{z{{{{{{{{{zz{{zzzz= {z{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{= {{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{zzzzzzzzzzzzzzz{{{zzzzzzzz= zzzzzz{{zzzzzzzzzzzz{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzzzz{{{{zzzzzzzzzzzzzz= {{{{{{{{{{{{zz{{z{{{{{{{{zzzzzz{z{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{zzzzzzzzz= zzz{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{zzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzz= zzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{= {{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{zz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{zzz{{z{{zz{{{{{{{z{zz{{{{{{{{zzz= zzzzzzzz{{{{{{{{{{{{{zzzzzzzzzzzzzzz{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{z{zzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{zzzz= zzzzzzzz{{{{zzzzzzzzzzzz{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{z= {z{z{{{{{{{{zzzzz{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzz= zzzzzzzzzz{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{zzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{z{z{z{z{z{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{{{{= {{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{zzzzz= zzzzzzzzzzzzzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{zzzzzzzzzzz= zzzzzzzzzzzzzzzzz{{{{{{{{{{{{{zzzzzz{z{{{{{{{{zz{z{{{{{{{{zzzzzzzzzzzz{{{= {{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{zzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzz{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{zzzzzzzzzzz{{{{= {zzzzzzzzzzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{zzzzz{z{{{{= zzzzzzzz{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{= {{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{zzzzzzzzzzzzzzzz= zzzzzzz{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzz= zz{{{{{{{{{{{{{{{{zzzzz{z{{{{{{{{{{z{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{= zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{z= zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz= zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{= {{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzz{{{{{{{zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{= {{{{{{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{zzzz{{{{{{= {{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{zzzz= zzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{= {zzzzzzzzzzzz{{{{zzzzzzzzzzzz{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{= {{{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{zzzzzzzzz= zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{zzzzzzzzzzzz= zzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz= zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzz{{{{{{{{{zzzzzzzzzz= zz{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= zzzzzzzzzzz{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzz{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzz= zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzz= zzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz= zzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzz= zzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{zzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {zzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzz= zzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{zzzzzzzzzzzzzzzzzzzz= zzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{zzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{= {{{{zzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=01= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zz= zzzzzzzzzzzzzzzzzzzzz{z{z{{{{{z{zzzzz{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= zzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzz{{zzzzzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzz{z{zzz{zzzzzzzzzzzzzz= zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= z{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzz= zzzzzzzzzz{{{{{z{zzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{zz{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{z{zzzzzzzzzzzzzzzzzzzzzzz{z{z= zzzzzzzz{z{zzz{zzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{zzzzzz{{= {{zz{{{{{{zzzzzzz{{{{{{{{{{{z{{zz{{{{{{{zzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{= {{zzzzzzzzzzzzzzz{{{zzzzzzzzz{{{zzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zz{{{zzzzzzzzz{{{zzz{{{{zzzzzzzz{{{{{{{{{{zz{{zz{{{{{{zzzzz= zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zzzzzzzzz{{{{zz{{{{zz{{{= {zz{{{{{{{{{{{z{{zz{{{{{{zz{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz= zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{zzzzzzzzzzzzzzzzzzzzz{zzzzz{zzzzzzzz= zzzzzzzzzzzzzzzzz{{{zzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {zz{{{{zz{{{{{zz{{{{zz{{{{zz{{{{zz{{{zzzzz{{{z{{zz{{{{{zzz{{{{{z{{{zzzzz{= {{zzzzzzzzzz{{{zzzzzzzzzz{{{z{{{{z{{{zzzzz{{{z{{{{zzz{{{{{zzz{{{zzzz{{{{{= {{zzz{{{{{{{{z{{{{{{z{{{{{{{{zz{{{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{zzzzzz= zzzzzzzzzzzzzzz{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{zzzzzzzzzzzzzzzzzzzzz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{{{{zz{{{{{z{{{{zzzzzzzz{{zzzzzzz= {zz{{zz{{{{{zz{{{{{{{{{zzzzzzz{zzzzzzzzzzzz{zzzzzzzzzzzz{zzz{{{zz{zzzzzzz= {zzz{zzzzzz{{zzzzzzzzzzzzzzz{{{zzzzzz{{zzzzzzz{{zzzzz{{{{{{zz{{{{zzz{zzzz= zz{{{zzzzz{{{zzzzz{{{zzzzzz{{zzzz{{zzzz{{{zzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{zzzzzzzzzzzzzzzzz{z{{{{{zzzzzzzzzzzzzzzzzzzzzz= zzzzz{{zzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{{= {{{z{{{{{zz{{{zzzzzzzz{{zz{{zzz{zzz{zz{{{{{zz{{{{{{{{{zz{{{zz{zzz{{zzz{{z= z{zzz{{zzz{zzzzzzz{{zzz{zzz{zzz{zzz{zz{{zzz{zz{{{zz{zzz{{zz{{zzz{{zz{{zzz= zzzz{zzz{zzz{{{{{zzzzzzzz{{zzz{zzz{zz{{zz{{zzz{zzz{{zzz{zz{{zzzz{zzzzzzz{= zzzzzzz{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{zzzzzzzzzzzzzzzz= zzzz{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{zz{{{zzz{{{{{{zz{{{{zz{{{zz{{{{zzzzzzzzzzzzzzz{zz{{{{= {zz{{{{{{{{{z{{{{{zzzzz{{zzz{{zz{zzz{{zzz{{zzzzzz{{zzz{zz{{{zz{zzzzzz{{{{= {{{{{{zzz{zzz{{zzzzzz{{{zzzzzz{{{zzzzzzzz{{{{{{{zzzzzzzz{zzzzzzzz{zzz{{{{= {zz{{{zz{{{{{{zz{{zz{{{zz{{{zz{zz{{{zz{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{{{{{zzzzzzzzzzzzzzzzz{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzz{{{{{zzz= zzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zzz{{{{{{{zzz{{zzz= {{{zz{{{{{zzzzzzzzzz{zzz{zz{{{{{zz{{{{{{{{zzz{{{{zzzzz{{zzz{{zz{zzz{{zzz{= {zz{zzz{{{zz{zz{{{zz{zzzzzz{{{{{{{zzzzzz{zzz{{zzzzzz{{{{zzzzz{{{zz{{zzzzz= z{{{{{zzzzzzzz{zzzzzzzz{zzzzzz{{zzzzzzzz{{zzzzzz{zz{{{zz{{{{{{{z{{{{z{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{zzzzzzzzzzzzzzzzzz{z{{{{{{z= z{zzzzzzzzzzzzzzzzzzzzz{{{{{zzzzzzzzzzzzzzzzzzz{zzz{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zz{{zzzzzzzzzzzzz{{zz{{{{zz{{{{zzzzzz{{{zz{zzz{zz{{{{{zzz{{{{zzz= zzz{{{zzzzzz{{zzz{{zz{zzz{{zzz{{zz{zzz{{zzz{zz{{{zz{zzzzzz{{{zzzzz{{{zz{z= zz{{zz{zzz{{{{zz{zz{{{zz{{{{zzzz{{{{{zz{{{{zzzzzz{{{{{{{{{zzzzzzzz{{{{{{z= z{{{z{{zz{{{zz{{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{zzzzz{zzzzzzzzzzz{{{{{{{{zz{{{z{z{z{z{z{z{z{z{zzz{{{{{zzzzzzzzzzzzzz= zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zzzzzzzzzzzzzz{{zz{{{{zzzzzzzz= {{zzzzzzz{zzz{zz{{{{{{zzzzzzzz{{zzzzzzz{zzz{{zzz{{zz{zzz{{zzz{{zz{{zzzzzz= z{zz{{{zz{zz{zzzzzzzzzzzz{zzz{zzzz{zz{{zzz{zzz{{zz{{{zzzzz{{{zz{{{{{zz{{{= {zz{zzz{{zzz{zz{{{zz{zzz{{zzzzz{{{zz{{zz{{{zz{{{zz{zz{{{zz{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zzzzzzzzz{zzzzzzz{z{z{{{{zz{z{zzz{zzz= zz{z{z{zzzzz{{{{{zzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= zzzzzzzzzzzzzzz{zzz{{{{{zzzzzz{{{{{zzz{{{{z{{zz{{{{{{{zzzzzz{{{{zzzzz{{{z= z{{zz{{{zz{zzz{{zz{{{zz{{zzzzzzz{zz{{{zz{zz{{{zzzzz{{zzzzzzz{{zzzzzz{{{zz= zzzz{{zz{{{zz{{zzzzzz{{{{{zz{{{{zzz{zzzzzzz{zzzzzz{{{zzzzzz{zzzzzzzz{zz{{= {{zzzzzz{zz{{{zz{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{zzzz= {{z{zzzzz{z{{{{{{{{zz{{{z{{{z{z{{{{{{{zzzz{{{{{{zzz{zzzzzzzzzzzzzzz{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{zzz{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{z{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{zzz{= {{{{zzz{{{{{{zzz{{{{zzzzz{{z{{{{{{zzzz{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{zzzzzzz{zzzzzzz{z{z{z{{{{zz{zzz{z{z{z{z{{{z{zzzz= {{{{{{zzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{= {{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zzzzzzz{{{zzz{{{z{{= {{{{{{zz{{{z{{{{{{{{{{{{{z{z{{{{{{{zzz{z{z{z{z{z{zz{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{zzzzzzz{z{{zzzz{z{z{z{{{{zzzzzz{z{z{z{z{z{z{zzz{{{{{{{z{zzzzzz= zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{zzzzz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zzzzzzz{{{{{z{z{z{{{{{{{{{z{z{{= {z{{{{{{{z{z{z{{{{{{{{{{{zzz{z{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{zzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z= zzzzzzz{{{zzzz{z{z{z{{{{{zzzzz{z{zzz{zzz{zzz{{{{{{{{{{zzzzzz{z{zzzzz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{zzzzzzz{{{z{z{z{{{{{{{{{{{z{z{z{z{z{z{z{z= {{{{{{{{{{{{{zzz{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{zzzzzzz{{z= zzz{z{z{{{z{{{{{{{zzzzzzzzzzzzz{{{z{{{{{{{{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{zzzzzzzz{{z{z{z{{{{{{{{{{{{{{{zzzzzzzzz{{{{{{{{{{{{{= {{zzzzzzz{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{zzzzzzzzzzzzzz{z{z{z{z= {z{z{{{{{{zzzzzz{{{{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{{{{zzzzzzzzzz{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{z{z= {z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{zzzzzzzzzzzzzz{z{z{{{z{z{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{zzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{zz= zzzzzzz{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{{z{z{zzz{z{{{z{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{zzzzzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{z{= zzz{z{zzzzzzzzzzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{zzz{{{z{z{z{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{zzz{{{z{z{{{{{z{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{{{{z{{zzzzzz{z{z{{{z{{{{{{{{{z{{{{{{{{{{{{{z{zzzzzzz{z{z= zzzz{z{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{z{z{z{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{zzzzz{z{{{{{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{zzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{z{z{z{zzzzzzz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{z{z{z{z{{{{{{{{{{{{{{{z{z{{{{{= {{{{{{{{z{{{{{{{z{z{{{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z= zzzzzzzz{z{{{z{z{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{zzz{zzz{zzz{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{z{z{z{z{z{{{{{{{{{{{{{z{zzzzzzz{{{{{{{{{{= {{{{{z{z{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zzzzzzzzzzzz{= z{{{z{{{{{{{{{zzzzzzzzzzzzz{{{{{z{z{zzzzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{zzzzz{zzz{z{z{z{{{z{{{{{{{{{{{z{z{z{{{zzzzzzzzzzzzzzz{z{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzz{z{zzz{{{{= {{{{{{{zzz{{{{{zzzzzzzzzzzzzzz{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{zzzzzz{zzzzz{z{z{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{z{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzz{z{zzz{{{{{{{{{{{{{{= {{{{{{{{{zzzzz{z{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{zzzzzzzz{z{= zzzzz{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{z{z{z{{{{{z{z{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzz{z{zzz{{{{{{{{{{{z{z{zzzzzzzzzzzz= z{zzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{zzzzzzzzz{z{zzzzzzz{z{z= {z{z{{{{{{{{{{{{{z{z{zzzzz{z{z{z{z{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6= =C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{zzzzzzzzzzzzzzzzzzzzzzzz{zzz{{{{{{{{{{{{{zzzzzzzzzzzzzzz{zzzzz{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{zzzzzzzzzzzzz{z{zzzzzzzzz{z{z{{{{{{{{= {{{{{{{{{z{z{z{z{z{z{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{zzzzzzz= zzzzzzzzz{zzzzzzzzzzzzzzz{{{{{{{{{{{{{{{z{z{z{z{z{zzzzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{{{{zzzzzzzzzzzzzzzzz{zzzzzzzzz{z{z{z{{{{{{{{{{{{{{{{{= {{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{{zzzzzzzzzzzzzzzzzzzzzzz{z{zzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{zzz= zz{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzz{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{zzzzzz= zzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{zzzzz{z{z{zzzzz{z= {z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{= {{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}}||= ~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{zzzzz{zzzzz{zzzzzzz{z{zzz{z{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzz{zzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{zzz{z{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= {zzz{zzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00= =00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{zz{{z{z{z{z{z{{z{z{z{{zz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}= }=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||= ~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01=00=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=FF=FF=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=E0\=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{= {{{=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{= {{{{{{{{{{{=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D=8D= =8D=8D=8D=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~}}||~~~~~~~~~~~~}}||~~}}{= {{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01=01=01=01|= |~}}||}}}}}}}}}}}}}}||~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC= =01=01||~}}|}}}}}}}}}}}}}}}||~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =00=0D=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90= =90=90=90=90=90=90=01=01=00=90=90=90=90=01=01=00=90=90=01=01=01=01=01=01=00= =90=90=01=01=01=01=01=01=01=00=90=90=90=90=90=90=90=01=01=01=01=01=01=00=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=01=01=00=90=90=90=90=90=90=90=90=90=90=90=90=90=90=8F=8F=8F=8F{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=00=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D= =8D=8D=90=90=90=90=90=90=90=01=01=01=00=90=90=90=01=01=00=90=01=01=01=00=00= =01=01=01=00=90=01=01=00=00=00=01=01=01=00=90=90=90=90=90=01=01=01=00=00=01= =01=01=00=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=01=01=00=90=90=90=90=90=90=90=90=90=90=90=90=90=90=8F=8F=8F=8F= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{||~}}=01=01=E8=04=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{= {{=8D=8D=8D=8D=90=90=90=90=90=90=90=01=01=01=00=90=90=90=01=01=00=90=01=01= =00=00=90=00=01=01=00=90=01=01=00=90=90=00=01=01=00=90=90=90=90=90=01=01=00= =00=90=00=01=01=00=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=01=01=00=90=90=90=90=90=90=90=90=90=90=90=90=90=90=8F= =8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~}}||||||||||||||||||~~}}{{{{{{{{{{= {{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=01=01=00=01=00=90=90=01=01=00= =90=01=01=01=00=90=90=00=00=00=90=01=01=00=90=90=90=01=01=00=90=90=90=90=90= =01=01=01=00=90=90=00=00=00=90=01=01=00=01=01=00=90=90=90=90=01=01=01=01=00= =90=90=90=01=01=01=01=00=90=90=01=01=00=90=01=01=00=90=90=01=01=01=01=00=90= =90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~}|||||||||||||||||||~~}}{= {{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=01=01=00=01=01=00=90= =01=01=00=90=00=01=01=01=01=00=90=90=90=90=01=01=00=90=90=01=01=00=00=90=90= =90=90=90=00=01=01=01=01=00=90=90=90=90=01=01=01=00=01=01=00=90=90=01=01=00= =00=01=01=00=90=01=01=00=00=01=01=00=90=01=01=00=01=01=00=00=90=01=01=01=00= =01=01=00=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01||~~~~~~~~~~~~~~~~~~~= ~~~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=01=01=00=00=01= =00=90=01=01=00=90=90=00=00=01=01=01=01=00=90=90=01=01=01=01=01=01=00=00=90= =90=90=90=90=90=90=00=00=01=01=01=01=00=90=90=01=01=00=00=00=01=01=00=90=01= =01=00=90=01=01=00=90=00=00=00=90=01=01=00=90=01=01=01=01=00=00=90=90=01=01= =00=00=00=00=00=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||~~~~~~~~~~~= ~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=01=01= =00=90=01=01=00=01=01=00=90=90=90=90=00=00=01=01=01=00=90=01=01=00=00=00=01= =01=00=90=90=90=90=90=90=90=90=90=00=00=01=01=01=00=90=01=01=00=90=90=01=01= =00=90=01=01=01=01=01=01=00=90=90=01=01=01=01=01=00=90=01=01=01=01=00=90=90= =90=00=01=01=01=01=00=90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F4=88=01=01||~~= ~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90= =90=01=01=00=90=00=01=00=01=01=00=90=90=90=90=90=90=00=01=01=00=90=01=01=00= =90=90=00=01=01=00=90=90=90=90=90=90=90=90=90=90=00=01=01=00=90=01=01=00=90= =90=01=01=00=90=01=01=00=00=00=00=00=90=01=01=00=00=01=01=00=90=01=01=00=01= =01=00=90=90=90=00=00=01=01=01=00=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=F6=C0=01= =01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90= =90=90=90=01=01=00=90=90=00=01=01=01=00=90=01=01=00=90=90=90=01=01=00=90=01= =01=00=90=90=90=01=01=00=90=90=90=90=90=01=01=00=90=90=90=01=01=00=90=01=01= =00=90=90=01=01=00=90=01=01=00=90=90=90=90=90=01=01=00=90=01=01=00=90=01=01= =00=01=01=00=90=90=90=90=90=00=01=01=00=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4= =1C=01=01||~||||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90= =90=90=90=90=90=01=01=00=90=90=90=01=01=01=00=90=01=01=01=00=01=01=01=00=00= =90=01=01=00=90=90=01=01=01=00=90=90=90=90=90=01=01=01=00=01=01=01=00=00=90= =01=01=01=00=01=01=00=00=90=01=01=01=00=01=01=00=90=01=01=01=01=01=01=00=90= =01=01=00=00=01=01=00=90=01=01=01=00=01=01=00=90=90=8F=8F=8F=8F{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=01=01=01=01||~|||||||||||||||||||}~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D= =90=90=90=90=90=90=90=01=01=00=90=90=90=00=01=01=00=90=00=01=01=01=01=01=00= =00=90=90=01=01=01=01=01=01=01=00=00=90=90=90=90=90=00=01=01=01=01=01=00=00= =90=90=01=01=01=01=01=00=00=90=90=00=01=01=01=01=00=00=90=00=01=01=01=00=01= =01=00=01=01=00=90=01=01=00=90=00=01=01=01=01=00=00=90=90=8F=8F=8F=8F{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}=01=01=8C=AC=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{=8D= =8D=8D=8D=90=90=90=90=90=90=90=00=00=00=90=90=90=90=00=00=00=90=90=00=00=00= =00=00=00=90=90=90=00=00=00=00=00=00=00=00=90=90=90=90=90=90=90=00=00=00=00= =00=00=90=90=90=01=01=00=00=00=00=90=90=90=90=00=00=00=00=00=90=90=90=00=00= =00=00=00=00=00=00=00=00=90=00=00=00=90=90=00=00=00=00=00=90=90=90=8F=8F=8F= =8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{||~}}=01=01=00=0D=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{= {{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=01=01=00=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{||~}}=01=01=00=01=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{= {{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=01=01=00=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E8=04=01=01||~||~~~~~~~~~~~~~~~~}}~~= }}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=00=00=00=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=01=01||~||~~~~~}}}}}}= ~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90=90= =90=90=90=90=90=90=90=90=90=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=FF=01=01||~||~~= ~~~}}}}}|~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8D=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=E0\=01=01= ||~||~~~~~}}||||~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8D=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D= =01=01||~||~~~~~}|||||~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8D=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =F4=88=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{=8D=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F= =8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F=8F{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=F6=C0=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=A4=1C=01=01||~||~~~~~~~~~~~~~~~~}= }~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=01= =01=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{||~}}=01=01=8C=AC=01=01||~||}}}}}}}}}}}}}}}}}}~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=0D=01=01||= ~|}}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01=00=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}|||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||~}}=01=01=E8=04=01=01||~~~~~~~~~~~= ~~~~~~~~~~~~}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||~}}= =01=01=00=00=01=01||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=FF=01=01||}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01=E0\=01= =01|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}=01=01=00=0D=01=01zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=01=01=F4=88=01=01{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{=01=01=F6=C0=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=A4=1C=01=01{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01= =01=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{=01=01=8C=AC=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=00=0D=01=01= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{=01=01=00=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=E8=04=01=01{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{=01=01=00=00=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=FF=FF=01=01{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=E0= \=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{=01=01=00=0D=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=F4=88=01=01{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{=01=01=F6=C0=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=A4=1C=01=01{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01= =01=01=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=8C=AC=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=00=0D=01= =01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{=01=01=00=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=E8=04=01=01{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{=01=01=00=00=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=FF=FF=01=01{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01= =E0\=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=00=0D=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=F4=88= --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: audio/basic Content-Transfer-Encoding: base64 Content-Description: Note the use of the audio button.. WWT03dbQ2N/edW1bW1pn5+Xc5uHcd19lalxa+fV082deYGfr4Nve09rqdnL2em9xfmxvbWz3 YWRfbfR301bc12PXUepYYnxu6Ozu3u5yeF5ua3f7eftz8ndicGhy5+DV2t7q9G/ufX1p9N3n 9ut3+PN6cm10Zl90Ynzx/uzpf2/8fnJ6+X1yZm16eP3p5+Tk5e1yamdoe/d87eDv7/x4/vDj 5eNvd+5yeWZqZF9lZGj+6+Tu5uzr82pubHLr+OTf5Pdq+Hp6+Ofe8eTrbmlp/nJqd314aG99 8/l8fHB0621tbHd5bmxna3Rwa/Xs7Onk5vfyeH3q/XF2amVjZmt5+O/n6/l8+fXu6ezybV5m Z294d+/z9O/u5eXt6v3++vr5eXh7bXrk6HZwZmNod3p0dHBzfv31+HL/7+3+++33+fDr8Xf4 7vRmY2xtdnNzdHH39v5sZHf5+3d27ubm7fHvf3X/fnpxdv749/Lp9O3r8vt3Zm9qcP/882x1 /e/x3d1b13xlXlt9UmZW6+7M6u3P8vJW5vhbV2rfb3J+4uj7ffjlaP1p+XVle+TWd17c3VtX cPNmUGzW+lnp5PBsbeV9YmD27+tsZtlu9uXg2nd421rWWGfe32Rf3dV5UNR4dlhc5vN2Ve/W WGTeeXxlWev2+u7x3XJ4+vXzZuFvc91l4+do7F/l52T3Y/v3ZV/1a/Rk7Pd8aWXceGHx32vr a2zXal/Zduvt3d1z33HbcV9neV9nZ3dpZX/t8Gh59uNmZvvvceLqdXtg7Htv4Gzy6mjt2mvv 6X1deeN7YF/m7mPr73LncPHvZ/Jn7+Vedu1lc2J26Hdy3tb2/N3g9O/f4mdY+3BdZm7h41/1 5+3peHdv+WpbcWZt6Wr6eW7zd+ty7Nvi7/fv7XBxdHp+8+fuZvh6bPRs+e9tbmnn6m1sduxr bvXzb21r9Xlsbe/fbG/n5+dwWufjXnfn4/Ff491YaeDhaGTx7GRX7fBsZ27V43nv9ufuZXV9 bu189GdPaObr6fXo5uF57dpjWGf+Z1/p/HF3YPze+1ru1+1l++jvbfT1e/d96e5iZOzvX2zv 6f3r6en1bfT06G9v7mf382F67mRnfv53c2Lpd2TgbW/vd+h/7lxo3GZefe5rYuPpX2zs1vdp 3d3b/PvlfHTwc2ZtbmloZnj9beF+eOJfePHxcWnrfHj47upk/ery6l/t013p2NzhVNv0XmZV +mFpXmXhZ3Lm7uxkft7sXV9x+nVr8OPi727Y3W5l7d9kY+fo6G9f+Nx0X/jiYWDt9Ghsanrm YWb1feh0eNvV417k2PZkXOXyVG/q/Flm3eb3fnFy43VW9N545n3e/l7fcG30bexlfvr24Hf8 bX1qZ2v97G1v7e31bW/v8Xtp9H5tY2/q7nFx5ez1e3nk5Ghu6/dqanbscGpr3uxteOblXf3m 5m1j6/1u7v14Z2Xsc2l2+/thf9/rdfD29ero3+xy4uh9b13f5GFs8uleYO73c//v3XFffuHj aWTe8f/ub+vxa2Ps+G3t6Ods+ORrc3RrcWxiZezxYF3k5H1l/Nrra+Tnevrs+nhvZd3vYHbu 23lf/u3uYFv+82dl6f5t8+ne+mjibvRwX+7x9Gj22+VqfuTo7fp9+m5iemppbHtwbu/3cvvr cGbp72pbd+B8b3/p3eZj8t7w+G996V9m52tvZHLe/m5vettoXO7acllu/fX9YWHl62947vJ+ 9ebzZnHe7m5p9+Xtcmnw62xm+fn9bml7fGlnamH37GPz62Xn3fjy8+PsanTfemJt7+5fYnzl b3f19eV8beb5c3Zs83VxZvbsbe3u5fdf8OtqZmLl4mlf5th4X3re3V1e+XdiWvXsaGN96O7n 4vfj8F9/7/hpb/nvenTx7/5zduXsbW3vbWJlY/l8a+lwaW/s2/915+BqbfBpcWBe5n5l8uDq 6efv4Xhv9m9lWmP0Zn1+Zt/u+uXu4mxy62lhW/DcaHfz+OxvaOvrbHX16PZfce/0ZGju639l 9u34a23q51583PXsamzpa3jdXWrkeuplfuTr72nx8/33bf5vXvd+W1/l6fhiadXoX27p2Gtc /uRxaPH37fXt6Pzj+PLnaO1vX3dpa3hwdHD85374aurfZWZv+W9z6e7s8+7g4PVo8eh2Xnru bF9l3XRi6efobHn0X/Z5Wm9qc/V53/768mzh6v7zeWv7+2Tn9fJ6Y+Px7u3442tdadznX2Hu 7HJfeutmemTt3XF6697wd37n5n1jfdjubWt953fsZWnp9W5k4uds93l7+//te2d8//1r+v1o 623p7mdm9d9td3Xs519p3vNzan3dd118+354Y+jadnzj5Glg5uxjb+N9bHbt5O3yfed66mhf d2leZHFvbWT3ePvn7ep+8OT1eG//6mhx23xt4+/d/Wjq8PNoZPBsW2hp92ds5vHrYmF87uld 59VPa9nq72Df1WVx6elxdfd57/pxZ2nu725483RibeVtXOzbZ2Tv9N51UnvgbmHv3uj2euPg ++5+5Opfb+z3VlrvfmD492Zt5fxx6fR5Z/b+Yu347OVf785lX+Xf6Vtt3NjoX+ndbFls719c W3biXWzc6G593dp3WnTf6mhefObxbfbn9Wvr5HJrbHH5a2zdfFrr4WZiZuv6ZF9m62Tn+V7f 8nLc8G/r2P1seGTcflvv6epr79ptamv5fFpu3vFoXOfoZ+Nd495mZmJ+/Wxp+9137d595+Ts /Wxv9Xxu71xr42Hma27ZeW9z/N57c2To3G/zYnD7+H5Zfev6emLq4+d6YdzmaGNz3W935GJ1 c1/x631i/Nv9Yvrn/mby7PNlaG/8be/i8XPe5lp7+XVmYu9zZXP65PVtbOrg/3R74OZxaPLu /W3t3m725XPy92v9bmX/bmtncNv6fPfk5/r1aevtblxh5vBx+Xjt3Gv45H57dHl08uLyd+R7 XtX3VWhofXZcX+bjdWVw8N33YOjzbv525/zq/OvcWerYam7t837x52Ju811yWmZsZulYcul5 3fx25+Hu8nln6Gn22mvq33T47PToeGFw+W1abP39/H3n+nH3e3Jl/3Fu5mth6e7/eW/f3m9w 3t/nfmzn82dcfO9fY2zr7WT84ex2bmxx+2d07/n9X3H1aOXjb3X87m3f3n7b6Hv+fu53dGN2 6WxmbfHheWV19nlpY3ptcXBzfmru2Odi4/Rw32Bk7uroau/ye99hYt3d8HZ6b/TnYFp6/vFq fOjv5HN7+299evN9a3Fs8nZve2z181345/bhdPl79eFlb/d96/Vkauv35vFq3eJicO985nF9 b234dHl69/VrY+zsanJ16ONeaX574etp5u9g/OhmZeL76e1q7ux+9Gp17W7vaGztdOLh63Vv 9mBqanp/aGZr3+Lk5Wz42Xdn/XPp/m36bnJ28Wt98+riZnzsbfF0Y2Nr7mtffH7Y7Vrv3/V7 5W1l7Gl28GT21XV++Wbd6l9mYWh+e2j39XLtfn73d/nf7Wf95ep1YuHYXm7f/fzs+X/1d2L8 ZV76dG1s+O3m+Wjz5HtsbGvtaVz36+jfY2XZ5v7j7Hz59mX7fmZv7e1Xb+D26n9v4+Plcmlm f3hgZl79cGrqdvjo7eb7dePk7HBn7uloWnnpf2pu3nll93D37W/26H5tfu9ybGt3cnH57N7p buXq6eF2bfj1XmTyZm/teeb6X23u5X5kdt3yXl9g8+9nbero+H347ebubfPqaWP+6vtud3n0 9Wz2Zu7f/fBkafdr/PxzfPz+/PDh4n/+9XR0eXL4fWRy9OvsfWhm/vVqdOr+eelsZtzzYW1r 8/txdXzo3+z34+bv5f527G5t+Xh2YmJxa379bfH0eft4bvPoaW92bPF3bvvr4eXx8ujofnz5 cnNtX2n1ZV/5+n1zeuXmefR8ZWRw7/N+8e9z7+Xn6fru7nZxc3p69/lqcu30fGRt/XN19P1q +Xxz+nZ4cvZ6ZXr5+ev18ert4eHt+HPv8Wt4c3Rvfvl2evzv6n5++XZ9bm54c3JsbnZ98Xzy 6fr46uz86+twcH9wam12+m/+7e36e+/3aXjvamdpZG/3dGp99frm6vLq+Hf58XL+7/5sePV5 +vVwZ3N/fPX77n569HB98212+2l6+HpwfXt/5+n5eevr+vT5dnx5b2lnZ3d7d+bx9+zt9P74 +v9sZ2xsf+bxc/Hr5e379vt5cHdrYWJu9/14func63Bve/t++XRqaGp89ft8+ndx7+r4/vf6 8m9rem95d3J0aP7n6fF37+Xq8fnu82dmamptZ3l3bXh6+P767O/p5N/j8/Px+W1ycG5sZWdm evJ5+X7+fm9x+O/5+3V0b3zs8/Tr7/3r7Xr9+Hv7+3x09ut8dXZ68/5ma3Jmav5xbXzu7vL0 +X9zfPXq+XT2bXH7b/fr8vv2/vru8P7+cnvwcWNmd355fXtwdO/zcnPv+Xj/d/bs7+7u5+rv 7erueW5tb3hueXV0fPf8b2xweHb99n5pbP5zbnrv7vD48+Xj6OnudmtvfG1qdn5td3V/73r5 +fr5evp+dP70fGp5/f95dX9v/Or56/J67O97d3f98/Z6bXF3eHlybW/48fx++/z8+Pt2eHj+ cm9+evH3bvfp7ePk6u/7+Wtsamduc/z78+/w+Pz36vR7f3Zubnz69/14evn3fXvu73Zz+f35 7/n6cHp+cmpqfXxqbXp1c+/z8+r//Ozt+f33fnn6+vH9fPDs9nj6+nP3fHZpZ21qa2ptb237 9fbwfvL48O9t+e99/f/09Ont6evu6evu+XFoZl9reXBobfx8bH74/+/s8+z3bn/wcn33cXJ9 fnL68PLn4+p/8/NwdnVoaWl1fnZ8+fJ5fv7x7/vzdG76+3Nrb3Np/+nx9ufpfnj15udxcHds cX9vanf3bHru+ufsevb9dGx2bG9xbnrt6/rz6efp8e3v9/n49210dvz9b252c3RtaXp+eXJs Z2r77u/1f+jt6+rw8//z/GxpcHl8/eno9/Xx8uv6cnX+cWhlbXhv9W9scHbr7nr18G9tev55 +3348/Dq6PT4+XVueP5wc3h2/n189n547/917fl+d3R9eG59ffLs+O7z8ejo7fL4b3b+e3dr cnJ9d3Jwcvn2a19u/PPu9PH1/ebpd25s+P1593F7fXnv7u7w73Zqb296/Whm+vHx7Onv9fn7 fXzz6fdqde3ufvZ7bWl29Xl+c3H+cGt39/l2cm958nN2+f/37Op5e/H3ffDt6Ojr6e368vpv bmpoamj/6+vzeO/v8PH88P5sZGxuZGf46uT09ebu6+r8dXD+dm9tZWdzc2lsZ259bm78/HRx +/lw++Db3+Df3+fd3Ojc4Obm5+vzfmhfXV9cWE1PU1BOTk9QV2pvbfXm4NjZ19TTz83Lzc7P zs/X3d7d7PP9/HFmXltRTE1PSkVISEdIS1RfZmzo4uHUzc7R09TV3d/b3vLz5OPk4uja0NLR 0dPX3N3sb2pwZ1hOTFNNR0tLRUVJSUxUVlh54t/S0NnT1Nnb3N7V1Nvc1dTb1NDXzsvMztHO z9fc8l9QS0Y/PDw9PT5ARUtXbvni0M3MzNLW1dXk7ujw+Xrz3tXY1s3Jw8LCxsvN1d/s+G1c S0VIQzs7PTw9QENIWWZq7trOzdHd3NbX4Obi0s/Py8fBwcDAw8TDx8vR2uhhTEE+OzUzNTU1 OTxBTWP63MvFwL/DycjK1drf7unn6/jm3dPLzMnBvb/BwcLK0t56WT89QDYuMTQ0NTk8QVri 3M7Fwb29xcrIyNN2cuzq+PXp1szKxL6+vr2/w8XL121OQkNDNS4wNDQ0NjxJS1LNzcm7uLvH 2c/F2E9P7eFtQkG+s8G7rqust7atul1CKh4uOB4cKk7F5j/Hqau84FjJuFMtMErXbEI+zKyw zcSzr7bEw7myr7jLwsJfLRweMigeITC+tM/MvK+sxDs7681PMjFku75pTMOuscPNua+vs7e2 sbbB30s0HxoqMSIkM8mutb7Nx7fFOioyavJIP1nGra/qW8q2s8Pnzq+nrLeysbzIWC4eGSMu JyUuzaupsdrrvr5PLi08dtVUQm+tqMlEQ8uxuNpwuaakqbLGx79ZJhUVLD4sJjG6op+wSEbH tmgnJjq+tFozXamo0zcy6auryFC6n52lvU5p1jwbDhg1RDUtTqydnLY5OM/APSknPbe0bEO/ rrPPOTdwsKy/1LWinabNSU1BJBMWIzJCO0jFpZul1TY+1HA0KC/cuLxszLW6xU85SryuuL61 qaCjt2k9LiEWGCMpLj7YsqSeprhrS1lINSovaMDK2Lq4w8tVQWC+ur+7r6ejprHZSzQeFRge Iy0++LWhnaW1zF1OTjopLU3Y2Lmvu8HLVFzLwMbAuK+opq26xlMqGxUaICQtOGutnp2mttBz 51IwJipDyr20s727vuz7zcXEvb23qqiruN9GLh4XGh0eKDNrsaOfpauzwt1PNCkqMEvOu7C3 ubnAvcHKw727t66srbjrSj4gFBofHyouOMmmn6apr7q61jYoKTdNUtG5ubGwv8S+u7m4vMK1 rq+51edeLBgYHx4iJic7tKWpqautpar6LCk0PD87P8uvrLnPyLKprbvMva+vus7p2Oo1GxYe ISMjHy2/p6esrKqhor1ALy4xLi8+2bq5u723raqrs7q5uLq/0frLyzogGh8iHx4cKeCxsLSv qZ2er+tPRjovKjNxyMzgyLWsq7K8uLG0v9PS0si9vNwhFyIlIR8aIdWsxs+3rpycr+Pd2v1B Ki1Z0NtgUc+uq7S/vK6tuM38077MbFpeLRklLCQqIyZNt09SubanpbrPtK/DTjdDwcREOEbV ub7Py7uvssXb0crdYz9FXetIJzVIO0s0LTncQUZmcda9ztbCxb/By93Kz9v3ZE9q3dbO4Nfg 4tXZ6OLMztnl5vLq0OpsT1ZVYV5HR0tLRUM+QVNmXWfq4d7V82x0d+jsfOHQ2N7d18e+vcXM xsjGy+dmWlxVWUpNWFxXT05LTlFUYmBab97k6+rn5GxXUFRRZ2VXct7NyszSycfHxs3X2+Zt XVNVT01NTVFPTUxVY+zj1tXYz87O1NfpZ1VSV13+fnv17ejg2Nvo3tnV1OP5a15TVFlMS0lG SlFbePXi1NDN09Te4+bsbHJvafLo49vZ3ujp3d7j6erd2d3p7P52dmFTT1NSTlFUWGVnYW1u Zm1yeHBs8efk3/Hr6uDW2N3i5OLY4uTe4N3b3/5vePZqWVlWWmlhXV9ocm9qa2dvc3Xt6/Hr 4urv9HZ1en13cHv8/fj17uXh6Oni5e9y8vFuf311ZmRraWNeZnx+aPj2c3f48Orj4Nve397e 3uZ6dWxoZGd2amZpdmdgavf0a2lsaWNocWhnefTs8Xv06Obp7Ov37u7s4fH46evt6uL2bXH+ /mx0++r6evp1eHFoZGRrZWFfZXBsdvP29ebw7Ofk6/by9/t5ev7v7f/+/vPo8/f3+352a2xt efhxbXJ29fDz8P726t/r9fh5e31oa3d3cWtyanNwdm918+vm7e18eftv9+10b3dtcv/x5+zl 8+vk7ejp8f1wa21pZ2hlZ2hveG1lavzx6ejz7eTk4ubu6N7r+f/6fm/5cmtxaWp+evjt+vx/ 8W9ia2dfXmNlaH/07+Xp7uvj5u7x8vbt6urt8n5vfW9t7e5v+fJ2dmtqY2ZqZ25qamdpd3lz 6uDo8/Tp9PPv//b7/ejq+fx6cHl9d21s/HRxdXFhY995a2vw+3P4e37w/e/f4ujk7nhu/WdM 9eFa+EjjvED0t3RkT36/8lJf8XtBPcd0SlLKzMlx1czfWlPR6HpMaGtz/M3oXfJibmRhZPda UWraVUrq5uvr287K7mDj1n1baFxiWVV34OLj5tjV2d7Z29rP0eTZ1Njc4047Qkg8OTU7TlxJ XcjAx9DMwcB5Xtned3Rizslf8sC9wcHEuba+xMK+wGEsJTIyIh8lNFVFOcaoqrGvray2TDlD RjUxMjlJ3M3CsbCxr7G4s7rFv8jKw8vC2S8eKUAgGh4qRV4wf5+gr6yoqa1eLztGLi04PkpO V7aqs7qwrK/EfsW+5F7RvLy/xk8sJC8pHBwgLkQ/SaygpaejpavBPjY4LiswNjxN6b6wrrKz sLLE18flz9jRt728tr5NJyEuJRoaIS9FR1upnaKmoaWsyjguLykmLTM9asW1rKutqq23v8vY +k9nyc7Iwrq9VDAkLS4cGiArNT4/tZ+gp6GgprJUMzguJSYtNUNfzLCprKypq7S+zc7fTk5t 4NrNz/5LMyo0Kx8fJCkzOj++qaemoaGkrMNbTjwvKy0vMjtRx7Owr6uqr7jH3PRbNj5BNUU8 RWxObfpZ+2FSTlj5Zl5fbdvsavJoYFJLV1le7uTZy8W/ubq+v8TP32FJR0E/QT9FW1n819HH x8jKyc/b1+D64+FsWlFKQj45OD1EQkhae9XJycW9vb/CxsrL3lpQUVZQSkhTXGly5dfc1OfW ysrOzcXIy8/l/2lWQj0+Pj8/Pj5P/era0szGyNLd1eNbT05VW19hZe3b4eDh2tTZ3t7T1dXY 2dzf5U7KxU/G2+PP++deT0hBSkM+Q05bV1pt+9/hV13vf/FqXVDq0lRl6tPP0d3Lvt9vxsrd cPDAv8zHtrG+y9M8PlgsIiouLDI0NsS107mmrbu4xOHaRTdJRC426PxQ0r28uMHDtsB02cXP 1sS7tsPNutUpKDwnHB8pM0Q6fqSjs6igrcHoRz43Ki5MQzdutrm/uq6vw93GwFtFdc7Q27+y vsm8PR8uMxsaJis0UmqtnKOqnKDH1/cyKCcnMjwwU6+2v6mlsrq8v8ZRQdvJZN+6uszKyigf QCcYIC4tPm/Ko6CzpZ25VdJNLy4vO0w4QLu637qstMbOu7nb5cDDzL+7vMFszj8bKDwcGS42 MmzUr5+uu6KrRknQPS42S/NQSca24l23s9bnvLrGyLu4vry1vcXdWEsjHSsmGSE7N0i/sKem sa2r0j1VQS40TF1WYcG2xcy8u8TLyr/Ax7q4wruvvc/PezwgHi4hGCdDM0O8sKmqtq6sXjnO Wy493HpeW9u82lvHvNHPvLi+xLeyvsG2usfiV08qGyUqGx4/RUS9r6yptb2uzS9Qyzg31Mns ZdzB4kzpxNToxrq6v7ewusCxssTgXVYtHB8vHRs5Vj7Mrq6qsL6yvzRByT826sHkWPPI7EVt xdHTwrm0u7qvtsK3tcL+W1MoHCU2GxxOXT3GsbKtv82xzi5YuUI+v7zbb1jh4DxKvc72vLm3 t7qyssC3sr/oUlEoGiQwHB1KWUHKsq+txtywyy5ftkpBv7vSWVnVYTtOwNv+vbe0trewtLy2 s7xdTU0iGysrGiNjTlq+ua+vZeKyZzHWuU5cu7vNTUv7TTlSv9PiurO1uLeztbu3r8FMfTca HjkfGzfkTs++uKzHP7+7ND66xXzIurrgPktuPDfXvNjMs661urW1u7y1s9JPSyUbKS4cJFpe Y8PGubJNQbraNdy4ysW5uL5MN1dHMEbCwcS+r6q2u7G1vbyzw0NKLhwjLyAgS11Yvc3Nst8z 6sg8S7u8vbS4utE+QUQ4OmW+vMi3qq+8trS2ubm97EwuHSIvIR46/2PHzc21zTZRyERFwby7 sLe9xEQ9Szg5aMm7vb2tqrjAtbO6vL7pUzcbHj0kHDzXYsTU/rLFLD65SjnGubaxvLu1WTRC QzlLyrm5xbaqs8y/s6+03uXKMRshPyceNO7S10Vrr84uRb50Qe+7r7PFvblcMjdFQ0/Rt7G7 uqytwr6zsbPMQ1E5Gh9LKyI4WNW9RD6xvy48xXNN6cmyrsTSveg3NkNd08y8s7W2srO5urau t2BFTSgaLTomKjpQvc823q9hMURhauBYy6ywzsi9/z05RNHGzsG0sre4t7WzsbTEak0xHiM2 KiQtP9XAQ0a2ukE6SWLWU0q5rLzcxcd6QDvpvs3Uva+vu7+yrLC2xl50Oh0kNSomKTHXvD9D srVwRDxYwks5y7W6zWfZxWxBXcW8wdC2qrPHvq+uuNRc4kAjKDUrKSktW85ASL65yG9FeMJn RmzMwcxrYdfS49TKvra7vLa8z97l1c9XTNzUbGFbUUI3Nzg4OTY4SFlMTWjUys3Lw8LU4N90 Xmx3anrszsG9vL+9urq6ubu9wtBvVUo6Ly0tLjAvMDg/Rkha08XFx8fCv8TN2/FqdGtce9LI v7u8uLO2uLa5vb7RXVtJNC0rKy0tKzA8QkpZb8/Bx8rIycXF1ufT2On+cePJx8G8vLi3u768 vb6+ynljVzwwLi0sLSwtNjs9SV3YwsXLwb6/v8bTzs7d8mtw2dfXx769vb2/vLi5vMLP6G5G NC4uKyssLDA6PEVl2Mi/w8C7wMfDzNTV/WdsX2Xo2s/Dvr26urq5uru8x+5dUz82MC0sLC0v Nzo+TXrTycbHwb2/xcbL0d95Y2Nr8ebTycW/vby8vLy7u8DM331PPDQxLiwtLjA2PEBQb+TM x8a+vsTFx8vQ3fP7e/3k2M3IxMG+vb/DwL2+x9PebU4+NzQvLS4vMjg7P01d9tnPyMHBwcTI yMnQ2NXT3uHUz8/Ozc3Nzs3Ky8jFw8bO22lLQzoyMDAwMjU2OkNPXvzZycTCwL6/wsfM09/6 +OTo6ePTysrLyMXExcXHyszS4G5PRj86NzY0MzY5Oz9HVHnf1MvHx8jJys3P19zZ3d7d3dPR zczMzcnFx8fKz9Tc4uR+Wk1JRT87OTg5Ozw+R1BYau/c1M/Nz87Lzs/Oz9PZ4d7a2NLNycnH xsbGyc/a2+R0YFpQSUNBPjs6PD4/QUdQW2vt39vX19rY1NDR19XOztLT08/Q0NLMy9HVz9Lf 5u/vfGZeY2JYTkxKQz8+PkFJS0tYZW/v6d3Y2dfPzMzR0szM1N7b2Nrh7XpZ6r/D3d7P0Nfk 7WtQXNxoP0RRQzo7O0JJPkJt09HU0MLCz87LzuPqz9Tt9uXs72Xq0lv7yNF2fM3Ea3PM7Xrv ZHr+SkFGRz87OT9LQ0Rm2dLUzcPAyMfBx97cz3xf51tP3fFSXtp4Tmm9vMzYvbvaYsPTPFrO OTFOPi00Pjk6Q1Vdb8i5vbuzuL66vdBmYHVNPUtVR0196+jPxMjIwLvBxr/KytlUPk1YMioz Ny4tLjhHS1vOvbKwtbCsrrrAxc5bPz89OTo9P0541se/vLq1u7i2w73B2VE6O1wvISoxKigr NE1b7sm4q6iwr6ist8HQzlw5NTg0NjY5X8rPybeurrCvr7S6xNTUOyc2RyMeJikpKik1a8e+ va6ioqyrqKq43uP7PDEvLjM6MznqvLu9sqmqrbCvsr3Y9EwtJzUrHSAmIygsLj7Vt7Kxp56i qKeorb54Uz0wLisrMzU2R8q6t7CqqKmsr6+yxVpZQCYkMiQbICUjKi8zUsCurK2inKGoqauz ylpCMSwsKSkwODtTvrKvq6enqKuvtLrOVD89Kh8sKxweJiQrMTZSv66rrKSdoKmrq7LJUUEz LS0rKS89RFS/r66sqKeqrbK7x+dbRjkwKiQvNB8fLS8uMjRouLOzr6mgpK+xrbTFUj8+OTMv LjtLSmW+sbCvrq2vtr/MXlpPPj5EOCckRFklJDk6PEI4Wbqzt760o6e9wra6yVtFQ0A+OjdH 2fRmvbC1u7m3v83xV1NOSz1A4NNdOC7dvS4oQEo+OC45b9tqUcqrrsS+sbK7zM7O6P9WQ2bU WFLQws/r18/MckNbYH55R2XCzc/Ey0U8v9sqMEMyMjArNU9eVlvDrLK/tayvvby63vvUXEBW Wj5P7FhPWeDa5H/vwcvQz93LzdlgVtTaVFs9OnBJMzpBPElAO1PX4ufWybvEysTAyczZ6exd Tm/nX23v09FpwtXaw97c0tNe0NJMX/FYaUpcWHlZTu1NT19eTlFqUVxYVF1YTF/xVU339Gvp eN3B2+vCy8/H5NzE0mbe0Nh7+dHl8dJg2Mdoa3bKVEhP/UpEXklZYW1fX93TUvLSZEjHXDr2 zT9HxUhKv14/3NBHUcBjTMXHWsq41dezxva7u07YzkjhS0BdR0r0PmXWSv7HXezSW9DPQN3Y P/pYPGFWU0k/2e1IVszz69F47b7U6+7Bv2VeufN+c9DuSczXPd/HQlXH/UHKyktPuE5Mutk6 579HRsJFP71LNcrqP1/TUVDJ7EPM+EvObvBle8/u2dbT3PW/3GzP3FDUwzfK5UbZ4XBeX9DE O93LTN3uT1zcUedR1kVo7UzBQVLE5y+51zXA3VZXuEZdvcs6wbgvwMY9aM1oP8fPUT+uXDCu yzPMuTZztT9Fuu8/6LtHQr1ZO7tYPMVvRNXlTN/p4kvbyE9MvkZMxlxa391U0FnUYGnCUGzN 6VXbfcxe7NBbbcdH581Cv1dPzWxM29tM+n5Mz2NR9ebtbt9kZefmSfXTS+zrXV/WUGPKTN70 9tzhZctt0dVb2uRyfs9XVtDKRdzHRc12V+JY4mJAyfc1skJLuT9zx01i6dFbS8FRRr1dRrxG Ub5fU87bTcVvX/ffclPLX9tb6dlM3c87xdM3v9I5vNw4uWxEvUTpy0fLSvrAPua/QFu2PGe+ Re6+OtjIOcrcOb/rP87SR8hZUcFPZ9Ra0HB+ykG8bjetRz294kXIazuxOPe+N77JL8G8Ns90 1FJh3FPtzUxHuV0/vO1W6cVA1b05ULlIRLpB+txJyEL6wjjExTTAvja86EnEWU/DTWzPSmTK SVOxNleuLca6OlmxO0ezREjD2jnN4V9Kys82uOo4xMc1yddU1kzPyTe2X1zTzDjDyTnDVlf6 1zu6T0/MUu/JU2i+S1W7SFC5WEjW0jy/6lFHxMsxvc02yss9zbovwck+esY/zedS1Wbca21s dWhh5tJLW79fRLdF+8FC48BQQrs+48w/d7Y21cE7v+9jWMlaeFHIUk7EOr/rQbtIWq8x47Iv w11Fyd1AUMleS/TGPbtaTNy5P3C/PbtC3Pnc1Du2/k3UxDW/vjVOucknuLk1S6w9OatDNb34 UGXx+ufQRGXB5z7M7ULNyD3iw+pa9+rGTv7OVub5zEhbv103vGJCxE9Jytc/5sj2WPDe3mno WOK+TE3cxmND0uJ9YfJdZsZDVczXTN/OScxtVGfDZkDV5mJr3lHhzuZM2r59SczTWdJPVdrY T0vg1FdKVFpdU0xIbvZHd9rf1PTQztHHyc/Dvc/QvcbExM3Jy8THPCAzXiQjLyg6wTg6uKu3 vbi5u7v+OW/MRlfNYdS7vr+urL24rbm+tL9jLBoiMR0cIiNQrlVRq6Gmsb6/tr4uIDrhQ0pV 6q2oxtCoprC4t7avrsxBNx0VKywaHyovrqbcy6ehrcFhTmJYLCI3zeXIvtivpLjCsrCyr77I ta+5TCsdGi8qGB4tN7Ks8sOkoq/BbkpfVy4oONa/xtLMsaeyy7y3t6673b2vuedCJxkfOCIc JS5ZpKpiuZ+ir+IzNFlBKCg+w7C449WsqLnq6Mi2sdJhuauuzTwsIigsHRwnN+eyubyspKe0 8DYzPzsvN1DMtLTEw7e803Hryb67wcS0qq3GbT4gHCYfHisvOK+mr6+oqa7KNC04Pz0+O061 rb365cu+v9VkyrCyuLSsrLjGNxgbKR8hKCY6pqKur6qrrMg0KTBBPzo3SLutuer90L20wXLY tK6xr7C1ur0uFxwkICcqJTyloaqtrbGvvT4qLjY8Rzw8zq622tXUvq636tS1sa+ssby/yi4Z HR8dJy8mOaunqKeuua6yVDAvLTRNRj35vb29vc7JtbC8vru9tqyuvthTLh0eIx8mLCg4sKqs rK6xrK70NjQ0O0o/N0fDvcfAxcmxrbvDvL26rq/D1tg8IB0kIiYsJSnIq62srrSsqbtLPTU2 T0o2N1vSyrq/1birsrq7xsW1rrjJ5kctHiMmICgoJj20sK+srq6orMlUPTQ8RzcvPlFdw7jK vqyttLa9yLuxtLzGW0MtHyQjISgoJz68t6+rraumrL5pQDc9QTMtND5WvrrMuK2urrC9wLay trrRTkcxHyIjHiYqKDnBuq+oqqulqr/aSjY1OjEsNj9NwbrAt62urq62u7i1uL3UTz8sHyYl ICcnKD6/vbOtrqukq8DnTDw/PiwqNkBRwcLPtqutrq63uLG0ub7XT1M4ICUnICUpJC7lybyu rauipLDGYUJCPS0oLTdA3cfWu6yrq6uwtLCyubzGXE08JiMnIiIlJClL2sm4rqqioau71V5S RTMqKjI+WOf1zrGqq6ywsa+wtb29yvhKKyMpJiMjHyI2Y97Bu6+loKavx3v+ZD0vKi07S1pc /7+urK6vsa+tsLi6ub3WPyYlLCUiHx0jP2H8zb6soJ+ptMDIx/g6LiwwOTw+QXS7sLKyr62q q7G2s7C2zzgkJy4lIB0bJUVZTP/Gq5+iq7G3t7naOi8vNTcyMz5zv7a3tKyqqauzsq6vtsw5 JScvJSAdGiQ8QT5Q262ip6usra+yyz89Pjo0LS8/Y9DMzLytqautr62orbXDVjMmLiofHxwd KzowPE7LqqetrauqqrDkUu5RPzErN0lWVlTytKuur7CvqauzvMvVSSsvLiMmHh0nMiw1P1e1 q7Cuqaqoqr3IxnNHNS01PD1FSWe7srW1tq+trrmztcTMMy88KykjHSIuLCoyN9Wxsbesqaal rrq2xvRJMDA8OztAQ9q/v7+4tbOts7Swtr7KPDVALSwmHyErKSgwM1+7uLasq6akq7W4wdNX OTU3OEE+Pn7IwL+8u7Ots7C1tLrARTc/MC0pICApKyovLkrFu7uwrqmlq7S4ucfwOzc9PEM+ PUfLx8TAvLSusLK1uba/zz42NTItKiQjKy4uMDhMx725trCrqa24v8PN7D88O0tCSkBgyMe+ yra3sLS9u8jG5uhMRDQxNjAxMC0vOjk8QkbbwLy+tLSvuMDRyN3mZ0NNSnBT8V/Ky7/Hvb69 v8rP02BnSFtDVTk+P0pERjo5SUNLQ05NydHJzcfFv8XP29zm42pm6/Pc1dvexcjI1M3Y1tt5 bH1VW1Jqb+ZLSFZnWk0/PkBOQUE9TWbc6dXLw7/Gz9TL08zs8PrY69dj79Ta3O1x8Nfl9F9g 5vp973Xn6vdQ8133VEU9R0RDQUBHZNjZztLLxsXP1MzNztxo3ujUd3hU+vXceltYde3gaWbf 6+jR2djJ0/nj3vp7Sz8+RD8+Oz5JW3Xf29LOysvO0czKy9zt5uPodmBVYe1kaGJ23dPk6NrL zMbVy8zVd21oWlJBPjs8PT87PUtt6t3Xz83Fx8vMzdLN193e6+9hW1peaGRpaOrX0NTX08/H ztjb0tXnW2VaTkY/PkBAQEFCSmLu593Y0snL2NXU0NTjc+fqenNqXHbf3m3e1tnL1d7l3eLe 4+Xd2+pjbO9uaE5GRkpDQkFBSFNYXmnq1M/U1s7NztHY5eLh725vefTr7+Xf2tLU3t3e3eR5 9+bk391taeLsa1FHRElEP0BDSldVVHvk2M7U1s7KyszU29LV4fhpbvFvXF9ncOb9b/Hj5Nvc 2M/NzdDi5t1wUUtCP0M/PD5ESlhaX+XPzMvNzsnFz9rq59zoamlscPdxbnb06eft4N3c2s7N x8nMzdt0+WZIQzw4Ozs2OUFLXPn70sLFxMHBwsXX8O7t62RUYW9rbnj23trY2NPT2M3O0cvL 09DkS1VlRz47NTg8NjVEUWbf28m4u8TDwMLE4GP+flxSS1zrW2tyWNnN3cnAxL/DxL67xtXc UkJXPiwvLiwvLyw8TlXRubatrLSwrrrK2lNHRDs6PzxJW2HPw8W3uL66u7+6wc7F1tPnNTJM LiUpJygyKi7l3+S0raymrK2psdXOZkA6Li84MTdrcc25uK+ttrGuuLu9ys/vaEopMD8fHyok JDApP8t4vqSqqqCnqau60cc8NDEtKy4uQ1dava+wq6msqa+2tr3n6VpLKSY8JBspKR8sMDPZ 5cWnp66foaqqrb/NRTk2KCsxKy9QS8+5s6mpraaptLK1w9tOUUIfKkccHDUfHjUtM8xitKOt ppumqqSzyM9DOy4lMSokPE47xbGyq6mnpa6urLzQylA9PiUlSB0bQR8cPzQozNi7qq2lnaqo oLjBvmg6Myw1KSlDPDPJtcOvqKmsrKu2yb3LSj9fOCA3PhgqOxspQCg71v+ttayeqKyfqru1 x1g8NzMuKjU6Nk7JxrytrK+trLW7udZzZ0JQMiJcNBdPNBg7RyFPzFqzuqelsqWfva+r7l1r OjI2LzMzOkl4zsC1sLKur7W1vs7KaEvqNyR1NRhjLxhIOx9Q4ki3v6epsKGlvqaxVb5XOj06 MjE0QTpSxea8sLiwr7mwvci9XU7RPyhETRk5RBgzRiE40D+/waqrs6Gluaet/bhzQUM6NTIz QzU/xlPJsL61r7ayvL651XLQYjAu0SYcxh8beicj5UlYvLimtKefsK6jx8O4RUI9OS8uPTYw 23lMt7vCsLSyuLuzydnK6WU3Mu4jIvMcIFUkKN5Cab6yq7GkpbGqqc67wkBHRTkuNEIvOc1H WLHBwq+xtbmyuM3CyPpNMz1JHjE4GTQ3HzdoNtW+r6+toKuvpLHHrt9HW0EyLz02LU9jOcm5 3rmuuLmztMO/v+nsbjQ3TCMrPR4pOiUuVz3jwbWvr6OqsKWvv63TVOhINjU8My9EQjjhxWy9 sr62rrfBt8H9x2kzPWcmK0kfKjkpLERJT9Kvtrmirq+lsL2uzWj3TD0zRDYvR0Q548trv7a+ urC4vrbFzMljQD5fJi8+Hi0xJi0+OVnetrqzpbCtprC6rcn62Vc9O0YzNEc+OuDaZL68v7e0 u765xs7LfDtGbiU4Ox8vLyYvPTtS9rW/sKWzrKays63H0thrPzxDMjBIPDh9bFnBv8K7tLe+ tcLOwdpCQe0qLUohKzYoLT08S268u7ynsbGnsLmvv9XY70M5SzkyRz85W+tWyL/Eura5vre+ y8fLRzzWLipVIyg4KCs4PURTvbjIp661p6+3r7vE/91nN1A/MENDOE1wWt/CwsC2uL+4usrF 0Gg9U04jSTMfOi4nM0E9U8u0z66nuqqpt7WxxNPm8T8+SzA0RDk4altZxcHEvLW4ure9w8vQ Rj7eKyxOIis4KC09Pkhuur29prGyqK+4sL7N4GpbNkI7Ljw8NFJpV8rBu7m0sLm2t8HEzWM9 SEsmNDceMTQmMkg+Vcq3v7GmtK6ntbuxwuh7Yz01QzQuQj03d+Fpwbi6t7C0u7W6zczOSzVr NSFHKh86LCc/S0TevbC9qaW4qqfAt7NTdm47ODc2LzFCPz/Q2s61ubawtLW5vL7T2eE6NeUo JWwfJUYmK1VFXcexrbukqbumq8u1vklTQzctMjcsNVM8UbbMvKyxtK6vvL2+0G3PQjA8QCQo Sh0pSCYw2ljftq2ts6Gquaiw38XLOzg6MiovPCw8yU3brLu4qa62s7THzcL3SHBEKjtRHS9U GzVLJ0DM67+4p6u4oKzErbdW5U41NjAwLS9DPkm9xr2rs7Cutra/zsp6bXBNWD4uRT4eQTsd REgrasDUtrenq7mnr9a8w0FHPTIwLzU1OmXe1ba4s661sbfKw9VO3n1Y4GBtXy1I1h0y9R0x 4CxEv8+yua2murKrz3zGTD47NDozNVZPU8C8t7ezr7++umZP30lL+PzZ2c/IRzVcPCEyMiQx QT9lxritr66qrr+5wExPSzw2NDo/QVTEzsmvs7+5wtreVldZSFvTzL/Au7jPSDA2Mh0oMCAu WEvBr66kqK2osNjeVDk3MTA3MkPfZcKxtrO0uL7pW1JDPkFR6dC8sa+xtLjPOyUnLxsbLSg0 9cSspKeioK6/wlIxLi4uLzhR/Ma1s6+uuMDLbT8/PDhKVmfDtbOvq623y29QKxsdLh8aOVbg tKminqawrMgxLy4pKS5Dw7u6qqeyub/ZRS8xOjQ2Wcq8tbStq7W6ucFYOU9BKiIiMjklMby9 wrGtrK/fT246KjFESGa7rKuwuLnIQTAvPTIwYsa/vriwsb/Ox8lkWcTG1tVs6k0tGyRiHyPf x7Sss6yjwDhOUi0uPlLEs7OrprlHTEMsKDA9VtO8sqyzysnGfUdJ987HubK5vcVWOSESKGQc Kryvp6G4tKTZJjI8LDNP46uir7CozCorMCgtO1O2qK60rLlIPkhGTFbTtayts7C7Ry8lGRUt RSVPq6ahpc3KtjcfKjg4UcO0oZ6su708JCYlKkDdu6qjqLbFZD01NULcyryuqqyvv180KCEb GTPFNu6ppaeuTEXYPCMrUWXDtK6kobBhRi8iJSsy37i2qqOuy+9EOj8+Tryysa+trrTbNisp KiAYKK12Sbiwq6hVLVPWMCpBV7aps7enqlkyLCQoNzNUqqevq6zSZz8tOGlWxq6vrau3ys1F KSYrLyodLbO/0MnNrqbeLz/dRzs7SbOkr8e3teY0IyM0R0fSrqirsctYUTkxPnXEs66tqay+ aU00KSsrMyYe4rHbwMzIp6w8LEVVPTw59aelvsO1wk0uHyA33+u6qKqprFk9SjYzRvK7p6q1 rrPrQjMrKy81MSkuzbzF1uW8rb87MTxIRkFHwKmosbzBzEMrIyU40Me1qayttk46PDY5VM63 qKm3usZNQjYvNz1KaTogM7fMelVPsKbOLS9QXFk/Q7Ggq8Xd9VAzJB8uyrevq6mpr+k4MTM2 St7IsKequ89bPT08PlhMd8YvGS6ySVxfRqacYSYuT0vsPjWsnKvF4E5POyIdN724raitrLFf ODYzN1fOv66qrb1lQzk5PEnz92fTPCAt01Vo/lezptAvMD9I4FRDt6Stxl9GQz0rJDq/r6qr rq+6djg0Oz9J5b60srW97EY9PEnsw8NWcTwdKMw+RNbur6K/LDFJOkVIO7iirc7FyFM9KyM5 vLq4raytt1c5PkU8PWfAtre6vb3iNy9D0sm8djg6JjbKMDzKuayubjM/Wy0vP3KuqLfItbVF KycmOdnUvKWir75iPUg4Lz/Lurm6ubzGVjs4Sc/EvOhANCdWfCg6y7Srtkc/0EskKzvXr7LF sae0Oy0sLTxEV7KipbO7y0g5LCxI0cq7sK+71k4/Qz5F1Lh+NzhCzUMqO7yvuef3v8M1JC1P 3eLbtaWoxD88Oi4qLmKurbGuq7RfMCw9TjxMvK+vvubX00M5Q1bXxjksur01N1Dfus04463Y LzpDR21HUq6pw9bEbT0wKTjGzdOvqq25d0ZNPS81Z8rAvr+3xE9PZFJNVUYv2rw4Q/buzsFK 4LLTO0tSOkFCRr20x76vx0Q9MzM/PkS5sLmvtMTbRTc/RT1exb69v9Pf40ZASUtb2c7OzM/Y c0A7VlVASGbo32xS3NBlX+Pwb3BdYGhRbsjW1r67wMXP2t5bUfPTyMr5SktEMTY9OVLWybax vsbEZT47NztOXvC8tLvDz39NPzk7RE5uzcfIwsjZ8GRXTExOWG9q7c/M0NTRzt1fXVlRTU1n 1MzKxcfK12ROS0tKTlh23tne/GpXS0lJUGt249jZ3+PdemRn/OTd3Nrb8PPs+Ovi3drX087V 6O1qYWhr++9lUVBbTkRNYmZw2M7O1ufp+k5LXl1WbtnW19ve4HFja2heZfPx8+be33956OTr 9Pnr/ldZamZUXuvj09LOydHY0eRn931bVkhGUEdDXGdZ3tLg2Ot27GZY+/Fs59jh2NLd4H1r 73Bdbujf3uft4XhicmtoeXz98HBq+fprcHZ86+707Ov9bmprZl9nbWZcYGJtdF/87Gfd2mh3 7e7k4uTd3efZ2N7hemVfWFViZF/y7PXr697xZ2pvbW3+eHFueXJqefF7ZWlvbHJrXnbu8t3e 7NTS8unj/f12Zv3rbvvg4+HyeH1VVGBMUnZha+Xq3tz749xuf+Ztb/pqbfp3eP3offvb3d/i 3+D5cPTq/mJlYExUZktSa1384NnP0NzU3Gdya1pnamNyfvja3vfe4uzwVvX3Re/2VOTZ38/O 2M3g69lqXFZDYGc7XO1J7dJ60s/fyt9f33pPY2FObvXu1+fb0m1w5VVUeFtp4OvRzNfIzeHX 52JpYFtaSER9TUDtUkzf3d7X7dTNbvPeWVNnX277eu3m3OXr49rW1dTa19bR5mfl7mV7cE5V TkxNPUxTSGLdfOPMzdDd4+B8WlZdYFxk5N3dy8fGw77A0dbVa1dTREvVRDjX6jhM6ENLWXzX Z92+2W3I02ZYWHJKT9lsVdbL39LHxczHvsPJxcbYV1RCMzs1LTs9P2vfzLq/wbzO4+pWSUNA WGdN2s/qzMfOyc/Kv8jJv73Fy9BcSjQzPygtRDdF18+/usO4v3ra8UVISkJaTlbNa+S+0s++ xMG9vr28vbvKZdM+KDw4HzQ8MV5w07C/yK7KT9VYQEg6TO092r1SzLvdxL/Iub2/tri+ucvl 3i8nQiwdOjU0+HPCr8u/relN00xBPzhsZz+9xVK9w9e/zsW3vbivssK5u15CKilCHx9ILznl 2baw1bKwTFvWRkI8POJSSsXV4sXLx8DMua+6tquyv7jLRywgPCgZMDU4VnC4qMnDqMxJfFtL OS9ay0Viu8zMy8y2w8etr7mwr7O+aHYuHTQpGi0qOctIw6O4zqzA3WI9XEksPb1eTL7NucRZ s7LJtq+vrbaytVlOKx06IhgyKjXPVMGlu8ytzd7oPE5WLz24fG2/57bATbewwrixrqqzuLhs VSccNyMZKyg/z0TLqLXRtMXFzzlI4Tw+w93PyEu7ulbDtrm0trSoqrzU3ecpHSokIiUfRc/2 +L6ts7fo07vsQjxJ6cRcTMDTxMpxtrK3u7StqavC7c9LIx8qISUoH0nOX8jLurCuxXfE3+xt O0rNz29aTdO7v72+uK+tr7i2u951QyknLigpKyU3SE7Y+NjDsrS9v83LyulvUFZrX3jrbs/B yMLIyLq/xb/L3M/tUkw/QT4yMzIwOj06Q19sycLKvr7Ew8rY3Xdg7Vtn2u/Wz9O/vb+4u728 v8XSS0dLNy8sKSs0MDA/R+fFxLy8urnBxcbWfuteX/Rb6tnjz8fEu7a3uLy5ueVJWEQ1LSgo Ki8wNDtM0cK8u7y4vMTH1X50YVp4dvbi3c3Evrq2s7S5vbrGY0hFOy4rKisrMDQ2RGLSvry/ wcHGysricm786tvY6t3OycO+ure1uLy7vsxZPz86LisrLS0yNzlKatfFv8PBvsXKy9bt7fJ4 4uR77trUyr28urm5uLu+yNZPQkY5Ly0sLS82NjpIXdzLxcPAvMHDxM7O1/j782Ng/u3jzMC+ u7i3uLq+x9VZQ0Q5LywtLS40NDlKbNHIwb6/vL/Gxs/Z62RoeGtcYfXdy8C+vLq2trm8w9Ba SEk9Mi0tLS00NDZKXuLKwr/BvL/Ly9PubGZeY2tffN7Yy769vLm4ubu7vsvsTk9JNy8tLi4x ODU8S2jPysfFxL7GzczZ9nh8cml5cfHYzsK/v726uLq5vMTN+ExKRTUtLS8uMzk2O01f483J ysbEzczJ0uTg4vLi4efc0s/JwcG9u7u6u7y/yuhPTEU3Ly0uLi81MzhHXfbazczJv8bNytPZ 1Nzb3t/d4tXPyb6+vr26ubq5v8zfVU5JOy8qLC4uMjA0RWrMysrAv77B0eDu+GFWZfTgzcjF vrm4ubm4trO3v8jeQTE2LyQnJSg7Nzl6wLq4tci/teFXTkNVTERCX9b5zMnAtrm1s7S1tLG0 tL/c+0EtJSomIScmOVg+ebmvtba/xbtmQkM/SEhCR+Tmz7/Gs7O2sbOztrW4srTQ3GVLLyIq KiQkJTtXSE29rre/y77BTz1DUkdES2/Ta829v7m6trCxt7e1trS6wszcSzQlKTAfJCcuVT4+ wq++v7+/vFVCZGJBRVhu+07lvsC/uLOvsbeysLm4t7bKaXY/KyMoKCIhJz5JPnS2sLq/wbjK TFVsWERDbt9WW82/v8S6sLK5uLK4u7W6ucVW3UwqJSwnISQlQEc0W7W1u76/sclJ9O5PRkRk 40hWxb/EwbmtssC2sLm+vbu0yFbM+C4nKiskHyI0QzJCwLS5wrquu+7sy9k+PHBwRUBnvsfZ uq6xvLiur8XFtLS+2M/A8iwkMigfHyE0NSk/urq9vLKotfrFwWs/O0xaOjfewc/JuK2ut7Or scLAuLjH3snPSzgqLSwgICUoLC4y+cDHuK6trrfAu8tGQ0dBPDhIzszLvLCusLGurLW/vLjI 3eL1XT00Ki0tICQlJy8tNOrCyLOurKy0ubbLT0xJQz45SuZu3Ly0r7Cxq622u7zG4WRQUUQ6 PDQsMysmLCkuNy8/2Mu/tLKtrbe4u9VuW0xIQURZc3XMvbeztK+ut73E1V9JQ0lHPUdNSjo9 RDE0LzE9NDlS6eXNxr24wMO+x9DQ2ebreNzO2M7Jx8fMyMvX1tjr5flieF9nZWV4Z1taXEtC Pzs7ODY7PUFKTmjg3dfOzMrFyMO/w7+8vb7Dyc3Y7n1iXWVeZGhpeP7x+Pnw39zo9WhXTkM/ Pjg2OTw+R01b7+DZy8TExMK/vsLFxMbN1t3qbltaZF9mb3j083b+3uPt7djS19jX2PVbUUo/ Ojg5OzxBSVb439vUzc3JyMnKysvO0N7r7/54cm5y9Oz19efp5N/e29vb1dHS0M/P19/2VkpF QD07OTs+PkJJW2507djRz83Kx8fKy8nO3+Pp9H9x9e3o2tbW0Nvf2uTw4+b2+evv8vzw8G3m +FVaTEpIPTxAQEFJTWV3Y+LR29XX2s3d5tBk0bzxwcfex17Z+Fv8/OT/8mrG3FLL2WrXT8/h ftNKzF1HWEJKQD5BQ0pCSWpeXn9v0t32xN3JwtvExs/T3+L0alnwaXv0e9nK8+TJbd7katJ1 ePfxZl/iW+hVWc1Lb1laaURLSVtDSGBQ/FdozHDUas7oZMJGwF5pyEzHUs/QZclryM1VtkvD 2k/AQchHcsw8xlvk2PDhT85LcElOVkZfRE5PWUXhWEzYS93PTchhzN90zNzT5d7N6M9ly/XT bua+R8ZPzso/u0LIVlvjTcs6wVd8zkjCXP1VWvRDWUFRXj7wT29tWPdidV3fUs9cectnx9PX zObE3NPZ79rq12by3UzKW03O+GPS41y/TL5X9N9T1j3ePlZNPOQ8XExUZErURsvpT8VdxuHa xVm9b9rOYL9Ax3vjUEjS0PxsyMvFR8bbekbX9F/ZOrhHb2ljvzXKQnBxO+JfUkV9cFFkT+jZ Vk3H3WnKXcXSWM/e1WTP5tzp4GrJTtBe295Iw03IY9/WYMVAx1LQR1PfSPI+bU9YSVDuT2pc 2mft4frBXnvCTsh1S79L01fc0k3Q6HjP6Vm+V1O+UM5VVsZJ3GtlxkPT+PXWSMxc6Utm4j9t T11dQtdS7lFVxEjfbNvVXMvE/8bxxcNcv/LQYFTaTURJTk1IS3LmZH7PzWzvzNr5Zf3PX2Po 0GFT33T3RX79YlNk0Wlp7czgatrP3lns1dxdX8t3Y1Zr50pMbOtJVd5ucljm0uhv38pwa97j 5Fh4yu/pz8jO18vO0VVW8Ug5Pkc/O0JQbFNwvsvXxL/H09vQz1NV2F9LVPV4XlToz2Js0+z1 edvU7ufXzd3SyttO4e48SkVBPj1NaVhXyMToycTL1/3i1FZH7ltTYeriW+jW4e7fytLb0cnc 8NfH5Uxu00M6TE08Okz7Wk3OvdPYvb/Yb+DZT0BdYkJEVnNjUdrH39LBx8jJzMbX6cx4TO1e PkZDSEpDUOFXZcjZ4s/U2utd6uRNWexSSv7tU+nZ1MjeycHVzsXR3dLtd1ZKTkc5QUk+TFxe 7drUxczTxdFy6vBga1dOYFpHdelX1tTXx8rHwsrIvs722l1FSD44PTo9TEZZ1tvKwMrOzt3i d1lnXUNS7kb3137Ix8e8vsW8vsrH1P5JOkA8LjY+O0JX38zPyLrF4c3UYVZTV1E+UdNFWM7Z ysvGvL7DtbfOx8LnQzdFQCkxQzk7WdDF1M+0wFnMxlRIS19UOEvWP0nIzs3BvLG3v7G1yM7L 4TkuSDklMj87PFXBuuTPr79W1cplQj59VzBH2UZI8r2+zbuts7uwsLvjz9MvK0UsJjE1RzxF uLR3wK7B2/nY0jw33EcwTltSd2C5ts22q7K2t7W5YnzcMCpCKygxMVVEP7y18Mi6xs5NdcVC ON9PPExG3NNPure/tbGvr7u2tNbr4DoqNC8mLitGUTnltcXPxb28XkzJ5jpEZFFERFnP3924 uLu2sa+0uLa9z/VnMig7KyYtK11NN8ywys3JvbdfRsPhPUlCXXc4UMPYxMS6rrW2sbG0usfO z1ItJzorIycp6Eg137O7xtS/sthM33RqTjVY10dR/8Kzysyzr664vbCyvtTg7EUoJy8oKiIv cEdG2cKzuurAu8nXSEj7SElPTeXf07+9ube5r7G1tLi6xPdkTi8nLiosJidSU01y5b21xsPH y7/TTVFITW1HTVbovr7Ev7mvs7/Cv7u/3FhnYz8wLjEzLjA6Pk9ZbM/PyMHGwszWztl5Vk5a c09ZaN/N19HHvry8vbu6vsHM2d1XQzw7NzQzMzg7PUpLUN/KxsnPx8bW32lYWVNVXGbs1dTL v7q3ure4u7y6vtTnXEdEOC8vLzAzNjw+Rm7VzszOzMjKz+9eY1xTUVp+69vIwb23tLa6uba4 vsnO3049PDcvLS0uMzY+REty3c7Gx8jG0NzpZmJaUlht69TLxL65tLe7uru5usDJz+BNOzk0 Li4tLjM6Qk1OX93Ox8nNzdrm6ndwaG1sedfNyMnGvbu8u7q7vb6+xMzdTD9AOjAuLC4zOT1D Sl3d0M3MysjT3uxufn1tcuzY0s3LxsC9u7u8u7y+vsXP21pBPz41Li0uMjY8QUhY8NjPy8zI xtDn5ujpa1tebeXb0crCvbu5urq4ubq+x8vjTD8+ODEsLC8vNjxDTl3g0dTPycnN2+Lq/W9d XHnk1dHNxb64uLm4ubi6vMLGzHRCPD42LywsLzA3PkVSXd/P2dPOzM3h8e5yfmlq597VzsnA vrm4urW3tra8wcXKcz84OzQuKystLjI9RE9l2svPzMjHy9HZ6e7yZHTj5NHIysW/vLG7vLC7 t7fFwtBMPTMyMiwtLCwvMTxFWd/MxcjGw8bPztvmY1VTVevPy8LAv7i4tbe7ubq7vMLK01s8 Li8vKy0rLjYyP05Wz9HCvc3Iy9fM7PJ8Tl9YZNDWw72+t7m1try4u7u6w8XSbEYvLS8rLS0s NzI4SkbZ0MO4xMPG1MvuceFLT1JT2NXHvcW7uLaxura4vbi+w8rrWzcsKywqLSsuOjFFTE7L 07q7wr/S1NFk8WJOYE740c6+vry4urW2uba9vLvBvs/lVjgtKSsoKisvOTVFS1TW0bq6v7/M z9Vl/15VW1boz8y+vr22ubO2ube+vL7GwM/kWjksJionKyssOjRIUFTN0ri4u7zGztdmcVRO W1Xk2cu+vru4uLW1t7i+vsHDw9N8UzwsJignKCwtOzxHeGPNzbq2ubu/yeVvVmBKTVJj08zG vbu5tbazuLq7xMPMzNN3WEAvKCgoJysuOUNI7OrOycC7vL3BxNrvWVNKTU9s2NPCv7m5uLe4 uby9ycvOzNffbk48LCkpKCsuNENIbNjVyse/vr3ExdfuXlVXTVdj5NPJw768vLi5t729wMnO 2dTf+V9KNisqKiktMDxNV9bPy8rFwsLDyszt/FZUVlldY9PPwsC9vb67vr3Ev8jLztDO4Ohe Qy4pKykqLTNAT9/JxsbBwcO/ycjS7mFNUk1YWu7Rzb+/vL68vb+9x8XQ0dHZ1e7hUzgrKioo LTA/WOfGxMXNw8nIy9fUbHNbWFFWYmrc1se+vru+vL/AwMTG0MrKzNXvYDstKSkoLDI/Wn/J x8vXz8vKxdLH3PRiUEtGTU9w3cW7uLa5ub2+wsfOzMnGydJ3RC4jIiYsPf3CvtT5SkBBYc6/ u8TH62364ONkTklUdcm5tLS6w8zRzsXCu7u8x/5JNyghJCw2VcvHyVFPQk12zsXOye3LyMO/ 3VQ5MjhPwLCtsb3Tbd7It7K3u8rZcHRRMyMfIi49yLu93UNKP/DUw8525O6+vLvFTTovNE/K srG0v9zc4726sbe+xNTL2Og4JR4fLz/GucTfPE5O6OhgWkjoxbOywNhANzY4/c69t7y7y83P x7q1sb28yMjNajgkHh8vRtC7z+g9UVZx70hJS864s7TKXUQ+Qz9W3sy6ubS8yMnUvbiztry+ xtRZLSAdITtPxM/nVT/fX9xFOUBIv6+vtt5aSE9WRU5Rz7qzrrzI6O6/ta2yucfR6j8oHx8p R3O+3HVHSW9VbTw6QGS2rq+5521LRD06XPq9tbCz0M5jzLuxrLa7yNJWKR8fJktkw9xYTELV anU8NTxIv6+vuNpsb1FEOz50v7CxtMr23c24tLG4xsDJyTYfHR9A1b6+SkU64MzXTDIzPtqy r7XPWGpWRDxDWb60r7XD19nCvLO3u8a/uL48HhwfRb6/wDo4NdzCz0MuMD7LrrC+6lLa3lI4 NkfErayz31jRuq+xusPdx7OzZR8ZHTWyu7k6MDT4tsBOLCo3y62rvV1G7sjyNSw606qprs5M 1bqsr7rMY8iysOgfGB0zrbXDNis5y667QCgoOr2ursxEVs273jErN8enp7FcPtOyqa/PcWO+ rK3OHxUdM6uu3TcpP8GsuzgmKT22rrTbQP68tt8sJDPDpKe8TjzGramze13atait1iAVHjqr rUYzKFO3rcMyJS5StLTObUzFsLdOJSA5t6Op30E+tKWnuEpWyK6mrWkeFh9Mq7I3LSzZsK9k LCc4zbTFTlXtsqu8OyEiQa6msk09Y66lrcZL3ratqrRYIhghS7S1NDQ2yra7RysrPtLB60Rm w62qwjciJUyvq7lJStKup7PPb8Ourq+47yoaIELHuDEyPMu2w0csL0rKx2A/+7utrM42JipI tLG9Yl3CtKy609nBr7O0usk6Gx012bE8LzvPtMRLKC5YxsBLNvezqaznMCosULi8yvzNvLe0 v8LEta+6u7u9SR8YMN25UyU9yqzCPCcs1LrRPy/Zqqm2Vjg2PkHz0c69wcPGubO5xc23tba5 xUshGS3LwUcmRrKq2zEoNru9QjAyvKau4URUVEwsPcq0sd5g0q2uwV3fqqmzzGd0JhwtX+A/ Lk+wsD40Lkm7ZjU2XLOsxUzbwnMxJ0q1rslJ+bKotOZVs6awxerH0CQZLN3iPytUqrE2LTLv uUYtPcKttVZUubk+JivPrbpOVLerr8d2uaivxsq9vTgYHNXWPio0qqNHJjfwtk8jNLqtwj5K tattKinlr75OTb2quNDItaiv3dOxtWkhFjW7NSovvKPAJTa+zEwoL7awdj7otaxnLjxry35V zLS7zcG3sq+xvr+6u+gvGiPZNCwzy6u5Lj+7/j4xOsq/VFW/xL/7OlxXPlzNxbnKza64wbKo sc3Gv8Q8Gx96NCcwy6u8MVazbjY1SNt7P9e17OzU/F9COuS/etzCuLPDzKyjttm7s8w0GyPM Jx8+uq3dNLqrPS5d4EY6QLi4N1u30jQ8WL7PPMStudfAtqisvrmsvkk3ICw+Hida2cHoUbG+ NELGSjdK771XOb63RDdM1bpKYLa0z7+1r621sq6x70U6IyosIS1FZs/MzbnUPm7JPjh5/+JO TsLLP1lpW8vbyr3HxbG2t62vs6653VwqH0EjHTVOceXyt6xIOrvHMj/c0mo2S7jaM9TNXu7R vLX9zquyv7OusbDJ4fApITklHy9Ae95au65bSr3PPE1j3H0/SNNeTelR0crTv7vOu7S1sLC0 s7W+YTknLTEdKDhNT03drbxC2bdmP2Dj3k07YsY9SNXrzd3btrz+u7CztLS1rrrLeEYnLS4h Jy8/X09mtLdt3r3J6lJK5vs9Q2o/bVFMv8TRub/Ctrq7r7O6tbzE3UUqMDQoKCs5U0xJ0r7H 0MzNxsj6Wm1VWU5CSFBq19rWvbu9ycrGx9D30MPIv72/0lxzSz04NTY8OTpHQUNfcfvS39fC xdTdZ09YTkhNWXPl28u/u7e3trS0tre7xd9TQz83Ly8xLzU+PENJTu7Zd+PMxsTK5/L5WVBb X19n8NHLycC8vLi1tbK0ubvD+0ZBOzItLC0wNDg9QEdVZOLMysbDyMvKz35bXWRfaXni1MrF w767tre2tri6v8rgTkA8NC8uLCwvMzk9QU/92ce/xL+9ws7XfmVmWlZca+bd18jFwby4uLi2 urm5vclrRD47MSwsKywvNTtAS3LRzca/wMC/ytToWlVcVVVr5dfNycK/wL25ubm6vbu8wMrs SEA7MS0sKywvMjg8Rljay8K9vLy9xc3U/1lXUFVjZ+vXzca/vbq3trW1uLq+w8nrRTo2Lyws KystMDY+RlXfysG8vL28wMrP5WVhYVthafDY0Mi/vr26trW2u72/x8zfTj03My8sLCwtLzQ5 QU5m08W+urq6vMTN2XxeXFhebHHf1dLIwb68uba3uby+w8nO4v5MMygmKS4uLjZFUVNPX9LA vLm3ur3NXlFQTE9WZt3NxMDDxcG9vL2+vr7EyczV4e5eRTcxLywsLS82P0la897Sx7+8ury+ xdHrW0tGSExd79rJv767ury9vsXIy9DU1NTX3n5PPjYxLSstLzM7RlB01cnAvbu7vsLI0eNx UkhMTlJ2387Evru6ubzBydDW2N/n4djZ7VtGOzYyLi4vMjhATm3Vy8O+vby/x87a9mVbUk1S YHbdzci/u7q7vsXN1dvpbm7q39/f6GBJPjk2MjAyNjtHXeTPyMTAv8HKz9PeemBaUVVbYn7j z8a/vb2+wsnP1Nvr/+jc2NLS3FlBOjUvLS4xN0FW6dPMxL+/wcfO19/walxOT1RTcObXx7+9 u7zAxcvb8G5o+9/QzMrM5Ew6My4rKy00PVLjy8TBw8PIy8jJys7W4GVNR0NCTXHQv7m2t7rC 0PlbYf7azMG+v8beTjkuLCssLzc+S2fm1c/Nxr68vLu/zvhQRD48QlN7z8C8vLy+wsnW3N/g 2tbMyMXBv8PUUjkvKykqLTQ8TX7e18/Iv7q5ur/WXk5GRUdIVHfdzcK9u7i5vsfaeHnx2Me/ vr/ByNlONi0pKCksMzxKZ9vPy7+8ubm+yu5VS0pMTk9SX+LNv7e3uLvE0N/5d+fd1svHwLu6 vdo7KyYlKC0zPEFGW82/ubW6wsza6O1zX1RKSFJp3cjDvr2/vb3F2W1PUuvPxr69uri8x18y JiQmKzI3O0VczLi0ub/M2NHcdVxJQ01sevLj4cu+vbm8y9Dcfuh8VV7TyLyztrW5yd09KCEk JiowMj/syLiyu8zHyc/OXUJGTGjNzl5wzcu6vMzJ09TJ0VpPU1LOvsa+uLews85TNyUfJicp MDVYvrm7usDPwctTU09P4NZ83cjKxsfTzdne3dfP3/FTTVxf48zAvbivr7PBZEQtICEqKS02 QMyztb7A1N/J7EdOV2TV1+THvsrV1NPY1+1WbPn861RMYt3bybq4sq2xt8FqRjQkHicsLDg+ Zru4wsXH3M3SSE3r8djU/tG8xenZ+NjQW15m4dzqb1js0+bQxbq1sra9v9FmRi0iJC4uLzo+ z7rDzcXHycfuRWrZ8+BtZc/G0ePW0c7ad29q7u5uV1Tv19bPyL24tre8wdlxTTgtKjAyMDc2 R+rd2MnIyMHH0s3L19jraGRzaWvc4OjPzdHM3HjvXE5cTlXt6+PHxs7Bw8vBws7R3V5dYEQ5 NjIzNDY6P0Zdz8fIwL69vsTQ2tra19t6aurtY1JOTVFVW/LQzMa/wcbGwsXDyMzO3G9YST44 MjIzNDY5QEhsysHBwsHBwcnV3+345+HqaWFuZF5NRlldaM/Xx8O/wcS9v7y+w8HBzGs3Ljcy KiosOU5qT9O6tbO70su91VNGSlTxTETrwM96d23b01ZDYfXg/Wlsxr/Nv7W0tLO6ucX5STAk Ky8kKDNM6s37v6y33M/M2dlKPl/PUVjcz8W82F/cyVM+TkzyVkb+xt/0yby0ssW1q7zPzeo9 KSAzLyMoQdVhfe6wrsxevLzOVVN+z1ZD68jf4dFv0dBHU9lXQ152089z6rq9ybq3tLHAycXc PSsjLzEfJz7gSWTOrqzP6bC2XFBj7l9EP8zIVum4x1FOyupGP03R+Etuv8vmyreyur2vtc3+ 10YpHzQvISo/yW/ezqqv1dCwxlFFT1xLOEnC0ljEtsni4/HrTjxJaEtb7czDx8O0sb+zsb/T 1mY9KyE5LSAsUvRH1b+steHHrs5AUOVcQz12vulRvLPt9eFtdkU8VW1AX9bKysO6r7i9rrbL zttHNSUuMyAnOlU7WMq2sMrDrLdk8cznRz9Iz2VB77bMXM3C0VRGX+o/ROTd7Nm+tbi+srC8 29d5PigvOiQnLz1CQ1e/scfBra/Gyc/Nc0E7X1g+ScvW5cTLzM1v/t9ITvpTZdrPxLnHurjA zL7nUTw3Ry8sLTk6Nz1UzM3NvrK2usHBxtlTSk5STFFp6ujazubb4l5PZ1xWferp0MjRzsbN zMLOzsP6VOtYPTw5OTo6OD9SVHbWz8jAyMnHzdrW4XPq6H1v9mpfWU5LU2Bi9+HYz8vKzMnM y83X1s3P29ng/mtXUUo+PDs7PD4/SVhmeOHQz9HYzdTXz8zT09fX2N7o8PJoZmN3bG95697h 3Nra5ufj7fp1b/p6cuPr+Xp29HpqXltVTUxMS0pKT09PYPDi39XY1tDS1tne4t3g/nX/bvzs 5NXS2drW2ONuWt5hT2dc5WLw3Nna6tzw/XlkamlfYmZSTVRPTU5OUVlbW2RrYu3l6uTY183R 1c7Ky9XR1dtbS9vwXNTJx2xCTsdYO1/FxUFbv9dLP8vJWFzRwVpF29dSP03Ta0RW2nFGS9lv S1za4lj+2Ohv3MjS7tPM3fzc1e9u6eXvdeTe7+3Y3eTh4/V35fBf/vNrZ/xaV1tXVk1VU1Bb UE9mY2ntZu3l5uDi2+rT3dnq8N7+dtzc1tHb293o7WVYb2Ng6/va09/f29Xs7vP8aVlXVFRQ Tk5UVFpbeWzp5vfu6Ox5fftq+vJ4cnD/+enj5drg6uPd4PDo5evm+O7o9+/2+Hx+fu/udWZn bWRma2FibWhkaV1Ye3Rge/X4cuXg6eHv7+73fvj3a/7u//v4dXb6bHfr+vPq5uLq4dzq8PLr +3F79vN29/toZmx+fWxpd/T3b2lkYGdqaF5fY318dv308fry+/j8+uzv7+/s6ffm39/b4N/p /XR6fXx6e3hsbm5ydnRnaf38fG1ueW1udnX4/fvt7PL0fHFpaGd1cGxv/Ofr6ubl5urq6er0 en57b3RraHf/Z2vz/ejf5+3s6e16d3xuaG/2eW5t/21sfGxma3b59erf63xv/fb9e3r6d/h8 cPV9ZmNnbnN0dHl8fPP29fno5+3n6urm6/D0dn18bm9xcnLq7fHy9W5sdWpvbnD8/39//vp6 9OXz7vH6fv/49H1mX15fZ2Z85uTi29jg5+38b2Rue3tqb/5+fPrx/vH3cXnxdWlve/T67/p2 /vzr/Hr06+7r6/DzfHRsbXl5cHFsdW9ndvnu7Pt8+PD8cmpoZ2lydG978/nq629Xx9Nlw2vP 3VrjW2h5PdBQRrI9/M5JylRY30PR0GTHXMvdWtt91e8+1kPuVFbRRt1gU71M03bZwU+/e9zS VuDlR/b5fGtmZEY+vlD4xli6S228UedibFo/Z0llWlvK5NzeY3toxVHfyGLJZOxhS/BhVfFU 0PfX197Pz+3g5t35cHRWXEpBXk1Fz03b81/Pa87ic8719HTqaWl68c9efdXVXPPY4H9S2NJk UGv1eVbr+lHdZ2tt/lN0737cc9Vl6dtX0FlR0V9k7WzZVfPOW9lcXM1H03lPylDY3F/+4vZj bNxrYNdfbMhcV9Jma1Lv3ErWeP7JVfnsXelX7/9o9ufszmfvbFrzXPjp5l3MykngyELXbTm/ S03CWv/p/NxGY99Ez+vc4O3s02Fbx01b2u3+af5YYnFsbM/j42zI6lfEYe/rTGpmb+5l8v5P 3WNZxT/VZVjETF/iXdraTd5mXmXeYdBs2ODo2FDPTGTnWdLv487rz9hZ1GD59FdkVeJfWN9X UdFQ4tld01DQclTcS/PmWGx57F3V6+TU39Nf1Gdc109eX3fZU93W7+F022Zv21PpTepqTs1V 3G1oz17W1ljc83JrdmFwbuz04d5k0fle63VWW2docWnfdnjte/Bt1nXtdWH7ZvTl6W7X/+7i 3N9t6m5n4WTjWe1k9nFc11jtfOl38+Rub+d7Zu75V3ZjZnxz4mrf+uTa7uHoZ95dbHJabWjw cebcXd/0VdBg6nr47Wnf4F557Gbpe29072Hw635y3mLt8vxvfuJs42HbcOP2auFa8H5fbF5p 5F53dmbfbnTm6Ols9+hk7Nhp7X172H7WdenVX+3mb25w63BaZX5U/nZNbGdbVW5xWfjpa3b1 8PPo5uDT0ebYy9bZzNl+1eD85XtiYV5iTEhLQUJISEhPWVZk/Pvc1dXNyMfFxcHCy7++yL3A xL/bQGpCKj8wLjg1QD1IZUlP2ljhys69uru2u726vLy7uLWzuTpoxh4zQSU4OTw8SU5EUlRN /dffycK/vLu7x7y4wbeus628LbU9GM0rJVMzVj9FzT0+zj78zvvJvsC8v8rFvr27sLCsqlky riMdzyMvQj7lSNrzQkZUQmv3zcjIwb3LzcLDybetr6yvPES6HShiJT5EWtFPx9U+SGQ4R9hx 7Mu8yny5ytq5tLSuqbFNNbwoHdUuLVj3z1vIvEY2zz0tz988ybVs2L3XzsK1trOpr8g/Pcke KcEpNcTe4N+90zZMeCw+zjtqtdy/wtjAycmzta+quMc2Qc0aON4lY8trxXXJejtARjo+Pn3J bb66esq+zcazrK+urb89PsYdLMspROVuxz/V1jY8SEE8O9nRbry+4tTFx8q0rbCtq7bvLcUz HMk6Lthk1k1Vwz88UTs7PE1vXsTD0+PLxMa7tKyvqq2+TjC+JyPCLzrkSc1ZTcZLO04/OUJL WerTx9Rlyr/HvLGvrKyxtEsuvy0h2zM7VUrXSnvOTk5HPj8/OFnXXMHB48rFxre4samvsa7O M0bXIi1OMz898cVG4MxHPjs/OzBI2GTRub/fxbzAt7Ouq7Cvs1sv0kMdPEQ3Oku/z0DZ2TYv SUgvPtrm7Ma1zeu1wcu0r7Wwrqy5WjjsPh08PjVFPcfKN/7ROjJJdDwyys5Qwb/H/Mm3x76v tLGtq7LkNmxCHjRBOj4908Q1WsE4MlpNQTdPuk5tts3Tysa2y7eruK+osb1MLdIrHkg7Pj4/ tmEzwWI0Pz1eUTDduFNvucjJz8Kzxrewr6qutb4yLd0iJ0Q6Zz1StUlC60VFNkfYPT3Zw/bb vsPB2Mu5wMG4q6uvtbovL+YiKTg41jhEtVdDVkljOT3PWjtfub/i0L66W1S+v767raSsuL44 MUckKzI71jxKumRFSUlmOT/aTkdbw7Pr7cDE8kHVt768rKSjsrtlJjcsIjAv6OM5zcBZSkBc XTlH01BE5Li+Z1nHxE5YvayusaOfr9c5LEMlHzc7/GE9vr9HREteTDZHzk5G7bvATkzLyF9r u6yttKaeq79DKTUtHi40/MQ73Ln9RT1LdT03en1NVc20zkpfxdJT27Gsr66horTjNCk6Jx8z PcdyN8i+Rz48Vm8zO9Bl+GnAsnVI78vTWNeuq66ro6Oy6i8kOyYiMTe68zfIxlhHMlXmMzx2 e9JjyLTRQl7Ixtzcr6aqraWksE0kJjokIi1Rs1Q8yMboOjH9Vjg+Wc3L17y93klj0s7Zx6+o qqulprBOJSEvKSEqRbTJOm/G00QvRXdFQFHcv9HHw91eTXjP18Czqaapp6aufiodKi0jLTW5 tzxJ2c16MDdmXkpIb7rBy8ne4k1O2sm/t66nqaiprcE0HyAuKyov96/aOkjS0zktP/NxT1LJ urnG5/JYb+3kurOuqaupqK6+OyAeLSwqMEaxyzpC781FLTzo4FtTz7i7xW1fV1nVybuysqqq ramttGsmHCcwKy00wLVKOEnW3zQ0VtbaVmLDurrVXWBe2M3JubGtrK+rqK3INSAgLi0sLkW8 0zo8W9RMNULoz+Niz7jEzdxbb17cv725tLCsrKqrsc8yHx8vLy4uQbzgOD9l3GU6SuTUzuXc w76/3FBN2sjKxbyxra+uq6u0VykeJDItLS9euFs5TXzMVTlR3M/UadG9vr9lSl7mycbIu7Wt rKyoq7dYKB4kLy4sL2G9Xz5O/MhuQFlrzs1z3M/Av1pMWtvDy8q7t66sq6etumooHiMtMCwv X7jcR0npwe9DR03Wym3wxMPK20v67tvIy8W6t6yoqqy40DMfHisxLi48vsBuV1/OyEk+RlzK 31PLv8/GVFvX68rFzLu3raaprLbIPCEcJjAwLznGut9a8NHMTz1FVdnZWd7BvMFUTvPSz/ro vbWuq6qorcJMJx0iLC4uNHC3x/9k58rqQEBHcM1x78fHuchNXP7V0W7MuLOsq6mmteEzHx4l Ky0zO7+4z+PmzMdJO0JM1XBOzcC9uWpv8u3P4fC/tq+pq6irv1QoHR8nLC0zUra7zN/Sxd0/ PUZx2Vd4wLu0zExXY9t6Vdi4sq2rqaOvyzshHiEoKi03y7O+yc/Fx086PURwcFPNvsW101Fr VtrVa8i5s6mrp6a69TAeHSEpLC87v7G7xNDEx0w9P0np/WjSv7W7eFBS+2pMZsW0r6ypo6i7 SykeHyIoKi9Mt7W8w8O/0Uo+PkxlVW7PwLPA7FhS6HlY7sK0raqppavEQSUdICMoKi//s7S3 wb+950E6PEtQUWHfurTA2mN41mVZ2b2vq6ynpa3MNCAfICQnJzPPtLG5vbi85UU5OkxPT098 t7XB3FbWyHpl6butrKyoqrTmLiEgIignJzfOtrS8v7m92Es4PEtTTkNyurjA33rHw9lo47yt ra2sr7XpMiYkJysmJy9bwbrBwb28v+ZKSlBfTkdX1sXJ4dbJw8fR18m9vL2+vsHWVUI9P0E6 NjlJW1dKS0xWX1ldet/Z0tTUyszWe2N1Z1dab9bDvLezsbW8xdRoTkg6MTM5Ozo5Oj5KT1t8 59HMy8jKysbU+e91bFxacdfBu7m1tLW4v9ZkVk0+NDM4ODYzNDg+SFNm78vEw8DFxMTS6fxo YVtX+M/Dube0sbS4vs58WU89MjI1NTIxMjc+S1x92snBv8PKyMrb6/J0bF1l28q+urq0sbW4 vs7vX049MjAzLy4uLzY+TGfozsC+vb/Hxcrk+XtsdF9p2cq/u7q1s7S3vcvuYEw8MC4wLy4v MThBU37ez8nEvsXLyc3Z2eHf4vLdz8nCvb25t7q7v8nfYU08MzAvLi8vMzlBVffq18vHwcTI ydDZ1Njb4uHVzs3Gwb+7ubi7v8bWclU+MS8uLS4vMzlAWfHg0cvFwMbKytbVzdLb39zTz8vE v7+7ubq6wM37XVI/MS0tLi8vMjlFX9zW0MnGxcXIzepRy8/3zsO4vLy6sK+1t7u43DguLSwr JCYuN0NNVc+4tLvYZvpmUU1hzr7Jzsy/uby9urSytbu+vsPJbysgLCkuJCFGz/pOR8quxko9 b7vFS1S7rbHha7+2wvjMsq+7ysK2ud1dbjofIywuLCAzw9RORF60wk9d6Lm10+fFuLTNacq9 usLGtLTAxM/EzlJLTEAuKSwuNCsuPltsTkrYw9Hc6M3Ax8nCvru9v7y+w8S9ub/W3Njae0pK VU5RPTY3ODY2OD5NSkpXbvV/5NnX4t7HwMO/vbu7v8nFyc7c8OLZ325na3l3WlZfWUZCRURK QD5ITEVHRlXf4Ojdyr/F1NnQxs3f3OXT1dvOzNDV2930d/599mZYWVhcXE9MUVZUTVBfeHZd XO7naF9g595nfOHY1NvZ1dnibmv07eXr393W2t3Z73pwZ39xWVtv5OteXf3tXlldaXVWU23r 62xs835lXWL57vb04djT0d7d3en7ZnP6dnx26Njnfft8dX7+fu1xbfjucmRrZF9fXFlfaHv+ 7eze1+n76utuYWr6amvl3Nnc5+Th3+b98/ZpaGReZmRneG1r/Pptd29fZ/Lw+/7t3upqZ3nu /Wlze93W697a393neHz2+3Ft6+d6bGpuZ11gaWJdY3Hz9XZqb/z+X1leXVxf9t7W09bU0NPX 3+Pq6ej1+Hh8f/9tc3ZtYmptaGloYllUU1laWlxnfHz+8+Pf2tvX09/c3Ojj4Obr8vv9dW5x d29ubnT1/fxpYF5dX1xZYWtvbGl77urz69/i3trc3unl4fZt++r2dHTx8f78+v19/Pl7Z15f XF9eZGhse/jyfG9+6+bq7OPh+XTr9Pbq6/j3eOvf7e3u8vH9+n9sd2xdXV5iZF5ga/z7ePfx 6Px14+v6ffnp7nVkb+v0+H385dzg8PH27vZwYl9ucG9tbv36+PTk6PJ6efbtfmh4dHtoa/tx dXJ38fPu7+zk4ujt7+3u8f16Z2VhYm1qfe95du3k9O3o8u3/b3txbP9rcnJ66eXqem7+6O30 9PZ5bP3zbmlx/f7t8vHo7/tsen5ofXltcW9v9Hp97Pzt9Xv87u7wa+/e6Xp06/V2b/lyaGZv 6+htaO7p+G597vz+ff12c3r7aGpz7/F76uv363L96urqfu1sZmj76G91ce7+bWz0cHh4anhy cW//8/Jzc+7l7e75ffv8fGRo+H1teWr3f/fuc+3u6Pfq5Pv+9nplYGr+bmlt6ORzevvo3Ozs 6OZsbm5ueGZqa/xuZnHu6/rt7fxp7+l4e3Hz6nxw5OX88OPg7WtseHNmYPZ9ZGdu+Pz76+rx bGxqa2Rn+mdg9d/r693Z5vfk4ef87udyYGJ5aV5lenfz5ePrefdr6H9dZWVuaHBybe3g5eX9 29ntcnDcfmt0/fXqdfLqf+lqcnp+amF3d2Zfb/RrcPPy7/X96/P98vTz9vbr4nBtfeLua2rp 6mdx8e1jYXLzYl3p4+9n6uFma/Z+bn/w+XT739zscvT4ampoZXH27t3t/H7m33ZtbHRxZmpf aXVx+Ot2a/Tk62786fR1cv7p9G/r7nh94N5qfv7s+1x0bHXrb/L6fHfo5m5k/OJ+bWV07nly /OV06uHr53J462xnbHjrX2F46uhrfd7xYHnf6FpbeON8cPHp4HBp7+H2Z3rm92d64uxva3x2 eX9u/uruaenhdGV363hkder6XXR272Zk5ub5a3Hj2nNm9+p8ZX3y9mV99PLt7vXv7Xr5+3p+ efju/vj15+xveOrpblpq3GtZbeDsY2Z26mFq3OZqdOfkal5x6nJoZHl+Y/fn8N/j3et+dXn/ 5fldbN/lYWXl4vttbHNqcXdwZWv0c31q/uDk7nR06fVeZ9/na/zd4Ohs69x8anZw32xZdXVh XvXfbV7Y42t26er5aV/xcmd97vVjX+zm/Ozi3tvvcNnrcWlrfmPz6Xtieu/vfGF7Z2Njbfj7 9G9uefnuem/373Zk9OLp6OXjfej9evf7a3V+b25rcW9rfu3waGjv5m1w/PH3+eTw5Ovt4+r8 bPzjb2F3+WRXZfr0aHvf6+7u5O1lYnp2ZVx65O5q7uXw7t/i6vD25X9reFxteHhua+nz6/z7 //96a3Robu5++u5u+31wcHb1fnv25HRo6OD9Z2306/x1avzw9v7n6X52dP55aGV5+WBs3upz a+vecWh57Ot7b/Dlb27m6HhwfO19e+Pme+/t7fFse+zxaWl1X2p4/P5/dOzr8PZxZ3/9eWtq 9nv28Ovi6fjtfmtsfH5nbXX46PTz7/D+8P5+b3v9+Ht0/vf5av346vHr9m/s8XBobWxmbH7/ aXznafbu/ez45+p7evTudv9/ffTufH3x/fp3aXPzcu94cnnv63Jp7eZwd3VrX27ub/f19eff 6ubn8Hp9/XV4cHRvb2/3725kcO1pd/HzdWvj4/1m+u1vXHfsfHP97vHx8d3X6Wzs3HRk7eRo XmR+ZFlneXpz5uLs/vfi62949HJmbPzw/Wx37eb67t7o8uvycW1sfm9odP/y+XbwfWl5e+/r eW99fPnr7uj2/uTk92159W5mbmt2///77+z/7epxbvbua2pscW5m+vhof/738XXx4+xm9up5 +Pn9fmz36v92bvPvfHnr72397Xlt/uv2/m1y9G767vrr6+zudfp6d/l9f35zeHRpdG5qb310 c+/08Xhv8u/u6+v57+Pp6u7+8/xtaWlwePN4Z3jw8/vq7//083dvbG55al97e2nt/+/m9+rp 4eL+9up9aGJ4fnJ1eXpu++r1bXLr7XRqc3VkZ3h0cGZx6uZ7fOT2+ujq9+/q7Ont8u7j5+3t 8GlnbWJjbGdocW1y9/1ubu/o9vv+/3n98PR+d3p1eG597u/16+Lr9e31+/Z9+nBob2trbXR3 +vP29Onr9fn6fnf97/Z+cG//bnPu+fnw6uXr+3VycXJpZGp3d3D8cX/o83z9cm1tbn76eP/3 8uzi3+Xv6OXue2hod/97dnJ4+u/x7fZubfP5bXJyaWRqf3hx/+3s7O7s5ez97e9sbmtnam5v d+fl+Ozq+/v1dWpxbW/29XZ/fnf98O7q8e3t++zu7vlvbHJwe+9xdn1yeXhqa/b2/3p1fe7s 7vZ6/O/p7nT+7v54//r6cH7v8/L7fvXv/3Z9dHD9dnBubW376fTw6vp67uHs/O7s7vD6/HVr cnRqZGl0+H758OzzfHV7dGt1eHdlY2hy8+7t+Wty7+328uz2fuvk+/ns+Pf1+vfs7XlxcGpr amlubHR29PXy6u19cftwa31veHp+5uXr6ezp5u56bHxwbG13enLz7HhsaG12cnT49fTvdHP7 8uv0+Pjv6Obr/Pfv+2t1c250+ftufv18bmttdXv8/nh79+777u35cmx1fvp/eXn9/XV1//n+ bPHm7O3t7vxubGhqcm12/f715Oj1f2xxdnR8dXvz7uzs7uvr7O306e39+3lrZGlrZWl9d217 eXns5Pnz8H54e3tyffr28PPx6uv3fPr5/n1/9/Tz/nh+eXJpaWZy+P/9eP726un5dXp1d/76 enRx8fD97e/28v3s6P11+3doam5tbGlo/31x9ufk6vB9/PlydXtvce7q7/Xp6evo8/p+eP57 ZWZqb3VtcfPq8+/n4e70f3t1a3f+bmt9/fhyeefxe3R2fHZ1+vP9fPnr9Gxv+2lpbmxt9urp 9fj79vH89vTy8evk7/h6d/50cP337fp7/mtla3ltaG1ycXBvbnt+fvjv+nh6/fP26erv6ubo 9v3v8u73eP3r8318b3R+fGp0dGZy7vtu+fh4dXR4++/0/Hdve3rz8/7v7/v2/u7m9/vyfHh2 Z21lYHR5e2167O3o6fJ6/fD2am327vz9fG/16/7z7+ni6fhv+Hrx8mdqcGNfaGFcZHR6bmX5 63Fzb3Xr3d3e3dva2tzg4uDf4+jt9/l0bHNrXmRoVFNeSkpoTkv44W/m2tjY5+7ddW7i3fv1 2dnh9une6nXp52Vo9X5r+vx1dH18ffZsd+vs9ufp/HV5dWtdXm1nZF5pdPnvXUzvaURe1XNf 3NHaenTc9lls2elu4tTT3NjMzdvg1drh29fU3NjTa1dZPDQ9PzZBddvdz8bI3mVqZkxOedTi 2cTDz9DW62FeW15kc+DY39PT3dxvUlVkU0xZeevhzsnP1s/O2ujgdlxgXjcz2j4u+MdS+cDD znNhzmVCX89qVvHLz11n0+ZWd83W4dzLv8zWwb7U18nI2UlKaDYrPUU0POPI0+XKwX1FWXlG PlnR2uLEvcPY3u5WXEpN3d3sxb7IzMrb3HJZ8Nn06sC83EvY7SkqQDkvP8+/yM+5t19H4XQ9 PvDP7d6+usz539RLPlBcZGPdwcPOyb/K2Oje1tfi6PdRQDY2PTs+V9PUzMfP2W1UU1BOVOrP zs3Eynfu9VFQYGbv1+jRw8zZy8nPzszHwsh0SF5JKSs+PC9AwcTQyLzAWUp2Zj0+6crkz7q6 y21e+Ek+Vt/g0MW+vczVyNtUYeXUxMzx3tdOLyw3Oy8y1cHl1Lu+5VNabkc+YsnQ07q0vtT9 Yv8+O+rfV9y9v8rQx8LvZNLS08bqb3dLMykwRDYu/rfH3L670k1N4VE5R8vNfsm6u89pVlZ2 R0LNzW3Hu8bSy8vK4+u+vdrf2E5DNSktPjQtbr3Ky8i/x1BDdl8+TcnG1ca5vN1YU0FUTj3P vtfFuMTPx8/M2/rKwszbyl08PSwoNzouRsHOysfHv3M9VPtGSNjDwr+7uL7hZ0M6bEc+yMHQ v7/SwMxl1tXfzsXKzutGSDkmKkA4L1W/vMjev7xUQWjzTEvZv8DFvLzKWj87VlU6ar/NzMTH v8N42sze0MjEyc9pREguJjNGNTrQv7/X47/NQEJtXU1oyr29vr3C11I5O2ZLPd7AwsLNxrnK Z9PRz83YxcbOVD5ELiQuSTU52r24yOrIx0o+U1ldfM27t7vDxtFPNTdUTj/vv7+/ycK2xGPb z9nl3cbFzUc+Ui4jLkM3PO7Cs8T6w79XQEhTdHDnvbS5wMbbWTszUVM/9sjCu8XNur97e+DU 3PnGvcDXRkc9KCUyOzlM4rm1zN3H00c+P1P0dNS4tLvA1PtUODlKSU3fxrm4v769yu1ue93j yr/Hv9M8PzUjJzQ0Pl30t7LR2cVpSkNAZunvwri5t7/m/EU3RT5C2c3DuLm9ucrq6V5d8t7H vsHB10E5MCUnLjVAeMy1scbMxv1MRERXevnLu7q4v/hjTjo7QEjezsu4ucDAzOndZlvW1c+9 vr/ERzU1KSUtMDtt6Ly1w8rB5FlVSFTxYNe/wbzA3npMP0xGR33XyL7GxLzJ19Ta2t7fx8HI x8pqPjQsKS4xND5dzL3Hz8TE1OVda9nkeebQxMTcZmhdVWJbbdza0M3Ox8nSz83Q09LSx8zZ zthVPTYuLzAxNz9S6tLSzcbBx83c4NvdfGBs399kXvfe2ejm0s3W5uTVztfZz8vN1N7Z1tvk 7PNhTkM7PkVBPTw7Qk9KTP3Ry8fDwr7BzNbxe29eVVpnfO/j3+zx4t3j4s/O0tHV0tPa3e3j 6n3c33RoYVdOSj88Ojw9PkFIXtzKycrJyMfO2trW3u9tc+btdl1XYXFve+vc1M3HycfJzc7b 3t7b2uf6cVtOS0lDOzo9P0FCSWHe1djZz87O2d7Z2Nnlcnzp6fRsaXf0fHnp18/Myc3NysrN zM3P0tff+VlNSEI/OjY3PUBBQ01t3djTzczMzdDb3dnc7mtx8d3f/3vw8/bk6ODa19fTzszI yMvKysvL0t5hSUA+PTg1Nzs/QENPd9XOzMjFw8XN2+bv+GxbYHnn6fvu6uXo6u/n3t7c0MzL ycbIx8bKy9T8XUxBPTw3NTY4PD5FUXbTx8PAv7/Gztzu621bUVpu+O91/O3r9Ovp1s/S1tTL yMnNy8nKzc3Q61ZDPD07MjE1OD1ESnXJv76+v7++yuB+a2xYS0pU//FpbOXW3d/l3M3O2+TS y83Ox8K9vsHEzV5DNC0tLissNkfkzsm4rrO7yt3+WT08SFL73vPbwc3U5+/e7E9Z2NLP1czC wM/LxL+8vsTI4E49MCknLCssOE/FvL28r7bG6lJLSEBCbNC/u8DTu79PTkpaYkhCy77FxcC7 u9TyxszJz9jR+T46MScqMSwuSm29u8G8sMD9a0pLTUVOxb+7usrFvGdES0dRTUb/vsbCvLq5 wuzjznXc0+fZ6UM6LiYtNisvT9m7usK2rsJcV0pJRD9Oyb++vci8vl9JTlFPSEnav8jEu7m7 xtfUze7uys3jUUdPLSQrNS0sO125vMq4rbfV71BWWEBG78jEyNHFvdxOVGN0VkhiyMnZyL69 xd3Zzs/m4NHOcktPPS8uLzYxMT1Yzs/KubS2vMrS1O9TR0xY8F1LZcfVc9bPyc1mesjV7+LW zM9nZeDg7/1l7dX7fNniWlNSSUE6Njk9Pj5N4c3IxMK9vcrW1N7k4/X75vL2dFRWXlRUa37j zMnNzc/W1vFca25f/uv52dbZ0M/eZ15hSz89Pj9EPz9NVVVo/fnLwc3JwMbIyulu8VpJT1Re 3eDlz8vPy8rSz8/m6uTs5vb92+H+9+fe/U9PXkE8Pjc6QTc5Vlx0ycrDs7jFvsHRz2FAT1Q+ RWFf4Nr+y7/My8bLxMh+08xmaOhdYXdV39Ni5tJYQ15SMzc8Mz1CN1HF1su3vL22xufP7E5W Sj5WaUBQ19PLyc29uc3Wx8vR5F1702ZK5eF/6u3Y2+bpXj5FZDYuOTc7Tj1Hu73Lubq/uMZV fOFMS01DVHZOZMvMz8fHxL7M4s7K52526NnvWWTVambJ5Vr0900+SUg4Nzg2SFlFZb/FxbzF wrzUXufwVlpPSF1YTffU39TLy8nGzMzGzdPa4t7vb19WZe996+dx2d9LS/BMNzw8OD8/OVjQ 38/Hx768ztvIzHxXW1tUZmVTfdvu1sfO08LFz8XO3Njsa1pOS05RTVJn4M/Q2tvdzNhFPUE8 ODk2PFhrXd/Hw76/ycbCy9zs6v9jXVBSavNnYNzP0s3LyMfY8fT2X05NUFlQWuHc2crEx8zO 3Ox0UUM8Oz4/OzhBU1laad3LydPbz8rN3d/T09Tc3NbRztjb19LQ42pzfmRZW2RbXXlod9nV 1dTe4tfbcVdXU09IQkhOTklHSU9eZV9fb+PZ29nQ0dHU19PP0dbP0NPT3N/k9Wv16P/3+nFy 7enl5O3h3ODzc15jY1BKSktOT09PU1pcX19p/+ft8uDn5dbc5dnZ3dzg39/f5/Dn3t/e3ufk 3+Ho+//t82pxdnNwb2/55u/7d21taV5bXFxPT1RSV2NkXmfz4d7k3dre5ebs8X/88fX79PT3 6OPh393f2tjb4eXk6vD0+HN1fHRiY25waGBjaWpnZmFdXlpcXl1lbW5ubH3q5ufm3+zt393o /fXv8PP29e7i4Orp4uXm5ev5e3psaG13b2dsffpzdn78dPvx+3FhYmhuY19gYXr+bWpud/Dv eH3w7/z68e/j4+7v7vXu5+nr7Nze5+nx8u30/HNxc3V1bW9tfvD/bnJ/bmtmaGZka21nX2R3 8PT3fP3w7u/y8+79+f1zefPq8/fy9e/h7PPr7fTu/290cnh+fnJ2+v397Ob+d/xmaWJgZm1v b2x98/z/++74dfr1bm94+fh4enz87u7p6v/+7Onq6+bj6P52fHpxa2n9+Xt//Pfy7/l3dfpv ZmhfaHR1em7+8unk5uPh7e7u/Xt9eWlmbG5qdfz7+PHt+Hn5d3NxamNmen7w7ufm6erq6vjp 5PJ4b/xva3R0dnL18/v2/3B4fXFobG9mbvj4/P30+3Jv8OZ8dfz39PPt6+zu5ubu6vB+fW5r bW5qa/b7aHfy+nlscn10bnTz+Pfi3uHo5e7v5vn9c3R8/m5hY214c2307v787e9ua25taF9r +u/59/B89+7r5+Xv+fN4b2tudnL58Ofl7e737+31fGJw7PJ4d3h3c2toZm3373p+cXno5ejs 7uvu6vz+c2l0e2RfbHZxbv7+dfL8eu398fZ48vpxf/duc+rq5PHu7vx98/JreGZY+evt5nt1 fe/7/uXf7fpmZfJ9Z15eTVtyT2Zjbu/729LR1uPj29TZ6eZiXl9aYF9e73tqbnzg6d3Y2+Zn fep9cGxlVmXP3WZYWO3a3WtbX2Xo3XRuZ3fud/z3//Vj895n7fR91+v/8eLa7W/85u18em70 c170de3zfutoYGhy7ONuX2/s5XpzdHT16vteafzs7WpeXXnd3uHz+vt51Nbua1db8upzY2pn XGLp33l57Pvf+/ja4uLh+HZ5+tzma3nscOHf3utdVmJoZ2FfXFJVX/n+amVeWmLl6+t7beff 29XP1drPzMzNz9DV3dDR1dfk7ev4+OJZPTQtLTM2OTw9QFDhzb+8vby8vLi7xc7Pzci/vsDH 0cvBvsHK1eTTyT8nJx4gLigpMy8/y7exra26sa+9vM5ETW7wzczuXs26r6y3wMPBuLjF3llP KB0kHCAvISY9R8Csq7Wrpresr05lUTVX219hel31uLSzsb29srK3vM5eZe06HhseHSwvIC1K 0auosLSlpKuuSy4/Q0htS0R7xL67u7+4sre2vMbGydrw7GNDJB0nJSovIittu7O4urSloa3M Pjc9R0I1O2HRvr/dzbSvt7zAwLC1ysvMxr7CRiAdLCwpJBsn07nRbcisnZ60+Vzd5zorLkrR 6D5GyLCsvODEqqiyyFbNsrjRWGLnLx4kKysqHyNFxMvYwK6kprXIx8PvOC03aP5EOlG9tLi8 ua6rr7y/v8PM+Vhk3upcNyAqPSsoISRCZz05VLOprbu2q6u9SUDf2lE9N1XJ3tzDtrO1ubq0 tsX0399aS0dY5dg4IzVCMiwgJD9HNTVEuKqxvbOvqK7U8cPFxko2TdTa22zVurzEy+DQxdRQ TVJGVE1BQUJFU1dSRUZPWG1oV+7Z5uPn3NreZU9TU1FsaGPt1ce+wsS/vru/yMzh+WNTTkxL S0VBR1hfXnBhbOni5uR3+9/b3P5lY11PT1RW+3dYaX7czs/Wz8bHzuZ0emxVTVFTT05PVmzu 7una3d/c5ufb6PTj0s7fcmz193ZiXG/j931qd9HP09nk29z5cltLSUVBRkRFTVZn+/Xs29vZ 1NzWzM3O0uLe1drk7Off3u18+/nv7/30b2d8bGNqXVxkXFlbXF5pZl5cX3v1b2Rw9+fj6Ojq 7+vn73dm3vVq497Z09fb1tPc6+VyZmleX15cXFhVV2X8dPXp5fRt+elwfur+39z16ez9+vNj XF99dmFvenrv7nzx8+rb521t5+Xx8310/XNjbm5aX2xjXWZ0793T1+nf2dfX7Hnzb2VoZl5q fPzu7ezweG5uYF5sZl1pZFlq/nhodd7a6OPrfOf6bfh8++vw6uvj297k3t7l9+5y/P3t62Jp YV9kaGJfXmVfeulxdO/h+n5uX/1rZ3hnbu/o5eTf+tTV297g4eVpYGZ2W19bYmvv9fjvfPHb 9HVz4WVd7fZWZXVg+Htv3+Nud+nfbfnr6390cV7of/Frevn82txn/enn8+r8a+72bWz/Zvn3 bW59cOpnbWxvaWr1fGvq5+/d7u/d5+Pm3l7eefZr+Vr+/Gtt4+v28etse292bFxsXWpyb3b/ /Xrt6+rfb+rm7Xd+8O73c/7fcut97u70eXbu535hYfltamVravBwe2rcamVu8n3aYdbbbNv0 /95z/ex86njmT933bGNW4Fzi+mNg3nR+Z91V7mXPXdrz+drYV89lVnjbT+5sbfZt9vja42lk 2NdQ11xy3U7mVnTUYWja0VXt40/JW+HbcefVVEtFd1pt7czO3tPf7MxeWWL+S0xH5t1a3M/f 3+xzbebe52je/9z75FHPWXRW5uJda9tQ3X5qdeRY39twZmbu5l9q7OlQ/uXn0Vt36Op26F93 2eNL8VHO61vVz9PaVl/iZVBXUXThTF7p1sx7Tt7P7GZVaMjsW2p80tRUb9/cbGNW5tnVcu7b 0trsXt7u9lpOXFhDQz4/UE1KbfnXztXJyMDGzNnJy93n28rD0NHHvr/JzcvI0DwoKC4tKSMq U87Y2MWspqy8ysnA5TowOk5/TD36ubW9ysm4ucnVy7+9wcfFvrm4bh8aKionHxw1rrG9x7Oe ob1IP3rXMSMqXra6Wt+vqrPS+8q9zO7dvrO4u7exr7j2IREZJyEiHzCmm6u5uqekzikkMHha LjS3oKC6PWW9zj4vOsO4ws68qKOtu7y8yOQ/IhQTIi01Njevm561clbC1S8gKG2usdPaqqCz OSUsV85MQ9uso6u5uq+ru04+SPDcbEEhERs4NT0sOKeZqVo7+rbKMyhBraa/PlasquMrJUqz v01Xv6amv+fEr67OQFjDvdFjVysREysoPi8qvZmfvnFTvrfwKi/Qsr1SP8aor1wtP8W0t15F vKixv/vKrrxGOlLBuMtP+WQcDh0iLd8vPp+YqLdYPszHLSI17L65v7qnorVEOEhjxNtD3ayr sbns2tVPOD5m+/roz8G4NhEYHyXISTW/naCryTI43m40PUJar6qwsauxu89ENkzPZ3rfYu67 wuDa8WNueVBk2tbl08XbLR4mIS9WPDt0vL+3vmPYuLnJytlXxLnEu7jA1Mx9T2dYP0Bg/cvA fFFZTk5WTUt5097cbl5TU1FMWXru5vDf0tzlaWvX41ZVVnHi8l9m6n/4Yl5cY2pl59ve3NLj 7W9p28rKzMrS72n0aVpdVVRz29DU1up09V9KVmBUZE9f2s3VfFhITlFZTUlOXOve6nl+8/13 ZV9+5Nfd1cXCz9nO2d/r+urb7ezn4OJx+nZ34v1iYW/m2t5dXWVTTUpKTFdSV3j8593fbVFS XFRPUHfTysfIzef18eLi5NrWzs7S1ehycF9WV19kdff46u3wb3F6ZG7u9eTg6GplXU5PUVJT XF5m8ufd4O5lZV9ccNzV1NDR1Njb+WVrc/R69O3r5vp6/nZmbHjx7nnk3uPr+21xc2ZubWRv /29saW9+//RhVWF18+h5avb3eWVeb/dwfu3i3fV/6OPl6fFvdvju4d/d39/n+f38/3pzaPvf 39/k92pwaV5cV19fWl1mXV1gdvT57vLx7uz/c3Fr+/H97Ofu7d3a2Nje4ODvbHT2bWloeOzh 3N3lfGVmaWVmYGBdXmttamn/6urz6eHr8Xlwb3N2bWJ2733q+HFsb/t8b3B+duHn6/Tv2djr d/B7fev7Y1pd/v9rauvz8+Xj3ubvd3BvXV9fbPdrZGnu5efrbGrf4mpibXr6935sb+7d4Ovq /vr1ZF5qYmNxavjV2fPf5P3e6F9leGr04v3w4/nx42pcfWFq5ft48ff063r93+Xu3+X49+vp 7PNiVFZXWVdMSkhLUVRcYWnu2tfb1dbUzc7Kys/Q0s/NzcvQ3NnZz83U3Nnc2tDM3jAkJyQu Qzg2SlzOsK67vL7Uwb3aUUI6QMzCztJo/L21uMD7Uu7HxMjM4NXDvb2/ydLD8yUbHBkkPTI6 3tW2oqazssZVyMhJPTUvQ7+4vcLg47mvtcpOP07MwMXEzs+9tLC0v9bczkUdFRcVJkc4Ub26 qJ2jrrLgP3paOTk0L026t7O6/N67trrORj1M17+7xNLGvrWxtr7R4drSOxoUFxcs+kR5urSk m6K1x0c3a2U5NTAy562vtrpo5rW5xf87NkfQxcLLcc24sa6wvM7X1NRRJBUWGiJS7EjcvLCi n67A0EtT0FA4NzQ+vq+6xNdiwLC3zEs7PXTJ5mNVTM20r7C1vcfAvsTWMBwZHCEyQjEzStqv paiur7a7uLzZSzozP11aV0RAW8e0r7nQ7/Tl2N9TRUdkxbq6vMPKyMG9xFYvKCgpMTUuLC0y Q8i3trKwr6yqrrrYTUZLRz86NjhLyb3FzuJx4tPS0Nz76trLxs/f+2l/7uzi4N7U0elbS0tL TUo+Ozo+R01NTlBTXeXY0s7TzsnEwMLN4/Ria/xtanDax7++wsnS2trd7nJbU1dhX1lbWmV6 3s/X52hUTktDOzY1Nz5IT1xiaPPWycjKz9vW1Nre19PVyr++wsnMy8XBw8zoZGBhXU9IREJJ WHPg3+Lm5djQ1upSQ0FDQT89Ozg7Q0pWb37j29bKw8XFxcTEx8nJysrIxsPGzdDW2+tvX1BL S0xOT1VeZnzk3trSz9Xa53lkTEI9Ojk5Oz5DSExWZ/Dg29TT0c3Ly8nGxsbFxsXEwcbM0dff 4+9pXlldYVpXUlNfa/je3OHp9HRubWFaV1lZWFFKR0NAQUVISUpPVWNz5tjPzMvFwb/BxMbK zc7P2t/e4uLf3tvd5e/q5PxtbF9cXF5oaWNs8/ZsZWVfWVFOS0hKS0lHSUpLUVJbcfny5eXg 2NTPzcvIxMLExsbFxsnN1Nzf5HthW1pbXV9hZWNjYWlpaGdfXFtaXV5lZFpcWVRaX1tZW1la YWBdX2Riae/m5eLh2drb2NjX2tTQzs3R0M/V09Xe4Or1fv90bG1uX15pXl1jYFhZW11eXVpV VVVVWFpVVV5fYGz48O/r6+Ld2tza2uPf3eDn3Nja29nZ3d/h3d/37utqdv7w5fB8c3X+9On/ Y15cW1xXT1VcV1pgXGxsYGpvdPn7aWr+dnvy7Pjd0N3Z0tng3OXu7Pj093Nw6fDs4ers7N7g 7evyb2NkaWpcXWxfX3RwZGVuaWpwbXdydXP3eW326+zq8vvk733m5vX6+/zy6ezq7ebr+u/r 4u98+/ltefP67u327e/6+3ZlY2VnbGVtdH58bfrxfHx8dHZtZ2p2eXf07PF09On2c254e/Hq 6evx6uPd5e7e5e/rcWhkX2hoY15neHv97u7s7Ovt7ff7eXD+dW5yfvr29v52/3Btd25ranD3 6Ot3++r6bmlufP7w63Z+dHDr6nlqe+7t7+rn7ut4d+3r7fXyf/Hj7PXs+25wbWNmX19ib3Fk aH5+a/Ts8vD6d29lWltYX278TUz6a1Ts8d/J1+7Uxb+8xMi+yNTaYUlTalZYY1tkdl9falFD PTo4Oz09Q1R8zsLFxsTJycfLx8TBura2tbGxsbS6wMX1LhsODRYgz6uvqqeln6G9NicdJD7t uK+5vKeksM8pIzXUrKe22MK1qKGqsMBJTd1dKxAIChI9np6jqrSqoK47IhcWLrSemKG2r6qz zykZHjuumpyuxs65pqS210E0erjANRIGCxg/l523scCun6wpGRUX05mXlaTZwLHKMRsSHsGd k5zBUlO8o6jWSzpRp6GyPhgHCRwfo5nfpp+on6kfDxUWZZKWmJ9dabdLJRsRHq2bk5jHTLu6 p6owL1u2nZ7dIxMIDiUqo57Jn52qrjwQDx8ym4+dnqW/wk8dEhYa25mZmqdq1K2vts4rZKOf oLklFAsNIC2poL6npavJMxQPIUqdkJqdo63HPBgNFB6ylZaZpcdk027IvluwrLaqvB4MDhYn nKW9qbu1sjkUExssm5KZmaq/w2shFxEV35yWlKXNv8hO6Ntiq6KvttsbDhofMqG86qqpuMUj Dxgq+Jycpp6gqrY8GhofJtKnr6Wjwbu+OUPZ36qepr1WIxEaLTGsrOyvp8VHKhUYL16onaim oazMPSAdLUK8rmHOtMa6zjtYvr60q62hnz8fEw89t7qv186gojcdFBQ+pqqprbiioOQqHx00 s7W3tMT6akMzReHOuq+yr66ysK5PHxwYKbjIyr+6rbExGhwmX6qvuKumprI8Iig3UsjSy6+o r+osHylHwq+urKirzjgsLMqsqao3IychLC4oPa6foKxILj0/OjY27qegq7xZRmE6Ki9EuKWq vc3f5mIxIiXnr6uszc+42jEnJTW8sLWtqsMuJiIs1uVMwKqlp8kqKTAzPkVesqKlssNTRj8s KzrWr6u0y9tYPjApLUbNvsXAvLy8VTdI983F6G7DsbK7ySwcL0U+vl9LpqS8ezYsPE8xOdO5 qazXT990Pi4qPMK0tsHKvL33PTQ+6srW3Mu9vvRCPkBDY1s6f7a8tbxQz8JLSEg+273MZDU8 1HFKOC5avddeXf69tc1KS/rJy1ZG0bm7xWFV1tZQPzxI1Mze58/FxvdAP01aX1ZTeczN5FxN 9cvwW1xZ1s5NSnvUv8LwXW7meFBKVujW2/B+5f5YV1Zj4978/ODd6llOT17s6tjNzdDfeHrm 6fVsae/V2WhPUV9zb2JgdejX1+ZpWv74b2ZfcXZhVVhffO9pdGV22Nv6Zmfi19zY29rU1+90 ZV9wZF5+6+Hd6GpbXVtWYf7o09Hd6/Dx9Pb4f/f7dGlcWFhedX936+Ti4XZ3+HZkXWBfZXZn ZGt+7Onu8Oji3OR2eevl2dfZ29/nampta/Xt7uTe5N3ob2puZltTTlVdXlJLSU9cYenl3M/O 0998a3N/efDx8/Lw5+l79e3+9+Xi29vd2+Hp4+Li5efZ3NvW8m37Wk5KQ0ZOT01OT2D49Ozu 79/X1dfj7evrfWdcXGn75OXf0czJzNfZ2+Ho5t7cz87ebmJbTUdCQUhOVlpWV19mavR5+tfS 1dnj921jaGdkZPrk5Orp4dnQz9bW0tDOz9TT0NjqX1VTTkdCQkVLT1NPUF724t/c3tjV2tjj //R4cm5hXmNy+97X2djX1dPZ1s7MzMrJztrsXE5RTUNAP0BITktKT1187Onj29fV2On/eXTv 6/T76+Pp7N/b2NTQzcrHx8vT19DT2u1kT1BQRD07PD9ER0tNWOrf3dvb1c/U2uv6d/br+/3v 9/nf2tnQzs7PzMvNzc3OzczX5O1YSUhDPz07PUBFSEhScd3Rz8/Pz9LX6ndpdftubPb58+7q 3tXMzM3MzMnIysvM0Njh6FtKTUo/PDs8P0NHRktl6drV1NfT0tTa9vt/enZiduvv59vVz8vK ysXFxsfJysrN2+J9T0hGQTw5Ojo9QUdHTXfc1tbUz83O1Ov+8/3yc3T27uzc19HKyMfGxcTI y8zMztre4F5IQUE9Ojo6Oz5BRkpY6dXRz83NzcvT6/R3Y2psdGl94dfPy8jGw8LBxcnJy8zZ 6vFtUENAQDs5OTk9QUNFTGbbzcrKyMfJ0ep7a2JlZF9sfOnc2c/KxsC+vsLFxsvO0NPc+mtL QEU/ODY2Oj5AQURNbd7W0s7Ix8rP33l87W1gYnTh1NTRy8XAwMHExMTKzNPT1d9vV0k/QT43 Njg7Pj4/RExy49vSz8jDx8/gbv/je2R25dfX1tLMwL7Cw8TEyM7g6/b3+21scF1JQkdEOzk6 PEFAQUhQ/9/b0c/LyMjP2t/d3Ovx6+Pe39rRzsrHyMjHys7a6fF5+n5teOz7YkhEUEo+Ozs/ RkNERE59+/ri0cjFztHW2tbe7eXVz9Tc3dDNztXa0czN2n/04Oj7cvfr6dzhXUZPVEM9Oj1F RENCR1BabOrezcfIzM3Nxsrc3tfQ2ejm59/b2ufr39Xb+3Pt5vFt/PX1fWxsdu/pXVlmVU1G QUVKSEZKU2z7dOXW0s/Pz9HZ09p3++zk3+ro3NfU1dnV1t/e7vz0fnBtanT1b2tw9Ox88/Jw aWNcUUtJTVBNTVJcbnRpa/jm3+bo4ubh3dra1dLY29XV1NrZ2d/qfn14+e3vbmvzfnJjYl5e bF9db/5tXF50Y23xa2tobG1fWFllX15o9fTt39/g7fjv5t7p6O/j7d7b7erd293g3Nng7PHn 9nt1dWZddWxobv5va21qanV9e3ZvfmtiXVZXWVtbZ19ebXL34OXo3tne6enn5NnU3d/a4OTn +u7x9X53/nZeYGJpcnTz7uv0d+/zfPHqenFqYGNZW1xYXWJs9/xta/1qevF1bnXr9ObZ2tzj +PPj7vl7cvTh4+jm6u3p3+Ls6e36fHFtZG93ZF9fZWFlanh8/nt6emVreW5kb3RraHd1+t/p 6eXd3ev2/vjz8vh4evr47P7t4Otw+u798erqc317dfF2e/J4bv19aXX8/m1lZG91Y11jaGJv 8fT7/Onj9fvq7XJ37Oh5/d96S8nITMpr3dJa+/XoX2Ls/lNLy91UZDu44EvJW87VRe1NPOdP aMnbzc3V1MpiZN5LaF1E2O5K5m3myF5dz/l9z0fo7lZ2Y19u5Vjl3F3Qb2n2+l/r9PXP4mLJ WPfITNx1WnrwZlzrVN5ZXXRy2edx3fh//2l5aXtq9ufac/LPat/fYNvnXWv8T3dnUX56ZvZs X9ru6ehe4N9Z+Nv43W759tl512/jy1na8+7dae5v2n3qeVfmUV9qXnllT0tZTlJLSU5kXltl 7tfa0dXPysnQz83f0tvf1era2uvr2erZ22XT1Xjicl3xa15cPjlBOz47OFtvVGJl08za7NnQ 2dzoz83Oy87PzNXVztPQzd7a1eXO4vzT7GXsbXXTa21v9d14Qi8+OTU4LUfoSFhf0L/SednM zM961cTLx9TWwsrU0tLIyt7f0+fv4/7b71/c8vfkbN/abfXjTy80Py88LTTWSEp137/Kdd2/ y9nQ3L/I3cnLztHc1MjR2tXVz/dV3eLs7Gbd0nT729H0WPPs1j8rRz8zOSxP0D9O6MnI717F verf2si+/evDzNrc6svF+9/Hy9ta887rdl7vyu5m2NLPa1ja2V43NU02NTQ0e0w8ZtnR32jV wc7+0MXGzuDGwtrf08rK5/TNze5XbNnvX3jZ095u2M3g9mXb1WNJOEhNNDI5RklBRHfQY3nN yMvr0sPN3NzJydv20sbY79bNzuFp8dxjW/vr2OVt3djn6v7o3up+VFJTSTw8Oz1EPUdaV1ff 08/S5MbK1c/bzc3n1M7Zz8vNzNrl2+f5ZFdy7mp6/fLcfX338PFrZWp5Wk1LS0pCQkxOUlJm 6fvm49Ta1s/UytDT2N7Q2+DteOri9GT4clZn72/+bvnjYmF98+R57uHpbGbm+GdTXe1uXl30 5m1n9OX3ZvTub21573l0ZH76W1lqbmRhY3fu5uPc2dna1Nvh3+vi6Pvv5On5e3h3aW1mbm1m a3X6+HN27/Xuc2t8bGRjYF5rb2Fu+/N1b3RqdG5ncPJ/++bt7uzh29za197i5unm+np2bmtj b3f+7fZ99+Xg/m1qZGZhYWBlcWFkbmpqaWlpaWdteXX5/Pfr7OHg3Nra1Nnd2+Dv+mpha3Bp cHpybfx+fe3p9vDxdn1vb3p2a3Bvb3Z2bmp8+nN4/m5xd33+dmx1fXj4+nrr7PX+7enl3uTu 9/757e/7+XRldfDt7errdXv17e77b3L+dXZqYWhiZGRkaHj38Ptz++3t6+/z/Xzq5H3/7n18 b3X/7v1u/Xj69ern6/L87vf/9/X3d2598/Tu7Xhv//Xyb2xqZ2x4e3RrZ25uZG5/+vX/+/F+ /erq9m585d3ucnxtbHz393V1d+fo/enb3u/r7vb6eHZtZmFlbGhla2128O7wfvx8+PRxeX58 cHr/+O3o6Ovt6uv4++7r7HRsb/n8bnx8ef5xdPD5b2xvY2ns8u70+PLq5vX9eXr06/5ueX39 /3R/9vX6f2xobG9xbV9n/Xnz/HRqafnq5ufs7ubl9vn08v58f37u6ftzb3JxbHZscntwc/b+ c3N8/nF3Z2n5cGRPUdfNz9D14tLf1NHtdF1UXF5ueGhsfvnted7Y4O9VWFtKSVLuzt9JQFzT xcfR0NPV0djU+FNJPT5IXs7Ex8fZ6/Bsy83ncUpRXnb+VlVe7dnueVNp4srcfmtC4WDY3Uz/ Snn5X+jn4Pfq/uzPz3tYVfDN1+pQT83N1GVEas3L91FQ5NTwaPTYUWX97s7mYUxR02zcTlvg a9T6WEdM3PbK61boaMLKzvNR3mzc6kdfU2Rwb9Dz2+D/4GLk4fjkU/DwdF5ie2bx7PT8c2Hn 69XqZldWbnrocV9ocvHz+vXyX3bn7O1qZPbc/vP77eDad/Tx4NLa3mvu4PLkYl9dXPdpa2Zs 6f1pZGBYaHhtXldhZXdpcm9r8fPd6OLxeeXW2djY6NjRzdff2OjW19TT3OVr7Pn2dE9AODc3 OT0/SE1e6fbX0dDNycjExMjO09DQy8/c2dHLyMfL1Nve09bZ6f7n7T8wLygwMjE/PEnp0ca7 w72/0MXM59Tu3snV5+xY5M3GvcPKwMjGyNvh3WXh2c7fNCwrJzUwMTs5S8nDure/uLi/u81Z V0lO8VhQWE/Vwr65xMi9v73C3mlla9DZ0mI2Li0tNTcxNzpGz8TAu767tbq5vN5bTkNJSD5E R3bCwcC/wbu6vb7H09Pa2tjc7lM0LywrMy8zNj5gyL/Cvr63try+015UTU9JPT9EXdjAvb29 vLy9xMbEwMjP2M3Ex1QvIyImLC4xOfm8s7G3vry+xu9GPUBNVF9+ZuDY1MTGysTKzsXLxr/C v77Iwb/Evvc1JyIjKSspNlS6rbC4vLy8yEs7NzpOWFXXy8rEz8/Gy9Tb7s/CxL/DwLm7wcDD vr9NLCEeIykoLj/MrKy1ubu6vV47OEFcaUhZzsS/3W/WysrN3tPAvcHJyby4wszMxLnCWCod HiQqKCk8vKutt7+0r7xaOzxVdEs9Tsa5w2Rqybq8zN3Nv8DO4tfDwtXtzry6xuVFIx8lIyom KvK0srK7t6uyy0w/Xd5DMztavL5YbsO1r7vTx72+z1d8ysjVY+jEv83m3GElHykjLiUmZrq2 tr62qK7CWkXk2TYwOVu3yFvNu62uxs7Gvr5fQWnh3G1Q7sLFz+bayk8lKCwmMyIsysW9vc+u qLzNVkLM5DdHTcWu2Wq/t6y3c9rHxsw+N1pYT2ND/MDc2H1g1c47KDUyOzssR9fczuzpuLvO 3GTPv9p53s69vvDPvb+9zvLX6m9WQUxdWGZNS29eVFNLWuDp7dxhfu5PUklHTk9OUVpc6uLc 0szKys7Lx8vKz9HR6GttY2ZmcGxwaV9kUFxZTlRed9zV19DZ4eDuamRjXmZmX2lgZnVs8/5n 8PxnefTn2e9edf7s6GReb/z6bFtq+25raOrV0dPZ39zg+e9zcvX/dm/l5nVsd97nYl5o8PFj b/Hs82lkbWt2bFpXXl1bWVln9vLy5tfR1NvxevbycW1uc+Ta2dva19re6HN0cG1rXWhvZ3Vv XXfybG1lZG5sZF1cXmN76ujf0c7a3e5qaVhQU1lk+PHq393X2t/l6O3p9H/5e3VtaGFeY21q avnt8OPm7+705d7s/u3l3d//bWdobWBUWl1kal5fberd8nzl7e3e3ebj4fBtYmFqbGNjdu38 /PT06uTm9vP27ebs8uns7fn+e2hdY2psamVx7Ov26uXk/n92Y11gX2JeYm947+Dg7eplZ8fL /k9P5tV7Ulvqz83oYvfQzOlWVmj+9V5Z8tfb9Ghq6eV1WVhhZmBYWF945t7h/fzZ0t31e/Pl 3/tfY/Tj/mdhf9/l+Xf68PluXWJvffJ2Zmbs2d3b19Z1OC1PurlZOE+5sshPReq8wFg8Q97J Y0BO2tZiREbMvcb/Sl7MxnZKR0/sdE5FRljMw8TIzsC6xH5GSUE/S17U4V7uy8bOak5SZ3dp W1VaU2Tu3t3o3+nezMzkWlBe3ONbUWHeztl9eOPe9mhia299ZFVUe+bf4mfq0dTfY2Fo9mxY W2Lq4Obh6vLqZ1pfaWdubGdeX37n5O7w4uF+++rj4O50fdrMzNvv8NnKzu5sbv1oZF1eTz48 PD5CREpR+trNzNXS0NnY2d3W2dzYz8/Mys3R0svGy9PU0dfU09vu6udHKiYpKzExNUrIvba1 v725vtBvTE9ZVVn29trOzMvJysrG0tbP2NnNz9DL0c2/wMC/4iweHyEpLi87xq6qqLXFv8Hc VT4zPUx90MnJ1MzLzsvW0tnc2dnq9d3Qwr7CxsTCvr3FTiQcHiQwOj1et62pqbvoY1lKRz05 Rl7Mt7XG41FY1cvX+3boxL/I0fDnzcLLztLRwLi5yDceGx4oNz5J2rCppqvBVUNCP0RDPkzP tq2su1tFQFTP3llWesq+wdpiXfnVz9Pp2si7trnAQCQbHSc1XtXCsayss80/Nzo+V3h778e1 rq249zs0Ok/W1fdd/cm/xn5GQlDrzMHExr+9uLe79S8hHSMz9cfDxsnDxNROPDc8Ycm9u729 uba+6D8xMDlbxbq+xcjJ1WVDPENczcC+vr2/vbq8wd42JR4fL1bHw83WyLzFbT84P3XFu77O 2si8vdtEMi87YL61uc95eenccEpDUNzBvr/Bw8nEv76+y0wvIx4pPtm+v9XRzdPfWj07SGbL v7/M0szJy2A9NDtOyre6ynFa48fK319UY8/GxsfKxsS/u7a5bi8kHiAvVce/ytvFxM1+PzAz SNu9usDJv7i2vFo1LzlO2czS3N/Eu7rJW0FDYtXFzNnXwLi3usTcTTIqIyEtTr+4vNXY3Gta Qzg3Ts24sbbAy8bO6UAuLDRYybe2u8TIx9DvSUFHfMi+ws/Zy7u5vsraaEEwKiQmN/e+vMzq 1t/0aUM5PWzHubjE0dDNzuw+MThQyr2+x9Pdzs7dXkpJXc/Gx9fz3sO6ur/U2+dLNSwjJjnP trbJeuh0XFE9NTxvwLa5ydvg299ZOzM7YMS9vcbLysrK2XFTYunOy9Dd6NjIvsHIzsvNWTov JSc1+cHGfUltan1fRz1J0L+6xNTo29TYZj83PWHJwsO+vsDCyNr8W1ly8ezo63nv0MbFxMC/ wf83LCUnNHTLyepY1c/fYEk8RefNx8zZ2MvK0mVANkD+zsfCvLy/zOFtaGtufvvy6eTX0ce/ vr+9vcxMMSolKjhn0tf04snN601DP07o2tnYzMO/xt5GOztL6tTUyLy3vMnUee/2a19e9N3X 0tXJwMK/w8j7OS4pJzBL+dbU88zD3VdJPkJr3/Ph1MO5vc9QPTxCUG3ozbq5vcTP291+X1tf 69fc3s3Fvbu/ycDcOjMqJTFGWnt2Vsu71VJHPEN17Wnr3MS1uMhjQDxET09S0ru3uMXMw837 WkpLd9rm0MLCv77Ky73WNi4pJjdMS2FdX8C40VVNQEvl+Vzp3Me5vcv7RT9BQUxZ1b2+v7/G wcbzbGNd6Of+zb/BwsXKxsPaPS4rJzJKQ0lYWMW4zl5RRVLneFJb6M2/usP/WE5ESk9TzcLT xr7DvsX99OLt1tvvzcTJys7bztJoRTIsLDJAQjtDaM29xPRpa+XP021q6NvPzdTrV01QY+nY 19fn69HMzNPk79rW1NLe3Nne62xbYu3g3M7N2nheT0M9ODk7PEJGSljo0cvGx8rM1exfXF5T VV5qe/Tg0szHw8HGy8zJys3acWdxcWNaXWHtzcjO32FWWk4+NzY6Pj4/R1R63M3JyczP1ed7 Yl5ydHJ4euPh8NTKycnN0M3IyszT6eng9mZbWV1u3s3My9d3cmpLPzs4ODo7PUJNetzb2tbM zNTd6+7j5e55dfd1Z37ez8fBw8TDxMbL1N3k+2lcVllbfuHi09DtXWZVRz85Nzo+P0RGUHTg 19na1dLP0dja1N3s6+9ubfvw39HMy8rNzMrP0NDZ5vxpXmBcYXnv49rV3WVbZVZJQj4/Q0RH SkhMYn/56eja0dvYztXo7nRkb3D+7ercz8rHxMTFyM3O0t/y/WxbXGlwdm51/O7u6GhPWVpL RUBBRURARkxQX2Vr6djVy8rS2uHp7/H58u3n2M/OzMrKysvNztXe4+h0X19cXF9iX2t1bW53 fu/o8WZbXFtUSD9ASEtJSktOZNzR1dTc2tvn5+Lj4NjU2tXMy8/NzsvHz9/p6eDyYltdXGJr ZW996O387/h5e2FXVFNTTklHSUpKTVdXXF5qZmf2/uHb3djYz83NzMzMz87P19ng49/o6+Pm 3+37d/H7bmd9bnL6ZmlnXmlsW11eWVlSUE1KUFNWWFZaXWpw//7q4tXZ29rW0NfT1s/Q2Nbf 1tnZ4t7n7unt9GXu/nXiZWN/YWJjWVVmW2lgTVtTXllPX2JdVWh872Tq1m/v9OTd69l43ePv 2urg7fTe49rm6uLj7t7u+O1343pp9+z1ZHH3+vf4/WpdY1tcWFlgXmxeZG1/YWBp7Fzu6nZ0 dN7a8e/f1tv84d/c4en/5Pzn5Xb8bO/uYmXs/fPyYOPnZ/vq/Wd2YGVsX2pdVmvyZvhvW3Dm e/Vs/OP09+d7b37//+T49er51OZ709jt733nYWPybl9pb+fmaen76dll7V9j3WNeWm14fFVd 5W73/nbj6+riZmrefnHvWuzfeu5qYu/pa9vga27k4HPq89TrW97X7GV7XfJgXe1fe2Bi+WJz +t5vXeft7WJq4vj/Yezi5/L8d3ZwbWLp8exrb/V23+7gYmTb5Xpz7mju9WTh3+/i3/rj/uVt XPVZbFhTcORiVvv13G1n2dr0c+l67/Ro6PX8beD2a+Rp5uVv4Xlsb29safNcaXxd3W9u7nnn e2Zb4d78aWJ11u3j6mnr5d9qevtr7HR05W1k2eFfYWPq32VXYvLgd3BnZOzy6O1q8Pr25G35 4f3s833q893uX3dvc/lqfuplcnT26Flc7N3m+/3m8ezz7+ZeZu36cH35ZFz91Otibu7paW3/ flxc++l1eOhv/e/o6f7tfvLn9/d46t/seubq5+Do4fXo7nVyd2xPQj5DSk5RU2jt2c/OzdHa 5ejn8u/i3d/r79zP1PX93M7N2ebx3d/s4N3d4NrW1elCLiouPUo+OD3yvLe7vsPEyuPv6HNZ TlzWyMrqV1/f1tfrbm1p/eXc2ef239PRzs/Q0tfPysHA0EouJCUvQEI1MEW9rKy1wMrO7FZP UE1HSPrAucF8TFjVxsrbaFlp1sjI1f9s2cbDytXh39XMxMTWQiohJTFLRjQvRbeoqrnS19P4 T0ZGSExbzLSvvWBEUtTI4lBKV+LOzc/dal3mzMvX5+Tay8PAvb/ZQS0nKC88Pjg2TbmpqbTM 7vphSj07QUtoyLe0v21IUNXI/T87S9TBw8vMyMXGy9d7V13y1MnJxb/E2kgwKCguO0A7O1W4 qau7bU5WUEQ7Pkhc2r6ysr9qSFrTzlc7OlHIu73I0dDIw8t+TEdW5tTNzcm/vMNZMygoMD9H OjdZtamrvmZWalhBOT1HVOC+trjOUE/6z9tOPkX3xL2/xs7TzsrQZ0dHZtbN09bMvrW31Dop JS5HTjgsNr+nprdiTmtmST08P0VbxLGxwlpKadbpTkRN58zCvb3Czuzs2ndJQk383nj0y723 tbnMPykjLlJbMyg0tKGmvU5LaVRCPj07OlC4q6/SRkrw32ZRT1d/zLqyu9pecdt3SkZOa/Du 1sS9vr66trxRLCIlNEU5LjLOqKWwzFpPRzs5PT0/WryqqrdvRk1VV1lVW3TUvLS4yldLUlNM R01o5d/PxL68u7y5uuU1JSEqPUc9Pv+yqK272kU0LzM/RklpwK+rsL9jPTY8WNTU3NTFu7m/ 2Uk8P01p69/e3M2/u73Cx8S9w1MxJyMpOExYWt66r6+8YzgtLDhU3cu+trCutc5EMS87fL+8 v8TGycfHfz40OlfUy83W3tXDvL3CycjDylc1JyAmN2XQ1ci5tLjEYzkrKzdnxLm3uLm6vt1A MzA+z7Wwt8ffet/dUT05P2fNvr7K6+jJv7/EycrJ6kQxJSApQNTDwL29v8LURi8qLj/Zt66v t7/H3U48MzZOwK+ut9FVV/ZoTEE/SvvGvcPVfO3NxL++v8LZRTEnIyg858a+ubq/xeA/Lisu PtS2rrC3wdVfQzkzOGO7rqyyxVtKUllPTE9b38O8v83sXWTZx7+6vnc7LCMjL0/Ux8C+vLvE WjUrKjNptqyssr7Wbk89NDE91LKqqbPeP0BMT1FLSlzSvrzD3FdNVt/BuLa/XjUmIStC2cK/ vr27vNw9LCcrP72rqa6+cU1JQTYvNlS6qKWsxUs+Q0xaVkpR1Ly0tcNfRURYzrq4z0UtJCc3 YMvAxce/ub9tOSomLFm0qqetyU1APjo3Njz/tqqorsJPOz5JUVlp7NK9tLfFX0FBXcS6x1Au JCc56MC7w9bNwcLoQS4oLUu6q6iuw1c/ODQ0Nj1xu66rrrrcSkNERk9d48K2srbC70xIYs/W WDYnJC5Rxba3xM7KzehMNiwuQsmwqqy76Ek9ODY1OUrLtKyutspcTEZHSUtW1bmvr7bOUEhX 3vBILiIiMPu2rLHEzs7WZ0MwKjBSuKilr89JOzg6OjU2SM+1rK641k5GRlFeW/vJua6ss89N Q1ZtWjsmHyg/yq2ruM3V5GNPOCkrPMaqoaa6XTwzNz03MTpfvKuorsROOzhAXn3kx7iuqazB Sj5CQk08Jh8lOdOtrLrKzdna5z8sKzXxraGks9JCNz5ANzE2RNOxqau6bTw0OkJKaMWyqaSq u2U/OTs8LCAgLUy4qrC/yNX//Vs3LjVKv6uosspnSk5WPzIxO1a+rq2611dGSUg+QWC/raOk sMpqRTo2KB4eLFW2qrLI0dHj3lAxLDfkr6WovlQ9PVreVjcwOmu4rK/HW0VFT1VEQVvBrKGl tMtPPDowIRwkOsapqbzla1hh7kQvMk27p6Gs1j4zN1JxRTc6S8uvrLnZVkRHSz04R8uuoqKs utNHNy0fGh84wKiks9l9XUpDNCouXbGkn6rORDo5Qj84N0fKubCvw+x2U0ZBOjNCw6qgo629 0E44Kh0YHTi7p6W10tndUT0vKS/braSkrs1hUEY7MS40abmwr7LC1NZnPjIsLkW8qqKkrbjL SjElGxkhTrKnqLnNx8xHLygoO7mnp6y6zMTHTjEpKTbNs7O0usa/vng5LisvV7mpoqWrssVG LR8YGSXeq6Wqt7+91jcmIShTrqars7q7tsQ9KCUrQMa6ubSytbjITjkzLzRNvaegoqmy0jgl GhYaKsirpqqtrbNeKx8fLOKwrK2urKy9RjAmKzRE7sCzq62yxOVNPTAuNF2ypaSmqbF8LB4W Fx84yK6pqKSltTslHyQ17cGzq6emqsY3KiorLjpVvqqorrW91U0zKCk7waypp6Oiq2EnGhUZ IzhguaifnaTKMScmKy84WbenoqWtwVs9LiQkLUa8rbCvqKm4Ui4oLT/qx7Gjnp+qVSgcGBkg Ji3cqp6corntTjUqJik5y7Sxrampr8Q8KisuNTtB47CmqLPNX0w8NjxWy7CqrLG/XzQjHiQq KjJGxauor7W4vMLrSEBMV01GR2bPxc//38bH2vV13MvWXlNMSUhKVe3azcjK1fD97ev48N/W 0dbuV01KREA+Pkhbdufb2t1pV1974tHMzMnHy9Heb11SSERMX+LOxsHBwcXZYFtdaf7p3djQ 22pSSUM/PT0+RE9ke+fb1OFrbf/x4tLJw8DEydT+Wk9GQUVPbtvIv76/xc/ib1dSWnPq3NTf +/VqVklDRkhISU9e/+Xj8X14YFVRWuXRy8fHxsfSf15STEpKWXnbzszNdM3GQ2O+ztDYy73C ydlbWFxCNzc0OUA6OU3t3czb2by9y8S/wMDaXG9YSko9P1JYW1xhy8bT1s2/xM7OzMDI383C w77n59E9MDEwKCgpLU1OWL6vrKyvr625+k5HPzowM0JHUeDRv8XKv8nZ82psWVBa8djcybq7 u7a5tbvzaz0sKCgpISYvPOLjuqmlqayutclCNzY1LzJAWdjMxbe3vLzGzNhaTUdEQUxWec6/ t7q4tLi8yGNdPCsoKSwhJzU929u4qaaqqqy2z0NAPDQvNEpHRdPTvcfJsL/Z19rrTUNW71FZ zb6/yry1vMHM0O47LystKyIpNzZL4rqsra2pqrXA3GI+MzI2NTdDSNTc2b25uce9wc7jZdrz XGLb39jLysHHxL7M31pANi8sLSkrNTdLacK1rq2srLG4x+tLPzg2OTw5P1tj4NLJu8PDvMPF zdrae2x8bHnY3uPKycfD29LtQ0Q2NTQmMTAzQ0rLvbi1rK6yub/KYUlFQDc3OjhBSGPTycG6 sru6ucLI3vhxV0lOU1RlWdjQ0r7Gwcj9Wjw5OCotMCw2O1rJv7etrK+wtrvOXUk+NC83OTRK Yd/EvrWwsbezu83YV0U9Oz4/QFH9/Ma9u7S7ubzbWjg9MyEsKiozNV/Lvrapqq2utbzoSUA6 Lyw1OjhVzrq3sq2trbm8yE9GOzc1Mzg+QlbMwb21r6+1rrnNz0QvKTAkHi4mNj1NubKuraWs tLzJbTw0ODgxOF7d0ruxrq+3tLzc9EM4NjEyOTdBderGuLawrrO3tMPIv0ZGQS0nLzYdLjEu XkPEs6+7rKq9v8fhTTw9TU9A6cXOubu6tcbPy2A/Qz00ODc9TVbWu7u4r7O3uL3J3mlbYks9 SjwwKz4zIT80P1ZbvLW0vqyvxcnIfUlESWfzUdW9wcvCv8z7XN1HODw8Q0FF4cnJvLW1uL7F y/JPT09GTd5qbXJJPy1MNh8+MTtNUcG4rryuqb3NxO9NS0dP22Z7w7/IyMXK5E1RWj46PkxR ROLGv73Hu7vUet/eSElqY/nMxcrUWjssPDYdLzc3T2q4sKmxtKm5WnBSPDg+SN3GzrywtL6/ xGE/Pjw1ODY+3X3ku7O2wMHD0lhFTElETWnbysi8vl9ENio1LR8uP1bju6yqpa24ssg+ODg2 OU19v6+xtrC11Ew9My8wLjpTXci7s7G5vMvaY0dBQkNDT+LOy8S9vL3O4EQtKSs0JidB6b2+ taqmq8nnz0kzLztb1MW7raq1ydRiOy8uMT1Mf8y5srvCxdtOPTw+REpS3sfCwL+9xNTa2ndO QS0mNEMuLULJtbi+t6ut5UNZVz43PHa6sru3rrXsQT47OTc0SMW/x8W9wd9VPkBLR034zcnD v8nMzPlZXmLt2u0/ODsvNTgvOGG/u7mxs7O5ZkVKS0A/Y8i4sLW8v9ZHOTU1OkVQ27y5vMDJ 5kpGPz9Pft3MxMjMz+ZaUlhaXP7PwsrW0XIyIy8+MTA30q6prbu1rsJINDM/T1JRza6stcdr cFs8MDZZ1tTKvri83k1BPT89PU3WxMPGxcTI31ldcOHO1WtCPDQrNDs0PuS5sK6vvMLGTzgz OUhdzb62ra+94ExBOzk5QP3Hube+ws9pRjUzPlNn7cu9u7/YV01OSkdNXdm+ubvK6l84JSY1 PUBF3rSopbTY2uRIMiwyUbywtLKsrbpXNC0wODo/Y8C0srvXVEtIQDs8VMi8vszW0NVzSENN /Me+vsZNOTErMjMwOnm0q6yzxM3OTTcxOFjGuLW1rq66bzkyMzlAR1fNtrG2ylhIQT04N0bf xb7BytXU40s+QVjUx8bDu7e+YUA1JCMzO0NXz7ispazQWUxDQDk1PM+uq660vsnpQzArMkvY xcG/vLvISTU1PUdRYd/DtrfE3W5eVFFWZ9O/wHQ7LysxPDg5SsWuqau63nxlSj86PVvAsa+y ucbaWT0zLzZO3svFvbm7yVA7NzpBTGzYyb67wc94WlFRYmt12cK6usZULSQoLjg/QFO+qaSq ue9EQ0Y8NDhWvayoq7bIa0Q4My80StC9trfD61tNPzk6PlzLvru+w8bN3ldJWPXNzU48Mi03 Pj0+RNu4ray412RPTlBHP0XduK2rss5hT0VAOjU2Rdm8ub3N+9/lXUpAQ1jVyMjJy83Jy99u Ymzfzl04MCstOD0/P1HMt6ytutFeSk9bVUtN58Cxq6++50tAQT45OT9fyru5xNN3VFRRS0hP 7cu9uLzEy9DRzuc/Mi0nKTU7Pk/sxLOsrr3WTjxES01QZtS+r6uvu9dLP0I/PT5BSem9ub7I ckhJWmhy/+zQv7u+wc/w9d3oTjwzKikzOT9UVXzLuLO4vNxCQklPdOfezr20s7W/aUhDQENL S0tmy7+8vtRfWVBUZHZ53snAvsDK229mcP9lSjwwKy42PUVESF7Pvbq9zGpbZuzY1dTQyL66 ub/dXlNPVltfYGfl2MrG0HtXUFRl6trSycbGx8rSfmBVSktRVzstLS42S0dKT1vbyb3Aztlw 7cnHyMvPzcO7vcfbY1BPYvt1emVu1szN22Jaa93KyszZ69bddmRUT1NOS01fcX1cPDIwMzpD RkhPa9vIv8TMzs7KxcXJ1dXKwLzBz3ZWWvDX1t79dOTa1952fm312dLV62RXVFliVEQ/Q1Rz 7PxeS0NAPkRIRUdKUWvo3dzV08zGx9DNztDEw8XExcrP0tnf6nxy6trc3ud6eezq5d3u/v5j Wk9MTEdCQUZLT2doTlBLQ0xPXGteYGL37v7m5dvMx8bKzdPPzMjHycvV297m4+Dh6PTm1tLc 8HF17fNpYlBMUlhVTkxNTkxMTU9ZXl1YT1ZgWlxeX3ZxWlzz6t7RzczMzc3Pz8zIyMrOz9bf 7PLs4Nva3/h9/ndmYl9p9G1dWE1NUVlRR0hLU2pkW1FOavTn43x07OD9am1ea3d63Nrd3uTa 2NXN19nU5OHf2NPc5O3j29rk+/rw8OtsZ+7sbVpOTlVYYlhTT1FcVFZTVllb8vh1+FtY9+zZ 2/Tm6tTM0tft7N7t3t7l8Wnk29/X7+fa3tnnevNye35pZFxwe2ZqZ15laHBwaPpfWl9VXFxb XWVq/31mZ3vj5+Tp8eXd6fn77Oh67+/s3ODi/+/c2d3q+vTs5NvibV9hXmX98WxeYG958/Py b2Fu+n5uX1pt4+v0c2pkXvTpeWhs8m187u77bHj77uHb3un35Of/8nt16/f+4Nzu+3v64vJy b19u5+v4Yl5iYXV9Z/pzZGpme39xaHXo2NbraWp97O/h6F1eXOne9OZld+Hl6WNh9/n5dvDu 7Wleb2lsbvPl3f9g8+/n4ul9+ujl7ebv7PBvfPnk/mlfWmZofnxlZ3bg73X/d/rx73JqaPvc 7l5uc3zd4fDxX11x5t13YV1o4NHbd1xceuLj73FhZ2vx43lkX2H14+j7b3X46O58/O7r7/N3 a/rxcHB3dnBraG949PVw+Pj46PZ0b2xy9+r4aHr08uX3be7n7P586ft8bmJqdmlpe+rr+n50 +Ozo7f5td3fu5Pd6Z3jg5e1zd/70/H10+eHn8355bW5sbWVfZHbj7X1sYPzt4+NzXmL23d3u aG7/++Dye3NobHTr7Wxid/To9mtoa/rp7vdvdPP0+f16a+/e4Phtf/bt5Ppval577+l4XmJy 5exxYWP95u19Z3jm/fLucGh17eLvcfx37urn6WptcnXr6PRtbGl23+l0Xmd8ev1wa/Pj3fNu /uTc9mJl+vdx+HxjZmd96u95euTj7vL4e3R4cWxkc3Bt+f3xemr64+Xs8Ph8bvbk6vNkYfLe 2+xxd/DZ3nhaWnnp/WNZWmr69nptbvrpeP7zc+/o7HttbPvtcnB87ubp+Xn18PV+aP7j8vR9 evLt8Gx4enHq6nlfXWpw6+32eXP88PlmZHDr5/j98P3m6HhzZ2VhanNze3rv5uVxZPHe6ur7 a3vt7+ztb3ru3+n4dG3t6vVpZW747G5pfe11YW/1amN3d+75bXRy6uPt63Nwdnh8dXN96+nt eXzq4uP5Z2Lt3un9aWZ87Xlrce/z8+55ev7+7n12bV1jaGRpb/Dp3uP/7O/9729eXmBtaGty +efm9/7u8OTb53RreOXje2lv+eLc53hs+ev3cW1rbXT9/XJvd35rbW1x9+9+aWVy+ff48Onx 5/Jy7/FsaPv0bW5scfD3fHpua3b1/XJpZ3rj4OLm6v978O7t6+n1bWjz7/h+cmlhd+Li/mtt +PhqXF9peHdsZWR+5+brdmj95+XvaV9z4tne7fHu6/X17Xtoav1vaHn3fHJ0+O/w3+xvcmtx dnZv+e58cvz4/Hx4fXxucO7udX3o6HptbvzpemJsbXr0e3x59/P5++vreHVs+O747vRyYWF0 5+l+a2fz2dne8mduefLz/HFaXHHm7HNlceTf+XBobnj++Hvw+v7k4/toc+3u73pqfu/3b3f9 d/ptcv/77P3o5vt59+r19nVpeH58+fNnYHb46+58aGx8e/Xq5fF6fGx+8X19bGvq3ut9a3b5 df1uaHbr9m5kbObf3ehwZ3Tr4e9mZGlnfPLz925mb+fk7/1z8PDm5vhxZXJ67OX6enn27ejv bv51Y3Px7/Z0ZPrmfWFv6uzk7HFgbHvs4Ph4dvTt7/d2/ez3cXJpYn7scmtrffTy7Xdv+/Rx Z2Vgeujh4/d6ffb47N/g/W7s6/jvbmt3d37s8mtmbXVqZF5veW7y8fX9fnj9/3X8e2hu6uXu f3nu3dnd7n745t70Z11fcH72emRmc+zkdF9j+Of9Y11m693k9Pbu/W57c29vbe3k9G586eXu dmj27Pj3dmpv/XhpYWdq/ert+Pp97+rr7e/l6/r9/P5ybHFt+/psb3p2eHj39floXnTwe2tn a/Xe5HVpbPjf3ex3b/Th5uvt7OzveHFkX3J3bG5nX23r9Wx49eTe6nhuce3p5ettbHHv6Or2 aWt0dH13enp3dnns3u1+d2Ji9OtwYl9p++Ln/3Jt/d/f7nVlavDg8GlsfO/t9Xh48ebvbWls en5+f3r739nmbWdqdup5W1lj+evv7ffz5+Dj6ejvcGVpZ2dnevx9/OfjfP3r+nptaXB8+nht cOrf3OPvd23l5fhuYWn97PhuYWl+cmhofe7s6H9naXvvdG508N/iemNv6uLm92lu9O75aXDu 7Pnz8fJ6e+78aWdpZ2hseObl9mxq+fPw625odXvr8/Pr7ev67e/y6O9vZHXo5+9sY/7n/29o Zmz79HxoaW1z9/H48+v4enf06+rsfXH67nZtfeDf7f93am/u7X1qY3z5dX558u7rfW1vbfni +Glu/u70eWt06+HubWtz+HdqYWX/9/R2anjf2uJ9bW754vZkZm956ej29e3s+fH+bvHp9Gtd ZHHs9WxrcvTx8P5vdu/q/npzb/11dP35+Ojg8HZ3efn27nhoeHx3+Xtu9OXxdnNu+e75d2Zv 7ejuZ2n64un+92559e90Zvvr6v1oZH7n7v5tYHHo5vpkX2/r5v9tffjz5OR2cPbt+Hh39ufk 3+tsePf7cV5ZYHbx/2Rk9+rq7Xt68+Tqe3J09PnvfWxvcvHr8PTv8/fz9+7udmZiaGlsbXN+ 8eXf8XR/a2hqdHt//X34/Hrq4eDr+/Pz7ux5bHf6cP31eHZ6cGt7cmRt+351dHj363hw/nV1 eOno7/Lz6OPf6ezw7/l5eWxubWRga3rs6PHz7fd9+/53dm5nZmty+Hhofevk5u337eXv+HNp eXFnYGhy/Ozq9urj5OTsc2lqbXdtb3p9dWtw+f7v5vl18O3s73toX237+nxvZ2d0dnx++fP+ 7+/t7O709H1u/nhzfHBpfObf5e7r7vbv/2puf29qaWN16uzyfHt5+/J1avt9bXVsYv7s/fn7 8+/p6/R9cHj78X1u9PB99f178f/5a2d3b291/Hn69/Xy73Vt7vDu/ffxfv1sbPj+c3J3ffpz dnz29m9ua292cH3s7fH6++Pp+ff7b3V0cXn78/Tq6nj27Hh37/B8bm93cG1sefv6/O9+fO7o 6vxzbv/ofGlzcvvu739tfX/+fvHt/PH49n147uL+Z2VnbH1/bml57efg6vr7en51fO7s/Hp7 d/fv7uPu/fH0fXf9fGdveGllZnr3c21uee3zbvl9df7+e3jl6uXh7fb17OzrfGpx7/Q= --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Finally, just for fun, here's what my mail-reply window looked like while comp= osing the message you are now reading: --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: image/x-xwd Content-Description: Reply-in-progress picture Content-Transfer-Encoding: quoted-printable =00=00=00k=00=00=00=07=00=00=00=02=00=00=00=08=00=00=02=9D=00=00=01=A7=00= =00=00=00=00=00=00=01=00=00=00 =00=00=00=01=00=00=00 =00=00=00=08=00=00=02= =A0=00=00=00=03=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=08=00=00=01=00= =00=00=01=00=00=00=02=99=00=00=01=A3=00=00=01=E0=00=00=00=00=00=00=00=02x= wdump=00=00=00=00=00=FF=FF=FF=FF=FF=FF=07=00=00=00=00=01=00=00=00=00=00=00= =07=00=00=00=00=02=FF=FF=FF=FF=E0=E0=07=00=00=00=00=03=00=00=00=00=FF=FF=07= =00=00=00=00=04=92=92=92=92UU=07=00=00=00=00=05=B6=B6=92=92=AA=AA=07=00=00= =00=00=06=B6=B6=B6=B6=AA=AA=07=00=00=00=00=07=B6=B6=90=90UU=07=00=00=00=00= =08=92=92=92=92=AA=AA=07=00=00=00=00 =DB=DB=B5=B5=AA=AA=07=00=00=00=00 =B6=B6kkUU=07=00=00=00=00=0B=DB=DB=DB=DB=AA=AA=07=00=00=00=00=0C=B6=B6=B6= =B6UU=07=00=00=00=00=0D=92=92llUU=07=00=00=00=00=0EmmmmUU=07=00=00=00=00=0F= =B6=B6=DB=DB=AA=AA=07=00=00=00=00=10=DA=DA=DA=DA=FE=FE=07=00=00=00=00=11=FE= =FE=D9=D9=A9=A9=07=00=00=00=00=12=FE=FE=DA=DA=FE=FE=07=00=00=00=00=13=FE=FE= =FE=FE=FE=FE=07=00=00=00=00=14=DB=DB=B5=B5UU=07=00=00=00=00=15=92=92kk=00= =00=07=00=00=00=00=16mmHH=00=00=07=00=00=00=00=17mmIITT=07=00=00=00=00=18= IIII=00=00=07=00=00=00=00=19HH$$UU=07=00=00=00=00=1AII##=00=00=07=00=00=00= =00=1Bmm""=00=00=07=00=00=00=00=1C=92=92IIUU=07=00=00=00=00=1D=B5=B5=DA=DA= =FE=FE=07=00=00=00=00=1EIIIIUU=07=00=00=00=00=1F=D9=D9=B5=B5=FE=FE=07=00=00= =00=00 =92=92=B6=B6=AA=AA=07=00=00=00=00!llll=AA=AA=07=00=00=00=00"=91=91= ll=AA=AA=07=00=00=00=00#ll=92=92=AA=AA=07=00=00=00=00$=B5=B5=B5=B5=FE=FE=07= =00=00=00=00%=DA=DA=FE=FE=FE=FE=07=00=00=00=00&=B5=B5=FE=FE=FE=FE=07=00=00= =00=00'=91=91=B5=B5=FE=FE=07=00=00=00=00(mmmm=00=00=07=00=00=00=00)$$$$=00= =00=07=00=00=00=00*mm$$UU=07=00=00=00=00+mm=92=92UU=07=00=00=00=00,=DB=DB= =92=92=AA=AA=07=00=00=00=00-IImmUU=07=00=00=00=00.=FE=FE=FE=FE=A9=A9=07=00= =00=00=00/=FE=FE=B4=B4=A9=A9=07=00=00=00=000=92=92II=00=00=07=00=00=00=00= 1$$II=00=00=07=00=00=00=002$$IIUU=07=00=00=00=003=DB=DB=91=91UU=07=00=00=00= =004=DA=DA=FE=FE=A9=A9=07=00=00=00=005=92=92=DB=DB=A9=A9=07=00=00=00=006=B6= =B6mm=AB=AB=07=00=00=00=007=92=92=92=92=00=00=07=00=00=00=008II=00=00=00=00= =07=00=00=00=009$$=00=00=00=00=07=00=00=00=00:IIII=AA=AA=07=00=00=00=00;=91= =91II=AA=AA=07=00=00=00=00<$$$$UU=07=00=00=00=00=3Dmm=92=92=00=00=07=00=00= =00=00>IInn=AA=AA=07=00=00=00=00?JJmm=00=00=07=00=00=00=00@=92=92=B6=B6UU= =07=00=00=00=00A=B6=B6jj=00=00=07=00=00=00=00B=FE=FE=B4=B4TT=07=00=00=00=00= C=B6=B6=91=91=00=00=07=00=00=00=00D=B3=B3=91=91=FE=FE=07=00=00=00=00E=D9=D9= =91=91=FE=FE=07=00=00=00=00FllII=AA=AA=07=00=00=00=00G=FE=FE=B5=B5=FE=FE=07= =00=00=00=00H=DB=DB=DB=DBUU=07=00=00=00=00I=91=91=DB=DB=FE=FE=07=00=00=00= =00J##=00=00UU=07=00=00=00=00K=DB=DBkkUU=07=00=00=00=00L=92=92""=00=00=07= =00=00=00=00M=FE=FE=D9=D9TT=07=00=00=00=00N=DB=DB=B2=B2=00=00=07=00=00=00= =00O=91=91=91=91=FE=FE=07=00=00=00=00P=B6=B6=B6=B6=00=00=07=00=00=00=00QH= H=00=00UU=07=00=00=00=00R=DB=DB=92=92=00=00=07=00=00=00=00S=DB=DBii=00=00= =07=00=00=00=00T=FE=FE=91=91=AA=AA=07=00=00=00=00U=B6=B6IIUU=07=00=00=00=00= V=FE=FE=D7=D7=00=00=07=00=00=00=00W=B6=B6HH=00=00=07=00=00=00=00X=00=00$$= =00=00=07=00=00=00=00Y=B7=B7=DB=DBUU=07=00=00=00=00Zmm=00=00=00=00=07=00=00= =00=00[=00=00$$UU=07=00=00=00=00\=00=00=00=00UU=07=00=00=00=00]=92=92##UU= =07=00=00=00=00^=FE=FE=91=91=FE=FE=07=00=00=00=00_mm=B6=B6=A9=A9=07=00=00= =00=00`=DB=DBmm=AB=AB=07=00=00=00=00a=B6=B6II=AB=AB=07=00=00=00=00b=94=94= =B6=B6=00=00=07=00=00=00=00c=00=00II=00=00=07=00=00=00=00d=FE=FE=8F=8FTT=07= =00=00=00=00eII=92=92=00=00=07=00=00=00=00f=B6=B6=DB=DB=00=00=07=00=00=00= =00g=FE=FEll=AB=AB=07=00=00=00=00hII=92=92SS=07=00=00=00=00i=B6=B6!!=00=00= =07=00=00=00=00j=92=92=00=00=00=00=07=00=00=00=00k=DB=DBIIUU=07=00=00=00=00= l=B6=B6=FE=FE=A9=A9=07=00=00=00=00m=DB=DBHH=00=00=07=00=00=00=00n=FE=FE=8F= =8F=00=00=07=00=00=00=00o=00=00=FF=FF=00=00=07=00=00=00=00p=A8=A8=A8=A8=A8= =A8=07=00=00=00=00q=FF=FF=00=00=00=00=07=00=00=00=00r=D3=D3=D3=D3=D3=D3=07= =00=00=00=00s=00=00=E6=E6=19=19=07=00=00=00=00t=00=00=7F=7F=7F=7F=07=00=00= =00=00u=00=00=BF=BF??=07=00=00=00=00v``````=07=00=00=00=00w=FF=FF=C0=C0=CB= =CB=07=00=00=00=00x=E6=E6=AD=AD=D1=D1=07=00=00=00=00y=7F=7F``=E5=E5=07=00= =00=00=00z=00=00=00=00=80=80=07=00=00=00=00{=F5=F5=DE=DE=B3=B3=07=00=00=00= =00|=DD=DD=C8=C8=AE=AE=07=00=00=00=00}zzoo=9A=9A=07=00=00=00=00~=B8=B8=A7= =A7=A6=A6=07=00=00=00=00=7F=98=98=FB=FB=98=98=07=00=00=00=00=80=00=00=B9=B9= =00=00=07=00=00=00=00=81=89=89=E2=E2=A2=A2=07=00=00=00=00=82LL}}=C8=C8=07= =00=00=00=00=83rr=BC=BC=B0=B0=07=00=00=00=00=84LL}}LL=07=00=00=00=00=85=89= =89=E2=E2=89=89=07=00=00=00=00=86rr=BC=BCrr=07=00=00=00=00=87=89=89=E2=E2= =98=98=07=00=00=00=00=88rr=BC=BC=98=98=07=00=00=00=00=89=89=89=E2=E2=96=96= =07=00=00=00=00=8ALL}}=8B=8B=07=00=00=00=00=8Brr=BC=BC=92=92=07=00=00=00=00= =8C=00=00=00=00=F7=F7=07=00=00=00=00=8D=BF=BF=BF=BF=BF=BF=07=00=00=00=00=8E= =BF=BF=90=90=D8=D8=07=00=00=00=00=8F??????=07=00=00=00=00=90=7F=7F=7F=7F=7F= =7F=07=00=00=00=00=91rr=BC=BC=81=81=07=00=00=00=00=92LL}}=CC=CC=07=00=00=00= =00=93rr=BC=BC=B2=B2=07=00=00=00=00=94=F7=F7=E8=E8=00=00=07=00=00=00=00=95= =89=89=E2=E2=99=99=07=00=00=00=00=96LL}}=9C=9C=07=00=00=00=00=97rr=BC=BC=9A= =9A=07=00=00=00=00=98LL}}=8C=8C=07=00=00=00=00=99=00=00=00=00=81=81=07=00= =00=00=00=9A=F7=F7=EB=EB=00=00=07=00=00=00=00=9B=89=89=E2=E2=8B=8B=07=00=00= =00=00=9CLL}}WW=07=00=00=00=00=9Drr=BC=BCww=07=00=00=00=00=9Err=BC=BC=B1=B1= =07=00=00=00=00=9FLL}}XX=07=00=00=00=00=A0rr=BC=BCxx=07=00=00=00=00=A1=DC= =DC=FE=FE=00=00=07=00=00=00=00=A2=DB=DB=DB=DB=00=00=07=00=00=00=00=A3=DC=DC= =FE=FETT=07=00=00=00=00=A4=FE=FEHHTT=07=00=00=00=00=A5=FE=FE##VV=07=00=00= =00=00=A6=DB=DB$$WW=07=00=00=00=00=A7=B6=B6=00=00WW=07=00=00=00=00=A8=92=92= =00=00UU=07=00=00=00=00=A9=FE=FEGG=00=00=07=00=00=00=00=AA=FE=FE!!=00=00=07= =00=00=00=00=AB=DB=DB =00=00=07=00=00=00=00=AC=B6=B6=00=00=00=00=07=00=00= =00=00=AD=DB=DB=00=00=00=00=07=00=00=00=00=AE=DB=DBII=AA=AA=07=00=00=00=00= =AF=FE=FEkkTT=07=00=00=00=00=B0=B6=B6$$WW=07=00=00=00=00=B1=FE=FEii=00=00= =07=00=00=00=00=B2mm=00=00UU=07=00=00=00=00=B3=FE=FE##=AA=AA=07=00=00=00=00= =B4=FE=FEHH=A9=A9=07=00=00=00=00=B5$$mm=00=00=07=00=00=00=00=B6$$mmTT=07=00= =00=00=00=B7=00=00IIUU=07=00=00=00=00=B8=DB=DB=00=00WW=07=00=00=00=00=B9=00= =00=00=00=00=00=07=00=00=00=00=BA=00=00=00=00=00=00=07=00=00=00=00=BB=00=00= =00=00=00=00=07=00=00=00=00=BC=00=00=00=00=00=00=07=00=00=00=00=BD=00=00=00= =00=00=00=07=00=00=00=00=BE=00=00=00=00=00=00=07=00=00=00=00=BF=00=00=00=00= =00=00=07=00=00=00=00=C0=00=00=00=00=00=00=07=00=00=00=00=C1=00=00=00=00=00= =00=07=00=00=00=00=C2=00=00=00=00=00=00=07=00=00=00=00=C3=00=00=00=00=00=00= =07=00=00=00=00=C4=00=00=00=00=00=00=07=00=00=00=00=C5=00=00=00=00=00=00=07= =00=00=00=00=C6=00=00=00=00=00=00=07=00=00=00=00=C7=00=00=00=00=00=00=07=00= =00=00=00=C8=00=00=00=00=00=00=07=00=00=00=00=C9=00=00=00=00=00=00=07=00=00= =00=00=CA=00=00=00=00=00=00=07=00=00=00=00=CB=00=00=00=00=00=00=07=00=00=00= =00=CC=00=00=00=00=00=00=07=00=00=00=00=CD=00=00=00=00=00=00=07=00=00=00=00= =CE=00=00=00=00=00=00=07=00=00=00=00=CF=00=00=00=00=00=00=07=00=00=00=00=D0= =00=00=00=00=00=00=07=00=00=00=00=D1=00=00=00=00=00=00=07=00=00=00=00=D2=00= =00=00=00=00=00=07=00=00=00=00=D3=00=00=00=00=00=00=07=00=00=00=00=D4=00=00= =00=00=00=00=07=00=00=00=00=D5=00=00=00=00=00=00=07=00=00=00=00=D6=00=00=00= =00=00=00=07=00=00=00=00=D7=00=00=00=00=00=00=07=00=00=00=00=D8=00=00=00=00= =00=00=07=00=00=00=00=D9=00=00=00=00=00=00=07=00=00=00=00=DA=00=00=00=00=00= =00=07=00=00=00=00=DB=00=00=00=00=00=00=07=00=00=00=00=DC=00=00=00=00=00=00= =07=00=00=00=00=DD=00=00=00=00=00=00=07=00=00=00=00=DE=00=00=00=00=00=00=07= =00=00=00=00=DF=00=00=00=00=00=00=07=00=00=00=00=E0=00=00=00=00=00=00=07=00= =00=00=00=E1=00=00=00=00=00=00=07=00=00=00=00=E2=00=00=00=00=00=00=07=00=00= =00=00=E3=00=00=00=00=00=00=07=00=00=00=00=E4=00=00=00=00=00=00=07=00=00=00= =00=E5=00=00=00=00=00=00=07=00=00=00=00=E6=00=00=00=00=00=00=07=00=00=00=00= =E7=00=00=00=00=00=00=07=00=00=00=00=E8=00=00=00=00=00=00=07=00=00=00=00=E9= =00=00=00=00=00=00=07=00=00=00=00=EA=00=00=00=00=00=00=07=00=00=00=00=EB=00= =00=00=00=00=00=07=00=00=00=00=EC=00=00=00=00=00=00=07=00=00=00=00=ED=00=00= =00=00=00=00=07=00=00=00=00=EE=00=00=00=00=00=00=07=00=00=00=00=EF=00=00=00= =00=00=00=07=00=00=00=00=F0=00=00=00=00=00=00=07=00=00=00=00=F1=00=00=00=00= =00=00=07=00=00=00=00=F2=00=00=00=00=00=00=07=00=00=00=00=F3=00=00=00=00=00= =00=07=00=00=00=00=F4=00=00=00=00=00=00=07=00=00=00=00=F5=00=00=00=00=00=00= =07=00=00=00=00=F6=00=00=00=00=00=00=07=00=00=00=00=F7=00=00=00=00=00=00=07= =00=00=00=00=F8=00=00=00=00=00=00=07=00=00=00=00=F9=00=00=00=00=00=00=07=00= =00=00=00=FA=00=00=00=00=00=00=07=00=00=00=00=FB=00=00=00=00=00=00=07=00=00= =00=00=FC=00=00=00=00=00=00=07=00=00=00=00=FD=00=00=00=00=00=00=07=00=00=00= =00=FE=00=00=00=00=00=00=07=00=00=00=00=FF=00=00=00=00=00=00=07=00=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01{{{=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01{{{=01=01=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=01=01{{{=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01= =01{{{=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01{{{=01=01=00= =00=00=01=01=01=01=01=01=01=01=01=01=01=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00= =01=01=01=01=01=01=01=01=01=01=01=00=00=00=01=017=1Dd=01=01=00=00=00=01=00= =00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00= =00=00=01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00= =01=00=00=01=00=00=01=00=00=00=01=01 =00 =01=01=00=00=00=01=00=01=01=00=00= =00=00=01=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=00=00= =00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01= =00=00=01=00=00=00=01=01=00=00=00=01=01=00=00=00=01=00=00=01=01=00=00=01=00= =00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=00=00=01= =00=00=00=01=01=FF=01=01=01=01=00=00=00=01=00=00=00=01=01=00=01=00=00=01=00= =00=00=00=00=00=00=00=01=01=00=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00= =00=01=01=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00=01=01=01=00=00=00= =01=01=01=00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=01=01=01=00=00=01=00= =01=01=00=00=00=01=01=01=01=00=00=00=00=00=00=00=01=00=00=00=00=00=00=01=01= =01=00=00=01=01=00=01=00=00=01=01=01=01=00=00=00=01=01=01=00=00=00=01=01=01= =00=00=00=01=01=00=00=00=01=00=01=01=00=00=00=01=01=01=00=00=00=00=00=00=00= =00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=00=00=00=00=00=00=00=01=01=01=01=01=00=00=01=00=00=01=00=00=00= =01=016=E8T=01=01=00=00=00=01=00=00=00=01=00=00=00=00=00=01=00=00=00=00=00= =00=00=00=01=00=01=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00= =01=00=00=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01= =00=01=01=01=01=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=01=00=00=01=00= =01=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=01= =00=01=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=00= =01=00=00=00=01=01=00=00=01=00=01=00=00=00=01=00=00=00=00=00=00=00=00=00=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=00= =00=00=00=00=00=00=00=01=00=00=00=00=00=00=01=00=00=01=00=00=00=01=01=00=00= -=01=01=00=00=00=01=00=00=01=00=01=01=00=00=00=01=00=00=00=00=00=00=00=00= =01=00=01=00=01=00=01=01=01=01=01=00=00=01=01=00=00=00=00=01=01=00=00=00=00= =01=01=01=01=00=01=00=00=00=01=00=01=01=01=01=01=00=00=01=01=00=00=00=00=00= =00=00=00=00=00=01=01=00=00=00=01=01=01=01=01=00=01=00=00=00=01=00=01=00=00= =00=01=00=00=00=00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=01=00=01=00= =01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=01=01=00=00=00=00=00=01=00=00= =00=01=00=00=00=01=00=01=00=00=00=01=00=00=00=00=00=00=00=00=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=00=00=00= =00=00=00=00=01=00=00=00=00=00=00=01=00=00=01=00=00=00=01=01=02=A4=1C=01=01= =00=00=00=01=00=00=01=00=00=01=01=00=00=01=00=00=00=00=00=00=00=00=01=00=01= =00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=00=00=01=00=00=01=00=00=00= =01=00=01=00=00=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00= =00=00=00=00=01=00=00=01=00=00=00=00=00=01=00=00=00=01=00=01=00=00=00=01=00= =00=00=00=00=00=00=01=00=00=00=00=00=01=00=00=00=01=00=01=00=01=00=01=00=01= =00=00=00=01=00=01=00=00=00=01=00=00=00=00=01=00=00=00=00=01=00=00=00=01=00= =00=00=01=00=01=00=00=00=01=00=00=00=00=00=00=00=00=00=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00= =00=01=01=01=01=01=01=01=01=00=00=01=00=00=00=01=01{{{=01=01=00=00=00=01=00= =01=00=00=00=00=01=01=00=01=00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00= =00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=01=01= =01=01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=00=00=00=00=00=01=00=00=00= =01=00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=00=00=01=00=00=00=00=00=00= =00=01=00=00=00=01=00=01=00=00=00=01=00=01=00=01=00=01=00=01=01=01=01=00=00= =01=00=00=00=01=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00=00=01=00=00= =01=01=01=01=00=00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=01=00=00=00= =00=00=00=00=00=00=01=00=00=00=01=01{{{=01=01=00=00=00=01=00=00=00=00=00=00= =00=00=00=01=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=01=01=01=00=00=00= =01=01=01=00=00=00=01=01=01=00=00=00=01=01=01=01=00=00=00=00=00=01=00=00=01= =01=01=00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=01=01= =01=00=00=01=00=00=00=01=00=00=01=01=01=01=00=00=00=00=00=00=00=00=01=01=01= =00=00=00=01=01=01=00=00=01=00=00=00=01=00=01=00=00=00=00=00=00=01=01=01=00= =00=00=01=01=01=00=00=00=01=01=01=00=00=01=00=00=00=01=00=00=00=00=00=01=00= =00=00=00=00=00=00=00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=00= =00=01=00=00=00=01=01{{{=01=01=00=00=00=01=01=01=01=01=01=01=01=01=01=01=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=00=00=00=01=00=00=00=00=00=00= =00=00=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=00=00=00=00=00=00=00=01=01=01=01=01=01=01=01=01=01=01=00=00=00= =01=01{{{=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=01=01=01=00=00=00=00=00=00=00=00=00=00=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00= =01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01= =00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=01=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=01{{{=01=01= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=01=017=1Dd=01=01=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=01=01 =00 =01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=00=00=00=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=FF=01=01=01=01||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||z|= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||=01=016=E8T=01=01|||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||}z|||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}=01=01=00= =00-=01=01||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}z||~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~}}=01=01=02=A4=1C=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~~~~~~~~~= ~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}|~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01{{{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~zzz{zzz= z{zz{zzzzzzzz{~~~zzzz{zzzz{~~~~~~~~~~~~~~~~~~~~~~~~~zzz{z{~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~{zz{{zz{{z{{zz{zz{zz{~~~{zz{{zz{{{~~~~~~~~~~~~~~~~~~~~~~~= ~zz{{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~~~~~~~~~~~~~= ~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~zz{~zz{~z{~{{{zz{zz{~~~~zz{zz{{~~= ~~~~~~~~~~~~~~~~~~~~~~~zz{{~{z{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{= {{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~zzz{{z{zz{= zzz{zz{zz{~~~~zz{z{{~~~~zzzz{~~zzzz{zzzzz{~~~~zz{~~~{{~zzzz{zzzzz{~zz{~zz= {~~~~~~~~~~~~~}}=01=017=1Dd=01=01||~}}}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z|= |~~~~~~~~~~~~~~{zz{zz{z{{{zz{zz{zz{~~~~zzzz{~~~~zz{{zz{zz{{zz{zz{zz{~~~zz= {~~~~~zz{{zz{zz{zz{zz{~z{{~~~~~~~~~~~~~}}=01=01 =00 =01=01||~}}}}}}}}}}}}= }}}}}}}|~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~zz{zz{z{~~zz{zz{zz{~~~~zz{zz{~~~= zzzzzz{zzzzzz{zz{zz{~~~zz{~~~~~zz{~zz{zz{zz{zz{~z{~~~~~~~~~~~~~~}}=01=01=00= =00=00=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~zzz{z= zz{~~zz{zz{zz{~~~~zz{{zz{~~zz{{{{{zz{{{{{zz{zz{~~~zz{~~~~~zz{~zz{zz{zz{{z= z{z{~~~~~~~~~~~~~~}}=01=01=FF=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}z||~~~~~~~~~~~~~~~{zz{{z{{~~zz{zz{zz{~~~~zz{~{zz{~zzz{~z{zzz{~z{zz{= zz{~~~{zz{~~z{zz{~zz{zz{zz{~zzz{{~~~~~~~~~~~~~~}}=01=016=E8T=01=01||~}}~~= ~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~z{{~z{~~zzzzzzzzzz{~~zz= zz{zzzz{{zzzz{{{zzzz{{zzzz{{~~~~{zzzz{{{zzzz{{zzzz{{~{zz{~~~~~~~~~~~~~~~}= }=01=01=00=00-=01=01||~}}~~~~~vvvvvv~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{= {zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{{{{= {{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{zzz{{{zzz{{{{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{{{zzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~= ~~~~{{~~{{~~{{{{{{{{{{{~~{{{{{{{{{{~{{{{{~~{{{{{~zz{{{~~~~~~{{{{{~~{{{{{~= zz{{{~~~z{{~~~~~~~~~~~~~~~}}=01=01=02=A4=1C=01=01||~}}|||||vvvvv||||||||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{zz{{{{{zz{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{= {{z{{z{{{{{z{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~zz{~~~~~~~~~~~~~~~~~~~~~zz{~~~zzz{~~~~~~~~~~~~~~~~}}=01=01{{{=01=01|= |~}}|||||vv||||||||}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{zz{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{zz{{{{{{{z{{{{{{{{{{z{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{z= {{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~zzzz{~~~~~~~~~~~~~~~~~~~zzzz{~~zz{{~~~~~~~~~~~= ~~~~~}}=01=01{{{=01=01||~}}||~~~v|||||~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{zz{{{{{zzzz{{{z{{{{{zzz{zzz{{zzz{{{zzz{{zzzz{{zzz{{{z{{{zz{z{{z{{{z= zz{{zzzz{z{{{{{{zzzz{{{zzz{{{{{{zz{zz{zz{{{{{{{z{{{{zz{{z{{zz{{zz{zzzz{{z= zz{{{z{{zz{{{zzz{{{{{{zz{{{{{{{zzz{{zzzz{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{{{{{}}}}}}}}}}}}}}}}}}= }{{{{{}}{{{}}}}}}}}}}}}}}}}}}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{zz{{z{{{{{{z{{{z{{z{{z{{zz{{z{{z{{= {zz{zz{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{{{zz{z{{{zz{zz{{{{{{z{{zz{zz{{{{{z{{{= {{{z{z{{{{z{{{z{{z{{{zz{{z{{z{{z{{{zz{{z{{{{{{zzz{{{{zz{{z{{z{{{zz{zz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{||~}}z|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01{{{=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{zz{{{{{{{{{= z{{{z{{zz{{{{{{{zz{{z{{{z{{{z{z{{z{{{z{{{z{{zzzzz{{z{{{z{{{{{z{{{z{{z{{{z= {{{{{{z{{z{{{z{{{{{z{{{{{{{z{{{{{z{{{z{{z{{{{{{zz{{zzz{{{{{{{zz{{{{{{{{zz= {{{{{{zz{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z|||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zz{{{{zz{{zz{{{{{{{{{{z{z{{{{zz{{{{zz{z{{z{{{z{{{z{z{{z{{{z{{{z{{z{{{{{= {z{{{z{{{{{zz{{z{{z{{{z{{{{{{z{{z{{{z{{{{{z{{{{{{{z{{{{{z{{{z{{z{{{{zz{z{= {z{z{{{{{zz{z{{{{{{{{{{z{{{zz{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||}=01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{zz{{{{{{{{{{z{z{{{{{zz{{z{{{z{{z{{{z= {{{z{z{{z{{zz{{z{{{z{{{{{{z{{{z{{{{{{zzz{{{z{{{z{{{{{{z{{z{{{z{{{{{z{{{{{= {{z{{{{{z{{{z{{z{{{z{{{z{{z{{z{{{z{{{z{{{{{z{{{{z{{z{{{z{{z{{{z{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01 =00 =01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{zz{{zz{{z{{{{{{= {{z{{{{z{{z{{zz{{z{{z{{{zz{zz{zz{{zz{zzz{{{{zz{{{z{z{{{z{{z{{{z{{{{{zz{zz= {{z{{{z{{zz{zz{{{{{z{{{{{{{z{{{{{zz{zz{{z{{{zz{{z{{z{{zz{{zz{{z{{{{{zz{{z= z{{zz{{z{{z{{{zz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{zzzz{{{{zzzz{{{z{{{{{{{zz{{{{zzz{{{{zzz{z{{zz{{zzz{{{z{{{{{{{{{{{{= {zzzz{{{zzzzz{z{{{zzzz{{{zzz{{{z{{{z{{z{zz{{{{{{{z{{{{{zzz{{{{{zz{zz{{zz{= {zzz{zzzz{{zz{{zzz{z{{{{z{zzz{{{{zzz{z{{zz{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~~~~}= }||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{zz{{{{zz{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{z{{z{{{{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{zzzz{zz{zzzzzzzz{~~~= ~~zzz{zzzz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=016=E8T=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{{{{{{{{{{{{zz{{= zz{{{{{{{{{{z{z{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~{= zz{{zz{{z{{zz{zz{zz{~~~~zz{{zz{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{zz{{zzz{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~zz{~z{~{{{zz{zz{~~~zz{{~{z{zz{~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=02=A4=1C=01=01||~}}||~~~~~~~= ~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{{z{zz{zzz{zz{= zz{~~~zz{~~~{{zz{~zzzz{~~zzzz{zz{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01= {{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~{zz{zz{z{{{zz{zz{zz{~~~zz{~~~~~zz{zz{{zz{zz{{zz{zz{z{~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{zz{z{~~zz{zz{zz{~~~zz{~~~~~zz{zzzzzz{{{z= zzz{zz{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{zzz{~~zz{zz{zz{~= ~~zz{~~~~~zz{zz{{{{{zz{{zz{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~{zz{{z{{~~zz{zz{zz{~~~{zz{~~z{zz{zzz{~z{zz{~zz{zz{~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{zzz{z{{{{zzzz{{{{{{{{{{= {{{zzz{{{{zzzz{{{zzz{{{{zzz{{{{{{{{{{{{{{zzz{{zzzzz{{{zzz{{{zzzzzz{{{zzz{= {{{{zzzz{z{{{{{{{{{zzzzzz{{{{{{{{z{{{{{{{{zzzz{{{{{z{zzzzzz{{{{{{zzzz{z{{= {zzz{{zzzz{{{{{{{{{{{{{{{zzzz{z{{{{{{{{{zz{{{{{{{zzz{zzz{{zzz{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~z{{~z{~~zzzzzzzzzz{~~~{zzzz{zzzz{zzzz{{{zzz{zzzz= z{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{= {zz{{zz{{{zz{{zz{{{{{{{{{{{zz{zz{{zz{{zz{zz{zz{{zz{zz{{{{{{{{{{{{{{z{{{{z= {{zz{z{{{z{{{z{{{zz{z{{{z{{{zz{{{zz{{{{{{{{{{{z{{zz{{{{{{{z{{{{{{{zz{{zz{= {{{z{{{z{{zz{{{{zz{{{zz{{{{z{{zz{{zz{{{{{{{{z{{{{zz{{{zz{{{{{{{{{{z{{{{{{= {{z{{{z{{z{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{~~{{~~{{{{{{{{{{{~~~~= {{{{{{{{{{{{{{{~~{{{{{{{{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01 =00 =01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{z{{{z{{{z{{{{z{{{z{{{{z{{{{{{{{{{{z{{{z{{z{{{{z{z{{{z{{= z{{{z{{{{{{{{{{{{{{z{{{{z{{{z{z{{{z{{{z{{{{z{z{{{z{{{z{{{{{z{{{{{{{{{{{z{= {{z{{{{{{z{z{{{{{{z{{{{z{{{{{{{{z{{{z{{{{z{{{{{z{{{{z{{z{{{{z{{{{{{{{z{{{= {z{{{{{z{{{{{{{{{{z{{{{{{{{z{{z{{{z{{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{zz{{{{{{z{{{{{{z{{= {{{{{{{{{{{{z{{z{{{{z{{{{{z{{{{{{z{{{{{{{{{{{{{{z{{{{z{{{z{{{{{z{{{z{{{zz= {{{{{z{{z{{{{{{z{{zzz{zzz{{z{{{z{{{{{{z{z{{{{{z{{{{{{z{{zz{{{z{{{z{{{z{{{= {{{z{{{{z{{z{{{{z{{{zzz{zzzz{z{{{{{{z{{zzz{zzz{z{zz{{{{{z{z{{{{{{{{z{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=01=01=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{{z{{{{zzz{{{{z{{{{{{z{{{{{{{{{{{{{zz{{z{{{{z{{{{zz{{{{{zz{{{{{{{{{{= {{{{z{{{{z{{zz{{{{z{{{{zzzzz{{{{{z{{{z{{{{{{{{{{z{{{z{{{z{{zz{{{{{z{{{z{{= {{z{{{{{{z{{{z{{{z{{zz{{{z{{{{{{{{{{{z{{z{{{{z{{z{{z{{z{{{z{{{{{{{{{{z{{{= z{{zz{zz{{{{zz{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{||~}}z||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01= 6=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zzzzzzz{{{z{{{{{z{{{{{{zz{{{z{{{{{{z{{{{{{{{{{{{{z{{{z{{{{z= {{{{z{{{{{{z{{{{{{{{{{{{{{{z{{{{zzzz{{{{z{{{{{z{{{zz{{{z{{{{z{{{{zzzz{{z{= {{z{{{zzzz{{{{{{z{{{z{{{{z{{{{{{z{{{z{{{zzzz{{{{z{{{{zzzz{{{z{{z{{{{z{{zz= {{{{z{{{z{{{{zzzz{{z{{{z{{z{{{z{{{{z{z{{{{{{z{{{zzzzzzz{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z|}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{z{{z{{{= {{{z{{zzzzzzz{{{z{{{{z{{{{z{{{z{{{{{{z{{{{{zzzzzzz{{{{z{{{{z{{{{{{{z{{{{{= z{{{{z{{{z{{{{z{{{{{{z{{{{z{z{{{{z{{z{{{{{{zzzzz{{{{z{{{{{{z{{{z{{{z{{z{{= {{z{{{{{{z{{{{z{{z{{{{z{{{zz{{{z{{{z{{{{{{z{{{{z{z{{{z{{{z{{{{z{{z{{{{{z{= {{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}z|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||=01=01=02=A4=1C=01=01||~}}|= |~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz= zzzz{{{{{{{{{z{{{z{{{{z{{{z{{{{z{{{{{{{{{{{{z{{{{{z{{{{z{{z{{{{{{z{{{{{{{= {{{{{{{{{{z{{{{z{{{{{{{{{{{{{z{{{{z{{{{{{{{zz{{{{{z{{{{z{z{{{{z{{{z{{{{z{= {{{{z{{{{z{{{{z{{{{z{{{z{{{z{{{zz{{{{{z{{{{z{{z{{{{z{{{{zz{{z{{{zz{{{{{z{= {{{z{z{{{z{{{z{{{{z{{{z{{{{{{{{zzzzzzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{zz{{zz{{{zz{{zz{{{{{{{{{{{zz{{{z{= zz{{zz{zz{{{z{zz{{{z{{{{{{{{{{{z{z{{{{z{{{{{{{z{{{{{z{{{zz{{{z{{{{{zz{{{z= z{{{{{z{{{{{z{{{zz{{{z{{{{{z{{{{zz{{zz{{{{z{{{z{{{zz{{{zz{{{zz{{{{z{{zz{{= zz{{z{{z{{z{{{{zz{{{zz{{{{{z{{{{z{{{z{{{{z{{{{z{{{z{{{{{{{{{{{{{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{zzz{{z{zzz{{{{{= zzzz{{{{{{{{{{{{zzzzzz{{zzzz{{zzzzzz{zzzzzz{{{{{{{{{{{zz{{{{zzz{{{{{{z{{{= {zzzzzz{{{{z{{{{{{zzzzz{{{{{zz{{{zzzz{{{zz{zzz{{{zzz{{{{zzzz{{{{{z{zzzz{{= {zz{{{zzzzz{{{{zzz{{zzzz{{{zzz{{{{zz{{{zzzzz{{{{{zz{{{zzz{zzz{{zzz{{zzz{{= z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~zzz{zzzz{zz{zzzzzzzz{~~~zzzz{zzzz{zz{~~zzz{~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zz{{zz{{z{{zz{zz{zz{~~~{zz{{{zz{{zz{~~{= zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=017=1Dd=01=01||~}}||~~~~~~= ~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~zz{~z{~{{{= zz{zz{~~~~zz{~~zz{~{{{~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01= =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~zzz{{z{zz{zzz{zz{zz{~~~~zz{~~zz{zzz{~zzzz{~zzzz{~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~}}=01=01=00=00=00=01=01||~}}||}}}}}}}}}}}}}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zz{zz{z{{{zz{zz{zz{~~~~zzzzzzz{{z= z{zz{zz{zz{{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=01=01=01=01||~}= }|}}}}}}}}}}}}}}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{z= z{z{~~zz{zz{zz{~~~~zz{{{zz{~zz{zz{zz{zzzzzz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~}}=01=016=E8T=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~zzz{zzz{~~zz{zz{zz{~~~~zz{~~zz{~zz{zz{zz{zz{{{{{~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00-=01=01||~}}~~~~~~~~~~~~~~~~||~~= }}{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{z{{{{{{{{zzz{{{{{{zz{{{{{{{{{{{{{{{{{{= {{{{{{{{{zzzzzz{{{{{{{{{{{{{{{{{{zzz{{{{{zzz{{zzz{{zzz{{{{{zzz{{zzzzzzz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{z{{{{{{{{{{{zzz{{{= zzz{zzz{{zzz{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zz{{z{{~~zz{zz{zz{~~~~zz= {~~zz{~zz{zz{zz{zzz{~z{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=02=A4=1C=01= =01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{{{{{{{= zz{{{{{{zz{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{zz{{{{{{{{{{{{{{{{{{zz{{{{{zz{{= {{z{{{{zz{{{{{zz{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{{{z{{{{{{{{{{{{z{{{{{z{{{z{{{{zz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~z{{~z{~~zzzzzzzzzz{~~zzzz{zzzzzzzz{zz{zz{zzzz{{~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{= {{{{{{{zz{{{{z{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{z{{{z{{{{{{= {{{{{{{{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{z{{{{z{z{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~{{~~{{~~{{{{{{{{{{{~~{{{{{{{{{{{{{{{{{{{{{{{{{= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~= ~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{zzz{zzz{{zzzzz{{zzz{{{zzz{{{{zzz{{zz= zz{{z{{{{{{{z{{{z{{{{zzz{{{z{{{{{{{z{z{{{z{z{{{{z{{{{z{z{{{z{z{{{{z{{{z{{= {{{{{zzz{{zzz{zzz{{zzz{{zz{zz{zzz{{zz{zz{{{z{{{zzz{{{{{zz{zz{zz{{{{{{{z{{= {z{{{{z{{{{z{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01|= |~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{{zz{{zz{{zz{{= zz{{zz{{z{{zz{{z{{zz{{zz{{{z{{{{{{{z{{zz{{{z{{{z{{z{{{{{{{z{zz{zz{z{{{{z{= {{{z{zz{zz{z{{{{zzzzz{{{{{{z{{{z{{z{{{z{{zz{{z{{zz{zzz{zz{{zz{zz{{z{{z{{{= z{{{{{z{{zz{zz{{{{{{z{{{z{{{{z{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{zzz{{zz{{zz{{zz{{zz{{zz{zz{{zz{zz{{zz{{zz{{{{{{{{{{{zzzz{{{{zzzzz{{= {{{{{{{{z{{z{z{{z{{{{z{{{{z{{z{z{{z{{{{z{{{z{{{{{{zzzzz{{{zzz{{{{{{zz{{z{= {{z{{{z{{z{{{z{{z{{zzzzz{{{{{z{{z{{{z{{{{{{zz{zz{{{{z{{{{z{{zz{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{zz{{zz{{zz{{zz{{zz{zzzzzz{zz{{{{{{zz{{{= {{{{{{{{z{{z{{{{z{{{{{{{{{{{{{{z{{z{z{{z{{{{z{{{{z{{z{z{{z{{{{z{{{{{{{{{{= z{{{{{{{{z{{{{{zz{z{{z{{{z{{{z{{z{{{z{{z{{z{{{{{{{{{z{{z{{{z{{{{{{{z{z{{{= {{z{{{{z{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{||~}}z|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=017=1Dd=01=01||~= }}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{zz{zz{{zz{{zz{{zz= {{zz{zz{{{{{zz{{{{{{zz{z{{{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{z{{{z{{{z{{{{z{{{= {z{{{z{{{z{{{{z{{{{{{{{{{z{{{{{{{zzz{{{z{{{z{{z{{{z{{{z{{z{{{z{{z{{z{{{{{= {{{{z{{z{{{z{{{{{{{zzz{{{{{z{{{{z{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z|||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||=01=01 =00 =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{= {{{zz{{{zz{zz{{zz{{zz{{zz{{zz{zzz{{z{zzz{{z{{zzz{{z{{{{{{{z{{{zz{{zz{{{z{= z{{{{{{{z{{{z{{{z{{{{z{{{{z{{{z{{{z{{{{z{{{{z{{{{{zz{{{z{z{{{z{{zz{{z{{z{= {{z{{{z{{zz{zz{{z{{zz{{{z{{{{z{{z{{{z{{{{{{{{z{{{{{{z{{{{z{{{{zz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||}=01=01=00=00=00=01=01||~}}~~~~~~~~~~~~~~~~|= |~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzz{{{zzz{zz{z{zzz{{{zz{{zzzz{{{zzzz{{= {{zz{{z{{{{{zzzz{{{zz{{zzzz{{z{{{{{{zzz{{z{{zzz{{zzz{{zzz{{z{{zzz{{zzzzzz= z{{{{{{zzzz{zzz{zzz{{zzz{zzzz{zzz{zzz{z{zz{{zzz{{zzzz{{{{zzzzzz{zzz{{{{{{= {z{{{{{zzz{{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=FF=01=01= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~}}=01=016=E8T=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00-=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{zzzz{zz{~~~~~~~~~= ~~~~~zz{~~~~~~~~zzzzz{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=02= =A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~= ~~~~~~{zz{{zz{{z{{~~~~~~~~~~~~~~zz{~z{~~~~zz{{zz{zz{~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~zz{~z{~~~~~~~~~~~~~~~{z{zz{~~~~zz{~{z{{= {{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}~~~~~~~~~~= ~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{{z{zz{~~zzzz{zzz= zz{~~z{zzzz{~~~zzz{~{zzz{~zzzzzzzzz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{= {{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~= ~~~{zz{zz{z{{~zz{{zz{zz{zz{~{{{zz{{~~~{zzzz{{zz{zz{{z{zz{zz{~~~~~~~~~~~~~= ~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{zz{z{~~zz{~zz{zz{zz{~~~~zz{~~~~~{{zzz{zz{zz= {~z{zz{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{z{{{{zzzz{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzz{zzz{~~zz{~zz{zz{zz{= ~~~~zz{~~~~z{~{zz{zz{zzzz{{zz{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=017=1Dd= =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{zz= {{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~{zz{{z{{~~zz{~zz{zz{zz{~~~~zz{~~~~zz{~zz{zz{{zz{{~zz{zz{~~~~~~~~~~~~~~~= ~~~~~~~~~~~~}}=01=01 =00 =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{zz{{{{{z{{zz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~z{{~z{~~~{zzzz{zzz{zzz{~~~{zz{~~~zzzzz{zzzz{z= zzzzzz{zzz{~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=00=01=01||~}}~~~~~~~~= ~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z{{zz{{{{{z{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{~~{{~~~~{{{{{{= {{{{{{{~~~~{{{~~~{{{{{{{{{{zz{{zz{{{{{{{~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01= =FF=01=01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{= {{{{{{zz{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~zz{~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~}}=01=016=E8T=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= ||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~{zzzz{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00-=01=01||~}}~= ~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{zz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{{{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}=01=01=02=A4=1C=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{zz{{{{{z{{zz{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z|}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{zz{{{zz{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}z|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||||||||||=01=01{{{=01=01||~}= }~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{zzzzz{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~}}~~~= ~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~z= zzzzz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}= =01=017=1Dd=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~{zz{{zz{~~~~~~~~~~~~~~~~~~~~~~z{~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~}}=01=01 =00 =01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~zz{~~~~~~~~~~~~~~~~= ~~~~~zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00=00=01=01||= ~}}||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~zz{~zz{~~zzzz{~~zzzz{~zzzz{zzzz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~}}=01=01=FF=01=01=01=01||~}|||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzzzz{{~zz{{zz{zz{{z{zz{{zz{zz{{~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=016=E8T=01=01||~~~~~~~~~~~~~~~~~~~= ~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{zz{~~zzzzz= z{zzzz{{zzzzzz{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01=00=00-= =01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~zz{{zz{~zz{{{{{{zzzz{zz{{{{{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~}}=01=01=02=A4=1C=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz{~{zz{zzz{~z{z{{zz{zzz{~z{zz= {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~~~~~~~~~~~~~= ~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzzz{zzz= z{zzzz{{zzzz{{{zzzz{{{zz{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{= {{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||~}}z||~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~{{{{{{{{{{{{{{{~{{{{{~~{{{{{~~{{{~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~}}=01=01{{{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||~}}z||~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01=01||~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~}}z||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01=01{{{=01= =01||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}z||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}=01=017=1Dd=01=01|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}z|}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01 =00 =01=01zzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=01=01=00=00= =00=01=01||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||=01=01=FF=01=01=01=01|||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||}=01=016=E8T=01=01||~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}=01= =01=00=00-=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}~}}=01=01=02=A4=1C=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|~}}=01=01{{{=01=01||~||= ||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01{{{=01=01||~|||||||||||||||||||}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~||~~~~= ~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01{{{=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01||~||~~~~~}= }}}}}~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=00=01=01||~||~~~~~}}}}}|~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~||~~~~~}}||||~~~~~}}~~}= }{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01|= |~||~~~~~}|||||~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{zz{{{{{{z{{{= {{{{{{{{{{{{{{z{{{{{{{{{zzz{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{zz{{{{{{{{{{{{zz{{{{{{{{= {{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{zz{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01=00=00-=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{= {{zz{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{z= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{z{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{z{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{z{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~||~~~~~~~~~~~~~= ~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{z{z{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{z{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{{z{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01= =01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{{z{zz{{z{{{{zzz{{{{zzz= {{zzzz{{{{{{{{{{{{{{{{{{{{{{{{zzzz{z{zz{{{{zzz{{zzzz{{{{{{zzz{{{{zzz{zzz{= {zzz{{z{zzzzzz{zzz{{{zz{zz{{zz{{{zzzz{{{zzz{{{{{{z{{{zzz{{{{zzz{{{z{{zz{z= z{zz{zz{{{{zzzz{{{z{{{{{{{{{{z{{{{{zzzz{z{zz{{{{zzz{{zz{{zz{{{zzzz{{z{zz{= {zzzz{{{zzz{zzz{{zzz{{zz{{zz{{{{zz{zz{zzz{{zz{{{zzzz{{z{zz{{zzzz{{{{z{zz{= {{{zzz{{{{{zz{zz{zz{{zzzz{{zzz{{z{zzz{{zzz{{{{zzz{zzzz{{zzz{{{{zzzz{{{{zz= {zz{zz{{{{{{{zzz{{{zzz{{{{zzz{{zz{zz{zz{{{{zzzz{{{{{{zzz{{zz{zz{{{{zzz{{z= zzz{z{zz{{{{zzz{{z{zzz{{{zzz{zzzzz{{{zzz{{zzz{zzz{zzz{{{{{zzz{{zzzz{{{zzz= z{z{zz{{{{zzz{{{{{{{zzz{{{zzz{{zz{zz{zzz{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01{{{=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{= {{z{{z{{z{{{z{{{z{{zz{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{zz{zz{{zz{{z{{z= {{{{{{{z{{z{{{{{z{{{z{{z{{{z{{zz{z{z{{{z{{{{{zz{zz{{z{{zz{{z{{z{{{z{{{{{z= {{zz{zz{{zz{zz{{z{{z{{{z{{zz{zz{{zz{z{{{{z{{{{{{{{{{z{{{{{{z{{{zz{zz{{zz{= zz{{z{{{z{{zz{z{{{zz{zz{{z{{{{{{z{{{z{{zz{zz{{z{{{z{{{{{zz{zzz{zz{{z{{zz{= z{{{zz{zz{{z{{{{{{zz{zz{{z{{{z{{{{{z{{zz{zz{{z{{{z{{{z{{zz{z{z{{{z{{z{{z{= {z{{{z{{{z{{zz{{z{{{{{z{{zz{zz{{{{{z{{z{{z{{{z{{z{{{z{{z{{zz{zz{{zz{z{{{{= {{zz{{z{{zz{zz{{zz{zz{{z{{{zz{zz{{z{{{z{{zz{z{{{{z{{{z{{z{{z{{{z{{z{{{z{{= {z{{{{{zz{zz{{z{{{{{{z{{{zz{zz{{z{{{z{{{{{z{{z{{zz{{z{{zz{zzz{zz{{z{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~||}}}}}}}}}}}}}}}}}}~= ~}}{{{{{{{{{{{{{{{{{{{{{{z{{zz{z{{{zzzzz{{{{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{z{{{z{{{{{zz{{z{{{{{{{zz{{{{{{{z{{{z{{zzzzz{{z{{{{z{{{z{{{{{z{{{z= {{z{{z{{{{{{zzzzz{{{{{z{{z{{{z{{z{{{z{{zzz{{{{z{{z{{{z{{z{{{z{{{z{{{{{{{{= {{z{{{{{{z{{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{z{{{= z{{{{{z{{{z{{{z{{z{{z{{{z{{z{{{z{{z{{{{{{z{{{z{{zzzzz{{{{{z{{z{{{z{{z{{{z= zzzz{{z{{{{zzzzz{{zz{{{{z{{{zzzzz{{z{{{z{{{{{z{{z{{{z{{{{{zz{{{{zzzzz{{zz= zzz{{z{{z{{{z{{z{{{z{{{{{{{{zz{{z{{{z{{z{{{z{{z{{{z{{{z{{zzzzz{{z{{{{{{{z= {{{z{{z{{zzzzz{{z{{{z{{{z{{{{{z{{{z{{z{{{{{{z{{{z{{{z{{zzzzz{{{{{zz{{{{{{= {zz{{z{{{z{{{z{{zzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01|= |~|}}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{z{z{{{z{{{{{{{zz{z{{z= {{{{{{zzzzzzz{{zzzzzzz{{{{{z{{{z{{{z{{{zz{z{{z{{{{{{{{zz{{{{{{{z{z{{{z{{{= {{{z{{{{{z{z{{{{{{z{{{z{{z{{z{{{{{{z{{{{{{{{{z{{z{{{z{{z{{{z{{z{z{{{{z{{z= {{{z{{zz{{z{{{z{{{{{{{{{{z{{{{{{z{{{z{{{z{{z{{{z{{z{{{z{{zz{{z{{z{{{z{{z{= {{{{{{z{z{{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{zz{{z{{z{{{z{{z{{{{{{z{{{z{{z{= {{{{{{{{z{{z{{{z{{z{{{z{{{{{{z{{{{z{{{{{{{zz{{{z{{{z{{{{{{z{{{z{{{{{z{{z{= {{z{{{{{{zz{{{z{{{{{{z{{{{{{z{{z{{{z{{zz{{z{{{{{{zz{z{{z{{{z{{z{{{z{{z{{{= z{{{z{{z{{{{{{z{{{{{{{{z{z{{{z{{z{{{{{{{z{{z{{z{{{{{{z{{{z{{z{{{{{{z{{{z{= {{z{{z{{{{{{{{{{zz{{{{zz{z{{z{{{z{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01{{{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{{z{= {{z{z{{{z{{{{{{z{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{{z{{z{{{{= {{{{{zz{{{{{{z{z{{{z{{{{{{z{{{{{z{z{{{{{{z{{{z{{z{{z{{{{{{z{{{{{{{{{z{{z{= {{z{{z{{{z{{z{{z{{{z{{z{{{z{{{zzz{{{{{{{{{{{{{{{z{{{{{{z{{{z{{{z{{z{{{z{{= z{{{z{{{zzz{{{z{{{z{{z{{{{{{{z{z{{{z{{{z{{z{{{z{{{{{z{{{z{{{z{{z{{{zzz{{{= z{{{z{{z{{{{{{z{{{z{{z{{{{{{{{{z{{z{{{z{{z{{{z{{{{{{z{{{{z{{{{{{{{zz{{z{{= {z{{{{{{z{{{z{{{{{z{{z{{{z{{{{{{{zz{{z{{{{{{z{{{{{{z{{z{{{z{{{zzz{{{{{{z{= {{z{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{{{{z{{{{{{{{z{z{{{z{{z{{{{{{{zzz{zzz{{{= {{{z{{{z{{z{{{{{{z{{{z{{{z{{z{{{{{{{{{{{zz{{z{{{z{{z{{{z{{{z{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~~~~~~~~~~~~~~~~~~~~~~~}= }{{{{{{{{{{{{{{{{{{{{{{z{{{{zz{{{zz{{{z{zz{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{{{z{{{z{{zz{{z{{z{{{{{{{z{{z{{{{{{{z{{{{zz{{{z{z{{{{{{z{{{{{{{z{{{z{{= z{{zz{{{z{zz{{{z{{{{z{{zz{zz{{zz{zz{{z{{zz{{z{{z{{{z{{{z{{{{{{z{{{{{{{{{{= z{{{{{{z{{{z{{{z{{zz{zz{{zz{zz{{{z{{{{{z{{{z{{z{{{{{{{{z{{{{zz{zz{{zz{zz{= {{{{z{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{{{{{z{{zz{{zz{{{z{{{{z{{z{{{z{{z{{{zz{= {{z{z{{{{zz{{{z{z{{z{{z{{{zz{{{z{zz{zz{{{{{z{{z{{{z{{{{{z{{z{{zz{{{z{zz{{= {z{z{{z{{{z{{{z{{{{{{{{zz{{z{{z{{{z{{zz{zz{{z{{{z{{{z{{zz{{{z{z{{{{{{{{{z= {{{{z{{zz{{{z{{{z{{{z{{{{{{{zz{zz{{z{{{{{{z{{{z{{{z{{zz{{{z{{{{z{{z{{zz{{= z{{z{{{z{{{z{{zz{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01|= |~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{zzz{{{{z{{{{zzzz{{{zzz{z{{= zz{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{zzz{{zzz{z{{zz{{{{{zzz{{{{{{{{z{{{{{zzz= z{zzz{{{{zz{{{{{{zzz{zzzzzz{{zzzz{{{zzzz{{{{zzz{{zzz{{{{zzz{{zzz{{zzzzzzz= z{zzz{{zzzz{{{z{{{{{{{{{zzz{{{{{{zzzzz{zzz{{zzz{{{{zz{zz{{zzzz{zzz{zzz{{z= z{{{{{zz{{{{{zzz{{{{zz{zz{{{zzz{zzz{zzzzzz{{zzzz{zzz{zzz{{zz{{{{zzzz{{{{z= zzz{{{{zzzzzz{zzz{{zz{{zzzz{zzz{{{{zzzz{{zzz{{{{zz{{zzzz{{{zzz{z{{{zzzzzz= {zzz{{{{zzz{{{{zzzz{{{zzzz{zzzzzz{zzz{{zzzz{{{{{{zzz{zzzz{zzz{{zzz{{{{zzz= zz{zzz{{zzzz{zzz{{{{{{{{z{{{zzz{{zzzz{{{{z{{{z{{{{{{{{zzz{{zzzz{{{{{zzzzz= {zzz{{zzzz{{{{{zzz{{{{zzz{zzzz{zzz{zzz{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01=00=00=00=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}}}}}}}}}}}}= }}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{z{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8= T=01=01||~}}}}}}}}}}}}}}}}}}}|~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{= {{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}~~~~~= ~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||||||||||= ||||||||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{= {{=01=01||~}}|||||||||||||||}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{zz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{zz{zz{{{{{{{{{{= {{{{{{zz{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{zzz{{{zzzz{{{{zzz{{zzz{zzzzz= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{{{{{{{{{= {{{{{zz{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{z{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{z{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{= {{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{{{{{{{{{{{{{z{{{{{{{{{{{{{z{z{{= {{{{{{{{{z{{z{{{{{{{{{{{{{{{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{= zz{{zz{{{{z{{{{z{{{{z{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{z{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~= ~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{z{{{{z{{{{z{{{{z{{{{z{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{zz{zz{zzz{{{{zzz{{{= {zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{zzz{{{{{{{{{zzz{{{zzz{{{{{{z{zz{{{{zzz{= {z{zzz{{zzz{{{{{zz{{{zzz{{{{{{zzz{{{{{zz{zz{{zz{{{zzzz{zzzzzz{{zz{z{zzz{{= zzz{{{{{{{{zzzzzz{z{zzz{{zzz{zzzz{{{{{zzz{{zzzz{{{{{zzz{{{z{{z{{{{{{{{{zz= z{{zzzz{{{{z{zz{{{{zzz{{zzz{zzz{zzz{{{{{zz{{z{{{z{{{{{{z{{{z{{{{z{{{{z{{{= z{{{{{zz{zz{zzz{{{{zzz{{{{zzz{{{zzz{{{zzz{{{{zzzz{{{zzz{{{{{{z{{{zzz{{{{z= zz{{{z{{zz{{{zzz{{{{zzzz{{{{zzzz{{zzz{{{{{zz{zz{zzz{{{{zzz{{{{{zzz{zzz{zz= z{z{zz{{{{zzz{{zz{zz{{{{{z{zzz{{zzz{{{{zzz{{{{zzzz{zz{zz{zz{{{{zzzz{{{{zz= {zzzz{{{zzz{zzz{zzzzz{zzzz{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{= {{{{{{{{{{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{{zz{{z{{zz{z{{{z{{{z{{z{{z{{{{{{{= {z{{z{{zz{zz{{{{{zz{zz{{z{{{z{{zz{z{z{{{z{{{{{z{{z{{z{{{{{zz{{z{{{{{zz{zz= {{z{{zz{{z{{z{{{z{{{z{{zz{z{z{{{z{{{{{{{{z{{{z{{zz{z{z{{z{{z{{{{{{zz{zz{{= z{{{{{{zz{{z{{z{{z{{{{{{{{zz{zz{{z{{{{{{zz{zz{{zz{zz{{z{{{z{{{z{{{{{{{z{z= {{{{z{{{{{{z{{{z{{{{z{{{{z{{zz{{{{{{zz{zzz{zz{{z{{{z{{z{{z{{z{{z{{zz{{z{{= zz{z{{{z{{{z{{{{{z{{zz{zz{{zz{zz{{z{{z{{{z{{{z{{zz{{z{{{{{z{{{zz{zz{{{{{z= z{zzz{zz{{z{{{z{{{{{z{{{z{{{z{{zz{zz{{z{{{z{{zz{zz{{{{{zz{z{z{{{z{{zz{{z{= {zz{{z{{z{{zz{zz{{zz{z{{{{{{z{{z{{{{{{z{{{z{{{z{{z{{z{{{zz{zz{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{zzzzz{{zz{{{{zz{{{{{{{= zz{{z{{{z{{zzzzz{{zz{{{{{{{{{{zz{{{{z{{{z{{{{{z{{{z{{zzzzz{{z{{{{zzzzz{{{= {{z{{zz{{{{{{{{{{zz{{{{{z{{{z{{z{{z{{{{{{z{{{z{{{z{{z{{{{zzzzz{{{{{{{{z{{= {z{{z{{{{zz{{{{z{{{{{{z{{{z{{z{{{{{{{{{zz{{z{{z{{{{{{{{z{{{z{{z{{{{{{z{{{= z{{z{{{z{{z{{{z{{{z{{{{{{{{z{{{{{z{{{{{{z{{{z{{{{z{{{{zzzz{{{{{{{z{{{z{{{= z{{zzzzz{{zz{{{{zz{{{{{{{zz{{z{{{z{{zzzzz{{{{{z{{z{{{z{{z{{{z{{zzz{{{{zzz= zz{{z{{{z{{{{{z{{{z{{{z{{{{{z{{{z{{{z{{zzzzz{{{{{z{{{z{{{z{{z{{{z{{zzzzz{= {z{{{z{{{{{z{{{{zzzzz{{{{{zz{{z{{{z{{z{{z{{{z{{z{{{z{{{{{z{{z{{{{{{z{{{z{= {{z{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{= z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{zz{{{{{{{{{{zz{{{z{{{z{{{{{z{= {{z{{z{{{{{{z{{{{z{{{{{{{{{z{{{zz{{{{{{{zz{z{{{{{z{{{z{{z{{z{{{{{{z{{{z{{= {z{{z{{{{z{{{{{{{{{{{{z{{{z{{z{{{{{zz{{{z{{{{{{z{{{z{{z{{{{{{{zz{z{{z{{z{= {{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{{z{{z{{z{{{{{{{{{z{{{{{z{{{{{{z{{{z{{{= {z{{{{z{{z{{{{{{{z{{{z{{{z{{z{{{{{{{zz{{{{zz{{{{zz{z{{zz{{z{{z{{{{{{{{{z{= {z{{{z{{z{{{z{{z{z{{{{z{{{{{{z{{{z{{{{{z{{{z{{{z{{{{{z{{{z{{{z{{z{{{{{{{{= {{z{{z{{z{{{z{{{z{{z{{{{{{z{{{z{{{{{z{{{{z{{{{{{{zz{z{{z{{{z{{z{{z{{{z{{z= z{{z{{{{{z{{z{{{{{{{z{{z{{z{{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{= {{{{{{{{{{{{{{{{{{{z{{{z{{{z{{z{{{{{{{{zz{{{{zz{{z{{{z{{{zzz{{{z{{{{{{{{z= z{{{{{{{{{{zz{{z{{{z{{{{{z{{{z{{z{{{{{{z{{{{z{{{{{{{{{z{{{{zz{{{{{z{{{z{{= {{{z{{{z{{z{{z{{{{{{z{{{z{{{z{{z{{{{z{{{{{{{{{{{{z{{{z{{z{{{{{{zz{{z{{{{{= {z{{{z{{z{{{{{{z{{{z{{z{{z{{{{{{{{z{{{z{{z{{{{{{z{{{z{{z{{{z{{{zzz{zzz{{{= {{{{{{z{{{{{{z{{{{z{{{{z{{{{z{{{{z{{{z{{{{{{z{{{z{{{z{{z{{{{{{{{zz{{{{zz{= {z{{{z{{{zzz{{{z{{{{{{{{{z{{z{{{z{{z{{{z{{z{{z{{{z{{{{{{z{{{z{{{{{z{{{z{{= {z{{{{{z{{{z{{{z{{z{{{{{{{{{{zzz{zzz{{{z{{{z{{z{{{{{{z{{{z{{{{{z{{{{z{{{{= {{z{{{z{{z{{{z{{z{{z{{{z{{{zzz{{{{{{z{{z{{{{{{{zzz{zzz{{{z{{z{{{z{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{zz{{{z{z{{z{{z= {{z{{zz{{z{{{z{{{{{zz{{{z{z{{z{{z{{{{{z{{z{{zz{zz{{{{{z{{{z{{zz{{{z{z{{{{= zz{{{z{{{{z{{z{{z{{{{{zz{{z{{{{{zz{zz{{z{{zz{{{z{z{{{zz{zz{{z{{{{zz{{{z{z= {{{{{z{{{z{{z{{{{z{{z{{z{{{{{{zz{zz{{z{{{{{{zz{{z{{z{{z{{z{{{{{zz{zz{{z{{= {{{{z{{{z{{zz{zz{{{{z{{{z{{{{{{{{{{z{{{{{{zz{{zz{{{{zz{{zz{{{{z{{{zz{{{{{= z{{{z{{{z{{zz{{{z{z{{z{{z{{z{{zz{{z{{{z{{{{{zz{{{z{{{{z{{zz{zz{{zz{zz{{z{= {zz{{zz{{{z{zz{zz{{{{{z{{{zz{zz{{{{{z{{{z{{{z{{zz{{{z{{{{{{z{{{z{{{{z{{{z= {{zz{{{z{z{{{z{{{{{z{{{{zz{{{z{zz{{z{{zz{zz{{z{{z{{{z{{{z{{{{{{{{z{{z{{{{= {{{{z{{{z{{{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{zzz= {zzz{zzz{{zzzz{{zzz{{{zzz{{{{zzz{z{{zzzz{{{zzzz{{zzz{{{z{{{{{zzz{{{{zzz{{= {{{zzz{zzz{{zzzz{zzz{{{{zzzz{{{{zzz{zzz{{{{{{{zzz{z{{{{z{zz{{zzz{{zzzz{{{= zz{{zz{zzzzz{{{{zzzz{{z{{{{zzzzzzzzzz{{{zzz{{{{zz{{{{{zzz{{zzzz{{{{{zzz{z= zzzzzz{z{{{{{{zzz{{zzzz{{{zzz{zzz{{zzz{{{{{z{{{z{{{{{{{{{zzz{{{{{{zzzz{{{= {{{zzzz{{{zzzz{{{zz{{{zzz{zzz{zzz{{zzzz{{zzz{{{zzz{{{{zzz{z{{zzzz{{{zzzz{= {{{zzz{{zzz{{{{zzz{{zzz{{zz{{zzzz{{{zzz{z{{{{{zz{{zzz{{{{{zzz{zzz{zzz{{zz= zz{{{{{{{z{{{z{{{zzz{zzz{{zzzz{zzz{zzz{{{zzz{{{{zzzz{{{zzz{z{{zzz{zzzzzzz= {zzz{{zzzz{{{{zzz{{zz{{{{{{z{{{z{{{zzz{{zzzzz{zzz{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zz{{zz{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{{zz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|= |~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}|= |~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~= }}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{= {{{{{{{z{{{{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4= =1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{z{z{{{{zz{zz{{{{zzzz{z{zzz{{zzz{{zzz{zzz{zzz{z{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{zz{zz{{zz{{z{{zz{z{z{{{z{{z{{{z{= {{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{z{{{z{{z{{{= z{{z{{{{zzzzz{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {{{zzzzz{{{{z{{{z{{z{{{z{{z{{{{z{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{{z{{z{{{z{{z{{{{z{{{{{{{zzz{zzz{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{z{{{z{{zz{zz{{= z{{{{zz{{{z{{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{= zzz{{{zzz{zzz{zzz{{zzz{zzzz{{{{zzzz{{{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01= =01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =02=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= {{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1D= d=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}|= |~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=02=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|= |~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}= =01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{= {{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}= }||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00= =00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{{= {{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{= {{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{= {{{{{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~= ~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{zzzzzzzzzzz{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{= {{z{{{{{{{{{{zzz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{zzzzz{{{{{{{{= zz{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{z{{{{{{= {{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{z{zz{{{z{zz{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{z{z{{{{{{{{z{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{{{{{{z{{{{{{{{{{{{{z{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{{zz{{z{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{{{{{{z{{{{{z{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{{{{{{{{{{{z{{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{= z{{{zz{z{{z{{{{{{{{zz{z{{{zzz{{{zzz{{{zzz{{{zzz{{{zzz{{{zzz{{{zzz{{{{{{{{= {{z{{{z{{{z{{{{{{{z{{{{{z{zz{{{zzz{{z{zz{{{zzz{{{zzz{{{zzzz{{{{{{{z{{{{{{= zzz{{{{z{{{{zzzz{{zzz{{z{zz{{{zzz{{{{{{{{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}= }{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{{{z{{{{{z{{{{{{{{z{z{z{z{{{z{z{{{z{z{{{z{{= {{{z{z{{{z{z{{{z{z{{{z{{{{{{{{zzz{{z{{{z{{{{{{{z{{{{{zz{{z{{{{{z{zz{{z{z{= {{z{z{{{z{z{{{z{{{{{{{zzzz{{z{{{z{{{z{{{z{{{z{z{{{z{zz{{z{z{{{z{{{{{{{{{{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{{z{zz{{{z{{{{{{{{= z{z{z{zzzzz{{zz{{{{zz{{{{zzzz{z{{{z{zzzzz{{zz{{{{{{{{{{{{{z{z{{{z{{{{{{{z= {{{{{z{{{z{{zzzz{z{{{z{z{{{z{zzzzz{z{{{z{{{{{{{z{{{{{z{{{z{{{z{{{z{{{z{zz= zzz{z{{{{{{zz{{{{{{{{{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {z{zz{{{z{{z{{zz{{z{{{{{{{{z{z{z{z{{{{{{{{z{{{{{z{{z{{{z{z{{{z{z{{{{{{{{z= {{{{{{{{{{{{z{z{{{z{{{{{{{z{{{{{z{{{z{z{{{z{z{{{z{z{{{z{z{{{{{z{{{z{{{{{{= {z{{{{{z{{{z{{{z{{{z{{{z{z{{{{{z{{{{{{{{z{{{{{{{{{{{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{z{{{{zz{z{{{{{{{{z{z{z{z{{{z{z{{{z= {z{{{z{z{{{z{{zzzz{z{{{z{z{{{z{{{{{{{z{{{z{{z{z{{{{{{{{z{{{z{z{{{z{z{{{z{= z{{{z{{zzzz{z{{{z{z{{{z{{{{{{{z{{{{{z{{{z{{{z{{{z{{{z{z{{{z{z{{{{{z{{{z{{= {{{{{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{{{{{{{{{z{{{{= {{{{z{{{z{{zzz{{{zzz{{{zzz{{{zzzz{{{{{z{{zzz{{{zzz{{{{{{{{{zzz{{{{z{{{{{{= {{{{zzz{{z{{{z{{zzzz{z{{{z{{{{{z{{zzz{{{zzzz{{{{{{{z{{{{{{zzz{{{zzz{{{zzz= z{{zzz{{z{{{{{{zzz{{{{{{{{{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {z{zz{{{zzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{z= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}= }{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{= {{{z{zz{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{z{{z{{z{{z{{z{{z{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{z{{z{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{= z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z= {{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{= z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{z{z{{z{{= z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{{{z{{z{{z{{z{{z{{{{z{{z{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{= {{z{{{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{= z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z= {{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{= z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z= {{z{{z{{z{{z{{z{{z{{zz{{z{{z{{z{{z{{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8= T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzz{z{z{z{z{z{= z{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{zz{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzz{= {z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{z{z{z{z{z{z{z{z{z{z{zz{zz{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzzz{z{z{z{z{z{z{z{zzz{zz{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{zzzzz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{zz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{z{z{z{z= {z{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{{z{z{z{z{z{z{z{z{{{{{{= {{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{= {{{{{{{{{{z{zz{{{z{z{z{z{z{z{z{z{z{z{z{zz{{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{{{{{{z{z{z{z{z{z{z{{z{{z{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{{{{{{z{z{z{z{z{z{{z{z= {z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{= {z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{= z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{= z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z= {{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{{z{z= z{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{zz{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{zzzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{= {{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{z{z{z{z{z{= z{z{z{z{z{z{zz{{{{z{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{{{{z{{{z{{{z= {{{z{{z{{z{{z{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{= {{z{{{z{{{z{{{z{{{z{{{z{{{{{{z{{z{{{{z{{{z{{z{{{z{z{{z{z{{z{z{{z{z{{z{z{{= z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z= {{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z= {z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{= {z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{= z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{z{{z{{z{{{{z{z{zz{{z{z{z{z{z{z{{z{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{z{zz{{zzzzzzzzzzzzzzzzzzzzz{zzz{{z{{{{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{= {z{{{z{{{z{{{{{{z{{{z{{{z{{{{{{z{{{{{{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z= {{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{{{z{z{{{{{{{z{{{{z{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{zzzz{{z{= z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~= ~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z{z{z{z{z{z{z{z{z{z{{z{z{{{{{{{z{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{z{{{{{z{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{z{{z{{{z{{{{z{{z{{{{{{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z= {{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{= z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z= {{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{z{z{{{z{z{zz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{= z{z{z{z{{z{zz{{z{z{{{{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{{{{{{{z{{z{{z{= {z{z{{{{z{{{{{{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{= z{{z{{z{{z{{z{{z{{z{{z{{{z{{{{{{{{{{{z{{{{{{{z{z{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{= {{{{{{{{{{{z{zz{{{zzz{z{z{z{z{z{z{z{z{z{zz{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{z{z{{{{{{{{{{{{{{z{{{z{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{z{{z{z{{{{z{{z= {{{{{{{{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z= {{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{= {z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{= z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z= {{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{{z{z{{z{z{{z{{{z{{z{z{{z= z{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zz{z{z{z{z{z{z{z{z{{{z{zz{z= {{z{z{{{z{z{{z{z{{z{{z{{z{{z{z{{z{z{{z{{z{{{{{{{{{z{z{{z{z{{{{{{{{{{{{{{{= {z{z{{z{z{{z{{z{{z{{z{{z{{z{z{z{{z{z{{z{z{z{{z{z{{z{z{z{{z{z{{z{{z{z{z{{z= {z{{z{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{z{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{= {{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{= {{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{= {z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{= z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z= {{{{{{{{{{{{{{{{{{z{{{{{{{zzzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}= =01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z= z{z{z{zzzzzz{z{z{z{z{zz{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{z{{z= {{{{{{{{{{{{z{z{{z{z{{z{zz{zzz{{{{{{{{{z{zzzz{z{{zzzz{{{{{{{{{zz{zzz{{{{{= {{{{{{{{zzz{{{{z{{{{{{{{{{{{{{{{z{{z{{z{{z{z{{z{{{{{z{zzz{z{{{{zz{{z{zzzz= {z{zzzzzz{{zzzz{{z{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{= {z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{= z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z= {{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{= {{{{z{{{{{z{{{{{z{{{{{z{{{{{z{z{{z{{z{{z{z{{{{{{z{z{zzz{{z{z{z{z{z{z{z{z{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{= {{{{{{{{{{{{{{{{{{{z{zzz{zzz{{{{zz{zz{{z{{{z{{z{zz{{z{{{z{zzzzzzzzzzzzzz{= {z{{{{z{{z{{zz{z{z{{z{{{{{{{z{{z{z{{z{{{{{{{{{{{{{{zz{{zz{z{{z{z{zz{{zzz{= {{{zzz{{{z{z{{z{zz{{zz{z{{z{z{{{z{zzzzz{z{{{{z{{z{z{{z{z{{{{{{{{{{{{{{{{{= {{{z{{{zz{z{{{zzzzz{{{zz{{zz{{zzzzz{{zzzzz{{zz{{{{z{{{{{z{{{{{z{{{{{z{{{{= {z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{= z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z= {{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{= {{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{z{{{{{{{{{{{{{{{{{z{z= {{{{{z{zz{z{z{z{z{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{z{z{{zz{{{z{{z{z= {{z{zz{{{{z{{{zz{{z{{z{{z{{z{{{{z{{{{{{{zz{{{{{{{{{{z{{z{{{{{{{{{{{{z{{z{= {z{{z{{z{{{zz{{{{{{{{z{z{zzz{{z{zzz{z{{{{{{{{{{{{zz{{{{{{{{z{{z{{{zz{{{{z= {{{{{{{{{{{{{z{z{z{{z{z{z{{z{{z{{{z{zzz{{{{{{{zzz{{zz{{zz{{z{{{{{z{{{zz{z= {z{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{= {{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{= {{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{= {z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{z{{z{{z{{{{{= z{{z{{z{{{{{z{{z{{z{z{{z{{{{{{{z{z{zzzz{{{z{z{{z{z{z{{z{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{= zzz{zzz{{z{zz{z{z{z{zzz{z{zz{{z{{{{{zz{{{{{zz{{{{zzz{z{{{z{{z{zz{{z{{z{z{= {{{{{{{z{{zzz{zz{{zz{{{zzzz{{zzz{zzz{z{{z{{zz{{{z{zz{{z{zz{{{zzzzz{zzzz{z= z{z{{zz{{{{{{z{{zz{{{{{zzz{zz{z{{zzz{zzz{zzz{zz{{{{{zzzz{{zzzz{z{{z{{zz{{= zzzz{zz{zzzzz{z{{z{zz{{{zz{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{= z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z= {{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{= {{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{= {{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{z{z{{{{{{{{{{{{{{z{{z{{{{{zz{z{{zz{z{zz{z{= z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{z{zz{{{zz{{zzz{zzz{zzz{zz{{z{zz{{{{z{{{zz{z{z{{zz{{z= zz{{{{{{{{{zz{z{{{{{{{{{z{z{z{{{z{zzzzzzz{zz{zz{{zz{{zz{{zz{{{{{{zzz{{zz{= zzz{z{zzz{zz{{zz{{zz{{zz{{{zzz{z{{z{{zzz{{z{z{{zzz{zz{{z{{zz{zz{{z{{z{{{z= {zz{{zz{{zz{{{{{{{{zz{{{{zzzzz{{zzzzz{{{zzz{{z{zz{z{{z{{z{{{{{{{{z{{z{{{{= {{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{= {{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{= {{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{= {z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{z{{z{{z{{{= {{{{{z{{zzzz{z{z{z{{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zz{zzz{zzz{zzz{zzz{z{{z= zz{{z{{{{{zzz{{z{{z{{zzzz{z{{z{{zzz{{{{z{{z{{z{{{{{{{{{{{zz{{zz{zzz{z{{zz= z{zzz{{zz{z{{z{{zz{{{z{zz{z{zzz{{{z{{zz{zzz{{zz{z{{{{{{{{{{z{zzz{{{{{zzz{= zzz{zzz{zz{zzz{zz{z{z{{{zz{zzz{{zz{{z{z{{zzz{{z{zzzz{{{{{{zz{z{{zzz{{{zz{= {{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{= {{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{= {{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{= {{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{{{{{z{{z{{{{= {{{{z{{z{z{{{{{{{{{{{z{{z{z{{z{zzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{|= |~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{= {zz{{z{z{z{z{z{z{{z{z{z{z{{{{{{z{zzzz{{{z{{zzzzz{{z{{{{zz{{{z{{{{{{{{{{{{= {{z{{z{zz{{zz{{zz{{zzzzz{{zzz{zz{{{{{{{zz{z{zz{zzz{{zz{{{zzzzz{{zz{zzz{{{= {{z{{z{z{{{{zz{{z{{{zz{{zz{zzzzzz{{zz{zzzz{{{{{zz{{zzz{zzz{{{{{{{zzz{{zz{= {zz{{z{z{z{{{{{zz{z{zz{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z= {{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{= {z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{= z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{z{{z= {z{{{{{{z{{z{z{{{{{{z{{z{z{{{{{{{{{{{z{{z{z{{{{{{{{{{z{zz{{{z{z{z{z{z{z{{= z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{= {{{{{{{{{{{{{{{{{z{zzz{zzz{z{z{z{z{z{z{zz{{{z{zz{z{{z{{{zzz{{zz{z{{zzzz{z= zz{zzz{{z{{{{z{{z{{z{z{{{{{z{{zzz{zz{{zz{zz{{zz{{zz{{zz{z{{z{{zz{{{z{{zzz= {{zz{zzz{{zz{{zz{{zz{z{{{{{{{{{zz{z{zz{{{z{zz{{zz{zz{{{{z{zzz{zz{{{z{zzz{= {zz{{zz{{{z{{z{zz{{{zz{zzz{zz{{{zzzz{z{z{{{zzz{{{{{{{{{z{{{{{{{{{{{z{{{{{= {{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{= {{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{= {{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{= {{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{{z{{z{{z{{{{{{{{{z{{z{{= z{z{zzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}|= |~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{zz{z{z{z{z{z{z{z{z{z{zz= {{{{{{{{zz{z{{{{{{{{zzzz{zzzzz{z{{{{z{{{{{{{{{{{z{z{{{{zz{{zzz{zz{zz{{zzz= {zz{{zz{{z{{{{zz{z{z{{{z{z{zz{{zzz{zzz{zz{{zz{{{{zzz{z{{zzz{zz{{{{{{zz{zz= z{zzz{zz{{zzz{zz{z{{{{zzz{zz{{zz{z{{{{{{zz{{{zz{{zz{zz{{zz{zzz{zz{z{zz{{z= {{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z= {z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{= z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z= {{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{{z{{{z{{z{z{= {z{{{{{{{{z{{z{{z{{{{{{{{{z{{zzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z= {zz{z{z{z{z{z{z{z{z{{z{zz{{z{{z{zz{{{{{zz{z{{{zz{{{zzz{{{{{z{{{z{z{z{{z{{= {{{{{zzzzz{zzz{zzz{zzz{zzzzzzzzzz{{{z{zzz{{zzzz{z{{zzzz{{zzz{zzzzzzzzzz{z= {zz{{{{z{zzzz{{z{{zzzz{{zzz{zzzz{{z{z{zz{{{{{{{{zzzz{{zzzz{{z{{zzzzzzz{zz= zz{{zzzzz{{{zzzz{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{z{{z{{{{zz{zz{z{z{z{z{z{z{z{= z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~= }}{{{{{{{{{{{{{{{{{{{{{z{zzz{{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{{{{z{{{{z{{{{{= z{zz{{z{z{{{{z{{{{{{{{{{{{{{z{{{z{{{{{{z{{{{z{{z{{z{{{{{{{z{{{z{{{{{{zz{{= {{{{{z{{{{{z{{{{{{{{{{{z{{z{{{{z{{{{{{{{{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{= z{z{{{{{{{z{{{{{{{{z{{{{{{{{{{{z{{{{{z{{z{{{{{{z{z{{{z{{z{{z{{z{z{{z{{z{{= z{{z{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{{z= {{z{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{{z{= {z{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{{z{{= z{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{{z{{z{z{{z{{z{z{{z{{z{{z{{{{{{{z{{z{z{z{{= {{{{{{{{z{zzz{{{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zz{z{z{z{z{z{z{z= {z{{z{zz{z{{z{{{{zzzzzzzzzzzzzzz{{{{{z{{{{{z{{z{{{z{{z{{{{z{{{{z{{{{{z{{{= {{{{{{{z{{z{{{{z{{{{z{{{zz{z{{z{{{{z{{{{{z{{z{{z{z{{{{{{z{z{z{z{{z{{z{{{z= {{z{{z{{{{{{{{z{z{{z{z{{z{z{{{{{z{{z{{{{z{{z{{{{{z{z{{z{z{{{{{z{{{{{{{z{z= {{{zzz{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{{{{z{{{{{{{{{= {{{{{{z{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{= {{{{{z{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{= {{{{z{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{= {{{z{{{{{{{{z{z{{{{{{{{{{{{{z{{z{z{z{zzzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{= {{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{= {{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{{z{z{zzzzzzzzzzzzzz{{z{{{z{z{{{{{{= z{{{{{{{{{{{{z{{{{{z{{{{{z{{z{z{{{{{{z{{{{{z{{{z{{z{{{{{{z{{{{z{z{{{{{z{{= {{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{{{z{{{{{{{z{{{{{{z{z= {{{{{{{{{{{{z{{{{z{{z{{{{{z{z{{{z{{z{z{z{{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{{z= {{z{{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{{z{{z{{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{{z{= {z{{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{{z{{z{{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{{z{{= z{{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{{z{{z{{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{{z{{z= {{{{z{{z{{z{{{z{{z{{z{{z{{z{{{{{z{{z{{{{{{z{z{{z{{{z{{{{{{{{{{{{zz{{z{z{z= {z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{z{z{{z{z{z{z{z{z{{zzz{{z{z{{{{{z{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{z{z{{z{{{{z{z{{{{z{{{{{{{{{z{{{{{{z{{{{{{= {{{{{z{{z{{{{z{{{{{{{z{{{{{z{{z{{{{{{{{z{{z{z{z{{z{{z{{z{{{{{{{{{{z{{z{{z= {{z{{z{{{{{z{z{{z{{{z{{{{{{{z{{z{{z{{z{{{{z{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{z{{{{{{{= {{{z{{{z{z{{{z{zzzzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4= =1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{z{z{z{z{z{= z{z{z{z{z{z{z{z{{{{{{{{{{{{z{{z{{z{{z{{z{{z{z{{{z{{z{{z{{{{{{{{{{{z{{{{{{= {{{{z{{z{{z{{{{{z{z{{{{{z{{z{{z{{{{{{{{{{{{{{{z{{{{{z{{{{{{z{{z{z{{{{{{{{= {{{{{{{{{{z{{z{{z{z{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{z{{z{{{{{{{{{{{{{{z{{{{z= {{z{{{{{z{{{{{{z{{z{{{z{z{{z{{z{z{{z{{z{{z{{{{{{z{{{z{{z{{z{z{{z{{z{z{{z{= {z{{z{{{{{{z{{{z{{z{{z{z{{z{{z{z{{z{{z{{z{{{{{{z{{{z{{z{{z{z{{z{{z{z{{z{{= z{{z{{{{{{z{{{z{{z{{z{z{{z{{z{z{{z{{z{{z{{{{{{z{{{z{{z{{z{z{{z{{z{z{{z{{z= {{z{{{{{{z{{{z{{z{{z{z{{z{{z{z{{z{{z{{z{{{{{{z{{{z{{z{{z{z{{z{{z{z{{z{{z{= {z{{{{{{z{{{z{{z{z{{{{z{{z{{z{{{{{{{{{z{{{{{{zz{{z{z{z{z{z{z{z{z{{{{{{{{{= {{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{z{zz{{zzz{z{z{z{z{{z{z{z{{{z{zz{z{{z{z{z{{{{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{z{{z{{z{{{{{z{{z{z{{{{{{{{{{{z{{{{{{{z{z{{{{{{{{{z{z{{z{z{{z{z{{{z{= {{{{z{{z{{{{{{{{z{{z{{{z{z{z{{z{{{{{{{{{{{{z{{z{z{{z{z{{z{{{z{{z{{{{{{{{{= {{{{z{{z{z{{z{{{{{{{z{{{{{{z{{{{{z{z{{{{{{{z{{{{{{{{z{{{{{{{{{{z{{{z{z{{{= {{{{z{{{{{{{{{{z{{{{{{{{{{z{{{z{z{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{{z{z{{{{= {{{z{{{{{{{{{{z{{{{{{{{{{z{{{z{z{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{{z{z{{{{{= {{z{{{{{{{{{{z{{{{{{{{{{z{{{z{z{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{{z{z{{{{{{= {z{{{{{{{{{{z{{{{{{{{{{z{{{z{z{{{{{{{{{{{{z{{{{{{{{{{z{{z{{{{{{z{zzzzz{z{= z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{{zz{z{z{z{z{z{z{z{z{z{zz{{{{{{{{{{{{= z{{z{z{{z{{z{{z{{z{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{{z{{z{z{z{{{z{{z{{{{{{{z{= {z{z{{{{{{{{{{{{{{{{{{{z{z{{{{{{{z{{z{{{{{{{z{{{{{{{{{{{{z{{z{{z{{{{{{{{{= {{{{{{{{{{{{{{z{{z{{z{{z{z{{{{{{{{{{{{z{{z{{{{{{z{{{z{z{{{{{{z{{z{{{{{{z{= z{{{{{z{{z{z{{{{{{{{{{z{{z{{{{{z{{z{z{{{{{z{{z{z{{{{{{{{{{z{{z{{{{{z{{z{z= {{{{{z{{z{z{{{{{{{{{{z{{z{{{{{z{{z{z{{{{{z{{z{z{{{{{{{{{{z{{z{{{{{z{{z{z{= {{{{z{{z{z{{{{{{{{{{z{{z{{{{{z{{z{z{{{{{z{{z{z{{{{{{{{{{z{{z{{{{{z{{z{z{{= {{{z{{z{z{{{{{{{{{{z{{z{{{{{z{{z{z{{{{{z{{z{z{{{{{{{{{{{z{{z{{z{{{{{{z{{z= {z{{{{{{z{{z{{{{z{zz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{z{z{z{z{z{z{= z{z{{z{zz{{z{{{z{{z{{{{{{{{{z{{{{{z{{{{{z{{z{{{{{{z{z{{z{{{{{z{{z{{z{{{{{= {{{{{{{{{{{{{z{{{{{{{{{{{{{z{{z{{z{z{{z{{z{{{{{{z{{z{{{{{{{z{{z{{{{{z{{z{= z{{z{{{{{{{{{z{{z{{z{z{{z{z{{z{{z{{{{{{{{{{{{{{{z{z{{z{z{{z{{{{{z{z{{{{{{= {{{{{z{{{{{{{{z{{z{{{{{{z{{{{{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{= {z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{= z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{z= {{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{z{= {z{{{{{{{{{{z{z{{{{{{{{{z{{z{{{{{{z{{zzzz{z{{z{z{{z{z{z{{z{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {z{zzz{z{z{z{z{z{z{z{z{z{z{{z{zz{{{{z{{{{{{z{{z{{z{{{{{z{{{{z{{{{{{{{{{z{= {{{{{{{z{z{{{{{{{{{z{{z{{z{{{z{zz{z{{{z{z{{z{z{{z{{{{{{{{{{{{{{{{{{{z{{{{= {{{{z{{z{{{{{{{{z{{{{{{{{{{{{z{{z{z{{{{z{{zzz{{zzz{{{{{{{{{z{{z{z{z{zzz{{= {zzz{{{{{{{z{{{{{{z{{z{{z{{zzz{z{{zzzz{{{{{{{z{{{{z{{z{{z{{{{{{{{z{{z{z{{= {{z{{z{{z{{{{z{{z{{z{{{{{{{{z{{z{z{{{{z{{z{{z{{{{z{{z{{z{{{{{{{{z{{z{z{{{= {z{{z{{z{{{{z{{z{{z{{{{{{{{z{{z{z{{{{z{{z{{z{{{{z{{z{{z{{{{{{{{z{{z{z{{{{= z{{z{{z{{{{z{{z{{z{{{{{{{{z{{z{z{{{{z{{z{{z{{{{z{{z{{z{{{{{{{{z{{z{z{{{{z= {{z{{z{{{{z{{z{{z{{{{{{{{{z{{z{z{z{{{{z{{z{{z{{{{{{{{{{z{{{z{{zz{{z{z{z{z= {z{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{z{z{z{z{z{z{z{z{{z{zz{{{{{{z{zzzzzzzzzz= zzzz{{{{{{{{z{{z{zz{{{{{z{{z{{{{{{z{z{{z{{{{{{{{{{zz{{{z{{{{{{{{{{{{{{{{{= z{z{z{{z{{z{{z{{z{{{z{{z{{{{{{{{z{z{{z{{{{z{{zz{z{{{{{{{{{{z{{z{z{z{{{{z{= z{z{z{{z{{{{{{{{{{{zz{{{{z{{z{{z{{{{z{{{{{{{{{{{{z{zz{{{{{zz{{z{{z{{{{{z{= {{{{{{{{z{z{z{{{{{{{{{z{{{{{{{{{{z{zz{{{{{{{z{z{z{{{{{{{{{z{{{{{{{{{{{z{{= {{{{{{{z{z{z{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{z{z{z{{{{{{{{{z{{{{{{{{{{{z{{{= {{{{{{z{z{z{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{z{z{z{{{{{{{{{z{{{{{{{{{{{z{{{{= {{{{{z{z{z{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{{{{{{{{z{{z= {{z{{{{{z{zzzz{z{z{z{z{z{zz{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{{zz{z{z{z{z{z{z{z{= z{z{zz{{z{z{{{z{{{{{{{{{{{{z{z{{z{z{{{{{zz{z{{z{{{{{{{{z{{{{{{{{{{{{z{{z{= {{z{{{{z{{z{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{z{{{{{{{{{z{{{{{z{{= {z{{z{{z{{{{zz{{{z{{z{z{{{{{{{{{{{{{z{{z{{zz{z{z{zz{{{{{{{z{{{{z{{z{z{{z{= {{z{z{{zz{z{{{z{{{{{z{{{z{{z{{z{{{{{{{z{z{{z{{{{{{z{z{{z{{{{{z{z{{z{{{{{{= {z{z{{z{{{{{{z{{z{{z{{{z{{z{{z{{{{{{{z{z{{z{{{{{{z{{z{{z{{{z{{z{{z{{{{{{{= z{z{{z{{{{{{z{{z{{z{{{z{{z{{z{{{{{{{z{z{{z{{{{{{z{{z{{z{{{z{{z{{z{{{{{{{z= {z{{z{{{{{{z{{z{{z{{{z{{z{{z{{{{{{{z{z{{z{{{{{{z{{z{{z{{{z{{z{{z{{{{{{{{z= {{z{{z{{{z{z{{z{z{z{{{{{{{{z{{z{{{z{zz{{z{z{z{z{z{{z{{z{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{= z{zz{{zzz{z{z{z{z{z{z{z{z{{z{zz{{{{{{{zz{z{{zzz{z{z{zz{{{{{{{z{{zz{{{{{{{= z{z{{z{{{z{{z{zzzz{{{zzzz{zzzzzz{zzz{zzz{{zzz{{zz{zz{zzzz{z{zzzz{{zzzzz{{= zzz{{{{{{zzzz{zz{{zz{zzzz{{zzz{{{{z{{z{{{{z{z{{z{{z{zzzz{{zzzz{{{{{{z{zz{= {z{{z{zzz{{zzz{zzz{zzz{{{{zz{zz{{z{zz{{{zzzz{{{zzz{{{zzz{{{zzz{{{{zzzz{z{= zzz{{{{zzz{{zz{{{{{{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{z= {{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{z{= {{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{z{{= {{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{z{{{{{{{{{{{{z{z{{z{{{{{{z{{zzz{z{z{z{z{z= {z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{z{z{{z{z{z{z{z{z{z{{z{zz{z{{{z{{zz{{{= z{{z{{{zzz{{z{{z{{{zz{{z{{{z{{{{{{{{{{{{{{zz{{z{zzz{{zz{z{z{z{{z{{{z{{z{{= {z{{zz{zzz{zz{{zz{z{{zzzz{{{z{{zz{{{zzz{{z{{z{z{zz{z{{{zz{zz{z{{{z{{{z{zz= zzzzz{{zz{{z{{z{{z{z{{z{zz{zz{z{{{z{z{z{{zz{{z{{{z{{{z{{z{zz{zz{z{{{z{{{z= {{z{{z{zz{{z{zzz{{z{{zz{z{{{z{{{z{zz{{zz{{{z{{z{z{{{{z{{z{{z{{{z{{{{{z{z{= z{{z{{z{{z{z{{{{z{{z{{z{{{z{{{{{z{z{z{{z{{z{{z{z{{{{z{{z{{z{{{z{{{{{z{z{z= {{z{{z{{z{z{{{{z{{z{{z{{{z{{{{{z{z{z{{z{{z{{z{z{{{{z{{z{{z{{{z{{{{{z{z{z{= {z{{z{{z{z{{{{z{{z{{z{{{z{{{{{z{z{z{{z{{z{{z{z{{{{{{{z{{z{{z{{{{{z{{z{{z{= {{{{{{{{{{z{{{z{zzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01= =01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{zz{z{z= {z{z{z{z{{z{z{z{{{z{{{{zzz{z{{zz{{zzzz{z{{{{{zzz{z{{{z{{{{z{{z{{z{{z{{{z{= zz{{z{z{{{{z{{{z{zz{z{z{zzzzzzz{z{z{z{z{z{{zz{{z{z{{{z{zzz{{{{z{{{z{zz{zz= {{{z{{zz{zz{{zz{{{z{zz{{{{z{{{{z{{{{{zzz{zzz{{{{{{{{z{{zz{z{z{zzzzz{zz{{z= z{z{z{z{{{{z{{z{z{zz{z{zzzzz{zzz{{{{zz{{{{{z{zzz{z{z{z{zzzzzz{{zz{{{{{zz{= {{{{{{z{{{{{{{{{z{{{z{{z{{{{{{{{{{{{z{{{{{z{{{{{{{{{z{{{z{{z{{{{{{{{{{{{z= {{{{{z{{{{{{{{{z{{{z{{z{{{{{{{{{{{{z{{{{{z{{{{{{{{{z{{{z{{z{{{{{{{{{{{{z{= {{{{z{{{{{{{{{z{{{z{{z{{{{{{{{{{{{z{{{{{z{{{{{{{{{z{{{z{{z{{{{{{{{{{{{z{{= {{z{{z{{{{{{{z{{{z{{{{{{{{{{z{{z{{z{{{{{z{{zz{zz{{z{z{z{z{z{z{{z{{{{{{{{{= {{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{z{zzz{z{zz{{z{z{z{z{z{z{z{{z{zz{{{{{{z{zzzz{{{z{{zzzzz{{z{z{{zz{= {{{{{{{{z{{{{{z{{{{{{z{zz{z{{z{{{{{{z{z{z{{{z{zz{{z{z{{{{z{{{z{{{z{{{zz{{= {zzz{z{{{zzz{{{{{{zz{z{{z{{{z{{z{{{z{{{z{{{{{z{{{{zz{{z{z{{z{zz{z{{{zz{{z= {{z{z{{{z{z{{{z{{{{{{{z{{z{{z{{{{{z{z{zz{z{{z{{{z{{z{{{{zz{z{{zz{z{{zz{z{= {zz{{z{{z{{{{z{{zz{{z{{z{{z{{z{{{{z{{z{z{{{{{{{{{{{{{{z{{z{z{{{{{z{{{{z{{= z{z{{{{{{{{{{{{{{z{{z{z{{{{{z{{{{z{{z{z{{{{{{{{{{{{{{z{{z{z{{{{{z{{{{z{{z= {z{{{{{{{{{{{{{{z{{z{z{{{{{z{{{{z{{z{z{{{{{{{{{{{{{{z{{z{z{{{{{z{{{{z{{z{= z{{{{{{{{{{{{{{z{{z{z{{{{{{{{{{{{z{{z{{{{{{{{z{{z{{z{{{{{{{{{z{z{{z{{zzz{= {z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{z{z{z{{z{z{z{z{z{z{zz{{z{{{= {{zzz{{zz{{z{zzzz{zzz{{zz{z{{z{{z{{{{z{{{{{z{{z{{z{{zz{zz{{z{z{z{{{zz{{z{= z{{{z{{{z{{zz{{zz{{zz{{{zz{{{zzz{z{{{zz{{z{{z{{zz{{z{z{zz{z{{{zz{{z{z{{zz= {z{{{z{{{{z{{{z{{{z{{{zzz{{{{{{zz{{z{zz{{z{z{z{{{zzz{zzz{z{{{{{z{{{zz{{z{= z{z{z{{{z{{zz{{z{zz{{z{{zz{{zzzz{z{z{z{{{{z{zz{{{{zz{{{{{{{z{{{{{{{{{z{{z= {{z{{z{{{{{{{{{{z{{{{{z{{{{{{{{{z{{z{{z{{z{{{{{{{{{{z{{{{{z{{{{{{{{{z{{z{= {z{{z{{{{{{{{{{z{{{{{z{{{{{{{{{z{{z{{z{{z{{{{{{{{{{z{{{{{z{{{{{{{{{z{{z{{= z{{z{{{{{{{{{{z{{{{{z{{{{{{{{{z{{z{{z{{z{{{{{{{{{{z{z{{z{{z{{{{{{{z{z{{{{= {{{{{{{z{{z{{z{{{{{{{z{zzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =02=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z{z= {z{z{zz{z{z{z{z{{z{zz{{{{{{z{zz{z{{{{{{{{zzz{{zzzzz{{{{{{{{{{z{{{{{z{{{{{= {{{zz{{z{{zz{{{z{z{z{z{{{{z{{z{zz{{{z{z{z{z{{{z{{zz{z{z{z{{{{{z{{z{{z{zzz= {{zz{zz{zz{{z{z{zz{zz{{{{{z{{{z{zz{{zz{z{zzz{z{zz{{z{{z{z{z{{{zzz{{{zz{{{= z{z{z{{{zz{{{{{z{z{z{z{{{z{{{zz{{{z{zz{z{{z{{z{zzz{{z{{{z{{{{{zz{z{z{z{{z= {{z{z{{{z{{z{{{{{{z{{z{{{{{{{{{{{z{{z{z{{z{{{{{z{{{{{{z{{z{{{{{{{{{{{z{{z= {z{{z{{{{{z{{{{{{z{{z{{{{{{{{{{{z{{z{z{{z{{{{{z{{{{{{z{{z{{{{{{{{{{{z{{z{= z{{z{{{{{z{{{{{{z{{z{{{{{{{{{{{z{{z{z{{z{{{{{z{{{{{{z{{z{{{{{{{{{{{z{{z{z= {{z{{{{{{{{{{{{z{{z{{{{{{z{{z{z{z{{{{{{{{{{{{{{z{{zzz{{z{z{z{z{z{z{z{z{{{= {{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{z{zz{{zzz{z{z{z{{z{z{z{z{{z{zzz{{z{z{{{z{{{{zz{z{{z{zz{z{zzz= {z{{z{{z{{{{{z{{{{{z{{z{{z{zzz{z{{zzzz{{zzzzzz{z{z{{{{zzzzz{zzz{zzz{zzz{z= zz{{{{zzzz{zzzz{z{z{{{zzz{z{{zz{zz{zzz{{zzz{z{z{{{z{{{zzz{{zzz{{{zzz{z{zz= z{z{{{{zzz{{{{z{z{{zzzz{{{{zz{{z{{z{z{{zzz{{z{zzzz{z{zzzz{{zzz{z{zzz{{{{z= zz{zz{zzzz{z{zzzz{{zzzz{{{z{{z{{{{{{z{z{{{{{{{z{z{{z{{z{{{{{{{{{{{z{{{{{z= {z{{{{{{{z{z{{z{{z{{{{{{{{{{{z{{{{{z{z{{{{{{{z{z{{z{{z{{{{{{{{{{{z{{{{{z{= z{{{{{{{z{z{{z{{z{{{{{{{{{{{z{{{{{z{z{{{{{{{z{z{{z{{z{{{{{{{{{{{z{{{{{z{z= {{{{{{{z{z{{z{{z{{{{{{{{{{{{z{{z{z{{{{{{{{{z{{z{{{{{{{{{{z{z{z{{z{z{{{{z{= zzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{{z{{{{{{= z{z{{z{{{{{{{{{zz{{{{z{{{{{{z{{{{z{{{{z{z{{{{{{{{{{{{{{z{{z{{z{{{{{{z{{{{= {z{{{{{z{{z{{{{{{{z{{z{{{z{zz{{z{z{{{z{{{{{{{z{{{{{{z{{z{{{{{z{{{z{{{{{z{= z{z{{{{{z{{{{{z{{{{z{{{{{{{{{z{{{{z{{z{{{{z{{{z{{z{{{z{{{{{{{{{{{{{z{{{{z= {{{{{{{z{{{{{{{{z{{z{{z{{z{{z{{z{z{{{{{{{{z{{{{z{zz{{{{{{z{{{{{{z{{z{{{{{= {{{{{{{z{{z{{z{{{{z{z{{{{{{z{{z{{{{{{{{{{{{z{{z{{z{{{{z{z{{{{{{z{{z{{{{{{= {{{{{{z{{z{{z{{{{z{z{{{{{{z{{z{{{{{{{{{{{{z{{z{{z{{{{z{z{{{{{{z{{z{{{{{{{= {{{{{z{{z{{z{{{{z{z{{{{{{z{{z{{{{{{{{{{{{{{z{{z{{z{{{{{{{{{z{{z{z{{{{{{z{= {z{{z{{{{{{{{{{{{{z{z{{zzz{{{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= {{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{z{z{z{z{= z{z{z{z{z{{z{zz{z{{{{{{zzzzzzzzzzzzzzz{z{{z{{z{{{{{z{{{{z{{{{{{z{z{{z{{z{= z{{{{{{{{{{{{{{{{{z{z{{{z{{{{{{{{z{z{z{{{{{{{{{{{zz{{zz{{{{{z{z{{{{{z{{z{= {{{{{z{{{{{z{{{{{{{{{zz{{z{{{{{z{z{{{z{{{{z{z{{z{{{{z{{{{{{{z{{{{z{{{{{{{= {{{z{{{z{z{z{z{{{{z{{{{z{z{{{{z{{z{{{{{{{{{{{{{{{zz{{zz{z{{z{z{{{z{{{z{{{= {z{z{{{{z{{{{{{{{{z{{z{z{{{{{{{{{{{{z{{{{{{{z{{{{{{{{{z{{z{z{{{{{{{{{{{{z= {{{{{{{z{{{{{{{{{z{{z{z{{{{{{{{{{{{z{{{{{{{z{{{{{{{{{z{{z{z{{{{{{{{{{{{z{= {{{{{{z{{{{{{{{{z{{z{z{{{{{{{{{{{{z{{{{{{{z{{{{{{{{{z{{z{z{{z{{z{{{{{{{{z= {z{{z{{{{{{{{{{z{{{{{{{{{{{z{{{z{{z{{{{{{{z{zzz{z{z{z{z{z{z{z{{z{{{{{{{{{= {{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{z{zzz{{{{{z{{z{zzzzzzzzzzzzz{{{{{{{{{{z{= {{{{z{{{{{z{{{{{{{{{{{{{z{{z{z{{z{{z{z{z{{{{{{{{{{{z{{z{{{{{{{{{z{{z{{z{{= zzz{{z{z{{{{{{z{z{{{{{{{{z{{{{{z{{{{{{{z{z{{{z{{{{{{z{{{{{{{{{z{{{{{{{{{z= {{{z{{z{z{{{z{{{{{z{{z{{z{{{z{{{{{{{{{{z{{{{z{{{{{{z{{{{{{{{z{{z{z{{z{{z{= zzz{{{{{{{{{{{{{{{{z{{z{{{{{{z{{{{z{{z{z{{{{{{{{z{{z{{z{{z{{{{{{{z{{{{z{{= z{z{{{{{{{{z{{z{{z{{z{{{{{{{z{{{{z{{z{z{{{{{{{{z{{z{{z{{z{{{{{{{z{{{{z{{z= {z{{{{{{{{z{{z{{z{{z{{{{{{{z{{{{z{{z{z{{{{{{{{z{{z{{z{{z{{{{{{{z{{{{z{{z{= z{{{{{{{{{{{{{{{{{z{z{{{{{{{{{{z{z{{z{{{{z{{z{{z{{{{z{{{{{{{{z{{z{{zzz{{z= {z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{z{z{z{z{z{z{z{z{{z{zz{{z{{{{{{{{{= {{{z{{{z{{z{{z{{z{{z{{{z{{{{{z{{{{{z{{z{z{{z{{{{{{{{{{{{{{{{{{{{{z{{z{{z{= {{{{{{{z{{{z{{{{{{{{{{z{{z{{{{{{z{{{{{{{{z{z{{z{{{z{{{{{z{{z{{{{{{z{{{z{z= {{{{{z{{z{{{{{z{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{z{{z= {{{z{z{z{{{{{{{{{{{{{{{z{{z{z{{z{{z{z{{z{{z{{{{{z{{{{{{z{{{{{{{{z{z{{{{{{= {{{{{{z{{{z{z{{{{{z{{{{{{{{z{z{{{{{{{{{{{{z{{{z{z{{{{{z{{{{{{{{z{z{{{{{{{= {{{{{z{{{z{z{{{{{z{{{{{{{{z{z{{{{{{{{{{{{z{{{z{z{{{{{z{{{{{{{{z{z{{{{{{{{= {{{{z{{{z{z{{{{{z{{{{{{{{z{z{{z{z{{z{{z{{{{{{{z{{z{z{{{{{{{{{z{{{{{{{{{{z= {{{{z{z{z{{{{{{z{zzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1D= d=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{z{zz{z{z{z{z= {z{{z{z{{z{zz{{{z{{z{z{{z{z{{{z{{{{{{{{{{{z{{{{{{{{z{{{{z{z{{{{{{{{{{{z{{= z{{z{{z{z{{z{{{z{{{{{{{{z{{z{{z{{{z{{{z{{z{z{z{{{{{{z{{z{{{{z{{z{{{{{{{{{= {{{{{{z{{{{{z{{z{{{{z{{{{{{{z{{{{{{{{z{{{{{{z{z{{z{z{{z{{z{{z{{{{z{{z{z{{= z{z{{{{z{{{{z{z{{z{z{{{{{{{{{{{{{z{{z{{z{{z{z{z{{{{{{{{{{{{{{{{{{z{{{{{z{= {{z{{z{{{{z{{z{{{{{{{{z{{z{z{z{{{z{{{{{{{z{{{{z{{z{{{{{{{{z{{z{z{z{{{z{{{= {{{{z{{{{z{{z{{{{{{{{z{{z{z{z{{{z{{{{{{{z{{{{z{{z{{{{{{{{z{{z{z{z{{{z{{{{= {{{z{{{{z{{z{{{{{{{{z{{z{z{z{{{z{{{{{{{z{{{{z{{z{{{{{{{{{{{{{{{{{{z{{z{{{= {{{{{{{z{{z{{{{z{{z{z{z{{{z{{{{{{{{{z{z{{z{zz{{z{z{z{z{z{z{z{z{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{z{zz{{zzz{z{z{z{z{z{zz{z{{z{z{z{{{{{{{{{{{{{{{{{{{z{{z{z{{z{{{z{z{= {z{{{z{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{z{{{z{z{{z{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{z{{{{{{z{{z{z{{z{{z{{{{z{{{{{{{{z{{{{{z{{z{{{z{{z{z{{{{z{{{{{{{= {{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{= z{{z{{z{{z{{{z{{{{{z{{{{{{{{{{{{z{{{{{{{z{{z{z{{{{{{{{{{{{{{z{{z{{{{z{{{{= {{{z{{z{z{{{{{{{{{{{{{{z{{z{{{{z{{{{{{{z{{z{z{{{{{{{{{{{{{{z{{z{{{{z{{{{{= {{z{{z{z{{{{{{{{{{{{{{z{{z{{{{z{{{{{{{z{{z{z{{{{{{{{{{{{{{z{{z{{{{z{{{{{{= {z{{z{{z{{z{z{z{{{{{{{{z{{z{{z{{{{{{{z{{{{{{{{{{{{{{{z{{{z{{{{{{z{zzzz{z{= z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~= ~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z{z{z{z{z{z{z{{z{z{{z{zzz{{z{{= z{{z{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{z{{z{{z{z{{z{{z{z{{{{{{{= {{{{{{z{{z{z{{z{{z{{z{z{{z{{{{{z{{z{{z{{{z{{z{{{{{{{{{{{{{{z{{{{z{{z{z{{{= {{z{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{z{z{{z{z{{{{{z{{z{{z{{z{{{{{z{{{{{z{{z{= {z{{{{{{{z{z{z{{z{z{{z{z{{z{{{{{{{{{{{{{z{{{{z{{{{{z{{z{z{{z{{{{{z{z{{{{{= {{{z{{z{{z{{{z{{{{{{{{z{{{{{z{z{{{{{{{{z{{z{{z{{{z{{{{{{{{z{{{{{z{z{{{{{{= {{z{{z{{z{{{z{{{{{{{{z{{{{{z{z{{{{{{{{z{{z{{z{{{z{{{{{{{{z{{{{{z{z{{{{{{{= {z{{z{{z{{{z{{{{{{{{z{{{{{z{z{{{{{{{{{{{{{{{{z{z{{z{{{{{{{{{{z{{z{{{{z{{z= {{{z{{z{{{{z{{{z{z{{{{z{zz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{= z{z{z{z{z{z{z{z{{z{z{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{z{{z{{z{{z{{{{z{{z{{z= {{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{= z{{z{{z{z{z{{{{z{{{{{{{{{{z{{{{z{z{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{z{z= {{{{{{z{{{{{{z{{{{{z{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{{{{{z{{z{z{{z{{{{{z{{{= {z{{z{{{{{{{{{{z{{{{{{{z{{z{{{{{{{{{{{z{{{z{{z{{{{{z{{{{{{{z{{z{{{{{{{{{{= {z{{{z{{z{{{{{z{{{{{{{z{{z{{{{{{{{{{{z{{{z{{z{{{{{z{{{{{{{z{{z{{{{{{{{{{{= z{{{z{{z{{{{{z{{{{{{{z{{z{{{{{{{{{{{z{{{z{{z{{{{{z{{{{{{{z{{z{z{{z{{{{{{{= {{{{{{z{z{{z{{z{{{{{{z{{{{{{z{{{{{{z{{{{{{{{{{z{{zzzz{{z{{z{z{{z{{z{{z{{{= {{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{= {{{{{{{{{{{{{{{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{zz{z{{z{z{{z{{z{{z{z{{{{{{{{{= {{{{{{{{z{{{{{{z{{{{{{z{{{{zz{z{z{{z{{zzz{{z{{{{{{{{{{{{{{{{z{{z{{{{{z{z{= {z{{z{{{{{{z{{z{{z{{z{{z{{{{{{{{z{zz{{z{{{{zz{zzzz{zzz{{{{{z{{{{{z{{{{{{z= zz{z{zzzz{z{{z{{z{{z{{{{{{{{z{{zzz{{z{{zzzz{{{{{z{z{{z{{{{{{{{{{{{z{{z{{z= {{z{{z{{{{{{{{{{{z{z{{{{z{{{{{{{z{{z{{z{{{z{{z{{{{{{{{{z{{z{{z{{{{{{{{{{z= {z{{{z{{z{{{{{{{{{z{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{{{z{{z{{z{{{{{{{{{{z{= z{{{z{{z{{{{{{{{{z{{z{{z{{{{{{{{{{z{z{{{z{{z{{{{{{{{{z{{z{{z{{{{{{{{{{z{z= {{{z{{z{{{{{{{{{{{{{z{z{z{{z{z{{{{{{{{{{{z{{z{{{{{{z{{{{{{z{{{{{{z{{z{{{{= z{{zz{z{z{z{z{z{zz{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}|= |~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{z{z{z{z{z{z{z{z{{z{zz= {{{{{{{{zzzzzzzzzzzzzzz{z{z{{z{{z{{z{z{{{{{{z{{z{{{{z{{z{{{{{{{{{z{zz{{{z= {{z{{z{z{{z{z{{{{{{{z{{{{{{{{{z{{z{{{{{{{{{z{{{{{{{{z{{z{{{z{{z{{{{{z{z{{= {z{{{{z{z{{{{{{z{{{{{z{z{z{zz{{{zz{{{{{{{{{{{{{{z{{{z{{{{{{zz{{{{{zz{{{z{= {{{{{{{{{z{{z{{z{z{{{{{{{z{{{{{{{{z{z{{z{z{{z{{{{z{{{z{{z{{{{{{{{{{{{{{{{= {z{{z{{z{{{{{{{{{z{z{{z{{{{{{{{{{{{{{z{{z{{z{{{{{{{{{z{z{{z{{{{{{{{{{{{{{= z{{z{{z{{{{{{{{{z{z{{z{{{{{{{{{{{{{{z{{z{{z{{{{{{{{{z{z{{z{{{{{{{{{{{{{{z= {{z{{z{{{{{{{{{z{z{{z{{{{{{{{{{{{{{z{z{{z{{z{{{{{{{{{{{{{{{z{{z{z{{{{{{{{= z{z{{{{z{z{{{{z{z{{{{{{{z{{{zzzz{{z{z{z{z{z{{z{{z{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=02=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{= zzz{z{zz{z{z{{z{z{z{z{z{{z{zz{{{z{{z{z{{{{{{{{{{{{z{{{{{{{{{{{{zz{{{{z{z{= {{{{{{z{{{{{{{z{{z{{zz{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{z{z{{{{z{{z{{z{{= {z{{z{z{{{{{{z{z{{zz{{z{{z{{{zz{{z{z{{z{{z{{{{{z{{{{{{{{z{zz{{z{{{{{z{z{{= z{z{{{z{{{{z{z{z{zz{zz{z{{{{{z{z{{z{z{{{{{{{{{{{{z{{z{{{{{z{{z{{{{{{{{{{{= zz{z{{{{{{{{{{{{z{{z{z{{z{z{z{{{{{{{{{{z{{z{z{{{{{{{z{{z{{{z{{z{z{{{{{{{{= {{z{{z{z{{{{{{{z{{z{{{z{{z{z{{{{{{{{{{z{{z{z{{{{{{{z{{z{{{z{{z{z{{{{{{{{{= {z{{z{z{{{{{{{z{{z{{{z{{z{z{{{{{{{{{{z{{z{z{{{{{{{z{{z{{{z{{z{z{{{{{{{{{{= {{z{{z{{{z{{{z{{{{{{{{{{z{{z{{{{{z{{{{{{z{{{{{{{z{{z{{{z{z{zz{z{z{z{z{z{z= {z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{z{zz{{zz{z{z{z{z{z{z{z{z{z{z{zz{{{{{{{{zz{{z{zz{z{z{= zz{{z{{z{z{{zz{{z{{{{{{z{{z{{{{z{zzzzz{zz{{zzzz{zzzzz{z{z{{z{{zzz{zz{zzz{= {{{zzz{{zzzz{{zzz{{zz{zz{zzz{{{zzzz{{zz{{z{{{{{{z{z{{z{{{{z{{{{zzz{z{{zzz= {{z{{zz{zz{{z{z{zzzz{{zzz{zzz{zzz{{{{{z{z{{{z{zz{{{zzz{{{{zzz{z{zzz{z{zzz= {{{{zzzz{{{zzz{z{{zzz{z{z{{{z{{z{{z{{z{{{{{{{{{{{{{{{z{z{z{{z{{{{{{{{{z{{= z{{{{{{z{{{{{{{{z{z{z{{z{{{{{{{{{z{{z{{{{{{z{{{{{{{{z{z{z{{z{{{{{{{{{z{{z= {{{{{{z{{{{{{{{z{z{z{{z{{{{{{{{{z{{z{{{{{{z{{{{{{{{z{z{z{{z{{{{{{{{{z{{z{= {{{{{z{{{{{{{{{z{{z{z{{z{{{{{{z{{{z{{{z{z{{z{{{{{{{{{{{{{{z{{{{{{z{{{z{{{= {{{{{{z{zzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{zz{z{z{z{z{z{z{z{z{{z{= zz{{z{z{z{zz{{{z{{z{{{zzzz{{{{{{{{zz{z{{{{{z{{{{{{{{{{{{{z{{zz{zz{{zz{{zz= {zz{{{{{{{{{{{zz{zzz{zzz{z{{{zz{z{{zzz{{z{{zz{zzz{zz{{zz{{z{{zz{z{{{z{zz{= {{{zzzzzz{z{zz{{z{{z{{zz{{{{{z{{zz{z{{{z{{{z{{z{{{z{{{z{{z{{zz{zz{zz{z{{z= z{{{zz{z{{z{{zz{z{{zz{{zz{zz{z{{zz{{{z{{zz{z{{{{z{{{{{{{{{{{{{z{{z{{z{z{{= z{{{{{{{{{{{z{{z{{z{{{{{{{{{z{{{{z{{z{{{{{{{{{{{z{{z{{z{{{{{{{{{z{{{{z{{z= {{{{{{{{{{{z{{z{{z{{{{{{{{{z{{{{z{{z{{{{{{{{{{{z{{z{{z{{{{{{{{{z{{{{z{{z{= {{{{{{{{{{z{{z{{z{{{{{{{{{z{{{z{{z{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{z{{z= {{z{z{z{{{{z{z{{{z{{{{z{{z{z{{z{zzz{{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{|= |~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{= zz{z{z{z{z{z{z{z{z{{z{zz{z{{{{{{{zzz{z{{zz{{zzzz{{z{z{{zzz{{{{z{z{{{z{{z{= {z{z{{zz{{z{{zz{{z{{{z{{{z{{z{{z{{z{{z{z{z{{{z{{zzzzz{{zz{{{{zzzz{z{{{z{{= {z{z{{{zz{{z{{zz{{{{z{{z{{z{z{{z{{{z{{zz{zzz{{{{z{{{z{{zz{zz{{zzzzz{zz{{z= z{z{z{{{{{{zz{z{z{zz{{{zzzzz{{zz{{{{zz{{z{{{zzz{{z{z{z{{zzzzz{{zz{{z{{zz{= z{z{{z{z{{{{{{{{{{{{{{{{{z{{{z{{z{{{{{{{{{{z{{z{{z{{{{z{{{{{{z{{{z{{z{{{{= {{{{{{z{{z{{z{{{{z{{{{{{z{{{z{{z{{{{{{{{{{z{{z{{z{{{{z{{{{{{z{{{z{{z{{{{{= {{{{{z{{z{{z{{{{z{{{{{{z{{{z{{z{{{{{{{{{{z{{z{{z{{{{{{{{{{{{{z{z{{z{{z{{{= {{{z{z{{z{{z{{z{{z{{{z{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{z{zzz{{z{z{z{z{z{z{z{= z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{= {{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{z{{zzzz{{{z{{zzzzz{{= z{{{{zz{{{z{{{{{{{{{{{{{{{{{{{z{{z{{{zz{z{{zz{{zz{{zzzzzzz{{z{{{z{z{z{{z{= z{{{{z{{{{zz{z{{z{{zz{{zz{{{zz{zz{z{{z{{{z{z{{{{zz{{z{z{z{{zz{z{{{zzz{{{{= z{zz{{z{z{{{z{{{z{{{z{{z{{z{{z{{z{z{{zzz{{z{z{z{{{{{z{zz{z{{zz{{{{zz{z{{z= z{{zz{z{{z{{z{zz{{{{{z{{{{{{{{{{{z{z{{z{{z{{{z{{{{z{{{{{{{z{{z{{z{{{{{{{{= {{z{{{z{{z{{{z{{{{{{{z{{z{{z{{{{{{{{{{z{{{z{{z{{{z{{{{{{{z{{z{{z{{{{{{{{{= {z{{{z{{z{{{z{{{{{{{z{{z{{z{{{{{{{{{{z{{{z{{z{{{z{{{{{{{z{{z{{z{{{{{{{{{{= {z{{z{z{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{{{{{{z{{z{{{{{{z{= {z{{zzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{z{z{z{z{z{z{z{z{{z{zz{{= z{{{{zzzz{{zz{{z{zzzz{zzz{zzz{{z{{{{z{{z{{z{z{z{{z{{{zz{zz{{z{{z{{{z{z{z{= z{{{{{{{z{z{z{z{{{zz{z{{{z{zz{{zz{{{z{zz{{{z{z{z{{zz{{z{{zz{z{z{{{zz{{{{z= {{{{z{{{z{z{z{z{{zz{{{{{{z{{zz{z{z{z{z{{{{zzzz{zzzz{{{{{{z{{{z{{{z{{{zz{{= z{{{{zz{{z{zz{zz{{{z{z{zzz{{{z{{{{{{{{zzz{{{z{z{{z{{z{{z{{{{{{{{{{z{{{z{{= {{z{{z{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{= {z{{z{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{{= z{{z{{{{{{{{{{z{z{{z{{z{{{{{{{{{{{{z{{z{{z{{z{{{{{z{{z{z{{z{{z{z{z{{{{{{{= {z{{{z{z{{z{{{{{z{z{{{{{{z{z{z{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}= =01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z= {z{z{z{z{z{z{z{z{z{z{zz{{{{z{{{zz{z{{{z{{{{zzz{{zzzzz{z{{{{z{{{{{{{{{{{{{= {{{z{z{{z{{{z{{z{z{zz{zz{{{{z{{z{{{z{{{z{z{z{{zz{{{z{z{{{zzz{z{{z{z{z{{{z= z{zz{{zz{z{{z{{{{{z{{{z{z{{z{z{z{zz{{z{{z{{z{{z{z{z{{{{zz{{{zz{{{z{{{z{z{= z{{{{z{z{z{z{z{z{z{z{zz{{{z{z{zz{{z{{z{{zz{zz{{{z{{z{{zzz{zz{zz{z{{{zz{{{= {{z{{{{{{{{{z{z{z{{{{{{{z{{{{{{{{{z{{z{z{{{{{{{z{{z{{z{{z{{z{z{{{{{{{{z{{= z{z{{{{{{{z{{z{{z{{z{{z{z{{{{{{{{z{{z{z{{{{{{{z{{z{{z{{z{{z{z{{{{{{{{z{{z= {z{{{{{{{z{{z{{z{{z{{z{z{{{{{{{{z{{z{z{{{{{{{{{{{{z{{z{{z{z{{{{{{{{{{{z{{= z{{{{{{{{{{z{{{{{{{{{z{{z{{{{{{{{{{{{{{z{{{{{z{{z{{zzzz{z{z{z{z{z{z{z{{z{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{= {{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{{z{z{{{{{z{{{z{{zz{z= {zzz{{{{{z{{{{z{z{z{{{z{{z{{{zzzzzz{zzzzzzz{{zzz{{{z{{{{{{zzzz{zzz{zzz{zz= zzz{{{zz{{zzz{zzzz{zzz{zzz{{zzz{zzzzzzz{z{z{z{{{zzz{{zzz{{zzzz{z{zzz{z{{{= {zzz{z{{z{z{{zzzz{z{{z{{{z{z{{{{{zzz{{z{{zzz{{{zzzz{{zzz{z{zzz{z{{zzz{z{z= zzzz{z{zzzz{{zzz{{z{z{{z{{{{{z{{z{{z{{{{{{{z{z{{{{{z{{z{{z{{{{{{{{{z{{z{{= {{{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{z{{{= {{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{z{z{{= z{{{{{{{{{{{z{z{z{{z{{{{{{{z{z{{z{{{{{{z{{{z{{{{{{{z{{z{{z{{z{{{{{{{{{{{z= {{z{zzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||= ~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{zzz{z{z{z{z{z{z{z{z{= {z{z{z{z{{{{z{{{z{{{z{{{{zz{{{{z{{{{z{{{{z{{{{{{{z{{{{{{{{z{{{{{z{z{{z{{{= z{{{{z{{{{{{z{{{{{{z{{{{{z{{{{{z{{z{{z{{{{{z{{{{{{z{{{{{z{{z{{{{{{{z{{{{{= z{z{{{z{{z{{{{{{{{z{z{{z{{{z{{{{z{{{{z{{{z{{{z{{{{z{{{z{{{z{{{z{{{{{z{{z{= {{{z{{{z{z{{{{{{{z{{{{{{{z{{z{{{{z{{{{{{{z{{{z{{{z{{{{{z{{{{{{{{{{{{{z{{{= {{{{{z{{{{{{{{{z{{z{{z{{{{{{{{z{{z{{z{z{{z{{{{{{{{z{z{z{{z{{{{{{{{z{{z{{z= {z{{z{{{{{{{{z{z{z{{z{{{{{{{{z{{z{{z{z{{z{{{{{{{{z{z{z{{z{{{{{{{{z{{z{{z{= z{{z{{{{{{{{z{z{z{{z{{{{{{{{{{{{z{{z{{z{{{{{{{{{{{{z{{z{{{{{{{{z{{z{{{z{{= {{{z{z{{{{{{{{{{{{{z{{z{z{z{{{{{z{zz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{= {{z{zzz{zz{{z{z{z{z{z{z{z{{{z{zzz{{{{{z{{zzzzzzzzzzzzzzz{z{{{{z{{{{{{{{{z= {{{{{{{z{z{{z{{{z{{{{{{{{{{z{{{z{{{{z{z{{{{z{z{{{{z{{{{{{z{{{{{{{z{{z{{{{= {z{z{{{{z{{{{{{{{z{z{z{{{{z{{{z{{z{{{{{{z{{z{{{{{{{{{{{{{{z{{{{{z{{{{{{{z= {{{{z{{{z{{{{{{{z{{{z{z{{{{{{z{{{{z{{{{{z{{z{{{{z{z{{{{{zzz{zzz{{z{{{{{{{= {{{{z{z{{z{{{z{{z{{z{{z{{{{z{{z{{{{{z{z{{z{{{{{{{{{{z{{z{{{{{z{{{{{{{{{{z= {z{{z{{{{{{{{{{z{{z{{{{{z{{{{{{{{{{z{z{{z{{{{{{{{{{z{{z{{{{{z{{{{{{{{{{z{= z{{z{{{{{{{{{{z{{z{{{{{z{{{{{{{{{{z{z{{z{{{{{{{{{{z{z{{z{{z{{{{{{{{{{z{{{= z{{z{{{{{{{{{z{{z{{{{{{{{{{{z{z{{{{{z{z{{z{z{{z{{{{{{{{{{{z{z{zzz{{z{z{z{= z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}= ||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{zzz{z{z{z{z{z{{z{zz{{z{z{{{{{{{{z{zzzzz= zzzzzzzz{{{{z{{{{z{{z{z{{{{{z{z{{{{{{{{{{{{{z{{z{{z{{{{{{{{z{{{{{{z{{{{{{= z{{{z{{z{{{{{z{z{{{{{{z{z{{{{{{z{{{{{z{{z{{{{{{{{z{{{z{zz{{{{{z{{{z{{{{{z= {{z{{z{{z{{{{{z{{{{{z{z{{{{z{{{{{{{{{{z{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{z{{= {{{{{z{{{{zzz{{z{{{{z{{z{z{{zz{{{{{{{{{{{{z{{{{{{z{{{{{{{z{z{{{{{{{{{z{{z= {{z{{{{{{z{z{{{{{z{{z{z{{{{{{{{{{{{z{{z{{{{{{z{z{{{{{z{{z{z{{{{{{{{{{{{z{= {z{{{{{{z{z{{{{{z{{z{z{{{{{{{{{{{{z{{z{{{{{{z{z{{{{{z{{z{z{{{{{{{{{{{{z{{= z{{{{{{{{{{{z{{z{z{z{{{z{{{{{{z{{z{{z{{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{= {z{{z{{{z{{{{{zzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zz{z{z{z{{z{z= {zz{z{{{z{zz{z{z{{z{{{{{{{{{{{{{z{{z{{{{{z{{{{{{{{{{z{{{{{{{z{{z{{z{{z{{{= {{{{{{z{z{{z{{{{z{{{{{{z{{{{{{{{{{{{z{z{{{{{{z{{{{{{{{z{{{{{z{z{{{{{{{z{{= {{{{{{{{{{{{{z{{{{z{{{{z{{{{{{{{{{{{{z{z{{{{z{{{{{{{z{{{{z{{z{z{{{{z{{z{{= z{{z{{{{z{{{{z{z{z{{z{{{{{z{{z{{{{z{{{{{{{{{{z{{{{{{{{{{{z{z{{z{z{{z{{{z{= {z{{{z{{z{{{{{{{z{{z{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{z{{z{z{z{{{{{{{z{{{{{= {{{{z{{{{{{{{{{z{{z{z{z{{{{{{{z{{{{{{{{{z{{{{{{{{{{z{{z{z{z{{{{{{{z{{{{{{= {{{z{{{{{{{{{{z{{z{z{z{{{{{{{{z{{z{{z{{{{{{{{{{{{{{{z{{z{{{{{{{{{z{{z{{{{= {{{{{{{z{{z{z{{z{{z{{z{{z{{{{{{{{z{{{z{z{zzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{= {{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{= {{{{{{{{{{z{zz{{{zz{z{z{z{z{z{z{{z{z{z{zz{{{{{{{{{{z{z{{z{{z{{{{{{z{z{{{{= {z{z{{z{{{{z{{z{{{{{{{{z{{{{z{{z{z{{{{{{{{{{{{{z{{z{{{z{{z{z{z{z{{{{{{{{z= {{{{z{{{z{{{{{z{{{{{{z{{z{{{{z{z{{z{{z{{z{{{z{{{{{z{{{z{{z{{z{z{z{{{{{{z{= {{z{{{z{{{{z{{{{{{{{{z{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{z{{{{{{{z{{{{z{{z{{z= {{{z{{z{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{z{{z{z{z{{{z{z{{{z{{{{= z{{z{{z{{{{{{{{{{z{{z{{{{z{z{{{z{{{{z{{z{{z{{{{{{{{{{z{{z{{{{z{z{{{z{{{{z= {{z{{z{{{{{{{{{{z{{z{{{{z{z{{{z{{{{z{{z{{z{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{z= {{{z{{z{{{{{{{{z{z{z{{{{{{{z{{z{z{z{{{{{{{{{{{{{{{{{{{{z{{z{z{{{{{{{{zz{z= z{{z{z{z{z{{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zzz{z{z{z{z{z{z{z{z{{z{zz{{{z{{z{{= {{{{{{{{z{{{z{{{{{{{z{{{{{{{{{{z{{{{{{{z{z{{z{{{{z{{{{{{{{{z{{z{{z{z{{{{{= {{{{{{{{{{{{{{{{z{{z{{{{{z{{{z{{{z{z{{{{{z{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{= {{{{{{z{{{{{{{{{{z{{{{{{{{{z{{{{{{{{z{z{{{z{{{z{z{z{{z{{{{{z{{{{z{{{z{{z{= z{{{{z{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{z{{z{{z{{z{{{{{z{{{z{z{{= {{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{z{z{{{{{{{{{{{z{{{{{{z{{{z{{{{{{{{{{z{z{{{= {{{{{{{{z{{{{{{z{{{z{{{{{{{{{{z{z{{{{{{{{{{{z{{{{{{z{{{z{{{{{{{{{{z{z{{{z= {{z{{{{{{z{z{z{{z{{{{{{{z{{{{{{z{{z{{{{{{{{{z{z{{z{{{{{{{{{{z{{z{z{{z{{z{= {z{{{{{{{{{{z{{z{z{{zzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{= {{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{z{z{z{z{= z{z{z{z{z{z{zz{z{{{{{{z{z{{z{z{{{{{{{z{{z{{{{{z{{z{{z{{{{z{{z{{{{{{{{{z{{= {{{{z{{z{{{{{{{{{{{{{z{{z{z{{z{{z{{{{z{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{z{z{{= {{z{{z{z{z{{z{{z{z{{{{z{{z{z{{{z{{z{{{z{{{{z{{z{z{{{{{{z{z{{{{{z{{{{{{{{{= {{{{z{{z{{{z{{{{z{{{{{{{{{z{{{{{{{{z{{{{{z{{z{{z{{z{z{{z{{z{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{{{{{{z{z{z{{{z{{z{{z{{{{{{{{{z{z{{z{{{{{{z{z{{z{z{{{{{{= z{{{{{{{{{z{z{{z{{{{{{z{z{{z{z{{{{{{z{{{{{{{{{z{z{{z{{{{{{z{z{{z{z{{{{{{z= {{{{{{{{{z{z{{z{{{{{z{{{{{{z{{z{{{{{{{{{{z{{z{{{{z{{z{{{{{{z{z{{z{{{{{{{{= {z{{z{{{z{{{{{{{{{{{{{z{{{{z{z{{z{{{{{{{{z{zzz{z{z{z{z{z{z{z{{z{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{z{zzz{zzz{{{{{z{{{{{z{{{{{{z{zz{{{z{{z{{{{{{{{{{{z{z{{{{{{{z{{z{{{{= {{{{z{{{{{{{{z{{z{{{{{z{z{{{{{{{z{z{z{{z{{z{{{{{{{{z{{{{{z{{{{z{{z{z{{{z{= {z{{z{{{z{{{{{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{z{{{{{{{{= z{z{{{{{{{{{{{{z{{z{{{z{{z{{{{{{{{{{z{{{{z{z{{z{{{{z{{z{{{{{z{{{{{z{{{{{{= {{{{{{{{{{z{z{z{{z{{z{z{z{z{{z{{z{{{z{{z{{{z{{{{{{{{z{{{{{{{{{z{z{{z{{{{{= {{{{{z{{{{{{{{{{{{z{z{{{{z{{z{{z{{{{{{{{{z{{{{{{{{{{{{z{z{{{{z{{z{{z{{{{{= {{{{z{{{{{{{{{{{{z{z{{{{z{{z{{z{{{{{{{{{{{{{{z{{{{{{{{{{z{{z{{z{{{{{{z{{{= {{{{z{{z{{{{{{{{z{{z{{{{{{{{{z{{{z{{z{{z{z{{{{{z{{{{{{{{{z{{z{{{{zz{z{{z{= z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~= }}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z{z{z{z{{z{z{{z{z{z{z{zz{{{{{{{{{{z{{= z{{z{{{{{{z{{z{{{{{{{{z{{z{{{{{z{{z{{{{{{{z{{{{{{z{{z{{{{{{{{{{{{{{{z{{z{= {{{{{z{{{{z{{{{{{{{{{{{{{{{{{z{{{z{z{{{z{z{{z{{{{{z{{{z{{z{z{z{{z{{{{{{z{= {z{{z{{z{{{{z{{{{z{{z{{{{{{{z{{{z{z{z{{{{{{z{{{{{{{{{z{{z{{{{z{{{{{{{{{z{= {{{{{{z{z{{{z{z{{{{{z{{z{{z{z{{z{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{z{{{z{{{z= {{{{{{z{{z{{{{{{{{{{z{{z{{z{{{z{z{{z{{z{{{{{{z{{{{{{z{{{{{{z{{z{{{z{z{{z{= {z{{{{{{z{{{{{{z{{{{{{z{{z{{{z{z{{z{{z{{{{{{z{{{{{{z{{{{{{{z{{z{z{z{{{{z{= {z{{z{{{{{{{{{{{{z{{{{z{{z{{{{{{{{{{{z{{{{{{{z{z{{z{{{{{{{{{{{{{{{{z{{{{{= z{{z{z{{{{{{z{z{zzz{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{z{z{z{z{z{z{z{z{= z{z{z{zz{{z{{z{{z{{{{{{{{{{z{{{{{{{{{z{{z{{{{{{{{z{z{{{{{{z{{z{{{{z{{{{{{= {{{z{{{z{{z{{z{{{{{{{{z{{z{{{{z{{{z{{z{{z{{z{z{{z{{{{{{{{{{{{{{{{{{{z{{{{= {z{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{z{{{z{{{{{{{z{{z{{{{z{{z{= z{{{{{{z{{{{z{{z{{{{{{z{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{z{{{z{{{{{z{{{z{{= z{{{{z{z{{z{{{{{{{{z{{{z{{z{{{{{{z{{z{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{z= {{{z{z{{{{{{{{{{{{{{{{{{{z{{{{{{z{{z{{{z{z{{{{{{{{{{{{{{{{{{{z{{{{{{z{{z{= {{z{z{z{{{{{{{{{{z{{{{{{{z{{{z{{z{{z{z{{{{z{{{{{{z{{z{z{z{{{{z{{z{{{{{{{{= {z{z{{z{{z{{z{{{{{z{{{{{{{{{{z{{z{{{{zzzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{= {{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{= {{{z{zz{{{z{z{z{z{z{z{z{z{z{z{z{zz{{{{{{{{{{z{{z{{z{{{{z{{z{z{{{{{{{z{z{z= {{{{{z{{z{{{{{{{z{{{{z{{z{z{{{z{{{{{{{{{z{{z{z{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{z{{z{{z{{z{{{z{{{{z{z{{{{{{z{{{z{{z{{{{{{{z{{z{{z{{z{z{{z{{{{{z{{{{z{= {{{{{{{{{z{{{{{{{{z{{{{{{{{z{{z{{{{{{{{{{{{z{z{{{{{{{{{z{{z{{z{{{z{{z{z{{= z{{z{{z{{{z{{{{{z{{{z{{{{{{{z{{{{{{{{{{{z{z{{{{{{{{{{{z{z{{{{{{{{{z{z{{z{= z{{z{{{z{{z{z{{{z{{z{{{{{{{{{{{{{{z{z{{z{{{z{{z{z{{{z{{z{{{{{{{{{{{{{{z{z= {{z{{{z{{z{z{{{z{{z{{{{{{{{{{{{{{z{{z{{z{{{{{{z{z{{{z{{{{{{{{{{{{z{{{{{{z= {{{{{{{{{{{z{{{{{{z{{z{{z{{{{{{{z{{{{{{z{z{{{{z{{z{{z{{{{{{{{z{{zz{z{z{z{= z{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}= }||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{z{z{z{z{z{z{z{z{z{z{z{zzz{{z{z{{z{{{{{{= {{{{{z{{{{{{{{z{z{{{{{{{{{{{{{{{{{{z{z{{{{{{z{{{{{{{{{{{{z{z{z{{{{{{{{{{z= {{z{{{{z{{z{z{{z{{z{{z{{z{z{{{{{{{{{{{{{z{{{z{{{{{{z{z{{{{z{{{{{{{z{{z{{{= {{{z{{{{{{{{{{z{{{{{z{{{{z{z{{z{{{{{z{{z{{{{{z{{z{{{{{{{{z{z{{z{{z{{{{{{z= {z{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{z{{{{z{{z{{z{z{{{{{{z{{= z{{z{{{{{{z{{z{{z{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{z{{z{{z{z{{{{{{{{z{{{{{{= {{{{{{{{{z{{z{{z{{z{z{{{{{{{{z{{{{{{{{{{{{{{{z{{z{{z{{{{{{{{{{{{{{z{z{{{{= {{{{{{z{z{z{{z{{{{{{z{z{{{z{{z{{{z{{{{z{{{{{{{{{{{{{z{{z{{{z{{{{{{{{z{{{{= {{{{{{z{{z{{z{zzzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00= =00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{z{z{z{z{z= {z{z{z{z{z{z{{z{{{{{{{{{z{{z{{z{z{{{{z{{z{{{{{{{z{{z{{{z{z{z{{z{{{{{z{{z{= {{z{{z{{z{{z{{{{{{{z{{z{{z{{{{{{{z{{{{{{{{{{{{{{z{{{{{{{{z{{z{z{{z{z{{{{{= {{{{z{{{{{{{z{{{{z{{z{{{{{{z{{z{{{z{{z{{z{{{{z{z{{{z{{{{{{{{{z{z{{{{{{{{z= {{{{{{{{z{{z{{{{z{{{{{{{{z{{{{{{{{z{{z{z{{z{{{{{{z{{z{z{{z{z{{z{z{{{z{{z{= {z{{{{{{{{{{{{{z{{{{{{{z{{{z{{{{{{{{z{{{{{{{{{{{{{z{z{{z{z{{{{z{{z{{z{{z{= z{{{{{{{{{{{{{{{{{z{z{{{{z{{z{{z{{z{z{{{{{{{{{{{{{{{{{z{z{{{{z{{z{{z{{z{z= {{{{{{{{{{z{z{{z{z{{z{{{{{z{{z{{z{{{{{{{{{{{z{{z{{{{{{{{{{{{z{{{z{{{{{z{{= z{{z{{z{{{{{{{{{{{z{{z{{{{z{{z{{z{{{z{{{{{{z{zzz{{z{z{z{z{z{z{{z{{{{{{{{{= {{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{= {{{{{{{{{{{{{z{zz{{z{z{z{z{z{z{z{z{z{z{z{zzz{z{z{z{z{{{z{{z{{{z{z{{z{{z{z= {z{z{{z{{z{{{{{{z{{{z{z{{z{{{z{{{z{{z{{z{{z{z{{z{{z{{z{{z{z{z{{{z{z{z{z{z= {z{{{z{z{z{z{{z{{{{z{{{{z{z{z{z{z{{z{z{z{{{z{{{z{{z{z{z{{{z{{z{{{z{{z{{z{= {{{{{z{{{z{z{z{z{{{{z{z{z{z{{z{z{z{z{{z{{{z{{{{z{z{z{z{{z{z{z{{{z{{{{z{{{= z{z{z{{z{{{z{{{{z{{{{{z{{z{{z{{{z{z{z{z{z{z{{{z{z{z{{z{{{z{z{z{z{{z{z{z{z= {z{z{z{{{z{{{{z{z{{z{{{z{{z{{{z{z{z{z{z{z{z{z{z{{{z{z{{z{{{z{{z{{{z{z{z{z= {z{z{z{z{z{{{z{z{{z{{{z{{z{{{z{z{z{z{z{{{{z{{{{z{{{z{{z{{z{{z{{z{z{z{z{z{= {{z{{z{z{z{z{z{{{z{{{z{z{z{{z{{z{{z{{z{z{z{z{z{{z{{z{z{{z{{z{{z{{{z{z{z{{= zzz{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z{z{z{z{z{z{z{z{z{z{z{z{{z{{= {z{{{{z{{z{{{z{{{z{{{z{{{{{{{z{{z{{z{z{z{{z{z{{{z{{z{z{{z{{z{{z{{{z{{{z{{= z{{z{{z{{z{{{{z{z{{z{{{z{{{z{z{{{z{{{z{{z{z{{z{z{{z{{{z{{{{z{{{{{z{z{{z{{= z{{z{{{{z{{z{{{{z{{z{{z{{z{z{z{{z{{z{{{{{z{z{{z{{{z{{z{{{z{{{z{{{z{{z{z{{= z{{z{{{z{{{{{z{z{{z{z{{z{{z{{{{z{{{z{{z{z{{z{z{{z{{z{{z{z{{{z{{{z{{{{z{z{= {{{z{{z{z{{{z{{{z{{z{{{z{{{z{{{{z{{{z{z{{{z{{z{z{{z{{{z{{{z{{{z{{{{{z{{{{= {z{{{z{{z{z{{z{{{z{{{z{{{z{{{{{z{{{{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{z{{z{z{{= z{z{{z{{{{z{{{z{{{{{{{{{{{z{{z{{{{{z{{{z{z{{z{{z{{{z{{z{{z{{z{{z{{{z{{{z{= {z{{{{z{{{z{{z{{z{{z{{{z{zzz{z{z{z{z{z{{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzz{z{z{zz{zz{z{zz{zzzzz{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zz{z{z{z{zz{z{zz{z{zz{z{z{z{z{z{z{z{= z{z{zz{z{zz{z{zzz{z{z{z{z{z{z{zzz{z{z{zzz{z{z{z{z{z{z{z{z{z{z{zzz{z{z{z{z= {zz{z{z{z{z{zz{zz{z{z{z{z{z{z{zz{z{zz{z{z{z{z{z{z{z{z{zz{z{zz{z{z{z{z{z{z= {z{z{z{z{z{zz{zz{z{zz{z{z{zz{z{z{z{zz{z{z{z{z{zz{z{z{z{zz{z{zz{z{zz{z{z{z= {z{z{zz{zz{z{zz{zzz{z{zzzz{z{z{z{z{z{z{z{zz{zz{z{zz{zzz{z{zzzz{z{z{z{zz{z= {z{zz{z{z{zz{zz{z{z{z{z{z{z{z{z{zzz{z{zz{zzzzzzzzzz{z{z{zzzz{z{zz{z{z{z{z= {zz{z{z{z{z{z{z{z{z{z{zz{z{z{zz{z{zz{z{z{z{z{z{zz{zz{z{{z{z{z{z{zz{z{{z{{= {{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{= {{{{{{{{{{{{{{{{{{{{z{zzz{zzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzz{zzzzz{zzz{zz= zz{zz{z{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzz= zz{zzzzz{zzzz{zzzzzzzzzzzzzzzzzzz{zzzz{zzzzzz{zzzzzzzzzzzzz{z{zzzzzz{zzzz= zzzzzzzzzzzzzzzzzzz{zzzzzzzzzzz{zzzzzzzzzzzz{zzzzzzzzzzzzzzz{zzzzzzzzzzzz= zzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzz{zzzz{zzzzzz{zzzzzzzzz{zzzzzzz= zzz{zzzzzzzzzzzzz{zzz{zz{zzzzzzzzz{zzz{zzzz{zz{zzzzz{z{zzzzzzzzzzzzzzz{zz= z{zzzz{zz{zzzzz{z{zzzzzzz{zzzzzzz{zzzzzz{zz{zzzzzzzzzzzzzzzzzzz{zzz{zz{z{= z{z{z{zzzzzzz{z{zzz{zz{zzzzzzzz{zzzzzzzzzzzzzzzzzzzz{zzzzz{zzzzz{zzzzzzzz= zzz{zz{zzzz{zzzz{zzz{zz{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}= ||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{zz{z{z{zzzz{z{z{z{z{z{z{z= {z{zz{z{zzzz{zzzzz{zzz{zzzz{zzzz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{zzzz{z{z{zzzz{z{zzz{zzzz{z{z{z{z{z{z{z{zzzzz{zzzz{z{zzzz{z{= z{z{z{zzzzzzz{z{zzz{z{z{z{z{z{z{z{z{z{z{zzzz{z{z{z{zz{zz{z{z{z{z{zzzz{z{z= {z{z{z{z{zzz{z{z{z{z{z{z{z{z{z{z{z{z{zzzz{z{z{z{z{z{z{z{z{z{z{z{zzzz{zzzz= {z{zzzz{z{z{z{zzz{z{z{z{zzzz{z{z{z{z{zzzzz{zzzzzz{z{z{zzzzz{zzz{zzzz{zz{z= {zzzzz{z{z{z{z{z{zzzzz{zzz{zzzz{zz{z{zzzzz{z{zzzzz{z{zzzzz{z{zzzz{zz{z{z{= z{z{z{z{z{z{zzz{zzzzzzzzzzzzz{z{z{zzzzzz{zzzzzz{z{z{zzzz{z{z{z{z{z{z{z{z{= zzzz{zzzzz{z{zzz{z{z{z{zzzzzzzz{z{zz{zzzz{zzzzzz{z{{{{{{{{{{{{{{{{{{{{{||= ~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{= {{{{{{{{{{{{{{{{z{zz{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{z{{{z{{{z{{{z{{{{z{{{z{{{z{{{z{{z{{z{{{z{{{z{{{z{{{{{{{{{{{{{= {{z{{{{{{{{{{z{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{z{{{z{{= z{{z{{z{{z{{{{{{{{{z{{{{{{z{{{z{{z{{{{{{{{{{z{{{z{{z{{{{{{{z{{{z{{{z{{{z{= {z{{z{{{{{{{{{{z{{{z{{z{{z{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{z{{{{= {{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{z{{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{z{{{z{{{z{{{z{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{z{{{{{{{{{z{{{z{{{z{{z{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~= ~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{z{z{z{z{z{z{z{z{z{{z{{z{z{{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{z{{z{z{{z{{z{z{{z{z{{z{{z{z{{z{{z{{z{{z{= z{{z{{z{z{{{z{z{z{z{z{z{z{{z{z{z{z{z{{z{z{{z{{z{z{z{z{z{z{z{z{z{z{z{{z{{z= {z{z{z{z{z{z{z{z{{z{{z{{z{{z{{z{{z{z{z{z{z{{z{z{z{{z{{z{{{z{z{z{z{z{{z{{z= {{z{z{z{z{{z{{z{z{{z{{z{{z{{{z{z{z{z{z{{z{{z{{z{{z{z{{z{z{{{z{z{z{z{z{z{z= {z{z{z{{z{z{z{{z{z{{{z{z{{z{{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{z{z{z{= z{z{{z{{z{z{z{z{z{z{z{z{z{z{z{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{z{{z{z{{z= {{z{z{{z{z{z{z{z{z{z{{z{z{{z{z{z{z{z{z{z{z{z{{z{z{z{z{{z{z{{z{{z{{z{z{z{z= {z{z{z{z{{{z{z{{z{z{z{z{{z{z{{{z{z{z{z{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zz{z{z{z{z{z{z{z{z{z{z{z{z= {z{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zz{z{z{z{zz{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zz{z{z{z{z{z{z{z{z{zz{z{z{z{z{z{z{z{z{{{{{{= {{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{= {{{{{{{{{{{{z{zz{z{z{z{z{z{z{z{z{z{z{z{z{z{zzzzzzzzzzzzz{zzzzzzzzzzzzzzzz= zzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzz{zzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzz{zzzzz{zzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{= zzzzzzzzzzzzzzzzzzzzzz{zzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzz= zz{zzzzz{zzzzz{zzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzz{zzzzzzzzzzzzz{zzzzzzzzzzzzzzzzzzz{zzzzz{zzzzzzzzzz{zzzzzz= z{zzzzzzzzzzzz{zz{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01||~}}||~~~~= ~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{z{z{z{z{z{z{z{z{z{z{z{zzzz{z{z= {z{z{z{zzz{z{z{z{z{z{z{z{z{z{z{zzzzz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzz{= z{z{z{zzz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzzz{z{zzz{z{z{z{z{z{z{z{zzzzz{= z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzzzz{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{z{z{z{zzzzz{z{z{z{z{z{z{z{z{z{zzzz{z{zzzzz{z{z{z{z{z{z{z{z= {z{z{z{z{z{z{z{zz{zz{z{z{zzzz{z{zzz{z{zzz{z{z{zzzzz{z{z{z{z{z{z{z{z{z{z{z= {z{z{z{z{zzzzz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzzzz{z{z{z{z{z{z{z{z{z{z{zz= zzz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzzz{z{z{z{z{zzzzz{z{z{z{z{z{z{z{z{= zzz{zzzzz{z{z{z{zzzz{z{z{zzz{z{z{z{z{zzzz{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{= z{z{z{z{z{z{z{z{z{z{z{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~~~~}}||~~}= }{{{{{{{{{{{{{{{{{{{{{z{zz{zz{z{z{z{z{z{z{z{z{z{z{z{z{{z{{z{z{{z{{{z{{z{z= {{z{z{z{z{{z{z{{{{{{{z{z{z{{z{{z{z{{z{z{{z{z{z{z{{z{z{{z{{z{z{z{{{z{{z{z{= z{z{{z{{z{{z{{z{{z{{z{z{z{{z{{{z{{z{{z{{z{z{{z{z{{z{{{{{{z{{z{z{z{z{z{z{z= {z{z{{z{{z{{z{{z{{z{{z{{z{z{z{z{z{z{{{{{{{z{{z{{z{z{z{z{{z{z{z{z{z{z{{z{{= z{z{{z{{{{{z{z{z{{z{z{z{z{{z{{{{{{z{{{{{{{z{{z{{z{z{z{z{{z{z{{z{z{z{z{z{{= z{{z{{z{z{{{{{z{z{{z{{z{{z{{z{{{{{{{z{{z{z{{z{z{z{{z{z{{z{{z{z{{z{{{{{{{z= {{z{z{{z{z{{z{z{z{z{z{z{{z{{z{{{{{{z{{z{z{{z{z{z{{z{{z{{{{{{{z{{z{z{{z{z{= z{z{z{{z{{z{{z{{z{{z{{z{{{{z{{z{{z{{{{{{{z{z{{z{{z{{z{{z{{z{{{{{{{{z{{z{z= {{{{z{{z{z{{{z{{z{{z{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z{z{z{z{z{z{z{z{z{z= {z{zz{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{z{{{{z{{z{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{= {{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{z{{{{{z{{{{z{{z{{{{{{{z= {{{{{z{{{{{{z{z{{z{{{{{{{{{z{{{{{{{{z{{z{{{{{{{z{z{{{z{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {z{zz{{z{z{z{z{z{z{z{z{z{z{z{zzz{z{z{{z{{z{{{{z{{z{{z{{z{{{z{{z{{z{{{{z{{= {{z{{z{z{z{{z{z{{z{{z{{{z{{z{{z{{z{{z{{{{{{{{z{z{{{z{{z{{{{{z{z{z{{z{z{z{= {{z{{z{{{{z{z{{z{{z{{z{z{{z{{{{{{{{{z{z{{{z{{{{z{{{{z{{z{z{{z{{{z{z{z{{z{= z{z{{{{z{{{{z{{z{{{{{z{z{z{{z{{{z{{z{{{z{{{{z{{z{{{{{z{{z{{z{{{{z{{z{z{{{= {z{{z{z{{{{{{z{{{{{{{z{z{z{{{z{{{z{z{{z{z{{{z{{{z{{z{z{{z{{z{{z{{{z{{z{{z= {z{{z{z{{z{{{{{z{z{{z{z{{{z{{z{{z{z{z{{z{{z{{z{{{{{z{z{{z{z{{z{z{{{z{{{{z= {{z{z{{z{{{{{{z{z{{z{z{{{z{{z{z{{z{{{{{{z{z{{z{z{{{z{{{z{{z{{{z{z{{z{{{z{= z{{{{{z{{{{{z{{{{{{{z{{z{{{{z{{{{{z{{{{{{{{{{{z{z{{z{{{{z{z{{{{{{{{{z{z{{= z{{{{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{zzzzzzzzzzzzzzzzzzzz{z{z{{{{{{{{{{{{= z{{{{{{{{{{{{z{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{z{z{z= {{{{{z{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{{{{z{z{{z{{{{{z{{{= {z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{z{{{{{{{{{{z{{{{{{z{{{{z{= {{{{{{{z{{{{{{{{{{z{{{{{{{{{z{{{{{{{{z{{z{{{{{z{z{{{{{{{z{{{z{{{{{{{{{{z{= {{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{{z{{z{{{{{= {{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{z{z{{{{{{{{{{{{z{{{{{z{z{{z{= z{{{{{{{{{z{{{{{{{z{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{z{z{z{z{z{z{z{= z{z{{z{zz{{{z{z{{z{{{{{z{z{{z{z{{{{{z{z{z{{z{{{{{{{{z{{z{{{z{{z{{z{{z{{{{= {{z{{{{z{z{z{{z{{{{{{{{{{{{{z{{z{{{{z{{{z{{z{{{{{{{{z{{z{z{{z{{z{{{{z{{z{= {z{{z{{{{{{{{{z{{{{z{{{{z{{{{z{{z{{z{{z{{{z{{z{z{{{z{{{{{z{{{{z{{z{{z{{{{= z{{z{{{{{z{{z{{{{z{{{z{{z{{{{{z{z{{z{{{{{z{{z{{z{{{z{{z{{{{{{{{z{z{{{{{{z= {{{{{{{{{{{z{{z{{{{{{{{{{z{{z{{z{{{{z{z{z{{z{{z{z{{z{z{{z{{z{{z{{{z{{z{{{= {{{z{z{{z{{{z{{z{z{z{{z{{{{{{z{{z{{z{{z{{{{{{z{{{z{{z{{z{{z{z{{{{z{{z{{{{= {{z{z{{z{{z{{{{{{z{{z{{{{{{{{{{{z{{z{{z{{z{{z{{z{{z{z{{{z{{{{z{z{{{{{{z{{= z{z{{z{{{{z{{z{{{{{{{{{{z{{z{{{{{{z{{z{{{{{{z{{z{{z{{z{{{z{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{= {z{zz{z{zzz{z{z{z{z{z{z{z{z{z{zz{z{{{{{{{{z{z{{{{{{{{{{{z{{{{{{{{{{{{{{z{= z{{{{{{z{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{z{{{z{z{z{{{{{{{z{{{z{{{{{{{z{z{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{{{{z{{{{z{{{{{{{{{{{{z{{{{{{{{z= {{{z{z{{{{z{{{{{{{{{{z{{{{{{{{z{{{{{{{z{{{{{{{{{{z{z{{{{{{{{{z{{{{{{{{{{{= {{{{{{{{z{{z{{{{{{{{z{{{{{z{{z{{z{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{z{{{{{{{{{{{{{{z{z{{{{{{{{{{{{z{{z{{{{{{= {{{{{{{{{{{{{z{{{{{{z{{z{{{{{{{{{{{{{{z{{{{{{z{z{{z{{z{{{{{{{{{{{{{{{{{{{= {{{{{{{{{z{{{{{{{z{{{{{{{{{{{{{z{{{{{{{{{{z{{z{{{{{{z{{z{{{{{{z{{z{{{{{{{= {{{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zz{z{z{z{z{z{z{z{z{{{z{zz{{{{z{{z{{{{{{{z{{= z{{z{{{{z{{{z{{z{{z{{{{{{z{{{{{{z{z{{z{z{{{{{{{{z{z{{z{{{z{z{{z{{{z{{{{{{= {z{{z{{{{{{{{z{z{{z{{{{{{z{z{{z{z{{z{{z{z{{z{{z{z{{z{z{{{{{{{{{{z{{{{{{z{= {{{z{{z{{z{{{{{z{{{z{{{{{{{{{{{z{{{z{z{{z{{{{{z{{z{z{{{{z{{{{{{z{z{{z{{{{= {{{{z{{z{{{{{z{{z{{z{{z{{z{{z{{{{{{{{z{{z{{{{z{z{{{{{{{{{z{{z{{{{{{{{{{z{= z{{z{z{z{{{{{{{{z{z{{z{{z{{z{{z{z{{z{{z{{z{{{{{{{{z{{z{{{{z{z{{{z{{z{{z{{= {{z{{z{{z{{{{{{{{{z{z{{z{{z{z{{z{{{{{{z{{{{{{{{{{z{{z{z{{z{z{{{{z{{{{{{{{= {{{{{z{z{{z{{z{z{{z{{z{{{z{{z{{{{{{z{{z{{{z{{z{{z{z{{{{{z{{z{{z{{{{{{{z{{= z{{{{{{z{{z{{{{{{z{{z{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{zz= {z{zz{{z{{{{{{z{{{z{{{{{{{{{z{{{{z{{{{{{{{z{{z{{{{{z{z{{{{{{{{{{z{{z{z{{{= {{{{{z{{{{{{{{{{{{{{{z{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {{{{{z{{z{{z{{{{z{{z{{{{z{{{{{z{{{{z{{{{z{{{{z{{z{{{z{{{{{{{{{{{{{{z{{{{{= {{{{z{{{z{z{{{{{{{{{{z{{{z{{{{{{z{z{{{{{{{{{{{z{{{{{z{{z{{z{{{{{{z{{{{{{z= {{z{z{{{z{{{{{z{{z{z{{{{{{{{{{{{z{z{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{= {{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{z{z{{z{{{{{{{z{{{{{{{{{z{z{{{{z{{z{{z{{= {{{{{{{{{{{{z{{{z{{z{{z{z{z{{{{{{{{{{{{{{{{{{{z{{{{{{z{{z{{{{{{{{{{{{{{{{= {{z{z{{{{{{{{{{z{{z{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{z= zz{{zz{z{z{z{z{z{z{z{z{{z{zz{{{{z{{{{{{z{{{zzz{zzz{z{z{z{{z{z{{z{{{{{{z{{= z{{{{{z{{z{{{{{{{{{{{{z{{z{{{{{z{{z{{z{{z{{{{{z{z{{z{{{{{{{{z{{z{{z{z{{z{= {z{{z{{z{z{{z{{z{{{{z{{z{{{{{{{{{{{{z{{{{{{{{z{{{z{{{{{z{{{{z{{{{{z{{{{{{= z{{{{z{{z{{z{{z{{{{z{z{{{{{{{{{{{{{z{{z{z{{z{{z{{{z{{z{{{{{z{z{z{{z{{{{z{= {{{{{{{{{{z{{z{{{z{{{{{{{{{{{z{{{z{z{{{{{{{{{z{{z{{{{{{{{{{{{z{{z{{z{z{{z= {z{{z{{z{z{z{z{{z{{{{{{z{{z{{{z{{{{{{z{z{z{{z{z{{z{z{z{{{{{{{{{{{z{{z{{{{= z{{z{{{{{{{{z{{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{{{{{{{{{z{{z{z{{z{{z{z{{{{{z{= {z{{{{{{z{z{{z{{z{z{{z{{{{{{{z{z{{z{{z{{{{{z{{z{z{{{{z{{z{{z{{{z{{z{{z{{{= {{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~~~}}||~~}= }{{{{{{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{{{z{z{{{{{{{{z{= {{{{{{z{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{z{{z{z{{z{{{{{{{{z{{{{{{{{{{{{z{z{{{= {{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{z{{z{z{z{{{{{z{{z{{{{= {{{{z{{{{{z{{{{{z{{{{{{z{{{{z{{{{{{{{z{{{{z{{{{{z{z{{z{z{{z{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{{{{{{z{{{{{z{{z{z{z{{{{{{{{{{{{z{{z{{z{{{{{{{{{z{{z{{z{{{{= {{z{z{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{z{{z{{{{{{{{{{{{= {{{{{{{z{z{{z{{z{{{{{{{z{{{{{z{{z{{z{{{{z{z{{{z{{{{{{{{{z{{{{{z{{z{{z{{z{= {{z{{{{{{{{{{{{{{{{{{z{{{{{{z{{z{{{{{{{z{{{{{{{{z{{z{{{{{{{{{{{{{{z{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01|= |~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zz{z{z{z{z{z{z{z{z{{= z{z{z{z{{z{{{{{{{z{zz{{{{{z{{z{{zz{{{z{{z{z{{{{z{{z{{{{{z{z{{z{{{{{{{{{{z= {z{{z{{{z{z{z{{z{{{{{{{{z{{z{{{{{{z{{{z{{z{{z{z{{z{{z{{z{{z{{z{{z{{{{{z{z= {z{{{{{{{{{{{z{{{{{{{{z{{z{{{{{z{{{{{z{{{{{z{{z{{{{z{{{z{{z{{{{{z{{{{{{{{= {{{{{{{{{{{{z{{z{{z{{z{{z{{z{{z{{{{z{{{z{{z{{{{z{{{{{{{{{{{{z{{z{{z{{z{{{= {{{{{{{z{{{{{{{{{{{{{{z{{z{{{{{{{z{{{z{{z{z{{z{{z{{z{z{{z{{{z{{{z{{{{{{{{= z{{z{{z{{{{{{{{z{{{z{{z{{z{{{{{{{{{{{{{{{{z{{{{{{{z{{{{{{{{{{{z{{{{{{{{{{= z{z{{z{{{{{z{{{{{{{z{{{{{z{{{z{z{{z{z{{z{{z{z{{{z{{{{{{{{{z{{z{{{{z{{z{{{= {{{{{z{{z{z{z{{z{{{{z{z{{z{{{{z{z{z{{z{{z{z{{z{{{{{{{z{{{{{{{{{{{{{{{{{{{= {{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{= {{{z{zzz{{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{{z{{{z{{{{{{{{z{{{{zz{{z{z{{{{{{{{= {zzz{{{{{z{{{zzzz{{{z{{z{{z{{{{{{{{{{zz{{{zz{z{{z{{zzz{{{zzz{zzzzzzzz{{zz= z{zzzzzz{{{{z{{{{{{{{{{z{{{{{{{{{z{{z{zz{{{{z{zzzz{{{{{{zzzz{zzzzzzzzzz{z= zzz{{z{{{{{{{{{{{z{{{zz{zzzzzz{zzzzz{zzzz{{{{{{{{{{zz{{{zz{{{zz{{{zz{{{{{= {{{{zzzzzzzzzz{{{zz{{zzzzz{{{zzz{z{zzzzzz{z{{zzzzzz{{{{{{zzzzz{{{{{{{{z{{= zz{{{{{{{{z{zzz{{{{{zz{zz{z{zz{{{zz{{{{z{z{z{{z{{{{{{{{{{z{z{z{{z{{z{z{{{= z{z{z{{{{{z{{z{{z{{{{{z{{{z{{{{{{{{{{{z{{{{{z{z{{{{{z{{{{{{{{{{{{{{{{{{{{= {{{{{{{z{z{{z{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{{z{{{{{= {{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~~~~~~~~~= ~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{z{z{z{z{z{z{z{z{{z{zz{{z{{{{{z{= {{{z{zz{{{{z{{{{zz{{{{z{z{{z{zzzz{z{{{{{z{{zz{{{{{{{{{{{{{z{{z{{zz{zz{zzz= z{{{{{z{zz{zzzz{z{zz{{zz{{zzz{{{zz{zz{z{{{{z{z{z{{z{{{z{{{z{{{{{{{{zzz{{{= {{{{{{{z{z{{zzz{{zz{{zz{{zz{{zz{{{{{z{{z{z{{z{{{zz{zz{{zz{{zz{{z{zz{zzz{z= {{z{{zzzzz{zz{z{zzzz{zzzzz{{z{z{{{zz{{{zz{zzzz{zz{{zz{zz{{z{zz{zz{{zz{{{{= {{{zz{zzz{{zz{{z{zz{z{{z{zz{{zz{z{z{{{zz{zzz{z{zzz{zz{z{zzz{zzz{zzzzzzz{z= z{{{z{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{z{{{{{z{{{z{{z{z{{z{{{z{z{= {{{{{z{{{{{z{{z{{z{{z{{z{z{{z{{z{{z{{{{{{{{z{{z{z{{z{z{{z{{{{{{z{{z{{{z{{= {{{{z{{{z{{{{{z{{{z{{z{{{{z{{z{z{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=016=E8= T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{z{zz{z{z{z{z= {z{z{z{z{z{zz{{{z{{z{{{{z{{{{{{{z{z{zz{{{zz{{{{{{{{{{z{{{{{z{z{{{{zzz{zzz= zzz{zzz{{{{{{{{z{zz{{{zz{{{z{{zzz{{zzz{{zz{{zzz{{zzz{{zz{z{{{{{{zzzzz{zz{= zzzzzzz{zzzzzz{z{z{{zzz{{zzzzz{zz{{{zzzzz{zzz{zzzzz{z{z{{z{{{{{{{{{{{{{{z= {zz{{zz{{zzzz{{zz{{zz{{{{{{{{{{zz{zzzz{z{zz{z{zz{{{{{{{{zzz{z{zz{zz{z{zzz= {zz{zz{zz{zz{zz{z{{{zzzzz{zz{zz{{zz{zz{z{zz{zzz{zzzzzz{{{{{z{zz{z{z{{{z{z= {zzzz{{zz{{zz{z{{zzz{{{zz{{{{{{{{{{{{{{{{{z{{z{{z{{z{{z{{{{{{{z{{z{z{{{{z= {z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{= {{{{{{{{z{{z{{{{{{z{{{{z{z{{{z{{{{z{{{{z{{{{{{{z{{{{{{{{z{z{{z{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{= {{{{{{{{{z{zz{{zz{z{z{z{z{z{z{z{z{{{z{zz{{{{{{{{{z{{{{zz{z{{{{{{{{{z{{{z{= {{z{{{{zzz{{{{{{{{z{zz{{zz{z{zz{zz{{z{z{{{z{zzz{{z{z{{{{{z{z{z{z{{{zz{zz{= z{z{z{z{zzzz{z{{zz{{z{zzz{zz{z{{zzzzz{zz{z{zz{z{zz{z{zz{zzzz{z{zz{z{{{zz{= {z{zzzz{{{{{{z{{z{{zzzzz{{{zz{z{zzz{{zzz{{zz{{zz{z{z{{z{{{z{zzz{z{{{z{{{{= z{{z{{z{{{{zz{{{zzzz{{{{z{{{zzzz{{{{zz{{zz{zzz{zz{zzzzzzz{{zzzzz{z{{zzzz{= z{zz{{zz{z{{{{zz{{zzz{{z{{z{{zz{{zzz{{zz{z{zzzzzz{zz{{z{{z{z{{z{{z{z{{{{{= {{{{{{{{{{z{{{{{{{{{{{{z{{{{{{z{z{{z{{z{{z{{z{{{z{{z{{{z{z{{{z{z{{z{z{{z{= {z{{z{z{{z{{z{{{{{{{z{z{{z{z{{z{{z{{{{{{z{{{{{{z{{{{{{{{{{z{{{{z{{{{z{{{{= {{{z{{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01||~}}||~~~= ~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{zzz{z{z{z{z{z{z{z{z{z{zz{z{{= z{{z{{{{z{{{{{{zzz{z{{z{z{{{{z{{{z{z{{zzz{zzzz{{{zz{{zz{zzzz{zz{{zzzz{z{z= zz{{zz{{{{{zzz{zz{zz{zzz{{zz{zzzzz{{zz{{{{{{{zzzz{{zz{zz{{z{zz{z{zzz{zz{z= {zzzz{{{{z{{z{{z{{{zz{zz{zz{{{z{zzzz{{z{zzzz{{{{{z{{z{z{{{{{{zz{z{{zzz{zz= z{zz{{zzzz{{{zz{{zz{z{zz{{z{z{z{{zzzz{z{zz{z{zz{{z{{z{{z{zz{zzz{{{{z{zz{{= zzz{zzz{{zz{z{zzz{z{{z{zzzzzzz{zz{{zz{{{{z{zz{z{{zz{zzzzzz{zz{{zzz{zz{z{z= {z{{{{zz{{{{{{{{{{{{{{{{{{{z{z{{z{z{{z{{{{z{z{{z{{z{{{{{z{{{{{{{{{{{{{{{{= {{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{z{{{{z= {z{{{{z{{z{{z{{{{z{{{{{{{{z{z{z{{{{{{{z{{{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01= =01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{z{z{z= {z{z{z{z{z{z{{z{zz{{{{{{{{{{{{{{zz{z{{{{{{{{{z{z{{{{{{{{{{zzzz{{z{{z{{{zz= {zzz{z{zzzzz{z{{{{{{{zz{{zzzz{z{{{zz{zz{zz{{zz{{zz{zz{zz{zzz{zzz{z{zz{{zz= zz{zz{zz{z{z{z{z{{z{zzzzz{{zz{zzzzz{z{{{{zzz{{{zzz{zzz{zz{{{{{z{{{z{z{zzz= zz{{{zz{z{zz{{z{{zzzzz{{zz{{{{{{z{zzzz{zz{z{zzzz{zzzz{{{{{{{{{zz{{{zzz{{{= {zz{{{zz{zz{{{zz{{zz{zzz{{zzz{{zz{zz{zz{z{zz{{z{zz{z{zz{zzz{zz{{{zz{{z{zz= {z{zz{z{zz{{zz{{zz{z{{{z{{{{zz{z{{z{{z{z{{z{{z{{z{{{{{{{{{{{{z{{{{{{{{{{{= {z{{{{{z{{z{z{{z{z{{z{{{{{z{z{{z{{{z{z{{z{{z{{z{{{{{z{{z{{{{z{z{{{{{{{{{z= {{z{{z{{z{{z{{z{{{{z{{{{{{z{{{{{{{{{z{{{{z{z{{{{{{{{{{z{{z{{{{z{{{z{{{{{{= {{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{= {{{{{{{{{{z{zz{z{zzz{z{z{z{z{{z{z{z{{z{zz{{z{{z{{z{z{z{{{{{{{z{{z{{z{z{{{= z{{z{z{{zzz{{{{{{{{z{zz{{{zzz{zz{zzz{{{{{z{zz{{{zzzz{{z{zzz{zzzzzzzzzzzzz= {z{zzzzzzzzzz{{{{{zzzzz{zz{zzzzzz{zzzzzzzz{zzz{zzz{{{zz{zzzzz{z{zz{{{zzzz= zzzz{zzz{{z{{{{{{{{{{{{{{{z{zz{{zzzz{zzzz{{{zzzz{{z{{z{{{zzzz{{zz{{zzzz{z= zzz{z{z{z{z{zzz{zzzz{{z{zzz{zzzzz{{z{zz{z{zzzz{{{{z{{zzz{zzzzz{{zz{zz{{{z= zz{{zz{zz{zz{z{zz{{zzzz{{{zzz{zzz{zzzzz{zz{z{{{{z{zzz{{z{{{{{{{{{{{{{{{{{= {z{{z{{z{z{{{z{{z{{z{z{{{{z{z{{{{{{{{{{{{{{{{z{z{{{{{{{{z{{{{{{{{{{{{{{{z= {{{{{{{{{{{{{{{z{{z{z{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{z{{z{{{{z{{{{{{z{z{{= {z{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~= ~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zz{{z{z{z{z{zz{z{z{z{z{z{{{{{{{{{z= {{{{{{z{z{z{z{z{z{z{{z{{{{{{{{{{{{{z{{z{{{{zz{z{{{{{{{{{{{{{z{z{{{{{{z{{{= {{{{{{{z{{{{{{z{{{z{{{z{{{{{{{{{{{{{z{{z{{{z{{z{{z{{{{{z{{{{{z{{{{{{{{{z{= {{z{{{{{{{{z{{{{z{{z{{{{{{{{{{{{{{{z{z{{z{{z{{z{{{{z{{{{{{{z{{z{{{{{{z{{z= {{{{{z{{{{{z{{{z{{{{z{{{{{{{{{{{{{zz{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{zz{= zz{{z{{z{{{zzz{{{{z{z{{{{z{{{{{{z{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{= {z{{{{{z{{z{{z{z{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{z{{{z{z{{z{{z{{{{{{= z{{z{{{{{z{{z{{z{z{{z{{{z{{z{{z{{z{{z{{{{{{{{z{z{{z{z{{z{z{{z{{{{z{{z{{{{= z{{{{z{{{{{{{z{{{{{{{{z{{{z{{z{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{= {{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{zzz{z{z{z{= z{{z{z{z{{z{zz{z{{z{zzzz{{z{{z{zz{z{z{z{z{z{{{{z{{z{{z{{z{{{{{{{{z{{{{{z{= {z{z{z{{z{{{{{z{{z{{{{z{{z{{z{{{z{{z{{{z{{{z{{{{{z{z{{z{{z{{{{{{z{{{{{{{{= {{{z{{{{z{zzz{{z{z{z{{{z{{{{z{{{z{{{{z{{{{{{{{z{{z{{z{{{z{{{{{{{{{{{{{{z{= {{{{{z{z{{{{{{{z{z{{{{{{{{z{{{{{z{{{z{{{{z{{{{z{z{{z{{{z{{{{{{z{z{z{z{{z{= {{{{{{{z{{z{z{{z{{z{{zzz{{{{{{{{{z{zzzzz{{{{{{z{{{{z{z{{{z{{z{zz{z{{z{{z{= {z{{z{{z{z{{{{{z{{{{z{{zz{{z{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{z{{z{{z{{z{{{{{= {{z{{{z{{{{{{{{{{{{{{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{= {{{{{{{{{{{{z{{{{{{{{z{{{{z{{{{{z{z{{{{{z{{z{{{{{{{{{{z{{z{{{{z{{{{{{{{{{= {{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{= {{{{{{z{zz{{zz{z{z{{z{z{z{z{z{z{{z{zz{{{{{{zz{{zzzzzzzzzzzzzzzzzzzzzzzzzz= zzz{{{{{z{z{{z{{{z{{{{{{{{{{{{{{{z{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{z{z{{= {{{{{{{{{z{{{{{{z{{z{z{z{{{{{z{{zzzz{{{{{{{{{{{{{z{{{z{{{{z{{{z{{z{{{{{{{= {{{{z{{{{z{{z{z{{z{{{{{z{{z{{{{{z{{z{{{{{{z{{z{{z{{{z{{{{{{{{z{{{{z{{{{{{= {{{z{{{z{z{{{{{{{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{z{{z{z{{z{{{{{{{z{{z{{{{{z{= {{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{{{z{{{{{z{{{{zz{z{{{z{z{{z{{z{{z{{z{{{{{{= {z{{{{{{{{{{{z{{{{{z{z{{{{{{{{{z{{z{{z{{z{{{{{z{z{{z{{{z{z{z{{z{{z{{z{{z{= z{z{z{{z{{z{{{{{{z{{z{{z{{z{{z{{z{{{{z{{z{{{{{z{{{{{z{{{{{{z{z{{{{{{z{{z{= {z{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}||~~~~~~~~~~= ~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{zz{{{z{zzzzzz= z{{{{{{{{{z{{z{{z{{z{{{{{{{{{z{z{{{{{{{{{{{{z{{z{{z{{{z{z{{{{{z{{z{{{{z{{= {{{z{{z{{z{{z{{z{{z{{{{{{{z{{z{{z{{{{z{z{{{{{{{{{z{{z{{{{{{{{{z{{z{{{z{{z= {{{{{{{{z{{{{{{{{{{{z{{z{z{z{{{{z{{{{{{{z{{{{{z{{{{{{{z{{{{{{{{{z{{{{{{{{= {{z{{{{z{{z{{{{z{{{{z{{z{{z{{{{{{{{{{{z{{{{z{{z{{{{{{{{{z{{z{{z{z{z{{z{{{= {{{{{{{{{z{{z{{{{{{{{z{{{{{z{{z{{z{z{{z{{{z{{{{z{{z{{z{{z{{{{{{z{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{z{{z{z{{{{z{{{{{{{z{{z{z{{{{{z{{{{{{z{z{{{= {{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{{{{{z{{{{{{{{{z{{{= {z{{{z{{z{{{{{{z{{z{{{{{z{{{{{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00= =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zz{z{z{z{z{z= {z{z{z{z{z{zz{{z{{zzz{zzz{{z{{z{{{{{{{{{{{{{{z{{z{{z{{{{{{z{{z{z{{z{{{{{{= {{{z{{{{{{z{{{{{{{z{{{{{z{{{{z{{{{{{{{{{{{{{{z{{z{{{{{{{{{z{{{{{{z{{z{{{{= {{{{{z{{z{{z{{{{{{z{{{{{{z{{z{{{{{{z{z{{z{{z{{{{{{{{{{z{{{{z{{{{{{z{z{{{z= {z{{{{{z{{z{{z{{{z{{z{{z{{{{z{{{{z{{{z{{{z{{{{{{{{{{{z{{z{{z{{{{z{{{{{{{z= {z{{z{{{{{{{{{{{{{{z{{{z{{z{{z{{{{{{{{z{z{{z{{{{z{{{{{{{{{{{{{{{z{{{z{{{{= {{{{{{{{{z{z{{{{z{z{{z{{z{z{{z{{z{z{{z{{z{{z{{{{{{{z{z{{{{{{{{{{{{{z{{z{{= {{{{{{{{z{{{{z{{z{{{{{{z{{z{{z{{{z{{z{{z{{z{{{{{z{{{z{{z{{z{{{{{{{z{{z{z{= {z{{{{z{{{{{z{z{z{z{{{{z{{{{{{{{{{z{{{{{{{{{z{{{{{z{z{{{{{{z{z{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{= {{{{{{{{{{{z{zzz{{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{{{{{{{{{{{{{{{{z{{z{z{{z{z= {{{{{{{{{{{{z{{{{{{{{{{{{z{{z{z{{{{{{z{{{{{z{z{{{{{z{{{z{{{{z{{z{z{z{{z{z= {{{{{{{z{{z{z{{{{{z{{{{{{{{z{{{z{{{z{{{{{{{{z{{{{z{{z{{{{{{z{{z{{{{{{{{{{= {z{{z{{{z{{{{{{{z{{z{{{{{{{{{{{{{{z{{{{{z{{{{{{z{{{{{{{{{{{z{{{{z{{{{{{{{= {z{{z{{z{{{{{{{{{{z{{{{{z{z{{{{{{{{{z{{z{{z{{z{{{{z{{{{{{{{{z{{z{z{{{{{{{= {{z{{{{z{{z{z{{z{{z{{{{{{{{{{z{{z{z{z{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{= {z{{{z{{{{{{{z{{z{{z{z{{{{{{{{z{z{{z{{{{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{z{{{= {{z{{{z{{{{{{{{{{z{{z{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{z{{z{{z{{{{z{{z{{z{= {{{z{{{{{{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01=01||~}}||~= ~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{zz{{= z{z{z{z{{z{z{{z{{z{{{{{{{{{{{{z{z{{z{{z{{{{z{z{{z{{z{{{{{{{{{{z{{{{{z{z{{= {{{z{z{{{{{{{z{{{{{{{{{{{{{{{{z{{z{{{{{{{{{z{{{{{z{z{{z{{{z{{{{{{{z{z{{z{= {{z{{{{{{{z{{{{{{{{{z{{z{z{{{{{{{{{z{{{{z{z{{{{{{{z{{{z{{z{{z{{{{z{{{{{z{= {z{{{z{z{{z{{{{{{z{{{{{z{{z{{{{{{{{z{{z{z{{z{{{{{z{z{{{{{{z{{z{{{{{{{{{{{= {{{z{{{{z{z{{z{{{{{{{{{{z{{z{{{{{z{{{{{{{{{{{{{{{z{z{{z{z{{{{{{{{{{{{{{{{= z{{z{z{{z{{z{{z{z{{z{{{{{z{z{{{{z{{{{z{{z{{{{{{{{{{{z{{z{z{{{{{{{{z{z{{z{= {z{{z{{{z{z{z{{{{{z{{z{{{{{z{{{{{{{{{z{z{z{{{{{{{{{z{z{{z{{{{{{{z{{{{z{{{= z{{{z{z{{{{{{{{{{{z{{{{{{{{{{{z{{{z{{{z{{{{{z{z{{{{{{{{{{{{{{{{{{{{{||~}}= =01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{z= z{z{z{z{z{z{z{z{z{{z{zz{{{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{{{{{{{{{{{{z{{{{{{= {{{{{{z{{z{{z{{{z{z{{{{{{{{{{{{{{z{{z{{{{{z{{z{{{z{{z{{{{{{{{{z{{z{{{{z{z= {{{{{{{{{{{{z{{z{{{{{{{{{{{{{{z{{z{{{{z{z{{z{{{{{{{{{z{z{{z{{{{z{{{{{{z{{= z{{{z{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{z{z{{{{{z{{{{{{z{{z{z{{{{{{{{{{{z{z= {{{{{{{{z{{{{{{{{z{{z{z{{z{{{{{{{{{{{{{{{z{{z{{z{{{{{{z{z{{{{{z{z{{z{{z{z= {{{{{{{{{{{{z{{z{{{z{z{z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{z{{{{{{{z{{z{= {z{{{{{{{{{{{z{{z{{{{{{{z{{{{{{{{{{{{{z{{z{{{{{{{z{{{{z{{z{{z{{{{{{{{z{z{= {z{{{{{{{{z{z{z{{{{z{{{z{{{z{{{{{{z{{z{z{z{{{{{z{{z{{z{{{{{{{z{{{z{z{{{z{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{= {{{{{{{{{{{{{{{{{{{z{zzz{zzz{z{z{z{z{z{z{z{z{z{zz{z{{{z{{{z{z{{z{z{{z{{z{= {{{{{{{{z{{z{z{z{{zzzz{{z{{z{{z{{{zzz{{{{{{{{{{{z{{z{z{{{{z{{{zzzz{z{zzz{= {z{{{{{{z{zzzzzz{{{{{z{{{{{{{z{{zzzzzzz{{{{{z{{z{{z{z{{{{{{{z{{z{{{{{{{{z= zz{z{{{{{{{{{{{z{{{{z{{{{{{{{{{{{zzzzzzzz{z{{z{{{z{{z{{z{{{z{z{{z{{{zzz{z= {{z{{z{{{{{{{{zz{{zzz{{{{{{{{z{{z{{{{z{z{z{zz{{{{{zzzzz{z{z{{z{{z{{{{{{{{= {{{z{{z{{{{{z{z{{{{{{{{{{{{{{z{{z{{z{{z{{{{{zz{{zzz{{z{{zz{z{{zzzzz{{zz{{= {{{z{{{{{{z{{{{{z{{z{{{{{{{{{{z{z{{z{{z{{{{{{{z{{z{{{{z{{z{{z{{{{{{{{{z{z= {{z{{{z{{{{{{{{{{z{{{z{{{{{{{{{z{{z{{{{{{{{{z{{{{{{{{{{{z{{z{{{{{{{{{{z{{= {{{z{{{{{z{{z{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4=1C=01=01= ||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{z{z{z{z{z{z{z{z{z{z= {{z{zz{{z{{{z{{{{{{{{zzzzzzzzzzzzz{z{{{{{{{{{z{zzz{{{{z{{{{{{z{{z{{z{{z{z= {{z{{{{{{{{{z{{{{zz{{zz{zz{zz{{{z{{z{{{{z{{z{z{z{{{{z{{{z{{{{{{zz{{{z{{z{= {{{{{{{{{{{z{{z{{z{{{{{z{{z{{{z{{{z{z{{z{{z{{{{z{{{z{{z{{z{z{{zz{{z{z{{z{= {{{{{{{{{{{{{z{{{{{{{{{zz{{zz{{z{{{{{z{{z{z{zzz{z{{{z{{{z{{{{{{z{{{{{{{{{= z{z{zz{{{{{zz{{{{{{{{{z{{z{z{{z{{{{{{{{{{{{{{{{{z{{z{z{{z{{{{{{{{{{{{{z{{= {z{zz{zz{{{zzz{{{zzz{zz{{z{{z{z{{{z{{z{{{{{z{{{{{{z{{z{z{z{{{{{{{{{{{{z{{= z{{{{{{{{{{z{{{{{{z{{z{{z{{{{{{{{z{{{{{z{z{{z{{{z{{{{{{z{{z{{{{{{{{z{{{z{= {{{{z{{z{{z{{{{{{{{z{{{z{{{{z{z{{{{{z{{{{{{{{{z{{z{{{{z{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{= zz{z{zz{z{z{z{z{z{{z{z{{{z{zz{{{{{{{{{z{{z{{z{{{{{{{{{{z{{{{z{{z{{{{{z{{{= z{{{{{z{{{{{{zz{{{{{{{{{{{{z{z{{z{{{{z{{z{z{{z{z{{{z{{{{{{{{z{zz{{{{z{{{z= {{{{z{{{z{{{{z{{z{zz{{{z{{z{{z{{z{{{{{{{{{z{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{z{z{{{{{z{{z{z{{z{{z{{{{{z{{z{{{zz{z{{zz{z{z{{{{{{{{z{{{z{z{= {{{{z{{{{z{{{{{z{{{z{{zz{{zz{z{z{{{z{z{{z{{z{{{{{{{{{{{z{z{{z{z{{{z{{z{{{= {{{{{{{{z{z{{z{{z{{{{{zz{{z{{{z{z{{{z{z{z{{{{z{z{z{{{{{{{{{{{{z{z{{{{z{{{= {{{{{{{{{{z{{z{{z{{{{{{{{z{{z{{z{{{{z{{{{{{{{{{{{{z{{z{{{{{z{{{{{{{{{{{{{= z{z{{{{{{{z{{z{{{{{z{{{{z{{{{{{{{{{z{{z{{{{{z{{{{z{{{{{{z{{{{z{z{{z{{{{{{= {z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}= {{{{{{{{{{{{{{{{{{{{{z{zzz{{zzz{z{z{z{z{z{z{z{z{z{zz{{{{z{{z{{{{{{{z{{z{{= z{zz{zz{{{{{{{{{z{{zzz{{{{z{{{{z{z{{{zz{zzz{zz{zz{zz{{{{{{z{{{zz{{{{zz{{{= zz{z{z{{z{{{z{{z{z{z{{zz{{{{z{{{{{zz{{{{z{{{{zz{{zzz{zz{zzz{zzz{zz{zz{z{z= zzz{{{{zz{z{zzzz{{z{z{{z{{z{z{{z{{z{z{{{zz{zz{zz{zz{{{{zzzz{z{zzz{z{{zz{{= z{{zzzz{zzzz{zzzzzzzzz{zzzz{{z{zzzzz{{zzz{{zzzz{{z{{{zz{zz{z{zz{zz{{zz{zz= zzzz{{{{zzz{{{z{{{zzzz{z{zzzz{zz{zz{zzz{{{z{{{z{{z{{zz{{{z{z{{{z{{{zz{{{z= {{{{z{{z{{z{{{{{{z{{{z{{z{{z{{{z{{{{{{{{{{{z{{z{{{{{{{{{z{{{{{z{{z{{z{{z{= {{{{{{{z{{{{{z{{z{z{{z{{{{{{{z{z{{{{{{z{z{{{{z{{{{{z{{z{z{{{{{{z{z{{{{z{{= {{{{z{{{{z{{{{{{{z{{z{z{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}= }||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zz{z{z{z{z{z{z{z{z{{{z{= zz{{z{{{{{{z{{z{zz{{{{{{{zz{zzz{z{{z{{{{{zz{zzz{{{{z{{{{{{{{z{{{z{{zz{zzz= {zz{z{{{{{{{{zz{zzz{{z{zz{{{{{{{{{{zzzzz{{{zz{{zz{{z{z{{z{zzzzz{{zzz{{z{{= {zz{zz{z{{{z{{{zz{z{{z{{zz{zzz{{z{{{z{z{{{{{{{{{{{{{{{{{{{{zzzzz{{{z{{zz{= zzz{zz{{z{{zz{z{{{{{zzz{{{{z{{{z{{zz{{z{z{z{{{z{{{z{zzz{z{zz{{z{{zz{{z{zz= {{z{{z{{{z{{zz{zz{zzz{zzz{zz{{zz{{z{{{{zzz{{z{{zz{zz{{zz{zzz{zz{{{{zz{{{{= {{zz{{{{{z{z{zz{{{z{z{{zz{{{{{{{{{{{z{{{{{{{{{{{{{{{z{{{z{z{z{{z{{{{{{{z{= z{{z{{{{z{{z{{{{{{{{z{{{z{{z{{{{z{z{{{{{{{{{{{{z{{z{{{{{z{{z{{{{{{{{{{z{z= {{{{{{{{z{{z{{{{{{z{{{{z{{{{{z{{{{{z{{z{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{|= |~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z= {zz{z{z{z{z{z{z{z{zz{z{zz{{{{z{{z{{{{{{{z{z{{z{z{{{zz{{{{{{z{{z{{{z{zz{{z= {{{{{z{{z{z{z{z{{{z{{z{{{z{{{z{z{{z{{zzzz{{{{{z{{{{{z{{z{zz{z{{{z{z{zzz{{= {z{{{{{{z{z{{z{{z{{zz{zzz{{z{{z{{zz{{zzz{zzz{z{z{{{z{{zzz{z{{{{{{z{{z{{z{= z{{z{{z{zz{{{z{z{z{zz{{{z{{{{{zzz{z{{{{{{{z{{zz{z{zz{{zzzzz{{z{{{zz{{zzzz= z{{z{{z{z{{{z{{z{{{z{z{{z{z{zz{{zz{z{z{z{{z{{{z{z{zz{z{{zz{z{{{z{{{z{{zz{= {z{{z{{{z{{{zz{z{{z{z{{z{z{{z{{zz{{{z{{z{z{{{{z{{z{{z{{z{z{{{z{{z{z{{z{z{= z{{{{{{{{{{{{{z{{z{z{{{{{{{{z{{{{{{{z{{z{z{{{z{{{{{{z{{{{{{{{{z{{z{{z{{{{= {{{z{{{{{{{{{{{{z{z{{{{{{z{{z{{{{{{{{{{z{{{{z{{{z{z{{{{{z{{{{{{{z{{z{{{{{= z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{= {{{{{{{{{{{{{{{{{z{zz{{zz{z{z{z{z{z{z{z{z{{{z{zz{{{{{{{{{z{{z{{z{{zzzzz{z= {zz{{z{{{{{{{{{{{{{z{{zzzzzzz{{{{z{{{zz{{z{{z{z{z{{zzzzzzz{z{{{z{z{{z{z{z= {{{{{{{z{{zz{{{zzzz{{{z{{{z{{zz{z{z{{{zzzzz{{{z{zz{zz{z{z{{zz{{z{{z{{{z{z= zzzz{{{{zz{{z{{{{{{zzzzzzz{{{{{{zz{{{{{{z{{z{z{z{z{zz{z{{zz{z{z{{{{{{{z{{= z{{zz{{{{z{z{z{z{{zz{z{{z{z{{{{z{z{z{zz{z{zzz{zz{{{z{{zz{{z{{{z{{zz{{z{{{= z{{{zz{z{{{z{z{z{{{{z{{zz{zz{z{zz{{z{{{{{z{{{{{z{z{{{{{z{z{z{{{{zz{z{z{{{= {z{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{{{{{{{{z{{z{{{{z{{z{{{{{{{{{{{{{z{{= {{{{z{{{z{z{{{{{{{{{z{z{{{{{z{{z{{z{z{{{{{{{z{{{{{{{{z{{z{{z{{{{{{{{{{{{{= {{z{{{{{z{{z{{{{{{{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01||~}}|= |~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{zzz{z{z{z{z{z{z{z{z{z{zz= {{z{z{{z{{{{{{{z{z{{{{{{{{zzz{{{{z{{z{{z{{z{z{z{{{{z{{{{z{z{z{z{{{z{zz{{{= z{z{{{{{{{{{{{z{{{{zz{{{{{{{z{z{z{{{z{z{z{{{{z{{{{{{{{{z{{{zz{{zz{{{{z{z{= {z{{z{{z{{{{z{{z{{z{{zz{{z{z{{z{z{{{{{z{{z{z{{{{{{{{z{z{{z{{z{{z{zz{z{{{z= {{z{z{z{{z{{{{{z{z{z{zz{{z{{{z{z{{{{z{{{z{{{z{{{{{{zz{{zz{{{z{{z{{{z{z{{z= {{zz{{z{{{zz{{zz{z{z{z{{{z{{z{{zz{z{{{z{{{{z{z{{{z{{z{{{z{z{z{{{z{z{{z{zz= {{{{{z{z{{{z{{z{z{{{{z{{z{{{{{z{{z{{z{{z{{z{z{{z{{{{{{{z{{{{{{{{{z{{z{{{{= {{z{{{{{{{{{{z{{z{{z{{{{z{z{{{{z{{{{{{z{{z{z{{{{{{{z{{{{{{{{{{{{z{{z{{{z{= {z{z{{{{{{{{{z{{z{z{{z{{z{{{{z{z{{{{{{{z{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01 =00 =01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z= {z{z{z{z{{z{z{z{z{z{{z{zz{{{{{{{{{z{z{{zz{{zzzz{z{{zz{{{z{{{{{{{{z{{z{{{{= z{{{{z{{z{z{{{zzzzz{{z{z{z{{{z{{z{{z{zzz{{zzz{{{zz{z{{{{{zz{{{z{{zzz{z{{z= z{z{{z{z{{{{z{{zz{{z{{z{zz{{z{z{z{zzz{{zzz{zzzz{z{zz{{z{{zz{{z{{{{{{{{z{{= z{{{{{{{zz{{{{z{{z{{zz{{zz{zz{{z{zz{{{{{{{zz{{zz{zz{{{zz{{zz{z{z{z{{{zz{z= {z{z{{{{zz{zz{zzz{zz{zz{{zz{zzz{{z{z{{zz{{z{{{zz{zz{zzz{{z{{z{{zz{{{z{zz{= zz{{z{z{z{{{zz{{{{zz{{zz{{{zz{{{zz{{zz{{zz{{z{zz{{{{z{{{{{{{{{{{{{{{{{{{{= {z{{z{{{{z{{z{{z{{{{{{z{{{{{{z{{z{{z{{{{{{{{{{z{{{{{{z{{{{z{{{{{{{{{{{{z{= {z{{{z{z{z{{z{{{{{{{{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{z{{{{{{z{{z{{{{{{{{z{{= z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}||~~~~~~~~~~~~}}||~~= }}{{{{{{{{{{{{{{{{{{{{{z{zz{{{zz{z{z{z{z{z{z{z{z{{z{zz{z{{{z{z{{{{{{{z{{{= {{z{{{{zz{z{{{{{{z{z{zzz{z{z{{{{z{{{{zz{{z{{zz{zzzzz{zzzz{{{{{{{{zz{{{{{z= zzzzz{{{{{{{zzz{z{zzz{zzz{{{{z{{{{{zzz{z{zzz{zzz{z{z{{z{{zz{{zz{{zz{{z{{{= z{zz{{{zzz{z{z{{{{{{{z{{z{{{{{{z{{z{{zzzzzzz{zzzzzz{zzz{{zzz{zzzzz{z{z{z{= zzz{{{{zzz{zzzz{zzzzzzzzz{zzzz{zzz{{z{zz{zz{{zzz{z{z{z{{z{{z{{{zzz{zzzzzz= {zzz{zzz{{zzz{z{z{z{zzzz{z{zzz{zzzz{zzz{zzz{{z{{z{{zzzzzz{{zzzzzz{zzzz{z{= {z{{{{z{{{{{z{{z{z{z{{z{{z{{z{{{{{{z{{{{{{{{{{{{{z{{{{z{z{{{{{{{{{{z{{z{{= z{{{{{z{{{{z{{{{{z{{z{z{{z{{{{{{{{{{{{{{{{{{z{{z{{z{{z{{z{{{{{{{{{{{z{{z{= {z{z{z{{{{{z{{{{{{{{{z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01=01=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zzz{z{z{z{z{z{z{= z{z{{z{z{{{{z{{{{{{z{{z{zzzzzzzzzzzzz{{{z{z{{{{{{z{{{{{{{z{{{{z{z{{z{{{z{= {{{{{{{{{{{{{z{{z{{z{{z{{z{{{{{{{{z{{z{z{{{{{{{{{{{{{z{{{{z{{z{{{{z{{{{{{= {{z{{{{z{{{{{{z{{{{{{{{{{z{{{{{{z{{{{{{{{{z{{z{{{{{{{{z{{{{{{{{{{{{{{z{{z= {{{{{{z{{{{z{{{z{{{{{{{{{{z{{{{z{{z{{{{{{{{{z{{{{{{{{{{{{{z{{{z{{{z{z{{{{= z{{z{{zzz{{{{zz{{{{{{{{{{{{{z{{{{{{{{{z{{z{{z{{{z{{z{{{z{{{{{{{{{{{z{{{{{= {{zz{{{{{z{{{z{{{{{{{z{{{{{{{z{{z{{{z{z{{{{{{{{{{{{{{{{{{{z{{{{{{z{{z{z{{= z{z{{{{z{{{{{z{z{z{{z{{{{{{{{{z{{{{{z{{{{z{{{{{{{{{{{{{z{z{{z{{{z{{z{{z{{= {{{{{{{z{{{{{z{{z{z{{z{{{{{{{{{{{{{{z{{{{z{{z{{z{{{{{{z{{z{{{{{{{{{{{{{{{= {{{{{{||~}}=01=016=E8T=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{= {{{z{zz{{z{zz{z{z{z{z{z{z{z{z{z{zz{z{{{{{{z{{{{{{{{zzzzzzzzzzz{{{{{{z{{z{= {{{z{{z{{{{z{{{{{{{{{{{{{{{z{z{z{z{z{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{z{{{z{{= z{{z{{{{z{{{{{{{z{{{{{z{{z{{{{z{{{{z{z{{{{{{z{{{z{{{z{{z{{{{z{z{{z{{{{{{{= z{{z{{{{z{z{{z{{z{{z{{{{{{{z{z{{{{z{{{z{{{{{{{{z{{{{{{z{{{{{{{{{z{{z{{{z{= {z{z{{z{z{{{z{{{{{{{{{{z{{{{{{{{{{zzzz{{{z{z{z{{z{{z{{{z{{z{{z{{{{{{{{{{{= {{{{{{{{{{z{{z{z{z{{{{{z{z{{{zz{z{{{z{{{{{z{{{{{{z{{zz{z{{{{{{{{{{z{{z{{{= z{z{{z{{z{{{{z{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{z{z{{{z{z{{{{{{{{z{z{z= {{z{{z{{{{{{{{z{{{{{{{{{{{z{z{z{{{{{z{{{{{{{{{{{{z{{z{{z{{{z{{{{z{{{{{{{{= {z{{z{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{zz{{{{z{{{{{z{= {z{z{{z{{{{{{{{z{z{{{{{{{{{z{{{{{{{z{{{{z{{z{{z{z{{z{{{{{{{{{{{{z{z{{z{{z= {{z{{z{z{{{{{z{{z{{{{{z{{{{{{{{{z{{{{z{z{{{{{{z{{{{{{{{z{{{{z{{{{{z{z{{{{= z{{{{{{{z{{{z{{{{{{{{z{{z{{{{{{{z{{{{{{{{{z{{{{{z{{z{{{{{{{z{{{{{{{z{z{z{= {{{z{{z{{{z{{z{z{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{z{{{z{{z{{z{{{z{{z{{{{{{{= {{{{{{{{{{{{{{{{{z{{z{{z{z{{z{{z{{z{{{{{{{{{{{z{{{{{{{{{z{{{{{{{{z{{{{{z{= {z{{{{{z{{{z{{z{{{z{{{{{{z{{{{{{{{{{{z{{{{{{z{z{{z{z{{{z{{{z{z{z{{{z{{z{{= z{{{{{{{{{{{{{{z{z{{{{{{{{{{{{{{{{{z{{z{{{{z{{z{z{{z{{{{{{{{z{{{{z{{z{{z{= {z{{{{{{{{{z{{{{z{{{z{z{{z{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=02=A4= =1C=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z{z{z{z{z= {z{z{{z{z{{z{zz{{z{{{z{z{{{{{{{{{{{z{{z{z{{{{{z{{z{{z{{{{z{{z{{{{{{{{{{{{= {{{{{{{{z{{z{{{z{{{{{{{{z{{{{{{{{{{{{{z{{{{{{{z{{{{z{{z{{z{{{{z{{{{{z{{z{= {{{{z{{z{{{{z{{{{{{{{{{{{z{{{{{z{z{{{{{{{{z{{z{{{z{{{{{z{z{{{z{{{z{z{{{{{= z{{{{{{z{{{z{{{{{{z{{{{{{{{{z{{{{{{{{{{{{{{{{{z{{z{{z{{z{{z{z{{z{{z{{{{{{= z{{{{{{{{{{{{{z{{{{{{z{{{z{{z{{z{{z{{z{{z{z{{{{{{{{{{{{{{{{{{{{{z{{z{{z{{= {{{z{{z{{z{{{z{{z{{{{z{z{{{{{{{{z{{z{{{{{{{z{{{{{{z{{{{{{{z{z{z{{{{{z{{{{= {{{{{{{z{{{{{{{{{{{z{{{{{{{{{z{{z{{{z{{z{{{{{{{z{{z{{{z{{z{{z{{{{{{{z{{{{= {{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{z{{z{z{{{{z{{{{{{{{{{{{{{{z{{{z{z{{{{{{{{{= {{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{= {{{{{{{z{zz{zzzz{z{z{z{z{z{zz{z{{z{zz{{{{{{{{{{{z{z{{z{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{z{z{z{{z{{z{{z{{z{{{{{{{z{{{z{{z{{{{{z{z{{z{{{z{{{{z{{z{{{{z{= {{{{{{z{{{z{{{{{{{{{z{{{z{{{{{{{{{{{{z{z{z{{{z{{{{z{{{{{{{{z{z{{{{{{{{z{{= {z{z{{{{{{{{{z{{{{{{z{{{{z{{z{{{z{{{z{z{{{{z{{{z{{{{{z{z{{z{{z{{z{{z{{{{{= {{{{{{{{{{{{{{{{{{z{{z{{{{z{z{{z{z{{{{{z{{z{{{z{{{{{{z{{{{{{{{{{{{{z{z{z{= {z{{z{z{{z{{z{{{{{{{{{z{{z{{{{{{{{z{{{{{{z{{{{{{z{{z{{{{{{{{z{{z{{{{{z{z{= {{{z{z{{{{{{{{z{z{{{z{{z{{z{{{{{{z{{z{{{{{{{z{z{{z{{{{{{{z{{{{{{z{{z{{{{{= {{z{{{{{{z{{{z{{z{{{{z{{z{{z{z{z{z{{{{z{{{{z{{z{{z{{{{{{{{{{{{z{{{{z{{z{{= z{z{z{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}||~~~~~~~~~~~= ~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{{zz{z{z{z{z{z{{z{z{{z{zz{z{{z{{z{{{{= {{{{{{z{{z{{z{{z{z{{z{{z{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{{= {{{{{{z{{{z{{{{{{{z{{{{{z{{z{{{{{{{z{{z{z{{{{z{{{z{{z{{z{z{{{{{{{{z{{{z{{= {{z{z{{z{{{{{z{{z{z{{{{{{{{{{{{z{{z{{{{{{z{{{{z{{{{{{{{{{{{{{{{{z{{{z{{{{= {z{{{{{{{z{{{{{{{{{{{z{z{{z{z{{z{{z{{z{z{{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{= {z{{{{z{{z{z{{z{{{{{{{{{{{{{{{z{{{{{{z{{z{{z{{{{{{{{z{{z{{{{{{z{{{{{z{{{{= {{{z{z{{z{{{{{{{{z{{{{{{z{{{{{z{{{z{{{{{{{{{{{{{{{{z{{z{{{{{{{{z{z{{{{{{{= {{z{{z{{{z{{z{{{{{{{{z{z{{{z{{z{{{z{{{{{{{{{{z{{{{{{{{{{{{{z{{{{z{{{{{z{{= {{z{{z{z{{z{{{{z{{{{{{{{{{{{{{z{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01= =01||~}}||~~~~~~~~~~~~}}||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zzz{{z{z{z{z{z{z= {z{z{{zzz{{{{{{{{{z{{z{{z{{{{{{{{{{{{{{{{{{z{{{{{z{{{{{z{{{z{{z{z{{z{{z{{= z{{{{{{z{{z{{z{{{{{z{{z{{z{{{{{{{z{{z{{{{z{{{{{{{{{z{{{{{{{{{{{z{{{{{{{{z= {{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{{{z{{{z{{z{{{{{{{z{{z{{{z{{{{z{{z= {{z{{z{{{z{{{{{{{{z{z{{{{z{{z{{{z{z{{z{z{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{z{{= z{{z{{z{{{z{{z{{z{{z{{{{{z{{{{{{{{{{{z{{{z{{z{z{{{{{{z{{{{{{{{{{{{z{{z{{{= {{{{{{z{z{{{{z{{{{z{z{{{{{{{{{{z{z{{z{{{{z{{{{{z{{{{{z{{{z{{{z{{z{{z{{{{{= {{{{z{z{{z{{{{{{z{{z{{{{{{{{{{{{{{{z{{z{z{{{{{{{{{{{{{{{{z{z{{z{{{{{z{z{{= {z{{{{{{{{z{{{z{{{{{z{{{{{{{{{{{{{{{{{z{z{{z{{{z{{{{{{z{{z{{{{{{{{{{{{{{{= {{{{{{||~}}=01=01{{{=01=01||~}}||}}}vvvvvv}}}}}||~~}}{{{{{{{{{{{{{{{{{{{{= {z{zz{{{zz{z{z{z{z{z{z{z{z{z{z{z{{{z{z{z{{{{{{{{{{z{z{{z{z{z{{z{z{{{{z{{{= {z{z{{{z{{{{{{{{{{z{{{{{{{{{z{{{{{{{{{z{z{{{{{{{{{{z{{z{{{{{{z{{{{z{{z{{z= {{{z{z{{z{{z{{{{{{z{z{{{{z{{z{{{{z{z{{z{z{{{{z{{{z{{z{{{{z{{z{{z{{{z{{{{{= {{z{{z{{{{{{{{{{{z{{{{{{{{{{{{z{{{{{z{{z{{{{{{z{{{{{{{{{{{{{{{{{{z{{z{{z{= {z{{z{z{{z{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{{z{{z{{{z{{z{{z{z{{{z{{{{{{{z{{= z{{{{{z{{z{{z{z{{{{{{{z{{z{z{{{{{{z{{{z{{{{{{{{z{{z{z{{{{{{{{{z{{{{{z{{{{= {z{{{{{{{z{{{{{{{{{{z{z{{z{{{{{{{{{{{z{{{{{{{z{{z{z{{z{{z{{{{{{{{{{{{z{{z= {z{{z{{{{{{{{{{z{{{{{{z{{{z{z{{z{{{{{{{{z{{{{{z{z{{z{{z{{z{z{{{{{{{{z{{{z= {{z{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~}}|}}}}vvvvv|}}}}}||~= ~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zz{z{z{z{z{z{z{z{z{{{z{zz{{{{{{{{{z{{z{z{{{= {{{{{{{{{{{{{{{{{{{{{z{zzzz{{{{{z{z{{z{zzz{z{z{{z{{{{z{z{{z{{{{{{z{zzzz{{= {zzz{{z{{{{{{z{zzzzzz{{{{{z{{{{{{{{{z{{z{{{{{{z{{zz{{{z{{{{{{{{{{z{{{z{{{= {{{{{z{{{{{{{{{zz{{z{{zzz{{zzz{zzz{z{{zzzz{zzzzzzzz{{{{z{z{{{{{z{{{z{{{{z= {{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{z{{{{{{z{z{{zzzz{zzzzz{{zzz{z{{= {{zzzz{{{{{{{{z{{z{zzz{{{zzzzz{{{zzz{{{zzzz{z{{{{{{{z{{{{zzz{{zzzzzz{{zzz= {{{zzzzzz{z{zzz{z{{{zzzz{z{z{{{{{{zzzzzzzz{{{{{{zzzzzz{{z{{{{{z{z{{{zz{{{= {{{{{{{z{z{{zz{z{z{{z{{{zzzz{{zz{z{z{{{{z{{{{{{{{{{{{{{{z{{z{{{{{z{{{{{{{= {{{{{{z{{{{{z{{z{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1Dd=01=01= ||~}}~~~~~vv||||~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{zzz{z{z{z{z{z{z{z{= z{z{zz{z{z{{z{{{{{{{{zzzzzzzzzzzz{{z{{z{{z{z{{{zzz{{{z{{{{{{{{{{z{{{{{{{{= {{z{{{{{{{{{{z{{{zzz{zzzzz{zz{{{z{z{{{{{z{{{zz{{z{{{z{{z{z{{z{{{{{{{z{{z{= {z{z{{{{{{z{{z{z{{{{{{z{z{{z{{{{z{{z{{z{z{{{{zzz{{z{z{{{{z{{{{{zz{{{{z{{z= {zz{z{{{{{{{z{{{z{{{{z{{{{{{{{{{{{{{{z{z{{z{z{{z{z{z{{z{z{{{{{{{{{{{z{z{{= {{{{zz{{z{{{z{{{zz{{zz{z{zz{{zz{{z{{z{{{{{zz{zz{{zz{{zz{zz{zz{{zz{zz{{z{{= z{{{{{z{{z{z{{z{{zz{z{{{z{{{z{z{zz{z{{{z{{{zz{z{zz{{{{z{z{{{{zz{zz{{{{zz{= {{{{zz{{{z{z{{{{zz{{zz{{z{{z{z{z{{{{zz{{{{{zz{{zz{{zz{{z{{{{{{z{{{{z{{z{{= z{{z{z{{{{{{z{z{{{{z{{z{{z{{z{{{{{z{{{{{{{{z{{z{z{{z{{z{{{{{{{{{{{{{{{{{{= {{{||~}}=01=01 =00 =01=01||~}}~~~~~v|||||~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{= z{zzz{zz{z{z{z{z{z{z{z{z{{{z{zz{{{{{{{{z{{z{{{z{z{{z{{z{{zz{{{{{{{{{{{{z{= {{{z{{{z{{z{{z{{z{z{{z{z{{z{{{z{{z{{z{{{{{z{{{{z{z{{zz{{{{{{{z{{{z{z{{zz{= {{z{{{{{{{{zz{z{{z{{{{{{{z{{{{z{z{{{{{{{z{z{z{{{{{{{{{{{{{{{{{{{{zz{z{z{z= {{{{z{z{{zzz{{z{z{z{{zz{{{{{{{{{z{{z{{{z{{{{{{{{z{z{{z{{z{z{{{{{{{{{{{{{{= {{{{{{{{{{z{z{{z{{{{{{{{z{{{zz{{{z{{zz{{zz{{z{z{{{z{z{{z{{{{{{{z{{{z{{{zz= {z{{z{zzz{{{z{zz{{zz{{{{{{{z{{{{{zz{{{zz{z{z{zz{{zz{{z{{{{z{z{z{z{z{z{{{{= {z{z{{{{{{{z{z{{{z{z{zzz{z{{z{z{z{{{{{{{{z{{{z{{{{{{{{{z{z{{zzz{{z{{zzz{z= {{z{z{{{z{z{{{{{z{{{{{{{{{{{{{{{z{{z{{{{{z{{{{{{{z{{{{{{z{{{{z{z{{z{{{{{{= {{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~}}~~~~~~~~~~~~~~= ~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{zz{z{z{z{{z{z{z{z{z{z{zz{{{{{{z{{{{{{= {zz{{{{{{{z{{zz{{z{{z{z{{z{zzzz{{{{{{{{{{{{{zz{{zz{{zz{zz{zz{{{z{{{{{{zz{= {z{z{{z{{z{{z{{z{{{{zz{{{{z{{zz{{{zzzz{zzzz{z{zz{zz{z{zzz{{{zzz{z{zzzzz{z= z{{zzzzz{{zzzzz{{z{zz{z{{z{z{{z{zz{{{z{z{{z{z{{{{z{{{z{{z{{zz{{zz{zz{{z{z= zzz{{{{zz{zz{{{{zz{{zzz{zz{zzz{zzz{{z{{{{{{{{{{z{{z{{{{z{{{{z{zz{{z{{{zz{= {{{{{zz{{{{zz{{z{z{{{{z{{z{z{{zz{{{z{{{{zz{{{{{{z{{z{{z{{{z{z{{z{{{{z{{{z= z{{{{z{{zz{{zzz{z{{{z{{z{{z{{zz{{zzz{zzz{{z{z{z{{{z{{{zz{z{{z{{{zzz{zzzzz= {z{z{{z{{z{z{{{{z{zz{{{z{z{{zz{{{zz{zz{{{z{z{{{z{{z{z{{z{{z{{{{{{{{{{{{{{= {z{z{{{z{{z{{{z{{{{{{{{{z{{z{{z{{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=FF=01= =01=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zz{z{z{z{z= z{z{z{z{z{{z{zz{{z{z{{{z{z{{{{z{z{z{{zzz{zz{{{{{{{{{{{{z{zz{{z{z{{z{{z{{{= z{{{z{{{z{{zz{zz{{{{z{z{{{zz{{zz{{{{zz{{{{{{{z{{z{{z{zz{{{z{zz{{z{{{z{{{{= z{{z{z{{zzz{z{{{z{{z{{{z{{{{z{z{zz{zz{z{{zz{{{{{z{zz{z{zz{{{z{{z{zzz{zz{z= z{{zzzzzz{{{{z{z{{{z{{z{{zz{zz{{z{{{zz{z{zzz{zz{{z{{z{{z{{z{zz{{{{z{{z{z{= z{{{{{{z{{{{{{{{z{{{{z{z{{zzz{z{{z{{{z{{z{z{{{{{z{{{{{zz{{z{{{zz{{z{zz{{z= {{zz{{{{{{{{{{{{{{z{z{{z{{zz{{{zz{{{{zzzzz{{{{zz{z{z{z{{{{{z{{z{z{z{{{z{{= zzz{zz{{z{{z{{zz{{z{{zz{{z{z{z{{{{{{{{z{z{{zz{z{{{zz{z{{z{{{{z{{{{z{{{{{{= {{{{{{{{{{{{{{{z{{z{{z{z{{z{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{||~}}=01=016=E8T=01=01||~}}~~~~~~~~~~~~~~~~||~~}}{{{{{{{{{{{{= {{{{{{{{{z{zz{{{zzz{z{z{z{{z{z{z{z{{z{zz{{{{{{{{{{{{{z{z{{{{{{{{{{zzz{{z{= {z{{z{{z{{zz{{{{{{{{{{{{{z{{zz{{zz{{zz{{z{z{{{{{{z{{zzzzz{{z{z{{z{{z{{{{z= z{{{{{zz{zz{{z{z{{{z{{{zz{z{{z{z{z{{{zz{z{{z{{zz{{z{zz{{zz{{z{z{z{z{z{{z{= z{z{z{{z{{{{z{{{{z{z{z{{z{{{{z{{z{z{z{{{z{zz{zz{z{z{{{z{{{{{zzz{z{{z{{zz{= zz{{zz{z{{z{{{{{z{{{{{{{{{{{z{zzzzzzz{{zz{{{{zz{{{z{{zz{z{z{z{{{{z{{{{{z{= {{{{z{z{z{z{{{{z{{{{z{z{{{zz{{{z{{z{{z{{{z{z{{z{zzzz{{z{z{{{z{z{{{zzz{{z{= {{{z{{{{zzzz{zz{{{z{{zzzzz{{{z{{z{z{zz{{z{zzzzzz{{z{{{z{z{{z{z{z{{{zz{{z{= z{zz{zz{z{{z{z{{{zz{{z{{{z{{z{{z{{z{z{z{{{{{{{{{{{{{{z{{{z{{z{{z{{z{{{{{{= {z{z{{z{{z{z{z{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~}}|||||||= |||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zz{{z{z{z{z{z{z{z{z{z{zz{z{{z{{= z{{{z{{{{zz{zzzzz{z{zz{{{{{{{{{{{{{{z{z{zzzzzzzzz{z{zz{{z{{{z{zz{{zz{{zzz= zzzz{z{{{z{{{{z{z{{{z{{{z{z{{z{{z{{{z{{{{z{{z{zz{{{z{{{{z{{{z{z{z{{z{zz{{= {z{z{{z{{{z{{z{{z{{z{{{{{{z{zz{z{z{z{zz{z{{z{{z{z{z{z{{z{z{{{{{{{{zz{{z{{= z{{z{z{z{z{{z{z{{z{zzzzz{{{{z{zz{z{z{{z{z{{{{zzzzzzzz{{{{z{{{{z{{z{z{z{{{= z{{{{{z{{z{{z{{{{z{z{{zzzzzzz{{{z{{{{zz{{zz{z{z{{{{{{z{z{{{zzzzzzz{{{{z{{= {{z{z{{{{{z{z{{{zz{{{z{{{z{z{{zz{{z{{z{{{{zzz{z{{z{{z{z{z{zz{{{z{{{z{{z{{= {{{zz{{zz{{{{{{{{zz{{z{{zz{{z{{{z{{zz{{{zz{{{z{{{{z{{{{{{{{{{{{{{{{z{z{z{= {z{z{{{{{z{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =02=A4=1C=01=01||~}|||||||||||||||||||~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{zz{= z{z{z{z{z{z{z{z{{z{zz{{{{{{{{z{{{{z{z{{z{{{z{{{zz{{{z{z{{z{z{z{{{z{{{{z{{= z{{{{{z{{{z{z{z{{z{{{z{{{z{{{{{{{{{z{{z{zz{{{{{{{{{{{z{{{{{z{{z{{{{z{z{{z= {{z{z{{{zz{z{zz{{z{{zz{z{{zz{{{{z{{z{z{zz{z{zz{z{{{z{z{{zz{zz{{{{z{{{{zz{= zz{zz{{{zz{{{{{z{{z{{z{z{{z{{{z{{zz{{z{{{z{{z{{z{{{{{z{z{zz{z{{{z{z{{{z{{= {{{{{{{{z{{zzzzzzz{{{{{{{z{z{{zz{{{{z{{{z{z{{z{z{z{{{{{{z{zz{{z{z{{{{z{{z= {{z{{zz{{{{{z{{{{{{{z{z{zz{{zz{{{{z{{z{{{{{z{{z{z{{{z{{{{zz{{{{{z{z{{z{z{= {{{z{z{z{{z{{z{{zz{{z{{{zz{{z{{zz{{z{{{z{{z{z{{{zzzzzz{zzzzzz{z{{z{z{{{{z= z{z{{{{{z{z{{z{z{{z{{{{{{{{{{{{z{{z{{{{{z{{z{z{z{{{{{{{{z{{z{z{z{{z{{z{{{= {{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{= {{{{{{{{{{{{{z{zzz{zzz{z{z{z{z{z{z{z{z{{z{zz{{z{{z{{{{z{{{{z{{zzzz{{{zzz{= z{{{{{{{{{{z{{z{z{{{{{{{{{zz{z{z{zz{zz{{z{{{z{z{{{z{z{{zzz{z{{zz{{zz{z{{z= {{{zz{{zz{z{zzz{z{{z{zz{z{{zz{{{z{z{zz{zz{zz{zz{z{z{z{zz{z{z{{z{z{z{{{{{z= {{{z{{z{{{z{z{{z{z{{z{{z{{{z{{{{z{z{z{z{{{{{zz{z{zzz{zzz{z{z{{zz{zz{z{zzz= {z{{{zz{zz{{zz{{z{z{{{{z{z{z{z{{{{{{{{{{{z{{zz{{{{zz{{zz{zzz{z{zz{{zz{{{{= {z{{z{{zz{{{z{zzz{zz{zz{{{z{zz{z{z{{{z{{z{{{{z{z{{{{z{z{{{{{z{z{z{z{{{zzz= {{z{{z{{zzz{{zz{{{z{z{{z{{z{{{zz{zz{{zz{zzzz{z{zz{{{z{z{{{z{zz{{{{{z{z{{{= {{z{{{{z{z{zzz{{zz{z{{z{{{{z{{{{{{{{{{{{{{{z{{{z{{z{{{{{{{{z{{{{{{{{{{{{z= {{z{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~~~~~~~~~~= ~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{{= {z{{{{{z{zz{{{{{{z{{zz{{{{{{z{{z{{zzzz{{{z{{z{{z{{zzz{{{{zz{zzzzzzzzz{{{{= {{{{{zz{{{{{zzzzzz{{{{{{zzzzzz{z{{{{z{{zzzz{{zz{{{z{{z{{z{{{zz{{{{zz{zz{{= zzz{{{z{{z{z{z{{zzz{z{{{{zzz{zz{zzz{{zzz{{zzz{zz{zzzz{zzzzzzz{{{{z{zz{{{{= z{{{z{{zz{{{{z{{{zz{{zzz{{z{z{{z{z{{zzzz{{{{z{{{{{{{{{{z{z{{z{z{{{{z{{z{z= zz{{z{zzzz{{{{zzzzz{{{z{{{{{{{zzzzzz{{zzzz{{zzzzzz{zzzzzz{z{{{{{{z{{zz{{z= {zzz{{{{z{z{{{{zzzzzz{{{{z{{{z{{zzzzz{z{{{zzz{{zzzz{z{zz{z{z{{z{z{{{{{{zz= zz{{{zzzzz{z{z{{z{z{{{{z{z{{z{{{z{{{zzzz{{{{z{{{{{{{z{z{{z{{z{{z{{{{z{{{{= {{{{z{{z{{{{z{z{z{{{z{{{{{{z{z{{z{{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= {{{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zz{z{z{z{z= {z{z{z{z{{z{zz{z{z{{z{{{z{{{{{zzzzzzzzzzzzz{z{z{{{{{{{z{{{{{{{{{{{{{{{{{{= {{{z{{z{{z{{{{{{z{{z{{z{{z{{z{{z{{{{{{{z{{z{{{{{{{z{{{z{{{z{{{{{{{{{z{{z{= {{{z{{z{{{z{{{{{{{z{{{{{{{z{{z{{{{{zz{{zz{{{z{{z{{{{{z{{{z{{{z{{z{{{{{z{{= {{{{{{{{{z{z{{{{{{z{{{z{{{z{{z{z{{{{z{{{{z{{{z{{{z{{{{{{{{{{{{{z{{{{z{{{z= {{{{{{{{{{{{z{{{{{{{{{{z{{{{{{{{z{{{{{{{{z{{{z{z{{z{{{{z{{z{{{{z{{z{{{z{{= {{{{{{{{z{{z{{{z{{{{{{z{{{z{{{{z{{{{{{z{{{z{{z{z{{{{z{{{{z{{{{{z{{{{{z{{{= {{z{{zzz{{{{zz{{z{{{{z{{z{{{z{{{{{{{{{{z{z{{{{z{{{{{z{{{{{{{z{z{zz{z{z{{{= {{{{{{{{{{{{{z{{{{z{{z{{{{{{{{z{{{{{{{{z{{{z{{z{{{{{{{{z{{{{{{{z{{{{{{{{{= {{{{{{{{{{{{||~}}=01=01{{{=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}{{{{{{{{{{{{{{= {{{{{{{z{zz{{{zz{z{z{z{z{z{z{z{z{{z{zz{{{{{{{{{{{z{z{{{zzzzzzzzzzz{{{{{{{= z{z{{{{z{{z{{z{{z{z{{z{{z{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{z{{z{{{{{{z{{{z{= {{{{{{z{{{z{{z{{z{{{{{{z{{{{{{{z{{{{z{{z{{{{z{{z{{{{{{{{z{{z{{{z{z{{{{{{z= {z{{{{{{{z{{{{{{{{z{{{{{z{z{{z{{{{{{{{z{{{{z{{{z{{{{{{{{{z{{{{{{{{z{{{{{{= {{z{{z{{z{{z{{{{z{{{z{{{{{z{{z{{z{{{{z{z{{z{z{{{{z{z{{{{{z{z{z{{{{{{{{{{{= {{{z{{{{{{{z{{{{{{z{{{{{z{{z{z{{{{{{{{{{{z{z{{{z{{{{z{{{{z{z{{{z{{{{{{{{{= {{{{{z{{{{zz{z{{{z{{{{{z{{{{{{{zzzz{{z{{{{z{{{{{{z{{{z{{z{{z{z{z{{{z{{{{{= z{{{{{z{z{{{{{z{{{{{{z{{z{{z{z{z{{z{{{z{{{{{{{z{{z{z{{{z{{{z{{{{{{{{{{{{{= {z{z{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~|||||||||||||||= |||||~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zzz{z{z{z{z{z{z{z{z{{z{zz{{z{{z{{z{{{= {{{z{{{z{{{{{{{{z{{z{z{{{{{{z{{{{{{{{{{{{{{{{{{{{z{z{{z{{{{{{{z{z{{z{{z{{= z{{z{{{{{{{{z{{z{{{z{{{{z{{{{{{{{{{{{{{{{z{{{{{{z{{z{{{{z{{{{{{{z{{{{{{{z= {{z{{{{{{zzzz{{{{z{{z{{{{{{z{{{{{{z{{z{z{{{{z{{{{{{{{{z{{{z{{{{z{{{{{{{{z= {{z{{z{{{z{z{{{{{{z{z{{z{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{{{{z{{{{{{{{{{{z{{{= {{{z{{{{{{{{{z{{z{{{z{{z{{{{z{{z{{{{z{{z{{{z{z{{{{{{{{z{{z{{z{{{{{{{{{{{z= {{{{{z{{{{{{{{{z{z{{z{z{{z{{{{{z{{zzz{{{{{z{z{{{z{{z{{{z{{{{{{z{{{{z{{z{{= {{{{{{{{{{{{{z{z{{{z{z{{{z{z{{{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{= {{{{{{{z{{{z{{z{{z{{z{{{{{{{z{z{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=017=1D= d=01=01||~|||||||||||||||||||}~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{{zz{z{z{z{z= {z{z{z{z{z{zz{{{{{{{{{{{{z{{{{z{{{{{z{{z{{{{{{{{{{{z{{{{z{{z{z{z{{z{{z{{z= {{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{z{{{{z{z{{z{z{{z{z{{{{z{z{= {{{{{z{{{{{z{z{{{z{{z{z{{{{{{{z{z{{{{{{z{{{{{{{{{{z{{{{z{z{{{{{{{{{z{{{{z= {{z{z{{{z{{{{z{{{{{{z{z{{{{{{{{{{{{{{{z{z{{{{{{{{{{z{{z{{z{{z{z{{z{{z{{{{= {{z{{z{z{{{z{{{z{{z{{{{{{z{{{{{z{{{z{{{{{{{z{{{{{{{z{{{{{{z{{{{{{{{{{{{{{= z{{z{{{{{{{{{{{{z{{z{{z{{{{{z{{{{{{z{{z{{{{{{{{{{{{{{{z{{{{{{{{z{z{{{{{{{= {{{{{z{{{{{z{{{{{z{{{{{{{{{z{{z{z{{z{{z{{{{{{{{{{{{{{{{{{{z{z{z{{{{z{z{{z= {{z{{z{{z{z{{z{{{{{{{{z{z{{z{{z{{{{{{{{{{{{{{{{z{{z{{{{{{{{z{z{{{{{{{{{{{= {{{{{{{{{{||~}}=01=01 =00 =01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{= {{{{{{{z{zz{{zzz{z{z{z{z{z{z{z{z{{z{zz{{z{z{{z{{z{{{z{{{{z{{z{{{{{z{{z{{z= {{{{{{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{z{{z{z{{z{{z{z{z{{{{{{z{{z{{z{{{{= {z{{{{{{{{{{{{{{{{z{{{{{{z{{z{{{z{{{{{{{z{{{{{{{{z{z{{z{{{{{z{{{{{z{z{{z{= {{{{z{{{{{{z{z{{{z{{{{z{{{{{{{{{{{{z{{{{z{z{{{{{{z{z{{z{{z{{{{{{{{{z{{z{{= z{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{z{{{{{{z{{z{{{z{{{{{z{{{z{{z{{{{z{{= z{{{{z{{{{{{z{z{{z{{{z{{{{{{{{z{z{{z{{z{{{{{{{{{{z{z{{{z{z{{{{{{{{z{{z{{z= {z{{z{{{{z{{z{{{{{{{z{{z{{z{{{{{z{z{{{z{{{{{z{{z{{z{{{{{{{{{{{{{{z{{z{{{z= {{z{{z{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{z{z{z{{{{{{{{{{{{z{{z{{z{z{{z{{{{= {{{{z{{z{z{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||~||~~~~~~~= ~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{z{z{z{z{z{z{z{z{{z{z{{z{zz{{{{{{= {{{{{{{{{{z{{{{{{{{{z{{{{{{{{{z{{z{z{{z{z{{{z{{z{z{{z{z{{{{{{z{{z{{z{{{{{= {{{{{z{{{{{{{z{{z{{{{{{{{{{{z{{{{z{{z{z{{z{{z{{{{{{z{{{{{{{{{{{{z{{z{{{{z= {{z{{{{{{{{{{z{{{z{{z{{{{{{{{{z{{{z{{z{{{{{{z{{{{z{{{{{z{{z{{z{{{{z{{{{{{= {{z{{{{{{{{{{{{{z{z{{z{{{{{{{{{{{z{z{z{z{{z{{z{z{{z{{{{z{{z{{z{{z{{{{z{{z= {{{{{{{{{{z{z{{{{{{{{{{{z{{{{{{z{{{{{z{z{{{{{{{{z{{{{{z{{z{{{{z{{{{{z{{z{= {z{z{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{z{{{{{{z{{{z{{{{{{{{{{z{{{{{{{{{{{{z{= {{{{{{{{z{{z{{z{{z{z{{{{{{z{{z{{{{{{{{z{{z{{{{{z{{z{{z{z{{z{{z{{z{{z{{{{{= {{z{{{z{{z{z{{{{{{{{{{{{{{z{{z{z{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01= =FF=01=01=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zzz{= z{z{z{z{z{zz{z{{z{z{z{{z{{z{z{{z{{z{{{{z{{z{{z{{{{z{{z{{{{{{{{{{{{{{{z{{{= {{{{{{{{{{z{{z{{{{{{{{{z{z{{z{{{{{{z{{{{{{{{{z{z{{z{z{{{{z{{{{{{{{{{{{{{{= z{{z{{{z{{z{{z{{z{{{{{{{{{{{{{{z{{z{{{{{{{z{{{{{{{z{{z{{z{{{{{{{{{z{{{{{{= {{{{{z{{{{{{{{{{{z{{{{z{{z{z{{{z{{z{z{{z{{{{{{{{{{z{{z{z{{z{{{{{{{{{{{{{{= {{{{{{z{{{{{{{{{{{{{z{{{{{{{z{z{{z{{{{{{{z{{z{{z{{{{{z{{z{{{z{{{{{{{{z{{z= {{{{z{z{{{{{{{{{{{z{{{{{{{{{{{{{{z{{z{{{z{z{{{{{{z{z{{z{{z{{z{{{{z{{{{{{z= {{{z{z{z{{z{{{z{{z{z{{z{{{{z{z{{z{{{{{{{{{{{{{{{z{{z{{{{{{z{{z{{{{{{{{z{{= {{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{z{z{z{{z{{z{{{{{{{{{z{{z{{z{{z{{{= {{{{{{{{{{{{{{{{{{||~}}=01=016=E8T=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{= {{{{{{{{{{{{{{{z{zz{z{{zz{z{z{z{z{z{{z{z{{z{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{z{{z{{z{{z{{z{{{{{{z{{z{{z{{{{{{{{z{{z{z{{{{{{{{z{{z{{{z{{z{{z{{{{= {{{{{{z{{{{{{z{{z{{z{z{z{{{{{{{{{{{{{{{{{{{z{{z{{z{z{{z{{{{{{{z{z{{{{{z{{= z{{{{{{{{{{{z{{z{{{{z{{z{{z{z{{{{z{z{{z{z{{{z{{{{{{{{{{{{{{{{{{{{{{z{{z{{= z{{{{{{{{{{{{{{z{{{z{{z{z{{z{z{{{z{{z{z{{z{z{{{{z{{z{{{{{{{{z{{z{{{{{{{{{= z{{z{{{{{{{{{{z{z{{z{{{{{{z{{{{{{{{z{{z{z{{{{{z{{z{z{z{{z{{{{{{z{{{{{z{{z= {{{{{{{{{{{{{{z{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{z{{z{z{{z{{= {{{{{{{z{{{{{{{{{z{{z{{{z{{z{{z{z{{z{z{z{{z{z{{z{{{z{{z{{{{z{{z{{{{{{{{{{= {{{{{{z{{z{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00-=01=01||~||~= ~~~~}}}}}}~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{zzz{{z{{z{z{z{z{z{z{{z{z{= {{z{{z{{z{z{{z{z{{z{z{{z{{{{{z{{z{{{{{{{{{zzz{{{{z{z{{{{{zzz{z{{z{{{{{{{{= {{{z{{z{{{{{zzzz{{{zzz{{{z{{z{{{{zzzzzz{{{{{{{{{{{{{z{z{zzz{{z{zzzz{{zz{z= {{{{zzzz{z{zzzz{{zzz{{zzzzzzz{z{z{{zz{{{zzzzzz{{{{{{{zzzzzz{{{zzzzzzz{{{{= zzzz{z{z{{z{{z{{z{z{{{{{{{{{{z{{z{{z{zzz{{{{z{{{{{{{{{{{{{{{{{{{{{zzz{zzz= {{{{{{{{zz{z{{{zz{{z{z{{z{zzz{{{z{zzz{z{{{{{{{{{z{{{{{{z{{{z{{{{{{{{zzzzz= {{{{{{{{{{{{z{{z{{{{{{{{{{{{{z{zzz{{z{{{{{{z{{z{{{{{zzz{{{z{{z{z{{z{z{{{{= z{z{{{{zzzz{{z{z{{{zzzz{{{z{zz{{{z{{z{{z{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{z{{{{{{z{{{z{{z{z{{z{{{{{{{z{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{||~= }}=01=01=02=A4=1C=01=01||~||~~~~~}}}}}|~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{z{= zz{{{zz{z{z{z{z{z{z{z{z{z{zzz{{{{{{{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{{z{z{{zz= {{{z{{{{{z{{z{z{{{{{{{z{{z{z{{z{{{{{{{z{zz{{zz{zz{zzz{{{{{z{{z{z{{z{z{z{z= {{z{{z{{{{{{{z{{{{{zz{{{z{{zz{z{zz{{{z{{{{z{z{{z{{z{z{{{{z{{{{{zz{{z{{z{{= {zz{{z{z{{z{{{{zz{{z{{{{z{z{zz{{zz{{{z{{{{{{{{z{z{{z{{z{z{{{{{{{{{{z{{z{{= {{{{z{{z{{z{{{z{{z{{z{{z{{{z{z{{z{{z{{z{{zz{{z{{{{{{{{{{zzz{{{{zzz{{{{z{{= {z{{{{z{z{{{{z{{{z{{z{zz{{{z{zz{z{{{z{{z{{{{{{{{z{z{{z{z{z{{{z{{{{{{z{z{{= {{{{{{{z{z{{z{{{{{{{{{{{zz{zzz{{{{{{zz{{{{{zzz{zz{{zz{{z{z{z{zz{{{{{{z{{{= {{z{{z{{z{{z{z{{z{{z{{{z{{z{{z{{z{{z{{z{{{{{z{{{{z{{{{{{{{{{z{{z{z{{{{{{{= {{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~||~~~~~}}||||~~~~~}}~~}}= {{{{{{{{{{{{{{{{{{{{{z{zz{z{zz{z{z{z{z{z{z{z{z{{z{zz{z{{z{z{{z{{z{{z{{{{{= {{{{{z{{z{z{{z{{{{{{z{{{z{{{{z{{{{{{{z{z{{z{{{{{{{{{{{{z{{z{{{{z{z{{zzz{{= {z{{{z{{{{{{{z{{{{z{{{{{{{{{{{z{{z{{zzz{zz{z{z{z{z{z{{z{{z{{zz{{{z{{{zz{{= {{z{z{{z{{z{z{z{{{{zz{z{{zz{{{{{zz{{z{z{{{z{z{{{{{z{z{{{z{z{{{z{{z{{{z{{{= {{{{{{{{z{z{{z{zz{{{{{z{{z{{{{{{{{{z{{{{{{{{{zz{{z{{{{{{{{{{{{{{z{{zz{z{{= z{z{{{z{z{{zz{z{{{z{{{z{{{z{{{{{{z{{{{{{{{z{zz{z{{{{zz{{{z{{{{{{z{{z{{{{{= {{{{{{{z{z{z{z{{z{{{{{z{{z{{z{{{z{{{{z{z{{z{{zz{{{{zz{z{z{z{{{z{{zzz{{z{{= z{z{z{zzz{{{{zz{{z{{{{z{{{{z{{{{{{{{{{{{{{{{z{{{{{{z{{{{{{{{{{{z{{{{{z{{{= {z{z{{z{{{{{{{{{{z{z{z{{z{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~|= |~~~~~}|||||~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{zz{z{z{z{z{z{z{z{z{{z{= zz{{{{{{{{{{{{{{{z{{z{{z{zz{zz{{{{{{{{z{{zz{{z{{{{z{{{{{z{{zz{{zz{{zzzzz{= zz{z{{{{{{{{zz{{{{z{{{z{z{z{{{{{{z{z{z{zz{{z{zzz{{zz{{{{{{z{z{{z{zz{{{z{{= {{{{zz{{{z{{{zz{z{{z{{z{zz{{z{{{{{zz{z{z{{z{{{{{z{{{{{{z{z{{z{{{zz{{z{{z{= z{{{{{z{{{{{{{{{{zzzz{{zzz{{z{{{{{{{{{{z{z{z{{{zz{{z{{z{z{{{{z{{z{z{{zzz{= {z{{zzzzz{zzzzzzz{z{zz{{{{{z{z{z{{{z{z{{{{zzz{{{{zzz{{z{zzz{zzzz{{{z{{{zz= {z{{z{{{zzzz{{{zzz{{z{zz{zzz{zzzz{z{{zz{{{{{{zzz{{{{zzzz{zz{{zz{{{{{{z{{z= {{z{{{{z{{z{{{{z{z{{{z{{z{{{{zzz{{z{z{{{{{{z{{{{z{{{{{z{z{{z{{z{{z{{{z{{z= {{{{z{{z{z{z{{{z{z{{{z{{{{{{{{{z{{z{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{|= |~}}=01=01{{{=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{= zzz{z{z{z{z{z{z{z{z{{z{zz{{z{{z{{z{z{{z{z{{{{{{{zz{zz{{z{{z{{{{{{zzzz{{{{= {{{z{{{{{{z{z{z{{{z{{zz{zz{{z{z{{z{{zz{zzz{{{{zz{{{z{z{{{{zzzzz{z{zz{{z{{= {z{z{{z{zzz{{z{z{{z{{zz{z{z{{{{{{{{{{zzzzzz{{{{zzzzz{z{{{z{{z{{{zz{{z{zz{= z{z{{zzzzz{z{{zzzzz{{{z{z{z{{{{{z{{z{z{{zz{{zzz{zz{{{z{{z{z{{zzz{z{{zz{{z= {{{{{{{{{z{{{{{{{{{zz{{z{{{z{{{z{{z{{z{{{zz{zz{{{{{{z{zzzzz{zz{{zz{zz{zzz= {zzz{zz{z{z{{zz{z{z{z{zz{{{zz{zz{{zz{z{{z{{{{zz{{{zz{z{{zz{{z{z{z{zz{{{zz= {zz{{zz{z{{{z{z{{zz{{{{{{z{{z{zzzz{{zzz{z{z{{zz{z{{z{z{z{{{{zz{{{{{{z{{{{= {z{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{z{{{{{{{{{{{z{{{z{{z{{{= z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{= {{{{{{{{{{{{{{{{{z{zzz{z{zz{z{z{z{z{z{z{z{z{z{zz{{{{{{{{{{{{{{{z{z{z{{z{{= {zzz{{{{{{{{z{zz{{zz{z{{z{{{z{{z{z{{{z{{zz{{z{z{z{{{{{{{{{{{zzzz{{{z{z{z{= {{{{{{{zz{z{{{{{z{{zz{{z{{{{{{{z{z{z{{z{{{{z{z{{{z{{{zzzz{z{z{{{{z{{z{z{{= z{{{{zz{{{zz{{{zz{{{{z{{{{{{z{z{{{{z{z{{z{{z{z{{{{{{{z{{{{{{{{{z{{{{z{{{z= {z{{{{{{{{{z{{zz{{z{zzz{z{{z{{z{{{{{z{{z{{z{z{{{z{zzzzz{zz{{z{z{z{{{zz{z{= z{zz{z{z{{z{{zz{{{z{{z{{{z{{z{{{{zzzzz{z{{z{{{z{z{z{{z{{z{{{zz{{z{z{{z{{{= z{{zz{{zzzz{{{{{{zzzzz{{z{z{z{{z{z{z{{{{{z{z{{z{zz{{zz{{zz{{z{{z{{{{{{z{{= {z{z{z{{z{z{{z{{z{{{{{z{{{{z{{z{{z{z{z{{z{{z{{z{{{z{{z{{{z{{z{{z{{z{{{{z{= {{{z{{z{z{z{{{z{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01{{{=01=01||~||~~~= ~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{z{zz{{zz{z{z{z{z{z{z{z{z{{{z{zz{{= z{z{{z{{z{z{{z{{zzzzz{{zzz{{z{z{{z{{{z{z{{z{{zzzzzzz{{{{zz{{zz{{z{zz{{{zz= {zzzzzzzz{{{{z{z{{z{{{{z{{z{z{z{{{z{z{zzzz{z{{{{z{z{{z{{z{zzz{z{{{{{{z{zz= {z{{{z{{{z{z{{zz{{{z{{z{{z{{zzzzzz{{{z{{{{{z{{z{{zz{{{z{z{{z{{z{{z{{zz{{z= {z{{zzzzzz{z{z{z{z{{z{z{{zzzzzz{z{z{{{z{zzzz{{{{{{{zzzzzzz{{{{{{zz{{z{{{{= z{z{{{{z{zz{{{zz{{z{{{{{{z{{z{z{zz{{{z{z{z{{z{z{z{zz{z{{z{{{{zz{zz{z{z{{{= z{zz{{{{z{{zz{{{{{{zz{zz{{z{{{z{z{{{{z{{z{{z{{{z{{{z{zz{{{zz{{z{z{{{{{{z{= {{z{z{{z{z{{zz{z{z{{zz{{{{z{{{{{{z{{{{{{{z{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{z{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{z{{z{{{z{{{{{{{{{{{{{{{{{{{{{||~}}= =01=017=1Dd=01=01||~||~~~~~~~~~~~~~~~~}}~~}}{{{{{{{{{{{{{{{{{{{{{z{zzz{{z= z{z{z{z{z{{z{z{z{z{z{zz{{{{{{{{{{{{{{{zz{{{{{{{{{zz{{{{{{{{{{zz{{{{z{z{{{= {{{{{{z{z{{{z{{{z{{z{z{z{{z{{{z{{{{z{zz{{{z{{z{{{{{{{{{z{{zz{{{z{{z{{{{z{= {{{{zz{zzz{{z{{{z{{z{z{{z{{{{{z{z{z{{z{z{{{{zz{{{{{{{z{{z{z{{zz{{{z{zz{{{= {{z{{zz{{{{zz{{{{{{{z{{{{{{{{{{z{{z{{z{{{{zz{{z{z{{z{{{z{{z{{zz{zz{{{{z{{= z{z{{{{{{{z{{z{{{z{z{z{z{z{{{{z{z{{z{{{z{z{z{{z{{{z{z{z{{{z{z{z{{{z{zz{{{= z{{z{{{zz{{z{{z{{z{{zz{{zz{{z{{z{{{z{zzz{{z{z{{{z{{z{z{z{{z{z{{{{zz{{{{zz= {{zz{{z{z{z{{{{{z{z{{z{z{{zz{{{{zzzzzzzz{{{{{{z{{z{{{{z{z{zz{{z{z{{{{{{{{= {{{z{{z{{z{{{z{z{z{{z{z{{z{{z{{{{{{z{{z{{z{{{z{{{{{{z{{z{{{z{{z{{{{{{{{z{= {{{{{{{{{{{{{{{{{{{{||~}}=01=01 =00 =01=01||~||}}}}}}}}}}}}}}}}}}~~}}{{{{= {{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{||~}}=01=01=00=00=00=01=01||= ~|}}}}}}}}}}}}}}}}}}}~~}}{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{= {||~}}=01=01=FF=01=01=01=01||~~~~~~~~~~~~~~~~~~~~~~~}}|||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= ||||||||||||||||||||||||||||||||~}}=01=016=E8T=01=01||~~~~~~~~~~~~~~~~~~~= ~~~~}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= |||||||||||||||||||||||||||||||||||||||||||||||||||||||||~}}=01=01=00=00-= =01=01||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~~~}}=01=01=02=A4=1C=01=01||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01{{{=01=01|}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}= }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}=01=01{= {{=01=01zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= zzzzzzzzzzzzzzzz=01=01{{{=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01{{{=01=01{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01{{{=01= =01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{=01=017=1Dd=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01 =00 =01=01{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=00=00= =00=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{=01=01=FF=01=01=01=01{{zzzzzz{{{{{{{{{{{{{{{{{{{{{zz{{{{= zzzz{{zzzz{{{zzz{{zzz{{zzz{z{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{zzzzzzz{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zz{z{zz{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{zzz{{{{{{z{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=016=E8T=01=01{{{{z{{zz{= {{{{{{{{{{{{{{{{{{{{z{{{{{{z{{{{z{{{{{{z{{{{z{{{{z{{z{{{{{{{{{{{{{z{{{{{{= {{{{{{{{{{{{{{{{{{z{{{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{z{z{{z{{{{{{{{{{= {{{{{{{{z{z{{{{{{{{{{{{{{{{{{{{{{{z{z{{{{{{z{{{{{{{{{{{{z{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01= =01=00=00-=01=01{{{{z{{{z{{{{{{{{{{{{{{{{{{{{{z{{{{{{zz{{z{{{{{{{zz{{{z{{= {zz{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{z{{{{{{z{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{{{{{{{{{{{{{z{{z{{{{{{{{{{= {{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{=01=01=02=A4=1C=01=01{{{{z{{{z{{{{zzz{{{{zzz{{{{z= zzz{{{{{{{z{{z{{{{{{{{z{{{z{{{z{{zz{zz{zz{{{{zzzz{{{zzz{{zzz{zzz{zzz{{{{{= z{{{{{z{zz{{zz{zz{zz{zzz{{zz{zz{{{{{zzzzzz{{z{{{zzz{{{z{{{{{{{z{zzzzzz{zz= {zzz{{zz{zz{{{{z{{z{zz{{zz{{{zzz{{{zzzz{zz{{zz{zz{zz{zzz{{zz{zz{{{{{zzz{z= zzzzz{zzz{zzz{{zzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01{{{=01=01{{{{z= {{zz{{{z{{{z{{zz{{z{{zz{{z{{{{{{{{zz{{{{{{{{{z{{{z{{{z{{{z{{zz{zz{{zz{{z{= {zz{zz{{z{{{z{{{z{{{{{{z{{{{{z{{z{{{z{{zz{zzz{zz{{zz{zz{{{{{z{{{z{{z{{z{{= {z{{z{{{{{{{z{{z{{{zz{zzz{zz{{zz{zz{{{z{{zz{zz{{z{{z{{z{{zz{{z{{z{{{z{{zz= {zzz{zz{{zz{zz{{{{{z{{{z{{z{{{z{{{z{{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{=01=01{{{=01=01{{{{zzzz{{{{zzzzz{{{{{zz{{z{{{z{{{{{{{{zz{{{{{{{{{zz{z{= z{zz{{{z{{z{{{z{{z{{{z{{z{{{z{{z{{{z{{{z{{{{{{z{{{{{z{{z{{{z{{z{{{z{{{z{{= z{{{z{{{{{z{{{z{{z{{zzzzz{{{{{{{{{z{{{z{{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{= {zz{{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{{{{{zzz{{{z{{{z{{{z{{z{{{z{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{=01=01{{{=01=01{{{{z{{z{{{{z{{{{{{{zz{z{{z{{{z{= {{{{{{z{{z{{{{{{{{{z{z{z{z{{{{z{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{z{{{{{{{z{{{= {{z{{z{{{z{{z{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{z{{{{{{{{{{{{{z{{{z{{{z{{{z{{{= z{{z{{{z{{z{{{z{{{z{{z{{{zz{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{z{{{{{{{z{{{{{= z{{z{{z{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01{{{=01=01{{{{z{{{z= {{{z{{{{{{z{{{z{{z{{{z{{{{{{z{{{zz{{{{{{{{zz{{{zz{{{{z{{z{{{z{{z{{{z{{z{{= {z{{{zzz{zzz{{{{{{{z{{{{z{{{z{{{z{{z{{{z{{{z{{z{{{z{{{{{z{{{z{{z{{z{{{{{{= {{{{{{{z{{{z{{{z{{{z{{{z{{z{{{z{{z{{{z{{{z{{z{{{{zz{{z{{{z{{z{{{z{{z{{{z{= {{z{{z{{{z{{{{{{zzz{{{{zzz{zzz{{{z{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01= =01{{{=01=01{{{{z{{{zz{{zz{{{z{zz{{z{{zz{zz{{{{{zz{{{{zz{{{{{{{zz{{{zz{{{= {z{{z{{{z{{zz{zz{{zz{zz{{{{z{{{z{{{{{{{{z{{{zz{{{zz{zz{{z{{{z{{{z{{zz{zz{= {{{{z{{{z{{z{{zz{{{z{z{{{{{z{{{{z{{{z{{{z{{{z{{zz{zz{z{{{{z{{{z{{z{{z{{z{= {zz{zz{{zz{zz{{z{{{z{{{z{{zz{zz{{z{{z{{{z{{{{z{{{z{{{{zz{zz{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{=01=017=1Dd=01=01{{zzzz{{{zz{{zzzz{{{zzz{z{{zzz{z{{{z= zzz{{zzzz{{{{{{{z{{{z{{{{zzzzzz{zzz{{zzz{z{{zzz{{{{{z{{{z{{{{{{zzzzzzz{{{= {{zz{zzzzz{zzz{zzz{z{zz{{{{{zzzzzzzzzz{{zzzz{{z{{{{{z{{{{{zzzzz{zzz{zzz{z= {zz{{z{{{zzz{zzzzzz{zzz{{{{zzz{z{{zz{zzzzz{zzz{zzz{z{zz{{{z{zzz{zzz{{{z{{= {z{{{{{zzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01 =00 =01=01{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01= =01=00=00=00=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{z{{{{z{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=FF=01=01=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{zzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=016=E8T=01=01{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{=01=01=00=00-=01=01{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01=02=A4=1C=01=01{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{= {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{=01=01{{{=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01{{{=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01=01= =01=01=01=01=01=01=01=01=01=01=01=01=01{{{= --Alternative.Boundary.4eAAtte0M2YtIfF9lv Content-type: text/richtext; charset=US-ASCII Content-Transfer-Encoding: quoted-printable --Alternative.Boundary.4eAAtte0M2YtIfF9lv-- --Interpart.Boundary.4eAAtte0M2Yt8fF9oM-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.6.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Fri, 12 Jun 92 22:23:28 EDT Received: from etlpost.etl.go.jp by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Fri, 12 Jun 92 22:23:23 EDT Received: from etlpom.etl.go.jp by etlpost.etl.go.jp (5.67+1.6W/2.7W) id AA10002; Sat, 13 Jun 92 11:23:16 JST Received: by etlpom.etl.go.jp (4.1/6.4J.6-ETLpom.MASTER) id AA00452; Sat, 13 Jun 92 11:23:13 JST Received: by etlibs.etl.go.jp (4.1/6.4J.6-ETL.SLAVE) id AA13778; Sat, 13 Jun 92 11:23:08 JST Date: Sat, 13 Jun 92 11:23:08 JST Return-Path: To: nsb@thumper.bellcore.com Subject: Re: [95:taka@fxis.fujix] MIME and Header encoding RFC. From: ysato@etl.go.jp (Yutaka Sato =?ISO-2022-JP?B?GyRAOjRGI0stGyhK?=) Organization: Electrotechnical Laboratory, Tsukuba Science City Message-Id: References: <9206120510.AA06898@atrai.sala.sony.co.jp> Content-Type: text/plain; charset=ISO-2022-JP MIME-Version: 1.0 Hi. I received a message from a member of i-headers mainling list, as follows: In message <9206120510.AA06898@atrai.sala.sony.co.jp> on 06/12/92(14:07:02) you taka@fxis.fujixerox.co.jp wrote: |FXISの神戸です。MIMEとヘッダのエンコードに関するRFCが出ました。 |RFC1343は、ほとんどmetamailみたい...。 | |RFC1341(.txt/.ps) | | MIME (Multipurpose Internet Mail Extensions): | Mechanisms for Specifying and Describing the Format of | Internet Message Bodies | |RFC1342(.txt) | | Representation of Non-ASCII Text in Internet Message Headers | |RFC1343(.txt/.ps) | | A User Agent Configuration Mechanism | For Multimedia Mail Format Information | |RFC1344(.txt/.ps) | | Implications of MIME for Internet Mail Gateways | |-- |神戸 隆博(かんべ たかひろ) FXIS / Network Team. | taka@fxis.fujixerox.co.jp He says that MIME has got RFC numbers and RFC1343 is almost about Metamail. Where can I get these official RFCs? -- Yutaka Sato Information Base Section ELECTROTECHNICAL LABORATORY 1-1-4 Umezono, Tsukuba, Ibaraki, 305 Japan ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.7.msg ================================================ Return-Path: Date: Fri, 29 Nov 91 07:13:33 EST From: Nathaniel S. Borenstein Subject: Testing Multipart messaging MIME-Version: 1.0 Content-type: multipart/mixed; boundary=foobarbazola To: nsb Status: RO Message-Id: <635263359948143070.21002.1@Jeffreys-MacBook-Air.local> --foobarbazola This is a text prefix. You should be able to read this, no matter where you are. Once you've had a chance to read this, interesting things should start to happen. In particular, a picture and audio should appear more or less *in parallel*. Finally, a magicmail message should sort out the pieces. --foobarbazola MIME-Version: 1.0 Content-type: multipart/parallel; boundary=seconddivider --seconddivider MIME-Version: 1.0 Content-type: image/gif Content-Transfer-Encoding: base64 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 --seconddivider MIME-Version: 1.0 Content-type: audio/basic Content-Transfer-Encoding: base64 Subject: TV Theme songs 8vp7cnRvc29ubWxcUebUX0tM1N5bauLZ5ejv2N5772hiX1lVVFdZWWPm0dDU1+LubmZhW1VXXVlfdOnZ0tHPz9TY3/ZgV1VUV2Lw7e/0cmRcV1FPUFZeb+7g2dLOzc7U5HJfYFxYWF/66uni3el0Zl5ZXFtdZnPx4djOyMXGz3FJPkzjXFVf/NfX2dzf5vj2 fXn39OLe9k46N1zAwM1maM7wVkxLW+bQ1dzi49zW0NDX4mBAOVfHyNDcdHfe4mdbUUtHTnXYz8/U09Ta2dTQ7UhJ1cvnT0VP//fd2O9WRkI+PEVlzsC/yM7PycG+vcpFOO69zF9PbOx+YFJJOzY2MzM8X8i7u7y7uLOxtsRLQ8m+2U5KXurcWVNRRTs3My0q LkDZv7+8tq+trrHGU9i5vtxUVW3ldFJPRzszMi4qKS9Oxbu8tq6qqay31Me3v9tRT2p3X05IPzwxLi8tKSk0aMO/vrSurKuvvb+ysr/mWGH1Z0tFPz01LS4vLiwvTcO5v8K6tK+wt7evr7nJ6+7qa05DPjs4ListLS0uO9C2tsDBvbm1trKur7W9zeF8Xk1F Pjo3MSsrLSwtL027rrK9vbq1sa+trrK4v8vacVZORT88OTAqLCsrLDFnubK9wLixraysrrG4vszkaVtaW1tbXllDQlBd7GJLQj04NTg9RlJgeuna0tDV2dfQzczJxcPL6M2+u8VZPDQxMDM4P0pQWmfu3dbb4ePc0czIw7+/zta+t7rdRDg0MzM3PkhPVl58 4Nra3t/b0szIw7++w9jNu7W67EM5NjY4PEFITFVgde/k3+br4tnPy8XBwdJq28a5uc9SPzk2OD1FTVRn+Ofb2Nbe3tXOysbExMjn787FurnFbEE5PTw4Nj1aU09f4dbZ29nLzc3IysnReOrWzsXBxd1NOzU0NzxBT23h1cvL2e9pX15u8drO1tvN0c/Gv8LU fltMRkM/Pj08PT9HU23s3dbPycS+vsnMy8vBvsV3RDkxLi4zOj5FSU/XubS0srKys7S2ucJhPzQyPkc5MzAwMC8xOd2qqauqrK6xtLvLTzUxRfpMOjI5UkY6MzNdr7K2sLS1u8TdYExGPjIySeXc63xQPT7PrbPFzMjE2mlNRklOREJKbdTV5djFy7usu9No SGzb/E5EOS8qLj7nx7/DzNi9paSrtEgzPWDyUz8/PC4wOkZ76lI/SrSpr620vs5RP2DK7z88Uezc1NPV3XTCr8htSzw0KSQkLlXi139R6b2sp6y3ppicqLfhSzcnHR0jKikpIx0dJEq1qqOYkZWXnaq9xHArJztMQTstHxoaHy05b6uorKeoqbG72i86p6m8 v8s7Jyg38MG1pqm7zkU1LSceFhEorautyllGxqikn5yWmaKpuMZWNiccEw0bNC0eGB03rqGfn5eUmZqfpaiwyz4qHBcoRiQgKC09Rz47YcLHr6Whpq+5x1gsJXGtbU+8vMi4w+G4sdZeRDUtIx0bGxoisaO6v6edn6OjpJ6Yoayyy1UvIh0XDg8pLRwYIEW8 pJ2dmJGVmZykrMBlPCkaHOndKh0eKCg0RztHwcy+qKOhqa+zzi4uq6fSODhvbLevytO3x0Q9LiojHRscHB6/n7G3qZyfnZ2mp6CmtLrOVDYpHxoVDxcgGh8u5K6kn6KdlpWam5+ntc1FLiQbHicocM/qOygrKCxJW8+rpqu0s7nLTC46XsiioaSwYlZKSr/Q OjYuKSMeGxodJFN41p2Xk5ijpqmpn6Kzvuw/LiciHBQQGx0YK1Gwo6alqqeZmJydpK24yVY0IhwrLx8rab7IRDw2MzAyXL69zNrOz+o/M1TyPGquop+lqrC+3E5PRzo3NS8tLSorOT452qugnqSqrrrMYVhZT0xBNzQyLisuKy/ptauorK+1vcra19R2WlBA Pj85LiouX7mvrK+1vM1XQT9LWFdeX0pHU2VGLzq+r62vtbq7yVA/P0VAOzk5ODY6REo3Pbyspqessba7zmpLQj04Nzc2NjY+Tzs317aurK61urrCzuDreUtLcFU+MDlKNC5NvbOwtLi9y9J9VFZST1Rk6eh+7+pnT1RcUklITVNVVFlb69LPzczN0+NfVFRT Yebc5+PQy9V9Tz8/QUBBSVNq4NXW29TFv8LKzczS9XJgTlVkYFZPU1xeWVJJQUpia+jIt7O3uLvJ1vVOPDY6UVtPT0Y+PD88OtKnqa2tsrrCzWxFNS82S0o9NC43QGmsqq6ts7nG12tJPDg0MDE0Liw1WK+en5+pub/rW0Q3Mi0qKywsKzA/r5udo7XMyLmy u95EOTIsKSgoKD61tbndW8m8uLu5wcv2SEg/Li25oqeuPzVETE1HPzguJiMnMdqinZ+fs97NxctNKiQzVEw6PLCdoaOseDMuLConHx0fKCwsUJ2Sko6TrkVV2MTORi4mIh4aH0tsWL21JB9Vwaiip6+3ub/UrqWuqqmlvRweIyQuMjI1NTEwOE3NtKujnKo0 PklNTTEtMUJX07mvrqytr6u9MjhEQTUsLC88OjM+3rmup6Kr32vYzb/eTktGQjcxOU1KPWLNZM63tLS1wOZj9tzg53teSkw+KiktR7musbi7yd3i3t/Px8TXPDU4Nj5GMzXmvbW0tra5v8LBWz9Z3s3ZRDUyMDEuOtK2r7GxtcrWw73E4U5JSkpDOzY1NzI5 5sO+tLG1u8PN0971eG1eVEY/PDY1Nzvit7KxtLi+xcjS29vwYE9FQTs2OkA+O0nNu7i4urq/xM3o1NF+b/5PPjY2Ozc2RM+7t7rBwcnT0dLS315TVEc9OT9NRkltxLq4uby8xdHkdmtcT09iWUc9PTw3RN7Curq7vsHNbU9e3+lVSU5QSkQ/OT3rwrq3ur7F xcXM3X5uWElHS01HPkBDTdjHycu7vsy+v83T5uP9WElHSkc7NjU9a9PEvr27vcfSz8ra6eBeV1VJPjg0LS5D4sO7vL67t7m+w9j5Vz84NzU1Oz86PVzOt66xtri7wdlXOzIxLzI7Qk/jwN9S1sW4rq+6zFY+OzYvLTZGx6qwsLfZ4Fp1Tz40LS4vLzBFpJSd p7G4v95JNSwgHBwcHDKmk5mbn6Wnv1xNNyQbFRIdapyboqOnpamtu10uIB0YEzucrKmiqq/E0EAxKiUhHCmgmaqfoq6tqLM9Jh0aFRTVnb3IzK2oqqmlsOc6Gxyfla6+LiwvKSMgHxwsNs2LiJGWq1c0RDMoHBURDxDOj5idqb6oqK23xkMqHS0mtpK3sD1J Yy0mIB0aLKOnNJaModREqq/VQSsdHMlcHhlFqigpX7Osnpmdp5edXSQznz0ZEBMVDxgptI+LlKipi5arQxwgHRgREtCdrkYkm6RPyDK2rrr+O7OqKy0vmYytzhoZHxgXFiqdnqw0OI6RlKVduzMlHyTMwyYaCyTCITy8kY6Ynqygma88HR2j0B0RDRIRHzuo jImSoUuVjarvGx4ZEhAVxJejbBospOinra2lv1kuM8m7s8y0jqVYIBEcFxQRFryWqzHFhYWPmjQ7OSAeHSTcKhQMFD3kl5mUj5ums8CioDUbGLQ9EwwX0jkuKTWljJGfspOOujQWFQ8aXmi6np80GSasQrexsq0+LBkkmY2YsbeTsS0dEx0XEQ4UQ5+voY+C hZepJywpGhoaHTUrDwwZtpmMjpCTqMBSMuenNBstxB0PFzuwTSQpQaiNlLehjprbIxEYLs3KzjvCxhgYS8i7qrmqxRwfr5+Zj6ZmoqZKKxcZHhALCgwui4mTiIWPnz0tVysZFREPHRMKZpOcl5KVk5u2bz0pP8MbH14hSq7IttMnFxQgsZGdqo+atzISJaKg r/4tI0w5Fi9fJ3Dfy7I1LKqZnJaTuradzS0bFBoTDAkJFZuBh4qEjZ3BJSksIRwWDw4VGSeamJqSm5+irb5JLSJIyBoiuq2gvTpbIhQTHUSfkaWfkr0mN06lobnELBsbTi0dPS01ukIrsp6XlqaqnKNNqaw1IRMPEgwFDTKbhYWNiouYqkIkJyEWEg4ID1TL nJarop2fn6PDXk8mH0EdGaealZ7wNyQWDxEb4JSWqJmrL2ipl5arSycbFik0HDc3HScrLquUjo6ar7WlScGpQCgZEw8IBQ0jo4uEio+MlZ/DMzAkGg4IDBy8pK2hrbuon5uisFkvLR0cSr6elpqsPiwfFQ4PGzSllKq+nZWZnZqfvDIeGRYaOyYaHxwbMpmS ko+YpLTWo6d4tPooGQ8LCA0VIKSQiIaRj5Ccqc81HxQLBQse9Jefs7ZOtp2YnKXRLiQZFEKopJGSotopGxcQDQ8dwpKcPKSRkI+PnbUxGxoXFio5GxwPDDiXj42Lk6K0Q7OdutBOKxwLCRYcFxcvp5GEi4+PmqT+MSMPDBgcGyOdltHSL02pnJyqxzkaDySf k6KalavTLB8aEg4OEyG3n5qNjY+QkKC5TSIaExIYMiAPCRG2l42Oi5KfrlhZopu8RyAXCggXIh8eSLuji4iPk5SbrjgaDAwdJyIksJe8Py1Bs5uYpbgrFBo5s5SYmZi5Xi8hGBgRDA4PG5SHjI2Tjo+hyUQsHxsTDx4eDRsmLq2WjIuRnaKvzLWr1zUaDhwt JR0aJE3dtZiTl5yoy0InFh4+P0s8Sa6pu7LC676yvzkiGSDBt8V3zqOhvLjCYVI5LSgqJSTfr6mwvqScrLPIRl9fRyseGRs6yLm3uamftbOst7hmSEQyHxwuVFhFNm+lq6usxbi6w9c8KCw8Pz9CRv2xy9WzyMXRzsA/IyxV2MLGZFCrqcK52dNNNzUpIDDV z+rTwM2ooq6sv9FDMjIrICQ1Slla19Gqn66xvbu5zEQuKCw+RUpNRzlau8KyrbO3vdNIMjFgyM9uPDFJsbnXzM/K1WNHPjZARkJc3tvXraq0uNdnWkg4KiEvatbZ6uXYr6mzrrO9zT0vKCUvOz5W7F1OuqSqp6/Q3GFPNC88V0c6Nzg5XK+/vLK7vsz4TE5P XubX1FY1OMfP18dcTE9ANkPZu7rXYlVMZq+vvrr2RDUwM0FORExd8fTj46qktLjOxsVoODI0NDQ0NzxOUbirsqqtt8hUOztFS0ZFRDcsLNOptbq8w8nhXERdzNNNQljuTd2uwVNIRkdESkZT89bDv9L0TPStrbjA1Fg5LCYvWHZYYllcWM2qp7G61EdFUElF RzwzODw6PE21qbu9uLe84lRT8ONPT1A/Nis3yMe6vcbL18zGv8Pb6Gs8NjvhtuNNTlZMPEJa29JZVsa7x2PVsLa6vuFSNi0pKjdLbNzrZ92zo6iurrz9NTI7SVY7LjA6OTtnr622uMPCzdtiW9nE1lZJPDIzV3pS1MvUalLPurvCy+tVSTk43rbJ3UI6TkdE ZdTd09bjd1dXw6+6tLfZSz04ODYzPklQXk1GvKOmrbPG3lQ+R0c6OzgxMjo9U7mysay7zn9d295MUM7HbD02O87F481PQENATcO7x9fp+G585L27xb12NDM/R0pCR3bIxs/19r+0v7yyxVc5NTw+Ojs+PkdbY82pqKuy21pIRlRNPj8/OC41QVW6tbSvuL/Z Vunac1ppz19FPj7Sv9fuSD9GT3jwxb6/xllBT+S2sMLIYj4xMz08SElX19997+W5q7G7035SUk45OTtIXkM7SGXDrqywu95BPkdNbWxkfk47OUTkta+6zGts2dbpX1FLRUNHR0pXxrm9vdtPRkpUU2F/XVBKREBPs6qxudNSPkFKQkFEPj9AaMrPuKyvuM5s T0ZYW0w+PU9EQUZcvK6zudFUUUxFP2X9YFZER0laxbi9xNRVS/nvWv5r4O1HRkhOzrrA9/RxUldJTevaz+NNTFxs4buwvclmTlVGQkRGTEI7PEbsw6+rs7S/1+tPRkJAOzQ0O0NJUb2rr7jJaWRaUkVDT1xoaWXy276zxX9MPkVCRExh693Vy8TJ1Me2vMpm Pj5AP0BNa9LfTkdNb825uL2+zvJYSldfQjk0OD5JZNC1rbC1v8LGW0xKTE04LjA6S3LFtbe1wu1eTeXR3OllX313ee3Cu/BFPERJPkhf7uZeWeHJvr+6tLvUS0NCODk9P0xVbGFSUdm3sLa+xtftTUhSZE88ODhLaN2/srPAzt7Y39zkZ0hDRz9BRUtjz8K/ wcrdVkti3PxiXVRWVVTexLrBdkE8Slnt5FpKSUt/zb+1tbO+zO1KPzw8PDs8RlHi1eLZv7Cwub/Pb09IUU5CPzk2OU7TyL7BzMnT3c/IvcVePzw/PT5LWtjP587V9nla+dfY4/vrbvrS0sW/0dhQOTk/WupuZGlqb9G6uLGxzl5JPT4/Q0Y+PkNPTmrJysO3 t7rB08zZ/VlMRTo7NzQ8Tty8vMDM5cu/vcTL6UY+PUNUZ97CyvpvTU3n1GxWTEhe7dTEx8i6udJlRzxBR0ZNTkteaXjJv7+3s8dgQzpAWF1OQjk9RUjrw7+9t7zHzdDLyNZnTTo3OTo/Uu7QwMHKzdvVvsDM0vNQPj5KWmP21+BPUFlOW3T38/ztbGTVw7/G xL7cUEtDQ0RLT0FARFHozbqzs7O/3W1gZUU+QTk3NkXt7tLAuLO8xtLYxdlfRz5GPDo/QU/qycJ/UmfZyM2+w31oT09ZW2xfbtpnR0Bezn5282T8du3YzsK+v8HE0FJLWklISEFDOzxK9cy/trW3vNN452ZfTz86NDQ7XOXnzsjBwcnLx8fHz3lLREM/R0pN bdvK0Xvx08nIxsn0Vko/RVfy1N7l6mBr2M/pZGFORVb8283Hvsbb5XpYVFVNQT5BQEZHWdnHurS3vcbR325tU0I9PD88PFDfysbLx8rDur29xtxPOTs+PkVQZ3T4zt/szsa7x9PRf1NNR0ZKXV9Y8mhkYl7Kyu9oW1JV28fJwsfV21lVa1ZfXE1JRUhJXd/M vr++t7vEzXhtWVJMQj8+SU1R2NLs2NnLvcbLwXde70ZDTl9PUU5DT2rb4Xj179rgz8fW3HtUYGFRTkZKd9jb2Np7fOt83MnEvsthUEVDZsm/yOpKQEZBQ09X2cjKv75n4sDL121NQD42NELYuM5fz1VE8ca5vL/Ob1Q/P3RGP9njWEdMVdzGxsPCvcDKzEg/ +ExBRUFJQE/m1sO4tsta2Ng4etlIT0NIP0Bcyru2t87sw080dUs7R01ifObj2MK4tsTnz0cuU/9HXF1ZWlV7yLWsrbnS2TorOzw2RWnv7P9u3Mm8tLS3tvo0PDYvP3FrUkE6S8S0rquts3E5Pjg3Rtj7Sz4zOP26sq6srsBqRzw1MUvg+lc9Nk/Ata2ts8Ru Pjc5MT3h3l46LTbMqqGkq7t7Oy8vKi5MUFA+Lix3opyfpLHKSjUwKClHWEczJyA4n5aZn67KRS8rKDPO0U0wJh4mrZmbn63CbjYpLVvBy08xKB8fWp2bnqjEUi4iNrOst2oxJh8eL6qam5+xezUiLbyzvN04KyQgLr6inZ6mvkclIGOyt8M/KyEdJdShm5qf uE0pHS66rrJgKx8bHTmnnJqdrdE4JivPrK7LMCIcGS2km5yers06JibuqKe3OSUbFSWgmZyertwwHyTIqqq+NyYeFx+klpqfr8ovHTCxrrDXMyIdGRu6lZabprkuHPimr7tfPyccGBkxnZecpLc4H9GgqK3JVy0eGBgmuZ2coro3HT+eoKW00TghGRcidKad n630HyGqoKOt2zsmHRgeSaKXm6jMKBxqoqKnyzgjGxgcRJ+WmqXELhwwqJ+kxDsmHBcVL56Ym6bBNR02pZ6fskkmHRkVJqCbnqfFLBxKnpyerlEnGxkXIKaanqLMJB+5nqCltk4qHBsdH7ydn560JiS4n6KswT8sHxoaH2Khnp6pLCK9n5+nsWItHxoXHT2v pKCkTiDjnJugsN41JBwYGzSyp6erySQvo5qcpb8/JRwZGSm3oqGrzSUhtZuaoLtEJRsbGiiunqKszCshyZybn7s6IhscGx+0m56kyiYivJybn69KJBkZGx7Fnp+k6iEurpyaoa1LJRsbHR9IqqOlWx8+qp2bpKtxKh8bGh9Dv62juypDrJ+bo6rlLCMeGhw8 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 rLv1Pjk2M1erqmQiGx4ntaCmqa685c2mn7A2Hh0aGxwmup6eoKCbl5/HKCQgHRwbHB4qt5qSjI+ddC4sIyMgHx4dHyREl4qOnbHEOy4qKScmKCYrzauzr6agqrHFTDcuLy80yam4Ox0eNq6iqau62UxEwqOlxiYbHBkcLayeo6OpqJycqj4hIRwaGhweLaqa mZCOl64vKyUfHx4dHB4iOpqJjJSr6D0qKSYmJCMiIzWypJuapqq8dj0yLSwsLDm6rs4sH1CopquuxFI/O0qyoq4+HBsbHDumnqWmrriqnJ+7Kh4dGRobHzamm52YkJShViYmHx0cGxscIj2djIuPnl45KyYlJCIfHx8o5Z6RkKKst0s4Ly0oKisrQ7OzcS7b oKmus8tBNzk3aKmnxigaHB5GpKGorbbOyKWdqU8eHBkYGh9IpJ2fnpmVnK8uIyEcGxobGyBOno+MjZe6MS8mIyIhHh0fITeejYyZrrpGLywsKCUoJirarrnFtqGosrtiPC8zNDi/p7VGHhok+6KlqbHG5Vi3n6K2KxkaGBog+6CfoaOimZmi3yIhHRoZGhsf +52Wj4yTpDcrKCAgHx0bHSArp4uKkabYSS0rKigjIyQjN7Ospp+lqbXNTjovLjAvRa+txTAbJ76kp6u151tJ7qqfq14cGBkZIsifpaWor6Kanq0uHR0ZGBocIdOcm5aOkpzJKCghHx4dGxsfKa2Mio6Z2T0vKSgmJCAhICjLppyTnq+w7EE0LysrLC/frbfy JyevpayuvFU+Pj/Fo6a8KxcZGiW6oKerrbuxnZym1h8bGRgaHCe/nJ6ckpGapzYjIx0dGxsbHiuwj4qNk68xLiglJCEeHR8hPKeWjZaytmM3Ly0qJykoNLmuvGQ5rKWysctLNjc4R62ks1seGB0qrqKprbbIzqicoq4vGRoXGBwrsp+hoZqUmJ/DIh8dGxoa Gx0trJSNjZGePSkqISEfHhsdHyyskIuPo8dpMy0sKSUkJCdirrKvraqosrzhRjUwMTLWqbHGMxkcNqymrK/I71W7n6Cqzx4WGBccMqmipqWkmZiepzcdHRkYGhsdMqaYkI2RmbgpJyIeHh0bGx4mto6Kjpa+PTEoKCYjICEgMLeuppidsrLLSzkvLCwsObWu v9onHVOprK+260hCYaqfqbI0GBcZHUWmpquprqGZnaK8IhoaFxkaHjyinJiOkpmiPiEhHRwbGRodJL6Oio6QpjUtKSQkIB4dHibVqp+Pkq681ToyLSooKS3ur7u+ZCzZprK1wUw5OT6/o6iy2SEWGR9+payws7+xnZ2kqzwaGBcXGh9foqGdkpKbnrUnHR0a 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 Kz2qmJyfprDA1VY/OSkeJykkKjGympqdoK3F60AqMD0sKiQjJi+2mZieoa9NQNlIPTQsKCQmKTHInJmkq6m43mZAOTEuKyglJSxLp5mcoKm+8E9IPjkwKSYiHidkopidoaq6z/hWPTYvJSEnJio/p5mcn6Wwy2ZROC4yLSYkIyY1q5ianqay0UVKRTYvKiQi JCc2r5qanqazv31NPjQuLCcmJiYuuZubnqKuxV5IPzk1LygkJScsyZuZn6Ovw/hWTTwyLiomJCUrX5+an6GrudVRRj84LiglISMnQaKZnZ+pus7kTjk1LSciICMnQaOYnJ6irtRfSjgyLCklJCYoOamWmJ6nst5OPjcyLiwmIyQqRqybmqCnt99URT84MCwp LCokL7mcnKGlscPvTD86QD0mIiQiKtKdm56grb/q18o8LS0kISAiKd+cmZ6gp6nDP0MzLSkkISElKlqfmJearrz9PjowLiooJSIkKsqZmZ6grb5bRj05Ni4rJis8KzWlmp6jqrvhX0c7NjdQLx8kIy6wm52ipbLOXVfF2SoqJB8fISy5mpqfo62trEk2Nioo IR8fIy67m5mZlqfh9Dw2LisoJCQjJCy4kpOioa/PSjw3Ly8sJyQmPVxPn5qhpbHITUdANjAvPE4jHyg6pZyfpau55ExHark9IiUfICE2qZucn6ezuqq4LzMrJSAeHyE2qpmcnZmd8kU/LiwnJiAgIyQwrJKOnaqvY0M2MiwrKyYiJDG5qJ+aoqi56kU8PDUv LC5aQB8q1J+do6a0wmlKPj/CvSYfIh4kQqKcn6Grvde1p0ooLSEfHR8hP6KanaCemq02Py4pJiIfHiIlPaWVj5Ksuuo6Ni0rKCgjIiMqtpWYn5+tv089NTMwLComN8YvJ7Cdn6WrvvZQPzs0SrNMHSEgJc6fnqOlsMRm4qquLCclHR4eJF+em56hqZ+d7y81 KCUgHh0gJ2OemZWOnfVwOS8rKCUiISAjJ8aPjqGjrd9ENjAtLSooJCjpvTytmqKnr8tMRD43NDPbti0dJCu5nZ+mqrbXWk3Fps4jIh4cHibJnpyhpa+vn6c1LCshHh0dHinInJqbkpS2Pj8uKScjHx8gIirFkoqWqK7ePDQvKiopJiMkN6+opJugqrbgQDk5 My8tNsLLJCA4rp6jqbHCa0lBSbOpNh4fHR0qt56foqi2w6yevCopIx0cHR4qtZubnpqUnU44MSglIh4dHyEsu5aMjp+84jgvLCgmJiIhIinDmJWdoqrBWzszMy8tLCpAtFYkQ6Wfpqq52k9BPzpyqrclHh8eL6yeo6Stu9nJpKFOJiQdGx0eLK6bnZ+jnJiu Ni8pIh8dHB4gLa+Zko2UtVI8LSsoJCMgHyElRZeMl6Wpykk5MC8uKyonKs+vTFufn6qswllDPDk4N8ysUx8eITGon6eossx7W7ygrDAfHhscHy+qnKCiqKucncgtKiMeHRwdITGrmZmRjp9eOTIoJyMgHx4gJTqcio6frsk8My8rKykmIyQzs6utn5+qs85E Ozg0MDA5vbM2HiNJp6CprLvlT0tgr6HDJR0dGx85p52ipa24qpukRCckHRscHCA3ppqdmZKXtDcvKSMiHh0dHyQ7n4yLlazuQS4tKigmIyEhKN+fl5mjqLf9PzY1Ly4tLEOxvi4mz6GlqrDGWURCP+moqjweHB0fTKOfpqq2ycSjnbUtIB4aGxwhQ6Kcn5+a lZ/4LCoiHx0cHR4lTp6QjI6ffjwwKikmJCAfICQ3oI6Poay6RzkvLywqKSgq2q3POrueqa247UY6Ojk6w6a+KxweI9ygpKiuwdtouJ6j9CMdGxocI9yfnqKkppqarDkmJB0cGxweJeicmJCNmLkyMCglIyEeHR4iLaiLi5mtxEIwLiwqJyYkJDOyrK+noKiy v1M+NjU0ND+xrV8kHS27oKertdpYTnarn7AxGxsaGye9nqOmqbKlmp/EJyIeGhsbHie9m5uYj5SjQysrIiEfHRweIi6rjIqQoXNHLiwqKCUiISEo0aSclqKqs+5DNTEtLi0vXa67PiExqqWrr79SQT9Cy6Sn3SEZHBstrp+nqq+/uJ6cqkEeHhoZGx4tr5ue nZWTnLcsKCMeHhwcHCAxqI+LjpnNNDAnKCUjHx4fIzyjko6bsbVOODEuKykqKS+9rsRASqOmr7PRRzY6OUKxpLg5GxsfOKahqa+70eOsnKO9JhobGBsfO6eeoaOelpqmTCIjHRsaGxwfP6KUjY2VqjAsKCMiIB4cHiEtpY2Lk6rGTi8uLColJiYmSq2vrqql qLS/WDsvLzEyZ6qv2igaJN+kp6y13llNyqKfrUUbGRkaIeSho6anqp2Zn7MpHx4aGhocIeedmZKNk55XJyggHx4dGxwfLKiLio+dfD4tKSgmIyAgIS64qJ2Voq616kAyLiorLDa8rr5YICmxpquvvVc+Pk+voKm9JRgaGii2n6errrepm56nUx4cGRgaHCe8 nZ2ZkJOcrisjIB0dGxobHi2mjIqOlb0xLSYkIyEeHR4n3aKWjZmyuFQ2LiwoJygsT7G2vkc7qaexttFDMzQ416eot0MbGBwtraOqsLvPvaCdprUoGRkXGRwvrZ+inpaUnKJcICAdGxoaGx40oo6LjZKjNSonISAgHx4hKd6cko+Yvj4yJycpKyouNfqknqGi yzxJOzYwLSwzRsSqo6OqaigtNTxRXVRMXc+5rqqqwyomKy07VNrAta+wtrOwwS4lLCsuOUf6vK6opqapujIgJyouOT9EbMKzq6ejpcQrJycoMDtHZs3BuLCrqLJBNz02NDU7SN/At7Syr7o8LjxCWezzUVDtyLy2sLg/JiwxPWjMvru3u8K/urtdKiktLjpN 2r6xq6qrrrfmKyUsLjc/SGXJta2qp6evRCcqKy45RFTnybu1rqqrwDc3NzE2O0FQ2MG7ubSzxzg1SEpZXk1KXtnHvbi2yjQqNT5Wz8XFwcHEwr67wT8pLTE5T9bEuK+ur7S7xEYnKS8xOkBO3bqvq6mqrcktJistNT5IUPXGua6rqaxtMjUwMjo+R2LPxL+7 tLDMPEpVUltJREtvz8S+vL9rLzRMXcnFyM3Y1tDMxsHcMSkwOE7Pxbq2tLW9x8reNSgtMjZAT96+tK2srrC8RCgqLjM/R0xfzrqvrKqquD8vMS84PURT99HHv7eusu9BTUpFPz1BTPzNx8S/wFc4RV3ez9jxWF3n1szBv2cvMT5L6dDBvry7w8zKxl9i5snL 3XllZu/b3n5fVk5LTWNy78zGz9/p7m9idO/3WU9PTFZv38i/xdtfXWn/9u/iX0xOUV3t1snK0OB5amT48m75a1JTWl9cXtrLzeVxallj6eXd4mNORkpTZuPPzexjcnXt1NDXcVROTlFXduDPyM/f3Nvf7O/p9GBOTU1OYdzJw8vfZFZbbuXq9F9JSE1WddbH yN5nXWtu9tzs+XNYU1llcnXZzdHtXm1obtzW2N9sWU5PYOjMys/7VF1269bT1nlOTFBkeOfQ09nvYm/z6ehramRaVFJfYm3XzM7be2pVU2ju5G9dTkpXet/NxMffXF9z7eng6WNZVVhp5dvY1dDY5/x1bV9mcW5gWFhXVWTfysjV9ltXW2j37eptUE5Z+NrX y8zhbF5kZmp6Y15ma/f87OHp0svO42ZhVU9f/d3feG9faujazMnQckxOVWXr7ef9W1tk/evn2tvmcl1mXmBzaXL9Z1pZXl1h3svI2WReWVp84uLvZlBNWuzRyMTH3VlWX2Ns/mlXUlRj7uTb1c/P3GhXWVVRW2z182FdZWrw1cjJ2GRNT1p82drrblNQXu/d 2M3S911b/uft3+xubGZmZ3n3et3Q1OdfYmpm7t/h/11XT1Z23szL2W5PVGnz5e15Wk1PW/bd4NbT335hY2JjaWBfbHBxannl4c/Fx9pjWFRWbt/d9GBaWWfcz83Kz3VNTVxrdnR0ZVtfevPq4OHd2eJyYFtdZ3ro3+1mYF5eetvLyNlkV1Zf79nd621TUV/o 0M/Ny91jW2RkZXxoXGFn+e3w29jTzdJ8UlJPTV355eZlX2Vm59TOzttfSUpWauLl9fVeWmzv39rU1NzwZW52aPH4cu32aGVz8OXSyMjVX1ZWT115a2FdU1Be48/IyMvdU0xVWFljYltbX3be1tLNztHcZU9QVVNaavTkf2nw5d7QyczdZU5NVmnn431zXlRk 4tfWzs7jZFddbmZsc1xcXlxfft/h1szQ4V5UW1VYZ2lfWVdWX+PTysfS6llOWWNpbnJoXF504M7Py8jU6GdYV1teXWJyfvN8+tve2M3T/FhPT1JcbvDvcXRoaOTX2NLU9ltYXmx+ee/3aWpuanzj4NfR2ev8bHJ6am98bltbX2nn2MzHzuD2ZF9jZV5ZWVNU YfzXz83Hz+9oXlZPU1ZYX19len7b1tfO0/lWUlNTXW196nds/m/o2dXS1+tiYXf+5d7m4m5bX2Boe+ba1t3+cX9v/v1maV1PTVNd/trOy8/rd3RfZGxhWFZRU2bk0srIyc/6XmJdVVlcW2NpceXY0s3Nz9b4WFRWVF1udPX6a/rm4NnS1eVuWVplZm1+Z2Vf VFpu7urd19vje236bGFmWFdZVVRc/uPRycvP3v7zbV9nYFlWVlt62tHMx8vR5GdqZVlTUlJVXGN63djTy8/Z7V9WU1FWXmJob3F94Nzazs/eb1xcZGZrfH1ubGZn8+Hk3NTZ3+379fZ6em1fXFpZXvji08rM1N3s+25eW1hVT09XZt7UzsfJ1ORuYllRTk1P UFdl/dnOzcjL23ZdV1FSV11qbHHp39XP0M3P42BZXmVud3b2fWlvbvvq7uTf63Ft+fn17XtvXlNTVVtq79fNz9vl297q/WNZU01MU2Ho183JytHe4O5tYltTUlBWafDbz8rIy9r9cG5eWlxbXltba+vc19PQ1+plXGFgZGtjYWdhZm787ujc4/hqbPd6b/Z8 bGZcXWB48ebW0dXf6d7f7+95Zl1ZV1lp69vPztPc8fl1ZF5bVlFRVmB+49rOzdbmdnFsY11bWl5iZGvx3dvSztXpb2ViYGl5b2prb27+5N3Wz9bvaWz3fXN6e29nY2Nm++nl2Nbd7Pz09/51aWJaVVZWYfzez9DZ5/R9bGZjXVxXUVVd/eHZzcrR4fh+bWlq X2FmaG1z6NbRzs3X9GdnXVtndHlqXmRqdOnh2tnhaVljbXB8ff79Z2Fka/jn3tvd6f309X7v+m5qXVZZX2zr1MvN1+jk5n15cV9cV09SYurZ0MvL0+v7/2JdXllWW11hbPPd08/S3W5dYFtWX2xvaV5fa/7q3dbb6mdYX2119fPy7nptcfTs5djZ3+j79v50 7+rw/mpdWV9pcd/V2ettcP5zePh0YlpUUFz65djR1Nvs9/N3a25qXlxfYmzs39PN0Nrqdm5mX2f99XJlYGrs4NrR2OxrXl9r++vo7XRlYV908u/g6HBob399ffTr7HNgXFVZYWTx3eP/cXr+9uzq7mpXU1BZ9t7Vz9fg5+Pn6uv4e2JWWmFs7ODY0Nbm+3lk Xl9eanVkXmBn8eHc2N10Xl5bYfjl4+h3am9v+unp5OpqXm/28uff3t/wZ2RiaHz159ze7+7s9ejh6O9tWlhYXfzc1dbefXj0fXb8cmZdUlVifebd2dnffmZpX1peXV9ramhufunb1dfe/19gXl1/4N7g83j159/c2NzwZFlgfffp4eXp+2pmaWxrevx9/3F0 +3j75OPycWFcXGNy39LW3vdy/fp/7/BuXlhYaOXa0s7U3vJ0cG1maW1maHX+7t/d2tHU4XhfWlhXY+3m7PN6cfXj4NredFpSVGB3693h/G1sZ2x/fPPvbmZpb/Xv7uLd6XVsY2N4893P1N3rfn306unsb1pWV17r2tLP235lZ2Zna2hmXlhdcPTd2trV2e5q ZF9eYmh+7fv7f3Lu3dnW3HtcWl1n7d7a3vptcnvy4d/g7WdaYXns39/i5/BuaWhmb3nx5Ot4dHJv/Ojn8nRdWFhbb+XZ1eFtX2ZwdvT8aV1YXG7v2tPR0trrb21uamxydPf69Ojr49zU1eB5W1ZYW2zt6up7am977Obf4XdcU1hqfuXe4uz8d3F1/v726e78 a239/fHk3uh+aF5eaPbc09TefWpv+/Hs7HBdV1tq69zSz9frbmNgZWRiZmJkZ2z25t7a1df1YFdSVFhi+/Z+c2xy9eDd2t5zW1ZceOzi3OLveX348OHg4N/wdm9v+fj79PV4ZWNgX27x3tbd72teX2VwdHBlWVZecODW0M7a8mhiY2VraGBeX2vy5NfT0tDX 6WleWlhcavju9/Lu7eLX1Nbc/FtTVl5t++nteGx08ere3ODwaFxbXWVzev54cmdnbXL57uPf7HNnYGJpf+71/WpiZ37e1dDP2vJta3d4+/ttYV1je+rZ09TW4v5gW1xaWl1jamtv9Ozf2dTU4HxcVVVda/fs6/5ve+3f29nb7mddX2/25uLn7v51b3rz6+nh 3+n8fPz89e7q+mxfW1tl7dzU09v3a2hub29xZFpUWGby29TT2ed2Y15gYF9fYWVmbPHk29bT1N/+ZF5fZnjs5eTueP/t3tra2+5lW11p/u3o93BjXWJr9unn5Ot6bG/6/Hx9dm1gXF9n+t/W0NPd/GdobHJzbmhgXWT/39LNzdXpbGJkZ2tsZ2VmZnvl29bU 1druZVtaXWJrcnZ4bmx18eDa2uD8X1ldZXT8+m9iXV5s/Orj4ebzdG7/7erv9XhybGdv++fb1dPY4vN3dnN3empfW1pfcefZ1NPc9GlkamhiYV1bXF5x69zV1NXc6HZmYGBfZWhqbm/+8eLa08/Y7WpfYWpx+fT9bWZr/uTb2trf9G5qefXyfGxlXl9ka3rs 4tva4vF6dW1rZmZgWlZXXm7p29XV3fhrZGZpZWBcW1xo9N/Vz8/S3PF2bGhmZ2prbXB27+be2tra5GxcWl1lbXp7b2piaW/z4uHk8G5laXzu6ev9bGJeZm157efi4ury9Ozp7fhya2VeYGr84NnU1dzrfHh0endqYF1cZHjr3NjX2+lwZ2traWViX2JlbH3w 5eHi5+9tX19iZ21zcWxoZmpy9N/b3OP7cn/u5uXo83ZpYmz97eTf3uPv+vLu7PJ6Zl5dWlxjcu/i3N7p/H3/fHd8bWFdW2Fu8N7Z19rl/HX7+XZyamRjZnju5drX19vk8nNxc3N1d29saG7569/b2d3ubGNpb3v8f3JqZGRv+ern5un3bWlve/7/e2tgXV1g aH/p4d/n9Hn87e3v735oX15r9ODY1NTa5PX69vZ4bGVfXl9s+une29vj+21paGhna2xlZGRs/+rf3Nvg+mtqdPv9+fd0a2hqdfTk4eHi6vb+8ejq7e58a2ZpbW/x4t3e6O728unq8f1uY1pbY3br4dzd6fx1c3r9dmddW1teZ33m397f7XFrbmtpaWtrZWZ0 9erd2NnZ3vFucH3y9Pfxe21uevrr39/o8ndrbHH8/Hp4bmdgZWxtfu3m5/b+8e7q6ez5c21fXGJw7OXf3efw7urq6er0bWVhaG/+4t3c3OPy/fLyfXd2dnBobXp/7eTi6PF2aWlw/ff8fnVmZWxxffPu+m1mZnF++fH6eG9nX2Rqb3vw5+Tp8enl5OHj7H5x ZmJoeujg3+Ht//zu7fX2d2FcW19qee3k5enydmpvfXBtb25uaGt78+be3ef7cGZlb33183tza2/16eTj4eh9bm/56enq6/p4cW1uefPz7ejr73p68vT07vpqX19eY3bu4uLtfm9x+/N6cWpeWFpic/Tq5OXu/3dxd/d+c3p3efry6uXe29rf9nJsaG998uv2 enZ5/e/q7O58YVtfavjv8vB+cnF6enn4+Pr4enl+/Ozs7urvemtpZ2d96d7c5e739+zn6/N7amBkcPLg3Nze6vr+/H7+eW1pZ2l3+PHo4t/h63NnYmBkanP/fG9tcXz05+XseWJcXmn/7/D3eW9w+u7r5OPp8fz87Ofk5ent9XxtbW1u/Ojh4u18cnT9+/p4 a2JdXml+5t3e5vpvbnr5+n9waGlu/u3o5N/g6vluaGtwdf3u7evu9PDt6ODe6n9pYWV57ufl7PT/fPjv7u3ue2pmaXfv7vL1/HRvbW1ubHX58vh8b213/H//emtlX19neerf3ufu8/Pr5uvw/21qbvzq4uDe3ub3fHZ2fG9qbnJzd3Z5+ezn6PNvZF5fanr2 7fN7e/rz7efl6X5nYmh77ery8/T5/PTu7u7t7e72+/z67uvr7O31em9uc/nk3d/se3V3ffj9e29mYGJy8+jh5Oj1b2prbWtmYWJma3b79+/l4uj4bGNfYGdz8ejo7vHr5N7b2+L2al9ldPLs7/j+/n337ezr8n1sZ2Zpbm9zeXx5dnNwcn3z5eTr/mtobn/4 8/J7bGts/+rh3eHwfHJyffT2e3Zycv7v5+Tl3+Dr/G5qZ2pucvvz+3hzfO/o4uDsb19dX2l7+/h4a2xuefbt7PdxZF9janF1cXR3cXF5/vXt5uDh6PR/eP7v7e3t/G9scP3p39zh829sbm51eG1oYWBneO/o5OPn73lucG1sbm93fHv7+fHq4t7h6n5mYmRs //Hq7f599urm4N7l9HVrcn7x7PH09fl9/vLx7+3w9fp5eXV5+/n5enFpYmZt+efj6f1qZ2tyen12amNiZXL26ePl6vJ+eH/4+n9+/fn18O3p5N7c4ez+a2ZocX75+PxvaXD97+rl729lYGRu//b8e3VycXP47u3p6vP8e379+vT5+ndvbmt17+Xd3OHsfXl9 9fL4+HVpaW7559/b3ebyfXd3fXdta2tqbXX57urk5Ox9cmxnZ2xtb3Jtampv/e3o5ut3ZmZpbv709/n+/vfu5t/e4Ojv+vn19vX5+/l/d3x///Tr5+vyem5tbXJ1b29tZGRree7j3uLr+nx7c3h8bmpqaW/87OTg3+Dl7/34e29zcnV7fv/47ebf3d/j73Bs bXL99vj+enV4+O/p4+n0e29xeHl8eHBubGlqcXN3+PLx9X1zbm1xc21qamVja37p3dja3+ny+vz79n5uamxy9ubg3t7i7Pp0b21oZmZma3B1ffTu6ujr9XpsaGpufvj4fnZ5e/bt6ePo9Xt1e/rv7vT6fnl5fu/r7Ofn6+vt7/Dy8v53cW1ubnn27ePf5+76 enV1dm5qZWFjaHbx6uXl6/l1b2tqaGVjYmNqc3v37+3q7fX9/Xt7+/v38fX48+/q5+Ti5fB9enn/9PR9eXJsbm53/vz7/3l1ff58fnxxbW1pbG9zfvfs6Ons8PT6/v50bWpkZGt67eLc3N/l7vD4fHltaGdobn7u5+He3+Pr+X51bmxpa25ydXz38+7p7PR8 bGhpa3V4cnJuampwd3z3+n10b3J1d3v+e3d6eXz17+vl4ODj6O3u8Pb5em9tamtx/e7m4eXt+Xlxb2tqaGNjYmh19+3n4+bu+Xl3dnN3cm5zdXv57evp5+ny/np++PXv7/b4+3/98+3s6ent8Pf18fLw8Ph6dHJyc3727Ont8vj5+v55b2tpZmVobXn67uru 9P55dG9ua2dmZmdtd/Hn4N3f5+vu8vj5+316ff738Orn5+Xn7/19enp6dW9xbm5xcXl++fTy/Xp8f/379vv+eW9vb3X99u3r7/Tz7/Hy9Px4eHd3ef707efk5urt7vP7/H53dXByd//v6ubj6fV+eXRvb3JwcnN0dnr78+/u9npvbWxsbnFzdXRxcnN4e/35 fHVyevnv6+jp6uzx9fb08e7r6+7x8e7w7uzz+3x0bmpqcHr58vf+f314eXp2b21qam53+e7q5+vx+P9+e318dXV3eX367+nl4ebs8vr9/vTx9PT6/Pj17+7s6+71/f349fH1/n96dXRxdnl/9/j7fXz/fH39eHFsaWhnam96+PX5fnwuc25kAAAAIAAA9RIA AAABAAAfQAAAAAEAAAAAAAAAAP//////////////////////////////////////9//////////////////////////////////////////////3//////////f///////////////////////////////////////////////////////////////////// ////9/////////////////////////////////////////////////////////////////////////////////////////////f/////////9/////////////////////////f/////////9/////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9//////////3//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////f39/f////////////////////////////////////////////////39/f39/////////////////////////////f39/f///f/////////////////////9/f3/////3d3d3d3d//3 6+fr7/f///93d3d3d29va2/d1dXd5+93b29vb29rb29vd3f/9+/v7+/v9/93b29vb///////d3d3b3f379PT33dnY2NnZ2dra2dnZ2dr//fv7+vv7+//d3d39//r/+fr593b59vv62tr729jX1tZX2drZ2drb19dY+/3zsTN2dXr4+v3b29fWV3LvsjP0edn WU9ITUtGP0ZAPkJMSkzn79vXzs7Lx8fKzMjHxcC6uLm8vsDHyNVda0m0vlk+PDw1Ozs6Pj4+PkQ9OD9NTEtJTlVPTl1fVWv//+/b9+vCyL6/vMO7u7y6urq8vbu2t8W/xL29z8Vn06i4Z2dJQDUxLzAmZ0g/LSssLC8zMjg9O0E+T3dv38rNysjZ69PN2dXr 193M28vL0ca7s7Kztba2tbWztsSloau2vbvNb2dTTUo+ODc2OTQxNTI2LzU0Njc7ND9DPUxPUznd4/drXcbBy8Hb511d/8jJy9HO39nCzdvGT6OrucXDt9vFzctPqry91ztCNjg6NThAODk4OD1HQUVES0w8OWNLV0VRSl1d49Nva8vMurqut7q8tLi7vsF3 p6a1v8a/T1v//2NLPEdCPzM6NTw8PUNDS1NX7/9f/1tZTkk6R0NKQUv/V1NbU01Ta+vjv7u/wb20uru7vbefrcHM2WtR7909rsJjb005Mj04ND1LQ0xMX1XVzNnLvtHra01L92tKR11LZ05NPknbX8LLxsbMxL7Vzs1LtqrCvdXJQFFOUeddSUpfSTw9U0NB SFFna+dvY83L3dPBz+dnREFPQ/dba1FKRU9DOV1K23fDzMbBvcLGwmO1p7bJxsVr69fXX6m7xN9PYzZBNztMQz1ZSURZ691j68vJ53dCV05DSUFEREZPPTpIV0Zr39vR2efF1dPP37KqvNfLv1vFyc/M42tn1U1PVWt3SlHvd2NjW1lvY2Pb5+NXWVE9Se9b U0dKSj85ODpBPvfRz8e7vry/vcD3oqq+y8DGXdfPY7WmycjnTz5BQ0U9/2NKU1lJVWdvX2/R92dRUVFJS0dLRD89Pj05PUVN69nLy73Fv8m/vcetp7PJxsr348bTxs1fS1tMP0U7REBJTWdMRkJATEpRVWNbV1lESU3n691dT1VTSzhFSkhv38jIvrW5xLW0 w7yhrsu/zvdb3VNCpsXTd1cyODk4Nz9AOkxFPkR3TE7/3f/vZ1ljY1Ff71tdVU1PPUdnRsnTz8m3u8y+vrrEsaWxx9HZTULO3c7bTkhdQzY8OzY7PkNDRFM+QFFMTXfrb2fnd2dvxs7A2dnfY11HTWtZZ8nTvb+6wcnDvMZDobDK31vvOl//OanLZ19bNi46 NTVEP0lNSUNN6/9Ozs7f2+t322/N18rLb9njZ09DW1l3yO+8y83PyczHyDursMZXTVcwX2tf70ZATkA4Mjk3NUM/X1tJUVXr53fJz8zLzc/Z17vBu7rX281RSEREb07nw8jAytnNxczD782sw1tXTTg+Pry8XVtjQS0yNzI0PWtIZ11XZ87I78jGxsjJzczJ yMzKwN3bzltERELfWd3Ly87b1c7X281rU6vLR0w8NzTnSlNMPz89NTU4NjdCTe9v6+fXzsjLwb++xsnP0b27ur28289dS0U5P05CzffXzuPd3cfNyvdFqrldT0s6Ojmux+tZSTgwMjM5N2tGZ9X/6/++xsbDv8HLyNvNvsHCw7/TxVdRQjpKUUXXa/9jU+/j X9/bbzWrr+M9QUs0SmddX1VPUUU9Nz88093vzcPN18PAy8fCxtHb79u6vcjIx8ljW0I+N0VCX3dv12Nvd9vd59vZNMeu50RNWyurw+fNS0c4Pj02Pk9Z99XVwcHOvsLBysHEx9vvxcvE49nX0U9FRzw3O0HrWWNrXVtvZ3dv498/N6nJPGNVQUxZ68prX1FK PTs83f/d58bAy9fFw8vJzMbL52/TvcPP79/fVT5APjI+RMpD99Xj69vX1+/X/0g1pclN9zy6vsrP30o6REI3NldX3/fVwr2/wr7Evc3Gztnd1dfX71HbUV08QDo6O0BnV2dd52PX3f/fd9lvYzeoyVvn909HxtfL61FLQjxAR+/rXc3Kxs3bzs/T79vra9Xd xs3TXWtPa0E/PTxAT0vMa+PR38/T483f5+trPKnJZ+84rb7EzedjOEA+PD9Lb//rzsvEwdnRys7d3e/Z591nU0tVTUtNPTo8PU1ESclra9HXzdnbytPX1903pbPG7+frT+vE529LO0FEQD/RVevV18/Ta9/v2fdnb9f3wM7d205PTUlCOz1JSE9R0WPN38rI ydHJy83T20y9qb1PPKvDxMdjTjg9SzxGQT7M3/fVycrn/2vj91tb1/dnXUxKU0ZLR0k/RE5VV1frwuvTvs3Iy8bHy9vfVTCnvVXb991Vx/dNR0VFPkdESmvf3d/b19tV/+t3XXfZ39vj01VdTEhJR0pCUVtbd+vTwdfIyMPLysjI3d//PLyx0UKut3fH/0M4 PT87R09AZ87n09fNze9r2d9vb9fn6+9MU0tdS0NFXUVja9tr593dycXIzc7Gys5j42dNOKu9Y87XTUxvQkw/PTxHTkxOZ8hnb9fv22t36+vv53fC0etfX2dHRUR3Rltv99ff1cbIzcHEz8jO01v3b0wxpq/TRKu8Y19MRTM5NjxNSUVdb9vT2dXL9+9v5+Pv 1ePdUVlfUVdIS1FnZ+PRyu/Nxtm9y8vZ1cvvWUtfRlkwq7vr2WdnPkhMPj49P05vTV3rwm/f1d3MZ1vX12tvvc/V/3dfS0hLR2P3/8zFzczHv73Mxb/by+drTU1ZU1M0qOdTsNtMOj42NTw4SHdTTmPM4+fbz8fRUdXVwGvI1edfV01LTU9AWdnf1cjJyt3X wNfL49/bZ1NFUU9dVzettcZTTT9EO1U6R0VXa+9nWcnf3d/d0c5Td8vnz8jF19dnWUxET0dG583rzcnIx928zdvF4+djVVdJTV1fT0GlXa/OZ1s2QS4+S09n3WNXyc7VzdvLzf/R08TNzs/T909LQ0hTREj3zdHZx8jT18fKb+dvUVFNSk1RWV1XNLq0Y0c+ UzNJSk3nW+Pf4/fT1ff32eP/x3f328TOzNXjXUhIQUxKT//Ix93EwsfOzL7Z791OTFNTSU9ZX19bNLSub3dNPT08Rmtjb9lr18vX0dXX48PLzc/JztHb2VdbPUZDUUdV48/NzMXNz8drzs9RT1NPWUpMXVlbY1kvqMpHOV1FOVnv39nv2f/F62/M5/fdys3O X8nM0ddvd1tFPz9VQXdf28vH1cfMv8zfyV3vY1tRX1tXY11n/z/VvqpVd01DRm9dd3fP39vL/9nfx+/G1cXX1c/j21lVQj45P05Ia+fb2cHb28Pd413vX0xKW2t3X/93Y/dfTy6s70JRTXdRz9vf7+vXd91nV+dj69PPzOPP29vjU1FKSjlNRVvd4+vNwdHd vsPd32fOS2PvY+vf9+9dZ19RKc+qyetb00dV2W/r2dPbXXdX3ffXzcnK1et3/29OREM6OkpM/93d3c3KxOPNz29rb+tXVf/V5+Pb/2tjU0c4R77LR+vVTu/MY+/TV+NvV/9fZ+Pn1e+/3XdnWVVDR0JJTVXn687X183MxsXV39lja9t339Xb1d3/X09RRzon p7DfxtnrRedfzuffUVffUV3L1c/d1dfjU1VKSz88PEhPzdfrz87b57zP3dvf91lfz3fdzs3f5/dZTD89OSiot2vT48pK3+/rd0hT409V/9vb99PHyN9XTE5LQUFRS+vd0d/O0//CzdHn79Pj9//J09vMytPrb05DPz47J6yfvMnTzT9d21lfSV9XWUvZ28rd 1dnr2U9JRE1CPlNNz8XI49fTym/JyV3b92f398rT983Na/dXSEA4OjQzU63EZ9vVRdPXVVFLTVtZW3fV2XfGz8/fUURBT0ZJV9fL2crb28bX69nR3//j1c7nwsvXz9HrWU1DPjs9PytCn7Bvy9FLWWdNXUtDTF1n493Oz+Pn43dVP0NRSkxPxMfFzePLy+dn 48FbWdvZ393Hxeff319MRDs8NTdNSjWlt0/Zx3dR9+dPSUVb39//583H19vdWW8+QU1jWdvGx9PdxNHjZ0rv62/nyszFzci819tv/0ZBPD05QkJHMZ+svMbMXTrrXUxPQUnd09/XxM3fZ2Nr/0dEWW9b1dHI0czXZ1tfXVn372vjys3V18rv/19TPj4+Oj83 5/dCsbCyWc/bSGv3R0hIa9fV78/HyNlR/1VTUUNVX83X08vPz89bTuNJTmfO2cO/v9XPwuNrS08+Pj1DPz9TQUvTn63PxWf/R0dTS01b29HO58rJ31dbXXf/TlNfw2P/57/b/11rWVtNd9HK07zGz9XV605OQz0/PkVBOP9f9zWxrcz3ye88TVM/b3fd/8LV 1ePnU0xRd+drSNPR12vD0d9f60xTU0z/yrzDvMDG1c/rXz9BRj5DR0FHTEY3rsylvc/PSTxBTEz3V93Rzdfd7/ddTl/34+dLzu/nX9/R319fU0lXXefJvsK+v8fZ91VTP0pDRURKTEdPa8tvNaa42etXSTpKX2vdb9XKy/9Zd2NPUffr71HX3+vI3+fn3VtZ Tldj28O+u8TAxuvrXU5BQ0VGREVXTEtMO6tPp7K5R09EOE7Va1fd49vX505b405P79P/1VN32Wtva9vrVU5bX93Lwr63yMTLX1lCTUdGR0tGTv9BV+Nnaz+9qb1HW0pFVd/348zV1W9fR0prUVXv32/dY+/f0Wdn299Zb11vzsrFvra/zNNrWU5MRUNFTEJZ TE7nP3ey11+juj9RSU1fzs9fzW93V+9GSXdbV+vXb9Nb73dXTv/R919n5+/HwcO9vb7rb1dOQ0ZTRkhLY09K11vvZ2tnP8W3/0Rr91fj0dPO22NVb0dFZ2f3Wdd33cxXa29r7/fd93fn2dPJxcG/v1vrb1lMR09KSltXUVPnSzyvx85M67JnRGvZd9vjZ19O XVVrUUhn9//Vb3fN51dZTmfX293b98zMyrzEzMrKRV1RS0ZJTFtOTldJ79nb/1tnYzr/s8VLz87Td83fZ3dMTFNPSHdv11VX487bTFnv/+vZz9Hb08fVxs3N2c9OTm9dSEtTWVFOU+NvT0SxxdNrRlWzx1XHxtVnd1VPTlFRVU9RY9NvY0nba2dGQ2t349HR y83Hx8TF0e/390lFVVlKVVPZSVdTd8jX2eNMSk4xsrLHd8S/9/dj3XdNR1NVTFfr1WdPVW/nX0ZO59/308/LzdPIz9fv72NnW0x3Z01Zb19jT9vj/1HBu/9vRkqxvt/NwsVrb1VfTUdLWUxNb9lnZ0ldS11XRUtn19fOwMfIysfK2XdnTFlPS11VX1fjb19N z+//ynfvQk06t7XH1cjFzuNjY3dVP0hTTUfdd19ZSVNOW1dNV+PX0c/HxsnPzszdV2tVWWNv/2tZa/dda2PV2Wf3d93/TMG4vt/Mw8/d911bSUtESE1RXd9nVVf3TGtVUU9X39HOyr/EyMrPy+NPWUtRVWNbXW9f3fdb1//3Z3dTSVVdu8Xb48THzd3jb2NK T0lITU53a09bT19Ib19bY2vPz8zIw8XJ1dPnY0xPTVf/42Nvb2Pn72/P62d3619X37q+xt3Kxs3RY+ddVUFLUUJKU3ddUU9T611HY11d39PTysO/xM3J4/dnU0pMW2v3XVXd9/fd79/fVWNdTVvVwc/j783Ly93fb2dPRFNVSUxO91NNSUx3701ZV3fO0cvG xcbDy8n/XVlPSVNn/+vvW+fj/+/PY+tOWVNZXcu9xtnPycbT391da01DSltMTVVnU1VEY2dnW1Vb49HTzcvDwsjMz3dbVVdJSf9jd1tj39vfd85jX1lOTVdbyL/G49PTydPV3/9rT0xRU1dKTlFPUUbna2f/WWvT187Kzc3Mzc/da0tLTklR92drb+fn3eff 129ZWU1Ra+PKycrR0czN3d3va1lXUVlRXVVfT1lJU2vfa3dfd9Pr0c7OzMbJ3+9rSktRS1Ffd19r3+vZ98vj71tOS0dr09nMy8vN59nT6/d3TGNVV01Ra0dNU0vvY93r6+Pd1dHPx8zJzczja19JR0tTW1dfWd3vd+9322tvU0lGV2fR083JwMjRztnn/29f d2NVTVt3R0hPW2933efr59Pf2dfRysjK1eNbTkdHTF1ZVV/nd9/v98nd/29OREZja9fRzcTFzevT09/v/2dnX1tTa1dLSUv/72ff4/f/2Xfny8vLztvd/1VJTUZMW11ZXefn5+/P591bX09MTXfn48nNw8TLztfj929va19dTG9VU0lOb2P3d+/j/+/T5+vP y8/M1+t3UUVMTU5rV1t37+vv09/d42NVTklOWffdzsbExc3b59vj7+v/Y1XnW09MU3dOY+Pf4/f/293v483M0dHva11OR0pOTlt3XV3369Pd/3drX1VTT2tn3dfIw8LCx9Pn9+tnb2td91NVTU3/W09r5993d//Z49vbzs3O0eN3WU1LSlVO7+dVY2fX3Xd3 d/9bTE1Na2Pfz8vAwcnP2+fn5+//b3dbW1lOX2dZU2vd4+tn59ff39XPzs/fb1tPS0xLX1lnZ1tdb93ja/9rY09VTFvr39XJxb/AxMzX43drb2tjY1NPUWtOV19ja+/jd1v329Pf29XN2ffjVU5NTE9vX2NfX+tr5/drd3djXVFL7+/d18jDvsHO0dnnZ3dr a1lVS1d3XVdf/2dn9+NnZ93n2dfR0c/jb2dOTE1PU/93W13jb2f3d+9jX1dRV1Hf1dPMx8LBv87X0+NVV29fV1NOXWdXW2v/Z2Nv611d3dXZ29XP2e9vY05NS1Fr9+tf9+9nY/93b29jXVtdX9vT0c7IxsbG3efjZ1NVY11VUVNnZ193b+9rY2v3/2/b09vX ztff519TUU1PV2d3711db2djY3fnXV1XX+930cvLzMnIysrj7913TU5nWVdPY2drb//rb2dbY+vvb8/V59nX5+t3W1lRTlNr72/jZ2dva2Nrd/dvY2937+vbztHP087R2eP/a11ZV2NXUVVjb/937/f/Z19n7+Pn19nb09vr62tXXV1TX3fv9+93XWf/Y2dv d11fZ/fn39/Tztvb0+vj3/fvb19XW2Nba3dv6+/n92dZY2v/69nX29vn5+t3X1tbWVdr7/fr6/93Y3dnb2drd2/37+/Z49fX2evbd+/va2Njb19ZX11na/fn69/rd19n///j29/b2+Pj63ddWV1jb2d36+d3/2djb2drXWdna/d33d/d2d3Z6/dnb+/3d3dn W1lf/3f/7+vj3+trX2vvb93b3d/v7+/vZ2tdXWN3a+/n7+vrb2NrZ2dfZ29393fv29vf3df/b/93b/9vZ29nWV13b3fn793j6/9fY3dr69vj3+Pn5/drX2NjZ/9v9+Pv7+9va2tvZ29ra///7+/f3ePd3/dfX2tv5+dv92tjZ+v/9//32/f//19nb3fr29/n 6/f//2tjb11ja//36+vj7+9rb19nb2Nvd+/r/93f39/n71//b2v3/2v//29nd///7+vf3+frY11vd/ff3+Pr5+//b2NjY2N362/v/+/3d29rY2dra2dv7+/r49vZ4+P3Y11nb/fr6/fvb2//9+v/6+Pn/+9jZ3dv7+vn6/f39/93b2tnX2P/9//r6/fr92Nd Z19rY2/n7+Pr3dnj5+93a2tfZ/93b+v3a29v6+v37+Pr929n/2f/9+fj5+/37/9nY2dja//39//r9/93Z2Nna3drb/f34+fj1+Pv92dfX2f/5+P37/d3a2vv7///9/d3a/9va/f/6+Pv9////29nZ19na+vn9+fn5/9rZ2Nja29369/n59/b5+/3/2djX2v/ 92/r529rb+/r//fv5/93b2dvb2/n3+f//+//b2tra2//6///6+v39/9vY2d3d2937+fr59vr//93XV1n/+Pj5+vj929n7+P/d3fvd2//d3dvb+vn93d393dvZ2dnXWv35+vn5+fvd2tdZ293d+/f6+/j2+fvd/drW2Nv/+/v5+t3b2vv6+v/9+Pr929rb2P/ 9+vn6//vd2tnX2tjd29v9///9/93a2Nv6+v//9/f7+PZ6+93/19Za3fn3+fr6+93Y+/r/2Nv/3f/d3dra+//4+fr/+//a2tdZ19n9+vj//fnb2trd+/j3evv6/f/9+Prd19vZ1ldY2//5+vv92d339nb9/fv/29na2dv73fr5+93/3d3b2vvb3d36+v/9/d3 d29rd/fv///r93f34+tvZ2NjWV9v9+/v7/f/a+/f2+dv//////fvd//v//f392tn/+/j3dPf7+v//2tv/2djX1tdX/939+vr5+fn429n3ef/Y11nZ//r/29nb2f/6+vd3d/j6/dv//93/2t3X11ra2trd/9n///3/293/2N3Z2tvd/935+fn49/j/2/f53dr b29n//drb2tjTlfAub7M2fdnY11dX1lTV2NfVWdjX2f//3fn5+/3b3d3Xdnd29/b39/Z293j729dU1VbU1vOyP/Pz99v5+/n/29ZU1NRTVFRUVNZW1NXX3f/79/r1dPP08/IzM3V09nj/+fra11PT0pMR0dNxNNJd7jG3XddT1lrXV/va11v6+fr19vf2dfZ zt/n7/9vb3f349fnd+9jY2dbW05MSkJDRURBTFXBwNfn29/Z02/Ny8z37+/v39PJzM/P2d/d79vv73dnXWtRb19ZX1tvY29VTF1VW0pFSURLST88TaKpy9XvR0FXU/fZd1tXU09T99PZzM3Tys7Z08/3/2PvY1fR3c/OzdfZb+dra1dRT0dJRUQ/Qjs/rrfZ 729jRlt3d9Vj5+/3d2PK1crRy+vj611fXevTW1Nbd2Nf72f/5+frTvf/709OTE1fVUo1vramwW9NRjRPXUtZR0tPRkRO4+vdyca/zL/CwMvPz8PPx7zO1dXZ2efrd2dKS0tGS0k/Q09ORT5Aq85ZX1UuO0M7PElIQltLa1fJ28q9vcW9vLrDu7rDtbrVwMXN ycXLzuNO429RTTs+Ozw4LrfbNsauXT7XSy7fXz4/Qzk1PTs/TldRz9X/08zf28/nur+1ur+8trnAvL7AwNt3Y+dRSldITltDRTkuo9NJR0kzRcx3UeNVRHdjVU/RTllTZ2NRQV33Tedn10vv18jLzb3CzLe7vc/d3WtZOtm011c4K7Hrb0FIPkzfzVlva2d3 69nRz8n328hrRUVJTVNdT8xn7+e+yszB0cnXwcTd9853//dfX0NBPiyqzuNRP0E9wc1b/9VRT1lTWd/T28nL3/9NREc+QDs/SUdfX8n/yc3Gxr+7vr3JxsW+z8b/VUYvq61vO0lnQ1+/S1fnSmvvZ2Nnz+//d1lBPDs+TjpEXVXvysjVs7q7u760vL7Oxc1d Y1VOST9EN++vyVFGV0rr6+9R2Vljd1FJU+/rS0hIP0A9OTw9PkNOTHfDwsmyuLS1t7q+wcS/ztdMS0hCPiuurNtBRkxFxM/bwcf/09dnS+/v91tTTD0/QTk5Pjk+TVtP1d3NvLmwr7C0s7rCzd3rU0hPSzUuU79ZSUZFSsfXy9XOxnfbWWfd2+dj918/Qj46 Nz06Pz9ATltv18a6squtr7G6xsvv/0xNRj84R1lKSUQ/SUvZZ9vN1d3DysvZ28rP993ZWUxXS0RNSUVHPkdXTv/T18i7tbGzur3Cz2dbRDw3OkI/PjxBQUNMzu/MwcjJyci7x7+8xtPZd2NIQz8+QUFKSkhMSuN3z8zPv7q+sru7wdPvUU1XRDo1NTQ1Oj1F Te/V2cbAwcC8u764vMPK0/9fV09MQEk9RkRBRk13TO/fz8a8urO3ssDDyVtBOjo1NDEzOEI/SU1X1+vLusS/urq+vbq7wMrX2VlNRERMPUVFTU5RSE/3Z1fXxb68u7/GwW9ORj83R0BBPDxBRUdNUf/n57mur7S8xczLzd/D13dOTVFJS0ZVTE9PV0R3T+9f b+/Lv7q9zctXU1FTPkVKTU9OV01LS1dPxNHDzs/Myc7Hys7X219TWfdZWWNfZ1dXZ11VTGtPXU132dPFyb2wuct3X0k5QkI8PD5DOzrZrq6xvMTL79nd98//TF1vW2dvY/9bWf9RP2dXZ09NZ1NZY1nKyc7NvsLZ78rPWV9ORUBB/1NbW2tv2dXVy8vLz//Z ztv/V1NfW1NVVUlTS0xd72Nra09IzFvL78brvqu12UxFPDo6QEo7xqy0wt/fWWf3X1VrVdld42fZ09nrd8/rd1Hdd3dZRUtAPtvbWVNTVU6vrLDO02tfRU13//9KTUhKQ0Hr4+PT19vO3eP///9jW01jUVdvV2P3y87j51nOW28909vPP8Wqz2djXUA8V0RX O7qstsBba0NrSmNfd0tAR0tOWetj19fNzePftru/xWvJ1/9GZz9nXUs4orxGTlU/RD9rWf9OS1lNPURvZ03dyse7zr69zM3Rd+f/d11VT1tj087nyr3PTUxIOeM/NajFQEQ8ODE0S0RTRDequdVX984+48Hnt9HFvry+u726vb7EwcfH473K58Zfbzk0Njw4 NCinvjs9OzUtNkFBV1Nd5/9rZ9dZx8rGubi2vLm7vcS7vbq8v7/LxMPHyde/zVc/UTk2OCwrRcU2LSwqJCwrMzU4PDY7q+fLa29fW8m12bWutq+vqaytqaiop6ijp6WsoaypxtdPRP8xOSOlXS4sKh8hISEkJigjJSMiJygvLi40SUA6T//Vzr66tLeztK6v raqmqaSmqKeurq+ttsWvn6rBvdE6PDMvNjo1NTMtNMtKRiw7JSoqKiovMDBJRO9R49nIvLu6r66sq72xv8XNvdHZPJ+uvrq9413rb/fRb1dv3T9IUT5LNDczLzgsLjcuNzI3PUVARUZRb9+/uri7x8TOv75ryE3Mprjbwb9O3cZrxL7Gv7jAVaWlrLLvvjE8 NDkzMjs0OTA1Nzk4PD5T3bnX70c/QjpJQDs9I6DjTM9jRl3Fy7+srrWvsLW2sba9vsO9ycVb5/drUd1bSVFjVU1BRndvY1E5Ni0oLTgqLR+2uTw8Sj1r08r/w7u/t7a70dWfp6yusLnfy9XdyltPx2/v18zL58i9srjCY087KysuKSMoH7Y5LjI2PTM+SFHD 47rCuby1sLa8vrnF1dnVycO/xcS6zb+9v7u+xK21tsHfUTQ1Kj0qJyJOUzIsMy0uOVc9Sc7nzsTT1VO1obC2uGNV72/Nd8TZ97/TvMS9sLiqq6qvtshnPzQ+Li4kLb41Nzw1LkZKNU3nVV3/Tf9r09d3Z+tjRUTb49tZ09tny8K+u7axrKyura+7z1M9Pj0r Kbq16ztdSTVIW0/3zsbJyUpnb0M3qshd3TAwLjpAOT49OD3fVdnCvK6pqayos7/d4z/vKjVnt9lKZ1lKWcPnysDFyL3T99tT919LOe86MTFAPTk4QzY3R0Jda9PGs7O1tr6/XVk82TkzRbL/3W/j78vXurS2vbuwvMW9z+c1vsfC4y01Mzo5OUU8MzFTPmNb 38TJvLvLzE0/Nj45K9271+dn18nJvbG3rrGysLG9usHJ4/drPGc1NDtLPE5GQj46XTxVWWPG09/d60ZFOTcxOSg/1chJZ+PT2cSyva2zubOvube2w+9nvdvHRTg5SEFBP1VJOE132dHPu77Gx9tNRjYzLjIpLjxfZ01X99nVvb+0s72ztbe4ub7Dz9VORV1H PkZda2tRX0hnzv/v68XAycPJ/1FAOjcuLzQ7Pkc/SENdX3e/vri+wrvAw73D1dnva1PLSVNMW29nT3dfXevVzdO+ur22u8TN40c9MTcsOTs/S1NjV1njxcS/wcG/xsjF0f9fV0g9VTdAQERjV2vZ/2vEycfMxbq4uLjL2+9HQTQ3P05ZVedd72fvzcXFwsXO ztHL2XdbUUw6ODM1ODo/R11XUVnTzM3PycG6uLa2vczG40NEO0o+V1dj2WfZ28LHwLW4xcvLx85vTUtHOTMyOzE6PD9LV01VyevPycS/vbu5uL7P4008PUBESu9f1c/Jz+e7xry/u7zJy+tva04/RD00MzA0NjxAP1VNV8n3zcnOy8W7v72+ydXbTUFIQl/f a+/VzsbZuce7uri4v8rF719VPj48NjQxOzc6R0VKSEzP593Mz8jFxsHAwMnXb0U7RD9FY1njy8nHxL26ura1trvIxfdrV0lBQzg2NTU5N0VBSU1ja9frzMrGysjJzc/nb09EPkRARedb9+vZ2cDHvsC3uba7wsXR/29OSkk8PTs5PkFLUW9r593N28rGyNHP 2+ff619PQjs+Qz9XY1nj08rMyMLEv7y6usfMd1NVWUpGRk9DSU5TTVdr4+fPy87Ry8jO2d//93dPRUc+RkRFR2dZZ/fT19HLzcLJvcTT091rW11TXVlVR05na2Pr18/Zz8rLysfAxM3TY2v/U0ZJQz5EQkNGS1VbX+ff49PKzMfMzv9nY0tNSk5PSEtbb2/j 3dHGx83Av8LGw8PIz8/f3/dLU0hDT1VTT11XY05r/3fn0dfb529OR0pJSUNMTUtdXVFn5//b2cjMy8HCxcXBx8zM0e/V/2dvVV9bXVtjW11j7+vj993vY993Y05PUU9KSExLS0tPZ3f349Xj583JzczMydHV3eP/1+P3/19vU19v32Nb29/n39PV49/Xd/9v T05RT0lOXVNXTlVj99/d3/dv4+f/09Xb2dfn999rXf9n/+vv7+frb93r39nd69/343djV1dZX19ZUWdjd29j39//29vf49vf7/ff62dr919rY1lfU0xd72Pn0ePn3dHT5+fV5+Pfb2NnXVdvX1lvd//v/9vd69vn/2/r7/9r//9dV2NbY2dbWVlOZ2Nb/+/j d93Z2d3Z2d/f329j///r/+d339XV5+vd19nVz/f///9vV/dvd1VOTExTTU5bU1lbXWNvd2/f39fX2+Pn7/fvb+f/6+/v79XRzN3/2dn/1czX3evnd2f/a3dTV1NZW1dLUU5PX2tbb2djb2//9+fv0ePv92dvd/9v92tv2dfn3evX3dPN0c/V3ffvb/fn52td V1tnTlFOVVlXU2tf/+vv6/f3d///Z/f/9+/j39/r7+fT6+vr2dXj693ba11j4/fj1+NrX2NvWVNRUV9fZ1nvZ2djb19bY293b29vb/fn293r729349//6+fX493O3dv//99359nj73drX19dUVdZ7+v/a29vX/9fd//n3+t3XU1ZX2trd/f/d//n4//v5+Pv 4+fX7+//59/X3+f/62f/d2NnX2NrWVnj2+ff3ff3b3fvZ2NbZ19v/2/////35+9vW3f3b+/r7/d3b+v33+vnb2tjb2tnb+fv6/dv/2/v39/r79nj3eNvY2/3//93a2tna29r93fv62ff7293a19jW/f/429fY2NXa13/Y2vf4+/f593X3dHZ3dvX72Nra2f/ 6+fvXWt3/3f/7/f/7/9vb3d39+vj/+93b19bZ05XY1Nj7+Pj2dfn5//j3+fv2d3d9/fv62t3b29na/9rX2dvd//n5+/3W3frZ3fr3W9dWV1bX+t369v/d+Pn59nX6+/va93n7/9v6/9jZ/9jY13r3////2tn/+9v93dn72t34+N3/2tdZ11fZ/93/+vZ4+/f 29vj3ef392NrXWPn/+Pr92tvZ+9nY2f/b+fj9+fvb///d29nd2dfXVtbV/f379vX39/3193n6+vna2tvY1tr7/f//+9va11rb11v73fn3fff92N3d//v5993Z2NjX11vZ//n5+vf6+Pf7+fv9+vv629fY//v9+t3/2dn7+drW2dnX+//5+9r///34/9vb29j Z29bWWf/3dvd1dfd193j6+/392djVV9rd+/n7/fva193b2f/b2d3b+/vb3f339vr9+9vZ19nZ2dra//3b/fr5+fn9+fn//fv411j9+fv63f3/29n6+9rb/9r/2Nj92dna+/d5+drd29va3f/d+/j2+//92fv6//j3+Pr7+9fVV93Z//3/2/39+/rY2tna/f3 9+Pv92//9+v/d/fvd2v/93fv39/r9///9+N3d2939/d3b19d//fr9/f/b11vb2Nr6/9v/+vn4/d39/93d29ja2/v4+/r593n69vd3+/f/2dnb2/va/d3X293b/9jd2tb/+9nY//v/+v37+/3d+v37+93b/9rY2djd+vd3d/r4+fd4+939/df/29vZ2dvd+v/ a2/3d2frd19ja2f/b2/v5+/v3+Pfd29vW1ddb//n69nb4+Pn3ePr7+/3d3f/d2tnX/93/2Nr/3ddd+NnY2v/b3fv59//9+9j/3dvb2Njb29n6+//d+vf493r3+/d493j93d3Y1tr/2/3a+/rb+fvd2N3b/93/2/v7293a2vra29nZ19fY/fr6/fv6/fv4+Pd 3+fr93d363dv/+vv929nb2NfZ3d3b2fv6/d33dvv63f3/2Nnb2Nj///39+vv7/fvd3f37/fn4+vvd/9rX3f3a2d3b2d3Y2/3d/9v5+fnd+f/d2v/a3d36+trb29rZ//n7+vn7+fv7+fv5+/r93f/63f//+/37+93/19jd2v3d2dnZ2t373f/72tva2ddXV9d Z3fr493j6+/v///v9/d369/v9/f39+v3/+f/6+t3d/f///dvd+9vb/f/93d393dfXWdfXWNnb//r//d3Z2dr63f3393v7/93Z2t3/+vf5+Pn4+/r6+/r5+Pj///rd3f/7+/rb2drX1lr7/fv5+//d2NfY3dfWV9nY2dvZ2Nv9/fn7/fr6+d39+fj2+Pd2efn 3+fj3+fv7/93b29nY2dfa3f3/293Y2Nvb2d3d3dvb11nZ29rb/f/a2vv79/f69PX3dvrZ19jY2dra3dnY2t3a2/v993Z1dvn5+t37+Pnd/9vZ2/f3edra2dna19nXVdXXV9r73fj6293b+fv7+/r7/9vd11j/+/f3d/f293jd+v/3+vn93dva/d3Z2v3d29r b2dja2dnZ2t3d99r5/fv/+fV4+vd6/ddTe9fWV1v/29dY29ra+vNzMrLzNHX193n699ja09RUU9VWVlTVW/nY19fV11ZV29ra//3///n49vb0czMz8rOy8/L1dfd2df/9+9dZ1dbWVdTTFNMTU1NS0RDU1VKR0xVY1v319nOzdXNztPKysrIyMbLytnR0dXZ 6//3Uc+1uMVnV0k7Pj0+PD07P0lIY1v/6+vV2dPZ9+djY0xrTk9Zb2tjyM/N1czLzs/RyMnPvsjJ0dfvX1tvZ0dTQUfRb1VXVWtXd11351/3291r5+9nV09NR0xHRj1HS1FHT+tf/9XLxr6/vsG8vL27u7q5wsPb4//va1NGMdGnr+tLOzguNTQ6Njk4MzQ8 TEz/293X3XdrW19VT09jd1v3/2dn08LCv766ube2tbexsK+vr6+vuLi8xrvIsK/JQTYqJCsqKSoqJigsKzEzNENIW1dbW2NTRtfDzevVU1FCQ0ZBSf9r1ee8vbu0s66wra+vsrezt66345+fn6q50TM6MjM0OSsuLysrLjc5MjpDPTs3LjQ3NUTZb1lr40pj Ss3Az8S8wsnA1b68vLu4vce7zuf/W2tJoayuvM3fREtRTUZHRTxEOT09Pz5RU0xGST07MzY5PeNL/+dOQ0BDQU7V59O1s7a0trCxr7WxurzH1dvRPt2fn7a690EuNS4vQjk1Pjo4P01ISv/fzsPfX1tTY0lMyu//70VDNzBDT0FGRtn/59XCvsO9u7y9w9Xf 72tDrKey173LT0lMPkNORkRNQzpFRkJH79fRz93vX1/v1dnjvM7JY1k9OjtHSkVMxMHP2cLOxcK8yufI2VdV6z5frZ+8u81KPjU3QUFDTklZQkZR41fXzMzKw83/19v351fnXWdZSDk7Qk5RSdnv503rwNHJwLzEyc3ZXUxrNqKpw9/bxz5n/0zf72/N70xE b1U/X9NV72NRT0hLU1vvw9HvTlc+Ojo/T0jvb83V29PCvcXHwsbb3fdrWVMyuMKlt7jEPWc+TmdL18/dWWP/a1X/69PVZ2dVT0tRT07/UVFIPzwsOTxGQVnj2d//ucXIvru6vsnT1+fP5+9Do7tO50RBT1NGZ8bd2/dbU0xvTm/j719fSj9CX0FIUetVWUg7 RzUvOz9N19PGy8G1trWus7W8v8TN2czZ0TWfR6my328/TDHO/0NXTEQ/RUo/Q+9jU1FHS09OSVFLa0lVQUA2Pjo/5+PKycjVzLu6xbW5vsPT0dPj/8/ZS622v0lVSz1G22vXT29jRz4+QU1Oa1NbT0VIUWtX/8a+53dNSD4+M01ZStPFyse/uLS/s6+7y8HR x9/b08xnTq1HtcFTQlNOL09JPEc/PDlBSl1NV/9ZT1//b+Ndus/bSExCTkVBVW/Jx7/Cu8G/v7i8vr7T71vnd11R61E3pNs6PTc/P1Vf319jWUdAOT4+XVNVX01nY/fV62fAxsb3a00/SUhL18PJu7q4t7a4sb23ws3r3+Nrb0//SjynZya+uUdCRks2Pzcw NTk2OldZb3fR2c7TvsC9wrO4zv9dTVFIQlNjycTGwsK+vsa0xcnZ32Pfa2dOVUo9LaldLjs4NTZET1tPPURBOj1BV0/v13fX09HFxcm7tbrDzU7vQUZGTdHfy9O4ubu5v7LBv8zLd///Z1VHSi05uzwuOia6W1/nSz43Qj43PVlT19Pb18XAwr21va2vuczf a2s+TD1C/1nV58rGzOfCvOP3b+9j/2PjWUZXM7/LQzdANjA9W053S0BbTztIX1/d2dHbwcC/vcO/s72+zcpTVUZMTUdbym/Pzb3K3b+91W/f4+t3b19OSDgvrkozODYuMTiqu75fX0pIQ0XX1+PdyufR277JwcS3v8fVVUtEPztERE13/8/OwM3nvsXPd+/d 62tnX05FRTWyZzk2OzZKTmfXa01J519FX9XP68vbyb7Lvci+trvHztFXRDxJRD9FXev/18jZa+fF49f36/d369VZW2dNMqtnQjg2QkBJNKiqzuvK40hX0efZze/FwN3N3ce4ytvIZ0o8Nk04Oz5XW1nOzuf31cXZ0+Pj/+ff93dVX0dntVM4Nz9BU/fnzMxb Z93d52/Kysjfz8nDzczMysnZ0edXQTw4PTk9P05OY9PX3XfZxM/V999v39vj1d/MU7W4z0VDRj3v9//XOqu/u8/fb1Xr9+9v43dra29fzt3GT0xEQTs8R0FFTmtV19Hb79PEz8rZxN3X3+tv78td97nRTkI6Qm/v5+PK/1XR583v2+fn3993//9n52/ZV9dV QkNBOj4+REdM5+PMxtPTz8HRy8/N69PZ087Tv9FXV8nLY01HTXfr218xyrTD09/dUV1XX+NdV1FT71VV61dESU5ISENHTffdX+fPa///0cXT49fbydfNx8TC02Pr591dX1FP29XL03f32Wv/U/9na1//a1tXT07vX1dXT1NHS0E+P0lOY2//38nZ18jM09Pf zMvMzM7Kx83N0dvj0ePrXXdd///nSUG5u87b/1lMXV9ZUVtRT2tTSk1GQkFGSUFHUU/n/+/n2d/bzc7N0dfKy8jOxsTHx8fN02PV92dvZ19r4/djXdNdZ01XTk5PV0pOT1NTX1tXd0pMTklLTFFd/9/Zzc3VzMrKzc3b/+PNx8/My8vN09vbd3fvZ1tfXVFd XVNXV11jX2/3W2tvd/djXWt372ddWU9fT01ZT1fn79fNzNvbzdXn09Xn793J38/R0c/Zb29bWVtXW2tnY2trY1d37/9dZ/9bV2drXV1vWWdnXWdbX3dfW3dr9+fZz8/J483Rz9XV6+d358zd2+fn3ev/W1lXW2dfa2tv/1tdU1dfd//n7+tfa29v92d372tj Y1NVW1lbXW9j9/fb3c/Xz9XZzdXV2c7VxNXT2+Pfb/9XXV9bW1dXVV1ZV19ZV2dvb2trd29v/3f36/fra29TTmN3Z1dZ6+fn1dvd1+PX39vf6+Pf49/b3d/3d+P/X01bVVv34+fnd2tnd2NXa2Njd2ddW1td9+/n9+d37+9r62/na+vj9+v37+vb4+Pn2/f3 /3fr29Xn3W93/2dZV1tZW133b3frV1trX1Vrb3f/d+/ja+fX2dfjz9/r//936+P3/2/n92fv//fn92/3Y11nb2/v5+9ra2v3Y1lZT1tVZ+fr699v7+v3d+vf693f4+d3693b3+vn52tfb1n3Z3fr/+dva3dr9+Pr4/9vY3dvWWNr7+t3d2dZUVljd11n5+fr 2+fv43f/79fb4+vd4+vn2dnr1+vja19nZ/dn5/93//fr92NbW19jX3dbb2Nr7+vrd2tn73dZY2tnX+/d5+vj7+ff/3ff7+fv7+vvd+Pd2d/j4/dvY//vd1//72v3b2N3X1tbb2d3b2/3Y2dr/9vvY+vra1dZb11n7///69/3//9vb9nZ49/j3+Pf29Xf3d/d 5+f/a3dj52//a2NjY2tnW1FVVVNZW19dXf/v73ddb/fr5//j7+/f19PX29nX1ePv5+/v6+Prb///3ef/d29va2tna3frb2//Z2dvY1tZV1dbU1dfX29fZ/fv91/j59//793d7+Pf39vVztnj693b9+/r//f/6+Pb6/9vd19bW19ZY2tvY29fY19jX2NZV2Nj X///6/fj2dnrXe/r7+/r29/v1dfb09vP2+Pj3+Pvb2tj//9vd/9nZ1tbXWdfa2NrY2dnd3d3d3dva2NdZ1tbX2d329/r6/9vd+Pr3+fn3dfX2evb39Xbb2/rd2trY2Nfb/fn3+frd2tvZ11na2trd29jW1tbZ2NjX1lXX2dvd/ff59XO4+Pr4+Pr3+Pj3d/d 3evf3dtv//dv/2dvW2Nv6293729nY2NnY293/3dv//9va/9rd2dfa19rZ2fvd+fd3eNv7/d34+vn2+/d3d/b59nb5/9rb19nXWtRV19n/+/jd2tvd11ZY2vr5+vn7/d373f/a2tvZ2/39/f36+fX19vn7/fn7//r6+vf4+Pv/3djX19na29jY11bb2/r7+/3 b//vXW//d//37//372/3d+93a2tvd//j9+f33dnr4+v3/2dvb3fv5+v35+fvd29jY2NrZ2tna19v/3d35+Nra/drZ1///+P39+P36+fv92djb/93//f3//fn3+Pna2//92dfa2P/6+fv5+/vZ19va3f/929jZ//v5+PZ3e/373d3a/fr6+fv9/d3d2dra2tn d29va3d39+Pv4+t3a/fvY2P/7+vr7+vr//93Y2Nja+t3d/93b/d39//n5+/r/2Nvd+fn3+Pf49/n63djY2tvZ3d3a1/3d//3d2trb3djXV9jZ/fn6+vjd/93d2//7+Pv7/f36+vn5+Pnb/93a2v39+/j4+Pv6//v/29v7+//9/9fZ3dr5+9vb2drX11dY/93 a29rd/93Z2dfX/f/7+/v6+/v3ePj3d/f7+fv7+Pd2+Pn3+Pn7+v/Y11ZX2Nrb2drd293Z2NfX293b2dnZ2t3/3f/9/d3b19j7+vr4+Pn7+fd39/r4+P/7/f37+/36+fn7+v39/9na2dnb29rZ2v39/d3b29nb19jX113//93b+/r//93a3f34+vr4+vj493j 4/f/d2N3/+/j3+Pf7+937/9392dfY1tfY19rb///d2dnb+/37/dva//v5+fr5+f393dva3d3d2/rd3fr7//r62tra/93d//n7/936+fr5+fn/2dnY2/v6+/v5+vv93d3/29va2NnZ2//b3f/b/9vXWtr7+/r5+f/7+vv7+Pnb29vY2f379/r7+/v9/fn6+fn 93dra29va3f/6+v/a2dv//f/a2tvd///a/93//9rZ2Nvb+//92//6+/v6+93b/fr7+fv7+v/7/fv5+f3929vZ2tn/+v/d//f93drd3dr/3dnZ2f/729nd3dra11fd/f/7+vf6//f5+vv3e/3d+9va/f36+/////v//fv73drd2d3/2tvd+fv7/f//2/v72dv b+/f929ra2drZ293b29v//dvb+/n7/fv/29vd/f34+vr63fv6+fr6+/v/3d3b3f39+//7/f/d/9rY3f3a29v7+frZ2/3a2NnZ2f/7+v/929vd3f39/f/b2trZ2/37+vv4+Pr7+fr4+vr7+/n///39/f/7/dv72tnb3djX2f/5/d3/29nXW93b29v/293/3dv 7+fv6+9vb/d37+vv6/fv9//39/f39+v/d/9v////5+f3/3f3d2t3d3dn//f/b2trb29ra2tn7+vv7/93/+/n5/fv7/f/d2d37+//6+/n92/3////9/93//93/3f////3//93/2tra2f37+vn6//vd2tnb/fr6+fn/293///v/+/37/9rb/9vb///b29vb/// d+/vd3dvb3f/9/fr63dr/3f/9+/rd+fn7///d3dv////7/fv9/f/d293//f/d/f/b2d3d2t36///////d2936/f/9////+v3/+v3d////29vb3f/9+/v9+/3d293b2/n6+/393dvb/f/7+/36/93a2tva//v9/dv9/d3d/f//293b29v/2dr9+//b3fr6+/v 7/fr7+f3d293d/93/+Pvd293b293d//v//d3/29v7+v3//fv63fv/3d3d3d3a29vb/f/b2/v92t39+93d3f/9/f35/fr5+/3d2/35+v3/+/////39/93/3f/a2dra29vb29vZ2939/f39/9vd///b29v7+v3d3fv5+vv9+/3/+vn/3f/9/9v7+fv73f39+// b/93Z29vb2dj/3dv/2Nna/93a/////f/b2t3/+/j3+/v5+Pv7+Pr7//r92937+vv/+/v/2tvd29r///v/29vd3djb///b3d3d2//d2tnb2937/f3b//3d////+vr7/fn92//6+vn5+/3//fn6+936+93b2tvb2v/b/d3d3drb2dvZ2drb/fv6/f3d2/3/+/3 6+v/d/93d2//7+/37+v/a3f36/fv6+//b+vv9//r9/d3d3d3d///93d3/2drb3dvb//37/fv9/9vb/f///fr9293//d3d+/37+/v6/dv///39+vv93f36+/vb+/v/2trb2t3////a3d3b2tra2dnd//v5+fv/293d/f37+v39/fv9////+/v5+vn9293a3f/ /+//a3f/b2//7/9vd///b/////939/dvb///Z2v////r5+vvd293//fv7+/3/+vr/+/r6+/v7/9nb/f/d/93d3dvd/9rb//3b2//d/9vb3d3d3fv/2937/drd/f3/+vn5+/39/93/+/vd///9/dv9+/39//v7/////f/9/93d2///2t3//f/d29r//fv//9v //f/d3f37//37+//6+vn93dvb2tv6+f///f393d37+/3//d3b/93d///d3dvb//vb3f/93d3d/f37+f/d3f//29vd//3d/9vd3fv5+v//+//b//v73d39/f/b2/3d3dvd3dv9/f39////3d3//f/9+/3///////v6/9va293a3f/7+/37+/v//fn7+/v7/93 /+/39//373d3d29v/3dvb293d/////93a2t3/3f/d3dvd/fv7+fn73d3//dv///37/f3d293/+vv//fr7+//9/dvb3f3d3f37/f/d29nb2//////b2t3b/9ra293///37/f36+v3a2//////6+vn4+fr9///7/f///f/b3f3929vd/9rd/9rb293b293b293 /+//d/f/93d373dvd///9+vn5+///+/37/fv7////3d3d/f3b293///3//93b2t3//939////29vb3f/9/f//3d3/3f/b2/39+/v6+//7+vv/3f/7+/v7/fv9/f3//939/93d3d3b293d3d3b29vd2///3d3b29vb3f/7+/v9/f3//f37+/39+/v7/fv7/d3 b//39///////9/f/b//v/3d3d/93/+/3/29vb29vb3f//3dvb2tvd//3//fv6+/3///39/f37+//9+vn7/f//29v////9/fv7/93//9vb29va29v/3dvd29vb29vd//3///3//f//+/v6+vv9///9+/3/+/v9/fv6+v3/3f/d3f//29vb3d3/3d3d29ra29v b//37/f39/f///////f///93d3f39/fv7+/v9/f39//37+/v7+/v7/d3b3dva29vb29v/3d3b3d3d3d3d29v/2939/f///f3//fv6+/39/f39+/r6+/39/f////3/////3dv//f/d293b2tvd3d3//f3//93////d2trb//37+vr7/f39/f////r7///7+/v 9+/v9+/3/3d3d29vb3d3/3f3///3d2trb2tvb293d//3//////f////39///7+/v7/fv/+//9+/v9/////fv7//3//9vd////3d3b29vb//3//9vb29vd/////fv7/d3d3d3//9vb//v7+/r5+//9/d3d3f39/f3///v7+/v93dvb29vd29vb29vb3f///f3 7/9rb2//b3f3//f/////////9///9/f///fv9/f////39+/39/////////f3//9vb3d3d3f//3d3d/93//f3b29vd////+/v9/f3/2939+/3///v6+/v9/f/7/f/d3d3//f//3f///f3/////3dvb293b3f/d3dv////93dvb2939//37+vv9/f/d/fr7+// 9+/v7+/393f/9/93d//v9/93b29vd3d3d2tvb29vb3d3//93d//39/fr/3d3//fv7+/r7+/v9/f/d/f3///36+/v5+vv/3f3/3f/d/f/d29vb29vb2//d293b29v//d3//////f/9/9vd///9+/37+vv7+/////v5+v///fv//f3/3dvb3dva29v//9vb3d3 d///9/93b///d3d3////////93f393d3d//37+/v6+vv7+/3///393d39//37/f3929vb3d3d////29vd29vd//////3/3dvb3f/9//39+/v7/fv///39/fv7+/v6/f///93d///b3f/9/f39/93b29vb29rd///d29vd3d3d/f3/3d3//939+/39/f39/f3 9/f3/3f//+/v7+/v9+/v93dvd3dvb3d3///393dvb29vb2//d3d3b2////fv7+vv93f/9//v7/f39+/v9+/39///9/////////f/9/93/////29vd//39/93d29vb29rb3d3//93b3d3/+/v7/f////3/+/v7+vv9////+/3//93d3f/9/f3//f3//93b2tr b293//fv9/f/d3dvb293////d/////fv6+/v7/f/d//39/f///93//f39/f3////d3d3d/f3/+/39///d2tv///39/f//3d3b29rb//37/f39/939/f37/f3////////9/f39/d3d//39////29v////9/f37/f/b29va2t3d//37+/3////d3f///fv//// ///37/f39///d3d3//f39/f3//////f3////d3d3d3f////39///d3d3d3f/9+/v9/f/d3d3d3f/9/f///////fv7/f39///d3d3d//3////d3f//////3d3d////////////3dvb29vd3f/9+/39/93d3d3//fv7+/39/f/9/f39/f/d29vb3d3////d3f/ ////9/f//3f/9/f/9/fv9/f3/3f/d3f/9/fv9+///3dvb3d3d///9///////9/f39/f//3f/////9/d3d/93d////3d3//f3///39/f39/f///////////f3////d29vb2///////3d3d////3f/9/93d3d3d/f37/f37+/39/f3////9/f39/f//3d3//// ///////39/f3/3d3////d///d//39////3d3d3f//3d3////9+/v9///9//39/93d3f39/f3///39/f///93//f////39/////////////////////93d3d3d///d3dvb293d3f///////f////v7+/v6+vv9/f3//93////9/f3/////3d3//93b3f////3 ////////d3d3d3d3d293d///////////9/////fv7+/v7+/39+/3//f3//////93//93d3d3d293d293d3dvd///d///d///d3f/////////////////////9/fv7+/v7/f/////9/f39/f/9/f3//93d3dvb293d////29vd/93d///////d/////f39/f3 9/f///f/////9+/v7/f/////d3f///f//////3f///////93d/////f3/////3d3/////3d3d3f//3d3////////9/f///f39+/v9/f///93d3f/9/f/9/f/9/f/d3d3d3d3//fv9/////////93d3d3d3d3/3f/d//////3//////93//f37/f/9/f39//3 7/f39/f3///39/////9vb3f//////3d3//9vb3d3d3f/////9/93d3d3d3d3d//////3//fv7/f///93d/f3////////9+/3/3f//3d3d3f/d/////////93d3d3d3f/d//3//////f/////9/f/d/////f3/3f///////////f39/f39/f/////////9/fv 7/f3/3f///93d//3//93d/93d3d3d3d3d3d3d///////9+/3//////////93d/////fv9/////////////fv9/f39/////f///////93/3dvd3dvb293//93d3d3d//3//////f39/f39/f37+/v7+/v9/f//3d3d//39/f3////d//////////////3//// /3d3d3d3d3d3d3d3////////d//////39///9+/37+/39/f393f////39///d3d3/3d3d3d3d//////////39///d3f//////////////3d3///////////39//39//39/93///39+/v9/f39/f//////////3d3////////d3f/d/////////f///////// /3d3///////39/f39/////////f39+/39/////////////93d3d3d3d3d3f//3d3d/93d///9/f3///////////39/f39//////39/f//3d3//f39/f39/f3/3d3//////////////93d/93d3d3d3d3/3d3//f////////////39/f39/f39/f3////d3d3 //93/3d3d///d3f//3d3////9/f///f/////////////////9/93d3f/d//////3////////////////d///////9/////93/////3f////39///////9//3//////////f39/f//3dvd3f/////d3f////////////////3///////3///39///d//////3 ////////////////////9/f3///////////3/////////////////3f////////////////3//////////f3//f///////////f////39///////d///9/////////////////////////93d////3d3/////3d3///39/f///////////////////////// ////9///////9/f3//93d/////////////////////////////////////////f////////39//37/f/////d3f/////////d//////////////39/f39////////////3d3d///////d3f/////////////d////3f///93d3f////////////3/3f///93 ////9/f39/////////f///////////////93d///////d3d3///////3//////////f3//////f39/f/////9/f3///39///d////////////////3d3d///////////////9///////d///////////////////////d///9+/39/f///////////////// //93d///////9/////93///39///////////////////////9/f///////f39/f39/f////39/////////f//////3f/9//////////3/////3d3d/////f39////////////////3d3///39/f39/////////////////////93d3d3///v//93//////// //////////f3////////////////////////9/f3////////////////////////////////////////////////////9/f/////////9/93d3d3d3f/////////////////////////////////////9/////////f3/////////////3d3d3d3//////93 d/////f3///39/f/////////////////////9///////////9/f39////////3f///////93d////////3d3///////3///3////9/f39/f///////////f//////////////////3d3d////////////3d3d3f/////d3d3d/////////f3////9/f///f3 ///3//////f3//////////////f3//////93d////////3d3//93d3d3d3f///////////////f39/f39/f39//////39////////////3f///93d3f/d3f/////////d3f///////93d/////////f///////f39///////9/f////////////3//////// 9/f///93d///////////////////////////////////////9/////f/////////////////////////////////////////////////////9//////////3////////////////////////////9/////////////////////f////////////////39/f3 ///////39/////////////////////////////93d/////////93///39////3f////////3//93//////f/////9///////d////////+///3d3///////////////////////3//f3////////////////9///////9//3//////////93d/////////// /////////////////////////3f/////////////d//////////////////////3////d3f/////////d3d3d3f//////3d3///////////////39/f3//////f///f/////////9/f39//3//////93d/////////93d3d3///////////3//////f///// /////////////3f//////////////////////////3d3//////////93d3f////////////////////////////3//////////////////////////////////////////////f/////////9//////////3//////////////f////////////////////3 9////////////////////////////3f/////////////9/f////////////3////////////////////////////////////////////////////////////////////////////////9////////////////3d3///////3//////////f///////////// ////////////////////////////////////d3f/////////d3d3d///////////////9/////////////////////////////////////////////f///93/////////////3f///////////////////f///////f39/////////////////////93d/// d3f///////93//////////////////f///////////////////////////////////////////////93/3f///////////////////////////f39///////////////////////////////////////////////d3d3d/////////////////////////// ///////////////////////////////////////////////////////////////////////////////////39+/////////39/f///////////////93d3d3//////////////////////f///////////////////////////////////////////////// ////d3d3d///////////////////////9///9///9//3//////////////f3////////////9/////////////////93///////////////////////39/f///////////////////////////////////////////////////93d/////////////////// ///////////////////////////3//f39/f///93d//////////////////3//////////////f39///////9//3//////////////////////////////////////////////////////93d3f///////////////////////////////////////////// ////9/f3////////////////////////////////////////9/f39///////9//////////3/////////////////////3f//////////////////////////////////////////////////////////////////3d3d///////////////d/////f///// //////////////////////////////////////////////////////////f///f////////////////////3////////////////////////////////d///////////////////////////////////////////////////////9/////////////////// ///////////////////////////////39/f///////////////////////////////////f/////////9///////d/////////////////////////////////////////////////////////////////////////////////////////////////////// //////f39///////////////9//////////////////////////////////////////////////////////////39//////////////////////////////////////////////////////////////////////////////39//3//////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3//////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/////////////////////////////////// ///////////////////////////////////////////////////////////////////////////3///////////////////////////////////////////////////////////////////3////////////////////////9/////////////////////// ////////////////////////d/////////////////////////////////////f/////////////////////////////////////////////9/////////////////////////f///////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////9/////////////////////f/////////9/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////3//////////////f///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////3////////////////////////////////////////////////////9//////////3////////////////////////9/////////////////////////////////////////////// //////////////////////////////f39/////////f////////////////////////////////////////////////////3///39/f///////////////////////////fv9///d/////93///3/////////////3d3d3d3d///////9/f39/f39/f3//// ////////d3d3d3d3d3d3d3d3////9/f39/f3//93d29vb29vb3d3d///9+/v7+vr4+Pj5+vr7+/v9/93b2tnZ2NfX2Nr/+/r6+/v9+/v7+/r7+/v9+/n6+v3d29nY19fX11dX19ja2939+/n49/f3d3f49/j5+fr5+v3d29nXVlXV1fr1dn/Y19dXWNn49/b 69nb2dvT0dPX1+9vWVFJRENDQ0dPT13/39vTyr++vb7BxMPHzc/T5/dXUUhCPDs6NDzTwOdfW11VU1nTztXLzNHd38zKzs7R219jVU9IUU5Zb+vX19fNzM3IxsfKz9vvX1FOSkVFPz07OzUxMjUzNjXvur/N3cfBvLm5t6+0tra3vby5vr+/xtF3S0VBPz9E P0BLTEpARVPb21VNV0tDOjo8Pj0+OUe7zedHOzo2NzastN3/49vPxbavp62wr6y5ubmxt7vFxNvvV0dRRUpPR0VGPT5APjg4PUM9ODgyMjA8OkBbW1dZUUlDR01ANq6pwl9r2dndxciwtL65ubvBura5s7m3u87L2dV329//0/frUVNXQ+NdUU5CPTAvLzEs O87VX0c6PDYxOTc0t7bIZ11r/8jFwLS/xs3L1WfRys7R0dvX31nvz8HJvru5t7vFwsTn2b/G409PSD01OTk2ODg9PDk5Mzk+OTBTsdNIW1VJ1Wu+sL3Jw8LKv7+5vMDCxd/3d1X37/fZycPCyuPX0+9Xys/3Rz09LjCv0UxESkEzOjc2QkQ/Pi6px2/nd/d3 58fCttPZ2cTFyrq5uMDDys7f/1/L1cvR0ctv/93Z/8zO399KSUVDP0JGPENGQjlFSUZJWWtPTarEW1FPT1N3ysfBWdfOyMTEurrD3dvva0VFR01v38/K1cr3587jb83L3WNdXy+ux9dGRTktNDQ0PUo+UWc4qLPX2//fSMjb58prd9HbzcC6vMrX29/ba1tN 39/KzdHLz9vTys3N693NT1lTRkBDST46Ozs2NkpETF3/6z3BqMVJ/1tXyNfvy3fj387Cz8C/yc9fb2dOR1ndy7/D1b7L1c3GxtXO0cDOZ0vGrV/bOjUsLS4sL0BCO1VnLE+nwU/j3V+/yM/C78nFw72/ub7EzXdfb1lCVVnP0c/nzdXX0cvL1+/fd/dTa1FL RFE9MTMwLzEyRUZLV+tHLKW/S1lfY8vK3fe/38DFvL+7u7/O1VXnVU9j2bjBwMq9wsPRz9Ff13df90U8qudCRD8tJSwrKy9AO0XdVddDxKrB987L08fK58HDxsO4u8fKxdn3VW9vRE5M0dfZy8/K2eff2W9OTEdNW/dZTj1ERjUuLzM0NF9Lb+vX10w3pLlv wOu7z8jZyri7u7u4vLy+0/9ZUU1FTVvn02vIxtvf92tbY0hnTFM9X7DvS0c+LywvLS45TUZv5+u81VGir9G/zb3Kx//fzrnJv8HBy7/jUUFERDY7PkpbY1Xby93/a/ffU1NJVVnJb+tXX0dFNzIzNTpZWefjvt93Obyqxd/Cy9nLwtvHscm+vsnNzudNRTtJ PjtGQ9dR78zX2f9rT19O42t3a8+rz8FTSTQyMi42OEZLy1/IxMZTRaG577/N2cfVW+fCu8++0/fXb01EQD89Oj87UVdVd9nN729rW2NPU3fN/8Lrv1VJa1M1Oj9AT2PRz8jP0WM2n7bLyePHzcjX1b26zL7H13frR0Q4Pzw/PT5PW9tfzc/VZ1njVV/v789J or251Ug7OjYvODtOV81vy8jD3zmktL1338930efvZ7zrws7va+9VQT9BO0E+OUbdW1XFzNFfX2tVX19fzee51cjJW1lVPjg7QlXb1dXbwd1rP6ukuWvTz+PF4//Tws3VyltVTUY9Nz46SEBAP+PDY8HFydvf12fXyNfXvqayvdFVPTs+KzI7QmNrX8zTyVkz n6u/19/3/91XX9/R0d3OY1tdSj48QTtBRTc7791rzcLMy9vr0+PZ28XMw7zJxedfTkM4NzhTSN9P0d/ZQzOhtsjjd+9nzl1r19fT281PXVlLPztIO0xTTEz3vtnHvsHD09vV3cXRPqGtvb3/bzRGNzIyNjlCYz++X9VbMK2uvs3fY2PZ2U/Xzu+/619Id05B Pz48P0U+U/fZ2c6+ysfN787f09/L2b/Ru83nS1E/Ozo7TEfjSdNLT0kvtLa//+NV78fT48rHd+vFW1lPUT8/P0pVVVXfxLrRwb2/y8hr42/M69+hscnO50E0PjgwOTQ7Q0tMv9drTDSftszK62fv0dnn1cld0W9dUWdJSEI/SEhDSVvI0cvCwMPDyf/V2+vX y9XFz9VdZz9CPDU4OkJCSVfjTkdHMam1v+fOa//Ax83IvdnM1WfdT1tCTURMY1ndW8DEysDAxdHNVWNT9zqttb7I40swQD8wMTAyPEI6RtPn7102oq+7z9N3UcnZz8vH2czd51P3T1NFREpRSFt3w8PRv8DCxNXfX29fW93R78rdU0M6Pzg3Mj07RD1VU1dO TzKgsrvby+dnxci+u8nNwsVZT+NPQEdER/dO2c++xtO/vsXI21tdSlk6obPOxsxDMDU4MjUvOkM9Odnr711LQ6GuwcfX3Vff08C778/F3VlPXVE/RD5ISD/fXc/G0cDFvsfRb29ZWdvM0V/D1UY/OTs6MjBJTEVB/01OVUM8oa69ydfL582/urfTy77vWT9L OkA6Q1VfTtfZvsbbvsfJzeNbV0k7vKm6zr53Mjc0Miw4Mz9JPEDj59X/Vzqfr7rJzNVnz8m7us7Kx8xLQkk6QTk/TEtIW93By9u/xsPMa1dXT2PXy87v1e9KPzc8Lzg+RElNRl1f32tGxp+vyL7RyszDwrG31+u7T006PzM1Pz9vY09MucTX68LE1dFZVV1H N6SwtcvR4zI+MTEsOTlGU0xMW8V331dHn7C9wMPT18nLtLnOZ79OXT5FODRCQVVNR07EzMfVy8vH/19MX1fj0cLGzGPVSzg3PC88S0prTllJX+PR7zilrLzKy8f/v7+yu8RvzlE3PDM3N0RP6+td586/yePK3df3U09ZOa6us7vEa0FBNDE1NjFCRVVZ729r yddLPp+z18PK48/KyrW7z1n3UTc1STE1SEpfVVVd/77P18bT1etVV+Pd18y/xcxvX1k2NDo/PkxF3V9RT+vf3eNKobfFz7/X07++urrVd0xLLzI2NDVGY/dja+fPzMPL2dXZ51tXZ1WmsrrDwFs+QS4rPjwwSk5vV3d3a2vHX0ejtcTJz8Xrv8O/t+ddTUI6 LzcyOExAXU5fVf/Hxd/Z2WffXffJztHCv8PKz0s6QS9XPElNU+NKY/93d9X/OJ+zws7BwNG+ybm660dEODgrPTE9TF9rZ8t30crDa8bvZ99vTc+ksbm6xOdCQTI2Mz81ONNIY13/b13/d/+/qrrX0cLDyL/EwrxXVUk4NDI5NDhrP3fr7+vXxdXVyF1b1+fP vcLGxbzf11tNNzVJSEVAd0tdQVv/b1tbQ6apv9vOu8G+wr2/y0hHPzAsPTk9PtlfzszZ1cjJ68TKb+vn90Kfqbi8v8s9QjwvLzs5OjjvUdtVVe9n52dOp6i938zGxb2+x853U0RBNC8vQzdISff379HZzcr/wd33/87Lw7y7ysbJz29HPzc1P05EQUlvSVFT 22vrVUalqLvfvb3Ht7vHxVs+PTsxLjQ3V1V3/8jbydvAyVvE5+P/zkeun667xMNFPj43Lzs2NDHdQWtnX1nv79lvO66tvd/JvM64vMjLTD0+PDcxNTk81T7Z03fT2cbVY8Zvd9vNx723v83JvUtVQDs6O0VLN1FKU0tOX+f/90lEo7S7xru6vru2x8VENT04 LjI6QE732+u8zs3XxtdLy1/r299Fn6m0wsfKNz44NDo1NDo+RE/P61VZ3d/JRUCisr/Xv7vAvL/dzUk0PD02NDlEX1dbytPf0d/R20z/92vLx8W+ucPM08xPQkI5OjtDPE09S0Nv3+//5+NPPZ+ywL66ubu3w8j3QC41NC84P093Vdd3vd3b49NrSGd3a9FI raGttMLGXTw/OTo1MC9GTTtFXV/bVdHO61VEn7C8vrzDvbvf12s8MDg9ODVISWNHz+/bx3ff0V9dWWPjyb3Ht77Fz8hvSj09Pjc5PURBP0xVU8vNb9Vj42elsLy2ury4usvOVzMtMDc7OlPnTFvPztlry0zjSVVrZ+Pn36Klr7++30o+Pjo8Mi4/Pkg+4+tf W8Vv0dVMvaavvbm8vr3CXeNVLzM1PTs9Tv9FTs/v3VP//+vfPGdn2b+8u7fExcnTTkU/RDw3O0w/RUlV3ffV687nvUS0p6q5tLm1vcNnWzooLi09O0Nn609byMj3U0LdY1dRW+vZTcykqLa6wllDPTk5OTAvW0FCT/fX2/93v+/JO6ekrr69uLvB60x3Ni4x PEVBTGf3Q93vy11JRuPNP0Z328u8vrq8v9XOd0I4Rjo5ODpLTkRbY9fN39vKw+c5oqGru7q3u8rVSUMtKi40PkdP69FEzMrTa0FC7+dZR+/Z40GfrLOzxetMPTs3NjYuOD1GQOv/38/Z68LLykzZn6bAuLi7601JPzctL0BKR0z/d01V3dlfTD7Pb11NY8jF ur/BvsFd42M9Rjw3OztBPz9MY2Pdy+fbvN3IVzafp7q4t7tvbz44MiwsPklPT99fd/fN129NPtXZZ1Xfx+fboLW4tedRSj06Njg1LkpEP1lb3d/V78O53dPVSqmisr+4vkNEQDc7MDRKW19ZXVdv31nV/0dvb+NOZ93Vvr29xsHNW1VPQkI2OT06Qk9JQctb xdvTx8HNztXT05+mvLPL/0Y3MjE4MEZbb/df92vBX+d3d09I429Z091Co6y1ybtRQD5LPjU1MTlKRk9Ezsznzsm/48zOxMREoZ+uxONPODw5N0BCR1trd01N/9Vdb2fPUV9nX2/Vyb+8w8bO208+Sz5END08Qz9Mb0zrd7/KvMTRyc2+vFHTn6/L1VE4NDYy PT1IU1PXW1fXxF1X51NnQGtby99XvKSuvtnEUzpCO0MzOS0+Qkpf28/f17rTt+vbwcDE/0WfreNvOjo1Pj9NXVVJT/dXUevba1XLTuNLVe/Tzci7u77K21tKPDs9Qzk7OUZGT1fZ19nPwcHB0dO9vL/F/6Wrv1dJNzY6QUFVU0pNb+dR293vVV//50hRZ93d QqCsscn3XTxBOjtAOTQxP0xVa86/0cTGxr/d0cO+x85nq6y8RD46OkVXXetNS09B71Vf52ffTGvNWVF398fCvbzB6+dMOEU4PTtHPDpFXVFV277IvcTOutnDv73Ex+OvrbtPPzc6PUdMTFVEU0drZ1/r99tBQvfvWVvdQqimrbfv1TxARD07QzY4Mkhd9//I vr6+z7rjys/Cys7R36uw0UY/O0NMWXdXS0dIQlVv/13TXVFfU8lZ39O/wbq6xuP/Qz85OThCPT09S11X58rFvMjHx3fByb3GxsS+s8DPQzs8PElNUVdIPllAd+/fV85PSVl3yV/j72ezp62/2103Szo7PD85OD1CXePjv8G40cvHW8rKw8/OxsG80+tCPENE 79tXTkxFSEVj4+Pra293Wf/E99fNvry+wet3Qz07Nzo8Qj5ET1tK99W9vcPBv9HjusO9w8XCvsTrX0Q7QERPU0pJSEBLRefb99lTW2dnd8/jyc/CtbO3xXdJPEA8Pz9FQj9TTkxjy76+xsy+4/+9zszJ38vB3VdMRD5FW/9jT01bT0tV48rbY+tj3+PnxsvH w7y9v9HjST8zNzw+RUZFU2NVR9nGu83JycLj18HFxcPNxr7ra01ESEZXVWtLSU1XSllVzM9TW0/f3+Pby8vJv7vAzN9TQDo8PkJHS0Vrb1NT48C71czGvf/JzcnMzNPDz19KVT1KSmNjW0dFX01ZT1nK3Vv/b+fXxtO/w8K/wsz/TUA4NDg9QUtKWef/WVHT uLzNzcK+zsnExMnJ08bnW01NRUZDTVNOS0RPV1VNT8/nTmPr18/Hyby6wLy+yNtLQzg3O0JDR1FO6+/vX86+vtfXzMDM29PLx9XR02tNTktBU1NVVU5ISFFrU0pjzudf9+PVxefDwbrExtHfVT46NzQ8QEVPV2/n/3fnyb/BzePLwMTLycu/zNPTZ09JS0RL Y0lVTE5IW2dfVWffUVtv28vG18a/wMrK7+NMQj0+PUdLTV1Z393f3dXRv8vZ487E4+vbycrM42NTSUtHSFfdW1tMU1Nd/1lfZ83dX3fdxM/PzMfIzutZd0xCQD5CSVNfa3fn2evZ4+PE0ff31cPj29nVys/vVV9MT1NLU99va1dfW+/j/19n2W9OZ8zCzdnC ycrPb1NbR0RAP0tKT1Nrb+/O787T27//d+fK1dnd1c/HzP9nTltfVV9nz/dZWWNZ7/9vU1vdX1lnztnNd9nZ3WtbT1FLSEVBV1db5+ff287Zz9Xjw/db68fR1ePf09XZa1NTT1tMT1n//11fZ29v52tjT99L/+/K1c7b19Hn6/dXV1FPS01fW2/v9+/T293T 0f/Kd//V69vj993X09VvW0xbX19rb9n/Y29jd193Z1NO51Xvz+/J1d3n329nW1tdU1FOU1lv79fn49fX1+ff/91rVdPj1ePr69vd32d3TlVnWWNn4/93//93//93V3dbV9XX69HP5+tva2dZXU9jT1ldWWNn2dvj3dPV32/NXf/j/93n593d387jd/dVXf/3 b+vd9+dr72f3WV9O31dd993n2dH/91/3WVf/U2NTWWtdd+vd1dnn09133fdvY2tn3dXj39/n0+9r/1NZZ19fX+9r72//Z+9dd91bV1vr5+/X0+PrX1v3WWNj/2dn72Nr6+fV0+fX29//a2P/Z//332vX4//Z52djU1t3Y/f/5/fna+//52P/Z2dvd//b39vV 3e9vX11jZ2NrZ2N3Z1/d59/X7+v/d/9f91tna+fb7/fZ693f7/9bY/ddZ2dr5//jd+f/b/dda1lf/+fr387n929nW2Nja/93a3dna9/r2d/j9+N3a19fZ2d39+v/5+vv3d//a11j92drd/fj9+f/7993Y2/3Z2fn2Xfn0/d392NZb29na1lnX/9369/b5+fn Y/9rZ1tvY3fb5+v/3efZ2+PnWW//Y2df9/fn52P342tjX3dXX3fvd+fV9/fvX1tb/3fn9//ja9/n2dvv699va2dbY29db+tvY//rd+Pr93dZY/dvb2ff6+fn9+ffb2dr73dr2+dv59vv63dnX/dr//9rXfdn6+vf2ffn/1tZY19rY1//4/dj9+Nv2e/n73df b2drY+fb49135+Prd1/rb2fr43fr1+9va2NVZ2tvd29n73fn69vj7/fvZ1tdXf//Xf/j52v35+Pb//f3Z2ff/29r593j3evv6+trY/dna+P3b//r52f/XVv/b/dva1//6/fj29fvd2dnWWNfb/djb+PfY+v359/n69/3Z3fva2vd19vj6/f/62tbZ2tbd/f/ 9///b2djW2dv9/dv/+/n693Z2ff372ddWWf/72Nr/+9j6+fr729vb2tv//d3b+fX393v9/fva2drb2//b+///+t3b2N3Z/ffb2f//+/v39vb/2d3Y1lfY2/vXf//63f/49/f/+vnb19v/2v/3dnX4+93d+t3W2t3b3d373f/b2d3Z2f//+N3Z/fv7/fn3d93 d29jWV1n9/9v73fv59/f4+t3929n9+9v93ff5+fva/dr729fZ29vb2//9+f//293///v529j9+P34+ff42tva2NZX2P/b2/v9+/3593n5//jb1tn92fv793d5+dr72//b2dn///3a//rb2v//2d3b//rb2f/4//n393372trY1tdd/d3///v/+/f4/f/Z29n Y3f3/3d35+v37////+t3Z2d3b3dnd+Pr//frd2//6/9na+/v/+vn4+9rb29nW11vb2936+t3993n5/f/919bd3drb+ff4+t39/9rd+9na3fv/2f/4+////dr9//r62t39+f/99/n7/9na11fY3dvb2/343fn3+/3d19vW13352935/f373f393f3b3drZ/// Z/fd5+9372f/5+t3a///63f/6+Nn/3dvY1v/b29rd+v/b9/f6+v/b19VVf/r79/T3+v/d/9nZ29ra2tvb3dvd+fn////d//v3f9v///v9+fn5/fv/2tnZ/93d2/34/933efv93dvZ11Z7/9399/v/29rd293b2NrX2NnZ3fv493v63dr63fr//fr6+/37+dv Y/dnX1ln993Z18/V3e/j/29nX19bVVVrZ/fn3e/3d/9ja29jXWdrY293d93OztXb2+Pn4933Z2dva2Nvb29rd+f3a/fv//9jd3dnY+/X62drZ1FTa2dnb1137/937/fn3+fn29POz9PP29nvd01FPzY8ycvfa9/R43ddV2dba19f393d4+vHz7+/wcfb53dZ TUlTXV//79/b29PN083XZ1VR/0dHPj4/PTw+Ozs7177H62Pv79vKxsLCw8THyby7uLu8ur7Av83X41FMR0ZBOjs+Q0tHSUtNSkdMVUs2M1m9y19ZVdfZb2tdRj5KTkpPW1tMY19jzMO5vru8vru5s7W2uby8v8XRyM/dZ0s8R0hET01MSD9KUT1LTD46r669 71FHQ0JCR0c8O0tITEl3b8HBvby0tbu3ur/Ay83bZ1VPQzs2MDs8NTE3Niq4vd9JUUA2UVdCoKe0zsfZ0+ddZ1nvSe9BRXdvxc7AvLi5ure3ub/Da1VVW0g3N1FJ20NOQUz3Pf9KWU1ZT01PRN2ftl/fUUM+Rjw4b0g+REA6TE3Ty729vriyt6+/vMvd60lb Wz9DSsfjX1NrTKG8xd/3PzRGSUFPM62p0TzvVztHPE1JT0n/SU1Md9W/ubivsriyuLTA5+M/bzs7PklIQl1n/2tJwUZHXU5fWWdCSfdFL6PIQD83Ly5FNUtNWU9DV11X1bu4r6ytrrWvsrrGW0o4LDI4V0pRWVtHob20x+9RRsjjU2tZR1csn8ZGWz4vT91A PlE9Sk9LUdXJuriwrq+1urm61V9BVTdENlM2PDg8U1U+19O9X8vZz1PR4+dP/y6hyU9XSz9FUT1GS0NGPk9Pa+u0u7CqrLO6t8HjSUouOjpIOVtCPbesu+/DWURfwndKZ1tf929HLZ+5Y+db2Tr3Pz/I/0hva0j/zL22u7S6u9Pn30ZVRDY4NTozQjpdVVNr 18DR08nf7+9Xd+9PRy5dpsZHZ7w3b99JT11jTldPTOOxwLyyu7fT3VE+Pj04OEF3OTmmtLTb0//vzs7vsG9A4+vnWfdOMKC6TkjnPjjMSl1nTkPrW0s+xrbIvsm/wc9TRFc/RTcvRzM8QE9fzc2+vbu4z7+13VPX32dMPTOit11fTMJIa+9KSkE9Q0tBW1HB t7u+xt3VXVNnQ1lXQVvNV8fCvsjEybzHyMfTytPIZ+fOW13bunfnSUBjR0bb2UljREhDS1NI0dPP09fvXVs8/0ZVPkFBX0/Z99fXxsHEv8rI273H7+PN51dn27/H00pMY01PS9VFU0VHSllZUUvD3e/jZ1NIQUpVz9Nn/75LznddXdHH1cDKzefjxt/n0+s+ /8/VUUNEPUl3Z83P4//3UUdn59F32c/V59tnZ0tnX1NOU0/XVdN3z9vRwc/O19nIa+fr49vdWU1LREVIRTxDa01fZ3fv2ePXb9Hb7+PV6+/nz+fXd9H/999r59HrTHdZXf//b+/Hb//d0Wdd3WtER05HV1VNSv9f1+fjzdvV7+tj3dXb1dHP49/322/32+vr 69Nvzdtra913X//jXWP/5/frXe9dW0tZV0tITkZXWeffd9l339137/f/4+fb09n/63fj/2/j4+/NZ+vLa1NTX0pda93b3/drX9/T1dN3Sj9OT0FKa1Xvd+PM39vKzc/X0dPV09nO/+drWUFGS1dOd3dPS1FMSUdKW93v4+vT29vLz9/r3cvMwMO+zsrNzMLD w8PCw8HKztHd12tfS0Q/ODI0MjI4NTU4Ojc8OTc4ODc8OT5JP0JjuLG0uL67vLmvuLe1ubWurqypqaimpKWprLG+zv9ZR0U+OzZXMjMvMSwrKSssKiYjIiEfHy8yLywtLjFBRNG8wL68r7Gvq6eipKajpaapq6iqrLK3ubvJycDL0/f3V04/Qj05MSssKbas wVU0KyEoJycpLS8uNS83RW/GwLGzqquxub7Va1lPY9fT59nAtbS6sLi1uruysr/A69td97673Ts7MjMuLCkrLScxLzc8U//n1/dra9lVSefv69fj0WfTvsO+r7OtrK2yuMO5vdf/QUmfoa/XXS8rNi4uMiwmMy4wMllfZ0/Iu9lLVUlAMzAzNDQ/Y0vJwbWu qbCssLmxtbO+2d01pafC0b7rOdfPT2dHREzrOkTr38hZ00pJODAuLygmJCYsLTE5QlNrwri/w7/Fur68ubzETqqfn6e10U1N611C3zZNX8HfuraysLCvvrTjTTQ2IiEiICksLSozPj7PzLzC0cHZtb7VX9cqn66wyUhjX8LNycP/58DCuLeyr6+zsrvCZz85 MCsvLScsNSwxLz00SUxXymdvX3dd601fSSyfn7G2wjBvQmtGXfdVu8a1sqqmqaqoqL+tyGM7KjUoKzsvOTc5R0TTV+fDRVM7Y0c/MiwhoOs2Okw4Z0drd+tj28LLvbqsqKmqqq65229dPS8yOzQ6W1dMTVfDxLXEvsVjW09GPzcwHz+1odvvQyv3KTlCLzpB TnfGv6alo6SrqLHDz1c8Ni45M/863W/3xruuq7DIr8RXwudAMiohoNMuLyswNyw7NEgzOjxG/1nVra6xsbzfU0BFOjg+Pv/DvbvIvbi2r6autba0ysXOSDcuJ6VO57LvRTBnMDQ7LTE1QTRVXc61tK69ve//SP85PjwwQNlb0+O+sqispqivr8XHr8VJPUMu qPc+OiwvPjA+Oj80OkE6OU/PzrXTyEI6My03Li42PU7LzrvAt7CqpqSqr7O1v8vOTz9CKp9vrLr/VT5IND5NLjk1PztJ48O+rtdXRzk8NjYxLjM2RG9Pb925taqmrKy8ucbDyk5DOiahuF9NSzM92TzvXUhJSe9HS867v8Oz51EvLi4tMCw6MWfZb8vGvrav r7Gyx8njb09bP0gtr7BJu6nOS8NVRkXVOlVV70vItri9urVRQj47Oi48PTs561FO68PGuLWpuLXA3UxK9zZNMSus9zg9QC5rxkrj71fTd8BvwL+zwMPOzDw4Li44OTpFY2uvwLi7t7CurrO9a/89QDQuOirbrMMpvqln38JfW0dOPF13Y/fGvr3Du+fZPDs+ VTXva1lNw87Iw7Wzr7Krvs5vQjs1Kzo1NLzKOzU7QTxbU1v362Pb377JvsK2xsHbV1cvPD03SVFr/7vCrruyvKu0tLXNRzw0NS0sMDLdwXcwLK68wMfL61Fb1/fvz1/jx8LD1+9NRDw9X0PH48F3usi5urixrrOuw+tVOy80LjAw3ddPNzQvPkDXNsXRZ9fK 18e/x8y/1+dOUzRCNEc8W9fZxrC9rLStrq2wtctvTzYyMjMzLDvA9z0wLLvCtO/Z21VOz13fy29j51VdU1s5O1dTa2/3vcC7wbi6sbivtLi7WVdDNDY8NjI+5+ffQUo+RFddP7vj78TPa8nN0dHTW0xfOz0+W0xGT//j0bXHrbeztbrHz2NKQjg4SDg8Pl3j z1tXX9FfuuO1ytPM12djd1lZW1FFVUY+QkZNW2vr11m+77rnzcHKxtXPXU9OTmtRW0nn09Pv5+Nfb8BRt8LDzMbZb9Vv/293QkZFQD5JT08/S1ld29m7z8TG09dnd0ZNPTxOTTtH/9/n23fP18Xbzr6+y9XFztnRy+9rVUxVTVNOd293V3fT12PjzONZW2dV Sz9JSEhISV9Va+vv19V3//dr/9nMvL3Ry7vExMrF2dPvd1NXV1dva1dMZ2tTXf/M2ffZ729RTUZKRklLU0xdVf/f3e/b291Xa8vfZ2PM59f/63fn91nf59935+dnd9nP4+/rxd3r92vnb1dbW0tfVU9Xz9vf69/r52tZV2Nfydf399/b1+vvY29jY+/32ef3 7/9P92fr79Pbd2tbd2//WWv/d1lvY19bWV/r3+/r691359fvXV/vX2tVUVVVa1H/69nRy87X5+fP493j3/9bVU9jW1t3Z1fj99fjzufZ1dn39/9jXevv42fvb+fna11jVVFVWW9d//d37/fv3ffX39XOU/dTd2d3a/dn/+/j59fV48/P1XdvX+dZ92//a2Pv /3dVU0xTSFNf72fj7+NbY+fv3e/j3+9fW2Pnb3fZ5+/f2dnf09Hbzsrj9+ddU/93b2djY1H3X1tfX1Vbb29f7+Nja13ja+vb59nZa29na19d/3dj6/fjzNvv3c3N0dnb62Nr92dZXV1rb2dTXU9XT01dX/ff4+djY+tn99/X32//Vef/9//X5+fV3dff5+fd 1efj69frVWvb629v92dVTV1fV0pOa3drb/d3Y13j///349v/XW9v62dr0Wtr7+vr3+Pf39PV793v73fr//fr/2f/52Nr91tdUVNnZ2tva91fZ2f/7+Pva1tfW/drY3fr59v/79fn3+f309vra/fvVV3rd+t33f9bZ9/ra29n39vn1+Pd/3ff99vb4+djW19j /11rb1lfa3fja11jY+/jb+fn/3dra1//Y2//Z1vn7/dn/+/n6+fn2dvr42tv99/f59trb/fvb2tn72/v7+N3593//+Pv72tjWVVd/1tdY1Vd9+NfY2Nv6+ff3c/d69/Z7+/Z/2tnX//v52935+9j92/n73fv7+/3W/f3Z13r4//n//9vWV1v/1lVWfdv9+fb 5+fj29//3+/j//f/7+v39/9j9+v/3+v/72/vb+Pj2f9rXVVrY1Vn71dXd+//W2Nn7/ff29/v793Z39vb6+/3V2//d11r6+fr79nf5+drW3dnY93vX19da2Nnb3dnX/ffb2tdXedv6+Pb193f52v3///nd2Pv6+/vZ/9j7+t3393j62/vZ+tv6193b29r/2dd a1Vb/+//a+//a+/b2ePn/+ff793f72drZ2dnW11nb3djZ+fv6/dr793v9+/3Z1trb3f/d3dna2/j919fa+9v3dnn3e/j4//f39Vnb2f/d2tvd2tnX+/r/2vvZ2//X/fj92vrd//3a11ra1tv5+//Xet3Y93d3+dv6/f/7+vf6+/3/+vnd3dn5/9vd3fn7+Nj a2/3b+v/719372tnY2NXZ+Pn/+f3Z29j//f3Z3fr6//v93dna2//5+/v7+fv9+vb3evvd+/v9/fv63dr5+P392djW1lfd+frd+dbW2/33/dn73dj/3frXWddX11n73fb3dnn63f33eP39+/b3+PV7///319ja19jZ+vX93djXWP37//vY2///2NjY1tnY2N3 d2f//+///+Pb4+frZ2//7/fn///r2dvd3ffrZ2/r//dvd+tbXWtv33f/7//3629rW11nWWtda11r39fn6+Pj4+P/Z2/33+Prd+vn7+/3/29jb+fn69/n72/vd+t3b+P3/29fb19jX2NZX2dnb///d+vv4+v3b2/34+/j93d37/f/Z2vn9/fn5+f/59//X2d3 72/v6+fr5+d3b2NvY19dX1tdd3fn4//n5/f3a+/n2+//5/93/19na2dn9+N37+Prb/f39+fr92/f4+f/b2Nja2dva+f/3+f3a2/v4///d//r99/jY1336+N3b2drXf/3/193b3fnX2f3b2t3/+//7+Prd+/363fn9/93/+/v///va//n52v/23dj7+/vd2vv 9/dj6/93a+frb2d39/9vZ+/j3ed3Z2drZ2t3d+936/939+Pj2+PvZ19fY/drZ3fr49/va2tv7+fda2/3b+/ra2drY2d359n35+vva3dd99/n4+Pn///rd2/3///n42tf/1Vjd///a19jZ2N36+/3/+djY1t3/2NjX3fn5+/n7/f33+/v293b3+P/3+vj2ePf 3ev3d/9XT1tVb29fd2dbY/9rd29nb29na3dvXWv39+9d7+v//+vr49nX2ePr9+/n6+vr4+/v5+/r92t319vrd2dvXVlrb/9n//fra2NrY19fY3dvY19rW11vZ+/v69/d3+fn6/fr3+PZ39/f5/dna+f/6+9n529ra+fvd2t3/29va29nXWNn929fb2trZ2tn Z/fv5+vn5+vv3d1vb3fv//f/b2/v393f4+Prb2/va/93b3d3b3fvd3f3b293a2tjW1lnZ3d3/+937+9v7+fr7+fn529vd2tn9+936+//9/9r/+vr593d6/9373djd/fv73drd2drb2djZ2vr92Nva3fv6+fr6/f/7/dvZ2tr9//r9+Prd+/n72f/5+P/7+fj 7+/n6+vr/29jZ2tfa3dvZ/f/b/93//9n/+/nb29jb3f/9/fv9//j729j92//d+fb3+vj3+v3d/fr33dv////b//vb2v39/dvX2fvZ2trb29v//93a3f/6+Pvb/9va/93a/9379/36+ff6/fd5+/39/9vb2tdY2//d293/2dr7/fv5+t3b2tfd2//7+/r93fr 93d39293b//v//fr5/f3593f7+v/Z2drZ2tv//9v//9vZ2v/b+/v//dvb///d+///+/v//9nb/f3d2/v7+9r9+/v5+ff3+/v6/dna29v/+vv/3drX1lja19n5+Pn4/drZ2dv7/f/b/9vZ2t3d2Nvd//r93dv7+939+/v9+v/d3f//+vf4+fn3ef36+Pr9+fr /29fX3drb+/r7/93/2Nna3d3Y19ja2dfd/f//+/3629vb2tra/f/79/f6/fv92dv4/fn4+/nb29rY93b2+//Z2NfX2Nnd+9va/93a2fv69/3/3drY29va2drb3fr4+/v4+/v4+vr49nf4+tjZ29rb3f//+vr6+/r5/f3d2NrZ1tZWV1jY3dd/2tZb2/b5+PT 2dfVb9v/b2dnW1dZWV9ZVWdrX+ff09vR2c7T2dfOzs/Z23djWdn/Y11NVVVNR0ZFQEBF3b7G2fdrV1dZa3fX19PMzdvN0dnTzcrNzNPb52t3a//n//9vWVVXV01IRklLRT1DXf9JR05VZ2///93TztXFxMjDxcHHycrX3efj9+/3///j69lj2c3n2XdnZ09T UXdHZ05CUUxLTkdITVNTzbi/yf/n91tPW1ldS0I4Qrvr12tXSVdJTFXv92P/083GvsfBvrqysrW2vcHIvl3dZ1VMS0M/STw7PEFIRkRZwNtASVU/Q0FNSk9FT0JDSUpIZ1Nb32fdb2Nna1/HxsG9sbSyramrrqappKuqsbu2tsu8uG9POy4tJCcpJW8tKiEj JyAoKy81NzZEr7/H29lfPkxLPUJBNzdCQ0pnwLu9r6mrqqempaipoqSoqKuprKirqrS4w+dXPjUlTLlGKCgpISEnKygnJyUtLSctQT4zTuNNV07/2W9T38rKsrSsra2ssKytq6q2scjPyuPvxb/Kw8XZwdHNXzGsujxVOTkqLyssMSkkxd88Kzs9JS8+Q0lP TT9PX0Lrx7+7rayrp6yvrKKqrrevsMpf311d329Ob+9rTT0xK6fbPUJjQywzMDg9TlFAS3dN9/9COUVLTTo3OTw2MjU6Rf9vvaits6uqqKmxrq6528f/xudrb2vG729NPD0sJ6jLNUk8Rj1MRFFEOKO1yUlZP0JVPllvRTJMQzgvOkJGS9vIvbyzrKaqr6+y wr5PyFtZS0ZOSuNNS009bzkrn7JbytdNTdU/Sc5HTk5TSWNZPD9APz9LNDc5Ni4yMTxDW8y+wL6srKqlq7K0sve2vetXY1XD087Z2UZrXyyiv79NQfc4SWdNL6TB/2NTPTI2NjZHPjk7Nj45PDQ5RUVfzcXHvruvo6+ssbuw78/JZ2PIyMDG2dtdTFlfXTKf rc277+M8R0z/PjkxNT0vLjIyMi46NjMxODU8Nj5DVffLu7a3rqmmo6qssrm3u8bJ71m8zsHZ70s/V1NrKq6uz99vWS9MOSaqSDwvZywoMzsxMzc3PS84REVAQ//Jx765ubGmqaqop7K7uKvbwb7f78PJz8pVW1tLRkMrb63XPkk0NjdFNjY+LTM+LzY6PzY+ QU4/PkVNVVvv18/Lt8C9saurrKiqr8Svr8LPy+v/x93V605PQ0dHTz0vq9s3P1MvPT0kql9ZM004LD86REdDRl1bTWv/01+9wcC7v7qzr7Cvr6e2t769t9/FxtPLyd9RTEE+Pzs5NDCsYzRdNygvOTc2NzE3SP9CU0tP91vr1edP2dHPY7/EwbzKubu0sLCu r66/vcDOS11R99tv/1dHQD9GOD4zJabOTEI7My86Kay2Tj87QkNVW1NXXVfr0WPTy8jAube7uK61uri0t7m5vd9nv05JSVFETktTQT9BNjg2OTwkp77nQzo9N1NPT0Q+PldZymfZ1cbT48bE5+vOyMa/yMq4yb/Jx77K0bK6yV3/V0dETU5XTEk8Pz04Qjk4 NSOnsv87Sz8+QjkwpsHZzMTGd8DPy8Pf27zP99vD193Ay7m8ycvIwMLVyNvjRVc7SzpPPDw+Pjo8Njo2MDo7J7euyU/n70/ny87Ld2vG27zJxsLF2+PfzVlNU/drZ2/T389ra9fdWb29xttnd1U4vlP3PkZVREhNRTw+PEEta6y7S05nV29HTqm/ytHNW+/D 68zN/13Lym9rzstVzMxr529Ma2f3U01ZZ0NES0BI2U1ZUVtrTVVNUU33/09XrLDL0/fv/2Nd6+93W9tMUcTP293ra1HfT1tX611nvmfZ929r3+PGzcnVb2NCPz/TSVFHTm9V/0lIWV1nT9W2tbvH08/ZX0qqtLvT39c/vT2/SGdRVV9PTFVRTkvOT1VXTkdT W19KZ2NdUUrnVUxvxU1nd+vvb2/v/+tPyLquuLzN39vO2+f/11tT509HSlfbTEhPSEZATUJXTc5nUU9RU113b+Pjzd93b+NjVcl3/9XZ/+PrV99b/89TZ8W2u8PXz1XfsbW7ztlOQkTGSltHPkVJUT9LRUb/SFlZUVVvUWNMX1XK0ePj09fvusHEzsrf19fX 2dnZxdXby8/I411jT0xTUV1XZ05NRudJW01fW1NdT1FPZ+v3b9/rVWv/b3fb99HXZ+vjb3fE48ndztPR0+Pv683f1+vMzMbM2fdZU+tZWVtfTktHa0pRPkNHV1lLRUtnUWdnd2//3e/Vd/fVzcPGxcXD0by8yc/d1dXf619r1+dva9nXa2djWVFRW05HT01I RT1VZ01OU05PTU1TW2Nd43fv4+PZ7//R19fRzMjByMrXw7zJyM7P2dHVztHV39nb39/3X05CRkBKUUdLS0REQUxvSUNGT1dXZ1VVX19vb/fX1dvT49fTz8nFxcnCx8vDusXM38/d3dHX72fra3dd619XSEpHS0RJRkhMT1FTT1VVRFVNVUtvW1Vn6+ff987f 1dfXysjExMTHy8XFzs7O0cjV7/d3919ZX1VPXV1bX11LUURNSVNRR0xKWWNXa2drXV9ra9F379nV19fN3dfZ09n3z9nRxsbK0dXR1dPV23djY11jY1tRWVdPTk9ZVUhOSV9LTllba/9312/v4//r/2vv79/369/j493d2+fj4+ffz9vb1c/R2dnd1+Pd5/dX Y1dbX01OW1ddUV1ZTFVOY19b/1tjW2f/7//363dr7+Pd49/f2dnT093V0d/b6+/f6+PZ3+fn6+vn93fvXVVZY2NdW1VfWW9bZ2dRTk5jW0trb3dv793nW2/f3+93693f39fN09HZ1dXX3dfr593d99vdb+P/d/9vb+ddVU9ZTkxLSFlRT1lbd19nZ2tjd+Pr /93d49/r19Hb2//v39vv/+/n2efX4933Z///687n0+trb/dfa19jY1lRV1VnWV9XX2Nna2tj/1VdXev39+/j29fP2ePn39vd6/9v3//f6+/f49/n2fdrb2Nf72trd2dfZ1tnZ11nb2dZV19XZ13362tj72vr///v63fd39fX39vd1dXd19fd693Zb2P/9//3 b13/XU1TVVNZY2t3b2N3d3drb/fvb2Nn//f3Z2/36+/j9+v3X+/Za//vz9/b49/v9+vd3+tja//jb/fv5+tv9+Nva2djXWNfY2NnVVtdV1VbWV9fX2Nj7+Pv993f39XX09v/d9/d3c7R4+vZ5+vj5+vr//dr93d3/2f//+tj/1tTT09ZV11bW1lXV2NnW29n 63fr59/Z69vj5+fb3evd3+/n2dv349fj39/d5+/f5+vfd1t3/2dnY2drZ2NVXVlPVVVXV19nd2Nda11bd2N3b+9v6+fb29vf39fd0c7O0d/Ly9nPztXr3/dvd3djX19ZT1NbWVdVWWdfW1FbT1NPU11rd+/v6//r3+9359/n99vj0dnZ09vd2dfb3efj7+Pr Z2ff62tv/2tnZ3drZ11VV29jY2ddY19fb/9nX19bWVlra3f/7//v5+/b3dnT1c7Tz8/P09vr59/n9/dj9+9j929vY2Nna11ZVVVfX1Vba2NbZ2f3b29jWWdfd3f/6+vr49/d99vb59ff293f3d/n49PR5/fr7+vr9///d11ZV2ddd+93W1tv/1trXVdj/3f3 d/d37/9352Njb19rX//r4+tv7/d35+fj3ePb2dXb09fvY//v59/v//93b19rZ11dZ3djZ2NfZ/93V2Nrb2v/63f/d2fv/3fr9+Pf6//j39/n3efr5+9372/369/d5/9fb29jb3djd293a3fr9//n7+9r93dnb2NRW19rW2//d/fr/+tva+P/9//r5+vn3dvj 4+Pn5+vn6+vr9/fv/2Nbb193b2djb293b2dvZ3d363df72//42tv/9//39/3//9vd/f3/+/35+fv5//r5+vn5/93a29vZ/fv7+9rZ11ra2drb2Nna2djb+/r9+vf9+fn9///Z1t36+/r6+Pn7/9va2tvd/dvd+vr7+/n7+Pj/+vr9+/////v92djXV1na3f/ Y2vn7+9nd+939/f/a+v3d+9vX2vv5+/f6+Pv63f3b29vb/d3///373dva/9na29r93f36+Pv79/3b/939/f/9933d3fn629v6+93d/dra19bWWf//+tv7/fvd/d3////d+//9+vj9//3/3fv7/93/2/v3/9vd2dfY29vd2dv6+Pn7//j9//n5+vn6/fj33dn b2/r73d3Z2ddZ2NdY2//5+v///f//293b293b3fv/+/r9/fj/29392/v/2//7/f/9+/v9+/d3efv9//3/2drb/fn9+/f63dv929ra2//b29vb2tjX2tdW2dvZ293d+frZ3drY/fn7/f37+fb4+v35+vj7+Pj5+vn39/vd3fv/+/3/2trX2NjWVljZ3dva2tv /29r9/dna3drb3f34+vr5/9nd/93//f//+/v59/n4+vv39vj5+fj9/9va3d3//9vd2tfb3dra/93d3dvd///Z13//2tnb2tja2//72dnb2/v9+/39+/n39/n4+fn5/f35+//7+vj6+/v6+/v73d3b2Nvb2dZW1tdXV1v79/b393j6//v/2tnd//vd11dX1td Z3fn6+ff3dnb2ePn/2/3d19dX2dnX2935+Pf2dfZ4+vf4/9jX1tXU1dfa2trd/f3b+fd39XX2dHb7/dnX05XV1dfZ/f3///j39/r3ePr911ZT05OUVdn693Tzs/RzcLFzM/T2XdbSktIQ0dIS1Vf/+Pf59/Vy9Pf3XdfUU9VUU9Vd+fr1czMycjLycHEzd3/ Z01DQ0NFR0tOT11r69/f4+Pd29v35+v/XV1r93fv3dnRzdPTz83V2+P/Y1lOTEpLTk5RV1tbb3fn29HRzc/b1dn3Z19OU1lb7+/3493Z09HRycvP3/d3W0VAQUJHT09fY2tr493ZzsfJz9ff7+9XTk1VX1/r7+ff3czPyMfHys/rX0xFRD4+QE5bZ2dv49PL x8S/wsjP71dKQElFQ0tba+vb0c/JxcrMxs3dd19MPzw7RUlOV2vf49vMw7+/vb/GzN1rT0E+QU5JTFFbb+//39HPz9fX2+9fb11MTlNZ39/b2dnM08nDx8zZ52tdSUU/Oz5BRGddXf/v29fRzsXO29Xd519bW1VXW2vdys3bzsjCytXX71dbWUlNRD9JRkhK W+P3b93Nx8zNzs/f2+/r/19LT09rb+vFz8rGy9vN7/9ZU0hPS09OQT9BSUxX28zNyc7Vz93MysTHzu9dTENGTEtNZ+fr17i91dff51vvZ09RSUI9PENXb93PwsLIy9XVz87j4+9rW09dT0dJa1VO/7vR3d3vb1VRUWtvT01IRD9BWe/Rz8W9vcS+wr+/2dXO 1+v/419FR1F3TevFw7tPY1lXTkhTT0tIPzw+PkNT79vnysDRa1NVa1VO3fd3991jWWdd1+fvvqywu83F087Rzc7j4/9TS0ZIT/dr3WNnv6+6yOfvTFdvY3fdRTs9Pm9DQ0PGqrJXO0M9Ozo8PUA4NjM1NztPd2/fz+N3TUZLV9/ZyMLCuMDR48W/v8q0qKOs vtvjv8q/tbm+xsz3TUlfd3dCMkapsMxOPjk8QUZOWfdXNi8vPEU2Ok63uFk5MUg5NUtOSUg/PTk5Pmvb62fj2ed3T1Vnzcy7t7OusL/VY73F5+esoafTz1nP3czAub3J1dtLP0NLd1c4O6axwF9CNDZEQk1r0e89NjE7QTUzOK21xWc2PD8+R+fj91FPPDw8 StXM2dnZ3+9j/1dZz9fVv7u2zVlK39NnQ8ChrbhVb0zj09vGu7jN0WM/PkBVy9HrP8antddTSTo7VVXfy1sxOTA9ODcvq8m+sUo/PlVFTdlvW1dRQD5IQvfI1//Mzutv42NnyMXNx7G0xd1vStFnO6Otvr5IUVXHXW/Cutvbb084Oj1G529FMqOtx0I+QzJd Z0zMvzlBOTk4RjHGrcS9ukc7QFVCb2tTSmtLOj5APs/V2c3G391n4+POvLq8rKu0vM/jW8BV75+vvstjTENjSevF2UpKQz8xMzU8Sz88Pi6jvkY6RUw9PVe8zko5QT9NVS+hrr/HrVs7Z0pr0/dNV0pZSExKSMHG08y9z9NvXczj18Tnr63ZzufjRGsyzKrG 38tdOkVjRlvB41FRPTo9NTg/Yz5OWT66rXdP62syOte70WM+Rkg+d02ir+evtclP90tF2eNn31VTWd1BU8zIXb/Z0dVvRtvX61dduLPR40fZOz84zKx363dIOTxCOktH4/dnPzg8PDo9/0lj1Ui+pbxfzs1jO8Wuts1KTsxR3Uihrr6rtcvOa0RC2U1H22NM TVFNW9fP78tv2VlRPkxdV0JTxLrNdz9TQzwsvq3n21NKPT4+OWc+OV3EXT5KPUpR21vvyGs5t6i/y87FOsSyxb5fXULHXTGisrmpzd3I31tC1UxCVWc6SUQ7X+Nfb8nN//9XPkpVSUpLvtfI1UtGPUEsvqzO0VdLNkNIPk5OOUlP3dtZRUFba1n3yff/RZ+6 wnfZTFO6xb/H6z+5VTWlrqmu08fJvU5N59tI/19bT0VITWdVa9FrW19NPkE+RT1XyWPrX0w+PUIotqzD50ZZOUI3O11vO0r/705TY9XRze/Lyc/dOJ+uwFX/zc/DycXZ513KYzKjo6zfwt9VwEZOUW8+U13vOE9LSu//Y8vX21NRSj5BQEXNxW9310dERUUl QKy9U0d3NkA4M0FORz5Z91U5QO/Tys7Tws3ZOJ+oumPbv7/Nv8HIyVHVRT2fpLjruudXwVdGS1NDQWNrNTk6XU1r/8vR3VVrVzg9PEfO01t33f9ERUYoya69a0ZjP1U6N0lPRD7Vz2dPREnLzr3Hus33N6apulvvu87/193F11VLPMmfsr13y19r42tLbz47 QO8/Qz09R1NZV3fX40H/TkE+Ql3R213j3cxdZz0rq7G702P/QeM/SFVdR013zV/dSlPnY9HIvsn3QFOjv81Tx9NHU1nA0V83NVufwL7Pyf9d6+d3TzpEWU4/WT1R/1tV383j42PJ/0hFT1vGz/fv38/d/zQprqnAa1f/U28+S1FNR1tRa033S1ffU0rFusnZ SUyft8Jnwb5ISL/bd/8vUT2osr1f103OXd/bRjlPV0hRRTpLX1tPU7zZ0+PM3VlFUc2933fny8vdWTUrqre1W1VbR2NAPEtIS1FMTVFRRUxdUUnjur1v7zpfo7vZxr9AW+9NR1vPL2OqucVvy0/Rd9HX6z9nWVVRTkFC71NTXcnGytXD0/dT27nL2eNn2Xdr Ri86q8LDd29HTmtESU1BP0c9PUY+SFVrTktnzb7v3ec4obe+12PTRVNFT7BCJrWru8/Fz1W/ztXB70FR3U1Ob1FE41NVX9/KwsLB09l3zsHbd2/V90jvQi0sqc3b5+dAWd9XXUFPPk8/Pz89R0NdT1lZWce/2f8toa+4Rc5ZN0hNuucwJ6mqwcPrw/+9ze+8 7z9J11dPY09B111r79nEwLfEys/MvcfvZ+vHQEzbPC42p8vnzt87RXdOWUM/O1E/PDg7OkJNSlFZSMC7x0wroqK7d2PrN1m7RU41LLSsvM3bym/H09vD2WdG2VVLV1FP11/Vzc7PvbbB2869vN/n291jQlnbTixXqblb2V9LS2tdW0I/PlM9ODg5O09OSlFX RL68zj4quKG1RkzrOL87RV8vJqqtxcnP2ffP292+yFdf21VJQ2NVZ1vXx8jBuLi8ysm0um/B2etfTktjSinKpbtv4+tBX+dTT047Pko7MzU2N1s/Qk1nW9e450kzd5/F50b3x10xR0o4Jaitv8PP23e/29W8v2tj/1c/SE1fa+fZy8q+t7e/w72xvdvN291T S0rrRCixp7/b59lHV+dEa0k2PUs6Li4zOkk8RU1ZVeu920M51Z+33UTFsS48XUM1Kqevv7nP2ePNzsjJvt9ZX01FPD5jVU3TysnDvLfEzbmyvU93yv9KSk5XPif3qr3X79trU093z04+QU48NDA1PD49QWfN2f/PvUw8z5+400O3xi49O0QsL62zvr3XW8/v y8K/vtfnV0NJOjxfW0LZxLu5v7W8yriwwV/ny1dASUNLNSq8sMV3zedO30zvzuM/QkVJMTM5PkQ/S//Ly87Zz9Hf95+vyVe/Uy86OzwoS6230b69TWvjXc7Bze9nPkM9M0VZU0jVyL+7ube8trSzwOvN119PSz5FNyqrs73nxN1Pa+/XztFAQENAMjQ6P0Y+ S9vLytHX5923PrCpxNnHRy05OS8nL6zG18W7T+dn0cbHx+P3O0A0O0BrUVPjxsa7vbe7uK/Mw9fVb09TR0A/Mi6ossHvu81Ha+PK2dlPP0E7Ojg5Q0lDTM/EzsvVX8euO66qwbY7QjE9Ni0p3bTf58K6SGdVxsRjyMjnNjM6PUBvRFfbxr/Bt7fCr7PCy7/P WUlCQFE3MTqqtd/IudNT/+vD11VvSz42OzQ8Rk9AW9fHxcvHV8u5TLahs688MDU0NC0p37RdTse1SlFZyb/vXbpvPS89PD1TRUPnwb7AvLu8rbe+ysrHWUI/QUs5Mmuls1+9vM/r482/xVdB3UMyMTk7Qk1GTtvOxsvJd7zNRz2fuatFLzMxMisrsblPTL66 71trx8vOWcPIRiw7OkQ+TUJvu8C+wLm3rrnKusrvb047PUQ9LTqjtmfZtd/v/8u/2c9RX0Y2Lz86RkZJTWvRzsvJU7HfYzWlr6tIMjkuLywrrrNdRM6350xn69lr79F3RSstPUBDTkJXu7vGurqyqre8v7XR/0pHP0lFMz6jtM7Rtc7Z68LDy1vbT0kwLzo6 P0dCRHfvX9PTZ7fbTzWrpaZDMDYxLSsqvrFrR/+0zFlX1cpjTb7nUzAuPkJLSUh3vLrFubq1rrW8w7/GT01IOz8/LeensN3dvMvR99m+yU1r3UEzMjs9QUtESs3Zb9/F0bfR/1UxoZ9bNzU4KioqrrZdQFHCw+tM0cjfSdPHQTYuPT1HREvfxr7BvryvtLG5 wMnV3UhEOzo7L6qrutfvxP/LY2vAzFNn90UwNjk7P0lCWc/rZ9/Rv7PJz28vtJ/MRzc5KSc2rb53S1fOvNFXz8nRXdfO/zszPEhGQk1v08TCwL6vt7m1wsrZWUg/OzM0LrixvuP/zt/ZY//Cyktdb0IyNz09SEpGb9Hj/8zXyrHFxMk/Tp+u2zw5LyI+rd1f UVN3xs1Vzc3RY/dVXzw6NzpGO0d348bJv7+ttLa3wc3vW0s+PzQtNq2xznfR98nn/8/Bymv/Wz02Nz49OktL/9/v3cbVybPCxc9IPp+uxj84MCDCt99bTV1Iw8z30c7n9+tKWUdCOjdLPkXv38/Bu7qstrK1v8n/Vz8+PDAlPqvA993ZUb//X8/Iz03vTzs5 Oz4/OUhKd9ff0cPNuri7vstZa+Oou1U3NCOyt2tbT/9HyNPT29ddd29LSExIOjo/PUbd9+u/vryturK1v83/V0I6Oi8mvq/nd9vdUch3Z8vK3U7dVz08Nz9FPj3n2d/b08nbs7y6vdHXvz2nvk89Lz28w0lRWVlP69fJ69NZa1dEPl09PEE/OGvb2+e9v7+r tbO1vsx3XVc8OjMqrrjRV9dbTsvr79vZ60pbRjs5MzlAQDpFz2/v79Hfs7a9v9nbuy+ksWs1L0q51V9N91n3682+2etb/1dHP2NIPjw9N07r12PEx7+usri3vclvX1E5Ni0rrbXn59fbUcnZ3c/X52f3RkM7OzY8OztCze/f1+vVuLa7x93Fvyuyrd0uK8G+ VUROZ1NRX9G+31db905BPUxbRTs6REl3zf/Oz7qvrrS0ub3vV2NDOyw9r7j//9HZXd3Vzs3b5/f3RERDODw4OjdN/2vv3V9jubW3vOPIvC7Lqdk/Ka7MT0RIa1lTTcu9xmNv71NDPkNVVzc3O1dZ1d/V2bi0rrK3t73XV2NINi13uMnvV+/v4+PVw8vXb+Nr R0lIPkQ+OjhK/+fZ391vuba0uXfEuD0rpMc+K63OPEpBXUt3PtHEyFNTY0lEPT5ZXTcyOEzj48nfzbu1rq+4trrKW29TNC7ZvWNb9+933d/nvc/Z7+P/RUxETEQ9PDU7Z9HjyuPfvLq0umPLrkMnq6s6OK6+MEdTQFtfQVfFxVlNd0pGRDxnU1E1Okf319XT 07i8rq63ubfEVWNLMCmywUFE19tTxl/XvMd3d+PXS0pJVUk6PTs+TdXLzczrtrywuf9rrkouKadFzbfONDVKPkpPPVvX2d9OVz9DPj9Mb0Y/OkhP0cnI1bm4r6qxuLK6z2tXOje2wj9FY29V2VnbxMROW2NnRUBDTkc4Nz09RVPXy8/nubyuvcvRr0tFLsy7 rrrfSDg+P1lTRM5f3+93W0VFRURJW0M9OUZRW87I08C+uK21vbe+z29fNPfBzTtCW09n09/MxMtjWff3TkFHX0Y2MjtESkhn09HZwcCzts7Is3dHOC+qpsZXV0g2Pl9Ta8xRXc3Pa1FVSFdTTUw9P05dV2PDwcLGt6+0vL3Lz2s/M7ndRDtBSUJHX9Xjz/// XWvvV0tJ/0s6NDlRWU7v38u/vb+2ssXGre9VPymmp85IXVMwO0lNztNfTtPZb01LS1NTQFlEPU9jXVnjvbrGtrGutsLHyuM0y8lZOjlAR05KQde/21vfV19rV05VZ103NjhFXVv3zv+/t8G5tb7Lr/dnRCmuo8hPTmc1OEg8yr5rPtXO1UpMRFVMPD5FPUBO T0/b29O9ubmzssfRxdc1sbtGOzs/R2dVT2O9zXfXZ+PTXVtVZ1c3NTlEU1fdyNHrsrK+urzXs9tPPj+/pcJfSVVCNz1MTOvdP1/vzE9DQltLRjpMRT5NWf/fx9fBtby0sc3Xx2NKr8U8OkU+R2NnXdnT48HnUWfXX1lRa0s9NDhDVWfrw8nbv766uLr3tc1K ObtCpMDrSElbN0VZV1df20Jf0fc/QklJPTlPRj9DXefjzcHfxbC2tsbXyEdMrN07NEk/RVtd99vM52/EV+vfXW9rVV1CPT5Ka1fLv8TZuMnEr713ssE+P7REu7XnV0RNMkJVSlFLPVFn3V0/R0lEQDr/S09A39PRzrnMyrmuucbZ00e1tlc8OUBEQkxX1d/L 2WPPy+9bVXdfSkpGQT9D61HGyL/dtM3XvrNXwsc4yaw9b67DVVNHNkZVSF33PD3P210/TElKQD5ZY1NGb9HTy77Dy768r8z360+oxUE+O0JISz7j1f/rzV1Pd8dPUWNvTEs/RT1DVWvXx87RvMHZyb7Gy80zra89K6i2409BPUxOTkfXTDdGwONDRk5XRT9V 63dT3d/L073Eyr6/t7v/TMWqz0c+QDxHSTxdzF1j091NWdXfV0tVQUg+RD1HV3fZ48fGy77LzM7R57k3tLZAJ++syu9JQD9fU0bbZ0I/3czVP05LW0dL49dv59Hvx7vCzL+/vr3ETb2rvkZBPTxATDhFb99V/9dLY2NjWWtdQ0lNSURFV+vd3dG81bvE08zI Wbv3sLtEOiuovr9GR0w/U01ja1NBV+/JRElFTEpEa93n2dvn777C08bBwLrTSrKowkdGQTo+SjtHd1dr5+dOW99jU1tOU0dNTUJLVXfV38rFw8S+09HA7//MsLz3Pyqssb5NR1lAPmdPX1lFTl3RTT5PRE5IS87f29vf58u+zNPAwb3JR7euv1NISzZBSD5L XUlO22dRY9lrXU9KRlNJR0hKU1vn283Aw8W779HDyUCrssnbSS09q7pbSWNCPuNdTGdOR13VVzpLSUxCT9Pn3evZ6+PFvXfXwMPRT6q75/dJQTg8P0JRXUVf1W93W9fn609KSUxMT0dXTVl3683Ixs7A2dfIzUGuodNTZzMuqrfPZ2dIP11vT99vS/fP50NK QUpMSe/N32vn22/Xv9FvyMrXWam7W05bQzY5OkJJSkBrd2df7+fX11U/V09IZ19nTufZ0c2+vsPFxMrLz0GqoMdHT0syqrvFWVU4Nk9XSFdvPnfj40BZTD1TVVnTznf/3ePNy8tnxsb/b6e90VdKUTo7NUZIRjlZ41Fb91vj3VNERm9FP+vvU03X18jBvLvT u8HFz0PDorVTV0guqa2+119MM1lrR013PkNrY0Y/Wz48T1//5+9f3V/d0c5rzchP96ax59tTQ0JAOztVTEBJ0+9M3/ff2+tKTlP/SkzJW1Nf187Hx77V477Pbz/AqLFOY0ko2am9d+9GOEhnTUjvV0Fnb2NKSlNFSPfXyd//29//zsdd3cdVW6etz+/bSDpG TjlETT1K4/9jWd3d32NHVUxVU09XX2tZ/9vLxcDG68LM7z69rqvHRU8yQaq3yVk8OjtVS1lIX0pXX2trSE1RU03du9dv98vf1cvH38NfR6atwtN3V0M+PE5FRTpK72djZ1vT03dLXW9OSWNnUUfdWf/nxcbK98LDbzy3rr6xSzs5Na27tVM6Nz5MSllPTFNN X13dUU1N12dV1bjnVd3F187FxdHPS6arssPbT1lMPTzvQjs92/93UVlr42dLSFtLSE/jV0ZF519nd8fR2e/CXznnrb7Dvz0yNqy3yds5MjlRTl9RT01LWVnbY1lf59VZzs/H32/LzdfCxdHj96ats7/LRUlrQj9BSEE6Vef3Y1dv9+NjVV1KU1NdX01LQ3fV V9vX39f/YzO9r8/buEItNq61x0Y9OjlMVW9nVVlXZ9nTb1/R593rwsXV783Vz92/vs9TvqiuuL7dT0hKR0dANzxHRmtnb1tfd/9Pa1NRU3dXUWtfSUpfzWPX3cfrZzqysc/rvVkvLa6yxE02NEFETl1rV0pNSmPPWWPn3WdbvcHbX9/L3+fBxMZNraiztrzK XVFGQVdBNDY9VVNTU1tVZ1VHX1VKTfddTFvjTUtr39vTz8rrW+ett8fRt3c1NquxtU44MzhLVVt3VUdMR2PZXVt361VP18T/V1Nj9+vVz91Xr6y9u7bMXUpGR09JOTk8S2fdV+9r72dVV2djb+f/W2/341Xnb13jxc/jSL+vudvjuMU0NauzwFM4NzQ+TG9v UUNKR13v62fj91NjzdHR51tX79vK1W9dq63CyrjCb19EU04/OzlBQ1Xv9/93b1tdWVtX1d93a9nfXWPr/1X/1c7vRLKwu+djy783PquyxkQ6ODU5RUx3TD5AR1n/d1nV/1tnzNv/92NZW/fO1/fjqa+5ybe+0+tHX2tGPD5JRVfv61fNX2Nfd/9R69Fr7+vZ WU9n/05d78xJS7i2x+9Z9749Q6+zyj84Nzc1PUPnQkY6TVd37//T2W/nysn3Z2NrXePVy0OurLS/wLfBzeNG//9COz1ESkzvZ+dn51f3Z+tZ3dPr4+PT/2dTY1lV6/9Vd6q+1edrU75FN6+03Uc7NTQ3O0ZOTjg9RlFf/+vb4+Pf1cb/Z1FR7+/XXU6srLfD wre6xN9Vd29DP0Y/Q1n/413ZZ1nv9+9f29/r0dXT51tdVVdZ42c7/63F3+trS8TZW6633UM7NTE0O05PQzg5Pedf//fN59XVzsjvX1lMY9XHVU2pq8S8xLq5vl9V71tAQkJAPUT/0XdjTV9b02vv29f3ys/M1WddVVdO22c9vrHBWdX3R13K0a2150JCPTI2 O0hjRTU1RFHbY+PO2d/Nys5vZ1NIX2fXSuOtsMbOyby7v9VT30xFQ0VDO0NX09lnR1H/4+/309Hb08nF0Xf3WVFTX2dEs7vE///Xa1HMs624Z0RBPzY0PkVZSzU1QWdrXc7T09fOwc7rY1FLVf9vP/etuM/VxMO6v99rY0tFRUFBPD1X791dSk5R7/fnytvX ytO/zev/W1lXW1FRr7bN/2PfTl/Hqa3AWUdDQjk3OkpPQDU7QGNn793H187Lycn/X05NX/dnQr+yv8rfysPAvO/ZX0pFSkI+PkFT499NSFdX/1v/38Xby8rGxdt3W2PvVUjEscLNZ1tPWUCxpa/NRUtFQzs4QU1OQTE6SFldWdPVytPLxdf3X05Td99OVbO9 zsXdyMfByc3Pb0lCV0tDP0pX3+NIQ07vX19n487L1cfJy9t3U13/SkayuP/f51NLTTvFpLHjSkhLRT87R1VNPzM5Q/9nd+vXyMjJw9n/71td9+9X67LD3cvOzsbH2c7E70RCTElDP0JZ4/9NQEtr/2f/59fXyMbKzs/rY2dvSlG3uF3j32dHTTvIo6/PRkVE PkY9R1VLPTU3Q1fvb/fX1cu9yd1360//52tPvLS+/9HPzMHH19/VxkZIR00/SkVZ9+NOP0hbW/fn59nd47vL0dXnY91nQVOxvU5T3U9NTzm+pLDBRkVAQj5LRU1HPDY3RE9n6+PXzs7Iu+fr62NvzWtVr7bIW8/V2b/I293bb2dNRUZGQkxXW11LREFOTWPX 09XZ18fGzszX92frS821y29R0UlLTjrBpa7bd0Y9QUFDTk9AODY6P1FTa9vVz8zDzdvLd2v/12/fsLjZd9vR3b/BzNPX/2tOU0RKR0rvY09LREdGT05v1dXf2crj077vd29dRbm80VdV3VdMRT27qq3RW0pPP0ZHV1lBOTY9QklZb+PVzMjCyev30V/v50zb rr9fW+vT2crNytHd/+tXRWdHT1f/WVNLS0tGV1330c3Mys/V2dfFZ/9KUbTAZ0tZX11NPjpfra3Ra0w7U0NFVU8/OzU8P0dd/93Xz7+9zNndd9nb50jEsLtZV9vTz8fL083Md+9vTUFVWVdrU0hXTEhDSWP/1dfOxtHb19Hr0dlFY7G950xfW1tjQDtPrq61 b08+PEVPVV89Njw7PUZOY+/d58m60+fb51/X30e6tMfZV+vRz8nKzNPP3//vV0hCTttrT0ZPb0pDSV/d09fPyMzbzs/T3+tVb7S/X1lZV09fRD7vsreyd0xDPz9H/1M7Njg+PkRNa+/j4829zuvf52/3/121tsj/92/nzdPKy83f49v/X0tKUffZWURZVU9D SGPZ19nJys3OzdfR2/9G77HFW05vUUxjRkDjsb22z1NEQkZGT1c9Njw7RUJHWffd28vE09nn729vV0+vsd1vY2v/yt/Pys7V7/f/X0tLX+9XV01ZX0xMSF3d087Lx8/Px83Oz/dPzLHFX1ldZ1dPRUbbsL+/301EQ0hKUz49Ojs6PkVGT2Pn2c7H1+fn729v TtG1uNtn51PVzuPTx8vZ1Wtfb1tO9+tfQlH/XUpFTVPr483Jy8vTzsvNzddXuLvG711XU3dKTEvEsL7GyE9JSUlTTEA5OUE5Oz9GTU9v1crJ03df52tjS9+yx3ff207ny9PZys/Ty/9VWW9d7+NPSEdNb0xCR0/n59fJzMzP1c/O0d9nsrzPVeNbU2dLWU66 r7zGzllHU1lfSkQ7Oz5EQUJETV932c3M12NXZ2dVR8q10U1J3U5n79XZ1dvVz19OUVfn5+9KSlFXUW9VSlXjz83HxsfE1cvTzP/fr7nbV1Vra1VBSv+2tLrPd1tBR3dbSj48Oz09Rk9HTl/XzcfKyu9X//9jS7u11V1OW2/nY93Z1efd1fdVR01n2VlAQU9P SERLU0lZ59PTzM7F08/R1XfArrvna2NX6/dMStWwsLbRd81MS93nSD4+PT5AQUtVTVHnzsnMz9VjXV1bTrm4yVtNV1td3+/b79/X0f//S0dr011HQFVTTElKRmdVa9fTy83JzMvX713Tr73vY19VWU5dR9W4sbfOa9n/S+fvSz4/P0FHS0hHb1ln18bIzt3/ Z2tRU7W0yl9OU2djWd3NZ2vb1+f/SUZn61FJQklNTUhKQENn9/f3ysvJy87R90/jrrrVX2NfY1VIWWe4tbbJ52vZWW//SkdCPUNKVU9JT//f48vH09/vd3dTScKxxlNOT1//W1/T2VVj093rV0hv52dITkpHU01JRkZMb+d318nLy83X3U33r7POT19dW1lM S061tb6+2Vvv2193T0VJPUBIX1tLTmf/zcbMyd/n5+9fS8S0v11OUWP/b2//2+tn79HXWUtfZ2dIS0xGT0xMREdRUVXn29/Kz83V30rvr7fNV1dbV1NOVVm6sbrLzldJ2e9nb01GPD9NXWdXT29r78XG19Xj4+NdS7uyx+9ZV1v39+//d2dr29/TX1NfY19R T0hBWVFFRkdNV09r3c/dzs/Z70rbsrjfVV1bTVFPV2+9trrG93dM3+tXY1lJPDtjX1VbU+tn48zJzf/X299rU7Wzv2dVd1lr39/jb29b28t391tdV2NnX0o+SGNFQkpNW1Fnb9HK387Tb0VjsLr/VVNnTEZRV92/ucHO3VNP69VOXWdRPDld91VTWf/3483V y9lv0ddrY6+vwW9Vb3dn79Xf72dnY8jRd29vWU9f/04/P1tOQ0ZOV1lda//Jz93TZ0jPsb/jV05ZXUVJXe+7vMHZ2WNFd81RTXddPTtR711XU29r2dHZ/9Xd6+NnzrCzymtdd3fv79XZb19v99/M3//vX1Nd31lIQ09RTUpMW1VnX/frytnvb07Ftb/vU1dR TUdITv+9vL/OW/9PU+d3SllfQzxFa2NdW2dv2c7b92/X6+9X2a+2z+9j72/3287jd1nr59vjztv3V2dX72tPRU5RTE5MTFdjY2vf583d/0a6tsRdV1lTTUZOUf+9v7/PXU1ZU9tbV01XRT9IX29fa2dn49Hd////42dn1ay61f//6+9n58nda1nj29nd28zO /0/3Z2dZTE5OT09RTVVfZ2fb3d9vW1G7ts1XUVlPS0VKWd+9v8DZXU5OV3fnTldJR0VTX3d3//dv39Pd//f3Z2NnvLC60W/v599n48zTXVPn1evZ29ff92ddd1tfV1VRV1NVT11bXf/n091rS9u3v9VNTllRR0NIXdO/v83fV09PVVHZX0VHQUhZX29v/+/3 29vr72/nZ1dTtq+702/f3df/2c/VW1vn19/f19XXa+/3WVtXW11VWVVRU19bW2vn39ljSFe1vV1XU1NRTEVLW86/wdfnWUtXXVlva1VAQktvZ//3d2vd2evna/djZ09bta++d+/f79nn2c/nZ1/j0+fb28vPd13f70pNY19VXVdOTV9ZUfd33etbSdO6xudJ V05RTUtRXcq+xNXrT1FXZ113Z1tGPVN3/+fva2vb0+drb11nU03Zt7rF32Pv79/n19djVe/j49nf1c/L22/va2dLd29vd1tPU1tfXW/d599XTL28yvdZS05RSkhVd8i/y+tVWUhTVVtv90hBREVn79vna2/XztlvXfddV0fZsr7T1+tj3+vn191TTtvj5+fb 79HX1f9rW1lZTmP371lTV1//d/fn1edbWbS4zmtZX0pZSUxfzcXAxmtPUU5MWVdd50ZAQk5O69vrY2Pv09trW19nSETKscLv/+v3a+Pf1edbUdfb69/r2dvP2d/nW1lPY03d329ZV1dj6+/n391La7S3zldnW1lKT05rycXCx29NV01bVVtX20w+QE5nU9PZ a1/v1dVrWVtbSz/Ls8DZW+9f71vd2+NRU+PX4+Pv59Pb1d/bb0xOX2Nn0d9jV1ln3ePf5+tOZ7a4yl9RW09RQ1F3xcfCzG9PU09XX1dX629DPk9Xa2/N919v1dPfX1dbTELKtL3ZY1tjb3dr2+tNU+vb393n59nR29fb61NKXVVnd9N3U09v49/Z4+9KTri4 ze9VTFlTS0nfxcXIze9VT1NXWV1P7+tLQklVX+PVzv/33czZ/11fT0DCtb7ba19T/1/3a/dLS2Pf39/369nj2+fb92tRTWNX39vfZ1Nb3dXV3/9RUbW6xvdbTklVRVFXxsPHz/9VTVNdWVNTU+9NSEtOa2vO19/n59XT3WtdT0bVtMHX729fa+9r21tMT3fv 39nr/9nZ69/r72tZTElVXddva1VZY93N63dLWbS4zu9ZVU5LTUvjzMTGzmdVVVVja1lRV2dbTExRU2frzOvf39fd3etdS0bHtsPV43dr/3fnd29KT+ff693X493T2+PZ/+9jV01OY/fnW1VTZ2/b2V1Ha7m73VtbUUtLSEpdxcvL02tNT2NvZ2NbU11jXVlV WWfZ39Pj28/P49lrTEfBtsfX9+9n//f3/1lVS2/d2//Z0d/b193j9//3XU5RV/dna1NVd//d02tIZ7m5311XXUtJR0ldycDT3f9ZR13/W19XV1FdY19VUWfr2+vR2dvO1+t3XUjGtLzX6//v7+fr61VKUVXn2et319vf39/Ta/f/Y09LU2t3WWtfX/fj319K S7i432NfVU1MSVH/zcfP72NbS1n//19RXVNf73djU1/v3//Z09vZ0+djW0nDtb7X/3dn4/fv709HSGN37+/369nX69/R63fvX1VVV2trVWf/Y2/V3V1RUbi8y29fVU5NSk5ryM7N419NT1tb92tVV1df599dWV9r72//ztnd5+N3TUjVtb/X52dv5+/n91tM R/f/513f49/Z3d/X22vvWV1ZY1tnY0/da3fv32NHa7a5z/dbW1NTU0z/xdX/21tJTl1Z6+9fW1dr49dVW2tv9+vr2c3d4+93UUjMtsXb//93d+P3Z1VJP13vd2//2ePfb9fb6+///1FnY2//b1dd43fvX2tMWby0xfdnWVlTU07jxtf/a11PTFVv//dXV1Nb 99n/W29va2vr79PM33dbWUrTtrvP92tj//fvd2tLTGP3d2tZa9Xd7/fn9/ff72Nn62tZX1NM59/X/11NX762xnf/Z1lPTEvTw87ZXV9MTE1XXW93V2tnW9vnZ1nvb2/f5+/T091fWUrbt73Rb2d33dHR32NFS19b511dXd/j3d3f3evna1FZ92tZY19Va9Xr Z1FHSLq3y+drY19bTlfTxdVrWU1VT2dfXe9vV1lbY+/Tb2NjY//R1/fjy91rSETrtrvL5+d3b83X21dPUVljWXdj6+fn39vfd3fnY1132fdTT1VRWXfbd05GRsC1wd1jd1dNSkvjyc//71lPWUlZW3d3611R7+/T3+v/69/T01v/zc//V0lVuLvZ/2fv387R d1VTVVljV113a+f///fN29vbZ2Nj311TVWNfT2Pj/11JR8G3v/9TV1VLTVndydX3XVFJTUxdX1tjX2NXd+PR2133a9vN193V09X/TEZTubnA/1vd3cnP6/fvV05XTU9nb93R42/f2f9rb+/j/2tMXXdbW1/b21tKRWO8vtnn/1VPTk9rzNHZb01HQ0xXX2Nn XVdXX2v37+vf1+PV3+PnZ9ffZ0lIvLfBZ+/dysnZ5+9jTVtj/11Tb+vjb+vVzuNj99vjd11db91XWVtZX2NXS1u5vsprUUxfY1ddzsfZZ1VLRUtbV1tPSk5V79/v29v3a//ZztXrd+vrXUtEv7PE73fb49XR1dHrY1FbW01NXdH/693R13fj38/V719ZZ1lf Z/fv7+9VRUG7vchrU1lTX0xvy8PPb29FP0BLX19ZV29XW2Nf78/b7+vXzuf3Z/f/91s/TLvGb+vRzszK23fvX1VZa1dNW+/n78/O1+ff3efvZ2/vb9/nX19dZ+v/Skq8tsddVWtrXVdVzcbf/1lJREVOW0tHSl1RU1133dPX93fRxt3nb1Ndb1tGVbi8ymPb 3c3Izu/n901bW1lLZ+/v2evnb+f/0c3d611dUe9vV/9dd3djS0zRucBbV2tZV1NnyLvD41tJRkNPT1NXUVtZVVvj2c/J92/nz+tra1nv629GQsG+y2vb1c/J2+f//1VZa0xJTF9r29fbz+P/793r9/9d/2f3Z29bXWtjY0pfvMrrV29v52djyL/Ha11MS0pL T1NfV2N3Y2/v18/R6+fLxs93XVlfX2dNRN29yvd368zEzXdfX05LTElPW2v/4+/r6//v3e/X3WtfX2ff2/9fVVFdX0trub/bY1tbZ133vr7JY1tXSklKU1dXU1VdVWfvzMfM09fRz89ra19bW3dTQeO7ws9r587I22Nd6+9OTU5MTFdr593f4+v/b+vd0edn W13nb3dbX/9vZ05Tw8DZa29bW2PXxb3M//9PSUJDSlNOT2dnb2fvz9nd0c3X0d1vd11db/9RRVu9xut308jE0Wv/71lITU1ZTlVr993Z2dPdY2/V72dfWffLzu9dU11bU1dTz8TOXV1jW+PVv8fM709MQUpEVU1RV0hTV/f30eP3ydfX383j91VNd09PRuO5 vM3vytPP49/T611GUU1VWVvf69Pf2eNbWevJ3+t3b2vd129fV1tbVUxFzL7K91dZU2fnxMLB3VdVR0Q/SEtXWUlVb3f/29PRyM/d/933U01f72tdUV/ExM/b0dPb2+vd/2dbW1dVX05X/+fVzNX32dnX/13352vfyP9TU133Y1NHzsDNV0xZV2/XvLvGY01V QEJAQ05MSkxv6+t3389v39Hd/87N62dbU1dXS0nGu8rf59nTzdnX319NR1NVXVN30c/O3dnn693V02/v/2/TyNPrZ1tdTkNF/8DC31trW1Pvzr7H709OQj5FRk5PUUpZb1Nd49fj18nV3+vZZ09VY19TTELGtr7N19vj3Xf/61lTY/dvV05b6+fV0dPX/+fT z+PR19vZ09V3W1NnV1lRTb7Fd1NZXV/bzb7J61lPR0RCPURDREtf///n3dfvb9vj4+PdWVNPXXdfVUfGu8HnY+vj09vR2f9VT19VWVFd/93b1crL1d/V1+fd4+/bycvX529nUUpFVb/F/1FXWWPPvL3N/0lDQDw+Q0lMT19vX1Nj499vY9vT4+PZ729ZW1tV Rj/LuLzZ59fR3293//dbUVFZVVVf183b19XZ92/32c3NztHKw893Y2NbV0pGTcK/yu9nU1PbwsTNb1FNSkhDRkNFR1drXWNd9+Pr48rG099rX09TV19dU0trtr73Wevn7+drZ2drX2d3Z09RX2Nj49fV3+vVzs/X3dfLyM7jZ11ba11dT8e7zlVMTFPLvbzA 1VlMQkJEQURJTExXX9/X2d139//Z2efj9//v62dVTkdPvL3NX/9fb9vZ2d/nT01JTUdNXWvd29Pdb1Nj3dPP993N08vO1efvW0xMPVG+wuNrZ2/Ixb7L2d1OSUJDP0dVZ+9dd2Nra19r79PNv8nf62NnZ19ZZ0tHw77H29vj9+9dZ19rTlVfa11OU1Ffb2/n d1tR/9vX08i/ztPjZ19VT1FVSPe5v9NNUVvbxL3I1+NLT09OSUtXTk5MX2/n293P09ndz8fn5//fZ1NbX2dT07zE91dTTf9r39vba05RTEpGS1Vb91lfX1v/2dXn2dfP03fd3dXv/1tNREO/v85bW19vxL+9v85ZRkxAQUNMX1vr79Xfa2tv1+PVzMbb99nZ 1ef/Z1dHS8HJ2+/3d9/Z/+tbXVdRU0hERllfd+drZ09RXWdf68rFxtvT1edZUVFNRkHJvM9db/fbxcXBx+9NRE1PU09nb1VbVd3jY2fn19/Ty7y+09nj62NZV29dU729x2tTU13bd/93a1dOWVFVS01XU05KT09na2fXzsjH0Xfb2/9vVU1NS0zZuc1jU05b 48i+v9f3WUpMRUpTV1NNXWv3Xf/Pz9fby8nK3+fZ2d3n29tdT8O6yF1PVXfn49/R0f9dV0xDQUpbXVtV/3dZUVn318/O03fn993f/1tLTUJPy8zfU1dd3cK8ydP3SkdIS0pMT11jb+Pnb2t3a//bysTCx9HX09nn/29VT9++zGtjd9nR0ev/b2NXT05RV1Vf V1VTXV9VU1l3683Hz9HN1+d3UUpITEhOwLvVV09Md8S9yNdfR0dLVVFdX11LSUtVXW/j69vRy8bFzdfV2d3nZ1tjU9G3wdtjWV//69fR09l3W09VTllbU05TY1dRW+vTzMrL1Xf/d//fd1dbWURI177TT0hJb8vEyc7bW09OSkJETVFTT1f/d19nb+fZzcrL zdvj087T3+frUWPBzetr59vZ08/V199fWVdVSk1RU1tj3+tfV1tr99/Zy87R2e/jd2NTU0dH78DPTklN58G9w9d3T0VGSVlbXVFMSkxfV11ZW2v3z83MzcXL0dNvW1ddTHe7vc5v7+vn18/O1+dZWWNbV1fvd2dfV1lPUWfVz9XMzM3X62/d42NTTEhFZ73H 70lITmfP1c/R909HSFFZTk5MR0xOW1dZW+/NyMXOysvf39vT393/V1vNvdX3Y2dn2dHX1+v/b29dTkpMT05b/2tvXW/r3ePRy9XX6/fR0+tnd2tRXcLHY0ZMWePKyMfL3U5FS1tOTExJSElRY2NRV2d32+fjx8DN59vb3f9fV0t3wsvba11v18vO193/VVNT V1dfX2NnY/9rXWtrZ+vO1dPd49/VzeNbTlVIUc3A41NPTnfNx8XK31dKVW9bVVNTU09VTUxLV+vd09nTzcbJ3+Pj32ddU0hbv73X/1tnd//v99Xjb1ldVU5jZ29TW2djXVtra9PNy83d71/v19fnZ2tOSW/Az3dTSFX3ysbI22dVb+dvU0hFS01ZWVdPXff/ 39nMyszR5+vj3/f/a1NRz73jU1dv39/v69f3X11rX09TW2NPU29362///9/d99nb19nX1dffY/9jSVfHyvdPQU7vyL7Dy11RUVVfUVtPUUtOUUpdX/dvb+fXzN3Oz9XM1d1jW0RM2brDb29nd2dr19HbXV9fXVVV9293b+dnW09T693X3dPX7+/d08/Z929Z QkLOv9FZR0tn1cvL1f9rZ3dfSkpNU09PUU9dW11ba/fNxc3M1ePn2+Pn51dPa77G0etv/2Nv39/rZ13/529vd1lVX3f/d19f/2dr59fN09fd29vfd2dnRkn3v9NJQET/zcTG1/ddV2NrVVFRTEpGSk1fa2tr9+fj3+PTzNHV299rZ1tZZ7+7xOtVV1X/0dPd 229jb11v/2f/43ddX1V343d349vd3+Pd2dHM1e9VQj9NxcjrSEdVd8jJz9PvX1tXS09JSU1MU19nV1tVY+fd193f19Pd39Pd32tTSv+6wuNva1/r2+vn6+/r3/dnY2fr6//v72djZ1ljb9/Rz9Hd39vX32dTTUVIzsdnR0dR28vN1d9bV1NXX1VNSktITlt3 d19dZ/d359XTycnT3d/b9+tnWf+7vM5nTmN36+fv6///Y9/j/93n711bV2tvX29r9+PV1dfZ1dHP229VTENHY8HNTkNGZ9vMy9vnV1FTW0tJTEZOSU9dXVtVd/fn5+/f69fX19fP0d/3XWfDusDjY19n9+/33c/R1dv3Z+/na3f/d/djXV9jY+/X1dfv69nb 5+f3WUk9QdfRV0dKY9nNzdf/X1FbY1FHSEdGS1vd2XdjV1dZa+/b1d3Vz9fV0dnfa1/TvcP/WVv/59/r6+dvb+vj9/fjd2tnb+tjXVdnZ3f369fZzsvN6+9dTUtARu/F21NMXevPyt3jZ1FRV1FJVVlXT1NnY1tdWV9nX//f5+vb2dPV29/rXVdfxbvN/1dV UVtd/9fV6+vd3d//b2N3d/9nV1dZ493Lztfb1d3n3evnY1FGS2vNzVlVV3fXz913X1///1dISEpHTFf/529fW2NbXXfn6//n2dnn38/P1f9f1cPRW1lRV1Vr793d///r33dnX1NZY/f3/2tv93fv69/O09fZ1d/f/1FMSlPOyGNTUefKycrbd1dXU1FRT09P WWfn3fdnV1VXWWdja2/rzMzP0dnn/1NH3b+/409KSUxVb+/n/2v/b1tbb2v3719TTU1V793Xz8rBy83N19vj905EP0PVub7v79HP1dX3X1lNVVNTT1NMTFn/1+9VR0ZJWffj19vn29Xd187N0WtNVcG801lERElTW///b//O0W9bSklKT1VZVVFj987R283K ztfR4+Pvb29rY1XbvcH/b9XRyMvV5/9bW1tRUUxMSk3/5+9r/1lPUUlPVW/3187X19HBzltHROPB11FEP0pZ08fb/1//Y1lRUV9RWWvn71tf59Pd49PR0dvRysfb/19PTENRx7vT3dnRx83b/1dNTU1PT0pVa+fO0f9RSkNGVVFja+fXzsfX3dPH41FHPF/D w91bSUFPW+NjX//v519jV2tZWW9v91Vj99nZzsDCwNfX2f9ja+drW0xPx77K4+Pd2eNfV0ZJT1v3/1tNTUpf/2P/VUlNY19j7+/Ry8rva9PKy+NvT2PLyO9GRUFV19n/a93372NRUVFMR1FbY2/j0cvN59nf3///ztnj79ffa2tP98DC3+/X49fd52tdVU9d UU1JTV/j4+/jVUpMVVdbW1fd0crN08jAw+9PQT9rxc3vVUdd3edv9+9va01MT01XXf/j32trX2Pv993X19/v0d//a93na1dHTdnD0c7N09f3W0xHSl9v92NPVe/v39nvVUtLUW9v/9/GwMLJ09fRzN1rV0tjwcDXV0tRa1tXX19fXVtfX09VT0tPV19rY2vv 3+Pf5+/v4+NbX+/j7/ddT9/DyNHfY/fnX1tPXWPv52tXUW9db93/W1dba9/n7+fXztHOzszJxcvna09dzsbTXU1NW13v9//na2NPSkRNTUtj99//Y2PX72tjXWNjb/fvb//T0+dLQE3X0dPX393nXVdVVVtj/2NKTm9v59fd32tRW2tr/+/TxsbExsjGwM7X /01Pb8PG129jY2vna1tdUU9bV09VV01b/+djT1Fja2NbW2trb+dra2Nr711NRU33zMvX19//W1FIS2dv3/9dZ/fv3dnd72NRY9nT3dPLx8bEx9PPz87M62NRXcu/yPdbRU5bV1drW1FjVVtXUUtOXW9vY2/r6+v/Z2tnZ29jXWvXzt1XU0pK18nT12tVY1tN UV3/52NRVU5OXWfd2WNXZ9nX19/X19fMx8fMzMTDzN9nV93Jyc/3XVdnb2trW2NjUUpJSk5RW+/3Y2dr929LSVNja+9v/+/fztX3U0Y/Y8bDxtfr92NXVV1jY1dnZ1NdZ2vf1/dra2Pr6+vd39PKx87Mz8zK2e9dW1vVv8bXVWNbY1tOU1ddW29VU1VXb+9r W11b9+tjXV1ja+vn92/32ef3Y01DSe+/vc/rV0xLS1PvY11jV05bXVfv/2tdZ+/d2d/Z3c7Mz9PZ2c7FydPrY13Zvb7NXVNTV2dbb2tv9+9vTk5OV2f37///729jZ2djY2tra//f3efnZ05GQ1HOxdPfXVFNS1FXV2P/TkdJTFNr//dvZ2/V2d3/Z93MzM7O 08rKycjV71fvwL3J52Nbb2dr//dja/djWVlda13//2/v3/9XXVlnZ2v//+fn2+fnWUdBPUvNv8XdW0hOTlFMSFlbU0lISVlra99nWVvr1dvf/9PPz8/TzMnHz8jN62//yL3C1fdrW2dTb//32e//V1ldb29n31vr529nZ2tn713r3+vrb+vv909JPT/fyL/P Z0xGT0xJRlNbV0xER0tRWWtrWW/v2d1r/93R0dPf08rPysvM1d/nzL3DzO9va2/39+v3393r62tvWWP37//r3f/va29vXVdd59nda2vva1tLQD5M28bL71NKV1dKRk9jU0o+P05TXWdrV2vr3dX3///b29vr28fMy8zIz9n368G+wd9ra1dv/+vf5/fr32dn T13r7+vv3f9rXWvvY11n3dnd7+fZ529KREJM2cbD1W9ZWV1FR0xZWUpCP0pMXV1nb2f39/dnb2/33/fn383N2dvPyNXfb9W+xttvb11vb2/n//f32+djXV3f//fr39v392/3b2P31cvf5+vf629PRUlK2cjG0f9jWV1FSU5OU0hFRU9OU1lZb2/39//39+vr 3//329XO2dfXytXnb9m9yN9jVVNnb133b2/32/dZTl33///369//9/ff62/329Xf29vZ329XVU9N38rGzd/3b1NISVNjXU5FSUdHTVNd9/f39////29v92dv59vf69vPxs33X9/DyddnV11jb/f3//fn29lZTGdvb//f383jZ/f3b2/329fj29HV42dZV1NK VdfJz9nb91dTSEpVTUZHSEZHR1Nj9/f//2f3b2/3Y2Pr2dXR3+POzNfjb+PDws7nZ2///29v/+vb3/dVX/f/6//349v3//9n9//n2+fj29n3929dU0dGT9HLx8zVb09NTE9PS0tPT0dKS09nb+P/Z2Nv/+fjb9/f6+v35+PO0dHr99vOwdH3XW9nX2NZ99vV 1edfWV9db2/319fn9/fn2ePj3+fb2+f3/2f/b11NT+fRztHb611TSE1TTExLS0VBQ0pZX29j9+P3//9vY2dv6+Pj69vKyc7n49vTyc7nZ2dvb+fj29vX511fY19jZ2Pjztvb9//n5/f392/b39vV5/9vXU1JSl3OzNHb4/dfTU1PTUtIRkY/QVP34/dfZ/dn Z/9v9/dv69fb29XOyd/36+ffzMvR1fdnX2Nv9+fb919jZ19jZ2Pj19/rb2f/5/ff39XR3+f3b//3Y1VOTWPOxMrV3+NZTk1ISk9ITVFIQkpRW11Vb/dfX2//6/dvb+vr69/V1efb1dHTzMjP62Nnb/fr99vR62/nb11dVWf36/ff5+vV1d33Y2/d3/f3b/f3 Z1lbVVXdx8jb4/dnXVVZY2NJRklERElRZ19j/+Nv/29n92dbXW9v69/OytPb5/dvb9fN2/9jY/fn39vb52//X1VVT2/n18/P3W/j6+f//9vX3ePj6+PrZ19ZTUxj28rNzM3Xb05JTk9JR0xLREdVb2dn//f3X19fb2Nf9+PT293X39/j4+vnb/fKzd1vY2P/ 9/fnb19vZ29nX19v//fn6/fj3eP/39PO09////d3b2dZV1t3z8XKzNf/b1lRW1dOTVFMS0dOWVFZX29fZ1/32+t3Z29n/+vb2d3Z39vd/+vTzONnW1139+Pd2d//b11NTFVn/+vr493T0933693f3+tnZ//34+NvW1lXd9fNyc/r/19db19ZUU1KSEhMUVFf 99vZ/2dvd2dnZ2//993X09PT2+v3W1vr0933Z3fb3d/3/29fXVlTS1Vf99/r39/d3/93/+Pr2dnf3+v3/3dVV11dZ//KwsbX42ddXVVVTkxMSk5XW1tnZ2d3W2dv/29vb//d49/f39vb4/93W2fry8rZb13///f3491vb19bWVldX/9n/+vf3f/32dHX2etn /2dv//9bWWdnb//KxMvVX1tZW1dbX1tfUVFKSFFZZ2f/X2/r69v3///d4//r69HV09vj62d399PjZ2dn63fj49frZ1tNUUhNU1tvb9fP0eP/4+vd9+v/9///3evjb3dnV1/XwsnR///j/3dZW01TTkxMSFdXX2dv/3f/Z3dfX2/34+vbzs7R43dfd19n69PX 9+vr2evr2et3WVVRV1VX/3f//+Pd63f/4+Pr6+Pj6/f/9/9nW19fUV/OwsDP/2dnW1tVW1tXVVVPUVtbX1tXW2dnZ3d369nZ3f//493j4/dv/2dn68/T3fdvb2fr3ePrd29vb1dXW1tfd93Z3ffj2d3Z493db19v////d///W2fvzM3jb29rW19bX2tfX1dN TE5NU1FTb+Pv7+//9//v7//r2d3d3e/36/9rZ+PZ43dnb//V0dnjb1dTV05XW1tr993Z2d3d6///9+Pr/+/j493d63dXU1dr0crR3e9rZ3d3a19bV09KTVNXW1tb//9nW2N3/+/j3efr1dXV2ff//2dXX//Rzt3n//fj5+f/a19rW1NXU2t39+vn7/f/Z/// 99nZ5/fvd///a29dW1df38zM1edjX11fY2NvZ19fY1dXV01PZ2t3/3f/4+PZ1d3b29/r6//36/93d//VzudvW2fv39/3/2tnW11ZVVdXW2t399/r/+/369//a3f37+Pj6/9nZ11d69XR2/9nXWv//+/n/2ddU01NT1Fda2v///fr4+Pj5//n49/d493b3/9n XVvn1dfrb3f339vj7/dnV1VPVVtjZ//r493/Z11jb+/r9/f359/f53dnW01NV+PO0d//b293/3dvZ1tnX1VTU1dfd////2v/69/b39vZ1dXX3ePn/3dvb2vf09Prd///7/f/b3dfW19XW19vb2dfa/9ja2dn//f/7+Pr4+/v/2tnW1dRVevKyd1vV11nd+vr 92dvY11ZT1dZW193/+/j49nV29vd5+fn693b5/d3a2/v1dXvb2Nn9+vr5/f/d2tbWVVba2P/6/d3d2d36////3d36+Pn6///Y1lNTFn/1+f/Z19f/+vv/3drW1FMTFNbX3f359/d29vr7+Pb2dvd3dfX293vb2dr49fb73f/7+vj3/9rXVtfX19rZ19v6/fv d1lfa2t37/fn39vX3/drW1FMTFH32dv/b2Njd/9rX2NfWVVMTFVZXWNrZ//v3dnj39/d29fb19PZ29/n9+/r39PX1+f3/2vv39vr/29rZ2N3a2NjY2tvY1tja2///+vn6/fv/+//Z1lRTVF319Pba1tfY/93d/9rX1lRTE1NUVtnd//r3+//59/f3//3393d 29vf3+fj6+/j3+fv7//f29vj5+vv729vY19rd/f//2v/d29rZ//v39/j9/f/Z2NTTk5Z9+Pfd2dda2//73dfVVNMT1FRWVlfY+fb2+//7/fj5+/j29fX0dvf6/frd/fb29//Z2vr39vn//93//9vXWt3b+93Y2Nna3f//+Pf39/j29/ja11VU1ld/9vZ7/93 X1lZ/2tnX1FOTU1NWVldZ2vrd293////6//f3+ff39vf2efnd2vn29Xrb2P/79/b9+fn39///293Z/9r/+9nd2dnb+ff3+tv7///Z1tVU11Va+vn72Pfb2NjY1VZXf/vZ11dV1dda+fn/11r59/f69/f59fR0dfZzs3R62tj/9PT2e9jXWt3b29jY2dZU1NT WVld//9na2v/d1tPW2dr/3f///fb3+9nT0lV2c7R3+//Z2dja29vZ29vY2dvd/fr93d3b////+/3593b39/n49vr/3drZ+vV1+tnb2tvZ19nZ2tnb2djZ2N3/3dvZ2f//3dra29v//f////v9/9vX1VX/9XR3f9nXVtbY/93a29nY2drZ3f/d2tr//fr9+/3 493n5+/r59vd5+9va+/Z0+NrY2Nrb2tvd3d3/3dfY19rb3f//////29vd29vd3dv//f39/dvX1lVY+Pb3/dvZ11dY2trb/9rW11dY2///3dvd+vv6/9v9+fj4+Pr39/f2+P/Z2/f0d/3d2t3d2///3dv/29ra293b3f/d////2dva29vd//////v//9rW1lR Xe/Z2/dvW2NjY2Nba29nXVtbX3d39/9ra//v7/f/7+fn5+/j393f3+P//2/f1dnf/3dvb2N3/3fv//9va293/2/3a///d29vd2//b//3//d3////a11RUW/f193/X1tfX11bX29nX1dbXWdrb3drd//v93d39+vr6/fr3+Pj4+Pr9//j19fj/3d3d//////3 9///d3drb//////3//93d3dva2//9+93d/93a19ZU1/v393/Z11fa11bX29nXVdXX2dvb3drb//37////+/v7//v3+fj5+ff7///39Xb93d3a3f///f////3d3dnb//////3/3dvd/93b3f/7/f//+//d2dZWV/v39vrd29rb1tZXWtrY1tXXV1na3d3d/// /3d3d3f3///36+fv9+/f6/f/79fd63d3a2//d//////393drb///////7///d/93b//35/f///f/d2tbX19339/r/3dra19dY2NnX11dX2dna2d3d///d//////3///37+fv7+/j7/f/79fb729nZ293b///d//3/2tjZ///////9/93//f/d//37/f39+/3 /29nZ19349/j7/93b19fZ2tvY11dX11jZ2v/////////d3f/d3f/9/f//+vf4/dv99/f73dra293///////372tjb3d3//f35/d3//93///37/f36+/3/2tra2Nr7+Pr7/f3b2dfX2djXV1fXV1dY2//////d/93d/9vb//v7+vv/+vn6/93/+Pd6/d3d/93 /3f///f3/2tr////////9/93/3f////39//39///d29rY11n/+fj5+v/Z2NjY2djY2NnX19jZ3d3//93b3f///93//f//////+vr6////+vd4/9vd3dvb2v//+/v/3drb29vd//v7/f////3///3//f39///d3f/b2djd+vr6+//b2tjZ2tjY2NjXVtbY2tv d2////////93d////////+vn7///9+/n5/93d3f/////9/f/d293d3d3d//v9/////////////////f///9vZ2Njb+/r6/f///9rZ2trZ2NfX11da////3dv/3d3////////9/f/9+vn///////v6+/3//93d/////f/d3d3d3d3d//3////d///////9+/3 //////93b2tnd+/n4/f///9nZ2Nja2Nna2NdX2dvb293/3d3//////////////f3///37+/v5+/3d3f/////9/f/////d3dvb/////////f39/93//////////93d29va//r5/f//3d3b293d2tfY19fY2t3d2///////3f//293/3f//+/r7///////9+/v /3d3//////f/////b29rd//37+////////////f///////93d29nZ2//6+/v7/f/b2drb2djZ2djY2///3f///93d3d3/3f///f//////////////+/v//93d///////d/93/3d3d///////////////9+/3////////d29vb//v5+vv9///b2tvb2tra2tn Y2tva293/3d3d/////93d3f////3//////////fv//9vd///////////d29nb3f///////f3//////////////////93b2///+/r9///d3d3d29ra2dnZ2dra3f/////////d3f///////f39+////93d//39////////////3d3d29nb3f///////////// /////////////29vd3f//+/n6/f//3d3b29va2tna293d3f/d/93d/////////////////////93d//36///d///////////d3dvb3d3////////////9/f//3f/d////3d3d3f//+/r7/d3d3d3b293d3dva2tra293d/93////////////////9/f3//// ////9/////////////93d2tva2tvd/////f3//////////////////////9vd//r7/f//////3d3a2tva2trb293d3f//////3d3///////39/f//3f//3f/9/f///////////93b29vb2///////////////////////////3d3d3dvd//r6+////93d293 d3dvb29vd3d3d3d3//////////////////////////////f/////////////////b293d3f///////////////////////////93d//39/////93d3d3//93d29vb29vb2/////////////////////////////////////////3////d293b293d/////// /////////////////////3dvd///9/f//////////3d3b29vb3d3d3f///93d////////////////////3d3///3////////////d/93d3d3/////////////////////////////3d3d3f///f///93d3d3/////3f/d3d3b293//////////////////// ///////////3//93d/////////93d3d3d3d3////////////////////////////d3f///////93/////////3d3b29vd3f///////////////////////////93d/////////////////93d293d///////////d/////////////////93d293//////// ////////d///d3d3d/////////////////////////////////////////////////93/3d3////////////////////////////////d3d3//////93d///////////d3d3d3d3//////////////////////////////////////////////////93d3f/ ////////////////////////////d3d3d/////////////////93d3d3d///////////////////////////////////////////////////////////////////////////////////////d3d3d///////////////////d3d3d3f///////////////// /////////////////////////////////////////////////////////////////////3d3d////////////////////3d3d3d3//////////////////////////////////////////////////////////////////////////////////////93d/// /////////////////3d3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////LnNuZAAAACAAAHDqAAAAAQAAH0AAAAABAAAA AAAAAADT087My8rM1W9369/j493b4+tvVVFVZ3djXUpVVVlfa2v/39/Z19vb3ePj5+/n3dvNxsLCwL+/wMXIyMzf93dnVVNVTktGQkNAPz9ERUlKV+/r7+/fzczLyMjAv7/Bw8TGycvOztXn/1dIQj89PT9DSU5TWV1j/+PbzsnLysjJxsPDwr/CxMPHy8/P 19/n19XfX1lTTElKS0pJSkpNU1FbZ//r3dfT0dXV19/3Y+u/s7vFy9t358SysLnMa0U/S+/HydtOOTIxOERv901BOTQ3R93Au8TX91X3x7qurrW91V9j6761uMF3PzUzOU3f72tKPDk9Tc67u8TdTkZT1bmytL3Ob0xjzcG3u9VnQz5La8a9xt9KOTc7TNnE 12dIOTg/a8C4uslnQ0NO17qztsLfZ1nTubCtssTdS0FP/8W+3Vc9MDA5R+fjVUI3Mjg/27u3vc13T1Xbvqumsr/rXVfvwbi5yF9HNzU9T//vSjs1LzhI97++1e9LRE3rvLCxt8brX+/Eta6wvttJPkR3v7m6zk05NThH3czNU0A9PTdZ9+fLXe/rY8XTvb/R 003Z49Ovsa2z3ds+Tc3ArbnESzUwKj13zbp3RCwpLCtVysS5X2M7O+PZr6mvrtPdT1W4tq2vx9c2RENOw9vbUTk2KjlE373bzk88Y0PIv7y41873U7/CtbHCwU9VT1XFxL7XXXc6U3dfu+//SjM4NE3Oz8JPTDk1TOe4rrm9WVFDTMG4rqi2vv9NS//AtLS7 40QuNTtDz8xnTjMwLTFBY9PJ499V793Gtre4usfByru8v71jd1dL2efOzU4/MTAwP3fby1lBPzI7S9uytrrMWUo+/7+vqKy250tLRdO6urHPbz46TlXVvtPRSDw1PU1Z2e9OSTlFSO+7yMfTY2d3xrq0ssDD/+vDxa+wubxMRDk+2efEyk45Ky0uPPdj9z84 Ni5EZ8KqtbfK/+vrvq2tp7fEQklnVcG7x8A/OS4zSknn/09ONkA9XcbLwdln90nN0cCxysbbX8nZvbjDy0pKOEjOybW5z+c0OTdEv8u/3UQ1KjI767a9u2NNQjrbvLWntbfRW9vfvK+xrb/RPUBTRtnvU/c1OjQ2TD9KQTo/NUlbzrbDvtXXxcqwrrCvzNVM V8fKubvNTTYzLUDvd79ZRjQpMjZjssa63Ug9PGfPuKu6u19vXV23tLGu1Wc7RFfjvru+x0pKOE/X78ZXTkMzQDpM2WPvS0lNVc7HubfEyVPPvr2ssLG562tM37vBt8xrNy4zMU3NXWs1MCkoNDz3uMq/b1NP77+yq6iztm/Zzcu3u728T0g5QVVb3VVTPjM8 OVfn/91GUU9Lxsy8uc3rRlHdzLextMHdWT1d09O3v8rjRkVD777HvN9OMjI4Om/L99k/PDQ4W9e9sr+763ffxLWwray9wl3Xx8+5xszNOj80O0tJUzw4MS46OlN3TndDWd/ZtbKwr77C6866ua+uu9NMRDdP093FW0g5LDEyQs3/11M8NDVHY7+xurxrU1VO w723rL3C92PO177ByMRNW1njwsq+71VON0VJTs9XTzcyODRJ3cm+19dCTefTtKyvrsDF/+O5tq6tvMZFRTpF2e93WTo1KC4vNU9ISkQ0Oj53w7qtr7vJ27+/sa6xr8jrVU7PzsDKXU0yNj0+9/fjRDo5MkBv973FxWtKW2/NtsC8zdFHU9nJt7S+wEpKP1O+ u7e1zGs4QEFZzdXjVTUyLTxDTcnr/19Aa+/EubWuwcXIyLS2rrK7u/9f71/J3+dLNzUtLz0/Z0tBMy4yOFG+vrG8vs1nxLiuqa+vztVRX8HAwLlvVzM4NTlnd2PnOTYsND1Lycrr40JRTc28vrbB31tNzMi2sLi451ldTsLBurvP0UxJ32PI391XOjkyNE5L 71dLOTVAVdm1u7fFzGPru7KtqK+z6+vv17q2wMZFPiswMjVNST4/LC4qNEZdwMvVz1vFwrOusq+2zMrZvLy3t83bRD5RTN/rb008OjU6U0rjY2NNOUdVz7q6t8/fRkH31cSzubrZb05Rz72+uL/MSEpra8G7y9VAPTU6RD5XWUE+Mjg/Z87LvcHV0+e+tLKt s7W5zsG+vbK1uetJNjI7P0pRPzwsLS4ySF932/9VPlnIu7CqrrLCx+fAuLe0t8fvP0lGXc/f91E5Mi8+P1FrSkM2ND1F08m/vdX/X1PRxLm/w8hvd87FuLe4zedjSffIwre9v18/OzxI1/f3S0AtLzU8V8vRyGdVRWu/ubSstLnLxr+4r66xtMjvRUtGSFdE OTQqLS82PERJQjs8PFPPurW2tb7JwcSxra+2wcz/Tdnby8fMX0I7OTx3Z29nSjwzNz1H1dvGx9lfY+vX2cLLx/fv79vJw8i6w8rT39PXysbZxef3/1dNRktIP0k7Pz9EPT5LUU7f68q9vL/CvLq/t7ezsbi3wMjM28tXTko9OTExNjM7NjdDP0BHTf9ny8rD ubq0tbe1vrW4xLzGwszd90z/W0dZSldDREk5Qjk4Rz1LSUlrTGfj3cDMydXVz//d29nAy72/wMPTy9fVv8i+zdfTd+tRTudVS0JAQTxBPjtXSUpTXePdxcG+t766u7e3urC5vLW9ucff70dJOzU8NzgvLzIwNjk7T0xda/fT18i7uK+zs7a7w8jAwL66ztNv V05JWU9P61FPRD4+PEFCS29VTVNf6+PJxc7E2+dv69/Xz8vIvMLEzs7V3czPz8LKzf9VS0VLREpXSkk/Ozk6QUVN09fKycvPxbq5uLK2tbq+xsW7u72+y2tHPzY2My42d1M9NzEsLjv/s7LKxmdNa7+rqKitum9Ob8W1r7jNXTsxO1vbxdNIQTAuNTtn3/9X OzI5QtO4sb/Kdzk/XcyxsrrNb0VE/7eurLfMTj5FZ7+ztcVVPSwuPUzOxVNEMCouSdG8tsTIV+vbvauqrLe9WePCuKirrsxGMyo4O+/ZRTQjJCMtRee1/182Lzt3rqiirLvJPEvjsaOhr9VMKDA6a6ysrVk6JiQ0R7KvvGsvKSQwW7Cnr7hAPTI52bustbpd O0VB2baqtLrCOFFJ2bq3tu9fLzI8PdVRY0U5Ly1BRM3Mz87j1/e5r62yvLzfycu8rrC10c9OR/dK51M7OS8tKkBDTuc/RTpBP3e1sq68wM/Xv7irq6y7a289Vde6tMr3NDMuOPfMs8dILSgoLVXMs7d3Vy4wO9mvp67Nay8uOF+tp6W01zwuP12wp6ev1zwr MkTJt7fNNi8mJjJAwMrFXTc6PGO8pqirr1vvZ9WwqKavtE1CTVW/vMBMPickKyw+R05BOzcrO0jfuLi5xsZrx7SvqrCwxtffU83Ew9PbSztVTOvR2+9OSjM/RkX3T0dBTUFdvsO4yHdHRFtvtra6y19nR+vItqyzwUtEN03ZwK27/z0rJy1AXbnGUTgqKSpP uKeisbtIPkzNraiirb9CNT5Xta2ruVE7JiovPd/dUzUvJyw0V7W2tNNPR0XKsqOjq7FVY1nNtqyux+8vMjQ9zb6461U3Ljg5V9/NSUc7LUFEz7u4uff/OkHjybnDwV3Z9++/ure+vVnvyeO+vcRjWz0yS0j/50E4LTErRd/ZuczZZ1vfuKmmqLPGa1Xjv6yn rcJVOy09PeO+b0osJR8kNE23vdtDMS8127eqorC8W1VPva+oprjXPjU3W8S8s91rOy44QL67vs46MSkwPsC2u71DPjw/17mvuLtDPD5Jwq6psLhnOEZFx7uwtdt3Lzg5PdPO30Q9Ki02O9nMxd3f71vMu62wsLnMyP/FvLe5x8xGY2tryl1GNzgrMkA/WVNH Ojo5RMC9trjH1ffvy6ypq67E2UFXTs6wucVZOyw1RHe1uMNXNSorOUq6tM9bNS8vU8uvqrzfODY0X72yqbO/7zpI47uvrLfRWzI4Pdm9ur5ENSkrMEXLyMVLPTg3Vb6rqqqz09Ndzrqtq6+4/0xESOvDuc3jOCwtKjVEa1NIQC43OkrRvbvOyevrxcKzs6++ yMPdxsrHx9NrPltZZ83T3UlPPD/3W99vTzs6NzrPxr23z+dHTD/3uLixvdNLVf/nr66vu3c/ND9IwLS+zj8zKzE8Z77G/zwzLTRv3bGst75NTlXGs6yossBKPUNfurSuvE86LTA0Z9fX7zQvKS4707m6ulVDPTzjw6ioq693X0Zrvq6qsbpCNzg2d8W3vsxB Lzc1T9nCyk9DMDM5Rt3EuevnT0JvWcjGv8df1WPNu7e3vb1P5+Njw8XIa1M1O0hB42tZRjkuLEpRybvJzPfvTL+urqmvuMrn/8uzsrK+3Vk3PkD/zv9INC0nLzNDytvnQToxOu/Pr7C6x1VZV7yzraq9yFM/R9G8u7HbTjowOlfEu7nfQDErNT3RvLm9UUE0 O2+8rrOzXTw8PNu5rKuwxUdIQGPBuLjJdzc4OD5Xz81RVzU0Oz1j2cPRb1tI18y3tLi519X/zry7u7/TRFFbY8vP0VtBLC06P29v71dFOjNd58q5w8t3X0nHtrSutcLZWVnMvLe6yOdKPD5Byr2/ykk4MTc8/8TO6z82MDpvxrS1v188Nzznuq+uu8xVRF2+ t66uxfc1MDdEzsK82z8sKi8928i/0UU9ND7ZtayqrctrV+u+sKurst9NP0jdx7q+z1kuMC0yRndZRUEvODxE38fC21s/Q+PPubS1vMzvZ7+8ube/50lVT/fR18vrTjo8S13b7/dVQzQ4Z/+/usbRb01Az8W/uMLMWU9Zz7OysbrTSz0+RcjBwM5INzE1Ot+/ yddAOC45U8W2t7zjSz5RxrisrrrEST1K37yysL73ODM1SNnKyFU/Lis2TNPLv8NVPjQ9b8K5trTXZ2Nvybuvr7fDV09HX8i7xc3vPD8/Rd/V11lMNjQ7Q3fT08znTElnb9PGy83Xd2PJxMG5uL7J2Wtv91dvd2NKQkJBSEJIZ1VGP0VFUWfvz8DGzcbFwby7 uLW5vL/FzcrOzL/I1+9nRUBCPkJGQz5CPjpASlFb//9jUUhZZ+vMv7q7wNPZxsrHvrzF2eNXVVVV993Zd1dMREM/TP/va1dPT2Nn58W+xd3j72/j38/DvsXGytHNysTGzt1rVURGWWfj/2dKSkA9SE9ra+9VTk1N69HPxcXGz9130cPJwsDA3+//b9vO1d93 Uz47ODznwMZbRjQ2OmO9u8rnUzc5WcO1rbG6zE9L0cC2sLi+Yz06V93Kv83rRzQzOF3v0+dZPTg/Tc29u7/vST9L38C5ub3Ob1F3wLqyu9NTPDY6U9vIy1FGMTQ9SO/T02dbNj1HZ7u7t7XDyl3JvrewvLvT9+Pju7/ByFVAMTtf587vQjkuMDdXw7y+UT42 Kz9Vy662u+NMPj69r6ututk1PENZuba4zEA1LTlTzLu87z8tNDNXwLixv8pMNUxXw7C5uNVdQ13KvLC3vchBSE9XzcrJ2U5EOknf69FTVz0yR0XnzN/dTlFGa8G8ubzTW0VM5760sb7bXz84S/fBt9tZOy42OVu+wL5ZSTAxP1nFusfGXVFH9721r7HAxW9b 68q+vsfdU0hDXdvdzElJPjRDSufG599ORkBI18O4vNX3RD5OzbKws71vQTlD28S2wv8/NTA0XcnIuGdNMzE2Ot+/xr/vST9j076vsrm9X2//zrS4ur3VY0zf48y+b2M7Njs+493fb0BBMj1jZ8rTXUU7PEPXtrWxv8xfQ//Ovq7Cw29FNzhdz72472cyNTk8 28jKzFtNOk/Vzr28xtFOTVPTvcC8z9XdTsnAwLnO0UhBTkvOvb++WU41OFFdv81vRjQxMT/LvbS/2082PVvGsa6xyHdDOWfKt6u8wVs3MzJJ0cC390svMzpFzcLNxz84NDvvy7yzvcJra93Js7a6xm9fTtnPy7j/Z0o5QkFjzd1vQzsxPl/XurTO2UhISlu4 uLi441M8SN/GtLbIbz85M0fn1b/P/0g4Qz9Xxt/XXT81Plvrx73Mx1lf2+O7uL2909lf47i8tbfNX0NPW9u8ytlBOjExQmfbvfdROTAzPWO8vcX/YzhFd8qvrre9Vz44SsW7srfTUTU6PmPFyMdMPzYxQ2/LuMjIXUFMZ8m5ub7T/z9O48aztr3BU0dIW8a9 tsH/Rz1Ea9G5vMtJNC4uPmfbvN1dPjI4SNe3urfMYz1JY9Gzrbe3a09GVcfBubv/RDU4OknVb+tbPjw3SlVv0Vt3TE3X0bu4vcDV3XfPu723xdlvRlv30bzP50s6LzlN78zD72c6PD1jt7S2ueNKOUt3xrW3xOtGQT9vycm95048OklnzrzP204/OD5Nb9Hf a009R0zvvLu+zfdLTXe/t7C2we9ZX+u8r7O3zko4O05nz8TdTDo0MD9j18bXZz4yPEDnt7q6xWtKS2PNvrbAxk1JUVnNwsXHUUI5PExd2e9vTDxCR2/KvrzV3V1J/9PBusfPX1Vn38O4uL7PYz5M/864t73GTT07S/fv2VVGODI1PP/M0c5XRj1Da8u9t8bG /1/nxrq4s7nL60hf587B92NCNTk6Tevj40Q+MzVFWcK8xNFbTk/Zt7WwuMpXRU73xLS3ve9NNjdN98++32s7NzU73b29uMX/P1Fd27i4wsxIQj9bzsO8v+dGOkZJ48bFxdljTUTr18/XV006OT9H78vPZ01FQE/dx7u/w99Pa9/DsLO1u8NrWdPBvLfB00Q7 Njxb5+PdSjsvND5M78zZ601BP2vNvbW6ye9HWV/KvL2/ylVEPk3rycf/WTo1PEL/x8jZW0tAS9PHvLjE/0lAR92+tLW+yFtDVefDtre7yV1CQuO9u7i/ZzUxMjZI3+/vSjkyNT9f0cDO2VdJU+fHuba3vcfv08K7t7vC00lFQ0vf1+NRQDUxOEVV193/RDw8 Quu8urW6yF1O98/AtLm+z19FWf/TxMHZazs9P0vj0c/RWUxGWdnHvMDN40dFT9/Mx8bdW0tFXdXFxNXjW0VJWca7t7/jXz09TVnV21VFOjQ4P//jz9XjRT5Da9G6uba9y+fdx7q3rbO81WtOW9nNz8pdSTk7PENRV05dRTw+Q1Pn08vV0f/n18nEyszN729v 18/T3+tvSkVMTWtvX1NLSUZT3efT19frW2drd9Xbz8nK7+fXys7BysfDytPV0c/RxMPAydHdU01JQEU/Pz9BRD89PURTU11jb+/349XdyMa5tbq9wcLFz8DCyMnnb1lTQ0NVTU5KQTw6PUVHXVljb+Pnb9fCyb/CxMrR1+vRydHL1dXZb3dXWV1j519bU1lv b93X48r/d+Pj/2v/b2ffX2fv59vr1+9n3d/b19vR2dHK2cjOz9//d01FPjtBQEpLSEZCR0tMWVnvydHV187Hwru6uLW7vsHGxc/GzNfT711TTVNMT0Y9REVGQ0RMSllnd9/by9HRyNfOz9vN29PT29n/3et3d1FZU01MSllRTf9dW11j/2vr//fdZ19n2dHd yMvNxdPMzcS8x8PD0cvNx8fFvs3ZW0hHQkRCPkI/Pjs4RkZPT09ZV29r2cfNx769vcC6vL69v8HE0e9r42dTU1NMQ0VAPD5CREVHSUdbZ2/r08nGyMzLycnTz9HLxtHVzNn36+dvX///W2djXfd3a2vb0e/39+dnX1tVa/djZ+/3Z+/V2dnLy8/Z39XPyc/V 18mzuetfPzM2O0rX50hBMS42PPfDz9l3PztH1butrbW8zv/fw6+ur7rTU0BHW8q9yvdMOC82RWfXa01FNzRDW8O0ucHfTEdTyLe1uMf/PTtT57m2xGM+MC8668G3yVM2LTI967qtusx3NDVIY7+wvcjXR073u6+ts85vOzpfuaurrsFDMS40Uc3O51U4MTA1 SGdjX0Q6Ok/VvK61zNFDQdfArqeossZVO0V3yb3Rd0w6NDpN1dXvPzctLDVdtrK7yE8+PEHRvK+0vsxTT2PRu73M01E6R3fZvLfdZ0gzOkvZu7O621c5Ok5fy8X/VUc+ScyzsLXOTz86P8ivqaq1008+OUTjwchvRjIyODhOyFdDOiwtNkrGr67Cz0A6Sve1 qaissMN348nEu8FnW00+U8nBwvc5MCsqM0fHurzHUT5DROu8uL7Nd0vnyr6vts9ONS00RsmxrsNbNSssNkfTusDM2UdBb+PNyW9TRT9Vw7Kur73RTEBHb7yurrK4329vY8/F21NFOThHX93PUTcwKis4Ucq1utlfPzZH276vr7e7w9nIuLK1w+tHODhGzbS2 v1cxKSksO+fEws1TPDxFU8m+ydNfTnfEuLGxw/9INT1b2bSuvs9bOTY9U9XF1fdZUVPZvrzHVzw0MjnrtK6wv103Mzpbuq6stb7dTWvRw7e4z2c6OEdV073dSDImJjA6a7u7zlc7NjhG0bu7vr/DxLqvrK28/0tGS+e2ra69XzssKzQ/3cPPd0g3PE33ysrj d0Y8d8O1q628WzgtMkPMsay02z80MDZBX9l3U0tFSd+/vMVvPzg3P+e6ra+8y0U5Pk/CsrC0ut/318W8t77TVz08X8C6t79KLyYlKzrZvrrVSzoyN0Xvv77P52/rybmsqrS/XT0+T8qvrbDBTjEtLzxv1d3vRjg5P1Pv32dNPzxHzravrrzjRTY9Wc61rrrI 40FFSWfKzfdTPj5P17m0xO9AMi41TLyvsLz/OjMzQ9O+t7jA22vZwry3ucjdTUnnv7ivu2c9LCovM0XZ3VtJODY5QUVRr2tOUWfOtKqqtMlbR0fjta2rsL5NPDc/d8/L31tENTtT783MX0k3M0X3va+ss81DNjtN37qyuM1bRkRKXdvjT0E5OkNfxrvEZz04 NTtrxLa5w89JPkdXzb3Bxs9r68+5tLS+yls+Tdu4rq2xy0AtLTI+d9HRWz01NTtEY8zrTEM8RefDsa62wv9ISvfDr62yuddGPUJrz9fbXz07P1Hn2WdLPi8vO++/trXCZ0A6R2/RubXA011K99XKu8FbRzw+U9u7t7/fPzQyOFe+tLjHWTs2OUnOxsbKX0hP 4762tLvHW0RNyLavrLHDbzk5QEVn029LOzE1O0hV/1k+Nzg9VcO0tr7bR0JL57asrLC961FNZ8i9vMjvSTlBXdnAy2dMNC44Rte4srnMRzlCVdu7t73MXUhR48/Exe9DODc+Z8S/x1U7NTM7W8y8vMjnRj5FWcm/zttfQ03bwba1vcdXPkrnvq6qrbjfPDxM /87BxWdANzQ7RVfdY0M5NTpXzL23xGdJP0Vnx7SytbrRX13/yL3Dze9KQUvrxsXTW0AvLTdO0b28y107NjtZ0b+4xedPSG/LxLq4zl9APUZvv7i3v1E2MTM5yLy7wttPQUJJ48zR31c9QVPXvLjB1WNIQWvAuK6vtL1nS2Pjyb6/0088OD9TZ19VQzMuMjlX w7m81UY1Nj9vu7SzutVnW+fKvba/yutDRm/Nu7rMVT80NkNdxrzGz2M/Q1Hr0cLH23dPXdHCwsfPXT8+Rl/XzcDKUT82NjxT483Ob1FHUf/Xw89vXUVDT+u+uL7Haz89R+fCtrO1u9Hn58zJycLJ71NPW3f342NEOTc3PVF31cnTa0pIRkrn1c3Gys7Oy8XC ytXbb11308bBydfrSTw9TFNZX2v3WU9XX11VXVtZW1fXw8fNy87jW1vv38/Ry8XN519VTUpMUVVfd9vX5+fnXVFbS09r79/V2dvZ71dfb3ff2ce+vr+6vcXR1+vn793OyONfWU0+OTk/RUdTW2dfY2tbV1tXY/f33cjEycjJ09nva+fVzsvKzMzbY1tMTFtn Z+vb4+ff92vv//9vb+/b08/TzuNvW1dfa2v31+93Z1tTT0xJSktKV//f3dvn43dXX11d69HT09tvb/9fXffr39PTx8G/wcHCx9Pn/+fX2dfN62NbRj49PkVVY11v929vZ1tvb1lf49XOys/LxtHf3+Pv19Xdzs/d29t3V01JS01NW9v/d+drVVNKT2vn79fN 2d3f7+fj/+fb3+fZ29nX3W9jTEVKT1fv3ffj929jZ11nZ2/r5/fv29vj42tn92/jzsHCv7y/xsvO0dPV19njb2NdX1VGP0FCQkVNWXfZ4+tnTExVX+fTzc3V/2t338O/yNv/UU9ryL68zWNJP0RZ18bDy9tVTFPbxr3G3WdCQ093xb7P71FAPUVdzcDF2Vc+ Oj1N387L71dIP0vVyL/C2VlNT0PVzNXJX29MTNt3wczOy1vT19O5urfF/1k6TePOtrzPPjY1LkfbwLfP20E6Pz/NwL6+XW89Pm/3uri/wEdRP0zAvbe711kyPT//vsnD2Uw/NU5Zyr/bzEtCW0/NysfMVV8/S9PjwcfT20pXS1HN681rTU0+a+vOv3fnSENL Ssu9vsBXXTk8TPe5uL7OV2NF58S7srfAyUdLRv/Au73XXTsvPkBnys7VZ0k+PE9rzcbR61NNY1vZ2d3vX19d58nNy9P/WU933cvAzN9fTUxrzcG9wv9rS0lb3ca1wNNNQjM4SdXAt8pbPDo3Q9/FxMFrQDc+Tt3Nw83vU0dI983CwsTXTkdGRHfNzNXfXVf3 18vCyNvnY+PJwry9xGtTQEFMz8vE2Wc/Pz1V0b7DzF9VP0JXz7660W8/Oz1N07u4vs1RPUNJ47vEw8lJQD1R69XC53dPRFNrycHLyFdRS0X/78nKd/dOUUZr1dXOX09HTPfMwb7V/0M7Pk/Lubm82U86Oj9vvL3I209DPVHRvbS7yVNLS2/EuLa0yu8+QEVX 3cbO01lEPEdj39HR/2NPW2/Ryc//T0FCSXfXys/jS0RHV+PDw8v3V0VO2726tMTfS0E+58WwtrrRWTk9Qt/Bu89rQDk4QGfNxctdOj5BR9m8vb/dRjg+UdnAu8HJ/1FEWffV0+tnVUpjb9fI129RTVP3yr+9w833SVv/zb7AxetMQkJjx8LB1f8+OUFfybO5 wl9FNDdC78u4xuNIRD1NY8zFxOtTQVFrz73ByNNLRUNf0cXBy9dXU1Vdzs7R91NOTFvn1ct3Uz49RF3Pv8XGY1M/RWfVyL/MzUtISF/NwMXnZ0M5R0zRubzE70o9PGfIu7S5zFVOTE/Vx8S/32NGTWfvzcjna05LTG/MxcjXb1FHTU1v22ddTENKUf/Rz91R TT9I58a6t77OW1NN47y6uMzIV0VPW9O+vsLvUz48Stu/v89rPzU3OUnXzMXTVT5ATFvOwszPa1NPd8zIx85dTUdFT9vHzM5rTENIW9/IvMvOb05n387AxcTvW01X18K9wM3vQkFDb8LAw8b/ST5JX9/Gxt1KPz4+XdXIv91XPT1HSdO7xMHZUT9O68+9usbM W01NX8rOyspdV0ZHZ9/IzedMPz5EVePfze9rSkn339HKzttTT1V3x72+0fdNPEVT/77Cy2tLPjxP08u8wc9VTlVfzL7Fv+NXQ0xvzsG7x8tjSkJd1c7ByNn/Sk9X/8zr3Vs/QkZNZ9/RX0w9PElrzcvJyGNMTV/Jv7i6wNFvW/fPu7y93WNEPkpd37vP2Uw9 NDdHd9/I6088RUVryMXMxmtTRmvXwr290f9NTUvf08/O/05GQU5T3c/fd1dKb+PKx8Tf90lNX8rGvsPBd1VLWee8v73Pd0RJUd/BusXjS0E5RGPXycXrRDs7P2PVw8TbXUVBT1vPvcbF2Wdjd8zExcLvd0xKb9vO23dvQERJV+vn319HPjxR78vEzNVRRktj wcG8wdPrS0Vn977Aw9tNPj9D/+u/yd9NSENO2cHBvNVbQkdT3by7ychfT0hjzsq9vczPSFNr38LKxcpPS0FVX2/jXVFAOkVHb+fT2VVKR03OzcHKy3dbVd3Ds7e2x+NTSFvRyrfE20M9Nj5d69HJY0s3OTpF68/J2UE9PkNExri6u8Lb29vEvby6xM93T1v3 4+t3Z0VFSFf359l3WU1FTuvXyszRa0hGV9vEwcPL209MWeu/vb/Ld0ZGUWvZv8fvSj05PU3b18jfWUU+P1njxc3K51tLY+PGvLm/xmtfY9vLz8rGb1VFS1Nv//d3T0BJSFNb/+9XTFFX0c7JyszjX1P/17+/w9PnW01Rb+vG1/dRRkNHV9vZydH/V1fdY2Pd 68jXb1lXb/ffzc3AztfV4+fvzMjMxdXT92NdV+NnTndOTUJDRURRUW/XW11OW19d18/EvcrJ29fTzb+/ur7P219XV0/rb//3Skc9PUFMa09bY0xIPlVn38DNxcd3X2Pf08a6wcTRb/9fb2//zF9jVUNNSVNfb+tb/19Xa1/n3dnM3dHfa//vzs/Tyc/Jzd/X 18zbz8jZ0d3vd2dnV1ldSlFXTExKTVFfWU1jZ2N3b9/b1dHRyM7XzMrHxsrK1dvn/+N3Y11dXU5PTklMS0tJS0xGT11bXf/X1c/P49Pb49nOyMvLzNPX42NvXf937/9jW1FPWVNjd9vna3djV19r59XO2+//d2Pj08XJxcfT19ffzszFys3V629ZV1tOUUhF R0FCQ0RRSldPUVdv39ndzdHOy8XDw72/xL/Ex83NytnX91VTSUpFU1dKR0c+OztT5+NrUUpJSuvCub3K12td58W6t7bE11lHWe/Rw9f/Qzw6PVfV2d1bRTxBS2/GwMrbWUdIU82/urzRb05Xb8a5tbrLd1NK59W/usfnRTg7PUzbzutNPjc4Pk3OxMfdTktL V8i6tr7E42vny8K7v8TvX0tJZ9/Z21VEOjk/Sm/d/0g+OzxVzbq5xndTOv/bua21t29JOjvXxq+zwlU0NDJT37m10Us0MzJPzL2122M7OD5Zvbmw0f9MM05dua6srd9vOD/jvK2xsV0+Ly07U77CzEYwMCo6Ssq6w908QjxTzbustrXbWW9Ovrasr8DRP1E+ T9nJy11LMjQ5OElM50tXSTpMSevfxMfXw13M0c7Hy7/NvsbRxWPjVetv19dbaz5APkJV68Vv20s6QjZMTM+81b9HTz1E0cGutLrZSV1DxLusrbnNPT86Y8e7s99nNy4uOWfVuOtRQCs4Ndm6ra/v9zU6XcSuraq/0z81S+u0srTRPjwqNjz3vcHdNjQrL0Bn tLu3/z5ANWvKr623vD9XP0zGsq24vj88STvZz7jJ0WMxQDRCa8rD79E4Qkc71dm80c9rPe9IzMm8u8u+487Pz7/Iu+PH0Vt3RVk/U0w/3zpKPjw8NV9CxMXdy0z/RtnOuK64td3f/++8wa66vtU9PTNKU8jKUVkuMiwyW+u613c9Lzs5wL+vsMT3PUJJvrCu qr/NQjhDS7m2r79LOCs3N9HIvcE+PjEyP+e5wrhNSEU0Tm+5u7jIUWtAb9e5sLW032NTR9XNt8jKXztENktMb91KWTU9P0X348Nb0/9P2d2/wbXKy7/vxcu/xMbGTtdNU11NV0BTN0trPltCTj9GS03M2cfbd2tL2WO8uLq73+dHZ9/Hsbu/d04+PF9jv8LV SDg4L19VyLvRYzs4M1fNwrDGzU08PT+9u6yuwdlBTVG9trSw2003MjlPy93ATTk0LDY808q9z0tHOE1dvLGzstPnV1/FuK2ztddNU0Fn68TTZ0IzODQ/S2fvSUxNQkpN49W/99//RufryMi5vd3DX+fRzcnRyE/P609jU2NJYztd401rS1NDT0hDydXO019V SutLwr3Dvtv/Su/RvrCyuM/vRkXrY76+0U08Ni5HQ9/E/2s6NjE93cyyusZdR0lOvLasrL3ZS0pLxby2sd1LNzEwQv/nv11AMy0yNdvHubtdTTpBTMC2t7DP411M78a2urfXTVVDY+vDx81bOj46Rk3Zy2d3PD5DQHfnvtfd/0dnUdXOv73OwN/ZzMm+vrjX wc9ba0xfSnc/RF08Rj49OkRKPNV3/9lId13L57SvubXEyPfOy8mvtr3ZVz87VUnM1V1RNDArND5Xx9v3QDg2O9/JsrK9201OTMG6r6q5yldDQOvEvrLMd0E2Nznj18DJSz4vNTr3z8++Tkg9PE3dvsi641NVR93FtrK0xF3rY8/DubrM0Ts6PDtP/8dfSjgv OjhP58XN73dCWf/LvLWzxb/f/8rGvLy439v/SVlNWU1bRDpKOD9GQUVGVTrd1/fN79lj0WPft8G7x8vj4+d3u8LAw2NMRVlOyMTV3UQ8Mz5Ga8Xb10U7OTpbWby9yudHQ0PRy7etvL7vX1Pvu7ivuNdHOTk9a1/T3UU7LzE0Xf/vxU9MQkVjwra2sMPT2f/I vrGxsbljY0pT58HK4281MTMzPE/nTUs3Lzw5V+u/w8/rS2/bx720tMK91ePMz8jJwN1rb05nW19r309FZ0dNTUtPV189UW9R42trVf9KV8nZyc7R39XP2be7u7nG3XfjVcrG7+tKQTY+PT1vS1dEPDo+U1PCxsfE92fvyce3srm7y9vrz8PIvcXZTD8+PUk+ TE5DRzg5O01OT81n73ddd+PK27y9zMjTy8vDzse749fjb2/b12PJX01ZSUZFY0x3W0VVRUlHV2930Wfv91tv3cjOvrzHvszVzcO9w7zH02dHQkdRRFdPRUM6ODlIP07bW+9jX2PRyM63u73AxsjJvsO4tr/C2+trZ09Lb0lIPDk4OD44RkdFTUZOTln338rR ycjMysvDx76+v73FztXZ72vj59vva19jVUdRSlVVT1tTU0lPU0tfVV3j72dX/1/r39HGvr7IxMfLwcO/vb7T/1NGS0ZOVVdPPD85OUFFVXfrd1lbVXfbyL27vcfM08/Cwb62uMfO/1VjWV1jb0Q6OzU6PERTV11GSUpJZ+vMx8jT49vrzcTBvb2+zdXX3c/V ztXZa09RS1VVY19VTUNJQ0hXXWdrd0hMV1H349PLysrn1dHNw766vb7L1ePr3f93Z11FPT48QENJU01TRklGT2Pvx8bGyNHV3cfCvbm6usXGzM7KysTLz19MQT09PEJAREM8PTk/QU3/d+Nj7+//09PHwcLHy8XKwcXFvsbXd/dd7/f32fdnR0hDQVVT/3dZ TUNNRVljZ9n/b1dVVWvOyr/BxcfMycu/v7/AwL/Xa2dBOj5NX19AOzcyO0Bbzs/ZUUxDTtvAtLW703dZZ8e3rK63b1VKPNnHvrjnQy0rKzJP58PjSD4tNjpVvLi2xFNJPU/Rua6vtstd613Lv8K42edJPU5K3dffZz9HOENTU89n/1lGW0tb09fO3f/nd8rH wb7Nxt/Kv825x85nQUo6TFtd70M/NTM+P+vL1eNJTEdMzMC4s8PJX2fNybe0srvP00jjyMi8ytdHOzkwPEVRWUE9NDc/Sffb1+9TWV9vx8LIvdHTa+PDv7a0v91TWUjfyMa+2V9ANjs+Y8vJ00s9NjY+/8a6xONAPkE+3by5scDMXVHZxrixtrzZd0BITl3j a1tEOTs4PEhOWVVKS0xd99fK18vb08nIu729vt/O18e9vLq/00xBSEhbZ2NXPDg1MjpIXcrva0hAS0r3yL66x8hZ49PXvLm5us3fT2/Z283Ob1lISUdTW09fR0BEPV3v689nY0lJb/fFvsLLZ29N18S/srG7zk1OS//FxsfdRTovMjpMz8/3RDs8Mkfnzra/ yPdX///Ct7Owu8Rfb9fLu7i6v/9fTUZfWV9bQjwyODo7S0hZTEVNR+fd2cV30e/vysu+u7vC2dP31crDwMbnZ0JGSl/O2d9fPj41O0ZryNfbS0NMP3fby73O0V9b29XDu7u4vszbzcbJxM1nY0JFSEZRRUxAOD04RV9f31dZQ1H/37y3urzb713bxLu1s77P T1VX2b68wutFPC42OkXj72NGODk1RWfKuMDXT0tfZ8S8uLXDzuNrz8m9u8LRTk5PS+ff22dJSTlCRURfT/dnQU1IY87Cv8/fTVFv2cW4vL7jb05dyry6t8r/Ojw8Ru/j61k8PC85PUXb09P3Rk9H78u9tLa/zNnM2cG9u7rEzM/dz9vKzl93Q0VKP0k9QTo4 QDtNZ1XfUVtLTffNwbnCyV9vV928tra2yNFIU1Nrv8LI0Uo/NkBKX8/fX0A4PTlV38+/02tORGNvxLy9vdvf7+vEvri1wsZna1tV0d/fXz48NDpKTu9VTjs5PkJnx8O+zdtPV8u/uLO5v/9vW/e+u7u4zd89RkRJ7/93Wzs5MTs+TNvjb1NJU0znzca+y9Xr a87OvbvCv+Pn2+vK08vZW11GTllV/05VRDtAQ0/r69Nrd05P39PHvsjIb2dZa8TCv7zO2Vdv/9nIzttnQT82QkdM/1tNQTo/QOPT08Pnb2P30de5tb2+3+/n2726trnO60pNd+vIy+dEODcxPFVX91lJNzdAS9PBxcP/Z0pP0cO+tLu9b29nd8a+vbzTYz9H T1fRzedZPTo1P0pj1+ddTUNVTtnNx77V3+NnzMrBvMPC0dvLzsHGy89PT0VCU09fSEo/Nz1BSWtf91VTSUR3ysC6vL3Z5+/jwby9t8nNY2vn48nH0dFMQTg/R0v3X0tCOT48TNnZzdtXU0dIXbirvb/P9+vfwLy+vNvrUUlv79XP31M9PjpBV1/db1dEOkhV 68HEws5vVUjnyMC6u8ZXTl9XyL69vNlbQT5ISGPdd19CPTc8S07r3V9fRFVrd8XHvr7PytPKv8G7w8bXd87NxcfOzlNRS0VfU11jTEM1O0NGX/frX0tPP13f2cLHydNn52/Ovr68w85nXefjz8rV401IQ0BdU1trSEY8PUhj2d3T51NbWdfFwbvBxdNj3c/C uru6yv9XTmfn09N3WTo6PD1PW2/3RkA3PE93z8bI2Wd3Wc6/vLi8yd9b993Gur+/01tGS19j499fVzw6PEFfW3fnTEc/S2fbyMnJ3V9r98rDv7nBz29b49XKxszZU0tHSltf73dTSjpBSEvn29PdWU9Hb87JwsfL3e/v98nHysfN1/9Z2f/n2f9nR0NDSl1M VV9LRj5GTlnd/+fnXf/r08PAvMLG19vOzMHAwL7X5/9d3+fd42NOQUREQ05RVU5JSj1MVVfn/9/vb/f308vNx8fF19HO2c/Lzc/v/1tjY1VZWVVMREZDSk1JXV9nXVdja+PXz8rMysrIzNPFx8bGx8zPz9v35+9vXVlTS0xLREdLS0pKSUdIU1dfb+vd09nb 0czKx8nIyM3Tz8/RysvP2evvb2NfVVVdU0lHTkxMTVFRWVtbXff/Z/ff3dnNz9POy83LzM/NztPf3+vn429bV1dNS05OUVlTUVVXW2f39+ff2+vr49vPy83Pz9Xd49vZ0c/X33dfTlNbVV1jW05HRkNITU9fX1lTVVlV3c/PycrM0dPRz8a/wsHGy9HR0ePP 093rX1VNS01MZ19TT0pKR0lPVe9nZ/93b2vr09PLzM3L19vb1dHXztfd3W9dWVtTRlNOS0xISkhPXWff5/f3d/fv18zJw8nMyM7PzsnGysnP2dv/a2NvW1VbU01LSUlHS0tIW1NPWWdnWWvv79XRzsrP19/V0dXMyMjFztPb43df9/frb11VTVFLSVldX2NV T0xVW2/j6+vd3+d359HMyMfP12dV/8rCztdrXVtj3+dVS0E4QFnfxb7M60w5PUlnxrq5y99VTGfTyb/A32dvZ+/Fu8DdRDk4OkbrwLnJWT40NDdE28TK01lIUVfrwr3G1VdOZ9HBta+4zWNBSffPv7q/b01BO0dn69v/SURCQ1vbxcp3STs8QFPItbS5zE5G SU7RurrB0UxKVVvdwMhZQDQxPUrjwLzfUUQ2PVXjv7jEztVvZ9/LwMTV7+vrzb24vMXdQzs7PF/Hyc7XRzo8PkVr91tjRT5T283Bvt1PPTZD2761rbfPZz8/Tf/Ct77O71NKWWfn510+Pz9Dd769wM9KOTY5QtG7vLvGZ2t399fN2+v/U//Fvr293Uc8MzdM 78S8xOdNPjxDV9nCwvdbWVfrxsPI1U9ASU/ZuK+xvm8+Ojo+/8m/w9lPQkVFS2dfVU9CRF/dysLKa008PVf/w7K2vMr3U13n08G+zufj69/KydNdPzg4PVvGu7rHVzo2OD13ycDDze9VX+PRxcjna0ZK682+tr7VSzYyOklnw73RVUM8PUljz8jd/+vv48vA xM5TRktX3bixsLnOVT9ASnfHwsbTVUZMUWPfZ09IOzpX18W6v99FNjI7Vcm3s7vZV0pKU//Nv8vf493bx8HG30U7OTtI67y4wONMOzc6SdvNycj3VW/f3czV62tLSFnEube0vl87MzpJ3cO4vetJPzxFT//Iz2dZXXfTxbzFZ0U7OkFdvrGxts5NPzxA68XC wtFZS05d//9dTD85PVPRwr/G/z82NUVn07q2xuNTTF/rz8HD0f9348y8t7zCVzo4OD/Zu7a70Ug5ODlM0cfEzWNRV1vXzs/nW0dFX8u+t7XG7z82PERdyrzF41E/QURHWf9bTFNj3cO6u7/jRj07Rtu6s7K5119MRW/Tx8HF41lPY//b1WtRQTU7U+fFu8DZ SDY3PEnrvrnE3VtOU1v/z8znY1/30765u8FjRT89R93GvsLXWUQ/QlXb69vfV0tv38/I2fdbPjtF2762srrZQzg9TG/DvLzTWUxIUVdv1W9JR0lV1cC6vNVVQD0/S8+9u7zOW05IT9vOzMnTX2/dzcrR71NANzlN3cjBwd9FNzZAUWPKwNV3V0pv5+PMzV9N T2vPvrW0vNdKQz9I3b27vMdXRkI+WdHP1ddbS1P/z8zZ611FPUfnyb+6vtlRPEBVXdvBxdtdTU5ZWWPvW0M/RE33xL27yFFBQkZfw7i4vddRS0ZZysDAw9drV2/XxL/P4109O0df0cC+yf8+OD1HW9HGzfdTTFlnZ93XXUlLTmvJv76+20xGR1PRwbzAz19L SEhX18/X31FHWW/Vw8n3WUA4Q13Ovrm8zk88Pkrvy769zWdPTv/v48/fTUZHSG/Rx8LOa0tDRV/TxMHD011RSEv319HNz2v/283ExMzfUT8/S93LwsLVTDw4Pktd08PbVUtEVevfzctjSkZJXc69u7vLU0JBRuu/ury+901HQ1fn2dPM/1Nb2cvJztdrQT1E 683HvsPdVz9FX/ffyMfdW01X99vf2/dCOT5DW8rDxs9OPDw/Ucq6ur3TV0xKW9nNz87ZZ1fjyL+9wc/vSD5K983CvL/fRj5DTl3vzM1rTk5d29XV2WdAPkRV58bAwetHQT5K/8zBwsrfX1lf48vR91tOQ07bw7q9x9tFNztH787AwMlbPj9O993TxN9TS1XZ ysfBxmNIPENX28y/v+9RRURJXdfOzddfVU7nz83ba1dGT2PPvbi7xOtHQEZj2cfByeNOR0tn6+vbd0pBPk3by8bJ51U+Oj9O3c3DwdNZTU1T99HLyN1vZ+vRyMfL41NFSFvTw8C9w9tfSU1da+PR0/dVXW/v3+vrZ05ITmfZz8zO60tCP0NVa+/j3WdXV2N3 ///f92dr78/GyM7T905GU3fZz8rDw91r/3ddWWPd1/fnzszv7+//Y1tZb93r59nP62tjV1NNTFdn9//n299rW11bWWPr28/N1d/dd1Vba3ff3dPP0ePd1etdU1VbV1Nd29/v4+drW1ddb+/3383T3d/3b1dXXWdrb/fj3dv/Z/djXWvn4+Pd393Z/2NfY2Nr 7+PZ29PMz9vvY11bXV/v1dnZ1etdVU5VXWN3593nd2Nrd11VY29fXWNn693v6+trV1tv/+vb1czX//9nY2t32c7M087K19/f93dnZ2d3b2v/4/drY2Pr92f/7/f//2tva1NRVVtVX3dv7+fr92tbXf/d1dnZ19fvd+d3Z2/359vd08Xv20xVTUPRyMG+/9dH SVFOyMXJvf/XSFH/XdvIzNFNSjk/SErP0dHLU04+Rmdjz8fPzll3R2PbRNPn68lZzOfdxtnI2/fnTetR/9f/zf/n3T5rS1fT78HF18tPd0pOZ0/P09/RSW9KT+9TzNvjyVHjVWPV78PRa2c9TT9N/8yutdX/Mjo5Rrmvt8dnOi49S824ucTrPT07d8e/udFd PzhMW867x9tXPjpDd92/v8tHOUnr27jL02c/PD/fr7Ouw+c7NUB3uKq1vEI5LTFXzbyrzF80MTVLx7KyvFU7KTQ/Z7K0wMQ+My893ciuuc1XPUtNzLnIxlM+PD7Vxr2x71k9O1FjwLa/40U9N1m+xLDIbz4jNLusp66vzUUyLj1rwau7zDw0MTFrysmw/1c5 M0VXx7TJxj48MEbKzbG7zdM4Skl3uMG9zk9APXf3xsBbUzs/WWu1uLnERT0wQM3GrrvOTTI1ON+6vbVfWT4xT+e9qr3GQzguO3fCr6/GzDM6P0i+u7m7V0I0Q2/dtsXdSzpEQdXBxLpnY0k632PMvWtvQT5FWcTKwFc+PzRN08ewwc1RNjU877a0rsTVPDdA Xbmss7VnRDY5Z927r9FjNTI1RdG+sb9vSi9GQ1+5yMTjPj08Xd3HwGtdOkNvd7i6xMtHPzpOysW30fdBOExbxbfAxEg+N0LCw7i13VM2NDvbt7GvyWM/MErdyqq950M2MjRXzLy061EuOURVvLi8v0k9NEL3zbrAyt04SVHRvsPFXVNDRcbEvbrvWTY4QFe+ u7jZUT00TtXIsb7HSzczOee4ubTXTS4vPF25rba5TkAzPWfXt7LNZzc8PnfDubfKX0U1T2vHtcbOVzg9O2vFvLnvXTw6Xe+6uczjPz4/Tr/BvNlGMi06Vc21ur5NOzA1/8W9rsnVPTY+Sb+tsbLjSzI8a8quqbzTODYyQdPBuLlnQDE9SNW8wsRjPz4599PF vndfOzhMTcW6wMlRRDxVyMO0w99FND9O57a6ue9DLi5TzLuuuso8NzQ7y7q4s9f3Nj5KXbuwvM5IPzlj08m3yXdEMT5B773Dwv9CODVZ27663e86OEpVwLy7yVNIOUfJwLK0wk87PEBvwb230Wc6NEpr07a9wVk9NDn/wb231VcyNTtJw7e8vk8/N0n3yrm2 ym88QUrbw76+11FAOFvnw7bHz1M5Pj/jwr2/b044Pl/Xu7vC40JAQVW7ubfBYzYtOU3jvL3BVz4xMU7dybbHzj04PUXRt7i87001TevNtK+7yD9BPl/Iv7m8Z0Y2Q0/Ov8bJWT1APuPNv73rXzs1SlfMvsDXTEA7SdvKt8HLZzpCVeu7vrvnTDMwSNnDt73I QTo4PtnBvLXVVzg9SvfAtb3FT0M5a86/tLjLXzU+Pm/CwL/RRjs2TVnIvNPfQDlDSszLwc1OQjk92826u8BdQEBF5768t83jQjdOd824wcJTPTU3b8O7tsn/MTc6Rsi7vb9OPTBBY867uMbrQEdFzL69uc9dQjdja8S5w8dZPD9J28+9xvdROD5b773Cwuc/ PDxRwbuzuslBNj5M376/vWdJNDVNZ9m8z3c9OjtL3b2/wetIM0tf2bi0vslHQj3nwL23vN9HOk5fwbrDykw8Ozzfyr2701U7OEhVzsK+304+OEnnz7vBxU88Slvdurq311kzNEjvy7m/zj89OT/jw8K+50w3QU7bw7rE20c+Of/NwLe8yv89TVfHvcC+1UU6 Pl/nwcXbazo3P07Oyr3LTDs0OU3Mvr6+XUE/SOPDvbTH0UU+V+/JuL3GW0Y2Q1/Nwb7Pazk+Pk7LxszOSzszS1/Pv8TTUT1ETsK7u7fJXUM9Y9/Du8PRWz4+TtvKvc3rTTtDUffHxcTZSj4/UePLv7/HUURNZ9W/vcTjVz9CVd/Z0eNPQz4+WefN093/SD5J W+POytHvV0pN48rIxr/XXVdd48zBzcbOT01VU+/b087bb1FVZ/9rVe/rV1tbY1lVXffdd2vZ1d3j59/N1d/bz2dVWVdjZ2/f2+9dT1VTUW/Vztv3U19bU1nZzdXf4/9nWWPTx8jTzs7vXffd2c3P2+9fSEhOY2fr3W9dT0lNTVVVa+tnX1trY2/d38zL29PX 09/f1d/K2dvR429bXedf6+dv91lPS1VbTG/db2tXVVFTX1fR09nT1d3vd9PTy8nX1+drVV3r69fR399dUU9R///f0e//X1NTWeN308vn4/9nb+/T28vM/9vn/2tj3e93W1VbUU9TU+tVV2ddZ1lbW1VnUWvfd9nb3ef/3+fNzdXJz9nvb9v/39PdzttvVWPv X+/d9/9TTk1Td2Pj1/dnV1lfX+fjzcjX09vZ/2/Z49/3Y+9nXVVn52tnd2v3Z19ba2NT53dv929vXV9vb9nR2cTJ3WP/2d/Ixs3O22tVV2tj9+fr91tMRk1XT2/3Z1tNTUxTX1/Rz+Pb3evn2c7RyszXztPd///jd9/b39tvX05NWV/d2V1NRkNHW+fbzmtT Tkxj58y9v9HdSGNj27u8ue9dPzpVX8DCwNtCRDxMb8W/zd09QD1K48+6x85XREtO08a0wsxnPk9Cd8a5t9nvNkI/QNXKvN3jPDhIOmvny93j2T1XR03rzsPbv//d22PXa8bPx8b3y1tXR1HR3bvN21VBQzpn98i+13c+PjhR78a0xMJNRT1E0cCussJ3Ozo1 79e4s89vMzo2VcK/ttddNzE6Ssy8tdN3TDFGRcK4sbNnWTM9d8ivsbB3UTcyXd+4trtfOjwuP1nKub/jODguOlvdtLq+S0E9Nd/Er662zztPPVXEtrG/yTs/RD7n27zP11c6SjhGXc/db9U7V0lI/9W/97/d99FfyefI1crG/9VIY11Zd//D69VdSFVF/1HL yufVSE89T9/NuMvFZ1NDQMvRtbvN1UJJPdnKxLnn/z06OUzNy7rrZ0ExOjjfzby9TU0vNj/jtrivze86NlPvsrKvu2dPMURTyLS2uWNJMjZIV7i9uu88Ni0/TL60usBATTtC58CvtLdbS009a2e9wMfOPUo6QVXZwt/MRE9NP2tZzW/ja0jrSd9v087dwuPL 3d3L58lbzcrTy2/RW+dZU81f41VZSURbQNPnW1lDRTpdScq+78xTd0jry8yzxMPVXVdTysq5w9vrPEQ8/8rBuXdbMzQ2PtHRvM9bOTE9PsC8t7PR3TtJT9OytK/BXzg0Pkq8u7i+UTwuO0HJu7q6SkMzN0TXu7u2X0tIOm9rube3u0pXPkn/xrjCwk1NTENr d8bV21M+Tj5ZT+t3TFM7S0hb4+/HUd3vb9F3xse+zOvH98/V09Hb30vT3/fZ7+tRdz5r51X3UW9GU0tHyOPN1WNvW9fju7jDxGdVQlFjzL7O20tDOkBrz77L40c7OTrv576/4282OThdxLuvucpFQUNru7exttVCOT5Lwby4vV9CMzk8z8W/vU5EMTI4QMnH u8lTRzpLb728uLp3b1Fj3765vr9ZSkhLX9/BytFLP0U9UUzX52tnPExER2fTyOvRd+vT68jEucrN2Wf3UXd31+9r11tvT1VZV99P29dvXUldR/9r/8Pb1V1fVVvV0be7yt9TUUnd27m3zdtFQDhT3cy4zONHODQ6W3fBz2tONDU0W8q6ssPbQD4/77q3rrfK SD0/S8LDtbvjWTc7PmfMxb33TDc3PEzKyb3OU0Y8Tuu8uri592tLXevBvcXISUZARV1rwc/dVTtFP1Pvx8z3XzlBR0rnyL3T21NHd//NwLm/091XX/fd1cTHZ+tPU1VM7+/PX1NjRE9DSk9TV0/P62trW29329+7uMfJ3+dZ09nLucnN60s/SGtvv8nraz04 NUZdz7/d/0A6N0Pvzbq7x/dLR07GwLe2ydFHPj1Vycm7xW9DNztFz83DvF9JOztH183LvWdMQkBTyL2+utdbUUz30bq7vslJSkJKd8a/ydFAPUA/TuvL3V9CNjs/TuPFyd9rR05j29G8uMjL62ff79fKvsvr31FjVV333+9Nd2dVWU1PZ1tFa9339///Z9tf 977AwcjRZ2/3Z8bDz89vSD5HSv/K1dtnSDxASVnNyttjTDw/V1/GvMbIb0tEY8y+tLrI70Y/SdvOw73jV0I6QHfj18RvTDw3Om/j3cbfX0k/S2/Cw7u62+9VWePBvr2541tVTFPXycnKd0RDQEZv193fXUBAQUZL38/bz2dV///vzLzAycxv5+tf99PT99N3 V1tFSP//VdnXX2NNR1n3VXfL5+9jS1nf39m+xM/R/2fj19m/vdnvY05PX2fny+tXUUxATUZO61dPTktASVlb39fv2dvvZ9/MzsbHx8jT69nV3d/V7+P3XW9vW09jX19dVVdjWUtVWV/r/+fN2+//2dnJxszDydt3/3dn49nT2WNNS0tJU2vn23dOTUtDTv/n 393/W1NOXd3OyMHFzvdfW93OzcTD3VdOSlHv99/L50xJQ0NdW1ff/1dKRUZOa+/Jxc/3/2Nv18rGvL/T2+dn69XRxtH3X1tNV2Nr5+9dSEk/P1drd/fvX1NXTvfP0cjFx9Pj/+vP19PI0etfX1Nfd2Pf52NMT05ZX2P/3+tXV1dX93f/ys/X7933483RyMjN 2dvvd+/f0c/fZ11bTVFZY/dfU0pMP0NLT2drd2tXVU//39fLz83d7+/Px87Gyc//b19r193d099rTU1MV1ld/2dfSUxMWfdv29Hbd2fd3cjLycLN42vr79vV18n3XU5VT093Z+PrV0dJTUhj3+fZX1VJTFd3zczEzNnrX1tn2c7BtLnZTEA8Re/Iu7/fQDk2 O2vXwsH/STU1OkzJwrjJ7z8+SF2/trW4z09MV//Fu7q990c/R1nVxMjPTz83PExb0cz3WUA/Q2vZxL/N11VT/9XFvb3L/09PW9/Iys3nTkRAVV/b1dtfQkVCWdnPzudjQ0NT68e/vsvvZ1dd18XFvdnfZ0zOzs3N628+SUFEzNHNb0Q5LzhE673HzUc7Ojhf xLe0vstHPU5nurCyuW9ZNzxn57q2wc08OjI8/9G703c+Mjs/58O8utlXRT7/z7y1vcFTS1tRyMnCv2trQExdV8332V9ARkJv3dfRWVc/PVlrz8LP0V1NTU/Gwr271+NFSv/Mvb7G70lIO1Xj08rRXTo5Oj9f3c/NX0o9P1/jxr7JzVdZa//Hv7m7zudRa9nb x8rVZ05MT3f///dJQD8/Ud3R1W9VPT9Lb7u4u8TrXz9P3cm2usTdSTs+Vc6/uc9vPTY4Qu/CwL53QzU3SWvHvMXVTElEZ8nJurvP51Nr782+xMTdUUlP39nN1V9MPD1HSd3f428/OzpG59O9xtVPQ0ZPyru7t8zfTUdr18a5w9lNRz9O2d3MyGNOPEBGTd3v 0eNLS0lj59HEzchv49HdwMvMyuN3WePH0cjdW0hDSmPdztvfRT88PPfPzsXjUTw8QGfBu7zG41U8TWfGtLm/2Uc9P1HLvbnB6zw3OkBdysvMWUQ3OUpb18TM705MSu/PyL7Hze9Z48vCvcHL71NOVe/GyM33Sjo9SFvNzdlnPTc0Qt3Fu7/TTD1AU8m6t7fO WUI/V9nGtr/PUT48Rl/Txb/3Uzo+RE3OzMrTSkk/Ue/VwsPOb1N378nBx8LTb19Z2dXLxe9nSEZXXdvr71dCPjhR73fN929LP0NKz7/GwtddR1Hrxry2vsdXSklXy8bFv/9OPEBNY8/T3VNAPjpRd+fH2eNPQ1vryLu9xdlrS1PZv7y7xfdFR0pfwsPCzE07 NT9f18LJ0Ug8ODpb0ce+zmc/PEnvyre5u9NRPklr1b65wMtERUNM39fJzFVGOD1DV+Pj01tFSklv79nI3+djUdvPwsHFyOv//9vHycLP41lEUV/fzd3bW0U6PE1r3913XURFRV3PxMTE22dJVffNw77H12NRR2/Xz8fN51NCS073ztfdZ0ZGSWfV19PnX0dI Y93DvsXLW1dRX8HAvrzZUT5HX9vCv8PvSzozRFvvydNvQzo6PlnIxr3LZz5ATWfHury9911OW8/EvrzJ50pJUXfXzMzjU0U9S1dr32tfSj1IVd/Tycrnb1NZ2cm/v8LOU1ld68bIw8dvSD9MY+PI0dVXQT4/X+ffyPddRUFMY9fHy8ffW0xvz8zBv8/dTU9b 28bOzs1PS0JO/+Pjd1tDPEFI69Xf3VtNQkXr0cfByt1PUV/bv7m5vctbQFHv076/x+dHOztL49XF0Vs6ODo/98nKwutPQUFnz8O6v8ZrTEtj2cbCv9VjQkhZa8/Tz91HRUJR993R53dLP0tj18/MzGNZT1XMycO8x+tRU2fbwsXDzllJQFXr58zb/0c9O0NX 4+PVb089SVf/y8fO01VPS+vGwr6/z/dNXefJxMnL901LQ2/b2dlvTz88R1Hn29tvT0lBUd/Jv8LF409Xa9G9vb3J90NEW9nKv8fXSj87Q/fPzsb/TT09Q2PdyszTWUc/Ue/OwL7G1VNXa9HDxL/Ea1FIVePNy9HnTT0/RF/v4+NVQzw7TffXyMzrT0ZHb8XC u7rJ909j3dG+v77Jb0ZJXdvdyc9vQUE/RWvj999XRT5JX+/XydHbVVljzcbHxsz/W0r/08zK0edXRUlR587O1XdOPUJX/9PO0WtJRERVzMjFy9VRTV3Xyb6/wdFjSUzv0czEz+9LRkJRd93n/1NHPUVKZ+Pf3+9LSlf32dXJy9XrY+fNx9HOye939//V1dXv b1lJS11ja1ljU0xIR1dnZ//34/9v59vRzMzJys/j3dvf1dvbz91rW2drU2fv7/9fX1FXU0pjd2dnd29TV2Nn4+Pf083T7+fT2dfVzcvX629v72Pf3+f/W1VNTEtJX11VT1FOTVljY9fj6+/j7+fXyc7JzM/T193f0czf1+frZ1lZWWNrV19TUU1VV1FXW1dv VWv/3dvd29Pd2evZz9HX39//a+f36+fj629nV1VvZ2tv62NZU1NZd/f/6+P/X19r99fRzcrP3+fn3+PV0dHb52trZ2dn6/9nX1VOUVFXV2NdU1tfW11n7/fj6+vb2dvX1c7Zz8/Z19XX29/j/+//XV9fWVdRU09ZVU5RUU9VV2v/4+Pf3d/n2c7KzMrM09nr 99/Z2efj42dfW1trb2dbZ1dNU1tbX19vXV9dW3f36+vf2ePb29PNzs/X3d/3393n3ev/a11ZU1tdU1VTS05n62dfTUlMWf/XyNPj91Vr18vAvcTOb11r2czDwM/vTURNVXfPzudOQz4/TGvXz91RQkRJW8/Fv8jZXUxj59G/vcr3V0tP99nJw9dvR0FGTvfN zdNbRT5EV+vKyNtrSUVM98rDvMXvXVNb48K9vclnTEhNZ+vGxutbRD5GTf/T0fdGPj9Hd9/JzG9OP0V3yr23t8h3RkFf28u9t8f3Z1FOX2Nj909FRFFr683XWUg3Oz9M07q5v9NNRE1O3by5vsTjZ//Z2cnJZ1dCPU3XzMfA60M/NjtRb8/Ax3dNS0hO79XK 1etjd9nMvrzFz1VHTVPrwru/0107PERCa9njY1VDQFdnY9HvTUxDQ+/Cvrq742tTRmPZxbu6wNn3WVXn79/dXUxNTVvPxc7nTDY2Oz5ryMbFx1NCV1ld2crPy9tjzsPJyMprU0E8W93Ov73LV0Q4OUlT38nNd/9jU/fva3dXRE9n476ztLvJSj4/R2vNvLy/ zE5LSUhTXVlbTUNZ29nO0VNGPDVAWdfAtrjN90dHW/fTw7/Mz8vTy8bP710/PUNP38e8x+9LODQ3QV/Px8nTUVNfVf/P1dndX+fHvr65vu9MOztN78y+uc1jTDs9Q0tf3f9ja3fv19PnY0RCREz327e1u8VfTEpJ58XDvr7XW2dvW/9dT01AP0zZz8bH90U3 MjlL98i4u9d3TUhTW9vDx8/Z29XNwcPH1U1ESUlrxL3Bx2c8Ojg8U+fr091RTFNRd/dja2dRWcu8u7m803c+PE1n0b25v9tNPkFFRm/fZ1dnX2/Ryc/bSj09QE3Ot7W4xVlKPz9j0cG9vMf/d2tdd1lPUUdBXc3HwsLnVzswOkZT172+1WdJRlVOa9HL49/X zsS8vsPdSEVESOu8t7rDY0Q8NjtM79/O1VtRX1Vnd1NdY0ZT3cO9t7nK60E+TO/Zv7m+3VlJS0pGUf9VT1NX/8/M091EPT1BT9u8ub3BY0pEQ2/HwL+902fr59/R911bRT5K487Ev9NRODA1Qk/fv7/P50pITERV3//32dnRvry/w2tPTExT3by6vL3vTEA7 QWNnd8/rTFFfW/drTE9BPEvVw765vM5TPT9Z98+5tcXOX0hTT03j/1NRVVFZ3dHO1Us/QT5H28C/vsdnVUZCd9PVxr7T59fXz8zvZ2tHQFvRy8XB0e9CNj1HSu/FxdtrSEdOSl3v/1tjb/fOwb/Az2NVTUr3wLu7vs/3TT5BT1//1dlnX1FTa19RW1NBSXfb x73Bxt9HR1dv2b+5vsv3X29ZU2f3TU5PT//T0dXvQjw+PEnrwsHD2WNOQ0Zj1dPHw9XZ0dPJw93v3UdBT9vMv73M/z41O0ZLa8TG2W9IS09ETe9dVVlfd8zGxsh3T01MWdm8uLq802dMQ1Hb3+PO61FTY2/b90xOPjg+Y9XFv8PPTjw/W+/TurfAyndVb/9r z9V3XVlRX9/X1d1IPz08RtvHxsHOVUtFRG/Z287I63fb0crJ2d9nSUj/zsu/wNH3QDpHU2PTwdf/VUZNVU5361tMT0tZ08fIyXdKR0NKzrm6u7zdX0xFZ93Zz8rdT1tnd+NbV1E/Okvr28y/zt9NPUpd/8u6usbPd2/f/93O3VNZV1XfyMvTYz07OjpPysLF xOdRRTxL99vTwsRva9/VyMnZ1e9FTO/MyL2+zlc6PUdNX8vC0/dTSVdXUWvjTk5TU3fMyczbSkJCQlvPvL28wOtjTE3nzNXLyHdf59/X1W9bTTk8R3fbycbXXTw4QFF3zbvCy9N37/9Jwcvd//dv98/LzdFdRz87Pk7Xz8rH91FJRE13Z/fP22/j0czL0+fr T0hb08fDwMjVU0JFTllj18rb52dfY19TWVlTUVFb78zX3+dbSkVDS+fO0cO9zN/3b29dX93G1dvNz+dnTlVbTEtn92d37+/3WVFZV09Z7+PVycfGydXvZ11j993XyMfV52dVSEdIT19bWe/f719j/19RUWPvb+vMxcfV3dv/Y2Pf19nOx8XV/29jT09VX2v3 39nZ/2tfTkxNUVld593V7293V0tOU1lbb9PKytPOzOdna+vr79XLxMzf4+9RS0xbWV1r7+dbU1dPTExVY2v348/KzsrN3/dvY2fv3czIz9XnV0tKSk1TXe/rd2v3Z1dXW2tjb/fX09XTz9fn7+vr//ff08/T0d33Z1lVV1db/93X2d3va1VNTE5Vd9/n3+Nj WVtXV11na3f3693Rz9PX3e9rX3fn49XKz9vrY09RVVNnd2//5+9nX1VTWVlj49/TzdXPzdv/9+t39+vr1df3d+t3WU9NTEtKU+vj5+P/U1NTVWvv387Kz9XV2+fZ29/b3+vf593X3etvW09PVVn35+PX2f9XV1VRUVn/4+vv3+NrW1NRV1Vf39XZ1c7V6+Pn 69/r49vX393X1993Z11RTVFVW+vd4/dbTUlMVXfdzMnGy93r/+//99vP2e/j2/9rZ2dnU01OWVNRZ+vjd2drZ1Vbd+ff1c7Jye/dX19nWczIycb/909b/1nZ6/f3U9X3X1tNY0//1+vMTlVXRF1b3b/R301NRUNvzb6+09tFS0xOw7+/vv9bPUZV977CyGdF STtP69W/4+9LPktI67++v9PfSElfZ8TFzMlfX0tK5//bY1tVQVNb991n/0lNUUnP0czJ/+dZX9vXwcPJ21tnY9/NxcR3XUM9SVXdusHPX0k7PEfvv7rO20hGREfjy8zOY1E+RV3dxL/M1VdNQF/Mz77G0dVVX01f22/X3//vW+v391lJTURV5+/EzN/vTlVP Z8jIv87rV0lT/8y8ydtIRz48V9PJu+NfPz08QmfGv7/X70tNVWfKyMrD5+9bd8/Tzev/WU9dVd3T691dZ19R53fd/1djS13f2cXV50dBQULvycm72eNKP0VO3b7DwOtvRktb/8HC1dtMVUhO0crByGtMPUZDY8vNxMzra0hjW//L48vZd+Nv09v/Y05bR13d /85nV09CVU1dzN/VX1lRTtvRw7vT3UhTWW+/ury+d1E7P0lrxb/K41dNPUdd67/R2/9IT0lfzM/F319GP05R3czZy2NnW0v3b+PT687v39Pjze9nU0xvY9HCy8lRTURFXWfRwePvSEhJX87Jv833XUFMV926wMTVTz86R1/OvcnZTkVDPlf328n/d05RZ3fR zNPTZ29Pd9HPwtPX2VNrW3fP/+dXX2NO2dXZ11FTQUt3/76+zuNKRD1R39O/yt9OP0lK38bMxmNZRUNfd8m4ysxXTD9Cb9G+uc7PTUpJT93f085nd0tX293V7+NjTndf1cXR0W9nVU7v79nba2tITVVX29/jb0xFQl/f0b3Hz1VNR0rjwr+6xuNMSk1dysHM zVVPQEhn48bI3e9BRkJb1c7EzutnSVdRd9fr2e9fd1nf49/vVWtMUdvjxsjdXU1XUf/JzMbdb0xKZ+vMwdXfSkpESd/NxsHfbz9FRU3MvsLA31lCSlf3xMXV2U1OSFf33c9nX0xFW1fdz9nZXWdjW9XVztfv31v/29nEz91fTFlMX8vKyONjPkBRTuPBystr VT9Gd+fGv9PfSk1JVc/Myc5rXUBMUV3Ly87ZVU9GZ+/bxNnd61lva9PR2dFdXV1X59fO12tnRktda8nKz+ddWUtd3dvF0+9KRk5R48/OzVtPPUFZXdfCzdNXTkFI38/Dvc/fWV9Td8bJy85vZ01fb9vN3+dTS09L99vn0W9rWVN3Y93d699VY3dn09nV/1VZ R1fb28bM3U1MU0hvzMvF2/9ITGdnzMTO0VtdR1HXz8nI3/9CS0VOz8rJyvdbR1tf78nV1eNVWVH/39vRb19KRltf29Pd3U1RVVPf383T5+NbZ+fjxc7RX1djU/fNycff70dFT073ydHRa1FARl33zcnb505TTWPPy8rTa1dAU1nfzM7TX01JRGdv28nd32tX X2PR0c7Lb3dfY9vOxs3Z/0lRUWPT089vY1FLX//Ry+PrS1FdY9PKzONbVT5MZ//Nzdl3T0g/T+PVxsvXX1lbWdXKzcvvZ09Z59fJyNXjS1FNX9/j2d1fX0tbW//V9+trTl1j3c7L11lbSEtv58vFzedKTENJ79nKy99ZSlNd58XLzfdjU0l3zsu/y9VfU09O 39HVzXdnSVdfXdvX5+dVWVdv0dXO2V9RRVFf28vT21dLTEdn69fR/3dMT2/rx8XK51VZS1vTysHH0W9JTk9fzs7M2WdHRU9n58/b41NVTFPfzcrH419GT1Vvz8vX21dVR1dnZ9/vZ19NW1/bzNfZd1dTW+vNw8bP3V1XX//PyM3bZ05LT2vZz9HfUUpKV2/R yc7VX0tFTv/vzc3ra09ITGvd3dVvWU9TZ+vPx9PbX05VX9nJxcfdZ1FOXd/Iyc3nU0tJTffVztf/TUdKU/fPycvb/1dLV2vjysvRa1lOT1tr6+Pra1VbX11r/9/nd2dn9+vn39vj49/Z3dPf9+dnX/ff3+vvWVdVU13f1dXnb11XU1n31czd93dPT1lv39nd d19VTFNn3dfT1etrXVl349/by9nvb2trb/fj183bb/9fV1Vdb2/n93d3Z1tjd+/n09Hf92ddXW/n39Xbd2dRSkxRY/fT13drV05RW+fTydXf3/9dZ+PVzsnN0d1vXWP/7+fZ22dbU1FXZ3fr1e9rZ11XXXfr49Xn72tbV1lrd//d7+f3XV1f9+fr29/f73dn b+vv99Xd5//3d2fv9+/Z//d3Y1VVXV134+vn73dnXWt379fX3+/v/3fvd//n/3ddW1tfb11n72//d/9na+9v69vf2dvn7/fb393P2dfjd2NdX11d/2v3d2NXVV1da+/r2+v3a2N3a+vT29nrb1NTXV/v2dnd72dZWWv3383X3e9jX2t3993R3d//Y2dn9/9v 6/frb1tZXWtfb93f3efn92/vd/fZ3dfd91lZX1/v11v/Rkg+SNHCusr/QjtDQsq5t7//UzpJWce4u7xbZ0E/a9u+xsdLPkY6Z9m+v9PbOUA6Q9e/t8TMQD9EPtvFucDPUThJPXfLv7vV3T9HSE/PzLzR2VdBX0zj0cbG3dlDU1lTY1/PY9HrV/dLV0zd58/B 381MTE9X2d+9xs3jP0E9Tl/FvMjRPkA5QW/Et73FQjs9P9PHtLXCUzk5Rcm7tbDP7zc2OD/DurnBTTcwOUDMs7a8U0AzOUzItLK6U0U1MkrZubK3WTw7Lkvvu668xD8+ND3ju660yUE7OzzTvLO300g2PDd3y7y61185QD5byb+3zd1JQUxF0cW/yOtVO0hE a9vVzP/rSk1RXfdvyevL12vnW+tbz9fTvdfN71dJV+vvws7nY0E/PFlvxsDX5z9DPVfdzLjG0UM+PkfPzbzC1WM8QUPbw7q5z2s6Pj5dvLm1x1U3NDxNvLa0v01BLzpDv7a1vUs/MDZH3bSzt9VENzVG57Ovtck/ODA9W72yu8o/OzU5Xdm1u8RMPT06d9e5 uMPLRklFWcy+usfOSkhKR+fbyN/nT0JPSGdf5+dv21/vd9/Xa9lf3dHj32/rT/9d68XZ0/9nSExjY8PJz+NXTT9bV8+9zdFXTj5RX+e8y9NfRDxCZ2+9xM93Q0M+3c28tsvnQUNByFfXudVfQTY6SMXCtsJbSTQ9R868tbnvTjY8R8+0srDNTjo1R2u3tbnL QD4zPU3Tub/LPz45PlvXtr7C70FFQl3dusXK1z5LRVHdwbzXzkRHV03j3cXv22NJa2PV28/3a9tTb//r1///Sut3a99351FnSWPL48rO42tRVVHTys7La1VETUjnw9XMa04+TVHru83K/0k9Qf/duLfG1UdIPuvNv7PL40g7OU7VybfMY0U0Nkbfxra85002 Oz7TvLWx01c3NT53vLizx1FEND5TyLm5wEhCNT1O1by7vl9HPkBP2bq+vN1GSj9R77/DzNE+SUpN69G/3cpIR19R39fEd9/vQldLXe/Ra1PXT2v/a+Pr1U3d71/R79Pr12vnx+PN1ePra29Vz9Xj21lRRVdJb8j/3WNKP0Vfd7y/y9lLSj//68a50dlPQz5b 0cq3yd1POzlH38q4vddbOTo868e4ss//Ozg9Z8S/s8NbSTU8SdG+uLtdTzc8SeO8ubjTTj07QVfDwr3TRkM6RlPBv8PJQ0pDSmfXvcrGS0ldV9nOu87M40djV+/ZxudZZz9VV13f19FHZ0ZK53fN0chXZ+NN3ePOz9NvTd9v59Xd13d3SGvjY9n/71NjWVnJ 49vfZ1tM91vPxdvTXVNDXf/Zv9PTa0dCTffZvL/O40U/PmvVv7rOdz46OU7NzbrF7084O0bdyLu8/188PUrrv7q2xP9EQElvw725yVtEO0RRzMnFzkdHPD9P78HJxU9JS0r338HJy9tFVU5r08HI3eNFT1Vf28rGY29HRWdd1dPIb193Rvdv2c/V6073XWff 99Xn509X22PZ29Xv72dPztPV0e9vTVdEY83jzOddR0pOV8bNyc9VS0JPXce9x8djTUZR68m7vstbRz5E792/vtX3Pjo6S93LvNnjRTw/S8zDuLzfTz0/Ts7CvLrjWUA+S93JxL13U0I9SlXLycHvTEs/T13PxMnJTktJS+/Ows3OWUtTT/fVxs/da0lbW+vT zMtra0dPW2ff3dFXWVVO72/f2dl3T3db59vZ0d3rTtvT083T0XdvSVXN0czb91NJRkXb29PZWU0/SEnVwMbLa1dJSVvXwcHF51tJQ19rxb/Iz0xBPEZv07/P01lCP0Xr08DC029FREXv08nB0e9ORUpv0dfG1eNdSFlf0dfLzv9vS19r6+Pj0WNfVU///9n/ 2+9bX1nr79vj5+9b///Xz9HN499VY2vv19fO/3dPS1tVd+/n71VOR1Nb/9nVzndvV13//9nOyeN3a1v/Z+PMzd9nX0xbVVnd62tZd1FTZ//R08vv/3dPa2vjz9F3zt9TX2dv19XP93dXVWNf393Z2W9fTVdXb+Pv12dfT1dnZ9/f1eNjY1V3b9/R189371/v 393O0893a2db///f2dtvVVdNVVdv5+vjV1lTWWvvz87P229rV2/rzcfNz/93VVljZ/fn2/dTS0lVa9vX2dlbVU5Zd9vT1c5jX1db9+fR1dNvVVtV//fb0dvbVVtXX+vd1dvnVU5VV+/r19Pfb05ZVffn2c3b3VtbX2/n18zV2+dfZ1/v29PO5+9XW11f6+/f d2dXTFFTZ+/n4/f/V2Njd9fZ1d3bZ2d3b9vX19Xb91dbV2tvb9/r411VU1N3a+fd29NOY29TZ03ryM7D1ddMSVFI38PIvdV3STxJRme+xLzZVz06SUzVvMbBTlNJPuf/w7vT2z5KSVfIxr/Da+9DV//rv7/M00RXQE3Rz7/Oa1M8UUhvzNvRS1FGQdvvxsLj d0NLa2vEwcbTT1VDW87Tv8jjWTpIQFfEy7/fVUE7VVXNusnLR0c9Qu/GvLrTaz1AQ1fLvcHCa107RUxfyL/JzVNVPk1r48rn52NRX0v349vXd/fj/9tj5+9Zd2fnw9XI/2dLSmPfxbvKy0ZLPkD318G821s7Pz1Oz8jEw2NXPUld/8a/v8VXT0JT49e+xM9r SVFDb9nn0V1bRkzvd8/Xd19JT3fjyc/Md1NRRvfN077X60pDSFHVvsbCY1U6QlFdwcHG0UdEOkR307q80VtBSUNbxsm8zndRQVtR773Mv+NdTk93/8/I3dNPXVdT42v3d1d3UW/bb9ddU1NT29vKy+fbREtRWcLKxcZrUz1GWe+8w8lnS0Q7TefbvM3ZWURE RV3Ny7vb90dKXVnZx8/GU2dNT9lv285390tnY+vPd/9TTl9T18/VyllTSUbf48m9zt9KRkBVy8e9v99fPT9GX7u+usBbRDg9Udm2u8JrRD43SN/TucbbUT5CRF/CxrjJY0ZDUVXTvcvEWVNLSHfvz8p390ZMY1nT0+9vUVtVd9Xnz+tbV03v2dXE0dlbS0tT z8fLxvdfP0RRXcnCzM1RSD1HZ+O/wdn3RUlIW9XXwc7vd0RbWWvO18lvW/9V2+vn02frY2vT583r929KX1tnytnPd09CQVfX073L10xGQEfXwcO722s+P0hvwLrEw1FLO0Jj48O80d8/QDpG3c6/vfdZPURJd8TIw8tXT0BZ787Az9FTRltK48/TzVtdTkfv b9nP629GTVtVy83GyFlPP13Z37/KzmdJR0Frxsy+zedDQExOz77Kwl1TQkZdZ86+2dVJS0VKd/fMyu/3S2tna9Xv2dNb42ff4+PZW29bT9nnztNrXUFLXWPGzM/3UUU8VdnTv8nOUUlGQ9nEy73b60dFS03Tv8vGW1E9RGN3x77f60NIRVnO1cnKZ1FBWWvR w87NY0xTS9nTzMX3/01GZ2POx8rNUVNGR9/bwsXZWUBOTl3Jz8bbY0U+Wf/TwMnLUU1GSd3Lzr7d50hLU0/ZyNHLWVdETG9ry9X3d0hZTm/d69PnX11O6+/Xz//dVVPrb87X2+dTY1Nj0ePP729KRFld48fZzFldSEbr1dHB09VNUUhLzsnKw/9ZQEtZ98LD 0dlNT0Fd39XDzudNQ05M38/VxmNbSUj/b87J19FTU1FT09nIy293SE/v78nT1V9LWUtrz9PH7/9CQmdb08XTzFVXQ03X3cvA1ddHUUhTzNPGxWtVP05Xb8TV0f9OST9nZ9fE3d9RSl9P1dfXx2dvZ1fjZ9Pb49VRa29d0XfVXVlvUd/T585j701N92fVztvR TltBStnjycXr/0VRS1/FzM3OY2c/X2PXws7NY0pXSNvd3cT/91FHZ1PZ2dvPU1NJStn/yMvv70VOa3fH08fvV1FCWd/TxNfXSEVPR+PL08X//0JFX1vVwszHXV1DSdvZyL/X50ZRT13L083NY1NBX2/nyc7ZY0tXSePX38jrY1lHX13dzuPTZ1FZTevrztN3 705V/2fO29PVVV9TWdvfzNvjW0hfa2/R389bXVFG59vjx+fZT19ZXdfN185vZ0lb73fO0e/nSU9KW9Pr1dlXU0VTX9nI3ddnTFdM29HNw+/vVUhnb87LydNZU0hM79vHzNfvRExRV8zPyNNvSz9N/+PK1c1jU01Hd9vbx9fnT01VV+PN283rZ0pZ93fXz9/b TT1RyNXv2c5vd1Nna+/na91vV/9d32v332/f/1/Z/+dr999jd/dr32N3XWfrU3fdZ+dZd3fv51vv2WfjZ+Nv69v31+dr3Xfna/fXd+/vX+tfd2/j12d3/133W9/n699f9/dZ/2vb7+d3W3dnX+fv22d371drb2fX699v/29VZ+fv1+/fa3dnUevj99v352Nn W13r4+vX6+tXd29n4+fv1XdnU2drY+/f5+tja1d3X13d5+/vY3dbd3d30dvv4+/vXefv79fv6913b1v392vd7+/vZ3dd52t34//j/2/3Xe9nZ913//f//1vvd//b/+Pr/3dd5/9r3Xfr/29rW+dvd93/92tv92vja/ffY3d3/+f/5/dr62Nv39vb5+NbRlNX /+/n72/nWV//b9/f2/9j/1Nn7/fV2dfnY3dbY+Pn1c7Xd1t3V2fd69Pf92dZb1dj2/fX43dfXf9b/9133/f3b1v/WV/fb9/j629f/19n43fn9/f/b99fd99nb1ln08TJb1NNRFH3x7/L/0ZBREvTwb/Hb0w9P2PVwrvEb0xFPVnHxLzJa0o9RU7vvsPK70w+ QFPfxL3N609GRlHLw8XHW1FIR2PTvb7dXT8+RWvGwr3dSUc8Ru/NvcHVVT5ARWPCvb7TVz48SG/Dur3MTT46PufFubjOUz09QFu9ur3NT0M6SPfPuL/fW0E9RGPGv7zKTz87PU/JvsXDZ0xTWe/Pw89VSD1H38y7uMhLODY4S9PFsrzfVz0/SV3JvcP/XU9J 18TGxvdJPUBEU7m1u71fPDc5Rue5vMXPTEdHXd3Vyf9TSkNn18i5w/dAPDtH2cu6uO9fRz5JXc/KwdVJV0tPyr/EzV8+Oj9L1bW4v99COTlFZ7+6xdFMRkpVzsbG11dHO0rn07m4zW9ANTlK2cS0u9VdPz1Jb93OzltRTFHOvr6/3Uo8Oz9vvLu4vldJPT5O 98rIx+dKWWNvxsTXX0Y4PvfRvbC7zEs4NTx3Vb22xd1LQkpX39fTa1FLRuO+v7zFWUQ6N0Tnv7221V9IQERP3dnX209b59nHxMt3QTo6Rtm/srTBVTs3N0vbyrvJ401DT3fTzc5rR0c+V766ubnbSjg2O0/AvLW330c+QElrzM3Pa01TY9XGx8lbPzo8TeO6 s7rIU0E8QE//xMLb3VFO79nOz+NRPz9AVb24t7vfPjQ2Pf+9urbDWz89SGPXycz3Q0JNa8W8vsVVPjU8TWu9s73GVzw5PlHfvsfV51FOW9/O2d9RR0RI3by5uMpbPDc7T8i/u7nrV0VCW/fb09tOP01v0b67w2tENTRGZ8ixsrrjQTc3Q3fJvcXXWUxX99HL 3WtGQTxNxby5t89RPTU4Wc/GuL3ZXUlJUWfn399OR2fjzL7AxVk8NTdL37y0t8RRPjw9U9vHxdV3S03r08jG40lCPDt3wLmzuc1HNjQ6b8K5tLvjS0RLWf/V2etKSVf3ycXGzUo5Nz5R0763vtdNP0BIVdvB0dvrTGfbzsnTY0Y/PUvXubm5wl86NDhLzcC8 uNlPRURda+fP10tATF3Tv76/3Uo2N0RfzbS4vs5KPT5GXc/K29tjU2PdzNXnVUE9PFHFvbq601M9OUXnzse6x2tZSWPd3dvVZ0JBa+PIu7zJbz0zO0dnv7S5yFM/PT5T2cnF129LU//TxcvfWUU8PPfCwbm/21k8OEr318e6yGtXUWfr59/fXz5Ka9vDvr/M STk4P1fVubi+3UdDP0r31cfj519Hb9XMw81dSD43Rd2+vbe97z83PEzTz7652VlKUffr2dfbTkJMZ8++v77fQjs8SFnVub7E40lFSUxnzdV3601O2czHyd9RQj08TsG9u7zRSTo4QuvLyb3IZ01Ga93f089nQUFT/8K/wcRZPTY+S2O/ub/FY0RCSFfjx9Xj 71Fb38vHze9MQT1B28K+u8l3Pzk+X9HVxb53XUlR29PX1dlVPU9n2769wc5JNzpDW8u4u8JrRz9DWefIx9//Rkpn18XF1WNJPzpZyMe8vtldPzpHb9fOvcpdUVNr39fZ2f8+RmPrxb+/yFU8OEBX17y8wttIRENP79PI6+9XQmPXzcTK/0lAOEfJw8C5xu9B Oj5L1dnCveNPSlHr59PZ301BS2PVv8G/40Y9PU1jx7q/xmNLSU9378vd9+9NU9fKw8rbX0M8PE7Gv7y9zE86OkBr087AyV9JRmPd187P6z09TWfHvb/Ab0Y2PU5dxbnAxmdGQUhv38TL519HS//PxMrNV0M7PWPOx76/0Uk+QUz399fA53dba9nb3fd3Vz9R 69fBvsLVTjw6TmfVvsLLd0lHSe/bzs3vWUVFb8m9wMz/RTw5SsnAvLrL/0A8QWvZ0cHRX01Nd9/VytfnRD1MX9vBvb5vUT09SWfMwsXRWVNNV+vd2etjTUVZ1cbDy9FvTD1B59PRw8PPU0VPY+sf --seconddivider-- --foobarbazola MIME-Version: 1.0 Content-type: application/atomicmail ; This is a a ATOMICMAIL message that contains a survey. ; If you are reading this after receiving it in the mail, that ; means that your mail-reading program needs to be upgraded ; to know how to run ATOMICMAIL programs. ; ; If you are reading this in the hope of editing your survey ; before sending it, you should start at the END of the message, ; which is where you'll find the parts you're likely to want ; to try to edit. (setq newline "¥n") (setq global-survey-qid-ctr 0) (setq total-questions 0) (defun nextctr () (setq global-survey-qid-ctr (plus global-survey-qid-ctr 1))) ; USAGE: (survey-multiple-choice "Which is best? " '("bar" "baz" "ola")) (defun informative (p) (strcat "#" (int-to-str global-survey-qid-ctr) " of " (int-to-str total-questions) ": " p)) (defun survey-multiple-choice (prompt choices) (strcat (int-to-str (nextctr)) " (" prompt "): " (car (car (select (cons (list "" (informative prompt) NIL NIL) (cons (list "" "" NIL NIL) choices))))) newline)) ; USAGE: (survey-short-answer "How are you? ") (defun survey-short-answer (prompt) (strcat (int-to-str (nextctr)) " (" prompt "): " (getstring (informative prompt) "") newline)) ; USAGE: (survey-integer-answer "How old are you? ") (defun survey-integer-answer (prompt) (strcat (int-to-str (nextctr)) " (" prompt "): " (int-to-str (getinteger (informative prompt))) newline)) ; USAGE: (survey-boolean-answer "Do you think I'm sexy? ") (defun survey-boolean-answer (prompt) (strcat (int-to-str (nextctr)) " (" prompt "): " (cond ((getboolean (informative prompt)) "Yes") (T "No")) newline)) (defun mapcar (func args) (cond ((null args) NIL) (T (append (list (magiceval (list func (car args)))) (mapcar func (cdr args)))))) (defun surv-pkg (q) (list (strcat (int-to-str (nextctr)) " (" q "): ") (informative q) "" "s")) (defun surv-pkg2 (q) (list (strcat (int-to-str (nextctr)) " (" (car q) "): ") (informative (car q)) "" (car (cdr q)))) (defun formatfillinlist (lis) (cond ((null lis) "") (T (strcat (car (car lis)) (sexp-to-str (car (cdr (car lis)))) newline (formatfillinlist (cdr lis)))))) ; USAGE: (survey-simple-form "preface" '("foo" "bar" "baz"))) (defun survey-simple-form (preface qlist) (formatfillinlist (fillindata (cons (list "" preface "" "i" NIL NIL) (mapcar 'surv-pkg qlist))))) ; USAGE: (survey-complex-form "preface" '('("foo" "i") '("bar" "s") '("baz" "b"))) (defun survey-complex-form (preface qlist) (formatfillinlist (fillindata (cons (list "" preface "" "i" NIL NIL) (mapcar 'surv-pkg2 qlist))))) (defun ask-question-set (qlist) (cond ((null qlist) "") (T (strcat (magiceval (cons (car (car qlist)) (cdr (car qlist)))) (ask-question-set (cdr qlist)))))) (defun qcount (l) (cond ((null l) 0) ((eq 'survey-simple-form (car (cdr (car (car l))))) (plus (dcount (car (cdr (car (cdr (cdr (car l))))))) (qcount (cdr l)))) (T (plus 1 (qcount (cdr l)))))) (defun dcount (l) (cond ((null l) 0) (T (plus 1 (dcount (cdr l)))))) (defun handle-survey (to cc subject qlist) (progn (setq total-questions (qcount qlist)) (sendmessage to cc subject (ask-question-set qlist) NIL 0 T))) (defun maybe-displaytext (t) (cond ((equal t NIL) NIL) ((equal t "") NIL) (T (displaytext t)))) ; This is the user-generated portion of the survey ; Be careful in editing this, because you don't want to ; mess up the LISP syntax. (Be especially careful if you ; don't know how to program in LISP!) ; Note that lines that begin with semicolons are COMMENTS. (maybe-displaytext "Thank you for your patience. I would now like to ask you four questions about what this message did when you tried to read it.") (handle-survey "nsb" NIL "Re: blah" '( ('survey-multiple-choice "Were you able to read the introductory text?" '( "Yes" "No" "I don't know" )) ('survey-multiple-choice "What happened with the audio part?" '( "I heard it fine on my SPARC." "I saw a message saying I can't read it because I'm not on a SPARC" "I saw garbage" "I don't know" )) ('survey-multiple-choice "What happened with the picture?" '( "I saw the picture just fine" "I saw a message saying I can't see it unless I run X." "I saw garbage" "I don't know." )) ('survey-short-answer "Do you have any other comments?") )) (maybe-displaytext "") --foobarbazola-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.8.msg ================================================ Return-Path: Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) id for nsb; Sat, 5 Oct 91 19:14:36 EDT Received: from fernwood.mpk.ca.us by thumper.bellcore.com (4.1/4.7) id for nsb@greenbush; Sat, 5 Oct 91 19:13:19 EDT Received: by fernwood.mpk.ca.us; id AA09802; Sat, 5 Oct 91 16:12:20 -0700 Received: from localhost by dbc.mtview.ca.us (4.1/Anterior/SMI-4.0) id AA22354; Sat, 5 Oct 91 16:00:42 PDT To: Nathaniel Borenstein Cc: "Stephen A. Uhler" Subject: Re: near closure on audio stuff In-Reply-To: Your message of "Fri, 04 Oct 91 23:13:17 PDT." <14836.686643197@dbc.mtview.ca.us> MIME-Version: 1.0 Content-type: audio/basic Content-Transfer-Encoding: base64 Date: Sat, 05 Oct 91 16:00:40 -0700 Message-Id: <22353.686703640@dbc.mtview.ca.us> From: Marshall Rose +vt26mvx613r4Xh2+mTt3Wxk3edkXN7fae3v62Bl/m5xYu54am3+7nFwb/N3a+N2X9xf1W5v1UnK XmffTMxcaW1x3fRv29rY2vHl4vF1al5/XWpeX/Bjamx76Wpz9OjnbXv7ZHleXXJt9X7u6uzn5+r/ 4vP2dWd+ZXRr/O987X303fzu8vrdfet++u569253+O3venJsZ2Vvb39rZ3NufG54em12bXJ5dvx+ +//z7vH07vPn6Ozu7fHp7vT2a29pZ3B/6fvx6/L09vp9bXF5cPno6vh8dvT4dWRoenNuamttd3h2 bnJub2948PLzeXj4cm398efl7+Xm6+P0+fPz7PnvbHVxZ3x7fPLp4+jt7XtsaWJocnh3df5rcHh/ fnVrbG5x93t9bX328u3z8Pnt9Pjs7vTw6e36fXx5+v1tbm5nfHf5e+/v6+z173ZuaPfvdffy+H5z +f14bn70fvz8bG9hZHJy8HZzcGh1bW789uLn6ubj4+3tev5vbGxobmpteu7y8+Xp6eZ1d+//fnv+ /nR+dG5yfXvy+vjq7Xx+fGxramt2+vt+fPbs8fV9/29jZGhvbWdtf+zs7+ji5uPp6v7t7Ozte3Vs eXVrfPH7ev//7vtnbmxr/nl8dXJ4cu/t6/X+7nl5aGl8evv5eWpy++rse3pz+O77bG1wd/Hv9e7u 6/X87e7Nw0kxPf60tH8/PGu/uMBQOT/jxstNOkDfvr78P0Pevv9Uc0949+LI22FtzNdZT2Dg8VZY aM3O5OxXV2f/6/FrWWNw59jb3fD36+zl919kafx88v1jbPTk62tdW2RtaGBt79zsY2v83dvo7m5o dm/m5WtnaOnj+2Zz3NvuaXjx7v57dXv0eN/peGlYaXzg42pi7ONeaWBXaGzs2OZxZmvg5O5+belq V1p5zcvtY25p4u5nbF1dftrfaW334ebt71ttdGh9+uz29Wni3/p6Zuj/bfRna1xe/fPu5v32ZmX7 e/9vbGp56+X+c/Di1+XsX130aufidvx2831sZ/fsd+jq+Ghh++Dvbl9t6eRoW2zp7HD+dm/l7+7v aW/s8N7tV2Nx9ebmdG7v/ufmbF5geuprcnJh9PTs7+Xq+93/bPBpe3l2cG5wb97X3//89ezxYHJp Y2VneGFiXPTc5/Vf5Nrf6WL4+fr89vph8955+mtqXVz+b2ZbaODc6vvt+Obk5Nh0Wm5v9Ppu6e/u /W5u9/R17m5n82Rr/HPg2u7882bm9lzsX19uXN3zX2t+6nV9+t/pd+F6fvl89HngZmVvZO/i3nFm dX7X9GJl8tly9/5r+m7k9m5qc9pwYnJr5elsW2RvbOf1/mpw7vnoallo+uDi6vbe2/75/+LxaPdu ZWpu6uxjZWRb6dt1aWPz2nv0/mt/+uXpaGv2a+rh+N9rb/fx61xbWHD69/xy+PzT33X2b996b/5l cH1g4dpZa+bl3nRdbd/xanr+ffbv72VibfLr9u3r5llo+mftZXZwevl46/Tpd+/gandfYPFz7+fi 32/+7dz6Z2xr3/n3bF5/Z2387OJqY3R1ZmrwaPrp7u5p6eHf6/rzff516m938G/7am1/fXv5fmRd X23ve2t7d+Tzb+no3d/t7Hfr7XFue/748npubP/x4PhfZWXy+G1cXXTo3/H6ceDf5eb97mZu/P7n Zmdsb2xie//7+nbx5PVwfX75dG/59enj9Oze9v5oZ21scl1s935saux47Oh1ZWfc3d7rY2365enu X1jx7tzsZlpj4vDb/F1qauzfcVto6eh9bvjp4N/t+V9u8HT6a273+PH8eGRt9+zqf3j+a210++n2 /nHy73JiXHLp3d7f6XZ4bfbsc2xcZu9tbm552dfe7/9+Z11e/u7qa3rxY/Xw/e/36XdqWWTx/+Lw 7+trcWpsaGr679/s/Hp94ed4Zl588+/4Z2b43d3i8mn35N/wbl5f9XJucWBke3x3ev729X376/Hs 5uXnbWRu9WxfX2fd5/76d+Lh6n1sYmj37/RvdHrs3t3sam7r7W5gXG78bXV79fh4+erk/mleXvXe 7297/ODd82dlZPng5vFdZ+7i52xtbW5hYHRscH3/5+x2en5x6+V3cXfs3+t4+efb2u9za2dqZmL4 6OnqaXN6XV525u5wanTt/mZp/OHr9eZxdHRp8f56eWdw5t3z+Xlv8Xzp7Pr6YWr05XtqZmj06+t6 +mto6+z8amNv5eLna/3e4uRzZHrycvrtbW1dYO79Zl9q797ucmpg+OP17ev2b23n3ejzfujqd2Rg XmJvd/X8fnt+7vjt4/Hl7n15an1vbWpv6fh8bm11++jt8/dtanns5u78+t/j+XJhZGn28P5vXmh7 7PN2bmVs+v/18vzv6ejrdXP98ODufXh55uVvbXf4/GxpZl9sfeze7PXp7O7wb2djX2ViYG50ennu 3OLvb2367vh39/Po8fv5/ebs8u39bGdiaPF+ZWdq8uPn7vN66OP9dmdmd33p7ntpXmvv6vtubXl9 69/td3f77PRwaWp28ubk6fRz93xtZmdvbH77/fZ3evrs5evvfXRvbW93/fP1eG999Pn6//v4/u96 euzr8nx6a21sam1vdHv2fnf/c29veerq+Pzv6N/e5ez/8/pqaGBhb3X8+3Jt/fr9d2tta3J9+Ovt 5+Xk7n75d/f7a3F2dXh8d/H0d+z9cGxrdvjn9fd4+vJt9PTyfmpvdPN0bXP86/P1/u3rfPN+6ud8 dGp7/fn8enxwdv36eXN4c/f5a2ltevj7cm97//13evbp4ePl6e16aW9sa21pc/x6dHt/7+zy7v9/ fnFxbv7r7Pl1cPvz//v27+799vf1e29sbunsenZvcmxqaW56end6+Pd9++zg3+L1dHd69fr6fnh4 eXJpaG52dX/5e3B27eno5u3p7fx3aWx7cHR9dvT3+fT8+Px8bmhla3R3eHX15OHgfWpsbXj+c3zx f/tve/9naWv4/mz86d7m6Ofr5/N6b3N79+7z7/p6eHh1bmplbH/3/Pz/d3Zzb217/HZyePLt7uXt 7uh5+/F6c2NlbWhv9e3td2/17O/8dvDsfHhwfu708vdwdHr76+rxfXP68HhqZWn58X1qanf36uvn 9m5uc/f+cmpu7Ovv/3Nz++zy93ZrbGpyb2x69O7r6urw8PV7e/Tn6/ptbXn4735zc3Z+enhta2dn fPX6/vrx6+//d21vdff3+u3t6/L9e3d2fez0f/j29vLxc2tvcHRzb29rcX74/O/p5ej59vf19/v9 /np7enZ2dW5sd/n2+v57+3VmaG/7/Xdzd//y5+Xs7/r27fN5ZWBqfvf6fvr27uzu9m9tb3dzd3Vv 9Ovu+3J5+n/89fX4/X7u7/xtY3J3dH19d3z9fP7x8/v37/d8/vX19/V7cW5x+/Lz+3hvaGl0dXf5 6uftfmtoav7v7vP/7/Hr6Ovxffz58vl6d3T/fXtwbXJyc3Jvbnb6+HtpZm58+O3n6Ort7vD9d2xu enr9fHZwcXj+9/v37ezq7/XvfnZ+fXRqbH72835rb378dG91bXT++e/s7vx5/vLt9/Xz+Pr07+3y fnx5+HxxamdrbHBtbnp4+uzn6/fv7fl5//z1+vj6bnf49/bt6/T/d/p9aGloZV1bYWZve/jt7+vm 4ODg5u/3dnr29fp3e/bq7PZ7cXJ6/2peYWJodnz9cnPx6ebq+Xn+7/P5fHh2b/zu8vZ8/Pbx7/x7 cnZ6dG5oanv19vv88enr6On4+3x0dX10aWtw/Pt8cm5vbvz59ff6+PPr6+fq9vj+f3BscnL98Pj8 /nl/d29sZGx89fL6+vr5+fl7/vr9+vz7/3Z69/Hu8fb4+nV4dnh9d3R8/Xx4cG99/f14c3l4/ffx 7e7/d/779f13cHV+fv/+8O7t6/R4bWx5+/bz8vb3fXJ2dnp2amVt+vb47/H49P1/f3Ftee/r7u7t 7ero7fr8bmZnaWttb3l4cnFpam777fj27Obk5+zv+nz3+3Z2dvvx7u79eH54aW12/PRwZmpv+fh7 eHFubHT67vH9++7l5ujq8vZ1bmxnb3Z9fXVzdPXv7vX5/nzs6eXg6H1saGNeXmZrc3d0fPn2+fbv 7/P8/fv3fXJ+7ePo7/Ht8P758/L5enVvc25nam1tbGlrdnp0eP7x6+Xn7vPx7u7u8fj19X9zdnx6 bWxubXz+cWdjaXzy+337f3/9/vX2+fbv6Ojv9/T1+3FpcHZ2eX35/nt++/Lu8XVpZWV6+PLz+fp4 /fL0fHj+9Pf8+Pv29vTu7n9ra2pqd/71/XZzdvnu8H13ePXv+Xx0e/Ls9Hd3fXx8+nt4eHp+fvvv 6+vyfnv/fnhzc29rZmlu/vbz7Ozr7vH5f3pxbXB8/nx2/e3q6/t4enn/dnH+9/P8fnlxbnJ4c3Zy dHR9/fnt7Onm5e52eHdze3dxamx+9/X3/Xl89/d+ev75/P747/D2/Xl9cmxwe315dnrx6/D9fvf4 dm1tdvp+/u/t7e73/fx4amRjaG54fe/n6+nq5+j5b2//fW9tcXv07vN9eP73fXz/+PT+cW1ycXV1 eH55b2xtd/15+unh5fB9eXd1b2559/P8d/zx7+/z7fD6fHB49/Z7fH/6/21teX17d25uc3R89u7r 7fHy8/j2/nZ7eHRzdHl1d3z89PX49/b3eXF69PD0dm14+npyfvDv8/T49fv5+P16aWJnbG9vcPrs 6+zs8/32+3j36fJ4c//y8vX3emthYm379Hpua3J4/PLu7O30fn/3/Hh2+PL9fnFv+vDz9PPv7fh+ fHZ2eH/+eHVzcXZ9/nhxd3v9+31+/vn4/f758fTu7fH8dHB1/PT4d21tcnV6fvrx7vDv8ft9fPbz fnFtbGxy/Px+/vX1fX5+eHp++/Ds5unq6/p+cm9rbnBvb3FycHZtbXB2+fDy9O/6fHt98/Tu6+70 /n58+vn/d2xoa3FwcXn57u3n5+30/Xp6/nh5eHV69/f8/P/8+/v59/56dG9sbXV8+/Ds7fd4d3d7 cXF8//f7dnR3/v779vf29vLu7evu8/j9fXV0d3l2bGptcX59cXJzffTv6ujr8X53fH1/d25uev96 eXj9/3JxeX7++fr29PXx7u3z+fz/cW5ua3JzfP12c3749vz9+vXy9Ozu9/3+/f/593tzdH5+cm5w bnjv7vp8dnV8eXf8+Pb08e7x+P5wbGttc3J49fLx8e3t9fb4+Prv8nl2b216/Xtvbnf//np1d3r2 7+7q6uv9dHJvbnF7fH18d3b69fP7fn1ze/7/9/h+cnr5+H17+vLv9e9+dnlvb3R3df3ye3Z2cm5w fPfp6vHz7e3t7/n9/X16fHp4eXFpa294/vr/e/359/n2+f3z7O/x9vnz8H10eXJtbm5sbXJ+/v95 dXh6enn9+fn18ezs7vX68/f8+f/9/fP6dXd89/tyamlqbnd97+3v+399+vX3+3Vsa250eG9vfPv0 6+zu6+rx/P94cG10ff/+9PH59e7x9vp3amhufH19+Pj9/nR88ff7d3l5d315+/l9d2tnfu3o5+7z 9/LzfXh3dm51fnl5bXrw5eHxdGhpffnw/3X1eP17dXx8/vju8ftzb3b59HB3/Xr4fm9xeX3w5ePl +WtvcPjpfWRfaHV+f3n48/Dn73RiafR45uJ5+nZ27/H5fmtu7OTofW5o++h0Ym1nW2rv9OnzbvLf 2+br8mn59P18a2Zu7m1r7Plrd+7m7H5+Y2zybv52YGFrb3Tc1+3t6v774eNrZ1lv1+/y8F1feu7i 72ppa/n1ff1VU2Ry2uT56Nvb69f5WGBoZWP75d/98dl6afxZX25o5H1sce3ic9vsXe5kZ9zZYVlm Yt/S3WFz+k9x1+3852hs293g7H5dXtloZt5VW251aOniVW336Wxh/W/j9frZ6/3f9vv93tpt7PFe b/P853lcXl5tX15eX+3h3NL+8Hj6zuPr41NVW3HX8HvrZuLk7exfaPhaWF9cbW5u+vD0bW3m3unc 6ODM3ehrVU9S+vjs2vB+/ePn+v5cVOxzYXNYYOfZ3uvtaGjx39nW5FdcWVLpz8zac1hPWlVt8m3X 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 s6afuzMiIB8mJh0q3cC2q6CfqnUrKzUrISVBtamin6CluDcqNEMuJDfGrqmpqK/MPCwrJR4gLvSv qKenqLRcOjQvLzlzwLWyxUxMc0Y+5dI/TOpc4NXPzruor86rsFo9KzEqKy8sbcbKta2uxWFJMzg0 KzJXxL2uqbDGcv9ZS09AO0/Ms7nAu7a+U0o9Mi0rNGS9uLe7weJbT0E9NjQ/17y7ub7xXFBCO0Bc YsaztcH7dHrIyNi3xcm0y9FQOTgsNjY4X0VFUV5TRfPwfcfWzL7HXDtJ67+urrTCvrxXRkNTYUvf 0cd8RjwyMjE9SEZK07m4usnUU0j3z7/S69zHy25oR0tQXF9t0V1kZPnmX1xV2cnUv6rGXLvX5kR4 9jg9LDBFOztUx8fMvMN3TD9N3M3p3MTDvLm8z9nOWd/jbUQ/8E9IPURNV2pswddVTUpEQeC/t7i5 ucHaRj89Nzo/V9nIyc3K1llJTU5e5O7uz8TO1cfmOtyoaFWz4eJA8G4yWjJK1DIyRtRGS7/M18rI y8LLXtHI5NjLwNP940lkSEHP4GtH8MlVWUdNUERR6NdOStvIxb66yc7PaV5GPT1Ib2bpzMLG9WZS TEtFTl3Wz8i8wsbLz9naUjJHyT/gssLNQXroPj8tRWE3PlfCwr26zsfNYFjZyvJaZ93S7WB+1OD7 3OpKRE5eX1pgW2l6aXV7bHzV0+Te29HP2PttbGnx3dxlT1JYXVpfYH3Y2dzT4v566NHZfVVOXmhu 83xlWlhSSlvg5+Pbx77Cze9tZV/u6XJdfups7n1VS0JDUuncfvtlZPv0593V6WX96fb45tTNycrQ 1G9aZVpMRklNVGvw49nY8+3d7mz62d/q4uzn5PhzaFpSUFpuafXk4dvb3uVfVllZbl785d/Teezb 5Oxi8el+6mxv/Pne3dvuZl1ZYWZy/fNzWnB7eGhdbF94393c+erd3d19bW9id/l5Z1xtcuzd4+Ph 3Nzf3OxXTU5Rc9za/WFu+97kb2RhdvH57/356fXhdVNOUmtu7uvd1NjLzdLa7nddWVNMUl5md+3k 4+lxaGNXVl7l3tzZ2tPX1+hgV1NbafLm3d3m7ePoamNaX1tXXmzc1t/m3OR4Xldmb/lveN/k9n3s 9vfrdmVkcf11am9y8eHd2e38c2/9cHFt8+3k3uXrc19TUlxdXGXq1trd4Oftefns4v9dZ2RdX337 ZGp47d7h7n746fLu7vvt5NjjdmdXX2pla2dyaGbt397h4ulza21t+PXv7G5nY2N1/OXf6O18anF+ eHhseeno8vLn6e/8eG5uamFqbmx37ujr5+f4bWlqa2957eTpeG1zbV5m+erf4t7d7PX97OJ+bWtp Y1dZYW73/Ovr9vjw5en7f3/9+G9pZGNu/uro7ebm5+16bWhpdu7d3e5tYmJeYWhw9/ru4u7s7vX3 dXVqbXH+f3zz8ezi3uh8bmtlanFueuzp5+nyeG1jXGX06+7s9vr6fW9maG9y8uvt6+Tt+fLs9H/p 6/HvbWVgXFxdbHbx3d7e4uzz83hlYGllaXNubvzr7fZ7dfzr6+/q5+3s/WZhaXT/8fl97OPsdmto bHp/dH7z7+33/u/l5O3ueV5bYGRsbWtzfuru8+ju+u3k7Ofm83lybWJhbHXv5vHv9Pn5fXpmZHX+ 7unzfHh3b3Xx8u/u+nz7fG548Ov3enhvbGZnbXFzbWx39uXf3+Tt7u/48O7x+3h6bnB6dG1seH99 emxrbm93fPv5+3/77O35dWRseHvv6ubm7Ofu+n5tbGht9/Pp6vl+dfr3fmtcXm337vb19vbv7u7y /H1vdH/4fnZ7+PPx7vL07/D57fJzbWlsbG9ta3JsZGNx+Ozn7e7n4ubr7v10fHpvd/bs6+94c3hx bm5oZ2tw/vPu7/r37/B0bHdxe/j17ezt7f52fHdtbXZ1bWltffl9/vLr6+7x7ebu+vp4bWtudXh9 d3L57e3t6uXzb2xnZm1vb33y7fR+e/jq6uTh6f9ubGRjYmRrcvjk4uXr9/Z7cXBze3Z0+/Lt6fF+ c3N+eXdxc3d0+/n693VpbHP68Ovr7Ovr83J2dHR6b2drb3z7+/f27e7z9ff68enxdHd4fPju7vX2 /29tbGtrcnhze3p5fXZ4/3h2dXzu6+Pf4er0/mtqbGtvfXpv+uvs93psa3R2eH/x6+bl6Oj9b2pq d33+dnJ0fPj8/ff1735td3739/78e/r4fft+/vXx9nR0fnh7fndtZ2x0/PDz8/Ps7vX4+3ZtbHBp Y2t29u7m3t3d3+fr9HNtb25pZGdlZmhvd33z9Pn483tsbnf++O71+fbs6vD8e3738fHv8fLr8P10 aWdteXZ6dm50ePbt8e/0+PD7fnx8e/75+Pn7/nRqZmptePf08/f4+PLu7/Z2ePn5+vTy9PxtaWdm aWltc/br5+To6uz1/nl7+PD1fXl7dnF7cW9tbWxraXP+9ezp5uvzem9zeXV9/fx/9ure2t3i+nx5 bWpfX2NhYmpv/PN9b250dX748+rl5efn5uru9n/79n17dnX58n5taWprb29veXh6fPDl4+Pq9nh3 c3FzcXN3dvLu+nh2//p9e29sbnr8enj7fnf7+PPq4erv7Onm6n5wb21pXl5fZWhv+PTv8/X++vx9 9+vn5OTr6er0enp0eX9vbGlw+Pp2bmpscnZ4fXd2dv3u7Ofi3+r8dG9zc21rbXf86Obp9P7/+/L3 c2pvcn3u7/50cHBnbfv48/Hx+XtzeP77eHBxd3x6/fLp6u3v7+7zeXBwdW95fPzu6+z8cm1ubG5u dG13/PXu+fXy7+zs8vxwbXH/enJyfv3u7u3tfnlsbHN8e/36eXF2e3px/Xl18Ovm4+Tm5u3v+XRw aGd+e2pmaWt28+99dG1zcPjr+/58dfjr6Ont7vf59vr58Xdz9XZuc25rb3z28XtzffXz8f15cXv/ cX39ffvx9fPz/Xr58HhxbGdv9nh4enh8/Pr29/5/9e73evHn6u/6+Pb+b2tpcm90dnnt7fZ9fv32 /Xlza29xfe/s7P3s7O/4fPPtfV9hZWRpYWrv5+Pk6Ozq4Od7eHFsafn7fHRmbPLr93358Orj8Pr/ +f78/W5mYWdv+XNtb3N29H3v7Pz/cH/48PV7fnj66+vt7/N5fuv+Z/rt3VlMeer4XVn529fpbvzW 1tjt+/5oVlNj+XdZYXjb5vb+bfbucV9v8Pf2dfnv69/q7vfs5Ofr9e/8eW5ialtfaGRmaP776+Dh 7O/v8eL3+fx09HBsd370bfny9HR5cnP1Y19te/h5+/Pye3J47+Z9+O/f2+fs9O97bHhpaGtcXGts 6uzy5N/ndWT06nBdXXrq/+t07O1q9vXs+3FueNvofm3/2/pnZn19fGz46ehqXvn/bXRo8ejedfre +XVqePpsam37bnt5//L35vV+6Hx1c2n67O7vc/h5ffD16+n7ZHn262dg3WR46Wz1ZXPrbHl0/Pxm beZ49u/u7ujp6O/q8nt4cF1qafdwXXHv9Vtf6Op6ZPPldnj539r2+e3r+2H72uxrY/bmbF1k3OZr ZfntbVxc7OFjb//t7mln69z9f/Lj8F373vLx5ervdWR5b2j4eGxua3H0/nz7+fP9cOzk6/v95Xpv dWnu9WFienVr8fjsbW3w7OT6X2jb2Ox0bu7sY236bl1x5u5scu7xa290d3Zwb+/o73p77ebw+nTp 5Wn9e3pvWu7hb11s3nRpcunbeG7p5u1saufmY3Vz/OFud+ZzaHF+c25paHTp/l9/4eb/7t/rdPbn 911e/O5kZeXf5Whx2/f6fP/jeWpp9/pocGfw/W1zcOrqbXXq4v1scernb25pa/9sbPvjd2L25+xn bePj9l5z4u31+O7rcnt4fmlu7fBvZfNuXWr363bu5/Xp+XTr9/z0/e149HD43/TnanPqbXZjbPh2 ZGNxcnts8uL5a2N+6/F7cOLX7X736O1ubf55eGRx6fv7c293fOX+cPjf4XdveujwaWh66GlmamL9 aGZnfe527fDp5uj3fuv0eFxg//798d/b3ujz5uTod1tib2taWHb4bG/073b4b27h6/vw7ebj4Wx6 6296+u96Zm11b3FkbO5tam10/PTi9nZ5+Pvx9Obh4uDz9+vu8nR2/XVgX214bWphaPn28fPp7/30 eP78fWp39/n7+uv2/+/x8fxtb/71bW50eHJs937t/Hf69uvr5G1x4ej1bW55b2ZeYXbv6/576unz fP9yeWz94PX5euPfeXZx93dsbHN5aHl+8vhxeGr95/NpafTt9XZ1+u79aHrvdv3n8ufb5/Hq4/1m d25qZWx08nZeaWprX3Ls/uzw5N/xbm7q7Plv/OLq/23/5uZybXFtaGBq5+RxcPDpf2J84Of9a/Dr dWZodm1randvaGZq6OT5fnzp6e998Odwdv346+/v7+bl8/vy7nRna2l2ZV9tcf1tevt37u7q7e/5 c+fp+fb6+G55d29qaPl2b3P38Wtvfunr+Xv66e/x6uj6dnT27/NuXfPg+2Nh9Pf3cW7xfv179m9f Y2z7/e7q7u/9evXv9e3t8v9ufPn4cW52fH5pfu37dnjt7vRqaPzr5n5s7uH1bHXu7W1i+ujzcGVn aGpta3zs83738Pfq7/ftfPnz8PhvdH7t7PX99uvv9Hp57nVlZm1wamxmcu70/Pft6/F28ev8/mp4 7/Tu9Xt2+HtxZl9qaG329O3m4uvu8Hfu7/v29u5y9ebo72ZlbfpsYXNsampufv19/Ozj6nJqbn74 d2z76Or39/Hy9n77+XBqc/Hp/nV0cHrs7Xh+9Ozz/vXu7+7u/PB8a3JrbWhs+Xhvdv1ubfPyfHN+ 9fX7cW335ez3ev/r6O3q6/Tv9XNtbGtfZ3hs//h69vZ+7Pj+7/rr9nBtaXh29Ozv6urk5nJocm7+ bGNvd3htcHB6/vt2/eh5eP7w6Px99/Pv+nD86/V4dvvv7ff6+v/8dnN7fW9lb/R4cn7x83/3+n/y +n/t7nVhXGf1fmlndfHu8vHm5+3p4+DveXp+/W1fZWxwevvy5ODo7vj8b2lqamhqbn72+v9+9O3p 83vz731ra3X+d21t8+jy/Xx++n9vbnj8cW1sdvj+/uje3t/o5+buf2Zrb2hjX2vw+mxlaG10/nh7 7OTp5+jy9fz06+x5bXNxePh2am9+dm5we/ry9Xjt5e3u9fXn5+fl7/50Zl9obGZnZmNob3VzfO/n 4N7j7+zj4ux2cnd2cXh7dnBvfvx1aWpqbXh6e2pre3FscvXl4u7z7uPg5uzv8H1tbXBubW1rdu7q 7/Tt6e12b/749n1tbnN9c2xxdXz49/x9eG9ta23+7Oz47+vwfX349vx6/Xn98/F1dOrpfmtub2xy +vP+8ebp8356bnBvbWxtev378uno9f7p5unvd2xrdn9waGlseHp2/vv79vDt9Pjz9vZ8b3d4efTy fXb37vVzcvP6fnJpanrt6/V5eXZxdHj0fnByd/Tw9O/r6/N4bGt3e//5+f//+u/u9Pbv7/pxbGtm anZ7fv99/n716u3u6+bo9nBmZWpvdX18+u/4/Pru6O3v7O73cGlve3twamlveXRve+7r6e58dXh+ 9fh3b3ZzbnJ2++7m4+bt9vJ8bWxraW51b2329f/59O3v7uvx+XRva2hwb3Xs6/f39fv46/l0+Xb9 7ft++vxweHNibO/0+O7y8Oh+aHRrZnz2eX35/P3v7evl5ezs93JtcnNrbm1rb29wdnl6eXz07/H0 7+7x/nh4dHj++/jv7u3w8PV++f5ybm13e21pbHr6+vp/e/bu8vf9/H539/j/7/v6+X97d/l8c21l b29pdHdvb+3k5unn6Oji6vDv+HpvbWxsa2dmZWVvffnz7uv0/Xv//XV1evf2fv3w5+fq6u7w7ff9 en13d/57bGhkYWRpcXp0evLw7eXk5ejs9Pf0fnr6enn+evv3+/V7cXBwd3RuampscHFzeffv7+3w +H18+fDv+XpvaW51b3Bz7+Pm6uvq7O/s7fv5+vx7eX5/fnhuam1qZ2ZjZGx9/Hl3+PPz7Ojo7u/t 8Pj49vbv7v5zef1zb21qcnBxd/3u6+rs6u/8enBycXBweXdyfv/6//vu7+3p6O/7fW9pa2ppbm11 9PX7/Pj09/Xw+H50bG9zbGxueXz58+7o5eHh5er5f3Vvbmt1//d+bmxudG9yfH5+9vP+fX11cXz6 +fXx6uPn7vj6/XR0bWtvcG5tdHp9/Pj79/Lz/P33+fPv7vLx9fXz9/dzcXRpZWRmaG50++7v9/fz 9/z77ezr6/P6+vT2+Hp6eHN6dnd2efv7/HdtcXRxeHv68fbw8vHs8PP9/f95b2xxbm1y+Pb6+n5w bG5zdnr78/Pw7e/u7vDw9ft+/vb4enF2cm1ycnJubnV6+vf39/fz+Pj29vLy+Hv98Ozp7fLz9Hds aWVoaG51d3378fDx8/b48+/6fXV7fvjt9vv4cWxsbXB1dWtqd/Ht6vHy7vf09fb7e3N19vD/fvx6 fv14d3Fze3p0bG97//Ts7u3t+f37d3B6/Xz9/X1/f3l1fPTv6ujr7vp9e3VtZmlubmpqcH748Ovr 6+7v7e37/PN5bGtudnz+fnn49vTz+XZzeHt8cXB1+e3q5ujq6e329n5vbGdiYmdtcnpzb/zv9H36 8fLs7e/u7O/z9Xz98vf7enF+/HhzcG5nZmZlaHBxcXh8/fDp5eru7Orr6ujq7+3q8X58/3RtaGZv dXJvb25tefLu7vH2+nt3dnv+fXt+/fvz7/d/dnR4e291f3v8+vr48e7u6ev0+v39+3NwdXV7fn3/ /v7+fnl5d3d6dnBrbnxzefHw7Orn5efs+nx6dnJ2dXVzdnh8fHd3eG9udXz4+nZzdHd87u758uzn 4enu9PDx+HhvbmdmZ2xyd3j8+/vx9ffw7vj38vT17+z7dGpoamt0b3F0c3b+/Pr4fvLx+fTv7vjz 8/ru7e72e3h2/vh/fnZvb2tuefvz7Ovr8n56+vZ9dm9ubnV8fHhtamxteHr79PT4+fny7fN3cnZ8 8Ozs5+bv8/H3/n51bWltcnP++/z3e2pnanBzf/b5fXz/+Hpwc3zu5d/h5e3z/f71fnRtZmxyeXt4 fX1wb3N7/n78+vz+9u7t7fL27/Ly9/v0+Pt4cHJycnFucnl5eX5+/fTr5+rv+338/3ducH52enhq YWVtdfx1b3f+9/Ht7Ozk5Ojn6+7x8/tydnV1fHt0cHFzd25pa3t6dHd8+X5zb3X+9/Lx8/j58/n5 //rs5ebr7PP8+X94d3z++/5vaWZqamtra2xwf+/u7ezw8Ph4dXx9e//28uzp6uvp6ejp+XtzbGxo ZWdsb253+ff0/X/7fXt+9vP8enx8e/fs6+/1+Pt+ff19enhubnR6eXh1cG9sbX338/X4+X739Pn3 6+jt7Ozt7u3ze25rbG5tbXVzb29ub3v28+/y/3v8e/zy+P7y7Ozx+Pp4bWxwcXNxcHl9fv95+vDv 9frv9PPvfX3/fff2/np3+O7t8f9+fHRvbm91dHj69O7r6/H5fHhvbGtrbnBzdHRzffHt9vju7/Dw +X99cWtucXj19H377Ozo5e37/ff9b210e3BoZWRrevXv7O/6fHx/efv7ffv29e3t7/b18Pd9ef/5 8PHx9XtuaGpubm93dnp3/vf5/vvz+/z39/t7/fn+/Xt1dn3+fv18eHr5/vny/Xj77O7p7P39/fn+ +fr//nt0aGZkaGpvc/7t6uLp9/Pv8vx1dGxrbWhpb3f9/PLs7Ovn4+vv+HB3/X55b29sb3V8+nx4 f/f08fH4+vn5fnNucXN3enJ2/fr28e7s7u/z+356dG93b3B8/v/48fPw7+73enh7dG91cnJ4ffXs 8ff+cnB4/vHs9X5+fnz+fHb+/n17d3v09Pr8cmtra2pxe3337Ovr7fPz7Ors7/V+b2xtcGxv//98 fv/48Pp+fHz7+fb5eXd/f3FsbW5ye/37/Pzx7Ojo7vd7f/Z+dnX58O7s8PX4/v56dm5paWZmcf59 e/7z9fv+dXd2dHH66u3s7+/t8fLu7vDy8/Ly+HVtaWdsbGhlaG50ff7y5ufq6uno8ff9+n1ubWxt b3b3fm1ubnT+9Ovq7PR9/3pubW93c254+/Py7u3u9XZ9+ffyfXBvcXd/eG939vDz9+/v+/Xu7/b+ /Xz98fr1+3Z1bGpxcG92dXp4dnb78+/p7O/v7evyf378fHV1dnn//nVtZmZqbXN4+ezu9fn89PTx 7u7q6ert+Pf/dXdwc3Nxd3p3eXz+/Xv7d2pqbnN3e/v07O7s6+3v7vxtampsdXBtcnR29uzr5ufs 8PD7fP92dn58fvv7/3V2efvz8fd+eXV1dHJ5/X19enn67+3t7vDz9vp6b25ta2trbnF6/vx9fvju 6/L+XUndtbjB6UA4PFTfzeZMRVbu4s/dUlN43NbZ6GZ21cnH6ExUfNHHynhJSUhd3d54XVhRbete T1d41sO/xc/qXFhm/XFeW1xbXl1aWVNVaene5ftwfX3x49/T0eL059fLz950W2Tw2W9STE95cEMv PbausK7DOzlFPD1HTdSyrLfTRS8yV9xeSDs4TMq8vtJWS2HOxMrY/H7Rv8XvdmNl1lMmJLCcqqal NCE7LyI6RC/Do7DCwjAlQ9xXzLrIva228E04MkrP3008NT7hvLfHXkY9TMq9xetZWNe9w+07JTCb j6Ouvh8f4UgnLSUkwKOuvk4oLNm+60VAW7SkqsJCLjrmxsdQLi9Zxru8YD9dz8O800U+RVRZWFMo GK+FjKKbOQ8mUh4gKh9dnZ+1Ox8hPLWvOiIut52dqmcjLcC+0ncvKtqutLnfNzv60V9KT1ZLTVJG QjkiHJ6AiJ6dNBUqMxsXGSWunKC5KSEwT7ZvHBo3o5igsFAu5K7JMS41VKypyGjf1cvfPi4uRdDP RisoRcBZIyOPgIudqx4cMicbERI3oZ2j5CsuPb36GBMexZOTpMNS28hcJiBEtKapyVnLuMFPLik1 Te9dNCsuRMrVLBy2gICWq0YoXCoYDwocop2pzD3Aw3xfFw0WMJqTpq+vq7k4JB4/rKiswMaxr7hK LC4yPE1AMCwsN31TLh8siICNp6pDvS4REAoUrKu6usyfqTo8Gg8VGVydn52cn7k8MyMp2reurKuu t7XCPC4sKzlBLyEeNcLVNiEjj4CKoJytn10SDQgVXC08yq+Rm19IIRkPCyC7q56Zl6SuuiEcOcG0 uLmvpp+qQCwtNT8tIh4dKmZrLyQ6ioCUm46eoSsRDwsgIQ4xqJqTubin0yIICh8vPGWgkpObtjA/ fTk7P7+tqaSstHwsLks8JBgXJENfJxqggIutiYmWaRQWEx0XBBOqoJ65qo+UwBENGxkPFj+dl6Gf nJy0Ji7nvz8swp2ewT9Yvs4uHBkfJiMfIaiHkqiGhI+xHyMiHQoDFisgUq6ajJKlu78iDAwRGzI+ 3paRoa2oqcrMVTv338jEzk4/ys82KyIjKx0knpGzooeKkaJFRjsbCw8aDg8o5p6YppmMmzYiHhcS GBw7uuaqn6evrKesvMK+ssszP0MxLSwvOigYIpWOUp+Kjo+jzrhIEgkcIQ0PHS+vprCdk56oosQg Gh0eHx4su67XwqWlscO/q6i6xbK7PCwpJiwkFBmdnjuNiJGOl5mfSBALGQ4FDx0eP7ymlpamoZef VFs0Gh8dHSwsNcOpq7Cop7PP4bOsz928+y8nKysWG6JmMIyMkI6SlJiwFhQaCQQNFBIpz8uXlqie maOspEsrOCYgJSAiTsvGrKSqp6fFua/MUdtuPDUvNj80JiDdmq67lZKanqKuzSsWFRsVER4mK8Gv use4s7KuX+K26kQ9NjlAP1PItLWrqbGvt73EzMVUNDJNaTgtM01aZ8uyq7GysbXIXDUnLzQvNj/J s7a1y2BSOzovKjhIOz1KSPnH1NC4tbaur7K5ysi9v85YSe30Vk89Oj1ETXZdadPBtb7UXE5NPzU4 Oj/Nvbu5zltZbDsuOlFrZWTVy+N6yb/q4L+8uc/ywL7Oy838XEVP/UwvLUFTUT48Zce5t729x8/B 1lU9PlJ5zunf5ElgXz0+QlrW2dHp+tfqX1pb7dPSysjI3cWxuMloWM3OVTcvNzhEOi87RunAvby7 u728v9xVR0Vl2mlPWW3jalRiauTYx8Xv7et4eVE+Pld1Y2Rvz7q3usv50svPUzw8QEs/OkU+PWvT vL7ZzMnFxvFLRVFf7+diatHCvsPe6s/O7FdQTtfqSUU8P1ZfUlfqxLu8y+DMzOnrXkQ+PUJLUkVF /tDKx83T0tPMzmxLRlX/eGB/z8fLxcfMy9vU70tJV+JpPj5RbVZDTf7b3ubIxdDq38fcV01ESFVf WF9RUtTM1Opd7uVvZOrbftrS3d/Z08a+z+jU3n5lRkdbW01CSUpLbtx8c29q1dff0tPX3Obo62JJ UuDl8F5QYvHsYWR3WFhbWVtv287EwsfJwsbP3evwXlxQRUNEU1dTUlrg1OD43u1paPne931s+9Hl aFNLVu19X2zz7One18zR5m9+fF9kXm7v4dnWz87O2+To6HNWSUldYFFMXuhqatPU825TW/Ll+PjT 19nPZElMSUpMS1z8dejPwMHPy8/i2PJZXfLn59zY1dryXllYUVBUUlx9ZW3g3O1+7dTN5E5OX1hl ZGfo3N5v1+5JUF9TT2vXz87OzcrP9u9dX/hcVVZ969fL1evc7Vb9X1n9YU5d6vf0avfj6Ph+Z1xU V2Zs/Xzo2dfQ81JaYE9QYvz429fZyc3b22ZW3u1PXWnu4nL/1eXu6W3q5mZQYNfmbt7a9GpkXGFY SUtfUlHf393Qzs3O4WztYk5PTmfzaufPzdri2d9sa1Vs2WJf3N/s4XVZaPTiaGnkbPPq3uDdcGbe YFBQU0dOWF117d7bzNPW1tTn52lUblhYcNfd4ntl2+VWT+LfXnJw/dzW/uzubd7Y9eji7vt8bV/l aVn0aVJPT0pjbVhb2dfy2dbO1W1q4XVQWufW3/jezdP689nybGfy5GJSXutjVlBdfG1nd996YezR 42FifuL+Xm7r73nr2NPU2s7G1eTp6mVNRkhKQj4/S1VVTnTQ7vve1s3X1e9Yysi8rrWuqKy4wMw/ Ny4pKSopKj0+O0JpZ0ZSRUlsPyg9qJ+srJKRmqCvrMomFhYjJBkf0KqnuLqpuS0hLi4gJTE9Vcq1 XDyjkq7Ak5efrLq3WTMWFSckGiHarKazv621Nig7NCYtMzlITUxMd6eXuKORm5qwrL0tJhUcJSIn TK6uq8jueDMpKDgpLko6Y9pTNVGwoNqskZ6ZoKChUDkbHyAaJzLEurDI2/AtMywyKzFDLE95TTdj rqDerJGhnKOdpD5UJC8pHyxG3D3SPzUvIzA4OixKxjZEyU4zTq+lVZ+Un5efl6VOVCMxISQqNms1 XCstKiUuL0EtWuk/2sJjT8WkqmuXnKGbpppoTzMmPyErPcg7RnsoLCArLC0uLM5NS7zN2cW7n7yu lquboqSlN8UpPC8f8D5GOG4zJishQSoqODxqL8vARcfhpaRomZ2jnKmaSUvsOEAc1GU6O1nJHygj MyYfRS8+L1zAO+u7saawopemnJ6erTOzXioqOj80OTTnKiEqKygjQjguPlvcO0uztr+loJ2anpmf pr3tzyQvNCYrOTowOyktKyUqLj0uOUtCW+/iuLOzop2fnJWeqKOwaTwuLyskLTYyKjEvJSktLjRC QDxERGbq57yvrbChmaSamKKmtLg5LS4pKCYtLSopLCkpLTg+R1JaTEnd0cXOuq+0raafn5+coqyy xUpBMi4tKCYiJh8jKSk4RmBka1RR4NzDvLq6r6+zq6enpqOpsLS1yVFSOC8oJCQfICEoLjRKS2Fm ZtPUx8O1srCvra67tLO9uLC3ubW2x1pfPDQrJyskJCctMDZDSG3cysjCtrKvsrCwvcHM1d11zcXF u8zM3VlfREA/Pz86OTg4Nzk5PkpN1s3Cubq1ube4z+xfa2f5ztLQ3mn+XkpZV33L2Pri7ENEPj4/ QExM3enNxcq+ztfj7GxJXOTrd9HdcPvebF/OyMrc0eJaUUlTRFr2ft9izGxjZF1wSvr4det9+11h XnlcZNDJxsG9v8zec04/OkJNTOjR09Pa52xkXVlYWF3a6HLs8FpMUVbh29PEvr/MzNJmTUhNS0tm 3Oz03+VbV1JUXlT92+D8ZWpWU19v4OfJwMDGycToVlFUW1Jg7tbqbeFiT1RKREhZZE/u399/VF9o d+LLzb+5wMzGzmFQUlNJWmhv82zd7V9VWFtLU2NTU1NZUkdX/fvby769vLzAysnaWlVOUVNRVltq W1ZUUU1UWlnY2PV/7H1aX1ddd+bW3M/Dx8zNytPm2flXSFBhRUtfY1xNbdbbWO7Oa1lmWUxaUmzL 3+TKwMzRy9L1cexqZ1JOWFpUVXFiXmd9/eZn7Mt+VtzSYE5o0nRTbcvPXu3J1m/r3XtVbeFRSFrn dlpq095PXuRnVnPY/OjQ1M7S8MvPaP3vYUlUX0xNTVtQV2Vh6Xvt3NDV3tfl5/7j5nDYzc3Oy8jG 0ujmXk9GSkM8PTo9PkJHVuzizcfDxcXK0c70a+bfZnm+ub63ra+6vcNpRTgvLSkmKCwqLT9RWNa6 srS0s7K8z9pLQeNeRL6nrq+enqmtrck/MiMeHhkXHiEfLGXXvKqlo6Knr66+S01AMSkfObHAVaeU m56amZ+3TykkGhAPEhMUHy1Crp+bl5SXm56u5z0sIR8eHiYzPlfH4tqgmKi1mZWltK+1PyUaFxsV EBkqM2K4pJqXmpyaoLlYPSceHh4kKS8/vbGzqqmwv1ElILy5HTChnamsm52grTM6aSYTFCMrJSU8 vKWosqCco7/BuEgsJyckJSUrOnLXy7SwtLzFMj+YtSaumpq5rJ65rEwcIi8iERUqKTJnUHChna+s op+6xOM9+jUmKkdDNk3rfcXEXsrITS8uLx5Oo0nZopiXoJmgrKdYJh8jHhMUHR8uPMe8rJucn6Of rsBLMi0kJR8oLTrax7q0q622wM1qRC0oLiovv8X1rqWcn5+fraes6DgsLCQeHh4gJCs6PVbHra2s qqumrLPO7NxBODQxMTIyOUBSaN2+xsG8wcnK0+vx+VtazL6+urm1rq+92d5fPjo3MC40Ojk8Rz5C bHhvbs7ZVl9OSUpKWlVkzsK4tq+srq+yvM35SzwyMDAvMjQ0RerQxL6uq6uoq6+0ustUPDQqKCkp Ky86PE3m4PPczdjQztLc0/HhxsLCxb67vcLJztlsVVJFQEFMUEta683Mx9XmxsrgfHntXFpVTFxe ZF952mR77374XlFJSEY9PEA/QUtYb+PIvry4sbS5t7a/2dbrUkxJQEBITElNdlVNVVPn8WNh6sHG y8TBwsvQ5HNcQjs7PDg1OT4/UOrYy8G5t7i5vcTL52pkVU9PT01XZ2Fo5NZs7O/n3nbsV3fc5P70 1M7X6tvv91tFSk5ISlZVY+bf+H3h6Gf9elhYU1lf6srFw8G9vsHG1M7R/FpHRUM8PDs/RU1IUtnL yszFwsHGz9Dd5WlVSU5fYU5Pb2VwcPZ+z83ufHfi/2liYWPvfVtx5c7O29vc0OdYT1rb8FlVWl5a TWXt6dpfYXrm32Xv3MjeUldUaFpc1b/Ezuj35NzX+lVVc3NCR/JhU1/obW3Py3l08tvd/lpUVtVu WPzm0cPS/WHsaURKdVdGSVhg68vCwcPExeba0NliRz5Nc0c5TNtpUnHb0NPBydbZ0t1YXGj79VVf dmRkVGV0WWFnSGRfXljr2M3P2sjxydXvzXnX5WtcWFv6XGjca29fW19X9HV+a/FtZ19l3tzj4urb 4O/e22PpVVRaVFhPdlxfzubYe9Xf2tHg4vvd6WX3Zttpff1o6ltiZmTtZm5633roZWXu9+hc5Xll bl59YvL8X+xSe2Lr5XrQ7d3Q5dHmzu1zXV3zWVheUfFOcFji7NjY59ng2Hjtc35ZaWxUXXR4+Gzv 5+3a3Fzy6XJycGFZ9G9mXm7UaODe+N/09Ht172h+bupo4XDr39/m4+3dbnNTbGZcWVllamDPaPrf 1eh47N/1615gYm5eVF9adWTfa/vP98zo0M/q5Vf+V2tkT/vwzlfv+mB4TFVY2XDf0tPK5sv/3d1V VVFfTk1YV35uemHP9N/b2tfs4Wtq8Gdbb3Rn3Odq7tnec9Xu7Gfv5t7V5lNUWEpOS0pcY8/fzsjL zsjQT1taTUpUT1Lf/9/cz8/czdXg3+pYWV1MTlhdZe7v6NvXftfc5HZxb3L26GZg9W5kd294ZHVn 7mxoX/Lkbuzz8Hno3N3hfGvu4O5cdGn+9tzd2szN0tLV1nxiTktGRENBQkZOUFxp5+TPy8/U3NnX 4O1u8/zoaX18X+LE3zi6o76tsce0vrI3JDIkJCghISo/7cytqKegoqevtNBANC0rJy8tM0JcvcS2 uby30e5APD82MTg/zaKlpJ6gmp+jtS4uIxwZFBYYHzVAVrOknJqbn6iqtUstJSQkJykrOfnEt7Ct rbC3wV45MC4sKzVvs6mmnp2cmJ2nxzsvIRsXExUYHiwxRL6snpudnaOkq8tKLCcpJykqL0dpx7i3 sLKyutnvRzw4MzY4P1i+r62no6Cipauy2kQxJyMfHh0eJi48Vs69s66ur7K5yNPuT0dGQURPb9/c ycC9u7m+yOJRRDs6NzY7QF/d08G3sa6ur7G4vcvrWEA8OjY0NDc5OD5GS1pdZlVJSkVJS0hXX+fE urSyr62vsbbC1mJPRj07OTY6PkhWddTIvr28vLy8xM7e7mFSTkZJS09IRkxLT0pDQDw9PTw/P01y 3MfCu7WzsLK2ur/G02ZQSUdIRUlNSlh0//px6vl6blxedeDe0szJxcO+wcbN8GZOQj03MjEzOjs9 SFFf38vEw728v8C+wcvLzM3V1dr27mNcVlBRSktGQ0dKUnHl19PMwMHBwsXLz9lwT0ZBP0VISk1R Y23k1eXl7PzzZmdVTlhYa/Pf2NbPzczOzdfc7W1oWVZSVF5gae/VzdDO0dbZ3OdoWVNQT09PUVNb efHr4t7d3eD6fn7+9Hp6a2vo6eHf3tvb1NzvbF1STE1JRERHTVx+4djPyMnGxsrN1NnrfXhrYmVu aXnt4+bs6vH+eWNWVE9NTUxQUVtld97WzcrJx8nO1Of1aVxfWVZQT1VUWF1ncWtyZVxcXGBmcXTu 1cjFw8HCxcbL1u9nVk9MS0lJTExNU1xibPLi3dnY3el+bXF++3d5693b2N7l6npuX1xZUlFVWGHz 3tPSzcrMztLhfmteWVFPUVBXV1Zfduve3NTPzs7a6P1qbGZfXl5na2pwdXz/bGVfXl9dXF1dbPTk 29nTzcrJztbd5ezs8XVlYl5XUVBQVFlbXmFodPPs6u7n4eri39/h5u3z7/d+dXtye2xiZGducmxz /O7f49/lev3++XFibHz27u/07ezk4urr4+bp7X13b29vbWxgX2lsY2FiYFpbXlhbX2Rtce7k28/Q z83P193naXvXX1lpdXxj6/t18Xz85u5bW1tbXV1VUmd0f9/W09HQzcrK1PT/eG9vX1ROTlBWXVRP Ul32fW1gXmhs7PRu+ODT1dnV1tbV0dZ9Wk9RVUY+S83MSbygqK+ura/hWDwfHSElIh8tR161oJ6l pqOqwlYzJyUqKyowVse7tLCur7XBZ0lBOS4sLC0sI8GRmJ6YlI+ZpM8ZFBgRDAoOITHAm5yYk4+T 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 n6q7NCYnHxsPG46GioibpsUbLQ8CCg5NlJiMmzimrsYmCQwPH5mQkJzPo619vCUYHDaamqzCLTLU saZYISIiKzxawcm3qbTuSlN0PC4zLyccH4+BjY2Xq6seHA4ABRbOk56amMKalWEWAwYXMJuVnJua jpDAHxgVGTKspcrjr6qqsrdPKScnJR4nTtW8qqi2vrW9WjMtKyIgGyeKgY6Pn6e5Hh0IAAsgp6Ov mJmdk58nCgYRHkitopWQjI+3IR0iHxwn3KqjnJyisM5NJRwfISMlMc+wqq3IeNPH2jkxPDozMigg loGPl5idnS4bCgAJGThLUJqMjY6dLRANExITHuSUi4qMmrJSNh4RFiQ/4q+dmJutzDQuKxsXGCnh 8dbEppujq788OCkhJCMuJjmFgpiRm5itFhUFBhcWHR+2i42Xn6/KKR0UDhgqz6SckY6TnrfRPBsS GShJxbepoZmcyicaHB0cIjyvp6mqsq6s6jovMzgqLDg4T4yJ05uPk6AZGw8OGwwMGOuYo5+Tj5VS IB0bIxsYLbWbmZyYlZ67RS0uIhsbJruwrLGtoLNOJyImHx8mPb6wqKSlpbZaOSwwKCgvPIyLRpqR nKsfNRgVGgcXPzA8N6CXmZzOuKXNKx0wSCsqQquiqa+xoLI+Qb+8Sz4vUe02Kyo1Jixczb/CsK21 wHZYSDo1OkvXwK+k5EiWuB+do8rST60zVCkSLxwTHzdCNqGbo5WdsK63MR8qJCEvOvjdtKSkoqqo qbXHVEgnHR8hKCcoO9a3q6eiqsLAfEpHNzw+d8dg0l0nvJoq3I+lurKksy4yGR8nERgzMyPPobur n6iop7O7p9wjNjUjHB827LKrm5SZnqapPx8fGRYVHDI14K2joa6qorDbWOFnN0hMNzowNjkiXZ47 ro+sr6KfsFnCISQsExksHxYtvTy9m52bmZ6nqkAfLCUaHilDyK2fnZ2ip6vXODo+KCEoLComLjle 1M6tpKqvra3C3bz+KCgyLS80KzauuT6Xkqqgm5++4jcgIxQPHCQZJK68/KSeqKmtwbG0O0+8Si5L w0NRv+C/rbDHucdI7DsoKjQxKy44RMrEYbestbiysL7J2Dc6RzVBRkpmXvi7qMnYqbTIxbfVO1Y3 LTgsJi08NDpy2dLCt8W/r8JnXMq61NfX1cC/vtDTyF9LSkhNTD89QEhGQF91YE09TODX/vrFu7W1 usXP2vh+U0Vb4Hn8fXf7VEdHQUFFRF7Yy8nHvMG/u+NSUE9iTVX43NZv8FtBPz9FPDw8RNPQyLa5 wbixu8/V2Nzfa0o+S1FCPz5AR2d4687OxsXI2HhvUl9oR0lVad7Jv7/BwsjJ3z44PDw8O0hdcsm7 u766t7/DzFpLSkJBRT87O0tTRD9F7s7Gv8PBw8TExMXfWVhVX0xa1d3JzNjOd2dpVEk5Pj83Pkpx 29vMxr3Dw77Gzc/W7u/tXEtBRE9PT0VCVnvc4NTKx73BzNpzZlFOV1dg7NzP1O3ueFlTS05dUU5W aXdYY+7q09/azNTV7eXceODS3O703d1ndF1SX1hcZVxr6NbV5XdXWFZOU27oZmze2s3K0NzZ32BT VlhXZ2NbZtXO1dPv2c9vX+/c8Wf/a2tzXVRKSUdHT1Fn6uHa0cbO2uhlYlrr3ebQzsXBx8bN3mdH RklDQklaUlbxcGVkWl984/p12c/KxcjN3urse/v07mVYVVvv7mJn5vdfVlp8X1ldauz22szN0Ofj 3mtXSUtNTm3q+W3e0drl5+l1/v3k19/b4enncG5y6XBOWl1Vb/FtdeboX15ybGt+aV/h2ujj29bP z9rh9ndwZ1tOT1lXU3HY33jk5nN46ez8/V1r3eXu4/Jlb+Pqa253+95s8LvmUfBSWlVFS3pfRU/e y+Hh2czCzm920+F2dGj6YntbYejh919ra1paaX1jaWfw1c54YvDVdGNd8m1h6tzjz8jU6910a1RG QEteWnDe1dfg29ndYP1ec21NXnzeXmLn/vdb7uX2YnvT2nPv1NbcadzS9lxf8VJQa9jrfubt0WpK U2ZaRWjI3dO9vsHLzNptV0JISj85QUxCS1BQW+rb2sbHysG8v8DBztrl4G9ZVElOSD9DS1ZIT27z 3OTS2uHi6tbW+mvO1PLa6PRYTcXVRcG8yMfAut3UeE1SOi8wOS0uPj87R9/ay8K/tbS7tba+wbrG 18PeXV5bQT9COUA/Pz5PS0BiaVVtzdnYxsjMxszZyM91/GFA4q8wZaNfwrivvle1RvVKKjA0JSA6 NSk3z2VpurmvrbGvp7LQs7JlVbpaOk0/Pjo/QU5JN1nrPj3/Yj9b23dtztrWx8XDxdNNua0yv59U vq6yuV+3UFM8IzQqHCE3LCI8zj1fubavrq2lpbmzqbBnx65DO1I7MS87Ozw3PG9NOV/PSE3NzUhc yv7238bNTMCs69egsLWprqzXxHFCPiMrJxwdKCkiM2BMfbq1rK2vpaK4vKazUsWvWULcVTUvOjw4 LjxjOjNe3D5Lwc1Vz8jazuVyx7LYbKO00Keus764xEhoLy4uHx8pJiArQTg+xca7r6+sqK20qazK vK7QTsp6NTk5NDQzOj1AOEV1QUPY017vx8nvb8yswEmeqe+jqq/Vz7wzPCwoLx8fLywlMuNRQLi1 vrKvrq++vqvLUL68VEm5Uj9bTk49SktbOz12STlI50BFbttwWvGvtT6goNWipau/zrg3OCwkKx0c KSohK874Ra+psayoqqm1wKzTQXtfPC1RQi5CR1NYesrJ2NHLyVBQ20I9SlhHOsmwOa+c6aWiq6zV rz03NR0sIRkkKSUlUL9CtaatqKSnp6e4t7VjPkhIKi09LS06SERP4uDJyN/Ew1p8ynlL0ulNrr1M nazOn6uu4L/VJTUiHCUbGicsJzO3wdujoqmho6mmrcO4y0I4TTgmODgvNkBSSm5m39NXZNnpRl3Z XmnO47qlaquVw6qdqrZJuTAiKRccHhQbKiolTKnEr52foKCip6W62b15MTBULio8Ojs7Sk/sZEL0 0kQ74Xs8VMzY7cbFu5+0z5efv6eisDZHPB8fGRceGhklTTs6qaOto56jpKW6srJKP09ULjZdP0NK 2OLrY1vTPzM+STAwTk9O3cm6s7u9wqSeTbCXrvSwrVIqLiQfHxYaLCQfRK3Gx5+epqWoq63AOkva KipFQDXrxM+st8m4uUozXzknLjYxO0xpvbG8t6ey1MNUPqjHIaqgZOGzrEM7PiY1KBclPSYlyanN sJ6oqKe4wb1OJyxBJiBPeU60r62mqLrGsEwsPDMoLDc0R9Prx622wbLJUVU6I9ChIz6Xprevoqtj 7CMkORgUJC4sMbuqp52oqJ2wRDs/LB0fKjkwPqqeoJ+bnqC8Pj4rHxcfJSEsPsSwqa6poavUd+M1 KCIcNp85K5KSnKKcm7neHBQmFwsRJDIvxqKilpirpaLKJScrHx4mL9+kq6WSl56qqtEqJRkaHRwc L+fNtamhpaa/xbo9KCk5LicvJjiRnDCUipOrrKIwKBoJEBoQDx+0pqOampSTp347PCYXFx4wP163 npSWnZ+crEMpHyEeGRsoSFzirqSmr7rH3UYvKjI+NzpOzsf6L8yOnTCakJivV88sLxkJFCUaGii0 npqbr56YuygfLiwdHyrLpKOpoZearedkYi0jHSdEPTdFtLXD51lXVDwnM1RSPk25rre9ur/E3EQn KJmXK7GQkqdQ7CMlIAoLHCYgJsSalJOgq5ykSBsbKyYjJDmqm5+qoZmgvkE5RTUlIjBJRDM4Rt9V L0RnytTovLWuwNq7ud1bTEFEOzUvKCqdksOtl5GbUjEeHx0MDBciPmfEnI+Nn7WmtkEfFRooNC43 rpqXnaejpMQtIyUpJik2TsDK1dfrzE4/S0zZ29TDvri9vb/P2U4wLjAxLjA4H6+Lnq2YkZO+ORkR Hg8KDx35qKOdk4iOtfQ9LBoPDhIry82vmI6PmKW6yDscFBkkK0BJwKikr0vTw+Q7LkTpx+1fyL/I 1kM8SDUuLDNH6bvHP7uKjbCfnpy6IhMLGRoOFSrOnJWeopWRwh8dHSAdGh1fnJmenZeWn+wmIiQd Fhs6w6yjoJ6lrGApJyMlJCk6YLOssLGrrr5FOT0uLC9C6M+vr+3blI+3zsOy0SYaDhwuICAyxZ+Y pbuomcYgHx8pLi4pW5+bn6SkparMKiMsKyAjRrisq660t7w8JiYoLzY8Xs2sqbK1trvdTD4vLzgy Pl7mw7i3Pa+Onsi/uq1HLxcTLCcfJDLbpp6suJ+e6TksLC0xMidDraettK6pqLdCLj9HLCUxu7G8 1Fm/vTwmKD/fZVx7uqCnzf/JxTopJSg8Q0Bdv6ypqbBBVJudYz5LscBDJxotPC0kJ0q6qa+8q6Sz Ri0rLC4yLj3EqaSloaaqsNc6JiEjIic4u6urqautuUssKiovNjZJx6qsvr69zD4wLS9O12vqxK+u sbk1K6ac9zVwqa67VhwlPTEeGytXsqy3tJ+ftEYxNzIxKiU6sKSoqaChqbRDJyUpJh8jTq2srrOu rro/JistNDI45LWjq7i+u79ILiw5S09DbLuwrso/L9qivTlesaeuuD8kLjcmHB0qSLqqrqyfnqnH TzUqKiUgKmm2raSfoaOpwTsqIRwcIiw/waqgnqCntN06JyUkKzhNy8ewqqy4z99sTD0zLj1k521X 1+Fsfb+zvbiwsa2zxkAsMTIrISEuQtq9ta6np6/IbEw3Li42TObNxbuxsbvOVlBFPTYxPV/WzsvA ubnDfVzv/VJCUG/y6uTb49fTbUJDSz49TmFQWtjKxbzD62rVzG1OS1ndzN12yrq7xdHT8F5KPTtC UE5GU9jR111ITE9RRUZUX9zN0s++vcbc187NyNfh2srL4WxUVFNLQ0Y+QFNPTEv/9XLl7vjpz8/R zcbGzuFpZVpNSEdK1L7Bvb23ub/BVD06OjoyODk9XN3T6OPg+t/qcmftzc3Izt/X39jwXFpvzc72 c8a8u8DX+lldPzMyOT06QUNl1cnI0cjEyN7c3uXtak5GVmJWWvFrxKqtt7W2s8LRPykvLSsmKTQ3 9se+ua+ttre6yvFfRzUzOzg8S23LuKytrq60xVA9LywwMTRCz7y8tbrAy29GOD1APT9O6NPLzdjf 12NNVE9Z3MTTfrafrbyuy7VoTCsdNiQmJi5Xcq25s6imrdX9QTk4LCgqQM7Lt6ynoaSrw+laMSkh ISgxPu2zq6Wkq7jRUC8pKSsyPlHZta61vMbcUkU7OEFR7cW5uL/Ksqzp49N6y0lNLzNRMTo2Sm53 v/e8tb7USnpIPz00Q1/BvsCvrK23y31GQzYsLjM5TdDBsq+rr8PYRTkuLC0zQ2jIvLOyuMbkZUY9 ODxVbu7cvrjDPluiuEjZwK3OzDQr3TgpITNUSspcvqinu1LGx1Q1LDFD5XhXuaequMjEy2E2KS07 QDQ8vLaur7eyuco0LzUvMDNR27W5xLu8w09DPjxGPkZX1r67vdlS/6uzP+K5rsdSSDRvOCYoN/A/ V265p63HTsHDRTAtPVZ+Y/iyqrDBz8fjPzAtO0Q+PcWuw7ersb/rTjc5MygxV+17x7m5ssNeYGxF MjxBR+9q07myxDtNqatGTrmstVs6NnQ8ISU5ZEVL6bejq9Z/usA4KixvdTJHyqquvr/Er3Y1MT5K LjZjtbfMxK+sz0RFUUMvLj1u223svLbFU1naXT41QO3dYVbAsLLHWknox0z7a76vvMJuwFIyLS0x Lzo3abavs7iyvdZLOTU1Oz1J2r+vr7i3vM1ZPzc4OzU+2bq6wLa+zvk9OTk/OkfX0cnKydTc41da Vk1MZ9zs3snAu8VMSc/fPkDtwr3M6sm6zz8+Rz41MzZJztDOwre3xtZeTEA+Pz1LYs28vL++vc7n ZktTY0tHcNv69fr17XRPRVxZQUpi6eTd0Me/wsjP1+pvTklQX/RlcvHd2FVCT11LUHPezb+9z8jB dlRUTktPXGTdzMvP21xNUEc+PUxfanzmx8XH1dvMxdRSZOZwTlD75OdfZ+lrUU5TePFeXN/ObVJ0 0t/ey9fMws1fW31DTGxK8czR3crMVU9OTlZVT+7D2XHg5nZwT0Vh4llY2upw2nFNXNtfUtPKy8fO 3dvUbExda1JWbFtOXl5f0MrOysnaWl1fSlRcTOnL5efIzVRo0m5eW01Z31tH/NpjXtzbzsLn4cfi S1zvSUnu6+3cYmDe+UxY2m5OWuLr79182s3wXOrcWWDsW01f6mfq1N/d3XBp11dO0s5r8dHj3vLX 6Gh5WmxNZtpgW2F4XmZRXdHvW9zD3lV5293a5nzNzVlLYF1LTVdq7XxWb8rRc2ri22VWV3d0VfjQ 4W3bzNp5f+fP31leb2FOXWNv2Obp3NTfaO/iV1fP4U7qw9B0Uj5Ubjo9zMlO37zN6t1/cdHmU9HP UlzM/0VYTkp57F/Zwdxb4upNU2pZa+FbVe9gUOvLzMrL0crQZl5vTkZa711i29nNx+FO78xJROdv TVzcbE9UZdH5TOu+0E/WwMpmZNHUV0NXZ1hOYejs4vXm3+Nv+udgXFxiX2hdXOfe/2vpfW908eDp 5eXc3Nr5ad3ZbFrn3mJf4fVPas/l+9Z7S1LsUkhh2srN3cy90ExT+E8/RlZs/19oztBXVNnYXW/N 1NzefGzuY01afV5QVldm8O3Zz8/Kv8X2U15jS0xLUcvPV9DB3F9+8lRTVePAxuPLu8tYVkw9Oz07 SWdVX87F2+rgZFhcX1TgxdXkwsHqf+LodVpOXOpaR1Te6VZb3c5tWuXc2edZe89bRt3FcEV7u663 w7uzvEc4OjUrKTA+U1jhwbu/yNj+V0pDRFXu2cy8srvJwsPkSUpRUUtGS1tdTlzpe1ldd3Tl1+77 9dPRd2dURF+ro7i6qKnWMy4sKSQiLVrYeMOwsLzTTz06NTE6Xse8t7OvsbW81mhWS0E+QEdOW2rn 0dhmT1deRz9J5tRcf7+2wvtWST+3nrhwq6O6Ly4rJyYiJjy8vMu6rqu8Py0yQzQvSLquuLmxrrPH Zl7dYT8/Sk5KSVb+2uxdWVpaTk5OUOTG2GrDuNM/RFE7rpu65aiguCwrJyIoIyI6ta27uqyrxTUq LjM3OEK4p6mzube92EI4S9NyRVbRz3Jbbt3mWEpOSj9BTWldZN7KxsW/40U+MzSpmLXXopyqMCQe HSchHTSwoqq5q6i5NR0dKDY8PruenKKuubjNOykqRvhLRd+6ucXT29DvPjEyOT4+TM+7ur69x/h+ UzgrKS2nkaOyn5mfNRwXFR4hHjKzm5uvr6y/LRgYHy/Sv7GfmJmpcFNGMCopOt+/vdHBtrjMSkNA OjAsLj3wy8a+trK1zEc9P1BGMComUJKNo62gnbMgFQ0QKjUoO6aTmLDMTjQnGhceWaahnpycnao+ JSAlKTHLr6yoq7toVEk0KywvOENFS+e+u77Av7/STDs+T1NITm3XXryTj6fQ279GHhcQFC/DyMqr m5+/QCokIyYsObaempymtcRuMyMgJzu8oaGuubbBNyonKSwzOz1fv73Nz760u9tbU09GSk1s0MbK TDatj5a9UNW7QB8VDxpNtLnCrZ6mzD0mHyEuS9quoJ6fp75ENjUwJio9z6SdqMr8xUorIiQrPehy Ws6yt8jUz9Pa3Ew+UM7JzsvTWS8ovZWXrs++rnMkFw4VL7euu6qeprhqKx0dL/jBrKOho6u6PyUn Mzc3T72voqCySDlJPS4oKjBD1s7b576zvtV37t9rXFJvz8fL+Fk5ISmikJmvuLPEOSIVDhhDraqp pKu7vHQlGR0yxKqfpK2vt+ssHiQ50LauqqWfqnAtKCkpLzQ5P/C+wM3q4OHT1Ofe0b++zWlX2thM NSQePJiNmKiuw1AtIBINF0Gonp6ludC98CUZGSnAn5ujsbq+3TQlJDa+qqWstLW5djAoKTVKVT43 SHfh7fPMvbu9w8nP/Uc/TGzl/E09NSkup5CTnq/dXjovHQ4RI7ufoam/Ts28TiQaH0+kmZ6ydUhn TzcpK+ionqCvy15JOC0tMkFVVkY9OTxQz7q7wcnAuMhLPVDY2d3+Rj09Kh4/lYyTna3LOi0lEAoP Jqubl52+abeyORgSHEielZutc9bLUjQlKUGvnqGvy1s+PEM8Ly42OTc4O0rJr6mtuMXRX0E+QVTy y8TrQDQpHi+bjZGZpLs+KyoVCw0Z0p6Vlqrbv7ZKHRMVI7GWk5y39U88PjInLNejnJ+r+DAwPkUz LCwuNT9j6dm9r6yxyGhBOjtG7srCxNtSQDEiJqePkJWftUkqLBkMDBEtrZiRm7G9udIoGBQYOZ6S k6C9WTc5NyghLrefm52sPigrOTwvKyUrRb+61c64ra262EY6PUbuxsDHfkk9OCseNZmOj5enwy0n JBAMDRdToJCPnbHDx0EeFREZapmPkqG9PjAzLyQeLbedlpmsMSMrOzotJyUv4rKxvsK9trO2zjou L0TLvL3cT0M+RzEfM52Qj5OfxykkIxUODRU1pY+Omq7L3DYfFxMYO56Qj5mwPCwvNSokLeWmmpim SiklKi80LyksVLSrr7/T18K3xFI6NkPivbvMZT4yMC8oMqORjpGdsy4fHhUODRIsq5OOk6C2zT0i GBMUJLGWj5Wiyj43MiogIji2n5mdskApKSwzNCwuP8+1sLXD39/PyMttQjtA6b285TkrKzk0MayT j4+ZpzweHhcQDhAg+ZyOj5muyEsoHBQSG1Cdk5OapsJEMisiIS1fs6Wdn7FEKSUnMDg3Nzp6va+u ve1M5bm2xkQzNlLFyFw3LjU3Mb+Yj4+Xp1sjIB0TDg4YM6iRj5eltL89JhoTFiS6nZaXnKfASzMo IiUtPsmnnZ+1QCwqNEM+LykvW7SprMRNVryvuGQyLjduwtZGNTY4KTSekI+RnrAvJCoWDwwPH0Cb kJOYo6fJMCIVEhYny6WYlZifsM0/LCMhIitqrJ6hrs9BP0U9LiMhKku3q6u0wMC9wdlKNzAyQerM 1FA/OCszpZSSk5ynVSYlFxEPER8ruJyXlJmbrDwoHBkZHi98rp+amp2jtEspJycoMjt0xritr7LJ QzMqKiwyT821rbK70+jU63pQQkpKXWNAODI/3H7Gp5yZmZ2uMR4dHB8kKi0rP72soZ+jtU86MTA0 Ojw4P+C3rKqstcPLy9J/UUhEQ0dFPz1AREFEVtW+ubnE+k5FSExi0sO9v81WPzs6QVjbx8O9wMy9 ub7J4+daSWVsX0w6Ny8uOUNZd9zR7eXHuK+sr75SNi8tMjxMzbqsp6usuOJFNDAsKzE7Vc/CvsbO 3VdZ7djP6OfiXWZdWVhY4t/XydXuW2rW1dDe7PdfanvXv7q8zG1mXE0/LygmLEPIsq61vsjO31ZE PDxOz7uys7nJb15h+31YTUZIUltaSUJCS3fYzt9mbuXPy83W/f37amFcbPfZycS/w8vfSzovMT1f y7+9urWzu+JGPkBMX1tNQj09QE1OS1Jsy724tr3K6mNWTl9s/NrNxcjS8EtCRU1eaGpbWGrb1PRs aWRZU1hOTl3exr64trzK/k0+PUldanvv7mpZUUZDSmXPv7e0u8nV7VhHPTg6P1PfycHJ3l1OS0tQ VmThzcXIzdryd/jr+3N29e317O/76uHiY1JKQ0dLYOPUysTG1XdcWWvi3dnV2vBaUk9LT1hy2s7L 0+RyV05NWH3x4s/Kwr7DzvpYSD49PkJUfdfU6vJq/t7c5GBfZ3Dk5Or1eebXzs7a6GhdaPLe1tlx VE5RVmR+dnP729PY6V5PTE1Zeuvl5N/Uz9Pb9GpeXmFpeW1pY/fPysXK2XxaZXJpWU5KR1H10MrP 32VOS01OU11z+enZ0dDU3+328dnT1tnyeH7o4HhkWFhkeO74dGludWlhW1dYWWDz29bS19/k5d/v X1ph7NjS0+9mcm1qYVZTT13q28/Oyszfa1RMSUxRVFdk/+jf393j7O/t/m5pbuzd1NbX1dfb6Xpf VlVUXXX4821qbWRt+/L+bG547t/l9nV37u30fnru5dza5e/7amJjYFlcZPLb1dLW3e50bmZjWk9N UV/02dHS3XdeW1dRUFVec9rNycbKz93ucGZlXl5cXnf58P5kX11kaF9fYXza0M7X6mRXWmR49+3m 4N/d2+H/bGFYVVtndO7l3NbU1Nv9YFpecH/q5vVtXllSUFRTWmN/3dfV1t3o7Ore3/P4dH756tze 3+X1aVhWWlZaaWptanX07uLh39/c3OXq7/HsenVwZnBqZF5YWV5q8efy9e3g1c/P2N7l6e9uXlRP TU9ZY3nw/X51b3ry7PLu8m5lZu3b2dHP1tzt+Whpb2BdWVpfY2929ezo6O/99evu+f3u7Ofo83Fr bXN8e29kXmBs7uDd3ODo6ubf3uP2a215/HBfWVJRVF5mZWNkbm90//Tk2tbT0tTb4env8Ojn6u1x X1pcZHJzamRhZG94b/Xt8Pb28310bXb76eHi4u94bWVmaWRdW23r2dDR0tna3eXyal5dZWtjX1lV UlRYWmzv7Ozm2d7r8nF5e+/l4d7l4t7c4en5c2xfXV1gYGNz7+Lf7PhuZGlufenh5+708u3t7nlj Wlpia3Lt49/Z19fb4OTu8/10amNfWVlXV1lYXGBgZnbz7u3q3tjb29/p6u3q597f6u3r7XdlXVpZ WFpcXm14ePLx7N7a293f6O7x+HZnZl9hbHZ++P/98eze2NfY3ODl93BjWFRQU1ZcZ2558/9nZ255 dvrk4N/f5e/y5enm4N/f3N/r/G9ucvlvXllWVVheX15ga/Xh3t3a2Nfb3+Xwfm9saF9fZGVz8+DW 0crM09rza1VPTEpNTVJVWV9x+3v27eve2tvk6OL28ePj4ODa2Nbb7Pp7a2BqX1heYmRjaG1lZGRs /ern6Ojq5d/d3+10bWllY2ZpbG/z6N/Y0cvO0trxb19aUk5OTk9PVFtj8+Hd4uLi7O93df/t6e3i 29fS0NTe6+56b2NfW1lYVlZTV15fam7+7ufb2djY3N7h4uxyX11dW19lafjf0czJx8nLz+BuVExH RERESEhNVl774Nnd3t3j4ejh39zW1dPV2drb4ufi+GphWVlaW1hSU1hdX2tw9+Pl5N3b29jY297n 9m5jXlxaV1xhbe7f1M7Jx8XGzNlrT0Y/PDw9Q0xd8t3Y1dbW1tff6+7t49rY1NTb3d/l6e1+bmdm YFhUUVJUVldaXWt+7d3Uz8/R09Xc4et7Z1pZWVZVWFpdZvLazcjCv7/DythrTD87OTo8P0dSa9/P zMvLzdLZ3+fn5eLg3NbT1dnb3+t9al9bU01NT1FSVFhZXGRy5t3a2NbR0NLU0tXd621cVU5LS01X ftjIwL69vr/Gz/NKPTY0NDY6P0te4tDLyMfGyMvP197n39zZ19bW2tvf5+z+aVhOSkhGRkhKT1hh 9t3W08/Ozc3Oz9HU3Oh7X1RNSkpKTl7t0Ma/vLu7vsfUdEs7NDAwNDk/Smbay8XDwcTIzNLX4ujp 5NnV0NPW2d3h9G5dU01JRkVGRUhNUl9x6tvVzcvLycjIy8/b7mdUTEhJSU1f5s7EvLm5ub3H3VVA NzAtLS40PEt4zsG8urq9wcjO2ejv9+Xa1M7NzNTfeVxUTEhDQkJDRklPVmX24dnW0s/MycfGyc3T 4H5aTUlITFRu2su/ure3ur7KdEY4LyspKSwxO07fw7q1s7S3u7/Gz9nf39vWz87S3fpcTUdDQUFA QEFESEtQWGFw6djOyMO/vr/Bx87ealFJSUpSc9XGvLe2uL3J80o6MCwqKisuND5W17+4s7CvsbW6 v8rW5O16b3d0aFtSTUxMTExNTE1NTE1OT1RYXXDm08nCv7/DzOH+fmf408W+ubS1tbvLaz4vKSUj IycsOVTMubGurq+zu8LP3v1rZ2ft49zb3t75Y1lYVFNVUE9MSkpISElMT1Zs6M7EwL7Cy+Dv7PjP v7evrayuscFbOyohHRwdHyg0cbqtpqSlqa25z2ZCPjw/TW7NxLu6vcDU/FNFPjs7Oj0+QEdLWXPb 0cvFycXH0O5OTl70yLisqKajqK2+Qy0gGhgYGyAtTruqpKKkqrXFakA9OT5JX83BtrSxr7W4xepS PTYvLSwsLjE7S+nFurS0tb3I60Q2NkprvaujnZ2dpbLuKx8YFRYZIjLZr6aipau87TsyLy87QPvJ vK+uqqqrrLW62kw8Ly0pKCotNkPqxLeztLrL+j4wLDb+vaWdl5eboL0+IRYUEBQbKturnpucorFh MichJio2UOa4tq+usK2zsLS9vu1UPjQxLS8xOENb2si/xs5qTzssMVG8pZuUkpadtzQdEA4OERwv uqGamJymxTglHx4jLku+r6eipaauvd1AOjQ5PUZ3+dTY73dQTURFRkhVVF5RPTJHt6ialJGSnrQr GRAMDxQeR7Oem5ufq9g0JB4eHyxEwaehmpmdo8BAKSAhJDROyba3uMToTz82Mzc7Slrk3UY9xaWb k5GRmbY8GxMQDhccKF/BqaOlpa7fOCIdHB44xaWYmJSZpbk2KiEhKS1AT3fIyr6+yus/LysqLj/v ubfRbbeknJSTkJm2OhgRDw4ZITe6sqmqu75YMCsfHyEm1K6clJaUnK3SLCcjJjA0Tl5gx8/Gw2VP NistLThQ0LvhOl2rnJCOjpGtNBkOEBAaKzjeyb6vr6+u3jEeFhgaMKmbkJOZnsdPOTZRRl5BMjgy SdfPvd8+MigpMj/LuLnKLzqsnY6Mj5K9JxgOFRYdMStDWNenpaWpRCQXERskv5qXk52ttVPk6vvP Ozg0MFX0wbtuTDIrLCs2P1DUy8NFMq2ZkYuQlKMpIhUWGxUfISRjz6eerrI6HRwWIUHJnJybna+o tb+9Q0U4M0JH92JKTjw/RDpCNi41MkDfzdEx3ZuUiouSlT8fFw8aGB0tJ07EvqGueUEZFxcZQL2d lpuZpayr0tNCMUE+17zFvkMwLig0NTM6MjtCVr3ATSlPm5OJi5OZNB8ZEx0aHSkiUK+unKtZORYW Fxk6f6Wdn5men6G85z4wUNm8vO5KMDExLz8vKiopOXe+sL83J7iWjoeNl6oiHhobIBgcHyDJq6Kb yTslFh4dKk9PsK6jmp6cpclmOUbIvLr4TD0yQDYxLyEkKDLYu664PyrvmI+Kjp2pLycxJScbFB0e RKaupeQkLRwlMihOPVGwr52dqKO7vbLLrbrY2jVIOzJGKionHyopMnXNv1Q3pJCNipanvyYtNi0p GhkjMbijtscuHScgJzMqP+a/qq2rrcyzsq+isrGzzLveXT0oKiosNywrKSQ498d5NaWPjYqWpcEk Ki4qJRobKkqtobLsLB0jIiEpLT+1qaWpxN1N0a6tpqu4rrCys1UwJiErLzIyKCooNM3KUzCsjoyJ k63KJCczKiEZGizRp56vViodISEfHypBtJ+jqsFIV7+sqau1uLKnqLduJR8kK0E3LCklLUnO2C4u no2KipqtSScxMSwaFR0ut6Glvj4qJygjHBspU6mdp8BXPN+rqay0vq6jnqTCNh8gLDIzKSAlLkvA 1zMfQ5KKiI+swi84UzAjExcs0aOhvz8xLzkoHRYaP66cnsFDPW24qrXcz7Shm52vVzEqLzErIx8j Lk7X8TknJayNi4ybubL0zzMbFhImv62puT9N1k4uGBMWKbCiorpHW7y0vtpNzKudnKKsyMxVNike HiIrNzY1Q09PPTekkI+PnKqsflonGBYWLMCyq7Lav8c8IRQUGzK2rKu4yLa20m9Z0LCpoqanprC4 OyYlICcpJiksOdXI+jYtoI6PkKayprrBJxURFjm0u7nH2quuSB4RExw+u7u3u7msr+Nh9cGuraqt pqOwvzUnKSkqJiMoNl7A7josMpqNk5evrJ2t3B0SFR18xDpPz7OfrDYbFBokQE9XwbSvrLDRxsG9 uLOrrKWpu+k3LS4uKSQjKjhe2lg8Mjygj5aZoKibqmYgFRkfOFUuOry0pK04IBofJS45NWy2tK6u v7ays7K2rK6prMhiOTAxMCwlJC06TWdFOztGu5iVnJmgnqDJNRsbICY8Mizvu7KvYy4kJSorMC80 3769r7Cwq6urrausrrPfQjcwLzAwKiw5QkdDPj0/SkmymZmZmqSirMQ/JCAeIzItM1FM3M1hRy8v MTM6MTJDUcqwrquqpqKkpq6/ZTszLy4vNjg7Sk9YUU9RRUVCTtaxoaKqrayrr7x3Ojk8Pz81Kycs LjtIPT5BSUVDRUFizce8s62mpKert8pNPTo0Nz07PlFOV1hNQDk5Ok7m1Lmsr7Ooo6errbW7uc9I MychIyUjKC0yPFdJOjlEZ83Bxr6xqKSkp7G6yGBPRTw9PT9S+HRJPTQuMzg+R0rWtbayqKSmpqKl q6/JTjgrJSIgHyItMzdGQDw/T+Ppa/7Yuqunp6u0uLu+xdpcQ0BMX2FJOTAuLzM4PUZP3K+ttrCq qKaipKuvvd5ZNCYhHyAjKi4vOjw+S1d7ZlJX2r+zrayssbS3uLe+y/VWZO98SzgvKysuMDY+UnDN s660sqmlpqaorLC51EcvJiQmJiUoLDE4PUBETFlaXW3Yv7eyr7G0t7Svs7rH3fPc1WdENi0sLS4z O0ZYYfa/r7CyqaepqKessbnsQTQqJyclIyguLzM4O0JRXWH56dXCuLOys7W0rq2wucTO087zTT0x LS0uMTQ6QEJFTcmvsbCppqakpaqxut1FNyomJiUmKi0uMjg7QUpRZODm38m9t7a3ta+rq6+2vr/D 1lo9My8uLjAyNTs/R0pLf7utraynp6inqa63y085LiknKSgoLC4vMzY5PUr6z8bP1L+9vLavra6v srSytL3YQzg5NTEuLi81PUNGRkpaz7Str62opqepq7K+1Uc3LyspKSgoKi4vMDQ2P2DTx8zV0L6z sa+xtrSvra+3wuRaTkI6MSwuMjY6OztFW+zf4r6urq2oqKurq6+7zU47MysoKSgnKSwsLzc+TG3k 0sS/vLe2t7WxsbKytrq9xtZnSD47ODQyMzU4PkVLWm195MexrbGtqaqrq622weZCNi4pJyYkJCku LzQ6QVnUwr28vr63sbCvsbW3t7q/yuJbTUQ8NjMzNjk8QUlMWuji49vBsrKwqqmrrK2wvM5YPC8p JSYnJygsLS86RVfexb28vb22srGwsba7vLzCy91mTkA7Ojc3ODs+RE9ZXPjl7urdv7CxsKurra2u tcTmRzcuKSYmJSYrLzI2P0tc18G6trq6tbKzs7W6v8DF0O1bTEdFQD89OTtCTE5VWFRh5NbS2ti8 sLCuq66ztLa/z188MCwpKCkpKSwyNjpFVeq/tbi6uLi4tLa7vL7IzNRwXWFXTU1LRUVGRUhMTU9X XGbf2Ob22Lu1ubSvsbWztL7UZj80LispKSgpLTU4PE1f2ruztbm6vLu4u8LI0dzX2vtmd2xm+VxH RUlLT1VSTVVge9nU5Xp9z7q5vru4u7m1us7oWz42MSwpKiwuNTw9RWjaxrq5vLy7vLy7wMvO1+vi 8WJcX2//8mhUT1RcY1tOTE5Yaeza2PNZb8e9xMC6u7q2t8DT51Q+OTIsKy0uMzk8PEVo2MW8vb27 ubu+wtDq7N7d6OXf3NPS0dtrV1daVE9OSkdLVV5ieuzzaVf0xMLHvLe8wr2+ztjcXUY9NzAwMjE2 Ozw+TvLZyL6+wsXGyMvMz9PTz8rM1djY297Z2fFfWE9MS0pIRklOUFv35OvvaFjXwMvIurzEvba9 zMrjTEY+NC8wLzE6PjxBWPjXwb3FysjGxsbN3drQysbGztnQztjhcU9MTElHR0lJTFNXXfDd5+rt X1nQwtDMvL7Ivri+ycfQVUdANS8vMDI5PT5DVf3Rv77Gx8fLzMvQ3drOysfHztTS0dnb6ldMTUtJ TU1JSlBRWG5qWVxfX9TAx8a7u8G+uLzGyNZVR0A3MTIzNDo/QEdZfdrFws3X09ve0NDd2s3HxMHI 09nW2ufwX0xNUk5PUU1MVV5aXnBz79bU7E9WzcTOxbrB0MC3v8zOckI+PzgyMjM4RlVMSlFXfcjA z+ba1dfKxMvUzcbDw8fO1dra2udbSkhKSkxLRkZJTlpz7/Tj19PaZ/jFyNjDvMnTv7zHyMtoRUY/ NzY3NThDSkRIU1Zm0srU5Onh08jFxcTDwb6+xcrP4PHuclVMSUZHT1VMS09VX/jh5Orj3tvZ6lxL VuHn8s/FyMm+u7/FyttVSUM7Nzc4Oj0/QENLVvjQzM3LxcTCwMDDxsfIzNPc3eR0Z3FlWVtiXVNR Uk5NTU1PVl9hb+fd3N3b2dve4Ot8d2/73tjb2M/Pz8/T4m5fWk5GQ0JBQUZMTlFf9uDVzMjIyszM z9XW2ebr3Nzi493f4el0ZF1WUVJQTElJS05SW27p3NbOysvLy87T1dz2aGddUlBTUE9WXF5v937t 4Nzf4+Pr8+rk5+33/O7i3+Hf5nxjbdPPb1RRUFZSSk1dau/p8NvQ2NfY2ttoXvd8detq/+//63zl 4+Xn9G5ea19TV2NaWn1zeXjz3/DZ197e2ux54H784nny5PHu7H586mFiaFdST1taWV997Pfa2drX 2djde1//Ym7vXG133u5g4djj/ubf+Wnz91pffWVcYF1fXXvl49zl3urk4+fd39f8c/BeYGhhen1f XVlUV1/r6fna1/Hz39Xf8u7/e1hacWNkYXXf4+/e19/d1uTrbmheT1hYWlpbZnDscPHt4Nrh3+LZ 3Nnb2t5v//NYY/xZX19eZF1hbHz892p8/Hrue+Lb+93c39jk7e9q6WRe8V1q/nF3ZmF27nR3Yu3g /n905ej1YV/ialtldeDh3Nvi29DsZ+ViWl5QWFpkdft6euDa2d/x6O3d52Fyfl1gb21oavbmaO/e 7u3+6fH6d3L1amleavxtZXp/3eD56Gvn6lvfcm/u6917+N5yY+VpZv1n5m35fvTecHhsY3nxX3Bn /vhh5uLm8Pji4vD883du5eJwcHFuaWdkYX77++h0au/q7W3x92b7b33o5WR63ffd7mX04Hb2/V72 d+tvbuj89G5mW3Fnce1laXftcv/m7u3p4e/o2G1r89/w/3hhX2zrYm7tZe1mWvN0aHfv5//f1d/m 7OzfbFtybW1ebNfn6Wxv2+/t7mhne/1iWW5gXWtldvVjbN/b6d3c5Ovp7OP8beB8bXJveXJucWdh cu7vZfrxc29y/XzsfWnq3exfaeLscPfd/vrh9flq7uR+829q6l5Q+Gxab2tpc+Tva+Xi7N7zdu/V 3XRp5ex23F1cfWzrW138e3xbbuLc7mfs+3vq6+tsdfny92zv9Xjm+uzubd/8XHTocmF9b+z8e3Jv 7Wz55f7r9+f8X/T0bmZr/P7vbu54aHTr3njx72719+1vaOXvXWZ86/938Gb31vJc+el9b2/03uBu WHfj6edtYd7j6m1ffmx0ZGb3/mhm+Nza5Wlv5OttZfn/eXj+4/1zbXzr7mhmenZoau3j8uvf7ers 5uhfad94W3jz835ne3lyb/txZW359WR44vZk99bc3vt4bG/ue3hx8WRf6Ohz9/P69/rweWV9+mZ/ //v3av796O3u7mb87mxl7G5kdv1xbu7s7Xru7fbw++XsePnnaW1rYOH8aO9yev/7cnNz6upp7uht Zu/nfPr0e+b6YX108+/h8HHh5/1y6P9eb237bGJz7+f7Ymh34+H56/d3e3luWHbfeube63507P1x e3dnev5p93j29Gx3dmd+7vDw+u72b+/pemn2+vXnbfr6+eZ1a3H77GZlbPXg4ext7fPw/F9obuzy fm378XhlXujicmpv7uDc9v/x4/B/9Fxk/nxvc+10X2jk5HNgdt7g5Xty9ux0+2Zp+fTd+W1/bGj5 3/VxYPb679jg7G53a3t9amtsYW/c711pfW57e293+fL67/X4/ejq49j9eeXt9nL36/VcWvv2bWJn bXjmal744+F7Z3ft3Ov462X65vPu82xfc+bobnNZXd/6X2X/6+/x3drpdWv28expaHJn8/Px8/1u 99/zdvHw/mHw7mpqbOjo83lu6/v+6fVlbXX3bl5z7eF3a2py7PdpZfHf3OX6+fZ6b+9+cf7/X23j +X3ufOflYWV47v5oePby7HZtdu/5eWtofW/o2+379eptcO9rfel2ZW3r4/V6b373+nj96nx8bWT3 b2Ft7+jtfHHp3X9x//vq8Pd5dHh4am7x6fN29/H6c3D0f2nq6Wlxdfv36u509fd7/floZWpmYWfv 6u198t7f7ezr6O99f3XweP3yfu/2aGB+a2hqZHxzbGt8/n7q7Pb87OHr+fv0em5xbWhfeejx7f7z +nrp6vp6//D8bHru6+r4/Pfu7vhue21c8PVta2lqdv9t9Obs5+frfn7zenpyZHh6d/d+9e3n+P11 bXV183dqb29u6+f08+Pb3+Xl72dnaGVuaGhjb37q6/vt7fh6a2Z1dG547+/18Pbt7+7/aP/w+3N7 /fX9/HRtdXT09nz+d3p77eLu+fx5fG909/p77f7w+XL6ann4d/fw9/Ptc3x95OhvdWhra3329Ozz 7Ofq8fL5bWZrZ15fZWp7fvzv7evy79/m6e/+6ef18fx3fGtxd2t38vVoa3V6cGNwZ29wa/r1493a 3OPe5OlubPlpXWJrcXRz+/d69/1wfHh0fnh3/Pn3+fv06+j3+/VzfHJ6fm3r6XNue+/t6en3/X52 aGdudfh99Pn7+nV1cXptb/jv8vn3evTl6ur49ux7bGZqdXv6fGt2+ffw5ePm6e3t/HlwZGZmaGRo c3xrb+/u7PL27+/18Ovq5eby6/Tu+G5+amdwbm1teW9qbWloZnD++Obr6uv77Ozl6XR6cW1w+/59 7fDx/v9+dXdyfPjs8nVudm9z8/Ps5uLj9vr2bWhzcXFsdnn29H94a3T4/m9ubmV27vXp4OLof/bu +e/0/vf+8G5r9fx29v12dnBtcXxvfO/5/e3mfG93a2d0cnt5b3r0/PLm6urw+u3vfnl0/+18dGpf a2xp7Obr6fL2fvrp7vn7/XVqc3J9//z39372+Hhxbfzq7PPr9/pvbf1yfnlzdHj+fPd3/vhzb/78 9/Hy8Pnt5Oft7+z7aG5vanFxbW1zamx98Ojt6u72e2198/jx6OXo7floaWxveXp6dHZtb3p77/t8 +330+O/0d/V+dvX+ff528/v27urq7O78fWVxfnV6anl3dG1sfv3v/fXv+PH1/Ht1dvt8dX53c/f3 7unu+XB89/j99P15c2V+9frp7f58fvn9eHZtefd++fLr6ez5dHJzbGx0/f/y7nZ69nx5//f9fm1z 8O3r9PLw+e/t7O35cWhnY2dnbHV3dXZxdXt/+Xvy7vDm6ujg5vj5+f52bnlzbnR5+/tva3f5+fDr +/P8fPD9fff5/nT+/WhnbG798PLs5e7u9vl+e/V7c3Nub3p8+/j79e3xeHN4//nx9/5y/fb9f3F1 eHV9ffnz9/Tq7fp9e354ff1z/vX38f10eHd8dnR4d/336/L/9vD2/nJobWpueXnv8ff7/vDp6fL7 8e3w/H/6eWhvbm54fHhwe3v3+nv8ef1+fvHt7Ozt8O7z/vL+eP1tbm5scm1ocvb4/X3/evTt7Ort 7O3v/X13/XR68XzzcnF7cm5tfHJ1/Xt4ePn++vX87ezu7u7u9P7+/nhxb310c/72+X51ffpydH1z +/z87vD0+e3u+Pz+eXV5c/n4/Pfw+Gxwb2d4+XhudHhpdPT08enm6+n3+uPl6vVyamZmZnPt9O/7 eHt893rs6vj4dWlrdWlmanP09uzv7uro5+vv+fx0/3137/N5cn7/9/N9evPuemhpbHVua3z29fz7 /fv9/vLq6/V6fHN48Pd+efz4+/n17PD78PN7cWpmamhjaWtsaW739fX76+Dl7O/v6+nt5OXw7Pj/ fnN5cmZqb2xsaGVma3NlZfru59/n7uru+fTp4eXm9Xf89ntzfHRybWJmffV5enBtcGx2bG/48+/o 7e3l7e/08u96dXN8+3dvaG307nr27Xp+fnz/7uXs7/97eWhzd3J0dWpu/X55ev9wa/rye+3z7uP2 7fR18Obv9+v7+fV9fmxreG5qb2toZWh4dXju6ePo8O3z62978fTzePTm4fb182hz+fZrY2ZiaWv2 7vd1/+bx7Ozv7vf4bm1qbPJ9d+72/Onq+n15fvdz+vf8fHR9anP2dv7y/u/u+3t99nPy6vX4X2Jh Y25p9vbn6vDd6PHu6H1t5+/593Jrdmt18W9u7vxv93xza2hxd+5wde396un47H/v4+rd821vYHTo ZXluWe3t+3Jrd2Xr42pl+fzr3fh36eHc7Gv4fGZpXvXeZl/1b27h5nzb0e5nXF964mxMV2p25Nvp 59beftzbal9WWGb3Z2Le09jaeWBpaVxXaVte9HTb1M/X7OH6ffdfX11eferpeW7u9ujg+XlpXlZR WVleaG3m2NLLzNHf73FWTEE7QFfJt66rrbG4yG0+MSsnKC06W8+/vcTP6GJRSU9YaufWy8rJxcbG zNbZfl9hUU1KPS8iIMWbl42NnL4iFhIPEx0iLM2km5OPkqE1GA4MFCe4npqaoKuzvt06LScmMErV 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 iIyNoSwcDhAXGTc/76aekY2Oj6U7Gw0OFR9SuqikqaWsvd03KyMfJis4y7Wsqa6wvHxGIRo/v6uO jZCVtmkjExkPDBIPHz+sjo2KjJ/OHA8QDhsrL8GsnI+NjJGhVRoPDQ8bMbynoqCossL+TzQoIh4f KFKuoJucn61gMx0SGj3BmoqMjZCqPxgODQgJDxIkrZaKhomOpSsaDgsRGCHaqJmRjo2TnrUoFhAP FSNNs6ajpa7DYTQoKSgpMkbDqZ+dn6zHPCckHBUpuKeOiI2OnNYrEw0LBwsRGlKflY2LjpOmQyAU EhcbJEm9qJmVk5ScqPwhHRcUHig9u7Cqr7/HRDxVRUlKP0dcz7yyrrO/9kAyLSgpVrSrlo+TkZ3n JxIMCwoPGSPCoZqRkJOXorlAHxcVFBw1x6OYl5abqrw4JiYgJCotRezGtLa5wU4zKSUqPMyvpKOo rL5rTz06ODc9NCk6vbmej5SXnVokFg8REBYpM060sKmenZubo6vJLywnHicsLUZs0LKtpZ6kpafH SjckHx8fIigvQl3BrKijn6Stvl08NDY/UPPPy+pOPTUvKik6y7efl5mZnLFJIxkXExUcIza/q5+b mpugrLlOKyIeHCEqNdSuo52doKi62EszLCglJSgxRHDPxb67ta2srrC/ZDwzNzhAaWNXSj06O0rk yruvrbS3w0k9Rj09bMm+uLW63klNTUBHSDQsLCwuOe69s6uprK+3yGxOPjk7QFDt1tDNyL67wcrZ SD06Mjc8RGDzz83v2cng2tB8W11s/dO+urq3uspgRz40NDc4RV7axMXFxdLT31VKPjk9RV7Pv7m0 tLi8xt9mXU9IRTo2OT9c2czKz87T8PpeVlxUWGf6a1FcWGTSxr66vsfY69zc5v5QPzIvNT5hyLq2 s7e/0FtFPDo8Pkpm18nHysPL1cTJy89URD06P0BGXFvfz8/Fwb2+xM3/aFNDREM/PTk/V2jDur25 vr6+0c7dZV1LRUNDR01PXFt25PLM0tbXddtxWXRjbmhUXVFe0c/HxsjE0M/RXEk/ODk8RFTxycLA vb/GydL3U0xORj9JUmns0sC+wczfaVJNRkRJX9/b7WNNSE9KTvDaxbq5ur/U4/peT0RNSUVfXmzd 08zV2NHvU05GP0NZ/uXNyM3L3PvnaHXm+9ri5/9hblhpek5u6eTV29vdaunmZVlKPzw/S2Xa0726 v7y+yeBcT25LO0JHSF/Sxry7v85iPjg9PkBM9MzFwsTW8d9xVGPcfVTj3uDb9OxtdVpg7mN79Wdf 5tDSzth8a2lHQk9KU+LkzcnS1+5zX1JXZfTbzdPa3d3rW1vc2mhWWU1Pa1VPXurq1cTN1f1UVGpw atvQ0tzeeVNaZ2jt1d7U/1/na3ZsSElMTVl24Ovo0NHg0sjV1NDucllYWUdLZe/i4t/X2N38V1dm WlZr5dfnZe3r2t107uhyWVlcVGh7etrY1M7P3PpZVlJOWlr42NPI0uhpUE9UU1xTWNve18rJy+Hm 3OZbUVVTTlv/cvnr3NPdef5dVlBe9ejV0tDQ1+lrZVpRWXb84/Dq3n55bGZabe5fVFnv8+nPzdjZ 5/p7X1xOUlpd6NbPy8/k+GJWT09WXGnm4NvU297meHltX19q9+p+5flh7+je5mlhV1d77njm5Orn 6Op5YmNudHv67nNv3Ojk6W5zcH5xbHFgbO3p7d/a2/JdZXZtfG5sZWF3+mp27/jrem//5efl3d7f 4PPz92htYFxhX25sY/HueOnn5+fu+WFt/2hyanr0+/7r4eze29vtZGNea/X0aGJbWuXY1tXg72lb X19YZ2tu+2xp+OPd3up57Pb6fXVwdPvr3Njl/Pn9ZV1gbfZ08/b49W3q7O/r+mpXVVtp9ube2Nfd 5/L3/GprXVNrb3nu59/t5+Z1aWdpbvDn+HB97uL1b2NpdHnf3+nU1+z4eXpkV1JTWmNode3n4eDl 5+DceXB7a2ltanHw8u/w5dr5c3tydWFibmpv6Ox94uTv/n3q3+lnX3VobHZeZG/8fOre7uzk8fvt fGFiYmh193z04Ojp3+j8b2589HRn7+z87u9zb/x7cHh3X1pt6Ojt397q63BgY2V+eG95+n1mfdzh 3tb1aXDw8Hzl8PZ2Xm1vZmBhbG/+6Pf13fH76v91/u33fPteZXzyffDe5e9bYG9p7W1icuvs/dbk 5932fGJvfV9nXWrw9/515OXf8m7s1d9q7OVtZGlmXG1hY+z4+3hved7YfWNq/vn3dfTq+X9v4OHn 5W9nbXlpbnT18V9n5Nj999/p7XlqZHLq9m1/93BtamfxcV5eZ3B88+Xa1ttma9vtb3xz7en3YGPv 52lifP3uX1Rw99/dbnf773Nfdn189/zt4N3f6ODb5fhmYmdhaG5paG/17PN5Z2Px5n369+/v5N3o 831rbWx5+nJvdvh/aWhyeunk6X1z/Glw8nxxfufl8/fw83trYGRv/XFs8+bn+fLyePvj3+Pn7/Z5 cm5raW/+9XBeUUVDTl/dwLexsLW92E0+NjMzNjxFTWrg1MjGx83fdmBWVl5ibG518/ni2NPMzNDZ 72laTEddzL6yqqipr79sMyciHh8iKTZM07WtqqeprbXF6Ek6NTIzOUd1y724tri7wtdbQzkzMTE1 PEv+z8O9u7m6vL/J13hRQj5Uzb6up6ansclPKyIeHBwfJTRHzK+rqKWoqbHC3Ek5NjQ3PErZwruy sLK3w95KODAtLS81P1rYw7y7uLm9xNh5VkY8OEvNu6qhn5+qul0pHhoYGhwkOFO9qqaipKeosshs Oy4pJysxQ8Ovp6Kipa3AXjcqJSMkKC5A47+yrq6wucDM+F9LPTo2Li9PvKufm5mcrMk4HhkWFhod KlLOrqWgnaGmqr9RNSgjHyArOtGrn5uanKKwXTIlHh0eIy091LavrK60vttcUk1PTkZBPTo1MmKv pZyYl5mq6DIdFhMUGh4r3bWnn52corLLOiUeGx4mMdWqnpqYmZymulsuIR0dHyQvW7yxra+50kk7 NzU6QlPlz8TCxsnWVzxMuqyinZuaqPg0HxcUExsjLO2wpZ6foafKPCkfHh8nRL6onZqZnaax3zYr JSQoKzdkwbSwtr7+Oi8rLTQ8UtbMwry4s7bA4EQyJiRFq5uTkpKZxCcZERAQFSU46a2knJqgprs0 IxkXHShlp5yWlp2owUAyKycpLDdXxq+oqK7MNicgHyUuSsm+vLm6trOytMhHMyonJSrEm5GOkpqk PhsUERUYGCQ9yaifmpWcrj4dFxYYKcejmZqeoa3HYkFBOikmKDe9p56dqPEqGxkeJzx62sfBva+p pqi47j0sJictTNVe0KaYkpSdp8wiEw8RGh8nS7elnp+gorQ+HxgaIjLJpZuZnKm0yD0tJyYuNkW+ qp+frvwxJCEjKTlKSlDmuauqrrnUSTg4StzN61pZRy4p2pyRkJy1WCYaGBojLyssPryin6Klslsm GhwpTLispaGmrs1KPi4pLDzAq6mmp625WzMrIx8fIi5Xv62prLPB0Nfl/Pff2HRMPzk2NSwkOqSS jZGiuz8kHRscIyMhKUKtnZyfq9cuHhsiNsi1t7e5ubW4uLvP5uHfzdNledTP3UgzLi4uMz9ky8fH wr++wc98VFBg3szYTTgvMDIvLt+cjoySpt86Jh0aGBodIC3NpZybo7hVLyMfISxKwbatp6OlrL5b OjExQM+6trm4tbreOSkkJikvP/2/ub3EyMTDzOH/3c3dTzovLjQ9SEB6o5KNj5y9PSgbFhMUGiMx zqOZmJ2tUSwfGh0nO8KsqKSipKmyz0c2LzRSv7S0vczdXj8yLSssLTJIyrWyuszc393qb/zr5HpM QkNDQ0pdZ8Sjl5OYq0UsJB4eISUtMjM90K+nqLR3PTIrLDp2ua61vr++u7i9zN9aSl7Sxcp7SUdY WExHPDUzNDxpyMXXX17awbu7vMHUXkU+P0JET+DXauKwop6jt3dJOS8vMzc4MSoqOH7Bu7zAyPRJ TPTJwMPeUUhHTe3Fu7i9zM2/urq/11Q/NzIyNDg9R1flyMPHzNHS1djh9nZjWlJMRkZNVF14fnPE rqmqs9D77F5ZeujmXT80ND9OTkQ3Mjc8RvfCuLa+7kpJWODKxcrW1sa4r662vs9lSTw4OT5AQkdN UU9IP0JW+N3V1s/M2HRaUVNcfdPHyM29r62wv97b2HxeaNzbVzwxMTk5MC0uNkNd2cC3t8DbX1hq 28q9uLzGyL2zs8B4VlxeT0hJTUxBPDs+Pjw4OUJb5M7Cu7i5vcTaVUVBR1Vretq7rrG7xb+1tr7M 6lU5KygqMDk6ODtCT2vXxr/D0+91eeTOwby8xNHPv7i5wc/U1NntY1VJPTYwMDI3O0BLV//VysO/ v8HI1+9jWWT628/P5mbLubzFyb2yuMPK3F8/LissLzU3Nz1HTl3eycDEzNPc4tjSzMfKzc/SyL25 ucDP4u1gTUdIRj86OTs+QUVHS1bnyMLEzNbj7u3q+2574t3c52r8v7K0urm1uM7t6lk/My0uMDQ8 QUJBQ1Hi1M/L0uLm3NTSz8a+vsHIzczJzNbd1M3Mzc3fUD84MzAwNDk/TGzYycbIx8rP2+Dk6O7w 5/VlXlpRd7Snqq6ytr5aSEs0KyYlLDE7V3zdzMvGyfxo927s4d3V3c++uru/ytLfetjHzN1dXd3Z 9Ek3MzE0PD9ESk95zMC/yMzLycXK32VSU1VNTmrX30vQoJ2orsC+xkQ7IRwgHy4xMHDTr6mvr9dP WkFLPTv92ryvsa6yt7nYXks7PTo9b8fEzOZlSjw2LzA6P05vzLqvrbS9yO1MPjw7PUtl7t/Pw8nJ vcs+MLier73FxrZePCQfMC87OjPZtquzzMVYPzoyOD/4v7y5s7CwuMfpXVtHPkZITlnLwmB35XdR Ozg3SfH51MrKxL7MZmFyT0BJTmPVzcnGwMJ6SkdJQiwypJ+zs7OnrvEtHCguKy8uQ7ypsNC9vFs5 Li08adrSu62sr77abWdePDxLadp03d3cwdpuV05WSj44Qmbca9zAvbvU7vRzVUJDSGvb62nTw9pT QDxESzYuqpilq62prUopGyIzKi4+6q2otdPKuT0nJypH2dbLs6asu9dLVlQ8MzzTv8DA12HAvFk/ QvVoUDw91czbWtbGur1gTmn4QD0+QlhuV1nNy2tPXllNSEZMOLWUna2usKhDJx0cOi8uRlyvqbDP RM9NKCUnQ8jAu7SpqrplPUdIPz9dvrSyw+7Q4kM8z1A77svVaGRNYdxVRdS/6VxIQ0xnRTlH1c3W 7trCyd5QTEtFTE4+XJuTqLK6r8QoHxkkPS8/bsCprLtQQ1stIyc3v7Gvr7GttHM4Mz9V9dTKtK23 z1tLQjQvUfTdx9DM+mFIQk5GY8rSXWXT8VFnSEr57m1d587KzN1aZldLUlhZTaiWo7zKzdUtJR8k UUtL4cq1uco/Lz01Kiw/vKyrrbS3vl8+O0rdw77Du7fFXkI8NDFuyE1pw8hMOTk9fdZd3bm6zPBd TV9uREfs0trd7uPZ4FlEPj1FZWBHtJaatNTixz0qHx8/22zj9c63ulguMjovMD7csaqstsXG3kND SnvCurnBy9ZMRkQ3Nkq8xUtp+VpIPD9jvrvYyMXwYEtGS9zI3Ojd3ntUSEdGWF1FP0Lnxsxespid ulddy0AyJiM+5tTcTe7GwlovMTk8P1fFtK6yxmJQTEtOXtW8tbjE3WhaWk5JREzOuHc5XNdeP0JM 4sHN3t/cXWL6T1jW7E5OblRFaM/NztpURUpdYGb3XqmYor1l1vExLiIjNXW9x87R1MtbNC0vN0nN trW6tLjWS0ZPWs7EysK+xexebVxPRj1Kv8Y3Mmm7xWZLUM3A7kNCTP7M1l/lxdBWTE1ESm/V0dLg V09wXE1YfWrInJms0ENVOzEqHShXtrC/eVjh1EguLS9Ay7izuri52FdFPkbfurm9ub3M3VtCOj9J Oz3g2UxLw7bD5kQ+S3hbSGXJu7W7e05aTj03PUn0wsnT19bcVEQ7QuXP4quZoL1ZSToxLyclOr60 t8Z2Wk9HNC4vOF+9rq+6vsRkQ0REWcW2srS2x1dFPTs6PUdLTeK+y2LXv8xQPTc8WczIxLu8v9Zc Rjw8PkBO7dLY28zUX0o/Rl7gy8K5pZ6ty046OjQ3LixI1Lq83FQ/Rkc8OTVD27ywtL7Na1NOWFz+ wbeytMP+SkZCPDo9RV/OfUdnxbnE7kg8UeTV5NXHw8LXWkI/R05YVldRWm/649/iWk1f2ci/w7Sp rLHRQDctPTw4QEbGxsTWQj85Pj8+TFHPua+0y29NXHllfNu8s7S79UlAPj89REpKWevT19DHzN9u XExLZt/RycjYbWJZVE5NSUpSTUxZ38rT5OfU0+bV1dGzqay7d0c5Njs4Oj5YycLGX0E7OkdKSEFO 0r6zucj+Um374trVwbu4vt5OPz5ASElQVkVT2cG9zOZZa+NdTEdmzsTI+Fpee3FVTU1KRUpa9NzY 1c3Iy1srN6OepLhq0TfZPCUlJby6rbZTXzW/ejwuJD1LrK2/u3e63u9IL0/srq62vFN6Tk8+Mj5G 1dDwVzxN3bm2zehb1NVnTDpEXcO5x+VJSk5RTjo5SdTAytx37M7C0ywps56frsrKR87ZNyQdMV+0 sr9nOM67xTUkJy+/sLC+0727uMlbPztUy77I2/zTy857PjgyNz9HYd6/uLq+209DSV/gzMXEw7/F 3Es4LzRO2snJxL7Gz2k+MC45Uda/u8HQ2N9bRkZRctDDvLzF2DstRb+3vt3IyMS/20ctKi87VM27 vL+4sb19OzEuLj1q1+nmyry2sLbZPzY5PD9JaMq6sK60wn1ENzI0O0RY5c6/ure9z3lKQj9FS0xZ 683Dv8LL2dPTfVpPSD49R1P51NXkZXznfm1OSUxd0MXBxsrHys3jWEpGVP3n72/o7unsb1dMWF5i XFZaZM3CydPa2OL0b1FIU+vU3nZaSkdIU1xXXHjYzcjK09/f3mlUUXPYzcjOzsjFzfJkU1Fg/F5J R05LT1pWVFF93drdbWZbe+Da2vfZzsjN72hPVl9q/mvb19HS5O1XWl9rfV5uXWre0szW2uf4d1tV TlJkcXNje+bf5mhkYfne/WFSWPfZ0Nzp6ejk4+xpW2F77O5uZF1dfN7W2d/e3Nzi6WleZfnj7/J1 em9cVUtLUFxlYn33cf7t4evr2tfU2+Po7ODRzc7U1tPedFlRU1RZU1NZWllRUlNWWVtpdt3RycXK zNz1b3ng5efi2tPa7V1PRkZNWWdpeXp773JeV1xt8tnNxsXJ0d/j8XFmYmVs4970Z1xWTUlHRkdL Vu/c19jY1NPQ1t/n8Orf2dXPzM3S3u5xXVdZXGdoX15iYFRNTE1PXHn39+rf3Nzg5vd58OPZz9Ld 9mppbm5mZ3bo3NfS2/dnXmf78f5qYV1dZF1VUVlo/9/c5XhrdvPo6O7q4djS1dji8HdvaWBpcvjo 7fhtb/r0/WleXF5kX1hYX210cnb86uDi6/Xu5d7a2djY2tzk93B28efk/GhbWVpUTklLVGR5bmt5 5dnc4/Du5d3Q09jZ19TZ4vZ2bHX17Obt6+Xe4e94XE9KR0hHSExVXF9kam/45NnW1M/Ny8vLyMfH yc3a/lxRTEdBQENHTE9WXHHp2c/V3u755+Xp8fLq5NvX1dTVzcfGxcTEydHgWUU8NzU1Nzg8P0VO X9vLwr27ury+xczR2/FhV1daaOna0s/S2OphT0dDQkFAQUNHTmbf0szIxMPEyMrQ3OPubWJfbXRs atzHv7i4vtBeSz46Ni8tLC0yPFbTvraysLGytbrE31BAOzg5RGDlyr65tbW3wu1IODEvLzAzOUNb 1cK7ubq7vcLK1n9WTUxOT1hfbNvKx9/1uLO0ssHNTUlTNi4oJyYrOUdbdLuvqqaqr8bP3lBFNjAt M0FluLGxsq+rsbx0Oi4rMC4tKy89V8K5uLi2sbS2weJYSU1DQT89Q0vpz8zGwb/aR8Ksvbv4ccxN zTwxLSlCMzU2PurRr663vbq0vc9JQUE/R0RBTty/wL+5u7jD1mQ/Pzk5NzI6P1vhzsC/ubvBxc7W flVIR0dFSkhNbtDJysTGv7q8vU0x0cJNajZDw8fAPEn+Teo3Mzc9R0bzTtq4uLi7uMC8v2NxZFdP SlBIfOld5ujg3PJUS1tWSEZFR1PxaHrPzcS9vsLL1Ofj6XpaWm9bbmlj4G1pXVRjWlpQRmNeUF/c 5+fZeM/LyMzc0NTV03ZPX1xPT0xPTVtgXd/m39Tb29/Z5mrveGJkYldZ9ePb2tLTz9T16nFgcllO TVRfWGJpbdvUzdjcz9bU62ZYUFRMTU9PXe/b1dPOzMzT5m5gXFNTT1JidtfV08zMydHZ5GNkX01N SkpPTlpcXGT32dfT19XV0dTw6G5rfV5qY2Pzaf/j5efd3e3xbflkW2ZXX2JeaXfw5dre1s/Sztr3 aVhZU05OV15e7ene1dvP2O3ff3TsXVNdWWztXf5xe9vy4u51b+tkaexTbWp43vDr39vg1NLe4+bm 7m9kZ1JTXk9WbFVpYFPWeuHOYdTcadHn4ONh6ttp6eVd537v21/acU/nTVHoR17nVc7sesddz85M 3V5P/VZv+/Pud9Pd1tfqzerc41niW0ZXTFdoadRN4r9Oz9ROxU5YyD3izT7BaVPASMzXScFvUNZN cM9H695N0fFdz2br1lLl5UbOTUjFPcvKN7naP7JMPq9BW7cvu7ors8ssq0strD08qypLpyXDsiOo xyWmcSykOi2jND2oJMOsI67iK6dHNK9G6bo1vuRCtS7Sui24SzysL8e8KqdMN6grwrYprj89sC/b xjzETOTeVr5IzM5Euj98ujXK6ju0PVe7Nb/xPMBPa/RVxUi+VEatN829Lqw7Ra0pscQnrUVFsy/M vzK1RDutNtfNNq9LUL88u99AzUrNyj1o0WzPTW7BXc1ZTL9U/k1Mv01K4FfN1kPIZdPCOc/fWMZC U8RZ3n49uPpJzj29yz/UT8vNP1Ld1NNOTdHQ2UlMz+9qVlXZ2Wxf3tbVblfX1//gU/3QW2JtatZV We9q5FPt0mHfTmfIUOdaS8BfZdtNxdlL2XPY1Unh9ebYS+Pcb9xPZNVjaWle029b32HgfWnqbOVh Yufz821r4et8537k3vlv4+Zffmpy5VZq5ljq8VzYaPfUZ+VqXdp3X/x23e5i5e7s4mn52l/s8Vvc WVrfVfBoVdVgc9Zi1N1f5lpt6Ff4bGToXtna/NR18dVl3uds7GZtZmX4Xm96fO5qeeZ14/lm6F74 d1zi/Pv5Y/7q9/t28PDn73zXe+PxW+drbPNd9d1e7/Jj311+21rfdVvgZ+f6YNr2fudk+Pxo4+/z 43B98W5ucfdtcPpr3u5u33L46lZs+lv2Y1rqZX7bZuDaY9zkcdxyfO507W149+h+du3u5v9ddvJo 7Wp3321xeF7ub1/zY/PrZ+314ept7Pfg7XB2Y+v3X//oePb8dex+9f5u8Xbw9m7q8P57aOXqafl0 fuZfaPF/7nB+6efufN75/fdj52lk+Wb5ZmH4bFx26XfpfPbqd+np+uPqcO77499mfuj5dl153vdo f+rqamN1XWZzbv5t5etuc+3bcVrr5m5je+hfdOXq4fro6/bs7er4X+7hXnr6/fxbdeb2dGZ2+W30 de5qZtp5eOtv4v9e4OL2/V/t/WZ66N5fZPPq8V/17np07ehL5cbsVmPP5GRba91eWWPdb2rs53d9 3ez17OTp9G5r9XJfWGxVYsfpYdnd7lpl+mhUX3vv+Vfb123V1uz+btv1XuZ3aPldZn1qc+fs+vDr 8WZl4OldadvkZl192/dh8eFdXuru9F1z6vh68Obp5e906n1s621b+mxt6vbldl7d7Fzzb2jsW+vc YXPu7OHk6uB8e+Zx9m9caW9l/W122ujq5/Xd+V/8Z217XHR7eHVq/3lydGR87Xfx6ersZ/PudO1w 7t7y6+Xz3/jy52R7YV1lVXFzeOf/dOvve35x6ex/7nry5Oni2tLP1NDT09fz/GNQS0FDQ0BHSEtW Xfzs5dHU09Lf3en86Hnw3+fZ4Vxc2NNROcujvNypqKnD7eA2PiccKComKTHpvLittKypyX9PTD8t NThDyMa9raaqtbrEZEI1LTQ7MjZGdGfo0+XHx/783NTyWWb+1dJzPEWfpVirqaWtP2QuNzUaIiwq ODlJv7Ct4k67bEI+Nmz5ycnVrKqvtL24vdlFOkpdQj9NV3xfSkZNVT46RkxVUHTKxcHJyM1wZVxB MOugr7eosaGt9EAmOCoeKCAs7tzBw7Wu2/RMMj8/RlRTuriyqrSvr8btRktNQlFPc8vQ2XFOTEU6 MzI3OEZWZce9vL+9v+56dU1TVEQ8v5+sr6qwp7rgRSUrKScuJSxARse+wsZczMnu1UZRz9i+zd/G zL29xMjWwcHLyuZ3aUpMPjQzLzw6OFBR/NrTvMPDwdLAy9/uSWRXRkozP62stK64r628vj8vNCsz LyQtN0u8v8Pfbb7Fzu5CTH1v+1dc6ty4sLi3vL64wM9bR1lGPzwvLzQ8REFJYHLMysnLybq/xMr0 VEZDRD46MnyhpqynrqSovnEnJysjKyMgOli/tMHA3s6+XE49Ot3S2OPzvba0vvu/tL3LZ+TX2nVC Pz07OzMtNkZWbeLKzr26xsnKyMnUTjY3Pz1APy5Pm5mqpKujofU4HR0rHigmHu+xrqzFu9VN8S0t OzzFxcm5uamsvr5fRs61zErlv7zOSTQ7QzgwLzU+9OhP3cTCx+Tt38fLXmNJRE4/Q1BWR7OUnaqh rqLEKiQXJCkdLSM3q7OtvceyT0k3KD5J1rzXtrOxrMXHzF3J1F9i7L/MY31MSUM2NTI4P0VVVtDF 08fPz8TLz/p3ez8+RUJOYORAtJOfrqa1p2YqJxcoKyA2KU2ssanDwbQ9OCknPT/Hvcqsq6uvz8zP 1s1KQU3ew+puXFnuRzUvMj5GS1BVyMTJx8+/wMvKbOT0Pz88Q1dL6NtHyZuctq6yrsIvKxsjMiYw LT62t667xLTuPzQuPERmzNnGsrK8ubu9vsp2P+XYT+dMX9hvVS80SDxJPjlm077Y7bvCvsJ37Vli XDs9RXjT2cTMx+7Jnq35vsKt8jk8JkI4Ki4mQFxI1X22r8DKUdrEST5BRFXay8a8rq22tLzM20lG QD1ANjk+PE9bU1Vl0+xbc/jUyszJ0tPS32lKTGrd5u3OxL64vtphVDsx5PU7+r+vv9PKYfhEOC8w Oj0+QdHIvLrNyNTH4khgU+TS3c7YwsPNxdruaFNURUVPS1FVT2RUVmJT5Nvp1drGy3Hd3tvWzsLM 2d7b61ZUTkdUWEtFSlZaXG1rZPLd3Gtm1tre4//c6uLf4MnMy83c2uLdc0pUamZfSUxWat5OS11d 7WNlW1jS19jJzs3X4G1RX15bUF3X1tDS39zj2t9bXlpdZVtnWVpmZe7l7u/k2dDkd+j53v1TZmjr 7Fdqd9zSb/fl9/Nr6PNZ/WZq6WzlX1VhVGFVT3f91NTnztzc3G/sct7d/9Xn39PrblVi91lgYWT3 amJVU19YUllt3Nnc5+zQ0dnddPbr8XlUXPPiz9TsfPd8XVxkW1l93ef46N/p6vxkYV1iZGFxdeze fHxrY2th8m1n3dzU19ja9+rs/fru3+1jYV9bW1paWmnn7+/m6N3reXxjeP10+Wr77uzV3+/m4+Nt a15TY2ZoYmze39zjcv1xcG9gbF9s9mR5/PPi6Nnhe/T36eHr5Pv53el5XV73+fD+bXbvfmFiYWZb XmNb/O326PPc2N3g/vHk5+Hj5d3i8HNaUk5OT09n9enY0c7R2uh2aF5cW19fbuDu8ezi3Xr793Ts 9/bl5Of26/dld3FqZ1xgam57e3Jtam5lXm3t39/j7uXY2eR+fXZ+/G176tbQ3vZtX19XT09Ybn/5 ++fb2eF8a19lZVps8t7V2tPb4N9rYFpXW1hje+fZ4N3a4+X+a25oZmZs/291/W1qa25sbP/z4trf 6d7h6/NebdlrVl7s095nY+jf52Jba2R9YVp46/Rpa+rtfmNi697l6urb2+9wY2hlXWNnbuvf4ubk 5OrufVxbXmZ56PPx4Nze7PxtZHNoXV5mbWRu8/fZ2lY52aazRDVOur5AL0jL10RAdcTBXkXXucpG PWTGzUxJ6czValbzz9RiTfTN5mZd6tr0XV7l6lFMbubseH7k5l9d3df/XmTUz3Fcaebl+WVr2Nlk VG3Z3WlXfOJvV1X22/1STvjV2m5W5MrcdP7n7+1pWWNq58rP8/jc0uZbUVFbXUlKXGPm2fbtzs3l bnrs7u1ZTWjf1ebv3eTe2e1sfdjrXFFQU/PdXldt2enu6GZx3eXz5O9c+e17bXJzX3LX621h/drT 4mpd9OFvZV9vZ15fVl/lzM19WG7Nzf5KS33bbU5azcj4WO3Y2+hSU+rcXU9/0czkX1ne2U5H9c3j Xlfh3fX3au/f+1lZd+Zt6+Ft5Nb42NZbaOndXVFRXujp329vZ+Xu+Vt12eB1XOrn+l1qeurgVE1r ztTeaX7QyOJLU17V11dJVtXT4Ghx2OHuVFNebf1o6H3T3G963tlmXFxhV21vZtrW3Pzz7Wtt6t/y Y1n91uV0Z3no3+VoV1Pp7Vlj5dpzaG/74dj9VfP939bdX2vX5uN4dVZs8F5dTF/57mlw1drR1N1l fNp5WEdc4NRfTPzS1WNVVN7B001Kcs7Peldvzc75WU5l6t/9b3js4Hhw73x5Zl9cZmJZbufUcVjp 8ff0X/DY6VRVbHHy4d/23uTd1ujucGJbcOb5bG7p4e1obOLbUDZCwrOzw9vNv8hPNy8zRc/N7O7q 1czWUz89Qk9oXVFh6dXOztfZ19vrcWZu5NPO1X1aXGhdTVvzQy1bm5mjr1/fzT0uJB8pQLeuWUFP Rs3POiwlMcivrb/p2c/Ozmdpzr2wtsTzSk9ZW19USkhDPz49RE1o1cnEytPIws17TjsqO5yUnaLQ RdI0KSQbIDF5qcw++jDZvD08JSZCvaWmtbvCvLPI70I8zrqvuU8+PE7ZztVNOTk8REA5Pk/OvLq/ 0PNw8M7TSywfS5iVmqJcY0wqLiQcHybaqrK52ULHunY6Ih4yxKmkrbrKxru90UU2QtW3t9tHPlrH v8ZNNTA0OD1KTmvMvry9xGlMVlxVOyElpJSVlqx6SSosLCMgITmuq7HCPEDLaT8qHSRGsqOnr7zR x8TAzlBP97692GlKTuPLxtBJMy4uMztP48/Fv8jWd1dpaEUpIruVlJWf2eo9Li4lIB4m47GxtE4y VExCRyghL26roai8WXbEtK69bWDkwLvWSDg6XMO92DstLTA6TGnq6NK+ur/fTUtRRy4pupiXl5/L 6jQpLikmISZFxbSw6TxHQENBKygzbq2jpbNhXc+2rr7kTk7Py856REVbyb/XPSwrLjpc49bQ08/F xuZUSkc/LyrbmpSWnLhzNSgtKSckJEO8sq/JRUc+PDcnJSxHsaShqsPa1720wM9aUszKzeRMS1Tc y+JCLikqMkjvzM7Sz8jHzuhcTUYzJ0eclJOYq8Y6JismJiIcLuq6qLHM+TUxMCYnLT+7qqOlr8D8 0brDzW99wb69zG9TQU1wa001LCsuOlPl3eLZz7+4vtB0QToyJTWglZKUnqxIISMfICMcKD9arqqq rlU5JRofJ0KvqqSmrrC9tq2/ezg0VNu7tLq/WkRMQD0wKy0sOV/tycnWx7y0uM5lTEhCNjJCsqCi pKSrvlVCPDQyLCgoKjBI17y++kE2OE3w0L+7vMbPxr+4uMx+99LJysO+wcv6TD86ODY3ODQ6QkpP W93KwsTL0H5caW13TlS0p624uLzLz721uchONS0pKjA2MSssNDpCa8i3s7i+zOHNvLS2wMa/xMfF x8jcZnhlV08/Ni4tLzhDSkxJRVXUxr++vMHO7lTIqqq6vba6ysC2vdFOMywpKCwzNjc6PjYwPmLO vrq5wtzOuqyor7vA1mh7zs3va2tTTExMSz85ODs+Ozg5OkjZv72+vsDO61xYv6ywv7ius8C9t8tU QTUtKCcuNj08Njg5Qu/Mw8HL0XpjzruvrLK+xsXDycHC50tFS0pNZmZOQDk3NTY6PENW58zHyMrI ydd2VHy3rrWzrrLBxbnA9l1EMSkrNjk0Mi8vND1W28jFycbFysK4srfEz87Gvbi5xvVZVFVLRktK QTs4ODo8REZGUfvRzMzFxMrYb2XOtbG5ubG1xL+0vO9JPTMsLjYxLS4vLjE+aODMvrm4urm5vL3A zNfNvru9vsHN/ltNPzw8PTk3OTxBSEtQVVvw1dfVx76+w9pCYLizsrS1uL6tqrxaNC0qJCkpJCYs QvnfxMnMuK6qr8xOPFW9u8lbYca1qqy9XD5ITEA1LCsuO1RjXFjvzsvO4n145tjXVjVYpqGnpauq qa2zLR8gHSMgHSEkdamqqrXCuLi4Yy82OD5dTVTMqZ6mqquuschDKiMpKikqLTzvwcDEvLzG2mlY UlxlUF3s2cpUN+eio7Gmq66ltMwqHiwdHSIZIzXbp7q1qrqnqcVsMD5NMk9DP7etra6uqq+2vzsu MC4rLTA1RGve09nP0dXJ9HTM0L6/y8X7VVxKTktHTUzev7+8uLu7vcvvTz8/QTo1MTQ9RnDcbOjN ycvNytDYz91rWGve89rOzMTDwMDHydtZSj46NzU2NDpCVdbJwr++vcrNyMzFx9PpW29nTVlZWGBZ Ylz91OPa09XW6vleSEVHTVdSWGbmzsvL2mZnWE1JQUVOadnSv7i4t7zCydvlVEE+PURMS0pLYOHd 1+X56N/R2XxoX/jf9GRRW2VPV31+2cS9v8fEv8jL01RGQT9EREtPTVpsan5zV01KUlRLTlnrzMO+ v8O8vr62vcnJd09HPTU6QD9IRFph6M7kbWrpee5nXV1z1t/T3Wz0xb3Hxb+7t7m/515yWEU5Ly0u Mzc1PUld0cK/xL64ur7Cz+j02tPq9+Xe3uJz9ubfdExLSk9TSEdGTVJSVGTt7+9y2MzLytzf6vZG OL6r3L6utaersGc61jMjJR4hLS81Nduwu6+vtq2uuFw9aEU9RTc5XLqxvbOpray4WktPOCcjKCwz PDZMubO+w7W2vMdWTGdRPDdAUUk3wpmqspqkn6PLNh8wHg8YGhswOUqwnJako56vtE4nJSgwJSNG x6+qqJ2boa693EstIh4gKycqN2W/ura5r6/A3O9eTEhEQVrhUU5dW0HMmqjVmaKoqE48ICsdDhof HjM+1KKYmKunnbjtLR8pKy0jK7itrayum5m1W2jXOiUiJDtJLC7ZvdVp8MS1uT5UuMRWTs/HyuE6 QetGOTA2pZxgqJuindlFLywsDxMhHSUyWKiYmKanmqlUNiorLCQeKsy7yrammpmy07a3PiMgKDIr IynQw03Yv6uotd/Frs43TOxSRzY3RlI8MTxPnpw8npekn1vKOywnDRgmGh4uzKaenKWdlrU/QjEp Hx4fMN1qx6acmJ2uq6znLCIoKCIiJzX2T3q1raqvubm+xUs7S0c+Nj9aRkRGTmM/sZrMqJepnbvK QyQsEBUgGB0r5q6gm6GemKvedTsoIB8eKj5LwqmhnJimrKnONiUlIh8jJC524uSuqqupr73XzUsv PDoyOz5AT/beY9jM0J6h6pyeqKtHzSomHRAfHRsmSrOrn56gnKC+0G0tISYkJS4+2rSnqZ2ar66v zDYnLCIkJiQ5YUvYrq2xs7LBy904P041ND1TUkns6cm2XMGXruCaqK7RTVweLBoWKxweL8S9wJ6e op+survsKSkzKScuU8m5rqyeoLOxs9UyLDMkJikqPD1Dz62ywrGruuLUUU1JOj4/WkNE2011x8/F sKC/r562sv7qPCUqGyMkHSk/7Wuspaqmpay5vk05Pi4qMUJFSMm3rqutrravwz5DRTgoKzAvNDlP 3MrFuLe7v7u/d+loTkw9PT5BRT7txtu4paqvpKazxsxNKykhHx8fJSxGXMirp6ikpq25yuhHODIw Njc7XNjXuqu1vK2vyNzdQDk0LSsuMi9MWVO8sLa6sbPEysxcQjszODMwPV/h+7moqKqpoaW/wMtC LCIlHx4hJzE3VL6ur66nqa+5u8ReQzw6ODM8Tk1fwa+2w66pv/LB1DUvNi8rKzE/RkjPtry8rK28 xLvLQj46NzQxOk1XZM62pq6wn6e0vLflKzAsJB8hKikuMl++yrWpqK6tqbXK4flHNTU5PjpD+9C2 u72xtLzZx+86PDowLTE1NT9W3b27ubCwu7y82VRQPjM3ODc7Tu7NvsCkqM+kqcHUysspNzQmKCUw KjM1S7juvK6rtburvMnZ8Oc/Tk5YTUzG5n7CuVn6uF1B/mQ3Oks+O0VQU9pl3L6+zMC319rTWEdF TT1GVU3Z2tfMvbDNv62+zMW9Uz5VPDAuMjAvMzdSXWDKu77Ctri/v8HM2dPs8HJ7/Wt+TW/PQUTV az/+yE9a3P5PW2RIYVVR6e5Y8cTWe87Pb+zWelp//FJf3utt0rzI0LPB0L3I6kT9SjQ5NDYvNjpB S0nXzcTHuLW+uLm9w8rN9+9mTVZMQz5YZDljxExMvspH3cBdR+J1RE5WWmZm7cjN2cbA3PPMYE1f U0hK/FhIbLrFRLCy18K4ukLN8jk6OD4qODQ4RTt+78HLvLC/t7e4ys7C6nVae1BHUkRNTVNETNpS c9Ta/NvMVFngZlJo4+9v3evc0e/h3OdmZ25UU2dnVUb0vEjotsDSya3c4r3fTUF4NDg1MTs1PT3Y 8P68vbq+tLjEvsfOZH5tU09IWEdERFpPSNpcY97O4dXH39PX41TvbElmdVhX3nZa7en0Yuzodf5e WkjLzj69vcfRuq9pwcvaRUFSMjotPDs2P0vMUcq7vr++tcHHyMXSXOP6cElNX0dISldKQ0lZ5mzs xr7Ox7rI+9bOW01gUUVHT0xOUVRganLnbOzb5+Xg3FK/vkC/u79wvLBPyvfOP0lINk0tPjhQNj7H Ut3xtsrIuby8zr3M1XpjX0pJP09EQ0tWXlrj8N3QzM3OxtDc19vtXWl5WE5t32Zm39Xs6ehyZl5c S0xPS0RLVE1PaOPn3MjBx/bNtsFozbrE3NHG399kSk1WQDU9QD48R05Y7+naz8TOz87R0dbf6uHV 2+LZ2dlucP5fW1hUTVVXSlFn9mvn2eTS1NHm2NHi6fLmeXNpX2ReWV1x8v7w5ebx+XNtbHhhYmlx +XHq5+vg4OR8+v9iW11xVlFZYGdp4ejc18/Oz8zMy9LZ3eR1W1pVTk9PT09VUFVaYGpfdvHi3d7W 1Nfd2tre5tjY6t/q/2loYVlaWlRPWFJQZe/f6NPS1tDP1Nze3+X6cmxqXGJfX1pUXlVYW1lpZmx9 7fXp29jf1dPU1dXW49/s92JeZVlaVV5ZXWpkbWH//fn77t/o49XY3Nrf5/j+X2VuW19gZF1dcGL+ 7u3u7OPq3d7j7O37aGlpcWpw93Dz9ff/79/r6evb6u718W1WX1laWWZjaPdpeu/g5t3a39nc2+rm 9G5hX19eY2T7a2pna2505vj7+ejzffHq5Obk+Onp6ul2cmxrYFxhYmFdX2589+vc2NXS1trc3/pt cmlbWVtaXV9mZnP89vjw6vnv+Orv9e/57fjm5OTg5Ons/HL8YV5faVpXX1xqbuzw6dzj3tvb4Obo 7PT6fWxpa2lob/lsamdkY2draHp4dfjk5ufc2dvd1tzl5up0ZmRaYFxXVFZaWmFqcn/r5OLZ29/a 19zm5+5/dm9mZWZiaHD9e/Ho9fn+dG9xdm979Pvr6/Hp6uL4/O3z/W91/3Rsa2VfZ3lxc3d2dfPq 8Ozy7/b/dW1/dmlu+u/o5eDi4+n2+P/99/htcG92cWh1bHB3/Px3cnb9dv10eXls9fh6fO7n7ujr 6O707e/q/XNvbmpjYl9fZWttaXvv7+Pl29bd3uTqe3Z7aV9iaGZmbXjx9ez+c+/u7ezq/Hb0+29/ +HD++/1vcu199npsa211bXJ0+fT08vDj3dzd6OzxemxkY2FhZ2ptd3vy+3j+9/Z7d255+Ozs7erq 6PDx7PN7dXj//m9paWtvcnVubm9t/e3t7/Hq8+zh5unn7HpvbXB3fG9mZ2du+/vv6ePp+vl3aWVm Y2Fqdf3uXF/Ex+d3X+fe401J//nR1Ob2185lZlBITVhbUfH438nO3OHZcXrsV1d27fTd5H/a2/Ns a11YZVZTY3zn2c/V1tXe7mRPSk5XYPLk2czIy9XvWk9MSktPXGr539jZ3fBiZHBq8e/23dPM0d/x /+jd6WpyfG1fXG3z+19RXWleZF9s7tTO09Le5OX0ZVNNTFlta3z139TU41tfXllTT2P00tPX4P/e 3dr9ev5o397e5djT2dJ+XltWT0NGTWfQzcfOzsvjbElCQEFOU27fysLCxNf7XFJOSUxOXHro19vY 3N5+WlVVcefW1s/FxcTU/2hfVk5RUlh6391vXNbEwsxqXVNhWUA7OUNZ4tfo08vDwthTSlBUa/Pe z8fCzeBkU1lXUlRu39HO2u10XVRSTklSbuna3djT0d34ePDa3//93NHO1W9WTFLLyejpVefeYU02 PEBMb1JaZs3Fxsj0XVrr3OfRzsC+xtVfZFZPTENLXeXl9+l6bFlOS0lUYOnb2tba09zi8uTV2tvh 2tvVzuPg1nhHP+q9z8z3T9BlTDcxOzv33lb93MrCvstcU1lYXGZ20Lq3usLf/l1WQz1HTGfu8m5q /XJnVUpIU2Bl6d/VxsbN2dze6edybuTc2dvb8XDo4NlaPUjJxM/RTld0dWk/Pzs//F9kfHjYw73I c09KT9/V/tbPyL3Dy+t4cl96UEVHSk9ZXFZVbOz25Pxo49XS0djt7dfP19jd+3ZuX09KSExabO3c 2Nxg58LWZ27o3mjSydHDy+x3U0lGQD06QFJUeNvh29HN0951WmXb08/L083Jy9fwbVRVW1RSVl9w +WVVWVhXV1NUYuza1NTd4dXZ3eLj3drT1uhmTf3G2HDVzNvdzNZ/6FtHRT88PkA+QVtuWuzf9+LU 0NLZ3+DPys/Ly9HPysrS09jtb15WT01FREVITE5XVV947NXY2tXZ0tPX3frt+/zvd29rfnh1XVDV x+7txMbYyr/M4eNcSkI6OD0+PEVeXmPY3O3Z0c/Q2vHezc7Mx8zUy8vY2d9tZnVhVVZLQkNGRUlP U13w6t/S1dLNz9fVz9zo5ux0bX5rbnBYSmbGzd/Lxc3NxsrgfVZKS0E8PkE9P1BUTVzr6OPPzdPV 3OXd2NTOy8/OxcXKys/kbWZcT0xIRUVFR0pNT1NeeOjW0s/OzszP2uz3eWhneHBgYFZZysDYzr7H 1crI4/Z0SEJEPTtAQD5JXFJW5OLfzczd4N3t5dfW1MrJy8PCy83N4HtxXU1MRz9AQkFFTE1PYPHi 1s7NysfL0dXkfevl9HpmW1BO1L/R1MHBzMq/yuruTz88OTU3OjtBVFpa6tzg08vP3OTu6NHKysrL zMbAw8rP29/gcFpORD4/Pz4+REpQaOfd1M/MxsbN0NnpeHpoWV9lVEdOyLzMxry/yse/znZiTD87 Nzc6OzxHY19c7ODp1cvO2OV3/djP0MrIysK9vsHI1PNvaVZKQT08Pz9AQUFDS1363NLMxb++v8jT 53NfW11YTUNuu73Buru+yMTD9FBAOTk0NDk3OT9U7fne3uHRysXN8WVt8M/Hy9PWx7+6ub/M3XdR WdlLOD04P0g4OTg8WfDV5vTFvbu5wc/qUlh+RTO5oK6jqdWpxmFLICUdJkMiNEc2r666zzpHPtW+ PfbBwKurtLjBysnZ9T8/51nY1FRXVVlDOzkyOD47SGB81cK9wr++09zR2dxMRFA9LLuYpaKlZqW+ NywXIR8tzyQ6vMmnrtk7LTsxPXY3x6eqpa3FyryzWTpESLyy5lNy3dtVOSosOTQ5OzpuwL3KyLzH vsFPT1TQx2ZTPTs9qJWlpq/QpesvHhYkIjVZKE64sqi4WDMsOzc+5E20paypv+vSzrhNRNjRsbfy T05uUDoyKy09OT5HSNLEvsfNt8HIzlN5587oQ1M7LK6Xoqe2+qvGNiIaIyI7zC0+xr2rs+03Ljo9 XcRayqqtrrtCPGrEz2TTxLivv29PQEVFOi8sNj4/X1Vczs3CxL+92uNYZ8nkXElLPUmcmaqnbcat NzceGycjynAu0Fe+rdBaLC08RLW607CzsK2+1kpEYm/Ayda9y8/JVz82MTQyOTc2S09owcLFwbq0 wM5qTO5zalguMaSYoKHHR8U8Wy8aHhs1tV+45z21w8ZfJSgub6qvq6/Ss765rPZENDPa1r7A/dNd 38dKNyonMz5bak1OUsm0r6/A3dnQ2FVPOi3Zop+iqrXFQjg/NisgHiUrPrixtbXbU004OT5O39C4 tsG4t7Ktu9hcS01HXdXQ0fFdUUdKQjg2Nj9PXutbZtzOv8zY09/P2+/qTm28s7rIw73GysC8z1M+ MjE3PktLPzQuMzc4Q2fLvLq7vr62sLTD4FQ/Tsu7tri8x39kTj04MTEyNDs6Qk1a0s3Q3+zQz8zL zLGpsri3ub/fyb3K3UQ5LictND1DOjszMTlJ083W3vHv3L2vrauttL/X5mNi43De3l5WR1pvSD80 LzAyP1n+49jGv8bUZU1nt6qxu7awsL7Ht757TTsuKSgqLDAxNDs9U9bCub6/wtjoZnLJurG0u72+ vsDAxV07Njc7PkROYHVeVUc9RE1Z+3Lk2NvYcdu8ur/Kw7a4vLWusctUPzQuLC4yLy4wNTg7TdS/ vsPGx8jJxLu4usPUzMPDwLu911dEOzo5PURDRExRTUhb4Nve/VtbZ3B107y4vMXBuLvCt66yw2lH OzIuLzAuLSwvMTU/b8vGxcfCvr64tLCutb3Ex8jMx8jhSz0/QT49PTo1OT4/R1HjyszOzcvN2dvb zL27vsnGv8bCuLW83E5JQDQvMTQ0MC8vMThBX9bO1d7Ju7awr6yssrzEw8bV33JPPzo8PDw9QktJ Qj9DSlrm3t3b3NLKxsTN0cnDws3bzMTFycfEyc7uST03NDc6Ozs2Njk+SkpPcu7k2cy9tK+vrq+0 ub2/xtllUUk/Ozk8Q0ZBPDo+QUdPXmZk/dTLzMvIvrvAy9fe19PKy9TY2djb3t/l9FpKQj07Ojs+ Q0VISElOUWjXz8rIx8C8ubi4u7/FyM7Y619RTktEPz8/Pj5AQ0lMTFpr/drW1NDNx8G+wMXM1uDg 3N7l629lbXB7dHx+b2FKPz9ASU5PVVZeYl517NnOy8vT2NHMyc/RzdPa5/V9W2XZz9tZR0NCRkRC QEJKV3TQyMvJxcHDy8/Y7mdQTF/Wwbq8w8TGzNl+Zk44LCcnLDQ+SWLr2su/sauqq7G9zdjRzNJn QjYvMj5LT1JTYmB3yL/G7UlAQ0xieX/s2MvDvrzBzN5oSzQuSrSmpLHMwLi1vU0uJRwYGiAyWu/i vq2inZ6fo63JQDIyNjErJipDx7q4trKvtsrkXD8xKiozP0RES8+zra6vr7K5yedcQjEqKCorKTuw nZaZpqupqKxSIBgSERQZIzzSvK6hmZSTmqfFQzQsJSIfHyIqQbimn56go6awzz8rIh4cHiYuPGy+ raOgoaWst8tMODAuLCooKCcvuZyTkZqnqqurvygWDw0PExsnSLqpnZeSj5Obq3c2LCUfGhcaIjnC qqOenJudo7NdLiAcGxwfJCo51a+inp+ipquyx003LSknJiYmJz2smpKVn6mrqavdIhQODhMZIC1S uKSblpOUmaK5Qi4oIh4aGRwoYqufnZycm5yhs0AkGxkZGx4hKDfarJ+dnqGlqa/BVjctKyknJiUl L7ydk5CZpq2sqLAwFw4MDxgeJjLyq5yWk5OXnavYOCoiHhsZGyM/r56ampydnZ6raSYaFxcaHB4h LGKsnZqbnqOnq7fuOismIyIiJCgsNMaeko2QnKmtrK5DGQ0JDBMdJS1NrpqRj5KYnqrFOCUeGxoa HChTrp6amJibnqW0SicaFBQXGx8mNsamm5eZnaOrtclLMSghHyEjJy02Q9eol46Mkp+vvL5dHw4I CA0ZJTRsrpuQjo+WnqvJNiIbGRocHylRrp+amZqbnajHMyEbGBcZHSQxU7mlm5iZn6280V0+LSQi IykvNTc/Wd2/pJaOjZeu8VXgRR0MBwoTJkBkv6WXj46UnKrHOSIbGRsdHyQ0uZ6Xl5udnqGzPCAZ GBocISgzU7+qn5uborPfT0g+MCciJjFO1dpUSvi9trOmm5aYqGA+S1YxGQ4OFSM9ZtCunZaUmKCu 3DIkHh0gIyQpP66blpmiq6ijrTocFBchLTM1P9ewp6Kfo69iMjA9QzUqKDL+vLi8wcfO3NbKXjzs q5yZp2Y/Ycl4KBcTFx8uT8Oto6Cfn6Ot7SwiJCouLSs0yqednJ+nrbXAXTAiHR4nOlZnati5qqeu xkc4OUBNTj87Ss60r7jdRj9HTUU8Ny86rJiTmbJM1LC4NRgOERonPc62rKainJqhxiwhJzU2KSIo SqyenJ6krr3N0M5AIhkbL721XTZGtaSov006NDRD1L3PPzvesbDmMy9C4+lVTnnPeuCjlpepOi/L rlIeFRQbIStYram3sqKXla0sHyg1LyUeKkzAp5yYnavBv7VPJRwdKTAxMV25sayrqq/YPDhHRT0+ SdfQ4NHDyko2NUnS0t/szrivulbss6uty05MXEg2NikiIypWvbjGu6qoqbxROy0qKjc9PE/Kp56f pq+3ymI2KCUjJi5E3Ma+vLWsq7DMQTtBRkA9PkFGVdO9v9pv/dbN2nRb9sCzvSse9qOivD1aera3 ue8aGSfhuFI/OOWsn5y3KyM19NxLNDE4vqGbpeZIRvHmRS8fHSnOra+1s7Cuq6/fLCInLztP2tHb vqqnsdxHOzU6SlNLR17MyMfF2Vg9KiNnqKOksq7Cu6q/PhkWHCY+37/NtJ6Wm7I8JSUlLzMoKDix n5yerdpPbHg8JR8fLcyrp665v7qvu+g0JSs4+cvS1Ny9r666VzEvMjg8Pz9G57murLXaY356XEQ3 N0jUw8JHL8KsqanP8TpivNtQJCUuPdXGz0fcrqquvUkvLDdLXkA3V7urqay66HtubFo+LysyT8e4 x8u9s7TZQS8yQEBAPVXPuq6utc9OS1R2TzkuMVu+sre/yMzEzHM7Liw0bsDCzMq9sK3DMCc7drvB UkpMw7m43i8rLkDSusbzyK+qrsY5Ky42TGlMTee5sK2zTzc5OklEPjtFwbSutb7IdedjVD0zPlXT zc/pWXTWzOpbS0JNbdPP2crGxcfN11JDR01CMTTfv62ruMdk0ttXOCcoLkfOuLa8sbCzvPo1Ki02 Stva3Me2s7K7VTw6P0xQTkBJf8Kxss9DPk147ldASNrGv8XzTkVPZ+baW05vxba41UVl3PJWNjhO wLe3v39eWuRdPzArN2m7tLrP0MfB0VI5LTNC37+7v8m8t7bBTTQyPEtiWk1S2MC9v9xLTl596XNP QEhMY9jSyMC9w7/I3F1GQTk4Sry0rbDH1EI/LywqJzNBvq2oq7OwvtNHLiclLj7Frq2qra+2yE0u KSguR+HMyMLCvr7TVD02OU3a1tLNyL27vc75SjtDT1xy6+B+Sduqray4SUowPjYqKiE3V7anra/L vMPhXC4pKDr+vq2yra2wsMlQLSkuNXjf19zeyszHWDw0M0FcztXOv763ub3QVko9RE7z1/DU08jD 2U0487i5sOI+OjFLPDowK0JUt620v9bEy8PkOy4uR8OsrLfE2dTL20MzMDhhvr/fRzxH8M3sSz9D fMO9w9L95NDLz3tXTmnay9lnWU9dbs+93zRbrb2stzs8Kj4+MTwoO12+pam0zND6WEcxKCxGyamn sLzBv8LCTzEsLz/ixvhfVW7Lx9NLQD1F3cnHztDd2MjL2lVERFNsV1RMUOfKurm7xNDZOzm8use6 SDs8P9VDPjAtTui4sMdRWOHdz1Y5NU68tKu2f2JQz8TTTzZBXM6+3kM7Qm7IzF8+PVL6x85ZWlPY xb2+7HBYWuzo7ko/Rl3GvL3H7eja7z8w0be/qb9dZjpOMi4sJTRJy66ttre4vspNMyktPW62r7S5 usfHzVU/N0BRy8V6Vz9Lc9PdTEU+RmrZ4F5s5MK3uL3aTkxOTlZLREth2si7tr7N5kk5JzOrsqil cclXWUskJBsgSsqopLG6sLG8ay8fHi1Gu6iusK2urrhMKyQpOtu3vszOz8rK3UA0NDpY19X9c9fN ubXC6klERU5eXGdcfO5s2cq/wsznSUczJtekrp2o7b85Qi0hIhorUcylo7Kuq7jGPCkcHzdGrqit qaqrsr86IyEoNdKzuri+xLy/1jguLS1I7+vc28e6r6++Zzs2PUVSbXhtXt3Fu7bGXkhASFQ7KXij p5qfytotLiogIRokQMGfnKmsrsDJPywdHSw3s6Spp6mrsLtGJB4jLW6zsrK3vLm8zjcsKik9c9nU zb66rq2+7kE0NTlDTEpf7M6+ure/1uxMQj8tJsKgppmk0sIzOyceHBUmP76enainp7jJOCIYGyk2 r6SooqOnqrBBIx0eKUa2u7OwsqmtvDgnJCM1Sl7ix7qyqay+VDUuMz1EUlHgvLa2vcDrXvhGPjot Ir+cppek7bwzSSgdGxIiN8idnKeko7C6PiUWGSYsr6SnoaOlqKtdJR4cIDu6u6+vtKmpsUkrIR4t RVnOzMu7qqq41TgsMz9bfVFLb760tLfmS2JOU1Y6KiavnaOVq9nHLU0mHRoSIzW2mpyjoqewvjgf FBgiL6ulpJ+joaSrRR8bGiA9vryvrauipLE9Jx4eL0Nc39LKtKaquO40LjdRb1RDO1W6ra63az9P UHFaPC8gNZ+fmZa+yUMzOh0dEhUtWp+XnKOkrMJeJxgSGyZdn5+enaCjqb0rHRsdJlu5u6epqKKv 1ysiHh84SXzDvbevqbHHUDM0P0lPTkVNzbOus8BLQktIUEI2MzU3vJuem57V3jEsKBsfGSJWwJ+c oamuvE41KB0cKDe+paKgpKivvWotJCIkL1y/ta2rrrK9Ty8oJCs3UMy+t7ezrrnMZD06PEBGQ1H2 xba5wf9CUG9aT0A7P0E9r56mnKd/0i80Kh8mGylHZKmlq6+xuNNKNiUjLi/ms7CoqqmtsLxEMCso LT1S2L22sLC1zUEzKikxP1nMvr65r7K80kw6NjxGVd/p0sHHwtJfW0lLSEpWWfZIQ7GprKC14/kz UjcyMR4rLDe5t7G2tLG7ts45MC0tPuzJw724ta2uvNtANS43Wlbf337MzctgPzczQ2/IvsXL1sfC zN5NPz9T2dDCyN32X15LV05ATlJt1s/Lz9D5UtXFyb3Ez8zXz+tWQDAxMTQ+TGPsx8G+u8PF0PX1 VGFSSFhO/dnRwsa+vL+/0WdKOzg3Mzg+S9zCubm+wdt7UUNGQU9s0r+8uL3I8kc+Ojk6PU77zL+6 vMHTZlhKPjo+Sfa8tq+ts7fE6VM5NjAsMDE5TFrZysjBxsHF291heOLoyM3Lw8fN2+BsTkNAP0NU W/zo4dzn5GVaS0JJS/nKxL29vcDJ0HpaUEE/QUZRWt7T0sza5uPteVBHSE/uycvJxc3BwcbIb1tI PkA7PD4+Rk1a9dvNzc/Kzs3GyMnOz8/b2PBeU1BQUV9fXlpTVVFcZmRrWltcb9jW09bZzs3KzNvp /O3ofnRlVlJQUVVWV1z86N/T7F5gX2Di1fLf18i9vr7VYlpJS0xDQD0/TmLn71pgXnvU0cvP1s7M w8TO3mp+7e7mbFFJS1Zq+mJTVlpo4+5dU1Zs3c/N19/i387M1Nbtc21ja1BMSkVVXF/v9e/u++Xq 99TP08bGycPP6GJKSkhCSk1LZPry4GdfYVJWXWb439nYzsjJycvP1ufn7mRtXFFYV1ljZVpSTUpV eNzP09rY09Db8GdcY3Ta0dLS5efvcm9QSEVGS05eZmNt+9/SyMXIys3W3OJ1X15ndOrf7/pvX1xS TklKTlVq+fDs5eft7e3t8Ofi4dfW0czNztPh8mBRS0dJS1JeZG704Nvg6/dsd/P55d3a1tfW2d7h cF5eV1VdW1pZXGp43tjc2/B08u7i3trY3tfb7H5ZTUtITE5SYG3r3tzc3u57+/fn7e7t6tbR0dLX 3Onv6/l0YlVSU1hbWVlYYW1tdHR8/u7o39jZ1tPZ3eLseGVnZmZ1bWlpaXFudG5naGlrcXV299/T zsvO3O9tYV5dWVZYYW/57PlyYlxeXF1iYG7r2dPS0tje2tja3ed8aVxXWV9jZG9udvD/dHFnYWJy fvvn49rX1tPY5Ppza2VeYl9eZ2xwamdgW19jdezf29rS0M/Q2ut3ZWNhX1xaXmVr+ez9dF5ZWmZv a3T7+vLj3uPh3t/d2tvl7nljZGdiZ2xsfu3zdXZuaGptbHfv7ebj4+fs+HFtcXf48ujn7eXk7Ptr Zl9cZGtvbnH26OPe2Nbfzs10V01NQj9KRVN5VNjNzr7KysvQz3pYyXBXzUfZVkRuQetPY9l+2MvZ 59V73VtWYExjVlbb39bZ1srazdr16/9rXFpRWk9WU1FZVlRuZdzZasr+z8p90e3U+115XvX6Xt/f 2M5c5Gxf3kxFbUxK9Uvj2v3MeMvKb91kX+DfbWXqUnDO6ujVwcnWwNXbwW5PSkg9NDgwM0BBSG/I wLy4u7a0u8LS0uNqUUNLTVFLSVlndVxe59rtYVZfaGJXTV7+dnD/3szJzNrPyt3sVVhPNEurZ0Wo 2qyl27Y9vXcePCIfOCInMF64erKprZ+jtbC1vPcyOTQvOy0wWenI2L6wtq6+9dRqQzMvMzE1OTle xLq3t6+usrfL6mM+NS4yNTM7Q0VMoZzpn56wm8rUPSHrGRQgFSYtKOPIoZulnJyfn7lfPCguJRwj KUFU5rSznp2qqrCz0jAoHx8mHx8sSL20r6agnaGvvL7POyomJSosKyxByeLLmZWtnpymoWFBJxUm Gw8YGCpKQKufnpWXnZ+rsMcpJR8cJCEpOUWwpKGfoZ6js8w3KCMeGxogLDrvt6mfnp6iqK7NVTks KCMkJSk4Sta+saqsqKKboL683+diJiQfGyMhJy4pX66tpKKmpqurrlgyMS8vLCszRci1s7GtqKyx w1ZBMi0qJScsM057xbOvq66vsLvE5UU+PDw5NTdGV/DGyMG5t7W+zexLRDosKzxh2sTKvrGvrbXK dD42OTYvLzE7WOPMzci4vL65ub/T7PdkYVFHRkxRU1lgbfvjf/vn2NxLT11Y5H542+7O4vDG3uHZ 3dHs69j7V15aS0hGTUhLXlz+2c3N2NLKx8nN1+7d4WJYVWpiY/RnbmZlf25qaV9YTE9bT1326npu 3Nzczc/f5s/P19/Xz9nX7FhOTU1CQElTX2pt3cvGwsjNys7WfFlXTUpIR0xSWXnb28/LzcvO2OVi VEtLSUZNUF342cjGwsHFxdHf6FVPR0JHP0ZLSWfr187bzcjDxdnT2Ot9XGFYUFlf++/5cV1u5Oj9 YFZoaVdPTlVc+t/f18vKzMbL1M/a6G1PTkVCTVRfYWvt2MvM0t7W2XjwZ1ZYWl1Xbfj37+LW3d7l d25qXFJMVFha92h52tbT2M/N1dLT3Oni6WFaVU1KSUxSUmvo6djS09Xo3t3n8GRs+GlfXm/f39/n 5dvc7GNaWVtRTVlnb+/v4tnWz9ju5+bxYlhhX1phYP7c3tzY0tXa4Pb5dF5QTlJVWmtxbObX3uPi 4tt+bmtq629v7Xrk5f3lfm1t/u9v7vJmYnNrXGdqYfHtfubZ2+Li7tzcemdeY2hhX1FQW2Fufe7g 4NnNy83W2tnsa21eTkxXV1FdemZe7+Pq2+rs8evU4+Pe8ejfd1xddXpzcWFy++ngb2tobf1fXm5m fOXo7Off3u3p7XD1/Gltcu73bvj5bnVrfup1bWH49XHu7u1vau7h3+H5ae7vfuXqemRiaGxpYmNr c+fk6fZ4f+/+Zvb9Z+/e3ur73Hpf7v5fYWtqZljt3d3tZt3f7tzh6vNsXmbqa09db3Lra2z17vf7 495pXere4XVccfHo+Xjn+ezi9uVvXv7r8/3t+W955+1fYuvvenVq9+tiX2/77HpsaWN17Oft9mzt 3uPsbnLg2N/q+W7m/2VkVmFaU1xea+Tq59vd2+Xd3372b2dfbl9i8Or/eeXu5N/i5Gr+b3NsW1lf eWZf8N3n5dXb5/p48/9hV1lyb2Rib/Lb3+zc3+fs6e1s/3d7ZWJtafduZHXd0Od0a3ju8fVfWl5g XGnp2d9paNzP1+bv7+nd8GNcW1RaZm14X1xu49XW3+vl293p6mlVU1hs8HRaWW/p29vld+7a3/Rv bWlpcGdke+zg29rb2+Tr5d/raWZrXFROVV5dW1dl8Onn6Ovs7fHp6u74eHR66/B8fOHS1ed49NnX c01GTF5ybWr5fGD4vqyqs95HW8vXPCklKzlJS0pjzLqwrrC74UZCTl1NOzZB1rm1vMrRxr/G5ko7 OD1KX2NOR03qysrZbXXWyMfWaVtp59xwRC8r6qCcqGo8u56hTBwZITQ8Jx4nRremn6O00WLErbky HiA9ta3LPFyvpai6Uj9IWl5WSzg0P/rN+EE7X76+bUBLyrjCY0/kyNBcQUJOU05X8fNeRz/AoZ+0 UFiyp7E5ICU6QzIpJzNZxLizr7vTybe27DYtOO/OVD1fuKyvvMXEv9dOQkVGOzQ0O0RITF3RydPc 2Ma/ws3Yy8rjWk1MTFBWUkxNXd3G1ni0qbliS9K+2Uw4Q2xNQENoSDpN1sjxPj/lvsdMS/3m1n/7 cu/IxL3D1+zjzNXqW1Nm4N1bTkhRbWZTSlNTT1ru3/JaTmbf22xm5NLN3tfNz9pbPvOpsM3BzbK3 6kYsNy8tQyorTtq4v8XC3bjRQEw6Q3xvYlXEtLq0uc3ByN1+Rz43S9tWX2Rh0tRZRkhYUU9YUM2/ 0uTr7Of1XkdHWFTy+WPkz77F915BV6uszra8tat0PCkvRio6LSdr3MLAysLov9o3PjxKz83dzbWt sbu/y9rMUjw5OkVEV157xudh7HNeRz9CVcvK3NHaybzLbE5ca1JVRkppZvJs4NhidEQ+uaa6t7G+ qLxKMypILS8xIkDSyL7JucfC0Dk9PzxJanjPuba5ubm8xM9bTUtGVE1X3dbF3lZQRktAOj1Datvz y8fEvsfL3/5vR0hKRmJgXWvgx9DO4kFAxKe1vLjUrLxMOCk8MTU4Jz/44b/CucLPdjlDTEFPbefC srS7vMLa4OJCUFhHZE5Xzrq/4eVuW0w2MDtKYmNg5c27w9XP3trvREBGVGV+0XPdwvV88k5WxKu4 wbC+r7lBOTE6MS0vJzfN0Ma/vru7zkA7REBKa05rvru7vMPT48nuYONIcc/azu7a7nf4Rjw+PURh Vl7q09bm3XL03PFkVlxnad/f3NXWzdfe92BnVOG1u8S7v7rIYE45OTkyNzQ3TWrRxcHK729ZUkxF TPnU1NPOxL6+zdzR08zeeObp09nu81dYTkdGQU9OTVdVcHLp2era3t7Wd2pgaH128nvm/PXb7uXp 8WxX8sfDzcjEx8bP1vhRVUxJRj1HWlJdUEtNS1BMTVph3dvn2NTMzczI1MzN0sjRz8vU0dzg7V5c SkZIQ0JFR0dNW2L17erc2N7t5eDf4tvU1NLd4Nnc419bWk5vzcjPxr7L09Pd/2NYSEE9PUhTS0hO TE9rfW1hYG3w293m1NLOzdLOysfIxcTNy9Le3XxhUUpGQkNAP0dISE1abuva2Nvf3NnX3NzS09jg 6uHr7XZj+/1nWnrIyc7Ex9DX2uxkYVZNST8+RUpOUlZTWXNoZ3R279zm/eze1NDMzc3LzMXEzdbg 2tzj/lhTU1FKQj9DSk5NTlJk6NrV1tjW19ja3+3+6+16fO3j3eT3YlDyxsnOxcLJzM3b429PUEQ6 ODs+PkpVUF556tvY3N7Y3/Lm5efa1NDPzcnKysjM09rf5HxvXFFORkdGQUNFSlVp/vvh2NPP1uvv 4vD2cmb06+fe19vf1etT5sjW0r+/y8fL3tt0TEg/NzQ7OztMVVl53+HczdXOyuX37Xxs5dHd08fN zs7Yz8/h5dbia1xRSkxMSEdERU1XXn7j2dTPz9bW3d/iampqXWh46+Dd4eXtXGrU397GwcjHxM/R 1GNMQjs0Nj8/QUpGU9rOzNDf79jP0dLfZGPTxcTI2O7azc3T52154+xqXkpCR0pLSURFTWLu2c7T 0s/S1dPV3uj2++fe4ejr9Xv0e19ZVFNXVmD35tve2tPW0dPg7PHv7W9aT05PTU1MSExUWF9z59zW ztHU0tLV3t/d3NTU1dTX1djmdmJbUE1NTEtKTFFZXWFtcvTb1tDNzMnKys/b6WRdX1ZQTlFXXGZo +er8d3x8cHdzbHjn2tvf4ePc3N7d6/Xy8fT+fG9qZ2hhXV5cW1xeYGZod+re2dzc3eTi4OxsYV9e ZGxmY2Vpa2x1/unm59va2d3e2+js9v71c218d21vfntoaW1mX1xeZGNrePTu7+vn5uLh4ub++v14 8+jo/HVyam1uZl9gZWJhZGh87N7Z2Nrc19TX2+Dt9H5qX1pXW1xbW1xna3d7dW537Ovr8O/m5eft 9u7r5+Pn8Pv4+v97bGpsaGhnb3Bsa2p4fnN7+/Hp6+Xg3t3g5u3s6O79cW1kW1hYW15kZ3D97+jq 6eLh5ejs/3n46ejt8nd4fHh2b3NxefD3d2149HhlYmx49vL17Ork4eLt++32dWdka2ppaXF7d2x1 d2978vXo3dvb3+vy9Hp7+/xvZ2ZhZG1oaXp9/nZ9+fTg4eXreH1ycPv593Jrd3h4/ff7cW559vb1 6+rzd3jy6+14WuTIW0dd2d1UW+HbZ1rp0d5o6ODqfH/1d21qXEJ8wf1W2LnEREnZzkw/VddqRlvc 1e/o1NXtTmraUl3Fu+s+T7q8PzptxFA6UMvPTVrHvNtY+s7fV1Zx+1dNXuB5Z2/j3v9r6tz/XV7n 53H3399rauHcfFdc9+d9aPHW3Wpr7+t6ZW/7dGRs+Ovt7erh7mhicXdcX/jucmHz2+xx6uLlaGT9 Zmtw/OTud9va5/bz6u1sYW7ve1tebWpceeDe72bh2957bOdsbP5uWG/o6edmbOVvXe/R1lpZ+uHc WFt72tX69lVc4un4X1Nj38/c19jffnriXFZHRU9id2J249TLydnc2Ox57/RcV1RvcmR6/fH+49Du V2rRzO1OV9nYcEZAX+HhbGnZzc3e/GLv39laUVxt4WJUXuzS12Bs8svF7U5T79hsR0FT1dF7XmbZ zs7d/fXb1vZgW1JX4dtiUFJq3+hhWXva0dTb4uLa42pRR01Y629dXd/L0dbg2dTc+k5KV3Z2TkdU 5c3J1e/WycbPW0dEW/5fTUtV5tPS2N3O0dvi9nhaU1BYbF9jX+vY0tPl7+7c1eZiT1dld2lRTlbq 09npcevWz9juZmR8bnJ4bWhk7N7rdmFp7t33YWhu9+zic1pp79nvdGZp+fHc9np+ef7v91tYW2dp fO5u7urcz9LU9V9edNXW8VFGSl7Y19zv+NnLvsbZYVlrY11JQUNNYV9cWWJ929Td82dpe/fp/XRj bu3h1tfb19rd2tbcZlZcYmFYWWhkPDLNqqSjq7TjddpNLyEdHCEuW8e+saqkpKi6RS8sLC0wNz1P v6mgn6WvzU9AODArJygvTM6/v8nNyr69xXg/OT1V6NfKRz+mmpeZpLQyLDQmHRQUFRs9raCloqCj qK2+LR4cHygzx7KsopyanaO2PCYgICEoLzpZvq2srrjVTj5BPj4+Oj9bw7e3ucpORUc7KTiooJqX naHo/0IeGg8ODRMwt56WkJKXnKnpJBwUERcfRbqfl5aTlpupXCobFhcbIzbHrKelpa7FWDgrJiov OGbAuLOur73hSTgvKil9opuUlJuiwdMxHRcODA4WK8KhmJWVlpymyzAhFxYZHzfGp56al5qepLhF KR8dHCAtOlLJvLi/v8tNREFDTF3Nycq+xc7+VGhMPDjTop6Xl6CsaEUrGxkQDg8YLM+lmZeYmZ2l uEktHRscHy5XsqagnZ2ip6/MPislISIpLzdJXtLNxL7L0drf3NrR0dTcfk9HRENKPzjjo5yXlp2q 3182HxoQDg4XKn2rn5ubmpmeqdIyHxscISo4+MKtoZ6dn6i40VM8LiklIiUqNkRWeevIwrSutLnH y9Pf6Ek3LzI8QDhnpJ2ZlpuiusFeJBsRDg4TIzTPr6KcmJSXnrBiLSMkJSQjKjRUs6Gen6Cmq6+2 6C8mHx4eJCgqM0LEtKejqKuwrrjH7zYrJywwNDMtzJ+Zk5acpbq2SSMYDg0OFyY167ujmZSRlp+5 WjoyKiMdGx8sULmopqOfnJqeqW8sJB4eGhobHSxQtamloaOhoKSv+zorJScpKiopLbmbmJWZnp6n ps0fFg4PExUeHib0pZWSlZeiqKOu2ikbGxohLio1TL2fm5SVnqSwzEMmGxQRFhsiL1C9qp2YmZqe qLpaOigfHh0hJSY+opmcmJibmqCqVxwZGBMSERQYHk+loZ+ZlJOSlaDJNSsnHRYUFR0zzKufnJiT lJun1CwdGBQUFRcdLc2pnpqYlJadqLjgOCogHR4gJCo2Zcy1rKqmqKmrtsFZOC8tLCgnKi9DzLOs qaipqq24eTkqJCUmKi87fL6tpaOkqKy20FA2LCckJigzVsu4r6ypq663zV9ANjItLS4wOj9Tz8G4 rqyrr7K1vchbRDQsKysuM0jPvbSuq66ytsxBMi0rLDA0N0bYwLWvsbq8t73YZ0c4Njg8RFzMxr20 tbW0v9thQjYzNDEvNDc4SMzFu62vtLO2vMTVUj4yLjs+OEzZyrasrbKvss5fQC4sLisoKzM7cL67 urW1tbW2uddUTUlNUnTq6crFycO+xmlKSjcyNzEtMTo4R8y9tbGrrK6rt8PERTkzLC8rKDXLtcux paegp7LA3V0rIykkISQlLk/IytCzp6esr7S6yG9CPUk9MEPjV9S5vru1uc7h10k2Ny4qLzEzQvnS xLOtsrGvtrrLUTw3OzQsNUU7RKip26GfqazCrk8+Tx4lKB4gIDc8OMjIs6mrrK6orMzYz0s8OzZA XFN+0cC9w7zEw8xWTjw5NDQ7NzxBTu7lx72+vsK9xNfOYU1bST4/Rzw9rLQ7p6Cqr76l7klnJzko Hh4gMSgw5Oe9ua6prKyzubnJWFxfRUxcVt3j5OHHv2bGwvZeT084PDkyPDk5PF3oXcW6urW2ub7E 4kxSQzo+NzXbq9fKnaeyr6q2OFY2KSwfHyYtKzLH2GK+sLC6sbO7u9zk0mpJScvrR7/Az72/wcbC 5ElWNywzMiswPkJL2MbHtLnEtLnP+e5VPUdFQFBbWVy2qsetn7C1trdgNkUsKikgJistLlXHc7+u sryyrr/H+1f0SEVM6dh7u7y7u7266tbxSkU3NTc4MTxFSlVl1+PBxdjFxcfe1dlPVE5XalV+3Vn7 ubHNr6jEuLzFWD9RLTAtKDAxMzjR207FvczZu8pczfVg693OzsPKvrnHu8fq0NloUO9QQk1COzw/ OT1IP0t06fjIvcy/vsLIX2xjTk1OaFJXdNOzvbyrtba8wcVGUjk1NyktLzY0QGdJe8/JyMfGzcPp ZM9rWmnN0dG3xLuyxb7IynRVXT1BOzc2PD06Sk5PX9fPy8XGy83V9vVdWV9kbWr33tXc0La0vrS0 uMLt1ldENS82LCwvN0JK6vfMvcnK2Njue+tZ+uvjzsG8vri7vb7I1WlbTktGPkA9PD4/T0tT8GTg 59nQ3c/g3u5n+mf04uPR09fTzcnd8sW90+/XzfNh9lRTTkZKQz8+R0tGV2NVVHR7eNbU1NTW2d/V 1MrG1cm/zNLQ1mBc809XYk1PT1hPUGdUV1xPVVZea3Pm59LZ287Q0t3c3d7vbXJbRk/P2m7IvMbJ vb3L0N5bTD84Ozs6OT9HRFtq79LNzdPV4+zk69nQ29jGxc7FxNTT0uHt/1hSUElIS01IR0xJUGBi 7O/g19ja4Nna3dnka234d+zlXk9cy8nVvbvBwr7B1tl2SEI8Njk6NztMS0pr5nrm1Obj3e/s0MvN yMnJxcbLyMxxbu9iW2hfWl9XT1pbTk9ZTU1nZmP+7efb29/a3HF76GVfe2FRa25XT/LCwsW9trvA u7/P315HPTo1NDs6OkVOUFvv+vrW2+Db3uLby9HVy8vFyMjG0Nje5H1u7V5YZVhQSk5RUlRMT1RT XXX67Nre7e/r8W96cml38u3n3+V5Y9O8w869usPGwMzr52lLQTw3Nzo4O0dHRlrl8eXP1+Hg3d/n 3NnTy8fFxsXGzs7Q4+bn9GNpZFNOTEpKS0hHTVZWXHP++Ovm5ut0fPxv693d39rS2d7pbV/bv8XS vrjGzMHHcGNjQzk4NTI4PUBMXF5l393v1cvX5dXP4uXU0NPPzczOz9fY19vc2tve4m9WTk1KSEhG RkxOUFdx7/DZ2t/g29vi29727fT+8/d++e59ae3MxcrLwcHLzMzaa11MQDs6OzxES0xRW15l+OTi 3t/v9/bv5djPzMrIycvJyMvP1dfd63hhVU9OSkdGR0VESU5aY23i08/Rz9Hb3Nnf39/o6N/c3t/h 925oXlhYW2FeWvPW3d3PzNjf09bn3tfrZVhNSEhIRkZHRklXXWnn1NLTztLZ1dLU1tLS1tDNzc3P 1eD9WlVQSkVGSUZHT1ZWZvPx593Y0cvLzczN09vofmZdW1xcXV5v/XD57v9rdfd6amtxeGpz7+7o 6OPh8u3pf3NvY1xbYF9jb3f89ufd29rY1tvf2trp9vl5YFdXU1BRVltbX2989/Hp6e3l39vc3+Th 4efe2+Tr5ur6et95VGFcWl5dYGV28fDx5e/l5PT4d3Rsbm5rcXZsfO3r7fnzdHX8d3JveGVgbGH+ ++bi3NnZ09LV3+XydfxlbGNeWllfX2J4afz5cG1q+3xtfvt96/b86+rt3eHh4+jy+nnxb+r79vZv fGRkYWNqXG1lcG523+DY2+Xe5e3mdHv3+v1qfV9hWmJlYG1yffB16ffb29zZ5Nv06mpkXVtsXGp0 eP1pfGj4bO3o9fX2+uTm6exs7ub34nrh3/ngYuxfX2FXYlhrWmxrbOn+3tnQ0tTb5Ox1/mZt92P1 YWlhaWhyavX2X/tp9/Zo6nzu5uvt/evp3+fj6PvzbmhdXlxyZG1t/Oxv4u7q5fHae+Np6Xz59WXk b3j2ZeNe6nB3bW58a2RtYV9qZHp4+u7t29ve2djW4t5y/XFhXl9dZV5rXmjy9Ozn9OH86Pjj7vVi X29sa2xr7Ofp3eDf4enh7P9obGNsYW9ea3X7+HNw8W/n/Ovu9XNya/7/7u/f/PT/e21wev3393h3 8HzvdPr/699o8OX24233b/dpYGZjb2pzd2Xue2r3b9/r8OZ+2njgd+/48ul97XV57mnpa+xgbWtv bXVr/WZobnlf/HXt4PfQ7Njb397u+3NcaFhmZ/xrbPN13Oz363rseO9uZPpw92pk6WPwbWzd+t3z 3uhu7WNtc2puX/t58ud95O7jbeDmfORhZnJz7Wl4Zt/n89xW3Vpwdl1ke2jxauT22e/+4HXWfels fPdvfF3tZ33pat5fevZfeu5v61Ds9eDidG/+5PXaYXbmeNhs5WX6cl7s++R6dWLldf1yZfdZ03rg Ye1g7uTf73NvY+lt6nFf9WDXZHj4ZN/47+Bs/Xj67eN34WvqYttp4Ftma1/2bn5nbNpx5/Vs8/d+ 6m/gWfJ19uNe3WbY/2t2b/R95nlt8GjvYfpt8G/+8u113mfmat7sauzjZNFPz3Vv7VVl8WB6YFri eGLdWupq79pt+erqz3jqbGnbbd9a5l/bdOxfW+Vw3Fv9W9tr995O0GfV9lXb/eVzVuRc5FTbT+Tx 8eZZ3ujl2U7NWMxR4Pdky1DgUt7j6mlM3lvObFnTS81dXNlFy2L9+VHW+tVfc2Xa1Pz0StzR4O9M 8uvd5k5l59/TWF3Z6d1YW2/t8eh/bvT+3Hrubm15cuVmdVlz9Ojw6ub36l3l8+xsXXLt6/JW52/e Ym/w2+Fqbfbo4W1zY9/qdWlf4Hbna2vo+OdgfuvieWF88eVqYOrj42J5+t93aGZq+FpeXHLvdXPs 4+TqfuPk3uX+7fDm6Hr/9Wl9XGdle3r6cfx89uT97PRx7Gpza2xzdPfweO/s5/Z79PXmeXlvb3l8 /m7teu5ucu596Hp+emdwZHnxfvHt6u7s7N/z+Or373J2eW5taXn4b+r0+2lvbnh3aPht8GlvaXv2 7evg2vvm4vn+aO5nbGd2dGr/4en09uRv/WdzbWl9dn/t5vT78fL97fZ5bnJy9ml7bv1y6uZ83u/l 7fR2bP5vYHv0cXb1bmt16XZ0e/V4e+7we2Tu6P3i5+Hv/+f9bG768mn0e2hobP5gdnH56uT96eJ8 733ueXVrX/l4+3/rc/nfdm3/8Gds82r2d+/25d5+5+JUbMJeS9NsTuPeZXbfXFfsa13r7l3m2F99 2vdm2uJr391h9Nt4b+V+XOp5Wmh9Ymf59nrq52z26Xb94Xl0/W9n6uB9ePl9/uryd293aW96evlw fPvt7OTievX9727m7WnzaXL89G/rbm7qb2d+8fz++3x8bW9u/3V4efP27uzo9ubk+ePoa3/vYXRy YF5wbWT2dm3173Z96X543et68OP6eeVq8+n3bvByYO1pYXb8dPLwc/zfe/Xv+u5ueH3v+evf4tzY 1tjR1dvjfWNUTktJRUJFSUlRXGhz6NnW0MzOzMvQz9ne9mz/YVp1UT/KvTa/qk2/r7Tl1bFFRls7 OS4wNDIvNE9APMzKcMmyusCxtr3AxsTT3/zWekbtXEpPV05AVE9KS1JTTmZjZHbd3tzR1c7PztHj 3l5aSXu2P+Gk28erscVZs1g1RC8vJiYsLSwtY2JFv6+6uairtK+zusr+6fdOPHlmN2PWUU7OzlHk 4lhJREg/PT1HSkdk1tfRvbzCvsTK5GBQRTw8w2w7qbHKqqusz7jBPEYqKyggIyovKT/H78muqbKs qLGwv8nOT0E9U0I5VtxpTr+83sa9y2pdTT40MjY0MzdTY12/tri2sLC7wsxqTD47OzE0aMdCuqK9 rqWpuce3PjUtJSggIiYwLjPEyMOwqauvqLG4vn/aVz49TUk4ZtlJ27rN1LnG791fQz06NTc6NUVf X9G9uLy1tL7D4WRNPDk4NzU8R0LNrL60nayvpq69+c81LSwfJiMhKTo9Or63vq6prLGuvc/NRUpN Pj5S6UrWvszDvrrPzs5US0I8ODo3OkBGUPzJycO8v8DH1edgSkRIQj5QYVvZyM3RrbHep63JtsDJ O0s/KzMoLSwrMT5uSb+2vLa4tczGz1f3QkpSUmfrvMfDs7q9ysLMR15ROzk7Ozc6PkdKZ+fNxMu9 wMnG1+ZeYU5EUkVOYlvt0c/r37q4d7Wszr22wFBV7jU1Mi4vLTA7TUhevb/JubnHy8XfcOxcfeXj 2sXD2sfJ1fdh2khIWUhFRFRHTVtX6fTp0MrU6cvZWW57WExYWkpPbenz19HT2N3fY87C5b2xwb23 vN983Dw6NS0uKy8zQkZcxMfDvbjAwr3S1Plzd13tZ9zS3szS3s7iU8ztUNzaUkr7SEVNSE5JWmfq ++7J1u7Nzuz36HdPW15KVFhWVmRtZtzqzLXAuKu2t7O601llODEvKywsMTZJXHLAwsHAvsXZyfth ZUxUV2/71sXOxMDOz8PNT8bWR+TuRUdhQkRVT1Jf3nTY4enPbGH7YUxPYE1S7mFZ2tjlz9HPz9vS 3ci/ybq3wb7Dz3tNSzg2MzA1MjtDVmlp0NzV09jec954dOL32dHIx7+7w77Ays/O3FD+SzzcQjrW SD1yXj5Y90p263lr4Hn5ze7e1+x3ZnFbbuXx9t98XeDl7+XWy8S/vLbBvr3S6FNOOzk5Mjg1O0NG Tln1X/3efvPa1N3Oys7CwL+9vr/DxNHZ40xXXz5KVkFDTkhFWFVba//m39zgz9XXz9rf5O11bWtZ V1JRVE5WXVZl6vbzz8vVyMLBvry3vL/A0/RNRz84NzU3NDhAQk1a6OnXzM/O1s3Q3Nja09bKxMnD xMfK2OpdU1BFTUg7U2U/4dNN185t5c/f2svg6+hmZ3VdTFVPSktJUFRq9+fZ3djO0ODNy+nUxsfJ vbnLwL3i3GpPQzs7MjY1Nz5CTE5tcfTV38/Qzs3OxcvEvsO/wcbQ2etdWUhGTj9PX0TieF3b9PHy 7l1obl395d7a09v37WNaUkxSTVNdXHn43t7l2ure3u7Z2t7Yz8W/wbi9yL7V9lpHQzg5NDI1Mz9E S11819PHxsXDwsDHxcnOzdXY5/P8aGlbV1lNTVdJXGNY6nXt6vjg2Nvcz9rg1+Dr7mtfW01MUUlI T05RYmzv3OPi1Nngz9nczNLbzdDJwcS8x8zHX2BNPz84Ozc3OztNUXbZ0MrJxc7MztjU29nr3tzs 3evx7Xn+bm5rYVpfaFV9/Xnf3djs3t/k3d7g/u9wZnBXWFNNSEZKTFJdbubg3M7R0MvV29Hj7th+ ZfPWzNS8u9u+x2n4UlA8PD01PTc9TVBg78ze08nTztDN3tjcb9Dc3NTa1+LX5Xt7W1hSTldXWH5o ZvPn7uvX397T2u3i5Wx7bllOTUtJU1VbfvXf29fV1tTkaPtkUe/va+rZ3c2+xr25xMjP5k5KUDo6 OjU5O0hMdN/zyczQycnN1sze9Nt7/OnsbezcaunqZ2dfW1NsXV/cWXHHfuPD2+XR4Fpv9FRna05U W09QZVJSdXdl6Nbl19Hm3OJZYPlZZNve99fRzMDEv73Hz9feS0hNPDs7Ozs+Slbi3tvLy9fTyt/2 3/ptbe/t59ro3dbm59rfbXRqVGt2WV5f6Px90OjY2Hze+f7x7vNeZF1OT1ZZVlhkc3t78+rk8vXp aGBiYnTz2tTU0NXVvr3KvL3M1WFpSj9BOT47N0BLT1ze0tvPzNnU1Pjh3XT+9+zo4Nri1NXs4+f6 Y1xaVmxuaeLf6Ojl5OXs8O7n7nft/GZmWFlcVlhXWFdWZ2jt3OXe3ePs/XlsaXj75Nrj3tPUyb7B xcTGy/RaTkdEPzw7PT9JVGXl29bW2tjf4ebt6HFma2n06Ojf2tXb3t7y7vNfZe/2dnxgWN/O09rb 197j8WNfX1ldW05OVFZcZ25jYGls9ebg2eD+dW98/Glqe+jd3djY28q+v8fJy9j7d2xRSkdAPkBC SVVfc+ra3erd5Pf48HZkYmBrdezh4tnX0c7Z3tzi9/vp7n747/tv++59/u73enlpX19dWVdVVVVW WmBvevTm6e7q6e/s7nh29fj63tfa3d/f7XDfxsrXzsnU6tnX7WxdTEE+PUJMTVNebWpy3d7r5+tt WVhaXGzj2dPNzcvJysvN0uPw4nVfaGhcWWx8bv5sYmliXl9fW11pYWBvdWlnbXJ/7/L16+/+fXp6 /vDx79/Z3eDl73Fd5cnP2M3IztXLzN76W0k/P0BDSEpKUV9k/9ze7+7zalxl/vzt6OXYz8vIxsrO 0Nz9avHhZE9afV9TaPZiYm1naP7x8e1zZf75ZmdxY1leaGNpcHDz6P356nR35uv939rr7t7f9efM x8zOysrR09DkYVJIQ0FAQUVLS05aYGrv5uno4uLp7Ovr8vn35NzWzcvOz9Xb7PnW1XVjcV9RVmVf XVxXWWRndubt/+Xa6vfufV9aXFtdXl5q9eru7+n06d3k9+/i7njq6+nNxs3Ty8nU1tHfa11OREA/ P0RJSEtZa3be1Nze1dTa4e94bH7x9+fc2tfV1NbU0977Z1xt7WxZW19bWmloYnP6dfTl7+fo/G99 emRhXVdZYmls/v138+Pj7+zm7+zi4+7k3enRxMvQyszX39rkX1VPR0JCQkJHS09h9vTs3Nvj3trh fW52b3rv4d7c19POz8/Q2+Ld2N7ueGJXT09RUVFTV1xs6eDi5ern4e13bmNfX2FrbHP79Hx2+PPt 49/f3+Hs9nVx++TPys/QzM3T2dvka1VOSUA9PkJFR1JpdO/d1tLRz9Td6vr07fbv5Ono2tLT1NXZ 3+1zc+v1YmNqXltdW1pdXV92dmh27u7q3uV+e2xiZGVodPh5bnn4e/n6/+zj5Ork4OTq9NnL0dnS z9LTz9TicVNKR0M+P0JDSFZmbfTe2tPNztPZ4err8m5pbHT939TU1dTV1NHY63FlW1RTU05PU1Zb Z3L97+ri3dnc5Ofn7/18d2xfXmpza2pvdX356+bu+erf4ebf2+Hm2dvk3dnf5dzffW1qWU5MSUVH S0xTXmd949vY1NTY3N7o7eXs7dzc/vfb2t7a3eXf3vNxZ1hWV09NTk5RXW506tvc09DZ2Njd+PLp cXd1YWFyYGjxZ3zve+j4aezyX3P4aXX67+b7aVNN5s/v3tHczsXO3+R1cXBcUUhFSU9dbmpj893d 5/b79/jt5u/67eLh2Njo3uDh3/R3ZF9dVGRVVnZbed9g19r7y+Hry3jX2lvbVVXlS2h4S+NbVtBP /c9P1OxT01t2z1vv5Vf43F7d42LX6/rXc27bYnDbX+/kdOncbdz7Zt5camNiY19lU29bX/lW3Pp1 z1rQ/fDNT8lT3O1Yyk7OZe7eWMxXzG3p21fbWG7uTNdL5mBT3EjOXF/GSb9V0t9lzVDOVtxdX+JM 0FLjel/kYmvbXtZsdM5Jyk3ZeFzLQ8JGym7n013WYOlq729vbXRf7FdtclXPTcpKzmNvz0zFSMhQ 0Vh1+GDfev/oad7q9tte3W5u4E7MRMpI1mRb11LVZt572GfVauRscGpk31/iXt1c3F3l9mruXu1r 62vVbNNe3nDu7Wtza19l6lXKTMlZ3Pl5/F7oXelg7mDoZ9hm12TRX9V88+NP007YU3lfZG9vYNhc 1nD04V3dU9lP2Fr17/Lt6uXt5d9o11baYOJ663xv7WDlav/rZdxS1U/dXuVh21/ZVdVU6ulf0kzN Vc9OykjITtxvdn3lX9hc2GTn4FrXVuR9c3Nq9G326/z5fO5i213safP94Hvb/H30dnT3WtlTzljX YG/sVN5Y7GPyX91Z0E/ST9FX2l7nY+vy4u7j++nv7dtq1VnYV+Fi+FzvYfltefn9Zu9U2VbcXttu 2WrVaOBk3mTl7GrbX2vqV+dic2lvZ/dj9XHz7dlszVrRXPjwWuRnbtZbzVvdbfttZndi/GZ97X/o eW3uW+r8cs5YyVDOWub5cPFh7FfbYfH792rZU81OyUvJS9ZR7FptdG3tfONd1EvIR8dMzFTOW+Tt Z9FT0FXQWt5rcN5Sz0nPUuF6a+Vv6GfoZ9106G/fYNZfettMzEffak7JQMBAx1De42nMT8lUznL/ 3FjfWu9df3Ju7HHmYefoZtJW3OZXyEHGSuJ2Vs1KzF9+0UvHTNP+Ys5PzVPeaGN8XWD6Vt9j3/n2 7P7l4+v77e/9ePdn6/tv6F7mWvVb8mXsa/xu523k9PneZ99y3/feZtz1a99c7Xp3auVd62Rxa+lj 3FTeYu9+fHh38nb96+rs4PrXdNxifW5s/FjyWO9p+2Tpa95t2W7aaeJ66O3vdOhf4l3xbG7oX99f 9nlh62HrZPR19+/n7eP88fXv63H7aPZy9H5ucWlsZWpmfm3s6/Lj+evv7OHw6XTse+9u73Pv9+r3 7X56/2huY19mam11bf/se977323n+ffrbOdg5WHgX+Fu7mp+a+fr3+p87GjtXfdeeGn8b+776/rv 8vHfeeZn5mTjZ+phc/p242TjYOBm52zxf/rxevlq/mzoYuRo53D5fGt9d/XvbOdg6Wrzee/35Xrg debue+Vt32TvXndrd3ZycGt7bOxr53ji/O7lf+Fx5vz/72XpXulr9fV46W3/X3Jw/PJ2cm3/9ff4 /vvyft/s5vDz5Xntafls+3Zy923zbPpub3Rn727ieu93b+1p83Pxd/D56nbqa+B13nb+bWb8Yftw fPRw43zgdO51/vZv8WftX/Fm7Xjk6ufp+ed47mX3ZPlfb15qa/737+/t7+/07+198nr1fu/78fLr 6+t99v19dmJoYmpwb/Zw7PPq7Obl+u5s/G9pamj1dXhh+mzh/uDz5uns5vf3dv1q+uj/Z+1t53D3 62P3aPNxfv17/Gl3bXB7dPb0/39u72x6/fvp7ePw5e3m6+7t/nlfbF9qXl9p/u7v8Xfj7e11efnw d/v/7ef65N/h83Vp6e/yaGV2ampjaWpy/WtyfPb5++3v4Pnp7+3qeun4+PJr/Wh4/Ht5dvRz8vt8 /H3l6/nuc/tmZGd46/p2a/fv/3/u//n87/zvcn77dvd6fGxrfXrr6ez/b3736vf4b3L97m1gdPZ9 +u71439tcvHv/Hd16v758fH4+mZv7/XvbmR2/m/v/vn8dejp8P137u55b2X76W52bu3l/ffq6H5f Zffm9mRtd+X3fnt4/u94bHXr/nv/9Ozu/m7x/Hpvd/fy7Pvq4+tyXm33b3Rs4vBsYG70cWxgdn3p +X3j3tbd6fF1aWRcZm1udvnu4/R38+LrYWTt+/tfbfHq+Wl95t/ubGTw3u1xfnHm83Jx+3hbdGxs +2315+zf5vP+bnju+mpqa/z3/3/r6/ns7vF3a2/+dvv0dHfn7ev57+9nd3L/8Wxxc+/sdmNccOrs bnTj4N7p9Oro9GhfaHVgXmJyeXZp797h9n7o7nJcY/p79/Lr2ujs4/7x63R1/P3n+2/+7O1sXl9m bPN253ry4339aWp3bPb2a2ht5eLvf+bk6e/x/HJqa3vqfHRdYuN9+GRl6u/16fTm3+/7/efsfXpg cfR0ZFfi3nHv8X7k6+98am9tbF9y/f18fuzm3Xzz7O3sY2tnY3Ffa3zteG73493v+Ovk5G9t/n79 dvt74u1jdvDf+V5u8ut5W2Dj8F5xcff3bPTe6erw7/v1625tfeTuZm9laX715HtbZ/546O535t3Y d2zy4+ZWXPHpeV9t49dv/vd7bV/h521oZHrn6Wtt7Ozsanzf7W9od+DubVpl4+lsV/vo3+9r2+dz anHo8+9qce7873B+ZX92belv92L131/2eW/lc3f99vrm5fL37d9nZftv+Wpua3nZ73763t5gX2vt YFj9/uj7/+7t8H7j4+jlcH5s/GhY+3bud1tt6+rzeeL5/uvy++Lpbe7372tV6tvheVVx5uD1WvLl 62BZ7etnWn/k63hb39nza17Y3Wdk99jg62lo3d5hU2rtaVxsdWz+/Gv+4nv8aXPl6fxq4u7s/3jm 29zt5+Dq5nxjZWZgWVtuc2fu7nvp7HznefvravNpafRs9G9u7uLmceXa4PppeXbtemdqaGh1fnDs 6e/b7fnza/1rdG1o/GXv8vVvX/Xs6m5t5+Dc9ODzeXha5t/9YFjv4m9qZH3m8GZoefv9WHzx7+Bp 6+zh22no9Hp3WX3k8Gbr4O7wX29qf+pd9Hx4e3Hvfuz/8t3peXX5bGZl+eV45u7Z2F1sbGt8ZmNm eGJ89Gry6u/l927//t/mYv7Y3O9gcubpeOr7+/Jte3JvbV9eZOz+a19723nt2uT2ZO/xflts8evd a/J8/OVv/F5r7mtkX3Ds7nfd5OFwZ+P3bV/x4+7u7/nv1+5+Xl/vVGPl/m5j6drkYVzx7urucv7n 3eP2fevfd3F5cXtna2tdfWVpZ2nqZPDo5/b14+fpfPvp5+N1Yfz2+vZnaWlv7vVoburefWnx/Ol8 Yn344u176vH33Nn1dHBxXVpqWmFiXl5x6/3k29zT3O917/NtbF9043pecdPPeWJs+fNoUVx+XWB2 f+Lhfn3t8uTi3PhkfN/d+X7v5fZe+Gr+9FXz5u1uXWn+4nRsbHZ0ZP7n5/jo+3ze7X3+/+3y7m1m 7etsY2t1YmXr5NvzbuXf6ntraml9+2t67XV45fV9a2ru7f5uZXH78+X7ZvXf8Xvv6+nv7XRrcmNy /3x/dG5793tYZer163H75Or8/N3g8WLq3ePpYX3m72pf+X7wZmFwZmxkdHRt99/u7uf853pq+vzk 7nNsX3vu+XptcuvbcV7v6eHx9OvxfGn9dfv8d/l66ep+6vDu9/VlXG9nanBf/3Dz+WP58fj16efq 5+n99PZncurqeHRsYXD0XmPr6ezl7PR7avPpe2Z57u/v9OHo52xk7ml2bGpt++NobHxr8/vr+X1v b/P+7mnd2GVqduP4Wv3e8PV27Nvv+21nfO/yaFpiZnfn4Hn+39z/bHZt6GNf6PDqcOz9+On582x2 WV3we/Ji7uHl4W3v7/7ndW7x+XRt6HludHP4at5kWX557n9vdtzmbfjo3/rx6nf56uTvb3Zw6/xk Xlpk7fFlbu3j8mNhePB+5uHd4/vx6N1xY+ryf1VTdGp2bt/be/Df3/lkb/F8b3BeYfPmfmN+1epp XWzS3PB26+n2dmn1YG1lYO5+fm1w3dv8Xvjd7XF7bGXsXW3i4+584v78cGpm+vVc7ubud3Ll7Ohs Xu7qfGNd/OLk7Wh7/nT9f2x5cF5+4Otycuzu5urr42lp++TrZOvobHR74O5tc/l6e25k/XJ+ePrh 8flmde3g4+h2Znpn+1tYefHY/lz+63t6fvDj6/596+RtdOft6Wlj7OjwWXHjem5f6Nr6Wl/f5Xp3 XHzZ42lg6uvvY27m5OpZ+uR7919k9eb4cvrxdWhmber3YXrb+mJs+d/5eXDs2fhzeunqeWpm4/dk at7UaGft1t9kbmf5Zll83PZU7d7p+2F49O5pW2Bx/mxed9vubvjh3eV6+ePm+Hnn+O7n5OJlZmtp XmjueG9f+/vu62/n8fhuXXb4emNz3t/i93nf63f69fRqamZi839rbHfo8nJha3zu6PHf8+Dg9H1t 2nZeZ3fi9/N0dvx/7nRqXHvobGRw7evp+Gv97Ovy/vLrc1944fF1Z3/rb2hrau7f4/356uvqdW9/ /G5l+H1v6+F/f/f58WJt8ub3X/j1+f1uc+jtaXpo8+rtbV3p6Xlye37w8HXv6Hxo/Ph29vF0YG3u /vv8/P5t8Orx7+n0fnd9e2T16vL5bfXp9WV36vltZ3n87mlf9ezf7WV7fPRuZW774Or25tvy8PRx fGp95+z4dmp6bm5kavDwa2x9+uh1d+vo7GlobPntbm7m4vHk6u/p9Wxzd2Rqfn9ucObi+Hh96nNi 6ur2X2Lrdm1jcuXt625q3+1nZHjk53Bs7NrsYnDj7GZs7uD1bm1t9PJuZO/obm10499oXH3e7mRl 7Nzg73nf42Z8+GZeZnRzdOnsc/F+bHVtef53cfx+8OTp6/zp8nJ8cPv5/vbvdWpvdHbt6/Lq/vL/ d+js/W999m9bYvX3enHu5+7v/Hv3eGpjc3doZ2Ht3+X6bvXg4vxy7+RzY3P45er18+vqeWBedXN0 cHD1/flz+uTr/ndy/+f1cv/n3u188e34bWRlbGhjanJvanPi3/d8+OPi/Gps+Ob2Y2r0829z69/c 7P3q8HhrZmFr8+5uaP3v8v9n/ejxdm747fP++un6a2p6eXN3bfzu9Xn+5ev79erqd2prdnpnYnrs 9vry9PD4c3vy9XRocu1+amJx7PhubvPo6fT15dzkdm/96PFzand+enJ08fLtem308nhwfGtiZWd2 fXV88N/f6fTu7Pd0b/ptaHV99fj7+OXf72plb/7ye3h8fnn+9/19dXV/7+vt9H7173tqa3Nwc3f1 8Gx86fFuZG/46+/48Ofj8ffu7HxrbHZ5bWBiaf1/bX3o3uXufv/0/29pdfv89Pby7Ojq9/96dXVz cHd0dXr5/H5++fP7f/r6fH349v78eG1vfP5wanJ5fPn+7uvs8Pnt6erv7uz8eHL59Hhvb2hrbm9u bG568PLx7OTk6fF8/P18cGpram776+z2enb+c2ltc/77+vXv7/X8/H5+f/96dvz9fHl79fHz8/Ly 8PJ/fP58fXx0bm78+n3//f7+eH379+3t+X77/Xn+/Htzb3L++/nx6+jq7fF9dnVubm9zbW1x/vn1 /H39/X12dHn78/Ht6ubn6e3y+XZwcXlybnR7c2tqb3V1eP30fnr37urq7vL6fndxePz+e3Bue35+ 7urn6/Pv8/15ffz8fnJvb3FxbHH69fX59+/v8X5+fHhva3N3dXb+fnp69+vq5urr83x8dXRwbm10 fnx69+7t7uzxeXZpaG52/vbw7+/z9fn07u7t8Xt99/j6d3JvcXV0c3R8fXf/9f5yd3h++Hp5fv3z 8/Dp6O18e3xzcmtpb3Fvefv49Px+/fbr5uft9P34/X15cHZ3d2xrcnry7e3v9/1+/fb38/d+fP34 e3v8enx3eXt4/vx+eXh1c3FvcXzy7vH08u/y7+vo5+z1fHV6d3Nra3JubG52+f378/D1/nl4fHd7 /Pbz+PDr6+vu7/T8eHR7dGtmaHL7//58b21udfzz8vf09n15d3z48/Ht6+zq8/f4fXd1dG5rbWtz /3h+fn3z7+rl4ubt7/b1/Hpvam1yd3RycnF0eXr7+3Rvc3p1c3Rucvrv6+jp5+Tl5+zx+fv8dm9p bXRubXX8+/76+vx9fnx4/vz09X5xcXt8f37/7+nr7vh5fnx2dGt2fnz+fHZ5+/Lu9fjz8vn99/P5 +v3+/ntybW5tbnJ8/3Z4f//7/H/y9Pf47ebt9/Ty7+7x+fz3eG1ybnFvbW1qbXd8fXh39e3z9Pb4 7/Lx9XV7fvr07efn7/l/dnN1dnh1b29tcv73+H/+fHt2e/f5dnb38Ovu7+rq8Hl5/vn2/nRubWpt b29uc3Z8/vvz9X7++/nu7vX7+fn37e3r7fP5b2xsZmlsbW52cnb+7+Xn6e/z7O95e/v+/3l8eHNv bXN5fPfw7urp7fh8e352cXFvbnF98Ozo6O3zenZybG5vefl8dXr68erq7u70/HNucnh+d3Z2dHp8 fHZycXl9fHv66+rw9Ppzdnd/+fjx8Pn39fbz8Pl3dG5x/vP5/ntvamVobvjh3NfSz8/S1eH1bFtT TUtJS0xOUlhkbfnq49/e29zd4+Tm4tzd3uHe3d/g4ubq8G5kX1tZWl1faGlrevDi3N3Z1M3P19vg 3/B2YVRVUVFOS0pKTU5VV15pfuji2tTNycnLz9PX2tzj6O3t8npoY2NhX1hVU1hcXmdocP7y7u3t 7erq5+Xf3uLu/nlvbWhnX1dWeubs3tnV0s/O1djZ4+9lVU5KSUhISUtQW2Jv6tvQzczLzc7S1tvo 7/p5dXN1bWViZWZlYFxcXV1cXV5fYGVtdffo4+Pf1s7Oz8/T2d/k7/trWF/1dm9z+9/c0t9+fGdn Wk9HQ0VHSUpNUmbv2tHPy8rKy8/R1dfc5P198fdrZWZnbmpoZGJmYV1bW11hcHX45d7c2tfU1dre 5vZ4a2NdWFZYXmRiZ2tietrU1NvVzsvI0t/y6vxaTkZFREdISk9YbPDj3NbQz87P09bY29/m6+7m 5Oz8b2ZeW1lZV1daXV9iZWRn//Hn29XU09PW29/h7vR6amZhXl5lY2FlX1pbZOzg593YzsnM0NnY 4X9cTEdFSUlJS1Jjb+ni3tvY1tbT2NjZ3N3f3uLf5+n4c2tfXllaWFteX2BeYGhzbvfm4Nzc1tXb 2tzn7/ZxZlxdX2FnaHf6emRaV2vh/Xvq1crHyNDR1uRxU0xGSUpLT1dia+jl393i5vLq/H797+78 8e3j7PPs8PP17Pf86+zq5n5pYFpfam13fu3q4ufq4ePk9XlramplZF9lZ3ry7O78eV512+346NvS 0s7a393wa1ZRS0xNTVVcbHTr6/Ho6ubt5+l+8u7s8efe3Nvh3+338e/sev/5fG1lXV5iY2Ngbmz9 fG37+efo6/x67+7v+e3q6+Pj8G9hXFpSX9vs/ejcztLO3+/jeGxaWE5UX1phY/h2+vJ57vT7df5+ dXdze/js6uLq7uvq5eTc6OTobnb9fW11aGNsamtt8ndueX3w7/Fvevz77vLt8e7/7+n+dWpmV+bS f/Du3d3f32R6/mldWVlSX15cannu/Onue/jw8ffq9Ozg8+/p59vc4Or17X9pfnJpZl5obmdcb3to anV1/fX+9G/7+fvo7ujk7fbt+/Pw5t/pdWRha9HkbN3aytXa7V/7WU5HR0hMVVNlbN/b2NPf1dnd 6ebf/+/1+vl8e/PofG5/cmxibGBZ5O1kefttdmtf7u/o5efW4uTr9d7m9mFfaWdfY25tX1Hox8vT 1cvGxc1sU1RMPjs8PUFISlTYzM3KxsS/wc/h3tp6X19gaX5sa+P4ZXz+XmptWldaW05cbFZn6+zd 2N3bytDj1tXh92NVXmNZS0xbfs3Vx7i6tbq/yed1PzYzLiwtLzZBV9fIt7Ozs7e7wsv4VUhGRT5F Tu7PxcG/ur7F2HFOQz01MzU8PUZX4MnFv766vMPLz9lnTENIRkBIVFlcUs6nrLqqrquwzE0vOysd Hh8jKzA72q2jq6ijpqm56UJBOywpMj9K3dK+r6uttbO3ymU7Li4sKCcuO0ndx7mvrK60ucDXXT83 OTg2NDpGbszpW6qYpbOgoqa4QykiLR0SGSAmMkDRqZqbqqWfqsk6KykuKR4nZMC7raignKO85Ltj KCQjJy0rJTi+vcu+ra2ru2vJwFgzPUY/Pzs4Xc5FTce998Wgn66noK6xzy0jIyMWFyAlMvXGrpyZ o6ylr2U5JiIoLCYpbLCqqKCfnZ+5Vjk1Kh8fJDA0Ok/ArbG3urG46ExITkdAOkZbak5F9s/aUuu+ zV2xnKe5o6W0xDQjHyMbEx4tMeO4rZ6Yn7avsD8sJSAnMC4xv6Wlo5+eoqrSNjQqIx4mLDRSUMO0 rr2/vM1vRT5AblBM3cbQ2NJPWfdMPU7oZFPFn5yvq56ovTwjHx8dFBkwPE+4qZ6YnrS+tkQjHx8m MDVCtJ+goaGfor1MLi0lHSYwQUfGu7ayzu5pYjk5S0lq2MzCs7bN1NZLNjc4OEJGYt/Popajspyf wD0jHRsbFRUwXk+yoJ2ZnbJxyDscHSImMkvYrJydpKOirFw7KikqIys/xc7Gu8PHXz43Pzw6TfvN ubK8uLXHXlU9LjI7OT/tx7y/spqYtbChvTwkGxsdHhkmvL+4pKGfn689N0IkHCYtPse6rqCdp62v tvs1MSwzMDRcwrvnzO9ZQzM3PExG98fDu7i+ysPPSj5EOjFBX2XKvL7IxaSYrc2mtVEpHB4hJB4m vbjBq6qoqMExKjcpITNPxauqrKWkutnpP1NGMD/Ky23AwcbfPDAyOisvSlzUv77FtrfT3+BrT0U+ QEVb6lnQvL7U8rqfnM3Jp88/Ix0oJykjOLLAva+4r7VCKy49LTBzza+psrOst95gU99zS1fXwn3j 2dv4OzU0OjYzQFjez83KxbzA1NvT2k9NTUVFcXRQ2MHGTcienLa/qbhPKB0lKiUgNMTJu7K6r7FP LTI7MjZQz7OsuLquu+rmZNrNWHTOxF5U5WViPjc6Pzw5Ql5+79TRy8DD0NTOzXBVY0pIU1JT28rR +2Wsm6bWsKzoMyEhLCwkJn++1bu7uq7ANi0/PjRH7MOus8O3scjV0VnHvVxUyddVYktQb0MzOlE8 OkpMZt3yZMi4w8rCyMlsREdJP0RoXta901i5nZ6+v62+RiQeKi0mIznCysC6vbC1Ry43STw8X82y rry9sbng4WhWxcdFZsLvaV1LZWI5Mj9HNzxLTNvQddS6usrGyNfWTT9HRUdXdN28u+fVsJ6i38ev zDoiIS0uKSU/vMrGwcCyuz8tOVw/P2DMr67DwbK4yenyytF1RWDZYl5Y7GxKOzk/PTg8SmHb2NvF ubzHzM7YV0RBRkxXcHrQu7rW36yeqkvBtVMyICU0Misr5bnKvsjNts4yLUFfRVzcv6uw0cS6xORM W8XCW1DMxeJYTmNkOjE0PT47QVDQv9HZvLjA1vjW2FA9RFtfX137vLfTWbKbpWDIsss2IB8sNCkn ULm+vcrSuME0KTlWTFvbuqmrv8a5v9tHSsrWamXYw85kS2lYOzIzOj0/PUzUx8nMv7i7y/re0FE+ P0pccVBYurRvRLudntz0rrtJIh4sNCwlNb29vcTftrY/KS9hXFHixquovNfCv89UPuS9zF1wwsHV Q0JuRDMtND9EQj9vv8DUz7y2xHdg5OtLQElZ5/RS2Li8696pm6xOu79pLh0hLTYrK92+u7jt3bfO Mis/9ejKz7qortNw1MjtQHPEyMXk0sfPWEJNPjgzLzZFSkVhyb7BxMO6u95gfmJKQkZJZdJP57e/ eWuqmqpTwLvVMB0fLDkuK2u9trP9arrFNig2d9LH4sGqrMhYdsvJSD/Jt7zrU8m83D48SUQ3LC9G W0tE47+8xt7EusZmSltwWkdDcc76Yci/z1q8m57Fx7vERiMdIjIzKTnUvK6/U826YywsRdu+ytuy qrTeXm7VzUdJurfO0uviz1I5OkM7Mzk8QPNnU8y+w8vBv8rHbEtYRklVT1je1uLHwVlcq52ozsi9 yjwgHis1Ly9Dy7Sux1vHx0IsLT7avs/Usqy4z3pf4cl8Wr24xNNbTu5hOjU9PTtDPj7y0+rZyMnE vNRq0/NNSEhMXN9v2b7HxMJWQr2gpcndxbtqKB8nODcvOVjCsLxW7MVxNCw2d7zG27uur7vcVXq+ ykjZvsXOVUR5zkY4PD09RTw2VtTm3c7Pv7nKaOfYXVVNRF/R2uTO2djN90JHsp6p18TBv1AlISk8 Oi9AVL+uyFDqzlMyMj3Yt8PItq+1xGpG379YUci8xPo+RcfrPTlCRERENUDbydXe0su+xl9f0uRY UE1Zfn3dwslTXc5rRmGtn6vF2cnFPSckLD0/Oz1MvbHJXVztUjg0PM+3vL6+vb3KeExdxc7fvb3G 20tAXl06Oz4/R0w+Pt7K1tHb/sS/4m/X3er7TEdw2+vT219tz9xAR7OfqM7gxLlaKiQqOT47OUDK sLz3Xn1dPzY69by+xcPDwcDOXFfLv+nJvc3OXj9GYEc9PTxAWWFDW8/P0uBe1bzG9OLUfV1NQkrg 0ernYXTJ7z9OrZ6uz8zKulQsJyo5ODg9PM2vu9hzZUs9OzhUw8G/v8fCu8P1XszDzLzKbeBbSEJH RE5RPz9VW0hYbnvl6XLUvcHIxdVbUk5ERk5n1cxwbMnYRjq/o6m93cKzyDspKC85PTc0Y7Svvuf7 dE89ND5uzcbKzsK3uMth7MLIzNlQde9+Sj9ITVxDPD5caFRfX+LYz83DvcDNfktDTkhFVNvFyt33 09NFM9mkprrNwLG5SColLDE0NDBFtqy2ydjuTj4yNUzaycLFw7azv+Rj18545H3u2v1MRXtkV0c9 QFVaP0zn0dPPz8K4wvNZU0hLRTxPzsrNz3F61vs8L12po6/Auqyv6y0jJy42NzA+vKyxv9tZRj0z LzpL2b67ubSwtcLZZmbmXkxYd+bh6FhRXlNEPj0/VHZkdNrNwbzB2OlrT0pIQ0/c0NHV4Pr762JC NVuoo6+9vK617DMmJyw1PDU8z7OvutpHOjo6Ojk9dLmvtLi2s7TE30pAYe9+TEhczcpZSEVOU05C QFffz+D/7sG9zmpOWHzmVEhu09j6UEpb6t9nR0jLq6m4u7u3vPU/LCouN0Q+OU3JvL/PWD5CUk9J RVHXv7m3tr3DvsTjZFhRT05pc1pPWePvW0tJS1hpVU9T5s3IzNzY0M/iZV169mpOSlRadHlvWVnv zbe5xsjDv8rK01JLSEZAPD1CS09PWmpWaOXzb29+Y2L64tXLyMnGx8zP0ftZYF9dYXLq3tXb5d19 VUtEQkZNVV5s7N3S2+rmeFlNTlVf8Nra73rUvr3Iwrm8v7q4xPlOSUQ6MS8zNDQ9SUta3c3O0M/V 2Ot46dzRycO/wcLBxdV4dmpfb2lZWWhpb21ORD9ARExOTV7b0c7M09TR5mJVTE1a/+zt5uHIub3H u7rDw7zC2mZLRD81LzE0MjdGSk3v0M7MzdfV2PTqz8rOxby/xsPEzdna8WBoYVhUTUtNTUVERUBF UVtv39XXz8rNztd8Y15QTVRmfejn7cm4vcm9usXKxMvZfkxEQzo0Njg1OUZJS2vW0c7P19jiZ2nb zczEvr+/vb7L1eNcV2JZTk5QT1lVQ0BERktSV1rlz9LT1dfPzuNraF1SXHx8/vh61Lu5w7+6wMvE yNprT0U/PDU1ODY3QEpKWuPUzcnR5fB+eN/Pz8u9ur2+v8rNzfJPWF5QTk5JSk5GQkdJSldkYO/S zs/Q3N3R3mlsc11c/vLx9WBdzLvByr27xcrGzuxkTUA8Ojk6OTg9S0xLY9/XzcrU6evj39fU08e/ v7++wMvO03BVU0xGSEdGSktJS05RVWNufNzT1dXW19nc39/rZ11rdnn1eGJa37/E3Me6v8jDw9x6 fk4/PDk3ODo5PUdLWOLV2c7J2v7n2NvVzMW/v76+wszLzepVVVRMR0lHRkdHRklMTlhk793W1dbR ztLb3drjdmx6fnJyemFXXNnFz9nAu8bKv8Xe4vVMPjs5Nzg4OUFNTmfW09XMzNnc1dXUzszLycnH yNDRztf7c/JdTEpJSUdISEdHS1Ne+93T0M/O0NnY1Nvs/n97c29ueXVdVVNd2s/Ux72/w729zNTT XEA7ODQzODw9Q0xb+dzUzszLzM7R2dbPz9DQ0NfYz8zU1s7XeGVdTUdIRkFBQ0dOVFj82dTSzMvP zs3V4ubvaGJuef799u16Z1xTV+zW4dvIx83IwcjT13VKQj88Oj1DRklOVmrj2NXS0NTU09rl5d7f 3dfW0MzLz9bV3nlnX1hPTk1JSEpOUk9W/+Dh3tTR1M/P1N3k6fH2+3Nsc351aXH48P5pZGJfX19l Z27v3tri4djV1tXT2+PwZlJOT09PUFBPU1lcXW3x7Ofh3dnUz87Pzs/W19XX3eb1aFtTVFhVU1RR UFRZY21v/OTb2tbOzc7Q1t/r7HViY2leXF9dXF1ja29mZmxrYWB6+frl3Nza2dfU19nc4O16bWVf WlVVVFNXXmVgZfzf29rV1dXX29/u+PbyfGZgX15cW1tbXGBpbHFv/+rh6O3o3tvj4NnU09fZ5Pd/ +m1jYVxUT1JVWmJv8+jr6ODg6Ozm5un7fmxkbXRydfft9HltbW10+Pfy8/13dXhve+vg4OTl5+Pg 3N/i7X53Z1xWVVVUVV1mcuzp6uTe3+Lm9XN+/XRxcXb16Ory+Pd9cnd++/b+/vfyfnJ+eXR2eH79 +u/o6n7ZzE9d3k/Zb1XVXPbuX+ZrX+pm8Nn4809b12ByZX7Pdu/e49fW7PnWavtrT2pqaW9h6X5n d3l85m3waHvufer77NzNz3Pu/lFRU1BSVE9d/tvd0MXjz9P0fm3cVmx3Wdxj3/nj1FnkWllfZlRZ 7mTwcuzV9NJv3ups22bf5V7ZYNte9GlX61L4YFTWVt7tdNf79Nt2a89O3uNezlnZ61fTZ19s7m1e /Ere6snnQr5B5+k1vkXc4ka0ULzo6MVewjnPSOJNN748wkRQv0m4Ru/E2s1J1OrjZUZ7V+j2SdLk 0vJOzOnaS0vQU9VPS83uxkjjxFXDQ2fJWtFGaMlY60tYxUzlT+XPXXdGy+jecW/NYspUdc5XylLT T/16WtlU3GRZ/F/6Y+5e4u3hYnreW9vh6N9x2Fnq30vkXFzPVvD6bc9P2NhZ3+1tb/PQSNbtVs9N 5lDgzUPJXN/fac9M1/ptZFzgW/JVfc9S10/Y0FfTT87TSOhe1fhH7dzSZmTb3t19XVHH8j3VZM9l TtpcwU5Pfc7IRWzWw1VV5/HWUE9hzVVH++XdUed15MpQ8+LN1E7aY9DZRvjz0mhOWeq/Pk3P2sxC 2mVuvkFlZsDLO/HkvkdLStW5RD3vt9E9VMnFXT9My89jPmq42khPxMR1UkXKylZBTbzSRURkuvdQ QOe2T0k/v7lBTU65zj9dbbrnPGrKwlFB18vPT0DO5uNNS8zw2UZ9y1zVP+vD2Wo9vM1IZkPDeGRQ SrZmVmjZv1ZhTczGPVBfw2pXdkvE6mdybMdK2vtY0HPsUuzke+9PZ9jfXdpfX87PSkvD4kJf49b7 U2fdv+5L7cbeUF9xZV9LaG/rdVzWzdRbWtXYfftObN7vaU/Z03RuXN7ccVdeztxnVdXUYltv3E9k 6l/jaVXtyspO3szhbVJeX9j+TOV8bGV51mR1d93pVnvq+PNV8NPWWFHW2WpRT8vSXvntz/Naa+7V YE3+1edJdtX0+l3l3eFeWd1pamfbX1LV3GFWb93t+Gnv3OhgXdjab+Nh5N9manHdamxj6dpWT2jW 6lxw5tvWZF/m0etLaeTrcFJn185iV/LR221ZfdLnbVDq5VZfXNbmcXlqzXbwaW/ZYm1V7NteWmLm 7mryWebdXm/112h51Gjp7HL2YuFWfeNj7u7de2/f7dxXR8a8S2PBv8Vvx8/t2T4+Sj83MDpJSkxM 2L+/xcS2t77Uy8r/WUVOTUhIQ1dXVV9v097u2NzT5u9nWHtoVVRMPMaqScaprKnRqq9luzQyNCkm HCYuKC02TdzOu7Swpqq1ra2yz8y7WGT8SERITTxEW0s9S1E+T0pKT1zrUN7M3sbDvcLAvtzf0GJB Nju70DHPs662zKu1ub40PzgtJB4qKiotL1TPvLmzpqSorqypssLdfmZBPzU7Rjo9PFRhSWtT6OBq XlV5Y1BSXf3Y337QxMfm7srf+VQ5RLvBN9OpqrS6qa+4uzw3NzIiHCUnJiUsPVa/ubeqoKKqp6ar tr/bXFNANS43PTc1PU5ZYlJj+t5UP1xbUkVJ2eTU08y5u7u+wLzK42M8PsPaOPq8tLvAsse5vjk1 NDUnHygoLS8yPny1sbSro6Spq660uMtMQ0hANzE4PEJKSE5r2mdabHlmV1VIV15XWu/LzcG8wLy6 v9nc8Uo7MTnmVj3su62tsa60rLhEPDUvJiEkJCwtLThtuLexrKemqqqwtLbA6U1YRTw8Ojs8Pj9B Tk5KbV5QW1VkVV9+X8/KzMG8tb2/u8vfYkg9NTQsNclTUbutpaqnqbitxD0vKSsgHyEhKy83QuGy ra2qp6eoq7K5vMVpSUY+Ojw4Oj5BSkRcXU/rYnNna3pQ7/lh1MrLz8K9zM3L91VMRjw5QTcv4LHF w6ympaentMu4XSwlJCQdHyEgLTxHSsKqqaijpKenqLXGwdBJPT44Lzg5MD1NT0rtz1fdzOVjdN9T V/lTXd/S3dfAx8vJ1v5a+ls/QUVDPtWzy7+ur6yurr5oxUswLCYlIigpJjNCWNy+r62opaqtrbC5 yt5bPkRCOjU5R0BO82x73dHw9OpXSlJNQENNWWffzsm8uL6/v8TU9VtFPT4+OzZEvbrJtrOtq62w 1tt4OTEoJSMkKisvPEvPvK+rrKinq7G5vs9mVEA8Pz9APkRXYOLZ39nf32ZWV0pGQUNFR1No1sfB u7q4vMLMd11SRDs5PD5GS0X1tLC1r62usLCz1kw8LywoJyIhKjE8SvXLva6qq6ysr7m9wdFtUEtE TFtJQUZeZGXgX09dXVNISk1BRU1U/f7Px8W7vL3CyMr+dWlOR0FGRUp4fllR9b65ubW6vbu+v9tZ RDIvLy4tLC40P1/Vxr67uLSzs7a9xc/Oz+/ualVRV1hLTFVOTFNWUU1TTUlVWVxicOXmzsPDyMjB xsvO2/5eXlROUVNWVFVPSU5OTExR6dfJvLq7vLu6vsbXYkg8ODY2ODw+QExZfOXTxsfCxMvKz87V 1s/Z4X1rYVhPT1hj/GZlbGR1/fT4et/7Z3z892Jr9fLa2uPq597o6+9iV1NXUlRcV1hn8+Pe2NbU zM7Y1dXf6+fvdvXf82N35e5kY2NbWmBbWVdTT0pOUU1OT1hmcvPq18vHwb++vr/CydLe72RUTkpJ SEdISUtPT1JcX2h86NrUy8jMzMvKztPZ83t+Y1ZcX1lVXF1TUU9NVF9udfjZ0tHMz9HR0NT0c21a VFBPTlJbVlt2/fHfz8zNx8nMztPY5+blXVVPTEtGSEdITkxMUlx58t3T0MjGyMrMys/Y1NXc5fFl WlpYUlBSUE5QU1di/u3n3Nze3Nfa4urr6vR3aWlqamZsdmtwdfzs7OHe4d/q92xobmJmanD4//rx 7u57/u19bGtra210bW/8ff3u6Ovw5t/i4eDj5+nm725tY15bVlRTXm1s9+3n4d/a4ezm5uXo8nNw bm9naGlncm967uHc3d3k7e7wc19hYVtYWVpXXmht9uHa4N7a3tzb3Ofz8fV+dnxucfPr6/b3fWZg XlxcWltcX2139OXf2dbZ2d7j6ezp9XFmX15aVllcZXn/9efi3tTQ1dvf5vpvbWtiXl1cV1laW2Bo e/Lf3d7Z19fZ3+b8eH55+fR+bWdvcW9vamthX2BbXWdxenL37+ro69/c3+Lm5eTn6u7v93JqYmJj ZWdtc251enx6efDp7e3w7/Lz6Obk4eT3a2hiYF1bXGFobf3u6+ni3N/g3+Hl7vtybXFvbWtlZGNn aWZseXr97unn4t/d4efo5uj3eW90cmpsampoZ25tev398vh7e3d1dn/7b3rx6Ofo5Ofn7ff7d2tk YWZmamlqb3ny6ujp7Ozo5ezy+Pn/fnhvbW5waW1wcHj99PZ+cG/66uXk5+fn5el+dHzy8P39eXJu aWhkZmloc/P09/3/9vp5b2hrevfv7O/u6+vt8vDy+vXu6uz59u7sf2xqamdv/2xsbl5l2+JobW94 cW78fnbp4/Lp79zd+trcb2Rkb3Vsc2BfZ1xecO3kb2J77ebx9+ff3uTp397x8X3v6HdoYmVqY15e WFdj79re/Ova2uRt+9jb5FZHWt/Sz+9XS1XUzexVUF/l71Rg3M7Wfezb09/U2GViUFBb6vBVT0lW eeLU0NHadmV73cTXR0dey8ntU0lryMvOdEVARXrI0WxLQ1rFusRSR1Rj7c7Bx/BFPU7LvcZZPD1V zsbXWkpXb9fL4+TXd1Fd3+pp5edlY+nM01JZd+fqZW5jWGLZze1NVufazuRgVVJ08tfQYkxXas/L fVBMYtrDwdVbSk58yMvZVT9FYc7T6WZNWuXSz9xxTlx+4tTx/vft7W92Zl1ldWZ35XNjYOPW9eVq cPdTbunS1lvu9O/R2OlQRU7/091mbFz3y8rXWVFmeNHO9ExKa9TP81pPVG/f1fVcWVdv7d3Y7fNg atvP0e5dW1xy2dTlaFpi4Nl9XVhNVWjt7mrw4dvU0tXnZ2Jge/nv5+XX2ufg5uptYlxTT09XWVtb X3Hp4OHh6HNf++Ls+HP+927l6Hb4//Ds8N/W3+TyY1lVdfp46Onq/D86z7ixq661zOvUSzs2KCMj JzZJy7i2rq6vsr/PXkA+Oz1JT/nXxby+vsTU4GhPRz8/PkBNUVxvZ+rNxcTJ0+n73e88MsGzspue p6nl1jErNRkbGxQhKUqxrp2kqJ+vrbJfUCwpKCU9T9Ovsqyqq6etsMQ7MCYiJiguND5i4buvrauv t7/V909FPzg4NjI2MjHdtK2cm52bpq3JOjQcHBoTGxofNXerqJ+dp6CnsK674T02LSkyOj5e0dHE s7SvrLO821I1KiokJywrOD9twLSoqaintLjJV0c0LiQkMzTIo6SZmZ+fsLhQLiwZGBYQGBsnQcCn pp2bn5udoae04TctJCEmKDBE5s26sLOtrbS9fj4sKCUhKCw1TNu6r6mlpaaqsLzzOysnLS1Pu7+m p62oubvoQjsmJx8bHhwlL0LDuaqopZ+hn6Corb1kOi0oJSgtM0Rq1r+4tbO1vNRTPC4sKiouNUP8 x7evq6qsrrrRQzxFOcq3vKezuLNo3T8zMSMpISAqJDA9Tb+8ra2spqqoqa6wucpdRDQvLi41OVBt 2MPMv8HS01BBNjE1LzxCRNXKurCyrbG3vk5HVUPNr7WoqLix2UQ+KysiISMdJiktaPe5r6+oramo raius7bXcz83NSwwLy88Pk3Xx7q0tL3PXz04ODY7QEBIXHnLubOvsbndU91avqmvoqW5tU42MSQm Hh0fGiEoLcm7qaGmoamsqrKvtcLIVEg+OD85PUM3Pj87W9/RvcXOdkZFOkNYW8/W2tR3597n0lRM 0nK6paadnKWouFI5KiEcGRcUFxsiOsquo56enJ6gn6irtO5TODEwLzk4PkY8PkM+WOHXzdbqUkxD Q01c6uHQ0dLNysLXU87TzqutqqKsrK++zE0yJx4bFxYZGiQ4V8KvqaadnJybnqWuxFtLPjgxLiwq Li45S0/i4t7z43tu1uXa29/439r2+lhQPEu3tqieqKGlvbfORDcrHxkYGBklOl+3rK6rpKiopbbf RzQrNUZFwru3ramqra5mOCwkIiUnJSwtN/K6rKSgpqivykcsJEe8sJmgqaK2t7tVJRcSDg8bJTWx qaCWlJeZn+UwIhgWGhweOtGrl5KQkpeoxkUiHRkWFhshLGi/sKiipaSpvuM7LSEjva2kkJ+hmK6o yisWDA4MESAjLbOjmI2Nk52oPCgoGxgaGRs/uqiZmpudnKm+ZSEeHiEnLzsxXL2xp6a1Y0gxLywj 1aqqkZedk6Ok3CUaCg0NDh0oNLGblpCQmKex2SkuIBkcHCdBr6inn5+ioqlZMychJy0xKy88Uq+k o6WuuuNwSSQlyr6vl6iqnrquOicbDBMTGDI90qudlpaYnbp17S0oJh0eKUTPs6murKOnrLw/KyUr LS41LzRTv66pqa64tbCzulEiHD+1rJqluq7PstUtJA4OFxYvSUy4sZ2WlpWessY5PTgqKR0hLDjC wLWxuKutsr9HOTU4Pjo7PD5mv7atrbKxuLm5zGY7NDEkJD9nvq3Csbjhsr/YPyMhHhwrPuKzrKWk pqWprr9INCkjJCUxSO2yrauqrqy/6X43Ly8yQUryzM69vr262GtBOkRX1N/q13Ld4+1uPjw4OUde y8C/vbWzusLQW0dUXEs8MS8yO1nx39zPu7OtrrK9bVNAOj40Nj5Jecm1tru/z+Hdd0U8Nzs9TGJu xsvCusLKY0tOSU5XX/de0r7EvcTWZUk/NzQ2Plrmz8fJwLu5vMK90VJOS0xIREpHUu9lemZTW09R Zmzh68u5vLe/zNBr31dEQzs6Oz5KT2fezbu4t7fEy9H9ZUM+ODA7P0RiZM3Cwru6t7/Zz9VnUEVN XlZQPUdUVnFTXPJ949Lfv7jDydLJz2tPP0JDRlVOTkhUdu3IycrN1tHOwNBPUkdEadfwXW1wWf3o XF5PWt/k6+jMwMXDx/Z4VklHP0JBPlLUwru8x8rOz3VLQDhCR0Ncc9nMxMDIxtLb92Dc4W9IP0xS fOHr2dfMyd/uW0pPUllXZ+JqYNrj5u18zvZb5WVjat3Kzs3HzNJcRVNhT0c+P1Nt7ePg8+DDwMzM z2Jpau7WV1RUWPdy199eV1pjZl1TWHH459DFzdnT3m5eW1NGXFpMam3oz8rP08fP2NXqVUhFRkt6 +VteXNrL03h+6vvW1cjE1l9Ra3J3XVFLSWVxa2R7al7Tz9PO0NjT2mVTTlJMTVRbanjt3c7Cy9j4 adXddFxHTWTl2+je4O3lfVZaTkVW/NvP3d3Sx8zl2HVUV11lTkxgal5j69/P597ZfOL0+21RUGl/ fHFZ49zn2Nfc3eLg1t5qT1lrW19fYPrj3+Pv/lZNZmjp2VBq0+7S3OLOZ25pW9z4Wmhqetx2dNzY +1t9b+nYZE9ibd/1TmlbVtx/0sbd3dvjzPRcW1heSEtg393w5ubZ3OH06m1WXktX3vfb0/Xt4W/m 7uVfTm9tZG54aW7p6uh+cG/Yyuxwet/pW35a3c7vWVXW3/VcWlxcZEde5fnX3efXzMzcUmh6e3RX VV5+3vnm0O1fWO/W3u9aT0te7u9w39pZ+NvKy+9eTF/veGdmX+LM0N/42t9kXkxMT1lr/Pbf5uP6 6s3I8U9MWuPdY2xcac3Q3d19ZXt4ZWpRU3vyZFRb5dfr3tbp39/m4+3b6ntfZGV+7O/+Uk9X8OH3 aU5r1dja92lfZvnayc7/Zllt8GNu/X1WTnXO2nnd42tqZ+Tja1ZRbObX0flZaX7r3fZhbnzv/eTZ 9G1z6dz0X2fv7l5TXWX+62pxeuzc5+bn2tzzZl5aU2Tq7Ol8aHffz83XZ1JWa21gW1heZvff3tfR 0tri4/Z7b2xeY2tiYG/m4NfX72ZcXlxYVlphWVpx5tzv++Xc1tn5a/Dq7V9m8u/e6+3qeGdt8eJn Qjg6Y7appqu5zdHJz1MzJyIhJCo1Xrqsqquusbe+0046Mi8vNUF21MvHw767u8DN/FdMSUZBPjs5 MzJbrZ2Ym6i3vbexyy4cFhUZHiUuS72spqeopqKjruUzKywvNTc7Q1vOuq+srLTHXUU/PDkzLzA2 Q2PRxMDBwcHJ3cyvoJucqtpHT9v+LhwVFBsoOk1kyLWsqKqsra+37DguLzxOU01T3b2wq6qtts1P OS8tKykrLjdI372xrKuutcH9OzNLtaGdqcpd07Ku8yUXFBolMDIxOG61qaeoqaquvko4QuHF5zsy PcqtqrDD6FlVTT0yLS0zQFZtbe3Ht6+xu83tbEQvLmComZmpYEDSrK06GRASHjU8LSk2uJ6anKKr r7jcQDg5OzQpJS1jrqWnr7Owr7pRLigoLTEyMTZE0bOrqq65wcXNWzQiHi+umZioQj2znJq7HBAS Hi8tHx4ttZuWmqCor7fOSDAkGxgdMbqqrrmtnZWXqUIoKC8vKSIgJzjkuK6wur65srPKPCsqLi8q MrqelpyvtJ+Xms8YDhIdIx0XGz2lmJedpamtud04JRsYGirCpKCprKCYl6FbJiEqMi4jHR8vx6mp t/Zmv62yXS4qN2J2PzQvLD6nlI+XscikmJ83EAsRHR4ZFyK8mpOUnKu/w7q/MhgPFzippsHHoJGP m8Q6OjAjHR4nKygs36qlr8jAtL0/LjRQWjs4UMvPWDwvOKqVkpu1vZ6XqCYRDhUaFhYdNLedlpKX qcnGuU8eEhQqzbu/uKGVlJyxXz46LSAcHiteubq/w7y0vGE0LS00PEZW7cu+t7q9y1cuKrCSlKls spWUxhkQEhQVFxsjM76Xj5SgsKuqYR4XGSIsOe6vn5uZmZ+w6j81JhwdKlPN6FzMubTEPy0rN0VM V8myrrW4srjyODI5Lx4smpKjuqmRk+0aFhoYFBQWGkWgl5ignJae5iYdHR8iKzZQr52Yn66mnq8v HyQoKCcvP/6vqrNkb9lAKyv5xVE757Ctr7rE61tcQDIqIyqgk6y1pJaU8SUfHBoYFBMaQ5+lq5uR k6ZUOjUkHx4cKVmurbmnnJuiulhGSjYnHiNL2/I8Tre66DhA28pANNmsqcpFyK2vai8sNUo3HRqx j6GypZqPqVQ3HRwWDw8ZPH5or5GMlqi0sscoGRUWIC4sRaiWk5ydl5q7Kh8fHBgeIC3Qr6y/t6el uPvnTUdDPjo9UuPkzsxYPDY+TjUp45WfvZeXkqQsfioeEQoPFC0+Ma2UjZSfn6a8KxcZHBoeJj+m mpqbl5acuzIuLh8TFiQ5PDq+pqCqtq+xvUEpLkFGNzViv73GaV1PPk1DOzS5kqqzkpybzSZWIhkN Dx4aLkrYnpWXpKKbszYlHiYlHCRLwbGon5yaoLGuuzYiISgkICY0W3vfs6ivwMy2veVNOTc6Oz9G WV5R38/Zzr63xkXOlqQsoafBxChUMigdFj0pIjVGsqqls62gtMvJxT80MSxRPzFeu7DAtK2xp89D yFs4LTM1Ky03Td9eWLaxusK7td5r6dvONy8/Q0k6Snh7v8vNzKGfL6ac1bg900ojIxo7Khkw2dNm sqepprO7qa0/ND4rKy8uPmnbxK2mr66irPbuVT8uIyUvMicu4bu7taysrLHCwss/MzU1LCoyNU3b 4Lu4rq3EppxCXp/GdT9HViwyJDc+HipGXz3hsMOvrLi1sr1qbTs2Xz43QfXFx729t6+zvk/f1T8x Lz42NTM+3mTZzr+6trnG09jeQzo4NEFJRUvkv728ucrrpqcrsaJIzd+xPy5EJUAmHzU8Ly24xF2w q6y8r7C1uT7t2zs2Ouk+R8pgzszGvcLF0db+RUdELiw4RT8/2r64sba2tcxt+FU2Nkk4N1Rk6NTC t8Rcv584NJ1jdtKwsyy3REU3IzUnKyJJdS3Mr6i6q5+wsMi+wTs8OT8zNFs9Pu68xNG/xr7b3Xln Vj9iPj1BU08+ztXOv8GyvNTcXnJFQEY6QUxf9lNcZsqvTMuizrexq7o9tEU0LCsuIyckOD89zbSu s6WnsrG1v1hCSDk7O0RSSWnj4e7tw/JOzcF6UcXXUl54VUNcV1xQS+TYcvDGxe/IxXVrTkM/QUg7 PlC+ydansLOsqa5Qv209LSkvJSomNTo339O8x7KqurG1s7fIvuReTkBJOzg+QD1BVFtazsXWurrE v8XN6V1KOz9DOUFNbOTXwMvJzeDSXl1YQk1OW0VDt9BEq66+v6+vTL7VQDg6PSkvKjc6Mk5lym+4 rb+wr7G7w7vkZVBCRzw4PDw9SmNdV8rGzb21ucPGxuB8VD9EPj4+RlVL8dr3+tvPblZqamZ732RM dqzaL6evX92srTK4vE09Q0wqNCkzNiw5WNBHvay6ta6sv8O31GlATE4+PUJeQUFh5k1fzm7f0b7J z7vGxNXS1U1EQkw8O0pVR0fUzmRl1s9u9879fXxSOOKxRVqwrMvLpbrf1MRRNTovNSorMT88M9nC zM60rsG6tbm+y8/9UktIREE/RUxMW1/Zy9rPzcrZ6+9cY19bWv3lW+zQ2VnZw9Xn185jYW9WSVRJ QVFQSUVdaFzm4s/W2dXZ01dZwMXc5cG2wL6/v8bU3UtAPTswMC80OjxGRu7OyMK7tru9vcPOy8/U fvLoXWNUVEtLUkhJTE9JSl1lWnzJztbIw8bIys7S09jkfl1YVExJTU5NT1dYWPbrb+fN1/vSy9re 49jf+vxod2JYYk1LUGFeTWF8YWzp6ODUzsvNzdHKydHM2Nz8bFVFT0tHRktLRk5ac27s0tPNy8jP 2tng5e775m9lc3FkT1hbUGRlZF9qbWDk4eTb1NTRzczLzNnr5npdUE5HSlpPTlRfb3Dc4Ord4Nbh 3u12f3nvafJ4dO/183Li5O30eej4fXxlaF9hW1NqX15u39nmz9bY3d/bdn5vcm1hbF9pe3V6fmZq 3/Vt8ut4bfNyYGlnaXdocOnh5erg3eLm5N/d++33cHRneWBaZVpXV1tfXXb959bU29nPztTg7PR+ b1xcWFZXWVZg1mpY7tbT79h7btzsVVLY6+1p39jm2GR//PNaUWNZWlteWGzvc/jay87RztHR1N72 YmddTExOTU9XW2X07H7g3djX2trh2t/u++3saWVs9vRvYnpvYWRlaV5raWh+9+3f3eXf3N3f3dv9 eHh8X1heV15kbGf86Xvt6Obn6H9t6+P8b/Dg4vj06Orv6fxxeHJqXFNNX2BbXHLd3Nnc2NPS3Xn1 +W9YVmNxfXRvcPnx8Hhxf251YV/43t3p1s/Q2OrxdmRUT1RaXVxgbfvq4+He2Nnl7PtuYnZ5Z3L9 +HBu/nRtd3F5evX47+zs5+nn8O7v6vt47XZpZ2VlcPV3dPbn7PH4ev50c2pkcHFz+ezm5d3o5uV8 eGhsX15sYGBg5Nzu5+Tt9Onf8Ghma3/0bnz77+f7dW9qaGBfZ3zm9nj64d3a5vPj63deaW5v/Wtt YnRzb25davbm8una29bW3uXrcWNiXVheamtoburh2Nvs8Hv4eGteXG9zdnb+7vf/cmtt7/jy5+bf 6ODf/G17ZlxdV1FNTXPBw8bNxb/M2EpFPD9IQEdL08q/vsbL6/hOS0JDUGHf3MzIxsja9VlSS0lK TWLp1NPa3trZdFtSVWjt1tfXz8nIz+peXFxYTk5NVWV+fm7v5tznZ2FofPLt9e3j297f4fB7cG9f X1phbGvn5OXt6XNqbGdnXWd57t/XztTZ3N7z+2hWWFdjYGvu6u/u5u/8Xl9kZWR/4+bZ2ehoc+rs /WhnaOzd5H5udfH1WlBOUmTv727m2Nnd6PJpa3/s82hz+dfN2+P07NLL6FFNTEtFSOnDvb2+x83q UjwwLzQ+Ut3Hvbi0uMdtQUFASlRVcNzDwsfQ6mFXVk1QU1VZZfX2/eDn49jc33Rp9+rd8OvSz8zO z9d5SzQ4vbrDxFDd2sjaMC8qN2Fg1W7Ux7OuxlU4Nj7qzm/Wwrext8lNQT4/SUJCT/LMzM96XWFY WlxSS1jcycTJ3m/l083M3Ozdz8nYWkM3QLm0ushFW0pYSSwrKDvawba6vL62ud0/Ly0zZce+t7iv rLDCSTMtMD1ETfnWw7q+0VdCOz5ISk5m58zCxsrd7ud+4Wle3s++vMhzT1BjubvV9EZZTEs/LCwu P+fIvsfGvbW5z0c2Nj1/1tTPx7GrrLdyPTU5PkA/PkzhxMHQWEJHT1dQTExsyLy6wcvZfGddZ1FM 7M3GxsbO4V5ARcG1vL9TQkBASzAsKi5RyrS0vb+2srvmOCwrPOzJvcrRvq+rsMtCNjlGTEY5N0fu wb/RW0haeOnwVE5c2MS/xdpmWWTt5lxISlzez8zKz87YZ8Sus7rTQTwyODUsLy04Y8KwsLe8vcTX SzYtLj9wv7e5trOxtbvMTDw6PD5DQD9GTtzMzOJaWFLv19nqY3LpzsrR5mtlaHFlYE5FUe/OycPD yMPMxLa9x+BJQDg6Pjk5NjY8QXPJxb+/v8HEwc5wUkU+P0VU+8y6trKwtbvVVkA2MzAyNz5R+dfK xcrM0NjfeGJVXffb0trd6Hzs29rd4Or/e+3t7XFbUExJRVPf2MnCv73GyNFpUERAOjY6PUZr0MbI ztfl3d/qfmf22cvJzdDf6/RxZVVVXGrv4Nze5+PrXk1EQ0lSZ3h46d7c2NfY3NfS19fa5/9valZL SExVau3g3d7TztTjalhRVWX83NTTzsrHzdTa4u1wXVNOSUVCQD9BRUhPauXW087NzcjFxcjNz9TU 0dPX3vBsV09MSkdGS05WXmhmaHX07evo9u/azcjIy87R1tznbFlPTExLTVNVXGRscPzi3dXQz9PZ 1dHOz8/T621eWVBMSUM/PkFJUVprfuLVzszNzMzKyMjIzM3M0NfibFRLSklHRkVHS09YW1tja+7d 1c7Lx8fIyczQ1eH8amJcWVhYWVtgXVhUUVRo6eDh3tjV0c/R2+jj8nJpY2ZdX15bVlJUT05PUldd cOzZzsvIyMjIyMjLzdHnaldSTktKSElLTldeaHz7Zl5jcPTg2tjSzcjGxsrU5PZwYltSTk5RVlRW WVhbX277f+zh3dTLxcXIy9Hd6XxhVU5OUlNVVFFQVVlaVlRYZezZ0M/R0dHPzdHV2dvX1tjf92VU TkxISEdITFRif9/X1tjb3d/f397b2NTQ0NXc4PNpWlFOTUxOT1RZXWZ28ere0s3LysvMz9bgfV9X U1BNS0xOVV1dW1pfbnzv49vY1dLQz8/Pz9DU2+fu+nlqXldSUU9OS0tMUVpld+rX0dDQzs/X293g 6vbv6ufm6flyaF9aU05NT1NYX2777N/VzsvLzNHb4uTq/mxhXFpXUUxKTE5VXGR07d/Y09LU3NvZ 1dDS1dja3+l8ZltUUFFUUlNXWl9iZWtx/fL7793SzMvO0dbb6P5nXlxdYGBeXFpdZm1wa2dndfLi 2dfW1tXW3OPvfG9vamVgXFtbX2BfXVpcYW1wc3L/7+Xc29nY19jY1tfb5/l6cmdlYFxaWFhYXGRn bXd8+/Pr5OHe3d7e3tzg6vB8bmlnZGVmbG9vcGpkYF9iaXzr5uTf2tbU1dre5fNsXl1aV1hZW1xe Xl1hY2hse/Do39rT09XX1tbZ2dzh5OXn921fXFdTVFRVWFxdYGv76uXj6u/s7O3r5+De4ebq7/P0 9fr49u/v/m9tbWhobXNybnh9dW1oZGRuamJmb/fr5er19vbu6OPn6ejl39/s28/g9m9XeNz4Y15c aV9ZVlFOTlRec/vm393Qz9PX29/q7f9sbnf9+t3Q1NPc4+FxalxTU05QT09WV1lmcWdx6+Pc0s/O zc/S2eL3dGtcWlhWVlVaX210bXRyf/n/e2/56+Xh3dfc4/ViXVpeXVA/T7i0qqOvsMxxdjU2Jh4f Hio+07OtrKqrra+/5TosLCcuPVfGt66uqqqtsMNWNS4rKy4zPEZuz8S5vL3B0d5dWk5KT01qfejV 7ex5ZWhdVzw5sqWkmqGwxjo8JyQgFxkbI1avn5ubnqa0x0MuJx8fIixevKadnZ2lrrxOOSkjJCUv QeC+vL7K0/pmVUpMSFZ42cjLxcrOz3xWRD49P09vyddOsJ2emZu1SiUeGxkfGxwpM7WelpWaosIy JyAeICMqPNWonpqYnajLOS0nKCoqMUjOta+xzEY6MDdGS3DlzcO+srjAx/pVQTw9NjpEWOLPw1pa n5mblahOJxodFxwfGSk+t5yXlZypxS0iHhsdJDPHqp2Zm56rwlMuKSUmLTveua6stctXOTAwLjI8 UsW4s7rCyu7h0uVNOjU2P2XT2+XZSkqflJiUpEkqGx8ZGR0WJU2vmZeYorZ8LSMfGh0oSKmdmJmh rus/NiwqJixCvqmmp7XoPzY0LCknKDrUrqiuv2x7yru5yT8xMjpl2nNBP0w44pmTlZWzQCccHxcb GhpGvaCXm6a+VTgqIx4bKmOql5ecrGI5Ki8uMkVBuqifn63PLyoqLTIrKCk7yqymrsdASOK+uN5S PEPb1MhrPC83SDSrkpeUndxPICIdFhsWJ8GunZ6tv+9aRiojHCPNq5eWobM6NTU2PC9C8Liin6W7 PCstNT04LScnPcSvq7z4SnG6ublqPEVYvr/2PC0rM+5XuZWVlpq66igdHRUbGyPBrqSgr7/iS0Yq ISAnwqecmai6SDQ+OTQ0Xb2soaCs0UEuNDUyMCgsLEDEw7jGztDivs7rZE/Z0cfDdkw7Mjs4MqmT k5Sl2U8mKh4YGRYru6qgqsfuYF9BKB8fOaqemJ2120xZSzgrJU6xpJ+ovU9LRFVAKCMkMkHcylHZ x7e0vdBAPkzZvsfqSktKTE5CNC6mkpSWrtljLjUfGBgYOLOtrcZoy7/IOR8dItyhoKCvxLy5tFIr Iym3o6W477+6sdE8KyInL0I2NTpKvrevw9zO7Mp79371x254VDk9RTs/o5WZnbK5vEAxHBcZHU68 2tTdv62v4ikdITK5qre4t6yjq783Jy1XrrG/0c60rrhdOTAwLy8sKjVE1L/Fx8m9t8btSFHP0MxV QEU8U+lpPcqZl52ozL3hNicaGR0u0GtE0rqtrMwxIig1375d2rOmoKe/QzU9dcnFYe26sa7CUT8/ QzUtKSkxT37b0MjCx73H3N/42dLzTD9ARk9TRD2ul5uhr7Ss0D0hGx0hMDwuNsmup7FuMis5Qkc7 ONiro6awydbc2O5kUlHJt7i8zmzyUj8zLS0sND5N69jX1MzBwtfU083K5l1NS1ZUTUhA1KOepa62 rbbdNyUjJCovLCs9w7O1xGlCSlpLPj1evK+wusjTyb/A21n6w7u9y3BXUVdKOjU1PEJKXVdd6vZr 9+zs1cfGzdxjXnJeUExLWuTt5buvtrivt87Lz1NIRD4/TUo+Qj03PD02MztL37u4vr+/z+faYlr1 1MO6sri7ucLS/E1ARUE5OTw+PkVBPUlZd9TN1tHLzcjG1PlufHZiTvm8v7usrbi4udNUSTkxNTcz OT43OkM9PEFDTdK8vry6w8rKz3Zv6uTFu7u8u77HytthT09IQT45OTo5OT1IZ93Z1tPKyszIz93o 6uBhSj5Fx7q+ta2vsK656F9LPjs1LSwzNTM5Ojc9T/DOvLu+u7zF2fl7++HQw7q4u7u7wMjRfE5L SUI8ODUyNDc6P0lf39TMxMDAv72+yM7P4FJDPz9cycW8sa+2ub3da3RNPTczMDIzMDM8P0rq0s7G u7i8wdZyZ3RoftfLvr2/wLy7wM74WVFORTs0MzU5PkJIUF/izsnJysbBvMDN2XpZUFROUWFo3L68 wb6+ztrK12bm8VFHPTQwNTY2PkpQ/dbRy8HAycfM7e3X0s3Mz8zCwcjLz+b26WNLQj48QEU/QEVL T1ZkZnnazcK/wcPHz9zb3e7t4d7d2dzsb1lPU1NTWV1cXF9aWGVqfNjPz9HS1+n3a1dVUE9OTVVd bX343NPR1NPT2drU3Pl8/+zq68PnRNVNRH48Sl9L6u9v2e7r2OPR4nXT0dfNz/Hnwtd5zE9PakFJ SEBEQlBlWfb75cfO2tXUzc3L1O3V3+rbfPZvcnpedmlZZF5ZT0lfVllpTO/fbNneaep92s7xyfPv 03TM4GB5YvhaVuxWZ95l2/Tf0vfVUlPdTF7ZY1Ni5u/33OlY49NY5ttO49Ff0FNTzEvT0Ey/51S+ UFjMP9hxP8xIb8dIcGNX7XDZUfn+TsxV0eJ6wFnKz1Pt2tjka3HZaNfgV1hhSGJOR2xN4FBgxUfQ 5uzHTr1Q+MBAtkvixTi0RFi7P97ZR971WONM2dU719M/2NND9sVXYshS9+5vyTrB5j63QFvDPMbf Sr5ZYLxL08dT1PJY1EhLy0lT3VVL+chAdb8/XMVaW9zF6EO4d0C820HBwTnOvz/2zk1OWcU/QLc2 T7tDX9zNQH+6Qma8aEjAz0TQ71/4XMtZYrhFarY71740xfs/yznMyi652S+sQzytM8THK6pJMqYt Q6UlxrApquE0qjxMrCnEqh+tvhyfMy6jH6vCI54yNZ8m2qojr84rpzBrsSmvxSysVkCyPtfEPsRa ScVrOcfkM7hHQbEwvtgyqjReryy31SuqVDy3QNG+ObdgPKsxTa824NY92W1K0kdcrzB6tDW75jy2 TFLGQMjLNrxUU7k8W7U5x846tkLa1DO1TkLHU9zoc1bg11j+/t5dXM5PVdLoPb/UR8Va3vFv1/To etrr6G10f1tfXU732Ftj22Rm3lv7adRD7r9H289jzfF+8FK/WT+80zvL3D7MzkVr/stPRbpGTbc7 2cg8yEZewDa/ZkG2RNnGUMZCzr5AyfpVvjx7yjvAT0XCS93eQLvfS9RN5fFK3lTfxz3mwl9mZ8Ze V75D28RD1vRiy1F4ZePZRvPPTV/QXV3HdD/K0ktg6Nw/1MA6x9RG693KRNm+SejOX1XZ00Jn1+NR Z+bv4+ddV9TfS+fuYM9M4mJRwz7Yxkq8UfPDUctH3MM3z9o8ye9Az3Ry4UzAWU+8Q1zIV1999/pv 6s5afM5H1cc7y81K1HxkaNxwRXnR8GHSa2C8TV/GUljt5UXrzlhN3sI+6L1Gatrn5lPR7k3N9U7L /mj5Td7oXPVf3Nz+XVXP8099Zt1t6GJ50ehmZO7mzVxL1s1UTdPoTtziUlnA5zzEzk3d+39e3889 2cI//dRU+ObYV2vHUVvLS3rYZWxx2WFq01hp3l3TfWLYXtFpWs1P2dpKz2Fj/lP0YW3dVdrSV9j3 2M9bYnZ49Pv0WEvJ8UjX3t9efttf3NhXWW7nVGTjb9Pgbf3vzGBL1mB57FFyaOzfSm7TXe1k8NRy 2Nzfz9ba6ePT53draV1VZUlPZVFXZl/y9Ot/Y8/W+drq6tb76n773l5tZmJaVltcblxaeXrze+7P 3NPOZ099vMffzsW+v8P4XG1oQDM4NDtAO0peyb/Kwr6+wNRuVFFXSUBKWHvR0s7HwcDP2ehhYU1G PkRQTV5p68vHwsjLw83S315aUk9IRE1PVXB22/DQyPN+1dlXQ0r/WE/N3E/Ry9nQ1eZY4dJST2xf dN72XPTNb2fkcufoeHpi3txd8OTr2evkbVn2WU10VVFXSfPU28ve0b/HzPRaWk9LRz9FT1vez8rK w8PL0nJZTEVKP0JVXNzTzcG/wL/N/nFST0hASU1a3vHezM7N0ux1X1lQSkxQU2Ht9trP0tHV0dv2 6ux7fm5ib/z0/n15XlxdWFteZWl88u3d3tzd3N7t+XdsfGVpd+HX4t/r5t92W0Q9ZOnt2F3ry76/ /2hWTWNaREJKX8/ExdnVy9DoXEVCS1JTV2vqzMHCzNba5e90SkZMVuLh5+nu09Dm+lpVVk1SWl/2 1tDR0dLoXmVWSE1eZe/U1tXJxNDub1FVXldNVF9r1MzW3OlOVszO1f5bY9LH/1xKQkxgdU1dffDC vc/xemVnblZDQlFu28jP1crJyNhlTUdQUFhtZenXz8/ra15VYVZVZGXq1s7NzdPf721dVVdaXO/m 4ejl0trYckE4OVXWxcPTzb68wdxKNzZBTldcWHjDtbW/90E+SVNLQ0ZWzrq4vcvkdvFsS0E+Q1/S ycrT197m+kxDSEpf4One4NnLzMrVanxobGtYXl1t2M7f6E06UMnCwtVdVdvB21o9MTdI2+La2da7 srTKVDk2TvbfZU1S37y9yl4+Q1nT5mBUTHvOy/FQSk3uz87qb2zu0tna53zbz9XsXmBaZe5PTj45 0La1sMLlcldZOTMtK0Hav7m5wcW3udJHMCw55ci9vM3HvL3QTDgvOWTSytFmVtzJ41xCO0n3y8/d 6GnNv8LJ+15229nc+GB9XUg5VsHGtcVd+UxaRz40KzxM3bu5xM6+wcvjQzY6SnTAtrm/v8jY30g0 MTpI3cLK19jW29xkPzxCTHLNytPR0tPMyuVfUU1p3tbXz9f43etPPVG/w7i+T1o/SlY8Oy87XOO6 usvZy8/cZT83Ol/Pua+3uMPQ5l5INzpBVs/F02hXTU9fXk1LT1nYx8vV5d7t59z8e2hk2tTQy/hd VVT58s3iOESxs6+tRT41NVI1NyssXMqrp7fP3WpbWDsuLkvMs6ixvMhk69n9RDxBStzB2FNLQE/Y 2P9JQEFTzMnM1Gp70sTF0W1JWGhfZE1OZe3Mw8bI5djSTDhTtsK2uUVTPlJVNjYqMVXMtLXM39HR w9xHNDJS27axwczTy8nOWD0+SPfYzP5PUUxy3t5kTUtMY29oXmLr18K/xtNdT1ldX21n7dDM1OfO 3W1jSUg1N7OorKXASEk2QS0mJSE7wK2kq7q/ydBwOCokLlq6p6q1usLBy/MzJyw9yLG0zlxTY8/U UTs3PVjLz2VadM27tLvgTD9CTVhYVVdc3MXCyMncY1lEOz07MMKeo52k3VAtLiceIx8t0K+hn6y2 w15GLScgJkTJpZ+kqLbFX0IvIyQvWrSoq7jOZFtdTToxMDZby8TI0MzBubjNTjw4P1nUzuRrcc7F yN9LPkxiV10+NLSeoZyvPzYlLiciJiE6uKadobbG+0tGLiggJ0vDpKGprrzJ008zJSMy766mq7PU 9fpYRy8qKzRsw73Dy8m9uLzgQTUwO1DVydXM0crAy9RbWVA8QzY8p6Kln8daPy82HyAfH060p5+n s7jD2D0qIx8tTrynq6yutbXKUy4lJixeua2vur/Gvc1YNSstNGDTyc7cw7qyuNw9Li81RvvY0tbA ube82ko+Pz0/NjOrn6KZrOg/KS0dHx8bN7yonp6qucd7OSknHiZHv6ajpKq0uc1PMSgiKDvDrKus vsfB5ng4KykrP/nFu8O+urW1yUUwLDA+88XEyczGvb/NTzw8OjkuRp6fnJe+zjcqKhkfGBtJuqCa naq1vvMvJx8aKES2oaCgq7W20EoxJyMqOtCtq6y8xcbl3jwtKCk5V7+6v8K+tbG5XzUrKjZWy8G/ wcS8u8ZXQjc0PkdAR6aeopqvdzgjJxwgIh9DwKmdnqayylYuJiYeKkHIp6KfqLK5YEA2KyYsN1G1 pKq0uuleWkEuJyovRr23uLO+vLe/bTYuKjB5y768xsS+ucZTQDUuNzJFoJ+embjCQS0sGh8aHELL pZydpa62fi8nHxwmO8moo6GprLnfYjQsJyo1da+qqbbCymnoPC8nJjRJvri5u8e2s7nZPCwpMUrO xcDS3r65uc1eOi84PTjJn6efn8vJNi8jGyMaJ3K/qJ6fqau5SisnHh4yQ7ynoqKrrMpERi4oLDA/ 1Lmqqq2x1XY9MS8pLjJOyL2wtrq9yOlJOjAuOGDKurjBxsrBy1dLNjI2L7udoJqh0+AxMSMbHhYk VbyfnJ6qrbdHLyccHSxCt6Wgo6qrvvhCLSkqLzzMrqurtsTsaVE2LykrOFi+ubO6yLq8zF48Liw1 TNO+usbHvr2+cUg2Lzk6NrudoZqexNstLB8bIRkoS76jnJ6nq78+KyYdHS07t6Oen6WqzVI9Kyco LTjKqqissMhZ/0IzLCgrMtS5sq29wb7Bz0w5Kys+Z8WzusPGxL3Qe0UuLzUuXaCenZuy0z0wJhsf GBw40qacm6SrsVYyKR4bIzHjqJ+eoqa32kwyJyUqMOO0r6qssb7RUjAsJiUuRM29sLW7sbfD60Qu LDM9Wse8v7q8vb7dWzwxMywpv5+glp65yDU4Hx0bEh8xwJ+Ym6KktVMyJRkaIi68op2eoae6yEcq Hx8pNcSqr6+rsrq3TiwkICUw07+3rre3rrLURjUpLEBRdsXFybq0uMH9QTQzOTc0P6ifnZarv0Ip KBwgGhorRKybmJyksGowKR4ZHylTqJybnqW12EwuIR0kLFWrqKaqssXV6DUrJSQtVLqzrrK7ubrG UzksKzhQ1cPCyMq9vcXjSjozNzk2M7Ken5WfuM8qKh0dHBYmOLecl5qhq885Kh8XGiI0rp2Zm5+p v943IhwfKECyp6Gnq7rX5zAoISAqPryzr6+5uLm97TwuKi9F7crBx8O6trjMTTovMTo4L82goJeZ r7syKR4ZHBUeNcidlpeeqLw9KyAYFx8svJ6amZ2jtd88JBwcJTO9pqerqKu6uEUnHx4lMMe6tq62 tLK07TszKi5GXnTPx8O1r7PAWDouLjcwLrWgn5Sdrr4wLBwbGRIfLr6clpedo74/Kx4WGB8st56a mZyjtdI1IhwcJDPDqKOlp67CzTspJB8nNNG2sKy1tba+1EAzKyw7Te7FycG6uLO80U00MC8uKfqf o5aYrq83MB8ZHBEcLHSfmJacoK5XLyEXFR0m0aKamJufrr9AJR0aHyvsrqegpaexwkgoIx0jLk65 s6mvr7DCykY3LSw5P2nOy7+8t7vB6EY9ODg6LTmno5uUqK5OLioaHhYWJjSrmpeaoKzYNCgcFhsg PKyemJqcpLXWLyEcHSY4wqukoqSsuegvJx4fJzPNuK2ssK+7wOs9MyswPU3Lxr66ubi+y1I8NC84 OS/ro6OZl6mwPCwhGR4VGys9ppqWmaCrTS0kGhkdJUitnpqanKe5XCsiHR8pNcavqKGlqrlWMSMh Iik/07evra+1uclXPDIuN0Rc1MzBv7u2vsxaOjI2Pzk3v6unmp2ptj8vHx4eFx4oPqyemZueqWM2 JhwdHiY5waaem5uirvcyKCElJy1K2q2mpKOzzDwrKSUrL0LbvrCvr7XB30k+Oz4/R01d08S6uL7O Y0k+Qkg5Mme3rp6eqLBZPSklJxwfJS3hrp+en6S7cDstKSkqLTvzu6ylpay42Es+PDs4Oj9P1ry4 vMn0TEQ/PkJKVXXa0MvFydTc+3RcW1ZNXWDdysXJ19ldWFpJSUNESlbwxLi3sbjCx3tcTEFAPD9B P0dLSVBdc9fRycjDvsvI1WRZR0lFUXp1y8PFwszPy9bhaUxIPT9FP0lNVmvz0NHKxcjFztl6T05P WfXg8/xxceLa2fVtWkta+t7R0eFWUuzq1cTSz8zOxc3OYT49NTc+QEhMXXLpycbHx83Rz9DW3tvu a31mXnzt1svHyuVrU0dHQ0E/RU9f1srGyNLlYlZSV2P/2s/HwcDD0PRTRTw6P0dT69DGwr/D13hT TFBcaffl693MxMTN6FZKTkxHR0NASE9v39rP4djN087Z5W1t2s/BvcXQ5WVWT0tDPj9ETn3WzMzV 2HJaU0hOS1Pq08S/u7vCyeVZTUZESE1PWenU19PY/VtOTk9b5+rm1NrJxMfJ535fVmZWUk5LV2Jq c1pRT09fXGN7ZdzLwry/v8bV2vNnWkpIS1Roeun4Z1lRVVNXV1VdXP/VzMXIyM/l3+zy7e31anX+ 7OH8WUxFREhOVmNn4czMwcLJyOTf5G3ea19uVlxkWVxVTE9OTlhbZn7t3NLV0tDb297o193j2t7V 19ba9F5MR0FESkxWVl3y2szMzdH2bnd95t7c3t/d2tPT3HJXUk5NUU9RWFdo3dbW1t3m4N/d39zW 29PV8m1dU1BOS0lNVlz/3uLh63B0bW14fefk3NHOy8zNz9Tb9WNZU09PT1JVWWd1b2ldV1dg79rQ z9bY2djX3eXy/Pj47vhwZl5eXFhcX15bYWZh/N7Xz8zKyc3P3X1eT0xMTVFXYG9vb3BuZltYV1Zj +uLW0s7MzM3T2eZ6c25+83p3d25z+H5iUkxLT1p27e3n5+Td2Nnm8XVz6+Tf4e7+eu3x+XxsbHn1 dXBsam//7erp7XtpX1tbXWZre+/t7OLg7XNfV1pq9ejd2tza19fc4ut7aWhv++rt+n1sZF9dXFdW Wl9s/fn39PX26ejt8/j38Oro6Orz9e3h3d3f5+zr7fl1bG1nZGZncnFqaV1ZXXtkWnxpdd3t4t5q 0tNS8XNj2Wrs1vDb3fnc9V/zXGXhZGZwXfl0Z/pfbm1m8/fs6fb25ubi7/3yb+/pfHdqY/zg5N7b 4tjfeHB5e1lRUVZhYF9kd2xt3WFu6Wnqfv3m2eL51d3e1N3s2ex2blxuWV7R2vNuTFVdRUhpVkx9 Y+fFzc/KyMrU3FRa+09hUVti7NlTzcXmxtLmzdj2TVpYQ0xEPkxaRUv+9dHJztXCxOnZ2ebg3nxd 6NVmVt/7Y3prVVTuTkloVlxeW/jV4d/p4sp12c5qzPtp3GTaZk9eYl5T18/Xv8PDvcLMYltKOTcy MTU5O0Bh1cu9ubi2uMDIzNx4WVBJSVBw22HoysbD0Oj69lhBPT4/Pj9ESejW28bGu77Ev9PO6FBS UU0/RUtKXVFAyKe5062zrK7xR0J8LyImJiwtLTBhsLS4r6qlp7TPy9NNMyswNj08Otq+t662sa6w vFZFOzEsJygwOj1L1rmwra+yr7LDZ0VBPDQvMT1GUWnnxty6mqTCrbGfty89KjUiGyEaKT41U8qh naepqqGo1z41MC0sJyk25LvFsqilp7mzsn0/LiwpJSgpMDz9ure0rKiqsrvE7UM2MS8uLzpHVnvB sra3w9KknbZrTbCpPCkkLi8fJB8oRd60v7Shn6K2vrvQQSspKCs0PU7gtqiipK+0ucPUOysoKC4t Ki9Lwbq8uLCsr7vF111NOzUxNT5DUO3Ju766s7S76k85Q7W+Uz1IrazFPDFIPDgsKC4vTsC4tr21 q6u5X0Q+Qjo0Q1F8y76vr7a8w9NMaFU6Ly07TkU6ReDCwc6/vcTCys38REVTWEdHa+LT1c++wMve 3cvSUTYxOD02MV6wqKy8uq2qt1M1LionJy02QFXYtaustL+/vMZkQD8/Pj9Hc/tu4dvLv77C0efw 61hUWEtHP0pYXHNSX+HWz9LQ1MnHzcrW7PdoTUhGQ0tLTGL13MrJzuHaysnObUtLTk9HSVx6293U y8nIycfLzd1dTEE/REhKTVhmeurg0tPX09nS3vj9ZXzv6etmXk9Uc2Bq/OrQy9Tx+Oj0X1RPUlVM V3/gzs3NzsvFytxyYFpbTlFWVmBfbvvv82d85efjaWfl6vBaWtjf+nxt9vLvaFlbZ/X3eGt86ePY 1uXu4dnT3tfkZ/z26n1eVFVVTlJTVlxcaPjj4OPu08zb3+7t2+lmee989/ViXm137HRqY2V4aOzk /HZt4+Xf6WL/7u71Xmr3cfN8fm9u5t/h6OTr7d3ucVtVZFpXWl3r3tXX39rd5f9dWl1WVFtfe/jc 2eTV19zn7eduaVxmfWH65O3n8HpwZP77bF9o63BjcHXt2u/6d/Pd3P5YXV9samZv8d/c3t7Z1+p7 cWR4X1drV1Bq8Ox8f/r33N/e6Grt2OdoduV3Ym1wcvVqXe/m4tLtbuT/bHBfVFJkbmFw7XjZzOLn 4tzW8ntfcGhiX05f6XhUXPFx/N/V5Pnb29jd921za1dcXfTd6vzv3uZhZ27sZWv0Yere5HFfY298 6OBu6+Pn3+vk2fBaampSSk5mX1Vx3+LR4t7O3triaml//XZvbmRj7eDx/Glv2OlhfWx5YWLlf/pu W2/e193c6+r6YtztV1FTWP967+L8aG3TxtPpYFv+3uxcTFBfYeHX72Bad9TN21pVaeXN5WhgWeXa 0t9YYG373t7mZVb64W1obu/uWlh37N5kW/D6X1d81dfd+mT00M3faGFc7fFfe3Nlb3Jv5+vh3Ghl X3zpbmZVVW/b2m5VV93Mztv4Zl3w3N3rWlhu7d5+aXZpZnbY2mpcV3jY3ep+YmJ/5dt5XGP+5uxf Yvnt+O3a6WdofvV2/Pdud/18+ffn7e/o7/pwevpteXlta2z+6u3y+Hfk3fleX2pfXV5iafji3tnf +vXvbm5pWl9p/vxnavje2t3l6fh96ObvdnR2b3/2Tzs5Ubusr8de2bevvUMtLTY+PjY0PV3JurW4 xN9j9c3OXT89Tc+/xuF638nByvZORERPbvpfS0RP9NXgX1dw1MvN2/xnbePU2ltQ0LWutdlR7b29 XDEpLDlEOjAyQs21sLnFzs7GxNVPPjs/XNLJzNLRxLm5x15FSF3j1d1gT05b7N5mRT5HaOPwUkte 1cjL5VNNVWX49Gdd9M/IzFM9abSrrslIUrmrvD0oKTvXfS8oLFuxrL1NStu6t8tHNj1d1tDmZ3zK vLm7yXdTXvhuV0tJVnn9XE5PUVZTUll92drc493Oy9BxVFFZ+/xmVEtlxLi7x9Pez8PD7ElGT2Bh STo5Q1/f6VVESXfSzdP7XnzVz95sX3HXysrR4fHl0szQ6F5UVmFrWlBc8NnW2+Xm4ebscVpNSEpK TFRbXm/j29vj6dzT0Np4W09X4NPW08rIy8nK09rc7V5UTEdHSEpMVVZTWF1m/t7e92x76tzY3ufi 2dPT3nNm8+Hobl1baejld2Vnde3l6ndmaGzt4PVscurb1Njxa3j2/2ZXVF16e3N0ZWF64d/vdm5v /X9rZmx98+5zX2T25+ftfHnk1tbf9P3n3+5eVmT46d3X29zUz9TZ5mtXV1VOSklMU2JjWV1+4t7r d3Dy3d7vd3T149nZ3ujs39bT4HVpbHv4aFlaYm56cXT5597f5vZrb+nd2+Ls+/jsdltPT1VaY11Y W2J26eLo7Ork4+Ln8P3t4eTn6ebf29bW19zf5XZeVFFQU1VVWF1t8OTh6O3n393e6v96cnbyfmRe Z33y63thX3jj6n1nYG3v4enx9+vd29/q8+zp9XZkX2NiY2Rmb3z27/91cXV/8urq8Xd37d/b2drj e29vaWhlXFZXX2h1bm94d/jr7PPz6NzX2eh1dfzu5+p1af7g2d73bGz+9WtbVlpkdnVoZGl/9vb3 +v98cHLz8/fq5+vm5OXo9vt7enZub3V9/vh6e/z/+vLs6ePg5/D6dm1qZWNpdnd5dm5+5t/mcl9f Yl1WWGXz5+jk39va5v9wb3t+c3nu5ebv+XxtbG/563l77+Xd3ev37Oz0fW1nbWpfWVleX3Z1bW5v eXpyc3zs5ejf397d6vt+7+Li5Oz66u7y9mleV1poa2RsZ3zv5tre5PLx6+r0aWZocXV5aWz87uT7 eGxhb21kX2fy7eXr8evq7Ovtc/vu/Pzu6+zk4efu/mlq8XdeXVxkdf51YG336+1+dnr25d7k+Pzv fH19eXd493767uHp6eTxc15hbXJnY250/vHn6nx66ufw93h6e238fXF9d3tzcHp68vHv7u3j6Pf6 eXf9e3x2aGh3+vX3c/nu7vRybGr0fHRwZm1/8u/q5u3v8ff0+evocW11am169G5iYnf07/Zuce7s 5+T5fH166312dG5x9+f3eG5v6fdwbv379/P79fXq6fDw9vT6cXZubX1uZG37a2V6ffjr8vfx6ezw +Whrd/n9/f3z7v/3+Pf0eHXx5+7z6eHpfnF1cmtgXGNjbHvx8vLm8vHr5urq/2tqX2Rna/P1e+vn 4+Dq6uTl+P/9dmJdY15kdGxiY/76/eLj5+3v6nz8/O7l7+zo+Xt6eHr69v78+2158f9xfXJscf3u cm5ydnp0cHj3++/ycHtv+uvm6/Huff19+vN2//l+9P1yfXn3e3T7aWvo7fPq6/1tce9uZ/X5eGNr 7nNv+Oru59/t7G12d2dqbnX76+zrdW/yfPLxeH5ncfF8bGVtanHs6/vv9HHw+Hzk3+766uzj5vtt a3d1a2dtbX52dfJ8bmlrafx8ZXt/fOzt7OLq7Xzj2+nt7vHm525uc3JqYWhlaW5fbXFy/XTn4/b0 6uXo4Ht2ffnzdHR9c2hv9v3+e3h1d3lyZ/l5++vx9fPu7uzu7H9v+/rp6nhubnf1dm56bHJ++3tp efp69fxz+vb54eXp7u3tb2x2aWn+fmh7dF3v7Hhzcn556erv5+Pmeejub35/6/ZvaXXtfvf4cWFj b3JmZfPv+fzp5ubzbOzl5eb/fXT4c3JraW1p7en+bHTz7/7273r/fv/v+X9s8ezu83J3ffJsbWhi a2t2d2x5e3jl3ez8/vv17uX7fO/r7Pju6/n5+Ox+ZmJhZG3vfGdufurrevvw5Onv7nd9amNnan7u 9/798frt5Pt0f/V3ePB6b3ry83P9f2xocG55+e/p7fP69O/q5O/x8fB9d3h4/nJqYWl6/ezq9H/+ bW1yen54eHJv+/v08uvq7vT2+Xb07u93Y2hy/vV1X2Vufuzu8nz08vn5dGlpeOjd4+r+eW9td/v2 7ufi2tnhZkU9QkdZzLuvra6vvndAMi0pKS0wO1zNuLCtrLG5xmhJOzg4OD9KU37bzcjEv8HHzO5i UElMSk1PTlJSWl5Q/sG4raaioaevwUAsIRwbGh0mLknBrqeko6Srsr3uRTcvLiwtNkLrva6opaap s8xGMSomJyktNkFkyruzr6+vs7rE22lNQj47ODU0NDVLv66lnpuboq7XLh8ZFRUXHitBv6qhnp6f pK661Eg3LSopKS43TcGto56dn6i6UC0iHh0fJjBH2Ly0sLG1ucLQ7F9bXV1aTkhBPDo1Od+zpp2a l5unujggGBMTFBknPsKpoZ2eoqi33EYzLiwsMzpWxLetqqenq6+77j4vKScnKzA9WOTT0Njd9n3i 1Ma/vb2/xtP5XEg8NTAuN8usnpmXl6C8Ox8XEhEWGyhWuaifnZ2iq7hXNCsmJyozT8uxqaiprbG7 1OxdRz44NzU2PUdPVU9KQT9KZM26sa6zvctyTERAPTk2NTEuPLagmZOSlaNkKBkREBIaJDTFrqaf n5+mt+wvIx8eJjjcraSgoKm1ymJaWHvW8GNHOzg1ODo4OTY1O0rLs6umqbDAYUQ7OT9BREU+OjY0 N2emmJOSlp2/JRkTERQZJj1ctaiinZ6irUQoHRkeKl+spJ+krrrlTl/qx8DKxs74Xkc+NiwpKi04 VsGvra2vvMxeRD87PklPf+n8aEg9OTk+6KOTj5KbrjsZERMXHys71sy7qaSen69RIxcWGyu6oJuc qLtwSPnDurfFbUw/Tu5uVD0xLi84VtPGxtb0ZldbZW/m3dLEvr/JXj82MDI9UumsmJGTnsE5HxUX GyMvNUu+saafpKvPKhwYGiZVr5+do6q5y8XhSz4xN1fLrqmuvkgwMDY/UUg7NzQ9ccu+v9b5Y3HQ xcDDzXZGPj8/P0hHTqyWkZWnQioeGB4pMT82Nuq2p6GtzzUfGx4r0amko6attL3jVjwsKjX5rqSl qblVOzk3OzgvLi42S+bPydPj2c/KyMfKxMHD00g5ODY1OztMp5SQlq05LScgJikoKyktabGpqrpi RDYtLTNPwbGsqKmy2D0yNDxSyLavrK61vt9FNi4tLi8vMjpI4cO7usDM3uLTxsHH1XRIODY7P0dV T0+ul5GVqEIuKyQjJiUnKy5GuKmpstVHOi4qLUHMs6ytr7THZkpFT/jQw721r7C89j82MzAvLi8y O1LOu7m/3GFf38vIzdbf6XFXTEQ+PUrp5Mqll5aduDgtLCcpKyosLCw5y62rs9BDODMyQ867tbzM 08zJyszNy9Hv3r+0tb/6SkQ+PDo0MTI4QF7X1d7j3szAvsDF1NPN4V1KPTg8R2XNw83HraKiq984 Oz89QUZCOCwnKjzRw8rb/djLy8C4u9JKNjVAXc24r7G4v8K9u8lROjU6QkZGTExHREVOX/x9Xmvc yr+8u73LXUU8ODpBWtG/uri6xtDCxl5COkDMubq7wtpOOjY6Q0g8NTc/aMzDv8DOYEU/Q1zYycC9 vL3Axc3PzM3eWkpITFJf8OdWPzs+Rk5RUFlu6NrS0NTrX2HrzL+8vsjxVEc9TMS7v8XRxbvEz9Xf bz4vMTg8PTk7Q0pUZ+vQzNje2NLKxsXCxc7lduHIwcTHycrZaGBzc08/Ozw+Pj9DSlZp7N7f5uLj 5d3Vy8XGy9d/WU5Z821a0LzC1OfMu7/JxNBtSDg8Qjs5ODY7P0f2zsvQ39rJydbtb2987c68t7a8 y9jZzc1tR0FERz8/RUdISU1gblxbX3Xg0cvMz9DOz9LfZVZXZN7LyNpNXMXD1+3TwcvYyMzqVkE/ Pjk6PTw+Q0zs3OLPzc/S4url+OXT1NPV2MrExMfW7WJo4uhjXnhpT0xPTUhEQ0lRX+rd297d1Nfo 7OTc19zc3X1gWVJMQULZvL/Hv7a2v8C+1VVFPDo4Njg5O0ls29T0ZWdfa9/Y329i4c3GwcfP2ODY 09bOz+B4Zm7nellOSUhHSVFZXXp7anbj19zm6Nva7mVod2leUEtNWPPX9HO9rrS+xb++3e/gSDo2 OU9LQkg/SG7+5VE/Wtza2Wxq6ubHxczL2s3DzNLub+BkTOvAyWpLW+lkSz8/S1xtY1Rf1c7nW1pp fuliUFvy18/fZGLs8Fvu4Vi8pam0xcq3xFw2KC8uLjkuO++/ts/X7lRyRTxDTdfFv72/ubfAzuxm eF5OP0D422NnwLvH2VZRU0s9PVBe29DY3szE8FdSS0w/Oj5c1M7BydTO7lE/SVVj11zGpJ+pr7+9 yTwrHyYuLT89arewteRvVDs2Lzdew7u7trS1u9NMR1BRTVF8z7/Aztx069xYPzpDV15bWNfG2Gt9 19LtXFJPXExCS2He5VhX3MrM319m3cnwYNjlxaimvbzHz900LSc2QTBGTOy/vuFM+U42LzRD0LzD uq6vucxgYurvTEzPxcTG3OfZZD9FSUVISUpQ4/Jk+eDd2dddfdjpcW3udN/eWFdnYfTpYmNaU13z 3+zV9dGmpL2+2czMOS4oO0k0S03gvcNYP1VCMTE5Vb+4vbausr3aVFbp4k5ayL6+yu5nXUUwLz5a Y2buz7zCblNheWJfV/PHxOFl29jvWENFT1NLS+bYfHVVZ9fa187GxcSvq7vCzdntPDItOUM4RElr 3vVOP1VdSkRN2b+7wsu9u8nhcuvPy9bgy8TUbkw/Pz0yM2nK0dPSyMLSREJecfraycm+xW5eY08/ PT5KfXNZ6snK319RVt7c/8+9vsi5srzT2d1dUTk0PkVFQkxKS2JKP1BsWFzezsbCy87DwtXr2dDI xtDd3NphS0Y+Q0g9POK6wtLg1tN3PzlY1M/PysrCwmtKTk0+PD5Fad3n2MnM1d5VQH6/y9LQy7+2 tNNfydRcTjk8Slg9OFFMTVBERnLRXk3y08zGz9O/u8jXzsnJzONebnJUR0FCSldTRkndvcj5ZurP 60tFccbDyM/TztlMPkVKSEpKTP7Nz9/kfV5iWFNt1MW/vb/JdMKyw81m9+BOPy82Pz0/P0tb5Ope 5NjnZWjjyry/xcLEydHddGJxYFZdWFFMSUxLTENC5bzAztPOy95UR2fTzMfLztfeVD9FRkVER1Vt 5etv8+r7ZlXby8a+wbu9103iwMzI2up8WUAyNDk8QkhKWujc3tXT7np89c7DwL+/xs3T9mFXZV9X YVBOVllWTEBNwrzK9e/R1mI+QFzTzcvLzMfaTkJIS0lKSFXf6fff5HJ29tzMztHDusJAP726t75R 3tfaPSwyMkpiRkvuxepjbFBfXldiyru8ub7M12VUTl377M7T2ulYTURFRD9E4rm8zW9o3PRSQUvs ycLP7O3V/EtGSlVeWVFc4uVwbVxz4Nzb0MK+yEVJubK1vuLk1+88LjE1PVtbS2zV6W9mTkxYW3HJ vLu6v9J4ZlVQ+NnPycza7W1NPj1BS1dQXc3Ew8rk+XB6WFNn6M7JzNvne11OSkhFS09ZZGvw2tTd 4dne29TPy+tCZri0uL/OeHpRODMzOETb41hweF9eekxJXvrNwb7BwMXfaFxSXNzOz9LldWpPQz5F UmTd33h+0cLO6m1lfmtib9TO09rf7mttU0pJS01QWFNe5tbV09jt+OPb2dPPytxGRd2+ur/I1trc SDkxMj1Y7WpjavXTz99eVWrfyMfOztXT5WpdVGNs59nmaFVZU01PUmL518vJydzvaVtcYurjzcnO 3mlcVVVLSlFVV1tcX2vi1dbZ5unj39jOzuVKRdy/uLvKytLeTjkzMDxP8N/14Gp6+GVaSlF6x73A wsvN2W9YTVx/29Ha81pXTUhISFJu3NPIx8nO3XhVVlBceOPW09DmcFtbXllPSkxQXV9e9tHHytLf +2703NrbWUrrxrq7zd/w6WVCOTdAYdrZalZPWG9uZE9Uf83FysrP0trubWPu3c/P2+VnV05MTk1Q ZOflb+fSzc7qW1BbZm7p4tjRy9T3a1JMTlJPTlNVZd3T0MzN2ud/ZHLl19DnTVDgyb7N5eXk2F1D OzhFZOx3XV/2zMjVXEdJY9LLztXWzszcZVFQYt/T231fW1tVTUpQedXN2Hjdz8jNdFtZ8t/d7GJm eud9WklETF7q6/hoaujX1Nzk9+rY7Gh76tLM0WY8Ok/OubvExsnIckM0LzxP2tfe5ubMztVbRERM 3c3MztXN1OVUSElR59TR2d/h83ZYUllu3dneY1Rb2szS03hpf+T6UVFPXvLqZlldatzU2HlbYX/Z 1N32enZ99Xhv4txaQkfuvbm6yOraZ1k9NDU95dLH2ufk3MnuY0VIYNPDzM3a2NtsVEdKVuzNzdHd 6PtcT0dJWubNzdtvXmVaVVRZYuDMwbi7w+FSRj9AP0pq1MjG0HFiWFdTT0pHU2Ln0s3MztNvYfft 3tZROE28sK+861bj40Q1Li5Gv7rBzv/nxclMODc8b8HB19nRz854RD1HYdrIzNjTzdN2UEZKZ+Dh 5ezz3NLZ8m5lYnjt+v7l3djS3mxXTk9YdfDy7ef+fuP78fhqZFpdWW/+a2ttbmZvYGb15t/e2ufx 6vHv3+Pu5t7X51RY07q6xdtdZVxlPDY5PWNu0V7nzMrB51M5P0xk1NPKzr7F2XBRUFJhVmHhzMTF z2pWVE9MSkpa3MfGztvs6OPnb11eceLa4353aWZeVExLWGJ+5t7b3N3vZmNnbHbu6PTn5uTn6/xs +u3k+fry5N3ybFJRV2B48dnUz8/V42pdWVxeZGdv7vd9aWBeZPP2/WxmfOHZ5Obn8uz8aVtaZ+vZ 2+bv5+npblRQV2/u5Ozu4dXS3PFgYHTq63NmaH/r72ZbX33l7WpgZnv09nR09+ri7HNkYWpqcnv0 5d3X3u3+efHs6fZ1efPv+/5mYGRrcnv4+PXt5ujtem95/XpoZWd87/P9bGhlaWtudPHo3+H9a19o bWx1/d/W0dbd7HZ2bmtoa2x39Pf9b3JtenNx/vXm6ur+b3B1eGZka3nz7unq5+bn7m1fWlxib/Tt 6eHj5uzxdW9vcffu7Pfw6+bofG5ufXd4c25yd/Dp6fD3/n1xYl5ebPvt7vnx6+v2cGhqfung3+f7 d3hvbWJgZnL17u327+/s+3j9/u3q5Oz6dGlpa3t3/vfx6+rudGtoYmNsd/Lx6+3y9XZwdPLj4Obv 8vN/amttc/718X79dXd3cX3+fHJsbXB6+evp7e/08e/s9H17+OrufG5qam1va3P97efl5u98amVp bGVqfO/m4+Pt7/t5bW5zfuvl6e/o7fVzZmBiZWt5evf79/d2amZmbfru5eXn5ObxfnBsevz4+HVu cvvn5vB5ffTr8f5tanzv7f54eXt6bmViZm56/vz47+/ze2597ejp5Obl4+fu/mtkZmptbWxv9Ovo 7PLv+fV6bWZfYWn97O7o4ePr9Pd7cG5vcXF8em9raGx+9Plpe8XPb/VXXGliaF9ncOzm3ubm5eni 5nRibn7y721jcnF97n3x8fn4bHZxb298/nf6f+r6e3pnc2/y9vHo8enw9f5udm52em/37ezm5ubv 9vtraWt1dnbtbu7y9fhxdGRoZXn3fedw7e/v4Oh083xw/fv5/efl+/luaWt3bGxsb/76435ubG50 8fL/+W7r6+7t8ezkfPZeZmRue+vv5Pvs3Xjpdn5tdWRtav1953XqZeppe3Jud/jw+/X4ee/06n53 9XX+/3Z8d+Rx3mfieed/b/Fc8f9x8G568/pv+2lv6l7ga/V69ffr9u3x6/rm9ez6/u906F9vanL8 ZOpt/Ox592Z+bm7+83zv8nz1eexr7nDr9n7g/fDnce1zavdicm1fb/1j4V3p9Gztdu7e9d1862ri au789G/kW/hd7mjhfd535m7ifNt+5f14/V32WfNkc1t6VOJa3WPg+t/089xv33L3+vb1ffJncW5p 7/X95e/t53XpcXZ9Yu1k/vT67G787GboXvJv/+h+6XHnf91n7GD9bPBs8W/6aPJbe/x96Gffat9o 3mfqZnNi32vlb9/03uzv/m78dfJt/mnmeepq8GfvXOdj7Wx0b/t29X125vL67HvoeGd3Yfdn+fB9 4X7o7nPocu968+7v4H10eF7zZv5lcmv8b+t28/rn8+F57WLvZ/Ju6WjtZt/94v7lbuBu6mJqc/tv /nnj/e5qb2rpW3Rc8mHlY+By32XpZet78/rg8Oh/6/T14XPfYuZgf2N4Z/p74fv6cvv+5/P0a1xr WvN343vbd+B04mvfbORe5l7rWPhj62PeZONr6HPmZ97/7P12bfN3ZuVf22fh8vl0/nvbbOFk4Wzi a/FsZflieGhe/2zw//Lvc+hq3mroZuv16nD/bvZu42X09up+8W9+f21x6l7fX+9963XtaOPy5nh7 Z99d32bgaXprefnybOpt21/edu/ybeZj6nRs3mvgaW5s62n4blv2Ynruedxv6OPx2G3sdPJ/9HN1 am9wZ2dxa/l4cvf65ebk7e384mLiauRe7WbnXeVh3WbkZOdm6WXmZ/Zpemblb+Vz6m3lbepvcW3s +//s7un54WTpbXZnaWpkY+lo5frdf9pv5W70fvBj72vndvN3+Pds+3Fm7Wjg/un77Wnsa/N4c/3v ZOZj52vs/nd6e1/6bfHr9/Pm7PbkX+Zi62r9fnPu7ez9fvZt5V7uZm/ybOlr7W9v62bz+fH2+eT3 5Oz87GffYfd+beps6GjmXuZbbmlXaGpo7Wju5d3s33fc7Obt+vR372PsXetc7Gjk8/vra+Bb72hg 5WjdfOn953HhZOVc8WN66F3mZXvcWdZa4nb7+3DhbN9s6vNs2lPPYN/mXdxX4GFq+WTgVtpb+exY zU3NWX7pU9hl3+3422TbX+vzZ+Ba2l1+e2DuXd9e5PRr2lraX353YO32+txu33Pr7XXlZex1+Plh 21fUU91kY95OzU7SWvHiUc9P1GJ23VXOTs9Z895Xy1XUbfTaXtpP2Fzt6mTZXOJk7vpq31vfX/f1 ZNld3mLv/mbaXNZk4f5b7FXyZGjpW9td3mXl4+7d7+jsc+Bj5nV48mbvbfNvd/5m9lnpXuztdddc 2VbnYm/rad5y2nXw7GnfX+FvduZf5Gb272DiaO77ZeJe4mPob3HmZthd4W386l/oY+X+9O9i5nDq fnrr/e7+9/X3+XfudHltZnRse21i92nscPvv7OX95/nlf+h57nb6eXh/enH8a3piem3v8fnwdvN/ 9n7++PV8ef/x9PH38fb88PP79ml7bv1+dntxfXxsfXH8d/T47O566Hjmd/JvcHxu/m597PPude54 +2d0aHRsbnpw6O/h6uTv6/L5dX5qfnjp/OZ483R0evx1/G7sffhvcXFq/mb+a+rv6uh/6Pnr9Pzq bnRga2Juc3zz8vHv9ex89n/78v3yf/Bxb3n26u7p7vv//nduamRiamtsd33u9+7p7/B47Pzq9/v6 eO548mx1bmr9c/p79PD+6H/wb/T9efz583h+/f7vdnpyeXt1f/1++3nt8Ofu8/h1eG1zb/n37O/v 93hxeH31eH1tb3dw9Hjue/H4/fFz8n7u9Xj3ePZ19/hx/25va3VydPHy7f/27fzu/vF+9u7972z7 +G5yZXV5dntv9nt2cfz3+O979H3vePn59ep95Phv8PX1/u/uenF2eXhy//95eHL+cnBu+/To7f74 //Hu/nF+8/j3/vd1/Hl8fGtrbGhnbX7v5+Xr5Obi6Oz9dXj+cmlvfXp1cGtpZ2xt8Ovr83n87eb8 eHh7/fvw+3708Xlr/HzodXD38/xvePx4fP338e38Ym/+6vb17ev0ePn/7/Zsc3HpfnNqcXZqb337 +fjy7+rze3Bz/u59b3z89W988e52bfDu6fZ2+/Xs/Hnu6eduZWZqaWzs9+/sd2547+5+b3F7+Hfv 6fN3efzv9G/46ujp8PxzevV2d2xobXr2fmVmbfP4dXd0fvjxdffk7PPw6PDy9P7vfP10avbw+Xtv dW10efrxd2pvenF6fH1+dezn5u/19H3s5/X77uP1b25rb35nZW5pcXB9c/ru6N/a53x8+/dtZV9e avN+aG315ujx8eHf7Px49Ovt/n739WpjcXhpXG3q4uPr9XXp6nNiaHl0b2lo8+l8+vhvff/8/X7o 6fz0fWts83lvcn35b/X27Ont6vT68P1v/G5idPX6eHF58ujzZ3bq/Hf38+96cn/1+nNv+uT0cXF5 5+n9Z2zo629sefFtZG3v7n1r/Nzua3Zr7/BhZXPo4Pjy6+3j4+3q6Glka2lqYWV45uH0Yl7+7Xhn ZH3z7u128t/q4d/m9Hd8/Gxp7f52/m1yaGR7ZWZ76uh2+f3s6eje7W5oaGx7a3l+6tnf/nN8+vVt YnZt/HZm8/Tr6vvv7ex5bG7sdmd3bmnr5vv77O1ufu3u9nd7beXrb+vx6WpsaHZ+YX3+635jcW38 c/jr5fFnfHjp82vs59ftc2167/juffJvcvNrfWv6/nPzbWpm6uhnavnp/GBq73vt8nvi7+37Ze/0 b+fuaWds4Ohlbfnp5vdq9N/vfGrx5Hxoc/PqZltp/PRYXeXk7357+d3a9v195ux69XR9fPv5dGt6 fWh58X52aGJxb3n36+3t7/D8durg6H338uXvbXl3alt47HH+a2x89XZ49/Lyefb7fWpp5OZ2+/vq 3+f3YXR7X1ljbHD37Ob79vDx3/V5ePXnbXzf73D3dmTv9XZs9+h89Xlke395a/fl+/NsYm3p5PJ1 cvpuePZ73+L18vDh8Vxn7d/qXFJo6/n4Zm/x/nVp+OXpeXjj5fRse9vbfXJzffVsZHFpbPBnavFx 72n83/ttbOnn/3vc3unqYWJzZWBx6+dw8X789Xj5cOX7YGN3ZvPc7PHx3Xli+Pn+8nv9/Xxx8Nzr fGdoYWP0a2hnddzddW/o4uxufeh+aGfy4Xt3dHXyf/xcbeBtbHHk4HpradfX+HV+4Phu9ub7d31f bH1mYWVu9fTydmV3+eHmZmLv2nlebf7g5Xtz4/1z8XznfOn9eNxrZmJ65HNsXn3g7Ghu3uF8a2x8 6ul2YfTdbFzw4PptZvLs/HR2+2X38Hv6b3Nu6vV4dH3nZ3J76tzx6H7s33Rkb+12e/r782lndPbv c35pbXrrcmLk5vVveevlbm7j+HZo+N3lcWh7+Pf+eWNu3OxjcfZt6vVdXeff+Ott9fPq72P9ffhn YPttZm508ufq6vDn6Pf6+Vlgb3rtfft24uhv7eDuYH3d6OZpZPZ4fP79bmxravtx5fb3+fzqbGt/ +fri7mh1buV7YXJ13Xt97vDo7nhw725u/m7tdPNldnj63mbybe3pfuN3fmfl4H1oY+hnYHL86nR1 9Obb6m1dcO1saWpzdvrl7vL17eju6PVobXn5dmF973b78Xb25Hzz5+5sYnxn+uR7c3Tp9nfv8m9e Z37wYWHo3d3r6v7c8V5qaOHpZmvj2m5j7+lvY19j+HhjaN/Y7Hpt7dz0Wl3w9P5t7+36Zvnf6PRh /NngaGjue399a233e2Lw7Wlfd/x92uN+93vq3eleXnr9b1xZa+Ds/uDjfWzo7P1sYOzz6eZ2/N3f Z2J69nVcWGLxZ2Xe6/z6a+Pe4u5s3NjibFz+63lhd3po/2p64PJtZ/R+eG9h4OHk8PLsXWxzbeXv efxxaPzvdfn1a17t4m718m7td2h07+1x69/qem723tzsaGb8+334bHNtZWJv9ff7Zevc7X55cHnz Z2Bz7uPm9PR5fuvh4fluXGNZWmBb+/b86uHw793X6mt//ODuYW7r4ubv/eLb/GJmZXhdW334fV1u 29jtWmXp5vpfae3e83Jkfdt6bHzlb2ngePp6YmDs32l2a+nl7Gxr4+3e9Pft6vNi/OttXWFmfOtj cuPv8O/58el4W15+4urrY3Hc6v5u/HPw/mRoZnp07u7v5fzt6Gxt9+zoeHr75/5mavbg6ntq+Orz X174fXBiV/3gbnvh1tfyX2Le1+xdWu/fdmJebvN6f+7l+25xd+bj/VRp3v1dWunk5e/y2dXieOTt cWldampxaW9pffZgd+/2amvw3+h96eDW7l9gcfN4d2Nu6Pr7Z2R37H9sd3fuamz34d34amfn4fhg Xu3j8ez4eOPa/Hj6eGtfZXbldmf67ezyal/13+pmY+vd4m5fd+3sfm717ev9cXJ2Y2L8++30ePzq 7H76aHv9++776nz+++51Y3ZmbWl77u/x9vHp6O3t9X/u8Ph7evDp+Wt69G1bY/ZpbmRcduPt9O39 6fFkbd/hcmzw6Ol5ZX3j3/53b3bpclpx5nprbvvn53v4391uX2d28m9fa/DsdPzr5vNxaHre729m be3qdmb7+f/z6fb35eHscW9s+u1rXmX5fnV7cX707Px5emdpcnbv3uZ+39fi+3lzdfVqY2dpc3J1 fvru7O19avPo7uzsb2x6cWptX2nv/Xp77e7o6v72/PT08HRq+Oz2e3n7+f17+eHsdXN3d/1oXWBr enL1/+/c3un97Ox9c29q+Oz0+vPr8/x772paXWr5c3Z59e3o4fP2f3N8+ff5fGz+5+fsffHt/nR5 cXf+dXDy63d+fW5qa21t8OLm6/x18fN7+G5hb/xna3J0793g6u5xdPb7//P+efX/b2n/eWz99/12 b2747/v9fPf1e21v8unyeHzu6/F8+Obt7vxvamv7/P54bWZweW/+8/Dp73ru5vFvbXX+7vpwe/Ju cfx69fL8fe7sdn376et3dn7r5/5lY2tqb2x3fXhzbu/p9fX36d/qem7v5O9xdP98a2v7dmdq/N/i dmhv7Ov+c/nr72lfcerqdnT99P5tb/Xw9nxpb3lvbHL46O318uPh6+/u5e/+ZmZ7cXB3c3r6dXh/ dW5w9PR5d/77+/V89u/y6eXq7O37/nh3Zl5lcH51bnPy5O12dPPs9XZv++58c//t7fb29/52a272 8vl1cPfs7Hdy9ujq8O59c378d3duZG39fnxpYWn+8fTv9P94end7/Xz38/L08uzx9e7v7vb8+/j1 enF0e/z4/W9sb3N9++/z+/5++v94efvu7vl1fPHs+m97+vD/dHF6/nn97uv0fGxja25rbfzy9v7+ 7eLi7fr99vf3e3j5/nR6eXl++fP8eG9zfnx7endvefnr7uzn6e33/nh7em5oZmtubmtsfe7t7vT9 +/h/d/nt8ft9+PXy+Hz88O3v8/n++317fnj9enBvdn579vL4fXVvamxudvj28+3r7Ovo6e99bGVn b/XzeHRyeG53fnXv7314/O/y6evu93r49ezw9/X47/V+bG9+dXRubmhrb292en77+/n27u7v7/91 bnf99vP6/Pz5fnZ2dXX++ezn6urs9fx9/n5+eG5raGpra3v07+3u8fH6+X53d3d5fvXv7/t6/3x5 9ero7Pf+enVybGlpaWpu//Dt7vDr6PL28/51bm5vePv07e3o5ejr8f3//H1zbnBqaGpkZWhvcnbx 6OXj5urs/m90dv/5+fh++vp6ff76fG9rcPl9b21sa3D78u3w7+3q6uzs8PLx+nVubG1ybWdrdXn8 +PXw7unm5+zt8/5+cW5xeHz/fnx5d3p5f/50bmpv/fb39fp+/PXs6uzx9PPv7/l2eHr5+nh1cGxt cnv/dvzy8/j8eHV1cHBv//L19vLx9vf07e30+H5ydHV4fv74/H36/W9sbHZ++fP3/Hv7/vv4/X5+ +377/Xz47uzs+PTx/nhtbXBuePj09vj4fXxvcHN79/jt7e3wff75cmpqanl+/vb08O/6+399+vn2 +PXx7u/w+X92ef357/H+eG5pbnh2b2xscXr47+3s6urvfXz4/Pv9dmxpc+7r7vD58PPzeXL9dHN5 dHBsZGlxdXh98Ovo6ero8/54+/x0ff17//v59vt8+vXz7vR7bmxoZ2hqdP719e/s6+Pl6e5+cW1v dnd4fHt8+PR1cHR97/Dv9Pr/8enxfHVra3by7PD0fXZ1fPh9fX53cHl9emxpcXrw8+7v+e7/7/5+ 7vHq7e58c21pZ2huefju6ujq6/J5dXNuc/r8eX56en18bnL77uPg7Px4b3ZtdGVqbmtzb/J5fvT2 6erh7/pwa3x96u7t7PLq9e78a3B+8O3vfGlsbWppZmtv7uvm6H958uju8fZ+c3h3+vp5b2VjYWVt b3f9+e7h5u91/Ozn3+fy9Ovp+/d7cPL8eHRzZ3n+aG1dXFZMT2XWxb/BydPd82RXTkxVaHjwel5b YWJfX1lXXX3q6uh5Z3Hm3Nvb5fHi19LT2uTr9n759WtXXGprb3N6+ubc6n55WUNBSfWurby+Rz1F PkQ3Okl6u7XC7Uw9THJkVUhZ3LuwvM9dTWjm1nJRWWbXzeFWSkxZ7Nv+U05Xaejm6+Da1+b38u7n 7er2cO/4dWNfb3rg7Hl8XV5KOEFeyqiturxOT0o7OC00T8uysMb3VEZaU0ZER865tbxpRj9N3dvg aVd+2NbrX1lj6djsXVlVXmJZWE5e3c/Jzc/a2uJlYVZb3c7KzmJcZ3zMfTkt2Kmxrso1Nz5dQjM2 OFy0tMrfREnSytRHP2DNt7XFVz5JbdrPflRt3NDbW0tJX9ra3fxZWFZcXVr85tjQ+F9j59Xc4XRp 3+ByU1pdU+rJxs/W00wv46S718Q7TPVjPyYtP1mzsu7xfvbEeEg3NdC4tbrhUU7Jv2FXb+vMv9NI QkpRWnBfUGXm8V5ZTkpn3NXS1eR32M7oa1pXb9rXfe/d+P5uXvzUydhnTzRWoavWzUBWZkA3ICpd zbK6buzezMpDNzY60769wca4w91hR+HO1NLcy9DuSzw+SVJXX1r2e1hbUmNuYuHYz83KzWhVZfLu 5NXifs/R80tJ4+l1cF772FxdravLy2VqSC8yKTDh28zNy7jG6lM3PUJGbPXAuLq52k9e3WQ/aMa+ vsjlWm1ZPThJat1+UE1c7VpNZ83G2GD43Xfi5urc3tHtVE9b69zQe1bb0s2/sqy93t9IPzApKi5I 3mfYxry40GdIQEo8P2TMuLm8vsjRbG9vQ0TevcLZ/tjRcko6P0pOTUpj3Nf9b9fN2vxi/Nt1SEfa ytpcSmjQwtdLX8e73EtOa7Wpu8+4u9c0JygsOC8v67avttbbyMlGLTA/W/Hlvq6ts8jHt+U0Nkvi 325jzLnNTUVERT47PVfU/XHLxcbOc+nLekJGV1ds+17Xx87O0dHW92BPU+zMtq69urbHVzQtKSsu LTt/yL66uri5yk1DQzo3O0fgvr64qqy+w8dfQT44PU5KT9TK29HoZl5HPD5ST03dycW+zfPY209K UVJifmN7zMXIycfR6nte6ry8XcezxOlLOTM4LykwRj9Oz8G5tLzLvcNMPkBFT09M1LW+uayzvsfh SUI3LzM8PEfW2M7Ey9PP9kdJWFBa6d3P0Onbzd/96Wth3OFsftPUa1972tS/xWu+tcztWUc/PDQs NDw2PFV6z7++vK+yyc/NWENEOj1M+s69t7eytcHaYUA3NjQ2PUNHbNDT0MbGy9N5ad3VYFV93dxr XO/Z6m/42tjZ5n7n4uL4U0L9xWf1xsrJ1Otp5HU+PT06Njk3PG7TyLqxs7S6zetgTkpIR1P03+vd z9HU42pfXFZOUF1aVlde9OR4duHX0dfW09fd9W5r7vBnXWFv7PpmVVnxffvg09vd1/pqYlhNST1B 09de3cK9yMvQyMDfVWD+TUM9OkJMSkrt3dnOzsvFy+/+5uZ3X1df/+bm3NDS1+Fve/peWGttXl9l YmVwX1Vr397c19Td1NHi82xhZGFXU1hdZGZt+erm6uHa62ljZGhnYmnj1trf5u1x+mxbW11sa3X7 8+zs7Ofj4urk3dzf6OTf6Ov6ZWFdWVNOTlRbXmtufH7q4d/c3d3d4Off3OL17+rl6/xuaH5rYmVm cHRvZVxfa2Vz7+LU1NfX2t/+ZF1XVFNTYHn79Ovb2t3k7PpsZ2VqaWtsb3t77+ro3+Tj29re8W1k YGhdWGJtZ2p0dvDo5+Xf3+t++PBwYGBkaXJ89OLY1+Lz73ZmW1hfYmZ87eLd6ejx+vpvaF1ebP/p 4Obk5/H6/vf5cnfx6e78cHBvb21gYnB9+vH5+Ovr+HR18u/vfH75ffLv6+759u/6aF9fZWFgbvnt 4d3e5eXk6/P6/W11cWd2b2lqY2ZraGJebPz06ezl2dXa2tzf8HVoXF1dXVteZnXs8vDu6+3w+/fl 6vL35+fq7m9tanF2++5/9+z/cG5fWVdbYGJmee3d1djY3N3l6u3/cmBebPLt9vrv7Oz/bGVnZl9o aG53/uvo5eLg5+zt+nv/+XFwbGBfZGRiaG54fu3s7OXn4t/m+PH4eP53fP77/f7p5+vtbl9dWlpj b3nt4Nvr7ufo7XD+fW9yeH3s8mpd+dFlVdLPaXhgXutXS1n8W1v73tjT097R0+H27W9zcVpYXnjt em/o6e5pWGzqbVpe7fNw9O3b1+R1/O7tZWFs9+xsee318tXd7OxuW1ZTWGtfZe/T2+Dc4tzl+WXf 7VpddXZfbVtkdWto9uR3+Ov1d+/s7ePx++7i8mpvfuz5Z3jhf2l3efV5amRwX13t6+7v5u7f3vDq 7PhscWRkdvnv4ubl5PJpXWVpZFpfZGh1dG/w7HDu39/h3tnY1trg7PRxZmpmX19kbWVhY/3we+3i 3OZ+cmljWllkaGxzb3rvdmBvcWdnbnn35+Li5PL849jh99rP3N3Q0M7Y7VQwQ69mNsC4usXf/u7L Nic9Ui4uRGO7tc7Gq7FSXOZJQTs2Sd1TRs2/2s3I2NXoPjtTXDs/Sk6hn8Ghmp+pxPo9LCMVGCsf Hzfzrqerrq6mujQ2OjczLTXYtr+9rKivt8Xu4UMuLTk4MT1LUt/PZtPE5f5yZO27t6qfpqGgqbZM NCUdHBocJis6ybaqqquvzng5LjEvLj3WwbWsqquss8nL8j01ODk5PTxEVE5DUVlPWlfOtKago52c oqvEPy8hGxkbICMtXb2tq66tt102Li0rLDFOvLOuqKSnrLbD7kQ3MDI2Nz1JVF9cS0VZTjtNwqul oZ2bnKa2z0IoHhwdICMrPcu3vMDA2DwuLC00O0vIrq2sp6ertLzA1VdMSEZAOz88NTMyMDE1PFd/ xaidnZ2bnaO0YEAuJB4hKCszRei/vutPSzMoKCo0QUvLr62yraqtt8C/v8nW0Mzbak9FOS4sKicn LzpC266enJyZm5+qyWI6KCIjKCouP1rZzG5GPTAoKCozPUzFtrCwrquus7m3u8fHxMfeXVRPOS4s KykmKzY9WLuknp6am5+mu8ZMLSgnKiYqPEtr4mVXSzYsLS0yNkLPxr2+trC1t7ext7u3tr7N1fRN NC4uKignLDs8RcKooqScnKCktLXaOi8sMCgpNz9KUU9OQzAsLzEuMld+3cjAtbm+tK+4vLSur7u6 ushTOjYuKCQnKy0zOeevqaadnKKgqK6/Sj0wLiUnMzA3UHFRS0I6PjYuPEY8R/7Z0Mi/sbO5sq+v s7K2vc7lXDwwLy4qKy45PDdXsbKunqKko6aswslROzUoKy4qLj9INz1KQTs1QkA9P1j3TdzFu7y1 rK2trayxvcnPXzw0MC8uLzQ5Q1ZbVHy+vL2pqKmlpam0t8lJOSwoKCQmLS4vP1JGV+pVTltKTFZM bM7EuK6rqqiprrG8zmQ/ODAsLC8yNkFZ79LKycXF5f27vO+uqb6uqLjStsk9QjMoJiUhJywqMj06 P/b35Lq2uLGusa6usbGyvMbPaU1FOzo8PD9GSk5WXFpk/G/q6NXEwr+7uLu+v9H2Ykg7OTg2NzxE SVlkYHhvbWNqee/e69DCwcG7vMXN6VxNSkNCSU1cZWzw6377293Wzc/OxcHJxcTMytDlaVhIPz4+ PkA9PkJERkpOVG334dLPysS/vbu6vb7Ax9Ltb1hLREFBPj9DREZLV1Zv3NnMyMjIxsTJycrNytPi 7W9TTVFNRkpORkdKREVLUFpje97PzsrAwMG/wcnN2er5Yl1XUE1MSkdEQ0dKUV/w39PKycfIw8fM yszQ1t5/bGJYUFRRSktJRkZGS09WZ3jhz8vFv8DGys7W+2JZVV9aam5dZmBVS1BZVlZt5u7b2uPW 19jX1NPX3OXb1u7r3nRiY1lMTlBMT1ZVV1xebu/o3M/P0c3V3eDvZvz3ZG93X15pVlNaV1Zn/e/i 0c7U0NPX1t3g3drX3+XqclxcW01LS0lKTVVfbHzi19zX3eTX3OHf3Ojl6Xbx7Gb/53NkY2BSTFBR VmJ569zb2NHPz87Q1dTg6OL2f3F2Y1ZXVlRUUlRfaV9v6/n27m1ldHdveu37/t3b3dbP3uDd62lt b1plal1f9n5VfONqed3k59HW4dXa+fbodnBtW11aUFhZV1hofmh/4erk6v/m6fn36efr6+TuaHp9 YmnuXWjnZXzh4d/f3t357e56dWBt6v7n2+nz6PljaF5XV1xcZGt/fHLddWr8cXR57H/t9N/k6Nff 6H37/WBpZ3BeZ/plb/V8bXZ04vr03OXb2+HW39nS5/n5Z1RNT1hQUXFkd/Pq+HLi7/Z3bP1edt9v ddzY6uPZ4X7q7l1q82xj9+/3b2z5fWr43/Hm1OX87Ox7ZvboZnP8YWJdYXRXXez5X/7ebXTq/vd+ 73L3927f/mTj3nrx2v537Hzv9W577/ft6u9bWu1dZOXwdunl4+T87/l8XmTpclr88Fhl8GpfaHv3 /X3j4Orv5eFoceF0funudvXufXx8cGT27Ov37t5xa9vf7ene7Hd8d3pfWWJjV1RvaltidndfXfdt X2h572l14t/u3dXX5NvN1m5PzrxK5rrIydK2xlrOYlc9NTQ1MCk7UDVAv73lua64uLu7xc9bUvE9 OEZINTxfTkhy1+HT0OpTv6dG7Z21uqujqVSy2zU7ISInHRshMCckzb7msKSjqKOhoq21us9RLDUx JygtOS88dtvPz768xe3q1lRGTFNPRuSuu7mdo6KepKK7w0coKhoWGhgXGiUrLtCxraKenZ2eoaeo tnVTRS4pLSotLzlIWMzvwrvY2dlgPj9FPUNESN3N3r6gosKdmaqlq6rXNjQcHxsSFxscHSpV77um op2bn56fpbPKxUotLy8rLy84S23W7ri46dbfYDw6OzY/RUvixMK4s7O1wdWyolFCoLfQ2drALDUl HjIdGiMrLi3dsq+jn6Gbnaastbs8LTErJSQrNDxE9L6vs7usscHfZF89PDQ2Rz5CY8q/xb+9vsH2 UkAyyLsp1ae6r8GnrWO8KjA7Hh8gLC8vb8u5p6uwqKuw91TuOD0wLztN3VK9sa+ur621s89HQTYt JikoKS81P227ubeur664x9D7UC8s1qxNTKGin6iupMXILxsmHBkWFiMpL0HSq6Ggnp+fnam1u891 Oy4qLzs3M0fIxsPIv7nLZD49PjEyMjNHWfLJvK+xsa61tr3R4VtMPDY6NjdGVl9IQmTAssTGvr6v vN1PR2c5MTIvPT9BUti5vb67vb3J7VdNTEU/StvHx8G7t7i/zu5ZRjUzNDIwMTxGVOXOvre0r7Cv sL7L0V9AOzs3MTU/RUrv0cq/vL7LzMxdVFpKP0FTTE100cbAv8fBv8TN3+hcYFhFRUVHP0VTR0hN Z15a3d3b0MjDyMLDw77Hyc3U1mdOSUA8OTg7OzxKT1fWx8C9urS5vb/JzdxmU0ZJTEBGTlBYXnFZ beT3Yl3kX1lzX/Tf3t3PxsrLxsfP3fZUS1JKPkVbUk9b6d7a1N3QzttvY+5zXVlSa+927+TRztLX 3Nr5/fNdWVlQVVhXdGVie3Tvd+/latbP1dLV0trR2WFg/F9NSU1PSUdOZOff6ubLv8XKxcjL2GJd TUVEP0BBREtJWtDOzszFu73BysvQ7nxOTk5KSkZQYG5jaOfW3vPa5uHrZ3Zha2ZeYmL+Y+7f79vi 0tv0ztnk7Wnta1JSUlhiWVRoaWTe2O/f1Nfl5tnv6uPt49fZ/G/9W1RWTVBST1hXfPFn3trV08/N 3NTf4+5sa19iTE9eWGxw/NfTztLX2edsYFRLS1JXU1jf1dfMzdDNyd547GpbUVlXVV5hWmzo9+p7 cGr8d1Fk83737uHd2eHt+N/Z5+v1bm1oZGBrbW78fuzg4ujd5Ov4d2Zed25iZnzramHo6+53am9h ZWdiam1+8fLd3uLV2+ni3eXs8HZjZ2ZVUltcWVlpdn7f4Ovf3uLY2dfW1t148HtoZlxjYmJfX2Vf Zl1aX2dvfPDl497a5OHZ5O798PVsdGz95OfvdO/2bnFkX19lXl9sdHl/8Oz1397k6Obd4+Xr+fxu bWBiX11kY2p+d21+/O717uX44+D69/Ln/mdvdvn7fXv/6Oz77ep0/H365u93YnXz/Pt4//9qZVpe Z1laX2r5/evh2dDU3NfX3OHveHlgXF5bX1hcX2jx6eXe3eDj7+v0dGhgZFxWV1tt7Ovl3tnY2Nre 3+f4Ym7+W1tfXGX+ZVxobfJndeR83enb0d/o19PtZmTo71lXVm9uZmVq4Hn17PfefF7433Nubfnl cmxgbdnbbm3s3d/5fep9YHprUlhseWNt8fDneXzQ22Ty2eto6d1jZNr1aeJ9/nhcYHduUmLidGJt 8uF5etzcdXTp9f98dOj7YH7i7XVj7u5sd3D77Wdd/OLuaXPh9vd+7up88X7h73Hr/nD6cWlqXl74 82Ri3911aOfp7uZ07+1v7+br9P5yZlxhYGdxbP3p293e7N7Z8XDy/1hg+l5bb/Js+/Dv4+V9a/R3 Wnnmdllz+Gh2fubzbeXh7XHm33Hn7vXmbmh+dFxbeGtrePl+6dnY0MvJycnL2+xuVkxIQj49Pj9B RktRbNzV08zExcjEx83Ozt334HdbW1xcTVRhSEi/1Tu1t9++va3587ZLUUY7QDMxNTs7NjvnUkfM ysHWwrHHwbm1vtC4vtf+5F4+PTxAODY8QUQ9Xtxo3srAzsy+yczLzNL/b17NzmHLurvNwbbIbG1y QzYyMi4pKzE1NDp509bFurK2ta+vtruzvda/wtxeZ1Q8Ozg5Ojg5Pkc/Snl5Zd3E1tDEyszXyMz+ 6u7S29PBw7e4vbe+x+1eVzQvLSkoKCwvMz5O6sa9t6+tq66vrrm9t8hk4OJIOkJAMzc9Pz9CS09t ZF3b4mt17OxfZd3d5N7R1Xfivb/fsK64rbSuvtrFOz0wJikiJSUnMDQ/b829sq+rqauqsrO60sPr TUxJSjw/R0JLVlpm6HZfZF5OSU5JREpOXGzozsfGys/FzFRVtK9AvqOzs8GtskHfLy0yHh8fJyok N1jfvrespqelqa2ottV0U2I2MT08Pz5J6NfNz83EzmVQTEQ6NTk+QEZT1sbEvbq3u8fR3OxPNzbI rz1uo6qsvLCtSc8uISwhIBofOC85abqppqSkpZ+jvsDGZzgnMS8uMi9lzr+8v6yuuc9jbkAyKykv NzU4U720vLmvrK6+x855XjkwMCzkr0TOpKSgs7CzP9AoGx8dIBseM0S8sa2inJqeqayu0D4qJiUh KSowZMa2q6CjqKmvvUw1KSEjICQpL1vIuq2oo6mqrLq/6T4vLTIrJiUttKm7paGdmKWrWDU8HBwX FBwfL0LIpKCcmZygqbfkMyYiHB8mKz9/rqKgnp6corXcOCgiHRsbHic1aLWwqKGin6q0w1ZOMzIt JCosNDsyQa6cnZiboZylrUEgGxAWGRYcITi+n5iam52jqq9GKSAcHyEvPUu5q52Ym52os8o/LR8b GhsgKjVGxq+oo6GkrbLFak05NiwtMjI8Nj5fbMTMqpmdl5mrpMpRMxsYDhEWGCw62qqel5WYnq7P SSwoIB0iJTXUr6Gem5ygprlQNSYgHx0hJS09XLesqKepq7S/3UM3MzEwMzxFTGfh3sC4u8DVrZ+h nKG32TEuIRwbERUbKFGxnp2ZmJufrL0uIh4aHSIuQMqnn5yZm56rzTckIR0cHiUuPtS2qaWjq7a5 7lU8NDUuOz9TyM69v8jM/WlSWl1GQMiqqZ2gubg8LSgiJhoeISJWsaSdm5+osMY7Li4gISQoP86r pZ+dpaeuxVIzJh8kKC9LXtq/t7a4tsh0Uzo3PUlT3MLAvsLHzOVdQDk3NT5KSlO2o6WanKmqRDco HSAYHB0jP9esoJycn6vCSi8tJSgmJjRHtqefnZ+hq7xkNywqJiQoKzhN0L3Cvb/Gw8rNbV76bNne 4utYT0FBPz1ETGjLwb23uKaip56vylwnJhweHRspJTnFsKOdm5+mtk0tLCUiKykxSseupJucnaG3 /zcpIiMiISctO3i3sK2qtLrG0P1QYD5CTEFXXuf169pn1tDVyM7T53m4r7Ojr8fMLCsiIiQgMis4 1cetoZ+ip7Z5MzEqJjYuOlt1v7Chop+fr8ZHLSYoJSUsKzU/y7mxqLOvvNbQTVxAQEw8UVxr0dDS 09PZ5tzQ29HYT9m+0LSxxLxgPjQuMCgyLSw/Q+u8raupprO/3kE4OTUwOT5D4Lu1q6isrLfVTTkt KCopKjI7TsS3r6utsLzHeEVLPT5CPkFFVW3Nvb68vcfHzt5xRj5JQv6+ybO0wr1TSzYsLyUsMC9O Wse0rKeoqbHIbEEyMy8xOz1tzbitramuuMZMOS4qKSktMz7tyLeusK6yu8LabE1DPTo8Qk/60cnC xczab1tIPDdHY92vr6ykr7DKPzcmJyMiLCo4WNSvqqWkqK29Xj8wLzAuNz5Pyr2yrayssbvYRjYt KyssMjtN1cW2sbKxt7zK9E89Pjw7RUlY+dbJxcfM3GxYS0k/Subos6yso667yjUxJiMnIi4vON3N r6qppq2ywlZCNTM4OT9Tec7AvLy7ur3Ez2hDPDc1OD1CTHF82cnGvr6/yc/kXV1PTExPWWXyf21Z V11h/nx+aGbGwLeprqqszt82KyohJycrOzrfyLutrqqttLrgVUA5Ojw+SWv73srJvra3ub7UUj44 MjI2Nj9OaszAure4ub7J3l9NRENBQkdKUFNfe/bWz8nKztZd8MnXta+3q7nM4DQwKScrKDI1O3b7 vLKtqKytvOFOOjQ1ODtGXP7Iu7iwsLS6ylY8NS4uMTU/X+jJv726vL/L12BXS0NJR0pOWHHt3NHU 0tjl619MS8/LtaespKvC0TQrJB8hHyctNea/rqWioKasv003LCgrLjRJ+8GyramprLXLZjowLisv NDpKXNm/uLS0ucTvV0hDSE1UYVdRVVfu5dTW5NtvfXFXSljBwKuiqqKv2FQoIx0cHh8tOGOzqZ+d naOz3DQoJSMmLzxeua6noKKmrMdBLiclJy0ySl7Xv72ztbW81lo/OzxJb97M1ON7VFtp9fT+WVZQ Uebg2l1PwMCtn6iirk48IR8cHSQkNl/DqZ+dnaO1Si0iHiQqONa7r6aioqKqvkwrIx4kLD3Mxba6 ubvDvuJnQzc4O0jexcS/ytbfal9QVElFTEhp5s6+wMl2PVq9vqGjrqlIPCoiJR0mJCtUx6ygnqKq wD4sKycuPEHava+qo6StuEwtJyUnMlTXvLe6u7vF5fs/ODs5S1/bz8jGy8TO2nNPREBITVtu+dzd 1dPoWztMt7ahm6qlyTUtHh4ZHSEn5bKlnJuhqco3KCUjJTU/zq+moZ+itOQzJiMmKzbnxbOsrrG9 7Dw2MjVCTvTa0MvCvb/B1lpBPDk7TFHy3+3ZzsvBylk2PLe0npiop28pJRweGh4mKcWnn5iap7Y+ KB8hJSdG3Liknp6fp9Y2KR4eKS9Ju7Grpaiwwk0uKi0vPezlzcDHvLe9xepIODc5OUdQe8u/u7u/ yv5DNiooS6iflZWnrzwkHxoaFRwmOaeYl5WbtVoqHxweJCnmr6WamqCq1S4jHx4iOGa3pKSmq7DL TDopJiktONi/uK+zs7q//z04LC43O17PvbaytMN4Szo1OC0svZ6bkJatyCkcGBkYFyMyxpuTl5ml Sy0gGxshKjexop2YnKzLOSMfIiUv0rGonqOtt1s0LyspLDA4R7+3rquxuM1pPzYzLTM8Sce3sayu uM9INi0uMTJDPvGdl5ePo0QuFhYXHB8idr2ik5SbomwhHBkZHTRRupycm5usai4jHB8vOcKmpqKi sd5ELiwyMzM1Pk7Jrq6vt9xNQjw3ODg5T867r664w+FOPjw2Mj1HU+PaX6mZoJeeMzYeGR8fKCU/ vK6alqKu7B8cHBwjO8W5npufna1LLSQfITrjxaakq6SwWD0uJigvLzh6zsmurbq3zkpEPz0/Zl9h y97Yx8jL2+NUR0g8Oz1ETmja8KyZn5qeNDQfGiQjLio9wLadmqW0TiAdHh8pQ7ivnpqgorg6KCMk KEzGvampsqy3RjcsJyk2O0Pe1cW0rre4xU9JRD47RD9F2cW3r7PDbkg2ND01NT9A/sG4uqaZpZ6o LDMgHCYlLypOuraenrC/SSQiJCguXLS3n56opsA8LCcpK0zIx6+stK+28j41LisyOzlPzMq0rLK9 1Uw3PD8+W2fcx725vcRvPTk3N05YTefjz8bNXrigrp+jPFoqIysoLyMzSVujnqWmuzUrJSMiMVhW p6GmnqvHRi4oJDA9TLaxrKOpss07LCcoKy89asavq6uxxms7ODc6Tk7u0ti+vb/IZ0o/Q05ESExG b9nH2Lair56jeMgpJCQgKiA2R2qjoKGgsEwvJSAfLD5Tq6inn6q23zgpJCsvS7y1q6SrrrtLOiom JSczR76tqqivwu4/NjQ1OT/ty72wt77ITz87OUFBRk5nzM67pqmioLy+OSYkHCUgLk1MrKujoqqu WzwnHyMkL2y8rKOjpKmy6DMrISUvP8Gup6epr8BsNykiIiUy+reqqKu2xnI8OC8vOUbKvrWyuL3W akA5NzU8WNnWw62qp5+uvlwpJh8hIyk9Pr2tqqOmqb/cOCcqJCs2TsK5qaqpqLbBTi8rJSo0Wbyx qaisscxGMSklKC0747qwrq+5x99EOzc1PlLPwLy6wsx6T0tLZk1IwMi4pLSrtU1PKCojIS4nPl/R rq2jqKyvVUk0LTA1PT7p7s61s6+utMj9PzEyMjZF7se7s7q+y1dFOjY2OkZwxby5u8XdVUg+P0NH aN/KvsC+xtRZQExQ3La3sbHEyWxCPC8sKCgqLj1av6+rp6iutcxOQDo5O0BDSVxtz8O8uLzH2m1V VE5NSkhJT3L40NDz61NMVU1n5dbHxcfS7VFDQz0+Q0pw0L64t7i6wcTIycXL1WpKPDg2NDUzMzQ4 PmPKuK+vr7S6wdL7TkI9Oz5GTnbWzcTDwcHFys/eXlZHPTs2Njk/Ut3Bu7i4vMHN6ltMRkJHTlFd WlBUVGTiz8m9t7avsrKzzNhIMjEqKi0rLzc8UNrDua+tra6yvc5dRT46PT8+SU9W18rEu7/DxczX 2f5PTT85Ojg7PkRRfc7Buba0tbzE5ko/ODY5Oz9PfNDDwb+5vbiyuLC4x8lFPDcrLSooLC0yQ13M uLCsqqutsbrK9ko8OTQ0ODdDe9+/ubu3u8DG2mVMPjk2Njk+TVzizcm+v7y7wcPO+WhNQj46ODo8 RV3fvrSuqaqrrLrIdDo1LSkrKCksLDdHZr22sK2vr7K1ub7D3GpOPTs6OD5ITHHp2MzMxMLIy+VV SD05Oj1BUPbXxcC+vb2+wcvfXEhAPDs8P0RIX9LFtK2sqKuxtdZLPy0sKyUpKCgwOU7DubKtr66u srK4v8nuVUg/PD1FRljucNfeYfVfV1lKR0NASE5d2c3HwMHEw8nNyc3U41REPTk7PT1L7tG1rqyn q6+01lRCLiwpIygmKDE2Sci9saytrKyusLS8yXhIPTs8QE9d+eL1eGBUVlBMT0pDQD09RE78zcS9 u7u4uLi4vMfiSzoyKyozOt+zrqWlqaqxxdg/LywjISEfJSwyWcW6rqytq6utq661vdlPPzo3PEBI WFJPWFlu19fb4VNDPTY4PT5OYXzNxb22s7GwtbzKakI3NDc+X8q8sbKytr7J6lM+NS0pJyUoLDRH bs7AurWvrKqpqq6zvtpdS0I/Pzw8Ozw/RVJp5+rrZFNPSk9YXlVe4szExcPFyNh2XEpEU8e2pqGk obLKYSwnHxsZGRshNsunnJqanam14z0zKiIhISY+yKWbmZmfq79RMSkhHh0eJjF3va2srK+6v8/c X1M/PTs6Pj89ZaqmmZOdmqtIQB4aFhEREhsly6KYj5GWnbJNMCMdHBkbIzSznJOQk5qs7isfHRoc Hyc517Sqp6quuM5YQDIuLy87TW7F2Vmxo6GRlp+cZEAvHBwSEg4THSi3o5qUlZmdqcw6IxsZGR44 vaOYmJiboK/eLxwZFBceJ0nFrqijn6KmtNc7KycmLDJGRTzCop+UkaSduDzHJicZERMPHyU9trWl npuamqK9PSgfISkrMVJ7sKGfnJ+rvUk3KCMfHSEpO8u3rKusra+1ylQ4MC4wMDy5r6icp6ilwrTo Qi8fJRkeJB4sLknMsqiooqepqbG7bT0wLjQ3REhZxsCvr7jCSz85OD07Pz1Ha9O+u7y+v766yftJ PGnqybnd2nxYy93LXz9IMz9ANjs0Oj5Ldlzm28e7trK9wtHeycbIzO1WUlhiXVxJQktN+N7X1enW 08jH1/lJSk5X621qX1xzfO5zU0pITXbPw7zAwMrTzdzU32ReSEVCPkM+PDk3O0Jo3M2/wrm2s7O7 v9vf2+7WX05JRVps5XlUTklOYFtSTkRIT2J8+d3czsnGxsfN19jd29vocuvm3tXb+1xSSUk+PT46 R0hSXFvf1sC8vb7Nzc7Sz+NkWVhf79bU3ul1afRuWU1JRkpPU2JbafLc1M7GycjL2+heWVJRXVdv 8d7P1dDh+mBTVUZLTExXWmp+3cvIwMDGxdjlYUxNRUhDSE5Q/XzWysvGxsbIy9ToZU5JR0lMT1xj /tjPzc/jX09JSExSZ+zWzcO+v7/K1uNfUklEPz5AQktYaNrLyMLEycnV2N7vfVpWT1dfZf7t7+HV 2tbzW01FR0ZPU1/z3srCwMDL4GlQTkxPTk1VW9/OxL/HyNPY32pcSUBAQUpPWV1dZW7g08zHysrM y8jLz+1cTkpVWHXwb2Jd1GA/Pj9scFNNWsK3trzP89PA2UM2Nkzv6V1X58rBzuf92tRsUEhS6exw WVVtffZeT2vp18zb1MzL2FxTT2f4dG1e+tPO12JPVFhST0xQ69LQy8jJyMzmXFZLR0dHUGZ2/eLP z8/P2drj7evwdWleWlpfYFxaWl9q6trU3Ofg4PNaVGPt4ul54+Lv0czF1FpTW/NZRERUed7+Wfbf z9VvW2D+/2Ff9eLa4dbW4Ofn193ubntrV1VKSlBYZ/Xg8Wvd1MzPbGbk0NpoXl763fdfWlvn1/Za Y9jW9mlg/9h+T05bbl9aXfvR0el72c/U3en8cOV8dtze9FtTWl5hVFBYZmZu393d4fx3fPjz5vRy bu7lf/P/7XtrfHbmeOHi6uPh3+XdYU9MXP1TSVe8usjFvbm9x1A9Qj80MTo8SFBJWM3Ezc/My8zO 7XHeeVFMXXVqe3TpysrT2NjYfFZXWVdPRDko7p7CzqqfnaapWkzOLhwYHBoeIiM2tqevqp+fn6e1 4VrhOSstLzlIU1LMtbW6vMng0WQ7Mjc2NTk+Ste9v7ywq6yywM9PM8i1TFPTwLy3wjs5YEUtKCQi KTA0Omu+tq+vr6ytr7zS4U9NZO5hYd3Xy89qR0NHQkhHQkVTbfDW1dbMxMnOyM7Y1+ji5tvZakc4 OlfpTlzoz7u5vdL6Zk9EPTczO0RRa9XPy8PByM3O711eZ37y69DMysbLztvf6WRSSU5aW1RaXWNb W1VNX1hTW1pv49Lb69PKzdPa2t/rVEVfz8rM2t7YzsnL5VBNTktAPj9CSmvmbGjk19DJy9Xa3N3t 621fbGX57d/Z29bh29nm8ntcTkhFSUpNTk1abt7NyMbFxcXHyNDv+G9aSUdCQERBRk7/0M7Ixb+6 vcLO2+J1WkhBQ0dKSk9XYWZnaGV5bmdjcN/W2tvNx8jIxcrU1ej7dl9ORUdMTEhKTF5weOzg0czI zdLO095rWVJMTkxNVGzo3M7GydXZ2tfc615QU1NSVFhVaOXg2trb6vDl8m5fV1NWX15XZ+Ha4djV 2tjf6v/e5mdsbuz9/Ph/6ex0W1heXFZZXV1v8HR/2tji393Z1trd6tvdfG9mbWpoX1tdam9rcnn4 b11aXWzr637o3dfb4OhsYmlrYV5lbWzi0tXR0dbY1/pUTVFSUVBMWGhyZ2HZ2uXd6+zY2vP32N73 3eXf3d15WF1RSUtSZNHOzsnCur3J3mVPSUE5NTY8Q0xj7eDLxcfEwcHN1dXd63BeUmZyaGZ73ul9 /GVlelxNTFxTU1xg7OPXzt7Mvc7Pz91tU1tDS1NTTVp5PEC5r8S/v7+4s7k/Nj49NS4sKjRU233Y vbaysrnEzMzsT0tGQkhXVnHAvMXIwMTUbEg+Qkw/OT5GXv9k6tzExtPM08zH0vpfa2ZmTlFXUV9m aks90KuywcDMt7K7Ui86ODAvKysvPfbKwb+8sa2uuMnV3WVIPDg9R1FPZL6ys77Ny8fvPzMwODw6 Nz5b28S+v7y8u73Lz91mXmlNQENISk1ZYurNv85OfbWtt3lFY7+7fjYvMz1APTo9RFXLvbvC0tjH ur7pUEtTdO1vWF90eM69u8fvYVdXVEI6O0JMWeXOy8TCxsXK0PNYU05MSk1OTF3h09DOy8zNztxx W05FP0JGTWPh0svFxL+9vMDN4GZUSkM+PkFGSU1TV2J+29LS1/F56+P8bX/f0cfBxMjMz9vgflRL S0tGQkVKTlRiZVthfOfWzcnJx8XKz8/R4WtVTEtQVVBPT1Ve/uLf2c/Kzc/V3OLf3utlVE9OVVpb XF9eXmBjY2ZlXlxp6uPg5eve0cnJzNLW0s/V4ex8a1hTTklHREZLVV1eZHzj1c7Nzc/P0tjk/3Z3 7+7wcWlu/XpeVFBWW1lVXfvd29jOzs7Mys3V4nheXFtQSEhOTlFVVlps6u3z+vT07uLa1dbRz83N 1t3b19v5Y1lXXFhQUFZaWllWU1dganDx29XVz87O0NTW2NrldmJfW05KS05VWGfq1szP1dPR0+X8 e/rycFpVWWZpW1lYXl9dX2JnZmpv+ujp5NvWz83Nz9Xa4/fx8n1tYFxaV1NOT1daWllmfe7j39zW 09fZ2tzm7/d9fvpoVE9QU1rxy7+8v871bPV9WkpDQD9BR09k5NjU2eDn6N7Y2Nzn/XR97tjNx8rS 52ldV1BKSElOWmZpd+vi6OLb4ujq4N3i4Nzb52NTT1FXXWVcRTk+0a2jpK7I6t7abz4uKScmJyw9 1LSusLi8urSzu9RLOjMzOEFb3djq07msp6m7UDk1NzczLi0uNUfTubK0ub6/vLzAzeJdTEQ/P0VK TExCNjjaqJycpshLW+5tOSYeHR4iLU24qKKkq62srLHHQCwoJyktNkffvrexrKmmpqzFPy0oKSsr Ky00Scy2rq2utr/I0uJ4Xk5IQz47PkZPbtnsRUW7n5iaqksvOk1GLiAcHSEoN9Cso6Gmr7SwsLro OiwpKisxQei9sq+vraysrrjpOColJiwvLy86aLytqquutL7M2ftiUEA4Njg7PkdY2sW/xepaxKie n65NLzRHVj0sIyEkKjbps6qprbe9uba5xlQ1LSssNVDLu7e6u7i0tLjB6EU2Ly4yNjc6RWXNv7u5 ub3Iz87N0P5LQ0VGRUpUZtzEv8LEwr7A1kcxKys1Vcm9vL/CwL28vsppPzUxNT5R79fZ5H5pceXQ yszT3ube19nqaV1cY2pqY11mfeni5u3w7f5hWV/v2NPfbFpWU1RaaOXRzdbg3tHKy9pbRj9BS1RX VVdi5tHKx8bJztnyYFlbWFVTVV583c/IxsvQ1NnmZk9LTE5NTExOT1Vdae7Z09be6efd0MrJzNbn ZllUT01MVHPc09Ta4enr497obVVMSk1SWWBu7dzSz87Ly87R19vsYlBJR0pNT1hj897Xz83Q1t7u +29dVVFTXGp8aV9n+ebg3vBxb/bq5Nze5erp6ePd2+Hs7PRqXVhXXGl3dWpiXl1eYWRoeuTd293f 3tvY3OV+ZFtVUlNi6tXOz9n0c3F7/HxuYl1ZWF5u7+jv+fXr5uDm/W1rcf/x7n1pZmd57uLe5+35 cG1sc/Pp4N7c4P1mX1pWUlFVWm3p29bZ4evq4d3f7XBjXVxfcuTW1Nx+YWBs/HhuYFpcYfvf3eb4 bGv45N7j8mtfXmNw7eXue2545NnW1t3yaWNmZWRjX11hfeXf4ev6a15cXV9kcerd2tre5u/v7fZ5 Zl9l/OHa2+T9ZmJiYGRjZGJgbevb2dvmeG976+Xm+WtkZF9dX2Joc3F45tfOzM/ddmFiYl9eXFtd ZHH57OPn8Hp0/uzn6ujw7u719vp6bGZfYW7v3tvc3eb0cWFfX15fYF9ne+re3eDq+3j57+30fXl4 +O3s8PV2aWhlbP3x9f9waWZoeOnk5+17cfro4Nzh92VeYm/7emls/v367+vk5f1hWmN74NXY43No cHFuaWNfXFtjd+vc2Nzo7vDz7O1zY11eaHLz5Oz2cvHo9e7f33Rhav3ybGNvdV1h8Xb/5ODc2d7m 7PhkW2dfXnNqbHFvfXHs3uLd7d7ceHtsXmRla3Bmduv1+Hno2djc+WBfY2/9aXNqanZs7/dr8/3t 39/b7mhscOx7X2Fic9zV3P5v8mz9+GpeT1zs7v996OJ1eO14+PLx+l5p6+fo7dnca2ltc/llfflt 8vH082p7el9rZG3++9ve5fZr8u7u5P9aWG/k6OXp/2tpaP5+bfp893jg0uPi6l5WXXrh2tfdXlBR U11l5d73cGnz4+bd7HRzb+nn3NPh/WFhXVhn9uHk4+psbfxoXF3/3OXk3m1XT1JcbtfS2Nff6vDx 6PpnZltdbWx0efjxbmT06Obc5uhzYWNabGt74eHobX3k3tTU5WpbVFVp7+Hh7Pj78+/x3+Xydl5X WGFueX58cF9qb3zycu/+b/T24+fr6nRpaGR94t/s6+t6YWvl3dbP0938XT4yMzzctKefo6m7UzUq KCYmJiguPtGvpaGkrL9YOzU3O0FERktezr21tbvKYUc+PkNITU9XaujLxMfPaEpBQC4i16Kejo6U n2M0FxMWDxETGyRqn5GMjI+kPh0SEhQjMEK+u6qgmZWXmKhRJRsYGSIsPX7Mx8y6ury7zehKTE1Q zM3Mz3xEKiNJqaSQjpicuUUfFhoODRAQGjOqlo6KjJyzNhoZGB8hJk5Ts5yUkJSXqTciGRUYICo4 zru4tay1xL5SPTY4NTLfzr+wucg2Iy6/spaOlpWnyi8bHw8NDw0SIcmcjoiIj5q/HRgREREUICXD mo+JiIuYrywXDw4SFCAvaKqim56fqN1FKyMhISw16bm0sOA416unlJGYmqzFLSIiERAODA8bRqmS i4uPmK8xJhwZFBQYGz6plY2Li5OcvywbFBEPFx0t2q+hpJ+kr7PuPiskIiEuQ1r5R7Ken4+Ol5Wp ujMeIA4ODgoPGjGymY6Nj5Cdt98nHRMQERMo2J+Tjo2Pk5+0Mh0TDhETHi92r62ioqCepq9fMCQf IicuLSlvpKCQjJORnqjdKCsQDQwIDRUpxqCTkJOSl6Go9y0ZEBEQHTe2npiQkI+UnrwoGQ8PEhom MX3QrqWemp6lzTooISUmLSUhbamgj46UlJ+fvT45EQ0KBw0VL8GkmJiXlZaao8wqGBMVGCI25bCf lZCOkZ7FKhsWGBscHiIsS7OhnZ2frMNrPTEnIB0ZNaSekZGcnaieoLt9GwwKCw8bLFrNtKGalZOX o8MzJiIeHxweJ1ummZCUmKG0yjQsHhkZGiErP2/CsKefnqKuzTYqIBokyKyfmJ2doaCfuVgiFxIP ExgaI0Swn5uXm6OhrbtsNCYZGh4qSbmsopyamJ+sTykkHiYiISIlPM2rp6errq2uuEEnGhzJsaCb rqKnoJu9VxwTGhYcHRgdK7ebmJadq6eurLY9IhgbITFSdtG4opyYnKraNjQqLCUdHiI33bKrraak pqy7TiQZKbvYqqvLn5+Xn39SGRsmGhsVFBwwp52lnqGgmZue0iwjHCcsLCUpO9Chnp2prK6/tU0v Ix4hIi83Psyyp6Kgo63CTyonzlBDvz28qaScwcNKJjQiGxgUGydWrLCwpKObmZyoTkUxLjgtJiMu RL2ur7vGtLuvtPo+Ky4uLz00PWjHr6umqLW3zT4sPNgvRl8wwLalo7yp2zphJx8cFyEmN75et6uq nJ+irPHgSUhWOC8tPOrFvMxXacjAvNFPR0FXaU1KNT722LnAxcjEtLq92j8xKiwuM0ZQx7Gpnp+i qcVVNyspIR8iJi1EZc3GvbW3ra+/vr/Av8PeVUxPbU5cUDxicHu80tFaRlRRXlpTPVte4LvRxmDu 62tjPkY3Ql5sva+usq+7wL/azEQ6Nyo1MzI5Lz1D+sHHw8rTw7m8ub7Jy87L3fBdTUxNTEpKVmV8 x1x/+ljMft5XTkpO6VfxPz9Oa766t7m7vcTGXUVDQD5JWF77887NzMba915HRDs6OT5BS2/i2tu6 urWvvbvS0ttaTUU+Q0pSc2xr+uvmzOXd1ztMPj9GW2Tiy9S7xLq+ztXY3V7dSE88NkxO4MnCzMHE ur3a1D44NjY9NDw/RufJvsS8vsW3wL7c7lpLeExVQkVuT8zc32NH9lXM3dV0WctX111AVD7bcdvT X9/Vwr/Wvefp7VxGRvtT2OVe+0vSzdvHVEFJTHXoa2xUWO/wcHdUWfzMxcrT7fnsb1xDS2vnyMLJ x+nH2HHYO0k6P05DVUJHSc/Du7PNttTEvebETUI9LVBVSc182cHBsLjazEU/VT09Ni0+PF/I3sLQ x7zLvtlc4v3EytLYTG51y9NTVEFJXt1nVzxEQkPFZdPuXcTavbvMvsvL4UxKMS49yMy2scCwuqq1 TkkoKCgpMCwyRNy6ra20v8W9y87bQD87PtvOvMnmzcm+zOdKPT5HUk1aREJKYc7t3ONt3ci/v8vP /lRfWEQwLNuusaKruq69p7w7MxoaHSEvLDBN3q2en5+ruLlq2kgqKiYzRWC4vbGsqamwuVk5LzAw LzIvNkDfxsS+ycnRxL/W121ad1/cTjUoQamom56wrLypty0pFRAVGigyO8i3pJWXm6fL5i81MiEj Hy7fsJ+mqainpq/NNSYiJy02Pzc7Q8ywt7xiREtWw9f7dEjj3r++UC4trqedl6+uwrasMi0ZDhIW Ij1TvLCpmJaaons7JSQvIigpLfKumZmepLTBytE2KB8jKzrH5tZRTNnVvF86MjFbyLi4yMPEvLze SyweP6uhlp+oqbyn6zAfDw8PGS9fvaqjm5ebnsQ6JhwiIi03R72uoJuborLXSTYtLiwsNEDt2czJ Vkg8PDxGUl7cy7m1sbK8yvdPPjo5KiBUoqCXlJus31QmHhoTEhMcOLSilpaanavDNiggHB4mON+u oaGfn6i230UtKCwuN07V0MrByVpFOCwzOlXY3ry8tq+2tsPi4UlIPDIvHyTAsZ+Plpyl8kImHSAT Eh0YNLislpmXmbbENB4mHyc7MN1ryaKnnZyqsUYxLyg5OTRVQVDfUGI/PEU4+snHsbOzusO+7lxp S0I5NzMxOTAt67KqmJSXl6faLBsZExQcGSVF76SZlJSbot8sJRsbICQxR8avqJ6bnJykyTQlHh4j LTdG7HDoy8C6urfCz+5GSkVNet3Mz9DWWU4/MjU4NjBEr6ubj5SVnM0rGBIODhkdJ8+4p5iWlZeg vS0fFxMdIjO9rqWgnqCioau+TiodGx4hN8W3rrDAa9/qZtTfV0VMSlPFwL++0l9GPzo6S1jqwMRf Vr+8rpufoqdHKx8aGBskKzvEuLihoqSfrMo3Kh8cKCw9ta6roaarq6++aEEsIiMjKU26r6iqvtpQ ODlDQ0VMUEztvbqvrbzMRzMxNkJY3Mvs39w5OsLMsZugoaLoMCcdGRwhJzDNtbGdnqKfsWgyJBwc JC1Hraemnqiur73bRTkqJC0rNcvAsau0yFQ7MjVGXHLEz9K7v7i0xk01KSYsO+a8r6+3tLvXPyk6 RU+goaSctEo5IBodHCQv5K2vn56ppbsuJB4aHzffrp6dop+qx145KyYtLC1mZta4s7e3tnlSSTw0 QEA5anfKv7a9z9RCPUFLU8y/v7e+0OnnSD0xGx1EVp+MkpKZQB4XDxAZIDJnpZ+fk5uqry0YGRgc Pa+jnJqhsbJlLi0oIixPz7KotuE+Oj1vtbvKVTApNEvSrq6wvctdPT44OkNe7cm7u7u8zk8+Likr JR5OnpyLiJqmNw8ODxIcLuS8qJWYmJS0Kx4QDhkt7qGXm52dsGU+JhobJjW+n5+lrt44L0tc8cNN MzM2OtS2ta6uueFOOiwvPEFfyfJuzM6/ur/TPzQvLTMtdZiYlY6uOikYGRwkJidosaqXmK23OB0b HiMmb7Crm5ifqW8pHh0lLfCnpaWks+1HMio1W8nJ2EUqMkrNqqavy0swLjM2PEzTwru2xNXU1s7Z cz4uLjREPzqik5yUmj4uHx0aFyIeKqidmZShvFgtKBsaHiLNo5iWpbU8JC4xMDk/vaehn7JNKyUv NF+0vu1YT2jOx9JFPExe319GPkHVtrC9ckI5X7/AyU86OknZ0kYm/pOYnJ1CLCQoMRYYHyetm5ia t87BQi4bFBkmrJqamamvtFQ6IBkdMLOem6a97+tINC8nLUS/r7vPUj9LZnrr5M7I4VxOR1foXk1L bMK4tL9XQj9LTzswIyqajpuft/XLLiwVDRotuKWvpKClnrArGBUdJjPMtKCVl567MiwqJyclQbGs pKq+49jGPi0sLj5NTltvzbe6wsnCx0AzOz9QelBLza6ors1CMTRAOTYvKESWkKCmsqO0LBsMFR4u Uzy2m5WbrcJqNCccGR0wtqqro56dorVJKyIlLC01262uuqqpr9suLC42MCoyScOtrrWvr79HMzY2 NTQ5V76trbfC71lLOjU3LUqbpbelpZq4NiAXJxwaHCuzpKGooZyjzywlKS4mIC7tsKitqJ+erEw6 MzEvKCYmVra4r7Osq7ftOjcvKy80RcK/yLmwrsVYSjY4My5B17u5zMO81Fw7LL6f7suto5zDZicr PRoaGidKyrexnZuouL3oPCwgIjJHSWC4paGjrLa1z080KiYmND5MZ9+8sq2yvdNJP0A6N0BFT9O7 ub++zFVFPkNFRlN7yL/K0ej+L2OjQU+rpp22t1NE/hwYHCMpLkXWpZujr6eoyD0uKS4tJipIsa6y sK2ipLZBQmA3KyoxOD5ARMOvtcfDu8hQPT5HVUZI38y/yvXq0+RAPUtP3sHNyrzFOnymXDTQxK24 vO3mtjIhJCopJyswv6Sns6ylrr3sSEc6MCoyZ05c5r+uq7TPv751R01EQUU5PFHeXlfO19jd/ODi 23JZ53zz6WL88mBER1pf/tfJzMG5vMLsWUhcWDxnz7u6wMjnbjsxKy40OUdqxsC9wru7x9pSY+Jm TklW6/Hv6tbK0Mzb28fN3Of2aldOQ0BKSURBTmNl0MvKwcXJytXvZGRWTlFe92xbVdvOz8XIwtBm TERJPT1CSW3d1tLEu77b6t/d12xt7mRRQ0BIUGRd/8/P2nzezNffVlD+731RdNPWytzeyNHmTE9Y REw/Rl1943nS0src331f2vLNyNvifV1VXF9WZdrV1d/rWGz9V0lNbPfPzev+69x7e19nbG1hWebX 5OXtbOlrW1JY4l5o7+fZYOrv6tTl5dPNzt/z+93kYUFKSFJQSlhs6Mfqyt7Z6PrVaHRYTvVebmDr 2MLSzNrt0VliSklbTHde1Nzed93883tOa09XeGXu3dvt02PZ5NXMY8puy89PZENYTD5IQvLeycvE w7/P/FlgcE9EU0ro/Hre/czd2+Rf3FxkUV1veOdfdN7r5dvtxuXOYmJxZmpZbOjye1J8T/5eflNi 8+7ZbNZ1eM9i1Xnsb/PT+OBp1dfnT0xFU19e6+XLzs3OXtZPYEtKYlra3+ff09fg+v7lZ1BYWXXX 6mXV69b7XVlc3PD+WP3u9PNj3tzOcu1vW+1J6k9q3l3z7eLh6/t51H/aXOrZettx3Ntuc1FOVkdP VvzU0s/M08/e915cU1ZiVm5rZOX3zOLR/mzgdeJcbflm2G7vZmH1b+p5autdXWZVcvFw2HfU+trs 6/X58W7oeX10aeBd417/XG52Ydho2dzq3m7xVlZJV2Bu2Org1s7O3th54/pgZ2BzTmhf/N1V41/W 83b4Wtz42u1+311xbWlq8mB7c3P19+Z82n3h8+3ifGXiWfBg8Hru7/f63O/pYF1jVn9ca+7j4tPf 5HpX61xealncWc9s19ru3lfQZ+rvT+ZZz1bz+3nhZHpZYWtb6vXf6/Z43+rWevvZXe5mWGpjeOp5 1fnQbuBt+vpm61pqYVvkU91j4ep9f/nvbOj+4Nje9FzlXPFace1c2Fjf6/ndUN1l3F1eXvLs9/H8 6unX6Or17u5Z7VjgaeRXf/hm2mXoaWX4U+lZ21bd42bQWs9e3dZp0FLcamLlW3P+bV9ud/z3Z/Tg +uZqaOV13Vface/fcOh25G11d2vqW+NQ3WZ7aGbcXNx8397s3WDXaOZga+NS3k/tavvld+n/9F/f X9xpbNNOzlHc+FvUVspuynbt2lXlSVxHUGJN6V/L28zO1c7c+l5nT15WaGBm3fz23NzZ1+x2avd7 T2NOW2R3Z2/e6Nji1uno2fTpbnFoX/Vj6WhxZO9+aGt039v09Gzac2xXX3Febmvy6OfU89Xp4nt+ +2zhXP9f7Pl78GjlbW9qXupn6Wbpfnv1aXVk6fjq6fjv+OFte2l17XR9X/p24ezwcmfraHlpe9zg 3XL+cm35YXbt1Njb3dnc1uV1aWhXVU5QUFhbW1xmcfbx4vLr63T6bPdz7mZ1feXb397j193kfuz3 ZVpQZGHm83M/UKawwr3Rtb3JQyg1OzI1MTBPzLvHy7nLy+0+PD5ebFPpzMW5uLrDy8v0Y09ISlxX XWh/9F99WVdoWlpac3vh0tbl79/6+XhsT0VJRVJUa1M6r52yrbS9rXlmJyA3KjQ2MlG+rrPGwMtV XDgzOkfS38zEwLa1wdffyL7sS0vmxOBPSlH8Vjw3Ok5uVE9Y1svN33LPyc/0UVt5cVJERmTk2ENW oKKuqcO2w008HiotLEgwOt67ssO/0UxPPzQ4QW/HwL2/ure+zH3vysNVSfPNxGBYSFXxPjc5RV/z Vkzjx8fc1tnWx9xwWmJbS0c+SGHf302xnqmrtMe6VDsoIi4sO0M1dLyzucnPTkhCNTpCXMq8vsW8 u7/H2mBevsJX+NrBxHdNP2hLNTY2PmB8Tl3Mx87W4vzJxftfV156YUdBXtfL1li3oqewv83D/T0r Jy4zOzs1SsS6w9jY7l9NPz9P5MvJzMm/wMHN52TVwszdXN/HzHNJSVJJOjo5R2JQXGHPztPP2s3H x+5YXmFcQT9FXNre1WC6oaawv8W4yUIsKTA0NDIuP8m9zujP1OtUPj5b4fHf2dHDvr/Fw8jTyr/U 1tvw0utpR0c/O0A5PkJLT3XV89vQzdHGyOHfaV1ZTk5HWG7ey9HS47yprrvPzbrWSDMwPjY2NDVI Z9Pm3srN1FpKVmdcTlRn3MS+wsC9vMHKzfLcZVN6WVZSU01LT0dBQkxNW1pf2s7Gy8rO29dfTUxN beri4tvPz8rRU1G7sL3K7MG721Y3PD44Oy4xQGbX7dfIxMh/WF1TU11meNvGvby9wcTCyPdmVk92 VFVOWV9JWUZLTUlWTe7v3tLa0tfZ7296bWF33OXu79vO1tXib0tKzcDM1tG9ucbYTEVHPT41MjpG eHXc0NbKzdbvW1hed2hf5crAwMTMy8LL7FJOWVVZUk9g+udnXmJZVktNTlNr9dra0s3N0Oz0fH53 ZXbu/3xwal5SSkZSyL7Iw7y2usXMbmBcQj44Nj1EV1pn6fDr7mhWT1NjaXzw3MXDys7Vz9Lf9Pva 3ufV1tDZ+mpZUklGSUtTWlhn+One5+r05trzbnNmaGZnXVRi8ejzZurEvsTBvr7Dx8jvX19RTj86 Oj1BP0VLTWD19njs3NTT3PDy397e3tvTzszLw8PM0NPZ63RiUFNTTUxHRkpNTE1aYf3o5ur54+38 dmdw7OLt6djU09j7fNTEy9fJw8LFxMnX1P9KPjc0NDg6PUpVX9/U2NvW1t7g7Hrw6+Xc0s3Mys3O z9DZ3Nfa2OD3dGhZTElGRkpJSU5bbf9/Ymry6u7x5d3U1N/u4dnlc2pxb9vJx8jEvsLIz9nqaVdF Pjs5Oz9GR01VXWpscPvk1dTW2trW19fW2djV2dPOzM3NzNTa6GlaVFBKRklKT1NOT1VdW11uce3a 2djU0tPV3ejw6uPo39zd19j/W2btal95e+7azs/a1dp6XE9JR0hKSk5SV2Br+Pt3eXdxbXbp2M/N zczL0tjU2uTh29vf5fFxbWVZU0xGREdISlJifdzT1dbX19ja2dPR0tng3uP5bF9XT1JUWFxiePpu ZGpvZFxfavjl2tbOycjIzNTZ3e16ZlVSVlJRTk5PTkpa51tm3Gz13v3Tz/bj6OTP2tzW29HS6Oh6 XGNdUlRXVVxeXm9j7dx43Op8zu3pz2vi2lvx8l3obFtwWm33WfLyXub7bflm9H39/2bd9n3N6XLZ ae7cVuJdTdpcXflgbOxt5Nxd1dZnzev+yXR63Vbx/FljVmFaVm9WbOhV0eRXyFVYx05wzVPd02Pf 2mbc1F/R+l/RZfbmXlveWlHXSnPZTd7oUt/gVctaT8ZVas5MyM9Avtk8xWBFzUX50j7E9Eu+WGvF V+nPU9J6SshmV9ZX7HpG0n9Jy3RVzFhu003M8kjAZEa9U1nESdvUSsrrR7tcPLU8Tbsx2tA4yGxF vVFdvEfFyj261UK9a0u9U07ISHXaO9PYPcVTUb5E389Pz1ZZ0lJu31zWZv/XYMltZMx8/eBrZvVc V+bqRt3mWslPbslK0809vWlJvULi0TrOaFLLSt3NTNPgY9dwXtfpe/ll8NVcU8NZXdxZ4md1Vdxo WG5XzlxdzGh/43Dl1Wvg0lPa4UzZav5Q7cdVT9vdStD+W9hf1VhY3ljjfVvcZ17wXOXbcuTXcXzo 5P9vzuJO29hUXPvoSszYRsfNdUTQzz7f8E5JzXw+2NVZ2c7vdc7n52jV/lPhSs5YSMZWYd1201LX zktvwUxlzu93SsvoQMRjTMVWSsvhW07nwznOxjrEc1xlW7Y8TrlLzlddyD3CzkPJ62NvbMVHTMRS XOLfVGbQbFPY1EPQ10XV4P5a69FT1W5DyNtUee3y9NZdS79vPs3TWld5zF1q01p+b+T8Xdxjcnhh 103izEbk0PnjVd/aW+xSfd7XX0zRwUtMzOxieN7sXuveR9bNSfFt525VzGBT2/TibvncTtzWSevk VXhi69Z02ejpy1HY/E7TX13r/fFN+elf1fla195l3mJj3/lfSNPoSd3e5Orc2Fz41GDjb2fXT1zq Xu/udO9fzu9LzvtTbnvsTOreWNXd/e310/xq0WpY6d9cUGbWUFXNbWrn3dxX485T6t1o+Ftc82/5 5Hxr8N9tWNfuY2zl01Jn3Wt96/nu9+/tcvJ952dg3Vtj2/heZ9fmT3zlZmL473bY53Xm+tt/aG3b 3lbz32v8XGhrc9VPXdF3amDm2lFn7n3lan3e2Nxy7NroZ2P73lxe9HBidO5rffZ+bt/fX/vpZ2ti 6P9i7fn9b2T26PD+ZunlZ25l5ul4/mfX8Vvo6tv8ad526+xu5mROSv6/YEC+uMbY2bPTSndKVDwy OThASDxP1c3P1ry3yMnCvsdm3s1vUk9qcExNW1xtU1ft829VafdZUk9hb1pc79DU7s/Hys/5XNaw 3juxtMPjWKzmOXQ6TjAnNSszPDFJ+cnB0LOrubq4uLti2dxNbEFOXUZrR1HZ7s7fwLzUz9ngVUND PT47OkhZXePLvL/Mv8fW9FlhSUJMQEpcTlxk6NS4tsyvr6+y27DRQ04vPCsnLycwOztX5r62vrSt ubm+ycNr6VhGd0VPWE/dS+7L+9Dnzspb9FNDTjo7Pz9PSG/JzL29vbe+wdPq70pCPz9HPkFWVHfz xba8tbe0r7++1WtlNTQvLS4qLjc9UGrNurm0tLa0vcnQc+xLQk9GTEpU6l7Ivs3ExLvJathiST86 PDc5PTxGZNXVz7u5vsLCwdpgXEpNSEZOSVdpy7zRtq+6s8e9y0dmNTQ1LC8rMDs9TebEu7i0r7S1 tszM9FRJO0xDQVdTY1nfvszayMXE325uRktGOj5ETUlMzMjLxMS8x9XgWV9NREQ+TU1I9eznyrGz 1bCruL7RvGA6Ri4tLiwtKjdHQ/i/ubq1ra64usPV0lhEP0lQPkRaaGpj9su+x9bSxs1zT0ZNRz8+ PlNf9d3XwL7BztnPe1RJRUc/QElOX/La3uy8rbrAta6xwcLlTlo5LystLisuNT5u1ce9ta2wuLm9 x9xVTkNHSkJKU3zee/rTvcHazMXR611HPkJGOzlGTmzbzcK+uLzHyNP2TkNCP0FCP0lbee3Z1da9 sbW9u7Syv9JrT047LysqLi4vNUXew7+4s7CvtrvG1txOQz49RUJHT1jc3dbCw7q6v77O0m9EQzg6 ODc+Qld7z8PHvb3Eydf2T0xQR0BGSk9e/+Ld3dnKsrG8trextcjZP0M7LSsmKSwvO0LvwLeysK+v srnB71dLPzw2Oz4/XPzY0Mu+ube6vL7G02hBOzo3NjY9QU3XzsnBv77FydhWVk5JSERMT1rq5NXV 0Mja5L+1vb27vbzBwVw9PC8uKyoqLDxG3Me+tLKtsbO6zdhZTT87PTtATVvl0Ma/wby2ur3A0nBQ SDkyNDM2PUhT+s3Dvbm7wsjTdFVIQ0RGTEtQbN/UzcrIyN/aure+vMTCwMDMQTsxLjMuLiw2Q1nF wr++ubW3u87rUk5MRUY9RFzgycfGw8C+wcW/xtf9Vkg8OTQ0NzpBTXnRxL27u73AyuJjTEpHR0tK V2Dy4t3P19HZcOC+vby3vr3Av8hSQi8tLC0vLjU2T8q9t7q4u7i4wcxZSkRMWktOUGLXyMDFyM3Y z8PBzOdTQj8/PDc2OT5Nd9DFwr++vL7G1lhJSElLSk5PWH713t/f3t3W7NK+vLi2uLu/x9xdQzQt LCwuMzY6RXzKv7u6urq7vr/I4mBPTkxQUk5bed7Tz8/PxcDAwc37TT87OTk4Oj5EXtzHwr67vr/E y9hyWElGR0hLSEtRWm/vz8zQ0cW7ta+zu8TQ2mVLOy8rKiwvOD5KX9vAu7W0t7q/wszX/lRJQkZL U19u6t/d2dbOysTBxs7nWUU8Ojw9Pj9DUO7Iv728v8bKz+BlTklFRUlJUVtoffjk39XS0cK6trOy tr3J1GlIOi8sKSosMDpEXN7Gu7eysrO5vcPV7lpKQz5CRElVZ/rs1czBvLu5u8HZUkM4NjQ0Njg/ Se/Kvre2uLy/yNt7UUY/PT5ARk9WZHHqz8zHw7m0tLC0ucLT+kk+NC0qKSsuNj5P7Mq9uba0tLe7 v8vYblZKRENESE9ZbeHSzMi9u7u7wNNWQDgzMzI0Nz5KcMi9uLa2uL3C0PhWSEI+Pj5BSVJle+7Z 0c/KvLS0sLK5v8zXW0Q4LSooKi0zPUhs0b+3s7Cys7i+yeBqS0E+PD0/Sll7287HwLy4uLm+y25F OzMxMDE1OkZZ0r+5tbS2u8DL7VRGQT08PUBGTmB169vOzMvBta+vr7S8w9P0RDgvKSkpLC82P07W v7aysrG1uLzC1lRGPTs9P0VLXufRwr6+vLi3ubvKWj41Ly4vMDI4QmLMurS0tbW6v8fdT0I+Pz8/ RERJXevez8/t1biurq6zusHDyEs3LScmKCwsLztVw7OsrrGys7S7yFY7ODk7PD4/SenBuLa6wb22 t7vMWT85OTIuLS40QvnPw7y3tLS3wdL8VktBQT5BTllke9nR187XXOC4s7i6urm/vM0+MywrKCgr KjNRxri0r6+urbHA/FBDPTs5NztJaNjJvbe4u8C+v9HUbU5BOzgyNjk+SVjn0r+8vL/JzvF9Yk1I Rldq8eZw5dnP1OxvTEu+s8HCv7Kzu75DNzMwLSQnKjFK2r+6r6qrr7bA3m9NPDM0O0BVZu3MuLG3 v8m+ymlXQkM+Qj04QUd869TQyrzCye9kaFFMPz9CTuzczcrJ0M/F1mVOUT9Pr7fOvLSruL/VODkv KyYiKi89YsS2r6upr7u/1k89NjMyPUZP68a5sq6zuszRy1A+Ozw7Oj8/THHa19G/w7/H1vhXTkJE QUJOWHPaxr6/wdDf4P5SRUo/Q7au6r2trrLf0jsyNSQnJyw1Pt7Arqusra+81P1BNi8uND5R+M+9 r6yutru/214/OTc1ODc/UlrfzsHAvsDM0eNdR0FAQUNGVWTjzcK9x8rQ4tpZSEdBPeKpvtuqq6rH 12suNSUgJCkxM0+8rKmpq6uyxF81MCwqKzZQf8C3raqmqrm960Y6Mi4tNzlBZNfLyL6+wMDT92pS R0A/RkxSUmDd1cnGycbP/PnmVUZOQTq9p83BqKqt3d9CLTEfHyUrNTjnr6alq6yruNs7LC4uKyo4 376yrqunpK3K90o+LCotMkI/WNi9usK+xcTrTkdKSz4/RF/e3OvaysjFytLzY15hT0hTTTpzpLDP q6qpv2dMLDIlHSEpND5Ru6ihpa+ttNhBKikqLS0wZbirq6qopKm/UDc5LScqL0lS2MW6r7rB1tVi QDw6QkhLRWbNxcvby8rI1PDwY1VVUU1nelU47p+v2a6tqsNdOSg3Jx0hLD5L4rqqnqK4u73TPSon KDU8PG2zqKmsrayvyT0uLTAtKzRVwrq6ura1w11CQT48OTxN5tjeyb/Ezet69eh1T0hLfXdVb+XT WEiupL+6r7Gw9UYoKjIfHyc4Tsq4tKSfqcfZeT4vJyYtP17Yvqqlp6m1tsdONCgrLDQ8P9O4rbG9 v8HPRDg4Oz1AREvSvr3K08nY6VJIWWVfTFX56Nbh389wT7GpxrW2ubpWTigrMSMnKj1fwrW0qaWs yeJMPDIsLC1H2Me7ramrrrjJd080KystOlfezLuvsLzH9EpGPTUzQmdgadS/uL7RaWLqYE5DQ132 8GFh4dTG2Evura2/tru3v/pAJy8uKCkrPlO/ubetqa3Cf0c+NS8uL0TYwbyxrayttspPWUMzLi8+ SPja0767vtdtWF9QPz5K7nFt3cy/ydtYW+L/XUlRcXdrVX/c3t9rSeKtvMa2v7TOzE8tPy4vLS47 O9TNvLi1sby+4GZISEc6Pkp22M/KxL+6vtjc5OJeTl5PYl9NTkdTT0xRWuzi1czKzc3W6OzxWEZU Y2BefNjPytHQ3uDkWk9QTlBPUXBW6M7kytHPzN/Mz/brXvnlVFhMR0xNTElTb27u1tDX5erv+fF8 ZWNu6t3SyMvFxsvTeHJQRkZFSk5Xa+/a2OTe1eJkV2VvbG9oeODd6el/8O56f2b98W94+tva6uPr 9nxdWVRcY1pi89zWzsvMy83X7GxYTkpNS0tPWlxk6t7q7+nq5t7c9+nf7/L47mxdcu/s4drX0dHW 3/H/W0xLSUxRU15q49XQz9PR2uh1XGJgW1tw6ePa19bW2eVqWllVTkxRWGb17+TZ09Td3trb3nVz a19vW1teX3xo9+bu1tfZ1uTj/WtlUlJTVVddb/be2tjc2dn3a2lqbmZmaXPm7Obt6dvs6nBr92lt XWjy6tzt497j3n1lY19cW2FqaW1vb+3n6Pbw4uPl8Pf7fnFpaGZtZmx1/fTy4uzh4uvqb3FeXWZh bnfv5Nvb3d3c2/R7/nNvYGFiY3dqbGVndWx6c3ju73tz7Obt6+zu+fx2bXdtYWF49fPo4uPh3d7n 5d7pfHNsamRfXF9rZ2lv/Ofp6uXp7H90cmtqbGVhaXXy6d/b3+Tt7ej6Y11kaXDz6vPv8Pp5bHZu d3NkZGtsb+/n7Ojm3d3p6fz99W5oYGFmYWpmePHs3tzY19zf6f5sZVpaXF1dZXn96e3s5OPpcnf4 cWt5c3rv9//13uLs73n/7/dyaW/8/vx4c/bt6v1tb2pwenJsbnvw8nZsa397c/Tx7enn5OHe5e70 9HxsZ2lqcfx3fXtua2VmYmVwdHP77eni4+Ti3uPx/HhxbGZkav3p9fXr5uljV2Td5VFO7MvVW1/P yXtOZs/ZTUVuzu1NVM/D01hT3c9vSEzcxtdOR2/N4U1JecfLelRe3tdrTlnaztb4Vk1d1NNkXNXH ze5WTmTZ+UxU2M3nUVXh1F1J8sreS07f3FBF97/A3Vdb+ehRRO3AxXdSWmJ27nXhzttaWFhPXurt 6MzRWVB6/mHu1tnX31xPZOH+etfYa1tlXlRr3Oxt4txbV93bWF/R1lpf1eBWaNHYZerN9UtY3mFG X9DyTmbM0FlZ0tNcW9XO73Hhc05dz9FjX9x4SEzr33Df1GZR/NxrZdzcZ3Hd8V1v6mtm499u+d5r UnLV5HHc22JSbudnbeZsUV3lbFjly9tm6NLlZvjrYWTk5Vxb4+hYXd3afvrb8Vlj5O5me+5qaerm ZGTk6V9n4N5//uf3anb19PXq/mJs7fBraPvq+3d9fv5+cGVs9uzv7enyff3u9m986vFhYvvrdW/m 4v375vRpbPhpXW3t+XH98/pzeXt29ef6ZnLk6Wtv5d71b3X173p2+Pj28H9tbPr+bHHy92386vF1 cffvfXH08n/16PFy/fj6d3z3e2tqcm1mbnVwc3ry7ejk5t/j+3L67Xtz8PJtZnT9bmRt+35+6+l2 a/z6bG7i2uZ8b29vf/H0fPHlbVxs5utu//H3f/v4bm3792hm/fJuavHtePXp+3Pu3u1v+up1Y21/ +/r2e2ht+Pxx8uLm8fbtfnv9cWx56+x5fvttZG5/cnrv6/1+8Phz/+bqffru/XJ993Fw6+b3bHT4 cG/98v756/NtZmtqX2Z++P9+7fB+6+X8e+be8Gt47vduf+v0b3Ftc318+e/l5vlxbG9pX2BodP3x 7err8fN8c2x58PV4d/Hq5+vw6+fq93b/fnh6a25vbmtsbnV7efz58/1ydnjx6+3p4OL3bW50ff54 dG96/nz++PPx+nZ99vv3/HR8fnl4+/r38vl0bnv1+Prv7f15em5oaXV8+vLr6+3l4uTxfft3bGpx e/X7eHX5+HRuaW9xbWhoevz89e3u8+rm6efs7+3x+nl4b2xqbGlla3Z3bnT+/vjs7PX++/D4+e3m 5+np7vfz9P//dWhmZWVqb/bu8OzufHz0+H5/9fl7/3xuaGz79X59+/p7fP319vfz7vX5+fLw+Xx1 cPzm7X189vN9e/1yefd5a2Zqa2dobW949PH8eP/37ens7Onp7/Tw9Pj49Pz6/nVxdnpydG94+v16 cHFrZWdv+Onj5N/g7Pb/cm5wevr8+3h4/v358/5vdHFoaHP++frx7fn+9Ofk7vj9/3d0b3F0cXx1 b/3w8fn07uzw9+7q7v5wbnJ8em9mbGxtfHp5/Pf7ff/7eXd3b3707Onq6u3p6/J7e392cXB++fr2 6ej2cnBta25xcv7x8Pv9/nhuaWtw+O/09PT7fvbv7vb++/r6/n18/n93bmx1/O7u7/b6+nx2fPb5 9+7u/3v/9u/1+ff+em9sampufvx8cnv9+/Dt8np6fndzdHj/8+7u7Ov4/f9zcG92/Pz97u338vX7 f3/4ff7v7vpxb3Jvb21ram16+PXx+fz8d3Vy/+/v7err8fXv7fN3aWVpdP748/n69PZ7dnJxe3t+ +O/s7vT9/PT2+vp9en/6+fr0/Xh1cnRzb3J9/3z89e/o6vJ+fPz4/nNycHFvbXJ4fvn5fP328fH2 9O/29f17/v7+/vr9/Pv5+nx4/v5+fnp+/PrzfG95e3Z4dH35/H55bmx0+fLz7/Hz8PD2fHpwaGt1 9vrx5eLk7PH8eXt6dW1rb3d3fv559ft1eHt7fvp7ffTu8vj59vf9/3p9+PX07fX79/j8dGplaHT/ f3h8dXn38u7q6Ojr7vN7d3t3fvx0evj39X92bW5ubXR79vx5eXd3c3Z5fvj29/747enw+Pfv7PL+ +vb+cm5zfH/7/frx+/93amhv/Pb+e/58eXz98vDy8fLv+H17eHJybnHz7uzz+fh+enZ9+/358+/x +v39/fjx+nNwdnx4dv//dGxtbXJ8/Hz88uzq7O3s7fH1eXl0dm9qbWtscn337u7s6Ojo6u/+fP3+ em5sbm9xe/j4fXt4dn72+fj7fH12dnRvcv/6+/n9+fb08/x4ef/38O3v7ezr8vf2fH14bmlkZnD9 8e7u9nt4e/vy7O7z+3Bsb25vfvLw+vr4+PP+//x2dXf+/3Nwb3b57Ors7e/3+PD0/Xlvam12+O7v 8/P1fHh2dnJtbnf98u729fv99/X1+nNtamVsd3T+7efq9Pjk4Xx46uX0d/RuZGFaXWBiYGV//Pn2 7dfL0OP7e/fz6n9hWVRdePXr7/Tg29vj9evrfGxdWlpcZGlyc2lx+fnt29nl8X3w3ebv72pdW2zm 6vJmX+HX2+RgXHfW21tTVllzcOzf8nhhd9LV0uJPV+rb12xRVVJq19ra/Vpfb9jM1fJNUOtnfl1m 12lMTem/yv5sa+rpX+bR3VRN299iXU5Y38fOV01cfM7F1GhNSlbYzWRSVWjn+ePQ2d/nd31tYV11 6G9sV0tc487GzGpQWeHP0tTzVVNWTklpzc1URW7Qztvr7vLa1v9VVG1eT2Pl1v5X3cXF2Gxt5tlu SUdZ6vRdXXvt3+vm32pmYmb0b25v3s33WFJc3s7S91lVadTI21BP/tDW8FhGT+rO1G1fad/Z5+Pt 7fBsaGNmaV5ibuvX5lhWaM/I2VVAR+LBxf9LQ0rSvL7dRj5N1L3B7kY+R+/JyN5JP1DOv8fuTEpe 0cbP81pj5t3f9m1YUFlaWVhk7OPofOvW09Pia15gant2YFpe7ODl6nRq+t3W0+RdU1vu1+FcUVZt 5dzkb2Ju49TP2XJYVv7a3ndZUlVfdOTY3uxqc9fS319OUl145+p2X2H53c3M3Gpi6tnc+VlQVV7/ /WJeY37i19bZ5vHy8uju+m9gXVpp7vhqXmL55OHqemhjbXj+fH18/XNlae3d5erz9vV9+/P6b19c XX7j6H5reeLdXjw8yqumtz8+uqWqXSYjNGBTMSYpOtSzr7rfYcKrqsE5LDrdy1I4OlLOwsHByuF1 4M7gRzc3Q0M2R6+gorLOrZydvCwiLT8rGxcdLUVYdMKwraqjn6e+TU3UXS4kKDz7X0vhuLC1vr69 0Ew9Pz41LzRKaU1CWMW8uKeen6eyrqKnWiQgKzMiFhUfQVhARserpq2wq6y3yt3cYDkwP+9YPkbG sbXU+LyzzT0yOD84LTBJfGFsxra2yLuinqzOx6qnyywoSHArHB4vSDMlLM2w0T1Ysam5V3O3r8ZP 5bavv1paxr3aQzxCSUY9Oz9HRkdc08LH0c7CvsXP087LzOph8tnZdlNLTl52W0lJT1pUSD49RlJg YmXv08nEwsHCydPheFxWUk5SXGR159jQztDS0dPW3PJcSEJKZWVOWt7m0sG9wM7Mxcra9llPV0s9 OTs/UWlNP0FszNBhUs66vN1X4snNX1nv2W5FSfPObkxkxrrKXmDOyu9VVFlNPzI+sLs6xq2prMXN tqxWLz87LysgIjdELirYtcXCybGkq728sbjVUDY/X0s2PO3g5VPPwsx8Ws3pSjw/SEZIT1ro0tba 4vrSp7RIpqm0rO+3ung3JlMtHCYiKS4qMlK2vtauqquuuK6uw9bn5vJDSOxRWmBcY0vq6nBkQVRZ Pj0/SlRbZnjJxNTNyeRUsa09rqp0pr/Gr1rfOj4tHi0fHiopOEtZ9renraymq6ytyc+8Tj0/P0s/ SlBZ80/MzEv/3/JHPk5PTkNL52xl3+DNzNdvzKr4VaHSxaxfr85NZUVFICw3IistND9O6cuvuryp rMC9r91k3PV5QU9mzvE/zs1UXPTnW1JWTUxCR1lEQ1j64mfhyd3T9VutvTmotWaqwbTF5cxAdyku PyQpLzsyOH1bwcbJtLbCxq7HTrzH0+fUycrNZMnvTd/hRjpYUT44OUc9OERp9WHTwcrCvcjZ3K++ Pqm55qzHtsjG0T5vLDA1JCQtNio2Vk3aysG5sbrArsDgsr/Oz7nJY8Tr1WZFYmFHOkhFNTlKPDxU YfJk7MnPy8nHwmZOvbM8xaZbt6q0xNu0TVI5KTIqJiU5Linz7Er5sbbPr7u7tN3Hu8Bx0bVn273q V1XNUUNNO0pCOT5RRDxu9kv6zNLiyMve3m1ZXrNsRqO5yq2srVyzwDlNKy0pJScnOSov3txW2624 vLG4vL272Lu+Y8HE2f7Py13t6k9QSzw+RTs6Qj8+SktK/d7dxMjW28/JXO6wvX+vq6+2uq7HyGgw OSslJCcuKzM9SdLZzL+7usG9yNbJxMnSwrzCvcHFv8nU9/dTPUI8OTw5OTc7Pz5KVGzLysnBwMHJ 0szvYMS5u7i3sq+1t85vRjY2KyYoKiwwPEJKZN7MyMG/v7/Gv8XDvb+8wb6+wsTR12NcS0JEPDs7 PT07QkZEWF5t1NDQzMTO1srN4eHX/OrJv8bDubm+wcXoaFs/OzcxMTMzMzlEQkzf29bBvr+9vcDD v8nRy9zi1dTd5NbfcfRdTlhaS0ZIQT9APz9ITlF839bRycjFws7Ryby8xry2v8O/y95iTT02Ni4v MjE4PUBLX+DZysHIw8HHz8bBzM3NytPg29XM2dvU72lgcFBESUE+PT5APkdMWX3r1NDExMjByM3I ur3Iu7zFy83OdmhLPjsyMTM2OTlHTFHt69bSzcfWzdHXzMvHycfS2M/Ny8/N1+Xpa11XVVBJRkE+ PT5BRUpXaG3az83FxMPJ1dvHvcfFvMLLysnV2OxPSD43NTk5Nz1BRElVam7g3NjVz87OxL/Bw8bL zsrM0c3S3OLnZ1VcWk1BPz09PTxGS05catvTycTIxsrO29vAv8nCv8bMxMnS0P1QRz03Njk2Nz0+ P0hXXu7Q1M3IysrHxMjDydfPz9LRysrT19z5aWJZVktCQ0A9PURMSlFneN7d1s3N0dXcZWTHv8y/ ur/Fv73Fw9BmUz01NDY0Mjo+PUdPWm7g2dPN1M7Gx8jDyM/LzNDFvsHJx9D7fVtRWU9GQT45Oj4/ RU1XWGH19NjT08rK2HTOur29t7m9v8PJzNDzUEE3MzY2Njo9PkBJTVR07t7Ozs/Ly8rHwsbNzMnH xMfKzNLh73tkXlpORT47Ojw+PkZMTl935M7IycbIzdbtz7q9xb+/y9XOzcnI1vhSPTY4OTU3PT0+ Q0dKXuzZyszPzcrKzMjJx8vMyse+vr68v81lSkNCQDw7NzY4Oz9JVmZ56uPW0NfZ1NpdXLusqKWn qLLQczw3LigqJCcuPdPGtrbF3UE8PD1FTm7+2MS6sa2sr7bNYU5GTFvx4e5kVFFQSkI+OTc5P1N3 0MjLzM/LxsjTXUtEPkI+YK2koJ+prtc/PSorIx8mJ0PHsqmuttRKOzIyMTVA87+vqqyuu9B8ZeVq W1BL6cq/uLzUSTYwLzE1OD9NaM7Cvr7L3vTv4N7gY1BQTFFWRlasoaCdrLpfMDsrLCYeKixPuK+t t8haQzk0MDdAW7Ouq629wmjt3F/5R2rKw7S5wPVFPDY3MjAvNT5nxcC9z9nS0L/HxM/l02NhSjs5 NTw51Z+enJ62vEs1MiEgHB85XbOqs7m+ztRHMCgmOm+wpq6xxc/E0udFO0R8wrK1v9lLUE9OPS8u LTpfz8bU3ejOvb7C1vtt8tZ3SDo1OEJezuBMrJmbm6lOPSkqKB4fHi3Ot6mrv76+z2owJSIvyLGm qbu+v8HYRDMyRryztrjV3cvY+z8wLC47S17iaP7Dw8bP6/nw0NtdXVlaWkc8QvfKxea8nJ6ipkY/ LCUtHyQmL8C3rqy/y711Ry0kKTW5rq2ptbe70UsvLjtZxLq+trq8v21HNzQ3Njo/RPLEyMDQ72p8 z/p8W1fj2NtYS0FDWunG5UmonKOfxD5BKTQkHiYn77e9srXGs7tWMCQsMd+zva+xsbHGVDMwPXjH w8bHuLa52Dw3NkdANDY5Wcy/yODu+M3Lyu5T5tvN2FA/OTtIZdXGaMqcnaWrQks8MC8dHyY4uL3K uby5r8VCKik5QcvEybazrrn0SD1IV17a7OC+r7DLTUNOSD4tKDVJwbzQzNTByNjUVVBb9HFaV0Q/ PEr5zLu2vLujo6y5PD05MjMmKjFBxv1azsW7wNhMOUVjWFNWd8S8vsz5zsfCwtjd2tveU1VXT35S VFZJSkZVX1JSWFNv29fN1c3Hxs5XQjw2O0vuwLi4vqifr7lpQ2Q7MigmLjhNXkd/uL3Dyth0XV5H P0jy2s/S1cO/vcHIxcfVb11yak4/RltiXEhDRFXmeU5KZXvX1d7S0snDzPdMREI8SWruyLy/v6Wp wsHlxdU/MScvNTI1Mzruvr/Oybm9yeNkVVdrTkdK6M7MxsK4t7y8wt1bSkE4Ozw9PztEasrO23Lv y8/Ua2f93M7Q+WReW2ZbbP/ayL27xu7Nw/daRFRtTE5HWGRVUU5UU1tWV1516efc2dLR1NPa3epx 79XO2+Pd4OltaWdhZWlbXF9hbl9kV1T76+d0XPTVzM51WlNTYVVRX+fMycjJ097lbF1ZVl5YU1hd YGduft/Sx8nPztDQ2O9cTVBZTk9ZVVZbaXl7X1hdYmp42dnX0tDT3dXa7PtoZGj16PTp6uPf4+1e WE9LTUlLWHPWzcnN3NzZ5unxcPn4fXtoal9YXVtk4+Ln73fr9/l6aujb3dXY4eTt5HhaWFNTTUpN VWj74dvZ19rxaGNiY2Nw/drNz8zNys3Z3WRVT01WWGNzcOr47edzZWRoevX/a19famhfY2Lv5+rZ 1tHY4upxZ11aYWFgb+/azc3S3e/6Z1lZWmR84tzl3N7raFtYT05PWnbu5NzSz9jnbFlTUltm9d7V zc3S2eJ1bWZaXVhYWlpcXnT1eXn57efk4dvW2tre6XllZ2Jjce7e2NjZ5Xp0XU9NTlFabO/o4Nre 5vJjWFlXZvXs3trQ0NPbfmdcXVxbaeja0tPZ3OnzalpYX2JcXF991s7kYFlWWnDteHfr6vVxb/77 8HhhYWPo3NO+zmrPV1BmRGJ0Zel33dHb2+9f82hcZ1RabOvY29Xfbv1dWmFYZPbi6fLf4/H6ZF1n aGljbvTj1tzm4ujvcWtuY3nj4+Hx+f5nY1dWX2vn4uTX29ze/G9fX2tu/nd+6eXk8Hd4WFhfXGFg c+Ha3ODh9XN1927t53nW2unc6/TzbGtjWV5XWf1rcHxocnh5d1302+vY3One2+B/bm1mc/BlYOrp 7Oh0dmtxXVtyXvDd/uPlfvhr/vpr315g9v7j5vfufm7dc1voYvjp9dxm2upvz07f703vUt5sX9ld 5edc8Wr97VbcdFfNZW7bdNZs9c5Y3dtX03Fb32Vt7mT8bV3+/mnhZ2XWY3veWv5taed1Xt99a9x1 2/pv32vg4fpu3l5e3llv4lnw7mzedOfdT8tiS8tSdNZU1/NXzEpewz7Yzj/CX1rNRszsTdjfb+fy 4N7z1l/qYPhsSc71Ss9wXslYWtNLy21LwUxozkboz1Hc31rKVlG/Qs3KO75dRsBCeMg8wGVOv0be yUbp3UnMZUzFYufx6N9t72R5VtdV9PVf1VLNWVnIQ+nBPuTAQsp3acI6yck2um46u0ZVvkXk0ErS 6k/WZnzia2LRWWbKSX6+R0y4P/++PcDsVMc8z9Q6zNg+xGtNzGnuXvfPS87eS8ZT2X55z0HIbk/P UuRrbPBOymhf2HvcSct+VtBS0nRlzkntxkdbvj7N6VPNU95pT9RmT+fhUcpaW8JT639fykjd007Q aVzcVtxZd2th4GH78e3mbOjp3F/d3GPScXT44lTX30HIbELGRP7PSvfneW7eTsNySbtF+Lw5xNRO 1FbffWbdTOlwf+dRYsNlS9hcz15Vy0zW2kzVWtvgU+rWf1bW62J93Wtn1d9ySc/TOMLmOr1ZTcZN 5NZKzlzd1krP0FfXX3Dx7nRBx9ZB0NhM3s1I02f/zkPTykPly0HLYk29QWnAQuTGP9fWVdNOVsJP fNhNwFlP29hQ6cw8zMtF8d3RXtrWT2fGQkzIXEzRdljFe/Lca8RRSbtDU79AX8RAaddO0W5JyFp6 yUfcykvZ2kq+VVnBS835SMZqUMtCYcU8yn5Hv0Vqwj7Q1D6+WFHFTtrJOr/TOLRCTbo5w+o9uFk/ u05PxEbj00vPelHJUv/MTdrsTNBqWddP1OpNx1puw0PgykLIT3PsSsRNWsRRVb1JZcNL1PRazT7F XUPCckng4+dVyFtZyf5iaM1yblbeblzIS1XHXutY7utyaF5b1exZ3O5qz1Vv43LQSs3SPrxYScRW 6mdfzFJX2lBqzUbxz0TKc2jJSsvXU8926HBf5eBg/t9K3N9X01bj81DYVnHRWlrqzVF57V/PWt7e T8/cTdlq49E6zck6xdg8vnLj5j+yTDqzP0K9TV/vXcBFX7tB8MREz95e11PPU1bcWVr+3kze1Fvc 2uLnX8vvScv2RfjcW176425hzlZbxF1R1Fnx5WlwacxhTNLyUM7hRtrEV0zN0kvd31ZtynFL3OBb XM1OW75PXvrP7kXN7UXO6kvQ2PtqdMxVSb9FRr1JU97dzkTJxUPJxUXqzX5NZMtRSsZtP8zrTlzn y0Vvw01vyllv32faXu3VUNXKSMvRR81Y/95FzWRCz2NQ4F3XfVnHaHbMcVrl2mpv8HVg9OdbbM9f XOtvX3b+XH3e71vi6mzQaW7V+vRi79tse9tT/dBKZNvu723tbGbU9k/p1V5id/Xx8vpq489waule 6ORcW1rW9krg8WPydvZ189trXtXl/f//4vF27+dv+/fucmnp6ldp3VRfc11tbOPyftjd89/d4eNy 7/Zy4350f2LebWZhXmRUXV9cYWh0ZevdbHzd2+9w4HH21nhp793tYOzmZ//pX13m1OJOTc20yuy+ w7y9elVJT0cuLzQxOzs+Wsq6vcO3s7e82WpXXFQ+OVn78d3cw7+8zHbp22BDPz9DSEZAVtnR29rK wr3G5OXZ41xIR0FLXkYv/5292qTHpqVZaiU9UBkkIh1LOknFvZ+kraa0s7JMOS0yPis2Q0u4uLCr ram3y+M8PDApKyoyPkN+07yxtLe8u77nW0pBQz9EPz1NVWnaZFKqnLSvqreiwjoyHzAiGyUbLcrb tK+lnaWmuG/NPS0qIyw0PHZ+r6imn6ittdVnLyomJCwpKz1Zwr24sLawuMzPXV5cREpBSGdOT0xN 2tfrUbmeqq+qv626Ni8eIyIcJx8rvrWopqKgpqa+PzMpKysmKDTTtrSpoaanqLHUPi8mKSolKzdJ W8ayuLGsuMLP22hHRz1EZEdEWVliWlFt2M7P6dSooKutvMWzWywhHiEeJiwr3K6noKGjq7PBOSwp ICcvMVDFrKSjoKittF85LCEiKzRJQu7EtarJx85t0kpKNkDdWNff/cvL1Pdlc1dNVVzt2tvZ1qui rrPS58RALCEgIyQ2SVO+rqegpbPYUTotMColNFy+r6uoqKWu2VY5Ki4yMztGzr61vdrMclBGPzo8 UmHhxsC+t8TY0WJHPUA9P1dY7Mm/vbe/Vuuuq8RfP1PLWTosKCk0eWND5bqsqK69Rzo/Pj8vL0jN tbCwsrO1wepKNC8zP+ja+/rNwthjRDpGZHzkbNm/wLzM3flDTUg+Pj1f0cG8zNLIwMjkRS02sKe3 13/Ivr/gLR8fLVTpdNrDsKaltjgrLjg/PT5IyauiprLD2kw6NTEsKjbSrqy1xcvLzVc1Ly9M3ePk ctrEucD8S1JdXWVWTU/Yv7zH+FdLTE5FNi/JoaGnrLjB80cuHBkdJ0TIsKqtpaCoxy4kIiY5Tu7J t6ajqbJ2NSwtNDs8Reu4q6mvxlA+ODUyLzVKzbiztbq/w9NjRTo3PEhUZ+jMwb7B6UY8QUdHSDzg opuep7xhOjItHhodKmyvpaKpsK+3XisfHiE1wa6qqqmorLZnLiUkKz3Tvbu2tK+utd82LC0yP0pJ S+G4srG4zWJJSEg7Nzk+Vc69ury9yV9PST46P1hZTbCbnqWr5TIsMSoeHyc0xaWfqbjE5VI+LCEg Lsaro6Oyv8XK7DcrJypMtamstsLTx7/dOy4rLT5d2t7cw7y0tsxOODY6QU9XddXDuri5v99GOj0/ P0NOZNe+rp+jrq1aLy0lJyEkNEK5p6Wnrb1iPS0oIyg5YLaopamvt+hEODQyNU7QtK60uN9UXUpD Ozg2OVrPx8TG1N7O4VlBPEVY0MnN2OXOyMfR+FRERk9cUVjr+d61p62usEs5LisuKDM3O8myq6uy zlc+NjQrLz1wsqqmrLnJTD47Nzc+T8iyr6/HUz8/7FpVQjI4R9nZ0s3Zyb2610xBOD5O6Ode1ca7 tLnPRzo2NztDSUx+tZ+fpKXjNi4nKiEmLjPEqqWlrMJaPC8tJigzVLCloKWyv14/OC8sMDzzsKqt ucvtOjtUTU9HQjxC3eLczs3Jwb3oRzw6P1jIz9HIzsnEwfo6ODc6Te3c0b6yqaeor1w5LCgtLTQ2 Pdm9r6yvyWFFNTUxNDhQu6+qq7XPS0E7OjxASuW1r7O8x2Y4QGNgXU0+NEfh79PUz9PEv25NPzpC bdDu5tvSwr3DZUtDRFpy3uzkyruvq6u+XTorLS0yNTZIa76xr7fK7Eg/PDUzOFnDsKutt89qRz09 Ozg74ry2rLLMTz9P4cxuPDM2S2nZ3PjJv7m+40IyMz903ubf9Mi3t8JcPTU9ctvuaeS5paSlsT00 KSovKS8tPsezqq645WleQz0xLjRduauprbjcaFNDPDM1Om21r7TF1vJ711tGOTg+R+v7ZnHgxry3 x1s+OT5BUlVP7869trfCf0Y8PkVNUlxww6ejpqXBRTIpKiMoKy5xt6qprLp9X0A2LiotOtSup6is utttSzwwLjRAxK+wt7vRbc7iTjszNDZc4/jf3c7At7/nTT07QVplW1zhxrixutlHODg8TVpX+c23 qqanr/I/LisrKiwsOu64qqqvxepSPjovKy5AyK6oqq+9zO1KPDIuNF++s7C3wl910HdWOjEuOml9 0tzZyru0xvRDODtLemFjaNm/tbLEXz03Oj5QTlTlsqSnoq5hQS0sJicqKDzVsamoq7/QXTovKygs QMWsqKeruMdxRTQuLTBHv6+ztru/ydhTNC8vND9c6X3MwL26u81UTkpCQUtPT+vNxL26v95cRDk3 QE5Y7cyupqShtFs2KSklKCksSMerqKivyttKOzAqKS5NvKqnqK67yXFCMCwrMFW8srWytb3E3kEw LS0wQuXIv7y9vr3D90s/Oj5JWF9n2M3AubrKX0hAPkFITWXtyq6np6i8YTktLScpKS5Nyq6trrXJ 0F1GNS0sMk7Crq2tr7W80k01LSsxTcu9ube1t8RjSUI5Njc8RHjGxb++v8fV7EhAP0FOXXb93Mm/ wdJkTUZGRUZf3cnLya2nqa7OPi4tLyssLjFMxK6ts7rN2N9UOi4uNU/GuLW5uLe6wOE/MDE+VNPD xc3NxbzB7jwvLzlHWWRs0762t8X+RUFNXWFNSE34wLq/zv9SUGRkW1dWQ1Wqp6yu3Fs5QEgnKScs Sc2uuL24urG72TcpKzRIbM/NxLKrq7XKRzQ6QkE+PUdpvq60vMTdcUhANC41PnPRwry/vsXVXkZE QEJIVnnUwb69yuNqU15ycEQ70rKpqrbKRU5dPS8lJSk52sjFx76vrK7EPzIxPExVUE7nvK+ttc1y Z+9sSTozOFLc0c3BvcPL8Uw+Oz8/SmDfzcW/ytPe/1lKRUBKfNDKy87f39LO3Ew6WbeurbjL3ejY TjIoJSs3RV977sSuqK2+az49RUc9NzxXxrWxtLzFysnOVz85NzpJZe/ZzcnIydZfSkNCRVBa9NHK xsnN23JfUkdGSlbrzcnJy87W3GA1Lv2+ta68sr63uFxGJSYnKzgzTUTMrqint7zmd2VKQjAyOVPL wrzAwby5uMXtVERCQUpNRUpNavb842n5bu3d49rq3ePl4u72XF1XT1Nc3dnZzMzN2eJwTj0uQs7B rr68ub+xyMU+LDErODM7Ojnez7S2vMTMvca9y1RGP05PVlNEVePFvL/Dz9bO29pwTklAQD9FSUZP WF7nyb/Ax8jKzs3qXEc/R05nYGjv4cvExtX3ZU48Q+Z7w8jdwc28x8m+TE8/Pko9Sjo8Rkft7eN1 3srFvb7C3PV0aOtpY1Vc+Hvj9Xz079XP0+hwa1VWVlBPS09UZvbq2M/Kzc/U29/oc1xSWFlc/mBe Wlx5cNzq/Oj7fGjf7+nc28zb2NfTytXcfl5aU05OTkhKSE9VT15YYv532drPx8jAxs7P29jf/e9f X1tQVk9UVFR0fe/t8fNvbXJobHRtfWZw79zN0dfe4t3reGxcVVpaZ2NeZmvl3+r/7err6Ofh/u/9 /NjX1Nrc2N/kalhQSkdAQURFTVp53dnMy8nExsLM0dnm1eTkblVWTVRUWF9danHt/292bvlmWldb bXLp4+Pe39XZ3t3l4ubr7GtfXWv8/fNycfb4bl1ZWFlea+fd19POyMbIztz/XFdOTE1ISUdMWFdn Z2zv8djc3dPTzM3Nz9rc4ep7Z11ZW2FycndoXV5bXV5iZWNqb2735efm3tjT0M7V3O55eWVoXFVY WWZyfnBpc3X/fn3z5t7c29rV3Onrend0cmZeY15gZF5kYWJeVltcX2v/6ePZ0s/Nz9DY2dje5n9u XlpeYGpiYV9faVtaVVRaWm587d7b0dfTz9bT3OPvanBtbGZYWFdXWFVZWmzl2c7NzM/U2d7ubmBY XWJmb214/fLt/nVhV1ZVV1hdYWdw/Ove2djU0dDR1NTY2uHn6/prW1hTU1dYWlZYXmZvcnf/9PPx 5eDf3NfT19re5/B0d25jXFRVW2Vsbv/349rZ2+bu8/Lt6ezv7O3s/HFoXF1bXF1dYmNkam50cWdu cP3v6uLj3djSz8/O1N7pemxmYFpVVlteYGNeXV9mcnNzd/bl3dve4+fm5N7d4+rt+XFrb2lmbWZm aW5zaXJ2e+7o4uTj39/k6O55Z2dnYWJhYWBla29+cHd/+vR6ff788e3d08/Q19nc4up9ZFhUVllY WFlXXWlue3R+9vLp6+vq5tza2tvd3uDl7v1xdG9pa2tsbG9pYmVnbW968/Pt6/T7e3F0b293eHd0 /n597e/2fXBzdvb9+PDw7Ofc2dnb4+ns6u11bmViZWZoX15cX2JjbXJ2dnh2eXt78+nn4d/f5ebk 5uXt8X1pbW9zd29qY2NlcH/+8e3z7erp7XZ1+u3m5fD29fDs93txZ2ViZmhrb2txbnBpa3l88PLw 7u3s6+fm6Ovt7e/4+n53enFvbGxyd/v1+ff09ff7/Prw7e/u9nl0dX76/P9tam1tbm52fHb9+/n7 +/j68e3x8u/n5u/5fHRtZmJfYGVrfPjw9PPx8u7x8+7q5ent7Ovo6urt7Oz8enZxa2JfX2RkZWhq cnr8fnv9fvb27uTp6Ont6evs7O3v9nZxbmptbGdnaGpsbWlobXnx6ubh4eLl5+rz/H17/X78+/p9 cHNzeX18/3z79Pjz8vl2cnZ99X52cm5qaXF9++/t8PX7+nhydvzx8vDv6+7t7vf1+X59d3Zva21v fPr8dXB6eXt0e358eG5vefbx9vn6+PDw7Obj5+36dXJvbXj2e2djan/y8fh8/f77+fv3+Pf2/n19 fHr68u3n7Ovs9P59c25vaGdkY2huePnv7Ozw9fb29+7v+f/8/Xx9+v16eXd2d//19/Hq6ezv8vz7 +nZydXhwbGxyc3F6/Pfz7u3o5enuf21paGpqZWt7+PH08/x7+vt3b21ucf3v7e3w9P58/3x99u7s 7ezr6+3z7/v+dWpobHNwdf768PH6/nd8/P76/fHv8/d3en3//fr4/25vb2psdHRwdXz87Orw8Pf7 dm5zd3d79fXs6OLh5uz59fH5c25+fnd1b2Zpe/z4fW9xeHt7dG5tbnF89uzl4uTl5Obs+XJrZWdo aW13/vHx8+vz+nlubXR6/vL9fW9ob3d++fr97+bi5vD39fn/e358bW13+vXy+Hx+/Pj4+/Xv8fp5 ffX8dnVtbnt+eHFzcW5ub37x6+nv8Pj79v73+XNvbnBycHn7+vry7u/v7ezr7Ovs9fp2bm1sbG3+ +3707/Dt8Pf3e29rbG9tc3l/+Pf5e3Jsb3z4/nj87+/v8f15cnZ3e/j8+fj28e/r7vD3+P1+cWtp b/3z5Obr7e/xdGxqam91/v379/H0+318dG5zbG1sbHN7+O7r6OTk6vX4e3R0b3Nyefr19/P29/X5 +3ZzcnFwc3n9+Pr68evq7Ozx/nZ4b294bmlxdnX58e/xffjv7/P/d21pam94/vl/ffv59O/u8PP0 9Pn3+395dXlzcG90fHj68vDu9vf0+Pv5/Xv/fX74dm1zeXp6+3z77+3r7Oru7/t0cnJ0dnr7+fh5 dm5sbnB++vl6c3F0fvvx9f31+fXv9fD3/ff+/nx/+/rv7u7y8u7t9XtvaWhmY2Zwb3b4+vf4fv/1 7/H3ff3z7vDz93z9/nr79/Hu9fj6fnBtaGdpbHd8fff07e/v8X13dnN3+PH08O7z7u/283h3bGZv fPj48OzzfPn29fR/eHh6cG5rbHB69fH0/PHu7vb9/3x+evTu7/Dy9f59dXh1d3h6fnZtbnv3+v18 fP55/vZ9eXZ5/P337u7v+/7+9u7x/XV2e3z9+3xvc3FveH/9+/58eHf36+rp7/n69fHy+v38/v58 em9ydHFxdndvb21z++zt7+/q6vL6b253fPh+fX59+e/z9PH0e3N7/nlyc3N/9fjv7u3o6efp+Pl4 bW1qc3RsaWRfY2lwevv69Onr8PH1+Pb16+vv7+/v9O7u7vD8cWp0dm5uamx1bnF8/vn2+e3p7fL9 ffz49/l9e316cnF3fvx9dXF9/fny8/T18/H49/P093RramhnbHZ0fX96cXjt6eTi6Ozv8u/w9Pn1 +Hhyb3h+/X50dHz/eXRvd317/3x3f3x3enRta252fvju6u7y7u/3+PHu8vTydnP09fX18fF7b2tt eXx7bWxwa21tbnTx5efn5uvq6/1xamJjbPzu7Onn6enp5+jzcF9WUVFWXWh87eDZ0s/O1/9v/njn 6evtZGtjavFzbWNYWFZd8Oje3Ofoe/zj5t7xZmJaX3Du29/k6X/49O3vaF1XVV5p697j6v567ufg 5O3zam3/6+Dg4/ZtaWppb21oZGJvevPr6+9vZ2Vlbfr1fnj77OPb2N3m+W9rcP19d2xra2307fP9 bmlgXmV16+Dd3Nzb3urzbGRdWFhSUE5W3Me9ur7I9U9JQ0NBQUhO/Mq/u77L8E1DQEFMXerSzMXE yczfZ1VOUVZh8evf4+77YFtXUlJUYevZ0dTb3uPc1dnk+mpbWF5tfHR59fzq6fr7ZV5eWVRNTmXb x7/CydtqWVBNTFBf8djPz9jvdmxgW1VTVlx+3Nba5PH57uHwZmFt59nc3PNj9evh5PJ1WmNiXG1s ZVVLUt7Dvr/Lc09MVlhVW09OY9zOz8/L2PRoVE5NXPfj0dDgc1xWVVliXFtlbvPd1d3u397q6+nd 3vDo/HTo3dddPDlsubKts/U7MjY8QUtIQ13Gt7K500c2NTxGXNnCvLm2vM9YQEBIXeff52xjd+zq ak9IRkxe89rX19LSzc7V3332cXTucF9bTjhRraytrN02LS46Oj1KP0nLuLO73lI+OklWVXrXwbex scJiPztKbNvhWEtJX8/G0FtDPkRaeF1NTWnNvbvA2W/t3NfnWkU/QUjLqKSqsGc1LSw1Mi82PvO3 rq69W0U+Oz8/PUjcubCtrLrtTUpUZ3VMPDxI7snBy3FPUml0WkM3N0rHtrO621/ozcjkRjk5RERi qJ2ip7g8LCYrKyMrNku1qKWt7Eg+Njs6MzhWtqmoq889Q13HuL75OjhGX9znVkZN1sbWTDgzO27A vsfS3trAucBiPjo3Q+nO11bLoJugqkgkHx8sLioyNtipoqKxPy0pLDpAWNnAq6WntE00MV+ys8FI ODxTx81YPT9b3ddPOzM848G/11pb7r62vvk/O0Bh0s/d29DKp5uks0UnKSYvLyQoLtuno6a3Oi0x O0g8PlXJqKGltD8tM9+0ts9BP2rBv+U/ND1zx9JFMi8868S/1ldqxba3xVo9O0he4srKzMjD4cmj o7TLNS0pKC8mJi9Qraapr1YwN0VSPjdFfK+goq1uNi05zsbWT1/GtbPPPS0zSNTTTDw0P/7Kxd7t 2cvCzM/nW+zW1lZBTW7Mvsx4P0Wqn6mvPyssLUQuJSgp36Whpr8+OUHzUzEvOcypoqTDNi463by8 2lzbvLnKTTIvOEzt/1NDRmTb2ORcYd7Fvb7A0WdQT0xESE1fz8rM1EnWo6Orr0k6Ly01IB8mLL+o pKa71OBd/zkpKSxat62puMq+vbu/0EYzPvDO1WtDQVTT0lg+MDM9Vs3Fvr/BvcXR90xLTXjW7/tW R0dJW23e1b+joq2t70U3KzgpJS4tR87Hs8LKuMbA0kU9NUR5c87V8NbGt7a/w8fNxsh9PjIvMDxc +Onw4e7q2OVZTll23M/GztzKz+lgSUM/RFzuysHJ2li9p7C2u0VKTmH+MS0rJzpdWl1GdbiuqbPu RkNXXE0+Mjnluq+vus/PtrfJVDg2PU5PPTo+R+fLytL63OdwXE1a/NrIw8PSXWxeUFxfcUxKS0mo nKuqu0/WP0EnGSEmNM/Yy8WyoqexZy8sMElFO0nuvauptcvTyNhPREdGXtHU8uTbXE9COTU5SFP6 y8vPwbu7wtZfU11fWUc9QkzyzOne2E6smai2vD57OzAoGSo5OslR2Laupbl0TzZCPzc3MVe6uLCy uLS0ufBBRjRDwfxoe9PEWEw1LUJMSUxI5svCv82+wtXW/N9iQkI6P/bq2c3HvM7KoKDNxVBD2zE0 JSBSNjxiOMO4uK3Z3Ns8TDs3X07Ivd+5trWvv8rwS3NvVkU+UXZvUkRHRlFqS0dFUePj19/ZwsTC wc7nVFpYRUxMaM7Iub2+xl3Nwf9eREtxSGXaU0Y/RktCSk1BRVvb1dDGwL2+wMhuT0pETF3oyr+6 vcbK2W5LPjw8RVP04mdbZuznYFFQVeXHydlxX+/q9Oh18tTT2vdjdn9w/tzd6ePt3+Lty8DEzNf3 VUhBPDU1Oz5JYerW2s/O2tDO3ObdzszX1dzTyc3S2NXT7/VkR0RESEc/S0xN8/nvZFf29tPK2dTO zMnNz+1y4ufk2c3O2s7OcWfp6W1gaE0+Pj89Oj5GR1H94tfb2c7PxcPJytnf1tnV4t3P1cbFz8/o aEw+Pz0+RERFRlhw+OLl7OTPyM3P1uPi4NXa8+p1fNPIytLNxcrRzdB1TkY/Ozg4OTo9Rk5UdOHR ztPOz87LysTIzc/T0Nnb0M7Oz8/Y6ub4WEg+Ozk4Ojk8RlX50si/vr6+x8zX4dvg4Xhk9X/u0dLa 18nBz9nN3mVPRTw1ODs6PkZLT1/14NXPzs7KzdfRxsTKy8vP08/Q3+fe5eXe7GdTST86Ojs7PkVM WenZ08rDwcnP0dXQz9bb3uH2cNvLzNDLxcnNzdxpVUo+NzU0Njo+REpdeunWzMrKys3V0MvIx8PC x8zS09nZ3PL6cWVXTU1HQT87OzxBS05b9dnKxsPCyMnM0tPd4+Dn6t/PztTQycfO0M7nbGtWRz05 MzE2Ojw/SE9q08jHxL7CxsnQ1s/GwMG+vsXJ0N36VUxHQkNBQEJDRkM/QUVMV23g0cfAvr7CytDa 7ev3WFzEuL28vLm4wsxPRj8yLyorLjI4N0Zt1c3Kvry4ub/AxMrgeFxe29nZyry5v8PI2fROPzs6 NTA0OkBKTlZt0s7QzMvMzcrIyM/h5O1/ZVVP7LzPzLKztcW+xlxcNjczLSoqODE4SWXUzLvCurm9 vMPC8ebZUVra0fbKusbDvs7e3V0/Pz0xMTgyNUROTfLKxr+5vMK9xM/N3V9SXVtSV1fIwey5r7a+ vrb+VEU2MisrKS8wMEls4NO2srq3t7jDyNBoeEtCc95W7Lu/1MC+1vJyT0NFOTU9OjRAWktYz8nM wLq+vsLP1N5ZTllNSVFbU8S93bSttr61s1pLRTYsKispLi81Snjjz7W0u7Swt8fJy29bSlHbX1vP vcvTvcTcfnpTRD42OTo2N0dOS3jSzcu/vL2+xMrJ0mdXTkRJWU9JxLd8vqqvxsGz6zxFOi0rKyot MTQ/1s7Xuq+zubSyvcfJ4FtIPUr0VljIvcvNvsLdeWBGQjs0Njk3OUlfXuLEwL28u7y/xtPW8lBH REZNUEdJv7Lbw6iuv8O9yUM+NCsvKyUrNj0+Y7+7urOwr7C3wdPRdD49RUpKXdDRxby/v8LO+F9N PDU4NDA5PkBN5s3Hu7m7uLi+y8/ZVUdKRkRHTWH65+K/r7rGuLu/5E1LOjs0LDE1Ojk7U9nJxb67 uLW9yMrH4lNZT01QVPDez8rMxsjN52NZTkM6PTw8QkRS/tXJxsTAvMLFydfXaExNTk1IUmRn39vY 1tTM3GhZUV3ubVvv3dHM2uT03uFVSkpJS0ZBSFhtbPHWy8jCxMbIzt7bxd9Wa/53V1RQTFtiTEtU VFJPTFPq2+3m2MnL59zS29Lc59rTzuFp5txkUF1pSD7ku993x8C+2mhSRk9BMzQ8RUdHYc2+ur7D vrrF7FpaUkpMQ0JI57zDx7+5tsRyRURIOjIzOkZYX3bNvLzL1szL3WRYWm35Z1JX2dXo6NrT4uHw QEWurnrP1La0RD0tMkMpKy43z8zEubCor7/NeVdCOTU2PnTVy8C+tK+0utJpTD04Li40PUtOfs2/ u77FyMnQ+2ljYmJjaV9ob3l2aFtXVWjuZ/TeQEKqobTWUa2uSzUgLDgqODJJyLynrbrC5tk9LC0x O0rYv7euqaqxw1tLTj4zMkHq3Nr34cz2YkxHUElfalNm58bC0dPd1dxYWU9a9WBkYm7fed/gaEY2 vqCqxkLNqbtDJygsK0VaYFh1rqeu0To2Ozo4NzpMx6+qrrjDv8hJNjc7QFTKtLnI083VRzQyPklQ X/vNzcjDv8dbTFZUSD1CXHHUxb/Ay9fb/UY7Pj45Xquho67Csb0/KR8fIic4yLmyrqumr28vKCgt Mz3YvK+pp6ey40EyLjE7RExN562gp8U8Nk5KNi8uP3zGtLvdXv7Ew1U7OERg9eDUxsLDzfFWREBJ U0hLtJ+gp7zhwGguJB0eJiv1r66pr6+qwTwrIicyPdC3sq2sra29STgtKztizs5uz66kqMczKzI3 NzQyQGXArrC50Vts3Gg/NDVF8szAu73B0uDeXkE3OD7Jp6Gkrc/e3zssIRsgKDe7r6qnr6uu2D4m HicvTLqxrKuur7DFRi4mKz3xw7/PybSpqME5KSo1OTc4RNi8sK2wwF1BRExEODdDbMq8t7a8z1tJ SERCOi9Hq52dp9Nh4T8wJRweISzJrKSkr66qsuYsHh4nONW3r6ytrquuyDomIi1P1df4yK6orLxO NS0rLjtMWn/Ot66wvltBPj5ARE1cbejGubW6z1ZDQEFFST492amen6vOb+tBLiMcHyQu3q+koqqu r7jeLyAeJzRbwLasqKqprLpWLCInM0hYSVS4op6lzC8pKzA1NTpJ6bytqq7HQjtLcG1CNz1twre6 x+BeV1lWT0k/P2q5q6iruMbcVEEyKCMhJzjWsamnqa20xFozJyQoMUjhv7OrqKmvve0/NjQzOD1E 5bmtq7XhQjk3ODY3Plbcxru4ucToWU5NS0ZHUurLwL7F0elYTUdCPz9NxK6nqLC9x/FBMCkkJCcu QtK1qqeqscL4RzkzNDc8RE/dvrSvsbnJ6fHZ3F5DOTxRzr/B2U5CQD9IT1ptYWPjzcG+yd5xWk9K RlHiysPL3vtre3xfTURBRmnBsaursr7eTkA6Mi4tLTA6TNa8tLK0u8r2WFdcXVZLSElLXOLMwr/A xMfIytFxSkdPeOtVQz5AR0lNWt/LxsTKzc7V5GdTTUQ/RFrQw8XS39vQ2WlTTk5PVH7LvLaztbrI Y0M8Ojg2MzI3PUlkz765ur7GysvVclNSXV9TS0xh1sjFycvM0dna1MzO6VVDOzg2OD5JXN7Kw7++ vr7E0H1RQz9BSVZi79fPzMvMz9v3XlZSUl3qxreytL7mTkI+PDcyMDM5Q1nTvbSyt73J3W5ZUE1M SUhHTmzRwb7Cy8/Nx8rZcFped2ZKOzY4PUhY7M3Cv8TNz87P41hKRENGTm/Pwr/CzN9pWVlaUUlE Tdu6rquuuddMPDk2Mi4tLjI+eb6yrq+1v83c8mhTRDw5Oj9P28O+vb/Cw8PFyM3jTz05PUtcVUU9 QVnRwL7Dzd9mVl5/9F9KQ0hf2cnFx8nO2+xvXVZMS05RW9e6ramuwFpEQ0I6MCsqLTZI2Luxr7O5 vb2/0Fc8NTQ4P05918zFv7q2t77bTUNITEc/PUNc39PU2NrX1dbX6l5NTFvt2uJqWWN86uX1aVpb ZP7c2uP/aW99ZFFuvq2qs89RXuR1Qi8qKCwzR8y7ub67sq2zz0U4ODg4OD5P8sy+sq2tuM3tYk5A Ozk7Qkpq0cfM297a0NlpTEtbbOnj4uvz7u3d7ltKRk1e59nU2+7p2NDebEk4PsaqqbXJ1sK9zFI2 KSEjLkp3YnXHr6mqscZPOTlAST42OEvMt66utMDLx8fUTzoyMTlFX1tMS2fIvbvD2ltV5tDO/1NN VvHr33NTS05s3tTc+mdt5NfcfltUXF5V5se8u766wb/J3F45Ni0yNDlEPVJaxb69vMi/ycHL5VxH TEpUXmR5+s/Fvr7H2F1XTUZCPz8/Sl/lz8jIz9HOzcvO22hTVFx5+mpYU1hq/m9gWF3t0MvN1N/q 5O34XFFMS1Nbee/d2dfSzcrW32RcUU1QTldQXGnm0c7O2drm6fP49W/+/vr7bWRZVlNQVVdeX33a zMbHys3U3nBbUE1NTlRi79rPy8nM1P9YTEhJSk9e993U0M3Kzdv7Z2VcVE5PWG3r3NXQ0tXe7mxW TUxRW2BcYW/q29rZ29jU09HS09rrd2ZbVFBPT1FSU1do7N3W1dHP1N/1dW1mXlhbZHD57uLc3uf7 +O14YVxcY2z++uzf4ePw8err73xxbf3t3tvb5XVtZWJbWVZZX2t2++zq729uc/jp6+Pm4+Hg3t/f 7XNnZmZjXVtaYvLf3OXo6OTk5e1tYl9fZHBycnB57+zm5eXp8nlucn/9cGZlY2JfYWj55d7e29jZ 19fY3vZoV1BOUVhYXWN+5dzZ3uT4+fzt5/B1Z2xw6eTi8nR2b/Pw731qZWh3/f9tZ3X47unj3uLp 7uvo+2ZYW2Fpd3f+e/Dp5+Dp7fxtYl9jZWVkbvzt597X09LY3Nve7WtaU1FTVFhYXGV87uni4ODm 6ejf3uXs93p2/352Y19r9efv/nV77efwfG9nX19qefZ4cHn35d7i7fZ0bmxrcXX++evn5eHp9fnw 7X5ramxqY2Jja/z3+PLr5OTo6uzs7vlxb29sY2Nrcv7z8X52fv3x7vD39u7v7/f6emxzePn9c3J6 +/D6e/Pu6uv2/Xt0b3j++PP9fHp5d3Nuamtt/fj7/m9qaG366+zv8PTv7/Pv93Nte+7m4+Lk5/D5 eGhhY2dqbXF2bnz16uXn5ODf6/1wbWdeX15fZG707+7p6Ojs8/337uz0/n/98PTu8vn/b21oampp aGptcv7v6+nn5unr7u3q7/F+dGtkY217e3pyb33t5eTs8vl/e3p1amZgZm5+7efo7e/z7uvo7XNo bmdz7+vh5vBqYl5bYmf+7+Hj7fr26OTf6uj9a2ltbnJ4bnNuenv78Ovz/PT8e2pmZ23+8vTu8Xr9 9PD89u/m39/i9nFpbW9ubmhmZmdnbXfv6OTl5env+P/2+vd9efz58Pl6ffz8cW1w/3Zw//3z/nx9 fHVrZWVvfPHr7PHw8u3q6e52d25vbGx0dvnp6+no7Pt0cnVvZVxz4uDc6vZqYWFiem/w9+rm6eD5 63t7b2ZpZHj24+Xm7np7bXJrZGhw9+zo8ft++/Pu6u3v+29qaXf/fvv8fX767ujr7n54eW5ta256 +eXp93p+9/X3bl5ZWV1r9+rf3eDe2t/g6PT9amJcWVpcYXDu5drZ3eHl72tmX2FoaW96+erl6uns 7Pd5/f3z8v56amJfY21rbfLm3dfb4uxxYVlcXmVqd/ju5+3o7d/g5e1xbGJw/fPs7vH5enzu9vfv 7vtqZmVnZV5cYH3r497f5evr6/Du8X59e/79dnr8b21mZmx1cm/+7uzr7352b3B2e/ju7eTh3uP2 +3ZocGZeXWRrbPvr6ujn8nd6en17e/nl3dnZ6Hz6b2hlZmxcZW1idHT3//Xtam1yeere3Nzs8/5h ee7o7Hnx/mpxefh7aG9nZvD9evh363htffTj+Ori4uvw/vXs7PRfYFpVY2z68+7s7PV++mtqdvDo 4+Df3Oj47X9rZltaXWfn4efi/W1lYWheavXk5/bv4ff25fXv9uz8Zf3x/nh/+mZZaf7v5+zjenfy aWxy7ON3bnb76vbl2unp9m9zYGJkeOt7d2peY2rv6OjW2d7e929gZXdhVlNTVVv52NLO2Of3Y2/x cXN15tzcz9Pf8mxsc3p7d/J1YmpfWFVRUU9VbPvu6d/d29XU2uXzaFhWXmv03dra3+rvfeze3uhl UEtKVG7m3Nzmc19RS1XewravrrXGZj84Njk+SU9XVVRbbePc3e9aTEhNXubOyczacWJq6c3Dv8XV dldOTFJncvz3eWlGPc6tp6Kmr90tIyMjKjpdzcrJv8LBusRqPSwoKjLusqqnrsP2S1Pgyru+3U47 OEBP2cnO21dDQkJMXGR38uTPx8PEzmpNPi0vuJ+alZqoZB4ZGRghLDXr772prKanyEEkGh0jPquf m5yquOREWUtFPS8/1r2ussdTLy87RNztPzYtMle+rKmxv2FEUGvY1k87LB8kuZePjJSsMBMPFBgn PD+/t6qanJ+sLRwVEh89r5qanKC65EM4PCwoKyz/ppyapMo5JSYvO008LSwvULWqqbLdRz9L3dDZ Yz0zNEBH8Z2RlZiqTzMbGyAaICcutKefmq9TMBodIib7u62eoqGkvPwuIy0vS7Szqqesrc0/Oi0s LSoyNTRP/M65v8XPYdfT0L/ZbWVX1NDdVis2o5iXmrBNJRcdIiIzNk2vr6eqSz8tIS8vP7u7qaCn pbZCMSIhLliupaWqvMO8zFkxJiYqOPPM0Uk4QWy/ucjXVkNf0Lu3w8jP4FEwKCAtn5CPk7Q0JBki LCYvJi6zrqeqPTovJkI9QL/Vrp+mpsYtKiEszLKhoK2+RUrSSzouKjpM2MlDMy4xc7yyuXpk18m2 tcF1PENt92c4KSElp42MkK4qKSAmMR0bHSGynJ2gRSk4M1tpLDc+zJ6eorcrJys8sautse919P67 zD8yLl24zkMpISpFuaivxV5OxrnBfjo5TtvC10MxKSkp3ZKLjp4+Mj8mJBoRGiPPmZylvipIzj01 HBo3uZmRnrQzIzM/7cZHeretpa7M4DozOTdKPiwuMEDDvbi6Z1RPZ7/VX+TYu7fOWTgvLy02OfeW io2bPyIwIhsYEBs+rpSZrs4oL8g4Kx4abaCYlalQNik9Xjs/PdCinqS9MDZTYFs3MD0+Q0o/T3Pg xtJqY1nSvs97WFjLw39MQD5JPzc3rY6MmMghKz8jHRgXNr+nnLdPQi7FuiwjHSyjnZ+oSkPXXs5U LTntr5+nyDgnPrO4aDArVs1DMCg0ybm6yktXy764yF5QXtnVTTk8QUvebkCpkJGeRSE6TyMdGB3V squpa0jkTrzHJh8jPqOeq7be6bTDQDAnM7ipp61aQcq+vlwtNFFNPiwoPcm7uuBJYdi/utZPVGrO xOtCPkNJTz8uP5uMkKc1Ls1GHRcWJM++uLnRvbS6ujocGyXno6SztK+srF4oJixara25x1a4o6xe KSM52EAuKC7TucTfWF7IxcrOfGbPwMr+PDVBTVFWNjWhjo+eRSzGyyAVEhtMwr60v76wu8dDHxsk QK+lraukp61lJCIuTLm2vbG1uqmpyy4gJk5cLiksWbO673dZX9b308TQ183Yy8xMREQ3Njgxr5CQ nb8+t6kqExAWMct+zb67q629aSkdIDPVsbCwpaGrvzgpNlXfxczHubqyrso6MztPSiwmLkHw11de zs/Lwr+/wt9g+2/z9E9GQzc3Nkmdj5WmzNCr0xkPEx9V2kZZwK6orcw7KCEpR8u7uLClpbHqOjla 2+zl4sq5t73K6mR4STcuLC4yOkRn0sbBv729xvBpWll45M/aWks/OT88RKSSlKHG+7bMHxIUIE3b QT7UtK6zzUkxKS5cvrzNybCprdI+QPrCv87t+FNvua61bzs9Wz8pIic/zcru68e8vtTg5ndm7s7G z1FIT0k8ODc/rZWQmbY+Tc07HhgbKl3ZTj9EXMO0uNw1KTTBrbXsQ/W3s7vP5cq6t77gT1F22Nhr SD8+PjcxNEPs3WBQZ83BxtHSz8fBv7/iQjw9QUtLVcy6tK+tr75PNTQ+TlZtzb7FYjoxOUJEPjtF 8dDX1MW6u9xJQ0lR7Ma+x93TvLS4xuV36fVPOi81WMXIXz08TGZRQz5DXs68ucLZ39nrXE9d1sLA xtXJur/3Sk/LvcrSysbePS4uOT43MThGTUdF4baxvdLd3Nnd28zP7eDIvsDO2sS5u90+NT1e2eNM Ozc7QEZEQUr2yL/D2e/Uyc73WlrqzsjEz2hQ/sXDztTCtrbH3eFfQTYxMjU3OD1CQkFL5cW/x9nf z83Q1NbQycfEwcjPxbm3xlVEWt59Sz07OjY1OTw9Q1XTw8rb28i8v9F3/9DExM3mZ2BZTk3St7nF z8zE20pR6W8/MzdES0dCP0ZKR1Lo19DOzc/d+tzIwMrf2c3KyMzPzc3OztTgXkpDPjw7Oj1IUl1l ZWx48dzX2dzg3tTMx8jR5H1v7dXL13PbydH0btvL2uTS1uhJOj0/PTw8Oj1I+MvQ8n7axcHK3eDZ 2eT25tjPxr68v83W2vhURkBAQkZJS0tLS05XW2T33c7Q2dDLyszW3ePq5OHt7ebla0tQ1c/l3szA x9XQ2vpsSz07PT9CPz8+Q2fPy83c2szM1vhcXubSy8O/vL3I5W3l2WxNS01MTVVkW0tJSElSWVVf cN7LzdHY18zP4OtzauXed2hpYltISsu6xMS+vLjN19pLSz4wMTA4R0lkz8zFyd7ddE9XXGtoWO3T v7rBwsPH11haYW3sb2x5ZF9USEhCQERCVevd08/Iv7/L/F5tcmJNSFF22Nz9a2bn8UVerq68tcW7 ulxOLi45KzgyNOfTur7BvvnhUz9DPkhd2sS/vLe7xMDO/XJNV0dH6V/e1OveWk9HQkRAU+nn6d/I x8vN6/9jVVdTU15uferZ1Orn6VdbXlBNRcupsbm3zLTHVUkuPjUwPS9I98zG2sP3WVU+P0NPYdTF v7q3tb/Re1lqS0pNSVjry77AxtFcTUA9Q0FOaPnu7MvLz87U1n1RR0FNWvHZdnzj7+ddTUxO6d7u 6bGjr7G6zsJGOCwqNy89R0jNw7/Lz9VJPj07SGzpz7+5ur3A0eRiU0tY1uHTzMfLzsn7akU8PTxE PVri3svezdHb51ZqWlJYUVhu4+3o2djf4ezq6FdOYuPdaMKnsLi5Yr1QNzQqPzI8UT3Mw73M99ZN RDw2Pld13cW9ube6w87U+FRaYFFZz73JzehW41U9OD1ER1pe4cjJ4ubZ7/lrVFDi13Xh3+v3/X9u 3t12X0xKWn7t52varq67vd2+zVo/LDw7P0Q9Y+i/3Fl8U2FCPj5I3uLKxcK5vcDL3NZpYnRmz9Hg y8PMXkhHREE8OURYbevaztbP1W3n3fD9+ePf0NR2b11dXlxaUF1aTlp+3dLeYsWwsrjNyMTQ5Tk4 OjxBOz8//tHe7GbxXWZIRFpm1N7MxcO5v8TL2tPi7Pt04OlmT2FrSUhBTFNOUE/y9tjU3+LgytvX 1O/g9PFYVVVKWlpTX3Lq5+Hf5NrZ7FBPwLi4wd2/xcZwPkU7SEE+Pj16c9LgY2lUdlJbVVbW1svQ 1MbFwcfZ2NrY519hVVhZTktKVGjneXrp5+duaV5n/N/W3dzhz8/d8l5cUVRPTU9QYnTe293e7d3m 6FZD4sLByNrBv8HE7W5LTlBFPzc+RVR/8ttYYX7g3VxrXPvZ19PZyMTAxM7cevdiWk9ITExRW2Zz Xmfs4uDx6uzc0c7M1Nfg2tl4a1FOUE1WTUxRXur6d3pv9O92Yllt4NTV3OJ02sS/x9THyM7V53ZY VE1LQTw8PEhMae5r5d7Lzc3L1t7s6PP4b2119+bu+2134uDvaGdtZWdmXl5jcuvo+vLd08/PzM7Y 3XtcTExMTFBQW2Fs+/Pl5OXl9m1ofuz47OLf3N/j7P7z/nNiUU1d7d3j2tXa0NTP2N7W395uWE9P VlZfXV9bXF9cYlxfZWr+bGtmZe7g2tvY1NrW1dTT4Ofr9P5qZFxfbnz6c2tna3hta2Nq9/Df293c 29Lc7nlfVk9UVU9RW2jx6/Vwa3plampn9vDo4d7d3NXQ0dPa5PDp5vf9eH79/nNiY1xXWWFrZGl7 7d7b5Ozm4+j1a2JfXGRnb3Rpc2VfXl1lY2Zq/vX86d3W19XT1NLX2OLt7v7zaWZ2+HVfYGJiZFxa ZWhpZWxyd+7v8Pjy7/Z7cHr07u37+f5t+XTz4+nq9ufe3+/+fnjxaWNqaf9/dnd+fvHyfPp0+npo bmVx+vn07fp8bXzu8/Tl5ODd3OHuemxjZ19aYlheXmxsXnBk4+Tu1e7U297dct777nd+63Prbu3y //RkfmdtYmNcbnTt/HPpeu13c/H77+/x9vX28XF7aGZ7Yvhs8uPk2/vp/HR/XWtfaO/z5OPp2uLh emJmXWliaWdr8WDtZe736OXj53fjfPF2/Xz66/7qfPz0aPxo7O306nju+mvyXnZoffly4mH1bHj6 b+9l6GDZaWviW+l+6fjt4WvebeVp9Pdg3Fjg/vne8ezrdW9vbHz1XO1mdXn+YeToZ9dY3/pj1Fzb e/JudG5e207XVeF8aOda6GHk+/16bdpt3Otg3v9w3FfcY/jtX9pk3t1v2Wfnc2vzX3P2d/ZbaVx2 aG7hX9Jo3dhczlXe7V/tXfRb53Nw2W3eeOR1/WnfW+JxYd5i3WT39/Rv8PtseXX1bPvuYO596Gbi cWXaZ9n98/F5d1/qXfB+V9FQ3fZX0Ff2403c/1nTZ+/OVc/9ZMpP0f5azk/d50vTbUvLVP/dUdty ZfvnU9xoVs9a79Vb4d5q6ut67mTqX/5wXONn+uPv6Nr+2nP042te4U/+21Ht30/f3FHPWVrOU9vt U8xiWcdUTMFN885U3HFy5XR3enxdaPPnY+jnaOj/6HF66Glq3uVQ3Wld3GZm+95q2/xay21p01l8 1lN45k/V2krX1k3Y6Ej24Vht8VDd21Lk3F/Q1WDj4d5obt9N8NNQZc9wZHzZfE/IWlXMWO7eWd/m XOB3XX3oXu77U+T0Ws1XV8hXbshJ3tBT0vNP231e3P79el/i+m7q71rh6F/lbWDWcW3fXdtaWdti 79ll5/df2GRj5Vzl+Fro32Df0Whw/e/7YGr4Wm5w42Zi21tp2W9n6Orl837m8+ZqedhY79hl4Hx2 52To4XX9c3pubOtjXXH4ZvJ55V7k2lXa7mbqZO7qYHF7Xvjnd23t7/bqfN9p6Nlf7/Vr32Zn5WZj d3xgdO7gfnTe9lz05Whs6+/1ddruXu3da17993Rn5W9V7OVq7+x7d/7i6l7y7F5u3G9i8ujl9+h5 c/np5m59715r7mP5f2796/3c7GHma2FuYmlodvZy/+rqcuHdcu386ODt4+1hfvRle3hdZ3/7+fzi 6vfd6Gf59V9qZlt8bt/4ZuV9/uX9//7h9e/q63pv9mb9dml3amv+9/32bO3v/fJqfer0/Hpr73zq 52p7+vv29/x3fW/2dnH9Xnd57+X76ffk8PT2aPrp63hl/P5s4WFXfWht9HDy4d3m++N5/XVw+ezp affz6en+b2x7aWxna2F59fvtb2z5/3nu9Xx68OPscu385/H263bj9vjk/Wfsbmp5W2Vsa3N2eG/+ 7vHs7/L06+X1fmn8fW98dnN+73r5afx6++h883l3eO38e3pp+nX2cPn68+Z46PH19m3t8XDofHZ9 9/tu+n7+/HR7cX/8cfH5e+5weXpt/+319/l5eWdsbPt7b+/36+/y7fTv9O3u5/zt5vfx/P5vaW5v cXF1bHJqeXX/83fzf/z/d/V5cnZv/u/y6u7u8/v+c3txZm1qcP705+zf4uvsdv/0+X1wc3dubmtt c296fvHn5+fu7e33/3VmanBubHb2+/jt7Orv+fhxcHp/enB2bnb9d330/vh+ee/s9/v4/P528Ppx 8/7z8/Lq+Hp/fHR3/Ptxb3Z7d3v4dHZ9d/zw9f54cm15+O7u6uju+frxev/9fHx4dnZraGppfv72 7eju8fH37fP1d3F2ef17fn77enV6bXv99Pd+/nX+/Hp2/O/16efr9fb+dHFz8fx+9e3+fG1qaWht a3vv8/Ln6O7r7fr6/Pz7ePXz+Pd9eWxsaWZna2Vjbml0+O7s7+rr8O/p9+vl5uHt+e3e3u9yXV1j Y19fZmt8e/l0dvl0+Hxu9fnq2NDOzM3Q3exzWlZOSklMTFNdX+zd3NvZ2d/n8XJmbW52e3Fv9ebu 5Onr4un/+HtxbHX5b3lrbvh7dnBxde/v79/Wz9fjad/Axc7Xev3n/Ek6PDs9RT4+SvrTx8DFycPD 0OF2VFVeXltr2NTKwsfHyM75WkxBQ0NERVFbX+fg4NvR2untfW9ub2Bo/O/l7vx4+erybvNqcdPm RPqvu7u61sPHvkUuNywwODUwPs7CubK3wrm84ko/OThFSElXxru1sLi7wL7UVkk5OTo8Oj5MXebT zdjQzt9/bu188PNm6tzS2ufr8+DuX15ufNzd72ps+FtITsbMyLzSxMzE2URMNzg6Ojk4SFbOvrvE xL/GzONfS05YYFlcZvbOzMfPycbQzuluW1RUSklHRUhSVmd67uLpztXY3uzV3tfibW9rdvt2al1d eu52ZF/959/ldGh0493e6+bZ0M3OzNDO0dzvXFFIQj88PDw+Q01YcdrNy8vJysrJzNPU0NHR0dDT 1tjkfGVUTEhDRklJSUtSVl1qfOHY1dTU0c/OzM/X3eX/bGJVUlNcX2L23M/QzczKzNfZ7WpaUVJP TEpISU5UY2FeaXvy+3diaG7x7PHh28vHxcXJwsLEyNn0aFtWSkZGQkRFSEpLVmJ44+Xp3trb2djZ 19vh5Ozq7PLv6upuXVpmb2/zycDKwsnTzej0TURFPkNDPEJKWuXWz9zX0drd6WlUXm5mZHP528fO 0szHwMPG1Orfd1ZLRURHSURCSVFWam742dbW193Y19jgZmx47OtveXfm2tbf7NnuWdS1xM2978/d TD8wPzs2SztB4MjDy8HM7tZXQkRNUljd2tC+usDHvNVy4k5laO1dWNZ+cl9NRU9SRkpUXFx8cvPT 1uvn3Nzb4vxz393l9nVfXubo4X5n2G5ftqzGvLrcykk4KytALjNEP9e6uMLAttJVTDw8TF1V68K7 urzC79nKRERGSs/XzObIutpgQUFFRj47T93Q3t3SwcT6VFvz/VJIR/PL2mZb18nac2lr6txTP8Gj t8SzyLhqNyojPzErPkLMuba+ybTGPjU0O0hbXtS1rK++w8790D0xQ0ni4NDDv7TLT0dFPzg4Ok/X 0+PXwL3F+E5t7FxHRVfjytzr2MvSYl9hdG5XZklErabJtrS4vzg3JStDKTNH1Lm8tsa+u00yLzk+ QEzguq+st8a+0+NZNkRRafrtvr66w19PRT00NDpHZu3f0MTEyNZfaXVeTlJp+svJzc/Sz19cYE1R TlJRW1FvqKu6ssG3aTg1Jzs4MUBJxsPBwNXC20IzMT5CTmXRubCvvMDAy+JMTElPTU3BvsDH3dFW PjUxPURHVnzWzM3Lz8/Pb2tgXm9u4NbLzNza61tVVVpNUVdUbmtUvq62ucW+wkxJNDlCOkU7Rl/o zPfVzediSEhLWV1j3s/Cx8jCysXK1nlv2eTX0dvn62pKPz0+P0VMTFru39vWzc7b3N1yaeDW1NjV 1N7o/1pfe3xfWf1nan9r409E0Mva3tq6vsTJeNhaSj44OjlDRlPu09Tb13TuaF5aXeZo3tLOy9HB wMG9xcvP3mhIQD8+Pj5CSln6dvfk6d/h5frx187N0crHzd5nXltgXElOZ+3e4N3k3+pWVVtXWFVf +d/P3N7V3+9aYHl43unc1dfZb19eaf5eWVtebl5UV1/o5t3X1tHe6PloZFlcVlVq7dzY1dXX3Opo T09SYOz04drT09/Q1uTxX2NaWVVRdeTd4+7uffdoVlVba11aXGfs6OXh2c/W1+Xv72poWVheVWBt 6t1vbGB33+3d49jJzdTl5+HsdWVfVlNXXXr5dVtc/vlrUU9a79bncvzk3d7f8fXc2ebu/Hlt7ODv 8F9ZY2RuY278/eTj73V9+f3t7+vr7vT89Obud2Zfefd1Z2dlef1rXltt7Nzb29no7PN0emZfV1t5 9XN5dP/f6e/n5+fs3dv3/Xp4ZmZpWl5laO3s6eXf4/HnaF5VVnlodG7q5d3b5Of51uDe3l7o5/t0 ZWpSZFZX7lnmam3Z8tj2c2be9/v88u1y7HXketfuZNtpa/pabmBee+vw0lh7523cemrfV+L06Gdx YXboYs9b31v5zlrXU1/jY+xm+Vhw9Nfz/WV619zl5N76Ymry6Ff3T2Xabd5W6F/aee5oVN1Y+OH9 2FjTXdXucnp76X7z7eJ58+Bv3WfgXGtjW/BYZGj4637vc+1u6Xzs7+j++N974vd57WjgZ/dXbVv0 W/T33dT23HT0+VXhWdha7Wp71WXbaHT39t1VbGDs42j8ZfRn+Glxa33qbujWY+h14d/t4VvsY+/5 W+lV4m13+WLUWM9j2Xv67GbZWOVu/Ntf32z0e1xoYP1a3Pvh6uFn7vny7l3+am/fV+NY6HTzel/z 9Pvv4N3s02PQ/OJ8dvJcdV1nYF3xV919dnfu9314W3Ty7+Nf1O3j4/bf4mH1Zmr1X2HmWdVq1nXu /mflX2H4WeH5fuj5du1xce9fa/dd5/jk6d1q8uha32n963tq7H7u7uNy7+9v7V5//XB1YnZa6lty 5W7t7G/Zb+TmXtFr3H748fffVtVP/elPzVRf1lfe21jn1krMXVTPUO1wbNzq6exk/t9b8XZs5evm bOl4avxkWdxY4OFV1mft513wcXb93mzu2mvabWfidF59b1zca1fWV3faXuVxb9vf/+h0cN73Udjq YdFXeddf2XtS2mht4FHhfl7fWu7eXddZXcpbbNhZ4tRk5Hdt3GV8YHTnYlxe3u73dv7u6+RkYfTu e2fqZ9h4WdHrcdJYWdlo/fFYeNVsX9ta5e55a1zbY2zt2/f02lnd3W1yYN7fWH3fVmt4Yu1Z31l+ 2Gjpa1zZbWXPVtjVTsV+XtJV8e9q42VV1V9qfWbtdGd53Vnb5lTNX17LeWnZVGTTXutcVdnyVXpp 2N5K59Rt4vFIz8BMXMxs3O9Mc9/g7Up+xlxqdmDo/Vpv1WNnfGJ78Xd05dv3VezXYXfcbOLaVt9s UdrfY23gd13Q4k323n1WWNZ5V9RuXM3pa2r57VHz0VFzatzJT17Ue+LtXd3VbGxefdBLStBp61lT 0fLa8FfR0l9l9vVreO5caNzhWGDW7/18Z+jl325fdtvbSWTKb2Ncfurb807d/vzrVe7p39xlb+Pp VN5oWtlg/NtP4M1V4u5Tzldf31PYbU/G5Vt6TdHcV/Nk2txi8n772m5Vas/rR2fM7E3vz99PTsvh TOrSU2G/80vdxeRG19VYc1l7W2fgUmHT5u5bb8xo995J2slPUt3db2Pb813O7UjN1U9kb33+aWBu 3M57WNZOVdH4a/PMa0rW2WFwa9ds73VJXndtXend7u5a6s/t29rq6NzkWV/R4E9PbdvqSlXg1fZQ XuTT/FP40stYS9bUZlHk1VTx6HTVX1nl52NK3ddWU+PZ5N1aftjtaWnb3n/z+N/xTOPKXk3r2VZe 5lt3z09Q0ttSU87obtF9a9zeW1LP6k9y6PJPedtb8+r46OrsYXLeZ2P56OP87N9y/Ofr9PvqZ2Dy WFr+92Nl4m9j5/tk8dx7btXeXnnc6X7p6OJ+6e9o7uj8cvB+Z2N5a1prY1VkYmNvcmZl6Ot7697a +ebZ6O/h4HTu5G5p5fZgaO3sXvj4YnP+d2lzbVvV11jMytrI1L7NZsxbVEs9Rzw7QT1ITU9x7M7H y8O/xsPLzs7n1+xr5GlqZGzyX2hoVltTU1tTXltbb2NtbOzZ6d7V2N/l1eL75mZmcWVlZn5nV3dp SFfE2VrIvbvVzrjM3fdrbUI9Ozc6PDs+TFxvaM3Cz8XFvsDMwc7Wztzw/N3uT1v1Vk1UX11OXFpQ W1JRV2D8W/vP5NbRzc/jztTr5O30Z2drWmRuXFpdXEhav11Wvr+638Wy6s/5WGU6QTcyPTo7PUt5 WGHLxcfAwru+w77QytPm2O7oWld4XFdXWl9dWVlQU1tNS1RcX1lt3eje2NTW1M7b3tfa4vbl6mJs YlpZVl5PSmbL1VnGvcHFzbrJ3tZRWUY/PDQ8Pzw8SF1eW+LN0MTGyMDCvcvNwc3W6uLdXVZVT15Z T1VXYFNJVk9PVlNkXH3iaOzY0dLcysvU0NTO3OPgamxpXFRKVlZMUlZbXtPF7cy9vcTavsfv31pa RUVHOTxBQzw/V1tXZdbV1szMysrBwsrFx8vPzc3d5uF5X1tSTEhJRkFIR0VLUllZetvh187JyczE yM3N0Nbl/npVT1RLS0xQUUtfeVpfz8f0zr+/ws68ydjQZ2tKTUU4PT9AOj1LSk1Z6NzVxMLBv72/ xsTGzMvV39xt/1laXktPRUZFP0RCRUlOWlpz2tPMyMLBw8HEyc/Z2uptW09PTUlHSlBVWFt4Zu3I ztvBvb/JyL7Q3+tcWkVCPDk9Ozs7QkxNWvLZ0czDv8C+v8HAxcnPytT02OVnVGFcSUpHR0FDSEFI TFBZaNzk3M3Mx8jFxsnGz9re5m9TVVFRT0lPU1JVVV1fVti/4c+7u73Oubvm2Wf9Sz9EOTs5OTo8 R0VObunk1sXFx8G8vcG/v8jGxtvj3uNOS2xLQURNRz1KTElMVWNY/ezq1c/LzMbFzcnJztvj415U U1NOSU5QTk5UWVlubm/ExGa9t77Ix7DZbsv+WDpIPzQ5Nzs4PEBHWWzs0L3BwLi1ur+6vMnNyupf Zl5NQk1GP0lFREZPUUxgalxo7+Tl2tTPx8HIx8PK0dnbb11fTUtLSUlJVVJOXW36XGm9yFm6tcrJ u7J2775dSj5IOTE5NDo6O0BNbVjbv7/DurK6wbm4ydLG0FdhX09JRktCSUpJUU1RVnlgVfr9bXzX 0uzSyMrRzMPO2t7ra1JST01MSFNTTlpfdnPwWsy4TMOux8XCrc5LumFDPEE9LjYzNjk2P1poXNG9 wca5tLq/uLnGzMnEY1n1VFA+TlY/RUpiR0ZuV09N4elW9tzefNrKztDPx8vZ1tPhY2VdTktHTEtN UU1mav5w87zAVrOv1ru7s21ivT1FNzk4LTUxPzs5YO1l7r27w7y0tr2+u8DUz9f0VFZhUkhDaU8/ T19QQVtvSktYdU1W4ePj48nEzMa+v8/Mx9tqXGtLQkpHSkdKVFFiWFW7vEqzrcq7uq59Z71AQzM4 NC0wLUE5NV3a5mi6tcS7tbW9xbvB0trj1FVLbGdWQ3fcSU9n/UZCXEk/P1JPR17b0dvIvb7GwrvG 09PW+k9SSUNDPEhLSE5Y22ZTt7VHtarHvr+s5km8QEI0NzcsMi0/PTZI0s1evbW6wLqwv8zGxc54 atdiTWTw7Eb8z1pfXf9KQ0lEQzw/SU5NY8zKxr63ur67w8jdfGlLTD09Sj1CTFNbTmTLsOrUpby/ v7C3OcldPDctNy0wLjlUQUjNu87KuLTAzLu92W3e72NZW3r5/PrK09/GzMzqbG9EQTw6Ojc8PkZc 6NLIvbm+vbrDzNPZdU1OSUVJQ09dTndOcbHGSq6rwcy7q0g72jo1KTEyLDQyXPley7mxvbyztMbc xdBPREZJRkJCWNnV1cS3t8LAuMddT0w+MDA3MzI5U+Tt0bu2vL+4ucrl1+hHP0tIQUhMXV5G9Ky8 TqupsNXIqEg6PTg3ICgsLC4wYdDEva+qqrC0rrrRVl9VNTM2QDs3UOPJ0suzrrnCubzbQERFMS4u OTw5TtjFyMGzt77AxspnSkxLRz0+WXNab1/5r614vKWqwlevujIvMDwlHiosLi5LysC1sKuqqK+4 s7zoPkVGNC46Pzo+W7/Izru0sMrJxN1WNz46NDU1UVFvyMK7vbm+z8fTTUNHQDo8UFRJ28jMWs+h sVOvrKnaS7dHPislMiYnIytFQ/rEr6qrq6uttsD4VEs5NjM4REZLa8m3tru5urbHXVZCPC4sMzI5 PVDNwreysrS2uM5XT0g6LzI+Pj9R18S/uLjPv6Otbsu4p2srV1RGISE4LCsnOnzZtbexraepvs3D wz4sN0M9LzjYvtHXu6usvr2/vuA7Oi4yLysuM1/ffsavqrC4ubzOUzw5OzcxLz76fdjJurK3x1au oMNOaKmoODQ/2zweIywxKik8Xr2vrrOvpKa9TdzEQi0tPEk5O1y4scS/s6mu02no1EcsKDE9NS42 7MPLzryurrrX289pPDQ8Qz4+UNvKxL6+v8DbQsOnul9RraHZODfPWyMfIy8qJy9Hu66qrq+no61i Pm1vNSgrR1Q/SMessr26rqzCZUdfTzQqKzg5PTpOxb66vrq1u8xqXlNFPDtARVPn18zFvL/PytM/ R6yr0kPKn6lHLEXILx8cKC4qLzzIraanq62qprs/Mz1JMCYsR+twZ7yrrba0q7XlSE5YNCosNTg1 PmPLzLu2uLq9v29JR0hDOT1FTm3ZwsLIw77I80c9zqewZVa2n648LEbbLR0aJS8tM0u5qKKkpqut rL9ALS02MikqO+PCw7irqbC6r7beOjlVNSkoNEQ6RHW/u7mztLjDy91UOzlEQDk3TcnH19i9t8d5 ZG8/Uqypv0bPoKNlJzLgPB8YIDE3N0a9qKOkpquyt79aMykqNTQtME+4sbavqau1ur/fQTE3OC4p LD9cXFPHsLG4vLe71lZQRjs5PEJETeLJy8vBusBtTGbZPzHOq63OU7KgqUYqM0MuHRwmNkRNyKql qKmprL5nRz8yJycvQVxT3rOnpaq0u8jHxU4rJzI9NikrV8C808ixrbTFzOJZRT8+ODhCa+Tu4si2 u8/j+9pqTDwvSK6ltPLOpp60LyQtOyscGyVBz8e4qqanqau3cTg4PS4lJzrOxM+8qqOmr7zMVjpC TDUoKD7aUDVAva236t68uMtRRktQSElEP0rkwr/O28e9v+ZMRz8/Qz42Q66forbYrKCrOB4fKy4g HCI9vbWuqKanq664XjItMjUuKjH+uLCysKuorr1yPTs9Oi8rL0X6dv3Uu7W7wdTo6PBPPzxCWFpP TuzBvc3x3MrKaEZNWU5ARGvXekzGo56r1mayqckpHSEvLyQgK2m1sbCtqqqxvcxoPC8wOTs3O9qx rbK5r6244UQ9OjU1Ojw3PGq/vdXjw7vHWEZq1ftUUPLU2udpanNuXFRVX3pzWVnfzN5bW9nI7kja qqWyXFC1rM8rHyY4OCkkLtqys7Wvra+7x8loNCwyTF89OtitqbTCua603j0zNDc4NjQ4SNa/w8/N wL3E41Vm1NRgRkh10d1USVTf03ZRU/zW0+ZqX1xg/Ph4WU91u6qsvN3Nr7FVKiQuPDAnKTnNvb63 sa+2vsnhQzMzOkVIStuyqquzvLe3yz8sKy0sLjlO6t3Brqu02G/Lx1A1OFTcWkR5vrrH9nDnZUxF QkZIWObf/mzfy8zvafvkfmy6rK253MOvu0kqJS42LSYoPMi+wruvrrXN2MtnPjc+79Rv3b2xssre y81iNy4yOD1GVt/Mw7i0vdhg/etOPD5a391p5cnGz2FLTVJNSEJGWOfLxcnT29nV32ZbWl9s88y0 rq+1wsDIXzkqJykrKi00Tc+/sqyrr7nAv8tOOjhBUVRPaNLBvsfO1t5qTD48RVl2Y17cxcLVZHnc 5GJYcdve9OvVzt9eVFZSR0FHUlxp4cnDyuD73dj/S0hh1c7ZzravsrzVzdFNNSsqLS4tMDtcxrqv rK2yub7H8EA4OkFNS03tyL6/x8fH0HBJPz5DTl1TTF7RvsLiXG/PzvJRWOLQ22pn++9kS0RGTFVc WmbizcXJ09nOy9NnT2Hf5FRJ2LWzv97ZvL9cNS4zOTQuMj9g1c67s7O4vr6+zk9BR1JSQkBa2M7c 58zByPFSTlNOTVteWlzpxsbtUnDIwdpYdM3MdUdMaGNJPT9KUE9e3srEwLy9yuTm3W5BOD5c7FpJ 57Gqrr3KurnnNy0vMi8qLTpK+d29r6+yuLe4xVY+QkdDOzpK79fa08O7vMvd8WFOQkdZWExN/szK 3e7Lw8j3Wf/1WkZFTlJMRk9o/ffozcbKzszGz3ZZXmdUSERNeep77s2/vry4t793S1JeQS8rLz9F PT1Wwre5ura0ucTZ+1lCPD0/Qz9Id8zDyMa/vcd6Vl56W0hFU2pjWV3f0dHW1tHa7XdvXkxESFFU Tk/4zMXKzMTAyOhYUVVPRT4/SmDezszFwsC5s7bEZ0xUWkEwLDA8RkNGXcu7ubq6ur3Fz+dYRz8/ QD9BS2rXz87Hv7/I4fvl5FZESF/fbVRj2s3Z+n3q5/hvbmJWVl5xXlZad97h5+Ha1tvk71tSXXlg S0te1M3W0M3SwrS1vXdO1tRTMiw1PD84N03szce/tra7vsHG5VFKSEM/Pkhgdency7/ByNbj5Wxs VUpSX+5sT1Xt0N1fX9zR2mpf7uHoZ1hXWGBsXlZb7dPU4X3j3+t4XFZab+3m8e3Vy9LSvbq/3Fbe 1F0/NDxFPTo3QF3s1cm/vby9vsTY8WpiT0FCRU5cWW7l1c3KyNDkc3na5llQVXDtXFNi7tbbe/7y 1c/oY1hkdWRTTVNefPbu6O7o29LZ+Wdy7nRbUVj/5+De083X7trL0d57X+feZFtVWF9VVE5MU2Fm a3Zq3tPW19zb4OjualdPVF9hXltm5dbPzNHSysjJz3tcYmNOQ0BIWF5kcdvKzNfg29bbaktSXFlW Vl/w3+DZ5t3O3vFyXvnvbGxoaGj62NtpW+vU2Nh5adTN0fhdW1NTTUdDSFJafO3l187JzdLX5erl dVFPVV7q3N7n3c/Mz9jpanFkT0dHTVBXWFtx4c/p18rUw9Lj1mrcbFVXU21MYl9O+2n9233c0u/Q 22jvW2TtXGBXWdLj18rfyczMy2NhTEVLRUI/R1N+3tnRzsPBydfl5G9lUUlNU15g+9/r1M/Py9Lj +WdtXk1KTVZPYGxd29zbzs7JzszZ4utfYE1MUU1NUWBZ+uRmz9rjy+faz2bn1l/7X1DqX+7YcNjY 4NThfmxXW1JQU0tTW2bo++PS3cvO6NPz5ndabVJqXG50ZOBo397e2+Dc4+9wZ15dX1tWYW1e3P3c 4uLIX87kb9tR6lFeT2RVWu9h3F/JZM3p5s1OyU3UXGj6TdBI0lPm7VjOT8pc4+9Z2lXnY+l03ubd 2m/TYNpu+Wpjb13sTehRbOBO0Fjj2FTJX3vMSM19TsVF78w+vER/xD65RtLXS79FzmlOzE3g51Xl XeBg2WBYyD++TF7CPLxE29lNxk3QbXz4b3d5anhc7Fxc0UDCUd7KTL5QymzdbO/vVd5E3kXVS91h dd1Zy0/IUMto2dpe3FbQU81O00/e9EvIQc1RXNNO3P3+1G3OdOTeWMdExE5z0T/JQutuWNVW0V/f 0FDGTdJ0V89IzlNozUe+RtLKQ7U7xnRGvzvOUVDOQcREzWVcy0LAT9rPTcNM0ehax0nKWF/IP71C z2xRz0TTTXxzUctJzfpXxEfBWd7US8ZG0/hGwju/RdpyUcVHwU3W3lvVWeNs7Ota21l8cnHl/enm bthf33Bl4l7bWehoWd1Z63V772j57VzhY+j75+306GrkfPzdZNpW2mdv3VXSVePqUs5S1XRf003V Wu1++vpr9v7y+/L8eeJpbW1n8Xh57V/lYd7/9eRr5Pj9/m3qV89Mzlr72ljZaXPrYHHsUtVQ2/Nn 013cdvnub+pd1Fbea2Pcae/dX+V5Zd9f4171eHTcU9NQ0FfW+P7fZe3sWtlY6m9p7mBzfmjhYeJr 6+Z94mXi9t7+5HHdYeBh72L1XXhfamtrbOta21vc+fXbfN3r4e/kbtx36Wlmblj6XX9fcf1t3mLT XeJ0be1rfPF5ffRi4GTbZ91e217eb+fka9pf31/va2/sWNlP0lDYW93wX9FVzVjd82rWWNNc7HNg 6l7uZ3p//XPvcfdt9W3pbOT88ORf2l7meHrecen0a9pc5VpnfmDmdFnUWdl5Y9FX0l548FnnWd9p 6upoz1XMWt5ucOprZ/Rj7ml4/Vvead/qe9Zg3HPz3FraVO90Wt9c4H90dHR3cvxrceZo4e1j2V7P bdzt+OBs9W1rbW9pcmJzYX5n93J/7m308/fda9lm3Xbw6m/nZfZv7/X8d/B28mpxd/D18Xn5YvFk 7G3ree519nF28Xb0fW/sYn5taO5k43Dk8/L54+/Yet9u8Hxs7FzrXvt9aOte6Gr1+275aflvdHbs ++hs63Ds+/7q9+fs/vVl9G759mz3ZPV47/JzfG33/XZ4Z/D+5eze/t9w7Hh/93r7cnRuf3r2cfZt b/5593J3cm9r73DtbO587/bp7ejp6evs+nhwcHJl9l77YPd78+xz7Xru9379d/v1b/lu63t79nTv fXr2eHVvY3dm+X/96fvn8PHy/+h73nrn9XXtZ+5rc3Jme21udfrr7fv8b31ubfZ67Hbp+e/n9eHq 5vlxdm/79XZ0X/54bW9ja23reGpsaute7epu4fbk2+De4uHf625pbHbqbmdrX3ZnanBh7mvn9319 aXHr5991b3vv3vHuX/19ePhu8Wlncnze6X1udfT1eWd07efm8338/vL49PP+cm5/6ntpZnH4Ymjs d+fva+384/d8b/Hw7nBv7+/+fPvu7vhzaPvydmxdc/H7+3t4d+Le4Ppu/Ovn6nt2aG3z/vNkXWF+ 2PFmXXXc3nhc9ujmbE5d5eb7a/Hj4ejz7NdyX2Ht6fVlWOHif/zu+fHnb2ht9eXxXmtw+P1f/HV2 d3Bo9OzvcnTv93zo0u73d3z2bXts7ed26HFx43Z47Ob+WVtr/PZ6a25v7uLi6d3g6m5ifHRkZmtr cF1o7Pno5drb7fVmfuzveWR69XJ16tz5bG/t+19oXfj/ZmlkYfHq9O/o2+3p4uL+ffn99nJ0c3Nt cvZ4+Oh+Y2pnbOzp/2ls4/Zub2H65Ghk7Onj6e3f3+9ua3VucmJ65/N++ejc3/V9bmprX2Jke+x6 b/ru8Wxu7Op8Y3ztentme+bmenX4593f5/Lkbmjx829eb+/ybV9mevVoaHLo3uxp+trseWdm5PRk bWd78Xps7+rq82Fo897feVZh3933YW/q83j2fe7h8mvp7Pb9a25vbGxu9uL9dHV+3/tfV1/s9e37 fOzp3t7hb15oa97zeu1v7N/w7n50XV9seu5kZ3Dv7fzx79xz/t1nd2t94Hhr/t/pZlln6/5qbfrq bGHq3Nt1Z+nh2/FaV+fcdl5c7vbu5+zhdGNy7H5wXWrc73ZdXujm7m507ezvY+Li9u1db+fvbv1p 8dhgevT1415jc+npYWzvbHFr79/ebXX6YPhqYPDp4OR8+9zl7el38m5e/G1jamZ86WNv4fnrYF3q ++rt7N/m/md68N/7Xmrq6nBi+O3q2eVgZ2Vqbmt+fl5h3t/n7OXccXVu625hbVl67vdo8fL03l1q 7mp7bend++936t7f+n7eZVtnXfvnaGju8uHveO3udnFkbnVfbvbl7v7o3djkcP9yX29kYPluYujp ce9x7PVp2upxbXjY7mT1d2RgaH1x5Ojd7lve4+P7XPdt7XtTfXvs72rz5vRzd1/v3nR/XOnobtxi bepw9eLgfW3r63JyaWhzZ1pyd//sfObb2t7xbXP29npvblRt5+ZxYunmdmbm82RfYfX52uD64X5+ eW/p5WtXW9/m9fZt797qeu73bmNh/ftjU3Tb18/seOTl33FeYltzW2T0buro6/Vn/Onm5mZgdXDX 3VdvdGjncf51Z+7s6u/rfO7ven1ZdP1qd3n44uXe7X7t6fFma2Tm+WD8Y/X0b29z7vh1d259dmj4 /t3vd9vz6+/udvzxXWtr5d36ZVts++95a37r3vD5b3Xl5mhmfn7rbHrXfXnxbX1k6eReW2/veF3/ +PLU43T+furnbf3wXnh8buJvbHh36mxoafXe/n7o4+r/eeNqZvxZbubx+2nq3O/6eWFd9fp4emXq 4+Po9P3/5mBibnlzUl/k5nZw593vX+7U+2/w4N3xaGpu+ulicXnpallx7ONg9HNm42vreeno/et8 4WBe+u9y8/vv6Pfn7u/raFx37G1dWO3c/2j71t5q2d9qXl7+/ORtW3Hf1mxidO3t4uBvclVV997h Vlrv0dpYWuvcbl9+8e165efo6XPgeF5haeX492br2N7gXWHtcl5eal9raf3t+e3b1dfubHvh4Xhc bOtkX3XwYVlbetdse2n61mxuXebZ6Opq3+Z4/OXdZfx+6d9RY33n3WBvZf14X2l16HPodfrgavPu 3nJl8frs5HJlbXt78PLhbVZyddX9XHJs5uxlbefpX2Tpzt9cX/La73N5dWZw/H3j5Fta99rcbFpf 6O9t7trfW1r92dl2Xlrpf2Tp4OZzWuTb5mxd8930bF5t6l5a3tHdZWnt5Ptia+tyVmBz3+NmYF7V 2n3pd+Tsc+3s72d+6/BnW3Zk6+5sYWnS31xa6M3tWFx37+x9buDi9f7ye/7xZWTpdF98bnt0YXf0 6+Fo/tLm3H5QYm7q9Gv46fHn4d/nXmZnfuxeYWB85e7f2Xlkfu7ubWn3+ersZvDgeWto9nzuZGN0 Xu/t2edc+d7eXFNvdt7vZHLp7XDx09p0ceT7ft9yb2Fh9WHo8Gx3WuHbXl1u9P3kc2Xy2upV+dl8 YGh75Nt2++XmbFZueuhvWGPb1mVkad3S+m723+dfYul6cnBj++Z6XGpv5t1ycWz24/r2+fH3a+vv aO3t4u35/ujvW/D46/1NXl586FVgZXLm1dbi2eHfcWxtXXxc/Nj19mzx8XvfeWhq7nJqc2rg7ev0 dH3z4WBz5mpv3OdmZ1302d5ZW2rv3lpq9evu7t7uZFj49uPaXmL6bvFqdf/p2m9y/Xp6bPrd3X9f Yt/odOhmfdxfY2d+7vLg6OxqYPfj/Fl4cXfbbWNgdHt41u9Zdfv87uHm+e154N3qfGP672h7bHZj XPP38PPd6GP142Jj43BY+n7859zlY3Fr/d3oZGb6ZXzq5PVc5u3ybVbo7nRdbODn6F5+3dXYXWBl b+jwZP7taulvb21d3tpiWWTy2uNqcOvqePl79+Pu5W5m6/H07X5e6fBrb274Yu/6W2Vu5ODheHVu 9NTsWmTw3u16X2ff6OztYVv33XFTUWXt49vg8fR08dn4cljjyOReVu/a+Wpo7/ZmUWt2futZa/H/ +PDd33v14uTmbm9xbPdpWlj2199pXmTbzXJYXvfe82db/eXk3+btYV903+1eaXDc6fvuatvtZXV+ fl99cennZuHt+/5t73FrXV1hXvX56Oft23Xq3Ofq5/Vcd2/5eFVz7N3mZ+1oXm72+upvXPPg3Od5 3uXt4V5cX1rp6nR7fdnaZndnXextWmVxYejf2/di0+v0719gXuTxaFxc7dnR593jXP/e4XNaXX7i ZGz4ce3lblVt9WtgZOTZ2m3u8evlXmRt1vJWde3xbXz83Nryb3TvdmFf2tX5Xl5+c2RcX+jnXnzj 5NThZvDf43lfWGFu+d7w6+Hn525jYGv5eVxffejkbnd23tj+7W9kYO7Z+GJn7+vb4Vhm+O7xbPps avVpfPlo7d3k9Gz+9W1nfuh7bHRqYWno7O9+c/bge1tg6N3s+Gxp3tz9593h+W3s9nhkT3rednZv /G9w6+p1XGlzbmBt3+fg2udpe+jf8V9lcvT9ZV9059rZamhpbG1g/W1fbOre6H7o3Nzj8OtpZWb+ 4WphberY/V9eWn3i+WJhd+Pc63xrbux+62phbH7rfd3n+mrm225tZmtt8fRnaG/m6Nze7elqevlf Zerra2pn7ed0fPbd5/98b2r+7VzzcFl+efx+ePfu6Gxp7tzn7ul+4/ZtffV9avBzd/ZtW2bh5+t9 XWp57G1b9PT97OHofH7f1N/zZvx8aO5dW27n7Wx8bH70+Wlgenbh6237dOvr6P755Hd/bmB27uV4 al5z7P19X+/f5etqb+fu8PR06+vnd2t3dO3v7mBoZmX4amxj8+rv7Gh039LX42xgfu95Ymdu+uDv YWHy5ed+YV1i+Xd0b+7c4u/96e3u+e3ucHBpeftw93Zy73tfbHjr5nR3b+rf/258ffV6a+3v8P91 6eN4aGRs/Whu+nr5cHLn3/RhbPLh5fp+cXH7/374df7y8/R5bv717v7++Pv4+/1n+u5wc2tu6t7o /Wdv+WxzeW159ubvc/l3ee/tef39/u95+/p/dWZv+vTq7/Ls4d7j6PtvZ2doZF9eZWX/7O3u9+nz 8G9odH79e/b37/5+7Orn+G9jbnP/5vL+/uvp+/fu63ZzZXLqcXBuanfu9Wts++t6e3l83u1+7/vw 9XJoZ2R68P73bvne4u72b2p7/vp6eP/q5vB7/ev3cm1oam509u17euXi4u9yan/0bF9ea/vx9e/+ a3Ts4/JtbH/s8Hh57uXreWVye25tbm/v4uvzevTs/O58bG1v/nv09fnz7fZybm9+/3dweu7k7H31 7+zueWVnfvv6ef56ffL3+n58b2x5b2Npf/PvfHbq3t/w/ezk7HtxbHp5bmpv7/Vtb3J5fvl9+urz eGd2/vfvdG959fPy7Orv8O7493x5enZ4fPvy929vdHr6fnxuevR3c3n16Oh7b3Z1b3Pu6urrfvTp 8G5ofPt2bmVjdP7/c3L97+ru/XB3+fb9eHr+7+7x7/r68vHu8nFrf/Ls9n99/fX/em9sbnN4dn53 cHb9/nl8e/ny8vTt6url5u93bHT8fW1tbHf9f/Px+Pv77/F4b21vefz9/P7v7/j7d//79398enV6 eH79/Pvx7u7w7vb59H1wZmJnam1tcXV1ffXr6u/1+Pn09nn47+vs9Pr37+3o7XtzfX54cW1rbWtn a21xfuvk5+Pn7fD6enBvbGxrcXj+8Pb27uzp7vV9b21pbXNycXf88e7x/v34/e/u9O9/9e3r93F4 b3Z6dnh2eH31+v9zbm9rcvny7vD48err7+/q8XlybnZ9enNpZ2tsdXV1c3B5+/Hv9vDx+u/s6Ofp 7vf7f3/8fHRybnd9evnw8Pb9bmVpanB4eff07unn5+zu831za3FxamlrcX3y8uzp6vD38/n6fXp4 cWxqbG5yevPs7Ori3eHu/Hpzb2pjZGhqbXb+9vH6+e/t7fL28u7s8nx5d3d5fHRzc3p4eX1+e336 /H78+Pf6/Hx5/f199vD29fP+/vX9fnJvdXR8/nVtdXV2fvHq6+vu7uvv6+73+Hl3e3Z2cW9ubW1s a3v8c2ttc3Z++e/n4uLk5ubr93Vrbm5xb3d9enz/+e/u7+3u9vn3fv58dmxlamptdnl8d3F5+O7t 6ufp6+/2/HV7eXh4c3/x6/V3cHR9eHt6em9pa2pufe7t9PHu7fD49PX7+Pf+eHNxfvHw8PHv8vj8 enRveXZubW16+n7//fry8+3n7/v5fXVtb25teP7+8/X39fz6/X749fV+f/t4d3n98fD8dHB1eP30 7vDt6vF8evv3/Xt1b21ue/h5cnV49+7x+Prz8vD2+310bW56d3x9cXV7/PD4/fh6cHF0eXN7/37x 7unq7uzt9Hx0cXn+d3x7+/n48/59/vXw7u35eHp97en6/nVvePp0bHRxbmlveXl5dHN1dHT/7+jm 6unk5unm6O93bWhoamhsc318enRzeXxzePn+7ujo7ezt7u329vl4d3x8eXxzbXf99fh5cXJwaGxu bndveXNy+vjs5eDk5eTp5uvx/HBoaGlteHV5+ndubnB0/+/2/Pj18/v+/Xz88u/v9/T+b2ptendx /P15b2tv+u/1cW9x69/l4uTh5f5fVl3z1s/MztPR2OhfSUFDSlFca2/y4Nnefl1QVmfy4N7b2NbV 3fNrY2n66+/xfHX7/fZ7cW5oaGpnbe/v7u/k5OHb2M7LyOlAR3zPtcN8WDxaSkpCMD5H3L/H3Fhr 3MzaUz0+Yc24u8fX7NHN0mxIR2TKv8LWXVJZX1lRRkVX/tjZ62lj7v9pXVVk997e8f1ha3Vqdnfo 2dLT2efu8W5rXmj89+jm1dDeYE9SWmp5bG957tfW2ON7amB2c2JobOrc2+VsX1pVV1dYX37l3+b/ Yl5jXWVkavXs3ePo4tnNzdPh7utzcfnp2+Z0bm3l5P53TTZBubGtsm9KQUpDOTQrNe+/trnVTVvW 5Vc/MzrVt6+ww1xS3tPhYz9C4ry3vdtDRF/xc1ZFP1Tf1t1hSkzp1drVbFRq5eR9clts19n6X1dZ dOHa6HtcU1dRO+OjqqWoR1gyNjQoNSY9vbuss8ZMW/g+NTAsOriuqarE7ktnTz9AN0LBqaqxzzs8 QlNBQDs2/MzD02dRTcfG0ddVTGnO1N7eWljb0N3abU1PU3ns5WZPaWzo50fbpKqyrzo7OTY/Kzgt PLO1r7fVQkFaOy8xM0mtqKqtzF5ET1A8Skn4ua+vuMRQPz07Ojc8OlbMy7/N1m1s7U9fVlLjzcfN zdHx5v1PTVNQWefT3XXoXVdsWnH+abKgrLXNNTw2PDAqMzLYra64y0g4Qkw5LjhBxKeorcBVS0Jf U0BOX8Gys7rKb1xRQz82Oz5F3t/MzNHTc2RLTGpr3tLW0tHLzu1iTENLXPztYmRp8Obu5Wx3b/t9 5qiluLRiO0U6OyssNTm6r7zAaUFEVEwyLzxXtKmtudlwXvraSkBJ37qzuMfcaWpNPTgyN0L4zsrK 2OpsYlFKW+LLwMXN0dbbdlpJQkpV587lfe7u3vhPSUda1dDDp6S4t1U0PTE1Ky48Pbmut73fQjtD QDIxQli3qK20zHJmXOJVS2bdvre/5mViW1lNQjg9RE3oct/d1dPt3Vdh3NfP5ell+NHf6l9QS1Rs e+/q3/HlZk1MUt/c0tC9oqi4uDs3OjI7KjE5QLO0vMhDPEJRTTY4Q1+zrbG42tjc08tYUE9uxMHN 39ro7VxCOTQ7QVjw6c7VzM/Y7lD229ndbXVyz8vsX0lFUnje7G/q5ubrTkhRX9vLvsOtorq8ejA7 Mj8yLD841bO+xXFHRUdVPTFDTsatr6+9ysnr2VlDSE7QxMvRy8bO9UQ3MDg+RmNi08a+xOVsRU/g z9Dr4+3Ows9eRj9DXXro9mzZ7WteXnhg79rRuqSmur9BNT48OyosND66r77aWUFNakkxLDpatait tMTLxMrdQzlCa8G3wlpfy8/tSjUuOE9e6Gx76cbA8nJKSt3HxNze7/HK0XVSR0le6XxVVG1ZZH5T XHbrysqtn62wwTk+MzguJjIxUrOzucZ0T0pKNikuO9+vqqy1u7/Q2k47O03NvbnAX1DDxW1HMC84 V3xPXF7iwLzWVE1O4MXKYFJe/8vM6FdTb+jT/kxHTmjf2mRRXdvAwK+isbq+PkA2Mi4nNztTub/F yvJnTEE2LDRLzLGwr7e7utLySz1FX8fDxcxS2rfD+D4wMDpKSUhY3ce6xexdTGnf0OVZZXLMx9v0 XFxqbFdPUVNZduV1bv946czDqaS3tmc8RjU6KSk3O8W4vsPO1thpPC0qNEy+s7m1t7Ozv3w8PENu yc7eYGC9s8BgNS41QEdDRFrHtrfRZ01K69riU1fp38HKbGdccXFlWkxc4nvt619XXdzP0bymq7q0 TUVFMzEmLjY7v8XOv77E1103Ki49TMe9vbOtq7XIaD9ET1VNV19mvK620E45Mzw3MTdG0L+1weDN 6O5sWU1N2ervztzf4d5nTl1QUPlvWfjfe+LtZ+2voLG2vETmSDkpIDIxT8h00sCxs796MisxOjxO acexqaewu8vzV0Y7NT5KTs21tbu+5kY+Ni4vO1Ljwb7Hv7zJ9l9PSFdXVGL019LY7Wh4ZlNZU05y 71xsZFnPp6S3r8LWxU44ISYtLEZAQeK1rK+wxEtAPjAuMTdNy7Wyrqmsr7vPSj49LzA+cc/Mws3L y1U9O0NHTlJKWs6/ydHS0crL6k1QZ3FvT0VMaujb3Gl3zM7xWlNSTb+rvsS3wbS70j0tPDEuMCot PeDHv7W2vra7c1dFPj5EV0zuwr64uLm/ycvedVY/O0FFSElFTXfX0M7Q4d7md3ZZWl1f7Xn33+7f 5W9iZ+Hl7Nnj18zR3WZeW0xMS0dGTF7u1Ma/vbu+xM7kXkxKR0pTXnTm539gVU5HSUhKU1rv39LN z8nQ2uV+5/Lf2N3Q19bO09n2b15PTUc/QEhRYnng3tDLztDa63ntcV9hX3Lm0tXUzdjpd19NR0xJ RUhRcNbJw8PBv8bL411YV1lRUlZQV19VT0xKU2Dy4dvT083O2d/r7efu6u3l2Nna1dTX3+9rVlBM SEdIT1FZXV5nYvHk18/Sy87My9Pa5+3t+/H2aWxgWVRPVVBPU1n44+Df49bR0dXe3Nvb1tjb6W9m VU1KRkhNVFldZXvy3+H76ezs5ufg39bY29PRz9Tc6e7qdmZbVlJRV1NXVFNZXv3z6dvb0s/U3ufg 7vrt/Xju7fxvcGhZXV1bZG1wduLk+PX/ePjm4ufZ09nc3uxyZ2ZeXF1VUVZYXF1ibGzx6/bh3dvY 3OLi2NLW2N7j4Or6aFtXVFlZWVpVUVBcZGj64tTOztHa2dvf5PVuZnNsaXJvb2lufvvu9XFqb/5t Zmhle+306+/t19TyZurqbvP5cXNsb2VaWlpcWFpudm3o2+Xh2dXPzNDZ1tt8b3JdW2FjYWNfXFhV ZV1RaHX96OXY2Nbi4tPy59Zv9+JraGRdaejpeXpudHz7cVlqfFd931ll4NHH41dfVl3yTU3N1Unt yW/61tj2adxqWuBaceJP8sRvW89w/s5vUtnxSs9VQcfjRnfQelrR71Df1GnwZGnSZFvxYebSbnNu bd944u1X0tJa8+JYZODsUXFuTN/RV2XObWPYzepQ2dXZT03ITD/N1URN3s3TPu+4VUzXz2ZM29dt ZebSeFReyt5B6sZUT9ZdTtjwfWbr2OrcXvTf8d9nelxh9PlwUW/dz/5O49vW2uPzfd77YGdnX2Fs al3w4Fvk71jf7VtUWWB6Xe/bUHjKz15YysnV6nLOztjVXENGVvR3Q0N7z8TT3tdr1cvhVklJZNb0 WlVNa9LXzsvPzNPOyN5ZSEpSRz4/Pz9T7d3Qzsa/wcLI1+v8bFhHQ0ROWldhX+jKx8zW1dbb4PpW Q0hf8lZU99rS08/K0HRXV1xs0b++xc7HurnUSzo1NzQvLC41OkvTvru8ubGvtL3XXmJjV1dcd3Fh 3MXG4F5jX1NGPz5DQz9JXG/h1M/Kx8bDwcnV5/dvcHFNPjoxKTStnJ+y0q+dnbUvHxwdHRweJSQo 6p6Wm6y/q56ixi8kIygsNkxSSuaqmpmhvFpXakErHx0eJDJqw8fUu6mjqLXP+vtfSj04NzUxLiky qJORmqqvnpyzKRUODg4TGys7PbiWjIyWsXrGyDsiGRgdKEWtn6Sro5mVnl0gHiAiISEkKjNNtaWo vm/UtrPKVktXYtPMxs4+Jx0lqo+Om7zPoZuxJxALCw0WKNKxuauVjI2bPh4fJSMfICdDu6CTj5ix T3O9XSMXGSQ9zLWywVQ9W7zFMyElO7+xr66usLW3tscvGhEdn4uMmLzKn5/aHgwGBgoerJeXoJ6S jplLFQ4PFR9Tqp+cmZGNlMUdFBkjJys4W8Crn5yoPx8eJzEvJic02auemZunzk5NSCwZERiui4eL mbS15CYaDAQDCCaWiomOmJupPBwPCgsSNpqNjI6TmqT2HRANEyjGo56lrravq7I5HhgZIi88P2a6 o5uan7dALzY6LhsPF5yCgIaZXCgVDhEMBAUPqYWAhI6tLRwVFA4LDyqeioWIka0yLCUXDhErpJqb oL1BPb+krCsVEhQj8Kqjq7eso6i8Py8yNS4fFRidgICCjkETCQkUDwkNGa+NhIGNxxwVFBEWHB88 rI6Fjpq8JCEcHSgq06ejprbaPDrHsbE3GhYUILqdmKDJSE3Br7pPLCEcHBwxjICDh5grEwgLEAwQ Gy6qkoeJnNMrGw4PHiZRqpuOkJqkLx4gHicqSZ+anq5OLCpVu7LTLRwVGjmtnp+rxUtOxbjBTSgc HR4eooOEhIm7HgwLEgoOHCLNmo+NmbtQHQ8VHCHgn5aQlpytMSchHigtS7uil6C/OCIqWbSyQiUd GiXKpqCovVtE2bi+dTspGxEYlYSJgo08IQ8VEgoVFRmhko6NskspER8aGldUopOUkKDwPR4jLio9 OlSsqJyg6TQgLGvtwDIfISZcrKSfsz9LSVq+3j4lERGfiYuBjTklEx8dDxwND6qajYur0xgVMBci LSerno2Nq641HT9qumAlLil7naGrWS41M73AMCccI16unabIRjjOvWtAKBwWv4mNio41JxglMhMp GxDdqpWPr7geGEElOS8gS0qdj52gSSA696ifutInIDpBx83wxlfAvEMwIR8rTqeirLpKRXXSzzgc E3WQkIiOxzIVLCsXNhQVTceTl6asHR8vJUAwLz03opefnb4rJy+vrKupTTk9RU8yOTg7s6qwXyYg ITm0qq/HT1nOta/fNi0tNC82p5uckpqvQiAoGRclHC3KrZulpqg9MyoaHB82tK6cm6agr8VVJSom LL21qqm9w1FRZjUvKCQtSLmrrr1cSEbqv99+STtJS82/zrq5uuxts8nJwNu9V05pLCwuKy4xPmTt v7S3r6++YkA/P269vcna1t7Vw8txSU/vzry+7j4vMDM1SGVPfM29srO26Tw8OD5L/b+/uK+0u9w/ NC86Wd3PznRASOLTzvpLRDxtwL+5w9dxX765xe47PEVbwdVdQi83QO+5vb/SS0dBP0VN176zsr7C 5ExSVVtNRVr7zrW5zVw/Qj9Y9EpKPjxFVcfI2MrMwLu8wmhWRzxHR1PawLW2t73bUz45ODMwMj3Q urSvwFs6MDg7Xry+wb/HzcW9xW9BOjlNvrS5zV5QX9HKWj85NDtJ4dhhc/TMwMjXaVhOU3F5XnLd zb23t8P9S0RPXFJFPD5M17u80U89PEnRw87ZX0/vy7y7zNxTP0JHUlNe1s3CvMHKcUQ7NDU7SWzf x7y5vcreTkVOTmLmeOzcxru/x2w9PD9T3M7N7V390cjTaFFHUvXl5mVOTm3TxL/Ez1VCPjtAQkZp zrq5v8PsXW5fYk1DQUbkvbm+zHxMSk5KR0tLWdrGuri/yVdBPzk/TnzSyr25uLrKcEY5Njk/SnHK wsC+wthVRD08QE7pzszFys7TXk1CQV/cxb/V6F1S/V1ZVElbWmL1XO3j28G+ur3Mz2BMSENNUWLY yr+/zNxlT01JR0A/S1Je/GRaVVBb/NzT0s3KzMjIzs3c+WpPUV5r6l5OT0tUfm3d1nXubl1dU2h4 3cPAvsDFyd/i3vfpde3Y1srjSj00Mzo9RENBQUp61crK0NDW1MjCv76/wcnP2WtOR0RHSE9WU1hb YXlfXGb52M7EyNrmXm7Px7y/w8DNycfa6kk5NjQ6Qz8/PDg+QUhWZOTLvbe3uLu+v8rjYFhs+ufk 6+llXVVFREdMV1dbWlJddOze187Nwa+vuLW9v8X9+UlNQS0tKiswNDtDbc7Lvra7xc5vcOXi5uLI v7+/x8/P0uxuX0w/Oz5LTklCQU1d383RysnTy8nIw91xu7rNtre6x1FoPEU4KjguLy82Rjvp+9u3 urq/ucbeyH743H3/zL7Tyb3P53lbREE/OEFIQE5kfe7Oz+vL0nXfze9ezl1Ft7VTsqy6ucm+QUg+ KDstJio4QDm9xNC8w8PHtulfx0JFS/9s4LbHurfAvcTIUVRQNz89OD1FSEvX1+PO2H1p3nlp3m5g WELWq8/MprO0vbe8RVosNjwkKTA7L02938rKz+rQ70nIUTtOVcu/uLCsrbq2udheR0I6OTk5SUFD aGtaV2dRSUxa6vv+z8Pa4M5IQbKyV6ejtq2ytFZXOSY3Ih4qMjA8unldwM7Ox8tJ28872sDZv7az ta+4v7fcUFxJOzlEP0JKREpKRENMSUBKTHbWx7u9v9LV3VBDSa65ZaGprau6sEQ+KSU2HiIvNjE6 verKvtXJ2vlLwMVMv8LHvLq5trTax7x1W1ZLREdFTF8/OEFCOTtBPz9JasrCw769yNHP2c7cPHWm u8+gqa6618U7NSInNR0jNzs3UbvcwcDnvslaUr3NTbvFxba9vbm249i/a3ZsVU0/PDxEPzY6PTc6 TmDz2tPHxL+/vL7Oz9jg6EM6r65Eqqavr+PBRzknHzwjHy9ARUy6zcO3Y9zJYD3ev2e6ucW0u8fN uMl2w3PqcVBhU1E7QEc3Ozk3PUA/SvvQyMC6ubnFzcBlSW5JMlqjxsqerai6+M84OR0oOB8qNkpV w77zts9JaOZWT8HszbTQxbS759a9ec3B+73Cd2BkUjY7Ni80LjI/T1Pbwry7wL29vOJi0lRDRFo9 Oqms26Opq6xi2EFPKR45KygtOkvWumXYu81KWVhLyedUwLfP0rvFzrq+zrm+2NHTZUhLNjI7MjA5 Qj9O8HPOvr/FwsfJx+xv5FZGSkw0OKeoxqapo6nl8TlaKx0rJiovMTzXrsRlysXL+khG1cBlXczC ubnIzbe0yszJ0MbtRERbTTYxMDI4PDtO1NjQx8TFwb/N0cjY7GtLSEFISkFesKmvrq2qtM37NzIt KisoKTFI+tbFv8nN1M/Vb/1fXnz1evnGv8K6uby6v8vdfl5GTT43RD48QkhWU2R1Ztb1/9Hf2tzY 4mx7TUxaVGHe1XnHrq+5trK7z9DtSUNAPDg4ODg9QD1GT0tJWXBs0sjT0MfI1crGzcnKy8jDxczH zu97eFtOS0JDQUA/PkZHTU9d7eDW2c/Lz9Hb195s3+DrfF/Gub/Nv7jGzMTLYFVXQDo1MjM4OzpE S0RY2dLSxcDNy8vS2NXR3M3Pz8nFv8bBx9LP52pIRT84Ozo6PEFHQ17n4c7JxsbHydbM3VRhVFhR THfEu8a7r7O5trnXflY7Mi4sLTM2Nz9OT1/WzcrCws3c1tXi7+jUzs3Oyb25vb++wcvpU0I+PjUy Nzc5PUVMWdzX0sfGwMHEx87aVUpKT1lKX8K2uriusLi8v9tQSj00Ly4uMjk7QFJXXfjNzdDM2t/f 2uP20s3LxsG8vLu9wb7I0fNPQj0+OTU6Ozs+SVFUaOvez8vExMjM1d9nWFNTZFZSy7a4urKvtrq9 xu5OQTcvLSsuMDM5Q1Nbfc/Hx8PDy9Pe5PLn09DJxL+6ury/v8fU6FZGPz89OTc3Oj0/SVNcd97W zcXCxsfL2Or+W1pmTk6/r8fCr7m0rbrI2UU2Oy4mKCotM0leRuvIyry/33XV6GjRztXEury6s7m6 t7vN52ZFPjw1MTU1Mzk/PkRZWfjO1MzGwru+wcva7E5QVD3TpKmwpq+vq+Q2KyYnJCgmIjnX2Ly6 19jI/EpKTlXKucK/srOxssZ+3tLraHNv787dSUZAODo1LzM9RE3t+Nm7vMfHyNHZ1mpMWW1ITO1J SK2boampuK69MSQdJCcoMiYzwbmwvdFlT1U5OEBOwrC0t7O3trfLXk7nz8/E0M/F1lk8Mi4uMS81 PUfwy8jQx7vBys/o6X17cWp0WEtbZUW+nJyhpbq1yjkmGR0eJD4xPdu2qaqvWDg3Lzc8QE+6q6uq tb/ExNVKUFTdvL2+zOteRTwvKy4vO0xOXt/FwcK+y9zY5OH9VEtGYXBHR0M68Z2WmZ6xuMRNLRoY Fx02V+Fsva2mpbk7IyAoOF97zbenn6KszE5JTOplWmLbt7e83kE4LzMwLi40TOLDxcnNxL7Kzfpf XFpmU1ZLSFBHRXaklpiaqb15MSsdGBYZKk25rq2urau2aiwdHCU/wKyoqqimqbTZOysvR9q9u7u+ wcHXUjUrKSswPnnt4tfMwbm31FVKT3Xee0lGRFPoe14/w5yXlZyyXyopJB0bGB0req2mpay2w9RI LSIfJj22pKChqbC7v9s/MC44fLuvrrnVXUdDOjArJyw73by8xnvkv7q+01ZCS3ba51NCOkJcTWuk mJeWn7Q7JSQaGxoaIjC/qZ+ep7PTQywlICMrRLannp6irb7xQTc0NzxT1bmusLjfSDgwMCwsLTpu xLa9ysvCw8fMZEY/S05QUz8/SWBIu5qYlJekwCgkGxkbGBwhOMKonJyfrc00JiEhJy5Pw62gnZ+m s2Y6MTg5P1FTxLy0tcPvODQtKy0yQlrEvr/Avb7IxNxaRURIQ09DPz5FUEmrmpeTmaTRLCQaGBkZ GyI6xqacm5+pvTsoIR8jLD7ataagoKCouPtEPDY7OkBLW83LvstoSTQvLzhIX9fd3s7Ewr/Azu5b V0c/QD46O1Fwa62bmJaYosQvJhwXGRgaHzHVrJ2bnaKt2jQoJSImMEDStaqlpaWqs77VTTs6Ozg7 QD9KeOF3Tkc/RXPv6uxiXFnky8bAydffYkxFPjYzQ0k/rpuXlZmeuzkwHhoXFBUZKXuvoJ2dn6Ss 0jUrIiAoNVnjvbKup6GgqLbjRz4+PC8sKS05XMtyXk5gzMC4ymNLQ1zSwsftZGVia3hUPDA3Wm3H oZqbnJ+p0DsvHhgWFxofM/S6q5+cnaCs2DcuListLy0yTbmro52iq6+xuN1CKyAfJy85PTo+d7et rbTRXE5k1OtSQkFj0cPNT0Q7Ql7d00m9npuanqq/OzsvHxkUFxskRNO6rJ+anKGubzo1NzEoJCcx frKnpaanpqans08uJSUoKiwpLDjgtq+vt76/xMrjST07SGdpdVVKTUxrem3awby/qJugqa/P6j4y Lx0bHB0oLDjPwq6hoaWvurzUbUguKCowR/TLvLaspKOpuMzZSjMuKykqKzE4Qdq8tri8u7/DvcV0 QkNLREVFPjxC3b63sbW1sbK+7OXgQjI2QkxNTElIXNjecFhFPT9QaVxQVOLIvrzDwsbDvcPI3m7v alxKPz9EXPtjVkxvycLNT0JHTv7i+mV50MHCzvRSS0xUYW3l0cjEwcPM2O9dRz04NDQ3PUt/ybas rK+4uLjB1Eo5NzY2Nzw/Pkvs0MrJycnLznlUXF5cUk5SYc3Avr7I5Pndz/FPSkthe1hKR0pa+F9G StvI1+PQx7/AycrO71lNRDs4PkxOTEnrs6ept7mvrrlyOSspKiopJSc2zbKvr62urKy2+D03ODo3 MzlM1cnHw7y4v7uyuN1PemhBNzE1Oz1GU2rZv7e9xsPI0+tgTD48PUJOS0ha2sbHxr68yVzOq6rE dcW3w1M0KikqLzkyL0O/sbCusrq8wdVKMSw1RD07S9K3r7C1tbS7z1FIRj03N0BFRljky8XFwb/F zdPrTD07PDo5PUNLbsy/vb27vtho6OtFONikpr/JtKuv3jYqIh8nKSMlO7qrqKioq7S71zcnJi44 Njtntaikpaqus8BWLiIqR0IzPt27tr/HzV182kozNU3pWkr8zc7Ox9RgT/7K4lBo4nxhVkY5/6Gd r7+ypqfNLycfHSElHx4uvqakp6SkqbLMOSYjKzMvMEy2pqKlqauttOUxKCksLjI5Vsu8t73Kzc7o TT09Ul1MSFrbycjO1nZm499qXFJf5vDr71U+P7Gerdu7qae7RDUrIycpIBwkTby6r6WkqKesyT42 OzYnJjRN5r61sq+pp67VQk/TSy4vOTxDST88TczJ72LUu7rM2M/Y4+NXPD1Oa2Nn/drMzM3W3lk/ PcSsyEu7qqy3xOJBOj4tHx8pMzpA7Lq0rqqvv7y4y1ZIRTw8SExEUNfJz9fDur3Fvb3O12FBOzo3 MjI6SWjiz8S9urq9x9TO50xBQEJLUVFUXmLsz9dnV3W+td1Zt6u3x77LXPteLiczOS4uOUftztbW yLy2us3r08zo/+R6aNjM6Xfk93N+593c9XZ9b11OQj9GTUpES2Hl19PPysPBw8vY2NbjY1pmVklK TEtSX1ZHStfB0dK3r7q9uMjp0fk8O0s6LzhBOThCQkX94WL2wbq9vr/Bvb3BytXbz9FnUmxtUU9V VFhYR0BHSkVFSUtVbezXzci+ur3Cv8PU295kUExEP0dRTkdGSk5a48/i2L26x8a3vMfAymNu9EA3 PjkxOj44PU5FStDK78y6v8S6vcrBvcjLyc7U1e1peGpYUUc8PD05Njo9P0pd7dPIvrm4ubi7w8LC 0mVXTUZKTEA8Q01KT1lVXd/Q2dDGwsbFvb7CxcvP31ZFQz84ODs5OEFRTFDq1dDMydPSxsXMy7++ wcfHxMTI0ehlVko/OjU0NjY2OkFJYNHFwLy4t7i4ub/Q7e3vXk5OT1NUTUdJTEpISVFcYPDXzsi+ uru8vL/I125PSEU+PT09PT1BSlBTWv3f4tzQzse/wb+8vb28vMXO1d5nS0A/PjYzNTQ1P0lKWtrN x769vbu9xsfGy9HQ2t7jd1ZLS0hCPDw/VllHfsXGy724vr+7wdb0WEhCPjs+Qj4+SU5IU/bu49bQ 1M7IycnJyMDBx8XBxszP6l9bT0I+PDU1Ozs7RFFb6M/OycHAv77BycnL0dze6H79XU1ORT4+7ds7 0rS/0MCwzt/B6FNJPTY2Ny84T0JEX9bt2L6+vLy6vsHBz9Lb6VtWX0VLVFNPX+l73tnjZnVhWlVN SUdTUFBZb/Dh08rIzcrIzNnZ2WFTblc+PEG9yTmzqLS+tqjL6u85PS4mIykrJTNQS9+7srWuqq6t r7XH3cxOPT1DPTlFQE/w59LGvcvKxeZNREE6PUA/R/nO0ce+vsbDv9NXV1BHPz4/OUz6SD1ooa1A n56otr6qR0ovHywhHRsmMC1XvbarpqOnqKq8zF9YNS05OTo69MnLv66rvbW4ymM+MS0uKSgsPUBs wLerqquur7XbU0c6My8tMDc4PuG+0kmml8W2nqWkTthULjQXHSMgIiBAzrOurKGgpK6/y203JiYv KzQ9Zq2uqKaloa61XEo9KCciKCksN0XBv7ayrqyvtszVXEI0LzY2OztF1czHxbiuylatnv3zrb+t P0M/LkYdIikqPi4/w6qqsq6srbhfMTw+LCozTd3Cs6yooa67sctYLi0sJy8oMEFbxMa1tq+vwcDM 6UtCOjhBOjxJ7mxwwcTAyMTCSkymrEGxuLatS9gzO0IeKycnPTVP57KqtrCzvL7iODY4PD43acy4 rK+rrLS7y1E6MDEuKjMxPHRlxby2t7+4xMzNTE1EPEA+S0VO1G/cx83IyL7WPN2pv1q2w7m96r41 OUIpOiwqNS910mbCvbq0vr7IVdxMRv1B/eTMtcK1us270etLNz41NToyQEpQzdC+v8m7wsHJdOtU SUo/SUtS62rl1s/D0c3OXE5FXvBa1d/Puru3u8fJdVhLMDE2Ly80Rk9P2MTAv7+9vsPD0Onf+OJm W/5id2Bf/G1mZOzg3e1n/OziWUlaXVhPVv5SYdnr4tjHytbR2ul6elpNSEZJRUpf18jFubCxtrm3 wetTPDgxLzIwNzpGWmLXysjKy8jN3vh4693k49vU087MyszPzW3v2Xz2TWBcQklHTElBTUtJcfTr 18/BycvL6u1rW1xUWllPVOC/u7/At7a+xMXMaUo9NTM0NjQ2PT9LXN/O1MjHzMbJy9Xcz9bU0dzT 1c3Q/OfnfVpfa11aXHRZVFZQVE5PTk5aXPvT1NnPzc/oamRSU1FQW2No4r63vL+7tr/Fv893T0s8 MjU3OTU5QD9MVOnO3c3PzcbOycrQzc3Jyc/MzdPW4v58bl9dW1pNT1ZOS0hPT0xSXXvs28/MzMzN 2+J5XFVPTk1PV1hY5b+8wL22ucLDvcn1YE09NTk9ODU7PT9JT33r6M/SzcvPy8vP08/MzMnGyt3Y x8zlcX1tT0xOSkpLSUZDRU1TWWb92tHPzczS0tfpcFple2P03ONeWce8ztPEvsnZwcHgdV9LOjY7 Ozc3Oz5IWvHY0MzPzMrP1M/Q5dzNz9PMxcvY0s/k7e1zYFVVTkhKS05LS1FUYXR16erg4fXl6fHv fvjt6Ofh19bsZ2T5zcjQzMPBy8u+xetqU0I4Njo3NTg/SlFp2sfMz9Dr29nPzn7rz8HC087Ex8jQ 4+1z81pISERISUFFTVdVUG3c1Nns29Xg5e527en+W1vp33Z83/pX+LKv0L2wsr9Lc148NyovOC83 OV7N1cjZy7/jW1Ft3GBe3ce8w8zAt7vf9fj36EdLZG1YQUxUT0pETl5dUWfNys3Yz8za/lhoXk5T UVhabdnzfuPPzWtR5LSx08GtsctSbXc8MS00PjIyQuHK1s/Nz9pNRlVqY13YwL6/v77Axst0XFFD VW1QWtjR7W96YVZORE75W0/7y8/f1uT58FlOV15YWm91+Phz//jka1VlT9atsL+yqq7VY35DNiwp MTUwMVG/xMrIydBuRj9NY2dgzr29vL/Ax9PQV09kU2Ff18zNyN3gdEw/PUFCSE5b/tbS39LW5HRl alJaXmryedvb8XtdZO/+bl9ayauvwa+ss31DTTcwKSk4PDs+0Le8wNxvY008NkZ45+XNt7W6wsvJ 1N9PSvzp+OPHwcTVb2FOPzQ6Q0RLWOXfzMjY0trkWk1YVF1iZOLT2nTy2e1bVunWZEtWsqa+xrCu ujk6PDc3KC9LaG9UxLe60EE+QEE1M0vSwMi+s7S2yNnY2ddJUeroyczNzszYST88OTc3Pk3h4/LM wMje3NrtY1daZ+Hj3dDS1/Jr7WhNSljoZFZfXsWts8S/uLhcPz04Qjo7P0trX9rh5eZWRDo/S09c /sW+vr/FwMTL5nHP327vz8nOytPlXEk/Ozs5QE1YdPDf3NHR3drc5u/q2d/h3dzcbmNgXVxVXl5R U2Xn7vXe2d7DtcDDvrvCW2hFPz46PjlCRU1sbuL02v5VW1RjVvDT3sbFwsDIwMfEy+9wYGtWUFBV Vk5QTU9PVl1bXFxgZ27k1tXU1M3Lzdbr735eUU1bY2no2dbf5vlfXlxdWmPt5+jj1tva5X7Vzs7Y 2crR2nZOSENBOzo+Q0pT+djPyszOysfM1s/S5fPp4X9ueXdoanf3dnd4+/9eU0tPUk5ZYeHb1dbR y87V4PB4bXt1ae/d5PH/b2NbVE9XXVdTWGb4+Ozf2dLT1dfb5vtrZ2Zuc2l7fnJkYF9dXl9t6NnT zcnJy87U5PprV05LTE5NTU9WXVxjffB4cvTl3ubc1dLP0NPe4ODr8X159fR8bW9+el9cXlxbWVpa YPvz8Onj3NfT2uLj6fJ2bWFcX2lrcWxpZF5rX1toeO7v5tra2dji4efq6/XufH379vlvbGdpaF5c YHxtZm/75ev07+3k/Wv39en+e/F69Xpsb259bWpycn51fP3x4ufu8Onb2t7m735sYV1cX215fu7i 4ex5cXB2b3B4d/x9dWxsfXj57ube5/tvfvD9bGt88+73+PD7dmtsdHb+cPj7fvNsc/zm3+vl5Ov/ bG5pZGNla21w/nVsbm5+6ubh3tjW3OTr/WdfYl9fZmpodfN7cG5xefb0fO3j5Oz29X1++XN7939+ 9vjx6+vx7OXucWJmY2JfZW109Pfu+Pz38+rv7+vs7Pry+Pvw/nN4c2pobHV+eW9rfejx7N/c3vT2 9fl2Zmhue3dtb3hyaGZsdHNud+3r7fb27e/xenT6/PT18ert6evr6O35c35+Zl9cXmVmbnzu6u3q 7O/z+vj8/PHv8/h6cnpxa2xyenz79v/47u7q6e/0+HNrbf379enp7enq9HNsZ19lZ2t2eHz88+3w +/L7evf06+/36+jl6u3rfm1iXWZmX2Rrffr68vH1+Pd9fnT/7+3s6OHg4eXt+ntubGlfX2NqcX9/ dm9wb3f+/vbs5+ji3eXw8u/7b2xscH76enF0cXRxbW/89P53fujk6e/+7urw8ft8e3t0b3V4cWtp aGp2fnv/8eru/Xt+fXJ89fPr6uvr5+ru+Xt1dXVud31iY8fMX0VBWtPLb0hJ/sfDy2VbfdHO2l1L TvfV2G5OVGfh5Ec56bSwxzowQ7620TsyQcq2wl1CWce2vWE8OlvEv+dHPUzRxM9YS1rWx81uTlL2 1dxhTVDv19t1W2PhztluV1dr4dz6UU9s3svTZlZh2s/T9Fpe5tjhZ1RYXOjedV9efd947F9h9NTT 8mlYXXTi6npyXv578tvY4ePf6fJuXVFWWW/q9F9XYO3VztXuaV93399uW1Vc4NXcb/p07tzc8/z7 +GtZUVZ/6utnU17xy87hbWNq287mVVVg3tDVXkdLZc3H11xJUerHzOlQTFXnzdpyVlN3zs7vS0lb 1sTgTUBO2r+/309GXNfCzVtJRlrUwdJkVVT12dfsTkpX5dXY9VdV89PW9GVnXHDobWNv7fDm2uTo 9W9fZW3e2fhqWFv11dT2ZWnr5ulmZGzn2fxZUlVu7NPaYFlbduTS13X95fFtX2Ps7exrVvvb1drr 61lN+e73aFJRZs7N9Ftw4N/S81tWbdzq+HpaYtrO0NtYUXJx3G9eaFjsZGXo4uJs7WT52VZgd2fg e+juc3Ns2tfY3mFMWdzhe+x7V+LN1OVsT0ha5NJzSVNa2snL2UxX4dbM2E0/YdbP1ufvQ2vY1Mzs bUNP6ubZ49Zv+nlnb1rcdHF3bN1c5uplXXLOZuLyUV1l0vDa2n5/T3Lr0NFnUkBK483N0eZGTuv5 08/QalDeVFXL1Pj54FhN0+t2+uZkSuBTfs183lXXTl3PVc3K1UlJbUzHyd1fTW5U7MfaXF5gVF/t /Gre1fDz39x29GdPU9fO699bRmbMyNLXU0ZR8t7q4u7m6GFUYuxn0s3qcE1NUWTS1NjRV09xX2Dr 4d3o2t5tTmzf3tLTckFJ4tnTydtZTXDya9zcXHbqVGPOXmtmVm9cy9Vq3FhjYf/f9+L021pL4dvf 5eNyVH3x59nfbmBZYGXP2nrmXVhs2W5edlpy18555eZOXuDY5+3fSEvW4tXS3vhXWVRa9Xvp2Ofd ZExe+NvPzNtgXVlXZ/jZ2WP3e1rw89vnet9OWOxVb/fk3Obcf//bZmruZFvz4edrc2Nmzc7q7VJD RHrNzMLPVUhMVnXWzN1zak9O3M3TztdUTlJVZNLM1+9PRUlp29rLzWxv8Wvf2PfkcmNdTlZZYd7m z8zO0evu7XH+bFtaYV5aX2JbdOP6b2RbWmbs4XJwb+3b2+Hybf9pb+3g2tjb+Xns7nb8/1NaZV36 4+DWydNFP9DFsaOqt+MxJSEoLTJJVFPCtrGsrrpcOC0oLkTKr6mrtslwUFRkXFJMQUBLWuXV0t3z eVpQUFFXcdrMwsPKzNl6XFNYT0U7MzbBpZ+Ym7VZJRwcHSgsNXJbv6imoKGxTyceHCJBvqmiqLHA 08jHwdBGOjAuO1nGuri841JFOTo8PkdW18zAur6+wM7daUo+ODQ1QHvmT0K5oaGUk6uyLxUVEBYe K7uyp5mhop67RCsbGBkp5KyZl56lwzwwLjM3TuFyxL3Nz/dIPj9CPD5AOUFi2Lmvr7S+3UdASU3z yuFRRj06TdPJ5UTWrK2dlKWu7BkVExMfKtGtr5yep52sUjkdGBogR7ugmqKmr1xVTUZLQkw8PF1N bsvk6N9bSEpMP0NWX9m/vb26vs/P02JRSj0zLzM3VLyxr79quKusmpzB0CQSFxUeN06qq66er7Cj +z4vGxwgMrunmpumquQ5QDI3Pz9PRnTNbMjOT1tJPkZNYG352+7Vw8W+vs/c+VhMRkY8Njs/Wr+2 rq7QOUO+vaOYq7XoGxsbGywx4b14qK6+nq3bzCgeHyM+yaeeqaaub8trOkM+P0FP1PLMwlpRSzpC TU1UTExIYcfBta+5v8lgR0JAOzg+PVC/uLKvvWItLMvBqJWlsrgeHB0YKS1EulutqLicoLu5LRwc GypRr52ipKfP09JIR0I/NTdUSXi+3PnYVUpSXElAVkFFxMS8rbK7xmk+MDExMEbl17atsrO5+TIk Ms7KnZeqpc0fJBsbJCFBSVuiq6SXqbXnHhsZHTbfopyjnqvOwVU9ODMxKjpSULm0wst9SztHY0JT +UhzzMy9trfBze49OTw0Olv60Ly4ury/cC8jK2/FnpOfn60mJBsXHh0tREWlpaWVobG+IxoYGitH qpyinqS9udpDOi0tKjB93buvxO5ZPTtMbGlwbEQ/T3jHsayvtcpCNi8uNkrUwbe2vL3J7UMoHCZV y5qOmpekKCAUEBcXM/3LmZ6flKO21h8YEhUjN6WXmpaduco7LSomKygx386vp7C3z0k+OkZCPUc2 OWbRr6Wlq8BHLSUrM0G+u7+83/79/s5UOCYbNLiojYyYl1gYFAwQGCC6uaWWo5yYtMQvFxMQGS+9 l5KVlafsQCYjJCMpLE25rJ+grbpBLSsrNz5PZEZq2sqtqq6y3TstKzM9b8HP28/51sG9veJGMB8d Oa+fjoyZnkAVEw0RHSa9uK+aqaGZsbk9GxcSGjLGmJOXl6tHNCQjKCsyNHu4tKOirrZ+My0tLjI7 R0Bcwbytpqy60zgpKS41UMrIw7q2trW3x0s1KSMgI3aim46NnaM5ExMOEB0mxK+ol5+dmLDKNxYT EhcvtpiRk5WqSC8cHCIoOmO5rayfpK+uVy0oICEnM0/cr6mrpa3IWS4lJCo86rOssK+5z81rREQ2 MTU3OzrCn5+WkKmxQRMVEREhLLmkpJegqZ/eQzkZGRocN7mblJeXqz4yHBonLFy2rqqtq7DKv0Ur LCMlMUPHtq+uv8XTSFxOPUpHS+fj0MvRy83Ix9jSZkBHPDEuL8qsoJKZoaUpGhgOFh8ttaydmqSc pd3YJBcYFRw7r5mUkZet2CkZHR4o6ryuqqqstbPDRDwqIicpNvzDsrOztcLA0U9WQDY8Oj5p0Luv r7C96k42Li4tLzI0dKidlY+YqOwYDw8OHDa9np6bn6+r2Tg2HRkbGy+1nZKSl6VKKBwaJC1VsK6t rLG3ub9vPi8mIykvRr6wrq2xwMx1RUE/Oj5ETtq/tLK3vPhBOC4vNz5X2ca/ysmvq6mfqMzjKBwi HidCTry7uK/Es7Ng3TYiJiQr3q+gnaCoy0Q0KTE8QtXLz8C4trKyy000JiMmLkq/rquutdVYS0FP Vk9bV1v22srHyM9kVEtDRk5cX2vy6+hq3rmvq6Kntbs5JSYcHSgtXbutpaqosF9OLSIoJy/fuami pKe3100uLzEwWc6+sbS2v9hiOC8tKC49dLisqq/BVjcxOUXZvb2+yu1sWGRpWFpNSlFZ2svKx+pO SD0/SnW1rKmfqre6LyonGyQpLtfFrKeuqr9dUy0sLys8UtmzsqyqtLDDfOc9PT47TktVeVvn29vO 3N10TE1BP0dFUu/Nu7WwsbzHWTk0Li85QnrJv7a3ubnMW0AvLS40Sta9tKuoqqSpt7w5KiUcHyQt ecetqbCuwH5kOjIwKzJA7rOqoqGorcpDNikqLTFIbs+9urm6xd1QOzYxMzxSy7ivrbG7z09CQEFM VE9NREFJW9C/u7jB1F89NzU3Q13Nv7u7vLOwraawtdYuKh4cISU767mssa+51tVZR00/P0xN3si8 sLOvuNLjOzU0Lz5IXcrUxcTPv8fP0lFAOTM4RPm9tbCxuslnRzw4NzY5P07nyLq0tLrG9kY3MS8z PmDEsqysrq+5v7/c4l06NSsoKSo0QPnCvLi5vL2+zNVqRkU8Pk1owLmxrre950M6MTE6PlTn3MnG w8HJ0GdFPDg7R/jBtrCzvMxeSUA9Pz5AQkRPfcu9ubrAz2hKPj0+RVd/z8bGvri3r621tc9DMyYi ICQtPc+4r62wt77G4PVcRkQ+P0Ze1MO3tre8yGtLQTc7PjxLUnHOxb++v9RgTkBBTVzcxb6+v8np Wkg9Ojg6Pkt0zLy3tbe+z2NAOTc4QE7vyMO/uLS0rbG4vE08LCUlJC0zTsvIuLm5uru+ysxlS0Y+ P0lo3MG6urzD0m5ZR0dFQ0dCSk9qz8a+wMjWXVFMTl544N7d5njj4N3eZU1BPTxAWdnBubm8xNRn Sz86Oz9IadPHu6+uqqmytno5LiQjIyoxRtfHubq2u7u5yMHuUEU2OztL38i4t7m7y9n7TUpAPT47 PUZiy724u7/OX0xIR1Ju5tXSz9vnflRRS0ZHRU5i6czGv7/Ize1YRz8/P0pX5sXAvra0ta62vcdD OSsoKCgwNU31yL65s7ewvMPVTkw8QUBHX1vc0su+vr7Az3NNQjs5Oz1N7cu9urq+w9x1UEREQk1Q edvZydbeaU9LQUZJW+fRxMHDyNZkUkQ9QkRS5c7BvLzDvbq/tsHSeDs2Li8vNDw6SUzp07qysqy4 vNhOQzg+Oj9MU9XCura2vc9rQDw8OT4/TPHLvLi1vsfzTU1DTEpPWmzSzcbN5lpFPz9CTHzZx8TF y9neZl1ORUpKUW/czb+8vb+9ucW8z0tNNjY3Ozk6PzdMWs+8ubO6uMfZ9klBPDw8SGLZwL+9vcLI 3PlLPjw5PkFQ37+1sbK8zmhGPj48QEdW6cvFyc99WExJR0lOVPbVysbG0tvlbV9dTUhOVOrKwcG/ zce0vrXBTkwzOTI1NCw4N2TDtLC3scG9yV9GNTUxP1n0vr+9u7u8z91DPDw7Q0hbTmnJuK6ut9RX Q0FEQjw5QFXNvbvJ6FVTbV9TRD9GZczJydh+49jM204+OUncwrrCxsfLs668vEw6RDY/Mi4sL1Jj ur3CwcO2vLxfPzw4TFRmVVTYyre4xtZLTU9ZTUBAPO/Mwr3SxsO4v89eO0FCT09PS1HRzsLNb1lT X15gSkZRadrOzOPf5G34V0VCTN7EvsHTx73Ctbbdzl09TTY2MDY9PdhY2dDOwMG7285uTlZMVkhf aXbKzc/M2tvi/FxLUkxd8Vx24ObYysXLx8ng2mpRTEVFS35u93hbXn7mffFeVWFq/fT4bXjc2uN8 W1BTV+vFx8bHy8PHy8nh3N9LXT08QThNPl5iXM52xtHHxs/IcP5PTUtJUU/v3NbO1N3Z5eT1Zl5P ZlFUZ2zz3cbJvr/L0OVwUk5EQUdOVWP079PPz9xtW1BSUlFTXXDu2tfh/ezx69963szIxsfYXca6 0dDqQFBqSD45OTVIckVm5dm9tLbJx9pUdk87O0JFWdXd5MS+xL7KbF1mUElMQET569rKycC9vMnk +01JSD89P01c3szSz9Db6WlYS05NT2f68Orc4evk2+jh3Ona1c/X0dhoTVa+yc3ITeLX2Wk6PDE5 TUVNV9/HtrC5ydppTVo9Njg6UWnNzMm4uba7yfJQTENAOjlEd8vGxcXBvcDWXUdFSU9ORk1c3cvK 0Or5ZmVjT01OV2p9/v/z1dPSzeTo6/r0aG5jX+7e3tXxU/zGycvJ39rU1WBFQzk8R0ZETFp9z8PD zs3a6upbTkpQX27e0c7GxMrO3vheWVRNS0tSX+zY0NHS0trb5PllWFxeXllbW114ff5rbGp05vPz evri1M/Y3ef3eHJfXlxdYGrlbvfuc/Nx9WRw4/bc0dHR221l4tnm92FXXHJ9X1pQVGZoWVBNUXDb z9fd6ffb1d1uV1pn//nq39vWz83N1/L6ev5rXV5SWF1XWldYVmXs693c3Nva1vT95X7vfFtfYWxn anV85u7u5P9sWVpna/N8eOnd1c/T3NHT8HtnXVxlYVplbXBteGRf53p3+VpaX2/s6+rr5eHc3mtq ZHfl7Px6d/Xv7OLkcG7pd2Z2XlJl9/fp6Ons4+Ho5dn7V/3v9+9kWl95+m1qa2r93uf9eGds69vp 5ebq6uPsXGn/bXlqam5yc1r36V9wb+Bqd9Dr3tf13NhgXXtdW3lnanVnbPTx2eBcaXl+2eZgWvjo 7dx/XWzh3fbrbFFi7X11Ymxz2tnr6mvx7+Tqb2VXYXPn93n98+Ln3Ohx9Oj1cWtpcWX86nVoZmdh bvT18el99d74a23v3t3kcHjz7u5u++v8aVtk/29mW2Du1+xebX/c2NbrcG1pcOX0WGj36mzz7lz1 6u3Z5WtYbGr2+mZjeeDk4Obt+O3k3/dwc3znbV9xYuLda2Bwb3RdVGBt92Vo7Ofi/+jk2dnv7/Hq 9/d7YOvie2V59GZuenNycGxcaf75b+Hqcdfc7ur0Xm34XXboaHD3fOzs8v186e7+e21nY27+9nVt fG/j2/Du3uT95+9ma2d97/1kW15h4frv6Ozf597u5OVhemlefWxqaWtrauP6cnz17XxtYG1vZ+zm 8+rq9vPi1uP572xo/XteXm9q+Oj09nDt7fHn7GZrfHv9/HFx4uZ5bG96cHpsXWR0/enn4ePp5/j0 9XZwfW9yeHz97Hn13u72/G9z+etuZGp++3H4amn+e3py9ux5euzj7Od4Zfbn8Hp3eHd9d/j/fX5s 7+dzbWx6//z6c/Hq4ettZl9sd2r95+Xr73v/ePfk+2/18uvr9/xs+/VpY2dkX2d2//vw/3fs6eTh 4+Pu8u5xaf77dHnvdnn0cHh3eHv973H65/dpbW9l+/5sfXhvefj09uzh5+ji9XJ/+Xx5bm1z9uz2 4eRue35pYWJeZXptf3758G7u4erk8/fl5PD0+3vybWZqZXvy+fP79u7+9Xx483BoYmVqb2987/zm 5uTf+frycXF5dGxlev7y7vzz9e3k7O5tdvBye/z5b/DyePls+nf2+Gt6a3l9+nVu7358bmr/8eTm 5+Tu7vR/bHT5dX50evpsanD28Xl3cPD17ux+7nz+9mxuc3/++Xx1b/3z8+X2dvjv3+D3dXh5bXlq Z/jxenT4Z19rbn5+fXn57vL55ex68ebp+3tzbvDq8/3xdnbyaWn6dnjz5Ot4enL+9/h2aWtseHV6 9/fs/Pn58X596eLsav/3c3ty9u/u7/TufXNob2xn/G9fZnF8+/537uXp6+jj5PPy9Ovu+2tkf/Dt 7/x5b25iY2xubXf3dPT0dO77/fpw/ml59frvfufr+Pt57X/p7W/4ev7y/vd2/e587352d2v/am5j Yux6bH3n5Ozq/+7hfW7q+G789m5453hobXFxbe5r/d/89enrd3D8ZfXm/vbv5/zv8GZudnZsc/5l +fF79/3p+e57Y3Vse/73+3zn9Pfv8f/46P77+XlrZmJebP58//VvcO3r7ufn7uXm6+7t4+nf6O7i 8O/yeWFaXFZVWFleXV9faf367enp7ezh+Pz5+eTl4+vv5e3q7P/7evt58Opxdm//6urpbU9Ky7u8 tMTk5PjgSD8xKC41P2DZ1824r6+zv1NCRT5BQD49Tc2/s7C2u7/A1XhKNjI1PUlieG/ZzcPAxtlY T0xTZl5cVmfp2s3fb2NdYF5bUE1j79THz1/srq6vqtlaVEZFLC4iITdBz7m3u7KorbbNOiouNTdF R03esaeoqLd/TVE/ODssLTtyv7izztDI3dpTQDM8WFzExtnZ0snbzmg+R0hNYOPg89vf2M3M6FhV S1Jrxaqusa3jy9pDOiMlHyU/Ps6/tq2opLLKRi8uNTg0P0rTsqmpr7TK5Gg/MisqM07PtLa4t7/B +ko3Lzc8S2vUycC5vL/QXkdBQD9HSkxY8svIv8jdzvj3/ltrTnizq7Owv3zaWT8pJSUkN0pkz7iw raiw0k1ANjg9MzlPyreurLGytcRnRDArNjY1TNvQuK67xsplSk5ENz5PT9i9ys7E0/v3XkJGVENP 9lpw1MvU0t5O+9nv3n9aULanurm95MLIWysoKyc1PDQ50beyqq/Gy8P8RUEyLz9nfM25tq+sssHL +z46Oy4tNj1Y69TKt7K8v8zvUE8+OU5RZ+XQzca93Pj1TkhDQj1JY2re18/Av8/Z2ODlWc2xz8u3 y7rMYDovPiopKyo4UM3duqqurq+92NxRNjg9PEJd2cGyrri6vdttVTUsMzUuROTrxLu5urK9YvpO Q0ROQ0bcaPrIxd1t+UdO/EpDUub8zsbdy8jH1/jtTM63Ynmyxr3D3nVHfCoqMyouLT5Cx7XIsqqq trzB9tZVNjhESUVX2NzKxdzLwdpf/GZXZlpJT11JTF9VT/rw5cjCyMXAzuDgWkxHPz0/QURS/NzP w7+8vMXQ6HpSSMlvO8a7xb7AwM3LTjhGNCktMzAxREpruru5r62zsq69x9BnXE8+ND08NkVMVFBt wcXIxMDF1uNj7kxCSUxMTHHr8ODTy9LS2dfoXlpdU0hITlBMWOXV0s3ExL/E0cnDVtu8UNXtYt1P +z9fPjVLOT02R0E/Y0/Mzce8uLS7tLO9usfP11lQPkc8M0E6PURNWv3S48bN0c/U2mnebGdpauj6 2NzUztLW4ftUWlhIQ0tMSmJ+293fz9HRw8Blvr/fvuPP8WRpTV87Q0Q9PT5IPkFGVF9q38/Cw8G6 u7y6u77JxMlhdU9IRzg8Qj48R1NMXHzY3djNztLn09jb4ufT6N/Z3uhw7XdgUUxQSkpOWV9jcN/Q 0MrL0r/P6Lvg28j1y2ru9mtbP1Q/PDw7Qjs+Q01SWtXUzsO+uL27t7q7xb7J5NdZXUU7Qj82Oks+ Qk9e5Hbbz9Lb0sjY29DS0NzSzNx29udeVVtNRURITkZNW/nj4sjIy77E07fD1Lvpydto/UhQO0I7 OD47RT1EUVJpV+7e2cfGvb6/uLu6vL6/x9V25UdBQTk/ODxAP0VKeFdz5NbN28jKxczNxtDO1tPf avteUlJQT01ITklLW0v8aXDY28e8w8evxb251L1X8ExGPjRDNDo1Oz86TEpmWe7IxMHEvbm+vbe8 vsPDxttQX3E6Qkc8PjtAR0ZCVfpe9NjO2s/EyMfOxcfQ0NzP8lxkXlRIR0tLQ0xLS1dR9ezt1dO5 vOyvtse1ybrP7ntFVS82Ny8vMD02PUZZ2+LIvLe6urG1u7m8vcje0PVISE49O0M+PUBAQkxOT33i 8tbHzs7Fy87Hys7Q0+Lo32BmXEtRSEdISlBGUXpbcNbb68iz0s+sxLy5xr3k1URMTC00NDAsMjo2 RVBkz8bFubC3ubC2vbu/xM7Td1ZTREM9PDw6PT5ITVF16tfV0MvSz9jU1N/R1trW0dTa2n1mX09O SkZESElETWB3Z93I1seyvdKuucC6ycFc3T83TC4uLjMuLkA6R2zdy7y3u7Svtre1u77Ezf/h7EFJ TUc8OkBFTTxG/nRbV83X4+P90tfl8c7H4NTQ19fh3frqXFBuU0tER09KUU5n0N/Ty8jLvLnju73G x/nEUlxROkY7PTM3PTpDRU5Z2NbTxsK8v7++wb/FzcnMz95zdVxWTUVCP0I/QUlLUVlj7OHVz8vF wMbIyc/P6uD9YWVRVU1NTUdPT09dYHP+4NPQ0tTO1trZ3uvt4m597npxZ/h/aHllbWldbmL+dH7j 9utwbf7+cHPm6vjyd2r/al1YVltXWmRgfeXf29nPzs3Kz9DV1+NlcGNdXVVdU1JQT1dSVFdeaf7b 2dbT1M7O0NTa3u9vZ2BkX1paW15ZXWBhbHXt4t3Z1eDe4Pnp+ex0aHRv9O7l5u/vf2VlX1xdXl9d XF1mZ3T87Ong1dTR1NTc29rn5PdtXFZXVlRUVlddXGRufeXn2tvZ19jX39PW2d7q625+ZWFeWFlR VFZXUlhdY3R539jU0M3Rz8zP1ubjemdlWF5TVllVW1VZWFpdXHh+++ff2eHZ1tbR2Nbk6N/56vj3 fWJlWVpYU1lUXWll+/zt5OHa4d7d3d/t5uXo4+bl6/duZWJaV1RSTlJXV19v7ufd19LQ0c7MzdDS 2eHvemRVUU5NTk9PVl5dZHjx8efh4uDe19bZ2d3f7frud29mZWdhY2Nvcnx3a29qbWltcHD99Ovt 6eHj3t/e29zc6vl6b2pqYmFgWlxcYF1ZYGNqffTd2tvX19fX19vg5vL1c29pXl1cW1tdZGtvevfr 7fD/9+358H59dm/5dnZ1cvLq6O3t6/L07vH3+/75/vd6ePv8fnX67fL07fh5e3dtampmaG9yV1/F 0m3nTnL+TF5PZ+tf7eLZw8zd1N3M9VleTPdeXmJ01d3lat9VVU9DT0/dT+/L6cXL1NHQ33Be6Fhl 51DxX/N0UuljcOhsfOTsavDd4PLrfm5qX1ZbWXFhXeja0nHHv/HFytXG2tJITnQ7Rj08P0JOP1/c 2dXDwMe6ur/Ex890dlxES09FSE5PTGJtVmzkdF/wd2bp4Gxu2Nzi09XS1dHcZd7leXxNSHuzvW+2 wLi152EyRD0nKiYrMT5OU76tq62tr7O3zFs8OTw2PDo/fsq+vLq3uLm7y/VSRDs0MTE2PklX8crA vLm9yMzdZkxEQj1ETE1g38nHx8jEwsnVckHbqbjEut+5xto8IS0qKC4pLjnNrq+rq6+ur8dMNTM1 Mz46Qcu4rKytrri62DsvLS4yNTg8UszEwb+/vr3D7FhUV1RQTUxTaW1ZX+rc0svLfmrT5l1aU0BL raauqbrAu8foKCIfHCYsMTlbs6ifnqvA4UtEOi4oJzh2va2ur6ypqrXTOSsrKDBPU9XKvrW6vVQ6 OTU9Pz9Ka8q+uLa/yNdfUUdHSUxYX2vazc/cY3NIUq+qrKu6vtTd8ywnHx0iK0hdv66so6KnvEQw KSowNzhB5LeooqOuvsf2TjUrJSI137SorbO/yNlIPS8qLDhR2r7ByMK8u8LXQzU3P1zgz99wyr6/ xvZPPj3FrKqpscvUWVE7KyUdIC09xa+sq6qrschKLSUoKzvoxLayrayus8pOQTQxODpOSs+urqmy 4UUtLC0yPT1X2Mq2sLS81WdFQEI6QUxTz8S9vcDH7WdQP0A+Z7Gqpqe0vlU9OiwqIyEqMHm2rKis tMtHOS8sMTREzbutqqqtvNBLOD89PkNC9dC9r7Cvv2JAMS4vMztJb87Fvb3GzPtVTUNFRk9/1sDC yMzqZ1pZTEFISFTBraalqLXSRDIvLCwrKzM93LaurLPJTzYuLC89WMm7t7Gvr7G960U4PURU293O 2tW6t7fLRjcsLDI6Ufrf1tTHx8vNdFtTS1Fg3cjExMzjeFxZaFxVT0lOxaumpqy+fjoxMC0uLCwz Pdm3rq2600w3MjE2P0/Qvbiur7CyyfNAOD9CZuHYy9HOxb690E07MS0yPlD32M3IwsDH22lMSE5R XW3t3c/GydbbeE1KSVJWR9euqaequMtMODMvLSssMkBmv7G1u8ZdQzozNztJ2r6xrq+zu8nyTD87 OkJp18S9xcW/ztB7PToyLztFfcvOycvPx9DvY0hETE9a3NrbzNXZ0PNbXE1W82rszbapqq64+0o9 MzM0Li43QF7CvL7C0ltGPjo6QlPYvra1urvAz99uS0ZHSFrOxMjJyM3JzmZHOzU3PUhTfeDm1MjH y9hlUFf25eDd6dzPy8rVXU5NSExQS0pOXtzOxb7Cys7Kys3KzdnsXFNOS0pGQz89QUpOX/vq4f5w Z2Zva3v05tTLw8LEwcHBwcjX2t5dSUpEQUlMTlhUTlJVU1lqZmL+5drNy8/Q0+h3b19ibV1XZ+ja 09fp6tHLzszKzczIy9PjVkRAPz9DRD8+RExc6+trYmBw5Nnb4d/f1srDw8PFysrFxc3tYmdcT0xH RkhIUGFmX1ZSU1pgYWhq+dvOx8bK2fNzZV9cUk9XaeTT1ODi3uPq6evy3+HbycjLzc/Y3+heSkE9 PUFISU1UVllp9PP2bVpcaX3p08rGv7+/v8PL2dv4VVNdXVtiZ2VfWVJPTUpJTlJdf9/Uz8/Y3e9j Z2hfZ3J7/Ont39DW6fp8b2x6797P0NnPyczOz+BgWlNNUVJLS0tJSk9UUVVVUlVfc+zY0tLLycnJ y8zOztPc5v9p/vZkeuR9XmRmVVZTS01VV3Db91hd39ne3+rmdlJYZ1pf3u5XctXY3Nfl5dbd+9/H vsW+vdnl3GNMSUE3Oz47QU5PX9nZ/PNgV/3m8uba3My+wMHCy83P3GlkWU5QS09r4+B7allSTkxO T19yd+7h2s7Jzt56Z15ZXWhs897k93praWpcVVRZfdbpb9e7r7W+vsXIzU83NDM2Pj06RW3Nxsrd VU5aV0tQXefCvsHCwb/Byt1gU1xeU1haUnXU3ubrZHfxWU1KS1hn59fc0NPd3nFbXVhPT1BTZe3n 7vfv7dzhYlxYX9PY7tDQwa6xvrvL0tJFPjUzOjQ4QT9U3WV432vn7mZ1ZuDX1cfFwr6+wsjO33tb VEtGSE1mc+r5aef9Y1xSVFhcZ2nz0c/NztbT2ul1UU1MS1RWVmFo6N3m52lv2ujz8H7s2cG2u7u6 vrnNaEk5OjExMC45Pk9s4sbGwMTN1d/u/PBs89nMxsjFyczL0/tZTUlJRUhNVXnv5unh4H1zXlpe bens5tva0c/T4XBWS0tNTE5YbOfVz9jc3+z2cG5z8ODp1b/AxL7Hw8bZbEZHPTs9ODk4Pz5DYWDf z8bDv7u/vsDEys/Tc35cTkxLVE1WXVNe69jc1eDt2OJvWVpOUGBhX/zj9NrS3drZ5259aVpmZVte b25z7O/j3+Ht5+h96uv79O56bXP07u/e+Xfk597l4+1092taUU5NSk5PUl5239bQ1NHP1dfb4PX3 d2FwenL93uT48W566O9tZmNaVVdQT1xo+uDb2NTU29nW3+73aGl4bGj7f2369nR97n5qbWhkbnVv bG139fxyb3n95t/e3OLZ2dribmRZWVpXWlxfbe/k4t3f4ex8cGVfXFtfaWr/6eLe2tTS09fd5+/9 cGlhWlVUV1VWWltjd+nb19TT0s/U1tji9HhrZGBcWlpbWVdXV19rfvLv5uPk4Obp6vDx7unq6d7b 2tnc3+Pj+2VbVlRTWVxcY2lxcnZ7+/psbGxtb/rt6+Hf3d/a1dvZ3e3/cWZbV1NSU1VZZfjm3djU 0tHQ1Nbd6vltZ1xaV1ZaXF9bXGJocHr59/fr49/e3N3f4+vy8/B+bm1qaXp7e/rx7Ovr8PXycnRx cP3z7vX0//19bmljZmJlb21wbnF5fn55/vTs6uvu7ejl5uvs6ury+v50d3p8fnF0f3t3bXR8dnhs amlrcnzw6e3r5+nn7n5ubnZ58/v27vJ7bWxveXZ3cXf9/fX3+vj07fD48fD2/v17+/Pz+XhtZGFj ZGl09ezn5Ojs9fr5fvt9fPn06u59fv7z/Pv3/vr39/t3cX39fnZtbm1pamFfYWN57uTi4uHe3uPp 8vp+dWhgaHT69/X18/By7dHP1WlNTFVy721SS09y2dHV7W/02tPX9GRgeOji6XFeXm/m29znbVBu 39LTZk9NV/bf8VpPT3fkzM7dcW/t3NnfcmBmbOjh9GZaWmjp3OBvYGV07fJuXl1m5tXV3fJkZX7h 2+F6XFtq8ej1bGBocvjz+nj87uPh8nVrbPXq83toZvzg2+f6b3Dw+e35aF5XVltocXVyfHN36t3Z 2dnd5Orv7/X1cWNaW2D96+ftc3P97O71937x7/J7bnT67Pp4b21zbm1yf/l3bm5v/fLo9n5+9+/u 7vpwcH757vxzbnr48u74ffjx4tnb72xhZWn57m1cWV/14N3q7vz06ut8d/j6amFgaXJyYF1le+bf 4Oz+fOjb1N33bGBga/v7bGpr/u30e3d6fHJ2++rvemhkevXn4Onz8/9y7d3e/GNpcvPw8fdzaFxf bGpsY15l68/HwsDBxs/b/F5NQz46ODk9Qk5ffeTUyMC9vcHJ0+Xp6mxZUVJXX+/a1tfY2eX4eGpe U01LSkxTWWBeTWm/ubCvtLC+yMXcXDstKygmLDE5SEvcxb+2sK6vtru+zuhxW01CQEdRZtnMx8nN z9rvX1RFPDg4PEFNYebXzsG6t7m9xNDrZVdNQjw7PD5DTl5OYrmuqqywrrXH2vFSNSkjJCUmLjz0 zcK4r6ysq62wvm9IPjw7PUJFRkld2s/BtrCyvMnfUjsxMC8vLjE9T/HKubCusbS3vs9oTUQ8ODo/ SE1a3czH1mnDr6utt76/yvJRUTwuJR8jKTA5TM+9t7avq6mstsDQYUQ7PUVCPkBP69PP1cq/vLu/ ws9rPzY0MjY1OkVX38m5s7G2vcbeXklGQj07PERW+dfJyMz3WceuqKq2xMXBy2pNOi4lHh4kLzlF cMGwrq2sqaqwweduX0Y7Oj0/PUFczcDM3tK8s7S6yu5HNS4vNTg3OELowbm3s7O5xNzrYko8Nzk+ S2Hj0dXc7lZSxa2mprHBxby8y1o1KyIeHSEsNz9H27Wqpqeoqq660m1YSDoxLzdAUGzezMrU2sGz rrXSTkQ+ODMyNTk6P/S8sbK4vLu6w95PPzkyMTZGdOX2beHOz2/csqaiqr7Ju7W9Vy8nIyAfICcv PkzWsqahpayxsrW+7EA3MS8vNT9X7NnLwLy5tbGwutZNQ0A5LyoqLzxR3cS6tre2tLS86UI8Pj07 ODxJb9nOysfRVt6vo6Gs4lXFs7dMJh8gJCYmKC46XLqon56msbq2sblTLigqMTw+P0pY1LqwrK64 xsnHx+c8LysrLzY+T3ncwrWtrLTG331fTjszMDI7TtrIxc3PyM7cvKumqb5hybKx3SkeICkuKiAh LVqzpqKiqK+wrK25QicmLT1IOS82YbqsrbO5u7q2uclTNC4yODgwLTVZw7e3urm5vcPUXEM3NDk9 QkVL88S7u8HNaVC+p6Kr6kC/qatVHxslNzglHB80w6ulqKqurqekrfErJDFQTy8kKl+xrLTEvbKx s7jFZzkvOEQ5Kycud77I3syzq7HG3+z0TDs5PDs8Qnu/v8/cy7zBSlGzpqjDRMGnrFUiHzJBLB0Z JU/IwbmupqSqqam3XTMzTEktJSlJub565rioqbnJxMHTSzk7Ny4sLzxNSlPItrC0vL6/0GVPSEI5 NDxQ+NnY2szGwcRNP7umqb9BxqClZyUjRuQoGRgnWWI/36yio6usqLHeSURFNCYpO1NQQmG0qq+7 u7Cvv2lbaVM4KysxODk4P967tLW8u7m7x2lEPTw7OzxHe9XZ3su8ucpEOriisFM/tJ6vMCpKwzkb Gik+Nyw7uKaqsa2qp67MUj06RTorKjFYzXHruqysub62scFsUEU8MS4uLS45WOLNvbCvuLu4ud5A PEFBNzY9Tmn028e7u8x3WdisrE5MuqepOzPn1j4iICw0Ly83ULWus7WyqavYTN/HTispPPNPOUHP tbO6vcO1ssHeas1bNC41PDEuOWXa4si5srO6xM7Q1ko1ND9GPDlnyNPn0L2+wl9LsKtbzrGvqkBN uUg7ICQ5KCwpLMq4uMS9qaixwdDC0jY1PT5LNTzwybbH0Lq0t8/JwMlzP0JANi8xOUA/Stm/uL6/ uri92lNORD48QExETWnev8XTztXEekW4rUPKqMirxk24Mj4uIjgkJjM08+xXvK+ursW6sMPMQlTT PEM7TclQWnXHuc3Kzcq51OnSUlE+ODs1OkNDUGfLu8LBwb7F4PhUV05BTEtGTVz6Zm7Px8v+6c++ rMnzp73Dtj2+WCwxKDsrJTUxU95Tzri1uLmytMbB0e/PP0VZQUdJa+1v6tnBycu+x8fPYFtUPzc4 OTpCSVzk18y9ub3AxMXU7l5HRD06P0NZV0ngy8XIxL7Lwq+6WrC1XbxPXe8yNC45Lik3NUBOct+8 tL6wsri8v8FodlpCWT86V2RcUW7ExMzMy7q/XOFtTEo8PDk8QEhoauPGur7GvbrIXkpjX0E3OUpP S1Ff1sbF0M29vc3eyb+4Wu+uXNjdR884Ozk8PSs9Pjw/TtPNwc+5s73AyL3W++VKVExP+F9kdM3D 1vba0GzzVz9hUkxQUmRb51/w0NTa28bXzcx9+llbUUVKP09TPVZt58zQzdG9v87M6Nq/v0XTsWTb zeTRS0E7QDgrOTgzPFlmXcW+uLnCure73ODD6l51W3VdW2xYUEpob0JIWG/cXtzGz9vf0e599OXx UWjW3Vdj6HBWT1hVTEdUXVz04dfb1cbU7s3V/srcaNbtzc7pt8navWLPWT9EMzwuNDcwQEdiWsu8 u7W4s7S2vMLB32FWQz44OT08Q0ROemzfwsrDtc7PusPibHFMUUhHS0lLSvhbZtDh6ffZ31hfXlxn W3Pu9/TV0XrF22fK2dpsvsZKsMZduPfVTklHL0AsMDkyOD7KV8S1ua+zr7i4vO/PXT9IOTc5QEc8 TmHbzM2/w8bOwc9exNZIYc9kS+r9XFxd7WpUVupsRFdzTkVY4Vdf2u7r2s3Q0NPUydzeytpZ4dVK VslmYs/qzfXU41byQVpDOz0/RzhW5d/fxbm+ur29v9nX21FJRU4/PEtIS0584uHMysXHzsrDZnzG Zljh3VZR/mZWTl9aW09Pf1BLZOticNTf18nK1NnZbO5qSlRcVnBjXNfY68W/67rF1r9qw0dYTTlV MkQ3QEdB2lXMxb++vbjFwcrzb1JIQj9GP0hLUOfz0NXPxsjEztDYbdRsS+fiTk7dZ0776WZc3m5q /mvg71xn1+hVeetWXW5oXWRsXmlqf+vo2s3V2sbJ19XaV8nbOMnSTFndyDrU0EtvTdhFU0tP2UFp 295d78Vb8s/h+F3S8X77Xsxwa+Ld1l/V7GFhW/RV6epixublzs7wXM9TWWleTUz2TFxbVW1gX2N/ X2ns5HPg3O3Q1tLYys/i0uPeWl3SWEvQ7Vne0ORty+peYV1PS05CUE5NWHt0XNLT2czM0d/c6XBw Z2toX1/26nbo7u96duXx32Xw2OHZ2czf4tv0YldeTlNPVlxUWl5nWGL9Y33gdf7d5e3Y3H3azOLl zdbjf2Pc507Z1V3g3s5W69dSW0liRkpISGtIaG3i9d7E39POztLj1+5u+WFnW1thYW5y7O/x5PHj b9TVYtTZ32rb41bocWxXcF5RYFFlYl5gaGphbW95eePp59/k5+rWbOrM293TyOvv1k/s6E3qX/Vc 9c1P1ndvWk9zQGRIUltT+1rOb9bO49blz93o4nf5Z/70bHpu5HRu4u95cXRi2PJZ0+Ns3s7tbtn8 Wlx6VVdiVlpdXlJzZ1nv8nHt1eTb2ezb3/jv1vtz1dvp7dL8UdTbTuV8+P7w0lzdXnD3VFVOd0RO Wk9UXd343M/PztHU09z5dfpcVVxaVV30ffPp3/lezc1R0cHrfcjKT3fhXU1UW0laTV3yYWbo0l1r 32tYbt9lbXfr9nH219rw1s7S2c3P42Xw11FO/V9uU+fiWORk21xbbVVZSe1eWG7p22ba1t/g3dft /eFsZVxkaVxvavv+397q7vDQ/NnP5tTd3PpzZlFXT09PWlhafP3q6ufr8vF7fG5nY29+a+jp9t/Y 1ejSzt7f0txOcNRMTeRWX3ng2G7OaNvrT19OWD9WW0xie9d60czPzc/O1eRraWhST1tQVF9zc3Ha 3Nze0M7hztvb3PXsX2RTVlhLT1NoZe3Z4dra1/Z39GJcWldVWl9ebuzk39DP19fS1uXc2HVdffZS aWxu2PXR3dbeXeZWU05VT0ZWUF9b/eDb1N3O0d/f2uteV2dcU2Fu/27n2dz43cJ5+cHUY+7PWE1r UktMV09pfF/YzujmydBf8O5UT1ZUVVtVbOnq6djI1NPEyd3q0u1TUF1iTltb++xc1NbU6PjTY1xS V1BHUVd1avXX09Lcz8/b/mpoVU5RT1RieuHWzdDV08fP79rZ5F5XX1lRSEtRT05i4d7bz8rO2eHt cVhOT1BMT2P16dXR1djSytnc0Nr0++T9ZFhMS2VuVFnfzPHWy9DTZm1TT0g+SUxTWt/Oz8bHyMvP 615dT0dHTE9abOHPycvTw77P5tzTb0tMSE5JQ0pf4V/z0cvP3uDr4mxRVFlbVllrdvTs39PQ4uDM 0HDfydlvfN/lY1Y+SepidVTbzuu+z91eTl5HUT88Rn7P3crHwcPI3XzwU0NCTEhQXf3VzcHIyNHs 1+nsbOTaceltW05JW19RQELUx+T3ftvQztZSW/5YVl9vY1ta6MfN6nzZyNbr3+/y+XdgVEtIYu/P 5nC/ysbUXV1ATz06SUZm7sW+vbrI1vFhRj4/RE5e7d3IwMXN09hfSUhLZs/l6c7Gxe5bSUVLRktP beTRxszN0+hxaWpPT1poaV508t/Yzdbu3tfdaltWY3zx4tvcVU1x1cXQ+dj4z9lORzg/RE3+U+vP vrm/y2xSS0xKSk5d2sjCzdXc6nhOSlHgycjK09/obVNDPkVRd+z37Ovl5/Du7eTo3tji+HhwWFJj bfvv19DQz93nZl5jUFFVfN5kUHXKvr3UflZU7k5EODlO/MTHzNDayc3bTj9CUdPLy97l19XYXkxF SV/m1/f/xrvAym1GQ0tSSklRYN/L0nFeYO/W1uhjZvzr5HldW1373tjd4tba3uT+XldbaO/n19na 3FU/Qte9v81kU1huekc9PkXvxcTObV3q1MzrTEZT08fI2FdOVW3m5nlZVN27ucJ9Q0RO9ulaU01n 1dXvUkxW+M/S43RhfuHY7l1UWHvc3uzq29PV1XlNUGXf1N10Xe3S2lNG4s7Hv19MQEjkVX1RRPjn ytRfVERuz87O9+rk1MvcYEtITvrRz+JWVs26vtdOQkVa+F5XU17hzc/7V0xQ88/R7ltZcNnU6F1O UWXi09d6aW/VwMjtUk1W4c7hYfvEw87vTERDUFdaZ1JYfNLQ63pST1JXX17l0cjBwsruXU9NXuza 4ODec1VT4srJ1WNXVlRUTlBd6dDO3nRdVl1k/flkYV3z3ero/m9nZOzf1df38nzk2+nf/HLezs3j zc36WEtbTFZkTGFYcW5ZX0dUZHvfaP5dd87Lx8/T2uTY4fRjXGN36GlUes3J1/tgV11cU01OWnTi 3+/08/jo3d9hVl53497b7vTrblxu2XhOae3t3d7d3c/N09fm09Hc7k1OTUpSSlBOVeXf31xRT1nd 4+pja9/TxMzX4O/Y4NriX15YWFj1y83ga1laW1tPSU9h5NTa9nLu4eDn7mVYZvXi3t7pb3Pt8Hlu dXbu1+ZseOnf3s/R3srC1FhFSEpOXktKTmHd3dhfVFVacFtaU/7NxcHP2u/n2uDlZmvh2/rszsLJ 7VpIR0VDQ0NU89XY5vJ/7XtnXV976tzXz83T4HZqa15VVm3h1tTU0Nvf6nPVv8X7U1dYT01GQktu 6WJjXV55+fZdVldi5Nvb+enMycnP4unr2tpnU1fgwbrGfVNUWkQ8Nz1Y49jr49XN03VYT1ZaavDl z8nI1PZ1bf5dTElaz8fKz97lyrW7Wkpbc1VBOjdA7s3faGDf2PxXSVBn629cdOTKxs/r/t3f23FX +9rZ497Cu8fxVFZQQjw5Qljl4e3Yz89uVVlfXlFYYN3Jy9PZ1dTbaElK98zV/enPyM7dxsN3zM9W Tzw/ODpMRvXq28/S0mbidVRTUGNc69/bzc7Fys/VbWJVV01N2su9xNTP3f5BOzxCTE1VZMrDyNLc 1XpPREplb3d62MjJzepubldLSV7cy8jQzsG/wslo2NVISDc8PjxQPWXc2c/7zuTQ3F9sX3ZTVlp2 0MzHysnGzd5jTEpd3M/Z6c/K111HQUNIRUVM6NLY2NLJz+1eXmZbWFps283U7erg4lxWb2nn3NDQ z8jKxPfKx05oP0lDPEs1SUtYdWLH3L/Fz87m0FZXS0dZVPP13MPFwMbMz2BXTXLXWldm3edwZlFc Wk1KUm9pdXDt1M7Xavl+c/Zv7HX3+GdnbWtj6tjMyMrLzsjMx8tj711VSDtBOkNFQEtN3N3Oycq/ yczlcmJST0hPV2Tf1cfExcTJytT7TkniYEhJVuRs8FlT5/BvTVxmZO5m9PDZ3mnq5Njh7+l53+hs WE9qaG/k3tLPydBrzL3Q53r6+VljQjtGRko+RVVX7+XPy8fByc3N2PVcWVdUVl9pc+nX1dbQ0N/e 0Nr4XVxXTlhOS1JcZmXw4enYz9Dc6udnXmBcXV/7/vbu7/Ns7uXl3tvZ5+bpdGRoakxL8dDR1tHO zsfI31tTUUhAPzw7P05s+N7QysK/wMrT2enzcGZfWVpbX/XY1t/m4u77d2dfXFlUWGRuYF5r/urr 5N3e2dfa3Ob5amBbU1ZUY/Dq1tHR3OPe/XFvZFBOWmPm3dnS2cnGzth4b1lOTEBCRkhMUHT27tzZ 0M/Ky9HS0dPe7G9fZF1eaWdoaHvp7fJuZmpqbV5cXWBjWVhd+97b19bT0dDV3/t6anJ8aWNcam5q b3FuZX71Z1ZWXm/Wz9PU18rKztLvd15XWUtLS0xPTllbXWNu6t/SzczNz9PX3OT6Ym1vbHlocXP+ 6vt4empoXV5lXmRocGl09f3j7fP+8N3b3eHe3+Hd+GdqYmFhZWhjanp8dfn0X1tmbOXX39/t5NPc 1Njf5Gv7ZVhSS05PVVZXXGp+9t/e2Nvc2tzX2tzn7tza2eL69215aWFiWllRV19na2VkY2v+93nv 39jV0NXd2+3zbG1tW19YWmlu9+7t7+Xf7v5jZWppe33q8Obd29fc1+Pq7GpvXl5eW1lVXFpaWl5h Znnx5dzU0tTS09fc3+r8bWdlYmhpXV9p/HlnaGVhYmZbXGnu6d/Z3dTT1t3o6X5ram5qa3FyfvHx 9fnz83hrX11kcm1mannt59/g4NrW29/v+mlcZV1aWlZXVVtjbPj97dzZ2dnb3eDf39/g5Ojs/np7 ZmNiZGFbYVxaXWRrZvz1+ebi3d3c2tve3uh6/m1pYl1dXmhqbXp2dWpiau7k4+fw5Nra19jb3/D7 dGljW1hWVVlhXmBobXz87e3q6PPo5efe493V1dnd4vZubmNbXmRiWV1hW19qbW/+bXH27ebu5+Tb 2NzZ397j7u5lbGxgZmBpXk9UX2/aycvM0tTP2tZuSUdCRElPX2V73t3W1N/tdXrwb/hvXW185tzb 2N3i4eDc2+jt9Hl4ZWFYVFRRV1xidnhv+OHh3uZxZWr09+zd39/mfmt+8+3nY1zozL27vcHne15N Sjo1MDE7S+jLxsC8urq/0mZFP0BCTE1b7dLAvLu9ytxmU05HQj89RHrGu7i9ydjrdFZHPjs/T/PR 0uL4fejjeVRFREx6zMTGz+fq4Nva6fxgSkzGtLKwvuJYR089NC8pLDZXxLu3ury4uMP0PzMzOFXi 0MTHvrm3us5SPDQ2O0JNUF3gvq+vsr1rRj9DQj9APkjXvrm9zl1HTE9LRz4+SOrAu7rA1+XWzd07 MHq+sKWuvGhIVTk7LiIlLEfBr62zube821IzKysyXMm1r7W0tLa/dz4vLTM+Tezay8G6tr7WSzUw ND1aybm3tbG1vdNNODE0OD5TbenRx8PJz3tKQ0RGSldz3ci8ur3E0/w8K0S/tqmvvM7owWFCLx8e JjXmurG0tqyrttE1KCguVM27tsK7sq6y0UEuKjI9TF5VbM23rbPFTTIwOElt1cfJuK6tsMVNNS83 Oj1APkjrv7a6xOBWT05OST8/SmjLu7m7wtDsWltJLy5avKulq7XS2GA4LiIeIzXIrqeprq6vvlcv JCMpRM6+tru4srG3dTktKzVL4MvJwr24tMFTNi4zSde/ury9vbvDXTsvLjdK7NzV1s/BvsXsSUFE T2NkWlNh2MfAxtPl7e9tVEk1MNOvq6m0x/ne2jcrIx8rVLivr6+yr67EOichJzb1v8XFubGsrb5H Li40QVleYt+9r620yUg0NTtFS09c+cW5t7vMX0ZDQj5AQkRW2sG8u73I2OhiS0VCPj1M3sW8ucg/ U7K1usZFPUDT5Dg4LTBUx73gfN/Is7PNPjU9WNHI4k1qv7a4x041N05yX0dFaL6yuMtfVVhZTDw5 QGLOx8bOzcbI3FNDQ1Ls7mFWYuDX1edz99vcZ2hjUFzczeJISLersbP9TVFO2TEqKytN37/Fbsu/ tLjmQjQ5Utvm/ujNubW1w+9dS1BAU21N53jk5XTiUFdTTFJZbl598F1u5tXV1c/Vzs3M2lFFPkJP b87Pyr/CyNt4TT5ARlFy5fdO3rO2vL978WD5XTI1NTtaXfJXXce9u8PcYWbd1GVGREzg1tjc28K/ vcbgelRWSDw7PEVMX/Lw0crHzt7ecHjn4t3v3+bm097kfmJYTltYWXn43M7IydTeeFRNSUNFUXdV QM+2ycPP79PavW0/WEtVTT4/QVD46+HTyr+8wM3d23tPUE9PYXnm5NzK1+vjbl9LSElKVU5PU1/Q yszR1szOztDm9mnr2e54WV1lZelXTFpr8dvYYFR62uD2dFVb6PFbTVt2XGHsy8DFx9LUy87aXlhY T0xCPj5CSVBv3ce/wsTNyr7La0xGSkxORkFY6NvRztHS0Nrm4ntPSEhMZ9jT1s/N0s/Kzt/6+3Vl ZVJISUtNT1xtcOTW1tTT2e1pYWpnZWxv9Gd95u/a5uTsad9vbPpTZl9q8vrS39rS3t316PRkel1f X3ne7upvc1hdd1VVTVhqft387+Xa1NPW5nFrdGX83+Lf3dDV2+ZeT09TVWVmd2T94m3q9ntzZeru 5t/pcud74dfs5F5afVjubWDgb9ndYPVPVVZPdGR53erZz9zP5+byb3x8eHnZ/tLc5eRMWEpNT1b8 V97RzcjK1ON9althVV1Pbfx+1nPcc3z7ZHlWbm3v5N7j2/Bsbmpf5l3p6n7Z9+ry2XDdY3TmV9JO 5G5g20/aTN1jYt5Tz21/3WN55VjuX/zp7n5+327TaeVpee3u9Hj9dG15d3PrXvvca85o3+B14nRa a2p3/2T5W+th4F35XHpm9Od94evj2+nXfPFlb31ZYVxq6nrW7dzd7uBw8GVsZlpmXu9m1tzb5etp 7mdtXlxkbmfZetjY9thu+V9RYlT2X97s6/H53Xjuff5baNp42tzz9fPsamBcbF546Gnjdm38Y9pu 9+pv2e/e+ehx9mZw/2L2XWjiV89g1v5/4GHpWGJbbnJr3Wbce27abuf5/+3kdNlj32l28Hl18mFq du5f6GH24Wbee3nnWd5t+dz77fXf6WrsVmBoe2Fue1jgbX7id+3s8fvYYN3hY9ltaN1n7PxXaHpT 4m9f42Pn12bTYV58XOvn/OP97tJ06e9X3Pdj6Fpc02N90FLh/GDeWGptXuX+W+lrZNb14+P9avXn avj7Zm7+fflmbm/62M/Rzd7x725qX1JUT09ZU2h059rd1Nzd4nvm8eR2cm9seft2bnRld2lsb178 c+rp6uXz3u7nb3v+6/Xu/OLu631kY11gYWBkZHx46vXu6evp7+7p7vbzb/Py9Xx2a2lvb//q/OPx 5+j9+mltb2psZGlqcHj59Ozm6d7q4fD6bf94/WhiaWj1+uv++uv57fL0+/z+eHdq/XL6dvl86u/k 5fHp/vj1aGFjX2RtbPr6+Onm6+Ry/HB153bu6nHucvDybXNqb297c3FvbHd1+PTx7+zr9P5+7/vq 8Onr7+59+nB0cG1rbW97f/d49G937/HteX9+dfd9fG5sb3n57uzu6u3s7vPzbW1nZXhtd3B88u3l 7+br6ert6+/9bW1gaGp7d/7u9uv18f1tbWprdHX/bHJtcHP26fbm7Obr6uby7vr1end5bmRfZmZv dvHz7+zy8313/v7y6O/i6eXu8nBwcXFtYmZq++vm7/T88m5sbG13fvX5+ft+9/nq7/ttbHRvbvvy 6/Z5cW/3/PDu7Pz+b37n4+n8/ndvb/736+74+mRnbHnr9e35eHZtcf778vf5cnlwbW10+fx6cnZ3 ePfn5uXj4ubp8Pt2aWZvevt9c3Jva11Uec7M2vptXFVaamt27+h/cXHq2trZ2+ZyXFxeXV9u8fpu amf+6d3bdOnFvs9jUVleY1VJR0xm3s7O0Nx199/aeEdESl3f0s3Y4tvVz9j7XFZf7eX/WU5X9NfS 3PNfYm1pfGtcXHna2ORvWV594OB4ZF5l6d7d5+bt+PNtXVROVE9JSlDru62sr7a8xdddOCsnJy05 RVDXs6qmqrlvPjo4NjU1PFXIubm9x87P1XBGPj5IW+nS1NXa7v9iWkMpO5+cnZ6+tsfUzSEeGBUq POrU36+ooJ+5MyIfKjhEVEPOrKWep81JU8fGbEIxNU3tw9VQQkXvXEY+NjtO18XCubq4tLnIUDw6 Ny8sz6GdmqO5tn5BKRsaFRw54bCtsa+vrskzJyEpT7ytrKypqqixSS8uN1ni5urawL27wlo7Ly4v NTc5RVjavbe0trm8y/JFOj07LSy7nZuaqb/HQUkuIh8ZIj7BqK68v8rBXjElHihGuqakqa2ura/L NyQmPMu0tsLIzMLB4j8sJiovQ1JKT0/Ou7Ovv9xm7srmWE9PWD12qaKjrLm+XUU8KyklJC04br+8 wexgW0M+Pj9X3sW4sa+0trjA1k44NkrSwL26xNHrS0I7My4vOj9Rf+vVw72+wMza5trd8Gdd4+JU PEm+sa6srbjfRz5BQjQsLS0zT9DHx858VlVVUWVhX9XDvr6+w87RcVdc58C6tri/1Uw8Ojw2MzM1 Nj/6zszo4c/Jv8XIztLIxtLtSjctNrmmo6Kpu1g9MzE1LyssLzzfvLa8ylA3NztK1MC9t7a7wdJc VnZgT1VP7batrbbZPDQ0Mjo9PD9IUlrm19vKv8LDy9fX4+Te9U5KQTYxPrainpymxlwrJC4sLTw3 PGVk18DDyfRCNDI877itrLXLfUZDVFjfwc7mv7Wzsr5dQTIsMjtBTEE9Q0txzsS9vsbU7u/o3tjV 9ExFPDQwRKyfm5iktWAjJSUhLiwvSz3avb2tusnVLCsyLdOvq6KtvXo3OztG0s7Nzc66s7S/Yz8v Ky0yRWBj6fT+3NLHxcvUdFlg483Jz1Y6Mi8xM1mom5eWnqpiIx4aGyMmP27bs7eurLvARCsmICtH vaSfoKnNSzUvOkvIu767vLm8y+BINCwnKzA8es3BvcjM1N/a6dbX4tXre29STUZAQUBJvqafm52l sjgjHRkeIjHjzrW1vbfCwstMOSwqLTjLrqWiqrbcPTY6QmzHwcLAyc7V4XBRQjQvLS49bMG7vcjd 52jn1tDL2OFcTEk/QUVW0X/Ysaqin6WqzDQoHR8iKEJM3MLRvcHEvMzaTDk2MTxWzbWwr7O/0vbs 2NLmZ2RVXV7v0djaU0A1LjA1RGnLvb27xMfK5O117O1hY05ES09h5mpazbewqKeprcxKLyQkICYu N3fLuK+ysrvYWT42NjZAV9zBwby6vLm6vsXlT0dNWnbg1+ZqTkA/OTs9PVFb39PLv8W/xs7P/GZa WU1EREZQ8d/7z7ewqqWmp7VaNCMfHh8oMUvKt6+us7jLY08+QkA8QUVZ5cq5tK6vs7jGckZGQUtg WvdWU01GT0FFPj5FRFvuxb26uL3C1OZdTUc+Pj5EXc7GysO2sq+qra25Uz4pIh8eJi1AzLmtq66v u87+PjcxLzk9a8a5rayrrbbDd0MzNDhE79fFz3lLPDw2Oj9KZnLPzb+7u7nAzG9NQT5CRVBj8dXH zWTnu7WqoqentzwrHRkbHitDv62qqKqyt9NCOS0qKS9H2q+opaSsut5FODc7PFnQv7e6zFE7LSsv M0jzzsvJydDBwMC/zG9SSD5BSU1g5ujgWjNeq6aWlJ6lOBsVDxUdLcu9raWupaKqrV4pGxgbJMih m5ecrc8/Li42OT1IRN2wp6SrzDIkHyMuSNna3mfow7Wtr7nnRDs7RU5YX0tJSU3dfjy4nZ6Qk628 HxMUExoiL2Pfrp6fmZ22XB4VFBovvp2Ympuo0UguJigsNu61sKqnrsB5NCorJisyOk9jysW5sba0 vM3uWk9PVVFBPUA/UvPMPzSfmpeLn/QvEhMWGh4eOfW4lJScnOYlHRkaHUPIqpaXm57IJR0cHzK0 qKejteS+0kxGMSkrNjs7TURBxrOyr7pgRGHUzL9aNTc5QGnP7VrWVjqlkZiSnComGRccHCAcLLWo mJGlzD0gISEpKDyqoZaVpXMnHB0wx7atqrOxsW9CMyoxSsvgQzUmLmy+rbDUQ0jFurCyWj08Olpc QTw5VMKrsi7Kl52Sli8lFxUfHi0jK7KsmpOtPS0eIys/O02lpZ2buDckICdOs7SwrK2ureEmJCcz yLK+PTgwNsnM5lRSVM+ttMTQVktefkc1Ly9BtaakrXAmHaiVnZLFHCUdOD0mJRYkr6iWmkI4MUvD 11IfJ0q9nZ6tWjhJbLS8PjA/88KqyTY1P8W6tE4rKixAzcNtWFPOr6epxlc3LTI6MzZK06+npKvV MiQ6pqqnpT4/RUrZMSgcGCQ5vaOpqqmrqb5kKBwfITjDs6ikpaKkrco6KiIjJzNN066rq7DEbTgu LCw0SuLEvriwr6657D8sKS40R820rayxyWldRDUsKkvBvKqqt7Sztr1MLSAbHy5Vvre7t7Cwr7xR NiwxPk7yb13zuqurqrJeP0A5NDtFO0rKxb3G+kk8TmRucEZDYeDIu8Pc6dbOwcVbQjo5RM2+5UMv WKWprKr3X9fSvD4kIB0lQ9y5xcutpqay6DQpLjtBPTY+3bKhoKzGPkXta1U3Ky9Ws7C/YEJmzLzF QC8sM03sxsDEwr65xfVQOjQ6Pk/Wu7jMzz/bnqm3uz5Z1m7aLRsbIjrAtbC3wq6lrlgtIyY5UeDf Us2soqKt00Q6QFtFLyksQLenrcFbWNDJWjApKj3KubW0urm9zF00MDE0Q+3Kys/HvsPhOEunpbG7 2tva9VQxIR4qRt3R82p3vKaowzwvOU78Szo2Pr6qpam2vcXK5TImJi5CWMm6ubi3ucNNLy4yPVp8 0srBurm/6EVGTkhKTUtFTOXPx72+dzzoqqm3znXbzcbqOCsiKj9DQj9iv62kq8NNO0hSQC4qMUq4 qqqvu7awscQ5LS0uMTZLZdDCuq+2xf9XRzs6ODlJ6si/yMXDys/qaE5APEJW6NfNyM9PTK6mtsr5 2szI2zkvKCpGUjssM03IqqixxM++vMo8KSotPtvAvr+wq6ipvk83LSsuNTI5+LqtrLK+zl0/OzYw OE/42ce8vL7CyupIPTs/Te/JvLzDzOdmTTgxRce+vr66u7m4000yKy0yNzU/U862ra2/1Whw6FtM QkdP98S/2VpUdfFveF/fz8jBxM56WEI/RklIRExS9MXByNhy7+Xp3fd582jn6lVSXeTb0tFeV/bY zt5pWV16am5aTFRs5up1X2nWycnOzdPX2W5STkxNWmBbUFBdY+bd6fTx19bZ5mhnZW7u7eff2tva 1/tobGNybX1oV1lTWm9sZXbn29LLzdftb/34bVRRWmrhz9R/XlxkdGZYTlL82cvL7fzn4tzde15m eOzt+mZaXF9fV1hbXXD679zUz9Xc2+Pg7H59av7m3N31ZlZPTlVZVldWc9LKyNDsalxiX1dbXXbZ y8XEy91nUU1NTU5Wc+Pe4d3R1t3peWliZmJaV1946uLe3ub+cX1tcHvx5OjzamptY1lO6L5oT9ff 1+bablX7W1l+blXr2eXO0nVXWlXiv15R/F3tVV5aW2RLVuza6cbLzsHTdU7f4k7vWFJq5+lf3fxr 6ltXV1pYT+HaZ8/a4NrZ3+/V8Hxp6Pvu7V/uXW9WX95FVvN35m7bWsXEYNBZUU1WXk7c2G/3y87L 0W55Y2lnXEla7m5eyN781lbjV+vWYNn78dv4ZHBSV1tOYGZvb2jX597D+ezr02xo111OXdhLzNxO 01L+aN7QWdxeT8z94fld91XWXWTr7eX6zl/a0mBpUV9pXvJfWO7U1Wbg2+fe6mdVbmJW+G3v3OVt Xe/i/Xhu8uvncWN5cl/z4+bk5vns3dLpXvJfT2N4Vl/Ycf3sz9nx21pUaux9VGtgYPrp4H3i5OLd /3VedOprfmtp/+DxXG7w9vDf9+rV5HD9Zk5f7mZn6Gld49TwXulb+M9/Z+/V8P3ffGL7Z2VnX19k 6eTg5+vd2enh0OVr8eFzYWRhYHZwW11cWlleZ2BZWGP32+jz/enZ2dDv/dne2tva4FZPeuf6bWRz bGzo7npSSVpv49HiOjmroKuu1j477VwqKyYpVLq0zdThzbS8UiwoL07AvL3KwbK1usJ5R0zb4G1k REdc6udnXUxKTEhDRlBq1sfGzMfCyd3xcVBo2FZKSkc4PaGZqqvBPU1MNR0bISRsrLe9vrqrrsQ3 HyIy7bS3s7OupK/rNictQO6/x9LLyLe4zkU0PUM/QTo8X8/Dwc9v38rSXkxLRE92aGDk1+3WxetH VMnAXDJNn52orT83/0cvICEmOq6v1c3v2bfERSsmNm28tMm+s66tzk4/O11jWNv50cXFzTktRry9 ZEA/TdjjPErYw7S0zE1RXEM9QkNJXODQxbu8xN1OPTk3OjgvvJSYpandb2suIBolND+3z06zsbS6 RS4mKj08+b+4pqiywUhRTkVLO1i+t7PA5lxFV9JxSD0/WE5FPUDmxcjOztTe52NNVe/zVU1V38bE 0fbzZllIQD8z3Zydra/dvb8yKR4nQTjUUTi3tbS6QUQyLz0uRN3DqKuutn7P/UQ/MkXQv7PDysPr 229QSjxES0hQP0T63cnN1vBY7e50dVxgaFpbXv3XzcXRVkxa9GBBOcGgpay13L9vOTYjKjMuXlhj ub6ztdleNC00NUZb47exsbTCz+9PS0hQ7NrOxcO9vcr1TUQ/Pz06PVTYztpvduba1uVmWWzeY1FO S/bOztf77dnj/FVNZGBZ3r66ura4v9Pd12xGPTw+Rkpc/kxGPz0/Pkpga+fYycvNwc7hcWvd7s3I y7/IxL7GzPlf/U9KRz9ITElJP0BKU3lv7tfMyuD4+ezV19LWfu7t7eJsWFhi7su9wsvEvcHV/mNN SE1IQkFDVVdGPztDTWDb397Qx8jk/W5n39XMzMvDxcbL0tDd3tTa2+5pWklCPzs5Oz5IVX3Z0tnf 5XBlbvPb1MvBxMXN5ehlU09NTktkxb/BwL7AztLeW01OUkxEQUFBQUFGSEpVa9/Sz8vP5OPj3unk 1t3UzMrJz8zN3d3e08/b52pVU0pAPDg6P0ZUZe3c183L1NnWzszNz+Jzfenb33b93t34X15raVxY X2llfN7X1tTS0t12Y1lXV1RWVVdaV1dTT09WbO/h1NLY2Nrd3uPs5+Le2dDJyczN1ulrT0hEREpK TVtibnd2/2t26urW0NLP1M/Nz9hwaW5eU0tOX3Xu/m10a2hqX15cbud+cW/y4tzT2N/d2NDP1N3q 7PluZllRTU1PU1hVVGRyevPl2NnVzdPY3OPj6/VvZGpxf3lobWxoaFxZV1phYGFjdd3X19PX3d/f 1+H17OPd4fJpXWJlX15TUltiamFm/vDk3+Tl6uLc3uHx8efm9GNeYF9mXVdYXnBx/Ong0c3Q19/f 2dzif3F2Zm5kV1hZWVhVVlVcd3X86d7Tz9jd5e/6+erw9ufn5uXv7fJsZF9eYmRqaWZ4/X1waW91 bHD78ePc2drf3uHr7Pt2bWJhXl1jYGt9b25t/PF69fj/6uPd3OLp7/LsbF1dWmj09+jt8+je2uV3 b2hobGFgav7q6efq6ubwefR9/u5zcG148vH5alhYXVxmZWzt4dfV2dna2d71cGNkbmtxc3f3+f9q XGRqaWpodvfo3N/n8294fHx1bX7p39ve6/P8+/xoYmJs9vd3d3r89nFoZGloaH10+O7p4ODm7/v5 /HZsbWxvbm9zcOzm5N/e3+br7/h7bWx1cX5xY2ZiY3BpX15fcufd2tvb19zk7fp2dW1wbF5fZXf2 9f3z5eLd53xrb3RnXVlaaPH2bn3v5uTl9Ort+vHn8vbu7e339W5sef31fvro5ujvbmRdXVtbX2Zt /uvh3t7i7Pf37Ozvb21sfH16fnv9aW35+Xhy/Hp06+949+rf3+xx/3dqdvvv6ehv68/pa3duYFtP S2NiVPrb0sjF09LTeFdJRUdLT0x0xsLJzcjM13JlaVhQT0pGTVlx3s/Nz9ng3Nzh6+prW1taYXn8 7uXf8u3m8Ono7nLza2ViV1dSWldjdXzr2tbZ19vT2+tsZHFfYGV9aP58au/kdXDhd+7pYF9tX1Zn b//se37i0NXV3fjd1utNWs9LWbpv2LbLycTJVUtUNTM7Ni5FS0TIw8e8sb3JvfRXZ0o7TVJFXN3v 5cfj3cfgXXNlTldSTFJYRy06na40nKGlmry8ycAwFCUmFR4eHtuzwMyfmbOrsmy9RyUnQjMuX7+w qaGxpqLWXz87KyoqIzc6MkvAzcm2vL67wV/Xzko6Msmd0vqbqaKt+rlGTBwZMx0ZIytFxbvMuKG5 V77YW0ZFTMfHZbaoqLWrrMbGOjM6MC0vSkc9VE9g0GRO4mpDP2b/R+DbXey6nra6ma6qrly5NDUl HzUcIDQvRfi/vbiw59PHRT9LPTzKYlGvrLCupayxs11xWDEvNzgvN0A/Rlpj7dhOV3dQTUp0X0xW cayv1J+jrKa2q715SCw+JB0pKCsyQVbczWvQzFhR+Vs9bsn+v7eyq62trq/HedlPOjpJPTw9QEE8 Pz9OSD5FTmJT6sbY1c7CscW3prSsrrKvy8RgRTkmKyklKS41N0VEVNhb587K19zDyL66s7Czr7O3 vNPa40RHS0NAPEU8Nzs+RUNBSE5qdGPN0MzD6Ou7vr6utK6tsbi/uOlHPS8vKigqLzQyOkdQZ23l 583X4svsv7u8trSutrG1v7/Yd09BPkA+Pz08P0FGRUZGSk1JTmT8797e8uvGwr2rr66qra22u95Q UDErKikpLS8uQUVBXWzc+c7L98rezL3FuLmztLawuru/zvxYRT1AOTo7ODU2Pj0+Rklj8t/Pz83J 0mDau8u7r7aqqq2zs7LrZEIuKiYmJCstLT0+RnjW0s67zMu71cq8v7+7u8Cysr24us/r/Eg+PDcz MTAvMzY4RFxu18XGwcDFycztVPHR0bSvuaqptLS1wU5GOCooJiUqLy00TEtt1tDUv7vdw8Lbx73D wLO7v7C3xrvD5uteRT8/NDM1Li83Oj9TW+zR0c7Kyc7Iyt/i69G+xbGstqurs73Dzjs2LycmJSUp MzM39+XYwLzCxrfL08LUzcW+yby3ybq3wsjH6k1OPDg6NTY9Pjk9RUNHXHz82M/LyMrDxcjI2Obe ur7Nqq6/rrPEWVw/KzEoJCsqLDtbR/i3ztK8xPLKv/rHxN3Fu8Dqu7z1w8DW1tZgZW0/PUo5Mjw3 MjtGRFPX08i9xMa9xMzKzNluYUXssF3Bob67r7zZP10tLTMfKTItLl6+Sr6vxMC+xOu/6Eq97kv3 w8ZovrrBv8jLydtJS1Q7NTs8OTo/P0tYVdjBxse9u8fNzd34Y0pFPzZFsr7do6etq768X0ctIzgn Iiw1Qkm+18euxMzazWdS1D1o0Fzq27rCub38uLTI7NjVZ1k+ND4+MjY+PkfwV2u/v83Jw9jMz1tS X19HREVJSNSssLKprKeuwM86PjEoKCInLDdEWcrHu73Cwc/eZWFcTVFN/M/LwL2zuLq5vr/U2mhN Qjk6NDQ4PkVIXnre3s7JyMnTzdzvXkxJRkhFSFd0cL+qqq2qq6y11XQ3MjArLSctMzxPTtnXys3d 0Wxx925mVOrZzr/EvLixtMvEwL/RWkZATT4yLzc9QkY/R+7N9eLNyMrN2Vjz23RbWX7dz9VTzqOn u62srLpvPyguLyAfIiowO1louKmwvby2v99rREn93kpMv7m3vL26wbrLRE9YTD46OjhLQjlI9mxM 5e3lxchq5r3L6eR3VvVlQ0tWePBFRaeevbKmpq9cRCcsNB0bIjE5PebCqKCvyrqyzzs1NENRRD1v rq21vLOps+c5S8k+NzJBbEI8Mk3XVD5F0s3eV/++u8jXz8bJbzw9WVI8PFz2TrGaqrOgpat4QCwe Kh4ZHixCSsqwp52ju83C3zUpKS88TElnsqWmrrGtrco7Ojk6OzY2R+9YTlrh2W5fTWjeZGzv5c7M 2VVc4Uc9PUhv/+PMur3CnZu5tLawyC8xHiItHh8kOc7ZvbKpoq3GbWjePSwuNUXh0sS1qaOts7K4 fy83PzEyMDVFWt5RU8zI02JWWm/3YFlvzM7vf2lpaGFx5c7d18HPdq6err+9vLVXOiwfJygoJiAx 2ti9saysr6mt0HNoSzovOTk2XsG6ubKrrK641l1BODQtKiwuNkRU5si/ube2t77FzmhgVUJDRk5W /8bHzMC9vMLI7UU9PDIsMDo+WMvEwLSusre6wND1XEZBRUNLQ0ZST1VNV15ldV3z1NzZ3vTX0dpd VdXa3drSxsS9w9HM2FhDP0M+OTc5P01ectnAu72/vbq9xNddTEtEPTw+SVRm4NLJw8fJzs/eY1tS Xl9aZfXSzM7R1NboVUhGSEc/QkRCTmpxbunLys3Iy8fCwb7BxcnX1up2WUZIR0Y+PkpLT1dt9Pfb 32ll8OhvceTc287KyMLEytjj8VdOSENGS09NWeXX2NPJwsXQ4+De81VPW15vdGBbaO1VREVHR0RH UFtz99jKxr29vr6/v8LIztbY7FhKRUdHQz89P0VISEtOVl/v1M3Ev8PEw7/GztXq6OFqTk5cYVla bPB0ZmVWWWly9/bY0+Tu9uLpZV5UU1xYVVV36e/17ODg4nVobXT99O7d09LRzsjEyM3U4HJXTURB QT1FT0tOT1vp3dzc2drc1NLX0czNycLJ2+vleFlZTUJDSVr949Hd5t7Xyd9RSEFKT1dlVVr808zO ztft6tTP1t1r69LO0GRYVE5gY1lNR1Vr8N9pW1790+JncHn47uxmU2Lzf9/ffu7VyM5k17GrrbjF xebgXy8lHyMqLDlDVMmuoqOtus5tTD4xJyYxWsS0rqqrqKWovEAzLi4vLSwuPd3FwsfKyMjI1VlN UGbveHH2eefU3GdLT23t4eLaTj6qmqCpz1jaNlEoFRgaMWv4rrisnZqcwS8nICgvLCsu0KGcm5+v vN13NyMlIyNGrqess7XPUVAwJiYzWOXJv7+5s7XIZU5APD4+PUPpvbi3v8lXNqeXp69EM0Et+SMV HiHetrKq0LKkprIxIB0iQ8/eyrOmnZ2n5zAvLS40MS9NtbWtq7naPz81ND07T23Dv8rP5sHE3ltE OzU9R0VP4MG7urS5xMXqLkWfqbnJMWtOwtUdHyAvucS92FG1r6/wJSgtXKyzvtDCrq+8Ti4yRNy9 1GxcvLJMWEw5YV1rRT55YfrkVW/eybe9z089Pz5LSj5mz8q8vb/J1OtHQi8o0J+dnqnO7lREKBgY HDG3ramuta2qsUIlHh8z37y4tq+ppK3dOi0tPFj9V/XfVMW5vb/pWUFBQzk8OkvEuri8vNRHVUk/ QUVz5crAzMvTyNU7Nz04L0qkm56esUZFMSwfGR8nV6yopbK/u81rNiYhKfiuqamywby91kkuKzJK v7+7uk5VyL24y/Y+OEo+Ozg4Z8m8usDHb2RdSlFQTE9s2u3QxsrWUEVLTT43vpydnKFMOywpLR0f Hiu0qJ6lx+Fb2GgzJyAtyquiqb/eyr/GUi4oLW+1sbXbTEBOsrO9ZzQ7OExGOTxNu7KvtttHNTxI SVNJS2vRwLq9yd5NTFFKOjeunJ2crkQ2Ki0iHB8gR6+jn67LX23eRi8jJEC2pqOtxd/DyfU+Kyky zrSxrMJM8Gfh1WhHNkFIS11ITe/AubK26UU1MThBXVzZztzDu7e87UlHSVRNNDa7n5ubqFozJyko IiIfMsutn6W34ODFXD0qHyU+uKakqLO6vN1FLiUmL3auqq+9ScuwtLw7KycsQlLieuK/r6243TIq MD5v2c737Lu2s7fjOS44RF/lTznen5qantQxJCQrJScfI0e9pp+hrMC/UDUsIx8hOcOmnZ+ntLzi STQjIy1Huauru8aysrfZNCUjLDhq0MvKxLi9v9hEOzxK7NvxUEfoxby6yd77YlJUW0o/P0pe5bWp qqqvvPlBNSkmJCcwVbmwqau1xVU+Ly4wN0zowrqzsri/zNzs5m1XSEVOZsjCy99STUtGR0RDSVrd 1tLR2dTTx8XfWEdMYNjBxNlnVl555WpJQ0ZY79bQ2d3YycrrSTs/Vsu8u8LP+vppTEI7PkruzszF 0dnW3ntLQkJHat/c2djNzM/Xa15raGxuf2lRTVHuzcjK1Nvq+WxYTUdMXujXysXMys/tTj49PERb 7s/Du7q9xH5IQD9ES2Fv68TKzdjxfFVNTU5ZZGxte/ve2ef36N7Z2977ePPp2eL4Z/nc1MnPeE5M T0xMTE5IXM/My9ZuXV567mNYWn7Tzc3b+mt79enraWBz6N7o92ZffeLX2uDnbG14Z1lLRkdW8NXP 1dnYzs/V6lxTW/f8YFhcaH7k7HhjYmxv6tXX1tXb4PD+ZFJRUldl793e3trd5n5mV1RddX1tdPXd zsvP6W5iZX5rX1dRXvba2/BxXmvo4utpW1li7ujve3Pk18/R4O5qZWxlYl9cZvjf2+b7YFdaXWp4 7tvTz9Dc72ZVVlZcZnzj4tjf6eT1+3NjWFBSYuXQzdjg6nz+cWdcV2Ru5Njb3f9zcWhvXlpYWm55 593l4eLb2eV5Z2t/8ej1cWRo9Onk73JrcXdsa2FiZXzq49ra4Ptua29qZFxj+OTX1+B0Y2BgaGNZ WXXc0M7S3ex4a2RcVVJbbe7r7OHd29ne7WFZYWttb3P+6uDc4vRoW1tfb/bl3drb3+P1bV5ZWVdc efHp3+Pe4ezya2draXVvbP7q39/r+nx39vpqZGBv6+Lf5Obr7e1uXVhYXnDu4Nvd3t3g+mBZWVtl eXjv597W2eZtXFlZZGxnbXD039TR3e76dXJvZ2Vjbu7i297ueWZdXFxiaW797d7a2+b6bGBgZW1w ++DY1NjidmNpc/H/YVxfb/Tu+Wpmb/fl7HVpbu7i3N/m5Orp6vFuXFleZHR9amZr9+vf3unwfH7x 7vtvbWxt9Ovu/XJ1evTxdmpv/erf3+z89/r8e2xgZG176Or8b2dpbfrx9fpvaOPX4P1rZ2hqX2Zt bXhs/+XU0dXb39/tbVdTWVpbaGx65+Pf3trf5O9ycWRcWl50+efb297n7PD7/m1lZ2ZlaF9kcffw f/R7+e/99fD5eu3l6+3u9/X19O7t7u9+bvzl6/hnY2pua2xtbG5maGlufPz39Orf3efn4e/r5er3 9f1vbmNYU1lYW21x+93Y2NPT3ft1bG3w6mdofml84u1r/PRjbvlrYX1xfuhtZ/jne/97bHTxfGvs 3t3d3v5sbWtoY2pz39bNy8nHyszW9VZLQj08PD5DTVd62s7Ly83R09ba7392bG5nYWd3duvm6OXr 5+Xobl13az9Es7HNsry3q7LcN0o5KywiHys6Mj3Jt7Cmq7Wrq79XTTM0PTAtOu3zyLKvrq2wvLzF Sjk2LS4zMDRG6dy/uLizsr3N02ZGPjozOEI8QlT/0MC+0WK3nrG1rMuos/AuJzsiIR8cKUZsTLai oZ+isray1i0pKSUyMDBEuKitpKiuqKvlLDMvKywkIzbRYOa7sayquXS6ul05NDQ8TzMuSsXJzc/J tLC9+9LmPr+qWsWwxqy62S0xSiAmIyAsSVY+rqGnpam5vLdIJiwtLD49Rsyop7CmrbS+WD8qKCkq NzlK07Our7C6uMbtPjo+NTg0O0rozNzKwLu/2MjSZkw9RVVIKzqiqrajs6OgtD0jPiQcHhcfPM5K uZ2dnZ+24b5cJB8lJTdPRcynnqalqbm4aSkfLiUfODtsr6exraS2xtc7Kz84KDdNUeS1yNSyxO3X bDtJUzhEZ05cxXZAqZuzqae9rLpDHiIqGh8gIDeyrbeenKKltD8xOygdJywzwbKvqp+iraviOzcq IB85OzS2r66jpr7OvjksLykoQ+M+yq60s67GRt5JLjc5NkXWR1uvu8q9Wfyco8yuyLa8dSoYLSYf KiczwaGqrJ6ksbw+IyUrIiQyP7+ln6Sjn6yz3C0nJicgJj7rsqWnqqitzkcyJyksLTNbxb2urre7 wE44OzY8TVBVyLfF7MbQ59s2LrWgtqy02Ky6aR8fJx0uKipHrKWon6ezu9csJCcjKT1q2a2ioaKl s+XdNyklJSkset28n6Sqr8VJNDEjIy0zVL+1t6uotcD0NzI+NzFGWtG6ucfVvNNVTC8vr6C2qa/G rbxaHyAjHCwuLkuupqSdp8LdSiolJiIqWb61paChoqa9QTorJCUlKDHKuamcpqu23ToqKR4mMT3R sauvqK26xU0vKTYxOGB/yLeywMXNSUU/MTeupK6hrLyww0UhIB4ZKC0y362mn5ukveo7JyUlISpL wLCjn6KiqsVCNioiIyQrPrqrqZ+lrLpbLyQlIig2T8Gupqqrrr5vPjEpLTI4V9K8u7W7yb9XPToy NLqjrqOpu6+63yYfHhkjLy9Ds6efm5+2b0kqJiciJjfIs6eho6WntVo6LCYmKCw2w62ln6mwwVo0 JiQjKThXxK+qqquxv106LysvND9o0rm3s7vGwV5QPiwyvKiupa7KtLXOLSQeGiUyMj/EsaSbnrL/ RS8wMCcmL/+2qKatrqyuv1kwJyktLzvRxLGmq7C/XjIsLSotOU7Usa2ys7vJW0Y2Ljk/Tu3Lvby5 w8jLT0M/MjS6qq+nrr+2uM0uJSAbJS8vOtS1qJ2erMn8PTY4KiYpPs6zq7G1r6yvv1YxLS80PF57 z7Wys774PTQ2NTg9SWq/uLq6v8r6VkM5Qk5e1MfGy8jO3PRKQT05OWquraumtra0xE0rJx4eKSww S8y0pZ+isL/3P0k7LSksPHi8try9s66vuttGPERJSUhHTFvj6VdHQ0ls19vm2cfHxs1tWktHSEtf cdbJxr7CzN5hW0tCPjpEXW//e7mssKy22c7j6z4wMCkwQUFEQUzVvLG5z87VxMDLaT4/RFNMUUxM 2r+0u7i8w7zI3Uo9NS4xMjhAXdnFury9v7/I12xMUFheX2ZqdeXg6XP2X2thWGl23nfk2+/c5vNT UVlZZ3Xt8dLIx87T5GVcWFVOSU9NXt/Vz9POzdnS8FlWV1hZbu5o+/J0+edzUU5PV/nh4d/Uz87S 1HlYXVFl633t6c7Ly8jjX29VUUZGPUhb2t7Izsi/wNfiWFNESEVASVzr18/M0cbJydDuXVJOS05F TEpd9O/T1NHEysrOzdLc3WlQU1NOVVJVV3Lfbvbv7+/Y71hVVl3c3ul69+Tg2d9+7dzS2d9ZXVRs bVtzWeLi3OVqbV7v/HhqY2J/5f7i3tjO1s/v8WtkWllQVVVVbW9veu/gfuTp7NvY2uXY3uvt9m5d +l1aVlxPZGZpX+z629HL0drh/HZiT05Ueufc33Pc+8/p4mluXvJ5Y15dV+pk43bj3+Hf6mbp3dbd 9llmV21fUlBSaPff2OrU2tDf82pbZf31XOv9+dfr3fre22T5VFZYUl1SZHbh083P1Nd4f2ZeWlNX bOre5+nu3+XadGJse+R281pZcW1fYFFlZezr6uLR0s3S2+PzcGhXT09MVlt079/S09Le2e/5cnxY 7V74ZeX++X3va/nqZ2v9bfdp/fft3er4aV5ebWRobPfY4tDm2f3rfPdeW1Vzaer2de375e1w7Fx2 bWRhYeLg0NXZ19ni4VlcTVZMWVpt7uDV1d/bcGz4dG5i/GTh6uXx5O/gZPFSa1lzWd953uDT5dZj fVNvWF1U93Xe19zo0//bbvlbWWBm+vHsa+fq6/h+XPp2513jXtp51+vdX/N25mdwYm1d6Xrcb9rp /PRiamVlZ27geOLv13Dpe3v0Z2tiXfVf4+Xw09vW6/JeXlddXVxoZ27Y99nn493d43NrZ2p8fG92 ed316Gljal5uYmhzetzu7eTu9O1/8ml7XvL+7u9+9uXo5ml8YvRY+mT27evv4uvi7fhpbmF6aWbz a9/v39/q3+1zbVxeXGVg/mPl8+Du5+7ec/dgd3Z8/e775Ozl8O/4+2df9mbuct/13WjzbG11/1z7 W+51237Ved9v7GL8W/pd4WjzbuX+6PZ6/fz1dW9+Xvx5/+jz9ex/42v8Yul55P5uc27982XpbOZ4 9v516f3d7PT2/379Ze1l6GT9buVw5XbsYu9k7FfoWfdg/n7f8dZ22mfdZ9//6m/7ffdk513YZehj emz0bv9f9l3oZt9869zv++9673v5a2t7dPh483Z/bu9ue/V++fJtfHB0e37j4ubi9vl6a2x+e2zs dn56Zv1s/nR6+fL28Pb+enrp/Ph67v798vT6cvVz+/fyduZx7mt4bHB8fGLjXtlg5Hn8/+1le2Hs fNv54+l94HHo6GN6Y2F0Yetkff725XHs9/hx7vB55+9r6m/v9XfiafT9/fZo7W5nfm73aPBm8Wfo e+N97HLybv1n7nDfb+Z9+/t3du5z43rnYudr72//83zu5Grfaehv8n5yb3RddGz4bW/6++tw7Gze 893032/nduth7mTyXvddfnfv+/B6eel33m//cHVv/Wvua9xs3PPv5fvu7mn9+/ZydWl172v/X3Zp dPX27Xnr6v7b9/L9fPp8ZG9n/m3w7HjfXutrfX5o72/rZOr1fu3p9+bw6X7leXp8X+Be+Xpa7lvi cm3wXN1g3G/v933qX9xm5/305n3pe+h/7nL47GDfXuNn6WV75mjgWONf9uxu6vvtem58aOBe3mPu f3bocOVm7nJw72DxX+N36Opo3l7WbeT+X+do53r87mriX99k8+1c3mP27F3jVt5i3/P132LaW+n3 beRn4v59+l3eUNhTd25W1mTvcPTgfdVv3+P+2FrVWOdvcHNs62n/7V3XWdto8O5f7Gn8cXlv/X58 72vu/m3f+eTs7/vfa+77Xn1k/Wz7+nDf++9ze3N0/XPm7ntwemlr9fX16Onnf/x2Zd9t9m9x/mbm W+j4fPD/7G7ucml7bfdn8udq5mnuduDw6Ort5vL8amB+X/1jbnn59+7v7O/v7v70e/Zs+3bueXp0 b3d56nbq+vfu+/51bv1q827ub/z8dOt77/356/Pp+e77/X1zaW1nbWx5+Pry9eXy3/TueHRqaWhu b3d87/Dm6vP5/n92+3XwePp0+/fv7Pnue3h3dnh69XnzffJvdXV7/nH7cfhvff106/np7vbyfe1t 727+ant9/X38+/b7+3ducHx+8O76+3N9bvX76O3k7ef+8HT6dfF8fHH/bW5tfG/+dfT4/f//+W53 a3dxfnX7/fDu6OXj5eTv63F+bGluenZtbXB1+XT4b/93e/5y8n/r9evs7Oru9f7//HD4anZpeW9y /nv++Orr+/9qdnZ2b3Lz++378/D26fju+PHtfu5temtsZ2F7dvTu6uju6/bu+f98cfx+/P15/P70 7uzzfXRwb2tuam9vdXtsbeLj5vxr/ufn8m527OXk+2997e5+eWx5d3B0eu98eHtkXmpxfep0ffXs 6OTo6Ovr6Pz2bGFfbvrzbmx17efv+vj1+3RubWlua/3v+fP76+jg5vN7/vHv9ftyZmlv/nFkYWlo 9ezl4+Le4urk9HplZmtkZ2psd3nv8+zu+PPm8Pj8/Of8f333bnxuePT/+f5xd/1+c3Nrc/n4em17 +3Xv6nxx9Obk6/f//Ozn621mbfTj6XhlXmbv7nlfWWjz3t9vdX3e3+r3bf17/OfrclZbcd/dZ1x7 6uXs/fXteXrx9m1fdujf7G1mft/3c2hh/Ovq7Hb37vDv8W9fXmrs7mxcX+vb5f3859/h9HZy6/j7 /u/5ZHnp3ulnWl/o6mBaXe3h5f9pavzv/+3u83Bp5untYWTl19ppWWF5/nFlb+v99uzj4mth8eN9 aWFs4uHudGP82uHn9Ghlbf7l3mldX+vd7fFhX2nt3vhnX2nx2OZqbnDu6n58bnnv+fju++n7ZmVj cern9PhmX+zW23dga+7i3f5nZG7f6/l+dGxu7PV9Y2Ts8+V9ZPv/8nJlamrn7vTr7ubu6W5ha/Pq 8/5yfHVv7OL2Xljs2e5vWnfg5ut5/vFvbvDgcVtc+u7zeWnq5ezb7l9eaXLucW9v8+7w5+bf6X59 9/Z78OLrb2xt9e7zbmRka2tqZGvr6OPvfWlob+ve82dgc+7n8G7i3+ftce/0a33l8Wp+bnH1bG1s f/freO98Ye946uX2b27y+Od1aPl083P06mpoaPD68vNj+ODl7Whu6t7ncHP4bFt9/GljXfri7O7s 3Otv7nv39WP9/f/5Z/9+b/Tu5+ty8un9425p+XfxX2V68N55avXr93VnbO7u7e5tbmBq9HbtY259 59ry9Grv1+HoaWPs5uTv+W11ePPoWFnx9fdtW1/+7eX9b+dw9+xeb2li7ebj9nrc3erc5upsTmni 8F9T6Nvx9Hbz8mFi+fV8dvDc9mp9+d58Y2Vj4/Frb2N04eh74+Xy/W7d3GZoYe/dbmhs9W1dfN7d X25+6N5bXH/e5mJs9efj+2zoe2L+6eB9XuTf6OpbZH1xbnBgZ+313/H4dvPrZuV2Zu7/5P1t7/1y /nR743f76Ojw9ep+ZV9h/mthZ2bv3/3y7Xp+2d14a2V8//Z+b2Zj/Obi7O3r5+xtZ2J76lxr8HH0 bObW5efp6GZPZdjha2Bx6eVnfO5973TtcvF1af1e3+Vvdf7pa2Vo7vb06P7cbfXdY+P2Z+hvX19j aO31b/Rx3+b88X/e/GTl3fxaXuPiaF/y4Xxs8OPsdV5cedziXll/5HJm7d9+893/fXBs33Vg5+5V XdDXelti1fJeee/tc+tya2Ft2vH9eGvc+vjebWR77+1fa974YGf47Hpv2upnZWvgfV7w4+rw5XZ6 9frX7FpibfVvbGpu4fZvb3T44Wli4+x7f/Ht5env6+n7aPz4dGBac3pkV3Xa7mt73N/uenHuYevg c3bx+l/q7vDqWPvg3/de+eD0c2Vo7l9q6G9iau3v8e/2393lcHl+Z/56ZfHnfORxY2b71Od0/3Vu X2Dn52x2ZevjfWBb/dnuY37s8env49/wZmfod+/eZmTm5XNZWunj/GBw/mBy9+Lk7Oju2+9ocnZy dGhVcfNg92jf3HT093Lr2vvfcV/hXunlb/Jy6352cm5q8OZ6efrxZV5d8+tTYPnY3Wj33M/gavDd 5XZybmhfXXPldlhi4d/pb/rwXmhyavxq4/pf3vXl3ep89eXv9nfvX+/oavt0aWFs4eHq4Gfs3vx+ aHpfY29v43hsbfXmb/Tral5h4v1rYF/f5n3+/+vr4NhuZnfv53Vv6tnma15m3/JvYGh3bnBqYWls 79vp/+Pwc2vd1uj/bHzk6HRdWmb6Xmds/Ov53tj7ZG197Gxq9m7e6e/c/fV4+N9wWm/qe2Vj3+Rl XG7i72ljeebo+Hrj3+L25t3o9lZr7mZaW2ld/GJi6efi5tzsfOZ7bPDb+/vsfePvbVxe4+dlW3b2 bWN433tlYVj96nhhe8zW9Xri0OBp8tn1XV9q/2psb97uX11o3Gp05W9kb9tlXmF23+Hn9uRs9ejb 3Fxu/fHe9WNffvPtYFj46O9jaulsb2/j4ll2393daV553OD3/3XjbfrxaN9yX2Td6Vz5benh3vxV YV7n5nTr8vp9flx9725wYdzkYvn74ttdatb0amRn6X7sd/na92zubPXXeW1mam9kZmJ25nhVatvi 5Pbf2nd52uRmZn1kb9pvXfPk9fv9bWNd+ufm+G/reWdsZ37k+Pno4OPhfXF1aPTtbVNdanfc7On6 5uFf/O5oeH1t7W139G7n4ufo8evwaP7b/HFkXflmWlVu4+77dert4Wxe3uLhfPJ8fORja3Zu/Hny an3pfO/h/e3fW27ufP1j6+9ta+7fb2ld9+l2X27f+ePk6N/+62dq8/TxaWrw8m/ufGVoeGtm6X1a 6+n3/3Jz7eLt5+pv5udjb3zzaVj+4H9je93aeGfu5ebval9z+9vqa/hqa+nuaWRu7nFndW7y+Wzs 32l+fGN/9Nzsbvrp6fduW3T6cm5u59t3bNfqcWl06fvxYmnn5ltX/u7o9Pbt6uD08+VxaulmXODj d2Fh7/ju5XZz919b+v7q7uvt5u5lbO7n+O3o73z8+f/rZ2hdZ9pwWmrf5G5eZN7g6Gpe5uvk2f5h fPp8+vl07uj7bl/x8PN5fGZY9Pt37GpbeNzt9Pze2fZiZfXgY1/yb2xu/3rreenlafp05OH1bGXk cXTi63ft5enmbf57bmhX/HFk+nz1fXlx/+Lf8ff3/eh4bnp+4Xvr5HBp+/RjdG/59GNlcPFlef5n 7f1tfN3pbWx9eO7le+3m3/nu4d37Wfh0efRg5+hiWXN03vFW9t/fY17+6Oxqbf7jcPTwbuVx+3Py 7mF6evl2dm545Pjm8+/mbP3z6mp4cmDg6W9i6dv5aWDd3G9Wbd1rc3xpfe9zae7/6e1/evHx9u9u 9Xp77n57dm537Xtw7/nz7+h3X2ln+OPz82Xk3Wb/7d73ae/u7mJn4/hlX2xpb/9w6nb5fvjzXP3f 5O1lb+7zc23+4t3xdffb22py5/lsa15sc15dYXzkeXXofO3w/u755+n9cvPl9PHv7+x7XVt26m9d Z+Xfc/bs/f16bfjocevo+2to2OVkZGLx32Ns3fdrennn6F9r9ujuZW5y8PFkb+npZe7c5vlp6+X+ W1328Gpk+WRteW/q5uf19H3u5mv7+vP3a3p57m748erd933/dnz8ZWh3bmpkavHqd3Lu8+vf53Tu 73HweHb5ZWP67ntuet7ffP3w2v5n9GZpdXB9cmn8dXT6avXt+u558f5cb2ps525s4OLk6OnZ23Rx dej3XH5wcntcde9tYG3n6HFr6u/x/Xfd9W31dW5seu/ta2nt4u724ef++XD27WRWW2xnYGjq3+Nq YdrY72715n5vZnzzfvzn6e/m93r36+9sZHpzZGZmaXz8fvTl4t/lePbf6ndxeWRkb2lucW3/fHXy 6/X+9PL37+3t9XR+5+nrb3Xh8vtsdGhlfv/5ZWtmbPd07fni4+Dmc+98/vd6cWNhcHl09u/5bm7n 62xu/v9xdnzy5P735uxyaXbs+X56ae/4dPPw/3H6/HprdvHr7m577OTsdXzs7Xd3/W9jbf3+d25x +uru9+/3fOr1bnFsanh4eu3o83n07+//+Ozyem9vdGllb3Vzam17+PTs4+Xs7ezs6/d9/vlsanf5 +X72/vx+a2Zt++ru7vR5dWtua2pxdnBudObg/Ong6Ojt63Rr+f18cG1/eWVlcHP38+vq+e/4b3Jy bXVycnPz6+Xf4+15b3Rrdnhqc/Ts+HP55ev27vTs/G16e/z5c2x9fWhmcnp+/nl29+13dvXs6uns 6+Txen5wa3B3aWxz//t/+PXs6/d+enn89nf+9P71/HV68/d6dXR0c3Rqe/BsbXR2//177ur0+Pzq 5+/v+Hx2cndxbXXv7X1uc357fvv17Pb76+1+/PHy+Pp+/nl6+Pj4d2pgZXN1bm337/nv7+rq/Hvz /fr6cHh3+/Hx8u/y/fT++fV/e25veXhvbHJvb375839x/Ozz+/Hu6/b/dnl8cnd2fnh+8/d2cv/3 /fn3fv58f/v0+fT39PT+fP7z9u7r73h3eWtkYmZobXD66u7x5/H68fL5eXz+7e/y7+rq7flvb3d3 e3tvamxyend4fHp5+fp1dH1+fPfu9Pfr6/D9/u/s7nptcHh/df/1+fz7+3xvb3N6eG91++/09+/t 6ubl7fT/dnhvbGdqa2lrdffr6+zt7uzv+v/3c2xtb3p6d3V2e//+9vr48fh6/fd4cm9tcnn17enq +Pj79+3t7f10evt+d3Ntb3Fve/vy6+74eHRzcX7v7u3r6+fo8Pl+dW5sbGtrd3lveH318vl8eXz6 8O3y/vv68/N+enJxcHh98u70+Pv9enZ2b251evfw8+7s7u74enF1d3V7eHBtdPvz/X57eHd3/fHx /Xh8/P54fPj37ujk5+vu/nNxeHdub3F4fXZ2//n28PP19P15fX///PT4eX3+fH15cnF4eXFtdvr3 +vnx9/fu7Ovt6uvyem9rbG55+ntzcXFz/n15/fX2+e/v8fL0/P/97+719/ny7fVwbGxzbmt0dHR4 dXZ2b2hpbG559e3k5+fj5ebu8u3x+fp4cnJub3X88/p1cHR2dXZ2fH9/enP76+nv7+/t6fL+eHZ9 eHJ6fG9udXxzcXp++vHz9vHr7PP9enJtbnn+/np9fe/p7/H5eHp4cHB0fPr18/T8ePn1/n57+O7v +X798+/+dXd2en14eXn+/v73e3FvcW9sbHJ6/vrx8vbt7e7n4ePt8/Tw+n11a2ZjZmtzb2xvdHh8 /vb09vz69u7u8e7t7PF9+vDr6e/193t2bWpoaHF0bGpsdnp1/u3t7ujl6fJ+enVydnj58/z17/d9 fvx+d3t8fHd1eXh6ffbv7O/v9n78/Hpvb21w/fz08vx6/3x6e/z7+vry7PZ+dHN2ePp2c3t0fnRy +Pbv9Pj4+3l5cWxye/Pt6uXp7evs8/p3cGxwenz7ff77/P77+/f/cm9ueHFrbG187uzs7/Tz7/L7 /nl6+f56/Pz7f/3y8/f3+Xx9dXJ4fXlzcm16+/T29ez2+PPx7vD7eHZtb/52bm1vcnn+dHj6+318 +fPr4+fr5e55eW5oa2htcXJ/9vR4/u/4d/rs8+7t9/bz9/n9e3l9fnZ49u75/XRrdXVvdm9sc3Bv cX7t6Ovu6/T7fvt4b3N6+vrz9+rl6ezm7HZvcm5vff39+/19+3prZWViX2x27uft49vb3t7g7Xt0 b3RtZmdnZGRpa2tqZ21oZG93d/bz8e3u7Ont+vPv6eDu7drr7NxvYdf1YO3tenjz9eVmPjbXuT3m sby/1875WDgtRUM2QsvIyLm7wsleRElDOD350MvDubW+z+/6WD49SFBRXdbKytPe62BNRkpOTWPc 3dHHy8/K02djbFpTXFpv5XPv193o5/xmdl9PWmBbWlBAa7fW+7a0vtLhXUw8MTtRR0fVxsbCw9Lv VT9AUE9Vz8jIx8/a3/1OTV1YVfre08/c4+dhSkxVWl1v2M/R3Pzc0nth3u/l1Nba893zX1I+NFTH 2My+sLzUVj9GNCw0Tk1Oz7y3tb3M2lQ/PUlMacvFvr3H3d5nSUdNVm3m39DO3nfrc1RPTk1SWlr3 4P128/fueW3f3d/a2ODbakjk2lLp1dPF0ufrRzbDtDzbt8XLSk9ITDstSOFKVsTIwrzcWlVTPUNx Z8e/xsG+0m/oXUtPfWFw2/389mxgYltUV1tUXXdr7Nfa4NTP6u3pTljfel7twub01WTl3v1QW2Bu OTWlr0yvwrzMMC4xTS4sX87mx7zotLhBP0JIPkjs0LG0zL6//E9SS1Hf7djJx9ZlU0xSTkVEUltN UmRt6uLe1MfK+PPp7mxVZ19+6PXMzFxZysJoRUBfzkgvr5zWvLfgvTIrJDtTKkjew7i03U+4Yi4y O0vXv9O4qLrZ/ldbTD45z7XFyMjL220+OUxNP0RbWW3vXPHP1+3d2Hnk5lboyNlsblxa2utp11JJ zL9mQmPbfEyqpN+y4E/ILSsnO0c3xeP0ubnrT/U/NDg4T721vrSvzMzYQURLb1XMtbu1xl1PSTwz OkJKWl5N7Mtyc9nkeOh5U+/S39HQ2drX0GzsV0vM9kphxMn25ElJ05+rWLk92ngnKCVISkTFU9yz vWNMTj06Qjxkt7S0tLzXzGpCTk3o6My4t7XPVk1GSDk3Pkr4YVhtaXHm52ld6/5QV+nUzcjQ3tXd bHH1WUtU48/cX3ZdPMCdpLbJP+VTLSggLjzfsOxfx8C+/T8tLT9Nyry+uK+vxuRJPFBf39jPxse0 ttBPOzpHSzw6PU5g6OFPX+jf0cfUZ1xk69LMc2biy8PLYkdPZd1mUVjv01VM2amjr7ZTPTovOzQv LzfQu8G95U39+nA/MzE8xLWwssHc08nI7UU/TM7AyMjGx8z2aFM9Ojc6QEZkdnTc2NHY1dl2bF34 08rM/9jP0ddbWFJKRU9yZnRmTEnDqKastvNTQTk+NzEtM1nOu7jSUF5cXEo2LzdWw7Gwu9Lc0snE 3U1J/czDtrjL2ldSXUk6MTI4SeVkTmH62MfDzvZjVPbIytrj49XIy+hbT05UV2lMPDjInp2ltzw8 RjEvJyIqQbKrtr1ZVsv6Sy8nLVOvqq+7ennJxdlIOz3Zta62Yk97z8doQjw9RVRSRkNNbXPv393R zNz6XEhIaNXf7OPTx7/IfGBJSEtdSTTrn5uirUM1PywrKCUtQLOpubz8Sc9oPS4pM+OtqbW/2u/N 21ZEPk3Qt7XDfElqyMZjPz9Mc1tEPERh18reT1TVytJ5SknvysnUclh5zcjSWUJKVEp0Ui/+nJif rjYySi4pIyQxSq2pzM5bRcxvOS0qQMKsqb7Hz37MXUVIT83Fv8Dq835Y9t/uW1NUSkdFQk/y3cvU Y2Ds22JOV2XWytDs7+j03uRXU1VHT+PObz84wpaar78vPEgrLB8jUsqqrFTbb0rNPy4rLNO1razK wcDr4z1D7d69y9DG285bRl3h0WdLPz0/RU5c19DKy+j+ZFVLSVzhycPO3d91bdXcWT87Vt5qYz4u wZWXrs093tosIhofVL+utm23s9LrLicsMPbMuq64r7lOQThPx8rG58a1wc5nOTn8vMZTPjpHVUNE TfPIxcvn5uRBPlR73trV3MrG+unN2FM7SMrMWUU9NHmZmby6xr7UJB4aIltSx7u/pajdQy8tLCgw PrWhp6q8altCPTU768OvrbjJ0VY+U35qRD9IUuZNPUNfzMjeUVjY3lNJTvDGznDZ0PfVx9VRQ1Fa ysQ+QUdEpJi0v665vioeGx4+Lje2rqWmxVpdTygdJje/qq+vpqW2TjQvOD9GXrqts7jN0sdYOC03 VUxAOULHvexu483OeFZFR1tl3c3Oz9TKw8hvQT5V6EdTytr4WO+fns+2wcjsIyQfLDsoS7y1rrXD vrpOJCc4QUpNyqqgq7y+wdI4MDZG5E9myK+tw87W5ksvKSw4QU9WzLe1usLFbj89RkpJW/LLvb28 yFg9P+vhOG/FXkMwoJ5LqbGuqTcuKDUrGi0yOcfOwqufsXi+VDIsKCtG0EC5pamor7THxl8rNjU0 RVjVvq67x9ZGOjQ1LThc/dO+ur6+1N/vVkZIYOLW2NXf8l/t6FX909v3aFR6TM2s17+ttrnk7zs/ MiMrKi4pQvHKqrKur67CauY6PUU6QFxT2ra1v7+6vsHdX9jPTT4+OTgyMTlH/86+ube5wMv+UUxA Q0JM1cTG5drJ1F5IW9btaPjQzdnW4vFv+FU/Ol3HU9m9ubfE1/7PSDg5OTY4PzpffHbFvMDGvMXN zGJV2V9DacnUzsPQw9RPT1JENz5IR1nezsrU6t9rTExba9nJwLu9v8rL/khMPT1EQU382mnPvsXK 1GJRZklGSElPat7rysDJz8vbfe5RTVVUSlpuV3f33c7d1N7a3W3a7e3X1tT6aGhTT0ZBR0ZPbM/N 08nM1/FgVlFSb+Hn6NrHyeB8am7w7vfc5mtfXVxbXVBd3M7V3PHm2/5aVF97a1pr9n76fGbny9dr X3dsWlROXWZl/eXd9Xzj39bV1czNz9DfallLTU9OWV/az+f9a/9oVFVQWu/c0Nbo7fPtd2lq49nq 3uZ4+V5qWVj7W2rl8O7y9+f7bnP56Pb093ft3tbX6uzoa15ZVldYd+bc4PT3amhoal1r9u3Szs/S 321eVlVfc35fa/LtflpcX2ri2dTW3+x072VYXl5869zf49fo5O1v+WdmaVxWUVtibHxv89/b397i 69nP197g6PRjUUpNT1Fo7N3c3e3s7vZ0Xv1359Xd3+ltYWNhYmfv5ebf7PHtbl9qfv9rdHR69/zs ++fr9+Xt5XVoYVxkZHz29ufi4d7m6/9cWmFpYl1dafnf19nSz8/Z9HJgWFRSXXh5amhz7vFzbWJz 7erd2N3f3e56a19ea+/l6vl4/urwfnBrZnf9amtrbmpmXmP/+uPf5OXs6PN+/HZrcvro7u/p+e9+ b29kaHr38fb/7ebk6Xj/bmz58et893Jt/WpoYGBjaX747OXl5Nrk+m1gZ2v36u967ePp6XFqc3R+ cf30c3xxaGZibHzt5+nj7P7q4e19+O/17/tx6Otubm9rX2BfXmp4d3rs7e3t9H7v7f969+Po6er7 8flmY2FfZWRt8N/b3d/n/Hp0aHz3fX527/5ra2pw+f3z4+Dg5vxsY1xYW2Vz+P3x4+n68Ozs7u7m 6unn6uHh7vpgXWFdXVxmd/Lo7/Pg63F7am33fG3t4vr8/uzo6G1v0+5o6ed4Z2BdfmBUXuzmbebv /Hnc1mT64OL+YlZh6lxhcOvm6tvn3eLmcXB3XmJiamTz7/He9fje3mf44HFuX2F78mJf/nNoafb5 7ed5/Nrece3n+Oz7eeLn/P3f8mz683BrbGd6ZFtfcl5c+/Ls6uPm5nxr8fdxbHX44X9u6fPz/Wli bvlqbOf0cejc4t5iTV59aFR1xLq+vbq5v95URkE2LzA5PT9Pb9PP093Ozfhq697082B00tnp18vP ztTe325OSk9LOi2/oFPKnqWmucrrPj0eGi8qHi9Dw62rr7uksTg+STgwMTFNxMDIsaWwtLPI5U06 Ljg+MjtYVFfW1tPL1Pvm4lF6a0lr9DM6mKA1nJulrF3eKjIkDx84HSRLzqqoqdCypy0pNDQ9OES9 rqqrq5+purtfPzcvLS9EREDkaFluXllOTEdVaE5qyMts4O0syJPCUJaipr9A7y08GhdZJxw6V8Gt t/VtrUAkY0ZEzMvVrqTOuKm20r/DPr9ONFVaQTHhQDxmPUZSYEHv1UbpxmVfx99qSi0vm6ErnJyo pEC8zUkhFk4tGS9L066z39G2NyU6MC9K+tavprKopbG/vso7Xzw33D9o4cjEU+lEOzovMzlBRz3O tc/Dx8nNRCsrn6cynJ2fnkSsuDciGkYiGS82yrnJ4d7iLS03MT5XzrOoq6qkq7Xv1+o+TD/Mvl/C ys1uOTkwLywrO0JHWOm7u87HvMhMQUA0WKSxtpiin6nyrTwoHyMwGSE6Ts18wNTtQS0/OjVF7rW1 rqino7DEvslQRFLizVNfzdN7Pz89NS8rMTtAPkvHv8/Du73VSlM6Oqutup6koKPOstc5KyYyHR8w MU1TzddXPzRUPDQ/7Lm9t66pqa+/wrdvXM/Pw2Fc29FZPVU/LywuMy8yQVrWzdK6uL3Ia9NIL8+v xKejpqGup7pSOSo3HhsnLjU019duTzrsQTk9XMBvv7Kura+vtLPKzL3I5G7kU0xPS0k9NTU0MjM6 VExn2N3DysrEz3hYQz3Jsrapo6SlrK/DTj0uKiAfKyotTfBsU19kRUREStvc3bm3ta6tsrq8ycrM 393WeFZrXl9DNzs3MjA6TEVNbuvn8s7HzdTX4G9QSb+xuamlqKqzs81SOi0sIyEmKy86T0rz02vN 8PXR19d1vbzBtbi2uL27vcjS019LUElGQUFFPjs7P0M9QEI/Ufnaxb26ury/1vtiR3vIyLGsrq21 tMBTQTAuKSUoKjM6RE7xz9nP4s3U2cbGusO+v8vI1czQytDWx8zTc3n1UUU9ODYyMzg5QEr8y8G6 u7m7wMLK1dbW3trcXVNXTW5ccMjLyNjKy/rySkE6MS4xMzhIase8ubu2uMXGz+VVVE5OZFDZyc7J z83V3PBYXVhTTUFBSUVJVGH0+NjMycTCvrzAxMva5U1FQD5IQ0FLW1hYe/HqdF9sbG5159DPy8fM yM3S0M3S5M/nWVtKRD4+P0BMTnHZ183Lxs7X2Obg5vh2fe3zdOrs+N7t6+F9bW5qXVNRUk9MTVBa Yl/849nNysPDw8LLzdt9YlNNSU9ST2Jx7+X18vteT1FZWFdfbPDW1t3V29vS19zW1d7sdG1vXmFi Z29YXWFkcV9g/vtuf+zza25wZ2libHD23dzPy83Lzd57YVxTT11n/Pl29G9eVFVeW1dibn3q3tXX 3tjY19jk2drd53Hpfl5hXV1iX2Jt9Gto3P1caVtbX1dUWVpRY+fk2tDPycbIzMvN5vFpV1taX2Fj Yl5bVVZcU01ZXmLz4NfU2t7b2+Hj2Nzp3+Hg1eP49mJZTE1OTFpbaO3n2t/g6Xbv/mdoa+/q8+3l 3d/i0tnq7n3r8HZlbvJkZV5STk9RVGh4+t3U0s/N0t/j9WRdZm1jaXJ9497f3+P0bGdVTk9RWmdu 8eno593U29/l7d/xd2dr8/Hj4uju6OVt/2/YzNR0SkZIUlxZS0NLXc3Lx9Lc3dTR2ONZXnzb3tx5 X2h92tbfalhTWGNoYFpaXHP6bWhlaPHb087R29rY3d/vcGNeW19+c2xhbX7c1NjuYVtXXFlWVVVY Z+zc2djT1dLX4dzf7fV3Zm768uz4clxcV1p28/B8a2doaHD09P58cv75+eji3eLm3Orl6ezk+G9l YmBrc31paG1pdm77enhtWl1k9f3g6ure3dfi5m1ueXb3+H5w6ery8HZzY25fYmVdZ2zv8urg7d/n 4e7/fWZsandy8vnm3uvf6ud5cnFncmRqbWlucmtfXFtheuPd2tPd3+rw7+/r+uX2aGJdam/07Ojk b15ZW19fXnLs5vfu4eLd4uvn5+3w9/f5d3F7evh0eGtvaGdpXF5mev7o4N3n/Xpnamr+5t7e3uHl 7ntzYV5manX58PLp5H1uaWBkbHF+9/bw5uHj6fd78/V4eG9uaW99dXx1c3/p3ubj4+PpfnN0c25w amdrbm1nZ25rbm1tb/Tx7N3b29/i7PBuYGBfZGt4+ern6+/p3+fj7HV8ff9wbmxtb3BmbHdycXb1 /3xvdn51f/bu/f12fXNu8Pbq5+/s9Pv+ePZ+dP54e/f09/v18Ort7+v2b2tpbW5qb2//7319f3Z7 fH75fH9+ffnv5+ft8XdpbXZ4++3t7e/9ffd9a3l1b19p8fvg4eri7v55X2NkZHzp39rZ29vmdV5W VVJTV1pndu7f1dHa3On8bV9dYXF46t7f3dve4O1tZF1YV1tleX3x6ejp6urq/m9vevp3dX7x7ezi 4+bo+H1oXWBre3j2+XT99nZqYl9jZ2t37uPf3d/m5+fm7+/t9/z+enx9fnRqaGl3cWx4/Xd2en19 /vH08/T8eu3r5ufq7PlvYmhlYmtydW1xfPr8fvfw+XR/9n388u/t7efq7/x4+3xxfPX29/L7b2ts a2VhZmhy8uTZ2djX2tzlfmpkX1xdX2RoZ2tsbnBwefrq6fT19fLy8uvq7/L09/P2fHhua2Zldnp3 /3D48Pf29+zv8/b79/Ls7fF+++/0b2FcWl5nedzOx8K/wcnT71VFPTo5OjxCTGbey8O/vsHGzNj9 W09LSEpNVWbz2M/Q1tbZ3ud0XlheX2B1euro5N/d3+nu6utuXnXfz8a+uLm7wNpYPDItKystMztL 8sm9uri4ur7Ey9nvWEtLT2HhzMC9u73F2lxIPzw5OTs/SFBh7NnPzMvMy8rKy9La5/xgU05JR0VA QVrUva6ppKaqs+Y9KSEeHR8kL0Haua6pqKerr7nLdj83MC8yNUBlw7StqKiqr778PS8pJygqMDlI es7Cvbu8vb7Ey9buXVBNSUpMT1ZibVdOy7etoZ6doa3HMiUbFxgYHSQ0XL2qop2cnaGrvkIuJSEh JC482rerpKKgoqatx0MsIh4dHyUwSta9t7KysbCytr3SU0A5NzxAS1ZZTUpMQj3arqabmJmdr3sn HRkVGBoeJDBcvaSbl5aZo8Q5Ix0cHycuSNq7raaenJudpro9JBwZGx8qOUrizb+3rqqpqrPNSDUv MTxN7NbpVEE8O0ZjX86pn5yWmZ6tXysaGBQTFxohLdqrnZWRlJuqTCYdGhwfKjZIyLGlnZmXm6K4 NyQcGh0iLTdOfNPAtKysq7XOTzo2NT9ObdHb2ftqVk5PSlx9WE+0oZ2WmJ+yPSgZGBcUFxogLr+f l5CQl6jdKh0cHSIlLjxPtKCYlJWaq1gsHh0fIiguO0jct66urbjlST88PU5iUGPr0cC5tr7gQjQw Lzhb8FS8oJ2YlJyuQCIYERYWGB8pRLCak5CSm7wuHxcZHSUvO8m1pZmVlpypSycfHR8nNDxtwLm1 t71XRDw0PUpvXGrV3L+yrq+72j4uLCwvPUbfxlC/m5WSkJ7KJBoWEBkZFx4s06STj5Oaqz0gHhob Hyk746icmZeapcBALCEfJCcy47isqq7OOjMsLjpESFHZy76vrbO5w3lGPjktKy8zQ+27r826mJSV k6g5HBcYEhocGCNKqpqQkZqr3CwcHBkaIji2pJmVm5+qzDgrKB8fMEq7pqSsxe82Ki0sKTBGXrys rLm+vOPLv/U7LS4sNmLq2dPBssDZm5ObmbI1HxsmFhkbFiFgn5mVmKO87j0fGxgbKc6fmpqdpbS5 yzIjHiUu86yoqbG+ZElEKyMiJzfJrK63wd/Otq++VzsuLUBoUUZCTd+4qq9OT52XnJzLJxocJxof HhwruZmXmJ+7RjUsHxweL/qomp2irrbWTUQqIilNvqymrL7q+T4wKiIkLuK2sbDE19XHt8DUTDtB PUJKQkVL98PDvrbHO7mTl5+xLyMaLC4YGxsm3KCVnKu6ymBJLR4aIsqqnpyqus6+zEAzKCtgr6+x sMpfR1U0KCooOF22sMjI9NDYzr/e71dmTz5VTklEQWjRxLOxRTuckZqpQCgdIkIgFxgfVKuYmavF wsFPLR4ZHl+jn56ru8LAu0kvKCpRsaqyvszS6Vk7KScrPefNwd1n0MXG1MnJ4NvZX0M+RUA/SE7M uru0vzzZlpShvysnJDA0GRcaKq2dnKO3yci8aR8ZHTCyoqGrxLuvrsM4LCkx062tzlvbztVbPCwq NUdQWenfyru7zdvCvr/K9kAwNDs+SVfqv7SysbxELq+XpK5MKzg78yYZGxw5qKKpsb6xr6x8Hhof OL+zs76/pJ2itDckIS/mfFlKV7alp747KSYsQUc8PlO/r6yzvL/F0mI7KysvPl7Gubevr7nG9DUp w6W3tclqztm/QiQcGiEzZL20taqenKjLMh8eIy8+Ree1qJ6anatvNCsrKCMjLETEqqWrvM3/Sjs1 Ly07+Luvr6+5ydD8Sz02Nz57vry+xcvJxvw8LSooKz1Pza+moaKmr9ZMPzMuLC0uO9TCvb7GzfJy RDQ2Q/XDt7a/xb3K4l9CODI/Ve/Cvr+/vLzM8U43LzI4QFDYx8i/ubq9wc9LPD9DVOPYdVFTTEZK TkNK4svFtqyxtLO7xNHjSTUwLiwyPD9JUHPpw7W6vMLP9GHvRzU2OD9byby6sK+2trS41Es6Ly0v Mzg+XMm8u7/Dz2xqaUxGSVZt59HkcFNPYlxTbtTLXjezmJ+gpEk5MzQyGxoZH+atoqCywbOsuzsn HBw0vKqrs7Cvqqe/NB8cKl23rbXCu6+svzknIitZwb7ecs69uMHgRDxHUlJBOjc3S9vDvLy6vsa9 ykQrL6Oap6C7PUw5RSUWGRwxrKOfqvq9tNQ+JB0fNq2ipKq9xbq8x0QrJzW+rrrMVD5az8ngQz48 TvBTTT1EybSvr7bKSTcvKSw2Sde9sq+tq7TvNSwnIB/PlJeZmbTLSy4lEQ8aIb2fn523wKnGWSgY GyPGoaSktMSttLpXJCIszqqyxmZLy7y/2zUyNT5eSUU6Rr+vr7jURDs/S0VFTdu9tbG7zNX8Qy4t MS0tPZ2Ol5qmLy4kHx4QGSpHmpmboElqWDAwHBsmTp2ZnKPyS009SiwkLWKmn6a1TzxDWm5ENTI3 TtrW7lp8xMDHzltEQ0taatvIwMLD2E1NUVlTPT0/SlI3tZKWnqNDKiEfJBcbL0Gjmp2hZTY+MDUr IixNqZufptYyOjdNTTQ8YK6jq8Y6MzlG3MTiUlNMUUhMTUrIvr293nlGP0tAS27Zz9fS08vDxNdC Nzo+RTw2r5WXnag8Jx8iJhsfMlKnnJ6rUTlJOjYsJS9lp52kqtY5PTo/PTdE37CpsPc4NTZavbrF XUlBP0xXWvDKvbzO8ko3PEJP6dLF3OTIyb7FZUM3OkxUU0cxV5qRm6LMKCIkLSAaIy7FnZuftUZF OjUyJSU0vqCeorY6MzE3Tk1LX7eorLhuNi8/yrzLUT4yOFfgx87BvdnbYT42OEdZ1728zevb3dr3 Wk05OkzryNc/RZ+UnabdKiMlNCgeJy5upJyer0M8ODg8KSYs+qSfn649Ly047eV7Wcmqp6zLMigt V7q2xkUxOlfRydrvU1vW5FpDPk5tybzB6U1KTHzIwcdzS05v41o2J2OamZ+jdzErLjEdHCMouJyb n75EQDU7Kh4kNa+enqLTMjU55MdsSUq1pqu+NyYoS66ruU4vLkHv3lpDU9G+vdhGOD5f1cnM/kRK 5cW3vMv9QUZFPkQ3KC+dj5iarT0pJSwaExwl0ZuWmapQQjAsJxsdLLibmZuuPTYzPks9Oz6/paSu bzEpMcyyum46Mj16zl1GbN/Cu89PNzxX5MHC2ldMeNHIxNRfSUxPPj9BNCfFkJSboFkuIysmFBol OaOYmaN4QTksLh8cKGqempykTzY0NkU7QEfcqqKmvTgnKES+tcZOODtddl1ES+nGuMHzPzpFXdTY 4WxX3NTKws7N7UpBPEBHRDY6npKcoL05KiQuHBcmM7ednKC+S1QzLSQcIzuqnJ+ju0hDOz44OU/h sqiotUowKzbww73VU0dUeVJDR2XhyMjvSzxGVejJycjyWVxd0cTE2UU+QkVr3GUyOJ2SnKbUMCYo NB0ZJzmxnZ2o3EhGNS8kHinto52hqsxHPTs5MT1uv6qmruQ/OTA8VeDP4t5VUlZISU793MrK52Ra WFrs2NTXaVNNYc7IzF9AP0zf2H9NNUuclKK1UzgvLzMaGCp0p56isn72YzYmHR4vvKCfqK+73kI3 Li1FwrGtrK/NSjU0Oj7s0tfq+vNQSUZIVNzM0vZYXlxt4eXSzd9VS3PNwMZSOz1U5u9dQzBrl5Sk ukFNPDErFBguxKOnrLTDudYvHxwkSrioqq6qrsU9LCw1YsS7t7KutmI5LzFA5sPV7dnbWEA8PFXO wMnp6WxTSUtcZN3gVGfNvLvOU0VZT0ZOSkoxR5eUprBXzUopJxIYOtGrt6+kravxKSEeKjZHuayj nqe/PDAzMzpBaLaprLbZPj89OzxPxcPG2kk/REhNb8zHx8jpU0hFR0/o1W5h2L68zlM7QlleWU1R WDzClJiyw2DBQicfFSBdz7nDrqGsvD0qKSUoKjm0o5+hscnnRzQqLD3Pr665sLxZTzc7TtjNSVFP RU9MS97BwdDMx1k+OD9e6dxeWM+4t+dBRExZ/k9ESN7LPMmWmry/z7tBJyAXKF9U3c+toavLPTc3 JyUpOLmqqKutrblTMS0yQ2zZzLaqu11KX8l7Tjo7UEk8O0vfvMHMxrvCRDc9X/5MSVbLtrnTTEtr WllMP0NX399U5J2Yt8C9u9kpIRspZTU4+LKosMpa89UuHyQ6yr67tKqjqMRDPD08NT1nyri7xraw ufNGODA3LSs4WcvDtbS8u88+PEZJRkZg3Ly1xNr3c2lHPD88QFDVvtncpJqyy7a95SolICtJLitd r7C3vsC7xTgjKT8/OVm2pqOptMvNYzMtMTxEYLu0rK28wcpLLSsqLTc+db+sssK8wO4+NzY+Tk5c wbW8wcLH2Uc1NTxFR17O0cbdrJy5zrS1xDAvKis3JShTu8PLtK+wuEAsND8uLE7FtbCvr7Cv0T0/ QD44SNVrvbW9t757PD8zKy04R12+wrqwuOBWeFdFQEhaysvUysnsUEc/VWhYVGTZZEauouHApqnD S3wwLSwfJT1INO+srK2tw1tpRSorODc/77q3r6mvtrrHbEU8MTZUTHW+u7+/wlw8NDI0PklSzMG+ xc3X2uVMTOrS4N7bb1paSUdj4lpn3uXV9V2xq9y3qa7VVtszLiomLDAwN8W2x7yvtsDK+0BJQjM6 TmdSzbW1s7G3wczVT0RMQEdV/l9pWj5JWFNM/NTe183cW2pfVU1a58u/zdbT3VZLR0VRVVVg09da TsClv9Spq7pPzVAvMSgrLzIvScJy7rGtv8m6y3daPD1CQDlIxsjLu7W4vcHFympi/uhPPkQ/NTQ+ S1hryrq8xMfJfEpDSEVIXd/N2tXFxu5NWt3rT0x7dE5TV2evr/Svp7Dr1b06My8sLi8uLkphScez vci3ttjgYE1VUEhIz+FP5cbG3MS6x725v8nQfj46Mi0vNDpEz8XHv7e9ys/xWlhcXvNSTWPtUkrk 3trV3unY5lJX9UrPreTNrK3LX7jtODozMjEwLDdfR0zCusrPucLNzNPV4NpSW3xPSlTpcd3Dx7u2 u8S/x0s+OzQuMzo9SmTfy7zBzc7Fw8vT62xOTE5NREd57/3a33Hj0upe18xeSLetTNyust1gwF5M SjQzPTYrOFxCPXvR6si9yb24wdfIv05Le29OROncz8bOxru/937uU0A9Pjo/PT1MYVpny7/AvLvC x9l9amlMRFtrU1dVWvl6XWjMzePNx9bu2u1fWkU/e9VXd8G3vsHAw8hwQDpAODAwNj1GTk7Vw8LJ v7e7vr/Bw8fhXVFQSURMSk5VZO3h6PHY3vpkbmlSUFBVVVhp3M3Lxr6+yMzcYlJMSERNUE1d5eDo 2dpwY3pnXP3jbd/Q2PLcz93/a39vbV5PXutyV1tgU0xVXlt82MzKxb/BxMfR321bSUpOR0JASllS Uu7V0dXRytLP6GHs63BWYujseu947er77PXc2nv6c3loYk5PSVZfWOPky8LN0M/F0GdbYV9ZVEtT bOtdTHrq7lNf/Vvzbext287Z0dvO1drf6c/mal5cW1dTTVFhWWJlcvn2b3fp1uXo39Li3uBs7mnt YWlyaujc4X7k3mxfX09OXW3zYdfp3tvU6NrZ72RnWmJQcV599Htv3N/u8dhy5udqd+nsZWNdcO1k +V772nPkfd3d7m9zeuj0eV1fa2RdcWv05O3j4O/uYHruXm/78tTp1+Xg3F5kWm1VT1tSX1j49tnP 3M/Uz9ze1untXW5bWlpSTVZYWFpd5tbOzdXP1Nl6WmpZWFlZbnLk39/U1dva4d3vYGRUWlRkUld2 b/N33+b91nPf9O787trlcul4+m38YF1kZGPy9fz17O/pa2tv4e7madnj1/bo4ORrYl1ZVFxdcWdv +O3r39vu3nLcbOtcYmFdWGJc5/PY3dTa0+Tr6e1rZF14X2dcfnXue3H9ff7y7X5yev/39W5ufXZ/ d+vu/N7g3uHs8Xf6Xl9qY2lr9Ozi3/bleuxrb2L7XmNvZvRt8e/93/rhe+Zy7v1X/WHfanvf/eJ8 7Oly9XT0e+Bk5HXvdm5kYmNoav1x/vvr7+B133LpdPprY+h32t3o3WfnX3xYc1h6e2r9ft5v9uvy 6vL59/f47mp5bGHvX+r56ut14u/te2D2bOZf+Frld334ZN197utq1m7r931zae1bdWxt8mfu3HjZ Y+Jv7H5y+Wp832j2/u96dXXteOzs5mTqeWvpXHnvZ3ty5mz3eu59/m1qaW7+dmXy7uzldeHj3eBh 32rybXt6af5bb3Jr+F7qbO7q8uFs0HPvf2/bZvJW/V92dV/ia91t5Ntx0lvuZetie25u5l7l82TO YOdm53Vsa2nffu97ZeVseO50bP9weHd96HLtb/l58/J6+ODs4t74415ubl5mZvtd6Gdy613ccur0 cdpp6W725XHja+xt+fp283XuaPDmd+l2Ym9z//pib2H4+2Xu9Xfx8fTt7+rmdt71/OZ4bvVo7uxe 3V7s9Wn8bHxvbXptbGPcY+Bs4u5x63zq2nbbfdpsc3FtZ19taHd6bvpr7O7ucPtu6X1xdHboeelo 2fDfd+nfa3ZtZ+dcaWL5Zvb66+bj+uV99Hzr+XNkYXZsb/hv9/fu+nHuZPfmd+hn6u18Z+v0buJl 7udj33Xc7vBs615ebV5u6ljib+fiZ9r57txk33Pt9Wbpem1s/W3tbXT27mzhWvxoYXtc9el95Ozh 6+N88N9s7n3v++vveXp0Z35eYlPuW+Fe6HF81FjMat7pW9Baz197fWzeW+peaW9f5WHaZ+74euNm 7Hjvfvjqe+Xu/PXn+upZaexb9Gln6F35eWLXcuvl7XXobm7j5ORl9f5pc13vXt344HZ+e3J3X+Nq 4l7p6XTi8fB743pt+WVve/Rr+V9pav3o597d4eLs5WH0UW5xXmZqb/Fs5W7+5eRx42rn7dvab+dk fmFcfWHdYfpqePFR6Vzra2b7+9vode7k4Obhed3X1l5z3PhmeFpvYGtcaHn/bFtf9vrn/l3V/Hro Wdxn9G3Yz99defb6Xk9mduhdZejhzfjQ2NfbWdxP219N/FvbYf1u5dZt7GvqeGtd9eRg/VjlYfl+ Z/J7ZmnzbvPf7dhw4nJ772x023L7Vm54XONkdtTafFLb0nZa0eFry1N40l1abutP6NtNTtt5R9H0 c/LodF/GYnLT4flj2VXe5W9p7c1VYVl3b+lWVt/pZmXv4dXp3WXiyk/tXOpvY29Zzn/+We/gaNlV fuvo31jWff38Xmbt6XRo8Ol3dXld53h5bPt3eW9v++956uP15+ne63nu+etyaGFidHF1WPVk+mph df3eZmd6fPNk+uLROy6wq0TJtresuMw/3ckrKTIvM0A2PLaxztW0uM3NPzzyWTg28tvl0m7Xt7fr 7cfaT0g8PGdMOC4sops+qZ2gmbbRPzjqGhMmISMyJ9+noKlgpqfUXywwPjorKf6zt7qsraan8FPw 7TApNi9AQjJCzL3a5sPM53xBSV0uPpeibZeen57tcCQvKg4YKBwvQU2poJ6+X6hzLy0lNT89O+6m oK2opain0Dk3PTQjLDQ4Xz8/zbrE5cvKe1Q/PUMsd5SuzZShnKNEWyM2Hg4gJSJPPu2korQ4ccAr MCottrrMxKieprO5w7q7Ky5MTU4uSnT9/S48YUs/Ok7uytpN07w2U5Oh3JmjpKU6MyAwJBElKibI 5lCqor4uPVkvPS0srKS+ua2oprtMPMe5Lj3n4bhPP1TOWyouNjxDNDrWt7rMuL7rNVeTreWaup2r KEIjPikVMCUsui5MqbHIL0n1Ps8rRJ6uyMDNtrJnMEm3yVTbcbqvPjzZ1UQtMTRM/C86xbe90tvo fC06l6PLnK+eoStBJzYuFS4lKLo0Sq+utjo/XUjnLjirts3JasWux0/SuK+9yGrzwD0vN0VAMjc8 eMVhXMi3vHVeU0U2JMmWsK2esZe0LVUoSSAcMBw+2Cv3uLC8PVNNd/Ipa67LwFz7u7W+6bqur7vd QmjXMjdAQ0w9PT/l0kFT0O5n699XPz0v2pWov5u1n6sseyk8Mhw1HyfbLU68uK9VWV5N1jc+zfJm 3mdsubGtrq6ss7pEOj81QDQ4SkFoV0ftac56P15W01U29VM/qZy0q6u5oVtCbCxxLyswHjBHNFTe ysZvztFe7mre+j9VV0G/v7yqtaqvysg+bUA0Vj5lSz/yW9xaRmJGVkM97WrXzNTwUbOs28nGybv5 uLVtvF1MbSszNzdQOERJSd5PUvVNaE04SlDkx8S1s6+wur7Hzsre8f5MWE9CQT1GQTg/R0teVd7D ztpKPsq12OO4tritrbu+tclfTC0sOzIrMEI3OlpPSFbuTVb1SWnn4r64tbavrrSzucPL6Vk/OjU4 Pzg5P0fy6XNi0cX9/U87O/qzz8+qrbWzr7HGwddGRzApMTIuMTg2NF/jP17X+NfyV17Uxse6uLqs rri4ubx4U0g7RTw2PT9DSktZ++H5bMzjUXNbTT7SrtDRr7G9w7W0y7/KTEM0LC8xLy42Pz9fbk9s ztZk5VxdycvDura2ubi5wMfO/uhZPEhFQ0pDSkZYd09na2veWHnaZGhKbr3E3tm6usO4t729v/I7 OTgwNDU5PkdcRU7yUe1jV+1NdXntv8i8uMS6vb670crdWm9LS1FYYU5MWlFETVVXX1Vw535uW0s8 SdLQx7avr7GwtL7M7VVIOC4vNDY4PUI9R1dJU37b3W7c1eDVzr+8vL2/vcDAxdHP3d9cUGJBQ0c/ Rj9ESkt4e2fre/v7ctrPys3M0PrY2vXrz8bMxr7HztjyW0U/OjY4ODg7QEtMWGtt1szJxMC+w8LA yMTEysnL1n5sclRaa17q9VBSXEE5Pzw9TVLrzMbBxMfFztLYXfviYnZuXm97+mpiYWpgVG/6eup7 a1tiZE5j/lnz3tnM0MnHz8vnX1ZMT073amzI19LVYXJpSEtcR2VyZM/y4dtv7HVbald60/XVzNrQ y9d393FWW2RMbOtaWmhlZn5VVv58//bW1NrM2tB1ad9j6exiznPd0lTi80xdSk5NTVxzcdDlb8Bl WcVqWvboaG7rX9Ze1dpTxuFZxOta03xVf01/SUjrSU7uXuLc39zXxm7gyVnQ9GHET2rIX/BWXN5E XfE/7dY9ztVPv0ncyEDM5FLPXN7ZU9/W3d9U2drmyk7dxz/n4ET0VUxwRO58P8JdSLpPY71V2836 v1rsvEPdvEN81lNS8nxB8VNaUkzJRXLESeTKTM7bXN396WZ011nV9Oxyd8NMcsJNaL9JTbhFR79H YE/ZYT3JWEnJ2Erl1F3kz9pNz7g9bblHVsZbTN3bT3BR0mZbv0TtzkrTTlvOVk/Kcm9Uzc9L1M1b ZL1HXLxHb1Xe1DTEyTTGzza/xEDP4s9NVcZH8+di2v7TX2W9bkPE90HTYnZp9vFY0HTfS9vNPcFH 29A2unhKylrXUfXPRNrGSdbI8ldizUlg0EfmU8/VScBsSMJL3F9HwFVGv11byVDh1V7RVNbVStbY cutX3t9dS0a/Qz/AQtBjUb49v8Y4uGBcvmJ7w37UaVS/QlLPT0rVXTzV3DxXw+c+3sBZbtnMVNa/ QtTARt/FRM1R8sg4vt02uFBR407TTd/kPcrePvbZ6l1eydldx/3M5N/bWcViQ8zjTmli6FZL3EXy 1j/E0Enty9hF/8leYc9WcrtSP8LZXk3d1Uja3FXeb3tYvnk9zspMS+jYU2HcV9n76M9r+c9zbHV9 UfrnY2/w2WzR60u/5EJQyc08Z9NUbNpLXLpHQMTEP0+zUj6/2kvs0kXcvENEuNc71dFW/9NLT8Ht O9zGSl5v12P60D/OyErVfM/WP9PIR2vTz1Rfy0zj2E1LzexBdtdjTMrZSr5kTOjDUkGxS0K+3eRP znI/vWg3w8o/YeLmW97pSs7VPNG9RkzG2EfZ1kzI3EHhwF4/2L5PTdnVX0zL5Ux5Zm9d80xcv19J 8sPlTdTDe17NZlfPVEPxxVs9yb9GX9ftWuTVQ83KQObFVk3j1E1a0N7pT3zUe9hLZNHyYk/v125P 4t3T70vH0HJe/8tMX/5ncVVs9fNrbVbR2kzi1ddhe9/V6Ev72t5faNNuXmrOfk3O7k3pY1brdE1c 0d5N5NPnfnrh2+RndN7jV17cb15Z6NJPWNLraWXd8V/WaG/WeG996/5y3vpi9n3r5lps4e9iYfpw dupZ+dR8ZVzb2lx7cNrdWmz93OBRctbm+1z63+1oYN1yXfv87FdY2GFm4F3q7Wf53tRf8czsauru 82v7Xml4Umjr6/l94OHgc/Lm9fVi3vJc/vnwXm/mZ/13a+BuX2pq91tedWVe+mxu5Gzn9/Pffdrb 9WXe4mTo++J07u5p4Ot+blTW3F3Absq4X7nZ6r498E04RjI4PDJAQ0Ttf9HEyb27t7fHubza2Pr9 R0ZSQEZNRk9UYXJY3Nhl5uXzdVvpenDmbtTa6N9QTbS1Nb2qxL1lrbM0yUk+RCcyLioyKzZURV7b vK/Euau1tb+/tdbPb2PFUEhcXlA5R31CQk5eZUZXbl/4XGTT3d5x3r/f1NXNzFnjXDlCst8qr6zH yN6f2zyyP2k0KzsmMDAqP0hOX9qzuciurbiywbnHYMJDVexEVURwYD/xfVZeXd9aR1pKR05GT1N9 21LSxMzIzrvJ/8b4TDlJrDs0pr+2yr6gPcLHMtYrLykjNyQqPURcVrytt7KorK2vu7no3Ww7Vz9A TEZfSlDeYHLxe/lPSklGRj9GTlzt79DCvb2/ubjH2tjjTzs6M0q8Lk2rwa9jq6NEtVRmVyQ2Jiwv Jzc7U3/rt665sKyzrsPHx1LcPlJrPntPb+5J0Nnh31TjTj5HOz5CPE5Eds1uv724tcazvNLMS1VH OTwqNbBNL66oqr65ncTNyjdbKSsiHzMnKjFWwWW6rKysrK2ysrvvVOlNOEFbQD3251L9zMzs2NhK VHM9PUBOTTrp1tLHzbi+xMLczX1MRDxIPjtCQkW4rU+zpaqqz6m5TdQqNC0nJR0uLi41QLm7ua6r qKqttrm6z01LST4+PUU/T9RV38fGznPS8E1PPjxGPUA/VtZe0MK9uce/vs7VVHBcQEdES1BRSVCr tky0r6q//bFP+0QrNSs0JiU1O0xB27qzrbOvsa222s9sb0s5Pz9cbEFYy7/H/8fF2dtFSUo+PzE9 RkNYTMi/xre8trzDvFZcXUJBOERHQGlfV1jEqc7Mq7Otx8LNPM43KissMyctNjznz8vAsauvubW1 wcp4V0tSTDtKUlL88uHdysfybNN2TUlJQz5IR0Vb4N3Qw729xr/K3e5ZX0NGSkRQTVx+29dgWL2v z8O6vq+7v05Jyzo0LSstKzQuOlnoxMOzsrCts7nAvshdWUs+PkhHPkVS8OLUzuDJws1lVGJQST8+ PkxbYM/QyL69vcjLyt3wXUhESE1IQU1NTFBJzLjHtrS2rbGwzFvoOTouKCcoMS03RnLJwq2xrq6y rr270lR7QEc9N0I8SElK1d3Iv8e+ycLXUVJFRj89Q0Vi69jHycXBwcDR9nNOTUg+RD9FUUpzZkxf va+8tLKyrLC13+FwNTIpKSQlLCw+R23Cu66yrq2xsLjA03JVRD4+OzpBQEdo2dvPvrq5vcLOc2pH PTs3PT5FWu/Nzse+xMPJ3GxkWk9IRURBUFVReGFYyLW1rq+0srWwxdxVMjAqKiYmKik4SdnEvrS2 raytsL6/0NRtREM4Ojs/T0hQTXTFvLe8u7/NyN9ZQDc4NTtCP1Fh9s/Hvb3GwdLg2fh3T0hHRVtU TllNU8i7tq60tLm5ts7MRzQvKi4pLCosPUzMw7m6uq+1r7S5wfraVVRNPkI9SkxQ71h72sq8u7fC 1txeWUlBOjQ4OD9UYfDmysC/u73F1nz3/m1URkhMT1Ba/21Z38G8s7O2t7u6ysxdPTUtLSkuLy86 PWjexbq8tLm2t7y7y8zoV2tZX1FIS0lTX1t+3tfJx8fP3OpUTUlBPzw9Qkxp68/FxMXFw8XL0997 YWRWTk1JSkRISkvgzL63s662trjByV5HNi8uKy4tMDg9WunJwr25uba2uL3CydfpY19PTk9IS0lQ VVVtd9nTysjW0O5nW1NSRUtHRFBr3+TNzNHJy83W3etWWFZNSkRHRkpP+M3GtbOxr7Gwv8LsST0y MSosKyw0N05Uy8nEt7iwtrS4wL/W3V9RSkJKS0xPT05X6dXP1d7j19nj3/VcVFddV1xSSlBf+d7U 1d7X09Xc5V9PVE9TUU5XVEdE0MG9tLe1ua+xvL5hSzY8MSotJi0vR05N0OG8uq+xuLO9vcHC1kxN RkJIRkQ+Sltt19LO18vN2NnbfVBpUEZTXl1b497dyMXMz83mXGlUSEJEREJVUVFa/9zdz8vHx9hS z73Qw86+yr66ftFbXz09QC45MDo2RF5L2s68vbi1wL2+x9h890RHS0tQTWxPcd3j3uLSaX7yaVhU XE5RaF1t5dHSz8DDxsTJ1f3h61NMS0FASk9DSW5nftrK0s3F1Nzg6VpMT0VKTVJWW9vbzcrFzM7M 2Nfvfl9k7mr18dzh39DV0N3lbk9WS0hFREVCTU1PXm/n7s7LzcjMzdXP1d/f7fVpfnn3+/tpZGJY Vk1MTlNfceTk29PNx8rIzdPY3N5/bWlYUE9MUmNSU1l/bl1lV1tXT01NU05UZ9zOx8K+vLy6v8/R vdpVaOptQ1JLSlBKSEFaRkVOZPR00dzXzMrN1c3a7O95YU9fU09RXWxp39/i29ja6Njc6+7sb2ty bWFkcG386nDsz9Xc18vT6uJmWk1MSkdWTVFXamvz3d3r8uPo+XBvaV5sbXFt79vv187KzuHvw75m 7sfE73TI5HJQUUhHQTc+Pj88TG1c7dHHxcO/xsXH2d7g3F5be11ZVWhcWXB2affW8Pzd3Ovm2m9n +2had35h/dnufdfYcGr7WlBYVEpLW1VVdNnm4svMzcvUUey4aUjKvuBNwspiblZaSFc5PVFAPkTQ XF7MycbQwMfLxdjf4+RZT+BpT17+9l15dvjgamp86VdSc1hPUF5VWejt49nP19LN297h5WhhZFlW efdx39nT5WrJt21kvMXeR8duQEo7Rzg+NTxZPlbqwNXOub++xsTI2dleWe5bR1fa4HnUys3U2tvq a0lKTj89PUhHRVpn29TNw7+9x8PFzfFnZEtIR0xVWnHfz+BvucFVwsLLVu3JQlRFQ0E+QDVSSklt zsfdvL3AxMnK4t1iTFRJS1RXe2zOy83By8fW3nVXVkZKQUVHSU1M8Xnr3tHM28zP1t998mJmXWjt 9t3czc3NynpVwL069r/eWkbFSUZNOU4/PjVLZj9cy8PRvrq/vsXPz9lfSk9fR0V7z2Lfv8nKz9bo 51lESVRAO09RT1vi4NjG187H0vnq3GFPTlNWX1Ntytjfw8HU18tdTLfOOsLA6Ux5yjtYRjVGPzcz Y2hC277Ew7m8wb3H69jdT0FNTkdXTOfN0dPNvdrp3X5iRUY/Rz88T2BxfczCwb/GwsXWY2VeQj9G TkRUf2vQyc7exMNZTq68Obi7w9N4wz/oPCs+Oi0qP0tF48PFtq+/vLS/ae/wSz5FR0BPVs3hxbXB tr7Ay+piPT45NDE3Oj5b8tXDuLu9uL/H2HleS0Y7PkpJUWPqysPOzL7ASd2p60+3v8VR51I8Zi0q OjotL01m9L29vq2xw8a6y09NR0I+Qj5e7W3Gwbe6t7nCu9tQQj41LjIwNT5JXc2/vLm3ur/E2GNa SD9BQ0JI7Nny1Ly+ysnI00LFrz7ct8XAX8tHRF8oLDkzLC9LUs+3x7uqr8HEuNVSTTs9RUg1RcDx 4by2s7O40L3FRDo6PC01MjJOV1p+trm+ur/EzNpIUVNBPkRXT1/Z1M67vtXKx0direxMuLu62chf O+IxJi0xLSw6Rua0t8KuqbG/wcpuXj80O1Q+OFXRwcm5ureuxMzW40k1Ny00NDM4VMzuxLmyt7m/ 3MtqST1EQztKTmDdztfBu8TN0NNB369gZLm+vtDMSDt/LyctMS8vP0fbr7a/sKyzw8fvWnFDNTtb Sj7lx+a8sr67tb/l1lM5OjguLz45PezP3L2yvr25ymHtXD1CSD5CWmF0ycbWwr3I2NZNSLHFScK+ tMHD4zl6PyopLC4uOT1Hu666uK6ttL3aS2BhPDA/TkRW1c3Ss7bAt7vC2OhINzw1LjI5PE3e59C5 tb69v9Tde0tASEw/Rlhf1snd1L291d/aSPOw1k++u73JxVQ4YjsqKy8uM0hKT7iuubiztb2/3EBL VD02P0lI3sPPxbm5t7m/0tniRzs2NjQ3OTtO69fOv7y8u8Te9elcREJGTGJoYdvLzM7Nzc7YZltM QMK9c8DKu7XA0TpOSTIvKy0zRkhF3Lu6uLW7vbq/41dPVkdFQT1W+tfZ1cS+trrNzNDWZUE7Mzw9 OjlC7d3PzcO/v8bT3vHhV1NQUlpabm383dfTzd7b3+/dYVrHx9HA3szL1M8/Rzs7PjY3NEVRWX7d zsC8v8PHwcjO7HVeX+pSX1Ne+WzY58jIzs7a3V9XR0A9P0E8SU/31s3Kyb/BxM7Q1+PiW1BLT1JP UU9k/dnj3tTc19vV539d6c/qz/Tb0MzHa2VSUU9CPDc8QEhKUV/pycS+v8C9vcLL5vF0YF5BQu3Z 4+3z39POV0JHSEhFRj5MbOzZ18vKvb7IxszM0dhlT1ROTk9JR03pc+nq+tbVzeR8dll10dnx29nO y8nWZW5dUExFPTs+QEVLUVZ908jJx8G/vb/IztfS2ObZ9u/+W1hNSUdARURDSUhZ/OfUzM7GzsnM 6cdv0exy213RUN5eYfBI3UhiWFDmUdRf6txjzVbkdu3G2tHp2M7Mz9v8a21bVUVEPj9GSEpKUmPk 0c3SycK9v8G/zcTQ3nNZVERFQT9BQ0pLV2vm5dPW1szZzd7nzXDLfPfRbMlq1PRp0kXaRlFUQ2JH X1Jd+2rT6eHg9sPMzM3WyM3F1d55aVVMST4+PUFETEpNWPrcysrIxMe8y77K1M1m0050V05fR1JJ Vk9VVlJeX/j1cODc8Mj10sVlv/vmy1vO7+lobGdKe0dPUkZhTmb5Zdzw2e7u1+3Nxs7My9LJ1dfk UFtKRkk/PT9HTVhd+3zYxszKyc/Pzc/R3NzZ7fvjbFrdUld2TFhMW0RQZkfwW2rh0+XVyW/B1efG 4tjP3+Bw/2JQXEhOT0ldVV1qcnvY5dbd5dHS3czH6s3N+dnjXmJVS1FESktAT09NbmD3+OjI4cbK 78jSysvy0eh82vhZbHxMbmRKS1VPTWBWW+/ibdjSWMXibrp8arhnfbhL9Mg94mg53Eg74E5F6/RY y8plytdcxXFtu19rweTeyuRLaGZKTU1KQE9kTlptX3XdzdPUytrMyd/Lz2bM2k7P/0Lr9z1Tdz9K aFpWWu3bc2fPynLTyMzc/MLOWNjJ60f430RKVVRERXBwV1jVz3Pvz+Nq7MrI5tDLzM/dzOBMSmNT RENMSENOZ+9PV9bP39zL09/hx8vW2NnR2s/wU9trSVtaT0VIVVxWUVrU7mvRz8/W3M/O2O1y2tFk auJvXFJYYVtIUPxqZlpe2Orq3/7h1dfjz8nO3ujZ2+BoYF9VWElJSkRJUlNp5X1169HM1t7Y187K 0dDO3nnc2vRqWE9YVEpLRkpWTnnsYPHl4tXQ09bTz9LQ1djY3O7vbGZaS05NUVJNWWNrZffi3tfn 8dnR1MzP2dbWz9Pk9V9QSExMREVITE9X6vVw4eXX0c3K2dbNzdTa1978fn18blRbWk9VVlBLUltc Xm3mbvTSztPUzM7Qz9PY3Ol+aWdZU1NRUEtMXWNdaPfqa2zt49HPzc3NycjIz9ftYVJJR0dEREhM TVtpZ3Xt3dvPz8/Pz8zN0tfU2Ory8f1mWFxXTU5OTU1NT1hbbOfZ1NHT0c/Nz9PU29zl4ed2YFlX UFFNTk5QU1Rkd3523s/IxcjIxsjLzNfyaFZHQkFERUJHTlJaaHH219DP0dbX1M/Mys7T1t7e3fNv ZlZPVlNOTU9WV1VVW2R04d7Z2OPY08/MztLc3+nwbmFjW1paWlVUW15WV1tt3dLJzM3Hys3U2Nnu W0tEQkNGSU9bY19iftrU1NTY29va29PP1Nvp+vru9m9uaGNeWl5gXFxXVVldXl589Pzs59rPzczP 1Nnj7H1uYlxbV1daWVhWX+jYzMvLyMjJ0tvfaVFGPjw8PUBKVXnj2tPPycfGyc7S3/j78uPo/ndz bm52enhrXltcX19hbXZsY15hb/7w6uPf5d/Z19nZ3ud7aWpgXl5bW2RkVlrpzsXEysjJzM7c3uxX Rjs2Nzc5PUVa8eTZzMG8u7q8v8nc9+7o7WZXUU5NTlhjcWVcW1tiY3Xp7nxgXXng2dbU1trn5tvV 1+N4XVZTUFVcY2ZfXFlRW9jDurq+v8TJztjcfE48MS8wMjg9SWfv5NTGu7e2tbq/zOp56d3pXU9M SkpMXHl1XU1KTlNYafnubV5b/8/IxcjN09vc0szP4l1NSklMUlhbWUpBT9G7s7e6u7/I3eLdWj4v KiwuMjpFadvd1se3r6+yucHMbFJZbPRXSUlPZHvez8/dYU5SVE9LRUhKSU5f2cjJycfCv8TGy9pk S0ZGS0tJS09TSkRsvK6ss7y9vr/Z/28+LyUiKjE7Q0nsy8K8tKqorbfP6u9TSkVERTw7RW7EwcfL 0tDpYF5YSjs0N0BTb+3Sy8bBvbi2usXealVHPz0/Pz5BR1JTZrurpai2vsK+wltFMygiHSEsOlVU 6b2wqquppqy46UZGQDw0MDc9Tt3Asq+zu8bM3VI9Mi4tLTA7UtzKvrmzrq6vtb3OVUM9OTYzNTo/ TFdz7HDErKKfq8XU1MDdPjAkIR4fLD7k1fG+rqShqa26zWA5NjU1Mi00S8q1sKyqrLC9zW0+Lygm KCsvNkXZu7Curayus7vJ4lE9NTExNTtIVnbi0cvXxKyjoK14T13AzDYqHyAkJTE+5cXKs6mgn63B fF35QDMrKi82S825s7avqKKmvkAuMC8sJiIoLT1uu6ysrri2ray08Dw5Oj88Njc0P1TNub7XT76j nJ27PzhHv08uHxofIS5Mzbi+t6ufnaO7Rjg9QzUqJygzUciuqqqsrqelrOUsJCcsLignKznfv66q rLG/vLe2xEMzNUFUQzUzOmzHwMF1SL6imputZTxC3jkqHBgaHCxrsK6uqaGanKXNNSonJyQnJy0+ waaenaCpsa+25jIhHh8nMDs+R+rBr6yss8r1eNnO5kk8O03Uzmw/OUNc2t46PqadmpeltDwrOSYd GREUHC6popyXnJugp7UzIRsXHCMuYsiqn5yZnaW2TDgsJiciJiw928u9vMO+wcbPbmFLTWr32NbX 3N7O20c5NDhFafo7uZ6flJemtygpHRcfFBYaHuOpl5KVl6C03zUlHxsbHSRIv6ObmZieprw/Misn IiMnLT/Zvr66vce+wcjZUUI8SWPuzcvPz87V7Fc+NzY+YN9qtaOlmJmprzQlHRgfGB0lIE+8pJqZ mJ+pvjosKCAkKykzTsaupJufo6jjTjsuLSkpJys7PmO8u7Svu77H3HFPX05Kck1q2PrR41VGP0dH 6tbPra6mnaintjYvHh0eHCYiLEpPraWinqWqudJeNzs2Ljc2OUx3v7Ovqq+ytM/dUDo7LyoqKS81 Ssu9r62ur7W4wN9PQTw5ODk/REpTTGHPvr61rK6mpq6ryTsxHh4eHiYmM0Ffsa6knqOlrsNfPjcu LjEvNkVnv6+tqamur75uRjUvLCopKS41RdG9sKutra+5v99XRzs7Nzg+PUZKSW7Ywb+zq62hpaun 5kw0HR8bHCEhMT3dr62fnqGfrb1vNi8pJyosNkz3t62po6eprcDrPC0pJiYnKjE7ZMq6raysrbW8 x+xUQTs6OTo8P0RHT3HXy7usrKKdpaGzTEMgHhwYHh0lND63raGbnZuitMs2LCkkKCksN0zGrqSf nqKpueY8LCYiIiQpLzxYzLmvqqmssb/Xb05KRT4+PUBBQkREUXzOxrWpq5+eqKXEOjEfHR0aHh8k N1Swop2Zm5+ozUcxKCsmKCwpM227o5ybnKaz7TwxKSckIiQoMErPt6+trLCyvMnUXVFHQ0JCSEtG RD8/UOjCv6+mq6CirK7KOyojHB0dHCMnOMWuoJudn6a2y1w3LywmJyctPciro52eo6y52z81KiQi IyUuPl/Fu7Wxra+yvuBYR01NWFVLRUI/REpQ6dXBx7+pqqOhrbRqPS0pJRweGx4qRr6toaOhn6es umE2KikkKSwtP9quo5udo6rA6kI2JiIfHyg0TOrAvrKrqa235ENHSmxaVD49TnLreFFIXM65yNyv raufr7zTTTwoKRsbHiEuPMvAqZ+dnae2y3R0Oy8jHyctc76zraafoqOw10U4LiknIiQqM03OvLiv ra+wvtL5X1dDQD08S0xMUUxny7u4u79ta6iturM/esXFPyYqHyw3LCs60M2trLytqK22wFIySTst NTQ/67a3ua6ytK+6a1E/Ly8vKi03O0HszcWzsri1tLrBylE/Qzo0MzdAWs/PvrO2tcVWsarvz05P x9pQKkFFMjgsLzjqPzbAubWvuL61qs9N30tVTz8zP+BS8dPbvrO7yr7EfFc+MjM4Ly48R/XFwbyv q7C4wvZaSzw2OD4+SF9iyMLBvsX+u61D3sTrwdzHS87lLjk1LyowLy/r+FrBrq6wqK+0rMR1TUg0 MT80PEpPeMK9z7y6zMzKUzw+Ojc/PTpUztbHuLy8t73Ext1JSk45OT5CWG9na9diQ7i0R7u1trS4 tuq5bjdENCghKycoPDxNwq+vqaGurqy5zG1LMjxJLzVMR0fc0O2/wtnDwmRa5Ew9TUQ5SUtP1sTR zLe7wb/H3eh4TlNMPj9DPT5KT0BRtM7eqq6sra20y8c7PUAoJCctJi5JQt7Gv7uvr72utMjBwdtX 1FNAbU9ASllESm9QfMvWfdTRZfP2SEtcTExrdFvP0efKwMXIx9pna1VIST9FSEpNWVjKtlm8q7u6 vrXI1OY9Uj0vLzovKDs+OUzbxse5vbmruLu3u9bgz0VKRT0/QUtMZ2Rd18na1Mne4eZvUE5GQ1BU WPzV2tPOy8zW1evuXFFfVFRvY2V8YHZMeLpdWLO7wsC2utHKTkpJMi0yNisxTEFL2sjKv7vBtbnL w77GbNzoTFlXWU1ZVmHU+ufVyun851FNSktGR0lMYnv+29XO1c7Iz8rP0tTf/1xbVlBPVlZXYmj9 ddnN39TIx8rTy9Pm6lheTkhBREU6P0ZKTVN99c/J1snHxcfNyMrP09TN1+bj4WxXWFFYTE5KT05J TU5TTFx45d3Wz87Jzs7R1N/c42/39ebw+n3rfWZbUU5KTE1PSFTU1dbPxLzDv7+/wd37YGBHPD03 ODc6PUBWYOzOw7++vcHCxM3d1Mvc5tTk7eX8b1taT0lKRUNDRkVHUllkedzQzsbExMHBwMHEz93e aVpNQ0FCQ0FFTVReb21y2s7UyszFwsfFzcfP8l1YU0dEPkBDR0hHU2B1bN7P2NPNztLNyszExszN 0tzv4lxWV1BLSExGTE9OTU9UVWNo79rMysnDxMTLzMzW43l2XFRRTEtKS1BYWlZbYWrb1ODWz8/M ycnNzc3f6PJVTk5JQUdJSEtaY2Pq6Ovj2+nw9+7x49TVzsvGyMjL0tfqe1pPSUVBQEBCSExcXv3m 29DPycvJyMjJzc3b5+1uXlNRTk5PTU5RWFpbcfJwcebQ1tvNy8bKzc7R0uFxXlZMSUpIS0xMTEtW V1Nk7dja18/SyMPExsfIzc7X5P5nVU1LRkZGRUVJT1ZfZP7u39nXzczLzcvLzdDW2elvaF9WUk9O Tk1LSk1ZZmn118nNzMLCw8fGzNfkWFVORz9ARUNGS1BWX2n97ejW0NHOy83RzsrM0M3P2OP4/WpZ S0tKRERHRkZNUV/q2M/KxsjIyM3W3eHu+25obWpbXmBWV2NkUFTc5VjXzNnNzMjKy9lx3V1HSko9 OkVDRFJbct3Q1svF1dLEzdvL0+7d23ds3+JacOdkbXNkYFxOUlxMR1RcTlzp7/Pc19fS19TU4OPY 327q7mt6XlddSVm+W1S2xsbCur/tylNWSjY4OzctPkw5SNzP2MO7v7jAxLnJ3N3NWFHiTlZUUlhV SEnJdkbKwmnywOBf711dWEtKb1BE6dxWfMzX7tHR3tz69tdrVeN0TV31X0psv/lwuL/DxL7A691X W0I3PTk0MEJHO0/h2ezKvcW/wby9zcnHzGPj009bbF5HRmlSSGPcXGfV9PX2+fFcWl5uU07p81zu zt/5zM3p2tnf9mBwZlJQWV5VVHDL2ui8vsa/usDd0fJURT49ODQ0PT07SWddYM7IzcG9vb+/v8TJ 2NfV+V58XkhNTF1TSentWmfeX052YVVTW2FeZm3a3evOzNPQytPn295rXV1PTlFOVFlZbljeul3G ruK+ur7U5cVFVUE8PTM4NkU5QP5LXebF1s+5xsG/xcPPy87O1vfT/1RTd19BbutLVd9eRFtVRkpU V1BqZfDc3szKzc/KzdvQ2Ojf42lfWk1LSlJWV0/Jyke0vfm4vb9qw9lGZjxEODk4O0U2WFlNbtjN /7+/y7u/v8THx9fR3+h4WlhrW0l1dExa6lVIZFZGTWVXTGtvY3Hn1d7VycjQzsXV3M/WbGHrTUlU TkhLUk3O+GC5ydC9u83jvu1SYU5APEE7Pz8+Tk5RX9jhfMXG0MXEyM3JzdjO5tPc/9R+aG98XVZp TU1MSEhJTUhPU1ZsauDYzs/OxdDKxsrT1M3obXFfS0xTTk9TTm7RVti+0c7BvOHZxl5SUVE+P0M7 Q0FFTVxfXNDW5MXGycnDwdLLztDafNXv+XZ04l1zfGdST11GR0xIRUdQTV5sd97c0NDKy8vHysvP z9fi+G9bS09QS0tZV0zQ117Fv8fSwr1u59RoSUNPPzw+QkhETVl0cPfU0c/SzMXJy83JzuPO0N7h 3tTx6vpfZFJTTUtGR0xCRk1NTVj+dOLUy8jJv8HGxcbO5NrkXmNdUUtMT0lLUlpeX97Y2tLNzc3K zNbf5GlYVU5LSkxNTVhZWmhmbn7u6e3h6Png39zX2dHU0czMzs/L1+3rclhNUEpCRkhHR09UVGPz 3+bSys3KycbN0M3X63ptXlhbWVFQT09XWlx+9P/t6+Tk19TRztHP09TV1dbh5HxdUk9JR0hDQ0NK SUtWXH72287NyMO/wsK/xMnMzdt1a1lOSUhHQkRHR0ZLUldq5trRzsvKzMnLzM3X3OTwa2BgXFta WVhXVllZVldYX27159zS09DMzM3My8/W3etlXFFKSEVGRUZKTFBWY3rv2c/MzMvIyMfGyMvO0+F+ al5TTk9LSEhISUpSWl5qe/Pu3dTV1M/MzM/Q0tnc4Oj9cG1gWVdXWFZRU1hYWFteZnzj29bPzc3L ycvO0tx9ZlxTTktMSEdJTE5PX2176NzY1s/Pzs/Pzs7S1Nrf4Ob4bmddWVNPTk5PT1FSV19pe/Xf 2dfQz8/R0tTZ297uf21nX1tWVVNOUVpaXm378Onf49rW1NHQzs/Q0dLZ4/hlWVFPTUtLS0tOUFZc Ym547t/c1NPSzs/Qzs7R1tjh8f1zb2BbWVRPTk9PUFZWXGBy6+Ta1M/Nzs/P0Nfg6XZkZGNcWVlV VVZYWV1sdfbn4ubi29na2NLQ0tTZ4e98a19XVFNRUE5SVFddZWhq//Ln3uDc3NnV0s/R0tbY3efl 8W1fWlhTUU9PUVRYWFhfZXXr3dfX1dPSz9DY2dnd4ep3Zl5cXFdYXFxaW1tbX2hv/uje29jT0tLT 1tri7X1pXlxbW1pYWFVVVVhcYGxy+ebe19PUz87O0dLX4eXm8XBnXldVU1FQUVdaXmBkbf/v5t/f 3Nra1dPY1tbe6/h+a2FeXFxcXFxcXWJpaGtw++3j3t3X19jU1Nfb3ef6b2pjWlRPTk1OU1dZXWdv fung3NjX1tbT09PW2dne5/f+dGdgWVJTVVZVVlVWXGFv9+Te2dbY1dTV1dXX3uTk6ntrZV1aWlpb WltdXV9kbP/p49/b2tbW19rb3ejzeGZgX1tYV1ZXWVtaW15lb/Xs6+fh29bR0dLS0tTa3eLvdWdf W1lWVFNSVVdaXF1hb/zu4NrV1NLW2drb3+v3+313bWtoX1pWWFpcYG339O/r6eLc19fa3t3e4+r0 fG5jX15aXF1fXVtaWFpfaHHv5uXg3tvY2drY19bZ3eLu+3lva2RfXFpZWFZWV1xfZGv5593Z19bZ 2NjY2t7k5+/5d2hkXVpeYV9fXl9hZG52fH757Ofh3dnZ2tba3uTu/m1kYV1ZV1ZXWFtdZWlub33u 4t3b1tbY2tnb4Obvend8dmtmY11dY2ZjX2RnZGpvcfnt8Ozo493c4OHj5+fk4+32fHFrY2ZgYGJj ZWRqb3r06+Lj4N7d3uPp7e/3fXVuaWNjXk5izPpTWFh0fW9kafDd195v0MNnUsy4y0tLT8/ISzM5 5c1QPkVqycn2V+S+yFlV1MHPcmNOZL67alK7ssHY19l3XUItLTo2Kyo4UW3dzb2uqa65trC3zVdK VV09LjdSWkJCadjN6Fv30NpOSFVfXEZJ7snN8cK2ubvI09q/zSYgpJ8j5q2ppGq6Lr62FRsiLR4c LDqmpLixl5aqtr+4/C4gHjY7JSzOrqmvtqubpUVkxlApICAmMispVq60uq6npK/YTNRhKykvOT0/ Pl6ts9C0TjeVlym1n6avMTkiSCgMGCcnJTZWqZCXsaCWqGIxJCEsHhovy6+yoJ6cmrXru9MkGiAl JiYlOba11bioqbPhbMK8SjFM3lJGSXfE2lZXXc7GJh+SjzuxoZ6iSyURKi0NDhw9yK2rno2MpV3F zCgYERYqNDxeopKTl6OlrEkvHBogIScsSb66s7S2r7nyYFlRQEZhSnfgX+3g5FZFSEZL3F4iQ4iR w5mnmqojEAgcFgoRIbaUk5yUio/WIRsZGxUQHLicmZuWkpaiMB0aIykZIUqupq7O37npLiUzU+vf XMCrpbtp19LZPDEyWdYvLsw5I4+JuJiaraM3GgULHQ0VL1mbjI+bmZO9HRYPFB8tLcKXjpGcorlq LhcSHcW/w6qpoqVYHx4sLiApSr+kqb+8p6pjNDFDWkFAZ9lb1/UcIYmKwZetuZ9GGAIKJhch2Uyb jZKezq83Gx8VGj6uoKCcl52qyiUdHBsruKCmp6Kx1jUgHR4qODXsuLWss8K+ucI8N0JN4NS/x0ZB OBkeiomzlK5OomwmBQUjHDmiVqmTk5TNLh8RICMlRsKblJeatEHrMSQbFm2emqDIy/pQMRwcLEhr aO26s7O808O9v0g1P2/Oz7lPKi4tHs6Hk6aPzsd2JSMGCx8Yr5uvn6qclvY4FQ4oNcPDy5qZm5lr Li0eKB48nqidosf2Mi8hHys2SMvOYr+/u8LNwsfDVDs9Z8W8yD8sKScjoIqamphewVwrGAkOGiO1 nainoKKerT8aDxc1uLOrrqqbmq00IBwkP7GlsKitvMs7KhwiLjzmT03kvbC1yMu0sL89Mj9P2s3f PDk6LCs2mY+ck6VpcCw4FQ8VDyK+o56op5yYnMAbEhEfTWa1tqmcmZy5LCEpSbW+1ks0aO7SSzA6 Qe1SOTs/7rq3sq+wsN9OSztETn0/MDs7QS82mpSZkafYRTA6GBYRDBgwsKOdl5OSl6ooFRASHC7U tKufmpmcq1szMDA7LyguN3zEvL/vZUxIPzxOVs+ysre3vMzkbUdBW09EQTg5QeXExLaurr1ewrfZ SCogHylp4b2xrqurq841KCInPc3PxcK6rbG7Wj0/RMjG1t1Z1M/PWzYxMj9cX9PAvLK2xd1PQzpB WGHMxMnR3H5MTVlLT9vIvcDKzvDaWjgsJy5D1Luxrq6utM1ANC47X+7qSkvVvsPIzGzq0dVTP0RB T1xOS0HYzMK6urXDzFhGRjg3P9zGz7/P08tvSjg9XFXO5ErGusLbVGFVVVM/QPXIwr2/vdtvW0pO T05n7MPsRUVNW3HmXNfAycfsaWRoUD9DPV/Pvbi5uMrTaUQ9Nzo7Su/Xy8rs1c/fdkn669LA1NPO 02A/QD9JVPNu5MDEvLnVX0BLQ0dGSkvpvsLM8uLeTuZZW8rL0F7X4EhMPztBT9LLurS7y8xyTks7 Pkli1/zP0c/QZF1HVvtg/NfN0tTc+0dKSEFU4vDhysS9tsFxVUVKT0pOU1/Jzt1fZF1cTlxrXcPF z9z82kxSTjlNX8a/wb3P3NdfT0RGQ0/cz9/c6NvnbmBEbOHPydhtaebfWlZJXFHz8PTd49rN09pk XWtfdnfd6Nzha2ZYXm9NSmdw0MLJ2/FeWnleWzxU+/TK1tfezcze+EDwUmrIbPnsWO9c21ZkztzO 0uhdUVRJRERYc9PGztPW79RoVlZX2HvP5eXMdOhsWlNW92T3Z1d56NJsfF5b1HLPWmDyU+TaXOZ4 2N7c4dto7+JQ+U5U5z/QQNrSzb7P1e5gVEdHSlfc3cbQ1c5g0kdfSEnp4cbN1+Dc5N1PTEZ8VODa WMdR0ORR3ENn+8/e4+tZ73HlWfZl7t/tzW/Z1u9+U2NSVF1H+lzextvAYNbkWtxOV1tV13fPbWxd /m9V7FnY1+LKTchaUOZBaHda08zj2OBn2mVd803e2P7NX1h1SuxM+OZjxPzM3mjbSONIbF5az13F ePnIXdxrRGluZ8pib8xj2c5L6UlOaFZ/3dXOx9Pc4EfwS03uROrS98vW69BgYeJOaeNY6eFq3GlL 409y3FnY2NvL7OhqZWVVWVd569nZ7u/eaWl8Wnd27s9f5+Zd629WW1Jb4d3czdnJye76UUtWTlRb X3Xc29bW4vh4bG3m7/3zdHL0W2JcaHf+3fnf3f7c+XDpXWHjWO5489jn3nbten5nWXR+3dvyfWxp cVpaWF1799zl3Nba125sYFvuX/X6Z+5qdnN18fXt3+vV4d5+ZW5aamFfanvs3/3l+G1qX2vycOn5 fOjh5+54dGhqa3df7ODa2OL1cV949l1uYWr+7vLm7ezwevNtaPPv/u/+auxodGRy6W7Y4efr6PFo eltPcuJQW+XZ9+Lie9t8YVbn2/Tmfd7W329fWPF+W1n51t/xcOzjfVtacH9kXnzm3exwaed3d2n4 6PTtbeTs4mhefG9sZ/Xu4uN75+VvX1Vn93n7ZPTf19xu7H1lWldz6Nj64M7m3v1XXu5dUuzq7t/1 //HrambfZ1V2X2ty42tv6O32XuTPwsZiW1he3/NDSVtP4s1s0M9Q0svqzl5GZFVi3WpjW1/WyfJY 8O7ez9ntdVZkW1X3aE5sZXvL19/f/e/i1uJZVvB6bupqWPpwW9hwVWv1z9hn+Fzt011OVF3a1Nff XWz2d+HbdV9j6uXl3nze1/JeWVJObtbc/2tfZ/Hm4/d6cf3s7d3cf2ZfaW174dvya1tf/uDc8mNd Xu7n/Hpl8eXj6GhfbXjb3fp3aPzk7u3xbV9faund3eZmUFdn6trsX1163dDW3P9fYV1fYVpj/Obb 2uf9/Ojf6H9eW2Bs9d7Z2/1hZ2zf3v50Xmz76ez5ZlpeZXLx7+7l8Pt++/bs8uvuc311dHT37v54 aGZpdO/b3t3kdGtqamlcY29xfX7v7Onl+vT88OLr5ejl5vZ6cWFbVllfZnby6d3i6OXud3BwaGZx eft7fvj68Orp5+zw+Xt1YWlndPx7e3Lu6eDe29ri82NbVlhgZm316/Hu+Pv68OrpfXBwdXZvbmZl ZGp3fe/s5Nrd2tzc5fppWVdYW2/n2s7Fv7/Dydt5WUtAPDs6Oz5FTlhv4tLLxcXGx8nN2vRnXF1o fP7v6+rs5N/r7v5uYFtZU09PUWvcyr+5tLS1ucTYTj40Li0sLS82Pk160ca+urq6ubq8v8bN3P5a TU1MT09SWF91/O7s8vhzaV1WVVNXW2J749TMx8bFx8zQ3f1eT0dEQDs9RVDexbewr660vM5bRDYw LSwtLjU+VOHKv7u2tLO0trm9xt1hTEE+PT5FT2rf0MzLzdfoYFJLRUJAQERLUF/o1MrEwL6/wcfO 221RRT89PD5KX9m8saupqq23xVo8LykmJCYpLThG8cm7tbGurq6vs7e/zl9GOzU2Nz1HWt7NxsTG y91wUkY/PTw+RExe48zDvbm4uLq9wc57Tj86NTQ1OD5DVc++sayop6utudFNNCwmJCQmKi48TtK+ ta6sq6ytsbnF7Ew8NjMyNz5N68m9ubi6v8rjVkU8NzQ0NjtDUe7KvLezsbO3vcfqTT84NTQ2PENQ etzTwLezrKqqrLbBUzouJyUjJicrND75wLCqpqSmqbC+cj40LSwuMjxFZ9HAtrCtrK60w2Q7Liop Ky42QVjdyLy1r62usbvUTjszLzA1PEhc6NPIv7/Ctq2uqq2zwlFHMy8uKSkkJSUqO+SvpZ+fpKy9 1U1JPzgzLCstN2y6qqWlqK++3FtLPjcuKCYoLTl2vbKurrC1trrAz1o+My8uMDpFWejJvbm0srbJ T37Nzra1usZaYT48Pi8sJygrMmHCsq2srrO2vMtXOy4oKjNNxbOur7CvsrS3x1U2LSkqLzQ8Rlvd yLi1tbm/xNDWZkc+ODk9TW3r3NjPyL69v8ftTTcuRMLAtbS1sbOru0kzIyEhKC8sM0bCq6Gep7bL fkw+OiwoLD3bu66vsqupq7xZNikrNDo9PD5I3bi0u8PU7+vT30k8PD5M8tTY5djX1MnHy950XUhF QDsyN7GpraetqK+ztDQnJB8fHiEnLs2po6Gko6qyvUQqJyorLjlJb7eop6eprsJ5RzMqLTM2P1rU y723wMrP01xMTUU/RlVZY9DG0t3hdH7d2mBDTWrx2W5XRG+lqbuusqm4fVYnKSghHRwqPXO6q6Sf nqKz2FU5KyUnKDBI476xp6anqrLHQj42Ky43SUxg+PHGwchzWm9oXlNZX15mXVd33+1aeNrNx87b Yezj3/xXXD+8ptrJsa6pX/FNLjEfHiAkOTtHtaWfqaums75bMissLScrPs6+sqyppqixxlQ2OTsu LztKTnrb3MS/y3jR8U1PS0xT/VVT3tPkeuHYzcnRYfHQeFRQXFA/u65OtaqtsvW6TjczHyAkKCgu Zrqtpaampq2/T0QyKiYoLzdhxLerpKOorblcO0UvJyw2ODxs6tW/vczLxu5tbFhHVFlHXuhpU+/U 18jI19fFxftNVF08O6+7QK6srb/AsDg5LyMlJSgmNtDDsaanqayvxUg/My4sMDY+3cy5qqmrrrLB +lo8LjA3MjdGUV1s1c7Gx9LP0vtdbGhdV15VWW7z0s7Mzs/aydFOSU5OOTO2rjmzpa6uyq5MPD8g KSkmIi7nccKvqqmoq7nE0EM2MDIzMUdI27e5sLKtttbL6FQ/PTs6QT89R3NaV/7P1NHEzc3N2O3r +11LUVtb7fbmZPfYYuHY519pz/JOxrncx7y6wdTLQj1EOjMvOTc+S1hr3MXJysbDwtDPyNvZ/PzY 6tpm/eJZXVxgdn3w7+XdaWDrbk9RW1lRWfJu5djMyc/K2N/jaVlKSEZKVVdffOzXzszL0tbg6/lv V0tSTlVp49fVyMTHysrM1+V4V0xKR0pFR1RWW1psbGN3ZmVs7u187eLX08zIy8nKzNHpeHVhU09W UFBbbF9XaWdob2xpXGJy9erg29fP0NPazszX9GdsX1VUWVRea1xfWWxlXnFo39jOy8/R9NnA0+72 UllLQzo4RkVPTVFn1r+/vbu6ubzG1OB891RHQD9ISU5JUunc3d/qZHRvV0tUa2Vbbd/OxcvIy8XC 6ut2ZFZLV05MU1tfWF1qat3k98fMycbIws/J3lRVTEg8PUE9Q09OXeHLzNvQ0tHOz+Hh2eb5/9Hz e+Rg483Ta37P4mJaS0pOSz0+UmJeXOLTx8nkz8LC2Gh87uxXSVxvXF9ReNJWS7yy3suzscDQxlNL PysoLzIqLEP2zru1sauqtb69xU86Pjk2OT1GZcnKzrq2v8nO6E72fj5CWFJDT2Zf59z43MDKbevS ZE9PQkBHSkpf1M7Lwb+/xMrV6fBSNz619jTBtLTdxLBq0EQzOzgzJjdKPEj3vsa5try0uL7s08tC RUVGRURtUnTqdtTMzvq6tubmyM9JRkM7Qz87QtXeVsu8w87GzvThWkRPU0hIVvx72tTMws/Pxsxn Tc/QSF3d0+Xn0+vP3VVVb1I6PD89Oj9KS2Xh0cK7ub65t8LNzc9eUk9BQ0lESHPd8NvM3vzieFNU W1VRXVtp5+Xh2N3Yz8/Q0dbp7epnT1NWS0xXYXD97+HR1N/Z2WNg6mVuVW3LzM7pyb3Mb2HdV0A5 PUU6OT5TXVrm18nCv76/vL/FyMvV3uJrX1NHR0c8O1dgSUZkz9PvZuDR42rm3ezz3M3Lx87Vy8/s X1VOSUhMTlFQVmz88v/t1NTl3NLX1dnQ1drW3Nro7m1cVU9OSUhGSUhLTUxfZv/n2cvLxMTCv8LE zNjleVhOU09OT1NOTFldW2h5+X7n5Hzv6vLy5Nnd2dLW19nd83D8Z1dUV1dUVlJVX2xmb+Lf497c 3d3Y3drS0tTV0tfb2uVhV1ZORkNFREVITVdffvTdz8nIysjHycvO0tbidl9cVU9LTlNVXFheYmRt bn1o8t/e2NvW1dXP1NLW2tzr/mJYTkpNS0pNVFhe/fft4d3a1s3Nzs7P1Nvd5fl0aWNeXFROT1JQ VltbYGdrZ/rq9+3m3+PZztLT0M3P1Njm83deT09YT0tOVVpfZW5x5t/t4t7h7uPV1tTT2Nnc5nlr alhUV1pUT1paW2Vy9ebY2tzT0dje3Od3bW9pYWlsbHV/7+vn6n/7bGBdXF1YVldlffXs49nY2t3a 1tnf4+jzcV9dW1VSW2NlaW57c2xz7+vu5NbS2d3c2dvl7fv4dWdmYV5WU1dZWV1o/O3q3trY3ufi 4ux0bnJuaWr57+zt7ebj5fRsZmRkY11eYWBodvv88Onn39va2+Dg3+LycGlgXFdaYmVsbHr2ef3z 7uvq7vTn5+zp7e317Oz27/prYWdua2hfTXjI4F5PbNjoXk9o5+Nia9nPzeTczcrTdlxq7/pVTVNX V09PX3pcV9vM1Glc383Tblp13eNvavPc3/J68exyXl9u/XtmZWlp9uzs7vvy5dne9/7o42ZdW2n3 enz+7fn7bl7dzu3j0szO29X4fvVORUZMRkJJSk9bbP3hz8vIyMfGycnR3d9wZFhYWE9VT1NbaG9j dPX28XdoXuvkamzk1tvb/OvP1npcfP9+fVVXaXhiaej5ysLfyL+/xdfLX1JPOTY2NzY0PUBK+dbI v7e2uLO4vsbQ1npcT0xNSk1MVl5fal9qWlVXTU9OT1JYfO3ez83Ewb/Bys3d6/JuUkdKTEdIPjHG p9zMrqynuLTvOdkuICAiKCUqOkq4q6+opJ+lsLbeSkIxJykvMjVGyresqaqpqrLJSDUsJiUiJi07 WM23raimqrC3wOFFNC4tMDc6OUHWv7lUW5WayaOyqKlVWRkiLBUYFxw0R8GuoZWZnJ6wrd0tJBsd HykxOruln52cnaKqxTcmIh4bHB4pPN27rqaioqqxucNPOTMvLzE6Nz3dvsLIuLm/W8uWom+ozbG5 NDQUHSYWHBwswLCfnJ2XnKq8NjYjHCAbITrgqqGcmZyboL5IKCAdGx4fKj9utrCppqusus9XPEE6 NTo+ZuLt211txrvETU3bzFa3lqW5pcW6PywiDxkdGiUvwaeclJadn7Q9Kx0cFxssL86mnZiWlJ+8 zz0kHBkZHi/s0r6qq6iuvvA8SzwvNTp5zb+4wri7zlc3PT1GYD0/5r7Lno+pq65azyAnFgwhHytM vaCdlZWftN0qHRsaHh4/squbmZmdo6lJJR8cHyowP+ato6q12j8+OTIuK0Hqzbi3rq+xtt1SPTQv Ky8/zL3jyLW7sZKWvrM/OC0hKA4UKCzTvKupnpebrUkuHh8hJSsvs6efmp6mucNJKikqIy3bvbWy rrzibjEoKS45R9i9uLGurrO90E08MS8yLTBH2ba3squ5scM+oZ3Jyi4tOjDvHhkmKN+6s7S4qJ+l vDsgISg4TTdnvaudn6m9dF46OTspJzjOr7K10UTeYj0xLjhGwbvKz8a7tbjLRjY8Ojo7PVnVt660 sre+zDwlIbOmx6vWyLisqCEaGhkoSclexKSanJ/BJiEjLy0tQ0yvnJierL47Ky8uIx8oPrSfnq3C zHdNNiwiJ0bfvbq2rrGttlc9MC80OU1KW724sa/C9lE9MiQlsKClmqaussDQHBYUEh89tK6kn5yb oLgiGhgcKzy/uaiamZylxysfHycqLDtesaKfprx2PC4xKygsPMi3rKuvt8bKXEA1LTI7R/PLv7mz sL9TNjA2NzosV5mYmJiz2S8sKBIUFBg4rZmZnJ2hq74rFxIUI0Oxnp+cmp2kwjAcFRklPMizr6ed m6PFNB8dIio1PVjKr6Sjqb5JOTQ2MC8yNVK7rqyxvNpS91U/NzE6OeqcmZ6bsU8uJiwYGRwaNLSd m52hssnXOiAbGiE/rJyeoaeutsw9HxodJliro6isrKqtukUiHB8nOdm9vLWsqa+4dy8oKC82Stbb wbKrq6+/PzU1Mjo9REhRfKuVmJmhPSocHx4WHRsnup6UlZqobzorHhwaHS/LnpmZmqe7RjAoICIl LfusoJyhsls4PjEuKyYqPb6sp67JT1jiX1Q+Mzddxr+6w2lT8dXc5eJRREZVbWnLy1ncop+lpE0r IiU3JzEtJkG6pKCisFw2Ly0pMC89zq6goaGr4EMzLzEzPj9MxLauqbXxMig1P3DaPkJF2rWyr85Q VD5V9V1BNlXjvq2zx0ZGPz5dSTUuO9m5rKy94q2iq6rDLSUjLy0zSSwwWr+up6jASjwyLjlCPl3H r66qqcHcSzw3M0hJW7+7urq9xlA4LCgzRsy3ubnFzdnn1lpAPUBQzL/M3GJMQ0VTSVr1dM/Cu8Zd WExNanFhYOmuoqWhsUc1JSYkJCspPMa1qKWque8/LSgvMz/Mu6+rqq6/zWU+Pzs5P1DVycPKY01K VFRLQU7dv7C0uuo5NTRQ2sW94e5u+t1cTTczNz7evLGwt77+SD04QFRe4dXS2beip6esQjQoJiwp Oy4vVE+9ramrsL5ELiwtL2TDu6+urLGxuN5JLyglKzlSxr3DysC9wcDPPTAwNVK+rK2wuM5iWFtI RD40MjM9VNi8u7y9ycXdb1g7NS85S2u9tK+vs8RXxrzCs75YPC0uKjFCMDxCO3DEsqyrqbprSjAx P0vS0cbJ4L7Avr9ePy8tMTlc2Ma4urm71WpTR0dCSFjMsayqrsNKLykoLDZBT1pe1cG2rrK/cj02 NkNg88/Pz8G/ubrGz0xAOjRE4sOwrbW8Yz4vKi0qMz5PybmsqaapuG81KiYrLz7hxrm5trW5ucl8 RjUuLjNB3Lyvrq+6+lJFRWb0f1dMT1TXxszZVD47Pkxg3czKysjU4eHl19Z4STw3OEXmxr24u77G 03ZEPUNL+rm2tLbSYjs1Lys1OkvPvbizr7S5x2Y3LiwpNEbWurGut7rB2m1KOzU0OEL7vbSvr73Z Uj9DTVZob2JQTVtzzcHAyvNOP0FIUvHq4/ZlZvrQy8zVVUFAQU/cwr2/v8zj+2NVVFpPWm3axrq0 u8VeOS8sLjM+Zci4tbW4v87kUTw1MDE6TNC8sa2vtcDkSz48OjxCSU9v3c/Dv726vcXeTD87Pklk 1c/Q0eRvaF9PSkZBQk9w2cO/wsfZ+VVRUk5o69rN0NfqdPLizMvd5mBYcG3a1t7eVE1EPkdKX+Hd 3uHx7uXh0uHqaEpLRkxg5MfFwr7Exs3nXEQ9OjpBTPvNw7u7vL/I2WRRSEBBSE9v2M7R2+ddVE9J S0tRZ+3R0M7P3OJuXV1WYW723tfJxcXI135bUE5SXmVQTnHsyr2+vcjtSjw4NzpIXe3My8zN2N/l fGRQTk9S8tXMxMjN2mdSSEdPXNvMyMTO2uLq5un0Z1RPTktSWltt+Ojt9u1pafPm3+12amNmfe3f 08zKzdX7U0xMTVdj9d/Y0+BpV09QWP3WysDCwsbO315KPjo7PkVSedXHwL7Bzv5PRUNIUmL239zT zs7N0tz+XFVOTlr40sjEydbvW09PT09SUFJf8c/IyMvb9l9PTEtNWHjf1M3Iy9LfaFNKRkdLVWne z8vMztLc7WFRUFdm+d3PycfK0eZnVk5KSk5VXW3s4t7d5nliXlhaZ2plZXL24NLO0Nbd8XRpaV9p e3d+efjr6d7e4+l8b2ZeZGBo+fDj5eLpb2RbWV1q8uHb3d3k/GRdXl9ibPbl4eHi5Obr8HFmXllX XW/j19PQ0Nfpa1xWVllicvXn5N3c4fFyZ1lZY2Bm+/p1bnT17eDe5uPu/3dtdWz86u/n5e53X19g X2lsd+7i2dfc7GxiX2x+evl+e/L67OTn5vRvYVtdXV9t79vV1trudGVcX2Zsamv/8Ovf4Ov4bmNe ZXPv5ujo5enn4uXua2RfX2xwevzq5Ov2dWtv/vP3+Pd+fHz48/52bWRsdvj0+fX26+bn72tfWlxl Z2x6//Pt7eLe3t7n5OPl5O9vZmNscnX7/Pnu8HBkX11fbHzx5ur2eW9ybW/77+ne4Ojs+PV5bGxu cG5t+/Lq4fD6+X56cHZtYGZr9+Lf3+XvfXJvbG50dnZ1eXz76+Pi5v1vaWRoaG9+9/Hz8Ozr5ePi 5/5tYV9fWl9o/+ri3dzl83hoZmNpe+7g29rf7f91dmthX2doYWJw+u/n63xvamdt/Ojh3d3m6/V1 dGtoa216/fPq5ebu+v39c3BtbGxudHhxeHr47vX0/Xr98+ns9vfy/G9rbnh5fPny9P/5fnh1/O3u 7Ovo5vJ2bWNhaH19f/59eHT9+PD1eX77fXl6fnp8+/Lz8+3s6+73/Xl+e3z3+/j4+vl7bWRjZGps aWd07uPl5urt9Hx8dXz09O3u7vD5dHd8cWxqbHVtbHj88Ozl4+v2dGxsdP3u6+3o6e/0fXRta2tv cHr39fR4bG5/9vL1/HtvdPnv7ers8O3u8X5vbWtkY2hw/PLy8evr6/Z9eXV9/vfx+3j97evq7vl+ aWdoamxteW578/Tr7fHy83Vwenr8/3v9cXF8eH368Ozu7/J4eHtzdnz58Ovs9Pj9dm1qcP3w6+96 dnByb250d/79/Pju5eXp7/1vbG9wdHdzeXr48+vm5+r5/nhsbnN8+/fw+3d2fPjw7/51+vb4eG1p aGtx8evp7/v+dGxs+/D08v58fHb48O/0e3Rwbn7w6efn7PZzaWtsd/307/r28/h8/3twbWpoa3L5 7ezv9/f16+94e3l6/vv8+Pb19Pr8+3NvcW92cn707eno7fh8d3NxbnL69n5ydvz/eXV87u33+vj4 8/H7eW5vdHJ1/PH9/PHw6e3t7PL5fnFsa2tqbXJ0d/ft8/Du+Xl0d33y6vP8/v7+/PX59/t6b294 +/X+e3t0cH1vY2ptevfw7u709+3s7n11eXz07vH1+vv29O/3eHl+9u7w/Xt7c3VzbG16d3Vwam98 8+/r6fT1fXR5cHFzfPPv8vjv6eTk7fl3cmtoamxsdHV/9fn3fHl69e3r6fT2/X77/Pt7eHJyefv2 8/X+/vTz9nttaWZpamx3f/Hz8+7w7evp6e3t8X9wamdtcnr9e3Rvb/z29/R4c3J3+PDy+Pz+/e/q 6e/v6/h6fn58enhwb3FudP3t6+/u8n5zbGxrbvnz/f/7/fzz+Ph9f/77+nx/f/ju6ujt9Pp+//t9 /ndub29vbnh6dnRwe3t++/3v7enn7/x0d/vy6uvs8/T8cWxtbG5ub290ffr4fv73+35wcG94+375 8vLt8fbv6OTk6fdya2dobHV7cm5v++7u8fj4/H9++vd++fp8e3l8dW9vcn1+8+/z7fLx6+nv/m1q eO/6/PP9dG13dG5z+/l6dn16b3/07uzp6ujq7/p6931ybG95dHp0cW9obHd7dnp8ev379ezr6Ov7 f3n+/f75d3z48e/t7u7s7enqfW9qZmlnbXlycm5yd3v5fnV0+e/0+vjz8/13ePTt6O718/77+Xx1 bW579vHz8vf7+375+nn//fx9d21rfff07vH3+nxzbGxteP369Pj47enp7O33b3N4d3Ryb2xsbnR6 9vP4/P78/Xz7/P74/e/r6ebu7erwe3R5/3lrbnNrZ2dvef7u7e72fXxwb21sbnd2evXq6OHi6+34 +Pv5fHZ0bHNvdvHr7/ry8Pf8/vp2bGpka295e3N6/PDq6Onj4en2dG1sZ211cXZ79/b6/Hz79PTv 7ujo7fl1c29xbmhrZ2htfPbu6ezv+vzv7O/2/n36+fv39/z38/1xcXZtbnVyeXd3d2xvbmxuevb1 7+/q6+zu9O7q8fx1+PL49P17cXJ4eHj68e70d2xsbHH89+75fvz9+3h7fv77e3BrcP99//v27ezv 7ezt7vf+/Xt2+/j/e/9waWZpb3f+9vn07ers9Ovu9P1vc3d6dnFyc3x6/vb8/Pr5+v329Pn9/Pz9 ff78e3Z7+ff4f3t5cW5qZ2t+/X/38+3p5ePm5ufve3n9e3ZzbWp1/29qbGtqb/3v8fHx/XZ3fXN0 b3P97ubk4N/m7vT5d3B6f3Zsb3t6fHn+9PDz/P9/eG9ub25tb3J4/ff48ezr6ert6/L8cWxxb3Fu bm9xeX5/9e/q6urp7/h5b2tt/315dHF7/fX3/v/7+f52dnf+8/n7+/58/PTu6+np7v17fHdyfHhw d3Vxbm50d3NwbW10fPTr7Onp8+7r7Ozp7vb0+3hweHdvdntta2tpam15e312e/Xu6ujj5u3t6+bm 6/h/cGpqZWJiaX74+/j+8e748vz7/H3+ffj4fHhxc3p9fvXx7fH9e3F0/353b3R9e37++PLy7/Hx 8fb59/r9enRvbG9+fn12eHxvcHz9+vf15+Xu8Ozo6unu9P56dHJ1cG1tamlmZWVmaGt48/Du6urt 8ezq6ufu8Orn6vP1+29wenZ0bmxtb255/X16c3F4en/6fvj09ff48+7u+Ht99fh+eG92eHr7/vz+ e313b21uf/j59fTv7+vq7O98e3/+eXx8bW1ubGxtb2929evm5OPq6+nu+f54bmlnaGpvdXz78err 7+7y+3hwbmltdnn67Ors9fX38+7v6+ru+fr9/XZzamFka21wc3T78O/t7vn8+v59eHj7/np99e7t 7+/y/n14cndzbnR5fX19ef76+Pr9+3718evr8vl+eXR0c3NxdvPy/nh5/vv6+PX7dnl+/f58+X7+ /f7x9/38/Xp1cHZ2eH7//f778+7v8fP08e7x9O/vfXd2cXd1bnF7en17dXZwcHd6//728/j3+Pv3 8/f3/vv++O7s6Ovu+nJxbml4+3t+/fr1+Xx0dXd4dnz87+vz7vP2+HtxbWxoZ2pubXV1e/bx7vDz 8u/u6/L27enl6/J+eHNudHd2/Pf47u76c2pnaW5ramlyf3328O3z8+7x8Pf5+fbz+fnw7vfy8/n3 /nFramprbGxsa3nt6uz0+/Xx7uzq7ezu7+72d2xtbnR3cm9sbnB2e3348/L0fHp8+/Xt7ffy9Pt7 eHVrbnR9/nr8+vnv9v9+enV8fn11e/r39PX17+zv+P58cHN9fnl2e/zw7vL0f3d9fnl8fHZ7c21v cHf47erp6evt+XZpaXB29/H2+vr68vX48Px9fnd4e/j7f/5tbXZ49u7s9nr99/T8eW5oa2798+/x 8/H1+PTy9/93b25xeXx99u7q7OvufHt3cnVxcXJven11eXN4fH718+/z9u7u7Or2dnj9+316c29s aW1zefPo5ens7u79cX74fnl4/vr8eG92cWxtb3Z3/PTx8/ft7fL5d21vbW9++f718e7n7/Hx+Ht1 e3n/fnr9eX39/fd9+vzx7fPv8/p2bm92fP/47+/7fXFqZmlnanB4+O7v8fDy8vb07/b++3t2/fXy 8+70+/t2bW9pZWhue/j7+ero6urv/v76/PT2/nl0cnN6+/n++vjy+3j9/nxzbGlubnF3fvjo5Ojo 7vPu7fDt9m9qbWtra2n+7ejp7Ovp7Xx3bmZpb29ye3t2/vh6cm9scHn47vL08e7v6evq6er1/31x dn/49vZ/+v52b3h4aGZqcHt6b3v38+3q7fJ/dHx5b3n+c2/+/H/39Ork6vT6ff357Ppva2xxdnd5 +vX18Pl8fft+f3lvbnPv6u71+fT7/vj9+uzr6e57b29wbGppZ2lteP73/Pzw835/+u79c/nn7Xd+ 6uX2e/Xq7f189vN0cnxuamdve2//9X1+cnBzbm529vZ7efjr5uXp7Oz09/nx9vZ8cXZ3e3Z9dG9s a3Nyc3r5enJ9+/bt7evt8ffz9XtzdH3//Pz19/j5+PP5/H5ze3Z5eWxua3f+8PL47vvx8/Tz739y ef98ent89e3v+XN2dnh8fX9zevTu8vT9/fv6e3Bx/f/9/nxzeHdqamxvd//r5ebg4eXr9vx9a3Bz bGxxbGtqa37z6+3z9/b6fG9xd3Z2/vj68u/r6Ors+XBxevjz9ezyeXdub2xsaWl0+/Xq7/nrXU1j atXJ9/je1MzVbFpYXmtZVlhWZevo1dl27u3p7WptZnjscmz17d/f/e/n8PdjW2xtbm9r5nZIfPBt 2mvb2Ong189q6eh26lhucmVhWet9aFzzfmvgZfHuX2L81nru7fLma+/p2OJnZOXec2pp63xvWW3i b19c6uFkcdze3+D35+5vcvx6W2lkXHh78/Bz5dbvWGXg5Ftt1939X330bXBz5uNweuzq3v5eYfJy XG1sYWzf4ODb7Onkb27+8GFVf/psbOrc3N1bcdnuWlZ792dncnpqbmfk22/s7O595Nxw/mb5cXf9 Zt/1399geulzZvRtd2bv7mJvZe7q/Xjf62977uhvb3Hu835l+25g+WrkfXze8fx+eXbx/mPo8nLd bOPacWzt615lZulwV/zv52lu7Pvh/vjjbfZ0a3x++W7/5+H5cOT5emJm3WpnfGzl5fdq+PNfWWTz duv28N3nfvrf7vtzYXtscG7053Hr6npxfG/z9Wrs+X3q5+7k/Hvj7vdeWWFlXl/+e/B1Y+rg+vvn +NvjeeLk3uft3/NdamdfeVhd+mlseO/t8ezx9+Z7ZG936PFf7+Rr7vTi3fX+/efseW10f3RcYm1r b3p85e/85nvudGV5+XPwemf39H155/D57fDq7fR16un7bHp9bG5aeOJ1d+3f6nJ07vJsbmtiX2Tx 7e927+bi7OzxeOZvdvdt+3p16npydf72ZV786V/36/7g/nnh531u+vd4YGXw7Ojv8d/saW/ta3Zz Yt/8X337fGxsdvTi533i33Rscu7z+GtiYWdrafzh5t7qc3p06F9dd1/+/e/13tTe337seGRUVnZt 7XN76Pbj5vf77PFyc/l5bnNu4eJvanLtcm5kaul/9Pfm+27s9uVndftw+Fr13uXyePJ//HR8Z+js c+5w7/pv4998b3V36Gxs+WRjbV51/XP6cP7x2/Nz6+7fc+3l9m546fZqXXD96/hhbe7kcnF97n/0 +W72bvPo8G1efejreWv/7H17/Xhv8tx9Z3Xw//nx6er8eHzh6nZjavz/b1df4/llZX7e6Hx/7OPs ZfrebP7u53pr+PbycXH95e1n7P1td/trYV1m4vXycu3daXz48WpvcG3fdn7v693+dfPs72RveGxt ++ttdvHp4vxtePHo7Ht4YWzubPZwbG325V5t5PN2ffHtfnt1aOflc+rp3/ls/X7p+m5vZF5lfv9k 7up36Ox8cfhs5Odo7G7we3rp79/n3+zw+G9+ZPtlanljdVty7Hd1eGtu8/HebX3v7N9u+d7e6vdz bv1vZWXs7mZtdd92avH18/5kbeF76ev55WpeZPptam3n3GxlaO/Y72Vv3uNx+PR29W7z5lx7flpx dezm6nns3fX8eeH6XmFoeGdpce3eb+nafvt+aftzZXJ1ffpr/OTo3+fz4N12bGldbWb3c1/re/D4 ZXdo+ubw9Ofm8+j+7Obw/V9t43xmeXDv5nRlX3D58W1t8Gx+bHPkfHju3uP9dGl26HZr6+t4bmhw 8Hf6/nHt/nrr6ujncfPje3hxe/5gYGpub2zt4+ff8ez0+e9vd3Vqe2Vx6n357vXu6mZt/vnwZ25z /upvaHvvbPbd/eZ9c+t+62lw93d99O1q8OTmenzuffZscfHpe2F47Xtoaf3qc/lmYO19eOP7dfh+ 7f5uaXng9/Tk9Hj3ffZ3euNob29q5m5jdubl8XNo93r3devxam5i7PP74njg52p4fXhz7nztaF3k +fx09OfvfG9zYO59a9rub2144eR7XP3t+2tr3/Xt72x4+HNicvHr73/+6e97bO3leXh97n7/fW7p amBsZm1jaOns5eD66O9qZfjqcP7++fppeffc4HDu3PFfdPp9e2xhX3dndP9v5+Dwb3Dp2vH97m7m el73+m5qb/HjdmRufOvva/r4ce3++vD55+j9bvt34un+4mRcXnvmbmRgePNv/Xl66uHh8fd+b3nq 4XL97+juZffwfXFo+eT6aXBnc25t6m9pdnzt4/x1f/fd/O/t9n977HV1Xl988H9md3t29/v6dOXt Y/Pu5+Zu7d/0/X5ken9peWxveffxd/7x9G175un4+93kdWVk93lsc3bv7Wpm4e1oZGzr7vX08OXy fPH49/D1cmZma256dPHq6/Z86fd8+Xf99XFqb2l99G147+bpePjj5ebr+nJ3cWhtc21tb3fpfmd9 8+36a2X3/3H1eezt+eLk7Pd99O9s/fhl/+z5aWd0+/b7/vxzbmhxdHdzbfr96O3p29/o9vr7dWNl ffz8cu/menJ5e+/5amt9cHz59P7572pv7n/z7Ofq7vd9amh0bnVtaXvv/3V49ejq9+zx8/R69+/x 9e/28Ovy9P5ubGpmXWVtdnhx//n4f+/q9fb69XdtevRyfex3/f19fnn/evrr3311c37p9Xdr+ff2 a2fp6e99f+7u/3B4/u7r8vV2bG1uenNwbmhye/Z6f+/p6/P4d/Xy+e757+7+d29saXlxa/7o63vz 7ebj83hpbW5qam7u6/Ty6eL7bnX5/3lxbe97aGFqdG366u7r6fr67PLr7O/2+XZufu/7am5vdXJs a2/9enb57Ob3b3J19ex3d+vtenn9/fT1e3z67vh/7vl+/33s6Plvam1udHv57/Ht/HV7f3lw//Tu +nl9/vdyb25tbXF8fPXu8/zv7u/2d/v48fLs5+3v+Ht5cmVianN0dfb5+vPt7vp8dXR49flvbnRy /fn67ufp6+vq8nl4cX5xaG1rbHNvbHf8+fh4b2lx9/h9+unl6ejk3uDq+/zx9/x9fv51a2VpZmZs b3Z5+vH39Pb4+3l3dHl1+uz2+/nv8/D19vtxdHl7e/n09/j9fX38fX58f/x2ev7z9fv9ffp9eHf7 7O/zfHn29/Tt7/D2c3R1cG1sb2lpcHbs6uzr7+/1e2tocX58fv3583t3fPX0/vt+d37/9fL2+/71 +f38+vf+eXp/+O71eP/7/nN1d336d3V3ffv18fDt+3VybnN1cm1vd/nt6eXj4ub9eG9scnx+ff/9 8u7t6/x3d2xqcHNvc/34/ft8fX5zc3717/x9/H379Pj08fZ/cW5wevv9+e7t7PL1fnh+eXJ0fHx/ eXb+9vn7/nz57u31+/f6f3hxdXBubnB5dv319Pbs6Orr6+z0eHNqZ2dmbHJ3e/7t6O5+f/L4+O/2 +fx/f/n58vHy8/58b21wbm9vdf/1/Pby+vz8+316/fLs6+/w9/rx7vb7/3r9dmxra2xqam1vdvbw 7/p9/395c/fr6Ofw+XRwe3d2dnh9+O/u7e738O35eHp/enFrZ2pvdP308/Pz+HF2eXn3/Pv38/Hv 8ff3fHl3/PHx8/T7/vX79fL0+2xlZ2hqbW169vb67+vu7/H2/H769fv88e7v8fB/fvxsaW14e/jz eHdzb25ydnt/ff92d/307uvo7+/u9H9zcHF19u7t7/bz8Xtxc2hnam1+8u/09/j1/XNva29udPv4 7Ozy7evz+PHv7u/z+v5+dnh1bnRvbm9vb292dv738e3v7ezv8PT29fTv7PR9cGpubWpvd3Ftdfv5 ++/w/v317vT59fr6/3h7c3d8e3v++/T5+O/s7vf6d21ub25xdHr88/Lr7vH4efHv+/58cW5sbXNu cG1qcXp69vXx5eru7PD7fHhvbW91e3757+7u9Pr27ujr9fX7fXZxdnl4b29z/O7v8vlub29scHd8 eHJ0fXv9+/7v6uro5OXu8X14dGtqbG94e3h4/n99e3v+9PZ3cXr68+rm5Ofu7+/+c3V6/v7+d3Nt ZWJhZmtsefPy7ujn6313ffvv7/r+/vn9fnx4dHv8+fX49/T29fp9cnR0dP19fPfv7vH49/j5+ndw bG12eHz7+/fy9nz6+np8dnV0efvz9Pfu8/r7+f19dHj57/X8fXplVdLPV9lfWOFQ8PBl82nl4/vi 3+nb6np5ZWZkbv10fmtq7G5vfm/se/X39+Jse3166/3p83N1fm9o7Wn0+Hvo//56b2/s93be5/Nx d29p8GdmfnB29+7v8nJvf/ZrduJvfe3yaN3yZd5n4+du1GPm61zfX2h183Zw+2XtaHJyfHNd4n96 +Gju6W/XbnXPVuzdXNRfcdRa2O1T1XVc3F1l1Uvn9E3LTezfS9lc8ehr2mjj9mrZbezsZPn47/31 /erl6mns5154a+9tXWn/Xm/kVd9xa9V86P3vVc/+Wc5f5e1mylxuzkfT8UzPWF3idlzw/njhY/fp aPlh9N9S9Pfd8FnT42fc01rw0knaeVrQScxbScFJ7/Tyc07DVVnOXXHYXV/LXk7Lfl7baef0121I x+E/yudEx15R3d1nTcl6Sc3wW9zORfLAPdzeaF5kxj7DzjvI1mNLxmBLv1Bf39ZPT7xKWs9YY+p8 Vdv1b/Vg3tz9V+DOTNzwXc9a7Gvg7U/eV9ztXdh933TraGTOSn7mXe9d0Wlo1VjnYeBsXdZk7ufj YGnUXFfa2FP4zlHs4Gxj7+Vd9fRl4/Vn5uZeathfWelqXujaWtnZWez572Xm917RaFvi72hd5Fxn 81l039hf2NJ432V0auptXdhxX+r1cXJwV/bc7mfq2ffr6Wvq3V5affBvX+x2/l96zVxY39dXWc5p UN3YWWXLclXXc2H+eHfy5F955P5h+vdh/1tQ49tuX97a4H9z2NzWeHrQ+exubV1AQE7mysbMt6+1 vM7hTDouKi4vLzVO3Mu8u7u4u8nh3mBIR0JJVGZ61cS9vs7Y2ltFSycel5cgoJerlXAoTSklDg4r HCmvLaSLmqWqqawrIxYVOSEiyayamJuenp/dJCUmHB0fKmu9vrinqLi/eExmOy8/12FN1Ma6z+87 H+KPnDehnZ+cKxwbGx4ODh43oaLCl4+arCsjKSgiFSS3qpqbn5qdsT8qKSckKCxPtLO1usHLVDos LTY2PEbPs6urtba+/U8uHxcRooSmuJeXi6kYDgscFwgVPp6KlJ2Yn6AfCQ0XNzw7n5OLjKS3zjEg Eg8dYLKsq6Can7MzKSknJBwgMWTXYryimqHQWszaLyUoJBkPmICQnpygikIKCAEOIh/m6ZaAj2k+ JjgOCRgbq5CTlKKZlzgaFx4yKjyqoJ6dq9NC2sslGx8rMis3S8GoqK+7vLrlLy05RsfdMRwZjoCO bTFDmy8OCgQWoJutRaWKnDgfEhkbLU85oo+OmN83MSIhJi85vZ+eqcfkReLA9kIrMS4zLilmwsG7 v9TJzMbBPjg8VrPFPSIbmoGPziIqplclFAcVtpybvcSbquAvFhcVL6Grnp6enMBAJx0mPbazwq+u sMlSRjZAdLx6Li4wPkfz2zhNurzEQVy8/d9QeLfQUiu5jZKpPyAzMls0DxAmq5qiqcpOvbg/GRQe VKGcoq2yrbFkLSYrNlC5r7K1v8/My1A+PU5cOzQuOk1jy1Xfv7+/TvbWRVblrqrHMSK8lpmqOyks PLs+GBMaTaSYmbNAP8i6Nx0YHtWemp+4zsfLzT8uJB84sZ2brsJkSFs6LCUmPNm6ssZMO1G7wGQ+ NE7LxM3HtbS61C8hQqemoqy+WihBMCIgHjNcppuhsmf9OjQ1KikqR7aonp+sv0Y1LCUqLVGtpp6e qNgqIiIoLjp6wrGzx8fMSy4qOdy+usPPu66uy0YzJiRGraKanqxNJywlJywwPDh6s6moq7pSODAv KiwzWberp620v+Hfek05LjRgtayzzEU8P17B0WJIPkM8NDQ4Tr+xrLC6u8voRTI1SFxaaVZQaNLG x7murLO5xU81MjEpKy80OUe6rKuwvdo/Pk5gW/jK5WPm6NTKyNHq1OdVTfe+yOdsVk02LC03fLu4 srO8weZQOzVJ6tXJ3VlcSENERVrmxLGurrG8wvxDPDk9Pkzf70c6OTtDTnpuXHrXw7u0sLPC6ks5 OkFGWcq6vc3Ixsx3Ozc6R19d6PPu0GFFRUNc1c6+w8nRS0NJWODq7crDzNHRycK/u8PmUEZLQz5A ODY4Ok5o8dLOyb+7vs3W197V205CRF/M3fDc2cbJ33RXZuZdUU1PWD87Pkfs3t/NycTK23Rr2M3i +uXpXV/Furm5u73PeFQ+NS8uLi84R/vn79rQx763tL7ZdVpWWlVMTH3Lv7u9wtL6YFBDPTs0Ok73 0eheT1rOydHZ39TL1u1cVlxT0bWuq6yxvtnsWj0sIx8gJjFF/c65raemrsROOTpLWUxAR9u7sLC7 yuZ+5/T0Wz41Mzc+TFJLTu/CubnD2nnlyc55WFb55WZaybKzsbS/ycnNRS4pKCkqKSksOuq4q6qr rK2ttspONjQ6Q0xNYdC/usPefWdeTkpDRVJZU1R449jP19jU3ODRxsnJw8xxVVZUUlNTUmfvXe/Q 6mdWVE9a5m5YT1RUXltNXe/WzMrhcN/g3szIzNLz/nr8cVFOTWXb0NDd2ONqa3Dh4mdZTE5UT05Q XnjTx8vZ8efPzM/eYVtfbmlWWWxvaVdMTFRxX1debtrPzc/b69vT1NPpfe7Xz9na9nTs9VdQTEdQ YWheZP518Obe5vBfV1BRXvz7f97MycvW9/Tc0dn0em/s4e1WRkZKUU9KS01a682/vL2/xsvhZVxR TVBYVV7l0tr9dmRWVFtdYH7f5PXp635sbH74eHt6bWxo9uv36OzdztLg92Jt6ex6X1xYV2BZWV96 2dzp7uzs+efj5t3Y09Xkd2FeXFxaVlleaGtnbWtp/PLj3eTl7Ozm5+3+7uXd2tfa7WFPTVBfbHnm 3Nrc8Hn26utlVFNSW2x8am3n1dHhfWv039rb7Hfs293qbV5YWGJlb3dwfX3x7G9jXVdpfuHW29jY 3HhZXWp47vT49/zk5XJkWl5keO58f/r39O7re2RdXuzW3P/23tvfeWlfbHNs/+Xc2tjm9t9uWE9P UEtLUujY5+bUzNre5ebe6edsbvxsWFx+fdfZ/ujZ4FxgWFtgT1744G992tnmY11k3+d1YuDacvDy 6Fxf/drTZO/V12Fs5HVaT1JTX2Jd79HY5Nzec/N5V2B1fXHc62He1m9u2e/75/lpfOxZV+JoXep+ cPLo+NnrXl9w8WXV/lJ27Pvu1lze0mR+19xZ+u1fbG5cXftNYtd++tlp6NVcX3lwcNN0bdff5ujQ WPbZWVrs/FFmXlp98llv4F3v2d/80dJwb+9m7Np+fu1iW+vmam33YHN8VV/o72Nm1+tpempkfnhm 39nh1tTObe74ZFNV51RdX+3dXV/33Gttc9rdYvvh3Gtc39d0ZOj57+1hbuVeVt/XZP72XHLb93PZ 4mLh01xQ8ftPW/lbznFH+NTwWtLd99ffXezmTHHT4Ft02XF3bmxy22hd29xeVN3lcXVdZ/rjZm3c 83ru7Pfr6W3t2d15+P5u7213X19sWV5vb15fWFf39W9p63t/8/3/4NDb2uHv219V7u14e+jScU7Z y9vPyr2+v7/c8+pNOzU2NjIxMDhSWVjgw7eyt7SysrbG1OR+SDk3PUA+PkNe5ddyas/KznlZW/Zq XV5yZFNf5bu8vLGspqmywtTVVDAmICAlJCMmL1XPvrWuqKWorbK4xN9YPzo/REBBRVzbycjRztXm X0k+PT89PUVPWuPMwLu5vcvBsq6ytb+/trjOQzYvLCwnIiQoLTlY1Me3r62qq6+6wM5wW1BGREVL aMzHycnJxtdlSkM/Njg9Pj9IWn3Rvrq8wMfN60pJ0ba2tbC0t7a22zwuJyMjJSQnLTzTtKyop6qs rrXKVjctKy04QlHtvrGrp6uzv99MPjYuLC0vOEv7z8LBv726u8RsRzw2MTzVvLaqqqymprG86C4l IRwdICYsQNO3qqOjqKu0z1U8LCorKjVT37mppqSjqrC9eT80LSknKSwxQ3LXwLy/urm8wddLPDYy MD/Nv6+jpaCeqq64RzMoHRsaHCApRti9rayrpaqwuN5BNzIxN0p307avrairsrfWSD0wLCwqKy45 SWbNv768wMfFzM/hT0M+NTZ3vq+hn6KfqbS3YTcpHRkWGR0lQ827q6urpaessMNPOTIuLjxgzbmy r6uprLG9cz4wKigqLC82QFbYxb29wMbP4+LiXEs8NS87zbamnJycnqu0wT0tIhkUExcdLOi2q6Ol paOor7hwNywoJy1Gzbauq6qoqKuxykEuKCQnKy84QVngxr68vcftVVdTW1RIQDkxU7OrnZibnaGz wWIvJBsUERMaJEOyqaOepKSkrb3yNigmKCs41rqspqSko6iyyT4sJiYkKC0yP17Sxby9xNF+UU9o 9OFiTkQ1L8+ooZmYn5+ltMY4HhUQDxEbKj25op6Yl5+rxjgnJCQfJC85vqCZl5merLjVNyggGhwl Lk3IwMe8tre4xkMyMTFA6NthV13qUe2pop6anaGfqsY4HhUQExUXIC9RppeWl563VUIyJCAeHS67 qJyWmZ+dpLlZKBkYHR8rQUlor6mtq7ZQP0MvLTQzPsa9zMTDQzSsn6ecnamem641IhcQFRcRFSZD rZSTnJ6jtchSIBYcIy3Prq6dk5ibnrk9LyQYGR0hMM7Bu6anr7HFNzEyKio4P1K8uMO8yzK6nKio n5+em6QxHx8YFBIPEB/YsKCYmJqaodsxJh0cHiUv1qebl5qZnKa/Lx8aHBwdIzPRr6itr6+03D8u KCs1Q0ZM6buyfVydnaafoZ2epXQlIhsVEw8SHTT6sZuXlZijuthEIhsaHCpTv62blZaTm6zaMR8Z GRYbJjNKs6ippae1z+szJy0xLjI+dsNUrpWdo56cmaG2LicsGBAQERYlOzq1lpSan6atvUAdGhwf LDJspZiWlZaYoscuHhkXFxkfK1i5r6qjo66/dT41MyslKT3XPb+Wm5+ZmZektTogJhkSEhIaJz1I tZmYnZ+nteM6IhweIScsw6Oel5WVmqG5NCgcFxcbHydH2LWno7TRWEMxJiYvPS82nJennJmUmq67 JiQfExEPGSYvQNehmZydpK+8YSweHR8jJkK5rJuXlZiepMw+JRwaGR0hKjvYsKyqqKqvy1A5LCor Lyg7np6qnpuWnqyvKy0qGxYPGiMlPG2vo6Gdo6qtu2ctJiYkKDU7Va+jnZ+gn6yz7S4mIyYiISw5 XsvFt66prLzC505NS1dXT11USlJ97kz2wcO7t7fB5M57QT03MzA4Qjk9RU9y38/U0cnHvrq7ur/I zd/9bl9RWebU0MfHzdPoYUY9PDg1NDY5O07v38e7uMHXzMbAurzQ2Ly1w93ExH1VV0Y3NTQtLC8y MDBB+NDFu7GvrqyvtbvB3kxOV1BNT2v7/dTdZGZYQTs9QD47PUVYXl7e0MrK7v+4rb3Asquqr67A fNtHMSYgIyMkJyxF5syzrq6vra69zd5YUE5WTErmycXGz8O5x+pcS0g/OjAvPD0+REvXv7q7ycS4 vM9CPcWyv+HLr6qwul9HRTAtJh8hK0I/QcSyrq2ttcjT41U+NTx8y9nRvLKxu8vY519EPTw4PkxJ TFNp/3dsXeLaYk1T7dPtR+Kpo665taqsv0MtKyUlJyQlLly3ra2urKmw1T4vKScoKTRbwa6jnp6f qLbLSC4nIyQoMTxWyru4uLzN2vVFMSwtN1NgyqKXmaCqpaa8LRwbGRobHys9x6udmJ2su77YMyAb HCMtQcmwp5+amZ6t1VI9LSEfJCo3SHjLu7a4ub3I5z4sKS48ODyxl5GWoaqkpW0dEhAUFxwiNcGp nZaTmKxVOjkuHhYXID63qKSfnZqZn7ozJiQlJSEiLEnEuLKxtLO6w8fZQy4qLDAzL/adkZKcrKyj ri4WDg8VGx4oTrGjmpOSmq4+LTMvHxcWHUGspKKfnZubps4zIx0eJCsuMzzmsKepsb3BwMDuPS8p KSwtN7GYkpelu66mtywUDhAZICc00qyfmZWWnbsvJCcpJhwZHj2pmpqen52dpMssHhobHyo5SV3b tqWfpbdgPj5GPzMqJys8U+OsmZSWo8jNtbRHHA8PGCQxPmq1opuam5+1NyIdHycnICEytZqSlp2l p6q+MR0ZGR0oOdK1srexqqewZi0mKjJBWW5rb29WSdGnm5qiv+i1qK0+GxETHCcvOlS6pJybnqnm LiMfIigqLTjbppeSl6G3zNBSKx0YGydHvrCwuMbLvbjEQikkK0u+tLrNaWNsRSwuvJyUmKnDtaao UxoODRQeKjzerZ2am6CrxD4nHBwiLkPTuqiblpmjwzs1Ny0mIyY027ivr7rkSklba0ErJCpLtKmt v+dgXVg+KiVPnpCPmbXOtK/kIA8LDRUhX6ednZ+jo6OxNx0WFyFBwa6ppp+bmqG7Mh8fKUDd6klX vayruzolIykwOj89P2W4pp+mvFNASEw5KiIjR5yOjZSmytLrKxcODA4aL7idl5qfo6mzRh0UFh4y yKqfmZidpaq3RCQZFx8yxKWeoazAakkyIBocJkS4q6qts7m2s75OLScvWMjRTz47M2qbjY6b3Sgq LiMcGhgYImygk5ar9VpJNyogIzFHv5+Ym6h2MDI+Ojc7O0vCr6mlpa95LyIgIyMlMvCzqamuutVO U8/AxmY8OUFj2ns+MTQ6LjGkjYyUo9wtHhcaJCQbIVSrnJufreQuJSgrKC5F9bKmo6Wv5EdMS1HD srrFeT88MC1Fys9MRlXyy8PHy29ARlfiw77LVz84ODo8PD9Xv6unrbfHNSW/mpymwTwkHzNTWDkl M1j/qa3jMiMuNlq4v7KvuKy13EYqKTBPt62qqrO+z3VrMiUgJ9WsqK9sNy84U3XLz2XY0cbEZzou M07EsK+3vs3AwmdCMScfHSqjkY+Qn8QpGx8cIyUdNdurm5+k0DMzJiosL37OsKaop7PZSTY4PU/I vsG+z+5vOzYyLTbUrq25WS0tSr6qqLLRPjUyNT1AX9rQycXDycrMU0U9MjM2QTsyrJWUkp5QKxka IzXOOlNlS660s8kxMSIpPj62sbOpq63GSjMqMTn5sKqtxl1WUWL0Vk5ePTfNub3QNy42T8m5tM1Z Z01e0dBrR01LUNtpXH1w08zeU0JETOpj7KSdnZ7oLSIaKjZ+zkPJ1LqqtsgwJSEgNUe3p6ikrrvs NzEnMFXFqKitwEw/NkxuS19EQ0nntLG5YTY5PU7MvsLuUVNo3OlXRT1G68vUe1pLXMvBxm88Nj10 vsPhq6GmotU3NSQ0OknLQtjgTsJdQTstLzM+Wsy0rbK5zUFFPUHIva+srrPaZj40OjdQ7dnLY1dF QlBPZmJdXF/cz8XEy9RnZPbufV9MQkdhy7/B2U5JQz9GUODb59dR36afn6VIMikjNTJJUD++w7ew XDopJS435b24rrS3s8XaVDs+Ucu3t7rLUEk8OT88Qz5JzMCzt8vqPTY7RGjaxLezsLnNbkc8NTQ3 OkRR3cjBwcrdX0pGSGTTy8PBw9VNRc+vq6267kU5Nzw/Ozk6P0po41paX/TP3Nbk383bycPPzu5/ 29zJy8/TVElDPUBFTGve4n3QycrTWU1U+NnLxczS0s/Y3fhGOjU2Pk/6z8nH0MvMeFhEPkhW0cO9 t7u7xNdeMz+/u6y/P0EuPEg/ZjI2S0PExuzcXMu+vbzr6tfjwMTeUjo4RN2/xeBcTl7j8mFIPT1D 47WvuOU8O1DHuLzLV0tv5eNONzA4V8y/0E1ES9W/vcRZSExczMnP1tfJwbvDPi490KypvFwyLC82 TEU/TP3CtbbNfE9S1tjcUk/PxLe+Ykg2O1JszmdQa3DIxdNkP0NV3sjIxb7F6FlOWF/239bL1+pi ST04Oj9V2M7ea2ru0MXCxs3adFxZUVxpbN/Xx8HcPjl7vK20e0E3Qk5ZWjo5Q+7Av8dz/tHQ0E88 O0rJurXBZU5FVW1iXU1wzcPA3VpJSFFi5u5+6NfM2Wb10czP61tRW2JjWENCTt3Ex850TU9UY/56 8e/i293W31tNVGJsbefW21RE17asrclbPUJYREk3NUZpvr/E1mHU3v1OOz1Mybu9ylFNU2JjTElF bcnBwNTsav3a6fxWTFZk3Nze4O3e4djQz9ZvWExMVmvk3t/sbnNvZlhPT1NjcGRoY2b27+Hf6eHo 29Ta3fRubPReRk/Tu7C0w91PTkhISjxIVN7J19xPVFVQcUpIQ0/Yzr7L4P5i1d/pV0df3L+8xNdT TElcW19meeLa2tnr/n5s5N/k6Wp46d/h4+VqV1trbX5rZG5hcGFWT0lTXHbb2NrxaXP429jVy8rI 0u9iUmXs52JNTU580MvK3PP55c7O21hHSktba217XF9ibmpeaVxVV2Bm6dXP1d75bvpkX23f0szI zMzJy9N3TkhMWWH4elxYaOje62lZWmFqevxtYlxaamv88nzo7OPja2RiZ/Lh0dPa1/RfTUpe4M/O zs7Mx8jL0/ZWSkpMT1JOS09f7uLvc15cX3Xn4+z4e/Xo8nBmX2R559fY2tvk2tXc5m5nbPnm9GFO S1Xv1NHb8O3Z1djibl5cX2ZmYml8e3P5f2JUUl1q7+9z/Gttdmp1d+vj5eTn6u7g5vT5e+nd1tbl 92pp+Orf7PJ2X2RdYHzvdVxqd2/m3NfY2eF2Z1hOT01MTlxv/ens8erq9PPr6/t2b2f61tHMzdXd 4uHv7u309u32bF9dXVtfY2lzdXd6c2lxb+/Y5ujg73xoZmVfXFNVYmr15O14e+rj8nNqYv3f2tbY 7e7j3+Xm5/zs4+nue2RnYmlgYH1r/fppYFxWVF9y+/l0bXH23tnc5OPc2M/NzdbqcV5aVExNTk9f efl2en5u9+nv7fLn4Nzkbmzp29zb3ubj7Xh8em75a19fXGNcV1JXYHrk5+rt7ufj3+Ts8Off3eV1 d/v68nViYmNt+fLofGtsc+7p5/br6e/qdGleW2Fu59zieWRdW11hX2Jv/enk6N/p9eft6t3qb/p+ 5d3p3ep/8Oj6e19bWFJgZl9gZm/s393h7+Tc7Hj7cn7yd/h6/ubr929t/vHu73Jna2hu8X5ufmte ZXzh3uno4Obm4OvnbFllZmXx6vx0bmlqbnru6vlqafL46uDu9vf++vluZ2Fqdfrt5Op7dnN0bGFn ffvl3urm5OHd4/l6eG1mZWlrcv35dmhnbW71eHtzdO/39f559e3o7Pj+d/7r6+319u/v6fhsbf/q 7XNiXWJ1eW1mcu/s5uj09vV97O91dWJnd3bo5PLv8/Hu9WtjcW1lYG367enn5d/h8m9u/f14+mt2 8Pbm6Xh1d2ptamlxZGv66ubm7O7seXZycWtjbWv95eTs735q/fZ/dv705+vy6+rsfX70bmJldG1p bX3p7O3m5PF3bWNocWv7e2v06Obo6+z8ee36Zm97bW92fv/29v9uamlv9fvt5eHodfLq7Ozf4O/z dG9ZWWNcZG1v8e7x7er2+uzlcGFz9/bu4d3d3eB0YV1fYF9qeunsfXduYWVuem9obe/k6uLu5+Dk 7Hv68eHh9e//7etucl9WWWVjZPX1+W1weGd1fffs7Ofl2tne3e329O/qamRsYGBwemxoYWZpa3f2 6uLv8PBvf3hvfOLf3uPy7vpv/3ppY19ua2hoffT16Hzz8fDr7PLq3ejl5Pby+G1iXVlebXh1ZGBv cmtrbXH+5+Tf5u3p+fLi6PP8fn3k393gdXp8ZWdqWVdbav75b2lr7t3q7ufxfuvtcvz6+tvW3e72 eV9jYl1eaXzv5ur0bmn0/mNfXWVt8enk597d3dzmb2plY3tv921p7/jk7v77dXRoXFtrbW/039fR 0eHm815UVl5f+ezpdPXnf999a09QWWj11tPI0OrccE9LSlHp5NjKz8V2TWxLZMB47W1NQkNIRmB9 vcnfx9DPbF5fUlpOZGPZyNjP3mFHREREXG7a09HMzdLV52zwbWhfWXbhzszLzdfda1BEQUE/QkZK TV3t2M/MyM3Y6Hjt49bOzMjEw8bKz95vV1BNSUpHREpNTlZdXmFfa/Hl2NLSzcjKz9bc7OvsaVlO TU5SWl1lX2Foanh4/fzu3dbR1NLP09TV3eDd4OPk+ndkWVlZUFRQTU9TW2FtbG1y8uri3N7c5efj 5eLd5+vh7n1vZWpjZGBudnH2bXH17u7j6+vX3ePm6+vm4OLj8vp1Z2ZcWFNOUVNXWlxj/OPd3N7l 4OHn5vH68f588Pnr5vH99v1yal5eYmNx7OXh3NnZ4Ovv9vBvZm1oanT4eXb59nxtdW5naGlra3Fs aW1rf/rv6O3o5u3w7e3p6e3yfGxsb3B79vHt6/Ly8XNwd/7w9HBsbmRlZWv89ejqfnx4c3r7eP16 amx+5ODg6e3o7+vu/H56bWhvcW9ub3Bpa2pnamt59u/q7PTx+379eXNtfe/x6+728+/s8Pz47+jo 9nf8+3Vvb3FvdnH26ursfW9tcnN1c21uffv3+Xl0d2528/n9//53bmls/PHu7urtfH1+dXd7+uvs 7enr8uzv8/h5f/vz8PJ8df13c31wd/p7eXlsamtlZWpnaGlw+fX48evl4OPv9vHxfm9zfXtz9vHu 7PT8/Hpqampyf/jz9fTv5+Xm5ejo7PD3em9pamhqZWVmYWpqbHV2dn/49e7p39/m6+/y9/b2fXF8 /fX+//n+eG1oZWlnanv37+30+/Dq5eTk4+r09f79fnl+fHr9fHBwa2hrcWlkZGNkanN4+O/t8Prz 6+Pm6uru8vLv6ebx/3N4fW5ubG1qbXBxef7t6+/18vHx9Pn1+fLz8O72fnJqY2Zna29we/f68Oro 6ur0/353e/9+dnr+eXl1dnl7/vz9e3p3f/f8+uzt9/b78ezq7fN6eX12fH37+nl5cm1qZWZvd3R2 effu7Ono7vh8d3d5eHf37vZ7d3z7+312dX/+/fx+/PT3eG1rb33z7e7r7e3r8Pv7+f9zcn39fXt3 dHZubnZ1b3J5eP3y8PXx7e7ufnZ2fPn4+nx9cHB5fHx1dXt7fH54e3Z87+zs7Ojr7vP59/H2+vr2 9vLvfmxnZmRkaW9zbm1x/vf29u3r6+vr6u3v7+/6c3F1bGlnZ2dmamtv/vvt6+7v6+nr6+zv+/v6 /fv2+X1+9/b7+/l8dnd3cm1ubm5tbnf49vf/fvHt7PL9d25we3NyeH789erq9O3p6ens8ndyd/bu 7+3y7/H3/n59bmtoZ19aWl1ocHx9ent5eXr78u3s6vDv7vDn6erq6+zr6evt8vjz/GdibXduZ2lr Z2p5+u98av7k3N7h3t/j5OPf3uxuX1RNTU9SVltfYmd1+ene2trb4Orr6uLk6ung4erq5+76dm9u bGtnZWRmaGx2/Xxub2949evm5+Pl6+33/H96dWppc3lxcHFva2VaW+zc7OnY1dvd2tTT3vNzX1JT W11XWF1aVlddc+/r6ePk6efn6eDd3Nzd4OjxfXR7+/Z5bWdcWFhfZ294dnNwc3f25t7c3Nzf6Ov0 8e35b25rbXJzdHN6enl+eXb97XZaVWzs9/jr5efq49nV2d3ge1pTWFtYWl9lZmRv+vDi3N3i7PX6 +3p+6eHl6e3u8fb9cGxrY19fX2BkZ2lsbXn17u3t6Ofg29jY2Nrf6PJ3bmxlXV5eXmJmbXR8+fxr Xlhi49XX2dXZ4eDb2d3tZlZQTlBXVVNUWFtgbffn3dra2NjY1tLV19fb4+jub2VmZl9cXF9cWlxe YmZlZ25tb/nm3+Hi39zZ2tze6vV7cm5oZWRiW1xmdHB3fP94dfPpdlts1c3U2NbY3ufe1NXtZVdN SUpSVE5PVVdZYP3h3Nva19vh29bY2t3e3+Tn6+/9dGZhY19bWVhZXF9maWpoa3jv49zX0c/T19fb 3+p6bWReX2FdWl1fYGJpa3V0cHzr6fd3Y17pzs/Y2tba4d7X0tl6V0xHSFFZV1RWW11ieuLZ2NnV 2eXp4t3e3t3f5u/6dGZlb3RsYV5fXV1dX2VlZ21sanzo29fW1tfY2d3g7f5+eWRcX2ZsampudXlz bnv37uftf3j6bnDm43pdVVZffObc2ulsafjf1dLZ7WVeYW7+6uft/mtte/Pu6u50Yl5gYV5dYmdl YmFofuzl4uDd3d7g4uvs5+Th6ftpYWNkanP8+nz7+nptdvb/dm96/HVue+nl6Onp6e3xfnN4b2dg X2Zxc2hgXVtaYnzs5OLf3dnSzs3O0t71aF5gZGBbW1xYXF9kZmVpam1saXP+9+vi4+jn5OHf4d/k 7vj293pxa19eYGJscX348u/n39va3+rwe3Hs6G1bYP97dHj2+HFmZGxye/l6Z2ZucWxq/fF6X156 5N3b1dXc3dvc3eHsdV5ZW15dWVtfYWJs9/bz7uvt7eXj5+30fXpzc3p7b2hqcX3z8urm6e39dGho bXv+8+np7+3n397h3+t8bGBdZXNya25vbHL18vn+eHR5+uzj3uLvdWpgXFtjcWxocvfr39rW19zo fG9tbGhqY15gZ2hu8evt5uHh5e7v73xvamVkaWttbm/67e3q7PR+ff57dm1qY2Bqd+/j5Ojl4eTj 397h4+T7cG5kZWllXmBqc/3s6Obj6u/6enJxbmBcXlxXW2x89evh3uDe39/e3+Pt7fTw9nVtZmdl Z21ydXd3c219+Xp4dXJvfX56eHr39/fv6+vx+Pt9dXV7+PB3bWxue/vv6uzt6+zw7u33/nh88/t4 fH3u5uv1fnZ1bmReYGRnZmNne/Dz///38vTw7ebj4u5+/H5/eXJ6++/u7ejo6O3+fPx8bWNhY2Jj aHD97vL17env8u/2+vfv8/z6fW9pZWdre/Xv7vb3fP/2+fr9/H58fPrx8/r98e3v7efv9fr2fW1o X2JveXd9/nl2dv70fH11dv78/3h8+e3s7O7r7vT5e/fu93Rta21vdnx8fPz58Ort9P15evv7/XJr b3T+9vHv8fn7e3N5fv97ff93cW978Orp7O35cW5tb/79/Xt0bXR+ffbv7Obl6/D29/P9eHNtamhr a29++PXw8PT5fv37fXv78+/5cGtrcGxtd3h0dnZ4+vLt6evu7vj59vb19ff48vDr8fL9dnZta2lp b3J2dHBxcnr27uns7Oz28vf6e3x9dXJucnNva2Zx7+rp6evr7fP+b3N9e3d++/j2937//Hz39/Ty 9Pd+d29wbmxucWxufPPs7e3y7+rs8vt0cm1naWtud3twdHx++vPz+///fvfy7+zv8+/v9/fy8+76 d3ZvcXBtb3X4+P35+vfz+Hx8dnV7+vt+dXP++f73/XV0fff09vf7eXl+enp+/vP2fHp7e3d1dP73 8u7q7vHy8ezr7vP9/vx7cm5tbGtqbGxpaHN8/fz89vby6+ru7e/z/vv6e352//T5+3twcG9qbHv5 +Xx89vb07/L39fl9eXr7/npxcXp2cnR8d3b48+/s6uz3d3v8f/rv5+br8vn49Ph5bW9oZmVlaGxt cnl9fnR2/u/j3uPo6+/2+f39ffz2eXZ7fXl1bW1vef/9f/z3+e/z9fx5/ndveO3s7/D1+Pxya2tp amtuc3Z99e3n4uft7O70enNwb3lzbm5w//z89fDx+Xdvb3J3b3F+ff72+fLr6+zz7+rs7e3v/nFp Y2NiaW1ve/zu6ePl6/X2eHBwbnJxdXd8+fL09+vn6/L6+nxua2NgZmpyd/Tt7unl5efo7Xr73t1x b2Ns1+ttW1tnZXNdcePtcGFt5uh9dmpzffrzeXTw79/e29np8HJwcmVgXVlifuTc4el5dPLo5Ot8 cnD67/T5cG1rfPF3aFxXW2Fw9PxtZnPs5+zz9nvy7Pvz6eTe6fh2eWtv49vU2+hKNkPx1rKprK66 0+dDNiojIR4nQ86upaKmrLLHTjcrJyYqOcmspqSlrLnPTjMrJyguPui9t7e+xthfTkE/RVLiyL6/ yMnWZk9EPThLt6efn6i3UTUtJB8cGx4pXqqdmpyjtVoxKSQjJi1GwqqfnZ6mtOM5KyYlKjRZva+s rrfOTjkvLCwwP+3Bt7S1uLzD1F5HPDY3OkRYcO/lz8K7t62prKqz9UosKiYiKSgtPXqvpqGirc5A LywuMTtEYcK2q6mttuRURT5BQUlS5cjEynhFNjE0PE1n2s3Du7u9yN9uaPTj6mtPREFHVGFcU1/5 /sannqKjsEUvJCUkHyYmLFG0n5udpL84KiMkKS4+ZLyppJ+jr9Y2Li4vOD5N6byura/CTDIrLTI+ VO3Lu7Oxt8V0RT9BQkI+PT9L0L68vcfP3ndM3quoqqm5WTcuLyklJiInOMmmnp+lvFM2Li4tMDQ6 dryro6KntdtJOTUzMzMyPNWup6iydDctLS8yOkNZy7esqay7dj83NDU3OkBkx7eztb3O7Ek2Q8S6 sKmsudZWQC4nJB4dIzPEqZ6bn6e4bDwtKCMgJS5Ur6Cbm56mt285KiMfHiQx+rWppqqvu99GMSsp KjRouq2rrbXG4FpGPDg5PEjuxbu5usNsPjEvPFfCrquoq7S73EgzKCMfIis4a7yuqqqrrrjMVj01 NDhBUfLLv7y8vMn1T0I/QUtdfNnMxsTI11xCOTo/R1/azsi/urm8wNVSPzk4O0FUcebX1dTa39ve 19LlbPLj39HPzM7h6G1ZXGjo7W93WU1KSktEPj5BSmrXy8rLys7MzNHU5fD7bd7PysbKytHre1pM RkFAPj5GUWHr29bW2dLW3uZvX2D+1M3Kyc7V8F9TS0lGQkvozcC8vLnBytVVRjo1NzdAW+nMxsLA y9loRUA/RFVf5dzk0cvFwMPH0d/m4tjS095zWU5LSUZFQkJHTmfq3Nbf7m1ob/fXzszIx8bN3nBW Tk9UV1136+fm4tTNy8bKz9T5bHl1cE4/NzAxNDlJccq6trKytLjE50s6NDI1QFzUw7y2tLO2vs9a Qjs3OT1GS0xUXWx9f3Zx7NbKw8DBydtoTEE+QUxa5MnDwsLF5Upsysu6s7rA4V5GMzErJiYoL0jG q6Sio6u43UI0KygnKC9OvKqin6Gptd8/MSklIyg71bKrq7DB3kw7ODU0N0vNua6vvNxNQjw7QERP 48i8uLrB21JBOjQsNbSnn5misVgvLR8hIRwiLvOnm5ecrNwsHx4hKjrjsaminaCovD0mHiAnM+O8 s7Gvtb62vWo7LiosPvTMv8LIzMbE1v5OPTxGXm/j2t7Kv77OXEM0NDxJaNfORmqempuZrzMfGh4b JC0nRLGflpScwigbFhgmO9itpJ2dnqXtLh8bIC7Jrquosb/LYD0qL1jdu7jjPT1KW8i9zGjn0d7J 4DguMUD+vrnWet/LvLjLODI6Qte6tMkxLq6foJqzKyQfKSgtMSZKqaCZm78lGhshMryzuamlpKe5 PB8dJDa4pKKqr79zWzwsJCMo8qWhp8M+Mj7J3FE4LzvPsLO/Xjc+4Lm+XzwxOs2ytMZMOEXpysLI Zjo0KlWXmJ2eOSEfIy4oMjYuvqOkorQsICU2asy23d+vrKq6TCwhMG63p6u8VE7B1044JSMubr6s pLTjXFdIV1YuNP+3ra6+OjJId8vPSi8uQ8yvrLHMREdTRTo9SUfxtK+/RDa7q6ujuz81Ljs0Liwo OMKupabCPi8wOTtlbeK1sa60zVg4RmVP4+FaXHV3TtPeRWzhztpZ2L+50UczLz7Mr6+4zUk+PD5A PDo6Ss+4sLK96FZcXWFWQTxCUc2xrsFPPTQrM6ubpKWyODAxNCghKCxMq6ets346P37QR0BPX7Sn q8E6LCw16sfNxsLCvr9ILjc5TbuvtdnwWUZeS0RPzb+8tsxNQTw5OEFLUtfEwsnLzNbZ23xgUVBU UVheddO8tcNmRTkuLPefnqiwQy0zOjYmJTFQrp+nts0+PERHOyw40K+kqcE/LTA4RmJf2buvrr1N Ly1Vz8i+ze/s2V5CSVLhxcDW38/kYkc3LzVgxLq81mp4z83j7GFj4M/cRzw7PmXGu73CwehDPi0v rZ+stMX9W0s5HhwuXa6jrb7HxtRHNiolOL+xrrK+2WNmPi4wP9u5rrPEyN5KPDY9Q8Cqx1trU1Zq 0UxE1sbEzFU0N1LexbzAYk95YVBMRT5LzL/AzGRNTWr698e/zPxOZ9DdZ0U9PGKppstn31Pv3jgn KkzJv7O/1r3GQjU4ODz5x8/Hu8L/V0k8QuzMw7m3xu12TkdMTkVDTHm6uL/dVvdfWkZE9cm9yPtV YGtLQUZg3+pNRmDOyND4U1nNyN91ZWjm9G1ZTmBbYMq/wszmXVffZD0216vD0sTWwOVLMS1cSjtE TMy0tNxX5Us6NzhIy7a/wrq8v30+ND1t5dPPys5m3ry92lRSVGf+SkNSXWTf3X7g31xZ7WFFSlpZ 39P31L28zGpMTV9cTUhW58/BxNbKzks6P1vezth2VW3F0MLdeb3M2D8/SD9GOEblvL/j7mrW32M/ PG3d0M/LxcvNdFRcUUxIXszO3uLbz9DrWVjk52FfVEtf2+RvbFxQ89Pe7m9l89bdb2JfXWVp6c/W 2+z+3d39VEhMXWfp4+XP1dv2Xl5tX03qw8rfaGh21m5LXNvN2OhkXWhQVH3pdlFNUXTqYWvu5eHo 8+HfXFJo6NzU0tfMxc/u/29nUktXWVhd6c7P3FtNUlRPUGrq3M/OyMjuTUpUau7y5tnV1O/6bk9O WGf+5Nne63tlYPT1bWl/6dzQ7PDd8Xtp++Lp7fPj421WTVBeeXlo8efc2/ldZuH6bm5cWl1dX3Pr 7ezaz83U615YZWhs9tTR3ep96/tdVltiVtrC0l1dc1JPU09WbdDRzM9o+n5YWldu2N7Pz+7lVmbq Xd/xTWnV4VJPaOrb2XBr/enfWlFw393n4Obm8XFlZGV03tXV53z9/l5SU1dcZujS3e3id1tVaflk ctjS0N5hWltZV3Xf3d3j+vT= ================================================ FILE: UnitTests/Net/Imap/Resources/common/message.9.msg ================================================ Date: Fri, 29 Nov 91 07:13:34 EST Subject: A parallel test MIME-Version: 1.0 Content-type: multipart/mixed; boundary=Outermost_Trek Message-Id: <635263359948198600.21002.2@Jeffreys-MacBook-Air.local> --Outermost_Trek Content-type: multipart/parallel; boundary=Where_No_One_Has_Gone_Before --Where_No_One_Has_Gone_Before You are invited to a *** STAR TREK 25TH ANNIVERSARY PARTY *** When: September 28, 1991, 4:30 PM until whenever What: For those interested, we'll have a rerun of last year's season-ending cliffhanger, and then we'll tune in the season opener and the 25th anniversary TV special. Prior to that, if you bring some food we'll have a pot-luck meal, and general merriment before and after. Who: You and your family, including kids of course. Where: 25 Washington Avenue, Morristown. (See Nathaniel if you need directions.) RSVP: 993-8586 What follows is some Star Trek related multimedia mail, the last of which will give you a chance to RSVP on line. Live Long and Prosper! -- Nathaniel & Trina --Where_No_One_Has_Gone_Before Content-type: audio/basic Content-transfer-encoding: base64 Content-Description: He's dead, Jim LnNuZAAAACAAAFmUAAAAAQAAH0AAAAABAAAAAAAAAAD////////37+/r7e/z9/f7//93b29z //////v37evv7+vr7+/z9/97b2NdVU9OT09RWmFr9+Pd3d3e4+vt/29la21ra2lra3vn3dzn 9+//YVtaV1tp9/PjzsjHxsbGy87P2ef3c2dz/+vr59/Z09HR1dLR2d7n/2lXTUU+OzY1NTQ1 OD5ETmXf2dLP1dfb3O9jYWNhX19pb+/ZzsjIzMzP43dfVU1RX2/bybu6u7q7wcjN0+1ra1VR Y3fv7+fZzsS/v8LEztXW62FPRj03Mi8sLCwsLTVFVffLwL6+v8XFy9b/W1tdV1RVWVtr2srG ytXj/09LRT4/SVtd2MC0r66trrG2uL3I0/dOSE5WWVxn99nGvby7vsfR4VdKRT03MCwoJSYn JyowPURb0cfHz9lrZ2tZRktdd+HazcrGv7iwrrC4usHR5W9VTl1pd8i7tLSztbm/xcrb91dF Pj9DREhXb+vQv7y7uby/wsr3XUQ7My8pJiYnJiYsOEFK38G9vL7Fzc/R72f/1dXe69/v99/M w87v919NSUU+PUVMTme8s66urKyvsrO2vcTNb1JVWVNLTmfr2szKx8HLzs3XY0o9ODQtKCYm KCYoLjpHacnIx8fI1W9dU0A9RU5nZf/Zxru2rKuusrK3xM/cb1pvd2PXu7Ovr7O2vtVlS0M9 ODM2Oj1ATVfr1cq/vbu6ur7DyutSPzoxKiUjJCUkJS48T+29trSxt7zCyNNYS1FYb+/t2c/H vrq6x9HbW0E9PDg6QE1dxbGtqaenqayxtbnC3FFNS1NeZ//c18/SzM7Pz/ddTktAOTUvLCgl JScmKCw3QV3bvru2trzCyMjrT0hTe+fXy767urCsq7G4vcn3WU4/P0NJTs+6tbS1uL3Oa0Y/ PDcxMjg+SlBb3si8urq4uru+yNnvW0c9OTApJycmIyQpLzdFY8i8uLS2urzC71b/697j2sfC vLivr7W9xM1bRT88ODxHSnu8rqyqqquvtsDXd1NGRERKUVphX+HTz9LV2t/3b1tNRDs2MC8p JSUlJSUsND1I2MC3srK1urm7xldHRUtLTF7Vyr61rKutsLa8zmdKPjpDRlHPt6+ur7K7x+FZ Rj86NzU3Pk9cb+/Nvry9wb6/w8jV/1pFOzgzLSssKygoLTQ9SNrHvbi3uLq8xNtMTE9eZWfn x8G6r6yttLa9ymdGODQ1PUBHzrWtrauutLrC2VlNPj1BRE1be+/jzMLJzNPjXVtKQDo2NDEu KygoKignKjA4QGvIv7u4uLq8v83hY2lvc+/Ovrm2r6utr7O7yetURzs5PUdbyrevrq+zusfP 91lEPjs5OT5FTFBd98zIzcvKy93ja1lPQzs6Mi4sLCsqKzRFT9a5s7O3ubm9vcPnY1dMS1NN XdfMw7y9x8rI0V1VT1M+PUdvz76vq6+vr7zCy9VZTkpKTERhc1lr0d3Sy83azs5rXU5EODMu KykmJSQkIygyOkTOuLWzrrG/xbu41s7I1+u9ubmyrKytrbS7uuFCOjY0ODlAc8O+tbbAyM3v X11LRkZERV7f69PPz9vZyszKx8DYy8vrUT83Li8pJioqKCs0Oz13u7W0srXHwsXcUVQ9PEZE QE/XzsC6uL28xcHhRz9HQD5axbavq6mssbC+z+PTRzI8Ojg700ZFd9dN47nDz7+47cjM7ztD Qy4qLS0jJygqMDNP38vPu7m8vbq2vsfG19fXzsO1tLOvrbPfu77VO0xFNS9CQEXCzL+3rcvY 4108Qz0wO0jj/93awr7VwLW83bS6wtTDWzowMzMoIyYpIyorLkJd19W6r7K/vLH/zrz3Pc3M P2O/zky5s9HIr+dMPkIvNkpM0LinpJ+fo6qvvU5LSzYuMjk4SdDP3sO9z8vFTzZHQi49U0Rd zMnN59zrbzA3PDsuLi0xKTAuKz3rxb6urqWgsbe4n6Sqt6rGLTI2Kibrs8XBq8F7MDIfJCEn Ljtfr6ain5+foqK1w0IvHyAoIzBByc+trKepq7HGZTErHx8fHx8fHyAnMkLIr6ifn5+fn5+f o6Cx78HhLzRTPylHMysrOiwmTEU4P7Pew7P33atJSa6nc76sr0i2rMNevbs438hIJVlQLyx3 OCgtNCslMTwuNOPQyLKtqqerrK7GzVvTNS0uRSwmRdM3T63FrqzM377eOT1fKy5XREjJt7Oq sLKtqv++wUfXwUss3UYvxNg8c6zLvrLDv75eS2suNy0iLjMfJjsyPa62yq2ipsyrxUq+zT5O 20e5PTK8yz+8sV/VZ7NFS09NMi9UTTxetFzIu96yvt+7r1ezsMXMa1tO0z05KT0rIkAuMEn3 QLfnabRWSkfJTDo3yk9DLN+qv1/RyUbrU0lFd0W5tr3Bv7xPZ9EwLsbEPFuvvVO+q7Cup7K4 Y080HyUgHyMmP0BXraOroammta3Jv0tLOygpKT5EL+mst8q7q6zv0cu1UUFZP003LjMzXS00 RkYq4z0wz0M4QrNFyrNIvsS3T7HG07DDsrasv7m/XbprOzFILS48KD4wRT3XO0TEUEjJy99M 3bPQY925RbbEa3OvQzrJOsTXTOvJ+9e/68FMr21aRMbDQcdCxMy92a9OwNXzX0bYOlVR33dO rcDjw7V31Uc8d0w/OzxTUz4/VdDz99/Ore3G78xCPjxBNi8/Ly85OTMywT+3b83Gzu3Vx0lD 70nIzFHIt669966wU8RMUelET0DLNWdMa01ttmfBP824Ok9JPeEw6Va/O2e8ULZS07XHU7rK uljVw1vXa/tfQ088STlLSmPnzGO/W7/Wx//TxDxNXm8x/85D30nP5bJMw+PNN9Y9V1bBUc8/ 7bG94cO+zmvHZ0zLRz9CQjhZSztAc0TOXjhO38FTyM1XzXNH5z1JNFMqT0RfTdeyXa/pwcXI Y1fS/87bX9nKzGf/vuHHz/e4T8DzuUpX73vFOs/Nzcr/yOf33kC/d9tcYchP671PxNDUSsL3 uL3VxLXF+8tMS009KjM4LS45OkTjMtBZ3Ei6wtFKb0rBb0zIxcg6u2HP10vM1O8z2M81QzbO R8ZYtMzPU8vPz1HKU8tFYWvM90PdVMZY607HTkbcP8c9zuVFVDrINcw/QzzzZ0q9yeu0uLnJ u8NXb9rV+06+Srbf80/Zx8/USctaREndOE04XGFvwsW367fR3L7ezzzeOfdEyEhfw0vBd8xD xmvOWlNj5+c+Uzk+ODgvQDM+NUE/WVX/yMnAx3fA/7BlvGm+Ub5Rxsq+xdW988XhVmNGVzlL OFpjRMLTtc68w9PMy9vT7VnY8+//593aXc3Wz8/I28vv4UHHUVlMUDxANUU9OktJa9fFy8jK w9zM49nKTM5Zd1lR90/cXdTdz9vX3l5jUT5VTW9P2b++vbq/wdJ3Y1dKPkBGPUM+TFlvWs/F 083Hw9HVzu1nRUg+QTU2ODQ2MzpNTGfcw8nLw8nhx9bO3cnVyMrAxrjFwL3Cu9vC92dcQ005 PD5BS1Prv8TVx87I1Gfe/9NOa3dvT1X3d3NvzM7vz8jI02drXVM8OTk6NDQ2MTw+UljN0MC7 v77SynfMZ1djUWtOY3PX0+3ry9Xn3ddlWm9LW0pIR/vdyb6+usPB2tTNZUxJUERLSllXa1nv x9bP2cfHx8rK1/9NVkM+NzM3NzM4PFxl18fFv8DFy8nMzszfxsXHzcTBwcjEyc/b299fR0M/ PTs/TvfUyb64usHJ1W9hU01VV1JNUE1TVG9l49PcyNHN193r729OQ0Y1NjQyMTA2NUJKY8rE wsfCxtnZ69Tr39nj7+/OztXdysbP5//vW0NDPT9ARf/OvrivsLK1vsPP0P9eU0peWVFUW2v/ a9nZzdXO1P93d29IPz0+NTIxMC4tNjtFSf/TvLu+ubu5vb3Nztfez9LT19jLxczb/8f3UkRJ Qz08QEpV28u/wcS/zdNvVE1fUD9DS0hMW13zzsfCur+3u77Jzd1PSUc/ODk2NTAvNzs/PmXj z9bJzd7N1MzP29fMydPIxsbAvr7B0cjTy2fnSkJBQ1lRzce+t7u9xMbTd3tXTEdHSU1Tb9nb 6c7SzcjEyc/lWWFKOzk4Ly0uLSsuMkNPVM3Dvr28vL+8u73IzcTFzNDGy83X291rX1FGPDo+ Ojo5P0Jb28C/vb3Ix9HOzNFzVE1VT1lYXWNn59jNx727vb68ydlfU0s/NDAyNS8vNkVGT2fP zM3JzN/v1t1nb9/KzNPOzGGryd/Lw06zzMn3XNHb3TfG12dfsfPCVVfvsllvQkfDP8c64+NB Ub9Ew9xc0+U8OL9K2FoyLjstOi89NOsuSz22ScPOrsixY8K/+04/47/e373FzcNQuMrTa2Vd Y0AsP0M4z7a7q666y6v3R1XhPdZLNMjHQN3Id9m349m3wTTFRMI80zE+RTNfWVwsWka6UVlG sk3nv8tR9zYwwq9HONTJa008Zaavus6tu1cxLS8sIjDlvNfJpqemtr61tjYrNiciIB8nPz1Y q6Kon6GjpajBYfcvIx8iIx8nHys7vbemrZ+rs03rMy03Vc2trK+rr9c8QDo0PeW2tc6zpKW+ yMXOTyYkJygjKy9GwaijoJ+fpKqryS8/LB8iIh8gKT0+Pb+wraOgpK9r4UY1LjXJwKu1tNVX KikhHyErN0vIuMasoa6/zME6LyYuM1VDY6ynp6Ofn6WyxunfNR8fKB8fIyYp2zU5ta9GwKOf xdGtrsZb2rGgpK2sqrc/LSwpHx8jMTQySc64rMfBs7c6PU44M2PZyq+ioqGfp62rtd3dPScu Kx8jLiQr2z8uY6jRO7Gfw0ZfwMJPS8WiprW1r18tICQiIR8q08x3tKiuqq3S5VsnHyIoHy89 X66foaSjqL5ZSUQ1MSk3KyknO0w7R8GzoqlvvqilTe+3vltS466hq7SutjkjJyYfHyAtPt9d rau1r6y43U0sNTctNMjVZ6afq6yrvddKLC1FNjM3PS46RitnscU9rqZra6ejXVGzsr/Z072k rNDOyDUfHyIfHyAwyb7DtJ+rw7W7dywoKy4rL1C+r6qfoamptNNvTz8/Qi45TCchLln3PDj3 59/E+2Oon6/rqaHDP9G6p6/KuLdVIyInJiIlSry/ya6tvLnhz1Q1Kjo/LTe5sK6mn6Kps99v Pi0kOD4vK0cyLEQ34cG+Ta2rrFU3UKeuNe+wxjI2R7atxdjB3SkfICsiISjntsLNqKOuX8Sx xy4kN1xENc6qqKqmrbbHOTs3Ki93Oj7HUTk8Zy85zKpESK6t5+t7p6CqS6yoyDhPxcW+Tklh Nh8iKiciLty7tr2vpalLSMPILC9fXE3z27+yq6motVhpYyotLixM5TQ+tOM2O+/7vDQ7vai3 udA1XbSsVEG31zwzOruvs0/d0zghHyMnKitZq6mpt8GrsTQz7eMtM8/JtM5jwKWjrLOww08x Mt1nND20uzUvSW05P08+zae8bbmhs8Y/PrGt3yu/r9UyV7atyTdT9zkfISs0KTTBqrG/taev Rjvrxz0wX8LOb//BuK2ssrXYQTA0LixQ1c7JW+9CNSw7SzswP0Jcy6Owtq6zyz0rWa/nLT26 ezwzS7GtzTFBUCkfJDFHRMKtn6evra/HPzE1NisuRqzXPGOyrq+2wrS4vtfDSDxNX0tGMi84 Tj4wOrq30dqmp846wKqtRCc4vksvWq3JL0U3OTkuObGvTzbVUzYlL2vEvbSfn6Sps7zAVywn Mjw6P0jbwUw7x6/M22dDX0gpKD85Nzw/TmlMOUiyxeO/qqbDWdW5zEzrrVsvNUUzva+v6TpR MjQ6Q9exvP84MCwpKTN3uqyfn5+fn6KtvD0pKSsfHy42L0e+xrymuP9P8zgwQELv09c1Lyk5 NS04tqaosbGvrcw9Pau0TCy+v+tALzTcwikqa8YqKTBNQj1Dt5+qurmzYy8oL9O6wa2fn6Os r7bPLyAqLiIgLC0yTT1DvbHL1VlXXVUyNs/GRlG9urvD47iuwsqvqq+80ruqXzT3wzw5Pv/H P1tfOSkxQDJBt7nVQEA4W09Uu6irzcvfbzAtQ72/uqafpqyzvVEuIB8fHx8gJCo3QLympbmr ornLytvK1jo/+/83b763wK2oqa7L78/RRT0/dz4xLTg5N0BZSFH/T2d3b9RLzcbbd2/bSUnr /1V7wcHEyr22sLm2trC4vcZ3Ri4pLjMrKjdDOz5Nb9B3Qz1ZUUI4TsvK1bmmpaqqpKesr7W1 tM1f71UvNT89NTc3Ny8uNkU7NDg1LzE3Pmm/ta+yuLGuvr+4vMXMVUnZzVFjylZFQzk1OTQr MDk4P93Pv73Bxs7zSlVv693EwMbCwr+9u8zR01tJPkNQ28vCu8Lfd15JPT5Oz8nfzr24ymdr zk8/Pk5PUT5D2dNBP2fX3evPvrrRSklXRTlB/148SnfF0e/jy8pXUt3aZ+O+w1ta52nn72Fv yc/3/8jB2/fGvcrvZ01GPzs4Oj88Slr/WGvOz9nEvsPlW2tINjU/U17Z083Jz93v3efrzsft d2tIOj1EU2HZx7u1vMDAurzC2tO/y0lBTkQzLC82SURNz7u4vr+7t73BvbzEzs3O0dLzW/tb SEpNSUxVZevrTz9KPTI6OTc8R1FOTkxTXV9VXffr187SycXNycnt2cnL0bmzubO3vr/DXD86 Ozs7PkZEODU0OD5PZ8i6u7q6vt/dysjvadnHyv9U08zZa8jEUWM3PD0uLDU+S0ZMVFdES2HL tbKzs7Czs7W9z9/Z1mNGS2vf/2Np2Ug5NDw7NDc8Zelnb9fLzM6+vLm9wr7Ed0lN4/9GQkJB Ozk8RlNNYcbHzMvbWe3W68zEy83MbU1KTz5CTU9AQz9ASVFTY9zT1c/DvLm6v7vAz8vL1Wvp 7//ryNZ3/+lVUVlbb+fd287L2V/e1eNzX0pKRjk0Okhb5c/KytnV3OPzX1ljZ1NGQUNZ59vB s7W8wMr3b3dfT05MXVtfY8a8xNPRzuNIOjg7PTk4RfdzW3fb3dbS07+8v7+8v8PEzN/n81VG PTMxNDU1OD5AREtFSFv/3M7CxMXI0tXJxMfKuLi7xOvnztfXzdRPP2NfN3f318jYyMbrU0xV 5/Nf1cC+yMvf6917e+fba09VTUlEP0FVV0hBPzw+PkNES1Nr7czZ39nIwL68vMnJ7Xfv+1v3 08vT2uv7/11PTldJPTw7Okbr2My/wMjN2VdaWktFWe9hXevjy8G+vru3xM/VaVNXSj9MV05M 91FJSlJX99ZvbWFP89X3V83K0W9zSE1NUf/Bws3LydTjyr3IyMj7UfdPUW/U78i+yuFvT0z/ a1FOXFVcT0A9R1dQW+/z2+drd8rB09TK2U1LPTQ1NjVHW1tSysXS78bIw7q+0v9PR01PU9/J xMnD309Y3/db691VR0U/SFvj0cDCy9vtNELKL9xWPcRD1dNZvNdrubjf0dfp18nPzNPY/1BI PTg6MT7CPGPIxL5HRePFxtvjSt9KP2FZe83Jv9fj7U5PXlHl2XfvY1ZPS1nTyMC+2GV3Xmvd 98Y3vrA9PD88uuPRr3vLzEh33l/n3cXDylFPMzE6LjY9TENVa/fny8G9tLfC1N1zOlc+Y9Pa uMPNx3Pj42Pr3lNXRj53Szaz6zi+P7m6NsRBQbc+XctXVkvczLfFusXd1VxGymHLZ9Xrad4z Oj00TCphxy5S1y/PRFm/39bLZ0jZY9+9U7nP1k+/OEPFN8HNSc33Mki/P89N2rnTx99Kx1Xr Os1fyUk6uz1by0mzc/fE9zx33Efc58Tzx0nlwTjKWzpX0MM199lHW7DptOe/30vPd1ZExtTV ucA7uz/JwN9lutVDSEtDU9/SU7tBzdRAvE//1z7GRllMO88+uU1ruW+zwUvrb0zEQ8ZLS05W PD08R91Gb0ha11XRRcJrb7TXVrpLQ8df17xnylPvvUXKukmxPlS7Ob9KQ7hD3NnIwTjA1Vuy Se++81Tbb0Ln31nhzcfUvEbGPM7Pu1S+tjy4Pjm3O8zIUzbE5yzDTVO9vTu1uz62UD27VU+9 Z3fMzjm+bze+Osq+RDW+7z68OWG8XF9I2zjRNvdc2U1E2Tu+dz64W+W3UVHKvjXF50S/2TDL NzfPVTu7SEfITvPn0E292UvKXbhB29W8zle067/3R1awRb/Jzu9t3DhP1zXAW8rYrtA8x7tL Rq9Xd+9ETdlXQkXAPbzZRNpZv03Ax8tLZzrjey5Ga8Ezw1s30/suz7bdSk7bWN9TPbtMVdFl 2TP/TsvFPLtZQ84z1Ek42s7nSbl7V8V7V8NvxVE/1VxRc2drwW9B2rNKT8y9ytXRw8FUQsTR PURbVjrJPj5GXLFzTrW4zTvMvlLr90S7e0hDtU1GssnVukfY50s843dEONFTzOfMt2td6dHl PzTjPys8Z0BMXdm2ulm5u+/nuMdO3N1PNkhVLlVELzJNWzHZxeO5uv9Z1ckyMlHtuzfWpbNd 16++RjFR0TUrPbzvLNuyVDSworJCr6a6RSlCsc0mMb3NMy3Nrq/DrKKnwWnntDYqQ0g4LTy2 vse5srbeZT03LCcrMy4yPMO5t6ymoaWvsMZWQi8lJS4qLC03S764/7mpvDzrvy1ES7rWRUA/ rkM0zavDSa6828XBPjE9QzD/bS7jt2/zzz1nuk4rQctBvUMxsq8+K/fKNSguurbPOUarrktG rKGpvby0rN83Q984JSUuT8LHT66frdwww709JUzSUCsu662xSu+soMMrQK/BLCvvs7Q+L1u+ ySoqwbIyMMdKSHdKy7CqX8Ct1d3tyMDNxkwxRTAqLO/dOzZdVUgvM1fRw907z7DBMjrPrLZ3 26up1FHMvus4OExLMi1E49vnwbOusWHMsbBLNsm2Nf9ZLza8MSjfrDouxq3KY+k7Qcc+LNOv 38quvju7p61rLTq8qUclOLRnJyzXpK4zK8qtQSc3q7dKLVa4tFkqPbyqazzn685ZOzXDuj0q OU0+LkG9r7U6OLGkySkv6aOvMi65o7s8JWmosDMsuKvZKTTDqtErKVOs0yw1rrMvLduotNgy WKu2LSnAq9U2xbmxxTAytK82N7VrSrz3LsusVjWyyzHerzguxP8oMbG+NkW03TxHWEy3tz06 ualON83eNkbAQ/Opu109PDU8S93fwL2/Uyouv0Ex26WrTURAPM29OTGzrkUtyaq+ODk7ratR K0yyOSY76biw1SdErdEuSv9YrK5ML82nYzNH2XfB1TTzralBM2e090EsUautPzHXres2LVOz sb+7V1e6QicnOGW7q9XjrsApKsvTRW9lyqzLJzi+vT8xN8SnxjQvx9dFNEXNwO/rvttTS0Y2 PK+2PE/APWWyNzO+sTtcvddvvkMxX8//QUq00tjEucVNLylQwrxOMryo/0W/u+fRby1Lrbkt U7zN2zw4uqe0Xc7HSigu3aas3F33z1k2K1+qqMo2O0P7bzUyR7S4v9NDTMi/4+OzxEztZ0Zf WzE6uPM0OfutrcwoLbiq2TnTzsQvKDi02TvfwSopy62qwSgiVapWLDG3oao/Jy1Ctq3NRV62 1WVLPz13rr1HSFlD0cBMN1nX18tGOcymwk/LsbpHMig2wbLWW8Oup9EsLOmvv0UvwK7KLTLN sK3IOEXHxzwpK+2svG82c7SuVjlWZ29lzlEtSbrKP8O5QS5vw0/Jsj9IvqzdLiEoxKm0NCw1 O9y+R1OrqNs2JS/BsbTvWee/w005O0e7rLhISbi8Py0+58vGa1PQyc7XU0BJa//Hs7nd/9XO zWtCPkvbx8JnQsSzx03nvcXvYUo3M0xb69H398e6y0Q/W9O5v1hC0Md3REY/X8nhXFFbX+ta TsW6vcfGb07XzUxE5+9PRT4/Ozc228BnPUA5U8hfR2W/zFVRP0fIvszvtsT7W+lb48LB3s7B RjIvUOtPW9VSO0FvVVzRxe/X0/dG97zLyLjDy72270Y/S1bnymVF/7vC3drJzffdZTQuOV1z 41tAU7e7Z+HDe8u360dOe0k/Ni9Ou8/rXz1G2cXXw7/OwsRdRFF3vMo8NlVvV048Kk7BVztJ RDvdwVNPycztz8PKv722sLi+02FCSffRWEM5QVdGPmfUX088OkvnvP89PcS9zsa72NPByGO8 tr3tX1tV61h33VvfTzw+WktJzspJPVNYVV1vybu9yHfv/1Rdzru7vca/YTxnzsfezM5jd1dv XWPX619j+0NLVDw+TUs/Sz82Nu/rXdLZY07r1OdXTlvbwcPfXFdU68jD1dTW1/vfa09Vz9dR Rv9WQDdNzrWsvlJO08zR1crEvLvETjk7S93N41tnSjw5RWfMxVw9U/PjXf/v5d3n0dF7d+vL wL/FTUvXymvvUE//u8FDOTxFUffvTU5hb2VRW/9d+9nGysr3R0nKxMDMVV1Y51Vj6+lMRkZd 829nSU/Kw2dET1Hc3crQ3e33/0pKXPfvysLJ2V0+PDxP0c7ad1dIRWPT08q/u793P0ZKYcDD Y1vnX0BHTs64uMtj3s27uLu4ucPN70NCSFN370tPTEBBOj1Zys/nTU9XTUZpv77H70lHZ/vO 11/vx7/N90xGPEbjy8heQz5EQU1NSWvVY0c7RVPnwsjJy87nXXfDtri6yGdJa+9Tae3r5cnT TTk8TNnAw15FW95HUdm/ytRdSV/nT0Rr1c9lPzgyP1H3wbm5ub3DzdTdw8fvVz05Oz09Rk5b /29rb1rvyr+3s7i+0Vk/PUzMv9FdTEpLU/PLxcHHyvddSEVWe3dTSkpJRDo/78G/xdNrZVdB TNfnY01FRT04Nj/NvL/O4+tvUlnXxru/yVtFPkJt59HFy9/pa1Nvyrq4vcTra1FNWuvNzMvd a15PX9LJz8vr/2dPRU9r3tvdb0U8PD9Y187Wd1FNSkpV183Cv7zFaU5c993QXUA7NzY2P1/d 4d3ra29ZV823try/w8fj49fLxsvnTkA9PVHfysfJ111NPzxDX29fU0xJSlRjzsK8ycrjUUZV XWve2eNTRkRGTd7JysnMYUpGRlnRx8nVd11KSUVLb8nAwczT5djCvri7vs7Zd0dEZ+PR019R TVFNXtfHzNXn/2NMR0JU993pTEE+Q1Pn92NNT09XTlP/ycPP3F9tR0VJZ9nZ1+NJQUVVXc/F zVtISUlh68nCwLy/xdPd48y8x9hvU0dEQ0h3zMrU3/9jTlD3ycrnTkVAQ0RI5cbBxc5lRkRc y7/AyntNQD5CVtXIy9P7Xlv/49/EvsvaTT48QUdZZWNZc2NVe8a5tLW+ydNdSEdLb9jvYVxf WV9ryr27v8d3SURDTf/zW0tDPD9CTWnPz+Prd0xIS0//09leV0ZAQEvvyMrX3t9v7+fp0cnf X1lGQExrzL68wMbFy9Lb08G8xe9OQ0JGV//XzfNNTEVET2PZytfvX1dPU2fevri802tZSk5N Tuvj/1xIRUZZa93Jz+9ZSUlOX+/PzOdPRkE/Rk1f0tHb4e//59XEuLe8y+lZSkZJc8/P+09T VV37387ExM/hWUlGS1zv4e1bT0xHSU1l499dTUhGVXfXxcDE3Onna/fj2NPX41lTTUtUZ+Xh 33tjX1133tHFvL/EyczIx8nN095zWVZPTlVfc/NjTkhJSkhNUld3d19dXXPp08nAwc/j82FR TExNWWNZU1NQV2Vt99v3V1RZXWd38+vvY1FQT0tTa/fa3+/p1dfLx8PAwMfZ/11aZXf73d/z 5/NrX2Nfa9vZ921jVFlfaefd52ttb19WTk9TV01MU1Bfd+vTx8jNztXz493l39XfY2lfU0lC SE5dZ11n7efn3M+/vb6/ws7/Z1dv721TWU5MTlFSWf979+9tU1FOW//nb/Pj7fP3/+/f5WNf T0FESE1X7+fj2/dfWFVb3dXb1dt3aWNhb+/pd3NhWWFjd8/DxsfGyM7R0c/K0eP7b1RNTVzj yszn4953YV1d99X3a2taT1FWZ9jQ2+t3a05HSkxf93dfWVNUXWPdz+Xv/15bV1Nj2dLd+2tX UEtQZ9HS2c7W397Wy7+7wMjVb1VPT1Xz4/drW05LTVRt0+ldV1JHREZT39HT1917Y19v49nf Y1RTSkZKV+HFyc/T71tRUWfRzdfva1RNSU7/3dxnXF5fVl3fxr29wcXM193f18zO52NVTEtL XuPM2P93XktFSFPr22tbV1BTUWXVys7vWkxJQT9IY+PpZ2dnY1tn3cvK429ZVVNRV93N0mta W1lPTunMwsfN0dXX3s/EvsPO3GNWTEtZ18/Xb2FbUU5P5c/L3W9fUk1JUN3Iyc7nb19YUV7b 3/tZTktLSlfPw7/L2/djVU9b18zT61hJRkNFXNPV7WdYUFFd38W7u8LO2+tjc9nDx9l3WkxJ SU3pzNN3U0dDP0NV69brXlVOTlNf0cPK1ltMRD9AS+3X3W9jU01LXNPJy9n/XlFMTV3azNbj Y1VKR1bVwL7AxszX5evQwb7I1/tlTk1f28zM329VS0ZFV9fMzttzVUtFVd7Mxcvd711JRE5n 9/9WTEU+PEFrz8nM1/NjTk7ry8XFzm9rTD9HWefa2+9eUUlL98e+vsTXbVVNVtXDv8LXd1dL SmHn09V3VUc+PUV30c3R5V1dUE/dxsPGzV9TRD5G99rT1d1vVUtMXNnIy873Z0pGTnfX0dj3 V01ESe/Lv7y+x87X79fMxsPK12dTSUz/0snK2FtLRT5Eb+Pb33ddTUZKX9TFxMbdWkhDSVtj Z29UST49Qlfr1c7R+15NT+fbycXG0OtOQ0hf697X22NORkvjz8rHx9VvU0dY59XNytLfZ1Zb 383NzM53UEJATO/W083db1lKVdHKxsfOWUs9PEln3NnT22NJQkZz09XV13tOQj9O39TT2P9b ST1Ia8vGw8XM3W/v0cK9wcbdXklHUtvMy9HhV0g+O0lc6+//XUxBQUrvycTJy9VtTlNp2dnn Z0xDPTtD+9bLzd1vU0hQ98bCxcnha09LVdrLyM3nXU5DS9/Iw8LJ62tMSFvhysbH1/9bTVLX xcHCyfddTkdX1c7Ky+1fSUVLb87GydNvSTs6PlNz5+tzU0M/RHvOy8vNe1RCQVXj1M/W6VND QErvysG+wtJrU1nVxL++xutPRD5K28zIyedYQTw/TfPVztVdRjw+TOvOycbYZ0xLVdjIx8zb VUc8PUxv0MnO22NLRkrrysTFzW1LQURd0MnJzON3TUZZ08S/wMrZV0ZHVd7NycznWk5JWM/E wcTWa1FGR2nbz87X/09DQ0vny8bK1V9IPjtGZ+/t61ZGQT5E+9TIytHvWktJT9nJycrnWUpH Rm3Iw8HF229bVmvKwL/H3WNMREdazcPCxdRnT0hJ/87LzeNVS0JEWdvJxcrnY09OXd/GydX/ TUE/P0rjzMvaa1FMRk3jx7/E1ftRSUNFc8vL0ndSS0xP98O7vcrfZVVLV9PGyONhU0tITV/M v8znV0tFRU73zczfZ1VNSlfvw7zC2W9bSkNCSf/dXE5JREFCS+fHyeddVU5NU/PNv813Z1hP VV3jwbzJ1d/v//ffw7zA221XS0dKYdfAzOfnd1lSVePHx91fU0dCQE3byc7/d19XVFfjzch7 TElDQkdMa8vP92tnVlRb5cS+ym9bVEpHSFfdzHtRUUxLTl3PwsfZ6/dnX2PlysPVa11cV1t3 28XE3HtnVlFTXuvW5VtTU1hl68y/vcXf721OSUpRaW9RS0hISUxf3c7Q91pbWVxj3c/Jz/9v d2/z1czEv8zZ4+Hv49fMycnXX1dRTk9YZd3cZ11dVVll69bP31xRSkhMWm/TzeN773d773N7 615FQkNESlBd4czV7+vt7+Pf1c3Pa1FOTEtMTlfnbU9NWGfz59nJw83f5+Pe3ePZy8jf8+fr 5d/f08rX/19fV1dPT2n3Z1FXc/fv7dPIzOdlYVVPTUta92FRTlZdW1VZ7+F3XG//d19d99va b2/p3ePr3cvEy9LPz9XvZ2/d41dOVVVPSlRp2913d+//Y15r599fV1thWU9f18rM3dbR32NT VlpvVUlKTEtITGPUz9vp3ed3XXPbz9n/e29jUU9d89fj79/n/23318bDytfR6W9de9PKytXU 1ON3Z3fYz+dvZ1BIQkNNXWdbd+t7e//by8fN42lXSkJDS23vc21vY1tPVu/Y3O9vWU1LTmPd 0+X3/21rW//Xw7/JzdPjXVVr2djhd15RUUpJd9zT3f9rXldQb93S3fNzW1lPU+XKxMbN4WtV SUpdaWtYSkdGQUhezMfN0+13X1hr0MnO2G9WVU9Md8rFydPr3fdd6czBydn/V1FJSVvOxsnW 92VYTVTZzM3bYUxLQkJW6c/U43dhW1NZ2cnL12lNR0I/TOfT0uddVk5FRV/Z0dxjVUxEQkrn z9PnY1lVVmPIuLW6v8vZXU5d3czK2OtnWExLd8nEydn/W0pHTPPPzuVfV05ETN3JwMPS32dI PkJc39rhb1VMQkVvzcjI2m9fSkBP28zIzuttV0NFWdPExcrZ51dR98jBxM97T0U9QGXayMfV 62dGQ03bycbR71dHPkBc0cjJ0etfTkhd1MvJ21FJPTg+TO/Pzt1hTj8+TenNzdJrVEVASuvK xMXQ72tQT9nDubm9w89jTlXdy8jI0/dVSEdrzsfGyutZS0NId+HT0u9XST5DT9/Kw8TU/0lC Rln/3dx3VExCQ2fby8vS81lDPkpd59nV71RGP0Jj18nGyNXpYVfdwr6+wdhtSD9GX9zNyMnf W0M/T9/QysnXZ0tFSfPOx8XD1u1RS2PXzMzN2FlDOTpIb93W0XdORD5K+9PPzd9dSz9I79HJ xsrYY0pLd8a8vL3D2FdGTevZ19Xcb1dGRHfPwcPF2PtKQkln0M7P22dJPj9Y1czM0/9TQjs/ WPvj3/9fTD9KZ9HLzNF7Uz48RG/b3N93VEQ9QGfSysbL191dW8+/urvAy+lMP0Nn08vKz+Nc S0NW1cvLzfdVSD9J48zEwMjT51NSb8vGyc3/Tj89QV7Xzs7ZX04+PUlr6+f3V0s+PERb08nF zetVSkvnw7y7vMjfWktd2c7O1+1fSD5AVc+/wcLPd0pIT93MzM3bX0Q+P1PXzMvPa1A9OTxI Z+/l+1lKRkzrxr+/wdddR0VL683Nz+NWRz5Fd9PFwcfP/09OX8a7vb/J50tBRm/NyMfN62NI QU/TysrM32dMQENP1cfGxdHpW1NZ28bEx9VZSz87R1zf2NfdVEM9PUdr5+9vSz86OT9j2dLM 2HdfVmPLvrm5vMHPa1lnz8vR1XtMRT8+T9XJyc/vWVNMV9jLyc3b/1RKTVvRx8rP71VDPjxK /+Pf71lQSkxf1cK/yuN3VElNX9PJzNlhSkRCSO3Iw8nX92ldZ9PDvcHU61FGQENdz8nN32VT TU1fzsHE1mtRS0ZM783Gy9z3Y1ZRW9fFy99TR0JARFXVy9NrT0dBP0Zf3+VdS0VBP0RN1sXS 6WdeZ2fZv7S0vMTL0+v/28vCz19OTElNU//Iwdp7W1JOUVnjysxvWlNTWGPdybzF43daTEVD TtnO71pfVFRXY87Axf9WT0pNTF/bxt9XTklHRkhdzszna2938/fQvLnG52dTTExMb8jG529r X2Nbb8rC129SSkZHSvfGxNh3Y11jXmvdyeNMRD9BRUdezszvZ1NNTk5P88zVa05LSkpNa93K 0/tpb//r3cW5ub3Fys/V3tnOzN9ZS0lJTVX308vjY11dXF9r49Hhd1VVVV/73czExuFfWUxJ SExf/29XU1Fca2/h0+VjTEtLTlRb8+fvWU5PU1tp7dHKz9vb18/MycbGx9xfUU9TU1nz2+dh XV1hb+/hzs3rZ1dXY2//48nI13fv49vj7+vjX0tGSE1bXGHn2f9fYWf/92/t0dNpTlFUXVpb d9vvXF7/3NXZzMDAxs7V19Xbb+/Z41dRXGtvXV/r3P9bXWd7X1FY/3deUVr/3Xdr2M3VaV1V UUlDSF/va1tdZ/djX/PX52tVYWdfTExdb1tOU1dfW2fjyMLHyMbBw8rOy8bO811dXU5IS237 Y1ldZ15XXf/Mzt3r7d/rd2vRxsza39fa/11d9/tVSktOTkdHT//ta2dv/11VUf/j71hTUk9L TmPj29/Z1NPW19HGwcTK0d7vXVJb8+tvaXdnWlNb693d7/P3d1pMTmX3ZVxdYV1RVuPNzdnh b19NSVL/3djd5ef/Xl1v2tHd6/9bS0VETWl7Z15fV05V7c6+vb29wMfP09PIyNnpZ1FGSVPv 3N3j/1VMSU5n6dXa529dUVVf28jFys7XbVpVXvf3c11ORkJAR1lz2+Pra1RNTVbf1Nnj/1dL R0x3187P09jfd/PRxr++xdl3UkdFTnfd3+d3XVBPX9nMzNHfd1xMS1dv5d93Y11VTVHhy8nL 3WtPQUBK/87N0ePzaVVY69HM1e9hTkA8PU138/tnV0tHTHfJv728v8PL09LIwb/J52VMPz9H c9PW3WtQREJFX+PZ22tTTklDVeXCv8DGz99bU2vY1d9zT0Y/PURX39jfc1dNRUNSe9PV72NV SEhO787Ex9Hjd2lv1cK8u73O91tOTmvjztd3Y1hOV3fOxcPI1ndUUVt729feY1FOTFjr0cTC 02NRQTxDTF3p63daT0tP98/Hx9BrTUQ9RFVv3Nl7W01FTv/SxL+/ytXr3s/Hv77E2l1HQ0ZY /9/bb1RKP0Jb/97b42lOQkBFZ9fJxMXO32tz18vKz95fRj89TP/f0s/f+09ER1f34+fzVUc8 OkJj2M/N1N3/W2/Lvbu7vcnR/2P/1crHzNp3TURKa9PLzM/nX0tGUe3Uzt5fXUhATG3Ry87r X0o8O0NU9+97WVpJSFrRw8DDz29XQ0FRZ+Pnb1lMRUBH38jAw8jT32Nj28fBwsnrU0g/SHPc zM/nZ1JFRlPdzsvN32NOSkzny8fFydPna13jzcrN2l9TRT5KX9XOzttfTUREV+3V1elTRz87 P1n/2NXh92dZa8q+ubm7wtpjVFzbzMnK129QSUdn28/N011PQUFMY9/X3PNZSUFDZ83Gys9z TUA+Rl/f2dxfT0dBTO/Xy8vZbU1AQEr3z83VZ05BP0nvysK+w87pZW/Rwr6/x+lfR0BJXdnM zdpfT0ZHZ87Gx8rlXU1JT9nKwsLK3W1OTW/b0Nn/WUo+PkNpzsjIzntPRURO69nd91FJPzxD UOfc4/9bTklTd8S7urvC12tZXePIxMreW05HSFrpy8fL1WNLRUZb4dHX71dNSUlWzsLAxddX SkNBW9zL0N/3WU1KTefIyM3rTkQ/PEjfz83XZ1RLR03rwr2+wszl/+3Zwry8w91RSkRCVdnO zdlbS0VGTvfGwMnWY0tGRU7XxL/G129cVVFrzcvcX0dCPj9IZ83I1OlXSERET+PO1mNNRUNC R2vWytpdT0pGSWfRwL7L1mdjX13nw73D2WtTU1NfzsK/z+9rVE1OUu/N0fdUTkpLUe/Ev8bd XUlFREvvzcfa/2dUTlhrzsLM51pKQ0FBTt3M1mdaU0tPXdG/usTO1efr3dTEvMffW0xHSEhV 0857T0dCQUZP/8XE3nNXT1Vde8a8xM3Zd2FdVXfPzmFNRkJESlH3ys9nWUxJS01e1c/lV01H R09Z3cjM72NbWmP/1cW7v8/b7213b97Ew8zrbV9j7+PNxsfab2teW1he39HnV1FLTldb78/T 6VNKRkhMWeXOyd9rY15nc+vTzuNnVk1NTk9d5+NbTE1KTlb/z8fI1dvd2c3PzsfK91lTTU5R W//Z1XNOSklLVmf309tjWVtn79nOxL/Iz9//b2tXW+vnV0pLTlFcY2vh61hPSExjX2Xn195b U1Vj9//v19PrZ3Pz1czLxb6+zd/3/+//a+vW2nddZ2/j92/r1fdbV11jXFNV9+tlWVtv7/9h b+9vTUlLU2Nj79nL0vd3d+97ZWfn5/9YVVpbUUlPX1xJSVNbXFt328bGzMvGxM3a39ndZ1hb be/3d+PT1GtjaW9zY2/n1etdY//n83vnzsvZ5f9vYU5JVf/3Y3vv429bWXvf/2VjbWdXUFvp 329pd/tvV1n/29vv7eHR3ePfy8jP2+f/WUxHVe3d7/fj2+9dWW3b3e//e19PSU1z3ePn3en3 d1xj6/9bUlVPTk1Qa9vc6//vY1dQUXvZ3+vrY09NSVF36+/7d2dlWW/ax8LDw8TJ2/P31tHV 3v9va1lSa9vP3elnW09IUF7f5+vvb19QTlvcx8fN2fdjSkVMXeXj3ud3XVVP/9HT2edeTkhH S2nf63NZUExDRlnn09HV2+/7d+fHvcDGz/9RR0ln2M7O1+tvVElN59fU1913VUlFT93Ny83Z 82tXWe/R0O9fT0pCP0ph18/T2ftjTUxX18vP1f9hS0dM787Jy9Pn/1ZV886/v8PK0PdXVvfQ zt1tU05HQU3nzcvV72NVSEz/2s7Z/19URkVO28fExs7nVkc/S2/r4/dtaU9LV9/Ix83j91lD QUpr+2dXTEc/PUFl1c3V6/9vV1nbxLm5vsbTX0xP3svHydlzXUlFT9zMzNZ3W05AQlnjz87Y 5f9aVWfOxsnQY0o/OzxN3s3K0O//UUdX183HzO9jSz9EVenMzNT3YUxLZc7Cv8PR53dWWdrO ydFnU0g+QE//0snP42dTSEzlzMjJ02lPRUBL4c7LzudrTUFFTF3v5+tfV0xNb83Bvr/K3ldJ S1v/7/9tT0pAPUtl2c/N1ftbUVrTwry7vcnhY05l2c7IxtZ3V0hN79fNz9dvU0FASXfc2dnl b11ST9vEwcXK81hBOj5O59XV3W9SREdX3dvb42FNPz1Ea9fV0tl7W0xT18nCwcXM315VY9TK y9P/U0Q/QVXr2dned11RTV/b0c/Z72lVS05r1szO0edlTEdOd97d72FTTUhM38W/w8nW51VN Z9PJy9xvTUA6O0/v19ffX1dLRl/Hv7u+ydPvU1Nz0cfIz9zvVkpZ1cfL03dUSD5BY9zRz+1b V0lGV+HIx87rUkU7PEr709PeY1RJR07jzs3XY0xGP0Fc5c/R32NUSEpay767vMbN5W9j2sfD x9dXSD89RHvVytD3XU1CRVLVx8nN71tKRk3Xv7u9xtxzSkdX387R52dPRkNN/8rBwsrvVUhF U9jJx9D/S0M8PFHv1d1vWE1FRlHNvr7B0XtTTlHjyMTG1G9XUk3vxMDF0WFORD9DV9vKzdxf TUdFV87Gxs9fRT47O1DhzM3XaVlNS1nbxcXP41VJQ0JXz8TH02VKR0VL28S8vcXN3fdt98y/ wtdvS0M+P0/Xys3fV0pHRk3ey8XP719RTVNzw7q6vs13U0pFUt/X71NIQENEU9DDwtNvUUhC Rk7TyNHvU0A9PT5SzsjO91ZPTlr3zbq3wM5nT0pMWM7Cx99jTk9OU9m/vsxvUUxGRk3/x8Pb d1VPTlf/x73B900/PT1AWMa9x+dpYVtb986+vdllTklJS1rPwMV3TURDSFHpyrvC2etnX2dv 18DB6VlLRkdMX87Dy2dQS0xOVdzHweFRTUtRWWnMvL/R+1VOTUhL79z3SkVCRk1X3cfA111O S09SUufJ1WdMREZITWfHwMrrb2dn++PPvbzPd1lPT1NZ2cfRd1VLTE9Vb8i/zm9fXF9rd9nA wNLp/2X39+XJwMlfSEA/QkNR183hW1FPWWN33cbD3GVLSE1NWt3N019OS0xca9bIv8v/Z15n Y//fzNVvU01PV1/pzsnQb1JRV2Fv0szMe05JSEtVX9/MytdfV1ddVV3/3eVZVFlb8+PQy8XR b11bY3f/59/nZ0pER0xZbd3Oy93r79vRzsvGw833Z11bb3P/2dfnWlNbY2t33c/X92Fjb/vr 79jK1+tr99vX4evX611HQ0NDRUlXb2VPTlNf+//vzsjcb2Nnd29p99TW91dfb+n/d9PK029c YXdzV1V361pPU2Xn523dzdNrWmv33f/r287tVVVl7+1z/8/L3Ptvc3dVSlPv811c/9/a/+3W ydT3Z+fdc1lTd/9dSkpPVE1KWefa7+XTy8vZ1srAyd/j63dSSk5v4/9cZ21fSUhd59737eXb e1NV68zR2tPQz/Npa9/3VUpHSEY/Q1vv+2Nrb/dhUVPdzdbb293vX1j/0tDb3+Pta1VR3cnI 0dXZ61JHSGHrd29v82tdW+PJyM3R1dv/WWHpz9nj4/NvXFlf1MnZ5+ttTkVASmn/a+/j72db We/LzNvb3/dcUVPn2ev/Z1NKQkFV3tnf1dvd93fWx7/Hz9f/TkA/TO/b3+N3YVBHTf/n3+f3 ZVFGSFXTyMbGydb/XF3d0+t3XU5APT1M69PY3ftvU0ZLY9XO0NXrX01MWNXJys/db1NMTenC vb2/x85rT1Fv3t9nWE1GP0BS08PDy9j/XUxN+9XN3mddVEdJ98zExtLnWUQ8PEv/3+n3bVtR TV/MwcHJ33dbS0xe2czP22lTRDs+X9na3GtdU1Fb18G9wM73Y0o9QlPb0M3X+3dSUnfQxsTP 61pMSEf3y8jFzc7T82/by8PL42NLPzo6TO3My/NVTEdGW8/H1e9lX1dKTdnNyMXd3+1MTFvZ v7m7w91jXlvf2dXea05HPj5Lb9rMzdDvTTo6Tffb3f9PRENFZ83CvcHL419OVGdr5WtdW01G RErdx8TE229JQ0z3z8vI1mtLQ0BN79nU0WtOQ0NZ2crAwL/I3VFHTWvXy8vR51tMXdvJxMnZ Y05MW2vT0N/O0vdcSEbau8XI1UxOQjhET0tXYUlb7UdabdvDwsbdVzxPY8e/bVnjZUtVPT3N yr21z9drX2/OzdvJz+9bODc9UePOzVvT1udrRC4qLkqyrK++1uNMZ1tJW0vav6u0t71F3VdC PzU1OVJrzsZjX+fKurnM39nj42VGZ2NBY0xOSURANLSlo6VPKh8nSq+fn6Gq50YtJCQrLz69 u7S998+9v797Ni4xKzpvXbWwrq3H32NI1r/D1vdnP0g9KDlCM/tAMTUvOb+vublGOfdOv6+r qbC+SkUuLT9OvLzd1UZPzysuTbypt0ElHyy/p6Gfrba+OicfISnPtbOvvbm3sLe8xTkzKiIl KCtFva6qqK+tuGPN28O8yE9jOzlrSfPbR0A4NTp716+tt79vV9rPx7i/0c8yKyslLjUpO6ys qLkpHyYwtKu+q662sckvPWNXt9nnx8C1qKq0tV09MyMfHyQvO1NFT8zMvbKxr7DId0E0Li43 Su/XzdLr1c7Fua+vr7zbzse5ra6uq7HLOTAlKjM0Ql1va+M6KjFbycTeOkL397ywuba3vLvK UUppy7W62Uk4MzpP78XI5VM4LCYmLT9Ye//hy8fHyMS+vcnbb1Bf18q3tbzH61FVSkNZ59r7 ST49PUNj0cC+ztPVXkxHQWPN09tpRkVPd8q5vO1dT01RPjpV3MG/xc7Myb++vsf/92VOPjo+ U99nPTk8SePOzsTD0eljXV1b3b21t8vnc3fbz8e7vclrQDQyMzZK38jGyMzTSEy5REVZ3ExH PkdI3b+4v9VfUl5NPTXD0kRBPUhNd86tvM9lSnvrY8K5zsffUDld7V9GSMldT0hOR1w6OstX Y1tnVrC5wqy+wb9A20VKzvNDrrr33TlHudDOs0fbTzpBOz9fW9PaO1Tf12XG1XdIXThvQ0JX v66suEJETeXl0Ve2vmk9Ly8tP1PNusqvu82/1b7C2UNMNjRbSjU6LzPKuLOqrKi12zk/NTg+ S0vdwjxAQyMyRS3HxDbQybztNTpIvKWkuMq6srVvOiUutKaswCofJSw5u8a2oafGQC8rc9/V tbCno6WzyT4uLyonJSsqNjhGurW1uMrTy+PDtke+rFPMtEu7vjNfPi7vQS334TTD2tuptl3p Y7irt8g5MC4kZdH/PiwrQjkpMC/Koaauu1w+TzIvvLCmqNEz2N9JbSooTkg6LjrPprE7QsjG vuM5uKq+ubbPsco8u1QsJCI4sqtBNzX3u0Et86ygo+vHrcOtr8a96yUlLShZqK21UiEfISk9 rqmjn7NfUzQ0VVTVpaeur0I6STMqLzs+21kvRdK0smE3PETVu6+sqLRTNSMtPzVjuffpPic9 Wb3IzL24SiwpNLKqqKCpuEEnID08zq65sMpCQTIjNbfGvjQjNVVDyKupn6pNQDg221M1trK4 v0I9vb5bTzU7X0MvP1q+uMrCvr7Me2fExj7G2b+460TBsUozJifZRnvN0cFILWs9QLmyd6u6 SVYuQ+3de9NvRy8jNberr98uMTU7P/exoKS0UT0vLSQzU/+9tL2xu2dKw+97XTM7NTIyPWm4 va+pxazKzLGtv7lIVT05NztVyPM9LjtZvs2zqcTGTyzX0b+trMm4QycqKDmuvLezZV88KCxC 2bO4xLfDPlQuPnfX2b/X/+NXWNXHxrpcW1Q+PzcyP0pTz8LPwbK2t+/O619IKjEtPDdJN9E+ wttJ07zLvb3MwtHH3Xfvwm9d4zxLPkXnzs7n48Jady5j0//DT9rN71xXOvdP1uNj2etK48rG wWfIT1s//9O0ta69w3s9MTA7Y8Xd4c1GRT1Ib8bhzNRfTURFyL64v+NnXUFHZ8nIyndJRTc7 Vdq6t75vQzU5PkzczcjpRTw8PEhYW9Pd520+PjxJ0cy9vuO1zL67u7a5ws5fTzszOj08Vk9V Wj9DUsLMw85vzu9ZU+nfzcrTx8Ld17++vL3K0VtKPEdJ4+PX2W1va2XPxsHG0Fc+PC84Rltv zMvZ0UxKNk4+X07PydnHwbTHw8rt9088QEGws29V/9xZ/+/fzf/f4UlBMTpJTtR7181TST9b zW/AykvhTUdERj/Dy8Lpykb3Q01C2Gu9XD8+P8d7y8/LuMvtu97Vyr65tblVXEA6aUZv5Vvn QmtZxWXv0dpGv2vD58u0Z8M93Dj7P7r3usrf00dCRkLPY2nCTUw/Umfv41Hd/81PPldPZ/Pb S8s7Vjlv78i6wrzr50DnTNTfv9hf60fORlTFUbg/7zxRQP/UT7tpWUdEVzu6293G1sVJ2z7A wsfTslXWSVPXOsFOtFW5RWVMyEpGvUPISL49ylPO1+NYuFPN6d61xMZnwzfOTU/hvU7fa0Zc NVLrvt1H93dNWDXbTLBPUss+vkFXR8FJvl9bW0HMSV9Jx0TZQ2tXQ7ZPtD57N1NOMck4u8tJ WEhnSfdIs1fFT2/fU9w/ulnFv1F3PzrOd1e40XfRLkXfOtfA/8iuTVW6Pce+RLXEV8PrPbrH 97zIPcY2K807Z8Nb7/+8P//fQq/3VcRIU0g3xP/LzVlZ/1VI2M/Gw7pWRdFHTHvdU3dTZ2NZ PjdRacjr0ffN1kBtRP/VPk09PEVBy8HFusnR401PUs/K18xHSkJKW02+v76/TE7ZUstZzcrJ ZUhHOEVVZ8e640Vvt7XM2uPJtLXF4ffpz+dcVTo9ODo1Nj/P6dvOb+vF1sy7vca8XfNhSENr b2XjWVD3UF/Ku7i/yFNLMzQ5NlBDSkJGRUfr1Lu1uLy91sra38Bt49trRDgtPELvuMdfSTlB OVtJU19Fd0JGPz5Kvrqusq+ytru9r8G63TkzJSYiKiw4S0vZybuzq6ukp7CxyW9QQUhJ005A ODs/Ql/Kt7CvvN3Ma1U5RsO+a0UtLC41V+vVREQxP0lTR9HNwrq+u83Hu7GqoaSpqa+9y/9L OykjIR8fHyAiMTxU08m7wrOusauuusnKY1PfTV3vY/9tZ9PJy7+2sbzL6VVJSjtFSThIQko5 NzIzQOHLY1tAPkjOvLOtrbm4s6+pqaWqrLe72Vk/NDEuMCgoHx8gICcrNFFQzb+zrKekoZ+i qq66ytlr+0tTPzIuMjE3RG3NztDR2/vnztXNxl/VQT85OTU9Rk0+Ozo4SExvyry5ubq3vre5 t7GyucPT22tlV0E+NC8rKywpLi42PEdHV9fOvL23sq+ytbu2srS0sri8zOf3b2PcX2f7UUJH QD5JOT4/Pjw1OzlNTO/ey83LxMG8v7vAuMXdZ0pIS0tLWm9jV1lUX1dvZ97e/1VnWV/Ta8XJ 61lMS01YTE9fd29349/Z3eXb1NNdae/ZzdPHxr3Jz9Hn72NUSFhPRENHSFtZTuvl/2tlY2Nf S05ZWVhMWenb0dXMytvf+9Xj6effy8fV18/Kz8/XzMzfe/fn49Xz5dHdV1lcUVJISU1vTklO T2FnWl/33G9hY19eW01Za/dfZ+n382Xd0t3rXf//929z38/V4/vtb1hPSFl3Tk1MT09JR2Pz 3f/3d/NpTWndys3RzcjT1OfVzcrd891391tW5+HtZ+Vv61RMXWNjWFtYb29WY9/b2+Pf2WtL SVB36eXX3ON3d2vSzMzP2dvnX1Jd29vn9/dnXldf4dvc6d/l329v68/V43tdWUhGS1rr42tr a1dIR1Fp6+//42NJR01319TX0s7be13t0tXb6+vzX1Ra2c7K09LX7V9VXefZe2dVUUk/QlP/ 9+93b2dPTlnTxr/Cv8HV71nt3dPa3/d7WVhd59DT3+HvWk1JTv/7b2ttXV1SV+nZz93/ZVRB P0lV/+vf2d1zb+vMwMLGzNfnXVRj2dHj81lOSURLY29tb1lXWU5Z79PN1etVS0NBPdtzR7Zd SsxUxd9KubHv91gw105H1ufQxs9lb+P/z8TU19tXSEDj5dG8d72+XMPrTP9hW8/fO1ZCPthL X9VNXGdOSv/3c8a/Z7rAz7nAvthV50lIPUI5P1FG1mdVPUpP77vR3co741Jdurm9wrHnM08q MMI3vLs7tzAu60tPOq6/tLAzRD02z3exoq28OiwlK0A0v7dLtt5EvVPEws9pZ9c6zEQ1yELj t9+wVFa4SLq4TrnN/y7KtLqsVy0sJTytpqCgyTsqIjXF47i57bS/QkIvNNm1rLjVMSw5Pr6z ycvzV0lWV2+9s7KzUylbt7mvSywlHylZr6mpvywqHy1D17yqqrOtPDEvJ1e6sq3OPVM8XcZU uuFzx2lNQm9fsK+9Wiv/ubW0MykiJtyto6jDMigiOXu9rdXM3ry93s4+RcjDzcTtPNJBSesy YUhnuLPUzr93qqtJPr3Jq8YuKh8o0a6kqksrJyBE48S061NPxMzfZzNPxsK9VDdBPUp3S09K R1XazsfFuLy6wkKuvrWuQTwjJtOspqtfJSQjO7+/t1w1QNPKyvcuREpzwONfY07pyczlVVtM 48rBvbqs0zi5wqmv3dcpO821oK/TMicvP8u7bTw+aePNazpEPmPB381ZQlNAT1djy9dOSjbW uLZQu620p287KSrNq6OmzjMkI0f3vb9K6b3EvDwqKDjKsb5OLSg1T7e0xt9IO0RpzrFz/7HC qPc1SyzKtq6fuO8yKDZfu7rDS1NnzL3L30dHVU9HOC8yP9vCyrxIODgv07q+w6mzpbw0Lizr rKWfs0IoIytItKqxtldN5z/XzrSrtXcvJh8qNme6wLlMMyooUU7RrKSoskMpLT20rKu0NzUt LFrItL3NOV5N78Jrv77JyE00MC0wU0/CtPdWKyg+NkPbv6+ouzwmKE6tn5+r0zEsL1S3q6jT zUtLyWe2t6620Fc1Mi85RHe9vsE8KjEtPF/Gy6nJv0ErQzDCp62q3UEuK0S+sry467uxwLpv z8PNSz8uKi4rP2POustMOy8yOT/Hta7KPCgqLNy4prK50TNbWtumta2247C/v7rJzNlKRjor LykpOkHfykVILyxfPEzTOLew37RPO1g+r62ssU1NP++tv7y/17a/wsfJuMfZXT03MC4pNDJF 3mfeRzI2NGPI2bzTvbS0uFNMQE24sauyzG85b8K4ucxeVcK2r8xIOTNBOzM7LTEvN+Pd91M0 ODk6RUzr1+PIzq2qrb89PzjBqqqor8jlZ0lJQzrMz8HDZVFAPEpLQWc0R89IzGsvM2s381Y7 777VzK5luLDTqefHs8nHu7G1uMdGXHtX3chDOF00azo090FQa026O09MYc08TznERUfLSLJT sLZetEnzssSrZ6++vbZVuGO8VN86OdssSTYwQDIrSzlVPm0v4Uk6zDjaaz/Qv7G+vtq2Q7pG 3dDK4fu2V7J7xFW9QL9nZ1Q9wD3GNOc1a0JrRFVfQ8VX0EB720xvvtDHvM7O7enr0mfK07/I a8Xe48bV1XNtPd84zj/ZRVb3T2tvS+dPXE3pPctHX0xB/+PV40q3SbZKzEPIyT/LN8tU92Nd yG1La+FPwVW23Ne4XcNZwTrHP9BdRlRETUPvWm0740e/b0HjXMxbzMBKuN/FSMJvxMZKy/PV UsFDe9HtOXfZa99KsljEzO2/493r0NnATbdD0jbzPt3jPuVEtlq6P70/uTxT60zaQL1PxErn OOXlMtM0zlB3R0pZPnc32kvlTNFFxvdVxVddV10z3k3v69NjWsJP88lQxDjBO81X6/vnv1LR 5c02xDPPXnfJ77blvj67Qs89yfv3Wul3Yds6z+vYe+NXVdNYytzMP89MwMtBvsvKxMg3xzVb TXdLXVxpY0nEMME/xsZV6dm8T7dIv03AXUjRP85CwVK8y1LXVGn/XMftS8s9zd86Ous8vknb Ot4z7XM6wzPBTNtOO7pGs07SyEvOX+FOve/vSk/ZQWdjYbZvwkfnzVzMXc7Mukm+U0jbbT7r 1N3lQbVNvNPFb7mwQLvIWLlE0bs4yjRt3DbJO0fANs3LL9dGPb9TXE7jc3e8RrrOQq86ybU6 s01OtTy6SjxNX0tvbW/P20tLvzO+b0W/Qla+L0q/S17ASl3FVP+63cK9Sc7zOdQzPN49c2NF RldCXMdRWu9BY8ZFzVpZwdbVx03n2sXVvm+/xGvUSUvlzd3YysjfxUNC7We+usbjyj1XSEpS Rk9F607/0eu21b/Azc7rS+NlZdlFT0VMyHfF1eG728tMTUBXZ+v3QUU4Pz9TR19Nzr7Lv0M8 OmHEsa+94TQ2MkVOT1VFSOv7w7+5v77T1PNKPjU+Tnfze2dv7829sK+urrrIa0pvQ0VOQUM9 OD42VWtdys/N0ddXzsC/uL7L31NLb0rMa1/PU+NcTlVV23PRXktRQUZdzrvDwO9QSU3lwb29 xVM9MTdAU9fZzslcb1VZx8zH09XvTE9ITFrf385rX0E/P0nn1c/OX0tPPlpp3dzO1VdJRElL 42/f/1tJVUta1dvPxc/KzWfrd9O8v7+/3ttMTv/c2ettSFVDSu3nu72zvb7JY9N31evcW0RC Mz88a2H/505GPD40Tl931tnv70v737y4trbAxu1XXF3nzOfEZU9BP05h1VvRTV1HPz9AZ1zP a/NEPj4/U9nMzcne72/71b7DwMHZ/0pFQVnv88x371NFV0fp08rL2VpRQU//z8rIzuNcTk9Y 3czL3edbRkBLV+vGyMjR72dbb83Hxb3L2W9NR2ff38/vV0hBPkr/zsLGw9PfWVXj1cvO03tN Qz1FV//K3+9RRT47Q2fv39NZa0nfd8i/w8DnaUJERFPj18/e911KSVxzwcHJd0pHUvPT0V9L TEn/y7/Fzv9YS05dU1dN2cS3sri/50w+RFXl6+dJOz4+RlbMx8TGyNLP7e/fy8HIzfdpRUVH T3dv61BMQz86SG/ZzMrM3M9z59XHz97Wa1pRTV3PzcrVTUk8OVfjw7u/1+9vT1ffxcDD305D Qj9AU9labT85OTs7W8i/vc9jRUI/Ud++sbW4wM9aT09czNX/d1xET1ddxLy8zsnOT11OTM7P Y18/OTg/RtjHzNDj2tVj08S/urTMz9FrTc7F68BLM089MUJH4bvKT2dXSkhtU9fR21/HVVVn 5dfOVkc+ST9S6+PK00hV3Ur/1e3DytpO+2k/U0xjwMvpytte71nhu8C93VxDQU09aczj3mdX VW9N29PS11RKT0c+Rk7vbef//1vP7XfAxsbKTc7tUdH/zL7Oz9Fve2NTb8rz81tHQTxKU8m9 7+N3RU5BWdXNwcnJyu/jTE7NycjOWXdAO0dT18FvVFVDRjxSWO/VTUfzPHdbP7zP0MJFXc9E 3vff2j9VTl9v69u86+ndREJNQ/fAxczvRl9RW3fz389n3/vRVctjxbjAwMZRVUxO2MnBv+dh Y0lrTvNd7/NVZ01fTEpS51tr7+PczOPL29DOTkM+REhIbd3M2FdpUFfX98fAxMnj729T32vJ 2uPZVltWU+fRv87ca1JTVV3V2d9RPj89Q0JPTsvz5V9zQmdMY97Vy+9RWU7f3ci5zs1YVETZ ///A1+XdPVhARdFvv8/dXEBDRUfr3rzO2fdYTlRfVcfJysv/ymtvzcS6wdHvS05Qd93RzGtM TEhIS1dnY1dJT1dHV0hn5+Nf2W1n2fvZw9TOSk5dS1tr0s3Fd1PjTOlpRtJGY15D1f9rym/N 2FNX62fY3WnOVeFVR+NPb2Vf729JR0tS62/nxefH0+nOb1nnSN3vVtvr2tFPb2vR29v3zFVN VT7Rb1DP98nNXl1d///nZ8Npd+dNzNPNy83B3dRK2mNP3D3a52/PX7/KxdHYyEdVSU7LXNnn R2s8O11N81lMSkI/Q0hd0+XN52/GXNe907vve/9HUURzysTH52tDY0JMW2/K9//dRVlRb8rK ydx7b1xbb+XT0M5n0/ff3t3Ra8xpT3dMRVd7xtfJ69ldYXdK0NPpXndl2f/zzNfeUUNHd1fv d3fXUltRSGtTe8DOudnzd2HjU8vjxtlrW1tr8+PYz29UP0lPd+vPzs/KSttLV/890mf31UNj Xz9HREvcWdhZQWU8aV1j++v/c2d7bdHCvL7M9+ll/13329vJWFFvS2dX0+vS6Wd7UWtU5+PM ztDbydPr0NXR2tnU3Hfbb//a995lX0g9TUbP1tTXX1dMTEj/3e/PZ9lNZ0VjzdHMzuFOS0Nb c83O51NEPz1MVdDHx8rd72lPUv/rz8/O1llMRExf43v/b0tPUVvHv8fG+2djXWfZ18Hn71lN W1NVY9Tj2GNIQkJCVtfpzmNeTWP/58u+xr7b3/9LZ03Tyr6//19HR1d33czM129ITFZNz9Zv a2tX5U370N/B0f/TW1djd8jF299TWlNJQT9P89vf+0xJP1jhz2dPQlPd19/f2czJymNVSU9c /+NfW1VZSkxFSczMw83nZUZdd3fGy+POT1tZRmnv2dbO5fdHW2frwrzFwsvVTlNX7+Xpymtn Q0tP3MXf2Fd7XklHPUZv2e97UUlGS9nLw73O2l1OTmft0czN0Vv3TGdj38nO1ftfUE5TXsrP 119BQE5OWd/SxcXPUUk/XdDHusfXXU8+Pk1SxsrLSkVAO2X3a1/Vd/dTPkRU4cPN33da/15c /8/M22VTW09ATP/Evcbba2NbW/vQ0cvNZ2NGVG3rwtXV011RX1fby7y+0dhz90pTY9z30d/3 Szw+RtnPzednW0tHRe3Zy97XT0dDRm/Rv8bPe91LQU5P19vV309KQUNA38nIwtP3UUdO283Q b+ffV05HRHu/wr/Za1tDY+PAucLJWVtOTk1e59PH5d9IP0Bd2MZp329XTDo8X83Hy+ddY1xT 1MnAw9vZY09DTnfBvcbbb1BFSErXy77Gc0I7SkxYY9XG0dtYU1l717y7vM1rVlpXa/fRy19v QklCSPvWw9xDQ0lEXWVj3P/ZTEg/Qk3pzdXIxuNVSz9N58zBe0tPPlFPb9HFyMTrVVtr3b/E w99VWU9KQ2/Xw8jO41db7+fUyL3D209GP0XfztPZ5WtbVkZP48nP505NSD5Md9nZ62VfXVlM Zcy8vdVeTElh49fBw8bZVEpJS1tvXl/37WtRQUNLY9Tj71lNTV//zMfMvb+/20ld7ce+d09P V1lFRFTXx9ZVQ0dPUVtt/+f/41tGT2nXw8Pb7+1OTkNEW8/L2HdTSkhf987Mxcn3X1/fycDA zNvL129ORV/YwsPaZ1FPVd7b5+Xr0NdRPT5N99nW2d3lT0xW/83F1c9fSUBCXHfb1uP380tJ XVHW19zaW09FT3PZzMzR7+NaTk5DT9vnZ1JMRUNOX9fGzNX/911j/8q8ubrQ2efv7//rzthn SUZITlFNY9t7XVNJSUVQ39XO71Xv62ldd9zBx93/UldfaW//5+Xt/2FfX2nZx8v/+1FdaV/7 79XI/09PRuXP0c7P69pvVVFKW2fbzNtbWUth/3Pr69n3a2ddd+9v2vdTUU9PVVdt69/la1tb UWdjb/Pje2P/Z2/3593S2ePl73tz/2/n53tbUk9TX+ff3uvv6+Pv0dnPysXL13Nne+3n6dvf 7XdpXF1dZ2tvWVlYV2FXY2n/6ef/d2/v39/d3eP3X2NaW2l3/+//b+9v9+dvZ+/p5ettb//n /3Nrb3d3729nbf/Zzt3r+93naVtYd+ttW11dZ2tv8+/j82drYV9jZ//j/29nd3N37/Pb3/93 c3NrY2d77+dz93d7///73+H393trc/f/+/f/7f9tY2N77+/j6/fz9/v3997Z3e///29hZWv7 9/f7d/97d3d3/3d3a2tjX11n++/t9/9zb3dvd/Pv93tvb21v/+/r93f/////d3f37/f3d3t3 b3t3+/f/9/f3///38/f7/+/z/3t3//v/e3Nvd3d3d/////f7//97d///9///////////+/f3 /////////////////y8= --Where_No_One_Has_Gone_Before-- --Outermost_Trek-- ================================================ FILE: UnitTests/Net/Imap/Resources/common/namespace.txt ================================================ * NAMESPACE (("" "/")) (("Other Users/" "/" "TRANSLATION" ("Andere Ben&APw-tzer/"))) (("Public Folders/" "/" "TRANSLATION" ("Gemeinsame Postf&AM8-cher/"))) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/common/preauth-capability-greeting.txt ================================================ * PREAUTH [CAPABILITY IMAP4rev1] ================================================ FILE: UnitTests/Net/Imap/Resources/common/preauth-greeting.txt ================================================ * PREAUTH IMAP4rev1 server logged in as Smith ================================================ FILE: UnitTests/Net/Imap/Resources/common/select-inbox-annotate-no-modseq.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 8 EXISTS * 8 RECENT * OK [UNSEEN 1] First unseen. * OK [UIDVALIDITY 1436832084] UIDs valid * OK [UIDNEXT 9] Predicted next UID * OK [ANNOTATIONS 20480 NOPRIVATE] A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/common/select-inbox-annotate-none.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 8 EXISTS * 8 RECENT * OK [UNSEEN 1] First unseen. * OK [UIDVALIDITY 1436832084] UIDs valid * OK [UIDNEXT 9] Predicted next UID * OK [HIGHESTMODSEQ 2] Highest * OK [ANNOTATIONS NONE] A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/common/select-inbox-annotate-readonly.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 8 EXISTS * 8 RECENT * OK [UNSEEN 1] First unseen. * OK [UIDVALIDITY 1436832084] UIDs valid * OK [UIDNEXT 9] Predicted next UID * OK [HIGHESTMODSEQ 2] Highest * OK [ANNOTATIONS READ-ONLY] A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/common/select-inbox-annotate.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 8 EXISTS * 8 RECENT * OK [UNSEEN 1] First unseen. * OK [UIDVALIDITY 1436832084] UIDs valid * OK [UIDNEXT 9] Predicted next UID * OK [HIGHESTMODSEQ 2] Highest * OK [ANNOTATIONS 20480 NOPRIVATE] A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/common/select-inbox-no-modseq.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 8 EXISTS * 8 RECENT * OK [UNSEEN 1] First unseen. * OK [UIDVALIDITY 1436832084] UIDs valid * OK [UIDNEXT 9] Predicted next UID A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/common/select-inbox.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 8 EXISTS * 8 RECENT * OK [UNSEEN 1] First unseen. * OK [UIDVALIDITY 1436832084] UIDs valid * OK [UIDNEXT 9] Predicted next UID * OK [HIGHESTMODSEQ 2] Highest A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/common/setquota.txt ================================================ * QUOTA "" (MESSAGE 1107 1000000 STORAGE 3783 5242880) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/common/status-literal-folder.txt ================================================ * STATUS {19} Literal Folder Name (MESSAGES 60) A######## OK STATUS Completed ================================================ FILE: UnitTests/Net/Imap/Resources/courier/capability.txt ================================================ * CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION A######## OK CAPABILITY completed ================================================ FILE: UnitTests/Net/Imap/Resources/courier/greeting.txt ================================================ * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information. ================================================ FILE: UnitTests/Net/Imap/Resources/cyrus/authenticate.txt ================================================ A######## OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID LOGINDISABLED ACL RIGHTS=kxte QUOTA MAILBOX-REFERRALS NAMESPACE UIDPLUS NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND BINARY SORT SORT=MODSEQ THREAD=ORDEREDSUBJECT THREAD=REFERENCES ANNOTATEMORE CATENATE CONDSTORE SCAN IDLE LISTEXT LIST-SUBSCRIBED X-NETSCAPE URLAUTH] Success (no protection) ================================================ FILE: UnitTests/Net/Imap/Resources/cyrus/capability.txt ================================================ * CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID STARTTLS AUTH=PLAIN SASL-IR ACL RIGHTS=kxte QUOTA MAILBOX-REFERRALS NAMESPACE UIDPLUS NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND BINARY SORT SORT=MODSEQ THREAD=ORDEREDSUBJECT THREAD=REFERENCES ANNOTATEMORE CATENATE CONDSTORE SCAN IDLE LISTEXT LIST-SUBSCRIBED X-NETSCAPE URLAUTH A######## OK CAPABILITY completed ================================================ FILE: UnitTests/Net/Imap/Resources/cyrus/greeting.txt ================================================ * OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID STARTTLS AUTH=PLAIN SASL-IR] imap.ecs.soton.ac.uk Cyrus IMAP v2.3.13-Invoca-RPM-2.3.13-1.0.JKF server ready ================================================ FILE: UnitTests/Net/Imap/Resources/domino/capability.txt ================================================ * CAPABILITY IMAP4rev1 AUTH=PLAIN LITERAL+ NAMESPACE QUOTA UIDPLUS A######## OK CAPABILITY completed ================================================ FILE: UnitTests/Net/Imap/Resources/domino/fetch-extra-parens.txt ================================================ * 2 FETCH (UID 14935 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 4 FETCH (UID 14937 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 3 FETCH (UID 14936 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 1 FETCH (UID 14934 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 6 FETCH (UID 14939 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 5 FETCH (UID 14938 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 8 FETCH (UID 14941 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 7 FETCH (UID 14940 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 10 FETCH (UID 14943 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 9 FETCH (UID 14942 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 14 FETCH (UID 14947 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 13 FETCH (UID 14946 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 15 FETCH (UID 14948 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 11 FETCH (UID 14944 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 12 FETCH (UID 14945 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 17 FETCH (UID 14950 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 16 FETCH (UID 14949 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 19 FETCH (UID 14952 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 18 FETCH (UID 14951 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 20 FETCH (UID 14953 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 21 FETCH (UID 14954 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 24 FETCH (UID 14957 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 23 FETCH (UID 14956 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 22 FETCH (UID 14955 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 25 FETCH (UID 14958 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 26 FETCH (UID 14959 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 28 FETCH (UID 14961 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 27 FETCH (UID 14960 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) * 29 FETCH (UID 14962 (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0 NIL)) A######## OK FETCH completed ================================================ FILE: UnitTests/Net/Imap/Resources/domino/greeting.txt ================================================ * OK Domino IMAP4 Server Release 9.0.1FP9 ready Fri, 14 Dec 2018 08:38:25 +0100 ================================================ FILE: UnitTests/Net/Imap/Resources/domino/list-inbox.txt ================================================ * LIST (\Noinferiors \HasNoChildren) "\\" Inbox A######## OK LIST completed ================================================ FILE: UnitTests/Net/Imap/Resources/domino/namespace.txt ================================================ * NAMESPACE (("" "\\")) (("Other\\" "\\")) (("Shared\\" "\\")) A######## OK NAMESPACE completed ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/append.1.txt ================================================ A######## OK [APPENDUID 1436832084 1] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/append.2.txt ================================================ A######## OK [APPENDUID 1436832084 2] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/append.3.txt ================================================ A######## OK [APPENDUID 1436832084 3] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/append.4.txt ================================================ A######## OK [APPENDUID 1436832084 4] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/append.5.txt ================================================ A######## OK [APPENDUID 1436832084 5] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/append.6.txt ================================================ A######## OK [APPENDUID 1436832084 6] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/append.7.txt ================================================ A######## OK [APPENDUID 1436832084 7] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/append.8.txt ================================================ A######## OK [APPENDUID 1436832084 8] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/authenticate+annotate+replace.txt ================================================ A######## OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE ANNOTATE-EXPERIMENT-1 REPLACE] Logged in ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/authenticate+annotate.txt ================================================ A######## OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE ANNOTATE-EXPERIMENT-1] Logged in ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/authenticate+filters.txt ================================================ A######## OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE FILTERS] Logged in ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/authenticate+fuzzy.txt ================================================ A######## OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE SEARCH=FUZZY] Logged in ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/authenticate+gmail-capabilities.txt ================================================ A######## OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE X-GM-EXT-1] Logged in ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/authenticate+replace.txt ================================================ A######## OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE REPLACE] Logged in ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/authenticate+savedate.txt ================================================ A######## OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE SAVEDATE] Logged in ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/authenticate.txt ================================================ A######## OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE] Logged in ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/copy.txt ================================================ A######## OK [COPYUID 1436832101 1:7 1:7] Copy completed (0.020 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/enable-qresync.txt ================================================ * ENABLED QRESYNC CONDSTORE A######## OK Enabled (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/examine-folder.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS ()] Read-only mailbox. * 0 EXISTS * 0 RECENT * OK [UIDVALIDITY 1543354378] UIDs valid * OK [UIDNEXT 1] Predicted next UID * OK [HIGHESTMODSEQ 1] Highest A######## OK [READ-ONLY] Examine completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/expunge.txt ================================================ * VANISHED 1:14 * 0 RECENT A######## OK [HIGHESTMODSEQ 7] Expunge completed. ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/fetch1.txt ================================================ * 1 FETCH (UID 1 FLAGS (\Answered \Seen \Draft) MODSEQ (4) XAOL.SPAM.REASON 0 XAOL-MSGID 1 XAOL-PAREN-LIST (XAOL-TOKEN-PARAM1 XAOL-TOKEN-VALUE1 XAOL-TOKEN-PARAM2 {17} XAOL-TOKEN-VALUE2 XAOL-TOKEN-PARAM3 (XAOL-SUBTOKEN-PARAM XAOL-SUBTOKEN-VALUE))) * 2 FETCH (UID 2 FLAGS (\Answered \Seen \Draft) MODSEQ (4)) * 3 FETCH (UID 3 FLAGS (\Answered \Seen \Draft) MODSEQ (4)) * 4 FETCH (UID 4 FLAGS (\Seen \Draft) MODSEQ (3)) * 5 FETCH (UID 5 FLAGS (\Seen \Draft) MODSEQ (3)) * 6 FETCH (UID 6 FLAGS (\Seen \Draft) MODSEQ (3)) * 7 FETCH (UID 7 FLAGS (\Seen \Draft) MODSEQ (3)) A######## OK Fetch completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/fetch2.txt ================================================ * VANISHED (EARLIER) 8 * 1 FETCH (UID 1 FLAGS (\Answered \Seen \Draft) MODSEQ (4)) * 2 FETCH (UID 2 FLAGS (\Answered \Seen \Draft) MODSEQ (4)) * 3 FETCH (UID 3 FLAGS (\Answered \Seen \Draft) MODSEQ (4)) * 4 FETCH (UID 4 FLAGS (\Seen \Draft) MODSEQ (3)) * 5 FETCH (UID 5 FLAGS (\Seen \Draft) MODSEQ (3)) * 6 FETCH (UID 6 FLAGS (\Seen \Draft) MODSEQ (3)) * 7 FETCH (UID 7 FLAGS (\Seen \Draft) MODSEQ (3)) A######## OK Fetch completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/fetch3.txt ================================================ * 1 FETCH (UID 1 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:28:25 -0400" RFC822.SIZE 253 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:28:25 -0400" "A" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {2} ) * 2 FETCH (UID 2 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:29:25 -0400" RFC822.SIZE 282 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:29:25 -0400" "B" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {31} References: ) * 3 FETCH (UID 3 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:30:25 -0400" RFC822.SIZE 298 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:30:25 -0400" "C" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {47} References: ) * 4 FETCH (UID 4 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:31:25 -0400" RFC822.SIZE 282 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:31:25 -0400" "D" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {31} References: ) * 5 FETCH (UID 5 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:32:25 -0400" RFC822.SIZE 330 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:32:25 -0400" "E" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {79} References: ) * 6 FETCH (UID 6 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:33:25 -0400" RFC822.SIZE 282 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:33:25 -0400" "F" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {31} References: ) * 7 FETCH (UID 7 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:34:25 -0400" RFC822.SIZE 253 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:34:25 -0400" "G" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {2} ) * 8 FETCH (UID 8 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:28:25 -0400" RFC822.SIZE 253 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:28:25 -0400" "A" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {2} ) * 9 FETCH (UID 9 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:29:25 -0400" RFC822.SIZE 282 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:29:25 -0400" "B" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {31} References: ) * 10 FETCH (UID 10 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:30:25 -0400" RFC822.SIZE 298 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:30:25 -0400" "C" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {47} References: ) * 11 FETCH (UID 11 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:31:25 -0400" RFC822.SIZE 282 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:31:25 -0400" "D" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {31} References: ) * 12 FETCH (UID 12 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:32:25 -0400" RFC822.SIZE 330 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:32:25 -0400" "E" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {79} References: ) * 13 FETCH (UID 13 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:33:25 -0400" RFC822.SIZE 282 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:33:25 -0400" "F" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {31} References: ) * 14 FETCH (UID 14 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:34:25 -0400" RFC822.SIZE 253 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:34:25 -0400" "G" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES X-MAILER)] {2} ) A######## OK Fetch completed (0.019 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/fetch4.txt ================================================ * 1 FETCH (UID 1 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:28:25 -0400" RFC822.SIZE 253 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:28:25 -0400" "A" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {2} ) * 2 FETCH (UID 2 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:29:25 -0400" RFC822.SIZE 282 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:29:25 -0400" "B" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE (("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 1152 23)("TEXT" "PLAIN" ("CHARSET" "US-ASCII" "NAME" "cc.diff") "<960723163407.20117h@cac.washington.edu>" "Compiler diff" "BASE64" 4554 73) "MIXED") BODY[HEADER.FIELDS (REFERENCES)] {31} References: ) * 3 FETCH (UID 3 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:30:25 -0400" RFC822.SIZE 298 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:30:25 -0400" "C" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {47} References: ) * 4 FETCH (UID 4 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:31:25 -0400" RFC822.SIZE 282 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:31:25 -0400" "D" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {31} References: ) * 5 FETCH (UID 5 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:32:25 -0400" RFC822.SIZE 330 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:32:25 -0400" "E" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {79} References: ) * 6 FETCH (UID 6 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:33:25 -0400" RFC822.SIZE 282 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:33:25 -0400" "F" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {31} References: ) * 7 FETCH (UID 7 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:34:25 -0400" RFC822.SIZE 253 MODSEQ (2) ENVELOPE ("Sun, 02 Oct 2016 17:34:25 -0400" "G" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {2} ) * 8 FETCH (UID 8 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:28:25 -0400" RFC822.SIZE 253 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:28:25 -0400" "A" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {2} ) * 9 FETCH (UID 9 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:29:25 -0400" RFC822.SIZE 282 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:29:25 -0400" "B" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {31} References: ) * 10 FETCH (UID 10 FLAGS (\Answered \Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:30:25 -0400" RFC822.SIZE 298 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:30:25 -0400" "C" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {47} References: ) * 11 FETCH (UID 11 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:31:25 -0400" RFC822.SIZE 282 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:31:25 -0400" "D" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {31} References: ) * 12 FETCH (UID 12 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:32:25 -0400" RFC822.SIZE 330 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:32:25 -0400" "E" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {79} References: ) * 13 FETCH (UID 13 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:33:25 -0400" RFC822.SIZE 282 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:33:25 -0400" "F" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {31} References: ) * 14 FETCH (UID 14 FLAGS (\Seen \Draft \Recent) INTERNALDATE "02-Oct-2016 17:34:25 -0400" RFC822.SIZE 253 MODSEQ (3) ENVELOPE ("Sun, 02 Oct 2016 17:34:25 -0400" "G" (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) (("Unit Tests" NIL "unit-tests" "mimekit.net")) NIL NIL NIL "") BODYSTRUCTURE ("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 27 1 NIL NIL NIL NIL) BODY[HEADER.FIELDS (REFERENCES)] {2} ) A######## OK Fetch completed (0.019 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getbodypart.txt ================================================ * 1 FETCH (UID 1 BODY[] {253} From: Unit Tests Date: Sun, 02 Oct 2016 17:56:45 -0400 Subject: A Message-Id: To: Unit Tests MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 This is the message body. ) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getbodypart1.txt ================================================ * 2 FETCH (UID 2 BODY[1.MIME] {43} Content-Type: text/plain; charset=utf-8 BODY[1] {27} This is the message body. ) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getbodypartheaders.txt ================================================ * 2 FETCH (BODY[1.MIME] {43} Content-Type: text/plain; charset=utf-8 UID 2) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getmessageheaders.txt ================================================ * 1 FETCH (BODY[HEADER] {226} From: Unit Tests Date: Sun, 02 Oct 2016 17:56:45 -0400 Subject: A Message-Id: To: Unit Tests MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 UID 1) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getstream-section.txt ================================================ * 1 FETCH (UID 1 BODY[HEADER.FIELDS (MIME-VERSION CONTENT-TYPE)] {62} MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 ) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getstream-section2.txt ================================================ * 1 FETCH (UID 1 BODY[HEADER.FIELDS (MIME-VERSION CONTENT-TYPE)] {62} MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 ) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getstream.txt ================================================ * 1 FETCH (UID 1 BODY[]<128> {64} nit Tests MIME-Version: 1.0 Content-T) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getstream2.txt ================================================ * 1 FETCH (BODY[]<128> {64} nit Tests MIME-Version: 1.0 Content-T UID 1) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getstreams1.txt ================================================ * 1 FETCH (UID 1 BODY[] {68} This is some dummy text just to make sure this is working correctly.) * 2 FETCH (UID 2 BODY[] {68} This is some dummy text just to make sure this is working correctly.) * 3 FETCH (UID 3 BODY[] {68} This is some dummy text just to make sure this is working correctly.) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/getstreams2.txt ================================================ * 1 FETCH (BODY[] {68} This is some dummy text just to make sure this is working correctly. UID 1) * 2 FETCH (BODY[] {68} This is some dummy text just to make sure this is working correctly. UID 2) * 3 FETCH (BODY[] {68} This is some dummy text just to make sure this is working correctly. UID 3) A######## OK Fetch completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/greeting-preauth.txt ================================================ * PREAUTH [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE NOTIFY] Logged in as user ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/greeting.txt ================================================ * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5 AUTH=NTLM] Dovecot ready. ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/list-folder.txt ================================================ * LIST (\HasNoChildren) "." Folder A######## OK List completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/list-inbox.txt ================================================ * LIST (\HasNoChildren \Subscribed) "." INBOX A######## OK List completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/list-personal.txt ================================================ * LIST (\HasNoChildren) "." Archives * STATUS Archives (MESSAGES 0 RECENT 0 UIDNEXT 1 UIDVALIDITY 1436832059 UNSEEN 0 HIGHESTMODSEQ 1) * LIST (\HasNoChildren) "." Drafts * STATUS Drafts (MESSAGES 0 RECENT 0 UIDNEXT 1 UIDVALIDITY 1436832060 UNSEEN 0 HIGHESTMODSEQ 1) * LIST (\HasNoChildren) "." Junk * STATUS Junk (MESSAGES 0 RECENT 0 UIDNEXT 1 UIDVALIDITY 1436832061 UNSEEN 0 HIGHESTMODSEQ 1) * LIST (\HasNoChildren) "." "Sent Messages" * STATUS "Sent Messages" (MESSAGES 0 RECENT 0 UIDNEXT 1 UIDVALIDITY 1436832062 UNSEEN 0 HIGHESTMODSEQ 1) * LIST (\HasNoChildren) "." Trash * STATUS Trash (MESSAGES 0 RECENT 0 UIDNEXT 1 UIDVALIDITY 1436832063 UNSEEN 0 HIGHESTMODSEQ 1) * LIST (\HasNoChildren) "." INBOX * STATUS INBOX (MESSAGES 4 RECENT 0 UIDNEXT 5 UIDVALIDITY 1436832057 UNSEEN 0 HIGHESTMODSEQ 15) * LIST (\HasNoChildren) "." NIL * STATUS NIL (MESSAGES 0 RECENT 0 UIDNEXT 1 UIDVALIDITY 1436832057 UNSEEN 0 HIGHESTMODSEQ 1) A######## OK List completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/list-special-use.txt ================================================ * LIST (\Drafts \Subscribed) "." Drafts * LIST (\Junk \Subscribed) "." Junk * LIST (\Sent \Subscribed) "." "Sent Messages" * LIST (\Trash \Subscribed) "." Trash A######## OK List completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/list-unittests-destination.txt ================================================ * LIST (\HasNoChildren) "." UnitTests.Destination A######## OK List completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/list-unittests-messages.txt ================================================ * LIST (\HasNoChildren) "." UnitTests.Messages A######## OK List completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/list-unittests.txt ================================================ * LIST (\HasNoChildren) "." UnitTests A######## OK List completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/move.txt ================================================ * OK [COPYUID 1436832101 1:7 8:14] Moved UIDs. * VANISHED 1:7 A######## OK [HIGHESTMODSEQ 7] Move completed (0.013 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/multiappend.txt ================================================ A######## OK [APPENDUID 1436832084 1:8] Append completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/namespace.txt ================================================ * NAMESPACE (("" ".")) NIL NIL A######## OK Namespace completed. ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/noop+alert.txt ================================================ * OK [ALERT] System shutdown in 10 minutes A######## OK NOOP complete. ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/notify-idle-done.txt ================================================ A######## OK Idle completed (0.001 + 5.433 + 5.433 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/notify-idle.txt ================================================ + idling * STATUS INBOX (MESSAGES 3 UIDNEXT 4 UNSEEN 3 HIGHESTMODSEQ 3) * LIST (\HasNoChildren) "." NewFolder * LIST (\NonExistent) "." DeleteMe * LIST (\HasNoChildren) "." RenamedFolder ("OLDNAME" ("RenameMe")) * LIST (\HasNoChildren) "." UnsubscribeMe * LIST (\HasNoChildren \Subscribed) "." SubscribeMe * METADATA "" (/private/comment "this is a comment") * METADATA INBOX (/private/comment "this is a comment") * 1 EXISTS * 1 RECENT * 1 FETCH (UID 1 FLAGS (\Recent) ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" "IMAP4rev1 WG mtg summary and minutes" (("Terry Gray" NIL "gray" "cac.washington.edu")) (("Terry Gray" NIL "gray" "cac.washington.edu")) (("Terry Gray" NIL "gray" "cac.washington.edu")) ((NIL NIL "imap" "cac.washington.edu")) ((NIL NIL "minutes" "CNRI.Reston.VA.US") ("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL "") BODYSTRUCTURE ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028 92) MODSEQ (1)) ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/notify-list-personal.txt ================================================ * LIST (\HasNoChildren) "." Archives * LIST (\HasNoChildren) "." Drafts * LIST (\HasNoChildren) "." Junk * LIST (\HasNoChildren) "." "Sent Messages" * LIST (\HasNoChildren) "." Trash * LIST (\HasNoChildren) "." INBOX * LIST (\HasChildren) "." Folder * LIST (\HasNoChildren) "." DeleteMe * LIST (\HasNoChildren) "." RenameMe * LIST (\HasNoChildren) "." SubscribeMe * LIST (\HasNoChildren \Subscribed) "." UnsubscribeMe A######## OK List completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/notify.txt ================================================ * STATUS INBOX (MESSAGES 1 UIDNEXT 2 UIDVALIDITY 1543354379 UNSEEN 1) A######## OK NOTIFY completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/optimized-search.txt ================================================ * ESEARCH (TAG "A########") UID ALL 1:7 A######## OK Search completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/search-all.txt ================================================ * ESEARCH (TAG "A########") UID ALL 1:14 A######## OK Search completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/search-changed-since.txt ================================================ * ESEARCH (TAG "A########") UID MIN 1 MAX 7 ALL 1:7 COUNT 7 MODSEQ 4 RELEVANCY (11 22 33 44 55 66 77) A######## OK Search completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/search-raw.txt ================================================ * SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 (MODSEQ 12345678) A######## OK Search completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/search-uids-options.txt ================================================ * ESEARCH (TAG "A########") UID MIN 2 MAX 13 ALL 2:6,9:13 COUNT 10 RELEVANCY (2 3 4 5 6 9 10 11 12 13) A######## OK Search completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/search-uids.txt ================================================ * ESEARCH (TAG "A########") UID ALL 1:14 A######## OK Search completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/select-unittests-destination.txt ================================================ * OK [CLOSED] Previous mailbox closed. * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 14 EXISTS * 14 RECENT * OK [UIDVALIDITY 1436832128] UIDs valid * OK [UIDNEXT 15] Predicted next UID * OK [HIGHESTMODSEQ 3] Highest A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/select-unittests-messages-qresync.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 7 EXISTS * 0 RECENT * OK [UIDVALIDITY 1436832084] UIDs valid * OK [UIDNEXT 9] Predicted next UID * OK [HIGHESTMODSEQ 6] Highest * VANISHED (EARLIER) 8 * 1 FETCH (UID 1 FLAGS (\Answered \Seen \Draft) MODSEQ (4)) * 2 FETCH (UID 2 FLAGS (\Answered \Seen \Draft) MODSEQ (4)) * 3 FETCH (UID 3 FLAGS (\Answered \Seen \Draft) MODSEQ (4)) * 4 FETCH (UID 4 FLAGS (\Seen \Draft) MODSEQ (3)) * 5 FETCH (UID 5 FLAGS (\Seen \Draft) MODSEQ (3)) * 6 FETCH (UID 6 FLAGS (\Seen \Draft) MODSEQ (3)) * 7 FETCH (UID 7 FLAGS (\Seen \Draft) MODSEQ (3)) A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/select-unittests-messages.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 8 EXISTS * 8 RECENT * OK [UNSEEN 1] First unseen. * OK [UIDVALIDITY 1436832084] UIDs valid * OK [UIDNEXT 9] Predicted next UID * OK [HIGHESTMODSEQ 2] Highest A######## OK [READ-WRITE] Select completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/setflags-unchangedsince.txt ================================================ * 1 FETCH (UID 1 MODSEQ (6)) * 2 FETCH (UID 2 MODSEQ (6)) * 3 FETCH (UID 3 MODSEQ (6)) * 4 FETCH (UID 4 MODSEQ (6)) * 5 FETCH (UID 5 MODSEQ (6)) * 6 FETCH (UID 6 MODSEQ (6)) * 7 FETCH (UID 7 MODSEQ (6)) A######## OK [MODIFIED 7,9] Store completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/sort-by-date.txt ================================================ * ESEARCH (TAG "A########") UID ALL 7,14,6,13,5,12,4,11,3,10,2,9,1,8 A######## OK Sort completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/sort-by-strings.txt ================================================ * ESEARCH (TAG "A########") UID ALL 1:14 A######## OK Sort completed (0.002 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/sort-raw.txt ================================================ * SORT 7 14 6 13 5 12 4 11 3 10 2 9 1 8 A######## OK Sort completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/sort-reverse-arrival.txt ================================================ * ESEARCH (TAG "A########") UID MIN 7 MAX 1 ALL 7,6,5,4,3,2,1 COUNT 7 RELEVANCY (7 6 5 4 3 2 1) A######## OK Sort completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/sort-uids-options.txt ================================================ * ESEARCH (TAG "A########") UID MIN 1 MAX 14 ALL 1:14 COUNT 14 RELEVANCY (1 2 3 4 5 6 7 8 9 10 11 12 13 14) A######## OK Sort completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/status-unittests-destination.txt ================================================ * STATUS UnitTests.Destination (MESSAGES 14 RECENT 14 UIDNEXT 15 UIDVALIDITY 1436832101 UNSEEN 0 HIGHESTMODSEQ 3) A######## OK Status completed (0.000 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/store-answered.txt ================================================ * 1 FETCH (UID 1 MODSEQ (4)) * 2 FETCH (UID 2 MODSEQ (4)) * 3 FETCH (UID 3 MODSEQ (4)) A######## OK Store completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/store-deleted-custom.txt ================================================ * FLAGS (\Answered \Flagged \Deleted \Seen \Draft $MailKit) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft $MailKit \*)] Flags permitted. * 1 FETCH (UID 1 MODSEQ (5)) * 2 FETCH (UID 2 MODSEQ (5)) * 3 FETCH (UID 3 MODSEQ (5)) * 4 FETCH (UID 4 MODSEQ (5)) * 5 FETCH (UID 5 MODSEQ (5)) * 6 FETCH (UID 6 MODSEQ (5)) * 7 FETCH (UID 7 MODSEQ (5)) * 8 FETCH (UID 8 MODSEQ (5)) * 9 FETCH (UID 9 MODSEQ (5)) * 10 FETCH (UID 10 MODSEQ (5)) * 11 FETCH (UID 11 MODSEQ (5)) * 12 FETCH (UID 12 MODSEQ (5)) * 13 FETCH (UID 13 MODSEQ (5)) * 14 FETCH (UID 14 MODSEQ (5)) A######## OK [MODIFIED 7,9] Store completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/store-deleted.txt ================================================ * 8 FETCH (UID 8 MODSEQ (5)) A######## OK Store completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/store-seen.txt ================================================ * 1 FETCH (UID 1 MODSEQ (3)) * 2 FETCH (UID 2 MODSEQ (3)) * 3 FETCH (UID 3 MODSEQ (3)) * 4 FETCH (UID 4 MODSEQ (3)) * 5 FETCH (UID 5 MODSEQ (3)) * 6 FETCH (UID 6 MODSEQ (3)) * 7 FETCH (UID 7 MODSEQ (3)) * 8 FETCH (UID 8 MODSEQ (3)) A######## OK Store completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/thread-orderedsubject.txt ================================================ * THREAD (1)(2)(3)(4)(5)(6)(7) A######## OK Thread completed (0.010 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/thread-references.txt ================================================ * THREAD (1 (2 (3 5)(6))(4))(7) A######## OK Thread completed (0.014 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/dovecot/uid-expunge.txt ================================================ * VANISHED 8 * 7 RECENT A######## OK [HIGHESTMODSEQ 6] Expunge completed (0.001 + 0.000 secs). ================================================ FILE: UnitTests/Net/Imap/Resources/exchange/capability-postauth.txt ================================================ * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS MOVE ID UNSELECT CLIENTACCESSRULES CLIENTNETWORKPRESENCELOCATION BACKENDAUTHENTICATE CHILDREN IDLE NAMESPACE LITERAL+ A######## OK CAPABILITY completed. ================================================ FILE: UnitTests/Net/Imap/Resources/exchange/capability-preauth.txt ================================================ * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+ A######## OK CAPABILITY completed. ================================================ FILE: UnitTests/Net/Imap/Resources/exchange/greeting-2003.txt ================================================ * OK Microsoft Exchange Server 2003 IMAP4rev1 server version (6.5.7638.1) ready ================================================ FILE: UnitTests/Net/Imap/Resources/exchange/greeting-2007.txt ================================================ * OK Microsoft Exchange Server 2007 IMAP4 service is ready ================================================ FILE: UnitTests/Net/Imap/Resources/exchange/greeting.txt ================================================ * OK The Microsoft Exchange IMAP4 service is ready. [TQBXAEgAUABSADIAMQBDAEEAMAAwADYAMAAuAG4AYQBtAHAAcgBkADIAMQAuAHAAcgBvAGQALgBvAHUAdABsAG8AbwBrAC4AYwBvAG0A] ================================================ FILE: UnitTests/Net/Imap/Resources/exchange/issue115.txt ================================================ [COPYUID 55 31 6] * 1 EXPUNGE * 0 EXISTS A######## OK MOVE completed. ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/add-flags.txt ================================================ * 1 EXPUNGE * 1 EXPUNGE * 1 EXPUNGE * 2 EXPUNGE * 3 EXPUNGE * 3 EXPUNGE * 3 EXPUNGE * 4 EXPUNGE * 4 EXPUNGE * 4 EXPUNGE * 4 EXPUNGE * 15 EXPUNGE * 15 EXPUNGE * 15 EXPUNGE * 15 EXPUNGE * 16 EXPUNGE * 18 EXPUNGE * 24 EXPUNGE * 24 EXPUNGE * 24 EXPUNGE * 30 EXPUNGE * 29 EXISTS A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/add-labels.txt ================================================ * 1 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 1) * 2 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 2) * 3 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 3) * 5 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 5) * 7 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 7) * 8 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 8) * 9 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 9) * 11 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 11) * 12 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 12) * 13 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 13) * 14 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 14) * 26 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 26) * 27 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 27) * 28 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 28) * 29 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 29) * 31 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 31) * 34 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 34) * 41 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 41) * 42 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 42) * 43 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 43) * 50 FETCH (X-GM-LABELS (\Important "Custom Label" NIL) UID 50) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.1.txt ================================================ * 1 EXISTS A######## OK [APPENDUID 23 1] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.10.txt ================================================ * 10 EXISTS A######## OK [APPENDUID 23 10] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.11.txt ================================================ * 11 EXISTS A######## OK [APPENDUID 23 11] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.12.txt ================================================ * 12 EXISTS A######## OK [APPENDUID 23 12] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.13.txt ================================================ * 13 EXISTS A######## OK [APPENDUID 23 13] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.14.txt ================================================ * 14 EXISTS A######## OK [APPENDUID 23 14] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.15.txt ================================================ * 15 EXISTS A######## OK [APPENDUID 23 15] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.16.txt ================================================ * 16 EXISTS A######## OK [APPENDUID 23 16] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.17.txt ================================================ * 17 EXISTS A######## OK [APPENDUID 23 17] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.18.txt ================================================ * 18 EXISTS A######## OK [APPENDUID 23 18] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.19.txt ================================================ * 19 EXISTS A######## OK [APPENDUID 23 19] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.2.txt ================================================ * 2 EXISTS A######## OK [APPENDUID 23 2] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.20.txt ================================================ * 20 EXISTS A######## OK [APPENDUID 23 20] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.21.txt ================================================ * 21 EXISTS A######## OK [APPENDUID 23 21] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.22.txt ================================================ * 22 EXISTS A######## OK [APPENDUID 23 22] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.23.txt ================================================ * 23 EXISTS A######## OK [APPENDUID 23 23] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.24.txt ================================================ * 24 EXISTS A######## OK [APPENDUID 23 24] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.25.txt ================================================ * 25 EXISTS A######## OK [APPENDUID 23 25] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.26.txt ================================================ * 26 EXISTS A######## OK [APPENDUID 23 26] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.27.txt ================================================ * 27 EXISTS A######## OK [APPENDUID 23 27] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.28.txt ================================================ * 28 EXISTS A######## OK [APPENDUID 23 28] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.29.txt ================================================ * 29 EXISTS A######## OK [APPENDUID 23 29] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.3.txt ================================================ * 3 EXISTS A######## OK [APPENDUID 23 3] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.30.txt ================================================ * 30 EXISTS A######## OK [APPENDUID 23 30] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.31.txt ================================================ * 31 EXISTS A######## OK [APPENDUID 23 31] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.32.txt ================================================ * 32 EXISTS A######## OK [APPENDUID 23 32] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.33.txt ================================================ * 33 EXISTS A######## OK [APPENDUID 23 33] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.34.txt ================================================ * 34 EXISTS A######## OK [APPENDUID 23 34] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.35.txt ================================================ * 35 EXISTS A######## OK [APPENDUID 23 35] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.36.txt ================================================ * 36 EXISTS A######## OK [APPENDUID 23 36] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.37.txt ================================================ * 37 EXISTS A######## OK [APPENDUID 23 37] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.38.txt ================================================ * 38 EXISTS A######## OK [APPENDUID 23 38] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.39.txt ================================================ * 39 EXISTS A######## OK [APPENDUID 23 39] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.4.txt ================================================ * 4 EXISTS A######## OK [APPENDUID 23 4] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.40.txt ================================================ * 40 EXISTS A######## OK [APPENDUID 23 40] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.41.txt ================================================ * 41 EXISTS A######## OK [APPENDUID 23 41] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.42.txt ================================================ * 42 EXISTS A######## OK [APPENDUID 23 42] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.43.txt ================================================ * 43 EXISTS A######## OK [APPENDUID 23 43] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.44.txt ================================================ * 44 EXISTS A######## OK [APPENDUID 23 44] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.45.txt ================================================ * 45 EXISTS A######## OK [APPENDUID 23 45] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.46.txt ================================================ * 46 EXISTS A######## OK [APPENDUID 23 46] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.47.txt ================================================ * 47 EXISTS A######## OK [APPENDUID 23 47] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.48.txt ================================================ * 48 EXISTS A######## OK [APPENDUID 23 48] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.49.txt ================================================ * 49 EXISTS A######## OK [APPENDUID 23 49] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.5.txt ================================================ * 5 EXISTS A######## OK [APPENDUID 23 5] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.50.txt ================================================ * 50 EXISTS A######## OK [APPENDUID 23 50] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.6.txt ================================================ * 6 EXISTS A######## OK [APPENDUID 23 6] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.7.txt ================================================ * 7 EXISTS A######## OK [APPENDUID 23 7] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.8.txt ================================================ * 8 EXISTS A######## OK [APPENDUID 23 8] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/append.9.txt ================================================ * 9 EXISTS A######## OK [APPENDUID 23 9] (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/authenticate+annotate.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- APPENDLIMIT=35651584 ANNOTATE-EXPERIMENT-1 A######## OK username authenticated (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/authenticate+create-special-use.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CREATE-SPECIAL-USE CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- APPENDLIMIT=35651584 OBJECTID A######## OK username authenticated (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/authenticate+preview.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- APPENDLIMIT=35651584 PREVIEW A######## OK username authenticated (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/authenticate+savedate.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- APPENDLIMIT=35651584 SAVEDATE A######## OK username authenticated (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/authenticate+statussize+objectid.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- APPENDLIMIT=35651584 STATUS=SIZE OBJECTID A######## OK username authenticated (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/authenticate+webalert.txt ================================================ * NO [WEBALERT https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbsNd6RU3LIlgDfhmL9Y7ywYhtagFig_xfuSJCUHD9Eg3XqN8DKlDk3G8jmj2w5viIm5PDC3BS4SVy7iFMB6g1244cnQt1E60EdOTSEpnqDzL6FH2L-ReOAyZ3qkSXZQZs2pIfL2] Web login required. A######## NO [ALERT] Please log in via your web browser: https://support.google.com/mail/accounts/answer/78754 (Failure) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/authenticate-no-appendlimit-value.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- APPENDLIMIT STATUS=SIZE A######## OK username authenticated (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/authenticate.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- APPENDLIMIT=35651584 A######## OK username authenticated (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/capability+login.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=LOGIN AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH A######## OK Thats all she wrote! n55mb83651539qtb ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/capability+logindisabled.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR LOGINDISABLED AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH A######## OK Thats all she wrote! n55mb83651539qtb ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/capability.txt ================================================ * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH A######## OK Thats all she wrote! n55mb83651539qtb ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/count-explicit.noop.txt ================================================ * 1 EXPUNGE * 1 EXISTS A######## OK NOOP completed ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/count-implicit.noop.txt ================================================ * 1 EXPUNGE A######## OK NOOP completed ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/count.examine.txt ================================================ * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $Phishing $NotPhishing) * OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen $Phishing $NotPhishing \*)] Flags permitted. * OK [UIDVALIDITY 26] UIDs valid. * 1 EXISTS * 0 RECENT * OK [UIDNEXT 2] Predicted next UID. * OK [HIGHESTMODSEQ 29225] A######## OK [READ-WRITE] Inbox selected. (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/create-mailboxid.txt ================================================ A######## OK [MAILBOXID (25dcfa84-fd65-41c3-abc3-633c8f10923f)] Thats all she wrote! n55mb83651539qtb ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/examine-inbox.txt ================================================ * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $Phishing $NotPhishing) * OK [PERMANENTFLAGS ()] Flags permitted. * OK [UIDVALIDITY 637172988] UIDs valid. * 270 EXISTS * 0 RECENT * OK [UIDNEXT 280] Predicted next UID. * OK [HIGHESTMODSEQ 35312] A######## OK [READ-ONLY] INBOX selected. (Success) ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/expunge-during-fetch.txt ================================================ * 1 FETCH (UID 1 INTERNALDATE "19-Jul-2019 06:00:17 +0000" ENVELOPE ("Fri, 19 Jul 2019 06:00:17 +0000" "subject 1" (("From" NIL "from" "example.com")) NIL NIL ((NIL NIL "to" "example.com")) NIL NIL "in-reply-to@localhost.localdomain" "")) * 2 FETCH (UID 2 INTERNALDATE "19-Jul-2019 06:00:17 +0000" ENVELOPE ("Fri, 19 Jul 2019 06:00:17 +0000" "subject 2" (("From" NIL "from" "example.com")) NIL NIL ((NIL NIL "to" "example.com")) NIL NIL "in-reply-to@localhost.localdomain" "")) * 3 FETCH (UID 3 INTERNALDATE "19-Jul-2019 06:00:17 +0000" ENVELOPE ("Fri, 19 Jul 2019 06:00:17 +0000" "subject 3" (("From" NIL "from" "example.com")) NIL NIL ((NIL NIL "to" "example.com")) NIL NIL "in-reply-to@localhost.localdomain" "")) * 4 FETCH (UID 4 INTERNALDATE "19-Jul-2019 06:00:17 +0000" ENVELOPE ("Fri, 19 Jul 2019 06:00:17 +0000" "subject 4" (("From" NIL "from" "example.com")) NIL NIL ((NIL NIL "to" "example.com")) NIL NIL "in-reply-to@localhost.localdomain" "")) * 5 FETCH (UID 5 INTERNALDATE "19-Jul-2019 06:00:17 +0000" ENVELOPE ("Fri, 19 Jul 2019 06:00:17 +0000" "subject 5" (("From" NIL "from" "example.com")) NIL NIL ((NIL NIL "to" "example.com")) NIL NIL "in-reply-to@localhost.localdomain" "")) * 2 EXPUNGE * 5 EXPUNGE * 4 EXISTS A######## OK FETCH completed. ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/expunge.txt ================================================ * 1 EXPUNGE * 1 EXPUNGE * 1 EXPUNGE * 18 EXISTS A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-all-headers.txt ================================================ * 1 FETCH (UID 1 FLAGS (\Seen) BODY[HEADER] {275} Date: Thu, 03 Mar 2016 12:25:01 -0500 Subject: text/plain message From: "Example From" Reply-To: "Example Reply-To" To: "Example To" Message-Id: <2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local> ) * 2 FETCH (UID 2 FLAGS (\Seen) BODY[HEADER] {275} Date: Thu, 03 Mar 2016 12:25:01 -0500 Subject: text/plain message From: "Example From" Reply-To: "Example Reply-To" To: "Example To" Message-Id: <2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local> ) * 3 FETCH (UID 3 FLAGS (\Seen) BODY[HEADER] {275} Date: Thu, 03 Mar 2016 12:25:01 -0500 Subject: text/plain message From: "Example From" Reply-To: "Example Reply-To" To: "Example To" Message-Id: <2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local> ) * 4 FETCH (UID 4 FLAGS (\Seen) BODY[HEADER] {275} Date: Thu, 03 Mar 2016 12:25:01 -0500 Subject: text/plain message From: "Example From" Reply-To: "Example Reply-To" To: "Example To" Message-Id: <2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local> ) * 5 FETCH (UID 5 FLAGS (\Seen) BODY[HEADER] {275} Date: Thu, 03 Mar 2016 12:25:01 -0500 Subject: text/plain message From: "Example From" Reply-To: "Example Reply-To" To: "Example To" Message-Id: <2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local> ) * 6 FETCH (UID 6 FLAGS (\Seen) BODY[HEADER] {275} Date: Thu, 03 Mar 2016 12:25:01 -0500 Subject: text/plain message From: "Example From" Reply-To: "Example Reply-To" To: "Example To" Message-Id: <2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local> ) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-invalid-headers.txt ================================================ * 1 FETCH (UID 1 FLAGS (\Seen) BODY[HEADER] {27} !@&^*$(*&E WOIFDUJS Fu87#$*) * 2 FETCH (UID 2 FLAGS (\Seen) BODY[HEADER] {27} !@&^*$(*&E WOIFDUJS Fu87#$*) * 3 FETCH (UID 3 FLAGS (\Seen) BODY[HEADER] {27} !@&^*$(*&E WOIFDUJS Fu87#$*) * 4 FETCH (UID 4 FLAGS (\Seen) BODY[HEADER] {27} !@&^*$(*&E WOIFDUJS Fu87#$*) * 5 FETCH (UID 5 FLAGS (\Seen) BODY[HEADER] {27} !@&^*$(*&E WOIFDUJS Fu87#$*) * 6 FETCH (UID 6 FLAGS (\Seen) BODY[HEADER] {27} !@&^*$(*&E WOIFDUJS Fu87#$*) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-korean-previewtext-bodystructure.txt ================================================ * 1 FETCH (UID 1 BODYSTRUCTURE ("TEXT" "PLAIN" ("CHARSET" "ks_c_5601-1987") NIL NIL "BASE64" 1896 25 NIL NIL NIL)) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-korean-previewtext-peek-text-only.txt ================================================ * 1 FETCH (UID 1 BODY[TEXT]<0> {512} vK2x4iAyNTCz4rDmILDtutAgvcO067ChIL3DwNu1x7jpvK0gsO260MDMtvOw7SC60riutMIgsMW0 68fRILmrtP3AzCCwx7yztcggsM3AuiC6uLTZIMH9vuDA+8DOILPzvvew+iDDtrHiILHivPrAxyC1 tcDUv6EgyPvA1L7uILCtt8LH0SDA/LvnIL+kuK7GrsDHIMPix/bAuyCzqsW4s8C0z7TZLiDAz7q7 wLogw7aw+iCx4sW4ILmwx7DAxyCw+LHewLsgyK66uMfPseIgwKfH2CCzssfRwMcgv6y+yCDB9rno IMH9tNyw+iDB/cHfwPvAziDBosPLwLsgufrAzLjpvK0gwd+xub+hILvnvcXAuyDGxLDfx8+46byt ILTrt/ogurvF5L/NwMcgwaLDy8DMIMH1sKHH373AtM+02SgyMzgsIDI0MywgMjQ3KS4gNLy8seIg tb++yCDB9rzTtcggx9G53bW1wMcgx9GxuSC8vLfCsPrA) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-nil-bodystructure.txt ================================================ * 1 FETCH (UID 1 BODYSTRUCTURE (("TEXT" "PLAIN" ("CHARSET" "utf-8") NIL NIL "7BIT" 5235 112 NIL NIL NIL)("TEXT" "HTML" ("CHARSET" "utf-8") NIL NIL "7BIT" 60479 873 NIL NIL NIL) "ALTERNATIVE")) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-nil.txt ================================================ * 3 FETCH (UID 1 BODY[1.TEXT]<0> NIL) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-objectid.txt ================================================ * 1 FETCH (UID 1 EMAILID (M6d99ac3275bb4e) THREADID (T64b478a75b7ea9)) * 2 FETCH (UID 2 EMAILID (M288836c4c7a762) THREADID (T64b478a75b7ea9)) * 3 FETCH (UID 3 EMAILID (M5fdc09b49ea703) THREADID (T11863d02dd95b5)) * 4 FETCH (UID 4 EMAILID (M4fdc09b49ea629) THREADID NIL) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-preview.txt ================================================ * 1 FETCH (UID 1 RFC822.SIZE 507 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:25:01 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:25:01 -0500" "text/plain message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local>") PREVIEW "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver") * 2 FETCH (UID 2 RFC822.SIZE 506 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:48:38 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:46:38 -0500" "text/html message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "") PREVIEW "Don't miss our celebrity guest Monday evening") * 3 FETCH (UID 3 RFC822.SIZE 507 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:49:29 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:47:29 -0500" "multipart/alternative message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<014Y2P3ZKXT4.TMD6XILA8I5N2@Jeffrey-Stedfasts-2013-iMac.local>") PREVIEW "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver") * 4 FETCH (UID 4 RFC822.SIZE 507 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:25:01 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:50:01 -0500" "text/plain message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local>") PREVIEW "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver") * 5 FETCH (UID 5 RFC822.SIZE 506 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:48:38 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:51:38 -0500" "text/html message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "") PREVIEW "Don't miss our celebrity guest Monday evening") * 6 FETCH (UID 6 RFC822.SIZE 507 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:49:29 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:52:29 -0500" "multipart/alternative message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<014Y2P3ZKXT4.TMD6XILA8I5N2@Jeffrey-Stedfasts-2013-iMac.local>") PREVIEW "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver") A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-previewtext-bodystructure.txt ================================================ * 1 FETCH (UID 1 RFC822.SIZE 507 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:25:01 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:25:01 -0500" "text/plain message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local>") BODYSTRUCTURE ("TEXT" "PLAIN" ("CHARSET" "utf-8") NIL NIL "7BIT" 5235 112 NIL NIL NIL)) * 2 FETCH (UID 2 RFC822.SIZE 506 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:48:38 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:46:38 -0500" "text/html message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "") BODYSTRUCTURE ("TEXT" "HTML" ("CHARSET" "utf-8") NIL NIL "7BIT" 60479 873 NIL NIL NIL)) * 3 FETCH (UID 3 RFC822.SIZE 507 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:49:29 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:47:29 -0500" "multipart/alternative message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<014Y2P3ZKXT4.TMD6XILA8I5N2@Jeffrey-Stedfasts-2013-iMac.local>") BODYSTRUCTURE (("TEXT" "PLAIN" ("CHARSET" "utf-8") NIL NIL "7BIT" 5235 112 NIL NIL NIL)("TEXT" "HTML" ("CHARSET" "utf-8") NIL NIL "7BIT" 60479 873 NIL NIL NIL) "ALTERNATIVE")) * 4 FETCH (UID 4 RFC822.SIZE 507 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:25:01 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:50:01 -0500" "text/plain message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local>") BODYSTRUCTURE ("TEXT" "PLAIN" ("CHARSET" "utf-8") NIL NIL "7BIT" 5235 112 NIL NIL NIL)) * 5 FETCH (UID 5 RFC822.SIZE 506 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:48:38 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:51:38 -0500" "text/html message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "") BODYSTRUCTURE ("TEXT" "HTML" ("CHARSET" "utf-8") NIL NIL "7BIT" 60479 873 NIL NIL NIL)) * 6 FETCH (UID 6 RFC822.SIZE 507 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:49:29 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:52:29 -0500" "multipart/alternative message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<014Y2P3ZKXT4.TMD6XILA8I5N2@Jeffrey-Stedfasts-2013-iMac.local>") BODYSTRUCTURE (("TEXT" "PLAIN" ("CHARSET" "utf-8") NIL NIL "7BIT" 5235 112 NIL NIL NIL)("TEXT" "HTML" ("CHARSET" "utf-8") NIL NIL "7BIT" 60479 873 NIL NIL NIL) "ALTERNATIVE")) * 7 FETCH (UID 7 RFC822.SIZE 1024 MODSEQ (41847) INTERNALDATE "03-Mar-2016 17:25:01 +0000" FLAGS (\Seen) ENVELOPE ("Thu, 03 Mar 2016 12:25:01 -0500" "audio/wav message" (("Example From" NIL "from" "example.com")) (("Example From" NIL "from" "example.com")) (("Example Reply-To" NIL "reply-to" "example.com")) (("Example To" NIL "to" "example.com")) (("Example Recipient #1" NIL "recipient1" "example.com")("Example Recipient #2" NIL "recipient2" "example.com")("Example Recipient #3" NIL "recipient3" "example.com")) NIL NIL "<2T1YDYWYKXT4.7B2PY7UJXN1U3@Jeffrey-Stedfasts-2013-iMac.local>") BODYSTRUCTURE ("AUDIO" "WAV" NIL NIL NIL "BASE64" 5235 NIL NIL NIL)) A######## OK Success ================================================ FILE: UnitTests/Net/Imap/Resources/gmail/fetch-previewtext-peek-html-only.txt ================================================ * 2 FETCH (UID 2 BODY[TEXT]<0> {16384} Planet Fitness
Don’t miss our celebrity guest Monday evening